(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o> 6]; var primitive = (tag & 0x20) === 0; // Multi-octet tag - load if ((tag & 0x1f) === 0x1f) { var oct = tag; tag = 0; while ((oct & 0x80) === 0x80) { oct = buf.readUInt8(fail); if (buf.isError(oct)) return oct; tag <<= 7; tag |= oct & 0x7f; } } else { tag &= 0x1f; } var tagStr = der.tag[tag]; return { cls: cls, primitive: primitive, tag: tag, tagStr: tagStr }; } function derDecodeLen(buf, primitive, fail) { var len = buf.readUInt8(fail); if (buf.isError(len)) return len; // Indefinite form if (!primitive && len === 0x80) return null; // Definite form if ((len & 0x80) === 0) { // Short form return len; } // Long form var num = len & 0x7f; if (num >= 4) return buf.error('length octect is too long'); len = 0; for (var i = 0; i < num; i++) { len <<= 8; var j = buf.readUInt8(fail); if (buf.isError(j)) return j; len |= j; } return len; } },{"../../asn1":1,"inherits":167}],10:[function(require,module,exports){ var decoders = exports; decoders.der = require('./der'); decoders.pem = require('./pem'); },{"./der":9,"./pem":11}],11:[function(require,module,exports){ var inherits = require('inherits'); var Buffer = require('buffer').Buffer; var asn1 = require('../../asn1'); var DERDecoder = require('./der'); function PEMDecoder(entity) { DERDecoder.call(this, entity); this.enc = 'pem'; }; inherits(PEMDecoder, DERDecoder); module.exports = PEMDecoder; PEMDecoder.prototype.decode = function decode(data, options) { var lines = data.toString().split(/[\r\n]+/g); var label = options.label.toUpperCase(); var re = /^-----(BEGIN|END) ([^-]+)-----$/; var start = -1; var end = -1; for (var i = 0; i < lines.length; i++) { var match = lines[i].match(re); if (match === null) continue; if (match[2] !== label) continue; if (start === -1) { if (match[1] !== 'BEGIN') break; start = i; } else { if (match[1] !== 'END') break; end = i; break; } } if (start === -1 || end === -1) throw new Error('PEM section not found for: ' + label); var base64 = lines.slice(start + 1, end).join(''); // Remove excessive symbols base64.replace(/[^a-z0-9\+\/=]+/gi, ''); var input = new Buffer(base64, 'base64'); return DERDecoder.prototype.decode.call(this, input, options); }; },{"../../asn1":1,"./der":9,"buffer":61,"inherits":167}],12:[function(require,module,exports){ var inherits = require('inherits'); var Buffer = require('buffer').Buffer; var asn1 = require('../../asn1'); var base = asn1.base; var bignum = asn1.bignum; // Import DER constants var der = asn1.constants.der; function DEREncoder(entity) { this.enc = 'der'; this.name = entity.name; this.entity = entity; // Construct base tree this.tree = new DERNode(); this.tree._init(entity.body); }; module.exports = DEREncoder; DEREncoder.prototype.encode = function encode(data, reporter) { return this.tree._encode(data, reporter).join(); }; // Tree methods function DERNode(parent) { base.Node.call(this, 'der', parent); } inherits(DERNode, base.Node); DERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) { var encodedTag = encodeTag(tag, primitive, cls, this.reporter); // Short form if (content.length < 0x80) { var header = new Buffer(2); header[0] = encodedTag; header[1] = content.length; return this._createEncoderBuffer([ header, content ]); } // Long form // Count octets required to store length var lenOctets = 1; for (var i = content.length; i >= 0x100; i >>= 8) lenOctets++; var header = new Buffer(1 + 1 + lenOctets); header[0] = encodedTag; header[1] = 0x80 | lenOctets; for (var i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8) header[i] = j & 0xff; return this._createEncoderBuffer([ header, content ]); }; DERNode.prototype._encodeStr = function encodeStr(str, tag) { if (tag === 'bitstr') { return this._createEncoderBuffer([ str.unused | 0, str.data ]); } else if (tag === 'bmpstr') { var buf = new Buffer(str.length * 2); for (var i = 0; i < str.length; i++) { buf.writeUInt16BE(str.charCodeAt(i), i * 2); } return this._createEncoderBuffer(buf); } else if (tag === 'numstr') { if (!this._isNumstr(str)) { return this.reporter.error('Encoding of string type: numstr supports ' + 'only digits and space'); } return this._createEncoderBuffer(str); } else if (tag === 'printstr') { if (!this._isPrintstr(str)) { return this.reporter.error('Encoding of string type: printstr supports ' + 'only latin upper and lower case letters, ' + 'digits, space, apostrophe, left and rigth ' + 'parenthesis, plus sign, comma, hyphen, ' + 'dot, slash, colon, equal sign, ' + 'question mark'); } return this._createEncoderBuffer(str); } else if (/str$/.test(tag)) { return this._createEncoderBuffer(str); } else { return this.reporter.error('Encoding of string type: ' + tag + ' unsupported'); } }; DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) { if (typeof id === 'string') { if (!values) return this.reporter.error('string objid given, but no values map found'); if (!values.hasOwnProperty(id)) return this.reporter.error('objid not found in values map'); id = values[id].split(/[\s\.]+/g); for (var i = 0; i < id.length; i++) id[i] |= 0; } else if (Array.isArray(id)) { id = id.slice(); for (var i = 0; i < id.length; i++) id[i] |= 0; } if (!Array.isArray(id)) { return this.reporter.error('objid() should be either array or string, ' + 'got: ' + JSON.stringify(id)); } if (!relative) { if (id[1] >= 40) return this.reporter.error('Second objid identifier OOB'); id.splice(0, 2, id[0] * 40 + id[1]); } // Count number of octets var size = 0; for (var i = 0; i < id.length; i++) { var ident = id[i]; for (size++; ident >= 0x80; ident >>= 7) size++; } var objid = new Buffer(size); var offset = objid.length - 1; for (var i = id.length - 1; i >= 0; i--) { var ident = id[i]; objid[offset--] = ident & 0x7f; while ((ident >>= 7) > 0) objid[offset--] = 0x80 | (ident & 0x7f); } return this._createEncoderBuffer(objid); }; function two(num) { if (num < 10) return '0' + num; else return num; } DERNode.prototype._encodeTime = function encodeTime(time, tag) { var str; var date = new Date(time); if (tag === 'gentime') { str = [ two(date.getFullYear()), two(date.getUTCMonth() + 1), two(date.getUTCDate()), two(date.getUTCHours()), two(date.getUTCMinutes()), two(date.getUTCSeconds()), 'Z' ].join(''); } else if (tag === 'utctime') { str = [ two(date.getFullYear() % 100), two(date.getUTCMonth() + 1), two(date.getUTCDate()), two(date.getUTCHours()), two(date.getUTCMinutes()), two(date.getUTCSeconds()), 'Z' ].join(''); } else { this.reporter.error('Encoding ' + tag + ' time is not supported yet'); } return this._encodeStr(str, 'octstr'); }; DERNode.prototype._encodeNull = function encodeNull() { return this._createEncoderBuffer(''); }; DERNode.prototype._encodeInt = function encodeInt(num, values) { if (typeof num === 'string') { if (!values) return this.reporter.error('String int or enum given, but no values map'); if (!values.hasOwnProperty(num)) { return this.reporter.error('Values map doesn\'t contain: ' + JSON.stringify(num)); } num = values[num]; } // Bignum, assume big endian if (typeof num !== 'number' && !Buffer.isBuffer(num)) { var numArray = num.toArray(); if (!num.sign && numArray[0] & 0x80) { numArray.unshift(0); } num = new Buffer(numArray); } if (Buffer.isBuffer(num)) { var size = num.length; if (num.length === 0) size++; var out = new Buffer(size); num.copy(out); if (num.length === 0) out[0] = 0 return this._createEncoderBuffer(out); } if (num < 0x80) return this._createEncoderBuffer(num); if (num < 0x100) return this._createEncoderBuffer([0, num]); var size = 1; for (var i = num; i >= 0x100; i >>= 8) size++; var out = new Array(size); for (var i = out.length - 1; i >= 0; i--) { out[i] = num & 0xff; num >>= 8; } if(out[0] & 0x80) { out.unshift(0); } return this._createEncoderBuffer(new Buffer(out)); }; DERNode.prototype._encodeBool = function encodeBool(value) { return this._createEncoderBuffer(value ? 0xff : 0); }; DERNode.prototype._use = function use(entity, obj) { if (typeof entity === 'function') entity = entity(obj); return entity._getEncoder('der').tree; }; DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) { var state = this._baseState; var i; if (state['default'] === null) return false; var data = dataBuffer.join(); if (state.defaultBuffer === undefined) state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join(); if (data.length !== state.defaultBuffer.length) return false; for (i=0; i < data.length; i++) if (data[i] !== state.defaultBuffer[i]) return false; return true; }; // Utility methods function encodeTag(tag, primitive, cls, reporter) { var res; if (tag === 'seqof') tag = 'seq'; else if (tag === 'setof') tag = 'set'; if (der.tagByName.hasOwnProperty(tag)) res = der.tagByName[tag]; else if (typeof tag === 'number' && (tag | 0) === tag) res = tag; else return reporter.error('Unknown tag: ' + tag); if (res >= 0x1f) return reporter.error('Multi-octet tag encoding unsupported'); if (!primitive) res |= 0x20; res |= (der.tagClassByName[cls || 'universal'] << 6); return res; } },{"../../asn1":1,"buffer":61,"inherits":167}],13:[function(require,module,exports){ var encoders = exports; encoders.der = require('./der'); encoders.pem = require('./pem'); },{"./der":12,"./pem":14}],14:[function(require,module,exports){ var inherits = require('inherits'); var Buffer = require('buffer').Buffer; var asn1 = require('../../asn1'); var DEREncoder = require('./der'); function PEMEncoder(entity) { DEREncoder.call(this, entity); this.enc = 'pem'; }; inherits(PEMEncoder, DEREncoder); module.exports = PEMEncoder; PEMEncoder.prototype.encode = function encode(data, options) { var buf = DEREncoder.prototype.encode.call(this, data); var p = buf.toString('base64'); var out = [ '-----BEGIN ' + options.label + '-----' ]; for (var i = 0; i < p.length; i += 64) out.push(p.slice(i, i + 64)); out.push('-----END ' + options.label + '-----'); return out.join('\n'); }; },{"../../asn1":1,"./der":12,"buffer":61,"inherits":167}],15:[function(require,module,exports){ // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 // // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! // // Originally from narwhal.js (http://narwhaljs.org) // Copyright (c) 2009 Thomas Robinson <280north.com> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the 'Software'), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // when used in node, this will actually load the util module we depend on // versus loading the builtin util module as happens otherwise // this is a bug in node module loading as far as I am concerned var util = require('util/'); var pSlice = Array.prototype.slice; var hasOwn = Object.prototype.hasOwnProperty; // 1. The assert module provides functions that throw // AssertionError's when particular conditions are not met. The // assert module must conform to the following interface. var assert = module.exports = ok; // 2. The AssertionError is defined in assert. // new assert.AssertionError({ message: message, // actual: actual, // expected: expected }) assert.AssertionError = function AssertionError(options) { this.name = 'AssertionError'; this.actual = options.actual; this.expected = options.expected; this.operator = options.operator; if (options.message) { this.message = options.message; this.generatedMessage = false; } else { this.message = getMessage(this); this.generatedMessage = true; } var stackStartFunction = options.stackStartFunction || fail; if (Error.captureStackTrace) { Error.captureStackTrace(this, stackStartFunction); } else { // non v8 browsers so we can have a stacktrace var err = new Error(); if (err.stack) { var out = err.stack; // try to strip useless frames var fn_name = stackStartFunction.name; var idx = out.indexOf('\n' + fn_name); if (idx >= 0) { // once we have located the function frame // we need to strip out everything before it (and its line) var next_line = out.indexOf('\n', idx + 1); out = out.substring(next_line + 1); } this.stack = out; } } }; // assert.AssertionError instanceof Error util.inherits(assert.AssertionError, Error); function replacer(key, value) { if (util.isUndefined(value)) { return '' + value; } if (util.isNumber(value) && !isFinite(value)) { return value.toString(); } if (util.isFunction(value) || util.isRegExp(value)) { return value.toString(); } return value; } function truncate(s, n) { if (util.isString(s)) { return s.length < n ? s : s.slice(0, n); } else { return s; } } function getMessage(self) { return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + self.operator + ' ' + truncate(JSON.stringify(self.expected, replacer), 128); } // At present only the three keys mentioned above are used and // understood by the spec. Implementations or sub modules can pass // other keys to the AssertionError's constructor - they will be // ignored. // 3. All of the following functions must throw an AssertionError // when a corresponding condition is not met, with a message that // may be undefined if not provided. All assertion methods provide // both the actual and expected values to the assertion error for // display purposes. function fail(actual, expected, message, operator, stackStartFunction) { throw new assert.AssertionError({ message: message, actual: actual, expected: expected, operator: operator, stackStartFunction: stackStartFunction }); } // EXTENSION! allows for well behaved errors defined elsewhere. assert.fail = fail; // 4. Pure assertion tests whether a value is truthy, as determined // by !!guard. // assert.ok(guard, message_opt); // This statement is equivalent to assert.equal(true, !!guard, // message_opt);. To test strictly for the value true, use // assert.strictEqual(true, guard, message_opt);. function ok(value, message) { if (!value) fail(value, true, message, '==', assert.ok); } assert.ok = ok; // 5. The equality assertion tests shallow, coercive equality with // ==. // assert.equal(actual, expected, message_opt); assert.equal = function equal(actual, expected, message) { if (actual != expected) fail(actual, expected, message, '==', assert.equal); }; // 6. The non-equality assertion tests for whether two objects are not equal // with != assert.notEqual(actual, expected, message_opt); assert.notEqual = function notEqual(actual, expected, message) { if (actual == expected) { fail(actual, expected, message, '!=', assert.notEqual); } }; // 7. The equivalence assertion tests a deep equality relation. // assert.deepEqual(actual, expected, message_opt); assert.deepEqual = function deepEqual(actual, expected, message) { if (!_deepEqual(actual, expected)) { fail(actual, expected, message, 'deepEqual', assert.deepEqual); } }; function _deepEqual(actual, expected) { // 7.1. All identical values are equivalent, as determined by ===. if (actual === expected) { return true; } else if (util.isBuffer(actual) && util.isBuffer(expected)) { if (actual.length != expected.length) return false; for (var i = 0; i < actual.length; i++) { if (actual[i] !== expected[i]) return false; } return true; // 7.2. If the expected value is a Date object, the actual value is // equivalent if it is also a Date object that refers to the same time. } else if (util.isDate(actual) && util.isDate(expected)) { return actual.getTime() === expected.getTime(); // 7.3 If the expected value is a RegExp object, the actual value is // equivalent if it is also a RegExp object with the same source and // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). } else if (util.isRegExp(actual) && util.isRegExp(expected)) { return actual.source === expected.source && actual.global === expected.global && actual.multiline === expected.multiline && actual.lastIndex === expected.lastIndex && actual.ignoreCase === expected.ignoreCase; // 7.4. Other pairs that do not both pass typeof value == 'object', // equivalence is determined by ==. } else if (!util.isObject(actual) && !util.isObject(expected)) { return actual == expected; // 7.5 For all other Object pairs, including Array objects, equivalence is // determined by having the same number of owned properties (as verified // with Object.prototype.hasOwnProperty.call), the same set of keys // (although not necessarily the same order), equivalent values for every // corresponding key, and an identical 'prototype' property. Note: this // accounts for both named and indexed properties on Arrays. } else { return objEquiv(actual, expected); } } function isArguments(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; } function objEquiv(a, b) { if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) return false; // an identical 'prototype' property. if (a.prototype !== b.prototype) return false; // if one is a primitive, the other must be same if (util.isPrimitive(a) || util.isPrimitive(b)) { return a === b; } var aIsArgs = isArguments(a), bIsArgs = isArguments(b); if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) return false; if (aIsArgs) { a = pSlice.call(a); b = pSlice.call(b); return _deepEqual(a, b); } var ka = objectKeys(a), kb = objectKeys(b), key, i; // having the same number of owned properties (keys incorporates // hasOwnProperty) if (ka.length != kb.length) return false; //the same set of keys (although not necessarily the same order), ka.sort(); kb.sort(); //~~~cheap key test for (i = ka.length - 1; i >= 0; i--) { if (ka[i] != kb[i]) return false; } //equivalent values for every corresponding key, and //~~~possibly expensive deep test for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!_deepEqual(a[key], b[key])) return false; } return true; } // 8. The non-equivalence assertion tests for any deep inequality. // assert.notDeepEqual(actual, expected, message_opt); assert.notDeepEqual = function notDeepEqual(actual, expected, message) { if (_deepEqual(actual, expected)) { fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); } }; // 9. The strict equality assertion tests strict equality, as determined by ===. // assert.strictEqual(actual, expected, message_opt); assert.strictEqual = function strictEqual(actual, expected, message) { if (actual !== expected) { fail(actual, expected, message, '===', assert.strictEqual); } }; // 10. The strict non-equality assertion tests for strict inequality, as // determined by !==. assert.notStrictEqual(actual, expected, message_opt); assert.notStrictEqual = function notStrictEqual(actual, expected, message) { if (actual === expected) { fail(actual, expected, message, '!==', assert.notStrictEqual); } }; function expectedException(actual, expected) { if (!actual || !expected) { return false; } if (Object.prototype.toString.call(expected) == '[object RegExp]') { return expected.test(actual); } else if (actual instanceof expected) { return true; } else if (expected.call({}, actual) === true) { return true; } return false; } function _throws(shouldThrow, block, expected, message) { var actual; if (util.isString(expected)) { message = expected; expected = null; } try { block(); } catch (e) { actual = e; } message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + (message ? ' ' + message : '.'); if (shouldThrow && !actual) { fail(actual, expected, 'Missing expected exception' + message); } if (!shouldThrow && expectedException(actual, expected)) { fail(actual, expected, 'Got unwanted exception' + message); } if ((shouldThrow && actual && expected && !expectedException(actual, expected)) || (!shouldThrow && actual)) { throw actual; } } // 11. Expected to throw an error: // assert.throws(block, Error_opt, message_opt); assert.throws = function(block, /*optional*/error, /*optional*/message) { _throws.apply(this, [true].concat(pSlice.call(arguments))); }; // EXTENSION! This is annoying to write outside this module. assert.doesNotThrow = function(block, /*optional*/message) { _throws.apply(this, [false].concat(pSlice.call(arguments))); }; assert.ifError = function(err) { if (err) {throw err;}}; var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { if (hasOwn.call(obj, key)) keys.push(key); } return keys; }; },{"util/":636}],16:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module attach-ware * @fileoverview Middleware with configuration. * @example * var ware = require('attach-ware')(require('ware')); * * var middleware = ware() * .use(function (context, options) { * if (!options.condition) return; * * return function (req, res, next) { * res.x = 'hello'; * next(); * }; * }, { * 'condition': true * }) * .use(function (context, options) { * if (!options.condition) return; * * return function (req, res, next) { * res.y = 'world'; * next(); * }; * }, { * 'condition': false * }); * * middleware.run({}, {}, function (err, req, res) { * res.x; // "hello" * res.y; // undefined * }); */ 'use strict'; /* eslint-env commonjs */ var slice = [].slice; var unherit = require('unherit'); /** * Clone `Ware` without affecting the super-class and * turn it into configurable middleware. * * @param {Function} Ware - Ware-like constructor. * @return {Function} AttachWare - Configurable middleware. */ function patch(Ware) { /* * Methods. */ var useFn = Ware.prototype.use; /** * @constructor * @class {AttachWare} */ var AttachWare = unherit(Ware); AttachWare.prototype.foo = true; /** * Attach configurable middleware. * * @memberof {AttachWare} * @this {AttachWare} * @param {Function} attach - Attacher. * @return {AttachWare} - `this`. */ function use(attach) { var self = this; var params = slice.call(arguments, 1); var index; var length; var fn; /* * Accept other `AttachWare`. */ if (attach instanceof AttachWare) { if (attach.attachers) { return self.use(attach.attachers); } return self; } /* * Accept normal ware. */ if (attach instanceof Ware) { self.fns = self.fns.concat(attach.fns); return self; } /* * Multiple attachers. */ if ('length' in attach && typeof attach !== 'function') { index = -1; length = attach.length; while (++index < length) { self.use.apply(self, [attach[index]].concat(params)); } return self; } /* * Single attacher. */ fn = attach.apply(null, [self.context || self].concat(params)); /* * Store the attacher to not break `new Ware(otherWare)` * functionality. */ if (!self.attachers) { self.attachers = []; } self.attachers.push(attach); /* * Pass `fn` to the original `Ware#use()`. */ if (fn) { useFn.call(self, fn); } return self; } AttachWare.prototype.use = use; return function (fn) { return new AttachWare(fn); }; } module.exports = patch; },{"unherit":629}],17:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer. All rights reserved. * @module bail * @fileoverview Throw a given error. */ 'use strict'; /** * Throw a given error. * * @example * bail(); * * @example * bail(new Error('failure')); * // Error: failure * // at repl:1:6 * // at REPLServer.defaultEval (repl.js:154:27) * // ... * * @param {Error?} [err] - Optional error. * @throws {Error} - `err`, when given. */ function bail(err) { if (err) { throw err; } } /* * Expose. */ module.exports = bail; },{}],18:[function(require,module,exports){ module.exports = balanced; function balanced(a, b, str) { var r = range(a, b, str); return r && { start: r[0], end: r[1], pre: str.slice(0, r[0]), body: str.slice(r[0] + a.length, r[1]), post: str.slice(r[1] + b.length) }; } balanced.range = range; function range(a, b, str) { var begs, beg, left, right, result; var ai = str.indexOf(a); var bi = str.indexOf(b, ai + 1); var i = ai; if (ai >= 0 && bi > 0) { begs = []; left = str.length; while (i < str.length && i >= 0 && ! result) { if (i == ai) { begs.push(i); ai = str.indexOf(a, i + 1); } else if (begs.length == 1) { result = [ begs.pop(), bi ]; } else { beg = begs.pop(); if (beg < left) { left = beg; right = bi; } bi = str.indexOf(b, i + 1); } i = ai < bi && ai >= 0 ? ai : bi; } if (begs.length) { result = [ left, right ]; } } return result; } },{}],19:[function(require,module,exports){ var bash_codes = exports.bash_codes = { "BLACK" : { "text" : "\033[0;30m", "underline": "\033[4;30m", "background": "\033[40m", "bold":"\033[1;30m", "hi_text":"\033[0;90m", "hi_bold" : "\033[1;90m", "hi_background" : "\033[0;100m" }, "RED" : { "text" : "\033[0;31m", "bold":"\033[1;31m", "underline": "\033[4;31m", "background": "\033[41m", "hi_text":"\033[0;91m", "hi_bold" : "\033[1;91m", "hi_background" : "\033[0;101m" }, "GREEN" : { "text" : "\033[0;32m", "bold":"\033[1;32m", "underline": "\033[4;32m", "background": "\033[42m", "hi_text":"\033[0;92m", "hi_bold" : "\033[1;92m", "hi_background" : "\033[0;102m" }, "YELLOW" : { "text" : "\033[0;33m", "bold":"\033[1;33m", "underline": "\033[4;33m", "background": "\033[43m", "hi_text":"\033[0;93m", "hi_bold" : "\033[1;93m", "hi_background" : "\033[0;103m" }, "BLUE" : { "text" : "\033[0;34m", "bold":"\033[1;34m", "underline": "\033[4;34m", "background": "\033[44m", "hi_text":"\033[0;94m", "hi_bold" : "\033[1;94m", "hi_background" : "\033[0;104m" }, "PURPLE" : { "text" : "\033[0;35m", "bold":"\033[1;35m", "underline": "\033[4;35m", "background": "\033[45m", "hi_text":"\033[0;95m", "hi_bold" : "\033[1;95m", "hi_background" : "\033[0;105m" }, "CYAN" : { "text" : "\033[0;36m", "bold":"\033[1;36m", "underline": "\033[4;36m", "background": "\033[46m", "hi_text":"\033[0;96m", "hi_bold" : "\033[1;96m", "hi_background" : "\033[0;106m" }, "WHITE" : { "text" : "\033[0;37m", "bold":"\033[1;37m", "underline": "\033[4;37m", "background": "\033[47m", "hi_text":"\033[0;97m", "hi_bold" : "\033[1;97m", "hi_background" : "\033[0;107m" } }; exports.colors = { BLACK: "BLACK", RED: "RED", GREEN: "GREEN", YELLOW: "YELLOW", BLUE: "BLUE", PURPLE: "PURPLE", CYAN: "CYAN", WHITE: "WHITE" }; var styles = exports.styles = { bold: "bold", underline: "underline", background: "background", hi_text: "hi_text", hi_bold: "hi_bold", hi_background: "hi_background" }; var REMOVE_COLOR = exports.REMOVE_COLOR = "\033[0m"; // various logical inconsistencies in the code below - renderColor and wrap seem like they should be combined, but I'm letting wrap basically stand on its own // in case anyone wants access to explicitly handle background or underline stuff. I feel like those are a bit more special-casey, and generally speakign // users are going to want to quickly turn a word or phrase into a single color without worrying about background or underline. So the .colorName methods // are just syntactic sugar. exports.wrap = function(str, color, style) { var c = bash_codes[color.toUpperCase()]; var s = styles[style] || "text"; return render(c[s], str); }; exports.black = function(str, hi) { return renderColor(str, bash_codes.BLACK, hi); }; exports.red = function(str, hi) { return renderColor(str, bash_codes.RED, hi); }; exports.green = function(str, hi) { return renderColor(str, bash_codes.GREEN, hi); }; exports.yellow = function(str, hi) { return renderColor(str, bash_codes.YELLOW, hi); }; exports.blue = function(str, hi) { return renderColor(str, bash_codes.BLUE, hi); }; exports.purple = function(str, hi) { return renderColor(str, bash_codes.PURPLE, hi); }; exports.cyan = function(str, hi) { return renderColor(str, bash_codes.CYAN, hi); }; exports.white = function(str, hi) { return renderColor(str, bash_codes.WHITE, hi); }; function renderColor(str, color, hi) { return render(hi ? color.hi_text : color.text, str); } function render(code, str) { return code + str + REMOVE_COLOR; } },{}],20:[function(require,module,exports){ module.exports = function(haystack, needle, comparator, low, high) { var mid, cmp; if(low === undefined) low = 0; else { low = low|0; if(low < 0 || low >= haystack.length) throw new RangeError("invalid lower bound"); } if(high === undefined) high = haystack.length - 1; else { high = high|0; if(high < low || high >= haystack.length) throw new RangeError("invalid upper bound"); } while(low <= high) { /* Note that "(low + high) >>> 1" may overflow, and results in a typecast * to double (which gives the wrong results). */ mid = low + (high - low >> 1); cmp = +comparator(haystack[mid], needle); /* Too low. */ if(cmp < 0.0) low = mid + 1; /* Too high. */ else if(cmp > 0.0) high = mid - 1; /* Key found. */ else return mid; } /* Key not found. */ return ~low; } },{}],21:[function(require,module,exports){ (function (process,__filename){ /** * Module dependencies. */ var fs = require('fs') , path = require('path') , join = path.join , dirname = path.dirname , exists = fs.existsSync || path.existsSync , defaults = { arrow: process.env.NODE_BINDINGS_ARROW || ' → ' , compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled' , platform: process.platform , arch: process.arch , version: process.versions.node , bindings: 'bindings.node' , try: [ // node-gyp's linked version in the "build" dir [ 'module_root', 'build', 'bindings' ] // node-waf and gyp_addon (a.k.a node-gyp) , [ 'module_root', 'build', 'Debug', 'bindings' ] , [ 'module_root', 'build', 'Release', 'bindings' ] // Debug files, for development (legacy behavior, remove for node v0.9) , [ 'module_root', 'out', 'Debug', 'bindings' ] , [ 'module_root', 'Debug', 'bindings' ] // Release files, but manually compiled (legacy behavior, remove for node v0.9) , [ 'module_root', 'out', 'Release', 'bindings' ] , [ 'module_root', 'Release', 'bindings' ] // Legacy from node-waf, node <= 0.4.x , [ 'module_root', 'build', 'default', 'bindings' ] // Production "Release" buildtype binary (meh...) , [ 'module_root', 'compiled', 'version', 'platform', 'arch', 'bindings' ] ] } /** * The main `bindings()` function loads the compiled bindings for a given module. * It uses V8's Error API to determine the parent filename that this function is * being invoked from, which is then used to find the root directory. */ function bindings (opts) { // Argument surgery if (typeof opts == 'string') { opts = { bindings: opts } } else if (!opts) { opts = {} } opts.__proto__ = defaults // Get the module root if (!opts.module_root) { opts.module_root = exports.getRoot(exports.getFileName()) } // Ensure the given bindings name ends with .node if (path.extname(opts.bindings) != '.node') { opts.bindings += '.node' } var tries = [] , i = 0 , l = opts.try.length , n , b , err for (; i this.length) srcEnd = this.length if (srcStart >= this.length) return dst || new Buffer(0) if (srcEnd <= 0) return dst || new Buffer(0) var copy = !!dst , off = this._offset(srcStart) , len = srcEnd - srcStart , bytes = len , bufoff = (copy && dstStart) || 0 , start = off[1] , l , i // copy/slice everything if (srcStart === 0 && srcEnd == this.length) { if (!copy) // slice, just return a full concat return Buffer.concat(this._bufs) // copy, need to copy individual buffers for (i = 0; i < this._bufs.length; i++) { this._bufs[i].copy(dst, bufoff) bufoff += this._bufs[i].length } return dst } // easy, cheap case where it's a subset of one of the buffers if (bytes <= this._bufs[off[0]].length - start) { return copy ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes) : this._bufs[off[0]].slice(start, start + bytes) } if (!copy) // a slice, we need something to copy in to dst = new Buffer(len) for (i = off[0]; i < this._bufs.length; i++) { l = this._bufs[i].length - start if (bytes > l) { this._bufs[i].copy(dst, bufoff, start) } else { this._bufs[i].copy(dst, bufoff, start, start + bytes) break } bufoff += l bytes -= l if (start) start = 0 } return dst } BufferList.prototype.toString = function toString (encoding, start, end) { return this.slice(start, end).toString(encoding) } BufferList.prototype.consume = function consume (bytes) { while (this._bufs.length) { if (bytes >= this._bufs[0].length) { bytes -= this._bufs[0].length this.length -= this._bufs[0].length this._bufs.shift() } else { this._bufs[0] = this._bufs[0].slice(bytes) this.length -= bytes break } } return this } BufferList.prototype.duplicate = function duplicate () { var i = 0 , copy = new BufferList() for (; i < this._bufs.length; i++) copy.append(this._bufs[i]) return copy } BufferList.prototype.destroy = function destroy () { this._bufs.length = 0 this.length = 0 this.push(null) } ;(function () { var methods = { 'readDoubleBE' : 8 , 'readDoubleLE' : 8 , 'readFloatBE' : 4 , 'readFloatLE' : 4 , 'readInt32BE' : 4 , 'readInt32LE' : 4 , 'readUInt32BE' : 4 , 'readUInt32LE' : 4 , 'readInt16BE' : 2 , 'readInt16LE' : 2 , 'readUInt16BE' : 2 , 'readUInt16LE' : 2 , 'readInt8' : 1 , 'readUInt8' : 1 } for (var m in methods) { (function (m) { BufferList.prototype[m] = function (offset) { return this.slice(offset, offset + methods[m])[m](0) } }(m)) } }()) module.exports = BufferList }).call(this,require("buffer").Buffer) },{"buffer":61,"readable-stream/duplex":24,"util":636}],23:[function(require,module,exports){ var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; },{}],24:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") },{"./lib/_stream_duplex.js":25}],25:[function(require,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. 'use strict'; /**/ var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { keys.push(key); }return keys; }; /**/ module.exports = Duplex; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Readable = require('./_stream_readable'); var Writable = require('./_stream_writable'); util.inherits(Duplex, Readable); var keys = objectKeys(Writable.prototype); for (var v = 0; v < keys.length; v++) { var method = keys[v]; if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; } function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); Readable.call(this, options); Writable.call(this, options); if (options && options.readable === false) this.readable = false; if (options && options.writable === false) this.writable = false; this.allowHalfOpen = true; if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; this.once('end', onend); } // the no-half-open enforcer function onend() { // if we allow half-open state, or if the writable side ended, // then we're ok. if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. processNextTick(onEndNT, this); } function onEndNT(self) { self.end(); } function forEach(xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } },{"./_stream_readable":26,"./_stream_writable":27,"core-util-is":104,"inherits":167,"process-nextick-args":294}],26:[function(require,module,exports){ (function (process){ 'use strict'; module.exports = Readable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events'); /**/ var EElistenerCount = function (emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream; (function () { try { Stream = require('st' + 'ream'); } catch (_) {} finally { if (!Stream) Stream = require('events').EventEmitter; } })(); /**/ var Buffer = require('buffer').Buffer; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var debugUtil = require('util'); var debug = undefined; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function () {}; } /**/ var StringDecoder; util.inherits(Readable, Stream); var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~ ~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; this.resumeScheduled = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } var Duplex; function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; if (options && typeof options.read === 'function') this._read = options.read; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function (chunk, encoding) { var state = this._readableState; if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function (chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; Readable.prototype.isPaused = function () { return this._readableState.flowing === false; }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { var skipAdd; if (state.decoder && !addToFront && !encoding) { chunk = state.decoder.write(chunk); skipAdd = !state.objectMode && chunk.length === 0; } if (!addToFront) state.reading = false; // Don't add to the buffer if we've decoded to an empty string chunk and // we're not in object mode if (!skipAdd) { // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function (enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 8MB var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length;else return state.length; } if (n <= 0) return 0; // If we're asking for more than the target buffer level, // then raise the water mark. Bump up to the next highest // power of 2, to prevent increasing it excessively in tiny // amounts. if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else { return state.length; } } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function (n) { debug('read', n); var state = this._readableState; var nOrig = n; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state);else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break;else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= n in length. // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. Readable.prototype._read = function (n) { this.emit('error', new Error('not implemented')); }; Readable.prototype.pipe = function (dest, pipeOpts) { var src = this; var state = this._readableState; switch (state.pipesCount) { case 0: state.pipes = dest; break; case 1: state.pipes = [state.pipes, dest]; break; default: state.pipes.push(dest); break; } state.pipesCount += 1; debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var endFn = doEnd ? onend : cleanup; if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); dest.on('unpipe', onunpipe); function onunpipe(readable) { debug('onunpipe'); if (readable === src) { cleanup(); } } function onend() { debug('onend'); dest.end(); } // when the dest drains, it reduces the awaitDrain counter // on the source. This would be more elegant with a .once() // handler in flow(), but adding and removing repeatedly is // too slow. var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); var cleanedUp = false; function cleanup() { debug('cleanup'); // cleanup event handlers once the pipe is broken dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); dest.removeListener('error', onerror); dest.removeListener('unpipe', onunpipe); src.removeListener('end', onend); src.removeListener('end', cleanup); src.removeListener('data', ondata); cleanedUp = true; // if the reader is waiting for a drain event from this // specific writer, then it would cause it to never start // flowing again. // So, if this is awaiting a drain, then we just call it now. // If we don't know, then assume that we are waiting for one. if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } src.on('data', ondata); function ondata(chunk) { debug('ondata'); var ret = dest.write(chunk); if (false === ret) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write // also returned false. if (state.pipesCount === 1 && state.pipes[0] === dest && src.listenerCount('data') === 1 && !cleanedUp) { debug('false write response, pause', src._readableState.awaitDrain); src._readableState.awaitDrain++; } src.pause(); } } // if the dest has an error, then stop piping into it. // however, don't suppress the throwing behavior for this. function onerror(er) { debug('onerror', er); unpipe(); dest.removeListener('error', onerror); if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); } // This is a brutally ugly hack to make sure that our error handler // is attached before any userland ones. NEVER DO THIS. if (!dest._events || !dest._events.error) dest.on('error', onerror);else if (isArray(dest._events.error)) dest._events.error.unshift(onerror);else dest._events.error = [onerror, dest._events.error]; // Both close and finish should trigger unpipe, but only once. function onclose() { dest.removeListener('finish', onfinish); unpipe(); } dest.once('close', onclose); function onfinish() { debug('onfinish'); dest.removeListener('close', onclose); unpipe(); } dest.once('finish', onfinish); function unpipe() { debug('unpipe'); src.unpipe(dest); } // tell the dest that it's being piped to dest.emit('pipe', src); // start the flow if it hasn't been started already. if (!state.flowing) { debug('pipe resume'); src.resume(); } return dest; }; function pipeOnDrain(src) { return function () { var state = src._readableState; debug('pipeOnDrain', state.awaitDrain); if (state.awaitDrain) state.awaitDrain--; if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { state.flowing = true; flow(src); } }; } Readable.prototype.unpipe = function (dest) { var state = this._readableState; // if we're not piping anywhere, then do nothing. if (state.pipesCount === 0) return this; // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; if (!dest) dest = state.pipes; // got a match. state.pipes = null; state.pipesCount = 0; state.flowing = false; if (dest) dest.emit('unpipe', this); return this; } // slow case. multiple pipe destinations. if (!dest) { // remove all. var dests = state.pipes; var len = state.pipesCount; state.pipes = null; state.pipesCount = 0; state.flowing = false; for (var _i = 0; _i < len; _i++) { dests[_i].emit('unpipe', this); }return this; } // try to find the right one. var i = indexOf(state.pipes, dest); if (i === -1) return this; state.pipes.splice(i, 1); state.pipesCount -= 1; if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this); return this; }; // set up data events if they are asked for // Ensure readable listeners eventually get something Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); // If listening to data, and it has not explicitly been paused, // then call resume to start the flow of data on the next tick. if (ev === 'data' && false !== this._readableState.flowing) { this.resume(); } if (ev === 'readable' && !this._readableState.endEmitted) { var state = this._readableState; if (!state.readableListening) { state.readableListening = true; state.emittedReadable = false; state.needReadable = true; if (!state.reading) { processNextTick(nReadingNextTick, this); } else if (state.length) { emitReadable(this, state); } } } return res; }; Readable.prototype.addListener = Readable.prototype.on; function nReadingNextTick(self) { debug('readable nexttick read 0'); self.read(0); } // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. Readable.prototype.resume = function () { var state = this._readableState; if (!state.flowing) { debug('resume'); state.flowing = true; resume(this, state); } return this; }; function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; processNextTick(resume_, stream, state); } } function resume_(stream, state) { if (!state.reading) { debug('resume read 0'); stream.read(0); } state.resumeScheduled = false; stream.emit('resume'); flow(stream); if (state.flowing && !state.reading) stream.read(0); } Readable.prototype.pause = function () { debug('call pause flowing=%j', this._readableState.flowing); if (false !== this._readableState.flowing) { debug('pause'); this._readableState.flowing = false; this.emit('pause'); } return this; }; function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); if (state.flowing) { do { var chunk = stream.read(); } while (null !== chunk && state.flowing); } } // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. Readable.prototype.wrap = function (stream) { var state = this._readableState; var paused = false; var self = this; stream.on('end', function () { debug('wrapped end'); if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) self.push(chunk); } self.push(null); }); stream.on('data', function (chunk) { debug('wrapped data'); if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = self.push(chunk); if (!ret) { paused = true; stream.pause(); } }); // proxy all the other methods. // important when wrapping filters and duplexes. for (var i in stream) { if (this[i] === undefined && typeof stream[i] === 'function') { this[i] = function (method) { return function () { return stream[method].apply(stream, arguments); }; }(i); } } // proxy certain important events. var events = ['error', 'close', 'destroy', 'pause', 'resume']; forEach(events, function (ev) { stream.on(ev, self.emit.bind(self, ev)); }); // when we try to consume some more bytes, simply unpause the // underlying stream. self._read = function (n) { debug('wrapped _read', n); if (paused) { paused = false; stream.resume(); } }; return self; }; // exposed for testing purposes only. Readable._fromList = fromList; // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. function fromList(n, state) { var list = state.buffer; var length = state.length; var stringMode = !!state.decoder; var objectMode = !!state.objectMode; var ret; // nothing in the list, definitely empty. if (list.length === 0) return null; if (length === 0) ret = null;else if (objectMode) ret = list.shift();else if (!n || n >= length) { // read it all, truncate the array. if (stringMode) ret = list.join('');else if (list.length === 1) ret = list[0];else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = '';else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy);else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy);else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; processNextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } } function forEach(xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":25,"_process":295,"buffer":61,"core-util-is":104,"events":144,"inherits":167,"isarray":23,"process-nextick-args":294,"string_decoder/":616,"util":33}],27:[function(require,module,exports){ (function (process){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all // the drain event emission and buffering. 'use strict'; module.exports = Writable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Writable.WritableState = WritableState; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var internalUtil = { deprecate: require('util-deprecate') }; /**/ /**/ var Stream; (function () { try { Stream = require('st' + 'ream'); } catch (_) {} finally { if (!Stream) Stream = require('events').EventEmitter; } })(); /**/ var Buffer = require('buffer').Buffer; util.inherits(Writable, Stream); function nop() {} function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; this.next = null; } var Duplex; function WritableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~ ~this.highWaterMark; this.needDrain = false; // at the start of calling end() this.ending = false; // when end() has been called, and returned this.ended = false; // when 'finish' is emitted this.finished = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. var noDecode = options.decodeStrings === false; this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. this.length = 0; // a flag to see when we're in the middle of a write. this.writing = false; // when true all writes will be buffered until .uncork() call this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) this.onwrite = function (er) { onwrite(stream, er); }; // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; // the amount that is being written when _write is called. this.writelen = 0; this.bufferedRequest = null; this.lastBufferedRequest = null; // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams this.prefinished = false; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; // count buffered requests this.bufferedRequestCount = 0; // create the two objects needed to store the corked requests // they are not a linked list, as no new elements are inserted in there this.corkedRequestsFree = new CorkedRequest(this); this.corkedRequestsFree.next = new CorkedRequest(this); } WritableState.prototype.getBuffer = function writableStateGetBuffer() { var current = this.bufferedRequest; var out = []; while (current) { out.push(current); current = current.next; } return out; }; (function () { try { Object.defineProperty(WritableState.prototype, 'buffer', { get: internalUtil.deprecate(function () { return this.getBuffer(); }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') }); } catch (_) {} })(); var Duplex; function Writable(options) { Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, though they're not // instanceof Writable, they're instanceof Readable. if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); this._writableState = new WritableState(options, this); // legacy. this.writable = true; if (options) { if (typeof options.write === 'function') this._write = options.write; if (typeof options.writev === 'function') this._writev = options.writev; } Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function () { this.emit('error', new Error('Cannot pipe. Not readable.')); }; function writeAfterEnd(stream, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); processNextTick(cb, er); } // If we get something that is not a buffer, string, null, or undefined, // and we're not in objectMode, then that's an error. // Otherwise stream chunks are all considered to be of length=1, and the // watermarks determine how many objects to keep in the buffer, rather than // how many bytes or characters. function validChunk(stream, state, chunk, cb) { var valid = true; if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { var er = new TypeError('Invalid non-string/buffer chunk'); stream.emit('error', er); processNextTick(cb, er); valid = false; } return valid; } Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; if (typeof cb !== 'function') cb = nop; if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { state.pendingcb++; ret = writeOrBuffer(this, state, chunk, encoding, cb); } return ret; }; Writable.prototype.cork = function () { var state = this._writableState; state.corked++; }; Writable.prototype.uncork = function () { var state = this._writableState; if (state.corked) { state.corked--; if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } }; Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { // node::ParseEncoding() requires lower case. if (typeof encoding === 'string') encoding = encoding.toLowerCase(); if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); this._writableState.defaultEncoding = encoding; }; function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = new Buffer(chunk, encoding); } return chunk; } // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, chunk, encoding, cb) { chunk = decodeChunk(state, chunk, encoding); if (Buffer.isBuffer(chunk)) encoding = 'buffer'; var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing || state.corked) { var last = state.lastBufferedRequest; state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); if (last) { last.next = state.lastBufferedRequest; } else { state.bufferedRequest = state.lastBufferedRequest; } state.bufferedRequestCount += 1; } else { doWrite(stream, state, false, len, chunk, encoding, cb); } return ret; } function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { --state.pendingcb; if (sync) processNextTick(cb, er);else cb(er); stream._writableState.errorEmitted = true; stream.emit('error', er); } function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; onwriteStateUpdate(state); if (er) onwriteError(stream, state, sync, er, cb);else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(state); if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { clearBuffer(stream, state); } if (sync) { /**/ asyncWrite(afterWrite, stream, state, finished, cb); /**/ } else { afterWrite(stream, state, finished, cb); } } } function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); state.pendingcb--; cb(); finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } } // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; var entry = state.bufferedRequest; if (stream._writev && entry && entry.next) { // Fast case, write everything using _writev() var l = state.bufferedRequestCount; var buffer = new Array(l); var holder = state.corkedRequestsFree; holder.entry = entry; var count = 0; while (entry) { buffer[count] = entry; entry = entry.next; count += 1; } doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is always async, defer these to save a bit of time // as the hot path ends with doWrite state.pendingcb++; state.lastBufferedRequest = null; state.corkedRequestsFree = holder.next; holder.next = null; } else { // Slow case, write chunks one-by-one while (entry) { var chunk = entry.chunk; var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. if (state.writing) { break; } } if (entry === null) state.lastBufferedRequest = null; } state.bufferedRequestCount = 0; state.bufferedRequest = entry; state.bufferProcessing = false; } Writable.prototype._write = function (chunk, encoding, cb) { cb(new Error('not implemented')); }; Writable.prototype._writev = null; Writable.prototype.end = function (chunk, encoding, cb) { var state = this._writableState; if (typeof chunk === 'function') { cb = chunk; chunk = null; encoding = null; } else if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); } // ignore unnecessary end() calls. if (!state.ending && !state.finished) endWritable(this, state, cb); }; function needFinish(state) { return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } function prefinish(stream, state) { if (!state.prefinished) { state.prefinished = true; stream.emit('prefinish'); } } function finishMaybe(stream, state) { var need = needFinish(state); if (need) { if (state.pendingcb === 0) { prefinish(stream, state); state.finished = true; stream.emit('finish'); } else { prefinish(stream, state); } } return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { if (state.finished) processNextTick(cb);else stream.once('finish', cb); } state.ended = true; stream.writable = false; } // It seems a linked list but it is not // there will be only 2 of these for each stream function CorkedRequest(state) { var _this = this; this.next = null; this.entry = null; this.finish = function (err) { var entry = _this.entry; _this.entry = null; while (entry) { var cb = entry.callback; state.pendingcb--; cb(err); entry = entry.next; } if (state.corkedRequestsFree) { state.corkedRequestsFree.next = _this; } else { state.corkedRequestsFree = _this; } }; } }).call(this,require('_process')) },{"./_stream_duplex":25,"_process":295,"buffer":61,"core-util-is":104,"events":144,"inherits":167,"process-nextick-args":294,"util-deprecate":634}],28:[function(require,module,exports){ var Buffer = require('buffer').Buffer var BLAKE2s = (function () { function BLAKE2s(digestLength, key) { if (typeof digestLength === "undefined") { digestLength = 32; } this.isFinished = false; this.digestLength = 32; this.blockLength = 64; this.iv = [ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 ]; //TODO tree mode. if (digestLength <= 0) { digestLength = this.digestLength; } else if (digestLength > 32) { throw 'digestLength is too large'; } var keyLength = 0; if (typeof key == 'string') { key = this.stringToUtf8Array(key); keyLength = key.length; } else if (typeof key == 'object') { keyLength = key.length; } if (keyLength > 32) { throw 'key too long'; } var param = [digestLength & 0xff, keyLength, 1, 1]; this.h = this.iv.slice(0); // XOR part of parameter block. this.h[0] ^= this.load32(param, 0); this.x = new Array(64); this.t0 = 0; this.t1 = 0; this.f0 = 0; this.f1 = 0; this.nx = 0; this.digestLength = digestLength; if (keyLength > 0) { for (var i = 0; i < keyLength; i++) { this.x[i] = key[i]; } for (var i = keyLength; i < 64; i++) { this.x[i] = 0; } this.nx = 64; } } BLAKE2s.prototype.load32 = function (p, pos) { return ((p[pos] & 0xff) | ((p[pos + 1] & 0xff) << 8) | ((p[pos + 2] & 0xff) << 16) | ((p[pos + 3] & 0xff) << 24)) >>> 0; }; BLAKE2s.prototype.store32 = function (p, pos, v) { p[pos] = (v >>> 0) & 0xff; p[pos + 1] = (v >>> 8) & 0xff; p[pos + 2] = (v >>> 16) & 0xff; p[pos + 3] = (v >>> 24) & 0xff; }; BLAKE2s.prototype.processBlock = function (length) { this.t0 += length; if (this.t0 != this.t0 >>> 0) { this.t0 = 0; this.t1++; } var v0 = this.h[0], v1 = this.h[1], v2 = this.h[2], v3 = this.h[3], v4 = this.h[4], v5 = this.h[5], v6 = this.h[6], v7 = this.h[7], v8 = this.iv[0], v9 = this.iv[1], v10 = this.iv[2], v11 = this.iv[3], v12 = this.iv[4] ^ this.t0, v13 = this.iv[5] ^ this.t1, v14 = this.iv[6] ^ this.f0, v15 = this.iv[7] ^ this.f1; var m0 = this.load32(this.x, 0), m1 = this.load32(this.x, 4), m2 = this.load32(this.x, 8), m3 = this.load32(this.x, 12), m4 = this.load32(this.x, 16), m5 = this.load32(this.x, 20), m6 = this.load32(this.x, 24), m7 = this.load32(this.x, 28), m8 = this.load32(this.x, 32), m9 = this.load32(this.x, 36), m10 = this.load32(this.x, 40), m11 = this.load32(this.x, 44), m12 = this.load32(this.x, 48), m13 = this.load32(this.x, 52), m14 = this.load32(this.x, 56), m15 = this.load32(this.x, 60); // Round 1. v0 += m0; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 16) | v12 >>> 16; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 12) | v4 >>> 12; v1 += m2; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 16) | v13 >>> 16; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 12) | v5 >>> 12; v2 += m4; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 16) | v14 >>> 16; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 12) | v6 >>> 12; v3 += m6; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 16) | v15 >>> 16; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 12) | v7 >>> 12; v2 += m5; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 8) | v14 >>> 8; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 7) | v6 >>> 7; v3 += m7; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 8) | v15 >>> 8; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 7) | v7 >>> 7; v1 += m3; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 8) | v13 >>> 8; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 7) | v5 >>> 7; v0 += m1; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 8) | v12 >>> 8; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 7) | v4 >>> 7; v0 += m8; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 16) | v15 >>> 16; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 12) | v5 >>> 12; v1 += m10; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 16) | v12 >>> 16; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 12) | v6 >>> 12; v2 += m12; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 16) | v13 >>> 16; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 12) | v7 >>> 12; v3 += m14; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 16) | v14 >>> 16; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 12) | v4 >>> 12; v2 += m13; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 8) | v13 >>> 8; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 7) | v7 >>> 7; v3 += m15; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 8) | v14 >>> 8; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 7) | v4 >>> 7; v1 += m11; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 8) | v12 >>> 8; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 7) | v6 >>> 7; v0 += m9; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 8) | v15 >>> 8; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 7) | v5 >>> 7; // Round 2. v0 += m14; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 16) | v12 >>> 16; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 12) | v4 >>> 12; v1 += m4; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 16) | v13 >>> 16; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 12) | v5 >>> 12; v2 += m9; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 16) | v14 >>> 16; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 12) | v6 >>> 12; v3 += m13; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 16) | v15 >>> 16; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 12) | v7 >>> 12; v2 += m15; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 8) | v14 >>> 8; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 7) | v6 >>> 7; v3 += m6; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 8) | v15 >>> 8; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 7) | v7 >>> 7; v1 += m8; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 8) | v13 >>> 8; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 7) | v5 >>> 7; v0 += m10; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 8) | v12 >>> 8; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 7) | v4 >>> 7; v0 += m1; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 16) | v15 >>> 16; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 12) | v5 >>> 12; v1 += m0; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 16) | v12 >>> 16; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 12) | v6 >>> 12; v2 += m11; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 16) | v13 >>> 16; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 12) | v7 >>> 12; v3 += m5; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 16) | v14 >>> 16; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 12) | v4 >>> 12; v2 += m7; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 8) | v13 >>> 8; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 7) | v7 >>> 7; v3 += m3; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 8) | v14 >>> 8; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 7) | v4 >>> 7; v1 += m2; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 8) | v12 >>> 8; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 7) | v6 >>> 7; v0 += m12; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 8) | v15 >>> 8; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 7) | v5 >>> 7; // Round 3. v0 += m11; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 16) | v12 >>> 16; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 12) | v4 >>> 12; v1 += m12; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 16) | v13 >>> 16; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 12) | v5 >>> 12; v2 += m5; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 16) | v14 >>> 16; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 12) | v6 >>> 12; v3 += m15; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 16) | v15 >>> 16; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 12) | v7 >>> 12; v2 += m2; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 8) | v14 >>> 8; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 7) | v6 >>> 7; v3 += m13; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 8) | v15 >>> 8; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 7) | v7 >>> 7; v1 += m0; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 8) | v13 >>> 8; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 7) | v5 >>> 7; v0 += m8; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 8) | v12 >>> 8; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 7) | v4 >>> 7; v0 += m10; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 16) | v15 >>> 16; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 12) | v5 >>> 12; v1 += m3; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 16) | v12 >>> 16; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 12) | v6 >>> 12; v2 += m7; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 16) | v13 >>> 16; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 12) | v7 >>> 12; v3 += m9; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 16) | v14 >>> 16; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 12) | v4 >>> 12; v2 += m1; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 8) | v13 >>> 8; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 7) | v7 >>> 7; v3 += m4; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 8) | v14 >>> 8; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 7) | v4 >>> 7; v1 += m6; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 8) | v12 >>> 8; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 7) | v6 >>> 7; v0 += m14; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 8) | v15 >>> 8; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 7) | v5 >>> 7; // Round 4. v0 += m7; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 16) | v12 >>> 16; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 12) | v4 >>> 12; v1 += m3; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 16) | v13 >>> 16; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 12) | v5 >>> 12; v2 += m13; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 16) | v14 >>> 16; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 12) | v6 >>> 12; v3 += m11; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 16) | v15 >>> 16; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 12) | v7 >>> 12; v2 += m12; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 8) | v14 >>> 8; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 7) | v6 >>> 7; v3 += m14; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 8) | v15 >>> 8; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 7) | v7 >>> 7; v1 += m1; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 8) | v13 >>> 8; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 7) | v5 >>> 7; v0 += m9; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 8) | v12 >>> 8; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 7) | v4 >>> 7; v0 += m2; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 16) | v15 >>> 16; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 12) | v5 >>> 12; v1 += m5; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 16) | v12 >>> 16; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 12) | v6 >>> 12; v2 += m4; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 16) | v13 >>> 16; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 12) | v7 >>> 12; v3 += m15; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 16) | v14 >>> 16; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 12) | v4 >>> 12; v2 += m0; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 8) | v13 >>> 8; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 7) | v7 >>> 7; v3 += m8; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 8) | v14 >>> 8; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 7) | v4 >>> 7; v1 += m10; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 8) | v12 >>> 8; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 7) | v6 >>> 7; v0 += m6; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 8) | v15 >>> 8; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 7) | v5 >>> 7; // Round 5. v0 += m9; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 16) | v12 >>> 16; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 12) | v4 >>> 12; v1 += m5; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 16) | v13 >>> 16; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 12) | v5 >>> 12; v2 += m2; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 16) | v14 >>> 16; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 12) | v6 >>> 12; v3 += m10; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 16) | v15 >>> 16; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 12) | v7 >>> 12; v2 += m4; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 8) | v14 >>> 8; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 7) | v6 >>> 7; v3 += m15; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 8) | v15 >>> 8; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 7) | v7 >>> 7; v1 += m7; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 8) | v13 >>> 8; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 7) | v5 >>> 7; v0 += m0; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 8) | v12 >>> 8; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 7) | v4 >>> 7; v0 += m14; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 16) | v15 >>> 16; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 12) | v5 >>> 12; v1 += m11; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 16) | v12 >>> 16; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 12) | v6 >>> 12; v2 += m6; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 16) | v13 >>> 16; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 12) | v7 >>> 12; v3 += m3; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 16) | v14 >>> 16; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 12) | v4 >>> 12; v2 += m8; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 8) | v13 >>> 8; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 7) | v7 >>> 7; v3 += m13; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 8) | v14 >>> 8; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 7) | v4 >>> 7; v1 += m12; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 8) | v12 >>> 8; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 7) | v6 >>> 7; v0 += m1; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 8) | v15 >>> 8; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 7) | v5 >>> 7; // Round 6. v0 += m2; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 16) | v12 >>> 16; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 12) | v4 >>> 12; v1 += m6; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 16) | v13 >>> 16; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 12) | v5 >>> 12; v2 += m0; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 16) | v14 >>> 16; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 12) | v6 >>> 12; v3 += m8; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 16) | v15 >>> 16; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 12) | v7 >>> 12; v2 += m11; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 8) | v14 >>> 8; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 7) | v6 >>> 7; v3 += m3; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 8) | v15 >>> 8; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 7) | v7 >>> 7; v1 += m10; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 8) | v13 >>> 8; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 7) | v5 >>> 7; v0 += m12; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 8) | v12 >>> 8; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 7) | v4 >>> 7; v0 += m4; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 16) | v15 >>> 16; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 12) | v5 >>> 12; v1 += m7; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 16) | v12 >>> 16; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 12) | v6 >>> 12; v2 += m15; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 16) | v13 >>> 16; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 12) | v7 >>> 12; v3 += m1; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 16) | v14 >>> 16; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 12) | v4 >>> 12; v2 += m14; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 8) | v13 >>> 8; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 7) | v7 >>> 7; v3 += m9; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 8) | v14 >>> 8; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 7) | v4 >>> 7; v1 += m5; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 8) | v12 >>> 8; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 7) | v6 >>> 7; v0 += m13; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 8) | v15 >>> 8; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 7) | v5 >>> 7; // Round 7. v0 += m12; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 16) | v12 >>> 16; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 12) | v4 >>> 12; v1 += m1; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 16) | v13 >>> 16; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 12) | v5 >>> 12; v2 += m14; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 16) | v14 >>> 16; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 12) | v6 >>> 12; v3 += m4; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 16) | v15 >>> 16; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 12) | v7 >>> 12; v2 += m13; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 8) | v14 >>> 8; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 7) | v6 >>> 7; v3 += m10; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 8) | v15 >>> 8; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 7) | v7 >>> 7; v1 += m15; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 8) | v13 >>> 8; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 7) | v5 >>> 7; v0 += m5; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 8) | v12 >>> 8; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 7) | v4 >>> 7; v0 += m0; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 16) | v15 >>> 16; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 12) | v5 >>> 12; v1 += m6; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 16) | v12 >>> 16; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 12) | v6 >>> 12; v2 += m9; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 16) | v13 >>> 16; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 12) | v7 >>> 12; v3 += m8; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 16) | v14 >>> 16; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 12) | v4 >>> 12; v2 += m2; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 8) | v13 >>> 8; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 7) | v7 >>> 7; v3 += m11; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 8) | v14 >>> 8; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 7) | v4 >>> 7; v1 += m3; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 8) | v12 >>> 8; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 7) | v6 >>> 7; v0 += m7; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 8) | v15 >>> 8; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 7) | v5 >>> 7; // Round 8. v0 += m13; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 16) | v12 >>> 16; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 12) | v4 >>> 12; v1 += m7; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 16) | v13 >>> 16; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 12) | v5 >>> 12; v2 += m12; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 16) | v14 >>> 16; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 12) | v6 >>> 12; v3 += m3; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 16) | v15 >>> 16; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 12) | v7 >>> 12; v2 += m1; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 8) | v14 >>> 8; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 7) | v6 >>> 7; v3 += m9; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 8) | v15 >>> 8; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 7) | v7 >>> 7; v1 += m14; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 8) | v13 >>> 8; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 7) | v5 >>> 7; v0 += m11; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 8) | v12 >>> 8; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 7) | v4 >>> 7; v0 += m5; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 16) | v15 >>> 16; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 12) | v5 >>> 12; v1 += m15; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 16) | v12 >>> 16; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 12) | v6 >>> 12; v2 += m8; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 16) | v13 >>> 16; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 12) | v7 >>> 12; v3 += m2; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 16) | v14 >>> 16; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 12) | v4 >>> 12; v2 += m6; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 8) | v13 >>> 8; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 7) | v7 >>> 7; v3 += m10; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 8) | v14 >>> 8; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 7) | v4 >>> 7; v1 += m4; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 8) | v12 >>> 8; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 7) | v6 >>> 7; v0 += m0; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 8) | v15 >>> 8; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 7) | v5 >>> 7; // Round 9. v0 += m6; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 16) | v12 >>> 16; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 12) | v4 >>> 12; v1 += m14; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 16) | v13 >>> 16; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 12) | v5 >>> 12; v2 += m11; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 16) | v14 >>> 16; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 12) | v6 >>> 12; v3 += m0; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 16) | v15 >>> 16; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 12) | v7 >>> 12; v2 += m3; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 8) | v14 >>> 8; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 7) | v6 >>> 7; v3 += m8; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 8) | v15 >>> 8; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 7) | v7 >>> 7; v1 += m9; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 8) | v13 >>> 8; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 7) | v5 >>> 7; v0 += m15; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 8) | v12 >>> 8; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 7) | v4 >>> 7; v0 += m12; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 16) | v15 >>> 16; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 12) | v5 >>> 12; v1 += m13; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 16) | v12 >>> 16; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 12) | v6 >>> 12; v2 += m1; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 16) | v13 >>> 16; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 12) | v7 >>> 12; v3 += m10; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 16) | v14 >>> 16; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 12) | v4 >>> 12; v2 += m4; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 8) | v13 >>> 8; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 7) | v7 >>> 7; v3 += m5; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 8) | v14 >>> 8; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 7) | v4 >>> 7; v1 += m7; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 8) | v12 >>> 8; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 7) | v6 >>> 7; v0 += m2; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 8) | v15 >>> 8; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 7) | v5 >>> 7; // Round 10. v0 += m10; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 16) | v12 >>> 16; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 12) | v4 >>> 12; v1 += m8; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 16) | v13 >>> 16; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 12) | v5 >>> 12; v2 += m7; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 16) | v14 >>> 16; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 12) | v6 >>> 12; v3 += m1; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 16) | v15 >>> 16; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 12) | v7 >>> 12; v2 += m6; v2 += v6; v14 ^= v2; v14 = v14 << (32 - 8) | v14 >>> 8; v10 += v14; v6 ^= v10; v6 = v6 << (32 - 7) | v6 >>> 7; v3 += m5; v3 += v7; v15 ^= v3; v15 = v15 << (32 - 8) | v15 >>> 8; v11 += v15; v7 ^= v11; v7 = v7 << (32 - 7) | v7 >>> 7; v1 += m4; v1 += v5; v13 ^= v1; v13 = v13 << (32 - 8) | v13 >>> 8; v9 += v13; v5 ^= v9; v5 = v5 << (32 - 7) | v5 >>> 7; v0 += m2; v0 += v4; v12 ^= v0; v12 = v12 << (32 - 8) | v12 >>> 8; v8 += v12; v4 ^= v8; v4 = v4 << (32 - 7) | v4 >>> 7; v0 += m15; v0 += v5; v15 ^= v0; v15 = v15 << (32 - 16) | v15 >>> 16; v10 += v15; v5 ^= v10; v5 = v5 << (32 - 12) | v5 >>> 12; v1 += m9; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 16) | v12 >>> 16; v11 += v12; v6 ^= v11; v6 = v6 << (32 - 12) | v6 >>> 12; v2 += m3; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 16) | v13 >>> 16; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 12) | v7 >>> 12; v3 += m13; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 16) | v14 >>> 16; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 12) | v4 >>> 12; v2 += m12; v2 += v7; v13 ^= v2; v13 = v13 << (32 - 8) | v13 >>> 8; v8 += v13; v7 ^= v8; v7 = v7 << (32 - 7) | v7 >>> 7; v3 += m0; v3 += v4; v14 ^= v3; v14 = v14 << (32 - 8) | v14 >>> 8; v9 += v14; v4 ^= v9; v4 = v4 << (32 - 7) | v4 >>> 7; v1 += m14; v1 += v6; v12 ^= v1; v12 = v12 << (32 - 8) | v12 >>> 8; v11 += v12; v6 ^= v11; v6 = (v6 << (32 - 7)) | (v6 >>> 7); v0 += m11; v0 += v5; v15 ^= v0; v15 = (v15 << (32 - 8)) | (v15 >>> 8); v10 += v15; v5 ^= v10; v5 = (v5 << (32 - 7)) | (v5 >>> 7); this.h[0] ^= v0 ^ v8; this.h[1] ^= v1 ^ v9; this.h[2] ^= v2 ^ v10; this.h[3] ^= v3 ^ v11; this.h[4] ^= v4 ^ v12; this.h[5] ^= v5 ^ v13; this.h[6] ^= v6 ^ v14; this.h[7] ^= v7 ^ v15; }; BLAKE2s.prototype.stringToUtf8Array = function (s) { var arr = []; for (var i = 0; i < s.length; i++) { var c = s.charCodeAt(i); if (c < 128) { arr.push(c); } else if (c > 127 && c < 2048) { arr.push((c >> 6) | 192); arr.push((c & 63) | 128); } else { arr.push((c >> 12) | 224); arr.push(((c >> 6) & 63) | 128); arr.push((c & 64) | 128); } } return arr; }; BLAKE2s.prototype._update = function (p, offset, length) { if (typeof offset === "undefined") { offset = 0; } if (typeof length === "undefined") { length = p.length; } if (this.isFinished) { throw 'update() after calling digest()'; } if (typeof p == 'string') { if (offset != 0) { throw 'offset not supported for strings'; } p = this.stringToUtf8Array(p); length = p.length; offset = 0; } else if (typeof p != 'object') { throw 'unsupported object: string or array required'; } if (length == 0) { return; } var left = 64 - this.nx; if (length > left) { for (var i = 0; i < left; i++) { this.x[this.nx + i] = p[offset + i]; } this.processBlock(64); offset += left; length -= left; this.nx = 0; } while (length > 64) { for (var i = 0; i < 64; i++) { this.x[i] = p[offset + i]; } this.processBlock(64); offset += 64; length -= 64; this.nx = 0; } for (var i = 0; i < length; i++) { this.x[this.nx + i] = p[offset + i]; } this.nx += length; }; BLAKE2s.prototype.update = function (buffer, enc) { if(enc) buffer = new Buffer(buffer, enc) this._update(buffer) return this } BLAKE2s.prototype.digest = function (enc) { if (this.isFinished) { return this.result; } for (var i = this.nx; i < 64; i++) { this.x[i] = 0; } // Set last block flag. this.f0 = 0xffffffff; //TODO in tree mode, set f1 to 0xffffffff. this.processBlock(this.nx); var out = new Buffer(32); for (var i = 0; i < 8; i++) { var h = this.h[i]; out[i * 4 + 0] = (h >>> 0) & 0xff; out[i * 4 + 1] = (h >>> 8) & 0xff; out[i * 4 + 2] = (h >>> 16) & 0xff; out[i * 4 + 3] = (h >>> 24) & 0xff; } this.result = out.slice(0, this.digestLength); this.isFinished = true; return enc ? this.result.toString(enc) : this.result; }; return BLAKE2s; })(); if('undefined' === typeof module) window.Blake2s = BLAKE2s else module.exports = BLAKE2s },{"buffer":61}],29:[function(require,module,exports){ (function (module, exports) { 'use strict'; // Utils function assert (val, msg) { if (!val) throw new Error(msg || 'Assertion failed'); } // Could use `inherits` module, but don't want to move from single file // architecture yet. function inherits (ctor, superCtor) { ctor.super_ = superCtor; var TempCtor = function () {}; TempCtor.prototype = superCtor.prototype; ctor.prototype = new TempCtor(); ctor.prototype.constructor = ctor; } // BN function BN (number, base, endian) { if (BN.isBN(number)) { return number; } this.negative = 0; this.words = null; this.length = 0; // Reduction context this.red = null; if (number !== null) { if (base === 'le' || base === 'be') { endian = base; base = 10; } this._init(number || 0, base || 10, endian || 'be'); } } if (typeof module === 'object') { module.exports = BN; } else { exports.BN = BN; } BN.BN = BN; BN.wordSize = 26; var Buffer; try { Buffer = require('buf' + 'fer').Buffer; } catch (e) { } BN.isBN = function isBN (num) { return num !== null && typeof num === 'object' && num.constructor.name === 'BN' && Array.isArray(num.words); }; BN.max = function max (left, right) { if (left.cmp(right) > 0) return left; return right; }; BN.min = function min (left, right) { if (left.cmp(right) < 0) return left; return right; }; BN.prototype._init = function init (number, base, endian) { if (typeof number === 'number') { return this._initNumber(number, base, endian); } if (typeof number === 'object') { return this._initArray(number, base, endian); } if (base === 'hex') { base = 16; } assert(base === (base | 0) && base >= 2 && base <= 36); number = number.toString().replace(/\s+/g, ''); var start = 0; if (number[0] === '-') { start++; } if (base === 16) { this._parseHex(number, start); } else { this._parseBase(number, base, start); } if (number[0] === '-') { this.negative = 1; } this.strip(); if (endian !== 'le') return; this._initArray(this.toArray(), base, endian); }; BN.prototype._initNumber = function _initNumber (number, base, endian) { if (number < 0) { this.negative = 1; number = -number; } if (number < 0x4000000) { this.words = [ number & 0x3ffffff ]; this.length = 1; } else if (number < 0x10000000000000) { this.words = [ number & 0x3ffffff, (number / 0x4000000) & 0x3ffffff ]; this.length = 2; } else { assert(number < 0x20000000000000); // 2 ^ 53 (unsafe) this.words = [ number & 0x3ffffff, (number / 0x4000000) & 0x3ffffff, 1 ]; this.length = 3; } if (endian !== 'le') return; // Reverse the bytes this._initArray(this.toArray(), base, endian); }; BN.prototype._initArray = function _initArray (number, base, endian) { // Perhaps a Uint8Array assert(typeof number.length === 'number'); if (number.length <= 0) { this.words = [ 0 ]; this.length = 1; return this; } this.length = Math.ceil(number.length / 3); this.words = new Array(this.length); for (var i = 0; i < this.length; i++) { this.words[i] = 0; } var j, w; var off = 0; if (endian === 'be') { for (i = number.length - 1, j = 0; i >= 0; i -= 3) { w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16); this.words[j] |= (w << off) & 0x3ffffff; this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; off += 24; if (off >= 26) { off -= 26; j++; } } } else if (endian === 'le') { for (i = 0, j = 0; i < number.length; i += 3) { w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16); this.words[j] |= (w << off) & 0x3ffffff; this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; off += 24; if (off >= 26) { off -= 26; j++; } } } return this.strip(); }; function parseHex (str, start, end) { var r = 0; var len = Math.min(str.length, end); for (var i = start; i < len; i++) { var c = str.charCodeAt(i) - 48; r <<= 4; // 'a' - 'f' if (c >= 49 && c <= 54) { r |= c - 49 + 0xa; // 'A' - 'F' } else if (c >= 17 && c <= 22) { r |= c - 17 + 0xa; // '0' - '9' } else { r |= c & 0xf; } } return r; } BN.prototype._parseHex = function _parseHex (number, start) { // Create possibly bigger array to ensure that it fits the number this.length = Math.ceil((number.length - start) / 6); this.words = new Array(this.length); for (var i = 0; i < this.length; i++) { this.words[i] = 0; } var j, w; // Scan 24-bit chunks and add them to the number var off = 0; for (i = number.length - 6, j = 0; i >= start; i -= 6) { w = parseHex(number, i, i + 6); this.words[j] |= (w << off) & 0x3ffffff; // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; off += 24; if (off >= 26) { off -= 26; j++; } } if (i + 6 !== start) { w = parseHex(number, start, i + 6); this.words[j] |= (w << off) & 0x3ffffff; this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; } this.strip(); }; function parseBase (str, start, end, mul) { var r = 0; var len = Math.min(str.length, end); for (var i = start; i < len; i++) { var c = str.charCodeAt(i) - 48; r *= mul; // 'a' if (c >= 49) { r += c - 49 + 0xa; // 'A' } else if (c >= 17) { r += c - 17 + 0xa; // '0' - '9' } else { r += c; } } return r; } BN.prototype._parseBase = function _parseBase (number, base, start) { // Initialize as zero this.words = [ 0 ]; this.length = 1; // Find length of limb in base for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) { limbLen++; } limbLen--; limbPow = (limbPow / base) | 0; var total = number.length - start; var mod = total % limbLen; var end = Math.min(total, total - mod) + start; var word = 0; for (var i = start; i < end; i += limbLen) { word = parseBase(number, i, i + limbLen, base); this.imuln(limbPow); if (this.words[0] + word < 0x4000000) { this.words[0] += word; } else { this._iaddn(word); } } if (mod !== 0) { var pow = 1; word = parseBase(number, i, number.length, base); for (i = 0; i < mod; i++) { pow *= base; } this.imuln(pow); if (this.words[0] + word < 0x4000000) { this.words[0] += word; } else { this._iaddn(word); } } }; BN.prototype.copy = function copy (dest) { dest.words = new Array(this.length); for (var i = 0; i < this.length; i++) { dest.words[i] = this.words[i]; } dest.length = this.length; dest.negative = this.negative; dest.red = this.red; }; BN.prototype.clone = function clone () { var r = new BN(null); this.copy(r); return r; }; BN.prototype._expand = function _expand (size) { while (this.length < size) { this.words[this.length++] = 0; } return this; }; // Remove leading `0` from `this` BN.prototype.strip = function strip () { while (this.length > 1 && this.words[this.length - 1] === 0) { this.length--; } return this._normSign(); }; BN.prototype._normSign = function _normSign () { // -0 = 0 if (this.length === 1 && this.words[0] === 0) { this.negative = 0; } return this; }; BN.prototype.inspect = function inspect () { return (this.red ? ''; }; /* var zeros = []; var groupSizes = []; var groupBases = []; var s = ''; var i = -1; while (++i < BN.wordSize) { zeros[i] = s; s += '0'; } groupSizes[0] = 0; groupSizes[1] = 0; groupBases[0] = 0; groupBases[1] = 0; var base = 2 - 1; while (++base < 36 + 1) { var groupSize = 0; var groupBase = 1; while (groupBase < (1 << BN.wordSize) / base) { groupBase *= base; groupSize += 1; } groupSizes[base] = groupSize; groupBases[base] = groupBase; } */ var zeros = [ '', '0', '00', '000', '0000', '00000', '000000', '0000000', '00000000', '000000000', '0000000000', '00000000000', '000000000000', '0000000000000', '00000000000000', '000000000000000', '0000000000000000', '00000000000000000', '000000000000000000', '0000000000000000000', '00000000000000000000', '000000000000000000000', '0000000000000000000000', '00000000000000000000000', '000000000000000000000000', '0000000000000000000000000' ]; var groupSizes = [ 0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 ]; var groupBases = [ 0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176 ]; BN.prototype.toString = function toString (base, padding) { base = base || 10; padding = padding | 0 || 1; var out; if (base === 16 || base === 'hex') { out = ''; var off = 0; var carry = 0; for (var i = 0; i < this.length; i++) { var w = this.words[i]; var word = (((w << off) | carry) & 0xffffff).toString(16); carry = (w >>> (24 - off)) & 0xffffff; if (carry !== 0 || i !== this.length - 1) { out = zeros[6 - word.length] + word + out; } else { out = word + out; } off += 2; if (off >= 26) { off -= 26; i--; } } if (carry !== 0) { out = carry.toString(16) + out; } while (out.length % padding !== 0) { out = '0' + out; } if (this.negative !== 0) { out = '-' + out; } return out; } if (base === (base | 0) && base >= 2 && base <= 36) { // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base)); var groupSize = groupSizes[base]; // var groupBase = Math.pow(base, groupSize); var groupBase = groupBases[base]; out = ''; var c = this.clone(); c.negative = 0; while (!c.isZero()) { var r = c.modn(groupBase).toString(base); c = c.idivn(groupBase); if (!c.isZero()) { out = zeros[groupSize - r.length] + r + out; } else { out = r + out; } } if (this.isZero()) { out = '0' + out; } while (out.length % padding !== 0) { out = '0' + out; } if (this.negative !== 0) { out = '-' + out; } return out; } assert(false, 'Base should be between 2 and 36'); }; BN.prototype.toNumber = function toNumber () { var ret = this.words[0]; if (this.length === 2) { ret += this.words[1] * 0x4000000; } else if (this.length === 3 && this.words[2] === 0x01) { // NOTE: at this stage it is known that the top bit is set ret += 0x10000000000000 + (this.words[1] * 0x4000000); } else if (this.length > 2) { assert(false, 'Number can only safely store up to 53 bits'); } return (this.negative !== 0) ? -ret : ret; }; BN.prototype.toJSON = function toJSON () { return this.toString(16); }; BN.prototype.toBuffer = function toBuffer (endian, length) { assert(typeof Buffer !== 'undefined'); return this.toArrayLike(Buffer, endian, length); }; BN.prototype.toArray = function toArray (endian, length) { return this.toArrayLike(Array, endian, length); }; BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) { var byteLength = this.byteLength(); var reqLength = length || Math.max(1, byteLength); assert(byteLength <= reqLength, 'byte array longer than desired length'); assert(reqLength > 0, 'Requested array length <= 0'); this.strip(); var littleEndian = endian === 'le'; var res = new ArrayType(reqLength); var b, i; var q = this.clone(); if (!littleEndian) { // Assume big-endian for (i = 0; i < reqLength - byteLength; i++) { res[i] = 0; } for (i = 0; !q.isZero(); i++) { b = q.andln(0xff); q.iushrn(8); res[reqLength - i - 1] = b; } } else { for (i = 0; !q.isZero(); i++) { b = q.andln(0xff); q.iushrn(8); res[i] = b; } for (; i < reqLength; i++) { res[i] = 0; } } return res; }; if (Math.clz32) { BN.prototype._countBits = function _countBits (w) { return 32 - Math.clz32(w); }; } else { BN.prototype._countBits = function _countBits (w) { var t = w; var r = 0; if (t >= 0x1000) { r += 13; t >>>= 13; } if (t >= 0x40) { r += 7; t >>>= 7; } if (t >= 0x8) { r += 4; t >>>= 4; } if (t >= 0x02) { r += 2; t >>>= 2; } return r + t; }; } BN.prototype._zeroBits = function _zeroBits (w) { // Short-cut if (w === 0) return 26; var t = w; var r = 0; if ((t & 0x1fff) === 0) { r += 13; t >>>= 13; } if ((t & 0x7f) === 0) { r += 7; t >>>= 7; } if ((t & 0xf) === 0) { r += 4; t >>>= 4; } if ((t & 0x3) === 0) { r += 2; t >>>= 2; } if ((t & 0x1) === 0) { r++; } return r; }; // Return number of used bits in a BN BN.prototype.bitLength = function bitLength () { var w = this.words[this.length - 1]; var hi = this._countBits(w); return (this.length - 1) * 26 + hi; }; function toBitArray (num) { var w = new Array(num.bitLength()); for (var bit = 0; bit < w.length; bit++) { var off = (bit / 26) | 0; var wbit = bit % 26; w[bit] = (num.words[off] & (1 << wbit)) >>> wbit; } return w; } // Number of trailing zero bits BN.prototype.zeroBits = function zeroBits () { if (this.isZero()) return 0; var r = 0; for (var i = 0; i < this.length; i++) { var b = this._zeroBits(this.words[i]); r += b; if (b !== 26) break; } return r; }; BN.prototype.byteLength = function byteLength () { return Math.ceil(this.bitLength() / 8); }; BN.prototype.toTwos = function toTwos (width) { if (this.negative !== 0) { return this.abs().inotn(width).iaddn(1); } return this.clone(); }; BN.prototype.fromTwos = function fromTwos (width) { if (this.testn(width - 1)) { return this.notn(width).iaddn(1).ineg(); } return this.clone(); }; BN.prototype.isNeg = function isNeg () { return this.negative !== 0; }; // Return negative clone of `this` BN.prototype.neg = function neg () { return this.clone().ineg(); }; BN.prototype.ineg = function ineg () { if (!this.isZero()) { this.negative ^= 1; } return this; }; // Or `num` with `this` in-place BN.prototype.iuor = function iuor (num) { while (this.length < num.length) { this.words[this.length++] = 0; } for (var i = 0; i < num.length; i++) { this.words[i] = this.words[i] | num.words[i]; } return this.strip(); }; BN.prototype.ior = function ior (num) { assert((this.negative | num.negative) === 0); return this.iuor(num); }; // Or `num` with `this` BN.prototype.or = function or (num) { if (this.length > num.length) return this.clone().ior(num); return num.clone().ior(this); }; BN.prototype.uor = function uor (num) { if (this.length > num.length) return this.clone().iuor(num); return num.clone().iuor(this); }; // And `num` with `this` in-place BN.prototype.iuand = function iuand (num) { // b = min-length(num, this) var b; if (this.length > num.length) { b = num; } else { b = this; } for (var i = 0; i < b.length; i++) { this.words[i] = this.words[i] & num.words[i]; } this.length = b.length; return this.strip(); }; BN.prototype.iand = function iand (num) { assert((this.negative | num.negative) === 0); return this.iuand(num); }; // And `num` with `this` BN.prototype.and = function and (num) { if (this.length > num.length) return this.clone().iand(num); return num.clone().iand(this); }; BN.prototype.uand = function uand (num) { if (this.length > num.length) return this.clone().iuand(num); return num.clone().iuand(this); }; // Xor `num` with `this` in-place BN.prototype.iuxor = function iuxor (num) { // a.length > b.length var a; var b; if (this.length > num.length) { a = this; b = num; } else { a = num; b = this; } for (var i = 0; i < b.length; i++) { this.words[i] = a.words[i] ^ b.words[i]; } if (this !== a) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } this.length = a.length; return this.strip(); }; BN.prototype.ixor = function ixor (num) { assert((this.negative | num.negative) === 0); return this.iuxor(num); }; // Xor `num` with `this` BN.prototype.xor = function xor (num) { if (this.length > num.length) return this.clone().ixor(num); return num.clone().ixor(this); }; BN.prototype.uxor = function uxor (num) { if (this.length > num.length) return this.clone().iuxor(num); return num.clone().iuxor(this); }; // Not ``this`` with ``width`` bitwidth BN.prototype.inotn = function inotn (width) { assert(typeof width === 'number' && width >= 0); var bytesNeeded = Math.ceil(width / 26) | 0; var bitsLeft = width % 26; // Extend the buffer with leading zeroes this._expand(bytesNeeded); if (bitsLeft > 0) { bytesNeeded--; } // Handle complete words for (var i = 0; i < bytesNeeded; i++) { this.words[i] = ~this.words[i] & 0x3ffffff; } // Handle the residue if (bitsLeft > 0) { this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft)); } // And remove leading zeroes return this.strip(); }; BN.prototype.notn = function notn (width) { return this.clone().inotn(width); }; // Set `bit` of `this` BN.prototype.setn = function setn (bit, val) { assert(typeof bit === 'number' && bit >= 0); var off = (bit / 26) | 0; var wbit = bit % 26; this._expand(off + 1); if (val) { this.words[off] = this.words[off] | (1 << wbit); } else { this.words[off] = this.words[off] & ~(1 << wbit); } return this.strip(); }; // Add `num` to `this` in-place BN.prototype.iadd = function iadd (num) { var r; // negative + positive if (this.negative !== 0 && num.negative === 0) { this.negative = 0; r = this.isub(num); this.negative ^= 1; return this._normSign(); // positive + negative } else if (this.negative === 0 && num.negative !== 0) { num.negative = 0; r = this.isub(num); num.negative = 1; return r._normSign(); } // a.length > b.length var a, b; if (this.length > num.length) { a = this; b = num; } else { a = num; b = this; } var carry = 0; for (var i = 0; i < b.length; i++) { r = (a.words[i] | 0) + (b.words[i] | 0) + carry; this.words[i] = r & 0x3ffffff; carry = r >>> 26; } for (; carry !== 0 && i < a.length; i++) { r = (a.words[i] | 0) + carry; this.words[i] = r & 0x3ffffff; carry = r >>> 26; } this.length = a.length; if (carry !== 0) { this.words[this.length] = carry; this.length++; // Copy the rest of the words } else if (a !== this) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } return this; }; // Add `num` to `this` BN.prototype.add = function add (num) { var res; if (num.negative !== 0 && this.negative === 0) { num.negative = 0; res = this.sub(num); num.negative ^= 1; return res; } else if (num.negative === 0 && this.negative !== 0) { this.negative = 0; res = num.sub(this); this.negative = 1; return res; } if (this.length > num.length) return this.clone().iadd(num); return num.clone().iadd(this); }; // Subtract `num` from `this` in-place BN.prototype.isub = function isub (num) { // this - (-num) = this + num if (num.negative !== 0) { num.negative = 0; var r = this.iadd(num); num.negative = 1; return r._normSign(); // -this - num = -(this + num) } else if (this.negative !== 0) { this.negative = 0; this.iadd(num); this.negative = 1; return this._normSign(); } // At this point both numbers are positive var cmp = this.cmp(num); // Optimization - zeroify if (cmp === 0) { this.negative = 0; this.length = 1; this.words[0] = 0; return this; } // a > b var a, b; if (cmp > 0) { a = this; b = num; } else { a = num; b = this; } var carry = 0; for (var i = 0; i < b.length; i++) { r = (a.words[i] | 0) - (b.words[i] | 0) + carry; carry = r >> 26; this.words[i] = r & 0x3ffffff; } for (; carry !== 0 && i < a.length; i++) { r = (a.words[i] | 0) + carry; carry = r >> 26; this.words[i] = r & 0x3ffffff; } // Copy rest of the words if (carry === 0 && i < a.length && a !== this) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } this.length = Math.max(this.length, i); if (a !== this) { this.negative = 1; } return this.strip(); }; // Subtract `num` from `this` BN.prototype.sub = function sub (num) { return this.clone().isub(num); }; function smallMulTo (self, num, out) { out.negative = num.negative ^ self.negative; var len = (self.length + num.length) | 0; out.length = len; len = (len - 1) | 0; // Peel one iteration (compiler can't do it, because of code complexity) var a = self.words[0] | 0; var b = num.words[0] | 0; var r = a * b; var lo = r & 0x3ffffff; var carry = (r / 0x4000000) | 0; out.words[0] = lo; for (var k = 1; k < len; k++) { // Sum all words with the same `i + j = k` and accumulate `ncarry`, // note that ncarry could be >= 0x3ffffff var ncarry = carry >>> 26; var rword = carry & 0x3ffffff; var maxJ = Math.min(k, num.length - 1); for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { var i = (k - j) | 0; a = self.words[i] | 0; b = num.words[j] | 0; r = a * b + rword; ncarry += (r / 0x4000000) | 0; rword = r & 0x3ffffff; } out.words[k] = rword | 0; carry = ncarry | 0; } if (carry !== 0) { out.words[k] = carry | 0; } else { out.length--; } return out.strip(); } // TODO(indutny): it may be reasonable to omit it for users who don't need // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit // multiplication (like elliptic secp256k1). var comb10MulTo = function comb10MulTo (self, num, out) { var a = self.words; var b = num.words; var o = out.words; var c = 0; var lo; var mid; var hi; var a0 = a[0] | 0; var al0 = a0 & 0x1fff; var ah0 = a0 >>> 13; var a1 = a[1] | 0; var al1 = a1 & 0x1fff; var ah1 = a1 >>> 13; var a2 = a[2] | 0; var al2 = a2 & 0x1fff; var ah2 = a2 >>> 13; var a3 = a[3] | 0; var al3 = a3 & 0x1fff; var ah3 = a3 >>> 13; var a4 = a[4] | 0; var al4 = a4 & 0x1fff; var ah4 = a4 >>> 13; var a5 = a[5] | 0; var al5 = a5 & 0x1fff; var ah5 = a5 >>> 13; var a6 = a[6] | 0; var al6 = a6 & 0x1fff; var ah6 = a6 >>> 13; var a7 = a[7] | 0; var al7 = a7 & 0x1fff; var ah7 = a7 >>> 13; var a8 = a[8] | 0; var al8 = a8 & 0x1fff; var ah8 = a8 >>> 13; var a9 = a[9] | 0; var al9 = a9 & 0x1fff; var ah9 = a9 >>> 13; var b0 = b[0] | 0; var bl0 = b0 & 0x1fff; var bh0 = b0 >>> 13; var b1 = b[1] | 0; var bl1 = b1 & 0x1fff; var bh1 = b1 >>> 13; var b2 = b[2] | 0; var bl2 = b2 & 0x1fff; var bh2 = b2 >>> 13; var b3 = b[3] | 0; var bl3 = b3 & 0x1fff; var bh3 = b3 >>> 13; var b4 = b[4] | 0; var bl4 = b4 & 0x1fff; var bh4 = b4 >>> 13; var b5 = b[5] | 0; var bl5 = b5 & 0x1fff; var bh5 = b5 >>> 13; var b6 = b[6] | 0; var bl6 = b6 & 0x1fff; var bh6 = b6 >>> 13; var b7 = b[7] | 0; var bl7 = b7 & 0x1fff; var bh7 = b7 >>> 13; var b8 = b[8] | 0; var bl8 = b8 & 0x1fff; var bh8 = b8 >>> 13; var b9 = b[9] | 0; var bl9 = b9 & 0x1fff; var bh9 = b9 >>> 13; out.negative = self.negative ^ num.negative; out.length = 19; /* k = 0 */ lo = Math.imul(al0, bl0); mid = Math.imul(al0, bh0); mid += Math.imul(ah0, bl0); hi = Math.imul(ah0, bh0); var w0 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w0 >>> 26); w0 &= 0x3ffffff; /* k = 1 */ lo = Math.imul(al1, bl0); mid = Math.imul(al1, bh0); mid += Math.imul(ah1, bl0); hi = Math.imul(ah1, bh0); lo += Math.imul(al0, bl1); mid += Math.imul(al0, bh1); mid += Math.imul(ah0, bl1); hi += Math.imul(ah0, bh1); var w1 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w1 >>> 26); w1 &= 0x3ffffff; /* k = 2 */ lo = Math.imul(al2, bl0); mid = Math.imul(al2, bh0); mid += Math.imul(ah2, bl0); hi = Math.imul(ah2, bh0); lo += Math.imul(al1, bl1); mid += Math.imul(al1, bh1); mid += Math.imul(ah1, bl1); hi += Math.imul(ah1, bh1); lo += Math.imul(al0, bl2); mid += Math.imul(al0, bh2); mid += Math.imul(ah0, bl2); hi += Math.imul(ah0, bh2); var w2 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w2 >>> 26); w2 &= 0x3ffffff; /* k = 3 */ lo = Math.imul(al3, bl0); mid = Math.imul(al3, bh0); mid += Math.imul(ah3, bl0); hi = Math.imul(ah3, bh0); lo += Math.imul(al2, bl1); mid += Math.imul(al2, bh1); mid += Math.imul(ah2, bl1); hi += Math.imul(ah2, bh1); lo += Math.imul(al1, bl2); mid += Math.imul(al1, bh2); mid += Math.imul(ah1, bl2); hi += Math.imul(ah1, bh2); lo += Math.imul(al0, bl3); mid += Math.imul(al0, bh3); mid += Math.imul(ah0, bl3); hi += Math.imul(ah0, bh3); var w3 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w3 >>> 26); w3 &= 0x3ffffff; /* k = 4 */ lo = Math.imul(al4, bl0); mid = Math.imul(al4, bh0); mid += Math.imul(ah4, bl0); hi = Math.imul(ah4, bh0); lo += Math.imul(al3, bl1); mid += Math.imul(al3, bh1); mid += Math.imul(ah3, bl1); hi += Math.imul(ah3, bh1); lo += Math.imul(al2, bl2); mid += Math.imul(al2, bh2); mid += Math.imul(ah2, bl2); hi += Math.imul(ah2, bh2); lo += Math.imul(al1, bl3); mid += Math.imul(al1, bh3); mid += Math.imul(ah1, bl3); hi += Math.imul(ah1, bh3); lo += Math.imul(al0, bl4); mid += Math.imul(al0, bh4); mid += Math.imul(ah0, bl4); hi += Math.imul(ah0, bh4); var w4 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w4 >>> 26); w4 &= 0x3ffffff; /* k = 5 */ lo = Math.imul(al5, bl0); mid = Math.imul(al5, bh0); mid += Math.imul(ah5, bl0); hi = Math.imul(ah5, bh0); lo += Math.imul(al4, bl1); mid += Math.imul(al4, bh1); mid += Math.imul(ah4, bl1); hi += Math.imul(ah4, bh1); lo += Math.imul(al3, bl2); mid += Math.imul(al3, bh2); mid += Math.imul(ah3, bl2); hi += Math.imul(ah3, bh2); lo += Math.imul(al2, bl3); mid += Math.imul(al2, bh3); mid += Math.imul(ah2, bl3); hi += Math.imul(ah2, bh3); lo += Math.imul(al1, bl4); mid += Math.imul(al1, bh4); mid += Math.imul(ah1, bl4); hi += Math.imul(ah1, bh4); lo += Math.imul(al0, bl5); mid += Math.imul(al0, bh5); mid += Math.imul(ah0, bl5); hi += Math.imul(ah0, bh5); var w5 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w5 >>> 26); w5 &= 0x3ffffff; /* k = 6 */ lo = Math.imul(al6, bl0); mid = Math.imul(al6, bh0); mid += Math.imul(ah6, bl0); hi = Math.imul(ah6, bh0); lo += Math.imul(al5, bl1); mid += Math.imul(al5, bh1); mid += Math.imul(ah5, bl1); hi += Math.imul(ah5, bh1); lo += Math.imul(al4, bl2); mid += Math.imul(al4, bh2); mid += Math.imul(ah4, bl2); hi += Math.imul(ah4, bh2); lo += Math.imul(al3, bl3); mid += Math.imul(al3, bh3); mid += Math.imul(ah3, bl3); hi += Math.imul(ah3, bh3); lo += Math.imul(al2, bl4); mid += Math.imul(al2, bh4); mid += Math.imul(ah2, bl4); hi += Math.imul(ah2, bh4); lo += Math.imul(al1, bl5); mid += Math.imul(al1, bh5); mid += Math.imul(ah1, bl5); hi += Math.imul(ah1, bh5); lo += Math.imul(al0, bl6); mid += Math.imul(al0, bh6); mid += Math.imul(ah0, bl6); hi += Math.imul(ah0, bh6); var w6 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w6 >>> 26); w6 &= 0x3ffffff; /* k = 7 */ lo = Math.imul(al7, bl0); mid = Math.imul(al7, bh0); mid += Math.imul(ah7, bl0); hi = Math.imul(ah7, bh0); lo += Math.imul(al6, bl1); mid += Math.imul(al6, bh1); mid += Math.imul(ah6, bl1); hi += Math.imul(ah6, bh1); lo += Math.imul(al5, bl2); mid += Math.imul(al5, bh2); mid += Math.imul(ah5, bl2); hi += Math.imul(ah5, bh2); lo += Math.imul(al4, bl3); mid += Math.imul(al4, bh3); mid += Math.imul(ah4, bl3); hi += Math.imul(ah4, bh3); lo += Math.imul(al3, bl4); mid += Math.imul(al3, bh4); mid += Math.imul(ah3, bl4); hi += Math.imul(ah3, bh4); lo += Math.imul(al2, bl5); mid += Math.imul(al2, bh5); mid += Math.imul(ah2, bl5); hi += Math.imul(ah2, bh5); lo += Math.imul(al1, bl6); mid += Math.imul(al1, bh6); mid += Math.imul(ah1, bl6); hi += Math.imul(ah1, bh6); lo += Math.imul(al0, bl7); mid += Math.imul(al0, bh7); mid += Math.imul(ah0, bl7); hi += Math.imul(ah0, bh7); var w7 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w7 >>> 26); w7 &= 0x3ffffff; /* k = 8 */ lo = Math.imul(al8, bl0); mid = Math.imul(al8, bh0); mid += Math.imul(ah8, bl0); hi = Math.imul(ah8, bh0); lo += Math.imul(al7, bl1); mid += Math.imul(al7, bh1); mid += Math.imul(ah7, bl1); hi += Math.imul(ah7, bh1); lo += Math.imul(al6, bl2); mid += Math.imul(al6, bh2); mid += Math.imul(ah6, bl2); hi += Math.imul(ah6, bh2); lo += Math.imul(al5, bl3); mid += Math.imul(al5, bh3); mid += Math.imul(ah5, bl3); hi += Math.imul(ah5, bh3); lo += Math.imul(al4, bl4); mid += Math.imul(al4, bh4); mid += Math.imul(ah4, bl4); hi += Math.imul(ah4, bh4); lo += Math.imul(al3, bl5); mid += Math.imul(al3, bh5); mid += Math.imul(ah3, bl5); hi += Math.imul(ah3, bh5); lo += Math.imul(al2, bl6); mid += Math.imul(al2, bh6); mid += Math.imul(ah2, bl6); hi += Math.imul(ah2, bh6); lo += Math.imul(al1, bl7); mid += Math.imul(al1, bh7); mid += Math.imul(ah1, bl7); hi += Math.imul(ah1, bh7); lo += Math.imul(al0, bl8); mid += Math.imul(al0, bh8); mid += Math.imul(ah0, bl8); hi += Math.imul(ah0, bh8); var w8 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w8 >>> 26); w8 &= 0x3ffffff; /* k = 9 */ lo = Math.imul(al9, bl0); mid = Math.imul(al9, bh0); mid += Math.imul(ah9, bl0); hi = Math.imul(ah9, bh0); lo += Math.imul(al8, bl1); mid += Math.imul(al8, bh1); mid += Math.imul(ah8, bl1); hi += Math.imul(ah8, bh1); lo += Math.imul(al7, bl2); mid += Math.imul(al7, bh2); mid += Math.imul(ah7, bl2); hi += Math.imul(ah7, bh2); lo += Math.imul(al6, bl3); mid += Math.imul(al6, bh3); mid += Math.imul(ah6, bl3); hi += Math.imul(ah6, bh3); lo += Math.imul(al5, bl4); mid += Math.imul(al5, bh4); mid += Math.imul(ah5, bl4); hi += Math.imul(ah5, bh4); lo += Math.imul(al4, bl5); mid += Math.imul(al4, bh5); mid += Math.imul(ah4, bl5); hi += Math.imul(ah4, bh5); lo += Math.imul(al3, bl6); mid += Math.imul(al3, bh6); mid += Math.imul(ah3, bl6); hi += Math.imul(ah3, bh6); lo += Math.imul(al2, bl7); mid += Math.imul(al2, bh7); mid += Math.imul(ah2, bl7); hi += Math.imul(ah2, bh7); lo += Math.imul(al1, bl8); mid += Math.imul(al1, bh8); mid += Math.imul(ah1, bl8); hi += Math.imul(ah1, bh8); lo += Math.imul(al0, bl9); mid += Math.imul(al0, bh9); mid += Math.imul(ah0, bl9); hi += Math.imul(ah0, bh9); var w9 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w9 >>> 26); w9 &= 0x3ffffff; /* k = 10 */ lo = Math.imul(al9, bl1); mid = Math.imul(al9, bh1); mid += Math.imul(ah9, bl1); hi = Math.imul(ah9, bh1); lo += Math.imul(al8, bl2); mid += Math.imul(al8, bh2); mid += Math.imul(ah8, bl2); hi += Math.imul(ah8, bh2); lo += Math.imul(al7, bl3); mid += Math.imul(al7, bh3); mid += Math.imul(ah7, bl3); hi += Math.imul(ah7, bh3); lo += Math.imul(al6, bl4); mid += Math.imul(al6, bh4); mid += Math.imul(ah6, bl4); hi += Math.imul(ah6, bh4); lo += Math.imul(al5, bl5); mid += Math.imul(al5, bh5); mid += Math.imul(ah5, bl5); hi += Math.imul(ah5, bh5); lo += Math.imul(al4, bl6); mid += Math.imul(al4, bh6); mid += Math.imul(ah4, bl6); hi += Math.imul(ah4, bh6); lo += Math.imul(al3, bl7); mid += Math.imul(al3, bh7); mid += Math.imul(ah3, bl7); hi += Math.imul(ah3, bh7); lo += Math.imul(al2, bl8); mid += Math.imul(al2, bh8); mid += Math.imul(ah2, bl8); hi += Math.imul(ah2, bh8); lo += Math.imul(al1, bl9); mid += Math.imul(al1, bh9); mid += Math.imul(ah1, bl9); hi += Math.imul(ah1, bh9); var w10 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w10 >>> 26); w10 &= 0x3ffffff; /* k = 11 */ lo = Math.imul(al9, bl2); mid = Math.imul(al9, bh2); mid += Math.imul(ah9, bl2); hi = Math.imul(ah9, bh2); lo += Math.imul(al8, bl3); mid += Math.imul(al8, bh3); mid += Math.imul(ah8, bl3); hi += Math.imul(ah8, bh3); lo += Math.imul(al7, bl4); mid += Math.imul(al7, bh4); mid += Math.imul(ah7, bl4); hi += Math.imul(ah7, bh4); lo += Math.imul(al6, bl5); mid += Math.imul(al6, bh5); mid += Math.imul(ah6, bl5); hi += Math.imul(ah6, bh5); lo += Math.imul(al5, bl6); mid += Math.imul(al5, bh6); mid += Math.imul(ah5, bl6); hi += Math.imul(ah5, bh6); lo += Math.imul(al4, bl7); mid += Math.imul(al4, bh7); mid += Math.imul(ah4, bl7); hi += Math.imul(ah4, bh7); lo += Math.imul(al3, bl8); mid += Math.imul(al3, bh8); mid += Math.imul(ah3, bl8); hi += Math.imul(ah3, bh8); lo += Math.imul(al2, bl9); mid += Math.imul(al2, bh9); mid += Math.imul(ah2, bl9); hi += Math.imul(ah2, bh9); var w11 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w11 >>> 26); w11 &= 0x3ffffff; /* k = 12 */ lo = Math.imul(al9, bl3); mid = Math.imul(al9, bh3); mid += Math.imul(ah9, bl3); hi = Math.imul(ah9, bh3); lo += Math.imul(al8, bl4); mid += Math.imul(al8, bh4); mid += Math.imul(ah8, bl4); hi += Math.imul(ah8, bh4); lo += Math.imul(al7, bl5); mid += Math.imul(al7, bh5); mid += Math.imul(ah7, bl5); hi += Math.imul(ah7, bh5); lo += Math.imul(al6, bl6); mid += Math.imul(al6, bh6); mid += Math.imul(ah6, bl6); hi += Math.imul(ah6, bh6); lo += Math.imul(al5, bl7); mid += Math.imul(al5, bh7); mid += Math.imul(ah5, bl7); hi += Math.imul(ah5, bh7); lo += Math.imul(al4, bl8); mid += Math.imul(al4, bh8); mid += Math.imul(ah4, bl8); hi += Math.imul(ah4, bh8); lo += Math.imul(al3, bl9); mid += Math.imul(al3, bh9); mid += Math.imul(ah3, bl9); hi += Math.imul(ah3, bh9); var w12 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w12 >>> 26); w12 &= 0x3ffffff; /* k = 13 */ lo = Math.imul(al9, bl4); mid = Math.imul(al9, bh4); mid += Math.imul(ah9, bl4); hi = Math.imul(ah9, bh4); lo += Math.imul(al8, bl5); mid += Math.imul(al8, bh5); mid += Math.imul(ah8, bl5); hi += Math.imul(ah8, bh5); lo += Math.imul(al7, bl6); mid += Math.imul(al7, bh6); mid += Math.imul(ah7, bl6); hi += Math.imul(ah7, bh6); lo += Math.imul(al6, bl7); mid += Math.imul(al6, bh7); mid += Math.imul(ah6, bl7); hi += Math.imul(ah6, bh7); lo += Math.imul(al5, bl8); mid += Math.imul(al5, bh8); mid += Math.imul(ah5, bl8); hi += Math.imul(ah5, bh8); lo += Math.imul(al4, bl9); mid += Math.imul(al4, bh9); mid += Math.imul(ah4, bl9); hi += Math.imul(ah4, bh9); var w13 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w13 >>> 26); w13 &= 0x3ffffff; /* k = 14 */ lo = Math.imul(al9, bl5); mid = Math.imul(al9, bh5); mid += Math.imul(ah9, bl5); hi = Math.imul(ah9, bh5); lo += Math.imul(al8, bl6); mid += Math.imul(al8, bh6); mid += Math.imul(ah8, bl6); hi += Math.imul(ah8, bh6); lo += Math.imul(al7, bl7); mid += Math.imul(al7, bh7); mid += Math.imul(ah7, bl7); hi += Math.imul(ah7, bh7); lo += Math.imul(al6, bl8); mid += Math.imul(al6, bh8); mid += Math.imul(ah6, bl8); hi += Math.imul(ah6, bh8); lo += Math.imul(al5, bl9); mid += Math.imul(al5, bh9); mid += Math.imul(ah5, bl9); hi += Math.imul(ah5, bh9); var w14 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w14 >>> 26); w14 &= 0x3ffffff; /* k = 15 */ lo = Math.imul(al9, bl6); mid = Math.imul(al9, bh6); mid += Math.imul(ah9, bl6); hi = Math.imul(ah9, bh6); lo += Math.imul(al8, bl7); mid += Math.imul(al8, bh7); mid += Math.imul(ah8, bl7); hi += Math.imul(ah8, bh7); lo += Math.imul(al7, bl8); mid += Math.imul(al7, bh8); mid += Math.imul(ah7, bl8); hi += Math.imul(ah7, bh8); lo += Math.imul(al6, bl9); mid += Math.imul(al6, bh9); mid += Math.imul(ah6, bl9); hi += Math.imul(ah6, bh9); var w15 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w15 >>> 26); w15 &= 0x3ffffff; /* k = 16 */ lo = Math.imul(al9, bl7); mid = Math.imul(al9, bh7); mid += Math.imul(ah9, bl7); hi = Math.imul(ah9, bh7); lo += Math.imul(al8, bl8); mid += Math.imul(al8, bh8); mid += Math.imul(ah8, bl8); hi += Math.imul(ah8, bh8); lo += Math.imul(al7, bl9); mid += Math.imul(al7, bh9); mid += Math.imul(ah7, bl9); hi += Math.imul(ah7, bh9); var w16 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w16 >>> 26); w16 &= 0x3ffffff; /* k = 17 */ lo = Math.imul(al9, bl8); mid = Math.imul(al9, bh8); mid += Math.imul(ah9, bl8); hi = Math.imul(ah9, bh8); lo += Math.imul(al8, bl9); mid += Math.imul(al8, bh9); mid += Math.imul(ah8, bl9); hi += Math.imul(ah8, bh9); var w17 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w17 >>> 26); w17 &= 0x3ffffff; /* k = 18 */ lo = Math.imul(al9, bl9); mid = Math.imul(al9, bh9); mid += Math.imul(ah9, bl9); hi = Math.imul(ah9, bh9); var w18 = c + lo + ((mid & 0x1fff) << 13); c = hi + (mid >>> 13) + (w18 >>> 26); w18 &= 0x3ffffff; o[0] = w0; o[1] = w1; o[2] = w2; o[3] = w3; o[4] = w4; o[5] = w5; o[6] = w6; o[7] = w7; o[8] = w8; o[9] = w9; o[10] = w10; o[11] = w11; o[12] = w12; o[13] = w13; o[14] = w14; o[15] = w15; o[16] = w16; o[17] = w17; o[18] = w18; if (c !== 0) { o[19] = c; out.length++; } return out; }; // Polyfill comb if (!Math.imul) { comb10MulTo = smallMulTo; } function bigMulTo (self, num, out) { out.negative = num.negative ^ self.negative; out.length = self.length + num.length; var carry = 0; var hncarry = 0; for (var k = 0; k < out.length - 1; k++) { // Sum all words with the same `i + j = k` and accumulate `ncarry`, // note that ncarry could be >= 0x3ffffff var ncarry = hncarry; hncarry = 0; var rword = carry & 0x3ffffff; var maxJ = Math.min(k, num.length - 1); for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { var i = k - j; var a = self.words[i] | 0; var b = num.words[j] | 0; var r = a * b; var lo = r & 0x3ffffff; ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0; lo = (lo + rword) | 0; rword = lo & 0x3ffffff; ncarry = (ncarry + (lo >>> 26)) | 0; hncarry += ncarry >>> 26; ncarry &= 0x3ffffff; } out.words[k] = rword; carry = ncarry; ncarry = hncarry; } if (carry !== 0) { out.words[k] = carry; } else { out.length--; } return out.strip(); } function jumboMulTo (self, num, out) { var fftm = new FFTM(); return fftm.mulp(self, num, out); } BN.prototype.mulTo = function mulTo (num, out) { var res; var len = this.length + num.length; if (this.length === 10 && num.length === 10) { res = comb10MulTo(this, num, out); } else if (len < 63) { res = smallMulTo(this, num, out); } else if (len < 1024) { res = bigMulTo(this, num, out); } else { res = jumboMulTo(this, num, out); } return res; }; // Cooley-Tukey algorithm for FFT // slightly revisited to rely on looping instead of recursion function FFTM (x, y) { this.x = x; this.y = y; } FFTM.prototype.makeRBT = function makeRBT (N) { var t = new Array(N); var l = BN.prototype._countBits(N) - 1; for (var i = 0; i < N; i++) { t[i] = this.revBin(i, l, N); } return t; }; // Returns binary-reversed representation of `x` FFTM.prototype.revBin = function revBin (x, l, N) { if (x === 0 || x === N - 1) return x; var rb = 0; for (var i = 0; i < l; i++) { rb |= (x & 1) << (l - i - 1); x >>= 1; } return rb; }; // Performs "tweedling" phase, therefore 'emulating' // behaviour of the recursive algorithm FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) { for (var i = 0; i < N; i++) { rtws[i] = rws[rbt[i]]; itws[i] = iws[rbt[i]]; } }; FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) { this.permute(rbt, rws, iws, rtws, itws, N); for (var s = 1; s < N; s <<= 1) { var l = s << 1; var rtwdf = Math.cos(2 * Math.PI / l); var itwdf = Math.sin(2 * Math.PI / l); for (var p = 0; p < N; p += l) { var rtwdf_ = rtwdf; var itwdf_ = itwdf; for (var j = 0; j < s; j++) { var re = rtws[p + j]; var ie = itws[p + j]; var ro = rtws[p + j + s]; var io = itws[p + j + s]; var rx = rtwdf_ * ro - itwdf_ * io; io = rtwdf_ * io + itwdf_ * ro; ro = rx; rtws[p + j] = re + ro; itws[p + j] = ie + io; rtws[p + j + s] = re - ro; itws[p + j + s] = ie - io; /* jshint maxdepth : false */ if (j !== l) { rx = rtwdf * rtwdf_ - itwdf * itwdf_; itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; rtwdf_ = rx; } } } } }; FFTM.prototype.guessLen13b = function guessLen13b (n, m) { var N = Math.max(m, n) | 1; var odd = N & 1; var i = 0; for (N = N / 2 | 0; N; N = N >>> 1) { i++; } return 1 << i + 1 + odd; }; FFTM.prototype.conjugate = function conjugate (rws, iws, N) { if (N <= 1) return; for (var i = 0; i < N / 2; i++) { var t = rws[i]; rws[i] = rws[N - i - 1]; rws[N - i - 1] = t; t = iws[i]; iws[i] = -iws[N - i - 1]; iws[N - i - 1] = -t; } }; FFTM.prototype.normalize13b = function normalize13b (ws, N) { var carry = 0; for (var i = 0; i < N / 2; i++) { var w = Math.round(ws[2 * i + 1] / N) * 0x2000 + Math.round(ws[2 * i] / N) + carry; ws[i] = w & 0x3ffffff; if (w < 0x4000000) { carry = 0; } else { carry = w / 0x4000000 | 0; } } return ws; }; FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) { var carry = 0; for (var i = 0; i < len; i++) { carry = carry + (ws[i] | 0); rws[2 * i] = carry & 0x1fff; carry = carry >>> 13; rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13; } // Pad with zeroes for (i = 2 * len; i < N; ++i) { rws[i] = 0; } assert(carry === 0); assert((carry & ~0x1fff) === 0); }; FFTM.prototype.stub = function stub (N) { var ph = new Array(N); for (var i = 0; i < N; i++) { ph[i] = 0; } return ph; }; FFTM.prototype.mulp = function mulp (x, y, out) { var N = 2 * this.guessLen13b(x.length, y.length); var rbt = this.makeRBT(N); var _ = this.stub(N); var rws = new Array(N); var rwst = new Array(N); var iwst = new Array(N); var nrws = new Array(N); var nrwst = new Array(N); var niwst = new Array(N); var rmws = out.words; rmws.length = N; this.convert13b(x.words, x.length, rws, N); this.convert13b(y.words, y.length, nrws, N); this.transform(rws, _, rwst, iwst, N, rbt); this.transform(nrws, _, nrwst, niwst, N, rbt); for (var i = 0; i < N; i++) { var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; rwst[i] = rx; } this.conjugate(rwst, iwst, N); this.transform(rwst, iwst, rmws, _, N, rbt); this.conjugate(rmws, _, N); this.normalize13b(rmws, N); out.negative = x.negative ^ y.negative; out.length = x.length + y.length; return out.strip(); }; // Multiply `this` by `num` BN.prototype.mul = function mul (num) { var out = new BN(null); out.words = new Array(this.length + num.length); return this.mulTo(num, out); }; // Multiply employing FFT BN.prototype.mulf = function mulf (num) { var out = new BN(null); out.words = new Array(this.length + num.length); return jumboMulTo(this, num, out); }; // In-place Multiplication BN.prototype.imul = function imul (num) { return this.clone().mulTo(num, this); }; BN.prototype.imuln = function imuln (num) { assert(typeof num === 'number'); assert(num < 0x4000000); // Carry var carry = 0; for (var i = 0; i < this.length; i++) { var w = (this.words[i] | 0) * num; var lo = (w & 0x3ffffff) + (carry & 0x3ffffff); carry >>= 26; carry += (w / 0x4000000) | 0; // NOTE: lo is 27bit maximum carry += lo >>> 26; this.words[i] = lo & 0x3ffffff; } if (carry !== 0) { this.words[i] = carry; this.length++; } return this; }; BN.prototype.muln = function muln (num) { return this.clone().imuln(num); }; // `this` * `this` BN.prototype.sqr = function sqr () { return this.mul(this); }; // `this` * `this` in-place BN.prototype.isqr = function isqr () { return this.imul(this.clone()); }; // Math.pow(`this`, `num`) BN.prototype.pow = function pow (num) { var w = toBitArray(num); if (w.length === 0) return new BN(1); // Skip leading zeroes var res = this; for (var i = 0; i < w.length; i++, res = res.sqr()) { if (w[i] !== 0) break; } if (++i < w.length) { for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { if (w[i] === 0) continue; res = res.mul(q); } } return res; }; // Shift-left in-place BN.prototype.iushln = function iushln (bits) { assert(typeof bits === 'number' && bits >= 0); var r = bits % 26; var s = (bits - r) / 26; var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r); var i; if (r !== 0) { var carry = 0; for (i = 0; i < this.length; i++) { var newCarry = this.words[i] & carryMask; var c = ((this.words[i] | 0) - newCarry) << r; this.words[i] = c | carry; carry = newCarry >>> (26 - r); } if (carry) { this.words[i] = carry; this.length++; } } if (s !== 0) { for (i = this.length - 1; i >= 0; i--) { this.words[i + s] = this.words[i]; } for (i = 0; i < s; i++) { this.words[i] = 0; } this.length += s; } return this.strip(); }; BN.prototype.ishln = function ishln (bits) { // TODO(indutny): implement me assert(this.negative === 0); return this.iushln(bits); }; // Shift-right in-place // NOTE: `hint` is a lowest bit before trailing zeroes // NOTE: if `extended` is present - it will be filled with destroyed bits BN.prototype.iushrn = function iushrn (bits, hint, extended) { assert(typeof bits === 'number' && bits >= 0); var h; if (hint) { h = (hint - (hint % 26)) / 26; } else { h = 0; } var r = bits % 26; var s = Math.min((bits - r) / 26, this.length); var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); var maskedWords = extended; h -= s; h = Math.max(0, h); // Extended mode, copy masked part if (maskedWords) { for (var i = 0; i < s; i++) { maskedWords.words[i] = this.words[i]; } maskedWords.length = s; } if (s === 0) { // No-op, we should not move anything at all } else if (this.length > s) { this.length -= s; for (i = 0; i < this.length; i++) { this.words[i] = this.words[i + s]; } } else { this.words[0] = 0; this.length = 1; } var carry = 0; for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { var word = this.words[i] | 0; this.words[i] = (carry << (26 - r)) | (word >>> r); carry = word & mask; } // Push carried bits as a mask if (maskedWords && carry !== 0) { maskedWords.words[maskedWords.length++] = carry; } if (this.length === 0) { this.words[0] = 0; this.length = 1; } return this.strip(); }; BN.prototype.ishrn = function ishrn (bits, hint, extended) { // TODO(indutny): implement me assert(this.negative === 0); return this.iushrn(bits, hint, extended); }; // Shift-left BN.prototype.shln = function shln (bits) { return this.clone().ishln(bits); }; BN.prototype.ushln = function ushln (bits) { return this.clone().iushln(bits); }; // Shift-right BN.prototype.shrn = function shrn (bits) { return this.clone().ishrn(bits); }; BN.prototype.ushrn = function ushrn (bits) { return this.clone().iushrn(bits); }; // Test if n bit is set BN.prototype.testn = function testn (bit) { assert(typeof bit === 'number' && bit >= 0); var r = bit % 26; var s = (bit - r) / 26; var q = 1 << r; // Fast case: bit is much higher than all existing words if (this.length <= s) return false; // Check bit and return var w = this.words[s]; return !!(w & q); }; // Return only lowers bits of number (in-place) BN.prototype.imaskn = function imaskn (bits) { assert(typeof bits === 'number' && bits >= 0); var r = bits % 26; var s = (bits - r) / 26; assert(this.negative === 0, 'imaskn works only with positive numbers'); if (r !== 0) { s++; } this.length = Math.min(s, this.length); if (r !== 0) { var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); this.words[this.length - 1] &= mask; } return this.strip(); }; // Return only lowers bits of number BN.prototype.maskn = function maskn (bits) { return this.clone().imaskn(bits); }; // Add plain number `num` to `this` BN.prototype.iaddn = function iaddn (num) { assert(typeof num === 'number'); assert(num < 0x4000000); if (num < 0) return this.isubn(-num); // Possible sign change if (this.negative !== 0) { if (this.length === 1 && (this.words[0] | 0) < num) { this.words[0] = num - (this.words[0] | 0); this.negative = 0; return this; } this.negative = 0; this.isubn(num); this.negative = 1; return this; } // Add without checks return this._iaddn(num); }; BN.prototype._iaddn = function _iaddn (num) { this.words[0] += num; // Carry for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) { this.words[i] -= 0x4000000; if (i === this.length - 1) { this.words[i + 1] = 1; } else { this.words[i + 1]++; } } this.length = Math.max(this.length, i + 1); return this; }; // Subtract plain number `num` from `this` BN.prototype.isubn = function isubn (num) { assert(typeof num === 'number'); assert(num < 0x4000000); if (num < 0) return this.iaddn(-num); if (this.negative !== 0) { this.negative = 0; this.iaddn(num); this.negative = 1; return this; } this.words[0] -= num; if (this.length === 1 && this.words[0] < 0) { this.words[0] = -this.words[0]; this.negative = 1; } else { // Carry for (var i = 0; i < this.length && this.words[i] < 0; i++) { this.words[i] += 0x4000000; this.words[i + 1] -= 1; } } return this.strip(); }; BN.prototype.addn = function addn (num) { return this.clone().iaddn(num); }; BN.prototype.subn = function subn (num) { return this.clone().isubn(num); }; BN.prototype.iabs = function iabs () { this.negative = 0; return this; }; BN.prototype.abs = function abs () { return this.clone().iabs(); }; BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) { var len = num.length + shift; var i; this._expand(len); var w; var carry = 0; for (i = 0; i < num.length; i++) { w = (this.words[i + shift] | 0) + carry; var right = (num.words[i] | 0) * mul; w -= right & 0x3ffffff; carry = (w >> 26) - ((right / 0x4000000) | 0); this.words[i + shift] = w & 0x3ffffff; } for (; i < this.length - shift; i++) { w = (this.words[i + shift] | 0) + carry; carry = w >> 26; this.words[i + shift] = w & 0x3ffffff; } if (carry === 0) return this.strip(); // Subtraction overflow assert(carry === -1); carry = 0; for (i = 0; i < this.length; i++) { w = -(this.words[i] | 0) + carry; carry = w >> 26; this.words[i] = w & 0x3ffffff; } this.negative = 1; return this.strip(); }; BN.prototype._wordDiv = function _wordDiv (num, mode) { var shift = this.length - num.length; var a = this.clone(); var b = num; // Normalize var bhi = b.words[b.length - 1] | 0; var bhiBits = this._countBits(bhi); shift = 26 - bhiBits; if (shift !== 0) { b = b.ushln(shift); a.iushln(shift); bhi = b.words[b.length - 1] | 0; } // Initialize quotient var m = a.length - b.length; var q; if (mode !== 'mod') { q = new BN(null); q.length = m + 1; q.words = new Array(q.length); for (var i = 0; i < q.length; i++) { q.words[i] = 0; } } var diff = a.clone()._ishlnsubmul(b, 1, m); if (diff.negative === 0) { a = diff; if (q) { q.words[m] = 1; } } for (var j = m - 1; j >= 0; j--) { var qj = (a.words[b.length + j] | 0) * 0x4000000 + (a.words[b.length + j - 1] | 0); // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max // (0x7ffffff) qj = Math.min((qj / bhi) | 0, 0x3ffffff); a._ishlnsubmul(b, qj, j); while (a.negative !== 0) { qj--; a.negative = 0; a._ishlnsubmul(b, 1, j); if (!a.isZero()) { a.negative ^= 1; } } if (q) { q.words[j] = qj; } } if (q) { q.strip(); } a.strip(); // Denormalize if (mode !== 'div' && shift !== 0) { a.iushrn(shift); } return { div: q || null, mod: a }; }; // NOTE: 1) `mode` can be set to `mod` to request mod only, // to `div` to request div only, or be absent to // request both div & mod // 2) `positive` is true if unsigned mod is requested BN.prototype.divmod = function divmod (num, mode, positive) { assert(!num.isZero()); if (this.isZero()) { return { div: new BN(0), mod: new BN(0) }; } var div, mod, res; if (this.negative !== 0 && num.negative === 0) { res = this.neg().divmod(num, mode); if (mode !== 'mod') { div = res.div.neg(); } if (mode !== 'div') { mod = res.mod.neg(); if (positive && mod.negative !== 0) { mod.iadd(num); } } return { div: div, mod: mod }; } if (this.negative === 0 && num.negative !== 0) { res = this.divmod(num.neg(), mode); if (mode !== 'mod') { div = res.div.neg(); } return { div: div, mod: res.mod }; } if ((this.negative & num.negative) !== 0) { res = this.neg().divmod(num.neg(), mode); if (mode !== 'div') { mod = res.mod.neg(); if (positive && mod.negative !== 0) { mod.isub(num); } } return { div: res.div, mod: mod }; } // Both numbers are positive at this point // Strip both numbers to approximate shift value if (num.length > this.length || this.cmp(num) < 0) { return { div: new BN(0), mod: this }; } // Very short reduction if (num.length === 1) { if (mode === 'div') { return { div: this.divn(num.words[0]), mod: null }; } if (mode === 'mod') { return { div: null, mod: new BN(this.modn(num.words[0])) }; } return { div: this.divn(num.words[0]), mod: new BN(this.modn(num.words[0])) }; } return this._wordDiv(num, mode); }; // Find `this` / `num` BN.prototype.div = function div (num) { return this.divmod(num, 'div', false).div; }; // Find `this` % `num` BN.prototype.mod = function mod (num) { return this.divmod(num, 'mod', false).mod; }; BN.prototype.umod = function umod (num) { return this.divmod(num, 'mod', true).mod; }; // Find Round(`this` / `num`) BN.prototype.divRound = function divRound (num) { var dm = this.divmod(num); // Fast case - exact division if (dm.mod.isZero()) return dm.div; var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; var half = num.ushrn(1); var r2 = num.andln(1); var cmp = mod.cmp(half); // Round down if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; // Round up return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); }; BN.prototype.modn = function modn (num) { assert(num <= 0x3ffffff); var p = (1 << 26) % num; var acc = 0; for (var i = this.length - 1; i >= 0; i--) { acc = (p * acc + (this.words[i] | 0)) % num; } return acc; }; // In-place division by number BN.prototype.idivn = function idivn (num) { assert(num <= 0x3ffffff); var carry = 0; for (var i = this.length - 1; i >= 0; i--) { var w = (this.words[i] | 0) + carry * 0x4000000; this.words[i] = (w / num) | 0; carry = w % num; } return this.strip(); }; BN.prototype.divn = function divn (num) { return this.clone().idivn(num); }; BN.prototype.egcd = function egcd (p) { assert(p.negative === 0); assert(!p.isZero()); var x = this; var y = p.clone(); if (x.negative !== 0) { x = x.umod(p); } else { x = x.clone(); } // A * x + B * y = x var A = new BN(1); var B = new BN(0); // C * x + D * y = y var C = new BN(0); var D = new BN(1); var g = 0; while (x.isEven() && y.isEven()) { x.iushrn(1); y.iushrn(1); ++g; } var yp = y.clone(); var xp = x.clone(); while (!x.isZero()) { for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1); if (i > 0) { x.iushrn(i); while (i-- > 0) { if (A.isOdd() || B.isOdd()) { A.iadd(yp); B.isub(xp); } A.iushrn(1); B.iushrn(1); } } for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); if (j > 0) { y.iushrn(j); while (j-- > 0) { if (C.isOdd() || D.isOdd()) { C.iadd(yp); D.isub(xp); } C.iushrn(1); D.iushrn(1); } } if (x.cmp(y) >= 0) { x.isub(y); A.isub(C); B.isub(D); } else { y.isub(x); C.isub(A); D.isub(B); } } return { a: C, b: D, gcd: y.iushln(g) }; }; // This is reduced incarnation of the binary EEA // above, designated to invert members of the // _prime_ fields F(p) at a maximal speed BN.prototype._invmp = function _invmp (p) { assert(p.negative === 0); assert(!p.isZero()); var a = this; var b = p.clone(); if (a.negative !== 0) { a = a.umod(p); } else { a = a.clone(); } var x1 = new BN(1); var x2 = new BN(0); var delta = b.clone(); while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1); if (i > 0) { a.iushrn(i); while (i-- > 0) { if (x1.isOdd()) { x1.iadd(delta); } x1.iushrn(1); } } for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); if (j > 0) { b.iushrn(j); while (j-- > 0) { if (x2.isOdd()) { x2.iadd(delta); } x2.iushrn(1); } } if (a.cmp(b) >= 0) { a.isub(b); x1.isub(x2); } else { b.isub(a); x2.isub(x1); } } var res; if (a.cmpn(1) === 0) { res = x1; } else { res = x2; } if (res.cmpn(0) < 0) { res.iadd(p); } return res; }; BN.prototype.gcd = function gcd (num) { if (this.isZero()) return num.abs(); if (num.isZero()) return this.abs(); var a = this.clone(); var b = num.clone(); a.negative = 0; b.negative = 0; // Remove common factor of two for (var shift = 0; a.isEven() && b.isEven(); shift++) { a.iushrn(1); b.iushrn(1); } do { while (a.isEven()) { a.iushrn(1); } while (b.isEven()) { b.iushrn(1); } var r = a.cmp(b); if (r < 0) { // Swap `a` and `b` to make `a` always bigger than `b` var t = a; a = b; b = t; } else if (r === 0 || b.cmpn(1) === 0) { break; } a.isub(b); } while (true); return b.iushln(shift); }; // Invert number in the field F(num) BN.prototype.invm = function invm (num) { return this.egcd(num).a.umod(num); }; BN.prototype.isEven = function isEven () { return (this.words[0] & 1) === 0; }; BN.prototype.isOdd = function isOdd () { return (this.words[0] & 1) === 1; }; // And first word and num BN.prototype.andln = function andln (num) { return this.words[0] & num; }; // Increment at the bit position in-line BN.prototype.bincn = function bincn (bit) { assert(typeof bit === 'number'); var r = bit % 26; var s = (bit - r) / 26; var q = 1 << r; // Fast case: bit is much higher than all existing words if (this.length <= s) { this._expand(s + 1); this.words[s] |= q; return this; } // Add bit and propagate, if needed var carry = q; for (var i = s; carry !== 0 && i < this.length; i++) { var w = this.words[i] | 0; w += carry; carry = w >>> 26; w &= 0x3ffffff; this.words[i] = w; } if (carry !== 0) { this.words[i] = carry; this.length++; } return this; }; BN.prototype.isZero = function isZero () { return this.length === 1 && this.words[0] === 0; }; BN.prototype.cmpn = function cmpn (num) { var negative = num < 0; if (this.negative !== 0 && !negative) return -1; if (this.negative === 0 && negative) return 1; this.strip(); var res; if (this.length > 1) { res = 1; } else { if (negative) { num = -num; } assert(num <= 0x3ffffff, 'Number is too big'); var w = this.words[0] | 0; res = w === num ? 0 : w < num ? -1 : 1; } if (this.negative !== 0) return -res | 0; return res; }; // Compare two numbers and return: // 1 - if `this` > `num` // 0 - if `this` == `num` // -1 - if `this` < `num` BN.prototype.cmp = function cmp (num) { if (this.negative !== 0 && num.negative === 0) return -1; if (this.negative === 0 && num.negative !== 0) return 1; var res = this.ucmp(num); if (this.negative !== 0) return -res | 0; return res; }; // Unsigned comparison BN.prototype.ucmp = function ucmp (num) { // At this point both numbers have the same sign if (this.length > num.length) return 1; if (this.length < num.length) return -1; var res = 0; for (var i = this.length - 1; i >= 0; i--) { var a = this.words[i] | 0; var b = num.words[i] | 0; if (a === b) continue; if (a < b) { res = -1; } else if (a > b) { res = 1; } break; } return res; }; BN.prototype.gtn = function gtn (num) { return this.cmpn(num) === 1; }; BN.prototype.gt = function gt (num) { return this.cmp(num) === 1; }; BN.prototype.gten = function gten (num) { return this.cmpn(num) >= 0; }; BN.prototype.gte = function gte (num) { return this.cmp(num) >= 0; }; BN.prototype.ltn = function ltn (num) { return this.cmpn(num) === -1; }; BN.prototype.lt = function lt (num) { return this.cmp(num) === -1; }; BN.prototype.lten = function lten (num) { return this.cmpn(num) <= 0; }; BN.prototype.lte = function lte (num) { return this.cmp(num) <= 0; }; BN.prototype.eqn = function eqn (num) { return this.cmpn(num) === 0; }; BN.prototype.eq = function eq (num) { return this.cmp(num) === 0; }; // // A reduce context, could be using montgomery or something better, depending // on the `m` itself. // BN.red = function red (num) { return new Red(num); }; BN.prototype.toRed = function toRed (ctx) { assert(!this.red, 'Already a number in reduction context'); assert(this.negative === 0, 'red works only with positives'); return ctx.convertTo(this)._forceRed(ctx); }; BN.prototype.fromRed = function fromRed () { assert(this.red, 'fromRed works only with numbers in reduction context'); return this.red.convertFrom(this); }; BN.prototype._forceRed = function _forceRed (ctx) { this.red = ctx; return this; }; BN.prototype.forceRed = function forceRed (ctx) { assert(!this.red, 'Already a number in reduction context'); return this._forceRed(ctx); }; BN.prototype.redAdd = function redAdd (num) { assert(this.red, 'redAdd works only with red numbers'); return this.red.add(this, num); }; BN.prototype.redIAdd = function redIAdd (num) { assert(this.red, 'redIAdd works only with red numbers'); return this.red.iadd(this, num); }; BN.prototype.redSub = function redSub (num) { assert(this.red, 'redSub works only with red numbers'); return this.red.sub(this, num); }; BN.prototype.redISub = function redISub (num) { assert(this.red, 'redISub works only with red numbers'); return this.red.isub(this, num); }; BN.prototype.redShl = function redShl (num) { assert(this.red, 'redShl works only with red numbers'); return this.red.shl(this, num); }; BN.prototype.redMul = function redMul (num) { assert(this.red, 'redMul works only with red numbers'); this.red._verify2(this, num); return this.red.mul(this, num); }; BN.prototype.redIMul = function redIMul (num) { assert(this.red, 'redMul works only with red numbers'); this.red._verify2(this, num); return this.red.imul(this, num); }; BN.prototype.redSqr = function redSqr () { assert(this.red, 'redSqr works only with red numbers'); this.red._verify1(this); return this.red.sqr(this); }; BN.prototype.redISqr = function redISqr () { assert(this.red, 'redISqr works only with red numbers'); this.red._verify1(this); return this.red.isqr(this); }; // Square root over p BN.prototype.redSqrt = function redSqrt () { assert(this.red, 'redSqrt works only with red numbers'); this.red._verify1(this); return this.red.sqrt(this); }; BN.prototype.redInvm = function redInvm () { assert(this.red, 'redInvm works only with red numbers'); this.red._verify1(this); return this.red.invm(this); }; // Return negative clone of `this` % `red modulo` BN.prototype.redNeg = function redNeg () { assert(this.red, 'redNeg works only with red numbers'); this.red._verify1(this); return this.red.neg(this); }; BN.prototype.redPow = function redPow (num) { assert(this.red && !num.red, 'redPow(normalNum)'); this.red._verify1(this); return this.red.pow(this, num); }; // Prime numbers with efficient reduction var primes = { k256: null, p224: null, p192: null, p25519: null }; // Pseudo-Mersenne prime function MPrime (name, p) { // P = 2 ^ N - K this.name = name; this.p = new BN(p, 16); this.n = this.p.bitLength(); this.k = new BN(1).iushln(this.n).isub(this.p); this.tmp = this._tmp(); } MPrime.prototype._tmp = function _tmp () { var tmp = new BN(null); tmp.words = new Array(Math.ceil(this.n / 13)); return tmp; }; MPrime.prototype.ireduce = function ireduce (num) { // Assumes that `num` is less than `P^2` // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P) var r = num; var rlen; do { this.split(r, this.tmp); r = this.imulK(r); r = r.iadd(this.tmp); rlen = r.bitLength(); } while (rlen > this.n); var cmp = rlen < this.n ? -1 : r.ucmp(this.p); if (cmp === 0) { r.words[0] = 0; r.length = 1; } else if (cmp > 0) { r.isub(this.p); } else { r.strip(); } return r; }; MPrime.prototype.split = function split (input, out) { input.iushrn(this.n, 0, out); }; MPrime.prototype.imulK = function imulK (num) { return num.imul(this.k); }; function K256 () { MPrime.call( this, 'k256', 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'); } inherits(K256, MPrime); K256.prototype.split = function split (input, output) { // 256 = 9 * 26 + 22 var mask = 0x3fffff; var outLen = Math.min(input.length, 9); for (var i = 0; i < outLen; i++) { output.words[i] = input.words[i]; } output.length = outLen; if (input.length <= 9) { input.words[0] = 0; input.length = 1; return; } // Shift by 9 limbs var prev = input.words[9]; output.words[output.length++] = prev & mask; for (i = 10; i < input.length; i++) { var next = input.words[i] | 0; input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22); prev = next; } prev >>>= 22; input.words[i - 10] = prev; if (prev === 0 && input.length > 10) { input.length -= 10; } else { input.length -= 9; } }; K256.prototype.imulK = function imulK (num) { // K = 0x1000003d1 = [ 0x40, 0x3d1 ] num.words[num.length] = 0; num.words[num.length + 1] = 0; num.length += 2; // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390 var lo = 0; for (var i = 0; i < num.length; i++) { var w = num.words[i] | 0; lo += w * 0x3d1; num.words[i] = lo & 0x3ffffff; lo = w * 0x40 + ((lo / 0x4000000) | 0); } // Fast length reduction if (num.words[num.length - 1] === 0) { num.length--; if (num.words[num.length - 1] === 0) { num.length--; } } return num; }; function P224 () { MPrime.call( this, 'p224', 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001'); } inherits(P224, MPrime); function P192 () { MPrime.call( this, 'p192', 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff'); } inherits(P192, MPrime); function P25519 () { // 2 ^ 255 - 19 MPrime.call( this, '25519', '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed'); } inherits(P25519, MPrime); P25519.prototype.imulK = function imulK (num) { // K = 0x13 var carry = 0; for (var i = 0; i < num.length; i++) { var hi = (num.words[i] | 0) * 0x13 + carry; var lo = hi & 0x3ffffff; hi >>>= 26; num.words[i] = lo; carry = hi; } if (carry !== 0) { num.words[num.length++] = carry; } return num; }; // Exported mostly for testing purposes, use plain name instead BN._prime = function prime (name) { // Cached version of prime if (primes[name]) return primes[name]; var prime; if (name === 'k256') { prime = new K256(); } else if (name === 'p224') { prime = new P224(); } else if (name === 'p192') { prime = new P192(); } else if (name === 'p25519') { prime = new P25519(); } else { throw new Error('Unknown prime ' + name); } primes[name] = prime; return prime; }; // // Base reduction engine // function Red (m) { if (typeof m === 'string') { var prime = BN._prime(m); this.m = prime.p; this.prime = prime; } else { assert(m.gtn(1), 'modulus must be greater than 1'); this.m = m; this.prime = null; } } Red.prototype._verify1 = function _verify1 (a) { assert(a.negative === 0, 'red works only with positives'); assert(a.red, 'red works only with red numbers'); }; Red.prototype._verify2 = function _verify2 (a, b) { assert((a.negative | b.negative) === 0, 'red works only with positives'); assert(a.red && a.red === b.red, 'red works only with red numbers'); }; Red.prototype.imod = function imod (a) { if (this.prime) return this.prime.ireduce(a)._forceRed(this); return a.umod(this.m)._forceRed(this); }; Red.prototype.neg = function neg (a) { if (a.isZero()) { return a.clone(); } return this.m.sub(a)._forceRed(this); }; Red.prototype.add = function add (a, b) { this._verify2(a, b); var res = a.add(b); if (res.cmp(this.m) >= 0) { res.isub(this.m); } return res._forceRed(this); }; Red.prototype.iadd = function iadd (a, b) { this._verify2(a, b); var res = a.iadd(b); if (res.cmp(this.m) >= 0) { res.isub(this.m); } return res; }; Red.prototype.sub = function sub (a, b) { this._verify2(a, b); var res = a.sub(b); if (res.cmpn(0) < 0) { res.iadd(this.m); } return res._forceRed(this); }; Red.prototype.isub = function isub (a, b) { this._verify2(a, b); var res = a.isub(b); if (res.cmpn(0) < 0) { res.iadd(this.m); } return res; }; Red.prototype.shl = function shl (a, num) { this._verify1(a); return this.imod(a.ushln(num)); }; Red.prototype.imul = function imul (a, b) { this._verify2(a, b); return this.imod(a.imul(b)); }; Red.prototype.mul = function mul (a, b) { this._verify2(a, b); return this.imod(a.mul(b)); }; Red.prototype.isqr = function isqr (a) { return this.imul(a, a.clone()); }; Red.prototype.sqr = function sqr (a) { return this.mul(a, a); }; Red.prototype.sqrt = function sqrt (a) { if (a.isZero()) return a.clone(); var mod3 = this.m.andln(3); assert(mod3 % 2 === 1); // Fast case if (mod3 === 3) { var pow = this.m.add(new BN(1)).iushrn(2); return this.pow(a, pow); } // Tonelli-Shanks algorithm (Totally unoptimized and slow) // // Find Q and S, that Q * 2 ^ S = (P - 1) var q = this.m.subn(1); var s = 0; while (!q.isZero() && q.andln(1) === 0) { s++; q.iushrn(1); } assert(!q.isZero()); var one = new BN(1).toRed(this); var nOne = one.redNeg(); // Find quadratic non-residue // NOTE: Max is such because of generalized Riemann hypothesis. var lpow = this.m.subn(1).iushrn(1); var z = this.m.bitLength(); z = new BN(2 * z * z).toRed(this); while (this.pow(z, lpow).cmp(nOne) !== 0) { z.redIAdd(nOne); } var c = this.pow(z, q); var r = this.pow(a, q.addn(1).iushrn(1)); var t = this.pow(a, q); var m = s; while (t.cmp(one) !== 0) { var tmp = t; for (var i = 0; tmp.cmp(one) !== 0; i++) { tmp = tmp.redSqr(); } assert(i < m); var b = this.pow(c, new BN(1).iushln(m - i - 1)); r = r.redMul(b); c = b.redSqr(); t = t.redMul(c); m = i; } return r; }; Red.prototype.invm = function invm (a) { var inv = a._invmp(this.m); if (inv.negative !== 0) { inv.negative = 0; return this.imod(inv).redNeg(); } else { return this.imod(inv); } }; Red.prototype.pow = function pow (a, num) { if (num.isZero()) return new BN(1); if (num.cmpn(1) === 0) return a.clone(); var windowSize = 4; var wnd = new Array(1 << windowSize); wnd[0] = new BN(1).toRed(this); wnd[1] = a; for (var i = 2; i < wnd.length; i++) { wnd[i] = this.mul(wnd[i - 1], a); } var res = wnd[0]; var current = 0; var currentLen = 0; var start = num.bitLength() % 26; if (start === 0) { start = 26; } for (i = num.length - 1; i >= 0; i--) { var word = num.words[i]; for (var j = start - 1; j >= 0; j--) { var bit = (word >> j) & 1; if (res !== wnd[0]) { res = this.sqr(res); } if (bit === 0 && current === 0) { currentLen = 0; continue; } current <<= 1; current |= bit; currentLen++; if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; res = this.mul(res, wnd[current]); currentLen = 0; current = 0; } start = 26; } return res; }; Red.prototype.convertTo = function convertTo (num) { var r = num.umod(this.m); return r === num ? r.clone() : r; }; Red.prototype.convertFrom = function convertFrom (num) { var res = num.clone(); res.red = null; return res; }; // // Montgomery method engine // BN.mont = function mont (num) { return new Mont(num); }; function Mont (m) { Red.call(this, m); this.shift = this.m.bitLength(); if (this.shift % 26 !== 0) { this.shift += 26 - (this.shift % 26); } this.r = new BN(1).iushln(this.shift); this.r2 = this.imod(this.r.sqr()); this.rinv = this.r._invmp(this.m); this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); this.minv = this.minv.umod(this.r); this.minv = this.r.sub(this.minv); } inherits(Mont, Red); Mont.prototype.convertTo = function convertTo (num) { return this.imod(num.ushln(this.shift)); }; Mont.prototype.convertFrom = function convertFrom (num) { var r = this.imod(num.mul(this.rinv)); r.red = null; return r; }; Mont.prototype.imul = function imul (a, b) { if (a.isZero() || b.isZero()) { a.words[0] = 0; a.length = 1; return a; } var t = a.imul(b); var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); var u = t.isub(c).iushrn(this.shift); var res = u; if (u.cmp(this.m) >= 0) { res = u.isub(this.m); } else if (u.cmpn(0) < 0) { res = u.iadd(this.m); } return res._forceRed(this); }; Mont.prototype.mul = function mul (a, b) { if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); var t = a.mul(b); var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); var u = t.isub(c).iushrn(this.shift); var res = u; if (u.cmp(this.m) >= 0) { res = u.isub(this.m); } else if (u.cmpn(0) < 0) { res = u.iadd(this.m); } return res._forceRed(this); }; Mont.prototype.invm = function invm (a) { // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R var res = this.imod(a._invmp(this.m).mul(this.r2)); return res._forceRed(this); }; })(typeof module === 'undefined' || module, this); },{}],30:[function(require,module,exports){ var concatMap = require('concat-map'); var balanced = require('balanced-match'); module.exports = expandTop; var escSlash = '\0SLASH'+Math.random()+'\0'; var escOpen = '\0OPEN'+Math.random()+'\0'; var escClose = '\0CLOSE'+Math.random()+'\0'; var escComma = '\0COMMA'+Math.random()+'\0'; var escPeriod = '\0PERIOD'+Math.random()+'\0'; function numeric(str) { return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0); } function escapeBraces(str) { return str.split('\\\\').join(escSlash) .split('\\{').join(escOpen) .split('\\}').join(escClose) .split('\\,').join(escComma) .split('\\.').join(escPeriod); } function unescapeBraces(str) { return str.split(escSlash).join('\\') .split(escOpen).join('{') .split(escClose).join('}') .split(escComma).join(',') .split(escPeriod).join('.'); } // Basically just str.split(","), but handling cases // where we have nested braced sections, which should be // treated as individual members, like {a,{b,c},d} function parseCommaParts(str) { if (!str) return ['']; var parts = []; var m = balanced('{', '}', str); if (!m) return str.split(','); var pre = m.pre; var body = m.body; var post = m.post; var p = pre.split(','); p[p.length-1] += '{' + body + '}'; var postParts = parseCommaParts(post); if (post.length) { p[p.length-1] += postParts.shift(); p.push.apply(p, postParts); } parts.push.apply(parts, p); return parts; } function expandTop(str) { if (!str) return []; return expand(escapeBraces(str), true).map(unescapeBraces); } function identity(e) { return e; } function embrace(str) { return '{' + str + '}'; } function isPadded(el) { return /^-?0\d/.test(el); } function lte(i, y) { return i <= y; } function gte(i, y) { return i >= y; } function expand(str, isTop) { var expansions = []; var m = balanced('{', '}', str); if (!m || /\$$/.test(m.pre)) return [str]; var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); var isSequence = isNumericSequence || isAlphaSequence; var isOptions = /^(.*,)+(.+)?$/.test(m.body); if (!isSequence && !isOptions) { // {a},b} if (m.post.match(/,.*\}/)) { str = m.pre + '{' + m.body + escClose + m.post; return expand(str); } return [str]; } var n; if (isSequence) { n = m.body.split(/\.\./); } else { n = parseCommaParts(m.body); if (n.length === 1) { // x{{a,b}}y ==> x{a}y x{b}y n = expand(n[0], false).map(embrace); if (n.length === 1) { var post = m.post.length ? expand(m.post, false) : ['']; return post.map(function(p) { return m.pre + n[0] + p; }); } } } // at this point, n is the parts, and we know it's not a comma set // with a single entry. // no need to expand pre, since it is guaranteed to be free of brace-sets var pre = m.pre; var post = m.post.length ? expand(m.post, false) : ['']; var N; if (isSequence) { var x = numeric(n[0]); var y = numeric(n[1]); var width = Math.max(n[0].length, n[1].length) var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1; var test = lte; var reverse = y < x; if (reverse) { incr *= -1; test = gte; } var pad = n.some(isPadded); N = []; for (var i = x; test(i, y); i += incr) { var c; if (isAlphaSequence) { c = String.fromCharCode(i); if (c === '\\') c = ''; } else { c = String(i); if (pad) { var need = width - c.length; if (need > 0) { var z = new Array(need + 1).join('0'); if (i < 0) c = '-' + z + c.slice(1); else c = z + c; } } } N.push(c); } } else { N = concatMap(n, function(el) { return expand(el, false) }); } for (var j = 0; j < N.length; j++) { for (var k = 0; k < post.length; k++) { var expansion = pre + N[j] + post[k]; if (!isTop || isSequence || expansion) expansions.push(expansion); } } return expansions; } },{"balanced-match":18,"concat-map":85}],31:[function(require,module,exports){ (function (Buffer){ var udp = require('dgram') var pipe = require('stream').prototype.pipe var os = require('os') module.exports = function (port, loopback) { var addresses = {} var socket = udp.createSocket('udp4') socket.readable = socket.writable = true socket.write = function (message) { if('string' === typeof message) message = new Buffer(message, 'utf8') socket.send(message, 0, message.length, port, '255.255.255.255') return true } socket.end = function () { socket.close() } socket.on('close', function () { socket.emit('end') }) var latest = null socket.on('message', function (msg, other) { if(addresses[other.address] && other.port === port) { if(loopback === false) return msg.loopback = true } msg.port = other.port msg.address = other.address //if paused, remember the latest item. //otherwise just drop those messages. if(socket.paused) return latest = msg latest = null socket.emit('data', msg) }) socket.pause = function () { socket.paused = true return this } socket.resume = function () { socket.paused = false if(latest) { var msg = latest latest = null socket.emit('data', msg) } return this } socket.bind(port) socket.on('listening', function () { var ifaces = os.networkInterfaces() for(var k in ifaces) ifaces[k].forEach(function (address) { addresses[address.address] = true }) socket.setBroadcast(true) }) socket.pipe = pipe return socket } }).call(this,require("buffer").Buffer) },{"buffer":61,"dgram":58,"os":279,"stream":576}],32:[function(require,module,exports){ var r; module.exports = function rand(len) { if (!r) r = new Rand(null); return r.generate(len); }; function Rand(rand) { this.rand = rand; } module.exports.Rand = Rand; Rand.prototype.generate = function generate(len) { return this._rand(len); }; if (typeof window === 'object') { if (window.crypto && window.crypto.getRandomValues) { // Modern browsers Rand.prototype._rand = function _rand(n) { var arr = new Uint8Array(n); window.crypto.getRandomValues(arr); return arr; }; } else if (window.msCrypto && window.msCrypto.getRandomValues) { // IE Rand.prototype._rand = function _rand(n) { var arr = new Uint8Array(n); window.msCrypto.getRandomValues(arr); return arr; }; } else { // Old junk Rand.prototype._rand = function() { throw new Error('Not implemented yet'); }; } } else { // Node.js or Web worker try { var crypto = require('cry' + 'pto'); Rand.prototype._rand = function _rand(n) { return crypto.randomBytes(n); }; } catch (e) { // Emulate crypto API using randy Rand.prototype._rand = function _rand(n) { var res = new Uint8Array(n); for (var i = 0; i < res.length; i++) res[i] = this.rand.getByte(); return res; }; } } },{}],33:[function(require,module,exports){ },{}],34:[function(require,module,exports){ (function (Buffer){ // based on the aes implimentation in triple sec // https://github.com/keybase/triplesec // which is in turn based on the one from crypto-js // https://code.google.com/p/crypto-js/ var uint_max = Math.pow(2, 32) function fixup_uint32 (x) { var ret, x_pos ret = x > uint_max || x < 0 ? (x_pos = Math.abs(x) % uint_max, x < 0 ? uint_max - x_pos : x_pos) : x return ret } function scrub_vec (v) { for (var i = 0; i < v.length; v++) { v[i] = 0 } return false } function Global () { this.SBOX = [] this.INV_SBOX = [] this.SUB_MIX = [[], [], [], []] this.INV_SUB_MIX = [[], [], [], []] this.init() this.RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36] } Global.prototype.init = function () { var d, i, sx, t, x, x2, x4, x8, xi, _i d = (function () { var _i, _results _results = [] for (i = _i = 0; _i < 256; i = ++_i) { if (i < 128) { _results.push(i << 1) } else { _results.push((i << 1) ^ 0x11b) } } return _results })() x = 0 xi = 0 for (i = _i = 0; _i < 256; i = ++_i) { sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4) sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63 this.SBOX[x] = sx this.INV_SBOX[sx] = x x2 = d[x] x4 = d[x2] x8 = d[x4] t = (d[sx] * 0x101) ^ (sx * 0x1010100) this.SUB_MIX[0][x] = (t << 24) | (t >>> 8) this.SUB_MIX[1][x] = (t << 16) | (t >>> 16) this.SUB_MIX[2][x] = (t << 8) | (t >>> 24) this.SUB_MIX[3][x] = t t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100) this.INV_SUB_MIX[0][sx] = (t << 24) | (t >>> 8) this.INV_SUB_MIX[1][sx] = (t << 16) | (t >>> 16) this.INV_SUB_MIX[2][sx] = (t << 8) | (t >>> 24) this.INV_SUB_MIX[3][sx] = t if (x === 0) { x = xi = 1 } else { x = x2 ^ d[d[d[x8 ^ x2]]] xi ^= d[d[xi]] } } return true } var G = new Global() AES.blockSize = 4 * 4 AES.prototype.blockSize = AES.blockSize AES.keySize = 256 / 8 AES.prototype.keySize = AES.keySize function bufferToArray (buf) { var len = buf.length / 4 var out = new Array(len) var i = -1 while (++i < len) { out[i] = buf.readUInt32BE(i * 4) } return out } function AES (key) { this._key = bufferToArray(key) this._doReset() } AES.prototype._doReset = function () { var invKsRow, keySize, keyWords, ksRow, ksRows, t keyWords = this._key keySize = keyWords.length this._nRounds = keySize + 6 ksRows = (this._nRounds + 1) * 4 this._keySchedule = [] for (ksRow = 0; ksRow < ksRows; ksRow++) { this._keySchedule[ksRow] = ksRow < keySize ? keyWords[ksRow] : (t = this._keySchedule[ksRow - 1], (ksRow % keySize) === 0 ? (t = (t << 8) | (t >>> 24), t = (G.SBOX[t >>> 24] << 24) | (G.SBOX[(t >>> 16) & 0xff] << 16) | (G.SBOX[(t >>> 8) & 0xff] << 8) | G.SBOX[t & 0xff], t ^= G.RCON[(ksRow / keySize) | 0] << 24) : keySize > 6 && ksRow % keySize === 4 ? t = (G.SBOX[t >>> 24] << 24) | (G.SBOX[(t >>> 16) & 0xff] << 16) | (G.SBOX[(t >>> 8) & 0xff] << 8) | G.SBOX[t & 0xff] : void 0, this._keySchedule[ksRow - keySize] ^ t) } this._invKeySchedule = [] for (invKsRow = 0; invKsRow < ksRows; invKsRow++) { ksRow = ksRows - invKsRow t = this._keySchedule[ksRow - (invKsRow % 4 ? 0 : 4)] this._invKeySchedule[invKsRow] = invKsRow < 4 || ksRow <= 4 ? t : G.INV_SUB_MIX[0][G.SBOX[t >>> 24]] ^ G.INV_SUB_MIX[1][G.SBOX[(t >>> 16) & 0xff]] ^ G.INV_SUB_MIX[2][G.SBOX[(t >>> 8) & 0xff]] ^ G.INV_SUB_MIX[3][G.SBOX[t & 0xff]] } return true } AES.prototype.encryptBlock = function (M) { M = bufferToArray(new Buffer(M)) var out = this._doCryptBlock(M, this._keySchedule, G.SUB_MIX, G.SBOX) var buf = new Buffer(16) buf.writeUInt32BE(out[0], 0) buf.writeUInt32BE(out[1], 4) buf.writeUInt32BE(out[2], 8) buf.writeUInt32BE(out[3], 12) return buf } AES.prototype.decryptBlock = function (M) { M = bufferToArray(new Buffer(M)) var temp = [M[3], M[1]] M[1] = temp[0] M[3] = temp[1] var out = this._doCryptBlock(M, this._invKeySchedule, G.INV_SUB_MIX, G.INV_SBOX) var buf = new Buffer(16) buf.writeUInt32BE(out[0], 0) buf.writeUInt32BE(out[3], 4) buf.writeUInt32BE(out[2], 8) buf.writeUInt32BE(out[1], 12) return buf } AES.prototype.scrub = function () { scrub_vec(this._keySchedule) scrub_vec(this._invKeySchedule) scrub_vec(this._key) } AES.prototype._doCryptBlock = function (M, keySchedule, SUB_MIX, SBOX) { var ksRow, s0, s1, s2, s3, t0, t1, t2, t3 s0 = M[0] ^ keySchedule[0] s1 = M[1] ^ keySchedule[1] s2 = M[2] ^ keySchedule[2] s3 = M[3] ^ keySchedule[3] ksRow = 4 for (var round = 1; round < this._nRounds; round++) { t0 = SUB_MIX[0][s0 >>> 24] ^ SUB_MIX[1][(s1 >>> 16) & 0xff] ^ SUB_MIX[2][(s2 >>> 8) & 0xff] ^ SUB_MIX[3][s3 & 0xff] ^ keySchedule[ksRow++] t1 = SUB_MIX[0][s1 >>> 24] ^ SUB_MIX[1][(s2 >>> 16) & 0xff] ^ SUB_MIX[2][(s3 >>> 8) & 0xff] ^ SUB_MIX[3][s0 & 0xff] ^ keySchedule[ksRow++] t2 = SUB_MIX[0][s2 >>> 24] ^ SUB_MIX[1][(s3 >>> 16) & 0xff] ^ SUB_MIX[2][(s0 >>> 8) & 0xff] ^ SUB_MIX[3][s1 & 0xff] ^ keySchedule[ksRow++] t3 = SUB_MIX[0][s3 >>> 24] ^ SUB_MIX[1][(s0 >>> 16) & 0xff] ^ SUB_MIX[2][(s1 >>> 8) & 0xff] ^ SUB_MIX[3][s2 & 0xff] ^ keySchedule[ksRow++] s0 = t0 s1 = t1 s2 = t2 s3 = t3 } t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++] t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++] t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++] t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++] return [ fixup_uint32(t0), fixup_uint32(t1), fixup_uint32(t2), fixup_uint32(t3) ] } exports.AES = AES }).call(this,require("buffer").Buffer) },{"buffer":61}],35:[function(require,module,exports){ (function (Buffer){ var aes = require('./aes') var Transform = require('cipher-base') var inherits = require('inherits') var GHASH = require('./ghash') var xor = require('buffer-xor') inherits(StreamCipher, Transform) module.exports = StreamCipher function StreamCipher (mode, key, iv, decrypt) { if (!(this instanceof StreamCipher)) { return new StreamCipher(mode, key, iv) } Transform.call(this) this._finID = Buffer.concat([iv, new Buffer([0, 0, 0, 1])]) iv = Buffer.concat([iv, new Buffer([0, 0, 0, 2])]) this._cipher = new aes.AES(key) this._prev = new Buffer(iv.length) this._cache = new Buffer('') this._secCache = new Buffer('') this._decrypt = decrypt this._alen = 0 this._len = 0 iv.copy(this._prev) this._mode = mode var h = new Buffer(4) h.fill(0) this._ghash = new GHASH(this._cipher.encryptBlock(h)) this._authTag = null this._called = false } StreamCipher.prototype._update = function (chunk) { if (!this._called && this._alen) { var rump = 16 - (this._alen % 16) if (rump < 16) { rump = new Buffer(rump) rump.fill(0) this._ghash.update(rump) } } this._called = true var out = this._mode.encrypt(this, chunk) if (this._decrypt) { this._ghash.update(chunk) } else { this._ghash.update(out) } this._len += chunk.length return out } StreamCipher.prototype._final = function () { if (this._decrypt && !this._authTag) { throw new Error('Unsupported state or unable to authenticate data') } var tag = xor(this._ghash.final(this._alen * 8, this._len * 8), this._cipher.encryptBlock(this._finID)) if (this._decrypt) { if (xorTest(tag, this._authTag)) { throw new Error('Unsupported state or unable to authenticate data') } } else { this._authTag = tag } this._cipher.scrub() } StreamCipher.prototype.getAuthTag = function getAuthTag () { if (!this._decrypt && Buffer.isBuffer(this._authTag)) { return this._authTag } else { throw new Error('Attempting to get auth tag in unsupported state') } } StreamCipher.prototype.setAuthTag = function setAuthTag (tag) { if (this._decrypt) { this._authTag = tag } else { throw new Error('Attempting to set auth tag in unsupported state') } } StreamCipher.prototype.setAAD = function setAAD (buf) { if (!this._called) { this._ghash.update(buf) this._alen += buf.length } else { throw new Error('Attempting to set AAD in unsupported state') } } function xorTest (a, b) { var out = 0 if (a.length !== b.length) { out++ } var len = Math.min(a.length, b.length) var i = -1 while (++i < len) { out += (a[i] ^ b[i]) } return out } }).call(this,require("buffer").Buffer) },{"./aes":34,"./ghash":39,"buffer":61,"buffer-xor":60,"cipher-base":81,"inherits":167}],36:[function(require,module,exports){ var ciphers = require('./encrypter') exports.createCipher = exports.Cipher = ciphers.createCipher exports.createCipheriv = exports.Cipheriv = ciphers.createCipheriv var deciphers = require('./decrypter') exports.createDecipher = exports.Decipher = deciphers.createDecipher exports.createDecipheriv = exports.Decipheriv = deciphers.createDecipheriv var modes = require('./modes') function getCiphers () { return Object.keys(modes) } exports.listCiphers = exports.getCiphers = getCiphers },{"./decrypter":37,"./encrypter":38,"./modes":40}],37:[function(require,module,exports){ (function (Buffer){ var aes = require('./aes') var Transform = require('cipher-base') var inherits = require('inherits') var modes = require('./modes') var StreamCipher = require('./streamCipher') var AuthCipher = require('./authCipher') var ebtk = require('evp_bytestokey') inherits(Decipher, Transform) function Decipher (mode, key, iv) { if (!(this instanceof Decipher)) { return new Decipher(mode, key, iv) } Transform.call(this) this._cache = new Splitter() this._last = void 0 this._cipher = new aes.AES(key) this._prev = new Buffer(iv.length) iv.copy(this._prev) this._mode = mode this._autopadding = true } Decipher.prototype._update = function (data) { this._cache.add(data) var chunk var thing var out = [] while ((chunk = this._cache.get(this._autopadding))) { thing = this._mode.decrypt(this, chunk) out.push(thing) } return Buffer.concat(out) } Decipher.prototype._final = function () { var chunk = this._cache.flush() if (this._autopadding) { return unpad(this._mode.decrypt(this, chunk)) } else if (chunk) { throw new Error('data not multiple of block length') } } Decipher.prototype.setAutoPadding = function (setTo) { this._autopadding = !!setTo return this } function Splitter () { if (!(this instanceof Splitter)) { return new Splitter() } this.cache = new Buffer('') } Splitter.prototype.add = function (data) { this.cache = Buffer.concat([this.cache, data]) } Splitter.prototype.get = function (autoPadding) { var out if (autoPadding) { if (this.cache.length > 16) { out = this.cache.slice(0, 16) this.cache = this.cache.slice(16) return out } } else { if (this.cache.length >= 16) { out = this.cache.slice(0, 16) this.cache = this.cache.slice(16) return out } } return null } Splitter.prototype.flush = function () { if (this.cache.length) { return this.cache } } function unpad (last) { var padded = last[15] var i = -1 while (++i < padded) { if (last[(i + (16 - padded))] !== padded) { throw new Error('unable to decrypt data') } } if (padded === 16) { return } return last.slice(0, 16 - padded) } var modelist = { ECB: require('./modes/ecb'), CBC: require('./modes/cbc'), CFB: require('./modes/cfb'), CFB8: require('./modes/cfb8'), CFB1: require('./modes/cfb1'), OFB: require('./modes/ofb'), CTR: require('./modes/ctr'), GCM: require('./modes/ctr') } function createDecipheriv (suite, password, iv) { var config = modes[suite.toLowerCase()] if (!config) { throw new TypeError('invalid suite type') } if (typeof iv === 'string') { iv = new Buffer(iv) } if (typeof password === 'string') { password = new Buffer(password) } if (password.length !== config.key / 8) { throw new TypeError('invalid key length ' + password.length) } if (iv.length !== config.iv) { throw new TypeError('invalid iv length ' + iv.length) } if (config.type === 'stream') { return new StreamCipher(modelist[config.mode], password, iv, true) } else if (config.type === 'auth') { return new AuthCipher(modelist[config.mode], password, iv, true) } return new Decipher(modelist[config.mode], password, iv) } function createDecipher (suite, password) { var config = modes[suite.toLowerCase()] if (!config) { throw new TypeError('invalid suite type') } var keys = ebtk(password, false, config.key, config.iv) return createDecipheriv(suite, keys.key, keys.iv) } exports.createDecipher = createDecipher exports.createDecipheriv = createDecipheriv }).call(this,require("buffer").Buffer) },{"./aes":34,"./authCipher":35,"./modes":40,"./modes/cbc":41,"./modes/cfb":42,"./modes/cfb1":43,"./modes/cfb8":44,"./modes/ctr":45,"./modes/ecb":46,"./modes/ofb":47,"./streamCipher":48,"buffer":61,"cipher-base":81,"evp_bytestokey":145,"inherits":167}],38:[function(require,module,exports){ (function (Buffer){ var aes = require('./aes') var Transform = require('cipher-base') var inherits = require('inherits') var modes = require('./modes') var ebtk = require('evp_bytestokey') var StreamCipher = require('./streamCipher') var AuthCipher = require('./authCipher') inherits(Cipher, Transform) function Cipher (mode, key, iv) { if (!(this instanceof Cipher)) { return new Cipher(mode, key, iv) } Transform.call(this) this._cache = new Splitter() this._cipher = new aes.AES(key) this._prev = new Buffer(iv.length) iv.copy(this._prev) this._mode = mode this._autopadding = true } Cipher.prototype._update = function (data) { this._cache.add(data) var chunk var thing var out = [] while ((chunk = this._cache.get())) { thing = this._mode.encrypt(this, chunk) out.push(thing) } return Buffer.concat(out) } Cipher.prototype._final = function () { var chunk = this._cache.flush() if (this._autopadding) { chunk = this._mode.encrypt(this, chunk) this._cipher.scrub() return chunk } else if (chunk.toString('hex') !== '10101010101010101010101010101010') { this._cipher.scrub() throw new Error('data not multiple of block length') } } Cipher.prototype.setAutoPadding = function (setTo) { this._autopadding = !!setTo return this } function Splitter () { if (!(this instanceof Splitter)) { return new Splitter() } this.cache = new Buffer('') } Splitter.prototype.add = function (data) { this.cache = Buffer.concat([this.cache, data]) } Splitter.prototype.get = function () { if (this.cache.length > 15) { var out = this.cache.slice(0, 16) this.cache = this.cache.slice(16) return out } return null } Splitter.prototype.flush = function () { var len = 16 - this.cache.length var padBuff = new Buffer(len) var i = -1 while (++i < len) { padBuff.writeUInt8(len, i) } var out = Buffer.concat([this.cache, padBuff]) return out } var modelist = { ECB: require('./modes/ecb'), CBC: require('./modes/cbc'), CFB: require('./modes/cfb'), CFB8: require('./modes/cfb8'), CFB1: require('./modes/cfb1'), OFB: require('./modes/ofb'), CTR: require('./modes/ctr'), GCM: require('./modes/ctr') } function createCipheriv (suite, password, iv) { var config = modes[suite.toLowerCase()] if (!config) { throw new TypeError('invalid suite type') } if (typeof iv === 'string') { iv = new Buffer(iv) } if (typeof password === 'string') { password = new Buffer(password) } if (password.length !== config.key / 8) { throw new TypeError('invalid key length ' + password.length) } if (iv.length !== config.iv) { throw new TypeError('invalid iv length ' + iv.length) } if (config.type === 'stream') { return new StreamCipher(modelist[config.mode], password, iv) } else if (config.type === 'auth') { return new AuthCipher(modelist[config.mode], password, iv) } return new Cipher(modelist[config.mode], password, iv) } function createCipher (suite, password) { var config = modes[suite.toLowerCase()] if (!config) { throw new TypeError('invalid suite type') } var keys = ebtk(password, false, config.key, config.iv) return createCipheriv(suite, keys.key, keys.iv) } exports.createCipheriv = createCipheriv exports.createCipher = createCipher }).call(this,require("buffer").Buffer) },{"./aes":34,"./authCipher":35,"./modes":40,"./modes/cbc":41,"./modes/cfb":42,"./modes/cfb1":43,"./modes/cfb8":44,"./modes/ctr":45,"./modes/ecb":46,"./modes/ofb":47,"./streamCipher":48,"buffer":61,"cipher-base":81,"evp_bytestokey":145,"inherits":167}],39:[function(require,module,exports){ (function (Buffer){ var zeros = new Buffer(16) zeros.fill(0) module.exports = GHASH function GHASH (key) { this.h = key this.state = new Buffer(16) this.state.fill(0) this.cache = new Buffer('') } // from http://bitwiseshiftleft.github.io/sjcl/doc/symbols/src/core_gcm.js.html // by Juho Vähä-Herttua GHASH.prototype.ghash = function (block) { var i = -1 while (++i < block.length) { this.state[i] ^= block[i] } this._multiply() } GHASH.prototype._multiply = function () { var Vi = toArray(this.h) var Zi = [0, 0, 0, 0] var j, xi, lsb_Vi var i = -1 while (++i < 128) { xi = (this.state[~~(i / 8)] & (1 << (7 - i % 8))) !== 0 if (xi) { // Z_i+1 = Z_i ^ V_i Zi = xor(Zi, Vi) } // Store the value of LSB(V_i) lsb_Vi = (Vi[3] & 1) !== 0 // V_i+1 = V_i >> 1 for (j = 3; j > 0; j--) { Vi[j] = (Vi[j] >>> 1) | ((Vi[j - 1] & 1) << 31) } Vi[0] = Vi[0] >>> 1 // If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R if (lsb_Vi) { Vi[0] = Vi[0] ^ (0xe1 << 24) } } this.state = fromArray(Zi) } GHASH.prototype.update = function (buf) { this.cache = Buffer.concat([this.cache, buf]) var chunk while (this.cache.length >= 16) { chunk = this.cache.slice(0, 16) this.cache = this.cache.slice(16) this.ghash(chunk) } } GHASH.prototype.final = function (abl, bl) { if (this.cache.length) { this.ghash(Buffer.concat([this.cache, zeros], 16)) } this.ghash(fromArray([ 0, abl, 0, bl ])) return this.state } function toArray (buf) { return [ buf.readUInt32BE(0), buf.readUInt32BE(4), buf.readUInt32BE(8), buf.readUInt32BE(12) ] } function fromArray (out) { out = out.map(fixup_uint32) var buf = new Buffer(16) buf.writeUInt32BE(out[0], 0) buf.writeUInt32BE(out[1], 4) buf.writeUInt32BE(out[2], 8) buf.writeUInt32BE(out[3], 12) return buf } var uint_max = Math.pow(2, 32) function fixup_uint32 (x) { var ret, x_pos ret = x > uint_max || x < 0 ? (x_pos = Math.abs(x) % uint_max, x < 0 ? uint_max - x_pos : x_pos) : x return ret } function xor (a, b) { return [ a[0] ^ b[0], a[1] ^ b[1], a[2] ^ b[2], a[3] ^ b[3] ] } }).call(this,require("buffer").Buffer) },{"buffer":61}],40:[function(require,module,exports){ exports['aes-128-ecb'] = { cipher: 'AES', key: 128, iv: 0, mode: 'ECB', type: 'block' } exports['aes-192-ecb'] = { cipher: 'AES', key: 192, iv: 0, mode: 'ECB', type: 'block' } exports['aes-256-ecb'] = { cipher: 'AES', key: 256, iv: 0, mode: 'ECB', type: 'block' } exports['aes-128-cbc'] = { cipher: 'AES', key: 128, iv: 16, mode: 'CBC', type: 'block' } exports['aes-192-cbc'] = { cipher: 'AES', key: 192, iv: 16, mode: 'CBC', type: 'block' } exports['aes-256-cbc'] = { cipher: 'AES', key: 256, iv: 16, mode: 'CBC', type: 'block' } exports['aes128'] = exports['aes-128-cbc'] exports['aes192'] = exports['aes-192-cbc'] exports['aes256'] = exports['aes-256-cbc'] exports['aes-128-cfb'] = { cipher: 'AES', key: 128, iv: 16, mode: 'CFB', type: 'stream' } exports['aes-192-cfb'] = { cipher: 'AES', key: 192, iv: 16, mode: 'CFB', type: 'stream' } exports['aes-256-cfb'] = { cipher: 'AES', key: 256, iv: 16, mode: 'CFB', type: 'stream' } exports['aes-128-cfb8'] = { cipher: 'AES', key: 128, iv: 16, mode: 'CFB8', type: 'stream' } exports['aes-192-cfb8'] = { cipher: 'AES', key: 192, iv: 16, mode: 'CFB8', type: 'stream' } exports['aes-256-cfb8'] = { cipher: 'AES', key: 256, iv: 16, mode: 'CFB8', type: 'stream' } exports['aes-128-cfb1'] = { cipher: 'AES', key: 128, iv: 16, mode: 'CFB1', type: 'stream' } exports['aes-192-cfb1'] = { cipher: 'AES', key: 192, iv: 16, mode: 'CFB1', type: 'stream' } exports['aes-256-cfb1'] = { cipher: 'AES', key: 256, iv: 16, mode: 'CFB1', type: 'stream' } exports['aes-128-ofb'] = { cipher: 'AES', key: 128, iv: 16, mode: 'OFB', type: 'stream' } exports['aes-192-ofb'] = { cipher: 'AES', key: 192, iv: 16, mode: 'OFB', type: 'stream' } exports['aes-256-ofb'] = { cipher: 'AES', key: 256, iv: 16, mode: 'OFB', type: 'stream' } exports['aes-128-ctr'] = { cipher: 'AES', key: 128, iv: 16, mode: 'CTR', type: 'stream' } exports['aes-192-ctr'] = { cipher: 'AES', key: 192, iv: 16, mode: 'CTR', type: 'stream' } exports['aes-256-ctr'] = { cipher: 'AES', key: 256, iv: 16, mode: 'CTR', type: 'stream' } exports['aes-128-gcm'] = { cipher: 'AES', key: 128, iv: 12, mode: 'GCM', type: 'auth' } exports['aes-192-gcm'] = { cipher: 'AES', key: 192, iv: 12, mode: 'GCM', type: 'auth' } exports['aes-256-gcm'] = { cipher: 'AES', key: 256, iv: 12, mode: 'GCM', type: 'auth' } },{}],41:[function(require,module,exports){ var xor = require('buffer-xor') exports.encrypt = function (self, block) { var data = xor(block, self._prev) self._prev = self._cipher.encryptBlock(data) return self._prev } exports.decrypt = function (self, block) { var pad = self._prev self._prev = block var out = self._cipher.decryptBlock(block) return xor(out, pad) } },{"buffer-xor":60}],42:[function(require,module,exports){ (function (Buffer){ var xor = require('buffer-xor') exports.encrypt = function (self, data, decrypt) { var out = new Buffer('') var len while (data.length) { if (self._cache.length === 0) { self._cache = self._cipher.encryptBlock(self._prev) self._prev = new Buffer('') } if (self._cache.length <= data.length) { len = self._cache.length out = Buffer.concat([out, encryptStart(self, data.slice(0, len), decrypt)]) data = data.slice(len) } else { out = Buffer.concat([out, encryptStart(self, data, decrypt)]) break } } return out } function encryptStart (self, data, decrypt) { var len = data.length var out = xor(data, self._cache) self._cache = self._cache.slice(len) self._prev = Buffer.concat([self._prev, decrypt ? data : out]) return out } }).call(this,require("buffer").Buffer) },{"buffer":61,"buffer-xor":60}],43:[function(require,module,exports){ (function (Buffer){ function encryptByte (self, byteParam, decrypt) { var pad var i = -1 var len = 8 var out = 0 var bit, value while (++i < len) { pad = self._cipher.encryptBlock(self._prev) bit = (byteParam & (1 << (7 - i))) ? 0x80 : 0 value = pad[0] ^ bit out += ((value & 0x80) >> (i % 8)) self._prev = shiftIn(self._prev, decrypt ? bit : value) } return out } exports.encrypt = function (self, chunk, decrypt) { var len = chunk.length var out = new Buffer(len) var i = -1 while (++i < len) { out[i] = encryptByte(self, chunk[i], decrypt) } return out } function shiftIn (buffer, value) { var len = buffer.length var i = -1 var out = new Buffer(buffer.length) buffer = Buffer.concat([buffer, new Buffer([value])]) while (++i < len) { out[i] = buffer[i] << 1 | buffer[i + 1] >> (7) } return out } }).call(this,require("buffer").Buffer) },{"buffer":61}],44:[function(require,module,exports){ (function (Buffer){ function encryptByte (self, byteParam, decrypt) { var pad = self._cipher.encryptBlock(self._prev) var out = pad[0] ^ byteParam self._prev = Buffer.concat([self._prev.slice(1), new Buffer([decrypt ? byteParam : out])]) return out } exports.encrypt = function (self, chunk, decrypt) { var len = chunk.length var out = new Buffer(len) var i = -1 while (++i < len) { out[i] = encryptByte(self, chunk[i], decrypt) } return out } }).call(this,require("buffer").Buffer) },{"buffer":61}],45:[function(require,module,exports){ (function (Buffer){ var xor = require('buffer-xor') function incr32 (iv) { var len = iv.length var item while (len--) { item = iv.readUInt8(len) if (item === 255) { iv.writeUInt8(0, len) } else { item++ iv.writeUInt8(item, len) break } } } function getBlock (self) { var out = self._cipher.encryptBlock(self._prev) incr32(self._prev) return out } exports.encrypt = function (self, chunk) { while (self._cache.length < chunk.length) { self._cache = Buffer.concat([self._cache, getBlock(self)]) } var pad = self._cache.slice(0, chunk.length) self._cache = self._cache.slice(chunk.length) return xor(chunk, pad) } }).call(this,require("buffer").Buffer) },{"buffer":61,"buffer-xor":60}],46:[function(require,module,exports){ exports.encrypt = function (self, block) { return self._cipher.encryptBlock(block) } exports.decrypt = function (self, block) { return self._cipher.decryptBlock(block) } },{}],47:[function(require,module,exports){ (function (Buffer){ var xor = require('buffer-xor') function getBlock (self) { self._prev = self._cipher.encryptBlock(self._prev) return self._prev } exports.encrypt = function (self, chunk) { while (self._cache.length < chunk.length) { self._cache = Buffer.concat([self._cache, getBlock(self)]) } var pad = self._cache.slice(0, chunk.length) self._cache = self._cache.slice(chunk.length) return xor(chunk, pad) } }).call(this,require("buffer").Buffer) },{"buffer":61,"buffer-xor":60}],48:[function(require,module,exports){ (function (Buffer){ var aes = require('./aes') var Transform = require('cipher-base') var inherits = require('inherits') inherits(StreamCipher, Transform) module.exports = StreamCipher function StreamCipher (mode, key, iv, decrypt) { if (!(this instanceof StreamCipher)) { return new StreamCipher(mode, key, iv) } Transform.call(this) this._cipher = new aes.AES(key) this._prev = new Buffer(iv.length) this._cache = new Buffer('') this._secCache = new Buffer('') this._decrypt = decrypt iv.copy(this._prev) this._mode = mode } StreamCipher.prototype._update = function (chunk) { return this._mode.encrypt(this, chunk, this._decrypt) } StreamCipher.prototype._final = function () { this._cipher.scrub() } }).call(this,require("buffer").Buffer) },{"./aes":34,"buffer":61,"cipher-base":81,"inherits":167}],49:[function(require,module,exports){ var ebtk = require('evp_bytestokey') var aes = require('browserify-aes/browser') var DES = require('browserify-des') var desModes = require('browserify-des/modes') var aesModes = require('browserify-aes/modes') function createCipher (suite, password) { var keyLen, ivLen suite = suite.toLowerCase() if (aesModes[suite]) { keyLen = aesModes[suite].key ivLen = aesModes[suite].iv } else if (desModes[suite]) { keyLen = desModes[suite].key * 8 ivLen = desModes[suite].iv } else { throw new TypeError('invalid suite type') } var keys = ebtk(password, false, keyLen, ivLen) return createCipheriv(suite, keys.key, keys.iv) } function createDecipher (suite, password) { var keyLen, ivLen suite = suite.toLowerCase() if (aesModes[suite]) { keyLen = aesModes[suite].key ivLen = aesModes[suite].iv } else if (desModes[suite]) { keyLen = desModes[suite].key * 8 ivLen = desModes[suite].iv } else { throw new TypeError('invalid suite type') } var keys = ebtk(password, false, keyLen, ivLen) return createDecipheriv(suite, keys.key, keys.iv) } function createCipheriv (suite, key, iv) { suite = suite.toLowerCase() if (aesModes[suite]) { return aes.createCipheriv(suite, key, iv) } else if (desModes[suite]) { return new DES({ key: key, iv: iv, mode: suite }) } else { throw new TypeError('invalid suite type') } } function createDecipheriv (suite, key, iv) { suite = suite.toLowerCase() if (aesModes[suite]) { return aes.createDecipheriv(suite, key, iv) } else if (desModes[suite]) { return new DES({ key: key, iv: iv, mode: suite, decrypt: true }) } else { throw new TypeError('invalid suite type') } } exports.createCipher = exports.Cipher = createCipher exports.createCipheriv = exports.Cipheriv = createCipheriv exports.createDecipher = exports.Decipher = createDecipher exports.createDecipheriv = exports.Decipheriv = createDecipheriv function getCiphers () { return Object.keys(desModes).concat(aes.getCiphers()) } exports.listCiphers = exports.getCiphers = getCiphers },{"browserify-aes/browser":36,"browserify-aes/modes":40,"browserify-des":50,"browserify-des/modes":51,"evp_bytestokey":145}],50:[function(require,module,exports){ (function (Buffer){ var CipherBase = require('cipher-base') var des = require('des.js') var inherits = require('inherits') var modes = { 'des-ede3-cbc': des.CBC.instantiate(des.EDE), 'des-ede3': des.EDE, 'des-ede-cbc': des.CBC.instantiate(des.EDE), 'des-ede': des.EDE, 'des-cbc': des.CBC.instantiate(des.DES), 'des-ecb': des.DES } modes.des = modes['des-cbc'] modes.des3 = modes['des-ede3-cbc'] module.exports = DES inherits(DES, CipherBase) function DES (opts) { CipherBase.call(this) var modeName = opts.mode.toLowerCase() var mode = modes[modeName] var type if (opts.decrypt) { type = 'decrypt' } else { type = 'encrypt' } var key = opts.key if (modeName === 'des-ede' || modeName === 'des-ede-cbc') { key = Buffer.concat([key, key.slice(0, 8)]) } var iv = opts.iv this._des = mode.create({ key: key, iv: iv, type: type }) } DES.prototype._update = function (data) { return new Buffer(this._des.update(data)) } DES.prototype._final = function () { return new Buffer(this._des.final()) } }).call(this,require("buffer").Buffer) },{"buffer":61,"cipher-base":81,"des.js":113,"inherits":167}],51:[function(require,module,exports){ exports['des-ecb'] = { key: 8, iv: 0 } exports['des-cbc'] = exports.des = { key: 8, iv: 8 } exports['des-ede3-cbc'] = exports.des3 = { key: 24, iv: 8 } exports['des-ede3'] = { key: 24, iv: 0 } exports['des-ede-cbc'] = { key: 16, iv: 8 } exports['des-ede'] = { key: 16, iv: 0 } },{}],52:[function(require,module,exports){ (function (Buffer){ var bn = require('bn.js'); var randomBytes = require('randombytes'); module.exports = crt; function blind(priv) { var r = getr(priv); var blinder = r.toRed(bn.mont(priv.modulus)) .redPow(new bn(priv.publicExponent)).fromRed(); return { blinder: blinder, unblinder:r.invm(priv.modulus) }; } function crt(msg, priv) { var blinds = blind(priv); var len = priv.modulus.byteLength(); var mod = bn.mont(priv.modulus); var blinded = new bn(msg).mul(blinds.blinder).umod(priv.modulus); var c1 = blinded.toRed(bn.mont(priv.prime1)); var c2 = blinded.toRed(bn.mont(priv.prime2)); var qinv = priv.coefficient; var p = priv.prime1; var q = priv.prime2; var m1 = c1.redPow(priv.exponent1); var m2 = c2.redPow(priv.exponent2); m1 = m1.fromRed(); m2 = m2.fromRed(); var h = m1.isub(m2).imul(qinv).umod(p); h.imul(q); m2.iadd(h); return new Buffer(m2.imul(blinds.unblinder).umod(priv.modulus).toArray(false, len)); } crt.getr = getr; function getr(priv) { var len = priv.modulus.byteLength(); var r = new bn(randomBytes(len)); while (r.cmp(priv.modulus) >= 0 || !r.umod(priv.prime1) || !r.umod(priv.prime2)) { r = new bn(randomBytes(len)); } return r; } }).call(this,require("buffer").Buffer) },{"bn.js":29,"buffer":61,"randombytes":403}],53:[function(require,module,exports){ (function (Buffer){ 'use strict' exports['RSA-SHA224'] = exports.sha224WithRSAEncryption = { sign: 'rsa', hash: 'sha224', id: new Buffer('302d300d06096086480165030402040500041c', 'hex') } exports['RSA-SHA256'] = exports.sha256WithRSAEncryption = { sign: 'rsa', hash: 'sha256', id: new Buffer('3031300d060960864801650304020105000420', 'hex') } exports['RSA-SHA384'] = exports.sha384WithRSAEncryption = { sign: 'rsa', hash: 'sha384', id: new Buffer('3041300d060960864801650304020205000430', 'hex') } exports['RSA-SHA512'] = exports.sha512WithRSAEncryption = { sign: 'rsa', hash: 'sha512', id: new Buffer('3051300d060960864801650304020305000440', 'hex') } exports['RSA-SHA1'] = { sign: 'rsa', hash: 'sha1', id: new Buffer('3021300906052b0e03021a05000414', 'hex') } exports['ecdsa-with-SHA1'] = { sign: 'ecdsa', hash: 'sha1', id: new Buffer('', 'hex') } exports.DSA = exports['DSA-SHA1'] = exports['DSA-SHA'] = { sign: 'dsa', hash: 'sha1', id: new Buffer('', 'hex') } exports['DSA-SHA224'] = exports['DSA-WITH-SHA224'] = { sign: 'dsa', hash: 'sha224', id: new Buffer('', 'hex') } exports['DSA-SHA256'] = exports['DSA-WITH-SHA256'] = { sign: 'dsa', hash: 'sha256', id: new Buffer('', 'hex') } exports['DSA-SHA384'] = exports['DSA-WITH-SHA384'] = { sign: 'dsa', hash: 'sha384', id: new Buffer('', 'hex') } exports['DSA-SHA512'] = exports['DSA-WITH-SHA512'] = { sign: 'dsa', hash: 'sha512', id: new Buffer('', 'hex') } exports['DSA-RIPEMD160'] = { sign: 'dsa', hash: 'rmd160', id: new Buffer('', 'hex') } exports['RSA-RIPEMD160'] = exports.ripemd160WithRSA = { sign: 'rsa', hash: 'rmd160', id: new Buffer('3021300906052b2403020105000414', 'hex') } exports['RSA-MD5'] = exports.md5WithRSAEncryption = { sign: 'rsa', hash: 'md5', id: new Buffer('3020300c06082a864886f70d020505000410', 'hex') } }).call(this,require("buffer").Buffer) },{"buffer":61}],54:[function(require,module,exports){ (function (Buffer){ var _algos = require('./algos') var createHash = require('create-hash') var inherits = require('inherits') var sign = require('./sign') var stream = require('stream') var verify = require('./verify') var algos = {} Object.keys(_algos).forEach(function (key) { algos[key] = algos[key.toLowerCase()] = _algos[key] }) function Sign (algorithm) { stream.Writable.call(this) var data = algos[algorithm] if (!data) { throw new Error('Unknown message digest') } this._hashType = data.hash this._hash = createHash(data.hash) this._tag = data.id this._signType = data.sign } inherits(Sign, stream.Writable) Sign.prototype._write = function _write (data, _, done) { this._hash.update(data) done() } Sign.prototype.update = function update (data, enc) { if (typeof data === 'string') { data = new Buffer(data, enc) } this._hash.update(data) return this } Sign.prototype.sign = function signMethod (key, enc) { this.end() var hash = this._hash.digest() var sig = sign(Buffer.concat([this._tag, hash]), key, this._hashType, this._signType) return enc ? sig.toString(enc) : sig } function Verify (algorithm) { stream.Writable.call(this) var data = algos[algorithm] if (!data) { throw new Error('Unknown message digest') } this._hash = createHash(data.hash) this._tag = data.id this._signType = data.sign } inherits(Verify, stream.Writable) Verify.prototype._write = function _write (data, _, done) { this._hash.update(data) done() } Verify.prototype.update = function update (data, enc) { if (typeof data === 'string') { data = new Buffer(data, enc) } this._hash.update(data) return this } Verify.prototype.verify = function verifyMethod (key, sig, enc) { if (typeof sig === 'string') { sig = new Buffer(sig, enc) } this.end() var hash = this._hash.digest() return verify(sig, Buffer.concat([this._tag, hash]), key, this._signType) } function createSign (algorithm) { return new Sign(algorithm) } function createVerify (algorithm) { return new Verify(algorithm) } module.exports = { Sign: createSign, Verify: createVerify, createSign: createSign, createVerify: createVerify } }).call(this,require("buffer").Buffer) },{"./algos":53,"./sign":56,"./verify":57,"buffer":61,"create-hash":106,"inherits":167,"stream":576}],55:[function(require,module,exports){ 'use strict' exports['1.3.132.0.10'] = 'secp256k1' exports['1.3.132.0.33'] = 'p224' exports['1.2.840.10045.3.1.1'] = 'p192' exports['1.2.840.10045.3.1.7'] = 'p256' exports['1.3.132.0.34'] = 'p384' exports['1.3.132.0.35'] = 'p521' },{}],56:[function(require,module,exports){ (function (Buffer){ // much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js var createHmac = require('create-hmac') var crt = require('browserify-rsa') var curves = require('./curves') var elliptic = require('elliptic') var parseKeys = require('parse-asn1') var BN = require('bn.js') var EC = elliptic.ec function sign (hash, key, hashType, signType) { var priv = parseKeys(key) if (priv.curve) { if (signType !== 'ecdsa') throw new Error('wrong private key type') return ecSign(hash, priv) } else if (priv.type === 'dsa') { if (signType !== 'dsa') { throw new Error('wrong private key type') } return dsaSign(hash, priv, hashType) } else { if (signType !== 'rsa') throw new Error('wrong private key type') } var len = priv.modulus.byteLength() var pad = [ 0, 1 ] while (hash.length + pad.length + 1 < len) { pad.push(0xff) } pad.push(0x00) var i = -1 while (++i < hash.length) { pad.push(hash[i]) } var out = crt(pad, priv) return out } function ecSign (hash, priv) { var curveId = curves[priv.curve.join('.')] if (!curveId) throw new Error('unknown curve ' + priv.curve.join('.')) var curve = new EC(curveId) var key = curve.genKeyPair() key._importPrivate(priv.privateKey) var out = key.sign(hash) return new Buffer(out.toDER()) } function dsaSign (hash, priv, algo) { var x = priv.params.priv_key var p = priv.params.p var q = priv.params.q var g = priv.params.g var r = new BN(0) var k var H = bits2int(hash, q).mod(q) var s = false var kv = getKey(x, q, hash, algo) while (s === false) { k = makeKey(q, kv, algo) r = makeR(g, k, p, q) s = k.invm(q).imul(H.add(x.mul(r))).mod(q) if (!s.cmpn(0)) { s = false r = new BN(0) } } return toDER(r, s) } function toDER (r, s) { r = r.toArray() s = s.toArray() // Pad values if (r[0] & 0x80) { r = [ 0 ].concat(r) } // Pad values if (s[0] & 0x80) { s = [0].concat(s) } var total = r.length + s.length + 4 var res = [ 0x30, total, 0x02, r.length ] res = res.concat(r, [ 0x02, s.length ], s) return new Buffer(res) } function getKey (x, q, hash, algo) { x = new Buffer(x.toArray()) if (x.length < q.byteLength()) { var zeros = new Buffer(q.byteLength() - x.length) zeros.fill(0) x = Buffer.concat([zeros, x]) } var hlen = hash.length var hbits = bits2octets(hash, q) var v = new Buffer(hlen) v.fill(1) var k = new Buffer(hlen) k.fill(0) k = createHmac(algo, k) .update(v) .update(new Buffer([0])) .update(x) .update(hbits) .digest() v = createHmac(algo, k) .update(v) .digest() k = createHmac(algo, k) .update(v) .update(new Buffer([1])) .update(x) .update(hbits) .digest() v = createHmac(algo, k) .update(v) .digest() return { k: k, v: v } } function bits2int (obits, q) { var bits = new BN(obits) var shift = (obits.length << 3) - q.bitLength() if (shift > 0) { bits.ishrn(shift) } return bits } function bits2octets (bits, q) { bits = bits2int(bits, q) bits = bits.mod(q) var out = new Buffer(bits.toArray()) if (out.length < q.byteLength()) { var zeros = new Buffer(q.byteLength() - out.length) zeros.fill(0) out = Buffer.concat([zeros, out]) } return out } function makeKey (q, kv, algo) { var t, k do { t = new Buffer('') while (t.length * 8 < q.bitLength()) { kv.v = createHmac(algo, kv.k) .update(kv.v) .digest() t = Buffer.concat([t, kv.v]) } k = bits2int(t, q) kv.k = createHmac(algo, kv.k) .update(kv.v) .update(new Buffer([0])) .digest() kv.v = createHmac(algo, kv.k) .update(kv.v) .digest() } while (k.cmp(q) !== -1) return k } function makeR (g, k, p, q) { return g.toRed(BN.mont(p)).redPow(k).fromRed().mod(q) } module.exports = sign module.exports.getKey = getKey module.exports.makeKey = makeKey }).call(this,require("buffer").Buffer) },{"./curves":55,"bn.js":29,"browserify-rsa":52,"buffer":61,"create-hmac":109,"elliptic":125,"parse-asn1":288}],57:[function(require,module,exports){ (function (Buffer){ // much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js var curves = require('./curves') var elliptic = require('elliptic') var parseKeys = require('parse-asn1') var BN = require('bn.js') var EC = elliptic.ec function verify (sig, hash, key, signType) { var pub = parseKeys(key) if (pub.type === 'ec') { if (signType !== 'ecdsa') { throw new Error('wrong public key type') } return ecVerify(sig, hash, pub) } else if (pub.type === 'dsa') { if (signType !== 'dsa') { throw new Error('wrong public key type') } return dsaVerify(sig, hash, pub) } else { if (signType !== 'rsa') { throw new Error('wrong public key type') } } var len = pub.modulus.byteLength() var pad = [ 1 ] var padNum = 0 while (hash.length + pad.length + 2 < len) { pad.push(0xff) padNum++ } pad.push(0x00) var i = -1 while (++i < hash.length) { pad.push(hash[i]) } pad = new Buffer(pad) var red = BN.mont(pub.modulus) sig = new BN(sig).toRed(red) sig = sig.redPow(new BN(pub.publicExponent)) sig = new Buffer(sig.fromRed().toArray()) var out = 0 if (padNum < 8) { out = 1 } len = Math.min(sig.length, pad.length) if (sig.length !== pad.length) { out = 1 } i = -1 while (++i < len) { out |= (sig[i] ^ pad[i]) } return out === 0 } function ecVerify (sig, hash, pub) { var curveId = curves[pub.data.algorithm.curve.join('.')] if (!curveId) throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.')) var curve = new EC(curveId) var pubkey = pub.data.subjectPrivateKey.data return curve.verify(hash, sig, pubkey) } function dsaVerify (sig, hash, pub) { var p = pub.data.p var q = pub.data.q var g = pub.data.g var y = pub.data.pub_key var unpacked = parseKeys.signature.decode(sig, 'der') var s = unpacked.s var r = unpacked.r checkValue(s, q) checkValue(r, q) var montp = BN.mont(p) var w = s.invm(q) var v = g.toRed(montp) .redPow(new BN(hash).mul(w).mod(q)) .fromRed() .mul( y.toRed(montp) .redPow(r.mul(w).mod(q)) .fromRed() ).mod(p).mod(q) return !v.cmp(r) } function checkValue (b, q) { if (b.cmpn(0) <= 0) { throw new Error('invalid sig') } if (b.cmp(q) >= q) { throw new Error('invalid sig') } } module.exports = verify }).call(this,require("buffer").Buffer) },{"./curves":55,"bn.js":29,"buffer":61,"elliptic":125,"parse-asn1":288}],58:[function(require,module,exports){ arguments[4][33][0].apply(exports,arguments) },{"dup":33}],59:[function(require,module,exports){ var Buffer = require('buffer').Buffer; // for use with browserify module.exports = function (a, b) { if (!Buffer.isBuffer(a)) return undefined; if (!Buffer.isBuffer(b)) return undefined; if (typeof a.equals === 'function') return a.equals(b); if (a.length !== b.length) return false; for (var i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true; }; },{"buffer":61}],60:[function(require,module,exports){ (function (Buffer){ module.exports = function xor (a, b) { var length = Math.min(a.length, b.length) var buffer = new Buffer(length) for (var i = 0; i < length; ++i) { buffer[i] = a[i] ^ b[i] } return buffer } }).call(this,require("buffer").Buffer) },{"buffer":61}],61:[function(require,module,exports){ (function (global){ /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ 'use strict' var base64 = require('base64-js') var ieee754 = require('ieee754') var isArray = require('isarray') exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 Buffer.poolSize = 8192 // not used by this implementation var rootParent = {} /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Use Object implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * * Due to various browser bugs, sometimes the Object implementation will be used even * when the browser supports typed arrays. * * Note: * * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of * incorrect length in some situations. * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they * get the Object implementation, which is slower but behaves correctly. */ Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined ? global.TYPED_ARRAY_SUPPORT : typedArraySupport() function typedArraySupport () { try { var arr = new Uint8Array(1) arr.foo = function () { return 42 } return arr.foo() === 42 && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } } function kMaxLength () { return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff } /** * The Buffer constructor returns instances of `Uint8Array` that have their * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of * `Uint8Array`, so the returned instances will have all the node `Buffer` methods * and the `Uint8Array` methods. Square bracket notation works as expected -- it * returns a single octet. * * The `Uint8Array` prototype remains unmodified. */ function Buffer (arg) { if (!(this instanceof Buffer)) { // Avoid going through an ArgumentsAdaptorTrampoline in the common case. if (arguments.length > 1) return new Buffer(arg, arguments[1]) return new Buffer(arg) } if (!Buffer.TYPED_ARRAY_SUPPORT) { this.length = 0 this.parent = undefined } // Common case. if (typeof arg === 'number') { return fromNumber(this, arg) } // Slightly less common case. if (typeof arg === 'string') { return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') } // Unusual. return fromObject(this, arg) } // TODO: Legacy, not needed anymore. Remove in next major version. Buffer._augment = function (arr) { arr.__proto__ = Buffer.prototype return arr } function fromNumber (that, length) { that = allocate(that, length < 0 ? 0 : checked(length) | 0) if (!Buffer.TYPED_ARRAY_SUPPORT) { for (var i = 0; i < length; i++) { that[i] = 0 } } return that } function fromString (that, string, encoding) { if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' // Assumption: byteLength() return value is always < kMaxLength. var length = byteLength(string, encoding) | 0 that = allocate(that, length) that.write(string, encoding) return that } function fromObject (that, object) { if (Buffer.isBuffer(object)) return fromBuffer(that, object) if (isArray(object)) return fromArray(that, object) if (object == null) { throw new TypeError('must start with number, buffer, array or string') } if (typeof ArrayBuffer !== 'undefined') { if (object.buffer instanceof ArrayBuffer) { return fromTypedArray(that, object) } if (object instanceof ArrayBuffer) { return fromArrayBuffer(that, object) } } if (object.length) return fromArrayLike(that, object) return fromJsonObject(that, object) } function fromBuffer (that, buffer) { var length = checked(buffer.length) | 0 that = allocate(that, length) buffer.copy(that, 0, 0, length) return that } function fromArray (that, array) { var length = checked(array.length) | 0 that = allocate(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } // Duplicate of fromArray() to keep fromArray() monomorphic. function fromTypedArray (that, array) { var length = checked(array.length) | 0 that = allocate(that, length) // Truncating the elements is probably not what people expect from typed // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior // of the old Buffer constructor. for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } function fromArrayBuffer (that, array) { array.byteLength // this throws if `array` is not a valid ArrayBuffer if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = new Uint8Array(array) that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class that = fromTypedArray(that, new Uint8Array(array)) } return that } function fromArrayLike (that, array) { var length = checked(array.length) | 0 that = allocate(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } // Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. // Returns a zero-length buffer for inputs that don't conform to the spec. function fromJsonObject (that, object) { var array var length = 0 if (object.type === 'Buffer' && isArray(object.data)) { array = object.data length = checked(array.length) | 0 } that = allocate(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } if (Buffer.TYPED_ARRAY_SUPPORT) { Buffer.prototype.__proto__ = Uint8Array.prototype Buffer.__proto__ = Uint8Array if (typeof Symbol !== 'undefined' && Symbol.species && Buffer[Symbol.species] === Buffer) { // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 Object.defineProperty(Buffer, Symbol.species, { value: null, configurable: true }) } } else { // pre-set for values that may exist in the future Buffer.prototype.length = undefined Buffer.prototype.parent = undefined } function allocate (that, length) { if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = new Uint8Array(length) that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class that.length = length } var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 if (fromPool) that.parent = rootParent return that } function checked (length) { // Note: cannot use `length < kMaxLength` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= kMaxLength()) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes') } return length | 0 } function SlowBuffer (subject, encoding) { if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) var buf = new Buffer(subject, encoding) delete buf.parent return buf } Buffer.isBuffer = function isBuffer (b) { return !!(b != null && b._isBuffer) } Buffer.compare = function compare (a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError('Arguments must be Buffers') } if (a === b) return 0 var x = a.length var y = b.length for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i] y = b[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } Buffer.isEncoding = function isEncoding (encoding) { switch (String(encoding).toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'raw': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return true default: return false } } Buffer.concat = function concat (list, length) { if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') if (list.length === 0) { return new Buffer(0) } var i if (length === undefined) { length = 0 for (i = 0; i < list.length; i++) { length += list[i].length } } var buf = new Buffer(length) var pos = 0 for (i = 0; i < list.length; i++) { var item = list[i] item.copy(buf, pos) pos += item.length } return buf } function byteLength (string, encoding) { if (typeof string !== 'string') string = '' + string var len = string.length if (len === 0) return 0 // Use a for loop to avoid recursion var loweredCase = false for (;;) { switch (encoding) { case 'ascii': case 'binary': // Deprecated case 'raw': case 'raws': return len case 'utf8': case 'utf-8': return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return len * 2 case 'hex': return len >>> 1 case 'base64': return base64ToBytes(string).length default: if (loweredCase) return utf8ToBytes(string).length // assume utf8 encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.byteLength = byteLength function slowToString (encoding, start, end) { var loweredCase = false start = start | 0 end = end === undefined || end === Infinity ? this.length : end | 0 if (!encoding) encoding = 'utf8' if (start < 0) start = 0 if (end > this.length) end = this.length if (end <= start) return '' while (true) { switch (encoding) { case 'hex': return hexSlice(this, start, end) case 'utf8': case 'utf-8': return utf8Slice(this, start, end) case 'ascii': return asciiSlice(this, start, end) case 'binary': return binarySlice(this, start, end) case 'base64': return base64Slice(this, start, end) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return utf16leSlice(this, start, end) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = (encoding + '').toLowerCase() loweredCase = true } } } // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect // Buffer instances. Buffer.prototype._isBuffer = true Buffer.prototype.toString = function toString () { var length = this.length | 0 if (length === 0) return '' if (arguments.length === 0) return utf8Slice(this, 0, length) return slowToString.apply(this, arguments) } Buffer.prototype.equals = function equals (b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') if (this === b) return true return Buffer.compare(this, b) === 0 } Buffer.prototype.inspect = function inspect () { var str = '' var max = exports.INSPECT_MAX_BYTES if (this.length > 0) { str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') if (this.length > max) str += ' ... ' } return '' } Buffer.prototype.compare = function compare (b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') return Buffer.compare(this, b) } Buffer.prototype.indexOf = function indexOf (val, byteOffset) { if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff else if (byteOffset < -0x80000000) byteOffset = -0x80000000 byteOffset >>= 0 if (this.length === 0) return -1 if (byteOffset >= this.length) return -1 // Negative offsets start from the end of the buffer if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) if (typeof val === 'string') { if (val.length === 0) return -1 // special case: looking for empty string always fails return String.prototype.indexOf.call(this, val, byteOffset) } if (Buffer.isBuffer(val)) { return arrayIndexOf(this, val, byteOffset) } if (typeof val === 'number') { if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { return Uint8Array.prototype.indexOf.call(this, val, byteOffset) } return arrayIndexOf(this, [ val ], byteOffset) } function arrayIndexOf (arr, val, byteOffset) { var foundIndex = -1 for (var i = 0; byteOffset + i < arr.length; i++) { if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { if (foundIndex === -1) foundIndex = i if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex } else { foundIndex = -1 } } return -1 } throw new TypeError('val must be string, number or Buffer') } function hexWrite (buf, string, offset, length) { offset = Number(offset) || 0 var remaining = buf.length - offset if (!length) { length = remaining } else { length = Number(length) if (length > remaining) { length = remaining } } // must be an even number of digits var strLen = string.length if (strLen % 2 !== 0) throw new Error('Invalid hex string') if (length > strLen / 2) { length = strLen / 2 } for (var i = 0; i < length; i++) { var parsed = parseInt(string.substr(i * 2, 2), 16) if (isNaN(parsed)) throw new Error('Invalid hex string') buf[offset + i] = parsed } return i } function utf8Write (buf, string, offset, length) { return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) } function asciiWrite (buf, string, offset, length) { return blitBuffer(asciiToBytes(string), buf, offset, length) } function binaryWrite (buf, string, offset, length) { return asciiWrite(buf, string, offset, length) } function base64Write (buf, string, offset, length) { return blitBuffer(base64ToBytes(string), buf, offset, length) } function ucs2Write (buf, string, offset, length) { return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) } Buffer.prototype.write = function write (string, offset, length, encoding) { // Buffer#write(string) if (offset === undefined) { encoding = 'utf8' length = this.length offset = 0 // Buffer#write(string, encoding) } else if (length === undefined && typeof offset === 'string') { encoding = offset length = this.length offset = 0 // Buffer#write(string, offset[, length][, encoding]) } else if (isFinite(offset)) { offset = offset | 0 if (isFinite(length)) { length = length | 0 if (encoding === undefined) encoding = 'utf8' } else { encoding = length length = undefined } // legacy write(string, encoding, offset, length) - remove in v0.13 } else { var swap = encoding encoding = offset offset = length | 0 length = swap } var remaining = this.length - offset if (length === undefined || length > remaining) length = remaining if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { throw new RangeError('attempt to write outside buffer bounds') } if (!encoding) encoding = 'utf8' var loweredCase = false for (;;) { switch (encoding) { case 'hex': return hexWrite(this, string, offset, length) case 'utf8': case 'utf-8': return utf8Write(this, string, offset, length) case 'ascii': return asciiWrite(this, string, offset, length) case 'binary': return binaryWrite(this, string, offset, length) case 'base64': // Warning: maxLength not taken into account in base64Write return base64Write(this, string, offset, length) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return ucs2Write(this, string, offset, length) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.prototype.toJSON = function toJSON () { return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) } } function base64Slice (buf, start, end) { if (start === 0 && end === buf.length) { return base64.fromByteArray(buf) } else { return base64.fromByteArray(buf.slice(start, end)) } } function utf8Slice (buf, start, end) { end = Math.min(buf.length, end) var res = [] var i = start while (i < end) { var firstByte = buf[i] var codePoint = null var bytesPerSequence = (firstByte > 0xEF) ? 4 : (firstByte > 0xDF) ? 3 : (firstByte > 0xBF) ? 2 : 1 if (i + bytesPerSequence <= end) { var secondByte, thirdByte, fourthByte, tempCodePoint switch (bytesPerSequence) { case 1: if (firstByte < 0x80) { codePoint = firstByte } break case 2: secondByte = buf[i + 1] if ((secondByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) if (tempCodePoint > 0x7F) { codePoint = tempCodePoint } } break case 3: secondByte = buf[i + 1] thirdByte = buf[i + 2] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { codePoint = tempCodePoint } } break case 4: secondByte = buf[i + 1] thirdByte = buf[i + 2] fourthByte = buf[i + 3] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { codePoint = tempCodePoint } } } } if (codePoint === null) { // we did not generate a valid codePoint so insert a // replacement char (U+FFFD) and advance only 1 byte codePoint = 0xFFFD bytesPerSequence = 1 } else if (codePoint > 0xFFFF) { // encode to utf16 (surrogate pair dance) codePoint -= 0x10000 res.push(codePoint >>> 10 & 0x3FF | 0xD800) codePoint = 0xDC00 | codePoint & 0x3FF } res.push(codePoint) i += bytesPerSequence } return decodeCodePointsArray(res) } // Based on http://stackoverflow.com/a/22747272/680742, the browser with // the lowest limit is Chrome, with 0x10000 args. // We go 1 magnitude less, for safety var MAX_ARGUMENTS_LENGTH = 0x1000 function decodeCodePointsArray (codePoints) { var len = codePoints.length if (len <= MAX_ARGUMENTS_LENGTH) { return String.fromCharCode.apply(String, codePoints) // avoid extra slice() } // Decode in chunks to avoid "call stack size exceeded". var res = '' var i = 0 while (i < len) { res += String.fromCharCode.apply( String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) ) } return res } function asciiSlice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; i++) { ret += String.fromCharCode(buf[i] & 0x7F) } return ret } function binarySlice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; i++) { ret += String.fromCharCode(buf[i]) } return ret } function hexSlice (buf, start, end) { var len = buf.length if (!start || start < 0) start = 0 if (!end || end < 0 || end > len) end = len var out = '' for (var i = start; i < end; i++) { out += toHex(buf[i]) } return out } function utf16leSlice (buf, start, end) { var bytes = buf.slice(start, end) var res = '' for (var i = 0; i < bytes.length; i += 2) { res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) } return res } Buffer.prototype.slice = function slice (start, end) { var len = this.length start = ~~start end = end === undefined ? len : ~~end if (start < 0) { start += len if (start < 0) start = 0 } else if (start > len) { start = len } if (end < 0) { end += len if (end < 0) end = 0 } else if (end > len) { end = len } if (end < start) end = start var newBuf if (Buffer.TYPED_ARRAY_SUPPORT) { newBuf = this.subarray(start, end) newBuf.__proto__ = Buffer.prototype } else { var sliceLen = end - start newBuf = new Buffer(sliceLen, undefined) for (var i = 0; i < sliceLen; i++) { newBuf[i] = this[i + start] } } if (newBuf.length) newBuf.parent = this.parent || this return newBuf } /* * Need to make sure that buffer isn't trying to write out of bounds. */ function checkOffset (offset, ext, length) { if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') } Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } return val } Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { checkOffset(offset, byteLength, this.length) } var val = this[offset + --byteLength] var mul = 1 while (byteLength > 0 && (mul *= 0x100)) { val += this[offset + --byteLength] * mul } return val } Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ((this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16)) + (this[offset + 3] * 0x1000000) } Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] * 0x1000000) + ((this[offset + 1] << 16) | (this[offset + 2] << 8) | this[offset + 3]) } Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var i = byteLength var mul = 1 var val = this[offset + --i] while (i > 0 && (mul *= 0x100)) { val += this[offset + --i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) if (!(this[offset] & 0x80)) return (this[offset]) return ((0xff - this[offset] + 1) * -1) } Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset] | (this[offset + 1] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset + 1] | (this[offset] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16) | (this[offset + 3] << 24) } Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] << 24) | (this[offset + 1] << 16) | (this[offset + 2] << 8) | (this[offset + 3]) } Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, false, 52, 8) } function checkInt (buf, value, offset, ext, max, min) { if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') if (value > max || value < min) throw new RangeError('value is out of bounds') if (offset + ext > buf.length) throw new RangeError('index out of range') } Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) var mul = 1 var i = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) var i = byteLength - 1 var mul = 1 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) this[offset] = (value & 0xff) return offset + 1 } function objectWriteUInt16 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> (littleEndian ? i : 1 - i) * 8 } } Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } function objectWriteUInt32 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffffffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff } } Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) this[offset] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = 0 var mul = 1 var sub = value < 0 ? 1 : 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = byteLength - 1 var mul = 1 var sub = value < 0 ? 1 : 0 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) if (value < 0) value = 0xff + value + 1 this[offset] = (value & 0xff) return offset + 1 } Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (value < 0) value = 0xffffffff + value + 1 if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } function checkIEEE754 (buf, value, offset, ext, max, min) { if (offset + ext > buf.length) throw new RangeError('index out of range') if (offset < 0) throw new RangeError('index out of range') } function writeFloat (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) } ieee754.write(buf, value, offset, littleEndian, 23, 4) return offset + 4 } Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { return writeFloat(this, value, offset, true, noAssert) } Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { return writeFloat(this, value, offset, false, noAssert) } function writeDouble (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) } ieee754.write(buf, value, offset, littleEndian, 52, 8) return offset + 8 } Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { return writeDouble(this, value, offset, true, noAssert) } Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { return writeDouble(this, value, offset, false, noAssert) } // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) Buffer.prototype.copy = function copy (target, targetStart, start, end) { if (!start) start = 0 if (!end && end !== 0) end = this.length if (targetStart >= target.length) targetStart = target.length if (!targetStart) targetStart = 0 if (end > 0 && end < start) end = start // Copy 0 bytes; we're done if (end === start) return 0 if (target.length === 0 || this.length === 0) return 0 // Fatal error conditions if (targetStart < 0) { throw new RangeError('targetStart out of bounds') } if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') if (end < 0) throw new RangeError('sourceEnd out of bounds') // Are we oob? if (end > this.length) end = this.length if (target.length - targetStart < end - start) { end = target.length - targetStart + start } var len = end - start var i if (this === target && start < targetStart && targetStart < end) { // descending copy from end for (i = len - 1; i >= 0; i--) { target[i + targetStart] = this[i + start] } } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { // ascending copy from start for (i = 0; i < len; i++) { target[i + targetStart] = this[i + start] } } else { Uint8Array.prototype.set.call( target, this.subarray(start, start + len), targetStart ) } return len } // fill(value, start=0, end=buffer.length) Buffer.prototype.fill = function fill (value, start, end) { if (!value) value = 0 if (!start) start = 0 if (!end) end = this.length if (end < start) throw new RangeError('end < start') // Fill 0 bytes; we're done if (end === start) return if (this.length === 0) return if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') if (end < 0 || end > this.length) throw new RangeError('end out of bounds') var i if (typeof value === 'number') { for (i = start; i < end; i++) { this[i] = value } } else { var bytes = utf8ToBytes(value.toString()) var len = bytes.length for (i = start; i < end; i++) { this[i] = bytes[i % len] } } return this } // HELPER FUNCTIONS // ================ var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g function base64clean (str) { // Node strips out invalid characters like \n and \t from the string, base64-js does not str = stringtrim(str).replace(INVALID_BASE64_RE, '') // Node converts strings with length < 2 to '' if (str.length < 2) return '' // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not while (str.length % 4 !== 0) { str = str + '=' } return str } function stringtrim (str) { if (str.trim) return str.trim() return str.replace(/^\s+|\s+$/g, '') } function toHex (n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) } function utf8ToBytes (string, units) { units = units || Infinity var codePoint var length = string.length var leadSurrogate = null var bytes = [] for (var i = 0; i < length; i++) { codePoint = string.charCodeAt(i) // is surrogate component if (codePoint > 0xD7FF && codePoint < 0xE000) { // last char was a lead if (!leadSurrogate) { // no lead yet if (codePoint > 0xDBFF) { // unexpected trail if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } else if (i + 1 === length) { // unpaired lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } // valid lead leadSurrogate = codePoint continue } // 2 leads in a row if (codePoint < 0xDC00) { if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) leadSurrogate = codePoint continue } // valid surrogate pair codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) } leadSurrogate = null // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) break bytes.push(codePoint) } else if (codePoint < 0x800) { if ((units -= 2) < 0) break bytes.push( codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x10000) { if ((units -= 3) < 0) break bytes.push( codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x110000) { if ((units -= 4) < 0) break bytes.push( codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else { throw new Error('Invalid code point') } } return bytes } function asciiToBytes (str) { var byteArray = [] for (var i = 0; i < str.length; i++) { // Node's code seems to be doing this and not & 0x7F.. byteArray.push(str.charCodeAt(i) & 0xFF) } return byteArray } function utf16leToBytes (str, units) { var c, hi, lo var byteArray = [] for (var i = 0; i < str.length; i++) { if ((units -= 2) < 0) break c = str.charCodeAt(i) hi = c >> 8 lo = c % 256 byteArray.push(lo) byteArray.push(hi) } return byteArray } function base64ToBytes (str) { return base64.toByteArray(base64clean(str)) } function blitBuffer (src, dst, offset, length) { for (var i = 0; i < length; i++) { if ((i + offset >= dst.length) || (i >= src.length)) break dst[i + offset] = src[i] } return i } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"base64-js":62,"ieee754":163,"isarray":63}],62:[function(require,module,exports){ 'use strict' exports.toByteArray = toByteArray exports.fromByteArray = fromByteArray var lookup = [] var revLookup = [] var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array function init () { var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' for (var i = 0, len = code.length; i < len; ++i) { lookup[i] = code[i] revLookup[code.charCodeAt(i)] = i } revLookup['-'.charCodeAt(0)] = 62 revLookup['_'.charCodeAt(0)] = 63 } init() function toByteArray (b64) { var i, j, l, tmp, placeHolders, arr var len = b64.length if (len % 4 > 0) { throw new Error('Invalid string. Length must be a multiple of 4') } // the number of equal signs (place holders) // if there are two placeholders, than the two characters before it // represent one byte // if there is only one, then the three characters before it represent 2 bytes // this is just a cheap hack to not do indexOf twice placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 // base64 is 4/3 + up to two characters of the original data arr = new Arr(len * 3 / 4 - placeHolders) // if there are placeholders, only get up to the last complete 4 chars l = placeHolders > 0 ? len - 4 : len var L = 0 for (i = 0, j = 0; i < l; i += 4, j += 3) { tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] arr[L++] = (tmp >> 16) & 0xFF arr[L++] = (tmp >> 8) & 0xFF arr[L++] = tmp & 0xFF } if (placeHolders === 2) { tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) arr[L++] = tmp & 0xFF } else if (placeHolders === 1) { tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) arr[L++] = (tmp >> 8) & 0xFF arr[L++] = tmp & 0xFF } return arr } function tripletToBase64 (num) { return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] } function encodeChunk (uint8, start, end) { var tmp var output = [] for (var i = start; i < end; i += 3) { tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) output.push(tripletToBase64(tmp)) } return output.join('') } function fromByteArray (uint8) { var tmp var len = uint8.length var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes var output = '' var parts = [] var maxChunkLength = 16383 // must be multiple of 3 // go through the array every three bytes, we'll deal with trailing stuff later for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) } // pad the end with zeros, but make sure to not forget the extra bytes if (extraBytes === 1) { tmp = uint8[len - 1] output += lookup[tmp >> 2] output += lookup[(tmp << 4) & 0x3F] output += '==' } else if (extraBytes === 2) { tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) output += lookup[tmp >> 10] output += lookup[(tmp >> 4) & 0x3F] output += lookup[(tmp << 2) & 0x3F] output += '=' } parts.push(output) return parts.join('') } },{}],63:[function(require,module,exports){ arguments[4][23][0].apply(exports,arguments) },{"dup":23}],64:[function(require,module,exports){ module.exports = { "100": "Continue", "101": "Switching Protocols", "102": "Processing", "200": "OK", "201": "Created", "202": "Accepted", "203": "Non-Authoritative Information", "204": "No Content", "205": "Reset Content", "206": "Partial Content", "207": "Multi-Status", "208": "Already Reported", "226": "IM Used", "300": "Multiple Choices", "301": "Moved Permanently", "302": "Found", "303": "See Other", "304": "Not Modified", "305": "Use Proxy", "307": "Temporary Redirect", "308": "Permanent Redirect", "400": "Bad Request", "401": "Unauthorized", "402": "Payment Required", "403": "Forbidden", "404": "Not Found", "405": "Method Not Allowed", "406": "Not Acceptable", "407": "Proxy Authentication Required", "408": "Request Timeout", "409": "Conflict", "410": "Gone", "411": "Length Required", "412": "Precondition Failed", "413": "Payload Too Large", "414": "URI Too Long", "415": "Unsupported Media Type", "416": "Range Not Satisfiable", "417": "Expectation Failed", "418": "I'm a teapot", "421": "Misdirected Request", "422": "Unprocessable Entity", "423": "Locked", "424": "Failed Dependency", "425": "Unordered Collection", "426": "Upgrade Required", "428": "Precondition Required", "429": "Too Many Requests", "431": "Request Header Fields Too Large", "500": "Internal Server Error", "501": "Not Implemented", "502": "Bad Gateway", "503": "Service Unavailable", "504": "Gateway Timeout", "505": "HTTP Version Not Supported", "506": "Variant Also Negotiates", "507": "Insufficient Storage", "508": "Loop Detected", "509": "Bandwidth Limit Exceeded", "510": "Not Extended", "511": "Network Authentication Required" } },{}],65:[function(require,module,exports){ var base = require('typewise-core/base') var codecs = require('./codecs') var util = require('./util') // // extend core sorts defined by typewise with bytewise-specific functionality // // byte represents byte tag prefix in encoded form, enforcing binary total order // type tag is 1 byte, which gives us plenty of room to grow // // boundary types // base.bound.encode = util.encodeBaseBound // // value types // var sorts = base.sorts sorts.void.byte = 0xf0 sorts.null.byte = 0x10 var BOOLEAN = sorts.boolean BOOLEAN.sorts.false.byte = 0x20 BOOLEAN.sorts.true.byte = 0x21 BOOLEAN.bound.encode = util.encodeBound var NUMBER = sorts.number NUMBER.sorts.min.byte = 0x40 NUMBER.sorts.negative.byte = 0x41 NUMBER.sorts.positive.byte = 0x42 NUMBER.sorts.max.byte = 0x43 NUMBER.sorts.negative.codec = codecs.NEGATIVE_FLOAT NUMBER.sorts.positive.codec = codecs.POSITIVE_FLOAT NUMBER.bound.encode = util.encodeBound var DATE = sorts.date DATE.sorts.negative.byte = 0x51 DATE.sorts.positive.byte = 0x52 DATE.sorts.negative.codec = codecs.PRE_EPOCH_DATE DATE.sorts.positive.codec = codecs.POST_EPOCH_DATE DATE.bound.encode = util.encodeBound var BINARY = sorts.binary BINARY.byte = 0x60 BINARY.codec = codecs.UINT8 BINARY.bound.encode = util.encodeBound var STRING = sorts.string STRING.byte = 0x70 STRING.codec = codecs.UTF8 STRING.bound.encode = util.encodeBound var ARRAY = sorts.array ARRAY.byte = 0xa0 ARRAY.codec = codecs.LIST ARRAY.bound.encode = util.encodeListBound // var OBJECT = sorts.object // OBJECT.byte = 0xb0 // OBJECT.codec = codecs.HASH // OBJECT.bound.encode = util.encodeListBound module.exports = base },{"./codecs":66,"./util":68,"typewise-core/base":623}],66:[function(require,module,exports){ (function (Buffer){ var util = require('./util') var FLOAT_LENGTH = 8 function identity(value) { return value } function shortlexEncode(codec) { return function (source, base) { // stupid lazy implementation // TODO: allow length getter to be provided var length = util.encodeFloat(source.length) var body = codec.encode(source, base) return Buffer.concat([ length, body ]) } } function shortlexDecode(codec) { return function (buffer) { // stupid lazy implementation return codec.decode(this, buffer.slice(FLOAT_LENGTH)) } } function shortlexParse(codec) { // TODO return function (buffer, base) { throw new Error('NYI') } } function shortlex(codec) { return { encode: shortlexEncode(codec), decode: shortlexDecode(codec), parse: shortlexParse(codec) } } // // pairs of encode/decode functions // var codecs = exports codecs.HEX = { encode: function (source) { return new Buffer(source, 'hex') }, decode: function (buffer) { return buffer.toString('hex') } } codecs.UINT8 = { encode: identity, decode: identity, escape: util.escapeFlat, unescape: util.unescapeFlat } codecs.UINT8_SHORTLEX = shortlex(codecs.UINT8) codecs.UTF8 = { encode: function (source) { return new Buffer(source, 'utf8') }, decode: function (buffer) { return buffer.toString('utf8') }, escape: util.escapeFlatLow, unescape: util.unescapeFlatLow } codecs.UTF8_SHORTLEX = shortlex(codecs.UTF8) codecs.POSITIVE_FLOAT = { length: FLOAT_LENGTH, encode: util.encodeFloat, decode: util.decodeFloat } codecs.NEGATIVE_FLOAT = { length: FLOAT_LENGTH, encode: util.encodeFloat, decode: function (buffer) { return util.decodeFloat(buffer, null, true) } } codecs.POST_EPOCH_DATE = { length: FLOAT_LENGTH, encode: util.encodeFloat, decode: function (buffer) { return new Date(util.decodeFloat(buffer)) } } codecs.PRE_EPOCH_DATE = { length: FLOAT_LENGTH, encode: util.encodeFloat, decode: function (buffer) { return new Date(util.decodeFloat(buffer, null, true)) } } // // base encoding for complex structures // codecs.LIST = { encode: util.encodeList, decode: util.decodeList } codecs.TUPLE = shortlex(codecs.LIST) // // member order is preserved and accounted for in sort (except for number keys) // codecs.HASH = { // TODO // encode: util.encodeHash, // decode: util.decodeHash } codecs.RECORD = shortlex(codecs.HASH) }).call(this,require("buffer").Buffer) },{"./util":68,"buffer":61}],67:[function(require,module,exports){ (function (Buffer){ var assert = require('./util').assert var base = require('./base') var codecs = require('./codecs') var bytewise = exports // // expose type information // var sorts = bytewise.sorts = base.sorts bytewise.bound = base.bound bytewise.compare = base.compare bytewise.equal = base.equal // // generate a buffer with type's byte prefix from source value // function serialize(type, source, options) { var codec = type.codec if (!codec) return postEncode(new Buffer([ type.byte ]), options) var buffer = codec.encode(source, bytewise) if (options && options.nested && codec.escape) buffer = codec.escape(buffer) var hint = typeof codec.length === 'number' ? (codec.length + 1) : void 0 var buffers = [ new Buffer([ type.byte ]), buffer ] return postEncode(Buffer.concat(buffers, hint), options) } // // core encode logic // bytewise.encode = function(source, options) { // check for invalid/incomparable values assert(!base.invalid(source), 'Invalid value') // encode bound types (ranges) var boundary = base.bound.getBoundary(source) if (boundary) return boundary.encode(source, bytewise) // encode standard value-typed sorts var order = base.order var sort for (var i = 0, length = order.length; i < length; ++i) { sort = sorts[order[i]] if (sort.is(source)) { // loop over any subsorts defined on sort // TODO: clean up var subsorts = sort.sorts || { '': sort } for (key in subsorts) { var subsort = subsorts[key] if (subsort.is(source)) return serialize(subsort, source, options) } // source is an unsupported subsort assert(false, 'Unsupported sort value') } } // no type descriptor found assert(false, 'Unknown value') } // // core decode logic // bytewise.decode = function (buffer, options) { // attempt to decode string input using configurable codec if (typeof buffer === 'string') { buffer = bytewise.stringCodec.encode(buffer) } assert(!buffer || !buffer.undecodable, 'Encoded value not decodable') var byte = buffer[0] var type = bytewise.getType(byte) assert(type, 'Invalid encoding: ' + buffer) // if type provides a decoder it is passed the base type system as second arg var codec = type.codec if (codec) { var decoded = codec.decode(buffer.slice(1), bytewise) if (options && options.nested && codec.unescape) decoded = codec.unescape(decoded) return postDecode(decoded, options) } // nullary types without a codec must provide a value for their decoded form assert('value' in type, 'Unsupported encoding: ' + buffer) return postDecode(type.value, options) } // // process top level // function postEncode(encoded, options) { if (options === null) return encoded return bytewise.postEncode(encoded, options) } // // invoked after encoding with encoded buffer instance // bytewise.postEncode = function (encoded, options) { // override buffer toString method to default to hex to help coercion issues // TODO: just return pure buffer, do this toString hackery in bytewise encoded.toString = function (encoding) { if (!encoding) return bytewise.stringCodec.decode(encoded) return Buffer.prototype.toString.apply(encoded, arguments) } return encoded } function postDecode(decoded, options) { if (options === null) return decoded return bytewise.postDecode(decoded, options) } // // invoked after decoding with decoded value // bytewise.postDecode = function (decoded, options) { return decoded } // // registry mapping byte prefixes to type descriptors // var PREFIX_REGISTRY function registerType(type) { var byte = type && type.byte if (byte == null) return if (byte in PREFIX_REGISTRY) assert.deepEqual(type, PREFIX_REGISTRY[byte], 'Duplicate prefix: ' + byte) PREFIX_REGISTRY[type.byte] = type } function registerTypes(types) { for (var key in types) { registerType(types[key]) } } // // look up type descriptor associated with a given byte prefix // bytewise.getType = function (byte) { // construct and memoize byte prefix registry on first run if (!PREFIX_REGISTRY) { PREFIX_REGISTRY = {} // register sorts var sort for (var key in sorts) { sort = sorts[key] // if sort has subsorts register these instead sort.sorts ? registerTypes(sort.sorts) : registerType(sort) } } return PREFIX_REGISTRY[byte] } bytewise.buffer = true bytewise.stringCodec = codecs.HEX bytewise.type = 'bytewise-core' }).call(this,require("buffer").Buffer) },{"./base":65,"./codecs":66,"./util":68,"buffer":61}],68:[function(require,module,exports){ (function (Buffer){ var util = exports // // buffer compare // util.compare = require('typewise-core/collation').bitwise // // buffer equality // util.equal = function (a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) return if (a === b) return true if (typeof a.equals === 'function') return a.equals(b) return util.compare(a, b) === 0 } var assert = util.assert = function (test, message) { if (!test) throw new TypeError(message) } var FLOAT_LENGTH = 8 util.invertBytes = function (buffer) { var bytes = [] for (var i = 0, end = buffer.length; i < end; ++i) { bytes.push(~buffer[i]) } return new Buffer(bytes) } util.encodeFloat = function (value) { var buffer = new Buffer(FLOAT_LENGTH) if (value < 0) { // // write negative numbers as negated positive values to invert bytes // buffer.writeDoubleBE(-value.valueOf(), 0) return util.invertBytes(buffer) } // // normalize -0 values to 0 // buffer.writeDoubleBE(value.valueOf() || 0, 0) return buffer } util.decodeFloat = function (buffer, base, negative) { assert(buffer.length === FLOAT_LENGTH, 'Invalid float encoding length') if (negative) buffer = util.invertBytes(buffer) var value = buffer.readDoubleBE(0) return negative ? -value : value } // // sigil for controlling the escapement functions (TODO: clean this up) // var SKIP_HIGH_BYTES = {} util.escapeFlat = function (buffer, options) { // // escape high and low bytes 0x00 and 0xff (and by necessity, 0x01 and 0xfe) // var b, bytes = [] for (var i = 0, end = buffer.length; i < end; ++i) { b = buffer[i] // // escape low bytes with 0x01 and by adding 1 // if (b === 0x01 || b === 0x00) bytes.push(0x01, b + 1) // // escape high bytes with 0xfe and by subtracting 1 // else if (options !== SKIP_HIGH_BYTES && (b === 0xfe || b === 0xff)) bytes.push(0xfe, b - 1) // // no escapement needed // else bytes.push(b) } return new Buffer(bytes) } util.unescapeFlat = function (buffer, options) { var b, bytes = [] // // don't escape last byte // for (var i = 0, end = buffer.length; i < end; ++i) { b = buffer[i] // // if low-byte escape tag use the following byte minus 1 // if (b === 0x01) bytes.push(buffer[++i] - 1) // // if high-byte escape tag use the following byte plus 1 // else if (options !== SKIP_HIGH_BYTES && b === 0xfe) bytes.push(buffer[++i] + 1) // // no unescapement needed // else bytes.push(b) } return new Buffer(bytes) } util.escapeFlatLow = function (buffer) { return util.escapeFlat(buffer, SKIP_HIGH_BYTES) } util.unescapeFlatLow = function (buffer) { return util.unescapeFlat(buffer, SKIP_HIGH_BYTES) } util.encodeList = function (source, base) { // TODO: cycle detection var buffers = [] var undecodable for (var i = 0, end = source.length; i < end; ++i) { var buffer = base.encode(source[i], null) // // bypass assertions for undecodable types (i.e. range bounds) // undecodable || (undecodable = buffer.undecodable) if (undecodable) { buffers.push(buffer) continue } var sort = base.getType(buffer[0]) assert(sort, 'List encoding failure: ' + buffer) // // escape sorts if it requires it and add closing byte for element // if (sort.codec && sort.codec.escape) buffers.push(sort.codec.escape(buffer), new Buffer([ 0x00 ])) else buffers.push(buffer) } // // close the list with an end byte // buffers.push(new Buffer([ 0x00 ])) buffer = Buffer.concat(buffers) // // propagate undecoable bit if set // undecodable && (buffer.undecodable = undecodable) return buffer } util.decodeList = function (buffer, base) { var result = util.parse(buffer, base) assert(result[1] === buffer.length, 'Invalid encoding') return result[0] } util.encodeHash = function (source, base) { // // packs hash into an array, e.g. `[ k1, v1, k2, v2, ... ]` // var list = [] Object.keys(source).forEach(function(key) { list.push(key) list.push(source[key]) }) return util.encodeList(list, base) } util.decodeHash = function (buffer, base) { var list = util.decodeList(buffer, base) var hash = Object.create(null) for (var i = 0, end = list.length; i < end; ++i) { hash[list[i]] = list[++i] } return hash } // // base parser for nested/recursive sorts // util.parse = function (buffer, base, sort) { // // parses and returns the first sort on the buffer and total bytes consumed // var codec = sort && sort.codec var index, end // // nullary // if (sort && !codec) return [ base.decode(new Buffer([ sort.byte ]), null), 0 ] // // custom parse implementation provided by sort // if (codec && codec.parse) return codec.parse(buffer, base, sort) // // fixed length sort, decode fixed bytes // var length = codec && codec.length if (typeof length === 'number') return [ codec.decode(buffer.slice(0, length)), length ] // // escaped sort, seek to end byte and unescape // if (codec && codec.unescape) { for (index = 0, end = buffer.length; index < end; ++index) { if (buffer[index] === 0x00) break } assert(index < buffer.length, 'No closing byte found for sequence') var unescaped = codec.unescape(buffer.slice(0, index)) // // add 1 to index to account for closing tag byte // return [ codec.decode(unescaped), index + 1 ] } // // recursive sort, resolve each item iteratively // index = 0 var list = [] var next while ((next = buffer[index]) !== 0x00) { sort = base.getType(next) var result = util.parse(buffer.slice(index + 1), base, sort) list.push(result[0]) // // offset current index by bytes consumed (plus a byte for the sort tag) // index += result[1] + 1 assert(index < buffer.length, 'No closing byte found for nested sequence') } // // return parsed list and bytes consumed (plus a byte for the closing tag) // return [ list, index + 1 ] } // // helpers for encoding boundary types // function encodeBound(data, base) { var prefix = data.prefix var buffer = prefix ? base.encode(prefix, null) : new Buffer([ data.byte ]) if (data.upper) buffer = Buffer.concat([ buffer, new Buffer([ 0xff ]) ]) return util.encodedBound(data, buffer) } util.encodeBound = function (data, base) { return util.encodedBound(data, encodeBound(data, base)) } util.encodeBaseBound = function (data, base) { return util.encodedBound(data, new Buffer([ data.upper ? 0xff : 0x00 ])) } util.encodeListBound = function (data, base) { var buffer = encodeBound(data, base) if (data.prefix) { // // trim off end byte if a prefix, and do some hackery if an upper bound // var endByte = buffer[buffer.length - 1] buffer = buffer.slice(0, -1) if (data.upper) buffer[buffer.length - 1] = endByte } return util.encodedBound(data, buffer) } // // add some metadata to generated buffer instance // util.encodedBound = function (data, buffer) { buffer.undecodable = true return buffer } }).call(this,require("buffer").Buffer) },{"buffer":61,"typewise-core/collation":624}],69:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer. All rights reserved. * @module ccount * @fileoverview Count characters. */ 'use strict'; /** * Count how many characters `character` occur in `value`. * * @example * ccount('foo(bar(baz)', '(') // 2 * ccount('foo(bar(baz)', ')') // 1 * * @param {string} value - Content, coerced to string. * @param {string} character - Single character to look * for. * @return {number} - Count. * @throws {Error} - when `character` is not a single * character. */ function ccount(value, character) { var index = -1; var count = 0; var length; value = String(value); length = value.length; if (typeof character !== 'string' || character.length !== 1) { throw new Error('Expected character'); } while (++index < length) { if (value.charAt(index) === character) { count++; } } return count; } /* * Expose. */ module.exports = ccount; },{}],70:[function(require,module,exports){ module.exports={ "nbsp": " ", "iexcl": "¡", "cent": "¢", "pound": "£", "curren": "¤", "yen": "¥", "brvbar": "¦", "sect": "§", "uml": "¨", "copy": "©", "ordf": "ª", "laquo": "«", "not": "¬", "shy": "­", "reg": "®", "macr": "¯", "deg": "°", "plusmn": "±", "sup2": "²", "sup3": "³", "acute": "´", "micro": "µ", "para": "¶", "middot": "·", "cedil": "¸", "sup1": "¹", "ordm": "º", "raquo": "»", "frac14": "¼", "frac12": "½", "frac34": "¾", "iquest": "¿", "Agrave": "À", "Aacute": "Á", "Acirc": "Â", "Atilde": "Ã", "Auml": "Ä", "Aring": "Å", "AElig": "Æ", "Ccedil": "Ç", "Egrave": "È", "Eacute": "É", "Ecirc": "Ê", "Euml": "Ë", "Igrave": "Ì", "Iacute": "Í", "Icirc": "Î", "Iuml": "Ï", "ETH": "Ð", "Ntilde": "Ñ", "Ograve": "Ò", "Oacute": "Ó", "Ocirc": "Ô", "Otilde": "Õ", "Ouml": "Ö", "times": "×", "Oslash": "Ø", "Ugrave": "Ù", "Uacute": "Ú", "Ucirc": "Û", "Uuml": "Ü", "Yacute": "Ý", "THORN": "Þ", "szlig": "ß", "agrave": "à", "aacute": "á", "acirc": "â", "atilde": "ã", "auml": "ä", "aring": "å", "aelig": "æ", "ccedil": "ç", "egrave": "è", "eacute": "é", "ecirc": "ê", "euml": "ë", "igrave": "ì", "iacute": "í", "icirc": "î", "iuml": "ï", "eth": "ð", "ntilde": "ñ", "ograve": "ò", "oacute": "ó", "ocirc": "ô", "otilde": "õ", "ouml": "ö", "divide": "÷", "oslash": "ø", "ugrave": "ù", "uacute": "ú", "ucirc": "û", "uuml": "ü", "yacute": "ý", "thorn": "þ", "yuml": "ÿ", "fnof": "ƒ", "Alpha": "Α", "Beta": "Β", "Gamma": "Γ", "Delta": "Δ", "Epsilon": "Ε", "Zeta": "Ζ", "Eta": "Η", "Theta": "Θ", "Iota": "Ι", "Kappa": "Κ", "Lambda": "Λ", "Mu": "Μ", "Nu": "Ν", "Xi": "Ξ", "Omicron": "Ο", "Pi": "Π", "Rho": "Ρ", "Sigma": "Σ", "Tau": "Τ", "Upsilon": "Υ", "Phi": "Φ", "Chi": "Χ", "Psi": "Ψ", "Omega": "Ω", "alpha": "α", "beta": "β", "gamma": "γ", "delta": "δ", "epsilon": "ε", "zeta": "ζ", "eta": "η", "theta": "θ", "iota": "ι", "kappa": "κ", "lambda": "λ", "mu": "μ", "nu": "ν", "xi": "ξ", "omicron": "ο", "pi": "π", "rho": "ρ", "sigmaf": "ς", "sigma": "σ", "tau": "τ", "upsilon": "υ", "phi": "φ", "chi": "χ", "psi": "ψ", "omega": "ω", "thetasym": "ϑ", "upsih": "ϒ", "piv": "ϖ", "bull": "•", "hellip": "…", "prime": "′", "Prime": "″", "oline": "‾", "frasl": "⁄", "weierp": "℘", "image": "ℑ", "real": "ℜ", "trade": "™", "alefsym": "ℵ", "larr": "←", "uarr": "↑", "rarr": "→", "darr": "↓", "harr": "↔", "crarr": "↵", "lArr": "⇐", "uArr": "⇑", "rArr": "⇒", "dArr": "⇓", "hArr": "⇔", "forall": "∀", "part": "∂", "exist": "∃", "empty": "∅", "nabla": "∇", "isin": "∈", "notin": "∉", "ni": "∋", "prod": "∏", "sum": "∑", "minus": "−", "lowast": "∗", "radic": "√", "prop": "∝", "infin": "∞", "ang": "∠", "and": "∧", "or": "∨", "cap": "∩", "cup": "∪", "int": "∫", "there4": "∴", "sim": "∼", "cong": "≅", "asymp": "≈", "ne": "≠", "equiv": "≡", "le": "≤", "ge": "≥", "sub": "⊂", "sup": "⊃", "nsub": "⊄", "sube": "⊆", "supe": "⊇", "oplus": "⊕", "otimes": "⊗", "perp": "⊥", "sdot": "⋅", "lceil": "⌈", "rceil": "⌉", "lfloor": "⌊", "rfloor": "⌋", "lang": "〈", "rang": "〉", "loz": "◊", "spades": "♠", "clubs": "♣", "hearts": "♥", "diams": "♦", "quot": "\"", "amp": "&", "lt": "<", "gt": ">", "OElig": "Œ", "oelig": "œ", "Scaron": "Š", "scaron": "š", "Yuml": "Ÿ", "circ": "ˆ", "tilde": "˜", "ensp": " ", "emsp": " ", "thinsp": " ", "zwnj": "‌", "zwj": "‍", "lrm": "‎", "rlm": "‏", "ndash": "–", "mdash": "—", "lsquo": "‘", "rsquo": "’", "sbquo": "‚", "ldquo": "“", "rdquo": "”", "bdquo": "„", "dagger": "†", "Dagger": "‡", "permil": "‰", "lsaquo": "‹", "rsaquo": "›", "euro": "€" } },{}],71:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module character-entities-html4 * @fileoverview HTML4 character entity information. */ 'use strict'; /* eslint-env commonjs */ /* * Expose. */ module.exports = require('./index.json'); },{"./index.json":70}],72:[function(require,module,exports){ module.exports={ "AElig": "Æ", "AMP": "&", "Aacute": "Á", "Acirc": "Â", "Agrave": "À", "Aring": "Å", "Atilde": "Ã", "Auml": "Ä", "COPY": "©", "Ccedil": "Ç", "ETH": "Ð", "Eacute": "É", "Ecirc": "Ê", "Egrave": "È", "Euml": "Ë", "GT": ">", "Iacute": "Í", "Icirc": "Î", "Igrave": "Ì", "Iuml": "Ï", "LT": "<", "Ntilde": "Ñ", "Oacute": "Ó", "Ocirc": "Ô", "Ograve": "Ò", "Oslash": "Ø", "Otilde": "Õ", "Ouml": "Ö", "QUOT": "\"", "REG": "®", "THORN": "Þ", "Uacute": "Ú", "Ucirc": "Û", "Ugrave": "Ù", "Uuml": "Ü", "Yacute": "Ý", "aacute": "á", "acirc": "â", "acute": "´", "aelig": "æ", "agrave": "à", "amp": "&", "aring": "å", "atilde": "ã", "auml": "ä", "brvbar": "¦", "ccedil": "ç", "cedil": "¸", "cent": "¢", "copy": "©", "curren": "¤", "deg": "°", "divide": "÷", "eacute": "é", "ecirc": "ê", "egrave": "è", "eth": "ð", "euml": "ë", "frac12": "½", "frac14": "¼", "frac34": "¾", "gt": ">", "iacute": "í", "icirc": "î", "iexcl": "¡", "igrave": "ì", "iquest": "¿", "iuml": "ï", "laquo": "«", "lt": "<", "macr": "¯", "micro": "µ", "middot": "·", "nbsp": " ", "not": "¬", "ntilde": "ñ", "oacute": "ó", "ocirc": "ô", "ograve": "ò", "ordf": "ª", "ordm": "º", "oslash": "ø", "otilde": "õ", "ouml": "ö", "para": "¶", "plusmn": "±", "pound": "£", "quot": "\"", "raquo": "»", "reg": "®", "sect": "§", "shy": "­", "sup1": "¹", "sup2": "²", "sup3": "³", "szlig": "ß", "thorn": "þ", "times": "×", "uacute": "ú", "ucirc": "û", "ugrave": "ù", "uml": "¨", "uuml": "ü", "yacute": "ý", "yen": "¥", "yuml": "ÿ" } },{}],73:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module character-entities-legacy * @fileoverview HTML legacy character entity information. */ 'use strict'; /* eslint-env commonjs */ /* * Expose. */ module.exports = require('./index.json'); },{"./index.json":72}],74:[function(require,module,exports){ module.exports={ "AElig": "Æ", "AMP": "&", "Aacute": "Á", "Abreve": "Ă", "Acirc": "Â", "Acy": "А", "Afr": "𝔄", "Agrave": "À", "Alpha": "Α", "Amacr": "Ā", "And": "⩓", "Aogon": "Ą", "Aopf": "𝔸", "ApplyFunction": "⁡", "Aring": "Å", "Ascr": "𝒜", "Assign": "≔", "Atilde": "Ã", "Auml": "Ä", "Backslash": "∖", "Barv": "⫧", "Barwed": "⌆", "Bcy": "Б", "Because": "∵", "Bernoullis": "ℬ", "Beta": "Β", "Bfr": "𝔅", "Bopf": "𝔹", "Breve": "˘", "Bscr": "ℬ", "Bumpeq": "≎", "CHcy": "Ч", "COPY": "©", "Cacute": "Ć", "Cap": "⋒", "CapitalDifferentialD": "ⅅ", "Cayleys": "ℭ", "Ccaron": "Č", "Ccedil": "Ç", "Ccirc": "Ĉ", "Cconint": "∰", "Cdot": "Ċ", "Cedilla": "¸", "CenterDot": "·", "Cfr": "ℭ", "Chi": "Χ", "CircleDot": "⊙", "CircleMinus": "⊖", "CirclePlus": "⊕", "CircleTimes": "⊗", "ClockwiseContourIntegral": "∲", "CloseCurlyDoubleQuote": "”", "CloseCurlyQuote": "’", "Colon": "∷", "Colone": "⩴", "Congruent": "≡", "Conint": "∯", "ContourIntegral": "∮", "Copf": "ℂ", "Coproduct": "∐", "CounterClockwiseContourIntegral": "∳", "Cross": "⨯", "Cscr": "𝒞", "Cup": "⋓", "CupCap": "≍", "DD": "ⅅ", "DDotrahd": "⤑", "DJcy": "Ђ", "DScy": "Ѕ", "DZcy": "Џ", "Dagger": "‡", "Darr": "↡", "Dashv": "⫤", "Dcaron": "Ď", "Dcy": "Д", "Del": "∇", "Delta": "Δ", "Dfr": "𝔇", "DiacriticalAcute": "´", "DiacriticalDot": "˙", "DiacriticalDoubleAcute": "˝", "DiacriticalGrave": "`", "DiacriticalTilde": "˜", "Diamond": "⋄", "DifferentialD": "ⅆ", "Dopf": "𝔻", "Dot": "¨", "DotDot": "⃜", "DotEqual": "≐", "DoubleContourIntegral": "∯", "DoubleDot": "¨", "DoubleDownArrow": "⇓", "DoubleLeftArrow": "⇐", "DoubleLeftRightArrow": "⇔", "DoubleLeftTee": "⫤", "DoubleLongLeftArrow": "⟸", "DoubleLongLeftRightArrow": "⟺", "DoubleLongRightArrow": "⟹", "DoubleRightArrow": "⇒", "DoubleRightTee": "⊨", "DoubleUpArrow": "⇑", "DoubleUpDownArrow": "⇕", "DoubleVerticalBar": "∥", "DownArrow": "↓", "DownArrowBar": "⤓", "DownArrowUpArrow": "⇵", "DownBreve": "̑", "DownLeftRightVector": "⥐", "DownLeftTeeVector": "⥞", "DownLeftVector": "↽", "DownLeftVectorBar": "⥖", "DownRightTeeVector": "⥟", "DownRightVector": "⇁", "DownRightVectorBar": "⥗", "DownTee": "⊤", "DownTeeArrow": "↧", "Downarrow": "⇓", "Dscr": "𝒟", "Dstrok": "Đ", "ENG": "Ŋ", "ETH": "Ð", "Eacute": "É", "Ecaron": "Ě", "Ecirc": "Ê", "Ecy": "Э", "Edot": "Ė", "Efr": "𝔈", "Egrave": "È", "Element": "∈", "Emacr": "Ē", "EmptySmallSquare": "◻", "EmptyVerySmallSquare": "▫", "Eogon": "Ę", "Eopf": "𝔼", "Epsilon": "Ε", "Equal": "⩵", "EqualTilde": "≂", "Equilibrium": "⇌", "Escr": "ℰ", "Esim": "⩳", "Eta": "Η", "Euml": "Ë", "Exists": "∃", "ExponentialE": "ⅇ", "Fcy": "Ф", "Ffr": "𝔉", "FilledSmallSquare": "◼", "FilledVerySmallSquare": "▪", "Fopf": "𝔽", "ForAll": "∀", "Fouriertrf": "ℱ", "Fscr": "ℱ", "GJcy": "Ѓ", "GT": ">", "Gamma": "Γ", "Gammad": "Ϝ", "Gbreve": "Ğ", "Gcedil": "Ģ", "Gcirc": "Ĝ", "Gcy": "Г", "Gdot": "Ġ", "Gfr": "𝔊", "Gg": "⋙", "Gopf": "𝔾", "GreaterEqual": "≥", "GreaterEqualLess": "⋛", "GreaterFullEqual": "≧", "GreaterGreater": "⪢", "GreaterLess": "≷", "GreaterSlantEqual": "⩾", "GreaterTilde": "≳", "Gscr": "𝒢", "Gt": "≫", "HARDcy": "Ъ", "Hacek": "ˇ", "Hat": "^", "Hcirc": "Ĥ", "Hfr": "ℌ", "HilbertSpace": "ℋ", "Hopf": "ℍ", "HorizontalLine": "─", "Hscr": "ℋ", "Hstrok": "Ħ", "HumpDownHump": "≎", "HumpEqual": "≏", "IEcy": "Е", "IJlig": "IJ", "IOcy": "Ё", "Iacute": "Í", "Icirc": "Î", "Icy": "И", "Idot": "İ", "Ifr": "ℑ", "Igrave": "Ì", "Im": "ℑ", "Imacr": "Ī", "ImaginaryI": "ⅈ", "Implies": "⇒", "Int": "∬", "Integral": "∫", "Intersection": "⋂", "InvisibleComma": "⁣", "InvisibleTimes": "⁢", "Iogon": "Į", "Iopf": "𝕀", "Iota": "Ι", "Iscr": "ℐ", "Itilde": "Ĩ", "Iukcy": "І", "Iuml": "Ï", "Jcirc": "Ĵ", "Jcy": "Й", "Jfr": "𝔍", "Jopf": "𝕁", "Jscr": "𝒥", "Jsercy": "Ј", "Jukcy": "Є", "KHcy": "Х", "KJcy": "Ќ", "Kappa": "Κ", "Kcedil": "Ķ", "Kcy": "К", "Kfr": "𝔎", "Kopf": "𝕂", "Kscr": "𝒦", "LJcy": "Љ", "LT": "<", "Lacute": "Ĺ", "Lambda": "Λ", "Lang": "⟪", "Laplacetrf": "ℒ", "Larr": "↞", "Lcaron": "Ľ", "Lcedil": "Ļ", "Lcy": "Л", "LeftAngleBracket": "⟨", "LeftArrow": "←", "LeftArrowBar": "⇤", "LeftArrowRightArrow": "⇆", "LeftCeiling": "⌈", "LeftDoubleBracket": "⟦", "LeftDownTeeVector": "⥡", "LeftDownVector": "⇃", "LeftDownVectorBar": "⥙", "LeftFloor": "⌊", "LeftRightArrow": "↔", "LeftRightVector": "⥎", "LeftTee": "⊣", "LeftTeeArrow": "↤", "LeftTeeVector": "⥚", "LeftTriangle": "⊲", "LeftTriangleBar": "⧏", "LeftTriangleEqual": "⊴", "LeftUpDownVector": "⥑", "LeftUpTeeVector": "⥠", "LeftUpVector": "↿", "LeftUpVectorBar": "⥘", "LeftVector": "↼", "LeftVectorBar": "⥒", "Leftarrow": "⇐", "Leftrightarrow": "⇔", "LessEqualGreater": "⋚", "LessFullEqual": "≦", "LessGreater": "≶", "LessLess": "⪡", "LessSlantEqual": "⩽", "LessTilde": "≲", "Lfr": "𝔏", "Ll": "⋘", "Lleftarrow": "⇚", "Lmidot": "Ŀ", "LongLeftArrow": "⟵", "LongLeftRightArrow": "⟷", "LongRightArrow": "⟶", "Longleftarrow": "⟸", "Longleftrightarrow": "⟺", "Longrightarrow": "⟹", "Lopf": "𝕃", "LowerLeftArrow": "↙", "LowerRightArrow": "↘", "Lscr": "ℒ", "Lsh": "↰", "Lstrok": "Ł", "Lt": "≪", "Map": "⤅", "Mcy": "М", "MediumSpace": " ", "Mellintrf": "ℳ", "Mfr": "𝔐", "MinusPlus": "∓", "Mopf": "𝕄", "Mscr": "ℳ", "Mu": "Μ", "NJcy": "Њ", "Nacute": "Ń", "Ncaron": "Ň", "Ncedil": "Ņ", "Ncy": "Н", "NegativeMediumSpace": "​", "NegativeThickSpace": "​", "NegativeThinSpace": "​", "NegativeVeryThinSpace": "​", "NestedGreaterGreater": "≫", "NestedLessLess": "≪", "NewLine": "\n", "Nfr": "𝔑", "NoBreak": "⁠", "NonBreakingSpace": " ", "Nopf": "ℕ", "Not": "⫬", "NotCongruent": "≢", "NotCupCap": "≭", "NotDoubleVerticalBar": "∦", "NotElement": "∉", "NotEqual": "≠", "NotEqualTilde": "≂̸", "NotExists": "∄", "NotGreater": "≯", "NotGreaterEqual": "≱", "NotGreaterFullEqual": "≧̸", "NotGreaterGreater": "≫̸", "NotGreaterLess": "≹", "NotGreaterSlantEqual": "⩾̸", "NotGreaterTilde": "≵", "NotHumpDownHump": "≎̸", "NotHumpEqual": "≏̸", "NotLeftTriangle": "⋪", "NotLeftTriangleBar": "⧏̸", "NotLeftTriangleEqual": "⋬", "NotLess": "≮", "NotLessEqual": "≰", "NotLessGreater": "≸", "NotLessLess": "≪̸", "NotLessSlantEqual": "⩽̸", "NotLessTilde": "≴", "NotNestedGreaterGreater": "⪢̸", "NotNestedLessLess": "⪡̸", "NotPrecedes": "⊀", "NotPrecedesEqual": "⪯̸", "NotPrecedesSlantEqual": "⋠", "NotReverseElement": "∌", "NotRightTriangle": "⋫", "NotRightTriangleBar": "⧐̸", "NotRightTriangleEqual": "⋭", "NotSquareSubset": "⊏̸", "NotSquareSubsetEqual": "⋢", "NotSquareSuperset": "⊐̸", "NotSquareSupersetEqual": "⋣", "NotSubset": "⊂⃒", "NotSubsetEqual": "⊈", "NotSucceeds": "⊁", "NotSucceedsEqual": "⪰̸", "NotSucceedsSlantEqual": "⋡", "NotSucceedsTilde": "≿̸", "NotSuperset": "⊃⃒", "NotSupersetEqual": "⊉", "NotTilde": "≁", "NotTildeEqual": "≄", "NotTildeFullEqual": "≇", "NotTildeTilde": "≉", "NotVerticalBar": "∤", "Nscr": "𝒩", "Ntilde": "Ñ", "Nu": "Ν", "OElig": "Œ", "Oacute": "Ó", "Ocirc": "Ô", "Ocy": "О", "Odblac": "Ő", "Ofr": "𝔒", "Ograve": "Ò", "Omacr": "Ō", "Omega": "Ω", "Omicron": "Ο", "Oopf": "𝕆", "OpenCurlyDoubleQuote": "“", "OpenCurlyQuote": "‘", "Or": "⩔", "Oscr": "𝒪", "Oslash": "Ø", "Otilde": "Õ", "Otimes": "⨷", "Ouml": "Ö", "OverBar": "‾", "OverBrace": "⏞", "OverBracket": "⎴", "OverParenthesis": "⏜", "PartialD": "∂", "Pcy": "П", "Pfr": "𝔓", "Phi": "Φ", "Pi": "Π", "PlusMinus": "±", "Poincareplane": "ℌ", "Popf": "ℙ", "Pr": "⪻", "Precedes": "≺", "PrecedesEqual": "⪯", "PrecedesSlantEqual": "≼", "PrecedesTilde": "≾", "Prime": "″", "Product": "∏", "Proportion": "∷", "Proportional": "∝", "Pscr": "𝒫", "Psi": "Ψ", "QUOT": "\"", "Qfr": "𝔔", "Qopf": "ℚ", "Qscr": "𝒬", "RBarr": "⤐", "REG": "®", "Racute": "Ŕ", "Rang": "⟫", "Rarr": "↠", "Rarrtl": "⤖", "Rcaron": "Ř", "Rcedil": "Ŗ", "Rcy": "Р", "Re": "ℜ", "ReverseElement": "∋", "ReverseEquilibrium": "⇋", "ReverseUpEquilibrium": "⥯", "Rfr": "ℜ", "Rho": "Ρ", "RightAngleBracket": "⟩", "RightArrow": "→", "RightArrowBar": "⇥", "RightArrowLeftArrow": "⇄", "RightCeiling": "⌉", "RightDoubleBracket": "⟧", "RightDownTeeVector": "⥝", "RightDownVector": "⇂", "RightDownVectorBar": "⥕", "RightFloor": "⌋", "RightTee": "⊢", "RightTeeArrow": "↦", "RightTeeVector": "⥛", "RightTriangle": "⊳", "RightTriangleBar": "⧐", "RightTriangleEqual": "⊵", "RightUpDownVector": "⥏", "RightUpTeeVector": "⥜", "RightUpVector": "↾", "RightUpVectorBar": "⥔", "RightVector": "⇀", "RightVectorBar": "⥓", "Rightarrow": "⇒", "Ropf": "ℝ", "RoundImplies": "⥰", "Rrightarrow": "⇛", "Rscr": "ℛ", "Rsh": "↱", "RuleDelayed": "⧴", "SHCHcy": "Щ", "SHcy": "Ш", "SOFTcy": "Ь", "Sacute": "Ś", "Sc": "⪼", "Scaron": "Š", "Scedil": "Ş", "Scirc": "Ŝ", "Scy": "С", "Sfr": "𝔖", "ShortDownArrow": "↓", "ShortLeftArrow": "←", "ShortRightArrow": "→", "ShortUpArrow": "↑", "Sigma": "Σ", "SmallCircle": "∘", "Sopf": "𝕊", "Sqrt": "√", "Square": "□", "SquareIntersection": "⊓", "SquareSubset": "⊏", "SquareSubsetEqual": "⊑", "SquareSuperset": "⊐", "SquareSupersetEqual": "⊒", "SquareUnion": "⊔", "Sscr": "𝒮", "Star": "⋆", "Sub": "⋐", "Subset": "⋐", "SubsetEqual": "⊆", "Succeeds": "≻", "SucceedsEqual": "⪰", "SucceedsSlantEqual": "≽", "SucceedsTilde": "≿", "SuchThat": "∋", "Sum": "∑", "Sup": "⋑", "Superset": "⊃", "SupersetEqual": "⊇", "Supset": "⋑", "THORN": "Þ", "TRADE": "™", "TSHcy": "Ћ", "TScy": "Ц", "Tab": "\t", "Tau": "Τ", "Tcaron": "Ť", "Tcedil": "Ţ", "Tcy": "Т", "Tfr": "𝔗", "Therefore": "∴", "Theta": "Θ", "ThickSpace": "  ", "ThinSpace": " ", "Tilde": "∼", "TildeEqual": "≃", "TildeFullEqual": "≅", "TildeTilde": "≈", "Topf": "𝕋", "TripleDot": "⃛", "Tscr": "𝒯", "Tstrok": "Ŧ", "Uacute": "Ú", "Uarr": "↟", "Uarrocir": "⥉", "Ubrcy": "Ў", "Ubreve": "Ŭ", "Ucirc": "Û", "Ucy": "У", "Udblac": "Ű", "Ufr": "𝔘", "Ugrave": "Ù", "Umacr": "Ū", "UnderBar": "_", "UnderBrace": "⏟", "UnderBracket": "⎵", "UnderParenthesis": "⏝", "Union": "⋃", "UnionPlus": "⊎", "Uogon": "Ų", "Uopf": "𝕌", "UpArrow": "↑", "UpArrowBar": "⤒", "UpArrowDownArrow": "⇅", "UpDownArrow": "↕", "UpEquilibrium": "⥮", "UpTee": "⊥", "UpTeeArrow": "↥", "Uparrow": "⇑", "Updownarrow": "⇕", "UpperLeftArrow": "↖", "UpperRightArrow": "↗", "Upsi": "ϒ", "Upsilon": "Υ", "Uring": "Ů", "Uscr": "𝒰", "Utilde": "Ũ", "Uuml": "Ü", "VDash": "⊫", "Vbar": "⫫", "Vcy": "В", "Vdash": "⊩", "Vdashl": "⫦", "Vee": "⋁", "Verbar": "‖", "Vert": "‖", "VerticalBar": "∣", "VerticalLine": "|", "VerticalSeparator": "❘", "VerticalTilde": "≀", "VeryThinSpace": " ", "Vfr": "𝔙", "Vopf": "𝕍", "Vscr": "𝒱", "Vvdash": "⊪", "Wcirc": "Ŵ", "Wedge": "⋀", "Wfr": "𝔚", "Wopf": "𝕎", "Wscr": "𝒲", "Xfr": "𝔛", "Xi": "Ξ", "Xopf": "𝕏", "Xscr": "𝒳", "YAcy": "Я", "YIcy": "Ї", "YUcy": "Ю", "Yacute": "Ý", "Ycirc": "Ŷ", "Ycy": "Ы", "Yfr": "𝔜", "Yopf": "𝕐", "Yscr": "𝒴", "Yuml": "Ÿ", "ZHcy": "Ж", "Zacute": "Ź", "Zcaron": "Ž", "Zcy": "З", "Zdot": "Ż", "ZeroWidthSpace": "​", "Zeta": "Ζ", "Zfr": "ℨ", "Zopf": "ℤ", "Zscr": "𝒵", "aacute": "á", "abreve": "ă", "ac": "∾", "acE": "∾̳", "acd": "∿", "acirc": "â", "acute": "´", "acy": "а", "aelig": "æ", "af": "⁡", "afr": "𝔞", "agrave": "à", "alefsym": "ℵ", "aleph": "ℵ", "alpha": "α", "amacr": "ā", "amalg": "⨿", "amp": "&", "and": "∧", "andand": "⩕", "andd": "⩜", "andslope": "⩘", "andv": "⩚", "ang": "∠", "ange": "⦤", "angle": "∠", "angmsd": "∡", "angmsdaa": "⦨", "angmsdab": "⦩", "angmsdac": "⦪", "angmsdad": "⦫", "angmsdae": "⦬", "angmsdaf": "⦭", "angmsdag": "⦮", "angmsdah": "⦯", "angrt": "∟", "angrtvb": "⊾", "angrtvbd": "⦝", "angsph": "∢", "angst": "Å", "angzarr": "⍼", "aogon": "ą", "aopf": "𝕒", "ap": "≈", "apE": "⩰", "apacir": "⩯", "ape": "≊", "apid": "≋", "apos": "'", "approx": "≈", "approxeq": "≊", "aring": "å", "ascr": "𝒶", "ast": "*", "asymp": "≈", "asympeq": "≍", "atilde": "ã", "auml": "ä", "awconint": "∳", "awint": "⨑", "bNot": "⫭", "backcong": "≌", "backepsilon": "϶", "backprime": "‵", "backsim": "∽", "backsimeq": "⋍", "barvee": "⊽", "barwed": "⌅", "barwedge": "⌅", "bbrk": "⎵", "bbrktbrk": "⎶", "bcong": "≌", "bcy": "б", "bdquo": "„", "becaus": "∵", "because": "∵", "bemptyv": "⦰", "bepsi": "϶", "bernou": "ℬ", "beta": "β", "beth": "ℶ", "between": "≬", "bfr": "𝔟", "bigcap": "⋂", "bigcirc": "◯", "bigcup": "⋃", "bigodot": "⨀", "bigoplus": "⨁", "bigotimes": "⨂", "bigsqcup": "⨆", "bigstar": "★", "bigtriangledown": "▽", "bigtriangleup": "△", "biguplus": "⨄", "bigvee": "⋁", "bigwedge": "⋀", "bkarow": "⤍", "blacklozenge": "⧫", "blacksquare": "▪", "blacktriangle": "▴", "blacktriangledown": "▾", "blacktriangleleft": "◂", "blacktriangleright": "▸", "blank": "␣", "blk12": "▒", "blk14": "░", "blk34": "▓", "block": "█", "bne": "=⃥", "bnequiv": "≡⃥", "bnot": "⌐", "bopf": "𝕓", "bot": "⊥", "bottom": "⊥", "bowtie": "⋈", "boxDL": "╗", "boxDR": "╔", "boxDl": "╖", "boxDr": "╓", "boxH": "═", "boxHD": "╦", "boxHU": "╩", "boxHd": "╤", "boxHu": "╧", "boxUL": "╝", "boxUR": "╚", "boxUl": "╜", "boxUr": "╙", "boxV": "║", "boxVH": "╬", "boxVL": "╣", "boxVR": "╠", "boxVh": "╫", "boxVl": "╢", "boxVr": "╟", "boxbox": "⧉", "boxdL": "╕", "boxdR": "╒", "boxdl": "┐", "boxdr": "┌", "boxh": "─", "boxhD": "╥", "boxhU": "╨", "boxhd": "┬", "boxhu": "┴", "boxminus": "⊟", "boxplus": "⊞", "boxtimes": "⊠", "boxuL": "╛", "boxuR": "╘", "boxul": "┘", "boxur": "└", "boxv": "│", "boxvH": "╪", "boxvL": "╡", "boxvR": "╞", "boxvh": "┼", "boxvl": "┤", "boxvr": "├", "bprime": "‵", "breve": "˘", "brvbar": "¦", "bscr": "𝒷", "bsemi": "⁏", "bsim": "∽", "bsime": "⋍", "bsol": "\\", "bsolb": "⧅", "bsolhsub": "⟈", "bull": "•", "bullet": "•", "bump": "≎", "bumpE": "⪮", "bumpe": "≏", "bumpeq": "≏", "cacute": "ć", "cap": "∩", "capand": "⩄", "capbrcup": "⩉", "capcap": "⩋", "capcup": "⩇", "capdot": "⩀", "caps": "∩︀", "caret": "⁁", "caron": "ˇ", "ccaps": "⩍", "ccaron": "č", "ccedil": "ç", "ccirc": "ĉ", "ccups": "⩌", "ccupssm": "⩐", "cdot": "ċ", "cedil": "¸", "cemptyv": "⦲", "cent": "¢", "centerdot": "·", "cfr": "𝔠", "chcy": "ч", "check": "✓", "checkmark": "✓", "chi": "χ", "cir": "○", "cirE": "⧃", "circ": "ˆ", "circeq": "≗", "circlearrowleft": "↺", "circlearrowright": "↻", "circledR": "®", "circledS": "Ⓢ", "circledast": "⊛", "circledcirc": "⊚", "circleddash": "⊝", "cire": "≗", "cirfnint": "⨐", "cirmid": "⫯", "cirscir": "⧂", "clubs": "♣", "clubsuit": "♣", "colon": ":", "colone": "≔", "coloneq": "≔", "comma": ",", "commat": "@", "comp": "∁", "compfn": "∘", "complement": "∁", "complexes": "ℂ", "cong": "≅", "congdot": "⩭", "conint": "∮", "copf": "𝕔", "coprod": "∐", "copy": "©", "copysr": "℗", "crarr": "↵", "cross": "✗", "cscr": "𝒸", "csub": "⫏", "csube": "⫑", "csup": "⫐", "csupe": "⫒", "ctdot": "⋯", "cudarrl": "⤸", "cudarrr": "⤵", "cuepr": "⋞", "cuesc": "⋟", "cularr": "↶", "cularrp": "⤽", "cup": "∪", "cupbrcap": "⩈", "cupcap": "⩆", "cupcup": "⩊", "cupdot": "⊍", "cupor": "⩅", "cups": "∪︀", "curarr": "↷", "curarrm": "⤼", "curlyeqprec": "⋞", "curlyeqsucc": "⋟", "curlyvee": "⋎", "curlywedge": "⋏", "curren": "¤", "curvearrowleft": "↶", "curvearrowright": "↷", "cuvee": "⋎", "cuwed": "⋏", "cwconint": "∲", "cwint": "∱", "cylcty": "⌭", "dArr": "⇓", "dHar": "⥥", "dagger": "†", "daleth": "ℸ", "darr": "↓", "dash": "‐", "dashv": "⊣", "dbkarow": "⤏", "dblac": "˝", "dcaron": "ď", "dcy": "д", "dd": "ⅆ", "ddagger": "‡", "ddarr": "⇊", "ddotseq": "⩷", "deg": "°", "delta": "δ", "demptyv": "⦱", "dfisht": "⥿", "dfr": "𝔡", "dharl": "⇃", "dharr": "⇂", "diam": "⋄", "diamond": "⋄", "diamondsuit": "♦", "diams": "♦", "die": "¨", "digamma": "ϝ", "disin": "⋲", "div": "÷", "divide": "÷", "divideontimes": "⋇", "divonx": "⋇", "djcy": "ђ", "dlcorn": "⌞", "dlcrop": "⌍", "dollar": "$", "dopf": "𝕕", "dot": "˙", "doteq": "≐", "doteqdot": "≑", "dotminus": "∸", "dotplus": "∔", "dotsquare": "⊡", "doublebarwedge": "⌆", "downarrow": "↓", "downdownarrows": "⇊", "downharpoonleft": "⇃", "downharpoonright": "⇂", "drbkarow": "⤐", "drcorn": "⌟", "drcrop": "⌌", "dscr": "𝒹", "dscy": "ѕ", "dsol": "⧶", "dstrok": "đ", "dtdot": "⋱", "dtri": "▿", "dtrif": "▾", "duarr": "⇵", "duhar": "⥯", "dwangle": "⦦", "dzcy": "џ", "dzigrarr": "⟿", "eDDot": "⩷", "eDot": "≑", "eacute": "é", "easter": "⩮", "ecaron": "ě", "ecir": "≖", "ecirc": "ê", "ecolon": "≕", "ecy": "э", "edot": "ė", "ee": "ⅇ", "efDot": "≒", "efr": "𝔢", "eg": "⪚", "egrave": "è", "egs": "⪖", "egsdot": "⪘", "el": "⪙", "elinters": "⏧", "ell": "ℓ", "els": "⪕", "elsdot": "⪗", "emacr": "ē", "empty": "∅", "emptyset": "∅", "emptyv": "∅", "emsp13": " ", "emsp14": " ", "emsp": " ", "eng": "ŋ", "ensp": " ", "eogon": "ę", "eopf": "𝕖", "epar": "⋕", "eparsl": "⧣", "eplus": "⩱", "epsi": "ε", "epsilon": "ε", "epsiv": "ϵ", "eqcirc": "≖", "eqcolon": "≕", "eqsim": "≂", "eqslantgtr": "⪖", "eqslantless": "⪕", "equals": "=", "equest": "≟", "equiv": "≡", "equivDD": "⩸", "eqvparsl": "⧥", "erDot": "≓", "erarr": "⥱", "escr": "ℯ", "esdot": "≐", "esim": "≂", "eta": "η", "eth": "ð", "euml": "ë", "euro": "€", "excl": "!", "exist": "∃", "expectation": "ℰ", "exponentiale": "ⅇ", "fallingdotseq": "≒", "fcy": "ф", "female": "♀", "ffilig": "ffi", "fflig": "ff", "ffllig": "ffl", "ffr": "𝔣", "filig": "fi", "fjlig": "fj", "flat": "♭", "fllig": "fl", "fltns": "▱", "fnof": "ƒ", "fopf": "𝕗", "forall": "∀", "fork": "⋔", "forkv": "⫙", "fpartint": "⨍", "frac12": "½", "frac13": "⅓", "frac14": "¼", "frac15": "⅕", "frac16": "⅙", "frac18": "⅛", "frac23": "⅔", "frac25": "⅖", "frac34": "¾", "frac35": "⅗", "frac38": "⅜", "frac45": "⅘", "frac56": "⅚", "frac58": "⅝", "frac78": "⅞", "frasl": "⁄", "frown": "⌢", "fscr": "𝒻", "gE": "≧", "gEl": "⪌", "gacute": "ǵ", "gamma": "γ", "gammad": "ϝ", "gap": "⪆", "gbreve": "ğ", "gcirc": "ĝ", "gcy": "г", "gdot": "ġ", "ge": "≥", "gel": "⋛", "geq": "≥", "geqq": "≧", "geqslant": "⩾", "ges": "⩾", "gescc": "⪩", "gesdot": "⪀", "gesdoto": "⪂", "gesdotol": "⪄", "gesl": "⋛︀", "gesles": "⪔", "gfr": "𝔤", "gg": "≫", "ggg": "⋙", "gimel": "ℷ", "gjcy": "ѓ", "gl": "≷", "glE": "⪒", "gla": "⪥", "glj": "⪤", "gnE": "≩", "gnap": "⪊", "gnapprox": "⪊", "gne": "⪈", "gneq": "⪈", "gneqq": "≩", "gnsim": "⋧", "gopf": "𝕘", "grave": "`", "gscr": "ℊ", "gsim": "≳", "gsime": "⪎", "gsiml": "⪐", "gt": ">", "gtcc": "⪧", "gtcir": "⩺", "gtdot": "⋗", "gtlPar": "⦕", "gtquest": "⩼", "gtrapprox": "⪆", "gtrarr": "⥸", "gtrdot": "⋗", "gtreqless": "⋛", "gtreqqless": "⪌", "gtrless": "≷", "gtrsim": "≳", "gvertneqq": "≩︀", "gvnE": "≩︀", "hArr": "⇔", "hairsp": " ", "half": "½", "hamilt": "ℋ", "hardcy": "ъ", "harr": "↔", "harrcir": "⥈", "harrw": "↭", "hbar": "ℏ", "hcirc": "ĥ", "hearts": "♥", "heartsuit": "♥", "hellip": "…", "hercon": "⊹", "hfr": "𝔥", "hksearow": "⤥", "hkswarow": "⤦", "hoarr": "⇿", "homtht": "∻", "hookleftarrow": "↩", "hookrightarrow": "↪", "hopf": "𝕙", "horbar": "―", "hscr": "𝒽", "hslash": "ℏ", "hstrok": "ħ", "hybull": "⁃", "hyphen": "‐", "iacute": "í", "ic": "⁣", "icirc": "î", "icy": "и", "iecy": "е", "iexcl": "¡", "iff": "⇔", "ifr": "𝔦", "igrave": "ì", "ii": "ⅈ", "iiiint": "⨌", "iiint": "∭", "iinfin": "⧜", "iiota": "℩", "ijlig": "ij", "imacr": "ī", "image": "ℑ", "imagline": "ℐ", "imagpart": "ℑ", "imath": "ı", "imof": "⊷", "imped": "Ƶ", "in": "∈", "incare": "℅", "infin": "∞", "infintie": "⧝", "inodot": "ı", "int": "∫", "intcal": "⊺", "integers": "ℤ", "intercal": "⊺", "intlarhk": "⨗", "intprod": "⨼", "iocy": "ё", "iogon": "į", "iopf": "𝕚", "iota": "ι", "iprod": "⨼", "iquest": "¿", "iscr": "𝒾", "isin": "∈", "isinE": "⋹", "isindot": "⋵", "isins": "⋴", "isinsv": "⋳", "isinv": "∈", "it": "⁢", "itilde": "ĩ", "iukcy": "і", "iuml": "ï", "jcirc": "ĵ", "jcy": "й", "jfr": "𝔧", "jmath": "ȷ", "jopf": "𝕛", "jscr": "𝒿", "jsercy": "ј", "jukcy": "є", "kappa": "κ", "kappav": "ϰ", "kcedil": "ķ", "kcy": "к", "kfr": "𝔨", "kgreen": "ĸ", "khcy": "х", "kjcy": "ќ", "kopf": "𝕜", "kscr": "𝓀", "lAarr": "⇚", "lArr": "⇐", "lAtail": "⤛", "lBarr": "⤎", "lE": "≦", "lEg": "⪋", "lHar": "⥢", "lacute": "ĺ", "laemptyv": "⦴", "lagran": "ℒ", "lambda": "λ", "lang": "⟨", "langd": "⦑", "langle": "⟨", "lap": "⪅", "laquo": "«", "larr": "←", "larrb": "⇤", "larrbfs": "⤟", "larrfs": "⤝", "larrhk": "↩", "larrlp": "↫", "larrpl": "⤹", "larrsim": "⥳", "larrtl": "↢", "lat": "⪫", "latail": "⤙", "late": "⪭", "lates": "⪭︀", "lbarr": "⤌", "lbbrk": "❲", "lbrace": "{", "lbrack": "[", "lbrke": "⦋", "lbrksld": "⦏", "lbrkslu": "⦍", "lcaron": "ľ", "lcedil": "ļ", "lceil": "⌈", "lcub": "{", "lcy": "л", "ldca": "⤶", "ldquo": "“", "ldquor": "„", "ldrdhar": "⥧", "ldrushar": "⥋", "ldsh": "↲", "le": "≤", "leftarrow": "←", "leftarrowtail": "↢", "leftharpoondown": "↽", "leftharpoonup": "↼", "leftleftarrows": "⇇", "leftrightarrow": "↔", "leftrightarrows": "⇆", "leftrightharpoons": "⇋", "leftrightsquigarrow": "↭", "leftthreetimes": "⋋", "leg": "⋚", "leq": "≤", "leqq": "≦", "leqslant": "⩽", "les": "⩽", "lescc": "⪨", "lesdot": "⩿", "lesdoto": "⪁", "lesdotor": "⪃", "lesg": "⋚︀", "lesges": "⪓", "lessapprox": "⪅", "lessdot": "⋖", "lesseqgtr": "⋚", "lesseqqgtr": "⪋", "lessgtr": "≶", "lesssim": "≲", "lfisht": "⥼", "lfloor": "⌊", "lfr": "𝔩", "lg": "≶", "lgE": "⪑", "lhard": "↽", "lharu": "↼", "lharul": "⥪", "lhblk": "▄", "ljcy": "љ", "ll": "≪", "llarr": "⇇", "llcorner": "⌞", "llhard": "⥫", "lltri": "◺", "lmidot": "ŀ", "lmoust": "⎰", "lmoustache": "⎰", "lnE": "≨", "lnap": "⪉", "lnapprox": "⪉", "lne": "⪇", "lneq": "⪇", "lneqq": "≨", "lnsim": "⋦", "loang": "⟬", "loarr": "⇽", "lobrk": "⟦", "longleftarrow": "⟵", "longleftrightarrow": "⟷", "longmapsto": "⟼", "longrightarrow": "⟶", "looparrowleft": "↫", "looparrowright": "↬", "lopar": "⦅", "lopf": "𝕝", "loplus": "⨭", "lotimes": "⨴", "lowast": "∗", "lowbar": "_", "loz": "◊", "lozenge": "◊", "lozf": "⧫", "lpar": "(", "lparlt": "⦓", "lrarr": "⇆", "lrcorner": "⌟", "lrhar": "⇋", "lrhard": "⥭", "lrm": "‎", "lrtri": "⊿", "lsaquo": "‹", "lscr": "𝓁", "lsh": "↰", "lsim": "≲", "lsime": "⪍", "lsimg": "⪏", "lsqb": "[", "lsquo": "‘", "lsquor": "‚", "lstrok": "ł", "lt": "<", "ltcc": "⪦", "ltcir": "⩹", "ltdot": "⋖", "lthree": "⋋", "ltimes": "⋉", "ltlarr": "⥶", "ltquest": "⩻", "ltrPar": "⦖", "ltri": "◃", "ltrie": "⊴", "ltrif": "◂", "lurdshar": "⥊", "luruhar": "⥦", "lvertneqq": "≨︀", "lvnE": "≨︀", "mDDot": "∺", "macr": "¯", "male": "♂", "malt": "✠", "maltese": "✠", "map": "↦", "mapsto": "↦", "mapstodown": "↧", "mapstoleft": "↤", "mapstoup": "↥", "marker": "▮", "mcomma": "⨩", "mcy": "м", "mdash": "—", "measuredangle": "∡", "mfr": "𝔪", "mho": "℧", "micro": "µ", "mid": "∣", "midast": "*", "midcir": "⫰", "middot": "·", "minus": "−", "minusb": "⊟", "minusd": "∸", "minusdu": "⨪", "mlcp": "⫛", "mldr": "…", "mnplus": "∓", "models": "⊧", "mopf": "𝕞", "mp": "∓", "mscr": "𝓂", "mstpos": "∾", "mu": "μ", "multimap": "⊸", "mumap": "⊸", "nGg": "⋙̸", "nGt": "≫⃒", "nGtv": "≫̸", "nLeftarrow": "⇍", "nLeftrightarrow": "⇎", "nLl": "⋘̸", "nLt": "≪⃒", "nLtv": "≪̸", "nRightarrow": "⇏", "nVDash": "⊯", "nVdash": "⊮", "nabla": "∇", "nacute": "ń", "nang": "∠⃒", "nap": "≉", "napE": "⩰̸", "napid": "≋̸", "napos": "ʼn", "napprox": "≉", "natur": "♮", "natural": "♮", "naturals": "ℕ", "nbsp": " ", "nbump": "≎̸", "nbumpe": "≏̸", "ncap": "⩃", "ncaron": "ň", "ncedil": "ņ", "ncong": "≇", "ncongdot": "⩭̸", "ncup": "⩂", "ncy": "н", "ndash": "–", "ne": "≠", "neArr": "⇗", "nearhk": "⤤", "nearr": "↗", "nearrow": "↗", "nedot": "≐̸", "nequiv": "≢", "nesear": "⤨", "nesim": "≂̸", "nexist": "∄", "nexists": "∄", "nfr": "𝔫", "ngE": "≧̸", "nge": "≱", "ngeq": "≱", "ngeqq": "≧̸", "ngeqslant": "⩾̸", "nges": "⩾̸", "ngsim": "≵", "ngt": "≯", "ngtr": "≯", "nhArr": "⇎", "nharr": "↮", "nhpar": "⫲", "ni": "∋", "nis": "⋼", "nisd": "⋺", "niv": "∋", "njcy": "њ", "nlArr": "⇍", "nlE": "≦̸", "nlarr": "↚", "nldr": "‥", "nle": "≰", "nleftarrow": "↚", "nleftrightarrow": "↮", "nleq": "≰", "nleqq": "≦̸", "nleqslant": "⩽̸", "nles": "⩽̸", "nless": "≮", "nlsim": "≴", "nlt": "≮", "nltri": "⋪", "nltrie": "⋬", "nmid": "∤", "nopf": "𝕟", "not": "¬", "notin": "∉", "notinE": "⋹̸", "notindot": "⋵̸", "notinva": "∉", "notinvb": "⋷", "notinvc": "⋶", "notni": "∌", "notniva": "∌", "notnivb": "⋾", "notnivc": "⋽", "npar": "∦", "nparallel": "∦", "nparsl": "⫽⃥", "npart": "∂̸", "npolint": "⨔", "npr": "⊀", "nprcue": "⋠", "npre": "⪯̸", "nprec": "⊀", "npreceq": "⪯̸", "nrArr": "⇏", "nrarr": "↛", "nrarrc": "⤳̸", "nrarrw": "↝̸", "nrightarrow": "↛", "nrtri": "⋫", "nrtrie": "⋭", "nsc": "⊁", "nsccue": "⋡", "nsce": "⪰̸", "nscr": "𝓃", "nshortmid": "∤", "nshortparallel": "∦", "nsim": "≁", "nsime": "≄", "nsimeq": "≄", "nsmid": "∤", "nspar": "∦", "nsqsube": "⋢", "nsqsupe": "⋣", "nsub": "⊄", "nsubE": "⫅̸", "nsube": "⊈", "nsubset": "⊂⃒", "nsubseteq": "⊈", "nsubseteqq": "⫅̸", "nsucc": "⊁", "nsucceq": "⪰̸", "nsup": "⊅", "nsupE": "⫆̸", "nsupe": "⊉", "nsupset": "⊃⃒", "nsupseteq": "⊉", "nsupseteqq": "⫆̸", "ntgl": "≹", "ntilde": "ñ", "ntlg": "≸", "ntriangleleft": "⋪", "ntrianglelefteq": "⋬", "ntriangleright": "⋫", "ntrianglerighteq": "⋭", "nu": "ν", "num": "#", "numero": "№", "numsp": " ", "nvDash": "⊭", "nvHarr": "⤄", "nvap": "≍⃒", "nvdash": "⊬", "nvge": "≥⃒", "nvgt": ">⃒", "nvinfin": "⧞", "nvlArr": "⤂", "nvle": "≤⃒", "nvlt": "<⃒", "nvltrie": "⊴⃒", "nvrArr": "⤃", "nvrtrie": "⊵⃒", "nvsim": "∼⃒", "nwArr": "⇖", "nwarhk": "⤣", "nwarr": "↖", "nwarrow": "↖", "nwnear": "⤧", "oS": "Ⓢ", "oacute": "ó", "oast": "⊛", "ocir": "⊚", "ocirc": "ô", "ocy": "о", "odash": "⊝", "odblac": "ő", "odiv": "⨸", "odot": "⊙", "odsold": "⦼", "oelig": "œ", "ofcir": "⦿", "ofr": "𝔬", "ogon": "˛", "ograve": "ò", "ogt": "⧁", "ohbar": "⦵", "ohm": "Ω", "oint": "∮", "olarr": "↺", "olcir": "⦾", "olcross": "⦻", "oline": "‾", "olt": "⧀", "omacr": "ō", "omega": "ω", "omicron": "ο", "omid": "⦶", "ominus": "⊖", "oopf": "𝕠", "opar": "⦷", "operp": "⦹", "oplus": "⊕", "or": "∨", "orarr": "↻", "ord": "⩝", "order": "ℴ", "orderof": "ℴ", "ordf": "ª", "ordm": "º", "origof": "⊶", "oror": "⩖", "orslope": "⩗", "orv": "⩛", "oscr": "ℴ", "oslash": "ø", "osol": "⊘", "otilde": "õ", "otimes": "⊗", "otimesas": "⨶", "ouml": "ö", "ovbar": "⌽", "par": "∥", "para": "¶", "parallel": "∥", "parsim": "⫳", "parsl": "⫽", "part": "∂", "pcy": "п", "percnt": "%", "period": ".", "permil": "‰", "perp": "⊥", "pertenk": "‱", "pfr": "𝔭", "phi": "φ", "phiv": "ϕ", "phmmat": "ℳ", "phone": "☎", "pi": "π", "pitchfork": "⋔", "piv": "ϖ", "planck": "ℏ", "planckh": "ℎ", "plankv": "ℏ", "plus": "+", "plusacir": "⨣", "plusb": "⊞", "pluscir": "⨢", "plusdo": "∔", "plusdu": "⨥", "pluse": "⩲", "plusmn": "±", "plussim": "⨦", "plustwo": "⨧", "pm": "±", "pointint": "⨕", "popf": "𝕡", "pound": "£", "pr": "≺", "prE": "⪳", "prap": "⪷", "prcue": "≼", "pre": "⪯", "prec": "≺", "precapprox": "⪷", "preccurlyeq": "≼", "preceq": "⪯", "precnapprox": "⪹", "precneqq": "⪵", "precnsim": "⋨", "precsim": "≾", "prime": "′", "primes": "ℙ", "prnE": "⪵", "prnap": "⪹", "prnsim": "⋨", "prod": "∏", "profalar": "⌮", "profline": "⌒", "profsurf": "⌓", "prop": "∝", "propto": "∝", "prsim": "≾", "prurel": "⊰", "pscr": "𝓅", "psi": "ψ", "puncsp": " ", "qfr": "𝔮", "qint": "⨌", "qopf": "𝕢", "qprime": "⁗", "qscr": "𝓆", "quaternions": "ℍ", "quatint": "⨖", "quest": "?", "questeq": "≟", "quot": "\"", "rAarr": "⇛", "rArr": "⇒", "rAtail": "⤜", "rBarr": "⤏", "rHar": "⥤", "race": "∽̱", "racute": "ŕ", "radic": "√", "raemptyv": "⦳", "rang": "⟩", "rangd": "⦒", "range": "⦥", "rangle": "⟩", "raquo": "»", "rarr": "→", "rarrap": "⥵", "rarrb": "⇥", "rarrbfs": "⤠", "rarrc": "⤳", "rarrfs": "⤞", "rarrhk": "↪", "rarrlp": "↬", "rarrpl": "⥅", "rarrsim": "⥴", "rarrtl": "↣", "rarrw": "↝", "ratail": "⤚", "ratio": "∶", "rationals": "ℚ", "rbarr": "⤍", "rbbrk": "❳", "rbrace": "}", "rbrack": "]", "rbrke": "⦌", "rbrksld": "⦎", "rbrkslu": "⦐", "rcaron": "ř", "rcedil": "ŗ", "rceil": "⌉", "rcub": "}", "rcy": "р", "rdca": "⤷", "rdldhar": "⥩", "rdquo": "”", "rdquor": "”", "rdsh": "↳", "real": "ℜ", "realine": "ℛ", "realpart": "ℜ", "reals": "ℝ", "rect": "▭", "reg": "®", "rfisht": "⥽", "rfloor": "⌋", "rfr": "𝔯", "rhard": "⇁", "rharu": "⇀", "rharul": "⥬", "rho": "ρ", "rhov": "ϱ", "rightarrow": "→", "rightarrowtail": "↣", "rightharpoondown": "⇁", "rightharpoonup": "⇀", "rightleftarrows": "⇄", "rightleftharpoons": "⇌", "rightrightarrows": "⇉", "rightsquigarrow": "↝", "rightthreetimes": "⋌", "ring": "˚", "risingdotseq": "≓", "rlarr": "⇄", "rlhar": "⇌", "rlm": "‏", "rmoust": "⎱", "rmoustache": "⎱", "rnmid": "⫮", "roang": "⟭", "roarr": "⇾", "robrk": "⟧", "ropar": "⦆", "ropf": "𝕣", "roplus": "⨮", "rotimes": "⨵", "rpar": ")", "rpargt": "⦔", "rppolint": "⨒", "rrarr": "⇉", "rsaquo": "›", "rscr": "𝓇", "rsh": "↱", "rsqb": "]", "rsquo": "’", "rsquor": "’", "rthree": "⋌", "rtimes": "⋊", "rtri": "▹", "rtrie": "⊵", "rtrif": "▸", "rtriltri": "⧎", "ruluhar": "⥨", "rx": "℞", "sacute": "ś", "sbquo": "‚", "sc": "≻", "scE": "⪴", "scap": "⪸", "scaron": "š", "sccue": "≽", "sce": "⪰", "scedil": "ş", "scirc": "ŝ", "scnE": "⪶", "scnap": "⪺", "scnsim": "⋩", "scpolint": "⨓", "scsim": "≿", "scy": "с", "sdot": "⋅", "sdotb": "⊡", "sdote": "⩦", "seArr": "⇘", "searhk": "⤥", "searr": "↘", "searrow": "↘", "sect": "§", "semi": ";", "seswar": "⤩", "setminus": "∖", "setmn": "∖", "sext": "✶", "sfr": "𝔰", "sfrown": "⌢", "sharp": "♯", "shchcy": "щ", "shcy": "ш", "shortmid": "∣", "shortparallel": "∥", "shy": "­", "sigma": "σ", "sigmaf": "ς", "sigmav": "ς", "sim": "∼", "simdot": "⩪", "sime": "≃", "simeq": "≃", "simg": "⪞", "simgE": "⪠", "siml": "⪝", "simlE": "⪟", "simne": "≆", "simplus": "⨤", "simrarr": "⥲", "slarr": "←", "smallsetminus": "∖", "smashp": "⨳", "smeparsl": "⧤", "smid": "∣", "smile": "⌣", "smt": "⪪", "smte": "⪬", "smtes": "⪬︀", "softcy": "ь", "sol": "/", "solb": "⧄", "solbar": "⌿", "sopf": "𝕤", "spades": "♠", "spadesuit": "♠", "spar": "∥", "sqcap": "⊓", "sqcaps": "⊓︀", "sqcup": "⊔", "sqcups": "⊔︀", "sqsub": "⊏", "sqsube": "⊑", "sqsubset": "⊏", "sqsubseteq": "⊑", "sqsup": "⊐", "sqsupe": "⊒", "sqsupset": "⊐", "sqsupseteq": "⊒", "squ": "□", "square": "□", "squarf": "▪", "squf": "▪", "srarr": "→", "sscr": "𝓈", "ssetmn": "∖", "ssmile": "⌣", "sstarf": "⋆", "star": "☆", "starf": "★", "straightepsilon": "ϵ", "straightphi": "ϕ", "strns": "¯", "sub": "⊂", "subE": "⫅", "subdot": "⪽", "sube": "⊆", "subedot": "⫃", "submult": "⫁", "subnE": "⫋", "subne": "⊊", "subplus": "⪿", "subrarr": "⥹", "subset": "⊂", "subseteq": "⊆", "subseteqq": "⫅", "subsetneq": "⊊", "subsetneqq": "⫋", "subsim": "⫇", "subsub": "⫕", "subsup": "⫓", "succ": "≻", "succapprox": "⪸", "succcurlyeq": "≽", "succeq": "⪰", "succnapprox": "⪺", "succneqq": "⪶", "succnsim": "⋩", "succsim": "≿", "sum": "∑", "sung": "♪", "sup1": "¹", "sup2": "²", "sup3": "³", "sup": "⊃", "supE": "⫆", "supdot": "⪾", "supdsub": "⫘", "supe": "⊇", "supedot": "⫄", "suphsol": "⟉", "suphsub": "⫗", "suplarr": "⥻", "supmult": "⫂", "supnE": "⫌", "supne": "⊋", "supplus": "⫀", "supset": "⊃", "supseteq": "⊇", "supseteqq": "⫆", "supsetneq": "⊋", "supsetneqq": "⫌", "supsim": "⫈", "supsub": "⫔", "supsup": "⫖", "swArr": "⇙", "swarhk": "⤦", "swarr": "↙", "swarrow": "↙", "swnwar": "⤪", "szlig": "ß", "target": "⌖", "tau": "τ", "tbrk": "⎴", "tcaron": "ť", "tcedil": "ţ", "tcy": "т", "tdot": "⃛", "telrec": "⌕", "tfr": "𝔱", "there4": "∴", "therefore": "∴", "theta": "θ", "thetasym": "ϑ", "thetav": "ϑ", "thickapprox": "≈", "thicksim": "∼", "thinsp": " ", "thkap": "≈", "thksim": "∼", "thorn": "þ", "tilde": "˜", "times": "×", "timesb": "⊠", "timesbar": "⨱", "timesd": "⨰", "tint": "∭", "toea": "⤨", "top": "⊤", "topbot": "⌶", "topcir": "⫱", "topf": "𝕥", "topfork": "⫚", "tosa": "⤩", "tprime": "‴", "trade": "™", "triangle": "▵", "triangledown": "▿", "triangleleft": "◃", "trianglelefteq": "⊴", "triangleq": "≜", "triangleright": "▹", "trianglerighteq": "⊵", "tridot": "◬", "trie": "≜", "triminus": "⨺", "triplus": "⨹", "trisb": "⧍", "tritime": "⨻", "trpezium": "⏢", "tscr": "𝓉", "tscy": "ц", "tshcy": "ћ", "tstrok": "ŧ", "twixt": "≬", "twoheadleftarrow": "↞", "twoheadrightarrow": "↠", "uArr": "⇑", "uHar": "⥣", "uacute": "ú", "uarr": "↑", "ubrcy": "ў", "ubreve": "ŭ", "ucirc": "û", "ucy": "у", "udarr": "⇅", "udblac": "ű", "udhar": "⥮", "ufisht": "⥾", "ufr": "𝔲", "ugrave": "ù", "uharl": "↿", "uharr": "↾", "uhblk": "▀", "ulcorn": "⌜", "ulcorner": "⌜", "ulcrop": "⌏", "ultri": "◸", "umacr": "ū", "uml": "¨", "uogon": "ų", "uopf": "𝕦", "uparrow": "↑", "updownarrow": "↕", "upharpoonleft": "↿", "upharpoonright": "↾", "uplus": "⊎", "upsi": "υ", "upsih": "ϒ", "upsilon": "υ", "upuparrows": "⇈", "urcorn": "⌝", "urcorner": "⌝", "urcrop": "⌎", "uring": "ů", "urtri": "◹", "uscr": "𝓊", "utdot": "⋰", "utilde": "ũ", "utri": "▵", "utrif": "▴", "uuarr": "⇈", "uuml": "ü", "uwangle": "⦧", "vArr": "⇕", "vBar": "⫨", "vBarv": "⫩", "vDash": "⊨", "vangrt": "⦜", "varepsilon": "ϵ", "varkappa": "ϰ", "varnothing": "∅", "varphi": "ϕ", "varpi": "ϖ", "varpropto": "∝", "varr": "↕", "varrho": "ϱ", "varsigma": "ς", "varsubsetneq": "⊊︀", "varsubsetneqq": "⫋︀", "varsupsetneq": "⊋︀", "varsupsetneqq": "⫌︀", "vartheta": "ϑ", "vartriangleleft": "⊲", "vartriangleright": "⊳", "vcy": "в", "vdash": "⊢", "vee": "∨", "veebar": "⊻", "veeeq": "≚", "vellip": "⋮", "verbar": "|", "vert": "|", "vfr": "𝔳", "vltri": "⊲", "vnsub": "⊂⃒", "vnsup": "⊃⃒", "vopf": "𝕧", "vprop": "∝", "vrtri": "⊳", "vscr": "𝓋", "vsubnE": "⫋︀", "vsubne": "⊊︀", "vsupnE": "⫌︀", "vsupne": "⊋︀", "vzigzag": "⦚", "wcirc": "ŵ", "wedbar": "⩟", "wedge": "∧", "wedgeq": "≙", "weierp": "℘", "wfr": "𝔴", "wopf": "𝕨", "wp": "℘", "wr": "≀", "wreath": "≀", "wscr": "𝓌", "xcap": "⋂", "xcirc": "◯", "xcup": "⋃", "xdtri": "▽", "xfr": "𝔵", "xhArr": "⟺", "xharr": "⟷", "xi": "ξ", "xlArr": "⟸", "xlarr": "⟵", "xmap": "⟼", "xnis": "⋻", "xodot": "⨀", "xopf": "𝕩", "xoplus": "⨁", "xotime": "⨂", "xrArr": "⟹", "xrarr": "⟶", "xscr": "𝓍", "xsqcup": "⨆", "xuplus": "⨄", "xutri": "△", "xvee": "⋁", "xwedge": "⋀", "yacute": "ý", "yacy": "я", "ycirc": "ŷ", "ycy": "ы", "yen": "¥", "yfr": "𝔶", "yicy": "ї", "yopf": "𝕪", "yscr": "𝓎", "yucy": "ю", "yuml": "ÿ", "zacute": "ź", "zcaron": "ž", "zcy": "з", "zdot": "ż", "zeetrf": "ℨ", "zeta": "ζ", "zfr": "𝔷", "zhcy": "ж", "zigrarr": "⇝", "zopf": "𝕫", "zscr": "𝓏", "zwj": "‍", "zwnj": "‌" } },{}],75:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module character-entities * @fileoverview HTML character entity information. */ 'use strict'; /* eslint-env commonjs */ /* * Expose. */ module.exports = require('./index.json'); },{"./index.json":74}],76:[function(require,module,exports){ module.exports={ "0": "�", "128": "€", "130": "‚", "131": "ƒ", "132": "„", "133": "…", "134": "†", "135": "‡", "136": "ˆ", "137": "‰", "138": "Š", "139": "‹", "140": "Œ", "142": "Ž", "145": "‘", "146": "’", "147": "“", "148": "”", "149": "•", "150": "–", "151": "—", "152": "˜", "153": "™", "154": "š", "155": "›", "156": "œ", "158": "ž", "159": "Ÿ" } },{}],77:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module character-reference-invalid * @fileoverview HTML invalid numeric character reference information. */ 'use strict'; /* eslint-env commonjs */ /* * Expose. */ module.exports = require('./index.json'); },{"./index.json":76}],78:[function(require,module,exports){ var _require = require //fool browserify module.exports = _require('chloridedown/build/Release/sodium') },{}],79:[function(require,module,exports){ module.exports = require('sodium-browserify') },{"sodium-browserify":515}],80:[function(require,module,exports){ (function (process){ if(process.env.CHLORIDE_JS) return module.exports = require('./browser') try { module.exports = require('./bindings') } catch (err) { console.error('error loading sodium bindings:', err.message) console.error('falling back to javascript version.') module.exports = require('./browser') } }).call(this,require('_process')) },{"./bindings":78,"./browser":79,"_process":295}],81:[function(require,module,exports){ (function (Buffer){ var Transform = require('stream').Transform var inherits = require('inherits') var StringDecoder = require('string_decoder').StringDecoder module.exports = CipherBase inherits(CipherBase, Transform) function CipherBase (hashMode) { Transform.call(this) this.hashMode = typeof hashMode === 'string' if (this.hashMode) { this[hashMode] = this._finalOrDigest } else { this.final = this._finalOrDigest } this._decoder = null this._encoding = null } CipherBase.prototype.update = function (data, inputEnc, outputEnc) { if (typeof data === 'string') { data = new Buffer(data, inputEnc) } var outData = this._update(data) if (this.hashMode) { return this } if (outputEnc) { outData = this._toString(outData, outputEnc) } return outData } CipherBase.prototype.setAutoPadding = function () {} CipherBase.prototype.getAuthTag = function () { throw new Error('trying to get auth tag in unsupported state') } CipherBase.prototype.setAuthTag = function () { throw new Error('trying to set auth tag in unsupported state') } CipherBase.prototype.setAAD = function () { throw new Error('trying to set aad in unsupported state') } CipherBase.prototype._transform = function (data, _, next) { var err try { if (this.hashMode) { this._update(data) } else { this.push(this._update(data)) } } catch (e) { err = e } finally { next(err) } } CipherBase.prototype._flush = function (done) { var err try { this.push(this._final()) } catch (e) { err = e } finally { done(err) } } CipherBase.prototype._finalOrDigest = function (outputEnc) { var outData = this._final() || new Buffer('') if (outputEnc) { outData = this._toString(outData, outputEnc, true) } return outData } CipherBase.prototype._toString = function (value, enc, final) { if (!this._decoder) { this._decoder = new StringDecoder(enc) this._encoding = enc } if (this._encoding !== enc) { throw new Error('can\'t switch encodings') } var out = this._decoder.write(value) if (final) { out += this._decoder.end() } return out } }).call(this,require("buffer").Buffer) },{"buffer":61,"inherits":167,"stream":576,"string_decoder":616}],82:[function(require,module,exports){ (function (Buffer){ var clone = (function() { 'use strict'; /** * Clones (copies) an Object using deep copying. * * This function supports circular references by default, but if you are certain * there are no circular references in your object, you can save some CPU time * by calling clone(obj, false). * * Caution: if `circular` is false and `parent` contains circular references, * your program may enter an infinite loop and crash. * * @param `parent` - the object to be cloned * @param `circular` - set to true if the object to be cloned may contain * circular references. (optional - true by default) * @param `depth` - set to a number if the object is only to be cloned to * a particular depth. (optional - defaults to Infinity) * @param `prototype` - sets the prototype to be used when cloning an object. * (optional - defaults to parent prototype). */ function clone(parent, circular, depth, prototype) { var filter; if (typeof circular === 'object') { depth = circular.depth; prototype = circular.prototype; filter = circular.filter; circular = circular.circular } // maintain two arrays for circular references, where corresponding parents // and children have the same index var allParents = []; var allChildren = []; var useBuffer = typeof Buffer != 'undefined'; if (typeof circular == 'undefined') circular = true; if (typeof depth == 'undefined') depth = Infinity; // recurse this function so we don't reset allParents and allChildren function _clone(parent, depth) { // cloning null always returns null if (parent === null) return null; if (depth == 0) return parent; var child; var proto; if (typeof parent != 'object') { return parent; } if (clone.__isArray(parent)) { child = []; } else if (clone.__isRegExp(parent)) { child = new RegExp(parent.source, __getRegExpFlags(parent)); if (parent.lastIndex) child.lastIndex = parent.lastIndex; } else if (clone.__isDate(parent)) { child = new Date(parent.getTime()); } else if (useBuffer && Buffer.isBuffer(parent)) { child = new Buffer(parent.length); parent.copy(child); return child; } else { if (typeof prototype == 'undefined') { proto = Object.getPrototypeOf(parent); child = Object.create(proto); } else { child = Object.create(prototype); proto = prototype; } } if (circular) { var index = allParents.indexOf(parent); if (index != -1) { return allChildren[index]; } allParents.push(parent); allChildren.push(child); } for (var i in parent) { var attrs; if (proto) { attrs = Object.getOwnPropertyDescriptor(proto, i); } if (attrs && attrs.set == null) { continue; } child[i] = _clone(parent[i], depth - 1); } return child; } return _clone(parent, depth); } /** * Simple flat clone using prototype, accepts only objects, usefull for property * override on FLAT configuration object (no nested props). * * USE WITH CAUTION! This may not behave as you wish if you do not know how this * works. */ clone.clonePrototype = function clonePrototype(parent) { if (parent === null) return null; var c = function () {}; c.prototype = parent; return new c(); }; // private utility functions function __objToStr(o) { return Object.prototype.toString.call(o); }; clone.__objToStr = __objToStr; function __isDate(o) { return typeof o === 'object' && __objToStr(o) === '[object Date]'; }; clone.__isDate = __isDate; function __isArray(o) { return typeof o === 'object' && __objToStr(o) === '[object Array]'; }; clone.__isArray = __isArray; function __isRegExp(o) { return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; }; clone.__isRegExp = __isRegExp; function __getRegExpFlags(re) { var flags = ''; if (re.global) flags += 'g'; if (re.ignoreCase) flags += 'i'; if (re.multiline) flags += 'm'; return flags; }; clone.__getRegExpFlags = __getRegExpFlags; return clone; })(); if (typeof module === 'object' && module.exports) { module.exports = clone; } }).call(this,require("buffer").Buffer) },{"buffer":61}],83:[function(require,module,exports){ /** * slice() reference. */ var slice = Array.prototype.slice; /** * Expose `co`. */ module.exports = co; /** * Wrap the given generator `fn` and * return a thunk. * * @param {Function} fn * @return {Function} * @api public */ function co(fn) { var isGenFun = isGeneratorFunction(fn); return function (done) { var ctx = this; // in toThunk() below we invoke co() // with a generator, so optimize for // this case var gen = fn; // we only need to parse the arguments // if gen is a generator function. if (isGenFun) { var args = slice.call(arguments), len = args.length; var hasCallback = len && 'function' == typeof args[len - 1]; done = hasCallback ? args.pop() : error; gen = fn.apply(this, args); } else { done = done || error; } next(); // #92 // wrap the callback in a setImmediate // so that any of its errors aren't caught by `co` function exit(err, res) { setImmediate(function(){ done.call(ctx, err, res); }); } function next(err, res) { var ret; // multiple args if (arguments.length > 2) res = slice.call(arguments, 1); // error if (err) { try { ret = gen.throw(err); } catch (e) { return exit(e); } } // ok if (!err) { try { ret = gen.next(res); } catch (e) { return exit(e); } } // done if (ret.done) return exit(null, ret.value); // normalize ret.value = toThunk(ret.value, ctx); // run if ('function' == typeof ret.value) { var called = false; try { ret.value.call(ctx, function(){ if (called) return; called = true; next.apply(ctx, arguments); }); } catch (e) { setImmediate(function(){ if (called) return; called = true; next(e); }); } return; } // invalid next(new TypeError('You may only yield a function, promise, generator, array, or object, ' + 'but the following was passed: "' + String(ret.value) + '"')); } } } /** * Convert `obj` into a normalized thunk. * * @param {Mixed} obj * @param {Mixed} ctx * @return {Function} * @api private */ function toThunk(obj, ctx) { if (isGeneratorFunction(obj)) { return co(obj.call(ctx)); } if (isGenerator(obj)) { return co(obj); } if (isPromise(obj)) { return promiseToThunk(obj); } if ('function' == typeof obj) { return obj; } if (isObject(obj) || Array.isArray(obj)) { return objectToThunk.call(ctx, obj); } return obj; } /** * Convert an object of yieldables to a thunk. * * @param {Object} obj * @return {Function} * @api private */ function objectToThunk(obj){ var ctx = this; var isArray = Array.isArray(obj); return function(done){ var keys = Object.keys(obj); var pending = keys.length; var results = isArray ? new Array(pending) // predefine the array length : new obj.constructor(); var finished; if (!pending) { setImmediate(function(){ done(null, results) }); return; } // prepopulate object keys to preserve key ordering if (!isArray) { for (var i = 0; i < pending; i++) { results[keys[i]] = undefined; } } for (var i = 0; i < keys.length; i++) { run(obj[keys[i]], keys[i]); } function run(fn, key) { if (finished) return; try { fn = toThunk(fn, ctx); if ('function' != typeof fn) { results[key] = fn; return --pending || done(null, results); } fn.call(ctx, function(err, res){ if (finished) return; if (err) { finished = true; return done(err); } results[key] = res; --pending || done(null, results); }); } catch (err) { finished = true; done(err); } } } } /** * Convert `promise` to a thunk. * * @param {Object} promise * @return {Function} * @api private */ function promiseToThunk(promise) { return function(fn){ promise.then(function(res) { fn(null, res); }, fn); } } /** * Check if `obj` is a promise. * * @param {Object} obj * @return {Boolean} * @api private */ function isPromise(obj) { return obj && 'function' == typeof obj.then; } /** * Check if `obj` is a generator. * * @param {Mixed} obj * @return {Boolean} * @api private */ function isGenerator(obj) { return obj && 'function' == typeof obj.next && 'function' == typeof obj.throw; } /** * Check if `obj` is a generator function. * * @param {Mixed} obj * @return {Boolean} * @api private */ function isGeneratorFunction(obj) { return obj && obj.constructor && 'GeneratorFunction' == obj.constructor.name; } /** * Check for plain object. * * @param {Mixed} val * @return {Boolean} * @api private */ function isObject(val) { return val && Object == val.constructor; } /** * Throw `err` in a new stack. * * This is used when co() is invoked * without supplying a callback, which * should only be for demonstrational * purposes. * * @param {Error} err * @api private */ function error(err) { if (!err) return; setImmediate(function(){ throw err; }); } },{}],84:[function(require,module,exports){ 'use strict'; /* * Constants. */ var WHITE_SPACE_COLLAPSABLE = /\s+/g; var SPACE = ' '; /** * Replace multiple white-space characters with a single space. * * @example * collapse(' \t\nbar \nbaz\t'); // ' bar baz ' * * @param {string} value - Value with uncollapsed white-space, * coerced to string. * @return {string} - Value with collapsed white-space. */ function collapse(value) { return String(value).replace(WHITE_SPACE_COLLAPSABLE, SPACE); } /* * Expose. */ module.exports = collapse; },{}],85:[function(require,module,exports){ module.exports = function (xs, fn) { var res = []; for (var i = 0; i < xs.length; i++) { var x = fn(xs[i], i); if (isArray(x)) res.push.apply(res, x); else res.push(x); } return res; }; var isArray = Array.isArray || function (xs) { return Object.prototype.toString.call(xs) === '[object Array]'; }; },{}],86:[function(require,module,exports){ var cont = require('continuable') exports = module.exports = function (fun) { return cont.to(fun) } for(var k in cont) exports[k] = cont[k] exports.para = require('continuable-para') exports.series = require('continuable-series') },{"continuable":97,"continuable-para":91,"continuable-series":92}],87:[function(require,module,exports){ var maybeCallback = require("continuable/maybe-callback") module.exports = maybeCallback(hash) // hash := (tasks:Object>) // => Continuable> function hash(tasks) { return function continuable(callback) { var keys = Object.keys(tasks) var count = 0 var result = {} if (keys.length === 0) { return callback(null, result) } keys.forEach(function (key) { tasks[key](function (err, value) { if (err && result) { result = null callback(err) } else if (!err && result) { result[key] = value if (++count === keys.length) { callback(null, result) } } }) }) } } },{"continuable/maybe-callback":88}],88:[function(require,module,exports){ var slice = Array.prototype.slice /* Given a function that takes n arguments and returns a continuable return a function that takes n arguments and maybe a n+1th argument which is a callback or takes n arguments and returns a continuable This basically means that you can do this: ```js var readFile = maybeCallback(function (uri) { return function (cb) { fs.readFile(uri, cb) } }) readFile("./foo")(cb) readFile("./foo", cb) ``` Be warned this breaks if the last argument is a function */ module.exports = maybeCallback // maybeCallback := (fn: (Any, ...) => Continuable) => // (Any, ..., Callback?) => Continuable function maybeCallback(fn) { return function maybeContinuable() { var args = slice.call(arguments) var callback = args[args.length - 1] if (typeof callback === "function") { args.pop() } var continuable = fn.apply(null, args) if (typeof callback === "function") { continuable(callback) } else { return continuable } } } },{}],89:[function(require,module,exports){ var maybeCallback = require("continuable/maybe-callback") module.exports = maybeCallback(list) // list := (tasks:Array>) // => Continuable> function list(tasks) { return function continuable(callback) { var result = [] var count = 0 if (tasks.length === 0) { return callback(null, result) } tasks.forEach(function invokeSource(source, index) { source(function continuation(err, value) { if (err && result) { result = null callback(err) } else if (!err && result) { result[index] = value if (++count === tasks.length) { callback(null, result) } } }) }) } } },{"continuable/maybe-callback":90}],90:[function(require,module,exports){ arguments[4][88][0].apply(exports,arguments) },{"dup":88}],91:[function(require,module,exports){ var list = require('continuable-list') var hash = require('continuable-hash') module.exports = function (obj, cb) { if(Array.isArray(obj)) return list(obj, cb) else if('object' === typeof obj) return hash(obj, cb) else return list([].slice.call(arguments)) } },{"continuable-hash":87,"continuable-list":89}],92:[function(require,module,exports){ module.exports = function series (continuables, callback) { if('function' === typeof continuables) return series([].slice.call(arguments)) if (callback) { next(callback) } else { return next } function next (callback) { continuables.shift() (function (err, value) { if (err || !continuables.length) return callback(err, value) next (callback) }) } } },{}],93:[function(require,module,exports){ // both := (Continuable) => Continuable<[Error, Any]> module.exports = both function both(source) { return function continuable(callback) { source(function (err, value) { callback(null, [err || null, value]) }) } } },{}],94:[function(require,module,exports){ module.exports = chain // chain := (Continuable, lambda:(A) => Continuable) => Continuable function chain(source, lambda) { return function continuable(callback) { source(function continuation(err, value) { if (err) { return callback(err) } lambda(value)(callback) }) } } },{}],95:[function(require,module,exports){ var of = require("./of") module.exports = either // either := (source: Continuable, // left: (Error, cb?: Callback) => Continuable, // right?: (A) => Continuable) // => Continuable function either(cont, left, right) { right = right || of return function continuable(callback) { cont(function (err, value) { if (!err) { return right(value)(callback) } // the left function takes either a callback or // it returns a continuable. Both are valid var cont = left(err, callback) if (cont) { cont(callback) } }) } } },{"./of":102}],96:[function(require,module,exports){ module.exports = error // error := (Error) => Continuable function error(err) { return function continuable(callback) { callback(err) } } },{}],97:[function(require,module,exports){ var maybeCallback = require("./maybe-callback.js") maybeCallback.both = require("./both.js") maybeCallback.chain = require("./chain.js") maybeCallback.either = require("./either.js") maybeCallback.error = require("./error.js") maybeCallback.join = require("./join.js") maybeCallback.mapAsync = require("./map-async.js") maybeCallback.map = require("./map.js") maybeCallback.of = require("./of.js") maybeCallback.to = require("./to.js") module.exports = maybeCallback },{"./both.js":93,"./chain.js":94,"./either.js":95,"./error.js":96,"./join.js":98,"./map-async.js":99,"./map.js":100,"./maybe-callback.js":101,"./of.js":102,"./to.js":103}],98:[function(require,module,exports){ module.exports = join // join := (Continuable>) => Continuable function join(source) { return function continuable(callback) { source(function continuation(err, next) { if (err) { return callback(err) } next(callback) }) } } },{}],99:[function(require,module,exports){ module.exports = mapAsync // mapAsync := (Continuable, lambda: (A, Callback)) => Continuable function mapAsync(source, lambda) { return function continuable(callback) { source(function continuation(err, value) { if (err) { return callback(err) } lambda(value, callback) }) } } },{}],100:[function(require,module,exports){ module.exports = map // map := (Continuable, (A) => B) => Continuable function map(source, lambda) { return function continuable(callback) { source(function continuation(err, value) { if (err) { return callback(err) } callback(null, lambda(value)) }) } } },{}],101:[function(require,module,exports){ arguments[4][88][0].apply(exports,arguments) },{"dup":88}],102:[function(require,module,exports){ module.exports = of // of := (Value) => Continuable function of(value) { return function continuable(callback) { callback(null, value) } } },{}],103:[function(require,module,exports){ var slice = Array.prototype.slice module.exports = to function to(asyncFn) { return function () { var args = slice.call(arguments) var callback = args[args.length - 1] var self = this if (typeof callback === "function") { return asyncFn.apply(this, args) } return function continuable(callback) { var _args = args.slice() _args.push(callback) return asyncFn.apply(self, _args) } } } },{}],104:[function(require,module,exports){ (function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(arg) { if (Array.isArray) { return Array.isArray(arg); } return objectToString(arg) === '[object Array]'; } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = Buffer.isBuffer; function objectToString(o) { return Object.prototype.toString.call(o); } }).call(this,{"isBuffer":require("../../is-buffer/index.js")}) },{"../../is-buffer/index.js":170}],105:[function(require,module,exports){ (function (Buffer){ var elliptic = require('elliptic'); var BN = require('bn.js'); module.exports = function createECDH(curve) { return new ECDH(curve); }; var aliases = { secp256k1: { name: 'secp256k1', byteLength: 32 }, secp224r1: { name: 'p224', byteLength: 28 }, prime256v1: { name: 'p256', byteLength: 32 }, prime192v1: { name: 'p192', byteLength: 24 }, ed25519: { name: 'ed25519', byteLength: 32 }, secp384r1: { name: 'p384', byteLength: 48 }, secp521r1: { name: 'p521', byteLength: 66 } }; aliases.p224 = aliases.secp224r1; aliases.p256 = aliases.secp256r1 = aliases.prime256v1; aliases.p192 = aliases.secp192r1 = aliases.prime192v1; aliases.p384 = aliases.secp384r1; aliases.p521 = aliases.secp521r1; function ECDH(curve) { this.curveType = aliases[curve]; if (!this.curveType ) { this.curveType = { name: curve }; } this.curve = new elliptic.ec(this.curveType.name); this.keys = void 0; } ECDH.prototype.generateKeys = function (enc, format) { this.keys = this.curve.genKeyPair(); return this.getPublicKey(enc, format); }; ECDH.prototype.computeSecret = function (other, inenc, enc) { inenc = inenc || 'utf8'; if (!Buffer.isBuffer(other)) { other = new Buffer(other, inenc); } var otherPub = this.curve.keyFromPublic(other).getPublic(); var out = otherPub.mul(this.keys.getPrivate()).getX(); return formatReturnValue(out, enc, this.curveType.byteLength); }; ECDH.prototype.getPublicKey = function (enc, format) { var key = this.keys.getPublic(format === 'compressed', true); if (format === 'hybrid') { if (key[key.length - 1] % 2) { key[0] = 7; } else { key [0] = 6; } } return formatReturnValue(key, enc); }; ECDH.prototype.getPrivateKey = function (enc) { return formatReturnValue(this.keys.getPrivate(), enc); }; ECDH.prototype.setPublicKey = function (pub, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(pub)) { pub = new Buffer(pub, enc); } this.keys._importPublic(pub); return this; }; ECDH.prototype.setPrivateKey = function (priv, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(priv)) { priv = new Buffer(priv, enc); } var _priv = new BN(priv); _priv = _priv.toString(16); this.keys._importPrivate(_priv); return this; }; function formatReturnValue(bn, enc, len) { if (!Array.isArray(bn)) { bn = bn.toArray(); } var buf = new Buffer(bn); if (len && buf.length < len) { var zeros = new Buffer(len - buf.length); zeros.fill(0); buf = Buffer.concat([zeros, buf]); } if (!enc) { return buf; } else { return buf.toString(enc); } } }).call(this,require("buffer").Buffer) },{"bn.js":29,"buffer":61,"elliptic":125}],106:[function(require,module,exports){ (function (Buffer){ 'use strict'; var inherits = require('inherits') var md5 = require('./md5') var rmd160 = require('ripemd160') var sha = require('sha.js') var Base = require('cipher-base') function HashNoConstructor(hash) { Base.call(this, 'digest') this._hash = hash this.buffers = [] } inherits(HashNoConstructor, Base) HashNoConstructor.prototype._update = function (data) { this.buffers.push(data) } HashNoConstructor.prototype._final = function () { var buf = Buffer.concat(this.buffers) var r = this._hash(buf) this.buffers = null return r } function Hash(hash) { Base.call(this, 'digest') this._hash = hash } inherits(Hash, Base) Hash.prototype._update = function (data) { this._hash.update(data) } Hash.prototype._final = function () { return this._hash.digest() } module.exports = function createHash (alg) { alg = alg.toLowerCase() if ('md5' === alg) return new HashNoConstructor(md5) if ('rmd160' === alg || 'ripemd160' === alg) return new HashNoConstructor(rmd160) return new Hash(sha(alg)) } }).call(this,require("buffer").Buffer) },{"./md5":108,"buffer":61,"cipher-base":81,"inherits":167,"ripemd160":424,"sha.js":507}],107:[function(require,module,exports){ (function (Buffer){ 'use strict'; var intSize = 4; var zeroBuffer = new Buffer(intSize); zeroBuffer.fill(0); var chrsz = 8; function toArray(buf, bigEndian) { if ((buf.length % intSize) !== 0) { var len = buf.length + (intSize - (buf.length % intSize)); buf = Buffer.concat([buf, zeroBuffer], len); } var arr = []; var fn = bigEndian ? buf.readInt32BE : buf.readInt32LE; for (var i = 0; i < buf.length; i += intSize) { arr.push(fn.call(buf, i)); } return arr; } function toBuffer(arr, size, bigEndian) { var buf = new Buffer(size); var fn = bigEndian ? buf.writeInt32BE : buf.writeInt32LE; for (var i = 0; i < arr.length; i++) { fn.call(buf, arr[i], i * 4, true); } return buf; } function hash(buf, fn, hashSize, bigEndian) { if (!Buffer.isBuffer(buf)) buf = new Buffer(buf); var arr = fn(toArray(buf, bigEndian), buf.length * chrsz); return toBuffer(arr, hashSize, bigEndian); } exports.hash = hash; }).call(this,require("buffer").Buffer) },{"buffer":61}],108:[function(require,module,exports){ 'use strict'; /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as defined in RFC 1321. * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for more info. */ var helpers = require('./helpers'); /* * Calculate the MD5 of an array of little-endian words, and a bit length */ function core_md5(x, len) { /* append padding */ x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; for(var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); c = md5_ff(c, d, a, b, x[i+10], 17, -42063); b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); } return Array(a, b, c, d); } /* * These functions implement the four basic operations the algorithm uses. */ function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); } function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); } function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); } function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); } function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); } /* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */ function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } /* * Bitwise rotate a 32-bit number to the left. */ function bit_rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } module.exports = function md5(buf) { return helpers.hash(buf, core_md5, 16); }; },{"./helpers":107}],109:[function(require,module,exports){ (function (Buffer){ 'use strict'; var createHash = require('create-hash/browser'); var inherits = require('inherits') var Transform = require('stream').Transform var ZEROS = new Buffer(128) ZEROS.fill(0) function Hmac(alg, key) { Transform.call(this) alg = alg.toLowerCase() if (typeof key === 'string') { key = new Buffer(key) } var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 this._alg = alg this._key = key if (key.length > blocksize) { key = createHash(alg).update(key).digest() } else if (key.length < blocksize) { key = Buffer.concat([key, ZEROS], blocksize) } var ipad = this._ipad = new Buffer(blocksize) var opad = this._opad = new Buffer(blocksize) for (var i = 0; i < blocksize; i++) { ipad[i] = key[i] ^ 0x36 opad[i] = key[i] ^ 0x5C } this._hash = createHash(alg).update(ipad) } inherits(Hmac, Transform) Hmac.prototype.update = function (data, enc) { this._hash.update(data, enc) return this } Hmac.prototype._transform = function (data, _, next) { this._hash.update(data) next() } Hmac.prototype._flush = function (next) { this.push(this.digest()) next() } Hmac.prototype.digest = function (enc) { var h = this._hash.digest() return createHash(this._alg).update(this._opad).update(h).digest(enc) } module.exports = function createHmac(alg, key) { return new Hmac(alg, key) } }).call(this,require("buffer").Buffer) },{"buffer":61,"create-hash/browser":106,"inherits":167,"stream":576}],110:[function(require,module,exports){ 'use strict' exports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = require('randombytes') exports.createHash = exports.Hash = require('create-hash') exports.createHmac = exports.Hmac = require('create-hmac') var hashes = ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160'].concat(Object.keys(require('browserify-sign/algos'))) exports.getHashes = function () { return hashes } var p = require('pbkdf2') exports.pbkdf2 = p.pbkdf2 exports.pbkdf2Sync = p.pbkdf2Sync var aes = require('browserify-cipher') ;[ 'Cipher', 'createCipher', 'Cipheriv', 'createCipheriv', 'Decipher', 'createDecipher', 'Decipheriv', 'createDecipheriv', 'getCiphers', 'listCiphers' ].forEach(function (key) { exports[key] = aes[key] }) var dh = require('diffie-hellman') ;[ 'DiffieHellmanGroup', 'createDiffieHellmanGroup', 'getDiffieHellman', 'createDiffieHellman', 'DiffieHellman' ].forEach(function (key) { exports[key] = dh[key] }) var sign = require('browserify-sign') ;[ 'createSign', 'Sign', 'createVerify', 'Verify' ].forEach(function (key) { exports[key] = sign[key] }) exports.createECDH = require('create-ecdh') var publicEncrypt = require('public-encrypt') ;[ 'publicEncrypt', 'privateEncrypt', 'publicDecrypt', 'privateDecrypt' ].forEach(function (key) { exports[key] = publicEncrypt[key] }) // the least I can do is make error messages for the rest of the node.js/crypto api. ;[ 'createCredentials' ].forEach(function (name) { exports[name] = function () { throw new Error([ 'sorry, ' + name + ' is not implemented yet', 'we accept pull requests', 'https://github.com/crypto-browserify/crypto-browserify' ].join('\n')) } }) },{"browserify-cipher":49,"browserify-sign":54,"browserify-sign/algos":53,"create-ecdh":105,"create-hash":106,"create-hmac":109,"diffie-hellman":120,"pbkdf2":292,"public-encrypt":297,"randombytes":403}],111:[function(require,module,exports){ (function (Buffer){ /*! * @description Recursive object extending * @author Viacheslav Lotsmanov * @license MIT * * The MIT License (MIT) * * Copyright (c) 2013-2015 Viacheslav Lotsmanov * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 'use strict'; function isSpecificValue(val) { return ( val instanceof Buffer || val instanceof Date || val instanceof RegExp ) ? true : false; } function cloneSpecificValue(val) { if (val instanceof Buffer) { var x = new Buffer(val.length); val.copy(x); return x; } else if (val instanceof Date) { return new Date(val.getTime()); } else if (val instanceof RegExp) { return new RegExp(val); } else { throw new Error('Unexpected situation'); } } /** * Recursive cloning array. */ function deepCloneArray(arr) { var clone = []; arr.forEach(function (item, index) { if (typeof item === 'object' && item !== null) { if (Array.isArray(item)) { clone[index] = deepCloneArray(item); } else if (isSpecificValue(item)) { clone[index] = cloneSpecificValue(item); } else { clone[index] = deepExtend({}, item); } } else { clone[index] = item; } }); return clone; } /** * Extening object that entered in first argument. * * Returns extended object or false if have no target object or incorrect type. * * If you wish to clone source object (without modify it), just use empty new * object as first argument, like this: * deepExtend({}, yourObj_1, [yourObj_N]); */ var deepExtend = module.exports = function (/*obj_1, [obj_2], [obj_N]*/) { if (arguments.length < 1 || typeof arguments[0] !== 'object') { return false; } if (arguments.length < 2) { return arguments[0]; } var target = arguments[0]; // convert arguments to array and cut off target object var args = Array.prototype.slice.call(arguments, 1); var val, src, clone; args.forEach(function (obj) { // skip argument if it is array or isn't object if (typeof obj !== 'object' || Array.isArray(obj)) { return; } Object.keys(obj).forEach(function (key) { src = target[key]; // source value val = obj[key]; // new value // recursion prevention if (val === target) { return; /** * if new value isn't object then just overwrite by new value * instead of extending. */ } else if (typeof val !== 'object' || val === null) { target[key] = val; return; // just clone arrays (and recursive clone objects inside) } else if (Array.isArray(val)) { target[key] = deepCloneArray(val); return; // custom cloning and overwrite for specific objects } else if (isSpecificValue(val)) { target[key] = cloneSpecificValue(val); return; // overwrite by new value if source isn't object or array } else if (typeof src !== 'object' || src === null || Array.isArray(src)) { target[key] = deepExtend({}, val); return; // source value and new value is objects both, extending... } else { target[key] = deepExtend(src, val); return; } }); }); return target; } }).call(this,require("buffer").Buffer) },{"buffer":61}],112:[function(require,module,exports){ module.exports = function () { for (var i = 0; i < arguments.length; i++) { if (arguments[i] !== undefined) return arguments[i]; } }; },{}],113:[function(require,module,exports){ 'use strict'; exports.utils = require('./des/utils'); exports.Cipher = require('./des/cipher'); exports.DES = require('./des/des'); exports.CBC = require('./des/cbc'); exports.EDE = require('./des/ede'); },{"./des/cbc":114,"./des/cipher":115,"./des/des":116,"./des/ede":117,"./des/utils":118}],114:[function(require,module,exports){ 'use strict'; var assert = require('minimalistic-assert'); var inherits = require('inherits'); var proto = {}; function CBCState(iv) { assert.equal(iv.length, 8, 'Invalid IV length'); this.iv = new Array(8); for (var i = 0; i < this.iv.length; i++) this.iv[i] = iv[i]; } function instantiate(Base) { function CBC(options) { Base.call(this, options); this._cbcInit(); } inherits(CBC, Base); var keys = Object.keys(proto); for (var i = 0; i < keys.length; i++) { var key = keys[i]; CBC.prototype[key] = proto[key]; } CBC.create = function create(options) { return new CBC(options); }; return CBC; } exports.instantiate = instantiate; proto._cbcInit = function _cbcInit() { var state = new CBCState(this.options.iv); this._cbcState = state; }; proto._update = function _update(inp, inOff, out, outOff) { var state = this._cbcState; var superProto = this.constructor.super_.prototype; var iv = state.iv; if (this.type === 'encrypt') { for (var i = 0; i < this.blockSize; i++) iv[i] ^= inp[inOff + i]; superProto._update.call(this, iv, 0, out, outOff); for (var i = 0; i < this.blockSize; i++) iv[i] = out[outOff + i]; } else { superProto._update.call(this, inp, inOff, out, outOff); for (var i = 0; i < this.blockSize; i++) out[outOff + i] ^= iv[i]; for (var i = 0; i < this.blockSize; i++) iv[i] = inp[inOff + i]; } }; },{"inherits":167,"minimalistic-assert":246}],115:[function(require,module,exports){ 'use strict'; var assert = require('minimalistic-assert'); function Cipher(options) { this.options = options; this.type = this.options.type; this.blockSize = 8; this._init(); this.buffer = new Array(this.blockSize); this.bufferOff = 0; } module.exports = Cipher; Cipher.prototype._init = function _init() { // Might be overrided }; Cipher.prototype.update = function update(data) { if (data.length === 0) return []; if (this.type === 'decrypt') return this._updateDecrypt(data); else return this._updateEncrypt(data); }; Cipher.prototype._buffer = function _buffer(data, off) { // Append data to buffer var min = Math.min(this.buffer.length - this.bufferOff, data.length - off); for (var i = 0; i < min; i++) this.buffer[this.bufferOff + i] = data[off + i]; this.bufferOff += min; // Shift next return min; }; Cipher.prototype._flushBuffer = function _flushBuffer(out, off) { this._update(this.buffer, 0, out, off); this.bufferOff = 0; return this.blockSize; }; Cipher.prototype._updateEncrypt = function _updateEncrypt(data) { var inputOff = 0; var outputOff = 0; var count = ((this.bufferOff + data.length) / this.blockSize) | 0; var out = new Array(count * this.blockSize); if (this.bufferOff !== 0) { inputOff += this._buffer(data, inputOff); if (this.bufferOff === this.buffer.length) outputOff += this._flushBuffer(out, outputOff); } // Write blocks var max = data.length - ((data.length - inputOff) % this.blockSize); for (; inputOff < max; inputOff += this.blockSize) { this._update(data, inputOff, out, outputOff); outputOff += this.blockSize; } // Queue rest for (; inputOff < data.length; inputOff++, this.bufferOff++) this.buffer[this.bufferOff] = data[inputOff]; return out; }; Cipher.prototype._updateDecrypt = function _updateDecrypt(data) { var inputOff = 0; var outputOff = 0; var count = Math.ceil((this.bufferOff + data.length) / this.blockSize) - 1; var out = new Array(count * this.blockSize); // TODO(indutny): optimize it, this is far from optimal for (; count > 0; count--) { inputOff += this._buffer(data, inputOff); outputOff += this._flushBuffer(out, outputOff); } // Buffer rest of the input inputOff += this._buffer(data, inputOff); return out; }; Cipher.prototype.final = function final(buffer) { var first; if (buffer) first = this.update(buffer); var last; if (this.type === 'encrypt') last = this._finalEncrypt(); else last = this._finalDecrypt(); if (first) return first.concat(last); else return last; }; Cipher.prototype._pad = function _pad(buffer, off) { if (off === 0) return false; while (off < buffer.length) buffer[off++] = 0; return true; }; Cipher.prototype._finalEncrypt = function _finalEncrypt() { if (!this._pad(this.buffer, this.bufferOff)) return []; var out = new Array(this.blockSize); this._update(this.buffer, 0, out, 0); return out; }; Cipher.prototype._unpad = function _unpad(buffer) { return buffer; }; Cipher.prototype._finalDecrypt = function _finalDecrypt() { assert.equal(this.bufferOff, this.blockSize, 'Not enough data to decrypt'); var out = new Array(this.blockSize); this._flushBuffer(out, 0); return this._unpad(out); }; },{"minimalistic-assert":246}],116:[function(require,module,exports){ 'use strict'; var assert = require('minimalistic-assert'); var inherits = require('inherits'); var des = require('../des'); var utils = des.utils; var Cipher = des.Cipher; function DESState() { this.tmp = new Array(2); this.keys = null; } function DES(options) { Cipher.call(this, options); var state = new DESState(); this._desState = state; this.deriveKeys(state, options.key); } inherits(DES, Cipher); module.exports = DES; DES.create = function create(options) { return new DES(options); }; var shiftTable = [ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 ]; DES.prototype.deriveKeys = function deriveKeys(state, key) { state.keys = new Array(16 * 2); assert.equal(key.length, this.blockSize, 'Invalid key length'); var kL = utils.readUInt32BE(key, 0); var kR = utils.readUInt32BE(key, 4); utils.pc1(kL, kR, state.tmp, 0); kL = state.tmp[0]; kR = state.tmp[1]; for (var i = 0; i < state.keys.length; i += 2) { var shift = shiftTable[i >>> 1]; kL = utils.r28shl(kL, shift); kR = utils.r28shl(kR, shift); utils.pc2(kL, kR, state.keys, i); } }; DES.prototype._update = function _update(inp, inOff, out, outOff) { var state = this._desState; var l = utils.readUInt32BE(inp, inOff); var r = utils.readUInt32BE(inp, inOff + 4); // Initial Permutation utils.ip(l, r, state.tmp, 0); l = state.tmp[0]; r = state.tmp[1]; if (this.type === 'encrypt') this._encrypt(state, l, r, state.tmp, 0); else this._decrypt(state, l, r, state.tmp, 0); l = state.tmp[0]; r = state.tmp[1]; utils.writeUInt32BE(out, l, outOff); utils.writeUInt32BE(out, r, outOff + 4); }; DES.prototype._pad = function _pad(buffer, off) { var value = buffer.length - off; for (var i = off; i < buffer.length; i++) buffer[i] = value; return true; }; DES.prototype._unpad = function _unpad(buffer) { var pad = buffer[buffer.length - 1]; for (var i = buffer.length - pad; i < buffer.length; i++) assert.equal(buffer[i], pad); return buffer.slice(0, buffer.length - pad); }; DES.prototype._encrypt = function _encrypt(state, lStart, rStart, out, off) { var l = lStart; var r = rStart; // Apply f() x16 times for (var i = 0; i < state.keys.length; i += 2) { var keyL = state.keys[i]; var keyR = state.keys[i + 1]; // f(r, k) utils.expand(r, state.tmp, 0); keyL ^= state.tmp[0]; keyR ^= state.tmp[1]; var s = utils.substitute(keyL, keyR); var f = utils.permute(s); var t = r; r = (l ^ f) >>> 0; l = t; } // Reverse Initial Permutation utils.rip(r, l, out, off); }; DES.prototype._decrypt = function _decrypt(state, lStart, rStart, out, off) { var l = rStart; var r = lStart; // Apply f() x16 times for (var i = state.keys.length - 2; i >= 0; i -= 2) { var keyL = state.keys[i]; var keyR = state.keys[i + 1]; // f(r, k) utils.expand(l, state.tmp, 0); keyL ^= state.tmp[0]; keyR ^= state.tmp[1]; var s = utils.substitute(keyL, keyR); var f = utils.permute(s); var t = l; l = (r ^ f) >>> 0; r = t; } // Reverse Initial Permutation utils.rip(l, r, out, off); }; },{"../des":113,"inherits":167,"minimalistic-assert":246}],117:[function(require,module,exports){ 'use strict'; var assert = require('minimalistic-assert'); var inherits = require('inherits'); var des = require('../des'); var Cipher = des.Cipher; var DES = des.DES; function EDEState(type, key) { assert.equal(key.length, 24, 'Invalid key length'); var k1 = key.slice(0, 8); var k2 = key.slice(8, 16); var k3 = key.slice(16, 24); if (type === 'encrypt') { this.ciphers = [ DES.create({ type: 'encrypt', key: k1 }), DES.create({ type: 'decrypt', key: k2 }), DES.create({ type: 'encrypt', key: k3 }) ]; } else { this.ciphers = [ DES.create({ type: 'decrypt', key: k3 }), DES.create({ type: 'encrypt', key: k2 }), DES.create({ type: 'decrypt', key: k1 }) ]; } } function EDE(options) { Cipher.call(this, options); var state = new EDEState(this.type, this.options.key); this._edeState = state; } inherits(EDE, Cipher); module.exports = EDE; EDE.create = function create(options) { return new EDE(options); }; EDE.prototype._update = function _update(inp, inOff, out, outOff) { var state = this._edeState; state.ciphers[0]._update(inp, inOff, out, outOff); state.ciphers[1]._update(out, outOff, out, outOff); state.ciphers[2]._update(out, outOff, out, outOff); }; EDE.prototype._pad = DES.prototype._pad; EDE.prototype._unpad = DES.prototype._unpad; },{"../des":113,"inherits":167,"minimalistic-assert":246}],118:[function(require,module,exports){ 'use strict'; exports.readUInt32BE = function readUInt32BE(bytes, off) { var res = (bytes[0 + off] << 24) | (bytes[1 + off] << 16) | (bytes[2 + off] << 8) | bytes[3 + off]; return res >>> 0; }; exports.writeUInt32BE = function writeUInt32BE(bytes, value, off) { bytes[0 + off] = value >>> 24; bytes[1 + off] = (value >>> 16) & 0xff; bytes[2 + off] = (value >>> 8) & 0xff; bytes[3 + off] = value & 0xff; }; exports.ip = function ip(inL, inR, out, off) { var outL = 0; var outR = 0; for (var i = 6; i >= 0; i -= 2) { for (var j = 0; j <= 24; j += 8) { outL <<= 1; outL |= (inR >>> (j + i)) & 1; } for (var j = 0; j <= 24; j += 8) { outL <<= 1; outL |= (inL >>> (j + i)) & 1; } } for (var i = 6; i >= 0; i -= 2) { for (var j = 1; j <= 25; j += 8) { outR <<= 1; outR |= (inR >>> (j + i)) & 1; } for (var j = 1; j <= 25; j += 8) { outR <<= 1; outR |= (inL >>> (j + i)) & 1; } } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.rip = function rip(inL, inR, out, off) { var outL = 0; var outR = 0; for (var i = 0; i < 4; i++) { for (var j = 24; j >= 0; j -= 8) { outL <<= 1; outL |= (inR >>> (j + i)) & 1; outL <<= 1; outL |= (inL >>> (j + i)) & 1; } } for (var i = 4; i < 8; i++) { for (var j = 24; j >= 0; j -= 8) { outR <<= 1; outR |= (inR >>> (j + i)) & 1; outR <<= 1; outR |= (inL >>> (j + i)) & 1; } } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.pc1 = function pc1(inL, inR, out, off) { var outL = 0; var outR = 0; // 7, 15, 23, 31, 39, 47, 55, 63 // 6, 14, 22, 30, 39, 47, 55, 63 // 5, 13, 21, 29, 39, 47, 55, 63 // 4, 12, 20, 28 for (var i = 7; i >= 5; i--) { for (var j = 0; j <= 24; j += 8) { outL <<= 1; outL |= (inR >> (j + i)) & 1; } for (var j = 0; j <= 24; j += 8) { outL <<= 1; outL |= (inL >> (j + i)) & 1; } } for (var j = 0; j <= 24; j += 8) { outL <<= 1; outL |= (inR >> (j + i)) & 1; } // 1, 9, 17, 25, 33, 41, 49, 57 // 2, 10, 18, 26, 34, 42, 50, 58 // 3, 11, 19, 27, 35, 43, 51, 59 // 36, 44, 52, 60 for (var i = 1; i <= 3; i++) { for (var j = 0; j <= 24; j += 8) { outR <<= 1; outR |= (inR >> (j + i)) & 1; } for (var j = 0; j <= 24; j += 8) { outR <<= 1; outR |= (inL >> (j + i)) & 1; } } for (var j = 0; j <= 24; j += 8) { outR <<= 1; outR |= (inL >> (j + i)) & 1; } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.r28shl = function r28shl(num, shift) { return ((num << shift) & 0xfffffff) | (num >>> (28 - shift)); }; var pc2table = [ // inL => outL 14, 11, 17, 4, 27, 23, 25, 0, 13, 22, 7, 18, 5, 9, 16, 24, 2, 20, 12, 21, 1, 8, 15, 26, // inR => outR 15, 4, 25, 19, 9, 1, 26, 16, 5, 11, 23, 8, 12, 7, 17, 0, 22, 3, 10, 14, 6, 20, 27, 24 ]; exports.pc2 = function pc2(inL, inR, out, off) { var outL = 0; var outR = 0; var len = pc2table.length >>> 1; for (var i = 0; i < len; i++) { outL <<= 1; outL |= (inL >>> pc2table[i]) & 0x1; } for (var i = len; i < pc2table.length; i++) { outR <<= 1; outR |= (inR >>> pc2table[i]) & 0x1; } out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; exports.expand = function expand(r, out, off) { var outL = 0; var outR = 0; outL = ((r & 1) << 5) | (r >>> 27); for (var i = 23; i >= 15; i -= 4) { outL <<= 6; outL |= (r >>> i) & 0x3f; } for (var i = 11; i >= 3; i -= 4) { outR |= (r >>> i) & 0x3f; outR <<= 6; } outR |= ((r & 0x1f) << 1) | (r >>> 31); out[off + 0] = outL >>> 0; out[off + 1] = outR >>> 0; }; var sTable = [ 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8, 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13, 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5, 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9, 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1, 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12, 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9, 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14, 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6, 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3, 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8, 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13, 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6, 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12, 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11 ]; exports.substitute = function substitute(inL, inR) { var out = 0; for (var i = 0; i < 4; i++) { var b = (inL >>> (18 - i * 6)) & 0x3f; var sb = sTable[i * 0x40 + b]; out <<= 4; out |= sb; } for (var i = 0; i < 4; i++) { var b = (inR >>> (18 - i * 6)) & 0x3f; var sb = sTable[4 * 0x40 + i * 0x40 + b]; out <<= 4; out |= sb; } return out >>> 0; }; var permuteTable = [ 16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7 ]; exports.permute = function permute(num) { var out = 0; for (var i = 0; i < permuteTable.length; i++) { out <<= 1; out |= (num >>> permuteTable[i]) & 0x1; } return out >>> 0; }; exports.padSplit = function padSplit(num, size, group) { var str = num.toString(2); while (str.length < size) str = '0' + str; var out = []; for (var i = 0; i < size; i += group) out.push(str.slice(i, i + group)); return out.join(' '); }; },{}],119:[function(require,module,exports){ 'use strict'; /* * Dependencies. */ var repeat = require('repeat-string'); /* * Constants. */ var TAB = '\t'; var NEWLINE = '\n'; var SPACE = ' '; /** * Replace tabs with spaces, being smart about which * column the tab is at and which size should be used. * * @example * detab('\tfoo\nbar\tbaz'); // ' foo\nbar baz' * detab('\tfoo\nbar\tbaz', 2); // ' foo\nbar baz' * detab('\tfoo\nbar\tbaz', 8); // ' foo\nbar baz' * * @param {string} value - Value with tabs. * @param {number?} [size=4] - Tab-size. * @return {string} - Value without tabs. */ function detab(value, size) { var string = typeof value === 'string'; var length = string && value.length; var index = -1; var column = -1; var tabSize = size || 4; var result = ''; var character; var add; if (!string) { throw new Error('detab expected string'); } while (++index < length) { character = value.charAt(index); if (character === TAB) { add = tabSize - ((column + 1) % tabSize); result += repeat(SPACE, add); column += add; continue; } if (character === NEWLINE) { column = -1; } else { column++; } result += character; } return result; } /* * Expose. */ module.exports = detab; },{"repeat-string":422}],120:[function(require,module,exports){ (function (Buffer){ var generatePrime = require('./lib/generatePrime') var primes = require('./lib/primes.json') var DH = require('./lib/dh') function getDiffieHellman (mod) { var prime = new Buffer(primes[mod].prime, 'hex') var gen = new Buffer(primes[mod].gen, 'hex') return new DH(prime, gen) } var ENCODINGS = { 'binary': true, 'hex': true, 'base64': true } function createDiffieHellman (prime, enc, generator, genc) { if (Buffer.isBuffer(enc) || ENCODINGS[enc] === undefined) { return createDiffieHellman(prime, 'binary', enc, generator) } enc = enc || 'binary' genc = genc || 'binary' generator = generator || new Buffer([2]) if (!Buffer.isBuffer(generator)) { generator = new Buffer(generator, genc) } if (typeof prime === 'number') { return new DH(generatePrime(prime, generator), generator, true) } if (!Buffer.isBuffer(prime)) { prime = new Buffer(prime, enc) } return new DH(prime, generator, true) } exports.DiffieHellmanGroup = exports.createDiffieHellmanGroup = exports.getDiffieHellman = getDiffieHellman exports.createDiffieHellman = exports.DiffieHellman = createDiffieHellman }).call(this,require("buffer").Buffer) },{"./lib/dh":121,"./lib/generatePrime":122,"./lib/primes.json":123,"buffer":61}],121:[function(require,module,exports){ (function (Buffer){ var BN = require('bn.js'); var MillerRabin = require('miller-rabin'); var millerRabin = new MillerRabin(); var TWENTYFOUR = new BN(24); var ELEVEN = new BN(11); var TEN = new BN(10); var THREE = new BN(3); var SEVEN = new BN(7); var primes = require('./generatePrime'); var randomBytes = require('randombytes'); module.exports = DH; function setPublicKey(pub, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(pub)) { pub = new Buffer(pub, enc); } this._pub = new BN(pub); return this; } function setPrivateKey(priv, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(priv)) { priv = new Buffer(priv, enc); } this._priv = new BN(priv); return this; } var primeCache = {}; function checkPrime(prime, generator) { var gen = generator.toString('hex'); var hex = [gen, prime.toString(16)].join('_'); if (hex in primeCache) { return primeCache[hex]; } var error = 0; if (prime.isEven() || !primes.simpleSieve || !primes.fermatTest(prime) || !millerRabin.test(prime)) { //not a prime so +1 error += 1; if (gen === '02' || gen === '05') { // we'd be able to check the generator // it would fail so +8 error += 8; } else { //we wouldn't be able to test the generator // so +4 error += 4; } primeCache[hex] = error; return error; } if (!millerRabin.test(prime.shrn(1))) { //not a safe prime error += 2; } var rem; switch (gen) { case '02': if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) { // unsuidable generator error += 8; } break; case '05': rem = prime.mod(TEN); if (rem.cmp(THREE) && rem.cmp(SEVEN)) { // prime mod 10 needs to equal 3 or 7 error += 8; } break; default: error += 4; } primeCache[hex] = error; return error; } function DH(prime, generator, malleable) { this.setGenerator(generator); this.__prime = new BN(prime); this._prime = BN.mont(this.__prime); this._primeLen = prime.length; this._pub = undefined; this._priv = undefined; this._primeCode = undefined; if (malleable) { this.setPublicKey = setPublicKey; this.setPrivateKey = setPrivateKey; } else { this._primeCode = 8; } } Object.defineProperty(DH.prototype, 'verifyError', { enumerable: true, get: function () { if (typeof this._primeCode !== 'number') { this._primeCode = checkPrime(this.__prime, this.__gen); } return this._primeCode; } }); DH.prototype.generateKeys = function () { if (!this._priv) { this._priv = new BN(randomBytes(this._primeLen)); } this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed(); return this.getPublicKey(); }; DH.prototype.computeSecret = function (other) { other = new BN(other); other = other.toRed(this._prime); var secret = other.redPow(this._priv).fromRed(); var out = new Buffer(secret.toArray()); var prime = this.getPrime(); if (out.length < prime.length) { var front = new Buffer(prime.length - out.length); front.fill(0); out = Buffer.concat([front, out]); } return out; }; DH.prototype.getPublicKey = function getPublicKey(enc) { return formatReturnValue(this._pub, enc); }; DH.prototype.getPrivateKey = function getPrivateKey(enc) { return formatReturnValue(this._priv, enc); }; DH.prototype.getPrime = function (enc) { return formatReturnValue(this.__prime, enc); }; DH.prototype.getGenerator = function (enc) { return formatReturnValue(this._gen, enc); }; DH.prototype.setGenerator = function (gen, enc) { enc = enc || 'utf8'; if (!Buffer.isBuffer(gen)) { gen = new Buffer(gen, enc); } this.__gen = gen; this._gen = new BN(gen); return this; }; function formatReturnValue(bn, enc) { var buf = new Buffer(bn.toArray()); if (!enc) { return buf; } else { return buf.toString(enc); } } }).call(this,require("buffer").Buffer) },{"./generatePrime":122,"bn.js":29,"buffer":61,"miller-rabin":242,"randombytes":403}],122:[function(require,module,exports){ var randomBytes = require('randombytes'); module.exports = findPrime; findPrime.simpleSieve = simpleSieve; findPrime.fermatTest = fermatTest; var BN = require('bn.js'); var TWENTYFOUR = new BN(24); var MillerRabin = require('miller-rabin'); var millerRabin = new MillerRabin(); var ONE = new BN(1); var TWO = new BN(2); var FIVE = new BN(5); var SIXTEEN = new BN(16); var EIGHT = new BN(8); var TEN = new BN(10); var THREE = new BN(3); var SEVEN = new BN(7); var ELEVEN = new BN(11); var FOUR = new BN(4); var TWELVE = new BN(12); var primes = null; function _getPrimes() { if (primes !== null) return primes; var limit = 0x100000; var res = []; res[0] = 2; for (var i = 1, k = 3; k < limit; k += 2) { var sqrt = Math.ceil(Math.sqrt(k)); for (var j = 0; j < i && res[j] <= sqrt; j++) if (k % res[j] === 0) break; if (i !== j && res[j] <= sqrt) continue; res[i++] = k; } primes = res; return res; } function simpleSieve(p) { var primes = _getPrimes(); for (var i = 0; i < primes.length; i++) if (p.modn(primes[i]) === 0) { if (p.cmpn(primes[i]) === 0) { return true; } else { return false; } } return true; } function fermatTest(p) { var red = BN.mont(p); return TWO.toRed(red).redPow(p.subn(1)).fromRed().cmpn(1) === 0; } function findPrime(bits, gen) { if (bits < 16) { // this is what openssl does if (gen === 2 || gen === 5) { return new BN([0x8c, 0x7b]); } else { return new BN([0x8c, 0x27]); } } gen = new BN(gen); var num, n2; while (true) { num = new BN(randomBytes(Math.ceil(bits / 8))); while (num.bitLength() > bits) { num.ishrn(1); } if (num.isEven()) { num.iadd(ONE); } if (!num.testn(1)) { num.iadd(TWO); } if (!gen.cmp(TWO)) { while (num.mod(TWENTYFOUR).cmp(ELEVEN)) { num.iadd(FOUR); } } else if (!gen.cmp(FIVE)) { while (num.mod(TEN).cmp(THREE)) { num.iadd(FOUR); } } n2 = num.shrn(1); if (simpleSieve(n2) && simpleSieve(num) && fermatTest(n2) && fermatTest(num) && millerRabin.test(n2) && millerRabin.test(num)) { return num; } } } },{"bn.js":29,"miller-rabin":242,"randombytes":403}],123:[function(require,module,exports){ module.exports={ "modp1": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff" }, "modp2": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff" }, "modp5": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff" }, "modp14": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff" }, "modp15": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff" }, "modp16": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff" }, "modp17": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff" }, "modp18": { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff" } } },{}],124:[function(require,module,exports){ // Simple wrapper around SJCL's ECC Implementation - v0.3.0 - https://github.com/jpillora/eccjs // Jaime Pillora - MIT/BSD(sljc) Copyright 2014 (function(window,undefined) {/** @fileOverview Javascript cryptography implementation. * * Crush to remove comments, shorten variable names and * generally reduce transmission size. * * @author Emily Stark * @author Mike Hamburg * @author Dan Boneh */ "use strict"; /*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */ /*global document, window, escape, unescape, module, require, Uint32Array */ /** @namespace The Stanford Javascript Crypto Library, top-level namespace. */ var sjcl = { /** @namespace Symmetric ciphers. */ cipher: {}, /** @namespace Hash functions. Right now only SHA256 is implemented. */ hash: {}, /** @namespace Key exchange functions. Right now only SRP is implemented. */ keyexchange: {}, /** @namespace Block cipher modes of operation. */ mode: {}, /** @namespace Miscellaneous. HMAC and PBKDF2. */ misc: {}, /** * @namespace Bit array encoders and decoders. * * @description * The members of this namespace are functions which translate between * SJCL's bitArrays and other objects (usually strings). Because it * isn't always clear which direction is encoding and which is decoding, * the method names are "fromBits" and "toBits". */ codec: {}, /** @namespace Exceptions. */ exception: { /** @constructor Ciphertext is corrupt. */ corrupt: function(message) { this.toString = function() { return "CORRUPT: "+this.message; }; this.message = message; }, /** @constructor Invalid parameter. */ invalid: function(message) { this.toString = function() { return "INVALID: "+this.message; }; this.message = message; }, /** @constructor Bug or missing feature in SJCL. @constructor */ bug: function(message) { this.toString = function() { return "BUG: "+this.message; }; this.message = message; }, /** @constructor Something isn't ready. */ notReady: function(message) { this.toString = function() { return "NOT READY: "+this.message; }; this.message = message; } } }; /** @fileOverview Low-level AES implementation. * * This file contains a low-level implementation of AES, optimized for * size and for efficiency on several browsers. It is based on * OpenSSL's aes_core.c, a public-domain implementation by Vincent * Rijmen, Antoon Bosselaers and Paulo Barreto. * * An older version of this implementation is available in the public * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh, * Stanford University 2008-2010 and BSD-licensed for liability * reasons. * * @author Emily Stark * @author Mike Hamburg * @author Dan Boneh */ /** * Schedule out an AES key for both encryption and decryption. This * is a low-level class. Use a cipher mode to do bulk encryption. * * @constructor * @param {Array} key The key as an array of 4, 6 or 8 words. * * @class Advanced Encryption Standard (low-level interface) */ sjcl.cipher.aes = function (key) { if (!this._tables[0][0][0]) { this._precompute(); } var i, j, tmp, encKey, decKey, sbox = this._tables[0][4], decTable = this._tables[1], keyLen = key.length, rcon = 1; if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) { throw new sjcl.exception.invalid("invalid aes key size"); } this._key = [encKey = key.slice(0), decKey = []]; // schedule encryption keys for (i = keyLen; i < 4 * keyLen + 28; i++) { tmp = encKey[i-1]; // apply sbox if (i%keyLen === 0 || (keyLen === 8 && i%keyLen === 4)) { tmp = sbox[tmp>>>24]<<24 ^ sbox[tmp>>16&255]<<16 ^ sbox[tmp>>8&255]<<8 ^ sbox[tmp&255]; // shift rows and add rcon if (i%keyLen === 0) { tmp = tmp<<8 ^ tmp>>>24 ^ rcon<<24; rcon = rcon<<1 ^ (rcon>>7)*283; } } encKey[i] = encKey[i-keyLen] ^ tmp; } // schedule decryption keys for (j = 0; i; j++, i--) { tmp = encKey[j&3 ? i : i - 4]; if (i<=4 || j<4) { decKey[j] = tmp; } else { decKey[j] = decTable[0][sbox[tmp>>>24 ]] ^ decTable[1][sbox[tmp>>16 & 255]] ^ decTable[2][sbox[tmp>>8 & 255]] ^ decTable[3][sbox[tmp & 255]]; } } }; sjcl.cipher.aes.prototype = { // public /* Something like this might appear here eventually name: "AES", blockSize: 4, keySizes: [4,6,8], */ /** * Encrypt an array of 4 big-endian words. * @param {Array} data The plaintext. * @return {Array} The ciphertext. */ encrypt:function (data) { return this._crypt(data,0); }, /** * Decrypt an array of 4 big-endian words. * @param {Array} data The ciphertext. * @return {Array} The plaintext. */ decrypt:function (data) { return this._crypt(data,1); }, /** * The expanded S-box and inverse S-box tables. These will be computed * on the client so that we don't have to send them down the wire. * * There are two tables, _tables[0] is for encryption and * _tables[1] is for decryption. * * The first 4 sub-tables are the expanded S-box with MixColumns. The * last (_tables[01][4]) is the S-box itself. * * @private */ _tables: [[[],[],[],[],[]],[[],[],[],[],[]]], /** * Expand the S-box tables. * * @private */ _precompute: function () { var encTable = this._tables[0], decTable = this._tables[1], sbox = encTable[4], sboxInv = decTable[4], i, x, xInv, d=[], th=[], x2, x4, x8, s, tEnc, tDec; // Compute double and third tables for (i = 0; i < 256; i++) { th[( d[i] = i<<1 ^ (i>>7)*283 )^i]=i; } for (x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) { // Compute sbox s = xInv ^ xInv<<1 ^ xInv<<2 ^ xInv<<3 ^ xInv<<4; s = s>>8 ^ s&255 ^ 99; sbox[x] = s; sboxInv[s] = x; // Compute MixColumns x8 = d[x4 = d[x2 = d[x]]]; tDec = x8*0x1010101 ^ x4*0x10001 ^ x2*0x101 ^ x*0x1010100; tEnc = d[s]*0x101 ^ s*0x1010100; for (i = 0; i < 4; i++) { encTable[i][x] = tEnc = tEnc<<24 ^ tEnc>>>8; decTable[i][s] = tDec = tDec<<24 ^ tDec>>>8; } } // Compactify. Considerable speedup on Firefox. for (i = 0; i < 5; i++) { encTable[i] = encTable[i].slice(0); decTable[i] = decTable[i].slice(0); } }, /** * Encryption and decryption core. * @param {Array} input Four words to be encrypted or decrypted. * @param dir The direction, 0 for encrypt and 1 for decrypt. * @return {Array} The four encrypted or decrypted words. * @private */ _crypt:function (input, dir) { if (input.length !== 4) { throw new sjcl.exception.invalid("invalid aes block size"); } var key = this._key[dir], // state variables a,b,c,d are loaded with pre-whitened data a = input[0] ^ key[0], b = input[dir ? 3 : 1] ^ key[1], c = input[2] ^ key[2], d = input[dir ? 1 : 3] ^ key[3], a2, b2, c2, nInnerRounds = key.length/4 - 2, i, kIndex = 4, out = [0,0,0,0], table = this._tables[dir], // load up the tables t0 = table[0], t1 = table[1], t2 = table[2], t3 = table[3], sbox = table[4]; // Inner rounds. Cribbed from OpenSSL. for (i = 0; i < nInnerRounds; i++) { a2 = t0[a>>>24] ^ t1[b>>16 & 255] ^ t2[c>>8 & 255] ^ t3[d & 255] ^ key[kIndex]; b2 = t0[b>>>24] ^ t1[c>>16 & 255] ^ t2[d>>8 & 255] ^ t3[a & 255] ^ key[kIndex + 1]; c2 = t0[c>>>24] ^ t1[d>>16 & 255] ^ t2[a>>8 & 255] ^ t3[b & 255] ^ key[kIndex + 2]; d = t0[d>>>24] ^ t1[a>>16 & 255] ^ t2[b>>8 & 255] ^ t3[c & 255] ^ key[kIndex + 3]; kIndex += 4; a=a2; b=b2; c=c2; } // Last round. for (i = 0; i < 4; i++) { out[dir ? 3&-i : i] = sbox[a>>>24 ]<<24 ^ sbox[b>>16 & 255]<<16 ^ sbox[c>>8 & 255]<<8 ^ sbox[d & 255] ^ key[kIndex++]; a2=a; a=b; b=c; c=d; d=a2; } return out; } }; /** @fileOverview Arrays of bits, encoded as arrays of Numbers. * * @author Emily Stark * @author Mike Hamburg * @author Dan Boneh */ /** @namespace Arrays of bits, encoded as arrays of Numbers. * * @description *

* These objects are the currency accepted by SJCL's crypto functions. *

* *

* Most of our crypto primitives operate on arrays of 4-byte words internally, * but many of them can take arguments that are not a multiple of 4 bytes. * This library encodes arrays of bits (whose size need not be a multiple of 8 * bits) as arrays of 32-bit words. The bits are packed, big-endian, into an * array of words, 32 bits at a time. Since the words are double-precision * floating point numbers, they fit some extra data. We use this (in a private, * possibly-changing manner) to encode the number of bits actually present * in the last word of the array. *

* *

* Because bitwise ops clear this out-of-band data, these arrays can be passed * to ciphers like AES which want arrays of words. *

*/ sjcl.bitArray = { /** * Array slices in units of bits. * @param {bitArray} a The array to slice. * @param {Number} bstart The offset to the start of the slice, in bits. * @param {Number} bend The offset to the end of the slice, in bits. If this is undefined, * slice until the end of the array. * @return {bitArray} The requested slice. */ bitSlice: function (a, bstart, bend) { a = sjcl.bitArray._shiftRight(a.slice(bstart/32), 32 - (bstart & 31)).slice(1); return (bend === undefined) ? a : sjcl.bitArray.clamp(a, bend-bstart); }, /** * Extract a number packed into a bit array. * @param {bitArray} a The array to slice. * @param {Number} bstart The offset to the start of the slice, in bits. * @param {Number} length The length of the number to extract. * @return {Number} The requested slice. */ extract: function(a, bstart, blength) { // FIXME: this Math.floor is not necessary at all, but for some reason // seems to suppress a bug in the Chromium JIT. var x, sh = Math.floor((-bstart-blength) & 31); if ((bstart + blength - 1 ^ bstart) & -32) { // it crosses a boundary x = (a[bstart/32|0] << (32 - sh)) ^ (a[bstart/32+1|0] >>> sh); } else { // within a single word x = a[bstart/32|0] >>> sh; } return x & ((1< 0 && len) { a[l-1] = sjcl.bitArray.partial(len, a[l-1] & 0x80000000 >> (len-1), 1); } return a; }, /** * Make a partial word for a bit array. * @param {Number} len The number of bits in the word. * @param {Number} x The bits. * @param {Number} [0] _end Pass 1 if x has already been shifted to the high side. * @return {Number} The partial word. */ partial: function (len, x, _end) { if (len === 32) { return x; } return (_end ? x|0 : x << (32-len)) + len * 0x10000000000; }, /** * Get the number of bits used by a partial word. * @param {Number} x The partial word. * @return {Number} The number of bits used by the partial word. */ getPartial: function (x) { return Math.round(x/0x10000000000) || 32; }, /** * Compare two arrays for equality in a predictable amount of time. * @param {bitArray} a The first array. * @param {bitArray} b The second array. * @return {boolean} true if a == b; false otherwise. */ equal: function (a, b) { if (sjcl.bitArray.bitLength(a) !== sjcl.bitArray.bitLength(b)) { return false; } var x = 0, i; for (i=0; i= 32; shift -= 32) { out.push(carry); carry = 0; } if (shift === 0) { return out.concat(a); } for (i=0; i>>shift); carry = a[i] << (32-shift); } last2 = a.length ? a[a.length-1] : 0; shift2 = sjcl.bitArray.getPartial(last2); out.push(sjcl.bitArray.partial(shift+shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(),1)); return out; }, /** xor a block of 4 words together. * @private */ _xor4: function(x,y) { return [x[0]^y[0],x[1]^y[1],x[2]^y[2],x[3]^y[3]]; } }; /** @fileOverview Bit array codec implementations. * * @author Emily Stark * @author Mike Hamburg * @author Dan Boneh */ /** @namespace UTF-8 strings */ sjcl.codec.utf8String = { /** Convert from a bitArray to a UTF-8 string. */ fromBits: function (arr) { var out = "", bl = sjcl.bitArray.bitLength(arr), i, tmp; for (i=0; i>> 24); tmp <<= 8; } return decodeURIComponent(escape(out)); }, /** Convert from a UTF-8 string to a bitArray. */ toBits: function (str) { str = unescape(encodeURIComponent(str)); var out = [], i, tmp=0; for (i=0; i>>bits) >>> 26); if (bits < 6) { ta = arr[i] << (6-bits); bits += 26; i++; } else { ta <<= 6; bits -= 6; } } while ((out.length & 3) && !_noEquals) { out += "="; } return out; }, /** Convert from a base64 string to a bitArray */ toBits: function(str, _url) { str = str.replace(/\s|=/g,''); var out = [], i, bits=0, c = sjcl.codec.base64._chars, ta=0, x; if (_url) { c = c.substr(0,62) + '-_'; } for (i=0; i 26) { bits -= 26; out.push(ta ^ x>>>bits); ta = x << (32-bits); } else { bits += 6; ta ^= x << (32-bits); } } if (bits&56) { out.push(sjcl.bitArray.partial(bits&56, ta, 1)); } return out; } }; sjcl.codec.base64url = { fromBits: function (arr) { return sjcl.codec.base64.fromBits(arr,1,1); }, toBits: function (str) { return sjcl.codec.base64.toBits(str,1); } }; /** @fileOverview Javascript SHA-256 implementation. * * An older version of this implementation is available in the public * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh, * Stanford University 2008-2010 and BSD-licensed for liability * reasons. * * Special thanks to Aldo Cortesi for pointing out several bugs in * this code. * * @author Emily Stark * @author Mike Hamburg * @author Dan Boneh */ /** * Context for a SHA-256 operation in progress. * @constructor * @class Secure Hash Algorithm, 256 bits. */ sjcl.hash.sha256 = function (hash) { if (!this._key[0]) { this._precompute(); } if (hash) { this._h = hash._h.slice(0); this._buffer = hash._buffer.slice(0); this._length = hash._length; } else { this.reset(); } }; /** * Hash a string or an array of words. * @static * @param {bitArray|String} data the data to hash. * @return {bitArray} The hash value, an array of 16 big-endian words. */ sjcl.hash.sha256.hash = function (data) { return (new sjcl.hash.sha256()).update(data).finalize(); }; sjcl.hash.sha256.prototype = { /** * The hash's block size, in bits. * @constant */ blockSize: 512, /** * Reset the hash state. * @return this */ reset:function () { this._h = this._init.slice(0); this._buffer = []; this._length = 0; return this; }, /** * Input several words to the hash. * @param {bitArray|String} data the data to hash. * @return this */ update: function (data) { if (typeof data === "string") { data = sjcl.codec.utf8String.toBits(data); } var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data), ol = this._length, nl = this._length = ol + sjcl.bitArray.bitLength(data); for (i = 512+ol & -512; i <= nl; i+= 512) { this._block(b.splice(0,16)); } return this; }, /** * Complete hashing and output the hash value. * @return {bitArray} The hash value, an array of 8 big-endian words. */ finalize:function () { var i, b = this._buffer, h = this._h; // Round out and push the buffer b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1,1)]); // Round out the buffer to a multiple of 16 words, less the 2 length words. for (i = b.length + 2; i & 15; i++) { b.push(0); } // append the length b.push(Math.floor(this._length / 0x100000000)); b.push(this._length | 0); while (b.length) { this._block(b.splice(0,16)); } this.reset(); return h; }, /** * The SHA-256 initialization vector, to be precomputed. * @private */ _init:[], /* _init:[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19], */ /** * The SHA-256 hash key, to be precomputed. * @private */ _key:[], /* _key: [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2], */ /** * Function to precompute _init and _key. * @private */ _precompute: function () { var i = 0, prime = 2, factor; function frac(x) { return (x-Math.floor(x)) * 0x100000000 | 0; } outer: for (; i<64; prime++) { for (factor=2; factor*factor <= prime; factor++) { if (prime % factor === 0) { // not a prime continue outer; } } if (i<8) { this._init[i] = frac(Math.pow(prime, 1/2)); } this._key[i] = frac(Math.pow(prime, 1/3)); i++; } }, /** * Perform one cycle of SHA-256. * @param {bitArray} words one block of words. * @private */ _block:function (words) { var i, tmp, a, b, w = words.slice(0), h = this._h, k = this._key, h0 = h[0], h1 = h[1], h2 = h[2], h3 = h[3], h4 = h[4], h5 = h[5], h6 = h[6], h7 = h[7]; /* Rationale for placement of |0 : * If a value can overflow is original 32 bits by a factor of more than a few * million (2^23 ish), there is a possibility that it might overflow the * 53-bit mantissa and lose precision. * * To avoid this, we clamp back to 32 bits by |'ing with 0 on any value that * propagates around the loop, and on the hash state h[]. I don't believe * that the clamps on h4 and on h0 are strictly necessary, but it's close * (for h4 anyway), and better safe than sorry. * * The clamps on h[] are necessary for the output to be correct even in the * common case and for short inputs. */ for (i=0; i<64; i++) { // load up the input word for this round if (i<16) { tmp = w[i]; } else { a = w[(i+1 ) & 15]; b = w[(i+14) & 15]; tmp = w[i&15] = ((a>>>7 ^ a>>>18 ^ a>>>3 ^ a<<25 ^ a<<14) + (b>>>17 ^ b>>>19 ^ b>>>10 ^ b<<15 ^ b<<13) + w[i&15] + w[(i+9) & 15]) | 0; } tmp = (tmp + h7 + (h4>>>6 ^ h4>>>11 ^ h4>>>25 ^ h4<<26 ^ h4<<21 ^ h4<<7) + (h6 ^ h4&(h5^h6)) + k[i]); // | 0; // shift register h7 = h6; h6 = h5; h5 = h4; h4 = h3 + tmp | 0; h3 = h2; h2 = h1; h1 = h0; h0 = (tmp + ((h1&h2) ^ (h3&(h1^h2))) + (h1>>>2 ^ h1>>>13 ^ h1>>>22 ^ h1<<30 ^ h1<<19 ^ h1<<10)) | 0; } h[0] = h[0]+h0 | 0; h[1] = h[1]+h1 | 0; h[2] = h[2]+h2 | 0; h[3] = h[3]+h3 | 0; h[4] = h[4]+h4 | 0; h[5] = h[5]+h5 | 0; h[6] = h[6]+h6 | 0; h[7] = h[7]+h7 | 0; } }; /** @fileOverview CCM mode implementation. * * Special thanks to Roy Nicholson for pointing out a bug in our * implementation. * * @author Emily Stark * @author Mike Hamburg * @author Dan Boneh */ /** @namespace CTR mode with CBC MAC. */ sjcl.mode.ccm = { /** The name of the mode. * @constant */ name: "ccm", /** Encrypt in CCM mode. * @static * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. * @param {bitArray} plaintext The plaintext data. * @param {bitArray} iv The initialization value. * @param {bitArray} [adata=[]] The authenticated data. * @param {Number} [tlen=64] the desired tag length, in bits. * @return {bitArray} The encrypted data, an array of bytes. */ encrypt: function(prf, plaintext, iv, adata, tlen) { var L, i, out = plaintext.slice(0), tag, w=sjcl.bitArray, ivl = w.bitLength(iv) / 8, ol = w.bitLength(out) / 8; tlen = tlen || 64; adata = adata || []; if (ivl < 7) { throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"); } // compute the length of the length for (L=2; L<4 && ol >>> 8*L; L++) {} if (L < 15 - ivl) { L = 15-ivl; } iv = w.clamp(iv,8*(15-L)); // compute the tag tag = sjcl.mode.ccm._computeTag(prf, plaintext, iv, adata, tlen, L); // encrypt out = sjcl.mode.ccm._ctrMode(prf, out, iv, tag, tlen, L); return w.concat(out.data, out.tag); }, /** Decrypt in CCM mode. * @static * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. * @param {bitArray} ciphertext The ciphertext data. * @param {bitArray} iv The initialization value. * @param {bitArray} [[]] adata The authenticated data. * @param {Number} [64] tlen the desired tag length, in bits. * @return {bitArray} The decrypted data. */ decrypt: function(prf, ciphertext, iv, adata, tlen) { tlen = tlen || 64; adata = adata || []; var L, i, w=sjcl.bitArray, ivl = w.bitLength(iv) / 8, ol = w.bitLength(ciphertext), out = w.clamp(ciphertext, ol - tlen), tag = w.bitSlice(ciphertext, ol - tlen), tag2; ol = (ol - tlen) / 8; if (ivl < 7) { throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"); } // compute the length of the length for (L=2; L<4 && ol >>> 8*L; L++) {} if (L < 15 - ivl) { L = 15-ivl; } iv = w.clamp(iv,8*(15-L)); // decrypt out = sjcl.mode.ccm._ctrMode(prf, out, iv, tag, tlen, L); // check the tag tag2 = sjcl.mode.ccm._computeTag(prf, out.data, iv, adata, tlen, L); if (!w.equal(out.tag, tag2)) { throw new sjcl.exception.corrupt("ccm: tag doesn't match"); } return out.data; }, /* Compute the (unencrypted) authentication tag, according to the CCM specification * @param {Object} prf The pseudorandom function. * @param {bitArray} plaintext The plaintext data. * @param {bitArray} iv The initialization value. * @param {bitArray} adata The authenticated data. * @param {Number} tlen the desired tag length, in bits. * @return {bitArray} The tag, but not yet encrypted. * @private */ _computeTag: function(prf, plaintext, iv, adata, tlen, L) { // compute B[0] var q, mac, field = 0, offset = 24, tmp, i, macData = [], w=sjcl.bitArray, xor = w._xor4; tlen /= 8; // check tag length and message length if (tlen % 2 || tlen < 4 || tlen > 16) { throw new sjcl.exception.invalid("ccm: invalid tag length"); } if (adata.length > 0xFFFFFFFF || plaintext.length > 0xFFFFFFFF) { // I don't want to deal with extracting high words from doubles. throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data"); } // mac the flags mac = [w.partial(8, (adata.length ? 1<<6 : 0) | (tlen-2) << 2 | L-1)]; // mac the iv and length mac = w.concat(mac, iv); mac[3] |= w.bitLength(plaintext)/8; mac = prf.encrypt(mac); if (adata.length) { // mac the associated data. start with its length... tmp = w.bitLength(adata)/8; if (tmp <= 0xFEFF) { macData = [w.partial(16, tmp)]; } else if (tmp <= 0xFFFFFFFF) { macData = w.concat([w.partial(16,0xFFFE)], [tmp]); } // else ... // mac the data itself macData = w.concat(macData, adata); for (i=0; i>>31, x[1]<<1 ^ x[2]>>>31, x[2]<<1 ^ x[3]>>>31, x[3]<<1 ^ (x[0]>>>31)*0x87]; } }; /** @fileOverview GCM mode implementation. * * @author Juho Vähä-Herttua */ /** @namespace Galois/Counter mode. */ sjcl.mode.gcm = { /** The name of the mode. * @constant */ name: "gcm", /** Encrypt in GCM mode. * @static * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. * @param {bitArray} plaintext The plaintext data. * @param {bitArray} iv The initialization value. * @param {bitArray} [adata=[]] The authenticated data. * @param {Number} [tlen=128] The desired tag length, in bits. * @return {bitArray} The encrypted data, an array of bytes. */ encrypt: function (prf, plaintext, iv, adata, tlen) { var out, data = plaintext.slice(0), w=sjcl.bitArray; tlen = tlen || 128; adata = adata || []; // encrypt and tag out = sjcl.mode.gcm._ctrMode(true, prf, data, adata, iv, tlen); return w.concat(out.data, out.tag); }, /** Decrypt in GCM mode. * @static * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. * @param {bitArray} ciphertext The ciphertext data. * @param {bitArray} iv The initialization value. * @param {bitArray} [adata=[]] The authenticated data. * @param {Number} [tlen=128] The desired tag length, in bits. * @return {bitArray} The decrypted data. */ decrypt: function (prf, ciphertext, iv, adata, tlen) { var out, data = ciphertext.slice(0), tag, w=sjcl.bitArray, l=w.bitLength(data); tlen = tlen || 128; adata = adata || []; // Slice tag out of data if (tlen <= l) { tag = w.bitSlice(data, l-tlen); data = w.bitSlice(data, 0, l-tlen); } else { tag = data; data = []; } // decrypt and tag out = sjcl.mode.gcm._ctrMode(false, prf, data, adata, iv, tlen); if (!w.equal(out.tag, tag)) { throw new sjcl.exception.corrupt("gcm: tag doesn't match"); } return out.data; }, /* Compute the galois multiplication of X and Y * @private */ _galoisMultiply: function (x, y) { var i, j, xi, Zi, Vi, lsb_Vi, w=sjcl.bitArray, xor=w._xor4; Zi = [0,0,0,0]; Vi = y.slice(0); // Block size is 128 bits, run 128 times to get Z_128 for (i=0; i<128; i++) { xi = (x[Math.floor(i/32)] & (1 << (31-i%32))) !== 0; if (xi) { // Z_i+1 = Z_i ^ V_i Zi = xor(Zi, Vi); } // Store the value of LSB(V_i) lsb_Vi = (Vi[3] & 1) !== 0; // V_i+1 = V_i >> 1 for (j=3; j>0; j--) { Vi[j] = (Vi[j] >>> 1) | ((Vi[j-1]&1) << 31); } Vi[0] = Vi[0] >>> 1; // If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R if (lsb_Vi) { Vi[0] = Vi[0] ^ (0xe1 << 24); } } return Zi; }, _ghash: function(H, Y0, data) { var Yi, i, l = data.length; Yi = Y0.slice(0); for (i=0; i bs) { key = Hash.hash(key); } for (i=0; iUse sjcl.random as a singleton for this class!
*

* This random number generator is a derivative of Ferguson and Schneier's * generator Fortuna. It collects entropy from various events into several * pools, implemented by streaming SHA-256 instances. It differs from * ordinary Fortuna in a few ways, though. *

* *

* Most importantly, it has an entropy estimator. This is present because * there is a strong conflict here between making the generator available * as soon as possible, and making sure that it doesn't "run on empty". * In Fortuna, there is a saved state file, and the system is likely to have * time to warm up. *

* *

* Second, because users are unlikely to stay on the page for very long, * and to speed startup time, the number of pools increases logarithmically: * a new pool is created when the previous one is actually used for a reseed. * This gives the same asymptotic guarantees as Fortuna, but gives more * entropy to early reseeds. *

* *

* The entire mechanism here feels pretty klunky. Furthermore, there are * several improvements that should be made, including support for * dedicated cryptographic functions that may be present in some browsers; * state files in local storage; cookies containing randomness; etc. So * look for improvements in future versions. *

*/ sjcl.prng = function(defaultParanoia) { /* private */ this._pools = [new sjcl.hash.sha256()]; this._poolEntropy = [0]; this._reseedCount = 0; this._robins = {}; this._eventId = 0; this._collectorIds = {}; this._collectorIdNext = 0; this._strength = 0; this._poolStrength = 0; this._nextReseed = 0; this._key = [0,0,0,0,0,0,0,0]; this._counter = [0,0,0,0]; this._cipher = undefined; this._defaultParanoia = defaultParanoia; /* event listener stuff */ this._collectorsStarted = false; this._callbacks = {progress: {}, seeded: {}}; this._callbackI = 0; /* constants */ this._NOT_READY = 0; this._READY = 1; this._REQUIRES_RESEED = 2; this._MAX_WORDS_PER_BURST = 65536; this._PARANOIA_LEVELS = [0,48,64,96,128,192,256,384,512,768,1024]; this._MILLISECONDS_PER_RESEED = 30000; this._BITS_PER_RESEED = 80; }; sjcl.prng.prototype = { /** Generate several random words, and return them in an array. * A word consists of 32 bits (4 bytes) * @param {Number} nwords The number of words to generate. */ randomWords: function (nwords, paranoia) { var out = [], i, readiness = this.isReady(paranoia), g; if (readiness === this._NOT_READY) { throw new sjcl.exception.notReady("generator isn't seeded"); } else if (readiness & this._REQUIRES_RESEED) { this._reseedFromPools(!(readiness & this._READY)); } for (i=0; i0) { estimatedEntropy++; tmp = tmp >>> 1; } } } this._pools[robin].update([id,this._eventId++,2,estimatedEntropy,t,data.length].concat(data)); } break; case "string": if (estimatedEntropy === undefined) { /* English text has just over 1 bit per character of entropy. * But this might be HTML or something, and have far less * entropy than English... Oh well, let's just say one bit. */ estimatedEntropy = data.length; } this._pools[robin].update([id,this._eventId++,3,estimatedEntropy,t,data.length]); this._pools[robin].update(data); break; default: err=1; } if (err) { throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string"); } /* record the new strength */ this._poolEntropy[robin] += estimatedEntropy; this._poolStrength += estimatedEntropy; /* fire off events */ if (oldReady === this._NOT_READY) { if (this.isReady() !== this._NOT_READY) { this._fireEvent("seeded", Math.max(this._strength, this._poolStrength)); } this._fireEvent("progress", this.getProgress()); } }, /** Is the generator ready? */ isReady: function (paranoia) { var entropyRequired = this._PARANOIA_LEVELS[ (paranoia !== undefined) ? paranoia : this._defaultParanoia ]; if (this._strength && this._strength >= entropyRequired) { return (this._poolEntropy[0] > this._BITS_PER_RESEED && (new Date()).valueOf() > this._nextReseed) ? this._REQUIRES_RESEED | this._READY : this._READY; } else { return (this._poolStrength >= entropyRequired) ? this._REQUIRES_RESEED | this._NOT_READY : this._NOT_READY; } }, /** Get the generator's progress toward readiness, as a fraction */ getProgress: function (paranoia) { var entropyRequired = this._PARANOIA_LEVELS[ paranoia ? paranoia : this._defaultParanoia ]; if (this._strength >= entropyRequired) { return 1.0; } else { return (this._poolStrength > entropyRequired) ? 1.0 : this._poolStrength / entropyRequired; } }, /** start the built-in entropy collectors */ startCollectors: function () { if (this._collectorsStarted) { return; } this._eventListener = { loadTimeCollector: this._bind(this._loadTimeCollector), mouseCollector: this._bind(this._mouseCollector), keyboardCollector: this._bind(this._keyboardCollector), accelerometerCollector: this._bind(this._accelerometerCollector) } if (window.addEventListener) { window.addEventListener("load", this._eventListener.loadTimeCollector, false); window.addEventListener("mousemove", this._eventListener.mouseCollector, false); window.addEventListener("keypress", this._eventListener.keyboardCollector, false); window.addEventListener("devicemotion", this._eventListener.accelerometerCollector, false); } else if (document.attachEvent) { document.attachEvent("onload", this._eventListener.loadTimeCollector); document.attachEvent("onmousemove", this._eventListener.mouseCollector); document.attachEvent("keypress", this._eventListener.keyboardCollector); } else { throw new sjcl.exception.bug("can't attach event"); } this._collectorsStarted = true; }, /** stop the built-in entropy collectors */ stopCollectors: function () { if (!this._collectorsStarted) { return; } if (window.removeEventListener) { window.removeEventListener("load", this._eventListener.loadTimeCollector, false); window.removeEventListener("mousemove", this._eventListener.mouseCollector, false); window.removeEventListener("keypress", this._eventListener.keyboardCollector, false); window.removeEventListener("devicemotion", this._eventListener.accelerometerCollector, false); } else if (document.detachEvent) { document.detachEvent("onload", this._eventListener.loadTimeCollector); document.detachEvent("onmousemove", this._eventListener.mouseCollector); document.detachEvent("keypress", this._eventListener.keyboardCollector); } this._collectorsStarted = false; }, /* use a cookie to store entropy. useCookie: function (all_cookies) { throw new sjcl.exception.bug("random: useCookie is unimplemented"); },*/ /** add an event listener for progress or seeded-ness. */ addEventListener: function (name, callback) { this._callbacks[name][this._callbackI++] = callback; }, /** remove an event listener for progress or seeded-ness */ removeEventListener: function (name, cb) { var i, j, cbs=this._callbacks[name], jsTemp=[]; /* I'm not sure if this is necessary; in C++, iterating over a * collection and modifying it at the same time is a no-no. */ for (j in cbs) { if (cbs.hasOwnProperty(j) && cbs[j] === cb) { jsTemp.push(j); } } for (i=0; i= 1 << this._pools.length) { this._pools.push(new sjcl.hash.sha256()); this._poolEntropy.push(0); } /* how strong was this reseed? */ this._poolStrength -= strength; if (strength > this._strength) { this._strength = strength; } this._reseedCount ++; this._reseed(reseedData); }, _keyboardCollector: function () { this._addCurrentTimeToEntropy(1); }, _mouseCollector: function (ev) { var x = ev.x || ev.clientX || ev.offsetX || 0, y = ev.y || ev.clientY || ev.offsetY || 0; sjcl.random.addEntropy([x,y], 2, "mouse"); this._addCurrentTimeToEntropy(0); }, _loadTimeCollector: function () { this._addCurrentTimeToEntropy(2); }, _addCurrentTimeToEntropy: function (estimatedEntropy) { if (window && window.performance && typeof window.performance.now === "function") { //how much entropy do we want to add here? sjcl.random.addEntropy(window.performance.now(), estimatedEntropy, "loadtime"); } else { sjcl.random.addEntropy((new Date()).valueOf(), estimatedEntropy, "loadtime"); } }, _accelerometerCollector: function (ev) { var ac = ev.accelerationIncludingGravity.x||ev.accelerationIncludingGravity.y||ev.accelerationIncludingGravity.z; var or = ""; if(window.orientation){ or = window.orientation; } sjcl.random.addEntropy([ac,or], 3, "accelerometer"); this._addCurrentTimeToEntropy(0); }, _fireEvent: function (name, arg) { var j, cbs=sjcl.random._callbacks[name], cbsTemp=[]; /* TODO: there is a race condition between removing collectors and firing them */ /* I'm not sure if this is necessary; in C++, iterating over a * collection and modifying it at the same time is a no-no. */ for (j in cbs) { if (cbs.hasOwnProperty(j)) { cbsTemp.push(cbs[j]); } } for (j=0; j 4)) { throw new sjcl.exception.invalid("json encrypt: invalid parameters"); } if (typeof password === "string") { tmp = sjcl.misc.cachedPbkdf2(password, p); password = tmp.key.slice(0,p.ks/32); p.salt = tmp.salt; } else if (sjcl.ecc && password instanceof sjcl.ecc.elGamal.publicKey) { tmp = password.kem(); p.kemtag = tmp.tag; password = tmp.key.slice(0,p.ks/32); } if (typeof plaintext === "string") { plaintext = sjcl.codec.utf8String.toBits(plaintext); } if (typeof adata === "string") { adata = sjcl.codec.utf8String.toBits(adata); } prp = new sjcl.cipher[p.cipher](password); /* return the json data */ j._add(rp, p); rp.key = password; /* do the encryption */ p.ct = sjcl.mode[p.mode].encrypt(prp, plaintext, p.iv, adata, p.ts); //return j.encode(j._subtract(p, j.defaults)); return p; }, /** Simple encryption function. * @param {String|bitArray} password The password or key. * @param {String} plaintext The data to encrypt. * @param {Object} [params] The parameters including tag, iv and salt. * @param {Object} [rp] A returned version with filled-in parameters. * @return {String} The ciphertext serialized data. * @throws {sjcl.exception.invalid} if a parameter is invalid. */ encrypt: function (password, plaintext, params, rp) { var j = sjcl.json, p = j._encrypt.apply(j, arguments); return j.encode(p); }, /** Simple decryption function. * @param {String|bitArray} password The password or key. * @param {Object} ciphertext The cipher raw data to decrypt. * @param {Object} [params] Additional non-default parameters. * @param {Object} [rp] A returned object with filled parameters. * @return {String} The plaintext. * @throws {sjcl.exception.invalid} if a parameter is invalid. * @throws {sjcl.exception.corrupt} if the ciphertext is corrupt. */ _decrypt: function (password, ciphertext, params, rp) { params = params || {}; rp = rp || {}; var j = sjcl.json, p = j._add(j._add(j._add({},j.defaults),ciphertext), params, true), ct, tmp, prp, adata=p.adata; if (typeof p.salt === "string") { p.salt = sjcl.codec.base64.toBits(p.salt); } if (typeof p.iv === "string") { p.iv = sjcl.codec.base64.toBits(p.iv); } if (!sjcl.mode[p.mode] || !sjcl.cipher[p.cipher] || (typeof password === "string" && p.iter <= 100) || (p.ts !== 64 && p.ts !== 96 && p.ts !== 128) || (p.ks !== 128 && p.ks !== 192 && p.ks !== 256) || (!p.iv) || (p.iv.length < 2 || p.iv.length > 4)) { throw new sjcl.exception.invalid("json decrypt: invalid parameters"); } if (typeof password === "string") { tmp = sjcl.misc.cachedPbkdf2(password, p); password = tmp.key.slice(0,p.ks/32); p.salt = tmp.salt; } else if (sjcl.ecc && password instanceof sjcl.ecc.elGamal.secretKey) { password = password.unkem(sjcl.codec.base64.toBits(p.kemtag)).slice(0,p.ks/32); } if (typeof adata === "string") { adata = sjcl.codec.utf8String.toBits(adata); } prp = new sjcl.cipher[p.cipher](password); /* do the decryption */ ct = sjcl.mode[p.mode].decrypt(prp, p.ct, p.iv, adata, p.ts); /* return the json data */ j._add(rp, p); rp.key = password; return sjcl.codec.utf8String.fromBits(ct); }, /** Simple decryption function. * @param {String|bitArray} password The password or key. * @param {String} ciphertext The ciphertext to decrypt. * @param {Object} [params] Additional non-default parameters. * @param {Object} [rp] A returned object with filled parameters. * @return {String} The plaintext. * @throws {sjcl.exception.invalid} if a parameter is invalid. * @throws {sjcl.exception.corrupt} if the ciphertext is corrupt. */ decrypt: function (password, ciphertext, params, rp) { var j = sjcl.json; return j._decrypt(password, j.decode(ciphertext), params, rp); }, /** Encode a flat structure into a JSON string. * @param {Object} obj The structure to encode. * @return {String} A JSON string. * @throws {sjcl.exception.invalid} if obj has a non-alphanumeric property. * @throws {sjcl.exception.bug} if a parameter has an unsupported type. */ encode: function (obj) { var i, out='{', comma=''; for (i in obj) { if (obj.hasOwnProperty(i)) { if (!i.match(/^[a-z0-9]+$/i)) { throw new sjcl.exception.invalid("json encode: invalid property name"); } out += comma + '"' + i + '":'; comma = ','; switch (typeof obj[i]) { case 'number': case 'boolean': out += obj[i]; break; case 'string': out += '"' + escape(obj[i]) + '"'; break; case 'object': out += '"' + sjcl.codec.base64.fromBits(obj[i],0) + '"'; break; default: throw new sjcl.exception.bug("json encode: unsupported type"); } } } return out+'}'; }, /** Decode a simple (flat) JSON string into a structure. The ciphertext, * adata, salt and iv will be base64-decoded. * @param {String} str The string. * @return {Object} The decoded structure. * @throws {sjcl.exception.invalid} if str isn't (simple) JSON. */ decode: function (str) { str = str.replace(/\s/g,''); if (!str.match(/^\{.*\}$/)) { throw new sjcl.exception.invalid("json decode: this isn't json!"); } var a = str.replace(/^\{|\}$/g, '').split(/,/), out={}, i, m; for (i=0; i= this.limbs.length) ? 0 : this.limbs[i]; }, /** * Constant time comparison function. * Returns 1 if this >= that, or zero otherwise. */ greaterEquals: function(that) { if (typeof that === "number") { that = new this._class(that); } var less = 0, greater = 0, i, a, b; i = Math.max(this.limbs.length, that.limbs.length) - 1; for (; i>= 0; i--) { a = this.getLimb(i); b = that.getLimb(i); greater |= (b - a) & ~less; less |= (a - b) & ~greater; } return (greater | ~less) >>> 31; }, /** * Convert to a hex string. */ toString: function() { this.fullReduce(); var out="", i, s, l = this.limbs; for (i=0; i < this.limbs.length; i++) { s = l[i].toString(16); while (i < this.limbs.length - 1 && s.length < 6) { s = "0" + s; } out = s + out; } return "0x"+out; }, /** this += that. Does not normalize. */ addM: function(that) { if (typeof(that) !== "object") { that = new this._class(that); } var i, l=this.limbs, ll=that.limbs; for (i=l.length; i> r; } if (carry) { l.push(carry); } return this; }, /** this /= 2, rounded down. Requires normalized; ends up normalized. */ halveM: function() { var i, carry=0, tmp, r=this.radix, l=this.limbs; for (i=l.length-1; i>=0; i--) { tmp = l[i]; l[i] = (tmp+carry)>>1; carry = (tmp&1) << r; } if (!l[l.length-1]) { l.pop(); } return this; }, /** this -= that. Does not normalize. */ subM: function(that) { if (typeof(that) !== "object") { that = new this._class(that); } var i, l=this.limbs, ll=that.limbs; for (i=l.length; i 0; ci--) { that.halveM(); if (out.greaterEquals(that)) { out.subM(that).normalize(); } } return out.trim(); }, /** return inverse mod prime p. p must be odd. Binary extended Euclidean algorithm mod p. */ inverseMod: function(p) { var a = new sjcl.bn(1), b = new sjcl.bn(0), x = new sjcl.bn(this), y = new sjcl.bn(p), tmp, i, nz=1; if (!(p.limbs[0] & 1)) { throw (new sjcl.exception.invalid("inverseMod: p must be odd")); } // invariant: y is odd do { if (x.limbs[0] & 1) { if (!x.greaterEquals(y)) { // x < y; swap everything tmp = x; x = y; y = tmp; tmp = a; a = b; b = tmp; } x.subM(y); x.normalize(); if (!a.greaterEquals(b)) { a.addM(p); } a.subM(b); } // cut everything in half x.halveM(); if (a.limbs[0] & 1) { a.addM(p); } a.normalize(); a.halveM(); // check for termination: x ?= 0 for (i=nz=0; i= 0; i--) { out = w.concat(out, [w.partial(Math.min(this.radix,len), this.getLimb(i))]); len -= this.radix; } return out; }, /** Return the length in bits, rounded up to the nearest byte. */ bitLength: function() { this.fullReduce(); var out = this.radix * (this.limbs.length - 1), b = this.limbs[this.limbs.length - 1]; for (; b; b >>>= 1) { out ++; } return out+7 & -8; } }; /** @memberOf sjcl.bn * @this { sjcl.bn } */ sjcl.bn.fromBits = function(bits) { var Class = this, out = new Class(), words=[], w=sjcl.bitArray, t = this.prototype, l = Math.min(this.bitLength || 0x100000000, w.bitLength(bits)), e = l % t.radix || t.radix; words[0] = w.extract(bits, 0, e); for (; e < l; e += t.radix) { words.unshift(w.extract(bits, e, t.radix)); } out.limbs = words; return out; }; sjcl.bn.prototype.ipv = 1 / (sjcl.bn.prototype.placeVal = Math.pow(2,sjcl.bn.prototype.radix)); sjcl.bn.prototype.radixMask = (1 << sjcl.bn.prototype.radix) - 1; /** * Creates a new subclass of bn, based on reduction modulo a pseudo-Mersenne prime, * i.e. a prime of the form 2^e + sum(a * 2^b),where the sum is negative and sparse. */ sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { /** @constructor * @private */ function p(it) { this.initWith(it); /*if (this.limbs[this.modOffset]) { this.reduce(); }*/ } var ppr = p.prototype = new sjcl.bn(), i, tmp, mo; mo = ppr.modOffset = Math.ceil(tmp = exponent / ppr.radix); ppr.exponent = exponent; ppr.offset = []; ppr.factor = []; ppr.minOffset = mo; ppr.fullMask = 0; ppr.fullOffset = []; ppr.fullFactor = []; ppr.modulus = p.modulus = new sjcl.bn(Math.pow(2,exponent)); ppr.fullMask = 0|-Math.pow(2, exponent % ppr.radix); for (i=0; i mo) { l = limbs.pop(); ll = limbs.length; for (k=0; k=0; i--) { for (j=sjcl.bn.prototype.radix-4; j>=0; j-=4) { out = out.doubl().doubl().doubl().doubl().add(multiples[k[i]>>j & 0xF]); } } return out; }, /** * Multiply this point by k, added to affine2*k2, and return the answer in Jacobian coordinates. * @param {bigInt} k The coefficient to multiply this by. * @param {sjcl.ecc.point} affine This point in affine coordinates. * @param {bigInt} k2 The coefficient to multiply affine2 this by. * @param {sjcl.ecc.point} affine The other point in affine coordinates. * @return {sjcl.ecc.pointJac} The result of the multiplication and addition, in Jacobian coordinates. */ mult2: function(k1, affine, k2, affine2) { if (typeof(k1) === "number") { k1 = [k1]; } else if (k1.limbs !== undefined) { k1 = k1.normalize().limbs; } if (typeof(k2) === "number") { k2 = [k2]; } else if (k2.limbs !== undefined) { k2 = k2.normalize().limbs; } var i, j, out = new sjcl.ecc.point(this.curve).toJac(), m1 = affine.multiples(), m2 = affine2.multiples(), l1, l2; for (i=Math.max(k1.length,k2.length)-1; i>=0; i--) { l1 = k1[i] | 0; l2 = k2[i] | 0; for (j=sjcl.bn.prototype.radix-4; j>=0; j-=4) { out = out.doubl().doubl().doubl().doubl().add(m1[l1>>j & 0xF]).add(m2[l2>>j & 0xF]); } } return out; }, isValid: function() { var z2 = this.z.square(), z4 = z2.square(), z6 = z4.mul(z2); return this.y.square().equals( this.curve.b.mul(z6).add(this.x.mul( this.curve.a.mul(z4).add(this.x.square())))); } }; /** * Construct an elliptic curve. Most users will not use this and instead start with one of the NIST curves defined below. * * @constructor * @param {bigInt} p The prime modulus. * @param {bigInt} r The prime order of the curve. * @param {bigInt} a The constant a in the equation of the curve y^2 = x^3 + ax + b (for NIST curves, a is always -3). * @param {bigInt} x The x coordinate of a base point of the curve. * @param {bigInt} y The y coordinate of a base point of the curve. */ sjcl.ecc.curve = function(Field, r, a, b, x, y) { this.field = Field; this.r = new sjcl.bn(r); this.a = new Field(a); this.b = new Field(b); this.G = new sjcl.ecc.point(this, new Field(x), new Field(y)); }; sjcl.ecc.curve.prototype.fromBits = function (bits) { var w = sjcl.bitArray, l = this.field.prototype.exponent + 7 & -8, p = new sjcl.ecc.point(this, this.field.fromBits(w.bitSlice(bits, 0, l)), this.field.fromBits(w.bitSlice(bits, l, 2*l))); if (!p.isValid()) { throw new sjcl.exception.corrupt("not on the curve!"); } return p; }; sjcl.ecc.curves = { c192: new sjcl.ecc.curve( sjcl.bn.prime.p192, "0xffffffffffffffffffffffff99def836146bc9b1b4d22831", -3, "0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1", "0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012", "0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811"), c224: new sjcl.ecc.curve( sjcl.bn.prime.p224, "0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d", -3, "0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4", "0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21", "0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34"), c256: new sjcl.ecc.curve( sjcl.bn.prime.p256, "0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", -3, "0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", "0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", "0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"), c384: new sjcl.ecc.curve( sjcl.bn.prime.p384, "0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973", -3, "0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef", "0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", "0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f"), k192: new sjcl.ecc.curve( sjcl.bn.prime.p192k, "0xfffffffffffffffffffffffe26f2fc170f69466a74defd8d", 0, 3, "0xdb4ff10ec057e9ae26b07d0280b7f4341da5d1b1eae06c7d", "0x9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d"), k224: new sjcl.ecc.curve( sjcl.bn.prime.p224k, "0x010000000000000000000000000001dce8d2ec6184caf0a971769fb1f7", 0, 5, "0xa1455b334df099df30fc28a169a467e9e47075a90f7e650eb6b7a45c", "0x7e089fed7fba344282cafbd6f7e319f7c0b0bd59e2ca4bdb556d61a5"), k256: new sjcl.ecc.curve( sjcl.bn.prime.p256k, "0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", 0, 7, "0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8") }; /** our basicKey classes */ sjcl.ecc.basicKey = { /** ecc publicKey. * @constructor * @param {curve} curve the elliptic curve * @param {point} point the point on the curve */ publicKey: function(curve, point) { this._curve = curve; this._curveBitLength = curve.r.bitLength(); if (point instanceof Array) { this._point = curve.fromBits(point); } else { this._point = point; } /** get this keys point data * @return x and y as bitArrays */ this.get = function() { var pointbits = this._point.toBits(); var len = sjcl.bitArray.bitLength(pointbits); var x = sjcl.bitArray.bitSlice(pointbits, 0, len/2); var y = sjcl.bitArray.bitSlice(pointbits, len/2); return { x: x, y: y }; }; }, /** ecc secretKey * @constructor * @param {curve} curve the elliptic curve * @param exponent */ secretKey: function(curve, exponent) { this._curve = curve; this._curveBitLength = curve.r.bitLength(); this._exponent = exponent; /** get this keys exponent data * @return {bitArray} exponent */ this.get = function () { return this._exponent.toBits(); }; } }; /** @private */ sjcl.ecc.basicKey.generateKeys = function(cn) { return function generateKeys(curve, paranoia, sec) { curve = curve || 256; paranoia = paranoia || 0; if (typeof curve === "number") { curve = sjcl.ecc.curves['c'+curve]; if (curve === undefined) { throw new sjcl.exception.invalid("no such curve"); } } sec = sec || sjcl.bn.random(curve.r, paranoia); var pub = curve.G.mult(sec); return { pub: new sjcl.ecc[cn].publicKey(curve, pub), sec: new sjcl.ecc[cn].secretKey(curve, sec) }; }; }; /** elGamal keys */ sjcl.ecc.elGamal = { /** generate keys * @function * @param curve * @param {int} paranoia Paranoia for generation (default 6) * @param {secretKey} sec secret Key to use. used to get the publicKey for ones secretKey */ generateKeys: sjcl.ecc.basicKey.generateKeys("elGamal"), /** elGamal publicKey. * @constructor * @augments sjcl.ecc.basicKey.publicKey */ publicKey: function (curve, point) { sjcl.ecc.basicKey.publicKey.apply(this, arguments); }, /** elGamal secretKey * @constructor * @augments sjcl.ecc.basicKey.secretKey */ secretKey: function (curve, exponent) { sjcl.ecc.basicKey.secretKey.apply(this, arguments); } }; sjcl.ecc.elGamal.publicKey.prototype = { /** Kem function of elGamal Public Key * @param paranoia paranoia to use for randomization. * @return {object} key and tag. unkem(tag) with the corresponding secret key results in the key returned. */ kem: function(paranoia) { var sec = sjcl.bn.random(this._curve.r, paranoia), tag = this._curve.G.mult(sec).toBits(), key = sjcl.hash.sha256.hash(this._point.mult(sec).toBits()); return { key: key, tag: tag }; } }; sjcl.ecc.elGamal.secretKey.prototype = { /** UnKem function of elGamal Secret Key * @param {bitArray} tag The Tag to decrypt. * @return {bitArray} decrypted key. */ unkem: function(tag) { return sjcl.hash.sha256.hash(this._curve.fromBits(tag).mult(this._exponent).toBits()); }, /** Diffie-Hellmann function * @param {elGamal.publicKey} pk The Public Key to do Diffie-Hellmann with * @return {bitArray} diffie-hellmann result for this key combination. */ dh: function(pk) { return sjcl.hash.sha256.hash(pk._point.mult(this._exponent).toBits()); } }; /** ecdsa keys */ sjcl.ecc.ecdsa = { /** generate keys * @function * @param curve * @param {int} paranoia Paranoia for generation (default 6) * @param {secretKey} sec secret Key to use. used to get the publicKey for ones secretKey */ generateKeys: sjcl.ecc.basicKey.generateKeys("ecdsa") }; /** ecdsa publicKey. * @constructor * @augments sjcl.ecc.basicKey.publicKey */ sjcl.ecc.ecdsa.publicKey = function (curve, point) { sjcl.ecc.basicKey.publicKey.apply(this, arguments); }; /** specific functions for ecdsa publicKey. */ sjcl.ecc.ecdsa.publicKey.prototype = { /** Diffie-Hellmann function * @param {bitArray} hash hash to verify. * @param {bitArray} rs signature bitArray. * @param {boolean} fakeLegacyVersion use old legacy version */ verify: function(hash, rs, fakeLegacyVersion) { if (sjcl.bitArray.bitLength(hash) > this._curveBitLength) { hash = sjcl.bitArray.clamp(hash, this._curveBitLength); } var w = sjcl.bitArray, R = this._curve.r, l = this._curveBitLength, r = sjcl.bn.fromBits(w.bitSlice(rs,0,l)), ss = sjcl.bn.fromBits(w.bitSlice(rs,l,2*l)), s = fakeLegacyVersion ? ss : ss.inverseMod(R), hG = sjcl.bn.fromBits(hash).mul(s).mod(R), hA = r.mul(s).mod(R), r2 = this._curve.G.mult2(hG, hA, this._point).x; if (r.equals(0) || ss.equals(0) || r.greaterEquals(R) || ss.greaterEquals(R) || !r2.equals(r)) { if (fakeLegacyVersion === undefined) { return this.verify(hash, rs, true); } else { throw (new sjcl.exception.corrupt("signature didn't check out")); } } return true; } }; /** ecdsa secretKey * @constructor * @augments sjcl.ecc.basicKey.publicKey */ sjcl.ecc.ecdsa.secretKey = function (curve, exponent) { sjcl.ecc.basicKey.secretKey.apply(this, arguments); }; /** specific functions for ecdsa secretKey. */ sjcl.ecc.ecdsa.secretKey.prototype = { /** Diffie-Hellmann function * @param {bitArray} hash hash to sign. * @param {int} paranoia paranoia for random number generation * @param {boolean} fakeLegacyVersion use old legacy version */ sign: function(hash, paranoia, fakeLegacyVersion, fixedKForTesting) { if (sjcl.bitArray.bitLength(hash) > this._curveBitLength) { hash = sjcl.bitArray.clamp(hash, this._curveBitLength); } var R = this._curve.r, l = R.bitLength(), k = fixedKForTesting || sjcl.bn.random(R.sub(1), paranoia).add(1), r = this._curve.G.mult(k).x.mod(R), ss = sjcl.bn.fromBits(hash).add(r.mul(this._exponent)), s = fakeLegacyVersion ? ss.inverseMod(R).mul(k).mod(R) : ss.mul(k.inverseMod(R)).mod(R); return sjcl.bitArray.concat(r.toBits(l), s.toBits(l)); } }; var ecc = {}, DEFAULT_CURVE = 192, ENC_DEC = ecc.ENC_DEC = {}, SIG_VER = ecc.SIG_VER = {}, elg = eccAPI('elGamal'), dsa = eccAPI('ecdsa'), sha256 = hashAPI('sha256'); ecc.sjcl = sjcl; ecc.generate = function(type, curve) { if(!curve) curve = DEFAULT_CURVE; var keys, pub, sec; if(type === ENC_DEC) { pub = 'enc'; sec = 'dec'; keys = elg.generate(curve); } else if(type === SIG_VER) { pub = 'ver'; sec = 'sig'; keys = dsa.generate(curve); } else throw "eccjs: generate: Unknown type"; var newkeys = {}; newkeys[pub] = exportPublic(keys.pub); newkeys[sec] = exportSecret(keys.sec); return newkeys; }; var cache = { enc: {}, dec: {}, sig: {}, ver: {} }; ecc.encrypt = function(enckey, plaintext) { var kem = cache.enc[enckey]; if(!kem) { kem = cache.enc[enckey] = elg.importPublic(enckey).kem(); kem.tagHex = sjcl.codec.hex.fromBits(kem.tag); } var obj = sjcl.json._encrypt(kem.key, plaintext); obj.tag = kem.tagHex; return JSON.stringify(obj); }; ecc.decrypt = function(deckey, ciphertext) { var obj = JSON.parse(ciphertext); var kem = cache.dec[deckey]; if(!kem) { kem = cache.dec[deckey] = elg.importSecret(deckey); kem.$keys = {}; } var key = kem.$keys[obj.tag]; if(!key) key = kem.$keys[obj.tag] = kem.unkem(sjcl.codec.hex.toBits(obj.tag)); return sjcl.json._decrypt(key, obj); }; ecc.sign = function(sigkey, text, hash) { var key = cache.sig[sigkey]; if(!key) key = cache.sig[sigkey] = dsa.importSecret(sigkey); //hash first if(hash !== false) text = sha256.hash(text); return key.sign(text); }; ecc.verify = function(verkey, signature, text, hash) { var key = cache.ver[verkey]; if(!key) key = cache.ver[verkey] = dsa.importPublic(verkey); //hash first if(hash !== false) text = sha256.hash(text); try { return key.verify(text, signature); } catch(e) { return false; } }; //ecc algorithm helpers function eccAPI(algoName) { var algo = sjcl.ecc[algoName]; if(!algo) throw new Error("Missing ECC algorithm: " + algoName); return { generate: function(curve) { var keys = algo.generateKeys(curve, 1); keys.pub.$curve = curve; keys.sec.$curve = curve; return keys; }, importPublic: function(keyStr) { var key = extract(keyStr); return new algo.publicKey(key.curve, sjcl.codec.hex.toBits(key.hex)); }, importSecret: function(keyStr) { var key = extract(keyStr); return new algo.secretKey(key.curve, new sjcl.bn(key.hex)); } }; } function extract(str) { return { curve: sjcl.ecc.curves['c'+str.substr(0, 3)], hex: str.substr(3) }; } function exportPublic(keyObj) { var obj = keyObj.get(); return keyObj.$curve + sjcl.codec.hex.fromBits(obj.x) + sjcl.codec.hex.fromBits(obj.y); } function exportSecret(keyObj) { return keyObj.$curve + sjcl.codec.hex.fromBits(keyObj.get()); } //hash algorithm helpers function hashAPI(algoName) { var algo = sjcl.hash[algoName]; if(!algo) throw new Error("Missing hash algorithm: " + algoName); return { hash: function(input) { return algo.hash(input); } }; } //publicise if(typeof module !== 'undefined' && module.exports) module.exports = ecc; else window.ecc = ecc; }(this)); },{"crypto":110}],125:[function(require,module,exports){ 'use strict'; var elliptic = exports; elliptic.version = require('../package.json').version; elliptic.utils = require('./elliptic/utils'); elliptic.rand = require('brorand'); elliptic.hmacDRBG = require('./elliptic/hmac-drbg'); elliptic.curve = require('./elliptic/curve'); elliptic.curves = require('./elliptic/curves'); // Protocols elliptic.ec = require('./elliptic/ec'); elliptic.eddsa = require('./elliptic/eddsa'); },{"../package.json":141,"./elliptic/curve":128,"./elliptic/curves":131,"./elliptic/ec":132,"./elliptic/eddsa":135,"./elliptic/hmac-drbg":138,"./elliptic/utils":140,"brorand":32}],126:[function(require,module,exports){ 'use strict'; var BN = require('bn.js'); var elliptic = require('../../elliptic'); var utils = elliptic.utils; var getNAF = utils.getNAF; var getJSF = utils.getJSF; var assert = utils.assert; function BaseCurve(type, conf) { this.type = type; this.p = new BN(conf.p, 16); // Use Montgomery, when there is no fast reduction for the prime this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p); // Useful for many curves this.zero = new BN(0).toRed(this.red); this.one = new BN(1).toRed(this.red); this.two = new BN(2).toRed(this.red); // Curve configuration, optional this.n = conf.n && new BN(conf.n, 16); this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); // Temporary arrays this._wnafT1 = new Array(4); this._wnafT2 = new Array(4); this._wnafT3 = new Array(4); this._wnafT4 = new Array(4); } module.exports = BaseCurve; BaseCurve.prototype.point = function point() { throw new Error('Not implemented'); }; BaseCurve.prototype.validate = function validate() { throw new Error('Not implemented'); }; BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) { assert(p.precomputed); var doubles = p._getDoubles(); var naf = getNAF(k, 1); var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1); I /= 3; // Translate into more windowed form var repr = []; for (var j = 0; j < naf.length; j += doubles.step) { var nafW = 0; for (var k = j + doubles.step - 1; k >= j; k--) nafW = (nafW << 1) + naf[k]; repr.push(nafW); } var a = this.jpoint(null, null, null); var b = this.jpoint(null, null, null); for (var i = I; i > 0; i--) { for (var j = 0; j < repr.length; j++) { var nafW = repr[j]; if (nafW === i) b = b.mixedAdd(doubles.points[j]); else if (nafW === -i) b = b.mixedAdd(doubles.points[j].neg()); } a = a.add(b); } return a.toP(); }; BaseCurve.prototype._wnafMul = function _wnafMul(p, k) { var w = 4; // Precompute window var nafPoints = p._getNAFPoints(w); w = nafPoints.wnd; var wnd = nafPoints.points; // Get NAF form var naf = getNAF(k, w); // Add `this`*(N+1) for every w-NAF index var acc = this.jpoint(null, null, null); for (var i = naf.length - 1; i >= 0; i--) { // Count zeroes for (var k = 0; i >= 0 && naf[i] === 0; i--) k++; if (i >= 0) k++; acc = acc.dblp(k); if (i < 0) break; var z = naf[i]; assert(z !== 0); if (p.type === 'affine') { // J +- P if (z > 0) acc = acc.mixedAdd(wnd[(z - 1) >> 1]); else acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg()); } else { // J +- J if (z > 0) acc = acc.add(wnd[(z - 1) >> 1]); else acc = acc.add(wnd[(-z - 1) >> 1].neg()); } } return p.type === 'affine' ? acc.toP() : acc; }; BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len) { var wndWidth = this._wnafT1; var wnd = this._wnafT2; var naf = this._wnafT3; // Fill all arrays var max = 0; for (var i = 0; i < len; i++) { var p = points[i]; var nafPoints = p._getNAFPoints(defW); wndWidth[i] = nafPoints.wnd; wnd[i] = nafPoints.points; } // Comb small window NAFs for (var i = len - 1; i >= 1; i -= 2) { var a = i - 1; var b = i; if (wndWidth[a] !== 1 || wndWidth[b] !== 1) { naf[a] = getNAF(coeffs[a], wndWidth[a]); naf[b] = getNAF(coeffs[b], wndWidth[b]); max = Math.max(naf[a].length, max); max = Math.max(naf[b].length, max); continue; } var comb = [ points[a], /* 1 */ null, /* 3 */ null, /* 5 */ points[b] /* 7 */ ]; // Try to avoid Projective points, if possible if (points[a].y.cmp(points[b].y) === 0) { comb[1] = points[a].add(points[b]); comb[2] = points[a].toJ().mixedAdd(points[b].neg()); } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) { comb[1] = points[a].toJ().mixedAdd(points[b]); comb[2] = points[a].add(points[b].neg()); } else { comb[1] = points[a].toJ().mixedAdd(points[b]); comb[2] = points[a].toJ().mixedAdd(points[b].neg()); } var index = [ -3, /* -1 -1 */ -1, /* -1 0 */ -5, /* -1 1 */ -7, /* 0 -1 */ 0, /* 0 0 */ 7, /* 0 1 */ 5, /* 1 -1 */ 1, /* 1 0 */ 3 /* 1 1 */ ]; var jsf = getJSF(coeffs[a], coeffs[b]); max = Math.max(jsf[0].length, max); naf[a] = new Array(max); naf[b] = new Array(max); for (var j = 0; j < max; j++) { var ja = jsf[0][j] | 0; var jb = jsf[1][j] | 0; naf[a][j] = index[(ja + 1) * 3 + (jb + 1)]; naf[b][j] = 0; wnd[a] = comb; } } var acc = this.jpoint(null, null, null); var tmp = this._wnafT4; for (var i = max; i >= 0; i--) { var k = 0; while (i >= 0) { var zero = true; for (var j = 0; j < len; j++) { tmp[j] = naf[j][i] | 0; if (tmp[j] !== 0) zero = false; } if (!zero) break; k++; i--; } if (i >= 0) k++; acc = acc.dblp(k); if (i < 0) break; for (var j = 0; j < len; j++) { var z = tmp[j]; var p; if (z === 0) continue; else if (z > 0) p = wnd[j][(z - 1) >> 1]; else if (z < 0) p = wnd[j][(-z - 1) >> 1].neg(); if (p.type === 'affine') acc = acc.mixedAdd(p); else acc = acc.add(p); } } // Zeroify references for (var i = 0; i < len; i++) wnd[i] = null; return acc.toP(); }; function BasePoint(curve, type) { this.curve = curve; this.type = type; this.precomputed = null; } BaseCurve.BasePoint = BasePoint; BasePoint.prototype.eq = function eq(/*other*/) { throw new Error('Not implemented'); }; BasePoint.prototype.validate = function validate() { return this.curve.validate(this); }; BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) { bytes = utils.toArray(bytes, enc); var len = this.p.byteLength(); if (bytes[0] === 0x04 && bytes.length - 1 === 2 * len) { return this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len)); } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) && bytes.length - 1 === len) { return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03); } throw new Error('Unknown point format'); }; BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) { return this.encode(enc, true); }; BasePoint.prototype._encode = function _encode(compact) { var len = this.curve.p.byteLength(); var x = this.getX().toArray('be', len); if (compact) return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x); return [ 0x04 ].concat(x, this.getY().toArray('be', len)) ; }; BasePoint.prototype.encode = function encode(enc, compact) { return utils.encode(this._encode(compact), enc); }; BasePoint.prototype.precompute = function precompute(power) { if (this.precomputed) return this; var precomputed = { doubles: null, naf: null, beta: null }; precomputed.naf = this._getNAFPoints(8); precomputed.doubles = this._getDoubles(4, power); precomputed.beta = this._getBeta(); this.precomputed = precomputed; return this; }; BasePoint.prototype._hasDoubles = function _hasDoubles(k) { if (!this.precomputed) return false; var doubles = this.precomputed.doubles; if (!doubles) return false; return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step); }; BasePoint.prototype._getDoubles = function _getDoubles(step, power) { if (this.precomputed && this.precomputed.doubles) return this.precomputed.doubles; var doubles = [ this ]; var acc = this; for (var i = 0; i < power; i += step) { for (var j = 0; j < step; j++) acc = acc.dbl(); doubles.push(acc); } return { step: step, points: doubles }; }; BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) { if (this.precomputed && this.precomputed.naf) return this.precomputed.naf; var res = [ this ]; var max = (1 << wnd) - 1; var dbl = max === 1 ? null : this.dbl(); for (var i = 1; i < max; i++) res[i] = res[i - 1].add(dbl); return { wnd: wnd, points: res }; }; BasePoint.prototype._getBeta = function _getBeta() { return null; }; BasePoint.prototype.dblp = function dblp(k) { var r = this; for (var i = 0; i < k; i++) r = r.dbl(); return r; }; },{"../../elliptic":125,"bn.js":29}],127:[function(require,module,exports){ 'use strict'; var curve = require('../curve'); var elliptic = require('../../elliptic'); var BN = require('bn.js'); var inherits = require('inherits'); var Base = curve.base; var assert = elliptic.utils.assert; function EdwardsCurve(conf) { // NOTE: Important as we are creating point in Base.call() this.twisted = (conf.a | 0) !== 1; this.mOneA = this.twisted && (conf.a | 0) === -1; this.extended = this.mOneA; Base.call(this, 'edwards', conf); this.a = new BN(conf.a, 16).umod(this.red.m); this.a = this.a.toRed(this.red); this.c = new BN(conf.c, 16).toRed(this.red); this.c2 = this.c.redSqr(); this.d = new BN(conf.d, 16).toRed(this.red); this.dd = this.d.redAdd(this.d); assert(!this.twisted || this.c.fromRed().cmpn(1) === 0); this.oneC = (conf.c | 0) === 1; } inherits(EdwardsCurve, Base); module.exports = EdwardsCurve; EdwardsCurve.prototype._mulA = function _mulA(num) { if (this.mOneA) return num.redNeg(); else return this.a.redMul(num); }; EdwardsCurve.prototype._mulC = function _mulC(num) { if (this.oneC) return num; else return this.c.redMul(num); }; // Just for compatibility with Short curve EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) { return this.point(x, y, z, t); }; EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) { x = new BN(x, 16); if (!x.red) x = x.toRed(this.red); var x2 = x.redSqr(); var rhs = this.c2.redSub(this.a.redMul(x2)); var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2)); var y2 = rhs.redMul(lhs.redInvm()); var y = y2.redSqrt(); if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) throw new Error('invalid point'); var isOdd = y.fromRed().isOdd(); if (odd && !isOdd || !odd && isOdd) y = y.redNeg(); return this.point(x, y); }; EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) { y = new BN(y, 16); if (!y.red) y = y.toRed(this.red); // x^2 = (y^2 - 1) / (d y^2 + 1) var y2 = y.redSqr(); var lhs = y2.redSub(this.one); var rhs = y2.redMul(this.d).redAdd(this.one); var x2 = lhs.redMul(rhs.redInvm()); if (x2.cmp(this.zero) === 0) { if (odd) throw new Error('invalid point'); else return this.point(this.zero, y); } var x = x2.redSqrt(); if (x.redSqr().redSub(x2).cmp(this.zero) !== 0) throw new Error('invalid point'); if (x.isOdd() !== odd) x = x.redNeg(); return this.point(x, y); }; EdwardsCurve.prototype.validate = function validate(point) { if (point.isInfinity()) return true; // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2) point.normalize(); var x2 = point.x.redSqr(); var y2 = point.y.redSqr(); var lhs = x2.redMul(this.a).redAdd(y2); var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2))); return lhs.cmp(rhs) === 0; }; function Point(curve, x, y, z, t) { Base.BasePoint.call(this, curve, 'projective'); if (x === null && y === null && z === null) { this.x = this.curve.zero; this.y = this.curve.one; this.z = this.curve.one; this.t = this.curve.zero; this.zOne = true; } else { this.x = new BN(x, 16); this.y = new BN(y, 16); this.z = z ? new BN(z, 16) : this.curve.one; this.t = t && new BN(t, 16); if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); if (this.t && !this.t.red) this.t = this.t.toRed(this.curve.red); this.zOne = this.z === this.curve.one; // Use extended coordinates if (this.curve.extended && !this.t) { this.t = this.x.redMul(this.y); if (!this.zOne) this.t = this.t.redMul(this.z.redInvm()); } } } inherits(Point, Base.BasePoint); EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) { return Point.fromJSON(this, obj); }; EdwardsCurve.prototype.point = function point(x, y, z, t) { return new Point(this, x, y, z, t); }; Point.fromJSON = function fromJSON(curve, obj) { return new Point(curve, obj[0], obj[1], obj[2]); }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; Point.prototype.isInfinity = function isInfinity() { // XXX This code assumes that zero is always zero in red return this.x.cmpn(0) === 0 && this.y.cmp(this.z) === 0; }; Point.prototype._extDbl = function _extDbl() { // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html // #doubling-dbl-2008-hwcd // 4M + 4S // A = X1^2 var a = this.x.redSqr(); // B = Y1^2 var b = this.y.redSqr(); // C = 2 * Z1^2 var c = this.z.redSqr(); c = c.redIAdd(c); // D = a * A var d = this.curve._mulA(a); // E = (X1 + Y1)^2 - A - B var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b); // G = D + B var g = d.redAdd(b); // F = G - C var f = g.redSub(c); // H = D - B var h = d.redSub(b); // X3 = E * F var nx = e.redMul(f); // Y3 = G * H var ny = g.redMul(h); // T3 = E * H var nt = e.redMul(h); // Z3 = F * G var nz = f.redMul(g); return this.curve.point(nx, ny, nz, nt); }; Point.prototype._projDbl = function _projDbl() { // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html // #doubling-dbl-2008-bbjlp // #doubling-dbl-2007-bl // and others // Generally 3M + 4S or 2M + 4S // B = (X1 + Y1)^2 var b = this.x.redAdd(this.y).redSqr(); // C = X1^2 var c = this.x.redSqr(); // D = Y1^2 var d = this.y.redSqr(); var nx; var ny; var nz; if (this.curve.twisted) { // E = a * C var e = this.curve._mulA(c); // F = E + D var f = e.redAdd(d); if (this.zOne) { // X3 = (B - C - D) * (F - 2) nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two)); // Y3 = F * (E - D) ny = f.redMul(e.redSub(d)); // Z3 = F^2 - 2 * F nz = f.redSqr().redSub(f).redSub(f); } else { // H = Z1^2 var h = this.z.redSqr(); // J = F - 2 * H var j = f.redSub(h).redISub(h); // X3 = (B-C-D)*J nx = b.redSub(c).redISub(d).redMul(j); // Y3 = F * (E - D) ny = f.redMul(e.redSub(d)); // Z3 = F * J nz = f.redMul(j); } } else { // E = C + D var e = c.redAdd(d); // H = (c * Z1)^2 var h = this.curve._mulC(this.c.redMul(this.z)).redSqr(); // J = E - 2 * H var j = e.redSub(h).redSub(h); // X3 = c * (B - E) * J nx = this.curve._mulC(b.redISub(e)).redMul(j); // Y3 = c * E * (C - D) ny = this.curve._mulC(e).redMul(c.redISub(d)); // Z3 = E * J nz = e.redMul(j); } return this.curve.point(nx, ny, nz); }; Point.prototype.dbl = function dbl() { if (this.isInfinity()) return this; // Double in extended coordinates if (this.curve.extended) return this._extDbl(); else return this._projDbl(); }; Point.prototype._extAdd = function _extAdd(p) { // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html // #addition-add-2008-hwcd-3 // 8M // A = (Y1 - X1) * (Y2 - X2) var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x)); // B = (Y1 + X1) * (Y2 + X2) var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x)); // C = T1 * k * T2 var c = this.t.redMul(this.curve.dd).redMul(p.t); // D = Z1 * 2 * Z2 var d = this.z.redMul(p.z.redAdd(p.z)); // E = B - A var e = b.redSub(a); // F = D - C var f = d.redSub(c); // G = D + C var g = d.redAdd(c); // H = B + A var h = b.redAdd(a); // X3 = E * F var nx = e.redMul(f); // Y3 = G * H var ny = g.redMul(h); // T3 = E * H var nt = e.redMul(h); // Z3 = F * G var nz = f.redMul(g); return this.curve.point(nx, ny, nz, nt); }; Point.prototype._projAdd = function _projAdd(p) { // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html // #addition-add-2008-bbjlp // #addition-add-2007-bl // 10M + 1S // A = Z1 * Z2 var a = this.z.redMul(p.z); // B = A^2 var b = a.redSqr(); // C = X1 * X2 var c = this.x.redMul(p.x); // D = Y1 * Y2 var d = this.y.redMul(p.y); // E = d * C * D var e = this.curve.d.redMul(c).redMul(d); // F = B - E var f = b.redSub(e); // G = B + E var g = b.redAdd(e); // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D) var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d); var nx = a.redMul(f).redMul(tmp); var ny; var nz; if (this.curve.twisted) { // Y3 = A * G * (D - a * C) ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c))); // Z3 = F * G nz = f.redMul(g); } else { // Y3 = A * G * (D - C) ny = a.redMul(g).redMul(d.redSub(c)); // Z3 = c * F * G nz = this.curve._mulC(f).redMul(g); } return this.curve.point(nx, ny, nz); }; Point.prototype.add = function add(p) { if (this.isInfinity()) return p; if (p.isInfinity()) return this; if (this.curve.extended) return this._extAdd(p); else return this._projAdd(p); }; Point.prototype.mul = function mul(k) { if (this._hasDoubles(k)) return this.curve._fixedNafMul(this, k); else return this.curve._wnafMul(this, k); }; Point.prototype.mulAdd = function mulAdd(k1, p, k2) { return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2); }; Point.prototype.normalize = function normalize() { if (this.zOne) return this; // Normalize coordinates var zi = this.z.redInvm(); this.x = this.x.redMul(zi); this.y = this.y.redMul(zi); if (this.t) this.t = this.t.redMul(zi); this.z = this.curve.one; this.zOne = true; return this; }; Point.prototype.neg = function neg() { return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg()); }; Point.prototype.getX = function getX() { this.normalize(); return this.x.fromRed(); }; Point.prototype.getY = function getY() { this.normalize(); return this.y.fromRed(); }; Point.prototype.eq = function eq(other) { return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0; }; // Compatibility with BaseCurve Point.prototype.toP = Point.prototype.normalize; Point.prototype.mixedAdd = Point.prototype.add; },{"../../elliptic":125,"../curve":128,"bn.js":29,"inherits":167}],128:[function(require,module,exports){ 'use strict'; var curve = exports; curve.base = require('./base'); curve.short = require('./short'); curve.mont = require('./mont'); curve.edwards = require('./edwards'); },{"./base":126,"./edwards":127,"./mont":129,"./short":130}],129:[function(require,module,exports){ 'use strict'; var curve = require('../curve'); var BN = require('bn.js'); var inherits = require('inherits'); var Base = curve.base; var elliptic = require('../../elliptic'); var utils = elliptic.utils; function MontCurve(conf) { Base.call(this, 'mont', conf); this.a = new BN(conf.a, 16).toRed(this.red); this.b = new BN(conf.b, 16).toRed(this.red); this.i4 = new BN(4).toRed(this.red).redInvm(); this.two = new BN(2).toRed(this.red); this.a24 = this.i4.redMul(this.a.redAdd(this.two)); } inherits(MontCurve, Base); module.exports = MontCurve; MontCurve.prototype.validate = function validate(point) { var x = point.normalize().x; var x2 = x.redSqr(); var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x); var y = rhs.redSqrt(); return y.redSqr().cmp(rhs) === 0; }; function Point(curve, x, z) { Base.BasePoint.call(this, curve, 'projective'); if (x === null && z === null) { this.x = this.curve.one; this.z = this.curve.zero; } else { this.x = new BN(x, 16); this.z = new BN(z, 16); if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); } } inherits(Point, Base.BasePoint); MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) { return this.point(utils.toArray(bytes, enc), 1); }; MontCurve.prototype.point = function point(x, z) { return new Point(this, x, z); }; MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) { return Point.fromJSON(this, obj); }; Point.prototype.precompute = function precompute() { // No-op }; Point.prototype._encode = function _encode() { return this.getX().toArray('be', this.curve.p.byteLength()); }; Point.fromJSON = function fromJSON(curve, obj) { return new Point(curve, obj[0], obj[1] || curve.one); }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; Point.prototype.isInfinity = function isInfinity() { // XXX This code assumes that zero is always zero in red return this.z.cmpn(0) === 0; }; Point.prototype.dbl = function dbl() { // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3 // 2M + 2S + 4A // A = X1 + Z1 var a = this.x.redAdd(this.z); // AA = A^2 var aa = a.redSqr(); // B = X1 - Z1 var b = this.x.redSub(this.z); // BB = B^2 var bb = b.redSqr(); // C = AA - BB var c = aa.redSub(bb); // X3 = AA * BB var nx = aa.redMul(bb); // Z3 = C * (BB + A24 * C) var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c))); return this.curve.point(nx, nz); }; Point.prototype.add = function add() { throw new Error('Not supported on Montgomery curve'); }; Point.prototype.diffAdd = function diffAdd(p, diff) { // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3 // 4M + 2S + 6A // A = X2 + Z2 var a = this.x.redAdd(this.z); // B = X2 - Z2 var b = this.x.redSub(this.z); // C = X3 + Z3 var c = p.x.redAdd(p.z); // D = X3 - Z3 var d = p.x.redSub(p.z); // DA = D * A var da = d.redMul(a); // CB = C * B var cb = c.redMul(b); // X5 = Z1 * (DA + CB)^2 var nx = diff.z.redMul(da.redAdd(cb).redSqr()); // Z5 = X1 * (DA - CB)^2 var nz = diff.x.redMul(da.redISub(cb).redSqr()); return this.curve.point(nx, nz); }; Point.prototype.mul = function mul(k) { var t = k.clone(); var a = this; // (N / 2) * Q + Q var b = this.curve.point(null, null); // (N / 2) * Q var c = this; // Q for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1)) bits.push(t.andln(1)); for (var i = bits.length - 1; i >= 0; i--) { if (bits[i] === 0) { // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q a = a.diffAdd(b, c); // N * Q = 2 * ((N / 2) * Q + Q)) b = b.dbl(); } else { // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q) b = a.diffAdd(b, c); // N * Q + Q = 2 * ((N / 2) * Q + Q) a = a.dbl(); } } return b; }; Point.prototype.mulAdd = function mulAdd() { throw new Error('Not supported on Montgomery curve'); }; Point.prototype.eq = function eq(other) { return this.getX().cmp(other.getX()) === 0; }; Point.prototype.normalize = function normalize() { this.x = this.x.redMul(this.z.redInvm()); this.z = this.curve.one; return this; }; Point.prototype.getX = function getX() { // Normalize coordinates this.normalize(); return this.x.fromRed(); }; },{"../../elliptic":125,"../curve":128,"bn.js":29,"inherits":167}],130:[function(require,module,exports){ 'use strict'; var curve = require('../curve'); var elliptic = require('../../elliptic'); var BN = require('bn.js'); var inherits = require('inherits'); var Base = curve.base; var assert = elliptic.utils.assert; function ShortCurve(conf) { Base.call(this, 'short', conf); this.a = new BN(conf.a, 16).toRed(this.red); this.b = new BN(conf.b, 16).toRed(this.red); this.tinv = this.two.redInvm(); this.zeroA = this.a.fromRed().cmpn(0) === 0; this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; // If the curve is endomorphic, precalculate beta and lambda this.endo = this._getEndomorphism(conf); this._endoWnafT1 = new Array(4); this._endoWnafT2 = new Array(4); } inherits(ShortCurve, Base); module.exports = ShortCurve; ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) { // No efficient endomorphism if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) return; // Compute beta and lambda, that lambda * P = (beta * Px; Py) var beta; var lambda; if (conf.beta) { beta = new BN(conf.beta, 16).toRed(this.red); } else { var betas = this._getEndoRoots(this.p); // Choose the smallest beta beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]; beta = beta.toRed(this.red); } if (conf.lambda) { lambda = new BN(conf.lambda, 16); } else { // Choose the lambda that is matching selected beta var lambdas = this._getEndoRoots(this.n); if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) { lambda = lambdas[0]; } else { lambda = lambdas[1]; assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0); } } // Get basis vectors, used for balanced length-two representation var basis; if (conf.basis) { basis = conf.basis.map(function(vec) { return { a: new BN(vec.a, 16), b: new BN(vec.b, 16) }; }); } else { basis = this._getEndoBasis(lambda); } return { beta: beta, lambda: lambda, basis: basis }; }; ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) { // Find roots of for x^2 + x + 1 in F // Root = (-1 +- Sqrt(-3)) / 2 // var red = num === this.p ? this.red : BN.mont(num); var tinv = new BN(2).toRed(red).redInvm(); var ntinv = tinv.redNeg(); var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv); var l1 = ntinv.redAdd(s).fromRed(); var l2 = ntinv.redSub(s).fromRed(); return [ l1, l2 ]; }; ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) { // aprxSqrt >= sqrt(this.n) var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); // 3.74 // Run EGCD, until r(L + 1) < aprxSqrt var u = lambda; var v = this.n.clone(); var x1 = new BN(1); var y1 = new BN(0); var x2 = new BN(0); var y2 = new BN(1); // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n) var a0; var b0; // First vector var a1; var b1; // Second vector var a2; var b2; var prevR; var i = 0; var r; var x; while (u.cmpn(0) !== 0) { var q = v.div(u); r = v.sub(q.mul(u)); x = x2.sub(q.mul(x1)); var y = y2.sub(q.mul(y1)); if (!a1 && r.cmp(aprxSqrt) < 0) { a0 = prevR.neg(); b0 = x1; a1 = r.neg(); b1 = x; } else if (a1 && ++i === 2) { break; } prevR = r; v = u; u = r; x2 = x1; x1 = x; y2 = y1; y1 = y; } a2 = r.neg(); b2 = x; var len1 = a1.sqr().add(b1.sqr()); var len2 = a2.sqr().add(b2.sqr()); if (len2.cmp(len1) >= 0) { a2 = a0; b2 = b0; } // Normalize signs if (a1.negative) { a1 = a1.neg(); b1 = b1.neg(); } if (a2.negative) { a2 = a2.neg(); b2 = b2.neg(); } return [ { a: a1, b: b1 }, { a: a2, b: b2 } ]; }; ShortCurve.prototype._endoSplit = function _endoSplit(k) { var basis = this.endo.basis; var v1 = basis[0]; var v2 = basis[1]; var c1 = v2.b.mul(k).divRound(this.n); var c2 = v1.b.neg().mul(k).divRound(this.n); var p1 = c1.mul(v1.a); var p2 = c2.mul(v2.a); var q1 = c1.mul(v1.b); var q2 = c2.mul(v2.b); // Calculate answer var k1 = k.sub(p1).sub(p2); var k2 = q1.add(q2).neg(); return { k1: k1, k2: k2 }; }; ShortCurve.prototype.pointFromX = function pointFromX(x, odd) { x = new BN(x, 16); if (!x.red) x = x.toRed(this.red); var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b); var y = y2.redSqrt(); if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) throw new Error('invalid point'); // XXX Is there any way to tell if the number is odd without converting it // to non-red form? var isOdd = y.fromRed().isOdd(); if (odd && !isOdd || !odd && isOdd) y = y.redNeg(); return this.point(x, y); }; ShortCurve.prototype.validate = function validate(point) { if (point.inf) return true; var x = point.x; var y = point.y; var ax = this.a.redMul(x); var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b); return y.redSqr().redISub(rhs).cmpn(0) === 0; }; ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs) { var npoints = this._endoWnafT1; var ncoeffs = this._endoWnafT2; for (var i = 0; i < points.length; i++) { var split = this._endoSplit(coeffs[i]); var p = points[i]; var beta = p._getBeta(); if (split.k1.negative) { split.k1.ineg(); p = p.neg(true); } if (split.k2.negative) { split.k2.ineg(); beta = beta.neg(true); } npoints[i * 2] = p; npoints[i * 2 + 1] = beta; ncoeffs[i * 2] = split.k1; ncoeffs[i * 2 + 1] = split.k2; } var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2); // Clean-up references to points and coefficients for (var j = 0; j < i * 2; j++) { npoints[j] = null; ncoeffs[j] = null; } return res; }; function Point(curve, x, y, isRed) { Base.BasePoint.call(this, curve, 'affine'); if (x === null && y === null) { this.x = null; this.y = null; this.inf = true; } else { this.x = new BN(x, 16); this.y = new BN(y, 16); // Force redgomery representation when loading from JSON if (isRed) { this.x.forceRed(this.curve.red); this.y.forceRed(this.curve.red); } if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); this.inf = false; } } inherits(Point, Base.BasePoint); ShortCurve.prototype.point = function point(x, y, isRed) { return new Point(this, x, y, isRed); }; ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) { return Point.fromJSON(this, obj, red); }; Point.prototype._getBeta = function _getBeta() { if (!this.curve.endo) return; var pre = this.precomputed; if (pre && pre.beta) return pre.beta; var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y); if (pre) { var curve = this.curve; var endoMul = function(p) { return curve.point(p.x.redMul(curve.endo.beta), p.y); }; pre.beta = beta; beta.precomputed = { beta: null, naf: pre.naf && { wnd: pre.naf.wnd, points: pre.naf.points.map(endoMul) }, doubles: pre.doubles && { step: pre.doubles.step, points: pre.doubles.points.map(endoMul) } }; } return beta; }; Point.prototype.toJSON = function toJSON() { if (!this.precomputed) return [ this.x, this.y ]; return [ this.x, this.y, this.precomputed && { doubles: this.precomputed.doubles && { step: this.precomputed.doubles.step, points: this.precomputed.doubles.points.slice(1) }, naf: this.precomputed.naf && { wnd: this.precomputed.naf.wnd, points: this.precomputed.naf.points.slice(1) } } ]; }; Point.fromJSON = function fromJSON(curve, obj, red) { if (typeof obj === 'string') obj = JSON.parse(obj); var res = curve.point(obj[0], obj[1], red); if (!obj[2]) return res; function obj2point(obj) { return curve.point(obj[0], obj[1], red); } var pre = obj[2]; res.precomputed = { beta: null, doubles: pre.doubles && { step: pre.doubles.step, points: [ res ].concat(pre.doubles.points.map(obj2point)) }, naf: pre.naf && { wnd: pre.naf.wnd, points: [ res ].concat(pre.naf.points.map(obj2point)) } }; return res; }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; Point.prototype.isInfinity = function isInfinity() { return this.inf; }; Point.prototype.add = function add(p) { // O + P = P if (this.inf) return p; // P + O = P if (p.inf) return this; // P + P = 2P if (this.eq(p)) return this.dbl(); // P + (-P) = O if (this.neg().eq(p)) return this.curve.point(null, null); // P + Q = O if (this.x.cmp(p.x) === 0) return this.curve.point(null, null); var c = this.y.redSub(p.y); if (c.cmpn(0) !== 0) c = c.redMul(this.x.redSub(p.x).redInvm()); var nx = c.redSqr().redISub(this.x).redISub(p.x); var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); return this.curve.point(nx, ny); }; Point.prototype.dbl = function dbl() { if (this.inf) return this; // 2P = O var ys1 = this.y.redAdd(this.y); if (ys1.cmpn(0) === 0) return this.curve.point(null, null); var a = this.curve.a; var x2 = this.x.redSqr(); var dyinv = ys1.redInvm(); var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv); var nx = c.redSqr().redISub(this.x.redAdd(this.x)); var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); return this.curve.point(nx, ny); }; Point.prototype.getX = function getX() { return this.x.fromRed(); }; Point.prototype.getY = function getY() { return this.y.fromRed(); }; Point.prototype.mul = function mul(k) { k = new BN(k, 16); if (this._hasDoubles(k)) return this.curve._fixedNafMul(this, k); else if (this.curve.endo) return this.curve._endoWnafMulAdd([ this ], [ k ]); else return this.curve._wnafMul(this, k); }; Point.prototype.mulAdd = function mulAdd(k1, p2, k2) { var points = [ this, p2 ]; var coeffs = [ k1, k2 ]; if (this.curve.endo) return this.curve._endoWnafMulAdd(points, coeffs); else return this.curve._wnafMulAdd(1, points, coeffs, 2); }; Point.prototype.eq = function eq(p) { return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0); }; Point.prototype.neg = function neg(_precompute) { if (this.inf) return this; var res = this.curve.point(this.x, this.y.redNeg()); if (_precompute && this.precomputed) { var pre = this.precomputed; var negate = function(p) { return p.neg(); }; res.precomputed = { naf: pre.naf && { wnd: pre.naf.wnd, points: pre.naf.points.map(negate) }, doubles: pre.doubles && { step: pre.doubles.step, points: pre.doubles.points.map(negate) } }; } return res; }; Point.prototype.toJ = function toJ() { if (this.inf) return this.curve.jpoint(null, null, null); var res = this.curve.jpoint(this.x, this.y, this.curve.one); return res; }; function JPoint(curve, x, y, z) { Base.BasePoint.call(this, curve, 'jacobian'); if (x === null && y === null && z === null) { this.x = this.curve.one; this.y = this.curve.one; this.z = new BN(0); } else { this.x = new BN(x, 16); this.y = new BN(y, 16); this.z = new BN(z, 16); } if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); this.zOne = this.z === this.curve.one; } inherits(JPoint, Base.BasePoint); ShortCurve.prototype.jpoint = function jpoint(x, y, z) { return new JPoint(this, x, y, z); }; JPoint.prototype.toP = function toP() { if (this.isInfinity()) return this.curve.point(null, null); var zinv = this.z.redInvm(); var zinv2 = zinv.redSqr(); var ax = this.x.redMul(zinv2); var ay = this.y.redMul(zinv2).redMul(zinv); return this.curve.point(ax, ay); }; JPoint.prototype.neg = function neg() { return this.curve.jpoint(this.x, this.y.redNeg(), this.z); }; JPoint.prototype.add = function add(p) { // O + P = P if (this.isInfinity()) return p; // P + O = P if (p.isInfinity()) return this; // 12M + 4S + 7A var pz2 = p.z.redSqr(); var z2 = this.z.redSqr(); var u1 = this.x.redMul(pz2); var u2 = p.x.redMul(z2); var s1 = this.y.redMul(pz2.redMul(p.z)); var s2 = p.y.redMul(z2.redMul(this.z)); var h = u1.redSub(u2); var r = s1.redSub(s2); if (h.cmpn(0) === 0) { if (r.cmpn(0) !== 0) return this.curve.jpoint(null, null, null); else return this.dbl(); } var h2 = h.redSqr(); var h3 = h2.redMul(h); var v = u1.redMul(h2); var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); var nz = this.z.redMul(p.z).redMul(h); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.mixedAdd = function mixedAdd(p) { // O + P = P if (this.isInfinity()) return p.toJ(); // P + O = P if (p.isInfinity()) return this; // 8M + 3S + 7A var z2 = this.z.redSqr(); var u1 = this.x; var u2 = p.x.redMul(z2); var s1 = this.y; var s2 = p.y.redMul(z2).redMul(this.z); var h = u1.redSub(u2); var r = s1.redSub(s2); if (h.cmpn(0) === 0) { if (r.cmpn(0) !== 0) return this.curve.jpoint(null, null, null); else return this.dbl(); } var h2 = h.redSqr(); var h3 = h2.redMul(h); var v = u1.redMul(h2); var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); var nz = this.z.redMul(h); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.dblp = function dblp(pow) { if (pow === 0) return this; if (this.isInfinity()) return this; if (!pow) return this.dbl(); if (this.curve.zeroA || this.curve.threeA) { var r = this; for (var i = 0; i < pow; i++) r = r.dbl(); return r; } // 1M + 2S + 1A + N * (4S + 5M + 8A) // N = 1 => 6M + 6S + 9A var a = this.curve.a; var tinv = this.curve.tinv; var jx = this.x; var jy = this.y; var jz = this.z; var jz4 = jz.redSqr().redSqr(); // Reuse results var jyd = jy.redAdd(jy); for (var i = 0; i < pow; i++) { var jx2 = jx.redSqr(); var jyd2 = jyd.redSqr(); var jyd4 = jyd2.redSqr(); var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); var t1 = jx.redMul(jyd2); var nx = c.redSqr().redISub(t1.redAdd(t1)); var t2 = t1.redISub(nx); var dny = c.redMul(t2); dny = dny.redIAdd(dny).redISub(jyd4); var nz = jyd.redMul(jz); if (i + 1 < pow) jz4 = jz4.redMul(jyd4); jx = nx; jz = nz; jyd = dny; } return this.curve.jpoint(jx, jyd.redMul(tinv), jz); }; JPoint.prototype.dbl = function dbl() { if (this.isInfinity()) return this; if (this.curve.zeroA) return this._zeroDbl(); else if (this.curve.threeA) return this._threeDbl(); else return this._dbl(); }; JPoint.prototype._zeroDbl = function _zeroDbl() { var nx; var ny; var nz; // Z = 1 if (this.zOne) { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html // #doubling-mdbl-2007-bl // 1M + 5S + 14A // XX = X1^2 var xx = this.x.redSqr(); // YY = Y1^2 var yy = this.y.redSqr(); // YYYY = YY^2 var yyyy = yy.redSqr(); // S = 2 * ((X1 + YY)^2 - XX - YYYY) var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); s = s.redIAdd(s); // M = 3 * XX + a; a = 0 var m = xx.redAdd(xx).redIAdd(xx); // T = M ^ 2 - 2*S var t = m.redSqr().redISub(s).redISub(s); // 8 * YYYY var yyyy8 = yyyy.redIAdd(yyyy); yyyy8 = yyyy8.redIAdd(yyyy8); yyyy8 = yyyy8.redIAdd(yyyy8); // X3 = T nx = t; // Y3 = M * (S - T) - 8 * YYYY ny = m.redMul(s.redISub(t)).redISub(yyyy8); // Z3 = 2*Y1 nz = this.y.redAdd(this.y); } else { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html // #doubling-dbl-2009-l // 2M + 5S + 13A // A = X1^2 var a = this.x.redSqr(); // B = Y1^2 var b = this.y.redSqr(); // C = B^2 var c = b.redSqr(); // D = 2 * ((X1 + B)^2 - A - C) var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c); d = d.redIAdd(d); // E = 3 * A var e = a.redAdd(a).redIAdd(a); // F = E^2 var f = e.redSqr(); // 8 * C var c8 = c.redIAdd(c); c8 = c8.redIAdd(c8); c8 = c8.redIAdd(c8); // X3 = F - 2 * D nx = f.redISub(d).redISub(d); // Y3 = E * (D - X3) - 8 * C ny = e.redMul(d.redISub(nx)).redISub(c8); // Z3 = 2 * Y1 * Z1 nz = this.y.redMul(this.z); nz = nz.redIAdd(nz); } return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype._threeDbl = function _threeDbl() { var nx; var ny; var nz; // Z = 1 if (this.zOne) { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html // #doubling-mdbl-2007-bl // 1M + 5S + 15A // XX = X1^2 var xx = this.x.redSqr(); // YY = Y1^2 var yy = this.y.redSqr(); // YYYY = YY^2 var yyyy = yy.redSqr(); // S = 2 * ((X1 + YY)^2 - XX - YYYY) var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); s = s.redIAdd(s); // M = 3 * XX + a var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); // T = M^2 - 2 * S var t = m.redSqr().redISub(s).redISub(s); // X3 = T nx = t; // Y3 = M * (S - T) - 8 * YYYY var yyyy8 = yyyy.redIAdd(yyyy); yyyy8 = yyyy8.redIAdd(yyyy8); yyyy8 = yyyy8.redIAdd(yyyy8); ny = m.redMul(s.redISub(t)).redISub(yyyy8); // Z3 = 2 * Y1 nz = this.y.redAdd(this.y); } else { // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b // 3M + 5S // delta = Z1^2 var delta = this.z.redSqr(); // gamma = Y1^2 var gamma = this.y.redSqr(); // beta = X1 * gamma var beta = this.x.redMul(gamma); // alpha = 3 * (X1 - delta) * (X1 + delta) var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta)); alpha = alpha.redAdd(alpha).redIAdd(alpha); // X3 = alpha^2 - 8 * beta var beta4 = beta.redIAdd(beta); beta4 = beta4.redIAdd(beta4); var beta8 = beta4.redAdd(beta4); nx = alpha.redSqr().redISub(beta8); // Z3 = (Y1 + Z1)^2 - gamma - delta nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2 var ggamma8 = gamma.redSqr(); ggamma8 = ggamma8.redIAdd(ggamma8); ggamma8 = ggamma8.redIAdd(ggamma8); ggamma8 = ggamma8.redIAdd(ggamma8); ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8); } return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype._dbl = function _dbl() { var a = this.curve.a; // 4M + 6S + 10A var jx = this.x; var jy = this.y; var jz = this.z; var jz4 = jz.redSqr().redSqr(); var jx2 = jx.redSqr(); var jy2 = jy.redSqr(); var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); var jxd4 = jx.redAdd(jx); jxd4 = jxd4.redIAdd(jxd4); var t1 = jxd4.redMul(jy2); var nx = c.redSqr().redISub(t1.redAdd(t1)); var t2 = t1.redISub(nx); var jyd8 = jy2.redSqr(); jyd8 = jyd8.redIAdd(jyd8); jyd8 = jyd8.redIAdd(jyd8); jyd8 = jyd8.redIAdd(jyd8); var ny = c.redMul(t2).redISub(jyd8); var nz = jy.redAdd(jy).redMul(jz); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.trpl = function trpl() { if (!this.curve.zeroA) return this.dbl().add(this); // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl // 5M + 10S + ... // XX = X1^2 var xx = this.x.redSqr(); // YY = Y1^2 var yy = this.y.redSqr(); // ZZ = Z1^2 var zz = this.z.redSqr(); // YYYY = YY^2 var yyyy = yy.redSqr(); // M = 3 * XX + a * ZZ2; a = 0 var m = xx.redAdd(xx).redIAdd(xx); // MM = M^2 var mm = m.redSqr(); // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); e = e.redIAdd(e); e = e.redAdd(e).redIAdd(e); e = e.redISub(mm); // EE = E^2 var ee = e.redSqr(); // T = 16*YYYY var t = yyyy.redIAdd(yyyy); t = t.redIAdd(t); t = t.redIAdd(t); t = t.redIAdd(t); // U = (M + E)^2 - MM - EE - T var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); // X3 = 4 * (X1 * EE - 4 * YY * U) var yyu4 = yy.redMul(u); yyu4 = yyu4.redIAdd(yyu4); yyu4 = yyu4.redIAdd(yyu4); var nx = this.x.redMul(ee).redISub(yyu4); nx = nx.redIAdd(nx); nx = nx.redIAdd(nx); // Y3 = 8 * Y1 * (U * (T - U) - E * EE) var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee))); ny = ny.redIAdd(ny); ny = ny.redIAdd(ny); ny = ny.redIAdd(ny); // Z3 = (Z1 + E)^2 - ZZ - EE var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.mul = function mul(k, kbase) { k = new BN(k, kbase); return this.curve._wnafMul(this, k); }; JPoint.prototype.eq = function eq(p) { if (p.type === 'affine') return this.eq(p.toJ()); if (this === p) return true; // x1 * z2^2 == x2 * z1^2 var z2 = this.z.redSqr(); var pz2 = p.z.redSqr(); if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) return false; // y1 * z2^3 == y2 * z1^3 var z3 = z2.redMul(this.z); var pz3 = pz2.redMul(p.z); return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0; }; JPoint.prototype.inspect = function inspect() { if (this.isInfinity()) return ''; return ''; }; JPoint.prototype.isInfinity = function isInfinity() { // XXX This code assumes that zero is always zero in red return this.z.cmpn(0) === 0; }; },{"../../elliptic":125,"../curve":128,"bn.js":29,"inherits":167}],131:[function(require,module,exports){ 'use strict'; var curves = exports; var hash = require('hash.js'); var elliptic = require('../elliptic'); var assert = elliptic.utils.assert; function PresetCurve(options) { if (options.type === 'short') this.curve = new elliptic.curve.short(options); else if (options.type === 'edwards') this.curve = new elliptic.curve.edwards(options); else this.curve = new elliptic.curve.mont(options); this.g = this.curve.g; this.n = this.curve.n; this.hash = options.hash; assert(this.g.validate(), 'Invalid curve'); assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O'); } curves.PresetCurve = PresetCurve; function defineCurve(name, options) { Object.defineProperty(curves, name, { configurable: true, enumerable: true, get: function() { var curve = new PresetCurve(options); Object.defineProperty(curves, name, { configurable: true, enumerable: true, value: curve }); return curve; } }); } defineCurve('p192', { type: 'short', prime: 'p192', p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff', a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc', b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1', n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831', hash: hash.sha256, gRed: false, g: [ '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012', '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811' ] }); defineCurve('p224', { type: 'short', prime: 'p224', p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001', a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe', b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4', n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d', hash: hash.sha256, gRed: false, g: [ 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21', 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34' ] }); defineCurve('p256', { type: 'short', prime: null, p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff', a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc', b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b', n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551', hash: hash.sha256, gRed: false, g: [ '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296', '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5' ] }); defineCurve('p384', { type: 'short', prime: null, p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'fffffffe ffffffff 00000000 00000000 ffffffff', a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'fffffffe ffffffff 00000000 00000000 fffffffc', b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' + '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef', n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' + 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973', hash: hash.sha384, gRed: false, g: [ 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' + '5502f25d bf55296c 3a545e38 72760ab7', '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f' ] }); defineCurve('p521', { type: 'short', prime: null, p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff ffffffff', a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff ffffffff ffffffff fffffffc', b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' + '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' + '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00', n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' + 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409', hash: hash.sha512, gRed: false, g: [ '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' + '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' + 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66', '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' + '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' + '3fad0761 353c7086 a272c240 88be9476 9fd16650' ] }); defineCurve('curve25519', { type: 'mont', prime: 'p25519', p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', a: '76d06', b: '0', n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', hash: hash.sha256, gRed: false, g: [ '9' ] }); defineCurve('ed25519', { type: 'edwards', prime: 'p25519', p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', a: '-1', c: '1', // -121665 * (121666^(-1)) (mod P) d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3', n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', hash: hash.sha256, gRed: false, g: [ '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a', // 4/5 '6666666666666666666666666666666666666666666666666666666666666658' ] }); var pre; try { pre = require('./precomputed/secp256k1'); } catch (e) { pre = undefined; } defineCurve('secp256k1', { type: 'short', prime: 'k256', p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f', a: '0', b: '7', n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141', h: '1', hash: hash.sha256, // Precomputed endomorphism beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee', lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72', basis: [ { a: '3086d221a7d46bcde86c90e49284eb15', b: '-e4437ed6010e88286f547fa90abfe4c3' }, { a: '114ca50f7a8e2f3f657c1108d9d44cfd8', b: '3086d221a7d46bcde86c90e49284eb15' } ], gRed: false, g: [ '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8', pre ] }); },{"../elliptic":125,"./precomputed/secp256k1":139,"hash.js":155}],132:[function(require,module,exports){ 'use strict'; var BN = require('bn.js'); var elliptic = require('../../elliptic'); var utils = elliptic.utils; var assert = utils.assert; var KeyPair = require('./key'); var Signature = require('./signature'); function EC(options) { if (!(this instanceof EC)) return new EC(options); // Shortcut `elliptic.ec(curve-name)` if (typeof options === 'string') { assert(elliptic.curves.hasOwnProperty(options), 'Unknown curve ' + options); options = elliptic.curves[options]; } // Shortcut for `elliptic.ec(elliptic.curves.curveName)` if (options instanceof elliptic.curves.PresetCurve) options = { curve: options }; this.curve = options.curve.curve; this.n = this.curve.n; this.nh = this.n.ushrn(1); this.g = this.curve.g; // Point on curve this.g = options.curve.g; this.g.precompute(options.curve.n.bitLength() + 1); // Hash for function for DRBG this.hash = options.hash || options.curve.hash; } module.exports = EC; EC.prototype.keyPair = function keyPair(options) { return new KeyPair(this, options); }; EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) { return KeyPair.fromPrivate(this, priv, enc); }; EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) { return KeyPair.fromPublic(this, pub, enc); }; EC.prototype.genKeyPair = function genKeyPair(options) { if (!options) options = {}; // Instantiate Hmac_DRBG var drbg = new elliptic.hmacDRBG({ hash: this.hash, pers: options.pers, entropy: options.entropy || elliptic.rand(this.hash.hmacStrength), nonce: this.n.toArray() }); var bytes = this.n.byteLength(); var ns2 = this.n.sub(new BN(2)); do { var priv = new BN(drbg.generate(bytes)); if (priv.cmp(ns2) > 0) continue; priv.iaddn(1); return this.keyFromPrivate(priv); } while (true); }; EC.prototype._truncateToN = function truncateToN(msg, truncOnly) { var delta = msg.byteLength() * 8 - this.n.bitLength(); if (delta > 0) msg = msg.ushrn(delta); if (!truncOnly && msg.cmp(this.n) >= 0) return msg.sub(this.n); else return msg; }; EC.prototype.sign = function sign(msg, key, enc, options) { if (typeof enc === 'object') { options = enc; enc = null; } if (!options) options = {}; key = this.keyFromPrivate(key, enc); msg = this._truncateToN(new BN(msg, 16)); // Zero-extend key to provide enough entropy var bytes = this.n.byteLength(); var bkey = key.getPrivate().toArray('be', bytes); // Zero-extend nonce to have the same byte size as N var nonce = msg.toArray('be', bytes); // Instantiate Hmac_DRBG var drbg = new elliptic.hmacDRBG({ hash: this.hash, entropy: bkey, nonce: nonce, pers: options.pers, persEnc: options.persEnc }); // Number of bytes to generate var ns1 = this.n.sub(new BN(1)); for (var iter = 0; true; iter++) { var k = options.k ? options.k(iter) : new BN(drbg.generate(this.n.byteLength())); k = this._truncateToN(k, true); if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) continue; var kp = this.g.mul(k); if (kp.isInfinity()) continue; var kpX = kp.getX(); var r = kpX.umod(this.n); if (r.cmpn(0) === 0) continue; var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg)); s = s.umod(this.n); if (s.cmpn(0) === 0) continue; var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0); // Use complement of `s`, if it is > `n / 2` if (options.canonical && s.cmp(this.nh) > 0) { s = this.n.sub(s); recoveryParam ^= 1; } return new Signature({ r: r, s: s, recoveryParam: recoveryParam }); } }; EC.prototype.verify = function verify(msg, signature, key, enc) { msg = this._truncateToN(new BN(msg, 16)); key = this.keyFromPublic(key, enc); signature = new Signature(signature, 'hex'); // Perform primitive values validation var r = signature.r; var s = signature.s; if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0) return false; if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0) return false; // Validate signature var sinv = s.invm(this.n); var u1 = sinv.mul(msg).umod(this.n); var u2 = sinv.mul(r).umod(this.n); var p = this.g.mulAdd(u1, key.getPublic(), u2); if (p.isInfinity()) return false; return p.getX().umod(this.n).cmp(r) === 0; }; EC.prototype.recoverPubKey = function(msg, signature, j, enc) { assert((3 & j) === j, 'The recovery param is more than two bits'); signature = new Signature(signature, enc); var n = this.n; var e = new BN(msg); var r = signature.r; var s = signature.s; // A set LSB signifies that the y-coordinate is odd var isYOdd = j & 1; var isSecondKey = j >> 1; if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey) throw new Error('Unable to find sencond key candinate'); // 1.1. Let x = r + jn. if (isSecondKey) r = this.curve.pointFromX(r.add(this.curve.n), isYOdd); else r = this.curve.pointFromX(r, isYOdd); var eNeg = n.sub(e); // 1.6.1 Compute Q = r^-1 (sR - eG) // Q = r^-1 (sR + -eG) var rInv = signature.r.invm(n); return this.g.mulAdd(eNeg, r, s).mul(rInv); }; EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) { signature = new Signature(signature, enc); if (signature.recoveryParam !== null) return signature.recoveryParam; for (var i = 0; i < 4; i++) { var Qprime; try { Qprime = this.recoverPubKey(e, signature, i); } catch (e) { continue; } if (Qprime.eq(Q)) return i; } throw new Error('Unable to find valid recovery factor'); }; },{"../../elliptic":125,"./key":133,"./signature":134,"bn.js":29}],133:[function(require,module,exports){ 'use strict'; var BN = require('bn.js'); function KeyPair(ec, options) { this.ec = ec; this.priv = null; this.pub = null; // KeyPair(ec, { priv: ..., pub: ... }) if (options.priv) this._importPrivate(options.priv, options.privEnc); if (options.pub) this._importPublic(options.pub, options.pubEnc); } module.exports = KeyPair; KeyPair.fromPublic = function fromPublic(ec, pub, enc) { if (pub instanceof KeyPair) return pub; return new KeyPair(ec, { pub: pub, pubEnc: enc }); }; KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) { if (priv instanceof KeyPair) return priv; return new KeyPair(ec, { priv: priv, privEnc: enc }); }; KeyPair.prototype.validate = function validate() { var pub = this.getPublic(); if (pub.isInfinity()) return { result: false, reason: 'Invalid public key' }; if (!pub.validate()) return { result: false, reason: 'Public key is not a point' }; if (!pub.mul(this.ec.curve.n).isInfinity()) return { result: false, reason: 'Public key * N != O' }; return { result: true, reason: null }; }; KeyPair.prototype.getPublic = function getPublic(compact, enc) { // compact is optional argument if (typeof compact === 'string') { enc = compact; compact = null; } if (!this.pub) this.pub = this.ec.g.mul(this.priv); if (!enc) return this.pub; return this.pub.encode(enc, compact); }; KeyPair.prototype.getPrivate = function getPrivate(enc) { if (enc === 'hex') return this.priv.toString(16, 2); else return this.priv; }; KeyPair.prototype._importPrivate = function _importPrivate(key, enc) { this.priv = new BN(key, enc || 16); // Ensure that the priv won't be bigger than n, otherwise we may fail // in fixed multiplication method this.priv = this.priv.umod(this.ec.curve.n); }; KeyPair.prototype._importPublic = function _importPublic(key, enc) { if (key.x || key.y) { this.pub = this.ec.curve.point(key.x, key.y); return; } this.pub = this.ec.curve.decodePoint(key, enc); }; // ECDH KeyPair.prototype.derive = function derive(pub) { return pub.mul(this.priv).getX(); }; // ECDSA KeyPair.prototype.sign = function sign(msg, enc, options) { return this.ec.sign(msg, this, enc, options); }; KeyPair.prototype.verify = function verify(msg, signature) { return this.ec.verify(msg, signature, this); }; KeyPair.prototype.inspect = function inspect() { return ''; }; },{"bn.js":29}],134:[function(require,module,exports){ 'use strict'; var BN = require('bn.js'); var elliptic = require('../../elliptic'); var utils = elliptic.utils; var assert = utils.assert; function Signature(options, enc) { if (options instanceof Signature) return options; if (this._importDER(options, enc)) return; assert(options.r && options.s, 'Signature without r or s'); this.r = new BN(options.r, 16); this.s = new BN(options.s, 16); if (options.recoveryParam === undefined) this.recoveryParam = null; else this.recoveryParam = options.recoveryParam; } module.exports = Signature; function Position() { this.place = 0; } function getLength(buf, p) { var initial = buf[p.place++]; if (!(initial & 0x80)) { return initial; } var octetLen = initial & 0xf; var val = 0; for (var i = 0, off = p.place; i < octetLen; i++, off++) { val <<= 8; val |= buf[off]; } p.place = off; return val; } function rmPadding(buf) { var i = 0; var len = buf.length - 1; while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) { i++; } if (i === 0) { return buf; } return buf.slice(i); } Signature.prototype._importDER = function _importDER(data, enc) { data = utils.toArray(data, enc); var p = new Position(); if (data[p.place++] !== 0x30) { return false; } var len = getLength(data, p); if ((len + p.place) !== data.length) { return false; } if (data[p.place++] !== 0x02) { return false; } var rlen = getLength(data, p); var r = data.slice(p.place, rlen + p.place); p.place += rlen; if (data[p.place++] !== 0x02) { return false; } var slen = getLength(data, p); if (data.length !== slen + p.place) { return false; } var s = data.slice(p.place, slen + p.place); if (r[0] === 0 && (r[1] & 0x80)) { r = r.slice(1); } if (s[0] === 0 && (s[1] & 0x80)) { s = s.slice(1); } this.r = new BN(r); this.s = new BN(s); this.recoveryParam = null; return true; }; function constructLength(arr, len) { if (len < 0x80) { arr.push(len); return; } var octets = 1 + (Math.log(len) / Math.LN2 >>> 3); arr.push(octets | 0x80); while (--octets) { arr.push((len >>> (octets << 3)) & 0xff); } arr.push(len); } Signature.prototype.toDER = function toDER(enc) { var r = this.r.toArray(); var s = this.s.toArray(); // Pad values if (r[0] & 0x80) r = [ 0 ].concat(r); // Pad values if (s[0] & 0x80) s = [ 0 ].concat(s); r = rmPadding(r); s = rmPadding(s); while (!s[0] && !(s[1] & 0x80)) { s = s.slice(1); } var arr = [ 0x02 ]; constructLength(arr, r.length); arr = arr.concat(r); arr.push(0x02); constructLength(arr, s.length); var backHalf = arr.concat(s); var res = [ 0x30 ]; constructLength(res, backHalf.length); res = res.concat(backHalf); return utils.encode(res, enc); }; },{"../../elliptic":125,"bn.js":29}],135:[function(require,module,exports){ 'use strict'; var hash = require('hash.js'); var elliptic = require('../../elliptic'); var utils = elliptic.utils; var assert = utils.assert; var parseBytes = utils.parseBytes; var KeyPair = require('./key'); var Signature = require('./signature'); function EDDSA(curve) { assert(curve === 'ed25519', 'only tested with ed25519 so far'); if (!(this instanceof EDDSA)) return new EDDSA(curve); var curve = elliptic.curves[curve].curve; this.curve = curve; this.g = curve.g; this.g.precompute(curve.n.bitLength() + 1); this.pointClass = curve.point().constructor; this.encodingLength = Math.ceil(curve.n.bitLength() / 8); this.hash = hash.sha512; } module.exports = EDDSA; /** * @param {Array|String} message - message bytes * @param {Array|String|KeyPair} secret - secret bytes or a keypair * @returns {Signature} - signature */ EDDSA.prototype.sign = function sign(message, secret) { message = parseBytes(message); var key = this.keyFromSecret(secret); var r = this.hashInt(key.messagePrefix(), message); var R = this.g.mul(r); var Rencoded = this.encodePoint(R); var s_ = this.hashInt(Rencoded, key.pubBytes(), message) .mul(key.priv()); var S = r.add(s_).umod(this.curve.n); return this.makeSignature({ R: R, S: S, Rencoded: Rencoded }); }; /** * @param {Array} message - message bytes * @param {Array|String|Signature} sig - sig bytes * @param {Array|String|Point|KeyPair} pub - public key * @returns {Boolean} - true if public key matches sig of message */ EDDSA.prototype.verify = function verify(message, sig, pub) { message = parseBytes(message); sig = this.makeSignature(sig); var key = this.keyFromPublic(pub); var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message); var SG = this.g.mul(sig.S()); var RplusAh = sig.R().add(key.pub().mul(h)); return RplusAh.eq(SG); }; EDDSA.prototype.hashInt = function hashInt() { var hash = this.hash(); for (var i = 0; i < arguments.length; i++) hash.update(arguments[i]); return utils.intFromLE(hash.digest()).umod(this.curve.n); }; EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) { return KeyPair.fromPublic(this, pub); }; EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) { return KeyPair.fromSecret(this, secret); }; EDDSA.prototype.makeSignature = function makeSignature(sig) { if (sig instanceof Signature) return sig; return new Signature(this, sig); }; /** * * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2 * * EDDSA defines methods for encoding and decoding points and integers. These are * helper convenience methods, that pass along to utility functions implied * parameters. * */ EDDSA.prototype.encodePoint = function encodePoint(point) { var enc = point.getY().toArray('le', this.encodingLength); enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0; return enc; }; EDDSA.prototype.decodePoint = function decodePoint(bytes) { bytes = utils.parseBytes(bytes); var lastIx = bytes.length - 1; var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80); var xIsOdd = (bytes[lastIx] & 0x80) !== 0; var y = utils.intFromLE(normed); return this.curve.pointFromY(y, xIsOdd); }; EDDSA.prototype.encodeInt = function encodeInt(num) { return num.toArray('le', this.encodingLength); }; EDDSA.prototype.decodeInt = function decodeInt(bytes) { return utils.intFromLE(bytes); }; EDDSA.prototype.isPoint = function isPoint(val) { return val instanceof this.pointClass; }; },{"../../elliptic":125,"./key":136,"./signature":137,"hash.js":155}],136:[function(require,module,exports){ 'use strict'; var elliptic = require('../../elliptic'); var utils = elliptic.utils; var assert = utils.assert; var parseBytes = utils.parseBytes; var cachedProperty = utils.cachedProperty; /** * @param {EDDSA} eddsa - instance * @param {Object} params - public/private key parameters * * @param {Array} [params.secret] - secret seed bytes * @param {Point} [params.pub] - public key point (aka `A` in eddsa terms) * @param {Array} [params.pub] - public key point encoded as bytes * */ function KeyPair(eddsa, params) { this.eddsa = eddsa; this._secret = parseBytes(params.secret); if (eddsa.isPoint(params.pub)) this._pub = params.pub; else this._pubBytes = parseBytes(params.pub); } KeyPair.fromPublic = function fromPublic(eddsa, pub) { if (pub instanceof KeyPair) return pub; return new KeyPair(eddsa, { pub: pub }); }; KeyPair.fromSecret = function fromSecret(eddsa, secret) { if (secret instanceof KeyPair) return secret; return new KeyPair(eddsa, { secret: secret }); }; KeyPair.prototype.secret = function secret() { return this._secret; }; cachedProperty(KeyPair, function pubBytes() { return this.eddsa.encodePoint(this.pub()); }); cachedProperty(KeyPair, function pub() { if (this._pubBytes) return this.eddsa.decodePoint(this._pubBytes); return this.eddsa.g.mul(this.priv()); }); cachedProperty(KeyPair, function privBytes() { var eddsa = this.eddsa; var hash = this.hash(); var lastIx = eddsa.encodingLength - 1; var a = hash.slice(0, eddsa.encodingLength); a[0] &= 248; a[lastIx] &= 127; a[lastIx] |= 64; return a; }); cachedProperty(KeyPair, function priv() { return this.eddsa.decodeInt(this.privBytes()); }); cachedProperty(KeyPair, function hash() { return this.eddsa.hash().update(this.secret()).digest(); }); cachedProperty(KeyPair, function messagePrefix() { return this.hash().slice(this.eddsa.encodingLength); }); KeyPair.prototype.sign = function sign(message) { assert(this._secret, 'KeyPair can only verify'); return this.eddsa.sign(message, this); }; KeyPair.prototype.verify = function verify(message, sig) { return this.eddsa.verify(message, sig, this); }; KeyPair.prototype.getSecret = function getSecret(enc) { assert(this._secret, 'KeyPair is public only'); return utils.encode(this.secret(), enc); }; KeyPair.prototype.getPublic = function getPublic(enc) { return utils.encode(this.pubBytes(), enc); }; module.exports = KeyPair; },{"../../elliptic":125}],137:[function(require,module,exports){ 'use strict'; var BN = require('bn.js'); var elliptic = require('../../elliptic'); var utils = elliptic.utils; var assert = utils.assert; var cachedProperty = utils.cachedProperty; var parseBytes = utils.parseBytes; /** * @param {EDDSA} eddsa - eddsa instance * @param {Array|Object} sig - * @param {Array|Point} [sig.R] - R point as Point or bytes * @param {Array|bn} [sig.S] - S scalar as bn or bytes * @param {Array} [sig.Rencoded] - R point encoded * @param {Array} [sig.Sencoded] - S scalar encoded */ function Signature(eddsa, sig) { this.eddsa = eddsa; if (typeof sig !== 'object') sig = parseBytes(sig); if (Array.isArray(sig)) { sig = { R: sig.slice(0, eddsa.encodingLength), S: sig.slice(eddsa.encodingLength) }; } assert(sig.R && sig.S, 'Signature without R or S'); if (eddsa.isPoint(sig.R)) this._R = sig.R; if (sig.S instanceof BN) this._S = sig.S; this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded; this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded; } cachedProperty(Signature, function S() { return this.eddsa.decodeInt(this.Sencoded()); }); cachedProperty(Signature, function R() { return this.eddsa.decodePoint(this.Rencoded()); }); cachedProperty(Signature, function Rencoded() { return this.eddsa.encodePoint(this.R()); }); cachedProperty(Signature, function Sencoded() { return this.eddsa.encodeInt(this.S()); }); Signature.prototype.toBytes = function toBytes() { return this.Rencoded().concat(this.Sencoded()); }; Signature.prototype.toHex = function toHex() { return utils.encode(this.toBytes(), 'hex').toUpperCase(); }; module.exports = Signature; },{"../../elliptic":125,"bn.js":29}],138:[function(require,module,exports){ 'use strict'; var hash = require('hash.js'); var elliptic = require('../elliptic'); var utils = elliptic.utils; var assert = utils.assert; function HmacDRBG(options) { if (!(this instanceof HmacDRBG)) return new HmacDRBG(options); this.hash = options.hash; this.predResist = !!options.predResist; this.outLen = this.hash.outSize; this.minEntropy = options.minEntropy || this.hash.hmacStrength; this.reseed = null; this.reseedInterval = null; this.K = null; this.V = null; var entropy = utils.toArray(options.entropy, options.entropyEnc); var nonce = utils.toArray(options.nonce, options.nonceEnc); var pers = utils.toArray(options.pers, options.persEnc); assert(entropy.length >= (this.minEntropy / 8), 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); this._init(entropy, nonce, pers); } module.exports = HmacDRBG; HmacDRBG.prototype._init = function init(entropy, nonce, pers) { var seed = entropy.concat(nonce).concat(pers); this.K = new Array(this.outLen / 8); this.V = new Array(this.outLen / 8); for (var i = 0; i < this.V.length; i++) { this.K[i] = 0x00; this.V[i] = 0x01; } this._update(seed); this.reseed = 1; this.reseedInterval = 0x1000000000000; // 2^48 }; HmacDRBG.prototype._hmac = function hmac() { return new hash.hmac(this.hash, this.K); }; HmacDRBG.prototype._update = function update(seed) { var kmac = this._hmac() .update(this.V) .update([ 0x00 ]); if (seed) kmac = kmac.update(seed); this.K = kmac.digest(); this.V = this._hmac().update(this.V).digest(); if (!seed) return; this.K = this._hmac() .update(this.V) .update([ 0x01 ]) .update(seed) .digest(); this.V = this._hmac().update(this.V).digest(); }; HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) { // Optional entropy enc if (typeof entropyEnc !== 'string') { addEnc = add; add = entropyEnc; entropyEnc = null; } entropy = utils.toBuffer(entropy, entropyEnc); add = utils.toBuffer(add, addEnc); assert(entropy.length >= (this.minEntropy / 8), 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); this._update(entropy.concat(add || [])); this.reseed = 1; }; HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) { if (this.reseed > this.reseedInterval) throw new Error('Reseed is required'); // Optional encoding if (typeof enc !== 'string') { addEnc = add; add = enc; enc = null; } // Optional additional data if (add) { add = utils.toArray(add, addEnc); this._update(add); } var temp = []; while (temp.length < len) { this.V = this._hmac().update(this.V).digest(); temp = temp.concat(this.V); } var res = temp.slice(0, len); this._update(add); this.reseed++; return utils.encode(res, enc); }; },{"../elliptic":125,"hash.js":155}],139:[function(require,module,exports){ module.exports = { doubles: { step: 4, points: [ [ 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a', 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821' ], [ '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508', '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf' ], [ '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739', 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695' ], [ '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640', '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9' ], [ '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c', '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36' ], [ '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda', '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f' ], [ 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa', '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999' ], [ '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0', 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09' ], [ 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d', '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d' ], [ 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d', 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088' ], [ 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1', '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d' ], [ '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0', '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8' ], [ '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047', '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a' ], [ '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862', '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453' ], [ '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7', '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160' ], [ '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd', '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0' ], [ '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83', '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6' ], [ '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a', '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589' ], [ '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8', 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17' ], [ 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d', '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda' ], [ 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725', '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd' ], [ '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754', '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2' ], [ '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c', '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6' ], [ 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6', '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f' ], [ '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39', 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01' ], [ 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891', '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3' ], [ 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b', 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f' ], [ 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03', '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7' ], [ 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d', 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78' ], [ 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070', '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1' ], [ '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4', 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150' ], [ '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da', '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82' ], [ 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11', '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc' ], [ '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e', 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b' ], [ 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41', '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51' ], [ 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef', '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45' ], [ 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8', 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120' ], [ '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d', '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84' ], [ '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96', '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d' ], [ '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd', 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d' ], [ '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5', '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8' ], [ 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266', '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8' ], [ '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71', '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac' ], [ '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac', 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f' ], [ '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751', '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962' ], [ 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e', '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907' ], [ '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241', 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec' ], [ 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3', 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d' ], [ 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f', '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414' ], [ '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19', 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd' ], [ '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be', 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0' ], [ 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9', '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811' ], [ 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2', '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1' ], [ 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13', '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c' ], [ '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c', 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73' ], [ '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba', '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd' ], [ 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151', 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405' ], [ '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073', 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589' ], [ '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458', '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e' ], [ '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b', '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27' ], [ 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366', 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1' ], [ '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa', '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482' ], [ '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0', '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945' ], [ 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787', '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573' ], [ 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e', 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82' ] ] }, naf: { wnd: 7, points: [ [ 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9', '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672' ], [ '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4', 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6' ], [ '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc', '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da' ], [ 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe', 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37' ], [ '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb', 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b' ], [ 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8', 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81' ], [ 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e', '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58' ], [ 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34', '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77' ], [ '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c', '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a' ], [ '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5', '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c' ], [ '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f', '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67' ], [ '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714', '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402' ], [ 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729', 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55' ], [ 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db', '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482' ], [ '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4', 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82' ], [ '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5', 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396' ], [ '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479', '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49' ], [ '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d', '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf' ], [ '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f', '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a' ], [ '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb', 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7' ], [ 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9', 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933' ], [ '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963', '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a' ], [ '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74', '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6' ], [ 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530', 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37' ], [ '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b', '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e' ], [ 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247', 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6' ], [ 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1', 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476' ], [ '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120', '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40' ], [ '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435', '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61' ], [ '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18', '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683' ], [ 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8', '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5' ], [ '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb', '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b' ], [ 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f', '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417' ], [ '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143', 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868' ], [ '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba', 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a' ], [ 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45', 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6' ], [ '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a', '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996' ], [ '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e', 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e' ], [ 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8', 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d' ], [ '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c', '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2' ], [ '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519', 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e' ], [ '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab', '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437' ], [ '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca', 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311' ], [ 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf', '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4' ], [ '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610', '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575' ], [ '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4', 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d' ], [ '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c', 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d' ], [ 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940', 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629' ], [ 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980', 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06' ], [ '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3', '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374' ], [ '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf', '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee' ], [ 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63', '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1' ], [ 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448', 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b' ], [ '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf', '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661' ], [ '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5', '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6' ], [ 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6', '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e' ], [ '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5', '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d' ], [ 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99', 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc' ], [ '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51', 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4' ], [ '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5', '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c' ], [ 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5', '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b' ], [ 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997', '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913' ], [ '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881', '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154' ], [ '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5', '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865' ], [ '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66', 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc' ], [ '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726', 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224' ], [ '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede', '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e' ], [ '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94', '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6' ], [ '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31', '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511' ], [ '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51', 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b' ], [ 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252', 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2' ], [ '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5', 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c' ], [ 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b', '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3' ], [ 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4', '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d' ], [ 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f', '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700' ], [ 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889', '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4' ], [ '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246', 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196' ], [ '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984', '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4' ], [ '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a', 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257' ], [ 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030', 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13' ], [ 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197', '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096' ], [ 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593', 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38' ], [ 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef', '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f' ], [ '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38', '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448' ], [ 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a', '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a' ], [ 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111', '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4' ], [ '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502', '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437' ], [ '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea', 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7' ], [ 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26', '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d' ], [ 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986', '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a' ], [ 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e', '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54' ], [ '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4', '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77' ], [ 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda', 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517' ], [ '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859', 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10' ], [ 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f', 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125' ], [ 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c', '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e' ], [ '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942', 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1' ], [ 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a', '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2' ], [ 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80', '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423' ], [ 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d', '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8' ], [ '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1', 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758' ], [ '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63', 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375' ], [ 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352', '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d' ], [ '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193', 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec' ], [ '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00', '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0' ], [ '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58', 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c' ], [ 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7', 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4' ], [ '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8', 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f' ], [ '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e', '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649' ], [ '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d', 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826' ], [ '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b', '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5' ], [ 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f', 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87' ], [ '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6', '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b' ], [ 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297', '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc' ], [ '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a', '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c' ], [ 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c', 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f' ], [ 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52', '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a' ], [ 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb', 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46' ], [ '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065', 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f' ], [ '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917', '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03' ], [ '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9', 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08' ], [ '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3', '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8' ], [ '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57', '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373' ], [ '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66', 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3' ], [ '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8', '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8' ], [ '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721', '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1' ], [ '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180', '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9' ] ] } }; },{}],140:[function(require,module,exports){ 'use strict'; var utils = exports; var BN = require('bn.js'); utils.assert = function assert(val, msg) { if (!val) throw new Error(msg || 'Assertion failed'); }; function toArray(msg, enc) { if (Array.isArray(msg)) return msg.slice(); if (!msg) return []; var res = []; if (typeof msg !== 'string') { for (var i = 0; i < msg.length; i++) res[i] = msg[i] | 0; return res; } if (!enc) { for (var i = 0; i < msg.length; i++) { var c = msg.charCodeAt(i); var hi = c >> 8; var lo = c & 0xff; if (hi) res.push(hi, lo); else res.push(lo); } } else if (enc === 'hex') { msg = msg.replace(/[^a-z0-9]+/ig, ''); if (msg.length % 2 !== 0) msg = '0' + msg; for (var i = 0; i < msg.length; i += 2) res.push(parseInt(msg[i] + msg[i + 1], 16)); } return res; } utils.toArray = toArray; function zero2(word) { if (word.length === 1) return '0' + word; else return word; } utils.zero2 = zero2; function toHex(msg) { var res = ''; for (var i = 0; i < msg.length; i++) res += zero2(msg[i].toString(16)); return res; } utils.toHex = toHex; utils.encode = function encode(arr, enc) { if (enc === 'hex') return toHex(arr); else return arr; }; // Represent num in a w-NAF form function getNAF(num, w) { var naf = []; var ws = 1 << (w + 1); var k = num.clone(); while (k.cmpn(1) >= 0) { var z; if (k.isOdd()) { var mod = k.andln(ws - 1); if (mod > (ws >> 1) - 1) z = (ws >> 1) - mod; else z = mod; k.isubn(z); } else { z = 0; } naf.push(z); // Optimization, shift by word if possible var shift = (k.cmpn(0) !== 0 && k.andln(ws - 1) === 0) ? (w + 1) : 1; for (var i = 1; i < shift; i++) naf.push(0); k.iushrn(shift); } return naf; } utils.getNAF = getNAF; // Represent k1, k2 in a Joint Sparse Form function getJSF(k1, k2) { var jsf = [ [], [] ]; k1 = k1.clone(); k2 = k2.clone(); var d1 = 0; var d2 = 0; while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) { // First phase var m14 = (k1.andln(3) + d1) & 3; var m24 = (k2.andln(3) + d2) & 3; if (m14 === 3) m14 = -1; if (m24 === 3) m24 = -1; var u1; if ((m14 & 1) === 0) { u1 = 0; } else { var m8 = (k1.andln(7) + d1) & 7; if ((m8 === 3 || m8 === 5) && m24 === 2) u1 = -m14; else u1 = m14; } jsf[0].push(u1); var u2; if ((m24 & 1) === 0) { u2 = 0; } else { var m8 = (k2.andln(7) + d2) & 7; if ((m8 === 3 || m8 === 5) && m14 === 2) u2 = -m24; else u2 = m24; } jsf[1].push(u2); // Second phase if (2 * d1 === u1 + 1) d1 = 1 - d1; if (2 * d2 === u2 + 1) d2 = 1 - d2; k1.iushrn(1); k2.iushrn(1); } return jsf; } utils.getJSF = getJSF; function cachedProperty(obj, computer) { var name = computer.name; var key = '_' + name; obj.prototype[name] = function cachedProperty() { return this[key] !== undefined ? this[key] : this[key] = computer.call(this); }; } utils.cachedProperty = cachedProperty; function parseBytes(bytes) { return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') : bytes; } utils.parseBytes = parseBytes; function intFromLE(bytes) { return new BN(bytes, 'hex', 'le'); } utils.intFromLE = intFromLE; },{"bn.js":29}],141:[function(require,module,exports){ module.exports={ "_args": [ [ "elliptic@^6.0.0", "/Users/joran/Documents/development/patchdeck/node_modules/browserify-sign" ] ], "_from": "elliptic@>=6.0.0 <7.0.0", "_id": "elliptic@6.2.3", "_inCache": true, "_installable": true, "_location": "/elliptic", "_nodeVersion": "5.4.1", "_npmUser": { "email": "fedor@indutny.com", "name": "indutny" }, "_npmVersion": "3.3.12", "_phantomChildren": {}, "_requested": { "name": "elliptic", "raw": "elliptic@^6.0.0", "rawSpec": "^6.0.0", "scope": null, "spec": ">=6.0.0 <7.0.0", "type": "range" }, "_requiredBy": [ "/browserify-sign", "/create-ecdh" ], "_resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz", "_shasum": "18e46d7306b0951275a2d42063270a14b74ebe99", "_shrinkwrap": null, "_spec": "elliptic@^6.0.0", "_where": "/Users/joran/Documents/development/patchdeck/node_modules/browserify-sign", "author": { "email": "fedor@indutny.com", "name": "Fedor Indutny" }, "bugs": { "url": "https://github.com/indutny/elliptic/issues" }, "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1", "hash.js": "^1.0.0", "inherits": "^2.0.1" }, "description": "EC cryptography", "devDependencies": { "coveralls": "^2.11.3", "istanbul": "^0.4.2", "jscs": "^2.9.0", "jshint": "^2.6.0", "mocha": "^2.1.0" }, "directories": {}, "dist": { "shasum": "18e46d7306b0951275a2d42063270a14b74ebe99", "tarball": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz" }, "files": [ "lib" ], "gitHead": "c32f20b22b420eb6af3c6dda28963deb7facf823", "homepage": "https://github.com/indutny/elliptic", "keywords": [ "Cryptography", "EC", "Elliptic", "curve" ], "license": "MIT", "main": "lib/elliptic.js", "maintainers": [ { "name": "indutny", "email": "fedor@indutny.com" } ], "name": "elliptic", "optionalDependencies": {}, "readme": "ERROR: No README data found!", "repository": { "type": "git", "url": "git+ssh://git@github.com/indutny/elliptic.git" }, "scripts": { "coverage": "npm run unit --coverage", "coveralls": "npm run coverage && cat ./coverage/lcov.info | coveralls", "jscs": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/*.js", "jshint": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/*.js", "lint": "npm run jscs && npm run jshint", "test": "npm run lint && npm run unit", "unit": "istanbul test _mocha --reporter=spec test/*-test.js" }, "version": "6.2.3" } },{}],142:[function(require,module,exports){ var prr = require('prr') function init (type, message, cause) { prr(this, { type : type , name : type // can be passed just a 'cause' , cause : typeof message != 'string' ? message : cause , message : !!message && typeof message != 'string' ? message.message : message }, 'ewr') } // generic prototype, not intended to be actually used - helpful for `instanceof` function CustomError (message, cause) { Error.call(this) if (Error.captureStackTrace) Error.captureStackTrace(this, arguments.callee) init.call(this, 'CustomError', message, cause) } CustomError.prototype = new Error() function createError (errno, type, proto) { var err = function (message, cause) { init.call(this, type, message, cause) //TODO: the specificity here is stupid, errno should be available everywhere if (type == 'FilesystemError') { this.code = this.cause.code this.path = this.cause.path this.errno = this.cause.errno this.message = (errno.errno[this.cause.errno] ? errno.errno[this.cause.errno].description : this.cause.message) + (this.cause.path ? ' [' + this.cause.path + ']' : '') } Error.call(this) if (Error.captureStackTrace) Error.captureStackTrace(this, arguments.callee) } err.prototype = !!proto ? new proto() : new CustomError() return err } module.exports = function (errno) { var ce = function (type, proto) { return createError(errno, type, proto) } return { CustomError : CustomError , FilesystemError : ce('FilesystemError') , createError : ce } } },{"prr":296}],143:[function(require,module,exports){ var all = module.exports.all = [ { errno: -2, code: 'ENOENT', description: 'no such file or directory' }, { errno: -1, code: 'UNKNOWN', description: 'unknown error' }, { errno: 0, code: 'OK', description: 'success' }, { errno: 1, code: 'EOF', description: 'end of file' }, { errno: 2, code: 'EADDRINFO', description: 'getaddrinfo error' }, { errno: 3, code: 'EACCES', description: 'permission denied' }, { errno: 4, code: 'EAGAIN', description: 'resource temporarily unavailable' }, { errno: 5, code: 'EADDRINUSE', description: 'address already in use' }, { errno: 6, code: 'EADDRNOTAVAIL', description: 'address not available' }, { errno: 7, code: 'EAFNOSUPPORT', description: 'address family not supported' }, { errno: 8, code: 'EALREADY', description: 'connection already in progress' }, { errno: 9, code: 'EBADF', description: 'bad file descriptor' }, { errno: 10, code: 'EBUSY', description: 'resource busy or locked' }, { errno: 11, code: 'ECONNABORTED', description: 'software caused connection abort' }, { errno: 12, code: 'ECONNREFUSED', description: 'connection refused' }, { errno: 13, code: 'ECONNRESET', description: 'connection reset by peer' }, { errno: 14, code: 'EDESTADDRREQ', description: 'destination address required' }, { errno: 15, code: 'EFAULT', description: 'bad address in system call argument' }, { errno: 16, code: 'EHOSTUNREACH', description: 'host is unreachable' }, { errno: 17, code: 'EINTR', description: 'interrupted system call' }, { errno: 18, code: 'EINVAL', description: 'invalid argument' }, { errno: 19, code: 'EISCONN', description: 'socket is already connected' }, { errno: 20, code: 'EMFILE', description: 'too many open files' }, { errno: 21, code: 'EMSGSIZE', description: 'message too long' }, { errno: 22, code: 'ENETDOWN', description: 'network is down' }, { errno: 23, code: 'ENETUNREACH', description: 'network is unreachable' }, { errno: 24, code: 'ENFILE', description: 'file table overflow' }, { errno: 25, code: 'ENOBUFS', description: 'no buffer space available' }, { errno: 26, code: 'ENOMEM', description: 'not enough memory' }, { errno: 27, code: 'ENOTDIR', description: 'not a directory' }, { errno: 28, code: 'EISDIR', description: 'illegal operation on a directory' }, { errno: 29, code: 'ENONET', description: 'machine is not on the network' }, { errno: 31, code: 'ENOTCONN', description: 'socket is not connected' }, { errno: 32, code: 'ENOTSOCK', description: 'socket operation on non-socket' }, { errno: 33, code: 'ENOTSUP', description: 'operation not supported on socket' }, { errno: 34, code: 'ENOENT', description: 'no such file or directory' }, { errno: 35, code: 'ENOSYS', description: 'function not implemented' }, { errno: 36, code: 'EPIPE', description: 'broken pipe' }, { errno: 37, code: 'EPROTO', description: 'protocol error' }, { errno: 38, code: 'EPROTONOSUPPORT', description: 'protocol not supported' }, { errno: 39, code: 'EPROTOTYPE', description: 'protocol wrong type for socket' }, { errno: 40, code: 'ETIMEDOUT', description: 'connection timed out' }, { errno: 41, code: 'ECHARSET', description: 'invalid Unicode character' }, { errno: 42, code: 'EAIFAMNOSUPPORT', description: 'address family for hostname not supported' }, { errno: 44, code: 'EAISERVICE', description: 'servname not supported for ai_socktype' }, { errno: 45, code: 'EAISOCKTYPE', description: 'ai_socktype not supported' }, { errno: 46, code: 'ESHUTDOWN', description: 'cannot send after transport endpoint shutdown' }, { errno: 47, code: 'EEXIST', description: 'file already exists' }, { errno: 48, code: 'ESRCH', description: 'no such process' }, { errno: 49, code: 'ENAMETOOLONG', description: 'name too long' }, { errno: 50, code: 'EPERM', description: 'operation not permitted' }, { errno: 51, code: 'ELOOP', description: 'too many symbolic links encountered' }, { errno: 52, code: 'EXDEV', description: 'cross-device link not permitted' }, { errno: 53, code: 'ENOTEMPTY', description: 'directory not empty' }, { errno: 54, code: 'ENOSPC', description: 'no space left on device' }, { errno: 55, code: 'EIO', description: 'i/o error' }, { errno: 56, code: 'EROFS', description: 'read-only file system' }, { errno: 57, code: 'ENODEV', description: 'no such device' }, { errno: 58, code: 'ESPIPE', description: 'invalid seek' }, { errno: 59, code: 'ECANCELED', description: 'operation canceled' } ] module.exports.errno = {} module.exports.code = {} all.forEach(function (error) { module.exports.errno[error.errno] = error module.exports.code[error.code] = error }) module.exports.custom = require('./custom')(module.exports) module.exports.create = module.exports.custom.createError },{"./custom":142}],144:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. function EventEmitter() { this._events = this._events || {}; this._maxListeners = this._maxListeners || undefined; } module.exports = EventEmitter; // Backwards-compat with node 0.10.x EventEmitter.EventEmitter = EventEmitter; EventEmitter.prototype._events = undefined; EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are // added to it. This is a useful default which helps finding memory leaks. EventEmitter.defaultMaxListeners = 10; // Obviously not all Emitters should be limited to 10. This function allows // that to be increased. Set to zero for unlimited. EventEmitter.prototype.setMaxListeners = function(n) { if (!isNumber(n) || n < 0 || isNaN(n)) throw TypeError('n must be a positive number'); this._maxListeners = n; return this; }; EventEmitter.prototype.emit = function(type) { var er, handler, len, args, i, listeners; if (!this._events) this._events = {}; // If there is no 'error' event listener then throw. if (type === 'error') { if (!this._events.error || (isObject(this._events.error) && !this._events.error.length)) { er = arguments[1]; if (er instanceof Error) { throw er; // Unhandled 'error' event } throw TypeError('Uncaught, unspecified "error" event.'); } } handler = this._events[type]; if (isUndefined(handler)) return false; if (isFunction(handler)) { switch (arguments.length) { // fast cases case 1: handler.call(this); break; case 2: handler.call(this, arguments[1]); break; case 3: handler.call(this, arguments[1], arguments[2]); break; // slower default: args = Array.prototype.slice.call(arguments, 1); handler.apply(this, args); } } else if (isObject(handler)) { args = Array.prototype.slice.call(arguments, 1); listeners = handler.slice(); len = listeners.length; for (i = 0; i < len; i++) listeners[i].apply(this, args); } return true; }; EventEmitter.prototype.addListener = function(type, listener) { var m; if (!isFunction(listener)) throw TypeError('listener must be a function'); if (!this._events) this._events = {}; // To avoid recursion in the case that type === "newListener"! Before // adding it to the listeners, first emit "newListener". if (this._events.newListener) this.emit('newListener', type, isFunction(listener.listener) ? listener.listener : listener); if (!this._events[type]) // Optimize the case of one listener. Don't need the extra array object. this._events[type] = listener; else if (isObject(this._events[type])) // If we've already got an array, just append. this._events[type].push(listener); else // Adding the second element, need to change to array. this._events[type] = [this._events[type], listener]; // Check for listener leak if (isObject(this._events[type]) && !this._events[type].warned) { if (!isUndefined(this._maxListeners)) { m = this._maxListeners; } else { m = EventEmitter.defaultMaxListeners; } if (m && m > 0 && this._events[type].length > m) { this._events[type].warned = true; console.error('(node) warning: possible EventEmitter memory ' + 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length); if (typeof console.trace === 'function') { // not supported in IE 10 console.trace(); } } } return this; }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.once = function(type, listener) { if (!isFunction(listener)) throw TypeError('listener must be a function'); var fired = false; function g() { this.removeListener(type, g); if (!fired) { fired = true; listener.apply(this, arguments); } } g.listener = listener; this.on(type, g); return this; }; // emits a 'removeListener' event iff the listener was removed EventEmitter.prototype.removeListener = function(type, listener) { var list, position, length, i; if (!isFunction(listener)) throw TypeError('listener must be a function'); if (!this._events || !this._events[type]) return this; list = this._events[type]; length = list.length; position = -1; if (list === listener || (isFunction(list.listener) && list.listener === listener)) { delete this._events[type]; if (this._events.removeListener) this.emit('removeListener', type, listener); } else if (isObject(list)) { for (i = length; i-- > 0;) { if (list[i] === listener || (list[i].listener && list[i].listener === listener)) { position = i; break; } } if (position < 0) return this; if (list.length === 1) { list.length = 0; delete this._events[type]; } else { list.splice(position, 1); } if (this._events.removeListener) this.emit('removeListener', type, listener); } return this; }; EventEmitter.prototype.removeAllListeners = function(type) { var key, listeners; if (!this._events) return this; // not listening for removeListener, no need to emit if (!this._events.removeListener) { if (arguments.length === 0) this._events = {}; else if (this._events[type]) delete this._events[type]; return this; } // emit removeListener for all listeners on all events if (arguments.length === 0) { for (key in this._events) { if (key === 'removeListener') continue; this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = {}; return this; } listeners = this._events[type]; if (isFunction(listeners)) { this.removeListener(type, listeners); } else if (listeners) { // LIFO order while (listeners.length) this.removeListener(type, listeners[listeners.length - 1]); } delete this._events[type]; return this; }; EventEmitter.prototype.listeners = function(type) { var ret; if (!this._events || !this._events[type]) ret = []; else if (isFunction(this._events[type])) ret = [this._events[type]]; else ret = this._events[type].slice(); return ret; }; EventEmitter.prototype.listenerCount = function(type) { if (this._events) { var evlistener = this._events[type]; if (isFunction(evlistener)) return 1; else if (evlistener) return evlistener.length; } return 0; }; EventEmitter.listenerCount = function(emitter, type) { return emitter.listenerCount(type); }; function isFunction(arg) { return typeof arg === 'function'; } function isNumber(arg) { return typeof arg === 'number'; } function isObject(arg) { return typeof arg === 'object' && arg !== null; } function isUndefined(arg) { return arg === void 0; } },{}],145:[function(require,module,exports){ (function (Buffer){ var md5 = require('create-hash/md5') module.exports = EVP_BytesToKey function EVP_BytesToKey (password, salt, keyLen, ivLen) { if (!Buffer.isBuffer(password)) { password = new Buffer(password, 'binary') } if (salt && !Buffer.isBuffer(salt)) { salt = new Buffer(salt, 'binary') } keyLen = keyLen / 8 ivLen = ivLen || 0 var ki = 0 var ii = 0 var key = new Buffer(keyLen) var iv = new Buffer(ivLen) var addmd = 0 var md_buf var i var bufs = [] while (true) { if (addmd++ > 0) { bufs.push(md_buf) } bufs.push(password) if (salt) { bufs.push(salt) } md_buf = md5(Buffer.concat(bufs)) bufs = [] i = 0 if (keyLen > 0) { while (true) { if (keyLen === 0) { break } if (i === md_buf.length) { break } key[ki++] = md_buf[i] keyLen-- i++ } } if (ivLen > 0 && i !== md_buf.length) { while (true) { if (ivLen === 0) { break } if (i === md_buf.length) { break } iv[ii++] = md_buf[i] ivLen-- i++ } } if (keyLen === 0 && ivLen === 0) { break } } for (i = 0; i < md_buf.length; i++) { md_buf[i] = 0 } return { key: key, iv: iv } } }).call(this,require("buffer").Buffer) },{"buffer":61,"create-hash/md5":108}],146:[function(require,module,exports){ function getStack(err) { return err.stack.substring(err.name.length + 3 + err.message.length) .split('\n') } function removePrefix (a, b) { return a.filter(function (e) { return !~b.indexOf(e) }) } var explain = module.exports = function (err, message) { var _err = new Error(message) var stack = removePrefix(getStack(_err).slice(1), getStack(err)).join('\n') _err.stack = _err.name + ': ' + _err.message + '\n' + stack + '\n ' + err.stack return _err } },{}],147:[function(require,module,exports){ /** * Extend an object with another. * * @param {Object, ...} src, ... * @return {Object} merged * @api private */ module.exports = function(src) { var objs = [].slice.call(arguments, 1), obj; for (var i = 0, len = objs.length; i < len; i++) { obj = objs[i]; for (var prop in obj) { src[prop] = obj[prop]; } } return src; } },{}],148:[function(require,module,exports){ 'use strict'; var hasOwn = Object.prototype.hasOwnProperty; var toStr = Object.prototype.toString; var isArray = function isArray(arr) { if (typeof Array.isArray === 'function') { return Array.isArray(arr); } return toStr.call(arr) === '[object Array]'; }; var isPlainObject = function isPlainObject(obj) { if (!obj || toStr.call(obj) !== '[object Object]') { return false; } var hasOwnConstructor = hasOwn.call(obj, 'constructor'); var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); // Not own constructor property must be Object if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for (key in obj) {/**/} return typeof key === 'undefined' || hasOwn.call(obj, key); }; module.exports = function extend() { var options, name, src, copy, copyIsArray, clone, target = arguments[0], i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if (typeof target === 'boolean') { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } else if ((typeof target !== 'object' && typeof target !== 'function') || target == null) { target = {}; } for (; i < length; ++i) { options = arguments[i]; // Only deal with non-null/undefined values if (options != null) { // Extend the base object for (name in options) { src = target[name]; copy = options[name]; // Prevent never-ending loop if (target !== copy) { // Recurse if we're merging plain objects or arrays if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { if (copyIsArray) { copyIsArray = false; clone = src && isArray(src) ? src : []; } else { clone = src && isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[name] = extend(deep, clone, copy); // Don't bring in undefined values } else if (typeof copy !== 'undefined') { target[name] = copy; } } } } } // Return the modified object return target; }; },{}],149:[function(require,module,exports){ (function (process,global){ var LIMIT = process.maxTickDepth / 2 , factory = function () { var count = 0 return function (callback) { if (count >= LIMIT){ global.setImmediate(callback) count = 0 } else process.nextTick(callback) count++ } } module.exports = global.setImmediate ? factory : function () { return process.nextTick } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"_process":295}],150:[function(require,module,exports){ (function (process){ exports.alphasort = alphasort exports.alphasorti = alphasorti exports.setopts = setopts exports.ownProp = ownProp exports.makeAbs = makeAbs exports.finish = finish exports.mark = mark exports.isIgnored = isIgnored exports.childrenIgnored = childrenIgnored function ownProp (obj, field) { return Object.prototype.hasOwnProperty.call(obj, field) } var path = require("path") var minimatch = require("minimatch") var isAbsolute = require("path-is-absolute") var Minimatch = minimatch.Minimatch function alphasorti (a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()) } function alphasort (a, b) { return a.localeCompare(b) } function setupIgnores (self, options) { self.ignore = options.ignore || [] if (!Array.isArray(self.ignore)) self.ignore = [self.ignore] if (self.ignore.length) { self.ignore = self.ignore.map(ignoreMap) } } // ignore patterns are always in dot:true mode. function ignoreMap (pattern) { var gmatcher = null if (pattern.slice(-3) === '/**') { var gpattern = pattern.replace(/(\/\*\*)+$/, '') gmatcher = new Minimatch(gpattern, { dot: true }) } return { matcher: new Minimatch(pattern, { dot: true }), gmatcher: gmatcher } } function setopts (self, pattern, options) { if (!options) options = {} // base-matching: just use globstar for that. if (options.matchBase && -1 === pattern.indexOf("/")) { if (options.noglobstar) { throw new Error("base matching requires globstar") } pattern = "**/" + pattern } self.silent = !!options.silent self.pattern = pattern self.strict = options.strict !== false self.realpath = !!options.realpath self.realpathCache = options.realpathCache || Object.create(null) self.follow = !!options.follow self.dot = !!options.dot self.mark = !!options.mark self.nodir = !!options.nodir if (self.nodir) self.mark = true self.sync = !!options.sync self.nounique = !!options.nounique self.nonull = !!options.nonull self.nosort = !!options.nosort self.nocase = !!options.nocase self.stat = !!options.stat self.noprocess = !!options.noprocess self.maxLength = options.maxLength || Infinity self.cache = options.cache || Object.create(null) self.statCache = options.statCache || Object.create(null) self.symlinks = options.symlinks || Object.create(null) setupIgnores(self, options) self.changedCwd = false var cwd = process.cwd() if (!ownProp(options, "cwd")) self.cwd = cwd else { self.cwd = options.cwd self.changedCwd = path.resolve(options.cwd) !== cwd } self.root = options.root || path.resolve(self.cwd, "/") self.root = path.resolve(self.root) if (process.platform === "win32") self.root = self.root.replace(/\\/g, "/") self.nomount = !!options.nomount // disable comments and negation in Minimatch. // Note that they are not supported in Glob itself anyway. options.nonegate = true options.nocomment = true self.minimatch = new Minimatch(pattern, options) self.options = self.minimatch.options } function finish (self) { var nou = self.nounique var all = nou ? [] : Object.create(null) for (var i = 0, l = self.matches.length; i < l; i ++) { var matches = self.matches[i] if (!matches || Object.keys(matches).length === 0) { if (self.nonull) { // do like the shell, and spit out the literal glob var literal = self.minimatch.globSet[i] if (nou) all.push(literal) else all[literal] = true } } else { // had matches var m = Object.keys(matches) if (nou) all.push.apply(all, m) else m.forEach(function (m) { all[m] = true }) } } if (!nou) all = Object.keys(all) if (!self.nosort) all = all.sort(self.nocase ? alphasorti : alphasort) // at *some* point we statted all of these if (self.mark) { for (var i = 0; i < all.length; i++) { all[i] = self._mark(all[i]) } if (self.nodir) { all = all.filter(function (e) { return !(/\/$/.test(e)) }) } } if (self.ignore.length) all = all.filter(function(m) { return !isIgnored(self, m) }) self.found = all } function mark (self, p) { var abs = makeAbs(self, p) var c = self.cache[abs] var m = p if (c) { var isDir = c === 'DIR' || Array.isArray(c) var slash = p.slice(-1) === '/' if (isDir && !slash) m += '/' else if (!isDir && slash) m = m.slice(0, -1) if (m !== p) { var mabs = makeAbs(self, m) self.statCache[mabs] = self.statCache[abs] self.cache[mabs] = self.cache[abs] } } return m } // lotta situps... function makeAbs (self, f) { var abs = f if (f.charAt(0) === '/') { abs = path.join(self.root, f) } else if (isAbsolute(f) || f === '') { abs = f } else if (self.changedCwd) { abs = path.resolve(self.cwd, f) } else { abs = path.resolve(f) } return abs } // Return true, if pattern ends with globstar '**', for the accompanying parent directory. // Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents function isIgnored (self, path) { if (!self.ignore.length) return false return self.ignore.some(function(item) { return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) }) } function childrenIgnored (self, path) { if (!self.ignore.length) return false return self.ignore.some(function(item) { return !!(item.gmatcher && item.gmatcher.match(path)) }) } }).call(this,require('_process')) },{"_process":295,"minimatch":247,"path":290,"path-is-absolute":291}],151:[function(require,module,exports){ (function (process){ // Approach: // // 1. Get the minimatch set // 2. For each pattern in the set, PROCESS(pattern, false) // 3. Store matches per-set, then uniq them // // PROCESS(pattern, inGlobStar) // Get the first [n] items from pattern that are all strings // Join these together. This is PREFIX. // If there is no more remaining, then stat(PREFIX) and // add to matches if it succeeds. END. // // If inGlobStar and PREFIX is symlink and points to dir // set ENTRIES = [] // else readdir(PREFIX) as ENTRIES // If fail, END // // with ENTRIES // If pattern[n] is GLOBSTAR // // handle the case where the globstar match is empty // // by pruning it out, and testing the resulting pattern // PROCESS(pattern[0..n] + pattern[n+1 .. $], false) // // handle other cases. // for ENTRY in ENTRIES (not dotfiles) // // attach globstar + tail onto the entry // // Mark that this entry is a globstar match // PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) // // else // not globstar // for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) // Test ENTRY against pattern[n] // If fails, continue // If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) // // Caveat: // Cache all stats and readdirs results to minimize syscall. Since all // we ever care about is existence and directory-ness, we can just keep // `true` for files, and [children,...] for directories, or `false` for // things that don't exist. module.exports = glob var fs = require('fs') var minimatch = require('minimatch') var Minimatch = minimatch.Minimatch var inherits = require('inherits') var EE = require('events').EventEmitter var path = require('path') var assert = require('assert') var isAbsolute = require('path-is-absolute') var globSync = require('./sync.js') var common = require('./common.js') var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp var inflight = require('inflight') var util = require('util') var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored var once = require('once') function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} if (!options) options = {} if (options.sync) { if (cb) throw new TypeError('callback provided to sync glob') return globSync(pattern, options) } return new Glob(pattern, options, cb) } glob.sync = globSync var GlobSync = glob.GlobSync = globSync.GlobSync // old api surface glob.glob = glob function extend (origin, add) { if (add === null || typeof add !== 'object') { return origin } var keys = Object.keys(add) var i = keys.length while (i--) { origin[keys[i]] = add[keys[i]] } return origin } glob.hasMagic = function (pattern, options_) { var options = extend({}, options_) options.noprocess = true var g = new Glob(pattern, options) var set = g.minimatch.set if (set.length > 1) return true for (var j = 0; j < set[0].length; j++) { if (typeof set[0][j] !== 'string') return true } return false } glob.Glob = Glob inherits(Glob, EE) function Glob (pattern, options, cb) { if (typeof options === 'function') { cb = options options = null } if (options && options.sync) { if (cb) throw new TypeError('callback provided to sync glob') return new GlobSync(pattern, options) } if (!(this instanceof Glob)) return new Glob(pattern, options, cb) setopts(this, pattern, options) this._didRealPath = false // process each pattern in the minimatch set var n = this.minimatch.set.length // The matches are stored as {: true,...} so that // duplicates are automagically pruned. // Later, we do an Object.keys() on these. // Keep them as a list so we can fill in when nonull is set. this.matches = new Array(n) if (typeof cb === 'function') { cb = once(cb) this.on('error', cb) this.on('end', function (matches) { cb(null, matches) }) } var self = this var n = this.minimatch.set.length this._processing = 0 this.matches = new Array(n) this._emitQueue = [] this._processQueue = [] this.paused = false if (this.noprocess) return this if (n === 0) return done() for (var i = 0; i < n; i ++) { this._process(this.minimatch.set[i], i, false, done) } function done () { --self._processing if (self._processing <= 0) self._finish() } } Glob.prototype._finish = function () { assert(this instanceof Glob) if (this.aborted) return if (this.realpath && !this._didRealpath) return this._realpath() common.finish(this) this.emit('end', this.found) } Glob.prototype._realpath = function () { if (this._didRealpath) return this._didRealpath = true var n = this.matches.length if (n === 0) return this._finish() var self = this for (var i = 0; i < this.matches.length; i++) this._realpathSet(i, next) function next () { if (--n === 0) self._finish() } } Glob.prototype._realpathSet = function (index, cb) { var matchset = this.matches[index] if (!matchset) return cb() var found = Object.keys(matchset) var self = this var n = found.length if (n === 0) return cb() var set = this.matches[index] = Object.create(null) found.forEach(function (p, i) { // If there's a problem with the stat, then it means that // one or more of the links in the realpath couldn't be // resolved. just return the abs value in that case. p = self._makeAbs(p) fs.realpath(p, self.realpathCache, function (er, real) { if (!er) set[real] = true else if (er.syscall === 'stat') set[p] = true else self.emit('error', er) // srsly wtf right here if (--n === 0) { self.matches[index] = set cb() } }) }) } Glob.prototype._mark = function (p) { return common.mark(this, p) } Glob.prototype._makeAbs = function (f) { return common.makeAbs(this, f) } Glob.prototype.abort = function () { this.aborted = true this.emit('abort') } Glob.prototype.pause = function () { if (!this.paused) { this.paused = true this.emit('pause') } } Glob.prototype.resume = function () { if (this.paused) { this.emit('resume') this.paused = false if (this._emitQueue.length) { var eq = this._emitQueue.slice(0) this._emitQueue.length = 0 for (var i = 0; i < eq.length; i ++) { var e = eq[i] this._emitMatch(e[0], e[1]) } } if (this._processQueue.length) { var pq = this._processQueue.slice(0) this._processQueue.length = 0 for (var i = 0; i < pq.length; i ++) { var p = pq[i] this._processing-- this._process(p[0], p[1], p[2], p[3]) } } } } Glob.prototype._process = function (pattern, index, inGlobStar, cb) { assert(this instanceof Glob) assert(typeof cb === 'function') if (this.aborted) return this._processing++ if (this.paused) { this._processQueue.push([pattern, index, inGlobStar, cb]) return } //console.error('PROCESS %d', this._processing, pattern) // Get the first [n] parts of pattern that are all strings. var n = 0 while (typeof pattern[n] === 'string') { n ++ } // now n is the index of the first one that is *not* a string. // see if there's anything else var prefix switch (n) { // if not, then this is rather simple case pattern.length: this._processSimple(pattern.join('/'), index, cb) return case 0: // pattern *starts* with some non-trivial item. // going to readdir(cwd), but not include the prefix in matches. prefix = null break default: // pattern has some string bits in the front. // whatever it starts with, whether that's 'absolute' like /foo/bar, // or 'relative' like '../baz' prefix = pattern.slice(0, n).join('/') break } var remain = pattern.slice(n) // get the list of entries. var read if (prefix === null) read = '.' else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { if (!prefix || !isAbsolute(prefix)) prefix = '/' + prefix read = prefix } else read = prefix var abs = this._makeAbs(read) //if ignored, skip _processing if (childrenIgnored(this, read)) return cb() var isGlobStar = remain[0] === minimatch.GLOBSTAR if (isGlobStar) this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) else this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) } Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { var self = this this._readdir(abs, inGlobStar, function (er, entries) { return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) }) } Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { // if the abs isn't a dir, then nothing can match! if (!entries) return cb() // It will only match dot entries if it starts with a dot, or if // dot is set. Stuff like @(.foo|.bar) isn't allowed. var pn = remain[0] var negate = !!this.minimatch.negate var rawGlob = pn._glob var dotOk = this.dot || rawGlob.charAt(0) === '.' var matchedEntries = [] for (var i = 0; i < entries.length; i++) { var e = entries[i] if (e.charAt(0) !== '.' || dotOk) { var m if (negate && !prefix) { m = !e.match(pn) } else { m = e.match(pn) } if (m) matchedEntries.push(e) } } //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) var len = matchedEntries.length // If there are no matched entries, then nothing matches. if (len === 0) return cb() // if this is the last remaining pattern bit, then no need for // an additional stat *unless* the user has specified mark or // stat explicitly. We know they exist, since readdir returned // them. if (remain.length === 1 && !this.mark && !this.stat) { if (!this.matches[index]) this.matches[index] = Object.create(null) for (var i = 0; i < len; i ++) { var e = matchedEntries[i] if (prefix) { if (prefix !== '/') e = prefix + '/' + e else e = prefix + e } if (e.charAt(0) === '/' && !this.nomount) { e = path.join(this.root, e) } this._emitMatch(index, e) } // This was the last one, and no stats were needed return cb() } // now test all matched entries as stand-ins for that part // of the pattern. remain.shift() for (var i = 0; i < len; i ++) { var e = matchedEntries[i] var newPattern if (prefix) { if (prefix !== '/') e = prefix + '/' + e else e = prefix + e } this._process([e].concat(remain), index, inGlobStar, cb) } cb() } Glob.prototype._emitMatch = function (index, e) { if (this.aborted) return if (this.matches[index][e]) return if (isIgnored(this, e)) return if (this.paused) { this._emitQueue.push([index, e]) return } var abs = this._makeAbs(e) if (this.nodir) { var c = this.cache[abs] if (c === 'DIR' || Array.isArray(c)) return } if (this.mark) e = this._mark(e) this.matches[index][e] = true var st = this.statCache[abs] if (st) this.emit('stat', e, st) this.emit('match', e) } Glob.prototype._readdirInGlobStar = function (abs, cb) { if (this.aborted) return // follow all symlinked directories forever // just proceed as if this is a non-globstar situation if (this.follow) return this._readdir(abs, false, cb) var lstatkey = 'lstat\0' + abs var self = this var lstatcb = inflight(lstatkey, lstatcb_) if (lstatcb) fs.lstat(abs, lstatcb) function lstatcb_ (er, lstat) { if (er) return cb() var isSym = lstat.isSymbolicLink() self.symlinks[abs] = isSym // If it's not a symlink or a dir, then it's definitely a regular file. // don't bother doing a readdir in that case. if (!isSym && !lstat.isDirectory()) { self.cache[abs] = 'FILE' cb() } else self._readdir(abs, false, cb) } } Glob.prototype._readdir = function (abs, inGlobStar, cb) { if (this.aborted) return cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) if (!cb) return //console.error('RD %j %j', +inGlobStar, abs) if (inGlobStar && !ownProp(this.symlinks, abs)) return this._readdirInGlobStar(abs, cb) if (ownProp(this.cache, abs)) { var c = this.cache[abs] if (!c || c === 'FILE') return cb() if (Array.isArray(c)) return cb(null, c) } var self = this fs.readdir(abs, readdirCb(this, abs, cb)) } function readdirCb (self, abs, cb) { return function (er, entries) { if (er) self._readdirError(abs, er, cb) else self._readdirEntries(abs, entries, cb) } } Glob.prototype._readdirEntries = function (abs, entries, cb) { if (this.aborted) return // if we haven't asked to stat everything, then just // assume that everything in there exists, so we can avoid // having to stat it a second time. if (!this.mark && !this.stat) { for (var i = 0; i < entries.length; i ++) { var e = entries[i] if (abs === '/') e = abs + e else e = abs + '/' + e this.cache[e] = true } } this.cache[abs] = entries return cb(null, entries) } Glob.prototype._readdirError = function (f, er, cb) { if (this.aborted) return // handle errors, and cache the information switch (er.code) { case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 case 'ENOTDIR': // totally normal. means it *does* exist. this.cache[this._makeAbs(f)] = 'FILE' break case 'ENOENT': // not terribly unusual case 'ELOOP': case 'ENAMETOOLONG': case 'UNKNOWN': this.cache[this._makeAbs(f)] = false break default: // some unusual error. Treat as failure. this.cache[this._makeAbs(f)] = false if (this.strict) { this.emit('error', er) // If the error is handled, then we abort // if not, we threw out of here this.abort() } if (!this.silent) console.error('glob error', er) break } return cb() } Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { var self = this this._readdir(abs, inGlobStar, function (er, entries) { self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) }) } Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { //console.error('pgs2', prefix, remain[0], entries) // no entries means not a dir, so it can never have matches // foo.txt/** doesn't match foo.txt if (!entries) return cb() // test without the globstar, and with every child both below // and replacing the globstar. var remainWithoutGlobStar = remain.slice(1) var gspref = prefix ? [ prefix ] : [] var noGlobStar = gspref.concat(remainWithoutGlobStar) // the noGlobStar pattern exits the inGlobStar state this._process(noGlobStar, index, false, cb) var isSym = this.symlinks[abs] var len = entries.length // If it's a symlink, and we're in a globstar, then stop if (isSym && inGlobStar) return cb() for (var i = 0; i < len; i++) { var e = entries[i] if (e.charAt(0) === '.' && !this.dot) continue // these two cases enter the inGlobStar state var instead = gspref.concat(entries[i], remainWithoutGlobStar) this._process(instead, index, true, cb) var below = gspref.concat(entries[i], remain) this._process(below, index, true, cb) } cb() } Glob.prototype._processSimple = function (prefix, index, cb) { // XXX review this. Shouldn't it be doing the mounting etc // before doing stat? kinda weird? var self = this this._stat(prefix, function (er, exists) { self._processSimple2(prefix, index, er, exists, cb) }) } Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { //console.error('ps2', prefix, exists) if (!this.matches[index]) this.matches[index] = Object.create(null) // If it doesn't exist, then just mark the lack of results if (!exists) return cb() if (prefix && isAbsolute(prefix) && !this.nomount) { var trail = /[\/\\]$/.test(prefix) if (prefix.charAt(0) === '/') { prefix = path.join(this.root, prefix) } else { prefix = path.resolve(this.root, prefix) if (trail) prefix += '/' } } if (process.platform === 'win32') prefix = prefix.replace(/\\/g, '/') // Mark this as a match this._emitMatch(index, prefix) cb() } // Returns either 'DIR', 'FILE', or false Glob.prototype._stat = function (f, cb) { var abs = this._makeAbs(f) var needDir = f.slice(-1) === '/' if (f.length > this.maxLength) return cb() if (!this.stat && ownProp(this.cache, abs)) { var c = this.cache[abs] if (Array.isArray(c)) c = 'DIR' // It exists, but maybe not how we need it if (!needDir || c === 'DIR') return cb(null, c) if (needDir && c === 'FILE') return cb() // otherwise we have to stat, because maybe c=true // if we know it exists, but not what it is. } var exists var stat = this.statCache[abs] if (stat !== undefined) { if (stat === false) return cb(null, stat) else { var type = stat.isDirectory() ? 'DIR' : 'FILE' if (needDir && type === 'FILE') return cb() else return cb(null, type, stat) } } var self = this var statcb = inflight('stat\0' + abs, lstatcb_) if (statcb) fs.lstat(abs, statcb) function lstatcb_ (er, lstat) { if (lstat && lstat.isSymbolicLink()) { // If it's a symlink, then treat it as the target, unless // the target does not exist, then treat it as a file. return fs.stat(abs, function (er, stat) { if (er) self._stat2(f, abs, null, lstat, cb) else self._stat2(f, abs, er, stat, cb) }) } else { self._stat2(f, abs, er, lstat, cb) } } } Glob.prototype._stat2 = function (f, abs, er, stat, cb) { if (er) { this.statCache[abs] = false return cb() } var needDir = f.slice(-1) === '/' this.statCache[abs] = stat if (abs.slice(-1) === '/' && !stat.isDirectory()) return cb(null, false, stat) var c = stat.isDirectory() ? 'DIR' : 'FILE' this.cache[abs] = this.cache[abs] || c if (needDir && c !== 'DIR') return cb() return cb(null, c, stat) } }).call(this,require('_process')) },{"./common.js":150,"./sync.js":152,"_process":295,"assert":15,"events":144,"fs":58,"inflight":166,"inherits":167,"minimatch":247,"once":278,"path":290,"path-is-absolute":291,"util":636}],152:[function(require,module,exports){ (function (process){ module.exports = globSync globSync.GlobSync = GlobSync var fs = require('fs') var minimatch = require('minimatch') var Minimatch = minimatch.Minimatch var Glob = require('./glob.js').Glob var util = require('util') var path = require('path') var assert = require('assert') var isAbsolute = require('path-is-absolute') var common = require('./common.js') var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp var childrenIgnored = common.childrenIgnored function globSync (pattern, options) { if (typeof options === 'function' || arguments.length === 3) throw new TypeError('callback provided to sync glob\n'+ 'See: https://github.com/isaacs/node-glob/issues/167') return new GlobSync(pattern, options).found } function GlobSync (pattern, options) { if (!pattern) throw new Error('must provide pattern') if (typeof options === 'function' || arguments.length === 3) throw new TypeError('callback provided to sync glob\n'+ 'See: https://github.com/isaacs/node-glob/issues/167') if (!(this instanceof GlobSync)) return new GlobSync(pattern, options) setopts(this, pattern, options) if (this.noprocess) return this var n = this.minimatch.set.length this.matches = new Array(n) for (var i = 0; i < n; i ++) { this._process(this.minimatch.set[i], i, false) } this._finish() } GlobSync.prototype._finish = function () { assert(this instanceof GlobSync) if (this.realpath) { var self = this this.matches.forEach(function (matchset, index) { var set = self.matches[index] = Object.create(null) for (var p in matchset) { try { p = self._makeAbs(p) var real = fs.realpathSync(p, self.realpathCache) set[real] = true } catch (er) { if (er.syscall === 'stat') set[self._makeAbs(p)] = true else throw er } } }) } common.finish(this) } GlobSync.prototype._process = function (pattern, index, inGlobStar) { assert(this instanceof GlobSync) // Get the first [n] parts of pattern that are all strings. var n = 0 while (typeof pattern[n] === 'string') { n ++ } // now n is the index of the first one that is *not* a string. // See if there's anything else var prefix switch (n) { // if not, then this is rather simple case pattern.length: this._processSimple(pattern.join('/'), index) return case 0: // pattern *starts* with some non-trivial item. // going to readdir(cwd), but not include the prefix in matches. prefix = null break default: // pattern has some string bits in the front. // whatever it starts with, whether that's 'absolute' like /foo/bar, // or 'relative' like '../baz' prefix = pattern.slice(0, n).join('/') break } var remain = pattern.slice(n) // get the list of entries. var read if (prefix === null) read = '.' else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { if (!prefix || !isAbsolute(prefix)) prefix = '/' + prefix read = prefix } else read = prefix var abs = this._makeAbs(read) //if ignored, skip processing if (childrenIgnored(this, read)) return var isGlobStar = remain[0] === minimatch.GLOBSTAR if (isGlobStar) this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) else this._processReaddir(prefix, read, abs, remain, index, inGlobStar) } GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { var entries = this._readdir(abs, inGlobStar) // if the abs isn't a dir, then nothing can match! if (!entries) return // It will only match dot entries if it starts with a dot, or if // dot is set. Stuff like @(.foo|.bar) isn't allowed. var pn = remain[0] var negate = !!this.minimatch.negate var rawGlob = pn._glob var dotOk = this.dot || rawGlob.charAt(0) === '.' var matchedEntries = [] for (var i = 0; i < entries.length; i++) { var e = entries[i] if (e.charAt(0) !== '.' || dotOk) { var m if (negate && !prefix) { m = !e.match(pn) } else { m = e.match(pn) } if (m) matchedEntries.push(e) } } var len = matchedEntries.length // If there are no matched entries, then nothing matches. if (len === 0) return // if this is the last remaining pattern bit, then no need for // an additional stat *unless* the user has specified mark or // stat explicitly. We know they exist, since readdir returned // them. if (remain.length === 1 && !this.mark && !this.stat) { if (!this.matches[index]) this.matches[index] = Object.create(null) for (var i = 0; i < len; i ++) { var e = matchedEntries[i] if (prefix) { if (prefix.slice(-1) !== '/') e = prefix + '/' + e else e = prefix + e } if (e.charAt(0) === '/' && !this.nomount) { e = path.join(this.root, e) } this.matches[index][e] = true } // This was the last one, and no stats were needed return } // now test all matched entries as stand-ins for that part // of the pattern. remain.shift() for (var i = 0; i < len; i ++) { var e = matchedEntries[i] var newPattern if (prefix) newPattern = [prefix, e] else newPattern = [e] this._process(newPattern.concat(remain), index, inGlobStar) } } GlobSync.prototype._emitMatch = function (index, e) { var abs = this._makeAbs(e) if (this.mark) e = this._mark(e) if (this.matches[index][e]) return if (this.nodir) { var c = this.cache[this._makeAbs(e)] if (c === 'DIR' || Array.isArray(c)) return } this.matches[index][e] = true if (this.stat) this._stat(e) } GlobSync.prototype._readdirInGlobStar = function (abs) { // follow all symlinked directories forever // just proceed as if this is a non-globstar situation if (this.follow) return this._readdir(abs, false) var entries var lstat var stat try { lstat = fs.lstatSync(abs) } catch (er) { // lstat failed, doesn't exist return null } var isSym = lstat.isSymbolicLink() this.symlinks[abs] = isSym // If it's not a symlink or a dir, then it's definitely a regular file. // don't bother doing a readdir in that case. if (!isSym && !lstat.isDirectory()) this.cache[abs] = 'FILE' else entries = this._readdir(abs, false) return entries } GlobSync.prototype._readdir = function (abs, inGlobStar) { var entries if (inGlobStar && !ownProp(this.symlinks, abs)) return this._readdirInGlobStar(abs) if (ownProp(this.cache, abs)) { var c = this.cache[abs] if (!c || c === 'FILE') return null if (Array.isArray(c)) return c } try { return this._readdirEntries(abs, fs.readdirSync(abs)) } catch (er) { this._readdirError(abs, er) return null } } GlobSync.prototype._readdirEntries = function (abs, entries) { // if we haven't asked to stat everything, then just // assume that everything in there exists, so we can avoid // having to stat it a second time. if (!this.mark && !this.stat) { for (var i = 0; i < entries.length; i ++) { var e = entries[i] if (abs === '/') e = abs + e else e = abs + '/' + e this.cache[e] = true } } this.cache[abs] = entries // mark and cache dir-ness return entries } GlobSync.prototype._readdirError = function (f, er) { // handle errors, and cache the information switch (er.code) { case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 case 'ENOTDIR': // totally normal. means it *does* exist. this.cache[this._makeAbs(f)] = 'FILE' break case 'ENOENT': // not terribly unusual case 'ELOOP': case 'ENAMETOOLONG': case 'UNKNOWN': this.cache[this._makeAbs(f)] = false break default: // some unusual error. Treat as failure. this.cache[this._makeAbs(f)] = false if (this.strict) throw er if (!this.silent) console.error('glob error', er) break } } GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { var entries = this._readdir(abs, inGlobStar) // no entries means not a dir, so it can never have matches // foo.txt/** doesn't match foo.txt if (!entries) return // test without the globstar, and with every child both below // and replacing the globstar. var remainWithoutGlobStar = remain.slice(1) var gspref = prefix ? [ prefix ] : [] var noGlobStar = gspref.concat(remainWithoutGlobStar) // the noGlobStar pattern exits the inGlobStar state this._process(noGlobStar, index, false) var len = entries.length var isSym = this.symlinks[abs] // If it's a symlink, and we're in a globstar, then stop if (isSym && inGlobStar) return for (var i = 0; i < len; i++) { var e = entries[i] if (e.charAt(0) === '.' && !this.dot) continue // these two cases enter the inGlobStar state var instead = gspref.concat(entries[i], remainWithoutGlobStar) this._process(instead, index, true) var below = gspref.concat(entries[i], remain) this._process(below, index, true) } } GlobSync.prototype._processSimple = function (prefix, index) { // XXX review this. Shouldn't it be doing the mounting etc // before doing stat? kinda weird? var exists = this._stat(prefix) if (!this.matches[index]) this.matches[index] = Object.create(null) // If it doesn't exist, then just mark the lack of results if (!exists) return if (prefix && isAbsolute(prefix) && !this.nomount) { var trail = /[\/\\]$/.test(prefix) if (prefix.charAt(0) === '/') { prefix = path.join(this.root, prefix) } else { prefix = path.resolve(this.root, prefix) if (trail) prefix += '/' } } if (process.platform === 'win32') prefix = prefix.replace(/\\/g, '/') // Mark this as a match this.matches[index][prefix] = true } // Returns either 'DIR', 'FILE', or false GlobSync.prototype._stat = function (f) { var abs = this._makeAbs(f) var needDir = f.slice(-1) === '/' if (f.length > this.maxLength) return false if (!this.stat && ownProp(this.cache, abs)) { var c = this.cache[abs] if (Array.isArray(c)) c = 'DIR' // It exists, but maybe not how we need it if (!needDir || c === 'DIR') return c if (needDir && c === 'FILE') return false // otherwise we have to stat, because maybe c=true // if we know it exists, but not what it is. } var exists var stat = this.statCache[abs] if (!stat) { var lstat try { lstat = fs.lstatSync(abs) } catch (er) { return false } if (lstat.isSymbolicLink()) { try { stat = fs.statSync(abs) } catch (er) { stat = lstat } } else { stat = lstat } } this.statCache[abs] = stat var c = stat.isDirectory() ? 'DIR' : 'FILE' this.cache[abs] = this.cache[abs] || c if (needDir && c !== 'DIR') return false return c } GlobSync.prototype._mark = function (p) { return common.mark(this, p) } GlobSync.prototype._makeAbs = function (f) { return common.makeAbs(this, f) } }).call(this,require('_process')) },{"./common.js":150,"./glob.js":151,"_process":295,"assert":15,"fs":58,"minimatch":247,"path":290,"path-is-absolute":291,"util":636}],153:[function(require,module,exports){ 'use strict'; // // Algorithms // // probably move these to another file when there get to be lots of them. function count(obj) { var c = 0 for(var k in obj) c++ return c } function widthTraverse (graph, reachable, start, depth, hops, max, iter) { if(!start) throw new Error('Graphmitter#traverse: start must be provided') var nodes = 1 reachable[start] = reachable[start] == null ? 0 : reachable[start] var queue = [{key: start, hops: depth}] iter = iter || function () {} var abort = false while(queue.length && (!max || nodes < max) && !abort) { var o = queue.shift() var h = o.hops var n = graph.nodes[o.key] if(n && (!hops || (h + 1 <= hops))) for(var k in n.edges) { // If we have already been to this node by a shorter path, // then skip this node (this only happens when processing // a realtime edge) if(!(reachable[k] != null && reachable[k] < h + 1)) { if(false === iter(o.key, k, h + 1, reachable[k])) return reachable reachable[k] = h + 1 nodes ++ queue.push({key: k, hops: h + 1}) } } } return reachable } exports.traverse = function (opts, onEach) { var self = this var maxHops = opts.hops || 3 var maxNodes = opts.max || 150 var reachable = {} opts.each = onEach = onEach || opts.each widthTraverse( this, reachable, opts.start, 0, //initial hops opts.hops, //max hops opts.max, //max nodes opts.old !== false && onEach ) if(!onEach || opts.live === false) return reachable function onEdge (from, to) { //if this edge is part of the initial setd if(reachable[from] != null && reachable[from] < maxHops) { //edges to new nodes. var h = reachable[from] + 1 var _h = reachable[to] if(_h == null) onEach(from, to, reachable[to] = h, _h) else if(Math.min(h, _h) != _h) onEach(from, to, reachable[to] = Math.min(h, _h), _h) if(h <= maxHops && h != _h) { //also add other nodes that are now reachable. widthTraverse(self, reachable, to, h, maxHops, maxNodes, onEach) } } } this.on('edge', onEdge) return function () { self.removeListener('edge', onEdge) } } // page rank. I adapted the algorithm to use // forward links instead of backward links which means // we only have to traverse the graph one time. exports.rank = function (opts) { opts = opts || {} var ranks = {}, links = {}, _ranks = {} var N = count(this.nodes) var iterations = opts.iterations || 1 var damping = opts.damping || 0.85 var init = (1 - damping) / N //initialize this.each(function (k, n) { ranks[k] = 1/N; _ranks[k] = init links[k] = count(n.edges) }) while(iterations --> 0) { //iteration this.each(function (j, n) { var r = damping*(ranks[j]/links[j]) n.each(function (k) { _ranks[k] += r }) }) //reset for(var k in ranks) ranks[k] = init var __ranks = ranks ranks = _ranks _ranks = __ranks } return ranks } //find the shortest path between two nodes. //if there was no path within max hops, return null. //convert a spanning tree to an array. function toArray (span, root) { if(!span[root]) return null var a = [root] while(span[root]) a.push(root = span[root]) return a.reverse() } exports.path = function (opts) { var reverse = {} if(opts.source == opts.dest) return [opts.source] opts.start = opts.source opts.live = false opts.each = function (f, t, h) { reverse[t] = f } this.traverse(opts) return toArray(reverse, opts.dest) } },{}],154:[function(require,module,exports){ var EventEmitter = require('events').EventEmitter var inherits = require('util').inherits inherits(Graphmitter, EventEmitter) module.exports = Graphmitter function each(obj, iter) { for(var k in obj) iter(k, obj[k]) } // // Node / Vertice // function Node () { this.edges = {} } var nproto = Node.prototype //returns the old data for this edge.. nproto.edge = function (to, data) { var _data = this.edges[to] this.edges[to] = (data == null ? true : data) return _data } nproto.has = function (to) { return this.edges[to] } //also returns the old data for this edge.. nproto.del = function (to, data) { var _data = this.edges[to] delete this.edges[to] return _data } nproto.each = function (iter) { each(this.edges, iter) return this } // // the whole graph // function Graphmitter () { if(!(this instanceof Graphmitter)) return new Graphmitter() this.nodes = {} } var proto = Graphmitter.prototype proto.hasNode = function (n) { return !!this.nodes[n] } proto.hasEdge = function (f, t) { return this.hasNode(f) && !!this.nodes[f].edges[t] != null } proto.node = function (n) { return this.nodes[n] = this.nodes[n] || new Node(n) } proto.get = function (f, t) { if(t == null) return this.nodes[f] return this.hasNode(f) ? this.nodes[f].edges[t] : null } proto.edge = function (from, to, data) { data = (data == null ? true : data) var f = this.node(from) this.node(to) var _data = f.edge(to, data) if(_data !== data) this.emit('edge', from, to, data, _data) return this } proto.del = function (from, to) { var data = this.node(from).del(to) if (typeof data !== 'undefined') this.emit('del', from, to, data) return this } proto.each = function (iter) { each(this.nodes, iter) return this } proto.eachEdge = function (iter) { each(this.nodes, function (from, n) { each(n.edges, function (to, data) { iter(from, to, data) }) }) return this } //get a random node proto.random = function () { var keys = Object.keys(this.nodes) return keys[~~(keys.length*Math.random())] } //add another subgraph proto.add = function (g2) { var g1 = this g2.eachEdge(function (from, to, data) { g1.edge(from, to, data) }) return this } proto.toJSON = function (iter) { var g = {} this.each(function (k, v) { var e = {} v.each(function (k, v) { e[k] = v }) g[k] = e }) return g } // // graph generators // Graphmitter.random = function (nodes, edges, prefix) { prefix = prefix || '#' if(isNaN(+nodes)) throw new Error('nodes must be a number') if(isNaN(+edges)) throw new Error('edges must be a number') var n = 0, g = new Graphmitter() function rand(n) { return prefix+~~(Math.random()*n) } for(var i = 0; i < nodes; i++) g.node(prefix+i) for(var i = 0; i < edges; i++) { var a = rand(nodes), b = rand(nodes) g.edge(a, b).edge(b, a) } return g } var algorithms = require('./algorithms') for(var k in algorithms) proto[k] = algorithms[k] },{"./algorithms":153,"events":144,"util":636}],155:[function(require,module,exports){ var hash = exports; hash.utils = require('./hash/utils'); hash.common = require('./hash/common'); hash.sha = require('./hash/sha'); hash.ripemd = require('./hash/ripemd'); hash.hmac = require('./hash/hmac'); // Proxy hash functions to the main object hash.sha1 = hash.sha.sha1; hash.sha256 = hash.sha.sha256; hash.sha224 = hash.sha.sha224; hash.sha384 = hash.sha.sha384; hash.sha512 = hash.sha.sha512; hash.ripemd160 = hash.ripemd.ripemd160; },{"./hash/common":156,"./hash/hmac":157,"./hash/ripemd":158,"./hash/sha":159,"./hash/utils":160}],156:[function(require,module,exports){ var hash = require('../hash'); var utils = hash.utils; var assert = utils.assert; function BlockHash() { this.pending = null; this.pendingTotal = 0; this.blockSize = this.constructor.blockSize; this.outSize = this.constructor.outSize; this.hmacStrength = this.constructor.hmacStrength; this.padLength = this.constructor.padLength / 8; this.endian = 'big'; this._delta8 = this.blockSize / 8; this._delta32 = this.blockSize / 32; } exports.BlockHash = BlockHash; BlockHash.prototype.update = function update(msg, enc) { // Convert message to array, pad it, and join into 32bit blocks msg = utils.toArray(msg, enc); if (!this.pending) this.pending = msg; else this.pending = this.pending.concat(msg); this.pendingTotal += msg.length; // Enough data, try updating if (this.pending.length >= this._delta8) { msg = this.pending; // Process pending data in blocks var r = msg.length % this._delta8; this.pending = msg.slice(msg.length - r, msg.length); if (this.pending.length === 0) this.pending = null; msg = utils.join32(msg, 0, msg.length - r, this.endian); for (var i = 0; i < msg.length; i += this._delta32) this._update(msg, i, i + this._delta32); } return this; }; BlockHash.prototype.digest = function digest(enc) { this.update(this._pad()); assert(this.pending === null); return this._digest(enc); }; BlockHash.prototype._pad = function pad() { var len = this.pendingTotal; var bytes = this._delta8; var k = bytes - ((len + this.padLength) % bytes); var res = new Array(k + this.padLength); res[0] = 0x80; for (var i = 1; i < k; i++) res[i] = 0; // Append length len <<= 3; if (this.endian === 'big') { for (var t = 8; t < this.padLength; t++) res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = (len >>> 24) & 0xff; res[i++] = (len >>> 16) & 0xff; res[i++] = (len >>> 8) & 0xff; res[i++] = len & 0xff; } else { res[i++] = len & 0xff; res[i++] = (len >>> 8) & 0xff; res[i++] = (len >>> 16) & 0xff; res[i++] = (len >>> 24) & 0xff; res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = 0; for (var t = 8; t < this.padLength; t++) res[i++] = 0; } return res; }; },{"../hash":155}],157:[function(require,module,exports){ var hmac = exports; var hash = require('../hash'); var utils = hash.utils; var assert = utils.assert; function Hmac(hash, key, enc) { if (!(this instanceof Hmac)) return new Hmac(hash, key, enc); this.Hash = hash; this.blockSize = hash.blockSize / 8; this.outSize = hash.outSize / 8; this.inner = null; this.outer = null; this._init(utils.toArray(key, enc)); } module.exports = Hmac; Hmac.prototype._init = function init(key) { // Shorten key, if needed if (key.length > this.blockSize) key = new this.Hash().update(key).digest(); assert(key.length <= this.blockSize); // Add padding to key for (var i = key.length; i < this.blockSize; i++) key.push(0); for (var i = 0; i < key.length; i++) key[i] ^= 0x36; this.inner = new this.Hash().update(key); // 0x36 ^ 0x5c = 0x6a for (var i = 0; i < key.length; i++) key[i] ^= 0x6a; this.outer = new this.Hash().update(key); }; Hmac.prototype.update = function update(msg, enc) { this.inner.update(msg, enc); return this; }; Hmac.prototype.digest = function digest(enc) { this.outer.update(this.inner.digest()); return this.outer.digest(enc); }; },{"../hash":155}],158:[function(require,module,exports){ var hash = require('../hash'); var utils = hash.utils; var rotl32 = utils.rotl32; var sum32 = utils.sum32; var sum32_3 = utils.sum32_3; var sum32_4 = utils.sum32_4; var BlockHash = hash.common.BlockHash; function RIPEMD160() { if (!(this instanceof RIPEMD160)) return new RIPEMD160(); BlockHash.call(this); this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; this.endian = 'little'; } utils.inherits(RIPEMD160, BlockHash); exports.ripemd160 = RIPEMD160; RIPEMD160.blockSize = 512; RIPEMD160.outSize = 160; RIPEMD160.hmacStrength = 192; RIPEMD160.padLength = 64; RIPEMD160.prototype._update = function update(msg, start) { var A = this.h[0]; var B = this.h[1]; var C = this.h[2]; var D = this.h[3]; var E = this.h[4]; var Ah = A; var Bh = B; var Ch = C; var Dh = D; var Eh = E; for (var j = 0; j < 80; j++) { var T = sum32( rotl32( sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E); A = E; E = D; D = rotl32(C, 10); C = B; B = T; T = sum32( rotl32( sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh); Ah = Eh; Eh = Dh; Dh = rotl32(Ch, 10); Ch = Bh; Bh = T; } T = sum32_3(this.h[1], C, Dh); this.h[1] = sum32_3(this.h[2], D, Eh); this.h[2] = sum32_3(this.h[3], E, Ah); this.h[3] = sum32_3(this.h[4], A, Bh); this.h[4] = sum32_3(this.h[0], B, Ch); this.h[0] = T; }; RIPEMD160.prototype._digest = function digest(enc) { if (enc === 'hex') return utils.toHex32(this.h, 'little'); else return utils.split32(this.h, 'little'); }; function f(j, x, y, z) { if (j <= 15) return x ^ y ^ z; else if (j <= 31) return (x & y) | ((~x) & z); else if (j <= 47) return (x | (~y)) ^ z; else if (j <= 63) return (x & z) | (y & (~z)); else return x ^ (y | (~z)); } function K(j) { if (j <= 15) return 0x00000000; else if (j <= 31) return 0x5a827999; else if (j <= 47) return 0x6ed9eba1; else if (j <= 63) return 0x8f1bbcdc; else return 0xa953fd4e; } function Kh(j) { if (j <= 15) return 0x50a28be6; else if (j <= 31) return 0x5c4dd124; else if (j <= 47) return 0x6d703ef3; else if (j <= 63) return 0x7a6d76e9; else return 0x00000000; } var r = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 ]; var rh = [ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 ]; var s = [ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]; var sh = [ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]; },{"../hash":155}],159:[function(require,module,exports){ var hash = require('../hash'); var utils = hash.utils; var assert = utils.assert; var rotr32 = utils.rotr32; var rotl32 = utils.rotl32; var sum32 = utils.sum32; var sum32_4 = utils.sum32_4; var sum32_5 = utils.sum32_5; var rotr64_hi = utils.rotr64_hi; var rotr64_lo = utils.rotr64_lo; var shr64_hi = utils.shr64_hi; var shr64_lo = utils.shr64_lo; var sum64 = utils.sum64; var sum64_hi = utils.sum64_hi; var sum64_lo = utils.sum64_lo; var sum64_4_hi = utils.sum64_4_hi; var sum64_4_lo = utils.sum64_4_lo; var sum64_5_hi = utils.sum64_5_hi; var sum64_5_lo = utils.sum64_5_lo; var BlockHash = hash.common.BlockHash; var sha256_K = [ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 ]; var sha512_K = [ 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 ]; var sha1_K = [ 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 ]; function SHA256() { if (!(this instanceof SHA256)) return new SHA256(); BlockHash.call(this); this.h = [ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 ]; this.k = sha256_K; this.W = new Array(64); } utils.inherits(SHA256, BlockHash); exports.sha256 = SHA256; SHA256.blockSize = 512; SHA256.outSize = 256; SHA256.hmacStrength = 192; SHA256.padLength = 64; SHA256.prototype._update = function _update(msg, start) { var W = this.W; for (var i = 0; i < 16; i++) W[i] = msg[start + i]; for (; i < W.length; i++) W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]); var a = this.h[0]; var b = this.h[1]; var c = this.h[2]; var d = this.h[3]; var e = this.h[4]; var f = this.h[5]; var g = this.h[6]; var h = this.h[7]; assert(this.k.length === W.length); for (var i = 0; i < W.length; i++) { var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]); var T2 = sum32(s0_256(a), maj32(a, b, c)); h = g; g = f; f = e; e = sum32(d, T1); d = c; c = b; b = a; a = sum32(T1, T2); } this.h[0] = sum32(this.h[0], a); this.h[1] = sum32(this.h[1], b); this.h[2] = sum32(this.h[2], c); this.h[3] = sum32(this.h[3], d); this.h[4] = sum32(this.h[4], e); this.h[5] = sum32(this.h[5], f); this.h[6] = sum32(this.h[6], g); this.h[7] = sum32(this.h[7], h); }; SHA256.prototype._digest = function digest(enc) { if (enc === 'hex') return utils.toHex32(this.h, 'big'); else return utils.split32(this.h, 'big'); }; function SHA224() { if (!(this instanceof SHA224)) return new SHA224(); SHA256.call(this); this.h = [ 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ]; } utils.inherits(SHA224, SHA256); exports.sha224 = SHA224; SHA224.blockSize = 512; SHA224.outSize = 224; SHA224.hmacStrength = 192; SHA224.padLength = 64; SHA224.prototype._digest = function digest(enc) { // Just truncate output if (enc === 'hex') return utils.toHex32(this.h.slice(0, 7), 'big'); else return utils.split32(this.h.slice(0, 7), 'big'); }; function SHA512() { if (!(this instanceof SHA512)) return new SHA512(); BlockHash.call(this); this.h = [ 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1, 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179 ]; this.k = sha512_K; this.W = new Array(160); } utils.inherits(SHA512, BlockHash); exports.sha512 = SHA512; SHA512.blockSize = 1024; SHA512.outSize = 512; SHA512.hmacStrength = 192; SHA512.padLength = 128; SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) { var W = this.W; // 32 x 32bit words for (var i = 0; i < 32; i++) W[i] = msg[start + i]; for (; i < W.length; i += 2) { var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2 var c0_lo = g1_512_lo(W[i - 4], W[i - 3]); var c1_hi = W[i - 14]; // i - 7 var c1_lo = W[i - 13]; var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15 var c2_lo = g0_512_lo(W[i - 30], W[i - 29]); var c3_hi = W[i - 32]; // i - 16 var c3_lo = W[i - 31]; W[i] = sum64_4_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo); W[i + 1] = sum64_4_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo); } }; SHA512.prototype._update = function _update(msg, start) { this._prepareBlock(msg, start); var W = this.W; var ah = this.h[0]; var al = this.h[1]; var bh = this.h[2]; var bl = this.h[3]; var ch = this.h[4]; var cl = this.h[5]; var dh = this.h[6]; var dl = this.h[7]; var eh = this.h[8]; var el = this.h[9]; var fh = this.h[10]; var fl = this.h[11]; var gh = this.h[12]; var gl = this.h[13]; var hh = this.h[14]; var hl = this.h[15]; assert(this.k.length === W.length); for (var i = 0; i < W.length; i += 2) { var c0_hi = hh; var c0_lo = hl; var c1_hi = s1_512_hi(eh, el); var c1_lo = s1_512_lo(eh, el); var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl); var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl); var c3_hi = this.k[i]; var c3_lo = this.k[i + 1]; var c4_hi = W[i]; var c4_lo = W[i + 1]; var T1_hi = sum64_5_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo); var T1_lo = sum64_5_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo); var c0_hi = s0_512_hi(ah, al); var c0_lo = s0_512_lo(ah, al); var c1_hi = maj64_hi(ah, al, bh, bl, ch, cl); var c1_lo = maj64_lo(ah, al, bh, bl, ch, cl); var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo); var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo); hh = gh; hl = gl; gh = fh; gl = fl; fh = eh; fl = el; eh = sum64_hi(dh, dl, T1_hi, T1_lo); el = sum64_lo(dl, dl, T1_hi, T1_lo); dh = ch; dl = cl; ch = bh; cl = bl; bh = ah; bl = al; ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo); al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo); } sum64(this.h, 0, ah, al); sum64(this.h, 2, bh, bl); sum64(this.h, 4, ch, cl); sum64(this.h, 6, dh, dl); sum64(this.h, 8, eh, el); sum64(this.h, 10, fh, fl); sum64(this.h, 12, gh, gl); sum64(this.h, 14, hh, hl); }; SHA512.prototype._digest = function digest(enc) { if (enc === 'hex') return utils.toHex32(this.h, 'big'); else return utils.split32(this.h, 'big'); }; function SHA384() { if (!(this instanceof SHA384)) return new SHA384(); SHA512.call(this); this.h = [ 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939, 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4 ]; } utils.inherits(SHA384, SHA512); exports.sha384 = SHA384; SHA384.blockSize = 1024; SHA384.outSize = 384; SHA384.hmacStrength = 192; SHA384.padLength = 128; SHA384.prototype._digest = function digest(enc) { if (enc === 'hex') return utils.toHex32(this.h.slice(0, 12), 'big'); else return utils.split32(this.h.slice(0, 12), 'big'); }; function SHA1() { if (!(this instanceof SHA1)) return new SHA1(); BlockHash.call(this); this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; this.W = new Array(80); } utils.inherits(SHA1, BlockHash); exports.sha1 = SHA1; SHA1.blockSize = 512; SHA1.outSize = 160; SHA1.hmacStrength = 80; SHA1.padLength = 64; SHA1.prototype._update = function _update(msg, start) { var W = this.W; for (var i = 0; i < 16; i++) W[i] = msg[start + i]; for(; i < W.length; i++) W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); var a = this.h[0]; var b = this.h[1]; var c = this.h[2]; var d = this.h[3]; var e = this.h[4]; for (var i = 0; i < W.length; i++) { var s = ~~(i / 20); var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); e = d; d = c; c = rotl32(b, 30); b = a; a = t; } this.h[0] = sum32(this.h[0], a); this.h[1] = sum32(this.h[1], b); this.h[2] = sum32(this.h[2], c); this.h[3] = sum32(this.h[3], d); this.h[4] = sum32(this.h[4], e); }; SHA1.prototype._digest = function digest(enc) { if (enc === 'hex') return utils.toHex32(this.h, 'big'); else return utils.split32(this.h, 'big'); }; function ch32(x, y, z) { return (x & y) ^ ((~x) & z); } function maj32(x, y, z) { return (x & y) ^ (x & z) ^ (y & z); } function p32(x, y, z) { return x ^ y ^ z; } function s0_256(x) { return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); } function s1_256(x) { return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); } function g0_256(x) { return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3); } function g1_256(x) { return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10); } function ft_1(s, x, y, z) { if (s === 0) return ch32(x, y, z); if (s === 1 || s === 3) return p32(x, y, z); if (s === 2) return maj32(x, y, z); } function ch64_hi(xh, xl, yh, yl, zh, zl) { var r = (xh & yh) ^ ((~xh) & zh); if (r < 0) r += 0x100000000; return r; } function ch64_lo(xh, xl, yh, yl, zh, zl) { var r = (xl & yl) ^ ((~xl) & zl); if (r < 0) r += 0x100000000; return r; } function maj64_hi(xh, xl, yh, yl, zh, zl) { var r = (xh & yh) ^ (xh & zh) ^ (yh & zh); if (r < 0) r += 0x100000000; return r; } function maj64_lo(xh, xl, yh, yl, zh, zl) { var r = (xl & yl) ^ (xl & zl) ^ (yl & zl); if (r < 0) r += 0x100000000; return r; } function s0_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 28); var c1_hi = rotr64_hi(xl, xh, 2); // 34 var c2_hi = rotr64_hi(xl, xh, 7); // 39 var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function s0_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 28); var c1_lo = rotr64_lo(xl, xh, 2); // 34 var c2_lo = rotr64_lo(xl, xh, 7); // 39 var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } function s1_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 14); var c1_hi = rotr64_hi(xh, xl, 18); var c2_hi = rotr64_hi(xl, xh, 9); // 41 var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function s1_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 14); var c1_lo = rotr64_lo(xh, xl, 18); var c2_lo = rotr64_lo(xl, xh, 9); // 41 var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } function g0_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 1); var c1_hi = rotr64_hi(xh, xl, 8); var c2_hi = shr64_hi(xh, xl, 7); var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function g0_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 1); var c1_lo = rotr64_lo(xh, xl, 8); var c2_lo = shr64_lo(xh, xl, 7); var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } function g1_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 19); var c1_hi = rotr64_hi(xl, xh, 29); // 61 var c2_hi = shr64_hi(xh, xl, 6); var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 0x100000000; return r; } function g1_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 19); var c1_lo = rotr64_lo(xl, xh, 29); // 61 var c2_lo = shr64_lo(xh, xl, 6); var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 0x100000000; return r; } },{"../hash":155}],160:[function(require,module,exports){ var utils = exports; var inherits = require('inherits'); function toArray(msg, enc) { if (Array.isArray(msg)) return msg.slice(); if (!msg) return []; var res = []; if (typeof msg === 'string') { if (!enc) { for (var i = 0; i < msg.length; i++) { var c = msg.charCodeAt(i); var hi = c >> 8; var lo = c & 0xff; if (hi) res.push(hi, lo); else res.push(lo); } } else if (enc === 'hex') { msg = msg.replace(/[^a-z0-9]+/ig, ''); if (msg.length % 2 !== 0) msg = '0' + msg; for (var i = 0; i < msg.length; i += 2) res.push(parseInt(msg[i] + msg[i + 1], 16)); } } else { for (var i = 0; i < msg.length; i++) res[i] = msg[i] | 0; } return res; } utils.toArray = toArray; function toHex(msg) { var res = ''; for (var i = 0; i < msg.length; i++) res += zero2(msg[i].toString(16)); return res; } utils.toHex = toHex; function htonl(w) { var res = (w >>> 24) | ((w >>> 8) & 0xff00) | ((w << 8) & 0xff0000) | ((w & 0xff) << 24); return res >>> 0; } utils.htonl = htonl; function toHex32(msg, endian) { var res = ''; for (var i = 0; i < msg.length; i++) { var w = msg[i]; if (endian === 'little') w = htonl(w); res += zero8(w.toString(16)); } return res; } utils.toHex32 = toHex32; function zero2(word) { if (word.length === 1) return '0' + word; else return word; } utils.zero2 = zero2; function zero8(word) { if (word.length === 7) return '0' + word; else if (word.length === 6) return '00' + word; else if (word.length === 5) return '000' + word; else if (word.length === 4) return '0000' + word; else if (word.length === 3) return '00000' + word; else if (word.length === 2) return '000000' + word; else if (word.length === 1) return '0000000' + word; else return word; } utils.zero8 = zero8; function join32(msg, start, end, endian) { var len = end - start; assert(len % 4 === 0); var res = new Array(len / 4); for (var i = 0, k = start; i < res.length; i++, k += 4) { var w; if (endian === 'big') w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]; else w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]; res[i] = w >>> 0; } return res; } utils.join32 = join32; function split32(msg, endian) { var res = new Array(msg.length * 4); for (var i = 0, k = 0; i < msg.length; i++, k += 4) { var m = msg[i]; if (endian === 'big') { res[k] = m >>> 24; res[k + 1] = (m >>> 16) & 0xff; res[k + 2] = (m >>> 8) & 0xff; res[k + 3] = m & 0xff; } else { res[k + 3] = m >>> 24; res[k + 2] = (m >>> 16) & 0xff; res[k + 1] = (m >>> 8) & 0xff; res[k] = m & 0xff; } } return res; } utils.split32 = split32; function rotr32(w, b) { return (w >>> b) | (w << (32 - b)); } utils.rotr32 = rotr32; function rotl32(w, b) { return (w << b) | (w >>> (32 - b)); } utils.rotl32 = rotl32; function sum32(a, b) { return (a + b) >>> 0; } utils.sum32 = sum32; function sum32_3(a, b, c) { return (a + b + c) >>> 0; } utils.sum32_3 = sum32_3; function sum32_4(a, b, c, d) { return (a + b + c + d) >>> 0; } utils.sum32_4 = sum32_4; function sum32_5(a, b, c, d, e) { return (a + b + c + d + e) >>> 0; } utils.sum32_5 = sum32_5; function assert(cond, msg) { if (!cond) throw new Error(msg || 'Assertion failed'); } utils.assert = assert; utils.inherits = inherits; function sum64(buf, pos, ah, al) { var bh = buf[pos]; var bl = buf[pos + 1]; var lo = (al + bl) >>> 0; var hi = (lo < al ? 1 : 0) + ah + bh; buf[pos] = hi >>> 0; buf[pos + 1] = lo; } exports.sum64 = sum64; function sum64_hi(ah, al, bh, bl) { var lo = (al + bl) >>> 0; var hi = (lo < al ? 1 : 0) + ah + bh; return hi >>> 0; }; exports.sum64_hi = sum64_hi; function sum64_lo(ah, al, bh, bl) { var lo = al + bl; return lo >>> 0; }; exports.sum64_lo = sum64_lo; function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) { var carry = 0; var lo = al; lo = (lo + bl) >>> 0; carry += lo < al ? 1 : 0; lo = (lo + cl) >>> 0; carry += lo < cl ? 1 : 0; lo = (lo + dl) >>> 0; carry += lo < dl ? 1 : 0; var hi = ah + bh + ch + dh + carry; return hi >>> 0; }; exports.sum64_4_hi = sum64_4_hi; function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) { var lo = al + bl + cl + dl; return lo >>> 0; }; exports.sum64_4_lo = sum64_4_lo; function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { var carry = 0; var lo = al; lo = (lo + bl) >>> 0; carry += lo < al ? 1 : 0; lo = (lo + cl) >>> 0; carry += lo < cl ? 1 : 0; lo = (lo + dl) >>> 0; carry += lo < dl ? 1 : 0; lo = (lo + el) >>> 0; carry += lo < el ? 1 : 0; var hi = ah + bh + ch + dh + eh + carry; return hi >>> 0; }; exports.sum64_5_hi = sum64_5_hi; function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { var lo = al + bl + cl + dl + el; return lo >>> 0; }; exports.sum64_5_lo = sum64_5_lo; function rotr64_hi(ah, al, num) { var r = (al << (32 - num)) | (ah >>> num); return r >>> 0; }; exports.rotr64_hi = rotr64_hi; function rotr64_lo(ah, al, num) { var r = (ah << (32 - num)) | (al >>> num); return r >>> 0; }; exports.rotr64_lo = rotr64_lo; function shr64_hi(ah, al, num) { return ah >>> num; }; exports.shr64_hi = shr64_hi; function shr64_lo(ah, al, num) { var r = (ah << (32 - num)) | (al >>> num); return r >>> 0; }; exports.shr64_lo = shr64_lo; },{"inherits":167}],161:[function(require,module,exports){ (function (Buffer){ 'use strict'; var zeroBuffer = new Buffer(128) zeroBuffer.fill(0) module.exports = Hmac function Hmac (createHash, blocksize, key) { if(!(this instanceof Hmac)) return new Hmac(createHash, blocksize, key) this._opad = opad this._createHash = createHash if(blocksize !== 128 && blocksize !== 64) throw new Error('blocksize must be either 64 for or 128 , but was:'+blocksize) key = this._key = !Buffer.isBuffer(key) ? new Buffer(key) : key if(key.length > blocksize) { key = this._createHash().update(key).digest() } else if(key.length < blocksize) { key = Buffer.concat([key, zeroBuffer], blocksize) } var ipad = this._ipad = new Buffer(blocksize) var opad = this._opad = new Buffer(blocksize) for(var i = 0; i < blocksize; i++) { ipad[i] = key[i] ^ 0x36 opad[i] = key[i] ^ 0x5C } this._hash = this._createHash().update(ipad) } Hmac.prototype.update = function (data, enc) { this._hash.update(data, enc) return this } Hmac.prototype.digest = function (enc) { var h = this._hash.digest() return this._createHash().update(this._opad).update(h).digest(enc) } }).call(this,require("buffer").Buffer) },{"buffer":61}],162:[function(require,module,exports){ function wrap (fn, hook) { return function () { return hook.call(this, fn, [].slice.call(arguments)) } } module.exports = function hookable(fn) { function hooked () { return fn.apply(this, [].slice.call(arguments)) } hooked.hook = function (hook) { fn = wrap(fn, hook) return this } return hooked } },{}],163:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = nBytes * 8 - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var nBits = -7 var i = isLE ? (nBytes - 1) : 0 var d = isLE ? -1 : 1 var s = buffer[offset + i] i += d e = s & ((1 << (-nBits)) - 1) s >>= (-nBits) nBits += eLen for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1) e >>= (-nBits) nBits += mLen for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen) e = e - eBias } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c var eLen = nBytes * 8 - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) var i = isLE ? 0 : (nBytes - 1) var d = isLE ? 1 : -1 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 value = Math.abs(value) if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0 e = eMax } else { e = Math.floor(Math.log(value) / Math.LN2) if (value * (c = Math.pow(2, -e)) < 1) { e-- c *= 2 } if (e + eBias >= 1) { value += rt / c } else { value += rt * Math.pow(2, 1 - eBias) } if (value * c >= 2) { e++ c /= 2 } if (e + eBias >= eMax) { m = 0 e = eMax } else if (e + eBias >= 1) { m = (value * c - 1) * Math.pow(2, mLen) e = e + eBias } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) e = 0 } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m eLen += mLen for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128 } },{}],164:[function(require,module,exports){ module.exports = function (buf) { var len = buf.length, i for(i = len - 1; buf[i] === 255; i--) buf[i] = 0 if(~i) buf[i] = buf[i] + 1 return buf } },{}],165:[function(require,module,exports){ var indexOf = [].indexOf; module.exports = function(arr, obj){ if (indexOf) return arr.indexOf(obj); for (var i = 0; i < arr.length; ++i) { if (arr[i] === obj) return i; } return -1; }; },{}],166:[function(require,module,exports){ (function (process){ var wrappy = require('wrappy') var reqs = Object.create(null) var once = require('once') module.exports = wrappy(inflight) function inflight (key, cb) { if (reqs[key]) { reqs[key].push(cb) return null } else { reqs[key] = [cb] return makeres(key) } } function makeres (key) { return once(function RES () { var cbs = reqs[key] var len = cbs.length var args = slice(arguments) for (var i = 0; i < len; i++) { cbs[i].apply(null, args) } if (cbs.length > len) { // added more in the interim. // de-zalgo, just in case, but don't call again. cbs.splice(0, len) process.nextTick(function () { RES.apply(null, args) }) } else { delete reqs[key] } }) } function slice (args) { var length = args.length var array = [] for (var i = 0; i < length; i++) array[i] = args[i] return array } }).call(this,require('_process')) },{"_process":295,"once":278,"wrappy":641}],167:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } },{}],168:[function(require,module,exports){ 'use strict'; var v4 = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}'; var v6 = '(?:(?:[0-9a-fA-F:]){1,4}(?:(?::(?:[0-9a-fA-F]){1,4}|:)){2,7})+'; var ip = module.exports = function (opts) { opts = opts || {}; return opts.exact ? new RegExp('(?:^' + v4 + '$)|(?:^' + v6 + '$)') : new RegExp('(?:' + v4 + ')|(?:' + v6 + ')', 'g'); }; ip.v4 = function (opts) { opts = opts || {}; return opts.exact ? new RegExp('^' + v4 + '$') : new RegExp(v4, 'g'); }; ip.v6 = function (opts) { opts = opts || {}; return opts.exact ? new RegExp('^' + v6 + '$') : new RegExp(v6, 'g'); }; },{}],169:[function(require,module,exports){ var ip = exports, Buffer = require('buffer').Buffer, os = require('os'); ip.toBuffer = function toBuffer(ip, buff, offset) { offset = ~~offset; var result; if (/^(\d{1,3}\.){3,3}\d{1,3}$/.test(ip)) { result = buff || new Buffer(offset + 4); ip.split(/\./g).map(function(byte) { result[offset++] = parseInt(byte, 10) & 0xff; }); } else if (/^[a-f0-9:]+$/.test(ip)) { var s = ip.split(/::/g, 2), head = (s[0] || '').split(/:/g, 8), tail = (s[1] || '').split(/:/g, 8); if (tail.length === 0) { // xxxx:: while (head.length < 8) head.push('0000'); } else if (head.length === 0) { // ::xxxx while (tail.length < 8) tail.unshift('0000'); } else { // xxxx::xxxx while (head.length + tail.length < 8) head.push('0000'); } result = buff || new Buffer(offset + 16); head.concat(tail).map(function(word) { word = parseInt(word, 16); result[offset++] = (word >> 8) & 0xff; result[offset++] = word & 0xff; }); } else { throw Error('Invalid ip address: ' + ip); } return result; }; ip.toString = function toString(buff, offset, length) { offset = ~~offset; length = length || (buff.length - offset); var result = []; if (length === 4) { // IPv4 for (var i = 0; i < length; i++) { result.push(buff[offset + i]); } result = result.join('.'); } else if (length === 16) { // IPv6 for (var i = 0; i < length; i += 2) { result.push(buff.readUInt16BE(offset + i).toString(16)); } result = result.join(':'); result = result.replace(/(^|:)0(:0)*:0(:|$)/, '$1::$3'); result = result.replace(/:{3,4}/, '::'); } return result; }; ip.fromPrefixLen = function fromPrefixLen(prefixlen, family) { if (prefixlen > 32) { family = 'ipv6'; } else { family = _normalizeFamily(family); } var len = 4; if (family === 'ipv6') { len = 16; } var buff = new Buffer(len); for (var i = 0, n = buff.length; i < n; ++i) { var bits = 8; if (prefixlen < 8) { bits = prefixlen; } prefixlen -= bits; buff[i] = ~(0xff >> bits); } return ip.toString(buff); }; ip.mask = function mask(addr, mask) { addr = ip.toBuffer(addr); mask = ip.toBuffer(mask); var result = new Buffer(Math.max(addr.length, mask.length)); // Same protocol - do bitwise and if (addr.length === mask.length) { for (var i = 0; i < addr.length; i++) { result[i] = addr[i] & mask[i]; } } else if (mask.length === 4) { // IPv6 address and IPv4 mask // (Mask low bits) for (var i = 0; i < mask.length; i++) { result[i] = addr[addr.length - 4 + i] & mask[i]; } } else { // IPv6 mask and IPv4 addr for (var i = 0; i < result.length - 6; i++) { result[i] = 0; } // ::ffff:ipv4 result[10] = 0xff; result[11] = 0xff; for (var i = 0; i < addr.length; i++) { result[i + 12] = addr[i] & mask[i + 12]; } } return ip.toString(result); }; ip.cidr = function cidr(cidrString) { var cidrParts = cidrString.split('/'); if (cidrParts.length != 2) throw new Error('invalid CIDR subnet: ' + addr); var addr = cidrParts[0]; var mask = ip.fromPrefixLen(parseInt(cidrParts[1], 10)); return ip.mask(addr, mask); } ip.subnet = function subnet(addr, mask) { var networkAddress = ip.toLong(ip.mask(addr, mask)); // Calculate the mask's length. var maskBuffer = ip.toBuffer(mask); var maskLength = 0; for (var i = 0; i < maskBuffer.length; i++) { if (maskBuffer[i] == 0xff) { maskLength += 8; } else { var octet = maskBuffer[i] & 0xff; while (octet) { octet = (octet << 1) & 0xff; maskLength++; } } } var numberOfAddresses = Math.pow(2, 32 - maskLength); return { networkAddress: ip.fromLong(networkAddress), firstAddress: numberOfAddresses <= 2 ? ip.fromLong(networkAddress) : ip.fromLong(networkAddress + 1), lastAddress: numberOfAddresses <= 2 ? ip.fromLong(networkAddress + numberOfAddresses - 1) : ip.fromLong(networkAddress + numberOfAddresses - 2), broadcastAddress: ip.fromLong(networkAddress + numberOfAddresses - 1), subnetMask: mask, subnetMaskLength: maskLength, numHosts: numberOfAddresses <= 2 ? numberOfAddresses : numberOfAddresses - 2, length: numberOfAddresses }; } ip.cidrSubnet = function cidrSubnet(cidrString) { var cidrParts = cidrString.split('/'); if (cidrParts.length !== 2) throw new Error('invalid CIDR subnet: ' + addr); var addr = cidrParts[0]; var mask = ip.fromPrefixLen(parseInt(cidrParts[1], 10)); return ip.subnet(addr, mask); } ip.not = function not(addr) { var buff = ip.toBuffer(addr); for (var i = 0; i < buff.length; i++) { buff[i] = 0xff ^ buff[i]; } return ip.toString(buff); }; ip.or = function or(a, b) { a = ip.toBuffer(a); b = ip.toBuffer(b); // same protocol if (a.length == b.length) { for (var i = 0; i < a.length; ++i) { a[i] |= b[i]; } return ip.toString(a); // mixed protocols } else { var buff = a; var other = b; if (b.length > a.length) { buff = b; other = a; } var offset = buff.length - other.length; for (var i = offset; i < buff.length; ++i) { buff[i] |= other[i - offset]; } return ip.toString(buff); } }; ip.isEqual = function isEqual(a, b) { a = ip.toBuffer(a); b = ip.toBuffer(b); // Same protocol if (a.length === b.length) { for (var i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true; } // Swap if (b.length === 4) { var t = b; b = a; a = t; } // a - IPv4, b - IPv6 for (var i = 0; i < 10; i++) { if (b[i] !== 0) return false; } var word = b.readUInt16BE(10); if (word !== 0 && word !== 0xffff) return false; for (var i = 0; i < 4; i++) { if (a[i] !== b[i + 12]) return false; } return true; }; ip.isPrivate = function isPrivate(addr) { return addr.match(/^10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/) != null || addr.match(/^192\.168\.([0-9]{1,3})\.([0-9]{1,3})/) != null || addr.match( /^172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})/) != null || addr.match(/^127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/) != null || addr.match(/^169\.254\.([0-9]{1,3})\.([0-9]{1,3})/) != null || addr.match(/^fc00:/) != null || addr.match(/^fe80:/) != null || addr.match(/^::1$/) != null || addr.match(/^::$/) != null; }; ip.isPublic = function isPublic(addr) { return !ip.isPrivate(addr); } ip.isLoopback = function isLoopback(addr) { return /^127\.0\.0\.1$/.test(addr) || /^fe80::1$/.test(addr) || /^::1$/.test(addr) || /^::$/.test(addr); }; ip.loopback = function loopback(family) { // // Default to `ipv4` // family = _normalizeFamily(family); if (family !== 'ipv4' && family !== 'ipv6') { throw new Error('family must be ipv4 or ipv6'); } return family === 'ipv4' ? '127.0.0.1' : 'fe80::1'; }; // // ### function address (name, family) // #### @name {string|'public'|'private'} **Optional** Name or security // of the network interface. // #### @family {ipv4|ipv6} **Optional** IP family of the address (defaults // to ipv4). // // Returns the address for the network interface on the current system with // the specified `name`: // * String: First `family` address of the interface. // If not found see `undefined`. // * 'public': the first public ip address of family. // * 'private': the first private ip address of family. // * undefined: First address with `ipv4` or loopback addres `127.0.0.1`. // ip.address = function address(name, family) { var interfaces = os.networkInterfaces(), all; // // Default to `ipv4` // family = _normalizeFamily(family); // // If a specific network interface has been named, // return the address. // if (name && !~['public', 'private'].indexOf(name)) { return interfaces[name].filter(function (details) { details.family = details.family.toLowerCase(); return details.family === family; })[0].address; } var all = Object.keys(interfaces).map(function (nic) { // // Note: name will only be `public` or `private` // when this is called. // var addresses = interfaces[nic].filter(function (details) { details.family = details.family.toLowerCase(); if (details.family !== family || ip.isLoopback(details.address)) { return false; } else if (!name) { return true; } return name === 'public' ? !ip.isPrivate(details.address) : ip.isPrivate(details.address) }); return addresses.length ? addresses[0].address : undefined; }).filter(Boolean); return !all.length ? ip.loopback(family) : all[0]; }; ip.toLong = function toInt(ip){ var ipl=0; ip.split('.').forEach(function( octet ) { ipl<<=8; ipl+=parseInt(octet); }); return(ipl >>>0); }; ip.fromLong = function fromInt(ipl){ return ( (ipl>>>24) +'.' + (ipl>>16 & 255) +'.' + (ipl>>8 & 255) +'.' + (ipl & 255) ); }; function _normalizeFamily(family) { return family ? family.toLowerCase() : 'ipv4'; } },{"buffer":61,"os":279}],170:[function(require,module,exports){ /** * Determine if an object is Buffer * * Author: Feross Aboukhadijeh * License: MIT * * `npm install is-buffer` */ module.exports = function (obj) { return !!(obj != null && (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor) (obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)) )) } },{}],171:[function(require,module,exports){ (function(root) { function isValidDomain(v) { if (!v) return false; var re = /^(?!:\/\/)([a-zA-Z0-9-]+\.){0,5}[a-zA-Z0-9-][a-zA-Z0-9-]+\.[a-zA-Z]{2,64}?$/gi; return re.test(v); } if (typeof exports !== 'undefined') { if (typeof module !== 'undefined' && module.exports) { exports = module.exports = isValidDomain; } exports.isValidDomain = isValidDomain; } else if (typeof define === 'function' && define.amd) { define([], function() { return isValidDomain; }); } else { root.isValidDomain = isValidDomain; } })(this); },{}],172:[function(require,module,exports){ module.exports = Array.isArray || function (arr) { return Object.prototype.toString.call(arr) == '[object Array]'; }; },{}],173:[function(require,module,exports){ var encodings = require('./lib/encodings'); module.exports = Codec; function Codec(opts){ this.opts = opts || {}; this.encodings = encodings; } Codec.prototype._encoding = function(encoding){ if (typeof encoding == 'string') encoding = encodings[encoding]; if (!encoding) encoding = encodings.id; return encoding; }; Codec.prototype._keyEncoding = function(opts, batchOpts){ return this._encoding(batchOpts && batchOpts.keyEncoding || opts && opts.keyEncoding || this.opts.keyEncoding); }; Codec.prototype._valueEncoding = function(opts, batchOpts){ return this._encoding( batchOpts && (batchOpts.valueEncoding || batchOpts.encoding) || opts && (opts.valueEncoding || opts.encoding) || (this.opts.valueEncoding || this.opts.encoding)); }; Codec.prototype.encodeKey = function(key, opts, batchOpts){ return this._keyEncoding(opts, batchOpts).encode(key); }; Codec.prototype.encodeValue = function(value, opts, batchOpts){ return this._valueEncoding(opts, batchOpts).encode(value); }; Codec.prototype.decodeKey = function(key, opts){ return this._keyEncoding(opts).decode(key); }; Codec.prototype.decodeValue = function(value, opts){ return this._valueEncoding(opts).decode(value); }; Codec.prototype.encodeBatch = function(ops, opts){ var self = this; return ops.map(function(_op){ var op = { type: _op.type, key: self.encodeKey(_op.key, opts, _op) }; if (self.keyAsBuffer(opts, _op)) op.keyEncoding = 'binary'; if (_op.prefix) op.prefix = _op.prefix; if ('value' in _op) { op.value = self.encodeValue(_op.value, opts, _op); if (self.valueAsBuffer(opts, _op)) op.valueEncoding = 'binary'; } return op; }); }; var ltgtKeys = ['lt', 'gt', 'lte', 'gte', 'start', 'end']; Codec.prototype.encodeLtgt = function(ltgt){ var self = this; var ret = {}; Object.keys(ltgt).forEach(function(key){ ret[key] = ltgtKeys.indexOf(key) > -1 ? self.encodeKey(ltgt[key], ltgt) : ltgt[key] }); return ret; }; Codec.prototype.createStreamDecoder = function(opts){ var self = this; if (opts.keys && opts.values) { return function(key, value){ return { key: self.decodeKey(key, opts), value: self.decodeValue(value, opts) }; }; } else if (opts.keys) { return function(key) { return self.decodeKey(key, opts); }; } else if (opts.values) { return function(_, value){ return self.decodeValue(value, opts); } } else { return function(){}; } }; Codec.prototype.keyAsBuffer = function(opts){ return this._keyEncoding(opts).buffer; }; Codec.prototype.valueAsBuffer = function(opts){ return this._valueEncoding(opts).buffer; }; },{"./lib/encodings":174}],174:[function(require,module,exports){ (function (Buffer){ exports.utf8 = exports['utf-8'] = { encode: function(data){ return isBinary(data) ? data : String(data); }, decode: identity, buffer: false, type: 'utf8' }; exports.json = { encode: JSON.stringify, decode: JSON.parse, buffer: false, type: 'json' }; exports.binary = { encode: function(data){ return isBinary(data) ? data : new Buffer(data); }, decode: identity, buffer: true, type: 'binary' }; exports.id = { encode: function(data){ return data; }, decode: function(data){ return data; }, buffer: false, type: 'id' }; var bufferEncodings = [ 'hex', 'ascii', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le' ]; bufferEncodings.forEach(function(type){ exports[type] = { encode: function(data){ return isBinary(data) ? data : new Buffer(data, type); }, decode: function(buffer){ return buffer.toString(type); }, buffer: true, type: type }; }); function identity(value){ return value; } function isBinary(data){ return data === undefined || data === null || Buffer.isBuffer(data); } }).call(this,require("buffer").Buffer) },{"buffer":61}],175:[function(require,module,exports){ /* Copyright (c) 2012-2015 LevelUP contributors * See list at * MIT License * */ var createError = require('errno').create , LevelUPError = createError('LevelUPError') , NotFoundError = createError('NotFoundError', LevelUPError) NotFoundError.prototype.notFound = true NotFoundError.prototype.status = 404 module.exports = { LevelUPError : LevelUPError , InitializationError : createError('InitializationError', LevelUPError) , OpenError : createError('OpenError', LevelUPError) , ReadError : createError('ReadError', LevelUPError) , WriteError : createError('WriteError', LevelUPError) , NotFoundError : NotFoundError , EncodingError : createError('EncodingError', LevelUPError) } },{"errno":143}],176:[function(require,module,exports){ var inherits = require('inherits'); var Readable = require('readable-stream').Readable; var extend = require('xtend'); var EncodingError = require('level-errors').EncodingError; module.exports = ReadStream; inherits(ReadStream, Readable); function ReadStream(iterator, options){ if (!(this instanceof ReadStream)) return new ReadStream(iterator, options); Readable.call(this, extend(options, { objectMode: true })); this._iterator = iterator; this._destroyed = false; this._decoder = null; if (options && options.decoder) this._decoder = options.decoder; this.on('end', this._cleanup.bind(this)); } ReadStream.prototype._read = function(){ var self = this; if (this._destroyed) return; this._iterator.next(function(err, key, value){ if (self._destroyed) return; if (err) return self.emit('error', err); if (key === undefined && value === undefined) { self.push(null); } else { if (!self._decoder) return self.push({ key: key, value: value }); try { var value = self._decoder(key, value); } catch (err) { self.emit('error', new EncodingError(err)); self.push(null); return; } self.push(value); } }); }; ReadStream.prototype.destroy = ReadStream.prototype._cleanup = function(){ var self = this; if (this._destroyed) return; this._destroyed = true; this._iterator.end(function(err){ if (err) return self.emit('error', err); self.emit('close'); }); }; },{"inherits":167,"level-errors":175,"readable-stream":410,"xtend":177}],177:[function(require,module,exports){ module.exports = extend var hasOwnProperty = Object.prototype.hasOwnProperty; function extend() { var target = {} for (var i = 0; i < arguments.length; i++) { var source = arguments[i] for (var key in source) { if (hasOwnProperty.call(source, key)) { target[key] = source[key] } } } return target } },{}],178:[function(require,module,exports){ var pl = require('pull-level') var pull = require('pull-stream') module.exports = function (db, update, get) { var waiting = [], ready = false pull( pl.read(db, { onSync: function () { ready = true while(waiting.length) { waiting.shift()() } }, live: true }), pull.drain(update) ) function call (opts, cb) { var value try { value = get(opts) } catch (err) { return cb(err) } cb(null, value) } return function (opts, cb) { if(!cb) cb = opts, opts = null if(ready) call(opts, cb) else waiting.push(function () { call(opts, cb) }) } } },{"pull-level":344,"pull-stream":179}],179:[function(require,module,exports){ var sources = require('./sources') var sinks = require('./sinks') var throughs = require('./throughs') var u = require('pull-core') function isFunction (fun) { return 'function' === typeof fun } function isReader (fun) { return fun && (fun.type === "Through" || fun.length === 1) } var exports = module.exports = function pull () { var args = [].slice.call(arguments) if(isReader(args[0])) return function (read) { args.unshift(read) return pull.apply(null, args) } var read = args.shift() //if the first function is a duplex stream, //pipe from the source. if(isFunction(read.source)) read = read.source function next () { var s = args.shift() if(null == s) return next() if(isFunction(s)) return s return function (read) { s.sink(read) //this supports pipeing through a duplex stream //pull(a, b, a) "telephone style". //if this stream is in the a (first & last position) //s.source will have already been used, but this should never be called //so that is okay. return s.source } } while(args.length) read = next() (read) return read } for(var k in sources) exports[k] = u.Source(sources[k]) for(var k in throughs) exports[k] = u.Through(throughs[k]) for(var k in sinks) exports[k] = u.Sink(sinks[k]) var maybe = require('./maybe')(exports) for(var k in maybe) exports[k] = maybe[k] exports.Duplex = exports.Through = exports.pipeable = u.Through exports.Source = exports.pipeableSource = u.Source exports.Sink = exports.pipeableSink = u.Sink },{"./maybe":180,"./sinks":181,"./sources":182,"./throughs":183,"pull-core":306}],180:[function(require,module,exports){ var u = require('pull-core') var prop = u.prop var id = u.id var maybeSink = u.maybeSink module.exports = function (pull) { var exports = {} var drain = pull.drain var find = exports.find = function (test, cb) { return maybeSink(function (cb) { var ended = false if(!cb) cb = test, test = id else test = prop(test) || id return drain(function (data) { if(test(data)) { ended = true cb(null, data) return false } }, function (err) { if(ended) return //already called back cb(err === true ? null : err, null) }) }, cb) } var reduce = exports.reduce = function (reduce, acc, cb) { return maybeSink(function (cb) { return drain(function (data) { acc = reduce(acc, data) }, function (err) { cb(err, acc) }) }, cb) } var collect = exports.collect = exports.writeArray = function (cb) { return reduce(function (arr, item) { arr.push(item) return arr }, [], cb) } var concat = exports.concat = function (cb) { return reduce(function (a, b) { return a + b }, '', cb) } return exports } },{"pull-core":306}],181:[function(require,module,exports){ var drain = exports.drain = function (read, op, done) { ;(function next() { var loop = true, cbed = false while(loop) { cbed = false read(null, function (end, data) { cbed = true if(end) { loop = false if(done) done(end === true ? null : end) else if(end && end !== true) throw end } else if(op && false === op(data)) { loop = false read(true, done || function () {}) } else if(!loop){ next() } }) if(!cbed) { loop = false return } } })() } var onEnd = exports.onEnd = function (read, done) { return drain(read, null, done) } var log = exports.log = function (read, done) { return drain(read, function (data) { console.log(data) }, done) } },{}],182:[function(require,module,exports){ var keys = exports.keys = function (object) { return values(Object.keys(object)) } var once = exports.once = function (value) { return function (abort, cb) { if(abort) return cb(abort) if(value != null) { var _value = value; value = null cb(null, _value) } else cb(true) } } var values = exports.values = exports.readArray = function (array) { if(!array) return function (abort, cb) { return cb(abort || true) } if(!Array.isArray(array)) array = Object.keys(array).map(function (k) { return array[k] }) var i = 0 return function (end, cb) { if(end) return cb && cb(end) cb(i >= array.length || null, array[i++]) } } var count = exports.count = function (max) { var i = 0; max = max || Infinity return function (end, cb) { if(end) return cb && cb(end) if(i > max) return cb(true) cb(null, i++) } } var infinite = exports.infinite = function (generate) { generate = generate || Math.random return function (end, cb) { if(end) return cb && cb(end) return cb(null, generate()) } } var defer = exports.defer = function () { var _read, cbs = [], _end var read = function (end, cb) { if(!_read) { _end = end cbs.push(cb) } else _read(end, cb) } read.resolve = function (read) { if(_read) throw new Error('already resolved') _read = read if(!_read) throw new Error('no read cannot resolve!' + _read) while(cbs.length) _read(_end, cbs.shift()) } read.abort = function(err) { read.resolve(function (_, cb) { cb(err || true) }) } return read } var empty = exports.empty = function () { return function (abort, cb) { cb(true) } } var error = exports.error = function (err) { return function (abort, cb) { cb(err) } } var depthFirst = exports.depthFirst = function (start, createStream) { var reads = [] reads.unshift(once(start)) return function next (end, cb) { if(!reads.length) return cb(true) reads[0](end, function (end, data) { if(end) { //if this stream has ended, go to the next queue reads.shift() return next(null, cb) } reads.unshift(createStream(data)) cb(end, data) }) } } //width first is just like depth first, //but push each new stream onto the end of the queue var widthFirst = exports.widthFirst = function (start, createStream) { var reads = [] reads.push(once(start)) return function next (end, cb) { if(!reads.length) return cb(true) reads[0](end, function (end, data) { if(end) { reads.shift() return next(null, cb) } reads.push(createStream(data)) cb(end, data) }) } } //this came out different to the first (strm) //attempt at leafFirst, but it's still a valid //topological sort. var leafFirst = exports.leafFirst = function (start, createStream) { var reads = [] var output = [] reads.push(once(start)) return function next (end, cb) { reads[0](end, function (end, data) { if(end) { reads.shift() if(!output.length) return cb(true) return cb(null, output.shift()) } reads.unshift(createStream(data)) output.unshift(data) next(null, cb) }) } } },{}],183:[function(require,module,exports){ (function (process){ var u = require('pull-core') var sources = require('./sources') var sinks = require('./sinks') var prop = u.prop var id = u.id var tester = u.tester var map = exports.map = function (read, map) { map = prop(map) || id return function (abort, cb) { read(abort, function (end, data) { try { data = !end ? map(data) : null } catch (err) { return read(err, function () { return cb(err) }) } cb(end, data) }) } } var asyncMap = exports.asyncMap = function (read, map) { if(!map) return read return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } var paraMap = exports.paraMap = function (read, map, width) { if(!map) return read var ended = false, queue = [], _cb function drain () { if(!_cb) return var cb = _cb _cb = null if(queue.length) return cb(null, queue.shift()) else if(ended && !n) return cb(ended) _cb = cb } function pull () { read(null, function (end, data) { if(end) { ended = end return drain() } n++ map(data, function (err, data) { n-- queue.push(data) drain() }) if(n < width && !ended) pull() }) } var n = 0 return function (end, cb) { if(end) return read(end, cb) //abort //continue to read while there are less than 3 maps in flight _cb = cb if(queue.length || ended) pull(), drain() else pull() } return highWaterMark(asyncMap(read, map), width) } var filter = exports.filter = function (read, test) { //regexp test = tester(test) return function next (end, cb) { var sync, loop = true while(loop) { loop = false sync = true read(end, function (end, data) { if(!end && !test(data)) return sync ? loop = true : next(end, cb) cb(end, data) }) sync = false } } } var filterNot = exports.filterNot = function (read, test) { test = tester(test) return filter(read, function (e) { return !test(e) }) } var through = exports.through = function (read, op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } var take = exports.take = function (read, test) { var ended = false if('number' === typeof test) { var n = test; test = function () { return n -- } } return function (end, cb) { if(ended) return cb(ended) if(ended = end) return read(ended, cb) read(null, function (end, data) { if(ended = ended || end) return cb(ended) if(!test(data)) { ended = true read(true, function (end, data) { cb(ended, data) }) } else cb(null, data) }) } } var unique = exports.unique = function (read, field, invert) { field = prop(field) || id var seen = {} return filter(read, function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } var nonUnique = exports.nonUnique = function (read, field) { return unique(read, field, true) } var group = exports.group = function (read, size) { var ended; size = size || 5 var queue = [] return function (end, cb) { //this means that the upstream is sending an error. if(end) return read(ended = end, cb) //this means that we read an end before. if(ended) return cb(ended) read(null, function next(end, data) { if(ended = ended || end) { if(!queue.length) return cb(ended) var _queue = queue; queue = [] return cb(null, _queue) } queue.push(data) if(queue.length < size) return read(null, next) var _queue = queue; queue = [] cb(null, _queue) }) } } var flatten = exports.flatten = function (read) { var _read return function (abort, cb) { if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (end, data) { if(end) nextStream() else cb(null, data) }) } function nextStream () { read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream) || stream && 'object' === typeof stream) stream = sources.values(stream) else if('function' != typeof stream) throw new Error('expected stream of streams') _read = stream nextChunk() }) } } } var prepend = exports.prepend = function (read, head) { return function (abort, cb) { if(head !== null) { if(abort) return read(abort, cb) var _head = head head = null cb(null, _head) } else { read(abort, cb) } } } //var drainIf = exports.drainIf = function (op, done) { // sinks.drain( //} var _reduce = exports._reduce = function (read, reduce, initial) { return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) sinks.drain(function (item) { initial = reduce(initial, item) }, function (err, data) { ended = err || true if(!err) cb(null, initial) else cb(ended) }) (read) } } var nextTick = process.nextTick var highWaterMark = exports.highWaterMark = function (read, highWaterMark) { var buffer = [], waiting = [], ended, ending, reading = false highWaterMark = highWaterMark || 10 function readAhead () { while(waiting.length && (buffer.length || ended)) waiting.shift()(ended, ended ? null : buffer.shift()) if (!buffer.length && ending) ended = ending; } function next () { if(ended || ending || reading || buffer.length >= highWaterMark) return reading = true return read(ended || ending, function (end, data) { reading = false ending = ending || end if(data != null) buffer.push(data) next(); readAhead() }) } process.nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } var flatMap = exports.flatMap = function (read, mapper) { mapper = mapper || id var queue = [], ended return function (abort, cb) { if(queue.length) return cb(null, queue.shift()) else if(ended) return cb(ended) read(abort, function next (end, data) { if(end) ended = end else { var add = mapper(data) while(add && add.length) queue.push(add.shift()) } if(queue.length) cb(null, queue.shift()) else if(ended) cb(ended) else read(null, next) }) } } }).call(this,require('_process')) },{"./sinks":181,"./sources":182,"_process":295,"pull-core":306}],184:[function(require,module,exports){ const levelup = require('levelup') function packager (leveldown) { function Level (location, options, callback) { if (typeof options === 'function') callback = options if (!(typeof options === 'object' && options !== null)) options = {} options.db = leveldown return levelup(location, options, callback) } [ 'destroy', 'repair' ].forEach(function (m) { if (typeof leveldown[m] === 'function') { Level[m] = function (location, callback) { leveldown[m](location, callback || function () {}) } } }) return Level } module.exports = packager },{"levelup":193}],185:[function(require,module,exports){ (function (process){ /* Copyright (c) 2013 Rod Vagg, MIT License */ function AbstractChainedBatch (db) { this._db = db this._operations = [] this._written = false } AbstractChainedBatch.prototype._checkWritten = function () { if (this._written) throw new Error('write() already called on this batch') } AbstractChainedBatch.prototype.put = function (key, value) { this._checkWritten() var err = this._db._checkKey(key, 'key', this._db._isBuffer) if (err) throw err if (!this._db._isBuffer(key)) key = String(key) if (!this._db._isBuffer(value)) value = String(value) if (typeof this._put == 'function' ) this._put(key, value) else this._operations.push({ type: 'put', key: key, value: value }) return this } AbstractChainedBatch.prototype.del = function (key) { this._checkWritten() var err = this._db._checkKey(key, 'key', this._db._isBuffer) if (err) throw err if (!this._db._isBuffer(key)) key = String(key) if (typeof this._del == 'function' ) this._del(key) else this._operations.push({ type: 'del', key: key }) return this } AbstractChainedBatch.prototype.clear = function () { this._checkWritten() this._operations = [] if (typeof this._clear == 'function' ) this._clear() return this } AbstractChainedBatch.prototype.write = function (options, callback) { this._checkWritten() if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('write() requires a callback argument') if (typeof options != 'object') options = {} this._written = true if (typeof this._write == 'function' ) return this._write(callback) if (typeof this._db._batch == 'function') return this._db._batch(this._operations, options, callback) process.nextTick(callback) } module.exports = AbstractChainedBatch }).call(this,require('_process')) },{"_process":295}],186:[function(require,module,exports){ (function (process){ /* Copyright (c) 2013 Rod Vagg, MIT License */ function AbstractIterator (db) { this.db = db this._ended = false this._nexting = false } AbstractIterator.prototype.next = function (callback) { var self = this if (typeof callback != 'function') throw new Error('next() requires a callback argument') if (self._ended) return callback(new Error('cannot call next() after end()')) if (self._nexting) return callback(new Error('cannot call next() before previous next() has completed')) self._nexting = true if (typeof self._next == 'function') { return self._next(function () { self._nexting = false callback.apply(null, arguments) }) } process.nextTick(function () { self._nexting = false callback() }) } AbstractIterator.prototype.end = function (callback) { if (typeof callback != 'function') throw new Error('end() requires a callback argument') if (this._ended) return callback(new Error('end() already called on iterator')) this._ended = true if (typeof this._end == 'function') return this._end(callback) process.nextTick(callback) } module.exports = AbstractIterator }).call(this,require('_process')) },{"_process":295}],187:[function(require,module,exports){ (function (Buffer,process){ /* Copyright (c) 2013 Rod Vagg, MIT License */ var xtend = require('xtend') , AbstractIterator = require('./abstract-iterator') , AbstractChainedBatch = require('./abstract-chained-batch') function AbstractLevelDOWN (location) { if (!arguments.length || location === undefined) throw new Error('constructor requires at least a location argument') if (typeof location != 'string') throw new Error('constructor requires a location string argument') this.location = location this.status = 'new' } AbstractLevelDOWN.prototype.open = function (options, callback) { var self = this , oldStatus = this.status if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('open() requires a callback argument') if (typeof options != 'object') options = {} options.createIfMissing = options.createIfMissing != false options.errorIfExists = !!options.errorIfExists if (typeof this._open == 'function') { this.status = 'opening' this._open(options, function (err) { if (err) { self.status = oldStatus return callback(err) } self.status = 'open' callback() }) } else { this.status = 'open' process.nextTick(callback) } } AbstractLevelDOWN.prototype.close = function (callback) { var self = this , oldStatus = this.status if (typeof callback != 'function') throw new Error('close() requires a callback argument') if (typeof this._close == 'function') { this.status = 'closing' this._close(function (err) { if (err) { self.status = oldStatus return callback(err) } self.status = 'closed' callback() }) } else { this.status = 'closed' process.nextTick(callback) } } AbstractLevelDOWN.prototype.get = function (key, options, callback) { var err if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('get() requires a callback argument') if (err = this._checkKey(key, 'key', this._isBuffer)) return callback(err) if (!this._isBuffer(key)) key = String(key) if (typeof options != 'object') options = {} options.asBuffer = options.asBuffer != false if (typeof this._get == 'function') return this._get(key, options, callback) process.nextTick(function () { callback(new Error('NotFound')) }) } AbstractLevelDOWN.prototype.put = function (key, value, options, callback) { var err if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('put() requires a callback argument') if (err = this._checkKey(key, 'key', this._isBuffer)) return callback(err) if (!this._isBuffer(key)) key = String(key) // coerce value to string in node, don't touch it in browser // (indexeddb can store any JS type) if (value != null && !this._isBuffer(value) && !process.browser) value = String(value) if (typeof options != 'object') options = {} if (typeof this._put == 'function') return this._put(key, value, options, callback) process.nextTick(callback) } AbstractLevelDOWN.prototype.del = function (key, options, callback) { var err if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('del() requires a callback argument') if (err = this._checkKey(key, 'key', this._isBuffer)) return callback(err) if (!this._isBuffer(key)) key = String(key) if (typeof options != 'object') options = {} if (typeof this._del == 'function') return this._del(key, options, callback) process.nextTick(callback) } AbstractLevelDOWN.prototype.batch = function (array, options, callback) { if (!arguments.length) return this._chainedBatch() if (typeof options == 'function') callback = options if (typeof array == 'function') callback = array if (typeof callback != 'function') throw new Error('batch(array) requires a callback argument') if (!Array.isArray(array)) return callback(new Error('batch(array) requires an array argument')) if (!options || typeof options != 'object') options = {} var i = 0 , l = array.length , e , err for (; i < l; i++) { e = array[i] if (typeof e != 'object') continue if (err = this._checkKey(e.type, 'type', this._isBuffer)) return callback(err) if (err = this._checkKey(e.key, 'key', this._isBuffer)) return callback(err) } if (typeof this._batch == 'function') return this._batch(array, options, callback) process.nextTick(callback) } //TODO: remove from here, not a necessary primitive AbstractLevelDOWN.prototype.approximateSize = function (start, end, callback) { if ( start == null || end == null || typeof start == 'function' || typeof end == 'function') { throw new Error('approximateSize() requires valid `start`, `end` and `callback` arguments') } if (typeof callback != 'function') throw new Error('approximateSize() requires a callback argument') if (!this._isBuffer(start)) start = String(start) if (!this._isBuffer(end)) end = String(end) if (typeof this._approximateSize == 'function') return this._approximateSize(start, end, callback) process.nextTick(function () { callback(null, 0) }) } AbstractLevelDOWN.prototype._setupIteratorOptions = function (options) { var self = this options = xtend(options) ;[ 'start', 'end', 'gt', 'gte', 'lt', 'lte' ].forEach(function (o) { if (options[o] && self._isBuffer(options[o]) && options[o].length === 0) delete options[o] }) options.reverse = !!options.reverse options.keys = options.keys != false options.values = options.values != false options.limit = 'limit' in options ? options.limit : -1 options.keyAsBuffer = options.keyAsBuffer != false options.valueAsBuffer = options.valueAsBuffer != false return options } AbstractLevelDOWN.prototype.iterator = function (options) { if (typeof options != 'object') options = {} options = this._setupIteratorOptions(options) if (typeof this._iterator == 'function') return this._iterator(options) return new AbstractIterator(this) } AbstractLevelDOWN.prototype._chainedBatch = function () { return new AbstractChainedBatch(this) } AbstractLevelDOWN.prototype._isBuffer = function (obj) { return Buffer.isBuffer(obj) } AbstractLevelDOWN.prototype._checkKey = function (obj, type) { if (obj === null || obj === undefined) return new Error(type + ' cannot be `null` or `undefined`') if (this._isBuffer(obj)) { if (obj.length === 0) return new Error(type + ' cannot be an empty Buffer') } else if (String(obj) === '') return new Error(type + ' cannot be an empty String') } module.exports = AbstractLevelDOWN }).call(this,{"isBuffer":require("../../../is-buffer/index.js")},require('_process')) },{"../../../is-buffer/index.js":170,"./abstract-chained-batch":185,"./abstract-iterator":186,"_process":295,"xtend":197}],188:[function(require,module,exports){ exports.AbstractLevelDOWN = require('./abstract-leveldown') exports.AbstractIterator = require('./abstract-iterator') exports.AbstractChainedBatch = require('./abstract-chained-batch') exports.isLevelDOWN = require('./is-leveldown') },{"./abstract-chained-batch":185,"./abstract-iterator":186,"./abstract-leveldown":187,"./is-leveldown":189}],189:[function(require,module,exports){ var AbstractLevelDOWN = require('./abstract-leveldown') function isLevelDOWN (db) { if (!db || typeof db !== 'object') return false return Object.keys(AbstractLevelDOWN.prototype).filter(function (name) { // TODO remove approximateSize check when method is gone return name[0] != '_' && name != 'approximateSize' }).every(function (name) { return typeof db[name] == 'function' }) } module.exports = isLevelDOWN },{"./abstract-leveldown":187}],190:[function(require,module,exports){ var util = require('util') , AbstractIterator = require('abstract-leveldown').AbstractIterator function DeferredIterator (options) { AbstractIterator.call(this, options) this._options = options this._iterator = null this._operations = [] } util.inherits(DeferredIterator, AbstractIterator) DeferredIterator.prototype.setDb = function (db) { var it = this._iterator = db.iterator(this._options) this._operations.forEach(function (op) { it[op.method].apply(it, op.args) }) } DeferredIterator.prototype._operation = function (method, args) { if (this._iterator) return this._iterator[method].apply(this._iterator, args) this._operations.push({ method: method, args: args }) } 'next end'.split(' ').forEach(function (m) { DeferredIterator.prototype['_' + m] = function () { this._operation(m, arguments) } }) module.exports = DeferredIterator; },{"abstract-leveldown":188,"util":636}],191:[function(require,module,exports){ (function (Buffer,process){ var util = require('util') , AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN , DeferredIterator = require('./deferred-iterator') function DeferredLevelDOWN (location) { AbstractLevelDOWN.call(this, typeof location == 'string' ? location : '') // optional location, who cares? this._db = undefined this._operations = [] this._iterators = [] } util.inherits(DeferredLevelDOWN, AbstractLevelDOWN) // called by LevelUP when we have a real DB to take its place DeferredLevelDOWN.prototype.setDb = function (db) { this._db = db this._operations.forEach(function (op) { db[op.method].apply(db, op.args) }) this._iterators.forEach(function (it) { it.setDb(db) }) } DeferredLevelDOWN.prototype._open = function (options, callback) { return process.nextTick(callback) } // queue a new deferred operation DeferredLevelDOWN.prototype._operation = function (method, args) { if (this._db) return this._db[method].apply(this._db, args) this._operations.push({ method: method, args: args }) } // deferrables 'put get del batch approximateSize'.split(' ').forEach(function (m) { DeferredLevelDOWN.prototype['_' + m] = function () { this._operation(m, arguments) } }) DeferredLevelDOWN.prototype._isBuffer = function (obj) { return Buffer.isBuffer(obj) } DeferredLevelDOWN.prototype._iterator = function (options) { if (this._db) return this._db.iterator.apply(this._db, arguments) var it = new DeferredIterator(options) this._iterators.push(it) return it } module.exports = DeferredLevelDOWN module.exports.DeferredIterator = DeferredIterator }).call(this,{"isBuffer":require("../../../is-buffer/index.js")},require('_process')) },{"../../../is-buffer/index.js":170,"./deferred-iterator":190,"_process":295,"abstract-leveldown":188,"util":636}],192:[function(require,module,exports){ /* Copyright (c) 2012-2015 LevelUP contributors * See list at * MIT License * */ var util = require('./util') , WriteError = require('level-errors').WriteError , getOptions = util.getOptions , dispatchError = util.dispatchError function Batch (levelup, codec) { this._levelup = levelup this._codec = codec this.batch = levelup.db.batch() this.ops = [] this.length = 0 } Batch.prototype.put = function (key_, value_, options) { options = getOptions(options) var key = this._codec.encodeKey(key_, options) , value = this._codec.encodeValue(value_, options) try { this.batch.put(key, value) } catch (e) { throw new WriteError(e) } this.ops.push({ type : 'put', key : key, value : value }) this.length++ return this } Batch.prototype.del = function (key_, options) { options = getOptions(options) var key = this._codec.encodeKey(key_, options) try { this.batch.del(key) } catch (err) { throw new WriteError(err) } this.ops.push({ type : 'del', key : key }) this.length++ return this } Batch.prototype.clear = function () { try { this.batch.clear() } catch (err) { throw new WriteError(err) } this.ops = [] this.length = 0 return this } Batch.prototype.write = function (callback) { var levelup = this._levelup , ops = this.ops try { this.batch.write(function (err) { if (err) return dispatchError(levelup, new WriteError(err), callback) levelup.emit('batch', ops) if (callback) callback() }) } catch (err) { throw new WriteError(err) } } module.exports = Batch },{"./util":194,"level-errors":175}],193:[function(require,module,exports){ (function (process){ /* Copyright (c) 2012-2015 LevelUP contributors * See list at * MIT License * */ var EventEmitter = require('events').EventEmitter , inherits = require('util').inherits , deprecate = require('util').deprecate , extend = require('xtend') , prr = require('prr') , DeferredLevelDOWN = require('deferred-leveldown') , IteratorStream = require('level-iterator-stream') , errors = require('level-errors') , WriteError = errors.WriteError , ReadError = errors.ReadError , NotFoundError = errors.NotFoundError , OpenError = errors.OpenError , EncodingError = errors.EncodingError , InitializationError = errors.InitializationError , util = require('./util') , Batch = require('./batch') , Codec = require('level-codec') , getOptions = util.getOptions , defaultOptions = util.defaultOptions , getLevelDOWN = util.getLevelDOWN , dispatchError = util.dispatchError , isDefined = util.isDefined function getCallback (options, callback) { return typeof options == 'function' ? options : callback } // Possible LevelUP#_status values: // - 'new' - newly created, not opened or closed // - 'opening' - waiting for the database to be opened, post open() // - 'open' - successfully opened the database, available for use // - 'closing' - waiting for the database to be closed, post close() // - 'closed' - database has been successfully closed, should not be // used except for another open() operation function LevelUP (location, options, callback) { if (!(this instanceof LevelUP)) return new LevelUP(location, options, callback) var error EventEmitter.call(this) this.setMaxListeners(Infinity) if (typeof location == 'function') { options = typeof options == 'object' ? options : {} options.db = location location = null } else if (typeof location == 'object' && typeof location.db == 'function') { options = location location = null } if (typeof options == 'function') { callback = options options = {} } if ((!options || typeof options.db != 'function') && typeof location != 'string') { error = new InitializationError( 'Must provide a location for the database') if (callback) { return process.nextTick(function () { callback(error) }) } throw error } options = getOptions(options) this.options = extend(defaultOptions, options) this._codec = new Codec(this.options) this._status = 'new' // set this.location as enumerable but not configurable or writable prr(this, 'location', location, 'e') this.open(callback) } inherits(LevelUP, EventEmitter) LevelUP.prototype.open = function (callback) { var self = this , dbFactory , db if (this.isOpen()) { if (callback) process.nextTick(function () { callback(null, self) }) return this } if (this._isOpening()) { return callback && this.once( 'open' , function () { callback(null, self) } ) } this.emit('opening') this._status = 'opening' this.db = new DeferredLevelDOWN(this.location) dbFactory = this.options.db || getLevelDOWN() db = dbFactory(this.location) db.open(this.options, function (err) { if (err) { return dispatchError(self, new OpenError(err), callback) } else { self.db.setDb(db) self.db = db self._status = 'open' if (callback) callback(null, self) self.emit('open') self.emit('ready') } }) } LevelUP.prototype.close = function (callback) { var self = this if (this.isOpen()) { this._status = 'closing' this.db.close(function () { self._status = 'closed' self.emit('closed') if (callback) callback.apply(null, arguments) }) this.emit('closing') this.db = new DeferredLevelDOWN(this.location) } else if (this._status == 'closed' && callback) { return process.nextTick(callback) } else if (this._status == 'closing' && callback) { this.once('closed', callback) } else if (this._isOpening()) { this.once('open', function () { self.close(callback) }) } } LevelUP.prototype.isOpen = function () { return this._status == 'open' } LevelUP.prototype._isOpening = function () { return this._status == 'opening' } LevelUP.prototype.isClosed = function () { return (/^clos/).test(this._status) } function maybeError(db, options, callback) { if (!db._isOpening() && !db.isOpen()) { dispatchError( db , new ReadError('Database is not open') , callback ) return true } } function writeError (db, message, callback) { dispatchError( db , new WriteError(message) , callback ) } function readError (db, message, callback) { dispatchError( db , new ReadError(message) , callback ) } LevelUP.prototype.get = function (key_, options, callback) { var self = this , key callback = getCallback(options, callback) if (maybeError(this, options, callback)) return if (key_ === null || key_ === undefined || 'function' !== typeof callback) return readError(this , 'get() requires key and callback arguments', callback) options = util.getOptions(options) key = this._codec.encodeKey(key_, options) options.asBuffer = this._codec.valueAsBuffer(options) this.db.get(key, options, function (err, value) { if (err) { if ((/notfound/i).test(err) || err.notFound) { err = new NotFoundError( 'Key not found in database [' + key_ + ']', err) } else { err = new ReadError(err) } return dispatchError(self, err, callback) } if (callback) { try { value = self._codec.decodeValue(value, options) } catch (e) { return callback(new EncodingError(e)) } callback(null, value) } }) } LevelUP.prototype.put = function (key_, value_, options, callback) { var self = this , key , value callback = getCallback(options, callback) if (key_ === null || key_ === undefined) return writeError(this, 'put() requires a key argument', callback) if (maybeError(this, options, callback)) return options = getOptions(options) key = this._codec.encodeKey(key_, options) value = this._codec.encodeValue(value_, options) this.db.put(key, value, options, function (err) { if (err) { return dispatchError(self, new WriteError(err), callback) } else { self.emit('put', key_, value_) if (callback) callback() } }) } LevelUP.prototype.del = function (key_, options, callback) { var self = this , key callback = getCallback(options, callback) if (key_ === null || key_ === undefined) return writeError(this, 'del() requires a key argument', callback) if (maybeError(this, options, callback)) return options = getOptions(options) key = this._codec.encodeKey(key_, options) this.db.del(key, options, function (err) { if (err) { return dispatchError(self, new WriteError(err), callback) } else { self.emit('del', key_) if (callback) callback() } }) } LevelUP.prototype.batch = function (arr_, options, callback) { var self = this , keyEnc , valueEnc , arr if (!arguments.length) return new Batch(this, this._codec) callback = getCallback(options, callback) if (!Array.isArray(arr_)) return writeError(this, 'batch() requires an array argument', callback) if (maybeError(this, options, callback)) return options = getOptions(options) arr = self._codec.encodeBatch(arr_, options) arr = arr.map(function (op) { if (!op.type && op.key !== undefined && op.value !== undefined) op.type = 'put' return op }) this.db.batch(arr, options, function (err) { if (err) { return dispatchError(self, new WriteError(err), callback) } else { self.emit('batch', arr_) if (callback) callback() } }) } LevelUP.prototype.approximateSize = deprecate(function (start_, end_, options, callback) { var self = this , start , end callback = getCallback(options, callback) options = getOptions(options) if (start_ === null || start_ === undefined || end_ === null || end_ === undefined || 'function' !== typeof callback) return readError(this, 'approximateSize() requires start, end and callback arguments', callback) start = this._codec.encodeKey(start_, options) end = this._codec.encodeKey(end_, options) this.db.approximateSize(start, end, function (err, size) { if (err) { return dispatchError(self, new OpenError(err), callback) } else if (callback) { callback(null, size) } }) }, 'db.approximateSize() is deprecated. Use db.db.approximateSize() instead') LevelUP.prototype.readStream = LevelUP.prototype.createReadStream = function (options) { options = extend( {keys: true, values: true}, this.options, options) options.keyEncoding = options.keyEncoding options.valueEncoding = options.valueEncoding options = this._codec.encodeLtgt(options); options.keyAsBuffer = this._codec.keyAsBuffer(options) options.valueAsBuffer = this._codec.valueAsBuffer(options) if ('number' !== typeof options.limit) options.limit = -1 return new IteratorStream(this.db.iterator(options), extend(options, { decoder: this._codec.createStreamDecoder(options) })) } LevelUP.prototype.keyStream = LevelUP.prototype.createKeyStream = function (options) { return this.createReadStream(extend(options, { keys: true, values: false })) } LevelUP.prototype.valueStream = LevelUP.prototype.createValueStream = function (options) { return this.createReadStream(extend(options, { keys: false, values: true })) } LevelUP.prototype.toString = function () { return 'LevelUP' } function utilStatic (name) { return function (location, callback) { getLevelDOWN()[name](location, callback || function () {}) } } module.exports = LevelUP module.exports.errors = require('level-errors') module.exports.destroy = deprecate( utilStatic('destroy') , 'levelup.destroy() is deprecated. Use leveldown.destroy() instead' ) module.exports.repair = deprecate( utilStatic('repair') , 'levelup.repair() is deprecated. Use leveldown.repair() instead' ) }).call(this,require('_process')) },{"./batch":192,"./util":194,"_process":295,"deferred-leveldown":191,"events":144,"level-codec":173,"level-errors":175,"level-iterator-stream":176,"prr":196,"util":636,"xtend":197}],194:[function(require,module,exports){ /* Copyright (c) 2012-2015 LevelUP contributors * See list at * MIT License * */ var extend = require('xtend') , LevelUPError = require('level-errors').LevelUPError , format = require('util').format , defaultOptions = { createIfMissing : true , errorIfExists : false , keyEncoding : 'utf8' , valueEncoding : 'utf8' , compression : true } , leveldown function getOptions (options) { if (typeof options == 'string') options = { valueEncoding: options } if (typeof options != 'object') options = {} return options } function getLevelDOWN () { if (leveldown) return leveldown var requiredVersion = require('../package.json').devDependencies.leveldown , leveldownVersion try { leveldownVersion = require('leveldown/package').version } catch (e) { throw requireError(e) } if (!require('semver').satisfies(leveldownVersion, requiredVersion)) { throw new LevelUPError( 'Installed version of LevelDOWN (' + leveldownVersion + ') does not match required version (' + requiredVersion + ')' ) } try { return leveldown = require('leveldown') } catch (e) { throw requireError(e) } } function requireError (e) { var template = 'Failed to require LevelDOWN (%s). Try `npm install leveldown` if it\'s missing' return new LevelUPError(format(template, e.message)) } function dispatchError (db, error, callback) { typeof callback == 'function' ? callback(error) : db.emit('error', error) } function isDefined (v) { return typeof v !== 'undefined' } module.exports = { defaultOptions : defaultOptions , getOptions : getOptions , getLevelDOWN : getLevelDOWN , dispatchError : dispatchError , isDefined : isDefined } },{"../package.json":195,"level-errors":175,"leveldown":33,"leveldown/package":33,"semver":33,"util":636,"xtend":197}],195:[function(require,module,exports){ module.exports={ "_args": [ [ "levelup@~1.3.0", "/Users/joran/Documents/development/patchdeck/node_modules/level-packager" ] ], "_from": "levelup@>=1.3.0 <1.4.0", "_id": "levelup@1.3.1", "_inCache": true, "_installable": true, "_location": "/level-packager/levelup", "_nodeVersion": "4.2.2", "_npmUser": { "email": "ralphtheninja@riseup.net", "name": "ralphtheninja" }, "_npmVersion": "3.5.0", "_phantomChildren": {}, "_requested": { "name": "levelup", "raw": "levelup@~1.3.0", "rawSpec": "~1.3.0", "scope": null, "spec": ">=1.3.0 <1.4.0", "type": "range" }, "_requiredBy": [ "/level-packager" ], "_resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.1.tgz", "_shasum": "8030758bb1b1dafdb71bfb55fff0caa2740cb846", "_shrinkwrap": null, "_spec": "levelup@~1.3.0", "_where": "/Users/joran/Documents/development/patchdeck/node_modules/level-packager", "browser": { "leveldown": false, "leveldown/package": false, "semver": false }, "bugs": { "url": "https://github.com/level/levelup/issues" }, "contributors": [ { "name": "Julian Gruber", "email": "julian@juliangruber.com", "url": "https://github.com/juliangruber" }, { "name": "Rod Vagg", "email": "r@va.gg", "url": "https://github.com/rvagg" }, { "name": "Jake Verbaten", "email": "raynos2@gmail.com", "url": "https://github.com/raynos" }, { "name": "Dominic Tarr", "email": "dominic.tarr@gmail.com", "url": "https://github.com/dominictarr" }, { "name": "Max Ogden", "email": "max@maxogden.com", "url": "https://github.com/maxogden" }, { "name": "Lars-Magnus Skog", "email": "ralphtheninja@riseup.net", "url": "https://github.com/ralphtheninja" }, { "name": "David Björklund", "email": "david.bjorklund@gmail.com", "url": "https://github.com/kesla" }, { "name": "John Chesley", "email": "john@chesl.es", "url": "https://github.com/chesles/" }, { "name": "Paolo Fragomeni", "email": "paolo@async.ly", "url": "https://github.com/hij1nx" }, { "name": "Anton Whalley", "email": "anton.whalley@nearform.com", "url": "https://github.com/No9" }, { "name": "Matteo Collina", "email": "matteo.collina@gmail.com", "url": "https://github.com/mcollina" }, { "name": "Pedro Teixeira", "email": "pedro.teixeira@gmail.com", "url": "https://github.com/pgte" }, { "name": "James Halliday", "email": "mail@substack.net", "url": "https://github.com/substack" }, { "name": "Jarrett Cruger", "email": "jcrugzz@gmail.com", "url": "https://github.com/jcrugzz" } ], "dependencies": { "deferred-leveldown": "~1.2.1", "level-codec": "~6.1.0", "level-errors": "~1.0.3", "level-iterator-stream": "~1.3.0", "prr": "~1.0.1", "semver": "~5.1.0", "xtend": "~4.0.0" }, "description": "Fast & simple storage - a Node.js-style LevelDB wrapper", "devDependencies": { "async": "~1.5.0", "bustermove": "~1.0.0", "delayed": "~1.0.1", "faucet": "~0.0.1", "leveldown": "^1.1.0", "memdown": "~1.1.0", "msgpack-js": "~0.3.0", "referee": "~1.2.0", "rimraf": "~2.4.3", "slow-stream": "0.0.4", "tap": "~2.3.1", "tape": "~4.2.1" }, "directories": {}, "dist": { "shasum": "8030758bb1b1dafdb71bfb55fff0caa2740cb846", "tarball": "https://registry.npmjs.org/levelup/-/levelup-1.3.1.tgz" }, "gitHead": "40bd66872974140c79a74d9411b992ddffa926a4", "homepage": "https://github.com/level/levelup", "keywords": [ "database", "db", "json", "leveldb", "storage", "store", "stream" ], "license": "MIT", "main": "lib/levelup.js", "maintainers": [ { "name": "rvagg", "email": "rod@vagg.org" }, { "name": "ralphtheninja", "email": "ralphtheninja@riseup.net" }, { "name": "juliangruber", "email": "julian@juliangruber.com" } ], "name": "levelup", "optionalDependencies": {}, "readme": "ERROR: No README data found!", "repository": { "type": "git", "url": "git+https://github.com/level/levelup.git" }, "scripts": { "test": "tape test/*-test.js | faucet" }, "version": "1.3.1" } },{}],196:[function(require,module,exports){ /*! * prr * (c) 2013 Rod Vagg * https://github.com/rvagg/prr * License: MIT */ (function (name, context, definition) { if (typeof module != 'undefined' && module.exports) module.exports = definition() else context[name] = definition() })('prr', this, function() { var setProperty = typeof Object.defineProperty == 'function' ? function (obj, key, options) { Object.defineProperty(obj, key, options) return obj } : function (obj, key, options) { // < es5 obj[key] = options.value return obj } , makeOptions = function (value, options) { var oo = typeof options == 'object' , os = !oo && typeof options == 'string' , op = function (p) { return oo ? !!options[p] : os ? options.indexOf(p[0]) > -1 : false } return { enumerable : op('enumerable') , configurable : op('configurable') , writable : op('writable') , value : value } } , prr = function (obj, key, value, options) { var k options = makeOptions(value, options) if (typeof key == 'object') { for (k in key) { if (Object.hasOwnProperty.call(key, k)) { options.value = key[k] setProperty(obj, k, options) } } return obj } return setProperty(obj, key, options) } return prr }) },{}],197:[function(require,module,exports){ arguments[4][177][0].apply(exports,arguments) },{"dup":177}],198:[function(require,module,exports){ (function (Buffer){ var sr = require('string-range') var defined = require('defined') var beq = require('buffer-equal') function eq (a, b) { if (Buffer.isBuffer(a) && Buffer.isBuffer(b)) { return beq(a, b) } else return a === b } module.exports = function post (db, opts, each) { if(!each) each = opts, opts = {} if('function' === typeof db.post) return db.post(opts, each) var encode = (opts && opts.keyEncoding && opts.keyEncoding.encode) || (db.options && db.options.keyEncoding && db.options.keyEncoding.encode) || function (x) { return x } var min = defined(opts.min, opts.gt, opts.gte, opts.start) var max = defined(opts.max, opts.lt, opts.lte, opts.end) var copts = {} if (min !== undefined) copts.min = encode(min) if (max !== undefined) copts.max = encode(max) var checker = sr.checker(copts) function cmp (key) { var ek = encode(key) if (opts.gt && eq(ek, copts.min)) return false if (opts.lt && eq(ek, copts.max)) return false return checker(ek) } function onPut (key, val) { if(cmp(key)) each({type: 'put', key: key, value: val}) } function onDel (key, val) { if(cmp(key)) each({type: 'del', key: key, value: val}) } function onBatch (ary) { ary.forEach(function (op) { if(cmp(op.key)) each(op) }) } db.on('put', onPut) db.on('del', onDel) db.on('batch', onBatch) return function () { db.removeListener('put', onPut) db.removeListener('del', onPut) db.removeListener('batch', onPut) } } }).call(this,{"isBuffer":require("../is-buffer/index.js")}) },{"../is-buffer/index.js":170,"buffer-equal":59,"defined":112,"string-range":615}],199:[function(require,module,exports){ module.exports = require('level-packager')(require('leveldown')) },{"level-packager":184,"leveldown":202}],200:[function(require,module,exports){ const util = require('util') , AbstractChainedBatch = require('abstract-leveldown').AbstractChainedBatch function ChainedBatch (db) { AbstractChainedBatch.call(this, db) this.binding = db.binding.batch() } ChainedBatch.prototype._put = function (key, value) { this.binding.put(key, value) } ChainedBatch.prototype._del = function (key) { this.binding.del(key) } ChainedBatch.prototype._clear = function (key) { this.binding.clear(key) } ChainedBatch.prototype._write = function (options, callback) { this.binding.write(options, callback) } util.inherits(ChainedBatch, AbstractChainedBatch) module.exports = ChainedBatch },{"abstract-leveldown":206,"util":636}],201:[function(require,module,exports){ const util = require('util') , AbstractIterator = require('abstract-leveldown').AbstractIterator , fastFuture = require('fast-future') function Iterator (db, options) { AbstractIterator.call(this, db) this.binding = db.binding.iterator(options) this.cache = null this.finished = false this.fastFuture = fastFuture() } util.inherits(Iterator, AbstractIterator) Iterator.prototype.seek = function (key) { if (typeof key !== 'string') throw new Error('seek requires a string key') this.cache = null this.binding.seek(key) } Iterator.prototype._next = function (callback) { var that = this , key , value if (this.cache && this.cache.length) { key = this.cache.pop() value = this.cache.pop() this.fastFuture(function () { callback(null, key, value) }) } else if (this.finished) { this.fastFuture(function () { callback() }) } else { this.binding.next(function (err, array, finished) { if (err) return callback(err) that.cache = array that.finished = finished that._next(callback) }) } return this } Iterator.prototype._end = function (callback) { delete this.cache this.binding.end(callback) } module.exports = Iterator },{"abstract-leveldown":206,"fast-future":149,"util":636}],202:[function(require,module,exports){ const util = require('util') , AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN , binding = require('bindings')('leveldown').leveldown , ChainedBatch = require('./chained-batch') , Iterator = require('./iterator') function LevelDOWN (location) { if (!(this instanceof LevelDOWN)) return new LevelDOWN(location) AbstractLevelDOWN.call(this, location) this.binding = binding(location) } util.inherits(LevelDOWN, AbstractLevelDOWN) LevelDOWN.prototype._open = function (options, callback) { this.binding.open(options, callback) } LevelDOWN.prototype._close = function (callback) { this.binding.close(callback) } LevelDOWN.prototype._put = function (key, value, options, callback) { this.binding.put(key, value, options, callback) } LevelDOWN.prototype._get = function (key, options, callback) { this.binding.get(key, options, callback) } LevelDOWN.prototype._del = function (key, options, callback) { this.binding.del(key, options, callback) } LevelDOWN.prototype._chainedBatch = function () { return new ChainedBatch(this) } LevelDOWN.prototype._batch = function (operations, options, callback) { return this.binding.batch(operations, options, callback) } LevelDOWN.prototype._approximateSize = function (start, end, callback) { this.binding.approximateSize(start, end, callback) } LevelDOWN.prototype.getProperty = function (property) { if (typeof property != 'string') throw new Error('getProperty() requires a valid `property` argument') return this.binding.getProperty(property) } LevelDOWN.prototype._iterator = function (options) { return new Iterator(this, options) } LevelDOWN.destroy = function (location, callback) { if (arguments.length < 2) throw new Error('destroy() requires `location` and `callback` arguments') if (typeof location != 'string') throw new Error('destroy() requires a location string argument') if (typeof callback != 'function') throw new Error('destroy() requires a callback function argument') binding.destroy(location, callback) } LevelDOWN.repair = function (location, callback) { if (arguments.length < 2) throw new Error('repair() requires `location` and `callback` arguments') if (typeof location != 'string') throw new Error('repair() requires a location string argument') if (typeof callback != 'function') throw new Error('repair() requires a callback function argument') binding.repair(location, callback) } module.exports = LevelDOWN },{"./chained-batch":200,"./iterator":201,"abstract-leveldown":206,"bindings":21,"util":636}],203:[function(require,module,exports){ (function (process){ /* Copyright (c) 2013 Rod Vagg, MIT License */ function AbstractChainedBatch (db) { this._db = db this._operations = [] this._written = false } AbstractChainedBatch.prototype._checkWritten = function () { if (this._written) throw new Error('write() already called on this batch') } AbstractChainedBatch.prototype.put = function (key, value) { this._checkWritten() var err = this._db._checkKey(key, 'key', this._db._isBuffer) if (err) throw err if (!this._db._isBuffer(key)) key = String(key) if (!this._db._isBuffer(value)) value = String(value) if (typeof this._put == 'function' ) this._put(key, value) else this._operations.push({ type: 'put', key: key, value: value }) return this } AbstractChainedBatch.prototype.del = function (key) { this._checkWritten() var err = this._db._checkKey(key, 'key', this._db._isBuffer) if (err) throw err if (!this._db._isBuffer(key)) key = String(key) if (typeof this._del == 'function' ) this._del(key) else this._operations.push({ type: 'del', key: key }) return this } AbstractChainedBatch.prototype.clear = function () { this._checkWritten() this._operations = [] if (typeof this._clear == 'function' ) this._clear() return this } AbstractChainedBatch.prototype.write = function (options, callback) { this._checkWritten() if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('write() requires a callback argument') if (typeof options != 'object') options = {} this._written = true if (typeof this._write == 'function' ) return this._write(callback) if (typeof this._db._batch == 'function') return this._db._batch(this._operations, options, callback) process.nextTick(callback) } module.exports = AbstractChainedBatch }).call(this,require('_process')) },{"_process":295}],204:[function(require,module,exports){ (function (process){ /* Copyright (c) 2013 Rod Vagg, MIT License */ function AbstractIterator (db) { this.db = db this._ended = false this._nexting = false } AbstractIterator.prototype.next = function (callback) { var self = this if (typeof callback != 'function') throw new Error('next() requires a callback argument') if (self._ended) return callback(new Error('cannot call next() after end()')) if (self._nexting) return callback(new Error('cannot call next() before previous next() has completed')) self._nexting = true if (typeof self._next == 'function') { return self._next(function () { self._nexting = false callback.apply(null, arguments) }) } process.nextTick(function () { self._nexting = false callback() }) } AbstractIterator.prototype.end = function (callback) { if (typeof callback != 'function') throw new Error('end() requires a callback argument') if (this._ended) return callback(new Error('end() already called on iterator')) this._ended = true if (typeof this._end == 'function') return this._end(callback) process.nextTick(callback) } module.exports = AbstractIterator }).call(this,require('_process')) },{"_process":295}],205:[function(require,module,exports){ (function (Buffer,process){ /* Copyright (c) 2013 Rod Vagg, MIT License */ var xtend = require('xtend') , AbstractIterator = require('./abstract-iterator') , AbstractChainedBatch = require('./abstract-chained-batch') function AbstractLevelDOWN (location) { if (!arguments.length || location === undefined) throw new Error('constructor requires at least a location argument') if (typeof location != 'string') throw new Error('constructor requires a location string argument') this.location = location this.status = 'new' } AbstractLevelDOWN.prototype.open = function (options, callback) { var self = this , oldStatus = this.status if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('open() requires a callback argument') if (typeof options != 'object') options = {} options.createIfMissing = options.createIfMissing != false options.errorIfExists = !!options.errorIfExists if (typeof this._open == 'function') { this.status = 'opening' this._open(options, function (err) { if (err) { self.status = oldStatus return callback(err) } self.status = 'open' callback() }) } else { this.status = 'open' process.nextTick(callback) } } AbstractLevelDOWN.prototype.close = function (callback) { var self = this , oldStatus = this.status if (typeof callback != 'function') throw new Error('close() requires a callback argument') if (typeof this._close == 'function') { this.status = 'closing' this._close(function (err) { if (err) { self.status = oldStatus return callback(err) } self.status = 'closed' callback() }) } else { this.status = 'closed' process.nextTick(callback) } } AbstractLevelDOWN.prototype.get = function (key, options, callback) { var err if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('get() requires a callback argument') if (err = this._checkKey(key, 'key', this._isBuffer)) return callback(err) if (!this._isBuffer(key)) key = String(key) if (typeof options != 'object') options = {} options.asBuffer = options.asBuffer != false if (typeof this._get == 'function') return this._get(key, options, callback) process.nextTick(function () { callback(new Error('NotFound')) }) } AbstractLevelDOWN.prototype.put = function (key, value, options, callback) { var err if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('put() requires a callback argument') if (err = this._checkKey(key, 'key', this._isBuffer)) return callback(err) if (!this._isBuffer(key)) key = String(key) // coerce value to string in node, don't touch it in browser // (indexeddb can store any JS type) if (value != null && !this._isBuffer(value) && !process.browser) value = String(value) if (typeof options != 'object') options = {} if (typeof this._put == 'function') return this._put(key, value, options, callback) process.nextTick(callback) } AbstractLevelDOWN.prototype.del = function (key, options, callback) { var err if (typeof options == 'function') callback = options if (typeof callback != 'function') throw new Error('del() requires a callback argument') if (err = this._checkKey(key, 'key', this._isBuffer)) return callback(err) if (!this._isBuffer(key)) key = String(key) if (typeof options != 'object') options = {} if (typeof this._del == 'function') return this._del(key, options, callback) process.nextTick(callback) } AbstractLevelDOWN.prototype.batch = function (array, options, callback) { if (!arguments.length) return this._chainedBatch() if (typeof options == 'function') callback = options if (typeof array == 'function') callback = array if (typeof callback != 'function') throw new Error('batch(array) requires a callback argument') if (!Array.isArray(array)) return callback(new Error('batch(array) requires an array argument')) if (!options || typeof options != 'object') options = {} var i = 0 , l = array.length , e , err for (; i < l; i++) { e = array[i] if (typeof e != 'object') continue if (err = this._checkKey(e.type, 'type', this._isBuffer)) return callback(err) if (err = this._checkKey(e.key, 'key', this._isBuffer)) return callback(err) } if (typeof this._batch == 'function') return this._batch(array, options, callback) process.nextTick(callback) } //TODO: remove from here, not a necessary primitive AbstractLevelDOWN.prototype.approximateSize = function (start, end, callback) { if ( start == null || end == null || typeof start == 'function' || typeof end == 'function') { throw new Error('approximateSize() requires valid `start`, `end` and `callback` arguments') } if (typeof callback != 'function') throw new Error('approximateSize() requires a callback argument') if (!this._isBuffer(start)) start = String(start) if (!this._isBuffer(end)) end = String(end) if (typeof this._approximateSize == 'function') return this._approximateSize(start, end, callback) process.nextTick(function () { callback(null, 0) }) } AbstractLevelDOWN.prototype._setupIteratorOptions = function (options) { var self = this options = xtend(options) ;[ 'start', 'end', 'gt', 'gte', 'lt', 'lte' ].forEach(function (o) { if (options[o] && self._isBuffer(options[o]) && options[o].length === 0) delete options[o] }) options.reverse = !!options.reverse options.keys = options.keys != false options.values = options.values != false options.limit = 'limit' in options ? options.limit : -1 options.keyAsBuffer = options.keyAsBuffer != false options.valueAsBuffer = options.valueAsBuffer != false return options } AbstractLevelDOWN.prototype.iterator = function (options) { if (typeof options != 'object') options = {} options = this._setupIteratorOptions(options) if (typeof this._iterator == 'function') return this._iterator(options) return new AbstractIterator(this) } AbstractLevelDOWN.prototype._chainedBatch = function () { return new AbstractChainedBatch(this) } AbstractLevelDOWN.prototype._isBuffer = function (obj) { return Buffer.isBuffer(obj) } AbstractLevelDOWN.prototype._checkKey = function (obj, type) { if (obj === null || obj === undefined) return new Error(type + ' cannot be `null` or `undefined`') if (this._isBuffer(obj)) { if (obj.length === 0) return new Error(type + ' cannot be an empty Buffer') } else if (String(obj) === '') return new Error(type + ' cannot be an empty String') } module.exports = AbstractLevelDOWN }).call(this,{"isBuffer":require("../../../is-buffer/index.js")},require('_process')) },{"../../../is-buffer/index.js":170,"./abstract-chained-batch":203,"./abstract-iterator":204,"_process":295,"xtend":208}],206:[function(require,module,exports){ arguments[4][188][0].apply(exports,arguments) },{"./abstract-chained-batch":203,"./abstract-iterator":204,"./abstract-leveldown":205,"./is-leveldown":207,"dup":188}],207:[function(require,module,exports){ arguments[4][189][0].apply(exports,arguments) },{"./abstract-leveldown":205,"dup":189}],208:[function(require,module,exports){ arguments[4][177][0].apply(exports,arguments) },{"dup":177}],209:[function(require,module,exports){ /* Copyright (c) 2012-2014 LevelUP contributors * See list at * MIT License * */ var encodings = require('./encodings') function getKeyEncoder (options, op) { var type = ((op && op.keyEncoding) || options.keyEncoding) || 'utf8' return encodings[type] || type } function getValueEncoder (options, op) { var type = (((op && (op.valueEncoding || op.encoding)) || options.valueEncoding || options.encoding)) || 'utf8' return encodings[type] || type } /* Encode a key. This method takes two options, because the leveldb instance has options, and this operation (a put, del, or batch) also has options that may override the leveldb's options. */ function encodeKey (key, options, op) { return getKeyEncoder(options, op).encode(key) } /* Encode a value. Takes 2 options, for the same reason as encodeKey */ function encodeValue (value, options, op) { return getValueEncoder(options, op).encode(value) } /* Decode an encoded key */ function decodeKey (key, options) { return getKeyEncoder(options).decode(key) } /* Decode an encoded value */ function decodeValue (value, options) { return getValueEncoder(options).decode(value) } /* check whether this value should be requested as a buffer (if false, then it will be a string) this allows an optimization in leveldown where leveldown retrives a string directly, and thus avoids a memory copy. */ function isValueAsBuffer (options, op) { return getValueEncoder(options, op).buffer } /* check whether a given key should be requested as a buffer. */ function isKeyAsBuffer (options, op) { return getKeyEncoder(options, op).buffer } module.exports = { encodeKey : encodeKey , encodeValue : encodeValue , isValueAsBuffer : isValueAsBuffer , isKeyAsBuffer : isKeyAsBuffer , decodeValue : decodeValue , decodeKey : decodeKey } },{"./encodings":210}],210:[function(require,module,exports){ (function (Buffer){ /* Copyright (c) 2012-2014 LevelUP contributors * See list at * MIT License * */ var encodingNames = [ 'hex' , 'utf8' , 'utf-8' , 'ascii' , 'binary' , 'base64' , 'ucs2' , 'ucs-2' , 'utf16le' , 'utf-16le' ] module.exports = (function () { function isBinary (data) { return data === undefined || data === null || Buffer.isBuffer(data) } var encodings = {} encodings.utf8 = encodings['utf-8'] = { encode : function (data) { return isBinary(data) ? data : String(data) } , decode : function (data) { return data } , buffer : false , type : 'utf8' } encodings.json = { encode : JSON.stringify , decode : JSON.parse , buffer : false , type : 'json' } encodings.binary = { encode : function (data) { return isBinary(data) ? data : new Buffer(data) } , decode : function (data) { return data } , buffer : true , type : 'binary' } encodingNames.forEach(function (type) { if (encodings[type]) return encodings[type] = { encode : function (data) { return isBinary(data) ? data : new Buffer(data, type) } , decode : function (buffer) { return buffer.toString(type) } , buffer : true , type : type // useful for debugging purposes } }) return encodings })() }).call(this,require("buffer").Buffer) },{"buffer":61}],211:[function(require,module,exports){ /* Copyright (c) 2012-2014 LevelUP contributors * See list at * MIT License * */ var createError = require('errno').create , LevelUPError = createError('LevelUPError') , NotFoundError = createError('NotFoundError', LevelUPError) NotFoundError.prototype.notFound = true NotFoundError.prototype.status = 404 module.exports = { LevelUPError : LevelUPError , InitializationError : createError('InitializationError', LevelUPError) , OpenError : createError('OpenError', LevelUPError) , ReadError : createError('ReadError', LevelUPError) , WriteError : createError('WriteError', LevelUPError) , NotFoundError : NotFoundError , EncodingError : createError('EncodingError', LevelUPError) } },{"errno":143}],212:[function(require,module,exports){ /* Copyright (c) 2012-2014 LevelUP contributors * See list at * MIT License */ // NOTE: we are fixed to readable-stream@1.0.x for now // for pure Streams2 across Node versions var Readable = require('readable-stream').Readable , inherits = require('util').inherits , extend = require('xtend') , EncodingError = require('./errors').EncodingError , util = require('./util') function ReadStream (options, makeData) { if (!(this instanceof ReadStream)) return new ReadStream(options, makeData) Readable.call(this, { objectMode: true, highWaterMark: options.highWaterMark }) // purely to keep `db` around until we're done so it's not GCed if the user doesn't keep a ref this._waiting = false this._options = options this._makeData = makeData } inherits(ReadStream, Readable) ReadStream.prototype.setIterator = function (it) { var self = this this._iterator = it if(this._destroyed) return it.end(function () {}) if(this._waiting) { this._waiting = false return this._read() } return this } ReadStream.prototype._read = function read () { var self = this if (self._destroyed) return if(!self._iterator) return this._waiting = true self._iterator.next(function(err, key, value) { if (err || (key === undefined && value === undefined)) { if (!err && !self._destroyed) self.push(null) return self._cleanup(err) } try { value = self._makeData(key, value) } catch (e) { return self._cleanup(new EncodingError(e)) } if (!self._destroyed) self.push(value) }) } ReadStream.prototype._cleanup = function (err) { if (this._destroyed) return this._destroyed = true var self = this if (err) self.emit('error', err) if (self._iterator) { self._iterator.end(function () { self._iterator = null self.emit('close') }) } else { self.emit('close') } } ReadStream.prototype.destroy = function () { this._cleanup() } ReadStream.prototype.toString = function () { return 'LevelUP.ReadStream' } module.exports = ReadStream },{"./errors":211,"./util":213,"readable-stream":219,"util":636,"xtend":220}],213:[function(require,module,exports){ /* Copyright (c) 2012-2014 LevelUP contributors * See list at * MIT License * */ var extend = require('xtend') , LevelUPError = require('./errors').LevelUPError , encodings = require('./encodings') , defaultOptions = { createIfMissing : true , errorIfExists : false , keyEncoding : 'utf8' , valueEncoding : 'utf8' , compression : true } , leveldown , encodingOpts = (function () { var eo = {} for(var e in encodings) eo[e] = {valueEncoding: encodings[e]} return eo }()) function copy (srcdb, dstdb, callback) { srcdb.readStream() .pipe(dstdb.writeStream()) .on('close', callback ? callback : function () {}) .on('error', callback ? callback : function (err) { throw err }) } function getOptions (levelup, options) { var s = typeof options == 'string' // just an encoding if (!s && options && options.encoding && !options.valueEncoding) options.valueEncoding = options.encoding return extend( (levelup && levelup.options) || {} , s ? encodingOpts[options] || encodingOpts[defaultOptions.valueEncoding] : options ) } function getLevelDOWN () { if (leveldown) return leveldown var requiredVersion = require('../package.json').devDependencies.leveldown , missingLevelDOWNError = 'Could not locate LevelDOWN, try `npm install leveldown`' , leveldownVersion try { leveldownVersion = require('leveldown/package').version } catch (e) { throw new LevelUPError(missingLevelDOWNError) } if (!require('semver').satisfies(leveldownVersion, requiredVersion)) { throw new LevelUPError( 'Installed version of LevelDOWN (' + leveldownVersion + ') does not match required version (' + requiredVersion + ')' ) } try { return leveldown = require('leveldown') } catch (e) { throw new LevelUPError(missingLevelDOWNError) } } function dispatchError (levelup, error, callback) { return typeof callback == 'function' ? callback(error) : levelup.emit('error', error) } function isDefined (v) { return typeof v !== 'undefined' } module.exports = { defaultOptions : defaultOptions , copy : copy , getOptions : getOptions , getLevelDOWN : getLevelDOWN , dispatchError : dispatchError , isDefined : isDefined } },{"../package.json":221,"./encodings":210,"./errors":211,"leveldown":33,"leveldown/package":33,"semver":33,"xtend":220}],214:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. module.exports = Duplex; /**/ var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) keys.push(key); return keys; } /**/ /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Readable = require('./_stream_readable'); var Writable = require('./_stream_writable'); util.inherits(Duplex, Readable); forEach(objectKeys(Writable.prototype), function(method) { if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; }); function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); Readable.call(this, options); Writable.call(this, options); if (options && options.readable === false) this.readable = false; if (options && options.writable === false) this.writable = false; this.allowHalfOpen = true; if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; this.once('end', onend); } // the no-half-open enforcer function onend() { // if we allow half-open state, or if the writable side ended, // then we're ok. if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. process.nextTick(this.end.bind(this)); } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } }).call(this,require('_process')) },{"./_stream_readable":216,"./_stream_writable":218,"_process":295,"core-util-is":104,"inherits":167}],215:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. module.exports = PassThrough; var Transform = require('./_stream_transform'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); Transform.call(this, options); } PassThrough.prototype._transform = function(chunk, encoding, cb) { cb(null, chunk); }; },{"./_stream_transform":217,"core-util-is":104,"inherits":167}],216:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. module.exports = Readable; /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events').EventEmitter; /**/ if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ var Stream = require('stream'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var StringDecoder; util.inherits(Readable, Stream); function ReadableState(options, stream) { options = options || {}; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = false; this.ended = false; this.endEmitted = false; this.reading = false; // In streams that never have any data, and do push(null) right away, // the consumer can miss the 'end' event if they do some I/O before // consuming the stream. So, we don't emit('end') until some reading // happens. this.calledRead = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, becuase any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } function Readable(options) { if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (typeof chunk === 'string' && !state.objectMode) { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null || chunk === undefined) { state.reading = false; if (!state.ended) onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) { state.buffer.unshift(chunk); } else { state.reading = false; state.buffer.push(chunk); } if (state.needReadable) emitReadable(stream); maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; }; // Don't raise the hwm > 128MB var MAX_HWM = 0x800000; function roundUpToNextPowerOf2(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; for (var p = 1; p < 32; p <<= 1) n |= n >> p; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0) return 0; // If we're asking for more than the target buffer level, // then raise the water mark. Bump up to the next highest // power of 2, to prevent increasing it excessively in tiny // amounts. if (n > state.highWaterMark) state.highWaterMark = roundUpToNextPowerOf2(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else return state.length; } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { var state = this._readableState; state.calledRead = true; var nOrig = n; var ret; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { ret = null; // In cases where the decoder did not receive enough data // to produce a full chunk, then immediately received an // EOF, state.buffer will contain [, ]. // howMuchToRead will see this and coerce the amount to // read to zero (because it's looking at the length of the // first in state.buffer), and we'll end up here. // // This can only happen via state.decoder -- no other venue // exists for pushing a zero-length chunk into state.buffer // and triggering this behavior. In this case, we return our // remaining data and end the stream, if appropriate. if (state.length > 0 && state.decoder) { ret = fromList(n, state); state.length -= ret.length; } if (state.length === 0) endReadable(this); return ret; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; // if we currently have less than the highWaterMark, then also read some if (state.length - n <= state.highWaterMark) doRead = true; // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) doRead = false; if (doRead) { state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read called its callback synchronously, then `reading` // will be false, and we need to re-evaluate how much data we // can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); if (n > 0) ret = fromList(n, state); else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we happened to read() exactly the remaining amount in the // buffer, and the EOF has been seen at this point, then make sure // that we emit 'end' on the very next tick. if (state.ended && !state.endEmitted && state.length === 0) endReadable(this); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!Buffer.isBuffer(chunk) && 'string' !== typeof chunk && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // if we've ended and we have some data left, then emit // 'readable' now to make sure it gets picked up. if (state.length > 0) emitReadable(stream); else endReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (state.emittedReadable) return; state.emittedReadable = true; if (state.sync) process.nextTick(function() { emitReadable_(stream); }); else emitReadable_(stream); } function emitReadable_(stream) { stream.emit('readable'); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; process.nextTick(function() { maybeReadMore_(stream, state); }); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= n in length. // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. Readable.prototype._read = function(n) { this.emit('error', new Error('not implemented')); }; Readable.prototype.pipe = function(dest, pipeOpts) { var src = this; var state = this._readableState; switch (state.pipesCount) { case 0: state.pipes = dest; break; case 1: state.pipes = [state.pipes, dest]; break; default: state.pipes.push(dest); break; } state.pipesCount += 1; var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var endFn = doEnd ? onend : cleanup; if (state.endEmitted) process.nextTick(endFn); else src.once('end', endFn); dest.on('unpipe', onunpipe); function onunpipe(readable) { if (readable !== src) return; cleanup(); } function onend() { dest.end(); } // when the dest drains, it reduces the awaitDrain counter // on the source. This would be more elegant with a .once() // handler in flow(), but adding and removing repeatedly is // too slow. var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); function cleanup() { // cleanup event handlers once the pipe is broken dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); dest.removeListener('error', onerror); dest.removeListener('unpipe', onunpipe); src.removeListener('end', onend); src.removeListener('end', cleanup); // if the reader is waiting for a drain event from this // specific writer, then it would cause it to never start // flowing again. // So, if this is awaiting a drain, then we just call it now. // If we don't know, then assume that we are waiting for one. if (!dest._writableState || dest._writableState.needDrain) ondrain(); } // if the dest has an error, then stop piping into it. // however, don't suppress the throwing behavior for this. function onerror(er) { unpipe(); dest.removeListener('error', onerror); if (EE.listenerCount(dest, 'error') === 0) dest.emit('error', er); } // This is a brutally ugly hack to make sure that our error handler // is attached before any userland ones. NEVER DO THIS. if (!dest._events || !dest._events.error) dest.on('error', onerror); else if (isArray(dest._events.error)) dest._events.error.unshift(onerror); else dest._events.error = [onerror, dest._events.error]; // Both close and finish should trigger unpipe, but only once. function onclose() { dest.removeListener('finish', onfinish); unpipe(); } dest.once('close', onclose); function onfinish() { dest.removeListener('close', onclose); unpipe(); } dest.once('finish', onfinish); function unpipe() { src.unpipe(dest); } // tell the dest that it's being piped to dest.emit('pipe', src); // start the flow if it hasn't been started already. if (!state.flowing) { // the handler that waits for readable events after all // the data gets sucked out in flow. // This would be easier to follow with a .once() handler // in flow(), but that is too slow. this.on('readable', pipeOnReadable); state.flowing = true; process.nextTick(function() { flow(src); }); } return dest; }; function pipeOnDrain(src) { return function() { var dest = this; var state = src._readableState; state.awaitDrain--; if (state.awaitDrain === 0) flow(src); }; } function flow(src) { var state = src._readableState; var chunk; state.awaitDrain = 0; function write(dest, i, list) { var written = dest.write(chunk); if (false === written) { state.awaitDrain++; } } while (state.pipesCount && null !== (chunk = src.read())) { if (state.pipesCount === 1) write(state.pipes, 0, null); else forEach(state.pipes, write); src.emit('data', chunk); // if anyone needs a drain, then we have to wait for that. if (state.awaitDrain > 0) return; } // if every destination was unpiped, either before entering this // function, or in the while loop, then stop flowing. // // NB: This is a pretty rare edge case. if (state.pipesCount === 0) { state.flowing = false; // if there were data event listeners added, then switch to old mode. if (EE.listenerCount(src, 'data') > 0) emitDataEvents(src); return; } // at this point, no one needed a drain, so we just ran out of data // on the next readable event, start it over again. state.ranOut = true; } function pipeOnReadable() { if (this._readableState.ranOut) { this._readableState.ranOut = false; flow(this); } } Readable.prototype.unpipe = function(dest) { var state = this._readableState; // if we're not piping anywhere, then do nothing. if (state.pipesCount === 0) return this; // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; if (!dest) dest = state.pipes; // got a match. state.pipes = null; state.pipesCount = 0; this.removeListener('readable', pipeOnReadable); state.flowing = false; if (dest) dest.emit('unpipe', this); return this; } // slow case. multiple pipe destinations. if (!dest) { // remove all. var dests = state.pipes; var len = state.pipesCount; state.pipes = null; state.pipesCount = 0; this.removeListener('readable', pipeOnReadable); state.flowing = false; for (var i = 0; i < len; i++) dests[i].emit('unpipe', this); return this; } // try to find the right one. var i = indexOf(state.pipes, dest); if (i === -1) return this; state.pipes.splice(i, 1); state.pipesCount -= 1; if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this); return this; }; // set up data events if they are asked for // Ensure readable listeners eventually get something Readable.prototype.on = function(ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); if (ev === 'data' && !this._readableState.flowing) emitDataEvents(this); if (ev === 'readable' && this.readable) { var state = this._readableState; if (!state.readableListening) { state.readableListening = true; state.emittedReadable = false; state.needReadable = true; if (!state.reading) { this.read(0); } else if (state.length) { emitReadable(this, state); } } } return res; }; Readable.prototype.addListener = Readable.prototype.on; // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. Readable.prototype.resume = function() { emitDataEvents(this); this.read(0); this.emit('resume'); }; Readable.prototype.pause = function() { emitDataEvents(this, true); this.emit('pause'); }; function emitDataEvents(stream, startPaused) { var state = stream._readableState; if (state.flowing) { // https://github.com/isaacs/readable-stream/issues/16 throw new Error('Cannot switch to old mode now.'); } var paused = startPaused || false; var readable = false; // convert to an old-style stream. stream.readable = true; stream.pipe = Stream.prototype.pipe; stream.on = stream.addListener = Stream.prototype.on; stream.on('readable', function() { readable = true; var c; while (!paused && (null !== (c = stream.read()))) stream.emit('data', c); if (c === null) { readable = false; stream._readableState.needReadable = true; } }); stream.pause = function() { paused = true; this.emit('pause'); }; stream.resume = function() { paused = false; if (readable) process.nextTick(function() { stream.emit('readable'); }); else this.read(0); this.emit('resume'); }; // now make it start, just in case it hadn't already. stream.emit('readable'); } // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. Readable.prototype.wrap = function(stream) { var state = this._readableState; var paused = false; var self = this; stream.on('end', function() { if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) self.push(chunk); } self.push(null); }); stream.on('data', function(chunk) { if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode //if (state.objectMode && util.isNullOrUndefined(chunk)) if (state.objectMode && (chunk === null || chunk === undefined)) return; else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = self.push(chunk); if (!ret) { paused = true; stream.pause(); } }); // proxy all the other methods. // important when wrapping filters and duplexes. for (var i in stream) { if (typeof stream[i] === 'function' && typeof this[i] === 'undefined') { this[i] = function(method) { return function() { return stream[method].apply(stream, arguments); }}(i); } } // proxy certain important events. var events = ['error', 'close', 'destroy', 'pause', 'resume']; forEach(events, function(ev) { stream.on(ev, self.emit.bind(self, ev)); }); // when we try to consume some more bytes, simply unpause the // underlying stream. self._read = function(n) { if (paused) { paused = false; stream.resume(); } }; return self; }; // exposed for testing purposes only. Readable._fromList = fromList; // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. function fromList(n, state) { var list = state.buffer; var length = state.length; var stringMode = !!state.decoder; var objectMode = !!state.objectMode; var ret; // nothing in the list, definitely empty. if (list.length === 0) return null; if (length === 0) ret = null; else if (objectMode) ret = list.shift(); else if (!n || n >= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted && state.calledRead) { state.ended = true; process.nextTick(function() { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } }); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"_process":295,"buffer":61,"core-util-is":104,"events":144,"inherits":167,"isarray":172,"stream":576,"string_decoder/":616}],217:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where // some bits pass through, and others are simply ignored. (That would // be a valid example of a transform, of course.) // // While the output is causally related to the input, it's not a // necessarily symmetric or synchronous transformation. For example, // a zlib stream might take multiple plain-text writes(), and then // emit a single compressed chunk some time in the future. // // Here's how this works: // // The Transform stream has all the aspects of the readable and writable // stream classes. When you write(chunk), that calls _write(chunk,cb) // internally, and returns false if there's a lot of pending writes // buffered up. When you call read(), that calls _read(n) until // there's enough pending readable data buffered up. // // In a transform stream, the written data is placed in a buffer. When // _read(n) is called, it transforms the queued up data, calling the // buffered _write cb's as it consumes chunks. If consuming a single // written chunk would result in multiple output chunks, then the first // outputted bit calls the readcb, and subsequent chunks just go into // the read buffer, and will cause it to emit 'readable' if necessary. // // This way, back-pressure is actually determined by the reading side, // since _read has to be called to start processing a new chunk. However, // a pathological inflate type of transform can cause excessive buffering // here. For example, imagine a stream where every byte of input is // interpreted as an integer from 0-255, and then results in that many // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in // 1kb of data being output. In this case, you could write a very small // amount of input, and end up with a very large amount of output. In // such a pathological inflating mechanism, there'd be no way to tell // the system to stop doing the transform. A single 4MB write could // cause the system to run out of memory. // // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. module.exports = Transform; var Duplex = require('./_stream_duplex'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(Transform, Duplex); function TransformState(options, stream) { this.afterTransform = function(er, data) { return afterTransform(stream, er, data); }; this.needTransform = false; this.transforming = false; this.writecb = null; this.writechunk = null; } function afterTransform(stream, er, data) { var ts = stream._transformState; ts.transforming = false; var cb = ts.writecb; if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); ts.writechunk = null; ts.writecb = null; if (data !== null && data !== undefined) stream.push(data); if (cb) cb(er); var rs = stream._readableState; rs.reading = false; if (rs.needReadable || rs.length < rs.highWaterMark) { stream._read(rs.highWaterMark); } } function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); var ts = this._transformState = new TransformState(options, this); // when the writable side finishes, then flush out anything remaining. var stream = this; // start out asking for a readable event once data is transformed. this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. this._readableState.sync = false; this.once('finish', function() { if ('function' === typeof this._flush) this._flush(function(er) { done(stream, er); }); else done(stream); }); } Transform.prototype.push = function(chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); }; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // // Call `push(newChunk)` to pass along transformed output // to the readable side. You may call 'push' zero or more times. // // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. Transform.prototype._transform = function(chunk, encoding, cb) { throw new Error('not implemented'); }; Transform.prototype._write = function(chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } }; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. Transform.prototype._read = function(n) { var ts = this._transformState; if (ts.writechunk !== null && ts.writecb && !ts.transforming) { ts.transforming = true; this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in // will get processed, now that we've asked for it. ts.needTransform = true; } }; function done(stream, er) { if (er) return stream.emit('error', er); // if there's nothing in the write buffer, then that means // that nothing more will ever be provided var ws = stream._writableState; var rs = stream._readableState; var ts = stream._transformState; if (ws.length) throw new Error('calling transform done when ws.length != 0'); if (ts.transforming) throw new Error('calling transform done when still transforming'); return stream.push(null); } },{"./_stream_duplex":214,"core-util-is":104,"inherits":167}],218:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // A bit simpler than readable streams. // Implement an async ._write(chunk, cb), and it'll handle all // the drain event emission and buffering. module.exports = Writable; /**/ var Buffer = require('buffer').Buffer; /**/ Writable.WritableState = WritableState; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Stream = require('stream'); util.inherits(Writable, Stream); function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; } function WritableState(options, stream) { options = options || {}; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() var hwm = options.highWaterMark; this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.needDrain = false; // at the start of calling end() this.ending = false; // when end() has been called, and returned this.ended = false; // when 'finish' is emitted this.finished = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. var noDecode = options.decodeStrings === false; this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. this.length = 0; // a flag to see when we're in the middle of a write. this.writing = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, becuase any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) this.onwrite = function(er) { onwrite(stream, er); }; // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; // the amount that is being written when _write is called. this.writelen = 0; this.buffer = []; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; } function Writable(options) { var Duplex = require('./_stream_duplex'); // Writable ctor is applied to Duplexes, though they're not // instanceof Writable, they're instanceof Readable. if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); this._writableState = new WritableState(options, this); // legacy. this.writable = true; Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function() { this.emit('error', new Error('Cannot pipe. Not readable.')); }; function writeAfterEnd(stream, state, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); process.nextTick(function() { cb(er); }); } // If we get something that is not a buffer, string, null, or undefined, // and we're not in objectMode, then that's an error. // Otherwise stream chunks are all considered to be of length=1, and the // watermarks determine how many objects to keep in the buffer, rather than // how many bytes or characters. function validChunk(stream, state, chunk, cb) { var valid = true; if (!Buffer.isBuffer(chunk) && 'string' !== typeof chunk && chunk !== null && chunk !== undefined && !state.objectMode) { var er = new TypeError('Invalid non-string/buffer chunk'); stream.emit('error', er); process.nextTick(function() { cb(er); }); valid = false; } return valid; } Writable.prototype.write = function(chunk, encoding, cb) { var state = this._writableState; var ret = false; if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (Buffer.isBuffer(chunk)) encoding = 'buffer'; else if (!encoding) encoding = state.defaultEncoding; if (typeof cb !== 'function') cb = function() {}; if (state.ended) writeAfterEnd(this, state, cb); else if (validChunk(this, state, chunk, cb)) ret = writeOrBuffer(this, state, chunk, encoding, cb); return ret; }; function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = new Buffer(chunk, encoding); } return chunk; } // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, chunk, encoding, cb) { chunk = decodeChunk(state, chunk, encoding); if (Buffer.isBuffer(chunk)) encoding = 'buffer'; var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing) state.buffer.push(new WriteReq(chunk, encoding, cb)); else doWrite(stream, state, len, chunk, encoding, cb); return ret; } function doWrite(stream, state, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { if (sync) process.nextTick(function() { cb(er); }); else cb(er); stream._writableState.errorEmitted = true; stream.emit('error', er); } function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; onwriteStateUpdate(state); if (er) onwriteError(stream, state, sync, er, cb); else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(stream, state); if (!finished && !state.bufferProcessing && state.buffer.length) clearBuffer(stream, state); if (sync) { process.nextTick(function() { afterWrite(stream, state, finished, cb); }); } else { afterWrite(stream, state, finished, cb); } } } function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); cb(); if (finished) finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } } // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; for (var c = 0; c < state.buffer.length; c++) { var entry = state.buffer[c]; var chunk = entry.chunk; var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, len, chunk, encoding, cb); // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. if (state.writing) { c++; break; } } state.bufferProcessing = false; if (c < state.buffer.length) state.buffer = state.buffer.slice(c); else state.buffer.length = 0; } Writable.prototype._write = function(chunk, encoding, cb) { cb(new Error('not implemented')); }; Writable.prototype.end = function(chunk, encoding, cb) { var state = this._writableState; if (typeof chunk === 'function') { cb = chunk; chunk = null; encoding = null; } else if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (typeof chunk !== 'undefined' && chunk !== null) this.write(chunk, encoding); // ignore unnecessary end() calls. if (!state.ending && !state.finished) endWritable(this, state, cb); }; function needFinish(stream, state) { return (state.ending && state.length === 0 && !state.finished && !state.writing); } function finishMaybe(stream, state) { var need = needFinish(stream, state); if (need) { state.finished = true; stream.emit('finish'); } return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { if (state.finished) process.nextTick(cb); else stream.once('finish', cb); } state.ended = true; } }).call(this,require('_process')) },{"./_stream_duplex":214,"_process":295,"buffer":61,"core-util-is":104,"inherits":167,"stream":576}],219:[function(require,module,exports){ (function (process){ var Stream = require('stream'); // hack to fix a circular dependency issue when used with browserify exports = module.exports = require('./lib/_stream_readable.js'); exports.Stream = Stream; exports.Readable = exports; exports.Writable = require('./lib/_stream_writable.js'); exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); if (!process.browser && process.env.READABLE_STREAM === 'disable') { module.exports = require('stream'); } }).call(this,require('_process')) },{"./lib/_stream_duplex.js":214,"./lib/_stream_passthrough.js":215,"./lib/_stream_readable.js":216,"./lib/_stream_transform.js":217,"./lib/_stream_writable.js":218,"_process":295,"stream":576}],220:[function(require,module,exports){ module.exports = extend function extend() { var target = {} for (var i = 0; i < arguments.length; i++) { var source = arguments[i] for (var key in source) { if (source.hasOwnProperty(key)) { target[key] = source[key] } } } return target } },{}],221:[function(require,module,exports){ module.exports={ "_args": [ [ "levelup@~0.19.0", "/Users/joran/Documents/development/patchdeck/node_modules/level-sublevel" ] ], "_from": "levelup@>=0.19.0 <0.20.0", "_id": "levelup@0.19.1", "_inCache": true, "_installable": true, "_location": "/levelup", "_nodeVersion": "5.5.0", "_npmUser": { "email": "ralphtheninja@riseup.net", "name": "ralphtheninja" }, "_npmVersion": "3.3.12", "_phantomChildren": { "core-util-is": "1.0.2", "inherits": "2.0.1", "isarray": "0.0.1", "string_decoder": "0.10.31" }, "_requested": { "name": "levelup", "raw": "levelup@~0.19.0", "rawSpec": "~0.19.0", "scope": null, "spec": ">=0.19.0 <0.20.0", "type": "range" }, "_requiredBy": [ "/level-sublevel", "/secure-scuttlebutt/level-sublevel" ], "_resolved": "https://registry.npmjs.org/levelup/-/levelup-0.19.1.tgz", "_shasum": "f3a6a7205272c4b5f35e412ff004a03a0aedf50b", "_shrinkwrap": null, "_spec": "levelup@~0.19.0", "_where": "/Users/joran/Documents/development/patchdeck/node_modules/level-sublevel", "browser": { "leveldown": false, "leveldown/package": false, "semver": false }, "bugs": { "url": "https://github.com/rvagg/node-levelup/issues" }, "contributors": [ { "name": "David Björklund", "email": "david.bjorklund@gmail.com", "url": "https://github.com/kesla" }, { "name": "Rod Vagg", "email": "r@va.gg", "url": "https://github.com/rvagg" }, { "name": "Jake Verbaten", "email": "raynos2@gmail.com", "url": "https://github.com/raynos" }, { "name": "Dominic Tarr", "email": "dominic.tarr@gmail.com", "url": "https://github.com/dominictarr" }, { "name": "Max Ogden", "email": "max@maxogden.com", "url": "https://github.com/maxogden" }, { "name": "Lars-Magnus Skog", "email": "lars.magnus.skog@gmail.com", "url": "https://github.com/ralphtheninja" }, { "name": "John Chesley", "email": "john@chesl.es", "url": "https://github.com/chesles/" }, { "name": "Julian Gruber", "email": "julian@juliangruber.com", "url": "https://github.com/juliangruber" }, { "name": "Paolo Fragomeni", "email": "paolo@async.ly", "url": "https://github.com/hij1nx" }, { "name": "Anton Whalley", "email": "anton.whalley@nearform.com", "url": "https://github.com/No9" }, { "name": "Matteo Collina", "email": "matteo.collina@gmail.com", "url": "https://github.com/mcollina" }, { "name": "Pedro Teixeira", "email": "pedro.teixeira@gmail.com", "url": "https://github.com/pgte" }, { "name": "James Halliday", "email": "mail@substack.net", "url": "https://github.com/substack" } ], "dependencies": { "bl": "~0.8.1", "deferred-leveldown": "~0.2.0", "errno": "~0.1.1", "prr": "~0.0.0", "readable-stream": "~1.0.26", "semver": "~5.1.0", "xtend": "~3.0.0" }, "description": "Fast & simple storage - a Node.js-style LevelDB wrapper", "devDependencies": { "async": "*", "boganipsum": "*", "bustermove": "~1.0.1", "delayed": "*", "du": "*", "fstream": "*", "leveldown": "~0.10.0", "memdown": "^0.11.0", "mkfiletree": "*", "msgpack-js": "*", "readfiletree": "*", "referee": "*", "rimraf": "*", "slow-stream": ">=0.0.4", "tap": "2.x.x", "tape": "4.x.x", "tar": "*" }, "directories": {}, "dist": { "shasum": "f3a6a7205272c4b5f35e412ff004a03a0aedf50b", "tarball": "https://registry.npmjs.org/levelup/-/levelup-0.19.1.tgz" }, "gitHead": "2847795d54c6eceb865e2c6b5157bccf68132c55", "homepage": "https://github.com/rvagg/node-levelup", "keywords": [ "database", "db", "json", "leveldb", "storage", "store", "stream" ], "license": "MIT", "main": "lib/levelup.js", "maintainers": [ { "name": "rvagg", "email": "rod@vagg.org" }, { "name": "ralphtheninja", "email": "ralphtheninja@riseup.net" }, { "name": "juliangruber", "email": "julian@juliangruber.com" } ], "name": "levelup", "optionalDependencies": {}, "readme": "ERROR: No README data found!", "repository": { "type": "git", "url": "git+https://github.com/rvagg/node-levelup.git" }, "scripts": { "alltests": "npm test && npm run-script functionaltests", "functionaltests": "node ./test/functional/fstream-test.js && node ./test/functional/binary-data-test.js && node ./test/functional/compat-test.js", "test": "tap test/*-test.js" }, "version": "0.19.1" } },{}],222:[function(require,module,exports){ (function (process){ (function (root, factory) { if (typeof process === "object" && typeof process.stdout === "undefined") { process.stderr = process.stdout = { write: function() { } }; } if (typeof define === "function" && define.amd) { define(["exports", "libsodium"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("libsodium")); } else { var cb = root.sodium && root.sodium.onload; factory((root.sodium = {}), root.libsodium); if (typeof cb === "function") { cb(root.sodium); } } }(this, function (exports, libsodium) { "use strict"; Object.defineProperty(exports, '__esModule', { value: true }); var output_format = "uint8array"; libsodium._sodium_init(); // List of functions and constants defined in the wrapped libsodium function symbols() { return Object.keys(exports).sort(); } function increment(bytes) { if (! bytes instanceof Uint8Array) { throw new TypeError("Only Uint8Array instances can be incremented"); } var c = 1 << 8; for (var i = 0 | 0, j = bytes.length; i < j; i++) { c >>= 8; c += bytes[i]; bytes[i] = c & 0xff; } } function memzero(bytes) { if (! bytes instanceof Uint8Array) { throw new TypeError("Only Uint8Array instances can be wiped"); } for (var i = 0 | 0, j = bytes.length; i < j; i++) { bytes[i] = 0; } } function memcmp(b1, b2) { if (!(b1 instanceof Uint8Array && b2 instanceof Uint8Array)) { throw new TypeError("Only Uint8Array instances can be compared"); } if (b1.length !== b2.length) { throw new TypeError("Only instances of identical length can be compared"); } for (var d = 0 | 0, i = 0 | 0, j = b1.length; i < j; i++) { d |= b1[i] ^ b2[i]; } return d === 0; } function compare(b1, b2) { if (!(b1 instanceof Uint8Array && b2 instanceof Uint8Array)) { throw new TypeError("Only Uint8Array instances can be compared"); } if (b1.length !== b2.length) { throw new TypeError("Only instances of identical length can be compared"); } for (var gt = 0 | 0, eq = 1 | 1, i = b1.length; i-- > 0;) { gt |= ((b2[i] - b1[i]) >> 8) & eq; eq &= ((b2[i] ^ b1[i]) - 1) >> 8; } return (gt + gt + eq) - 1; } //--------------------------------------------------------------------------- // Codecs function from_string(str) { if (typeof TextEncoder === "function") { return new TextEncoder("utf-8").encode(str); } str = unescape(encodeURIComponent(str)); var bytes = new Uint8Array(str.length); for (var i = 0; i < str.length; i++) { bytes[i] = str.charCodeAt(i); } return bytes; } function to_string(bytes) { if (typeof TextDecoder === "function") { return new TextDecoder("utf-8", {fatal: true}).decode(bytes); } try { return decodeURIComponent(escape(String.fromCharCode.apply(null, bytes))); } catch (_) { throw new TypeError("The encoded data was not valid."); } } function from_hex(str) { if (!is_hex(str)) throw new TypeError("The provided string doesn't look like hex data"); var result = new Uint8Array(str.length / 2); for (var i = 0; i < str.length; i += 2) { result[i >>> 1] = parseInt(str.substr(i, 2), 16); } return result; } function to_hex(bytes) { var str = "", b, c, x; for (var i = 0; i < bytes.length; i++) { c = bytes[i] & 0xf; b = bytes[i] >>> 4; x = (87 + c + (((c - 10) >> 8) & ~38)) << 8 | (87 + b + (((b - 10) >> 8) & ~38)); str += String.fromCharCode(x & 0xff) + String.fromCharCode(x >>> 8); } return str; } function is_hex(str) { return (typeof str === "string" && /^[0-9a-f]+$/i.test(str) && str.length % 2 === 0); } function from_base64(sBase64, nBlocksSize) { function _b64ToUint6(nChr) { return nChr > 64 && nChr < 91 ? nChr - 65 : nChr > 96 && nChr < 123 ? nChr - 71 : nChr > 47 && nChr < 58 ? nChr + 4 : nChr === 43 ? 62 : nChr === 47 ? 63 : 0; } var sB64Enc = sBase64.replace(/[^A-Za-z0-9\+\/]/g, ""), nInLen = sB64Enc.length, nOutLen = nBlocksSize ? Math.ceil((nInLen * 3 + 1 >> 2) / nBlocksSize) * nBlocksSize : nInLen * 3 + 1 >> 2, taBytes = new Uint8Array(nOutLen); for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) { nMod4 = nInIdx & 3; nUint24 |= _b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4; if (nMod4 === 3 || nInLen - nInIdx === 1) { for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) { taBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255; } nUint24 = 0; } } return taBytes; } function to_base64(aBytes, noNewLine) { function _uint6ToB64(nUint6) { return nUint6 < 26 ? nUint6 + 65 : nUint6 < 52 ? nUint6 + 71 : nUint6 < 62 ? nUint6 - 4 : nUint6 === 62 ? 43 : nUint6 === 63 ? 47 : 65; } if (typeof aBytes === "string") { throw new Exception("input has to be an array"); } var nMod3 = 2, sB64Enc = ""; for (var nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) { nMod3 = nIdx % 3; if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0 && !noNewLine) { sB64Enc += "\r\n"; } nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24); if (nMod3 === 2 || aBytes.length - nIdx === 1) { sB64Enc += String.fromCharCode(_uint6ToB64(nUint24 >>> 18 & 63), _uint6ToB64(nUint24 >>> 12 & 63), _uint6ToB64(nUint24 >>> 6 & 63), _uint6ToB64(nUint24 & 63)); nUint24 = 0; } } return sB64Enc.substr(0, sB64Enc.length - 2 + nMod3) + (nMod3 === 2 ? "" : nMod3 === 1 ? "=" : "=="); } function output_formats() { return ["uint8array", "text", "hex", "base64"]; } function _format_output(output, optionalOutputFormat) { var selectedOutputFormat = optionalOutputFormat || output_format; if (!_is_output_format(selectedOutputFormat)) throw new Error(selectedOutputFormat + " output format is not available"); if (output instanceof AllocatedBuf) { if (selectedOutputFormat === "uint8array") return output.to_Uint8Array(); else if (selectedOutputFormat === "text") return libsodium.Pointer_stringify(output.address, output.length); else if (selectedOutputFormat === "hex") return to_hex(output.to_Uint8Array()); else if (selectedOutputFormat === "base64") return to_base64(output.to_Uint8Array()); else throw new Error("What is output format \"" + selectedOutputFormat + "\"?"); } else if (typeof output === "object") { //Composed output. Example : key pairs var props = Object.keys(output); var formattedOutput = {}; for (var i = 0; i < props.length; i++) { formattedOutput[props[i]] = _format_output(output[props[i]], selectedOutputFormat); } return formattedOutput; } else if (typeof output === "string") { return output; } else { throw new TypeError("Cannot format output"); } } function _is_output_format(format) { var formats = output_formats(); for (var i = 0; i < formats.length; i++) { if (formats[i] === format) return true; } return false; } function _check_output_format(format) { if (!format) { return; } else if (typeof format !== "string") { throw new TypeError("When defined, the output format must be a string"); } else if (!_is_output_format(format)) { throw new Error(format + " is not a supported output format"); } } //--------------------------------------------------------------------------- // Memory management // AllocatedBuf: address allocated using _malloc() + length function AllocatedBuf(length) { this.length = length; this.address = _malloc(length); } // Copy the content of a AllocatedBuf (_malloc()'d memory) into a Uint8Array AllocatedBuf.prototype.to_Uint8Array = function () { var result = new Uint8Array(this.length); result.set(libsodium.HEAPU8.subarray(this.address, this.address + this.length)); return result; }; // _malloc() a region and initialize it with the content of a Uint8Array function _to_allocated_buf_address(bytes) { var address = _malloc(bytes.length); libsodium.HEAPU8.set(bytes, address); return address; } function _malloc(length) { var result = libsodium._malloc(length); if (result === 0) { throw { message: "_malloc() failed", length: length }; } return result; } function _free(address) { libsodium._free(address); } function _free_all(addresses) { for (var i = 0; i < addresses.length; i++) { _free(addresses[i]); } } function _free_and_throw_error(address_pool, err) { _free_all(address_pool); throw new Error(err); } function _free_and_throw_type_error(address_pool, err) { _free_all(address_pool); throw new TypeError(err); } function _require_defined(address_pool, varValue, varName) { if (varValue == undefined) { _free_and_throw_type_error(address_pool, varName + " cannot be null or undefined"); } } function _any_to_Uint8Array(address_pool, varValue, varName) { _require_defined(address_pool, varValue, varName); if (varValue instanceof Uint8Array) { return varValue; } else if (typeof varValue === "string") { return from_string(varValue); } _free_and_throw_type_error(address_pool, "unsupported input type for " + varName); } function crypto_aead_chacha20poly1305_decrypt(secret_nonce, ciphertext, additional_data, public_nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: secret_nonce (unsized_buf_optional) var secret_nonce_address = null, secret_nonce_length = 0; if (secret_nonce != undefined) { secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); secret_nonce_address = _to_allocated_buf_address(secret_nonce); secret_nonce_length = secret_nonce.length; address_pool.push(secret_nonce_address); } // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: additional_data (unsized_buf_optional) var additional_data_address = null, additional_data_length = 0; if (additional_data != undefined) { additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); additional_data_address = _to_allocated_buf_address(additional_data); additional_data_length = additional_data.length; address_pool.push(additional_data_address); } // ---------- input: public_nonce (buf) public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_npubbytes()) | 0; if (public_nonce.length !== public_nonce_length) { _free_and_throw_type_error(address_pool, "invalid public_nonce length"); } public_nonce_address = _to_allocated_buf_address(public_nonce); address_pool.push(public_nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output message (buf) var message_length = (ciphertext_length - libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, message = new AllocatedBuf(message_length), message_address = message.address; address_pool.push(message_address); if ((libsodium._crypto_aead_chacha20poly1305_decrypt(message_address, null, secret_nonce_address, ciphertext_address, ciphertext_length, 0, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { var ret = _format_output(message, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_aead_chacha20poly1305_encrypt(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: additional_data (unsized_buf_optional) var additional_data_address = null, additional_data_length = 0; if (additional_data != undefined) { additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); additional_data_address = _to_allocated_buf_address(additional_data); additional_data_length = additional_data.length; address_pool.push(additional_data_address); } // ---------- input: secret_nonce (unsized_buf_optional) var secret_nonce_address = null, secret_nonce_length = 0; if (secret_nonce != undefined) { secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); secret_nonce_address = _to_allocated_buf_address(secret_nonce); secret_nonce_length = secret_nonce.length; address_pool.push(secret_nonce_address); } // ---------- input: public_nonce (buf) public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_npubbytes()) | 0; if (public_nonce.length !== public_nonce_length) { _free_and_throw_type_error(address_pool, "invalid public_nonce length"); } public_nonce_address = _to_allocated_buf_address(public_nonce); address_pool.push(public_nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length + libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); if ((libsodium._crypto_aead_chacha20poly1305_encrypt(ciphertext_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { var ret = _format_output(ciphertext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_aead_chacha20poly1305_ietf_decrypt(secret_nonce, ciphertext, additional_data, public_nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: secret_nonce (unsized_buf_optional) var secret_nonce_address = null, secret_nonce_length = 0; if (secret_nonce != undefined) { secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); secret_nonce_address = _to_allocated_buf_address(secret_nonce); secret_nonce_length = secret_nonce.length; address_pool.push(secret_nonce_address); } // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: additional_data (unsized_buf_optional) var additional_data_address = null, additional_data_length = 0; if (additional_data != undefined) { additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); additional_data_address = _to_allocated_buf_address(additional_data); additional_data_length = additional_data.length; address_pool.push(additional_data_address); } // ---------- input: public_nonce (buf) public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_ietf_npubbytes()) | 0; if (public_nonce.length !== public_nonce_length) { _free_and_throw_type_error(address_pool, "invalid public_nonce length"); } public_nonce_address = _to_allocated_buf_address(public_nonce); address_pool.push(public_nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output message (buf) var message_length = (ciphertext_length - libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, message = new AllocatedBuf(message_length), message_address = message.address; address_pool.push(message_address); if ((libsodium._crypto_aead_chacha20poly1305_ietf_decrypt(message_address, null, secret_nonce_address, ciphertext_address, ciphertext_length, 0, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { var ret = _format_output(message, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_aead_chacha20poly1305_ietf_encrypt(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: additional_data (unsized_buf_optional) var additional_data_address = null, additional_data_length = 0; if (additional_data != undefined) { additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); additional_data_address = _to_allocated_buf_address(additional_data); additional_data_length = additional_data.length; address_pool.push(additional_data_address); } // ---------- input: secret_nonce (unsized_buf_optional) var secret_nonce_address = null, secret_nonce_length = 0; if (secret_nonce != undefined) { secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); secret_nonce_address = _to_allocated_buf_address(secret_nonce); secret_nonce_length = secret_nonce.length; address_pool.push(secret_nonce_address); } // ---------- input: public_nonce (buf) public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_ietf_npubbytes()) | 0; if (public_nonce.length !== public_nonce_length) { _free_and_throw_type_error(address_pool, "invalid public_nonce length"); } public_nonce_address = _to_allocated_buf_address(public_nonce); address_pool.push(public_nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length + libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); if ((libsodium._crypto_aead_chacha20poly1305_ietf_encrypt(ciphertext_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { var ret = _format_output(ciphertext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_auth(message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output tag (buf) var tag_length = (libsodium._crypto_auth_bytes()) | 0, tag = new AllocatedBuf(tag_length), tag_address = tag.address; address_pool.push(tag_address); if ((libsodium._crypto_auth(tag_address, message_address, message_length, 0, key_address) | 0) === 0) { var ret = _format_output(tag, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_auth_hmacsha256(message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_hmacsha256_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_auth_hmacsha256_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_auth_hmacsha256(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_auth_hmacsha256_verify(tag, message, key) { var address_pool = []; // ---------- input: tag (buf) tag = _any_to_Uint8Array(address_pool, tag, "tag"); var tag_address, tag_length = (libsodium._crypto_auth_hmacsha256_bytes()) | 0; if (tag.length !== tag_length) { _free_and_throw_type_error(address_pool, "invalid tag length"); } tag_address = _to_allocated_buf_address(tag); address_pool.push(tag_address); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_hmacsha256_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); var result = libsodium._crypto_auth_hmacsha256_verify(tag_address, message_address, message_length, 0, key_address) | 0; var ret = (result === 0); _free_all(address_pool); return ret; } function crypto_auth_hmacsha512(message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_hmacsha512_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_auth_hmacsha512_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_auth_hmacsha512(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_auth_hmacsha512_verify(tag, message, key) { var address_pool = []; // ---------- input: tag (buf) tag = _any_to_Uint8Array(address_pool, tag, "tag"); var tag_address, tag_length = (libsodium._crypto_auth_hmacsha512_bytes()) | 0; if (tag.length !== tag_length) { _free_and_throw_type_error(address_pool, "invalid tag length"); } tag_address = _to_allocated_buf_address(tag); address_pool.push(tag_address); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_hmacsha512_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); var result = libsodium._crypto_auth_hmacsha512_verify(tag_address, message_address, message_length, 0, key_address) | 0; var ret = (result === 0); _free_all(address_pool); return ret; } function crypto_auth_verify(tag, message, key) { var address_pool = []; // ---------- input: tag (buf) tag = _any_to_Uint8Array(address_pool, tag, "tag"); var tag_address, tag_length = (libsodium._crypto_auth_bytes()) | 0; if (tag.length !== tag_length) { _free_and_throw_type_error(address_pool, "invalid tag length"); } tag_address = _to_allocated_buf_address(tag); address_pool.push(tag_address); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_auth_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); var result = libsodium._crypto_auth_verify(tag_address, message_address, message_length, 0, key_address) | 0; var ret = (result === 0); _free_all(address_pool); return ret; } function crypto_box_beforenm(publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output sharedKey (buf) var sharedKey_length = (libsodium._crypto_box_beforenmbytes()) | 0, sharedKey = new AllocatedBuf(sharedKey_length), sharedKey_address = sharedKey.address; address_pool.push(sharedKey_address); if ((libsodium._crypto_box_beforenm(sharedKey_address, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output(sharedKey, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_detached(message, nonce, publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); // ---------- output mac (buf) var mac_length = (libsodium._crypto_box_macbytes()) | 0, mac = new AllocatedBuf(mac_length), mac_address = mac.address; address_pool.push(mac_address); if ((libsodium._crypto_box_detached(ciphertext_address, mac_address, message_address, message_length, 0, nonce_address, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output({ciphertext: ciphertext, mac: mac}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_easy(message, nonce, publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length + libsodium._crypto_box_macbytes()) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); if ((libsodium._crypto_box_easy(ciphertext_address, message_address, message_length, 0, nonce_address, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output(ciphertext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_easy_afternm(message, nonce, sharedKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: sharedKey (buf) sharedKey = _any_to_Uint8Array(address_pool, sharedKey, "sharedKey"); var sharedKey_address, sharedKey_length = (libsodium._crypto_box_beforenmbytes()) | 0; if (sharedKey.length !== sharedKey_length) { _free_and_throw_type_error(address_pool, "invalid sharedKey length"); } sharedKey_address = _to_allocated_buf_address(sharedKey); address_pool.push(sharedKey_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length + libsodium._crypto_box_macbytes()) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); if ((libsodium._crypto_box_easy_afternm(ciphertext_address, message_address, message_length, 0, nonce_address, sharedKey_address) | 0) === 0) { var ret = _format_output(ciphertext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_keypair(outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); // ---------- output secretKey (buf) var secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0, secretKey = new AllocatedBuf(secretKey_length), secretKey_address = secretKey.address; address_pool.push(secretKey_address); if ((libsodium._crypto_box_keypair(publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output({publicKey: publicKey, privateKey: secretKey, keyType: "curve25519"}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_open_detached(ciphertext, mac, nonce, publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: mac (buf) mac = _any_to_Uint8Array(address_pool, mac, "mac"); var mac_address, mac_length = (libsodium._crypto_box_macbytes()) | 0; if (mac.length !== mac_length) { _free_and_throw_type_error(address_pool, "invalid mac length"); } mac_address = _to_allocated_buf_address(mac); address_pool.push(mac_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output plaintext (buf) var plaintext_length = (ciphertext_length) | 0, plaintext = new AllocatedBuf(plaintext_length), plaintext_address = plaintext.address; address_pool.push(plaintext_address); if ((libsodium._crypto_box_open_detached(plaintext_address, ciphertext_address, mac_address, ciphertext_length, 0, nonce_address, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output(plaintext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_open_easy(ciphertext, nonce, publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output plaintext (buf) var plaintext_length = (ciphertext_length - libsodium._crypto_box_macbytes()) | 0, plaintext = new AllocatedBuf(plaintext_length), plaintext_address = plaintext.address; address_pool.push(plaintext_address); if ((libsodium._crypto_box_open_easy(plaintext_address, ciphertext_address, ciphertext_length, 0, nonce_address, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output(plaintext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_open_easy_afternm(ciphertext, nonce, sharedKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: sharedKey (buf) sharedKey = _any_to_Uint8Array(address_pool, sharedKey, "sharedKey"); var sharedKey_address, sharedKey_length = (libsodium._crypto_box_beforenmbytes()) | 0; if (sharedKey.length !== sharedKey_length) { _free_and_throw_type_error(address_pool, "invalid sharedKey length"); } sharedKey_address = _to_allocated_buf_address(sharedKey); address_pool.push(sharedKey_address); // ---------- output plaintext (buf) var plaintext_length = (ciphertext_length - libsodium._crypto_box_macbytes()) | 0, plaintext = new AllocatedBuf(plaintext_length), plaintext_address = plaintext.address; address_pool.push(plaintext_address); if ((libsodium._crypto_box_open_easy_afternm(plaintext_address, ciphertext_address, ciphertext_length, 0, nonce_address, sharedKey_address) | 0) === 0) { var ret = _format_output(plaintext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_seal(message, publicKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- output ciphertext (buf) var ciphertext_length = (message_length + libsodium._crypto_box_sealbytes()) | 0, ciphertext = new AllocatedBuf(ciphertext_length), ciphertext_address = ciphertext.address; address_pool.push(ciphertext_address); if ((libsodium._crypto_box_seal(ciphertext_address, message_address, message_length, 0, publicKey_address) | 0) === 0) { var ret = _format_output(ciphertext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_seal_open(ciphertext, publicKey, secretKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- input: secretKey (buf) secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); var secretKey_address, secretKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; if (secretKey.length !== secretKey_length) { _free_and_throw_type_error(address_pool, "invalid secretKey length"); } secretKey_address = _to_allocated_buf_address(secretKey); address_pool.push(secretKey_address); // ---------- output plaintext (buf) var plaintext_length = (ciphertext_length - libsodium._crypto_box_sealbytes()) | 0, plaintext = new AllocatedBuf(plaintext_length), plaintext_address = plaintext.address; address_pool.push(plaintext_address); if ((libsodium._crypto_box_seal_open(plaintext_address, ciphertext_address, ciphertext_length, 0, publicKey_address, secretKey_address) | 0) === 0) { var ret = _format_output(plaintext, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_box_seed_keypair(seed, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: seed (buf) seed = _any_to_Uint8Array(address_pool, seed, "seed"); var seed_address, seed_length = (libsodium._crypto_box_seedbytes()) | 0; if (seed.length !== seed_length) { _free_and_throw_type_error(address_pool, "invalid seed length"); } seed_address = _to_allocated_buf_address(seed); address_pool.push(seed_address); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); // ---------- output privateKey (buf) var privateKey_length = (libsodium._crypto_box_secretkeybytes()) | 0, privateKey = new AllocatedBuf(privateKey_length), privateKey_address = privateKey.address; address_pool.push(privateKey_address); if ((libsodium._crypto_box_seed_keypair(publicKey_address, privateKey_address, seed_address) | 0) === 0) { var ret = _format_output({publicKey: publicKey, privateKey: privateKey}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_generichash(hash_length, message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: hash_length (uint) _require_defined(address_pool, hash_length, "hash_length"); if (!(typeof hash_length === "number" && (hash_length | 0) === hash_length) && (hash_length | 0) > 0) { _free_and_throw_type_error(address_pool, "hash_length must be an unsigned integer"); } // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (unsized_buf_optional) var key_address = null, key_length = 0; if (key != undefined) { key = _any_to_Uint8Array(address_pool, key, "key"); key_address = _to_allocated_buf_address(key); key_length = key.length; address_pool.push(key_address); } // ---------- output hash (buf) var hash_length = (hash_length) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_generichash(hash_address, hash_length, message_address, message_length, 0, key_address, key_length) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_generichash_final(state_address, hash_length, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: state_address (generichash_state_address) _require_defined(address_pool, state_address, "state_address"); // ---------- input: hash_length (uint) _require_defined(address_pool, hash_length, "hash_length"); if (!(typeof hash_length === "number" && (hash_length | 0) === hash_length) && (hash_length | 0) > 0) { _free_and_throw_type_error(address_pool, "hash_length must be an unsigned integer"); } // ---------- output hash (buf) var hash_length = (hash_length) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_generichash_final(state_address, hash_address, hash_length) | 0) === 0) { var ret = (libsodium._free(state_address), _format_output(hash, outputFormat)); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_generichash_init(key, hash_length, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: key (unsized_buf_optional) var key_address = null, key_length = 0; if (key != undefined) { key = _any_to_Uint8Array(address_pool, key, "key"); key_address = _to_allocated_buf_address(key); key_length = key.length; address_pool.push(key_address); } // ---------- input: hash_length (uint) _require_defined(address_pool, hash_length, "hash_length"); if (!(typeof hash_length === "number" && (hash_length | 0) === hash_length) && (hash_length | 0) > 0) { _free_and_throw_type_error(address_pool, "hash_length must be an unsigned integer"); } // ---------- output state (generichash_state) var state_address = new AllocatedBuf(357).address; if ((libsodium._crypto_generichash_init(state_address, key_address, key_length, hash_length) | 0) === 0) { var ret = state_address; _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_generichash_update(state_address, message_chunk, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: state_address (generichash_state_address) _require_defined(address_pool, state_address, "state_address"); // ---------- input: message_chunk (unsized_buf) message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); var message_chunk_address = _to_allocated_buf_address(message_chunk), message_chunk_length = message_chunk.length; address_pool.push(message_chunk_address); if ((libsodium._crypto_generichash_update(state_address, message_chunk_address, message_chunk_length) | 0) === 0) { _free_all(address_pool); return; } _free_and_throw_error(address_pool); } function crypto_hash(message, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_hash_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_hash(hash_address, message_address, message_length, 0) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_hash_sha256(message, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_hash_sha256_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_hash_sha256(hash_address, message_address, message_length, 0) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_hash_sha512(message, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_hash_sha512_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_hash_sha512(hash_address, message_address, message_length, 0) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_onetimeauth(message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_onetimeauth_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_onetimeauth_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_onetimeauth(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_onetimeauth_final(state_address, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: state_address (onetimeauth_state_address) _require_defined(address_pool, state_address, "state_address"); // ---------- output hash (buf) var hash_length = (libsodium._crypto_onetimeauth_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_onetimeauth_final(state_address, hash_address) | 0) === 0) { var ret = (libsodium._free(state_address), _format_output(hash, outputFormat)); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_onetimeauth_init(key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: key (unsized_buf_optional) var key_address = null, key_length = 0; if (key != undefined) { key = _any_to_Uint8Array(address_pool, key, "key"); key_address = _to_allocated_buf_address(key); key_length = key.length; address_pool.push(key_address); } // ---------- output state (onetimeauth_state) var state_address = new AllocatedBuf(144).address; if ((libsodium._crypto_onetimeauth_init(state_address, key_address) | 0) === 0) { var ret = state_address; _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_onetimeauth_update(state_address, message_chunk, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: state_address (onetimeauth_state_address) _require_defined(address_pool, state_address, "state_address"); // ---------- input: message_chunk (unsized_buf) message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); var message_chunk_address = _to_allocated_buf_address(message_chunk), message_chunk_length = message_chunk.length; address_pool.push(message_chunk_address); if ((libsodium._crypto_onetimeauth_update(state_address, message_chunk_address, message_chunk_length) | 0) === 0) { _free_all(address_pool); return; } _free_and_throw_error(address_pool); } function crypto_onetimeauth_verify(hash, message, key) { var address_pool = []; // ---------- input: hash (buf) hash = _any_to_Uint8Array(address_pool, hash, "hash"); var hash_address, hash_length = (libsodium._crypto_onetimeauth_bytes()) | 0; if (hash.length !== hash_length) { _free_and_throw_type_error(address_pool, "invalid hash length"); } hash_address = _to_allocated_buf_address(hash); address_pool.push(hash_address); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_onetimeauth_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); var result = libsodium._crypto_onetimeauth_verify(hash_address, message_address, message_length, 0, key_address) | 0; var ret = (result === 0); _free_all(address_pool); return ret; } function crypto_pwhash_scryptsalsa208sha256(password, salt, opsLimit, memLimit, keyLength, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: password (unsized_buf) password = _any_to_Uint8Array(address_pool, password, "password"); var password_address = _to_allocated_buf_address(password), password_length = password.length; address_pool.push(password_address); // ---------- input: salt (buf) salt = _any_to_Uint8Array(address_pool, salt, "salt"); var salt_address, salt_length = (libsodium._crypto_pwhash_scryptsalsa208sha256_saltbytes()) | 0; if (salt.length !== salt_length) { _free_and_throw_type_error(address_pool, "invalid salt length"); } salt_address = _to_allocated_buf_address(salt); address_pool.push(salt_address); // ---------- input: opsLimit (uint) _require_defined(address_pool, opsLimit, "opsLimit"); if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) && (opsLimit | 0) > 0) { _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); } // ---------- input: memLimit (uint) _require_defined(address_pool, memLimit, "memLimit"); if (!(typeof memLimit === "number" && (memLimit | 0) === memLimit) && (memLimit | 0) > 0) { _free_and_throw_type_error(address_pool, "memLimit must be an unsigned integer"); } // ---------- input: keyLength (uint) _require_defined(address_pool, keyLength, "keyLength"); if (!(typeof keyLength === "number" && (keyLength | 0) === keyLength) && (keyLength | 0) > 0) { _free_and_throw_type_error(address_pool, "keyLength must be an unsigned integer"); } // ---------- output derivedKey (buf) var derivedKey_length = (keyLength) | 0, derivedKey = new AllocatedBuf(derivedKey_length), derivedKey_address = derivedKey.address; address_pool.push(derivedKey_address); if ((libsodium._crypto_pwhash_scryptsalsa208sha256(derivedKey_address, keyLength, 0, password_address, password_length, 0, salt_address, opsLimit, 0, memLimit) | 0) === 0) { var ret = _format_output(derivedKey, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_pwhash_scryptsalsa208sha256_ll(password, salt, opsLimit, r, p, keyLength, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: password (unsized_buf) password = _any_to_Uint8Array(address_pool, password, "password"); var password_address = _to_allocated_buf_address(password), password_length = password.length; address_pool.push(password_address); // ---------- input: salt (unsized_buf) salt = _any_to_Uint8Array(address_pool, salt, "salt"); var salt_address = _to_allocated_buf_address(salt), salt_length = salt.length; address_pool.push(salt_address); // ---------- input: opsLimit (uint) _require_defined(address_pool, opsLimit, "opsLimit"); if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) && (opsLimit | 0) > 0) { _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); } // ---------- input: r (uint) _require_defined(address_pool, r, "r"); if (!(typeof r === "number" && (r | 0) === r) && (r | 0) > 0) { _free_and_throw_type_error(address_pool, "r must be an unsigned integer"); } // ---------- input: p (uint) _require_defined(address_pool, p, "p"); if (!(typeof p === "number" && (p | 0) === p) && (p | 0) > 0) { _free_and_throw_type_error(address_pool, "p must be an unsigned integer"); } // ---------- input: keyLength (uint) _require_defined(address_pool, keyLength, "keyLength"); if (!(typeof keyLength === "number" && (keyLength | 0) === keyLength) && (keyLength | 0) > 0) { _free_and_throw_type_error(address_pool, "keyLength must be an unsigned integer"); } // ---------- output derivedKey (buf) var derivedKey_length = (keyLength) | 0, derivedKey = new AllocatedBuf(derivedKey_length), derivedKey_address = derivedKey.address; address_pool.push(derivedKey_address); if ((libsodium._crypto_pwhash_scryptsalsa208sha256_ll(password_address, password_length, salt_address, salt_length, opsLimit, 0, r, p, derivedKey_address, keyLength) | 0) === 0) { var ret = _format_output(derivedKey, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_pwhash_scryptsalsa208sha256_str(password, opsLimit, memLimit, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: password (unsized_buf) password = _any_to_Uint8Array(address_pool, password, "password"); var password_address = _to_allocated_buf_address(password), password_length = password.length; address_pool.push(password_address); // ---------- input: opsLimit (uint) _require_defined(address_pool, opsLimit, "opsLimit"); if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) && (opsLimit | 0) > 0) { _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); } // ---------- input: memLimit (uint) _require_defined(address_pool, memLimit, "memLimit"); if (!(typeof memLimit === "number" && (memLimit | 0) === memLimit) && (memLimit | 0) > 0) { _free_and_throw_type_error(address_pool, "memLimit must be an unsigned integer"); } // ---------- output hashed_password (buf) var hashed_password_length = (libsodium._crypto_pwhash_scryptsalsa208sha256_strbytes()) | 0, hashed_password = new AllocatedBuf(hashed_password_length), hashed_password_address = hashed_password.address; address_pool.push(hashed_password_address); if ((libsodium._crypto_pwhash_scryptsalsa208sha256_str(hashed_password_address, password_address, password_length, 0, opsLimit, 0, memLimit) | 0) === 0) { var ret = libsodium.Pointer_stringify(hashed_password_address); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_pwhash_scryptsalsa208sha256_str_verify(hashed_password, password, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: hashed_password (string) hashed_password = from_string(hashed_password + "\0"); var hashed_password_address = _to_allocated_buf_address(hashed_password), hashed_password_length = hashed_password.length - 1; address_pool.push(hashed_password_address); // ---------- input: password (unsized_buf) password = _any_to_Uint8Array(address_pool, password, "password"); var password_address = _to_allocated_buf_address(password), password_length = password.length; address_pool.push(password_address); var result = libsodium._crypto_pwhash_scryptsalsa208sha256_str_verify(hashed_password_address, password_address, password_length, 0) | 0; var ret = (result === 0); _free_all(address_pool); return ret; } function crypto_scalarmult(privateKey, publicKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- output sharedSecret (buf) var sharedSecret_length = (libsodium._crypto_scalarmult_bytes()) | 0, sharedSecret = new AllocatedBuf(sharedSecret_length), sharedSecret_address = sharedSecret.address; address_pool.push(sharedSecret_address); if ((libsodium._crypto_scalarmult(sharedSecret_address, privateKey_address, publicKey_address) | 0) === 0) { var ret = _format_output(sharedSecret, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_scalarmult_base(privateKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); if ((libsodium._crypto_scalarmult_base(publicKey_address, privateKey_address) | 0) === 0) { var ret = _format_output(publicKey, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_secretbox_detached(message, nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output cipher (buf) var cipher_length = (message_length) | 0, cipher = new AllocatedBuf(cipher_length), cipher_address = cipher.address; address_pool.push(cipher_address); // ---------- output mac (buf) var mac_length = (libsodium._crypto_secretbox_macbytes()) | 0, mac = new AllocatedBuf(mac_length), mac_address = mac.address; address_pool.push(mac_address); if ((libsodium._crypto_secretbox_detached(cipher_address, mac_address, message_address, message_length, 0, nonce_address, key_address) | 0) === 0) { var ret = _format_output({mac: mac, cipher: cipher}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_secretbox_easy(message, nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output cipher (buf) var cipher_length = (message_length + libsodium._crypto_secretbox_macbytes()) | 0, cipher = new AllocatedBuf(cipher_length), cipher_address = cipher.address; address_pool.push(cipher_address); if ((libsodium._crypto_secretbox_easy(cipher_address, message_address, message_length, 0, nonce_address, key_address) | 0) === 0) { var ret = _format_output(cipher, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_secretbox_open_detached(ciphertext, mac, nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: mac (buf) mac = _any_to_Uint8Array(address_pool, mac, "mac"); var mac_address, mac_length = (libsodium._crypto_secretbox_macbytes()) | 0; if (mac.length !== mac_length) { _free_and_throw_type_error(address_pool, "invalid mac length"); } mac_address = _to_allocated_buf_address(mac); address_pool.push(mac_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output message (buf) var message_length = (ciphertext_length) | 0, message = new AllocatedBuf(message_length), message_address = message.address; address_pool.push(message_address); if ((libsodium._crypto_secretbox_open_detached(message_address, ciphertext_address, mac_address, ciphertext_length, 0, nonce_address, key_address) | 0) === 0) { var ret = _format_output(message, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_secretbox_open_easy(ciphertext, nonce, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: ciphertext (unsized_buf) ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); var ciphertext_address = _to_allocated_buf_address(ciphertext), ciphertext_length = ciphertext.length; address_pool.push(ciphertext_address); // ---------- input: nonce (buf) nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; if (nonce.length !== nonce_length) { _free_and_throw_type_error(address_pool, "invalid nonce length"); } nonce_address = _to_allocated_buf_address(nonce); address_pool.push(nonce_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output message (buf) var message_length = (ciphertext_length - libsodium._crypto_secretbox_macbytes()) | 0, message = new AllocatedBuf(message_length), message_address = message.address; address_pool.push(message_address); if ((libsodium._crypto_secretbox_open_easy(message_address, ciphertext_address, ciphertext_length, 0, nonce_address, key_address) | 0) === 0) { var ret = _format_output(message, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_shorthash(message, key, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: key (buf) key = _any_to_Uint8Array(address_pool, key, "key"); var key_address, key_length = (libsodium._crypto_shorthash_keybytes()) | 0; if (key.length !== key_length) { _free_and_throw_type_error(address_pool, "invalid key length"); } key_address = _to_allocated_buf_address(key); address_pool.push(key_address); // ---------- output hash (buf) var hash_length = (libsodium._crypto_shorthash_bytes()) | 0, hash = new AllocatedBuf(hash_length), hash_address = hash.address; address_pool.push(hash_address); if ((libsodium._crypto_shorthash(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { var ret = _format_output(hash, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign(message, privateKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- output signature (buf) var signature_length = (message.length + libsodium._crypto_sign_bytes()) | 0, signature = new AllocatedBuf(signature_length), signature_address = signature.address; address_pool.push(signature_address); if ((libsodium._crypto_sign(signature_address, null, message_address, message_length, 0, privateKey_address) | 0) === 0) { var ret = _format_output(signature, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_detached(message, privateKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- output signature (buf) var signature_length = (libsodium._crypto_sign_bytes()) | 0, signature = new AllocatedBuf(signature_length), signature_address = signature.address; address_pool.push(signature_address); if ((libsodium._crypto_sign_detached(signature_address, null, message_address, message_length, 0, privateKey_address) | 0) === 0) { var ret = _format_output(signature, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_ed25519_pk_to_curve25519(edPk, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: edPk (buf) edPk = _any_to_Uint8Array(address_pool, edPk, "edPk"); var edPk_address, edPk_length = (libsodium._crypto_sign_publickeybytes()) | 0; if (edPk.length !== edPk_length) { _free_and_throw_type_error(address_pool, "invalid edPk length"); } edPk_address = _to_allocated_buf_address(edPk); address_pool.push(edPk_address); // ---------- output cPk (buf) var cPk_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0, cPk = new AllocatedBuf(cPk_length), cPk_address = cPk.address; address_pool.push(cPk_address); if ((libsodium._crypto_sign_ed25519_pk_to_curve25519(cPk_address, edPk_address) | 0) === 0) { var ret = _format_output(cPk, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_ed25519_sk_to_curve25519(edSk, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: edSk (buf) edSk = _any_to_Uint8Array(address_pool, edSk, "edSk"); var edSk_address, edSk_length = (libsodium._crypto_sign_secretkeybytes()) | 0; if (edSk.length !== edSk_length) { _free_and_throw_type_error(address_pool, "invalid edSk length"); } edSk_address = _to_allocated_buf_address(edSk); address_pool.push(edSk_address); // ---------- output cSk (buf) var cSk_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0, cSk = new AllocatedBuf(cSk_length), cSk_address = cSk.address; address_pool.push(cSk_address); if ((libsodium._crypto_sign_ed25519_sk_to_curve25519(cSk_address, edSk_address) | 0) === 0) { var ret = _format_output(cSk, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_ed25519_sk_to_pk(privateKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); if ((libsodium._crypto_sign_ed25519_sk_to_pk(publicKey_address, privateKey_address) | 0) === 0) { var ret = _format_output(publicKey, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_ed25519_sk_to_seed(privateKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: privateKey (buf) privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; if (privateKey.length !== privateKey_length) { _free_and_throw_type_error(address_pool, "invalid privateKey length"); } privateKey_address = _to_allocated_buf_address(privateKey); address_pool.push(privateKey_address); // ---------- output seed (buf) var seed_length = (libsodium._crypto_sign_seedbytes()) | 0, seed = new AllocatedBuf(seed_length), seed_address = seed.address; address_pool.push(seed_address); if ((libsodium._crypto_sign_ed25519_sk_to_seed(seed_address, privateKey_address) | 0) === 0) { var ret = _format_output(seed, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_keypair(outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); // ---------- output privateKey (buf) var privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0, privateKey = new AllocatedBuf(privateKey_length), privateKey_address = privateKey.address; address_pool.push(privateKey_address); if ((libsodium._crypto_sign_keypair(publicKey_address, privateKey_address) | 0) === 0) { var ret = _format_output({publicKey: publicKey, privateKey: privateKey, keyType: 'ed25519'}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_open(signedMessage, publicKey, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: signedMessage (unsized_buf) signedMessage = _any_to_Uint8Array(address_pool, signedMessage, "signedMessage"); var signedMessage_address = _to_allocated_buf_address(signedMessage), signedMessage_length = signedMessage.length; address_pool.push(signedMessage_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); // ---------- output message (buf) var message_length = (signedMessage_length - libsodium._crypto_sign_bytes()) | 0, message = new AllocatedBuf(message_length), message_address = message.address; address_pool.push(message_address); if ((libsodium._crypto_sign_open(message_address, null, signedMessage_address, signedMessage_length, 0, publicKey_address) | 0) === 0) { var ret = _format_output(message, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_seed_keypair(seed, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: seed (buf) seed = _any_to_Uint8Array(address_pool, seed, "seed"); var seed_address, seed_length = (libsodium._crypto_sign_seedbytes()) | 0; if (seed.length !== seed_length) { _free_and_throw_type_error(address_pool, "invalid seed length"); } seed_address = _to_allocated_buf_address(seed); address_pool.push(seed_address); // ---------- output publicKey (buf) var publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0, publicKey = new AllocatedBuf(publicKey_length), publicKey_address = publicKey.address; address_pool.push(publicKey_address); // ---------- output privateKey (buf) var privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0, privateKey = new AllocatedBuf(privateKey_length), privateKey_address = privateKey.address; address_pool.push(privateKey_address); if ((libsodium._crypto_sign_seed_keypair(publicKey_address, privateKey_address, seed_address) | 0) === 0) { var ret = _format_output({publicKey: publicKey, privateKey: privateKey, keyType: "ed25519"}, outputFormat); _free_all(address_pool); return ret; } _free_and_throw_error(address_pool); } function crypto_sign_verify_detached(signature, message, publicKey) { var address_pool = []; // ---------- input: signature (buf) signature = _any_to_Uint8Array(address_pool, signature, "signature"); var signature_address, signature_length = (libsodium._crypto_sign_bytes()) | 0; if (signature.length !== signature_length) { _free_and_throw_type_error(address_pool, "invalid signature length"); } signature_address = _to_allocated_buf_address(signature); address_pool.push(signature_address); // ---------- input: message (unsized_buf) message = _any_to_Uint8Array(address_pool, message, "message"); var message_address = _to_allocated_buf_address(message), message_length = message.length; address_pool.push(message_address); // ---------- input: publicKey (buf) publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); var publicKey_address, publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0; if (publicKey.length !== publicKey_length) { _free_and_throw_type_error(address_pool, "invalid publicKey length"); } publicKey_address = _to_allocated_buf_address(publicKey); address_pool.push(publicKey_address); var verificationResult = libsodium._crypto_sign_verify_detached(signature_address, message_address, message_length, 0, publicKey_address) | 0; var ret = (verificationResult === 0); _free_all(address_pool); return ret; } function randombytes_buf(length, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: length (uint) _require_defined(address_pool, length, "length"); if (!(typeof length === "number" && (length | 0) === length) && (length | 0) > 0) { _free_and_throw_type_error(address_pool, "length must be an unsigned integer"); } // ---------- output output (buf) var output_length = (length) | 0, output = new AllocatedBuf(output_length), output_address = output.address; address_pool.push(output_address); libsodium._randombytes_buf(output_address, length); var ret = (_format_output(output, outputFormat)); _free_all(address_pool); return ret; } function randombytes_close(outputFormat) { var address_pool = []; _check_output_format(outputFormat); libsodium._randombytes_close(); } function randombytes_random(outputFormat) { var address_pool = []; _check_output_format(outputFormat); var random_value = libsodium._randombytes_random() >>> 0; var ret = (random_value); _free_all(address_pool); return ret; } function randombytes_set_implementation(implementation, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: implementation (randombytes_implementation) var implementation_address = libsodium._malloc(6 * 4); for (var i = 0; i < 6; i++) { libsodium.setValue(implementation_address + i * 4, libsodium.Runtime.addFunction(implementation [["implementation_name", "random", "stir", "uniform", "buf", "close"][i]]), "i32"); } if ((libsodium._randombytes_set_implementation(implementation_address) | 0) === 0) { _free_all(address_pool); return; } _free_and_throw_error(address_pool); } function randombytes_stir(outputFormat) { var address_pool = []; _check_output_format(outputFormat); libsodium._randombytes_stir(); } function randombytes_uniform(upper_bound, outputFormat) { var address_pool = []; _check_output_format(outputFormat); // ---------- input: upper_bound (uint) _require_defined(address_pool, upper_bound, "upper_bound"); if (!(typeof upper_bound === "number" && (upper_bound | 0) === upper_bound) && (upper_bound | 0) > 0) { _free_and_throw_type_error(address_pool, "upper_bound must be an unsigned integer"); } var random_value = libsodium._randombytes_uniform(upper_bound) >>> 0; var ret = (random_value); _free_all(address_pool); return ret; } function sodium_version_string() { var address_pool = []; var version = libsodium._sodium_version_string(); var ret = (libsodium.Pointer_stringify(version)); _free_all(address_pool); return ret; } exports.compare = compare; exports.from_base64 = from_base64; exports.from_hex = from_hex; exports.from_string = from_string; exports.increment = increment; exports.libsodium = libsodium; exports.memcmp = memcmp; exports.memzero = memzero; exports.output_formats = output_formats; exports.symbols = symbols; exports.to_base64 = to_base64; exports.to_hex = to_hex; exports.to_string = to_string; var exported_functions = ["crypto_aead_chacha20poly1305_decrypt", "crypto_aead_chacha20poly1305_encrypt", "crypto_aead_chacha20poly1305_ietf_decrypt", "crypto_aead_chacha20poly1305_ietf_encrypt", "crypto_auth", "crypto_auth_hmacsha256", "crypto_auth_hmacsha256_verify", "crypto_auth_hmacsha512", "crypto_auth_hmacsha512_verify", "crypto_auth_verify", "crypto_box_beforenm", "crypto_box_detached", "crypto_box_easy", "crypto_box_easy_afternm", "crypto_box_keypair", "crypto_box_open_detached", "crypto_box_open_easy", "crypto_box_open_easy_afternm", "crypto_box_seal", "crypto_box_seal_open", "crypto_box_seed_keypair", "crypto_generichash", "crypto_generichash_final", "crypto_generichash_init", "crypto_generichash_update", "crypto_hash", "crypto_hash_sha256", "crypto_hash_sha512", "crypto_onetimeauth", "crypto_onetimeauth_final", "crypto_onetimeauth_init", "crypto_onetimeauth_update", "crypto_onetimeauth_verify", "crypto_pwhash_scryptsalsa208sha256", "crypto_pwhash_scryptsalsa208sha256_ll", "crypto_pwhash_scryptsalsa208sha256_str", "crypto_pwhash_scryptsalsa208sha256_str_verify", "crypto_scalarmult", "crypto_scalarmult_base", "crypto_secretbox_detached", "crypto_secretbox_easy", "crypto_secretbox_open_detached", "crypto_secretbox_open_easy", "crypto_shorthash", "crypto_sign", "crypto_sign_detached", "crypto_sign_ed25519_pk_to_curve25519", "crypto_sign_ed25519_sk_to_curve25519", "crypto_sign_ed25519_sk_to_pk", "crypto_sign_ed25519_sk_to_seed", "crypto_sign_keypair", "crypto_sign_open", "crypto_sign_seed_keypair", "crypto_sign_verify_detached", "randombytes_buf", "randombytes_close", "randombytes_random", "randombytes_set_implementation", "randombytes_stir", "randombytes_uniform", "sodium_version_string"], functions = [crypto_aead_chacha20poly1305_decrypt, crypto_aead_chacha20poly1305_encrypt, crypto_aead_chacha20poly1305_ietf_decrypt, crypto_aead_chacha20poly1305_ietf_encrypt, crypto_auth, crypto_auth_hmacsha256, crypto_auth_hmacsha256_verify, crypto_auth_hmacsha512, crypto_auth_hmacsha512_verify, crypto_auth_verify, crypto_box_beforenm, crypto_box_detached, crypto_box_easy, crypto_box_easy_afternm, crypto_box_keypair, crypto_box_open_detached, crypto_box_open_easy, crypto_box_open_easy_afternm, crypto_box_seal, crypto_box_seal_open, crypto_box_seed_keypair, crypto_generichash, crypto_generichash_final, crypto_generichash_init, crypto_generichash_update, crypto_hash, crypto_hash_sha256, crypto_hash_sha512, crypto_onetimeauth, crypto_onetimeauth_final, crypto_onetimeauth_init, crypto_onetimeauth_update, crypto_onetimeauth_verify, crypto_pwhash_scryptsalsa208sha256, crypto_pwhash_scryptsalsa208sha256_ll, crypto_pwhash_scryptsalsa208sha256_str, crypto_pwhash_scryptsalsa208sha256_str_verify, crypto_scalarmult, crypto_scalarmult_base, crypto_secretbox_detached, crypto_secretbox_easy, crypto_secretbox_open_detached, crypto_secretbox_open_easy, crypto_shorthash, crypto_sign, crypto_sign_detached, crypto_sign_ed25519_pk_to_curve25519, crypto_sign_ed25519_sk_to_curve25519, crypto_sign_ed25519_sk_to_pk, crypto_sign_ed25519_sk_to_seed, crypto_sign_keypair, crypto_sign_open, crypto_sign_seed_keypair, crypto_sign_verify_detached, randombytes_buf, randombytes_close, randombytes_random, randombytes_set_implementation, randombytes_stir, randombytes_uniform, sodium_version_string]; for (var i = 0; i < functions.length; i++) { if (typeof libsodium["_" + exported_functions[i]] === "function") { exports[exported_functions[i]] = functions[i]; } } var constants = ["SODIUM_LIBRARY_VERSION_MAJOR", "SODIUM_LIBRARY_VERSION_MINOR", "crypto_aead_chacha20poly1305_ABYTES", "crypto_aead_chacha20poly1305_KEYBYTES", "crypto_aead_chacha20poly1305_NPUBBYTES", "crypto_aead_chacha20poly1305_NSECBYTES", "crypto_aead_chacha20poly1305_ietf_NPUBBYTES", "crypto_auth_BYTES", "crypto_auth_KEYBYTES", "crypto_auth_hmacsha256_BYTES", "crypto_auth_hmacsha256_KEYBYTES", "crypto_auth_hmacsha512_BYTES", "crypto_auth_hmacsha512_KEYBYTES", "crypto_box_BEFORENMBYTES", "crypto_box_MACBYTES", "crypto_box_NONCEBYTES", "crypto_box_PUBLICKEYBYTES", "crypto_box_SEALBYTES", "crypto_box_SECRETKEYBYTES", "crypto_box_SEEDBYTES", "crypto_generichash_BYTES", "crypto_generichash_BYTES_MAX", "crypto_generichash_BYTES_MIN", "crypto_generichash_KEYBYTES", "crypto_generichash_KEYBYTES_MAX", "crypto_generichash_KEYBYTES_MIN", "crypto_hash_BYTES", "crypto_onetimeauth_BYTES", "crypto_onetimeauth_KEYBYTES", "crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE", "crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE", "crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE", "crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE", "crypto_pwhash_scryptsalsa208sha256_SALTBYTES", "crypto_pwhash_scryptsalsa208sha256_STRBYTES", "crypto_pwhash_scryptsalsa208sha256_STR_VERIFY", "crypto_scalarmult_BYTES", "crypto_scalarmult_SCALARBYTES", "crypto_secretbox_KEYBYTES", "crypto_secretbox_MACBYTES", "crypto_secretbox_NONCEBYTES", "crypto_shorthash_BYTES", "crypto_shorthash_KEYBYTES", "crypto_sign_BYTES", "crypto_sign_PUBLICKEYBYTES", "crypto_sign_SECRETKEYBYTES", "crypto_sign_SEEDBYTES"]; for (var i = 0; i < constants.length; i++) { var raw = libsodium["_" + constants[i].toLowerCase()]; if (typeof raw === "function") exports[constants[i]] = raw()|0; } var constants_str = ["SODIUM_VERSION_STRING", "crypto_pwhash_scryptsalsa208sha256_STRPREFIX"]; for (var i = 0; i < constants_str.length; i++) { var raw = libsodium["_" + constants_str[i].toLowerCase()]; if (typeof raw === "function") exports[constants_str[i]] = libsodium.Pointer_stringify(raw()); } return exports; })); }).call(this,require('_process')) },{"_process":295,"libsodium":223}],223:[function(require,module,exports){ (function (process,Buffer,__dirname){ (function (root, factory) { if (typeof define === "function" && define.amd) { define(["exports"], factory); } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { factory(exports); } else { factory(root.libsodium = {}); } })(this, function (exports) { "use strict"; var Module = exports; Object.defineProperty(exports, '__esModule', { value: true }); var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){throw"NO_DYNAMIC_EXECUTION was set, cannot eval"}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[null,null,null,null,null,null,null,null],addFunction:(function(func){for(var i=0;i=TOTAL_MEMORY){var success=enlargeMemory();if(!success){DYNAMICTOP=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var __THREW__=0;var ABORT=false;var EXITSTATUS=0;var undef=0;var tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat;var tempI64,tempI64b;var tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var globalScope=this;function getCFunc(ident){var func=Module["_"+ident];if(!func){abort("NO_DYNAMIC_EXECUTION was set, cannot eval - ccall/cwrap are not functional")}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=Runtime.stackAlloc((str.length<<2)+1);writeStringToMemory(str,ret)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;function UTF8ArrayToString(u8Array,idx){var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;function UTF16ToString(ptr){var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}Module["UTF16ToString"]=UTF16ToString;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}Module["stringToUTF16"]=stringToUTF16;function lengthBytesUTF16(str){return str.length*2}Module["lengthBytesUTF16"]=lengthBytesUTF16;function UTF32ToString(ptr){var i=0;var str="";while(1){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)return str;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}Module["UTF32ToString"]=UTF32ToString;function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}Module["stringToUTF32"]=stringToUTF32;function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}Module["lengthBytesUTF32"]=lengthBytesUTF32;function demangle(func){var hasLibcxxabi=!!Module["___cxa_demangle"];if(hasLibcxxabi){try{var buf=_malloc(func.length);writeStringToMemory(func.substr(1),buf);var status=_malloc(4);var ret=Module["___cxa_demangle"](buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}}var i=3;var basicTypes={"v":"void","b":"bool","c":"char","s":"short","i":"int","l":"long","f":"float","d":"double","w":"wchar_t","a":"signed char","h":"unsigned char","t":"unsigned short","j":"unsigned int","m":"unsigned long","x":"long long","y":"unsigned long long","z":"..."};var subs=[];var first=true;function dump(x){if(x)Module.print(x);Module.print(func);var pre="";for(var a=0;a"}else{ret=name}paramLoop:while(i0){var c=func[i++];if(c in basicTypes){list.push(basicTypes[c])}else{switch(c){case"P":list.push(parse(true,1,true)[0]+"*");break;case"R":list.push(parse(true,1,true)[0]+"&");break;case"L":{i++;var end=func.indexOf("E",i);var size=end-i;list.push(func.substr(i,size));i+=size+2;break};case"A":{var size=parseInt(func.substr(i));i+=size.toString().length;if(func[i]!=="_")throw"?";i++;list.push(parse(true,1,true)[0]+" ["+size+"]");break};case"E":break paramLoop;default:ret+="?"+c;break paramLoop}}}if(!allowVoid&&list.length===1&&list[0]==="void")list=[];if(rawList){if(ret){list.push(ret+"?")}return list}else{return ret+flushList()}}var parsed=func;try{if(func=="Object._main"||func=="_main"){return"main()"}if(typeof func==="number")func=Pointer_stringify(func);if(func[0]!=="_")return func;if(func[1]!=="_")return func;if(func[2]!=="Z")return func;switch(func[3]){case"n":return"operator new()";case"d":return"operator delete()"}parsed=parse()}catch(e){parsed+="?"}if(parsed.indexOf("?")>=0&&!hasLibcxxabi){Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling")}return parsed}function demangleAll(text){return text.replace(/__Z[\w\d_]+/g,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module["stackTrace"]=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(x){if(x%4096>0){x+=4096-x%4096}return x}var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var STATIC_BASE=0,STATICTOP=0,staticSealed=false;var STACK_BASE=0,STACKTOP=0,STACK_MAX=0;var DYNAMIC_BASE=0,DYNAMICTOP=0;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||33554432;var totalMemory=64*1024;while(totalMemory0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Runtime.dynCall("v",func)}else{Runtime.dynCall("vi",func,[callback.arg])}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){var array=intArrayFromString(string,dontAddNull);var i=0;while(i>0]=chr;i=i+1}}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){for(var i=0;i>0]=array[i]}}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;function unSign(value,bits,ignore){if(value>=0){return value}return bits<=32?2*Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_min=Math.min;var Math_clz32=Math.clz32;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var ASM_CONSTS=[(function(){{return Module.getRandomValue()}}),(function(){{if(Module.getRandomValue===undefined){try{var window_="object"===typeof window?window:self,crypto_=typeof window_.crypto!=="undefined"?window_.crypto:window_.msCrypto,randomValuesStandard=(function(){var buf=new Uint32Array(1);crypto_.getRandomValues(buf);return buf[0]>>>0});randomValuesStandard();Module.getRandomValue=randomValuesStandard}catch(e){try{var crypto=require("crypto"),randomValueNodeJS=(function(){var buf=crypto.randomBytes(4);return(buf[0]<<24|buf[1]<<16|buf[2]<<8|buf[3])>>>0});randomValueNodeJS();Module.getRandomValue=randomValueNodeJS}catch(e){throw"No secure random number generator found"}}}}})];function _emscripten_asm_const_0(code){return ASM_CONSTS[code]()}STATIC_BASE=8;STATICTOP=STATIC_BASE+34944;__ATINIT__.push();allocate([8,201,188,243,103,230,9,106,59,167,202,132,133,174,103,187,43,248,148,254,114,243,110,60,241,54,29,95,58,245,79,165,209,130,230,173,127,82,14,81,31,108,62,43,140,104,5,155,107,189,65,251,171,217,131,31,121,33,126,19,25,205,224,91,103,230,9,106,133,174,103,187,114,243,110,60,58,245,79,165,127,82,14,81,140,104,5,155,171,217,131,31,25,205,224,91,133,59,140,1,189,241,36,255,248,37,195,1,96,220,55,0,183,76,62,255,195,66,61,0,50,76,164,1,225,164,76,255,76,61,163,255,117,62,31,0,81,145,64,255,118,65,14,0,162,115,214,255,6,138,46,0,124,230,244,255,10,138,143,0,52,26,194,0,184,244,76,0,129,143,41,1,190,244,19,255,123,170,122,255,98,129,68,0,121,213,147,0,86,101,30,255,161,103,155,0,140,89,67,255,239,229,190,1,67,11,181,0,198,240,137,254,238,69,188,255,67,151,238,0,19,42,108,255,229,85,113,1,50,68,135,255,17,106,9,0,50,103,1,255,80,1,168,1,35,152,30,255,16,168,185,1,56,89,232,255,101,210,252,0,41,250,71,0,204,170,79,255,14,46,239,255,80,77,239,0,189,214,75,255,17,141,249,0,38,80,76,255,190,85,117,0,86,228,170,0,156,216,208,1,195,207,164,255,150,66,76,255,175,225,16,255,141,80,98,1,76,219,242,0,198,162,114,0,46,218,152,0,155,43,241,254,155,160,104,255,51,187,165,0,2,17,175,0,66,84,160,1,247,58,30,0,35,65,53,254,69,236,191,0,45,134,245,1,163,123,221,0,32,110,20,255,52,23,165,0,186,214,71,0,233,176,96,0,242,239,54,1,57,89,138,0,83,0,84,255,136,160,100,0,92,142,120,254,104,124,190,0,181,177,62,255,250,41,85,0,152,130,42,1,96,252,246,0,151,151,63,254,239,133,62,0,32,56,156,0,45,167,189,255,142,133,179,1,131,86,211,0,187,179,150,254,250,170,14,255,210,163,78,0,37,52,151,0,99,77,26,0,238,156,213,255,213,192,209,1,73,46,84,0,20,65,41,1,54,206,79,0,201,131,146,254,170,111,24,255,177,33,50,254,171,38,203,255,78,247,116,0,209,221,153,0,133,128,178,1,58,44,25,0,201,39,59,1,189,19,252,0,49,229,210,1,117,187,117,0,181,179,184,1,0,114,219,0,48,94,147,0,245,41,56,0,125,13,204,254,244,173,119,0,44,221,32,254,84,234,20,0,249,160,198,1,236,126,234,255,47,99,168,254,170,226,153,255,102,179,216,0,226,141,122,255,122,66,153,254,182,245,134,0,227,228,25,1,214,57,235,255,216,173,56,255,181,231,210,0,119,128,157,255,129,95,136,255,110,126,51,0,2,169,183,255,7,130,98,254,69,176,94,255,116,4,227,1,217,242,145,255,202,173,31,1,105,1,39,255,46,175,69,0,228,47,58,255,215,224,69,254,207,56,69,255,16,254,139,255,23,207,212,255,202,20,126,255,95,213,96,255,9,176,33,0,200,5,207,255,241,42,128,254,35,33,192,255,248,229,196,1,129,17,120,0,251,103,151,255,7,52,112,255,140,56,66,255,40,226,245,255,217,70,37,254,172,214,9,255,72,67,134,1,146,192,214,255,44,38,112,0,68,184,75,255,206,90,251,0,149,235,141,0,181,170,58,0,116,244,239,0,92,157,2,0,102,173,98,0,233,137,96,1,127,49,203,0,5,155,148,0,23,148,9,255,211,122,12,0,34,134,26,255,219,204,136,0,134,8,41,255,224,83,43,254,85,25,247,0,109,127,0,254,169,136,48,0,238,119,219,255,231,173,213,0,206,18,254,254,8,186,7,255,126,9,7,1,111,42,72,0,111,52,236,254,96,63,141,0,147,191,127,254,205,78,192,255,14,106,237,1,187,219,76,0,175,243,187,254,105,89,173,0,85,25,89,1,162,243,148,0,2,118,209,254,33,158,9,0,139,163,46,255,93,70,40,0,108,42,142,254,111,252,142,255,155,223,144,0,51,229,167,255,73,252,155,255,94,116,12,255,152,160,218,255,156,238,37,255,179,234,207,255,197,0,179,255,154,164,141,0,225,196,104,0,10,35,25,254,209,212,242,255,97,253,222,254,184,101,229,0,222,18,127,1,164,136,135,255,30,207,140,254,146,97,243,0,129,192,26,254,201,84,33,255,111,10,78,255,147,81,178,255,4,4,24,0,161,238,215,255,6,141,33,0,53,215,14,255,41,181,208,255,231,139,157,0,179,203,221,255,255,185,113,0,189,226,172,255,113,66,214,255,202,62,45,255,102,64,8,255,78,174,16,254,133,117,68,255,182,120,89,255,133,114,211,0,189,110,21,255,15,10,106,0,41,192,1,0,152,232,121,255,188,60,160,255,153,113,206,255,0,183,226,254,180,13,72,255,176,160,14,254,211,201,134,255,158,24,143,0,127,105,53,0,96,12,189,0,167,215,251,255,159,76,128,254,106,101,225,255,30,252,4,0,146,12,174,0,89,241,178,254,10,229,166,255,123,221,42,254,30,20,212,0,82,128,3,0,48,209,243,0,119,121,64,255,50,227,156,255,0,110,197,1,103,27,144,0,133,59,140,1,189,241,36,255,248,37,195,1,96,220,55,0,183,76,62,255,195,66,61,0,50,76,164,1,225,164,76,255,76,61,163,255,117,62,31,0,81,145,64,255,118,65,14,0,162,115,214,255,6,138,46,0,124,230,244,255,10,138,143,0,52,26,194,0,184,244,76,0,129,143,41,1,190,244,19,255,123,170,122,255,98,129,68,0,121,213,147,0,86,101,30,255,161,103,155,0,140,89,67,255,239,229,190,1,67,11,181,0,198,240,137,254,238,69,188,255,234,113,60,255,37,255,57,255,69,178,182,254,128,208,179,0,118,26,125,254,3,7,214,255,241,50,77,255,85,203,197,255,211,135,250,255,25,48,100,255,187,213,180,254,17,88,105,0,83,209,158,1,5,115,98,0,4,174,60,254,171,55,110,255,217,181,17,255,20,188,170,0,146,156,102,254,87,214,174,255,114,122,155,1,233,44,170,0,127,8,239,1,214,236,234,0,175,5,219,0,49,106,61,255,6,66,208,255,2,106,110,255,81,234,19,255,215,107,192,255,67,151,238,0,19,42,108,255,229,85,113,1,50,68,135,255,17,106,9,0,50,103,1,255,80,1,168,1,35,152,30,255,16,168,185,1,56,89,232,255,101,210,252,0,41,250,71,0,204,170,79,255,14,46,239,255,80,77,239,0,189,214,75,255,17,141,249,0,38,80,76,255,190,85,117,0,86,228,170,0,156,216,208,1,195,207,164,255,150,66,76,255,175,225,16,255,141,80,98,1,76,219,242,0,198,162,114,0,46,218,152,0,155,43,241,254,155,160,104,255,178,9,252,254,100,110,212,0,14,5,167,0,233,239,163,255,28,151,157,1,101,146,10,255,254,158,70,254,71,249,228,0,88,30,50,0,68,58,160,255,191,24,104,1,129,66,129,255,192,50,85,255,8,179,138,255,38,250,201,0,115,80,160,0,131,230,113,0,125,88,147,0,90,68,199,0,253,76,158,0,28,255,118,0,113,250,254,0,66,75,46,0,230,218,43,0,229,120,186,1,148,68,43,0,136,124,238,1,187,107,197,255,84,53,246,255,51,116,254,255,51,187,165,0,2,17,175,0,66,84,160,1,247,58,30,0,35,65,53,254,69,236,191,0,45,134,245,1,163,123,221,0,32,110,20,255,52,23,165,0,186,214,71,0,233,176,96,0,242,239,54,1,57,89,138,0,83,0,84,255,136,160,100,0,92,142,120,254,104,124,190,0,181,177,62,255,250,41,85,0,152,130,42,1,96,252,246,0,151,151,63,254,239,133,62,0,32,56,156,0,45,167,189,255,142,133,179,1,131,86,211,0,187,179,150,254,250,170,14,255,68,113,21,255,222,186,59,255,66,7,241,1,69,6,72,0,86,156,108,254,55,167,89,0,109,52,219,254,13,176,23,255,196,44,106,255,239,149,71,255,164,140,125,255,159,173,1,0,51,41,231,0,145,62,33,0,138,111,93,1,185,83,69,0,144,115,46,0,97,151,16,255,24,228,26,0,49,217,226,0,113,75,234,254,193,153,12,255,182,48,96,255,14,13,26,0,128,195,249,254,69,193,59,0,132,37,81,254,125,106,60,0,214,240,169,1,164,227,66,0,210,163,78,0,37,52,151,0,99,77,26,0,238,156,213,255,213,192,209,1,73,46,84,0,20,65,41,1,54,206,79,0,201,131,146,254,170,111,24,255,177,33,50,254,171,38,203,255,78,247,116,0,209,221,153,0,133,128,178,1,58,44,25,0,201,39,59,1,189,19,252,0,49,229,210,1,117,187,117,0,181,179,184,1,0,114,219,0,48,94,147,0,245,41,56,0,125,13,204,254,244,173,119,0,44,221,32,254,84,234,20,0,249,160,198,1,236,126,234,255,143,62,221,0,129,89,214,255,55,139,5,254,68,20,191,255,14,204,178,1,35,195,217,0,47,51,206,1,38,246,165,0,206,27,6,254,158,87,36,0,217,52,146,255,125,123,215,255,85,60,31,255,171,13,7,0,218,245,88,254,252,35,60,0,55,214,160,255,133,101,56,0,224,32,19,254,147,64,234,0,26,145,162,1,114,118,125,0,248,252,250,0,101,94,196,255,198,141,226,254,51,42,182,0,135,12,9,254,109,172,210,255,197,236,194,1,241,65,154,0,48,156,47,255,153,67,55,255,218,165,34,254,74,180,179,0,218,66,71,1,88,122,99,0,212,181,219,255,92,42,231,255,239,0,154,0,245,77,183,255,94,81,170,1,18,213,216,0,171,93,71,0,52,94,248,0,18,151,161,254,197,209,66,255,174,244,15,254,162,48,183,0,49,61,240,254,182,93,195,0,199,228,6,1,200,5,17,255,137,45,237,255,108,148,4,0,90,79,237,255,39,63,77,255,53,82,207,1,142,22,118,255,101,232,18,1,92,26,67,0,5,200,88,255,33,168,138,255,149,225,72,0,2,209,27,255,44,245,168,1,220,237,17,255,30,211,105,254,141,238,221,0,128,80,245,254,111,254,14,0,222,95,190,1,223,9,241,0,146,76,212,255,108,205,104,255,63,117,153,0,144,69,48,0,35,228,111,0,192,33,193,255,112,214,190,254,115,152,151,0,23,102,88,0,51,74,248,0,226,199,143,254,204,162,101,255,208,97,189,1,245,104,18,0,230,246,30,255,23,148,69,0,110,88,52,254,226,181,89,255,208,47,90,254,114,161,80,255,33,116,248,0,179,152,87,255,69,144,177,1,88,238,26,255,58,32,113,1,1,77,69,0,59,121,52,255,152,238,83,0,52,8,193,0,231,39,233,255,199,34,138,0,222,68,173,0,91,57,242,254,220,210,127,255,192,7,246,254,151,35,187,0,195,236,165,0,111,93,206,0,212,247,133,1,154,133,209,255,155,231,10,0,64,78,38,0,122,249,100,1,30,19,97,255,62,91,249,1,248,133,77,0,197,63,168,254,116,10,82,0,184,236,113,254,212,203,194,255,61,100,252,254,36,5,202,255,119,91,153,255,129,79,29,0,103,103,171,254,237,215,111,255,216,53,69,0,239,240,23,0,194,149,221,255,38,225,222,0,232,255,180,254,118,82,133,255,57,209,177,1,139,232,133,0,158,176,46,254,194,115,46,0,88,247,229,1,28,103,191,0,221,222,175,254,149,235,44,0,151,228,25,254,218,105,103,0,142,85,210,0,149,129,190,255,213,65,94,254,117,134,224,255,82,198,117,0,157,221,220,0,163,101,36,0,197,114,37,0,104,172,166,254,11,182,0,0,81,72,188,255,97,188,16,255,69,6,10,0,199,147,145,255,8,9,115,1,65,214,175,255,217,173,209,0,80,127,166,0,247,229,4,254,167,183,124,255,90,28,204,254,175,59,240,255,11,41,248,1,108,40,51,255,144,177,195,254,150,250,126,0,138,91,65,1,120,60,222,255,245,193,239,0,29,214,189,255,128,2,25,0,80,154,162,0,77,220,107,1,234,205,74,255,54,166,103,255,116,72,9,0,228,94,47,255,30,200,25,255,35,214,89,255,61,176,140,255,83,226,163,255,75,130,172,0,128,38,17,0,95,137,152,255,215,124,159,1,79,93,0,0,148,82,157,254,195,130,251,255,40,202,76,255,251,126,224,0,157,99,62,254,207,7,225,255,96,68,195,0,140,186,157,255,131,19,231,255,42,128,254,0,52,219,61,254,102,203,72,0,141,7,11,255,186,164,213,0,31,122,119,0,133,242,145,0,208,252,232,255,91,213,182,255,143,4,250,254,249,215,74,0,165,30,111,1,171,9,223,0,229,123,34,1,92,130,26,255,77,155,45,1,195,139,28,255,59,224,78,0,136,17,247,0,108,121,32,0,79,250,189,255,96,227,252,254,38,241,62,0,62,174,125,255,155,111,93,255,10,230,206,1,97,197,40,255,0,49,57,254,65,250,13,0,18,251,150,255,220,109,210,255,5,174,166,254,44,129,189,0,235,35,147,255,37,247,141,255,72,141,4,255,103,107,255,0,247,90,4,0,53,44,42,0,2,30,240,0,4,59,63,0,88,78,36,0,113,167,180,0,190,71,193,255,199,158,164,255,58,8,172,0,77,33,12,0,65,63,3,0,153,77,33,255,172,254,102,1,228,221,4,255,87,30,254,1,146,41,86,255,138,204,239,254,108,141,17,255,187,242,135,0,210,208,127,0,68,45,14,254,73,96,62,0,81,60,24,255,170,6,36,255,3,249,26,0,35,213,109,0,22,129,54,255,21,35,225,255,234,61,56,255,58,217,6,0,143,124,88,0,236,126,66,0,209,38,183,255,34,238,6,255,174,145,102,0,95,22,211,0,196,15,153,254,46,84,232,255,117,34,146,1,231,250,74,255,27,134,100,1,92,187,195,255,170,198,112,0,120,28,42,0,209,70,67,0,29,81,31,0,29,168,100,1,169,173,160,0,107,35,117,0,62,96,59,255,81,12,69,1,135,239,190,255,220,252,18,0,163,220,58,255,137,137,188,255,83,102,109,0,96,6,76,0,234,222,210,255,185,174,205,1,60,158,213,255,13,241,214,0,172,129,140,0,93,104,242,0,192,156,251,0,43,117,30,0,225,81,158,0,127,232,218,0,226,28,203,0,233,27,151,255,117,43,5,255,242,14,47,255,33,20,6,0,137,251,44,254,27,31,245,255,183,214,125,254,40,121,149,0,186,158,213,255,89,8,227,0,69,88,0,254,203,135,225,0,201,174,203,0,147,71,184,0,18,121,41,254,94,5,78,0,224,214,240,254,36,5,180,0,251,135,231,1,163,138,212,0,210,249,116,254,88,129,187,0,19,8,49,254,62,14,144,255,159,76,211,0,214,51,82,0,109,117,228,254,103,223,203,255,75,252,15,1,154,71,220,255,23,13,91,1,141,168,96,255,181,182,133,0,250,51,55,0,234,234,212,254,175,63,158,0,39,240,52,1,158,189,36,255,213,40,85,1,32,180,247,255,19,102,26,1,84,24,97,255,69,21,222,0,148,139,122,255,220,213,235,1,232,203,255,0,121,57,147,0,227,7,154,0,53,22,147,1,72,1,225,0,82,134,48,254,83,60,157,255,145,72,169,0,34,103,239,0,198,233,47,0,116,19,4,255,184,106,9,255,183,129,83,0,36,176,230,1,34,103,72,0,219,162,134,0,245,42,158,0,32,149,96,254,165,44,144,0,202,239,72,254,215,150,5,0,42,66,36,1,132,215,175,0,86,174,86,255,26,197,156,255,49,232,135,254,103,182,82,0,253,128,176,1,153,178,122,0,245,250,10,0,236,24,178,0,137,106,132,0,40,29,41,0,50,30,152,255,124,105,38,0,230,191,75,0,143,43,170,0,44,131,20,255,44,13,23,255,237,255,155,1,159,109,100,255,112,181,24,255,104,220,108,0,55,211,131,0,99,12,213,255,152,151,145,255,238,5,159,0,97,155,8,0,33,108,81,0,1,3,103,0,62,109,34,255,250,155,180,0,32,71,195,255,38,70,145,1,159,95,245,0,69,229,101,1,136,28,240,0,79,224,25,0,78,110,121,255,248,168,124,0,187,128,247,0,2,147,235,254,79,11,132,0,70,58,12,1,181,8,163,255,79,137,133,255,37,170,11,255,141,243,85,255,176,231,215,255,204,150,164,255,239,215,39,255,46,87,156,254,8,163,88,255,172,34,232,0,66,44,102,255,27,54,41,254,236,99,87,255,41,123,169,1,52,114,43,0,117,134,40,0,155,134,26,0,231,207,91,254,35,132,38,255,19,102,125,254,36,227,133,255,118,3,113,255,29,13,124,0,152,96,74,1,88,146,206,255,167,191,220,254,162,18,88,255,182,100,23,0,31,117,52,0,81,46,106,1,12,2,7,0,69,80,201,1,209,246,172,0,12,48,141,1,224,211,88,0,116,226,159,0,122,98,130,0,65,236,234,1,225,226,9,255,207,226,123,1,89,214,59,0,112,135,88,1,90,244,203,255,49,11,38,1,129,108,186,0,89,112,15,1,101,46,204,255,127,204,45,254,79,255,221,255,51,73,18,255,127,42,101,255,241,21,202,0,160,227,7,0,105,50,236,0,79,52,197,255,104,202,208,1,180,15,16,0,101,197,78,255,98,77,203,0,41,185,241,1,35,193,124,0,35,155,23,255,207,53,192,0,11,125,163,1,249,158,185,255,4,131,48,0,21,93,111,255,61,121,231,1,69,200,36,255,185,48,185,255,111,238,21,255,39,50,25,255,99,215,163,255,87,212,30,255,164,147,5,255,128,6,35,1,108,223,110,255,194,76,178,0,74,101,180,0,243,47,48,0,174,25,43,255,82,173,253,1,54,114,192,255,40,55,91,0,215,108,176,255,11,56,7,0,224,233,76,0,209,98,202,254,242,25,125,0,44,193,93,254,203,8,177,0,135,176,19,0,112,71,213,255,206,59,176,1,4,67,26,0,14,143,213,254,42,55,208,255,60,67,120,0,193,21,163,0,99,164,115,0,10,20,118,0,156,212,222,254,160,7,217,255,114,245,76,1,117,59,123,0,176,194,86,254,213,15,176,0,78,206,207,254,213,129,59,0,233,251,22,1,96,55,152,255,236,255,15,255,197,89,84,255,93,149,133,0,174,160,113,0,234,99,169,255,152,116,88,0,144,164,83,255,95,29,198,255,34,47,15,255,99,120,134,255,5,236,193,0,249,247,126,255,147,187,30,0,50,230,117,255,108,217,219,255,163,81,166,255,72,25,169,254,155,121,79,255,28,155,89,254,7,126,17,0,147,65,33,1,47,234,253,0,26,51,18,0,105,83,199,255,163,196,230,0,113,248,164,0,226,254,218,0,189,209,203,255,164,247,222,254,255,35,165,0,4,188,243,1,127,179,71,0,37,237,254,255,100,186,240,0,5,57,71,254,103,72,73,255,244,18,81,254,229,210,132,255,238,6,180,255,11,229,174,255,227,221,192,1,17,49,28,0,163,215,196,254,9,118,4,255,51,240,71,0,113,129,109,255,76,240,231,0,188,177,127,0,125,71,44,1,26,175,243,0,94,169,25,254,27,230,29,0,15,139,119,1,168,170,186,255,172,197,76,255,252,75,188,0,137,124,196,0,72,22,96,255,45,151,249,1,220,145,100,0,64,192,159,255,120,239,226,0,129,178,146,0,0,192,125,0,235,138,234,0,183,157,146,0,83,199,192,255,184,172,72,255,73,225,128,0,77,6,250,255,186,65,67,0,104,246,207,0,188,32,138,255,218,24,242,0,67,138,81,254,237,129,121,255,20,207,150,1,41,199,16,255,6,20,128,0,159,118,5,0,181,16,143,255,220,38,15,0,23,64,147,254,73,26,13,0,87,228,57,1,204,124,128,0,43,24,223,0,219,99,199,0,22,75,20,255,19,27,126,0,157,62,215,0,110,29,230,0,179,167,255,1,54,252,190,0,221,204,182,254,179,158,65,255,81,157,3,0,194,218,159,0,170,223,0,0,224,11,32,255,38,197,98,0,168,164,37,0,23,88,7,1,164,186,110,0,96,36,134,0,234,242,229,0,250,121,19,0,242,254,112,255,3,47,94,1,9,239,6,255,81,134,153,254,214,253,168,255,67,124,224,0,245,95,74,0,28,30,44,254,1,109,220,255,178,89,89,0,252,36,76,0,24,198,46,255,76,77,111,0,134,234,136,255,39,94,29,0,185,72,234,255,70,68,135,255,231,102,7,254,77,231,140,0,167,47,58,1,148,97,118,255,16,27,225,1,166,206,143,255,110,178,214,255,180,131,162,0,143,141,225,1,13,218,78,255,114,153,33,1,98,104,204,0,175,114,117,1,167,206,75,0,202,196,83,1,58,64,67,0,138,47,111,1,196,247,128,255,137,224,224,254,158,112,207,0,154,100,255,1,134,37,107,0,198,128,79,255,127,209,155,255,163,254,185,254,60,14,243,0,31,219,112,254,29,217,65,0,200,13,116,254,123,60,196,255,224,59,184,254,242,89,196,0,123,16,75,254,149,16,206,0,69,254,48,1,231,116,223,255,209,160,65,1,200,80,98,0,37,194,184,254,148,63,34,0,139,240,65,255,217,144,132,255,56,38,45,254,199,120,210,0,108,177,166,255,160,222,4,0,220,126,119,254,165,107,160,255,82,220,248,1,241,175,136,0,144,141,23,255,169,138,84,0,160,137,78,255,226,118,80,255,52,27,132,255,63,96,139,255,152,250,39,0,188,155,15,0,232,51,150,254,40,15,232,255,240,229,9,255,137,175,27,255,75,73,97,1,218,212,11,0,135,5,162,1,107,185,213,0,2,249,107,255,40,242,70,0,219,200,25,0,25,157,13,0,67,82,80,255,196,249,23,255,145,20,149,0,50,72,146,0,94,76,148,1,24,251,65,0,31,192,23,0,184,212,201,255,123,233,162,1,247,173,72,0,162,87,219,254,126,134,89,0,159,11,12,254,166,105,29,0,73,27,228,1,113,120,183,255,66,163,109,1,212,143,11,255,159,231,168,1,255,128,90,0,57,14,58,254,89,52,10,255,253,8,163,1,0,145,210,255,10,129,85,1,46,181,27,0,103,136,160,254,126,188,209,255,34,35,111,0,215,219,24,255,212,11,214,254,101,5,118,0,232,197,133,255,223,167,109,255,237,80,86,255,70,139,94,0,158,193,191,1,155,15,51,255,15,190,115,0,78,135,207,255,249,10,27,1,181,125,233,0,95,172,13,254,170,213,161,255,39,236,138,255,95,93,87,255,190,128,95,0,125,15,206,0,166,150,159,0,227,15,158,255,206,158,120,255,42,141,128,0,101,178,120,1,156,109,131,0,218,14,44,254,247,168,206,255,212,112,28,0,112,17,228,255,90,16,37,1,197,222,108,0,254,207,83,255,9,90,243,255,243,244,172,0,26,88,115,255,205,116,122,0,191,230,193,0,180,100,11,1,217,37,96,255,154,78,156,0,235,234,31,255,206,178,178,255,149,192,251,0,182,250,135,0,246,22,105,0,124,193,109,255,2,210,149,255,169,17,170,0,0,96,110,255,117,9,8,1,50,123,40,255,193,189,99,0,34,227,160,0,48,80,70,254,211,51,236,0,45,122,245,254,44,174,8,0,173,37,233,255,158,65,171,0,122,69,215,255,90,80,2,255,131,106,96,254,227,114,135,0,205,49,119,254,176,62,64,255,82,51,17,255,241,20,243,255,130,13,8,254,128,217,243,255,162,27,1,254,90,118,241,0,246,198,246,255,55,16,118,255,200,159,157,0,163,17,1,0,140,107,121,0,85,161,118,255,38,0,149,0,156,47,238,0,9,166,166,1,75,98,181,255,50,74,25,0,66,15,47,0,139,225,159,0,76,3,142,255,14,238,184,0,11,207,53,255,183,192,186,1,171,32,174,255,191,76,221,1,247,170,219,0,25,172,50,254,217,9,233,0,203,126,68,255,183,92,48,0,127,167,183,1,65,49,254,0,16,63,127,1,254,21,170,255,59,224,127,254,22,48,63,255,27,78,130,254,40,195,29,0,250,132,112,254,35,203,144,0,104,169,168,0,207,253,30,255,104,40,38,254,94,228,88,0,206,16,128,255,212,55,122,255,223,22,234,0,223,197,127,0,253,181,181,1,145,102,118,0,236,153,36,255,212,217,72,255,20,38,24,254,138,62,62,0,152,140,4,0,230,220,99,255,1,21,212,255,148,201,231,0,244,123,9,254,0,171,210,0,51,58,37,255,1,255,14,255,244,183,145,254,0,242,166,0,22,74,132,0,121,216,41,0,95,195,114,254,133,24,151,255,156,226,231,255,247,5,77,255,246,148,115,254,225,92,81,255,222,80,246,254,170,123,89,255,74,199,141,0,29,20,8,255,138,136,70,255,93,75,92,0,221,147,49,254,52,126,226,0,229,124,23,0,46,9,181,0,205,64,52,1,131,254,28,0,151,158,212,0,131,64,78,0,206,25,171,0,0,230,139,0,191,253,110,254,103,247,167,0,64,40,40,1,42,165,241,255,59,75,228,254,124,243,189,255,196,92,178,255,130,140,86,255,141,89,56,1,147,198,5,255,203,248,158,254,144,162,141,0,11,172,226,0,130,42,21,255,1,167,143,255,144,36,36,255,48,88,164,254,168,170,220,0,98,71,214,0,91,208,79,0,159,76,201,1,166,42,214,255,69,255,0,255,6,128,125,255,190,1,140,0,146,83,218,255,215,238,72,1,122,127,53,0,189,116,165,255,84,8,66,255,214,3,208,255,213,110,133,0,195,168,44,1,158,231,69,0,162,64,200,254,91,58,104,0,182,58,187,254,249,228,136,0,203,134,76,254,99,221,233,0,75,254,214,254,80,69,154,0,64,152,248,254,236,136,202,255,157,105,153,254,149,175,20,0,22,35,19,255,124,121,233,0,186,250,198,254,132,229,139,0,137,80,174,255,165,125,68,0,144,202,148,254,235,239,248,0,135,184,118,0,101,94,17,255,122,72,70,254,69,130,146,0,127,222,248,1,69,127,118,255,30,82,215,254,188,74,19,255,229,167,194,254,117,25,66,255,65,234,56,254,213,22,156,0,151,59,93,254,45,28,27,255,186,126,164,255,32,6,239,0,127,114,99,1,219,52,2,255,99,96,166,254,62,190,126,255,108,222,168,1,75,226,174,0,230,226,199,0,60,117,218,255,252,248,20,1,214,188,204,0,31,194,134,254,123,69,192,255,169,173,36,254,55,98,91,0,223,42,102,254,137,1,102,0,157,90,25,0,239,122,64,255,252,6,233,0,7,54,20,255,82,116,174,0,135,37,54,255,15,186,125,0,227,112,175,255,100,180,225,255,42,237,244,255,244,173,226,254,248,18,33,0,171,99,150,255,74,235,50,255,117,82,32,254,106,168,237,0,207,109,208,1,228,9,186,0,135,60,169,254,179,92,143,0,244,170,104,255,235,45,124,255,70,99,186,0,117,137,183,0,224,31,215,0,40,9,100,0,26,16,95,1,68,217,87,0,8,151,20,255,26,100,58,255,176,165,203,1,52,118,70,0,7,32,254,254,244,254,245,255,167,144,194,255,125,113,23,255,176,121,181,0,136,84,209,0,138,6,30,255,89,48,28,0,33,155,14,255,25,240,154,0,141,205,109,1,70,115,62,255,20,40,107,254,138,154,199,255,94,223,226,255,157,171,38,0,163,177,25,254,45,118,3,255,14,222,23,1,209,190,81,255,118,123,232,1,13,213,101,255,123,55,123,254,27,246,165,0,50,99,76,255,140,214,32,255,97,65,67,255,24,12,28,0,174,86,78,1,64,247,96,0,160,135,67,0,66,55,243,255,147,204,96,255,26,6,33,255,98,51,83,1,153,213,208,255,2,184,54,255,25,218,11,0,49,67,246,254,18,149,72,255,13,25,72,0,42,79,214,0,42,4,38,1,27,139,144,255,149,187,23,0,18,164,132,0,245,84,184,254,120,198,104,255,126,218,96,0,56,117,234,255,13,29,214,254,68,47,10,255,167,154,132,254,152,38,198,0,66,178,89,255,200,46,171,255,13,99,83,255,210,187,253,255,170,45,42,1,138,209,124,0,214,162,141,0,12,230,156,0,102,36,112,254,3,147,67,0,52,215,123,255,233,171,54,255,98,137,62,0,247,218,39,255,231,218,236,0,247,191,127,0,195,146,84,0,165,176,92,255,19,212,94,255,17,74,227,0,88,40,153,1,198,147,1,255,206,67,245,254,240,3,218,255,61,141,213,255,97,183,106,0,195,232,235,254,95,86,154,0,209,48,205,254,118,209,241,255,240,120,223,1,213,29,159,0,163,127,147,255,13,218,93,0,85,24,68,254,70,20,80,255,189,5,140,1,82,97,254,255,99,99,191,255,132,84,133,255,107,218,116,255,112,122,46,0,105,17,32,0,194,160,63,255,68,222,39,1,216,253,92,0,177,105,205,255,149,201,195,0,42,225,11,255,40,162,115,0,9,7,81,0,165,218,219,0,180,22,0,254,29,146,252,255,146,207,225,1,180,135,96,0,31,163,112,0,177,11,219,255,133,12,193,254,43,78,50,0,65,113,121,1,59,217,6,255,110,94,24,1,112,172,111,0,7,15,96,0,36,85,123,0,71,150,21,255,208,73,188,0,192,11,167,1,213,245,34,0,9,230,92,0,162,142,39,255,215,90,27,0,98,97,89,0,94,79,211,0,90,157,240,0,95,220,126,1,102,176,226,0,36,30,224,254,35,31,127,0,231,232,115,1,85,83,130,0,210,73,245,255,47,143,114,255,68,65,197,0,59,72,62,255,183,133,173,254,93,121,118,255,59,177,81,255,234,69,173,255,205,128,177,0,220,244,51,0,26,244,209,1,73,222,77,255,163,8,96,254,150,149,211,0,158,254,203,1,54,127,139,0,161,224,59,0,4,109,22,255,222,42,45,255,208,146,102,255,236,142,187,0,50,205,245,255,10,74,89,254,48,79,142,0,222,76,130,255,30,166,63,0,236,12,13,255,49,184,244,0,187,113,102,0,218,101,253,0,153,57,182,254,32,150,42,0,25,198,146,1,237,241,56,0,140,68,5,0,91,164,172,255,78,145,186,254,67,52,205,0,219,207,129,1,109,115,17,0,54,143,58,1,21,248,120,255,179,255,30,0,193,236,66,255,1,255,7,255,253,192,48,255,19,69,217,1,3,214,0,255,64,101,146,1,223,125,35,255,235,73,179,255,249,167,226,0,225,175,10,1,97,162,58,0,106,112,171,1,84,172,5,255,133,140,178,255,134,245,142,0,97,90,125,255,186,203,185,255,223,77,23,255,192,92,106,0,15,198,115,255,217,152,248,0,171,178,120,255,228,134,53,0,176,54,193,1,250,251,53,0,213,10,100,1,34,199,106,0,151,31,244,254,172,224,87,255,14,237,23,255,253,85,26,255,127,39,116,255,172,104,100,0,251,14,70,255,212,208,138,255,253,211,250,0,176,49,165,0,15,76,123,255,37,218,160,255,92,135,16,1,10,126,114,255,70,5,224,255,247,249,141,0,68,20,60,1,241,210,189,255,195,217,187,1,151,3,113,0,151,92,174,0,231,62,178,255,219,183,225,0,23,23,33,255,205,181,80,0,57,184,248,255,67,180,1,255,90,123,93,255,39,0,162,255,96,248,52,255,84,66,140,0,34,127,228,255,194,138,7,1,166,110,188,0,21,17,155,1,154,190,198,255,214,80,59,255,18,7,143,0,72,29,226,1,199,217,249,0,232,161,71,1,149,190,201,0,217,175,95,254,113,147,67,255,138,143,199,255,127,204,1,0,29,182,83,1,206,230,155,255,186,204,60,0,10,125,85,255,232,96,25,255,255,89,247,255,213,254,175,1,232,193,81,0,28,43,156,254,12,69,8,0,147,24,248,0,18,198,49,0,134,60,35,0,118,246,18,255,49,88,254,254,228,21,186,255,182,65,112,1,219,22,1,255,22,126,52,255,189,53,49,255,112,25,143,0,38,127,55,255,226,101,163,254,208,133,61,255,137,69,174,1,190,118,145,255,60,98,219,255,217,13,245,255,250,136,10,0,84,254,226,0,201,31,125,1,240,51,251,255,31,131,130,255,2,138,50,255,215,215,177,1,223,12,238,255,252,149,56,255,124,91,68,255,72,126,170,254,119,255,100,0,130,135,232,255,14,79,178,0,250,131,197,0,138,198,208,0,121,216,139,254,119,18,36,255,29,193,122,0,16,42,45,255,213,240,235,1,230,190,169,255,198,35,228,254,110,173,72,0,214,221,241,255,56,148,135,0,192,117,78,254,141,93,207,255,143,65,149,0,21,18,98,255,95,44,244,1,106,191,77,0,254,85,8,254,214,110,176,255,73,173,19,254,160,196,199,255,237,90,144,0,193,172,113,255,200,155,136,254,228,90,221,0,137,49,74,1,164,221,215,255,209,189,5,255,105,236,55,255,42,31,129,1,193,255,236,0,46,217,60,0,138,88,187,255,226,82,236,255,81,69,151,255,142,190,16,1,13,134,8,0,127,122,48,255,81,64,156,0,171,243,139,0,237,35,246,0,122,143,193,254,212,122,146,0,95,41,255,1,87,132,77,0,4,212,31,0,17,31,78,0,39,45,173,254,24,142,217,255,95,9,6,255,227,83,6,0,98,59,130,254,62,30,33,0,8,115,211,1,162,97,128,255,7,184,23,254,116,28,168,255,248,138,151,255,98,244,240,0,186,118,130,0,114,248,235,255,105,173,200,1,160,124,71,255,94,36,164,1,175,65,146,255,238,241,170,254,202,198,197,0,228,71,138,254,45,246,109,255,194,52,158,0,133,187,176,0,83,252,154,254,89,189,221,255,170,73,252,0,148,58,125,0,36,68,51,254,42,69,177,255,168,76,86,255,38,100,204,255,38,53,35,0,175,19,97,0,225,238,253,255,81,81,135,0,210,27,255,254,235,73,107,0,8,207,115,0,82,127,136,0,84,99,21,254,207,19,136,0,100,164,101,0,80,208,77,255,132,207,237,255,15,3,15,255,33,166,110,0,156,95,85,255,37,185,111,1,150,106,35,255,166,151,76,0,114,87,135,255,159,194,64,0,12,122,31,255,232,7,101,254,173,119,98,0,154,71,220,254,191,57,53,255,168,232,160,255,224,32,99,255,218,156,165,0,151,153,163,0,217,13,148,1,197,113,89,0,149,28,161,254,207,23,30,0,105,132,227,255,54,230,94,255,133,173,204,255,92,183,157,255,88,144,252,254,102,33,90,0,159,97,3,0,181,218,155,255,240,114,119,0,106,214,53,255,165,190,115,1,152,91,225,255,88,106,44,255,208,61,113,0,151,52,124,0,191,27,156,255,110,54,236,1,14,30,166,255,39,127,207,1,229,199,28,0,188,228,188,254,100,157,235,0,246,218,183,1,107,22,193,255,206,160,95,0,76,239,147,0,207,161,117,0,51,166,2,255,52,117,10,254,73,56,227,255,152,193,225,0,132,94,136,255,101,191,209,0,32,107,229,255,198,43,180,1,100,210,118,0,114,67,153,255,23,88,26,255,89,154,92,1,220,120,140,255,144,114,207,255,252,115,250,255,34,206,72,0,138,133,127,255,8,178,124,1,87,75,97,0,15,229,92,254,240,67,131,255,118,123,227,254,146,120,104,255,145,213,255,1,129,187,70,255,219,119,54,0,1,19,173,0,45,150,148,1,248,83,72,0,203,233,169,1,142,107,56,0,247,249,38,1,45,242,80,255,30,233,103,0,96,82,70,0,23,201,111,0,81,39,30,255,161,183,78,255,194,234,33,255,68,227,140,254,216,206,116,0,70,27,235,255,104,144,79,0,164,230,93,254,214,135,156,0,154,187,242,254,188,20,131,255,36,109,174,0,159,112,241,0,5,110,149,1,36,165,218,0,166,29,19,1,178,46,73,0,93,43,32,254,248,189,237,0,102,155,141,0,201,93,195,255,241,139,253,255,15,111,98,255,108,65,163,254,155,79,190,255,73,174,193,254,246,40,48,255,107,88,11,254,202,97,85,255,253,204,18,255,113,242,66,0,110,160,194,254,208,18,186,0,81,21,60,0,188,104,167,255,124,166,97,254,210,133,142,0,56,242,137,254,41,111,130,0,111,151,58,1,111,213,141,255,183,172,241,255,38,6,196,255,185,7,123,255,46,11,246,0,245,105,119,1,15,2,161,255,8,206,45,255,18,202,74,255,83,124,115,1,212,141,157,0,83,8,209,254,139,15,232,255,172,54,173,254,50,247,132,0,214,189,213,0,144,184,105,0,223,254,248,0,255,147,240,255,23,188,72,0,7,51,54,0,188,25,180,254,220,180,0,255,83,160,20,0,163,189,243,255,58,209,194,255,87,73,60,0,106,24,49,0,245,249,220,0,22,173,167,0,118,11,195,255,19,126,237,0,110,159,37,255,59,82,47,0,180,187,86,0,188,148,208,1,100,37,133,255,7,112,193,0,129,188,156,255,84,106,129,255,133,225,202,0,14,236,111,255,40,20,101,0,172,172,49,254,51,54,74,255,251,185,184,255,93,155,224,255,180,249,224,1,230,178,146,0,72,57,54,254,178,62,184,0,119,205,72,0,185,239,253,255,61,15,218,0,196,67,56,255,234,32,171,1,46,219,228,0,208,108,234,255,20,63,232,255,165,53,199,1,133,228,5,255,52,205,107,0,74,238,140,255,150,156,219,254,239,172,178,255,251,189,223,254,32,142,211,255,218,15,138,1,241,196,80,0,28,36,98,254,22,234,199,0,61,237,220,255,246,57,37,0,142,17,142,255,157,62,26,0,43,238,95,254,3,217,6,255,213,25,240,1,39,220,174,255,154,205,48,254,19,13,192,255,244,34,54,254,140,16,155,0,240,181,5,254,155,193,60,0,166,128,4,255,36,145,56,255,150,240,219,0,120,51,145,0,82,153,42,1,140,236,146,0,107,92,248,1,189,10,3,0,63,136,242,0,211,39,24,0,19,202,161,1,173,27,186,255,210,204,239,254,41,209,162,255,182,254,159,255,172,116,52,0,195,103,222,254,205,69,59,0,53,22,41,1,218,48,194,0,80,210,242,0,210,188,207,0,187,161,161,254,216,17,1,0,136,225,113,0,250,184,63,0,223,30,98,254,77,168,162,0,59,53,175,0,19,201,10,255,139,224,194,0,147,193,154,255,212,189,12,254,1,200,174,255,50,133,113,1,94,179,90,0,173,182,135,0,94,177,113,0,43,89,215,255,136,252,106,255,123,134,83,254,5,245,66,255,82,49,39,1,220,2,224,0,97,129,177,0,77,59,89,0,61,29,155,1,203,171,220,255,92,78,139,0,145,33,181,255,169,24,141,1,55,150,179,0,139,60,80,255,218,39,97,0,2,147,107,255,60,248,72,0,173,230,47,1,6,83,182,255,16,105,162,254,137,212,81,255,180,184,134,1,39,222,164,255,221,105,251,1,239,112,125,0,63,7,97,0,63,104,227,255,148,58,12,0,90,60,224,255,84,212,252,0,79,215,168,0,248,221,199,1,115,121,1,0,36,172,120,0,32,162,187,255,57,107,49,255,147,42,21,0,106,198,43,1,57,74,87,0,126,203,81,255,129,135,195,0,140,31,177,0,221,139,194,0,3,222,215,0,131,68,231,0,177,86,178,254,124,151,180,0,184,124,38,1,70,163,17,0,249,251,181,1,42,55,227,0,226,161,44,0,23,236,110,0,51,149,142,1,93,5,236,0,218,183,106,254,67,24,77,0,40,245,209,255,222,121,153,0,165,57,30,0,83,125,60,0,70,38,82,1,229,6,188,0,109,222,157,255,55,118,63,255,205,151,186,0,227,33,149,255,254,176,246,1,227,177,227,0,34,106,163,254,176,43,79,0,106,95,78,1,185,241,122,255,185,14,61,0,36,1,202,0,13,178,162,255,247,11,132,0,161,230,92,1,65,1,185,255,212,50,165,1,141,146,64,255,158,242,218,0,21,164,125,0,213,139,122,1,67,71,87,0,203,158,178,1,151,92,43,0,152,111,5,255,39,3,239,255,217,255,250,255,176,63,71,255,74,245,77,1,250,174,18,255,34,49,227,255,246,46,251,255,154,35,48,1,125,157,61,255,106,36,78,255,97,236,153,0,136,187,120,255,113,134,171,255,19,213,217,254,216,94,209,255,252,5,61,0,94,3,202,0,3,26,183,255,64,191,43,255,30,23,21,0,129,141,77,255,102,120,7,1,194,76,140,0,188,175,52,255,17,81,148,0,232,86,55,1,225,48,172,0,134,42,42,255,238,50,47,0,169,18,254,0,20,147,87,255,14,195,239,255,69,247,23,0,238,229,128,255,177,49,112,0,168,98,251,255,121,71,248,0,243,8,145,254,246,227,153,255,219,169,177,254,251,139,165,255,12,163,185,255,164,40,171,255,153,159,27,254,243,109,91,255,222,24,112,1,18,214,231,0,107,157,181,254,195,147,0,255,194,99,104,255,89,140,190,255,177,66,126,254,106,185,66,0,49,218,31,0,252,174,158,0,188,79,230,1,238,41,224,0,212,234,8,1,136,11,181,0,166,117,83,255,68,195,94,0,46,132,201,0,240,152,88,0,164,57,69,254,160,224,42,255,59,215,67,255,119,195,141,255,36,180,121,254,207,47,8,255,174,210,223,0,101,197,68,255,255,82,141,1,250,137,233,0,97,86,133,1,16,80,69,0,132,131,159,0,116,93,100,0,45,141,139,0,152,172,157,255,90,43,91,0,71,153,46,0,39,16,112,255,217,136,97,255,220,198,25,254,177,53,49,0,222,88,134,255,128,15,60,0,207,192,169,255,192,116,209,255,106,78,211,1,200,213,183,255,7,12,122,254,222,203,60,255,33,110,199,254,251,106,117,0,228,225,4,1,120,58,7,255,221,193,84,254,112,133,27,0,189,200,201,255,139,135,150,0,234,55,176,255,61,50,65,0,152,108,169,255,220,85,1,255,112,135,227,0,162,26,186,0,207,96,185,254,244,136,107,0,93,153,50,1,198,97,151,0,110,11,86,255,143,117,174,255,115,212,200,0,5,202,183,0,237,164,10,254,185,239,62,0,236,120,18,254,98,123,99,255,168,201,194,254,46,234,214,0,191,133,49,255,99,169,119,0,190,187,35,1,115,21,45,255,249,131,72,0,112,6,123,255,214,49,181,254,166,233,34,0,92,197,102,254,253,228,205,255,3,59,201,1,42,98,46,0,219,37,35,255,169,195,38,0,94,124,193,1,156,43,223,0,95,72,133,254,120,206,191,0,122,197,239,255,177,187,79,255,254,46,2,1,250,167,190,0,84,129,19,0,203,113,166,255,249,31,189,254,72,157,202,255,208,71,73,255,207,24,72,0,10,16,18,1,210,81,76,255,88,208,192,255,126,243,107,255,238,141,120,255,199,121,234,255,137,12,59,255,36,220,123,255,148,179,60,254,240,12,29,0,66,0,97,1,36,30,38,255,115,1,93,255,96,103,231,255,197,158,59,1,192,164,240,0,202,202,57,255,24,174,48,0,89,77,155,1,42,76,215,0,244,151,233,0,23,48,81,0,239,127,52,254,227,130,37,255,248,116,93,1,124,132,118,0,173,254,192,1,6,235,83,255,110,175,231,1,251,28,182,0,129,249,93,254,84,184,128,0,76,181,62,0,175,128,186,0,100,53,136,254,109,29,226,0,221,233,58,1,20,99,74,0,0,22,160,0,134,13,21,0,9,52,55,255,17,89,140,0,175,34,59,0,84,165,119,255,224,226,234,255,7,72,166,255,123,115,255,1,18,214,246,0,250,7,71,1,217,220,185,0,212,35,76,255,38,125,175,0,189,97,210,0,114,238,44,255,41,188,169,254,45,186,154,0,81,92,22,0,132,160,193,0,121,208,98,255,13,81,44,255,203,156,82,0,71,58,21,255,208,114,191,254,50,38,147,0,154,216,195,0,101,25,18,0,60,250,215,255,233,132,235,255,103,175,142,1,16,14,92,0,141,31,110,254,238,241,45,255,153,217,239,1,97,168,47,255,249,85,16,1,28,175,62,255,57,254,54,0,222,231,126,0,166,45,117,254,18,189,96,255,228,76,50,0,200,244,94,0,198,152,120,1,68,34,69,255,12,65,160,254,101,19,90,0,167,197,120,255,68,54,185,255,41,218,188,0,113,168,48,0,88,105,189,1,26,82,32,255,185,93,164,1,228,240,237,255,66,182,53,0,171,197,92,255,107,9,233,1,199,120,144,255,78,49,10,255,109,170,105,255,90,4,31,255,28,244,113,255,74,58,11,0,62,220,246,255,121,154,200,254,144,210,178,255,126,57,129,1,43,250,14,255,101,111,28,1,47,86,241,255,61,70,150,255,53,73,5,255,30,26,158,0,209,26,86,0,138,237,74,0,164,95,188,0,142,60,29,254,162,116,248,255,187,175,160,0,151,18,16,0,209,111,65,254,203,134,39,255,88,108,49,255,131,26,71,255,221,27,215,254,104,105,93,255,31,236,31,254,135,0,211,255,143,127,110,1,212,73,229,0,233,67,167,254,195,1,208,255,132,17,221,255,51,217,90,0,67,235,50,255,223,210,143,0,179,53,130,1,233,106,198,0,217,173,220,255,112,229,24,255,175,154,93,254,71,203,246,255,48,66,133,255,3,136,230,255,23,221,113,254,235,111,213,0,170,120,95,254,251,221,2,0,45,130,158,254,105,94,217,255,242,52,180,254,213,68,45,255,104,38,28,0,244,158,76,0,161,200,96,255,207,53,13,255,187,67,148,0,170,54,248,0,119,162,178,255,83,20,11,0,42,42,192,1,146,159,163,255,183,232,111,0,77,229,21,255,71,53,143,0,27,76,34],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([246,136,47,255,219,39,182,255,92,224,201,1,19,142,14,255,69,182,241,255,163,118,245,0,9,109,106,1,170,181,247,255,78,47,238,255,84,210,176,255,213,107,139,0,39,38,11,0,72,21,150,0,72,130,69,0,205,77,155,254,142,133,21,0,71,111,172,254,226,42,59,255,179,0,215,1,33,128,241,0,234,252,13,1,184,79,8,0,110,30,73,255,246,141,189,0,170,207,218,1,74,154,69,255,138,246,49,255,155,32,100,0,125,74,105,255,90,85,61,255,35,229,177,255,62,125,193,255,153,86,188,1,73,120,212,0,209,123,246,254,135,209,38,255,151,58,44,1,92,69,214,255,14,12,88,255,252,153,166,255,253,207,112,255,60,78,83,255,227,124,110,0,180,96,252,255,53,117,33,254,164,220,82,255,41,1,27,255,38,164,166,255,164,99,169,254,61,144,70,255,192,166,18,0,107,250,66,0,197,65,50,0,1,179,18,255,255,104,1,255,43,153,35,255,80,111,168,0,110,175,168,0,41,105,45,255,219,14,205,255,164,233,140,254,43,1,118,0,233,67,195,0,178,82,159,255,138,87,122,255,212,238,90,255,144,35,124,254,25,140,164,0,251,215,44,254,133,70,107,255,101,227,80,254,92,169,55,0,215,42,49,0,114,180,85,255,33,232,27,1,172,213,25,0,62,176,123,254,32,133,24,255,225,191,62,0,93,70,153,0,181,42,104,1,22,191,224,255,200,200,140,255,249,234,37,0,149,57,141,0,195,56,208,255,254,130,70,255,32,173,240,255,29,220,199,0,110,100,115,255,132,229,249,0,228,233,223,255,37,216,209,254,178,177,209,255,183,45,165,254,224,97,114,0,137,97,168,255,225,222,172,0,165,13,49,1,210,235,204,255,252,4,28,254,70,160,151,0,232,190,52,254,83,248,93,255,62,215,77,1,175,175,179,255,160,50,66,0,121,48,208,0,63,169,209,255,0,210,200,0,224,187,44,1,73,162,82,0,9,176,143,255,19,76,193,255,29,59,167,1,24,43,154,0,28,190,190,0,141,188,129,0,232,235,203,255,234,0,109,255,54,65,159,0,60,88,232,255,121,253,150,254,252,233,131,255,198,110,41,1,83,77,71,255,200,22,59,254,106,253,242,255,21,12,207,255,237,66,189,0,90,198,202,1,225,172,127,0,53,22,202,0,56,230,132,0,1,86,183,0,109,190,42,0,243,68,174,1,109,228,154,0,200,177,122,1,35,160,183,255,177,48,85,255,90,218,169,255,248,152,78,0,202,254,110,0,6,52,43,0,142,98,65,255,63,145,22,0,70,106,93,0,232,138,107,1,110,179,61,255,211,129,218,1,242,209,92,0,35,90,217,1,182,143,106,255,116,101,217,255,114,250,221,255,173,204,6,0,60,150,163,0,73,172,44,255,239,110,80,255,237,76,153,254,161,140,249,0,149,232,229,0,133,31,40,255,174,164,119,0,113,51,214,0,129,228,2,254,64,34,243,0,107,227,244,255,174,106,200,255,84,153,70,1,50,35,16,0,250,74,216,254,236,189,66,255,153,249,13,0,230,178,4,255,221,41,238,0,118,227,121,255,94,87,140,254,254,119,92,0,73,239,246,254,117,87,128,0,19,211,145,255,177,46,252,0,229,91,246,1,69,128,247,255,202,77,54,1,8,11,9,255,153,96,166,0,217,214,173,255,134,192,2,1,0,207,0,0,189,174,107,1,140,134,100,0,158,193,243,1,182,102,171,0,235,154,51,0,142,5,123,255,60,168,89,1,217,14,92,255,19,214,5,1,211,167,254,0,44,6,202,254,120,18,236,255,15,113,184,255,184,223,139,0,40,177,119,254,182,123,90,255,176,165,176,0,247,77,194,0,27,234,120,0,231,0,214,255,59,39,30,0,125,99,145,255,150,68,68,1,141,222,248,0,153,123,210,255,110,127,152,255,229,33,214,1,135,221,197,0,137,97,2,0,12,143,204,255,81,41,188,0,115,79,130,255,94,3,132,0,152,175,187,255,124,141,10,255,126,192,179,255,11,103,198,0,149,6,45,0,219,85,187,1,230,18,178,255,72,182,152,0,3,198,184,255,128,112,224,1,97,161,230,0,254,99,38,255,58,159,197,0,151,66,219,0,59,69,143,255,185,112,249,0,119,136,47,255,123,130,132,0,168,71,95,255,113,176,40,1,232,185,173,0,207,93,117,1,68,157,108,255,102,5,147,254,49,97,33,0,89,65,111,254,247,30,163,255,124,217,221,1,102,250,216,0,198,174,75,254,57,55,18,0,227,5,236,1,229,213,173,0,201,109,218,1,49,233,239,0,30,55,158,1,25,178,106,0,155,111,188,1,94,126,140,0,215,31,238,1,77,240,16,0,213,242,25,1,38,71,168,0,205,186,93,254,49,211,140,255,219,0,180,255,134,118,165,0,160,147,134,255,110,186,35,255,198,243,42,0,243,146,119,0,134,235,163,1,4,241,135,255,193,46,193,254,103,180,79,255,225,4,184,254,242,118,130,0,146,135,176,1,234,111,30,0,69,66,213,254,41,96,123,0,121,94,42,255,178,191,195,255,46,130,42,0,117,84,8,255,233,49,214,254,238,122,109,0,6,71,89,1,236,211,123,0,244,13,48,254,119,148,14,0,114,28,86,255,75,237,25,255,145,229,16,254,129,100,53,255,134,150,120,254,168,157,50,0,23,72,104,255,224,49,14,0,255,123,22,255,151,185,151,255,170,80,184,1,134,182,20,0,41,100,101,1,153,33,16,0,76,154,111,1,86,206,234,255,192,160,164,254,165,123,93,255,1,216,164,254,67,17,175,255,169,11,59,255,158,41,61,255,73,188,14,255,195,6,137,255,22,147,29,255,20,103,3,255,246,130,227,255,122,40,128,0,226,47,24,254,35,36,32,0,152,186,183,255,69,202,20,0,195,133,195,0,222,51,247,0,169,171,94,1,183,0,160,255,64,205,18,1,156,83,15,255,197,58,249,254,251,89,110,255,50,10,88,254,51,43,216,0,98,242,198,1,245,151,113,0,171,236,194,1,197,31,199,255,229,81,38,1,41,59,20,0,253,104,230,0,152,93,14,255,246,242,146,254,214,169,240,255,240,102,108,254,160,167,236,0,154,218,188,0,150,233,202,255,27,19,250,1,2,71,133,255,175,12,63,1,145,183,198,0,104,120,115,255,130,251,247,0,17,212,167,255,62,123,132,255,247,100,189,0,155,223,152,0,143,197,33,0,155,59,44,255,150,93,240,1,127,3,87,255,95,71,207,1,167,85,1,255,188,152,116,255,10,23,23,0,137,195,93,1,54,98,97,0,240,0,168,255,148,188,127,0,134,107,151,0,76,253,171,0,90,132,192,0,146,22,54,0,224,66,54,254,230,186,229,255,39,182,196,0,148,251,130,255,65,131,108,254,128,1,160,0,169,49,167,254,199,254,148,255,251,6,131,0,187,254,129,255,85,82,62,0,178,23,58,255,254,132,5,0,164,213,39,0,134,252,146,254,37,53,81,255,155,134,82,0,205,167,238,255,94,45,180,255,132,40,161,0,254,111,112,1,54,75,217,0,179,230,221,1,235,94,191,255,23,243,48,1,202,145,203,255,39,118,42,255,117,141,253,0,254,0,222,0,43,251,50,0,54,169,234,1,80,68,208,0,148,203,243,254,145,7,135,0,6,254,0,0,252,185,127,0,98,8,129,255,38,35,72,255,211,36,220,1,40,26,89,0,168,64,197,254,3,222,239,255,2,83,215,254,180,159,105,0,58,115,194,0,186,116,106,255,229,247,219,255,129,118,193,0,202,174,183,1,166,161,72,0,201,107,147,254,237,136,74,0,233,230,106,1,105,111,168,0,64,224,30,1,1,229,3,0,102,151,175,255,194,238,228,255,254,250,212,0,187,237,121,0,67,251,96,1,197,30,11,0,183,95,204,0,205,89,138,0,64,221,37,1,255,223,30,255,178,48,211,255,241,200,90,255,167,209,96,255,57,130,221,0,46,114,200,255,61,184,66,0,55,182,24,254,110,182,33,0,171,190,232,255,114,94,31,0,18,221,8,0,47,231,254,0,255,112,83,0,118,15,215,255,173,25,40,254,192,193,31,255,238,21,146,255,171,193,118,255,101,234,53,254,131,212,112,0,89,192,107,1,8,208,27,0,181,217,15,255,231,149,232,0,140,236,126,0,144,9,199,255,12,79,181,254,147,182,202,255,19,109,182,255,49,212,225,0,74,163,203,0,175,233,148,0,26,112,51,0,193,193,9,255,15,135,249,0,150,227,130,0,204,0,219,1,24,242,205,0,238,208,117,255,22,244,112,0,26,229,34,0,37,80,188,255,38,45,206,254,240,90,225,255,29,3,47,255,42,224,76,0,186,243,167,0,32,132,15,255,5,51,125,0,139,135,24,0,6,241,219,0,172,229,133,255,246,214,50,0,231,11,207,255,191,126,83,1,180,163,170,255,245,56,24,1,178,164,211,255,3,16,202,1,98,57,118,255,141,131,89,254,33,51,24,0,243,149,91,255,253,52,14,0,35,169,67,254,49,30,88,255,179,27,36,255,165,140,183,0,58,189,151,0,88,31,0,0,75,169,66,0,66,101,199,255,24,216,199,1,121,196,26,255,14,79,203,254,240,226,81,255,94,28,10,255,83,193,240,255,204,193,131,255,94,15,86,0,218,40,157,0,51,193,209,0,0,242,177,0,102,185,247,0,158,109,116,0,38,135,91,0,223,175,149,0,220,66,1,255,86,60,232,0,25,96,37,255,225,122,162,1,215,187,168,255,158,157,46,0,56,171,162,0,232,240,101,1,122,22,9,0,51,9,21,255,53,25,238,255,217,30,232,254,125,169,148,0,13,232,102,0,148,9,37,0,165,97,141,1,228,131,41,0,222,15,243,255,254,18,17,0,6,60,237,1,106,3,113,0,59,132,189,0,92,112,30,0,105,208,213,0,48,84,179,255,187,121,231,254,27,216,109,255,162,221,107,254,73,239,195,255,250,31,57,255,149,135,89,255,185,23,115,1,3,163,157,255,18,112,250,0,25,57,187,255,161,96,164,0,47,16,243,0,12,141,251,254,67,234,184,255,41,18,161,0,175,6,96,255,160,172,52,254,24,176,183,255,198,193,85,1,124,121,137,255,151,50,114,255,220,203,60,255,207,239,5,1,0,38,107,255,55,238,94,254,70,152,94,0,213,220,77,1,120,17,69,255,85,164,190,255,203,234,81,0,38,49,37,254,61,144,124,0,137,78,49,254,168,247,48,0,95,164,252,0,105,169,135,0,253,228,134,0,64,166,75,0,81,73,20,255,207,210,10,0,234,106,150,255,94,34,90,255,254,159,57,254,220,133,99,0,139,147,180,254,24,23,185,0,41,57,30,255,189,97,76,0,65,187,223,255,224,172,37,255,34,62,95,1,231,144,240,0,77,106,126,254,64,152,91,0,29,98,155,0,226,251,53,255,234,211,5,255,144,203,222,255,164,176,221,254,5,231,24,0,179,122,205,0,36,1,134,255,125,70,151,254,97,228,252,0,172,129,23,254,48,90,209,255,150,224,82,1,84,134,30,0,241,196,46,0,103,113,234,255,46,101,121,254,40,124,250,255,135,45,242,254,9,249,168,255,140,108,131,255,143,163,171,0,50,173,199,255,88,222,142,255,200,95,158,0,142,192,163,255,7,117,135,0,111,124,22,0,236,12,65,254,68,38,65,255,227,174,254,0,244,245,38,0,240,50,208,255,161,63,250,0,60,209,239,0,122,35,19,0,14,33,230,254,2,159,113,0,106,20,127,255,228,205,96,0,137,210,174,254,180,212,144,255,89,98,154,1,34,88,139,0,167,162,112,1,65,110,197,0,241,37,169,0,66,56,131,255,10,201,83,254,133,253,187,255,177,112,45,254,196,251,0,0,196,250,151,255,238,232,214,255,150,209,205,0,28,240,118,0,71,76,83,1,236,99,91,0,42,250,131,1,96,18,64,255,118,222,35,0,113,214,203,255,122,119,184,255,66,19,36,0,204,64,249,0,146,89,139,0,134,62,135,1,104,233,101,0,188,84,26,0,49,249,129,0,208,214,75,255,207,130,77,255,115,175,235,0,171,2,137,255,175,145,186,1,55,245,135,255,154,86,181,1,100,58,246,255,109,199,60,255,82,204,134,255,215,49,230,1,140,229,192,255,222,193,251,255,81,136,15,255,179,149,162,255,23,39,29,255,7,95,75,254,191,81,222,0,241,81,90,255,107,49,201,255,244,211,157,0,222,140,149,255,65,219,56,254,189,246,90,255,178,59,157,1,48,219,52,0,98,34,215,0,28,17,187,255,175,169,24,0,92,79,161,255,236,200,194,1,147,143,234,0,229,225,7,1,197,168,14,0,235,51,53,1,253,120,174,0,197,6,168,255,202,117,171,0,163,21,206,0,114,85,90,255,15,41,10,255,194,19,99,0,65,55,216,254,162,146,116,0,50,206,212,255,64,146,29,255,158,158,131,1,100,165,130,255,172,23,129,255,125,53,9,255,15,193,18,1,26,49,11,255,181,174,201,1,135,201,14,255,100,19,149,0,219,98,79,0,42,99,143,254,96,0,48,255,197,249,83,254,104,149,79,255,235,110,136,254,82,128,44,255,65,41,36,254,88,211,10,0,187,121,187,0,98,134,199,0,171,188,179,254,210,11,238,255,66,123,130,254,52,234,61,0,48,113,23,254,6,86,120,255,119,178,245,0,87,129,201,0,242,141,209,0,202,114,85,0,148,22,161,0,103,195,48,0,25,49,171,255,138,67,130,0,182,73,122,254,148,24,130,0,211,229,154,0,32,155,158,0,84,105,61,0,177,194,9,255,166,89,86,1,54,83,187,0,249,40,117,255,109,3,215,255,53,146,44,1,63,47,179,0,194,216,3,254,14,84,136,0,136,177,13,255,72,243,186,255,117,17,125,255,211,58,211,255,93,79,223,0,90,88,245,255,139,209,111,255,70,222,47,0,10,246,79,255,198,217,178,0,227,225,11,1,78,126,179,255,62,43,126,0,103,148,35,0,129,8,165,254,245,240,148,0,61,51,142,0,81,208,134,0,15,137,115,255,211,119,236,255,159,245,248,255,2,134,136,255,230,139,58,1,160,164,254,0,114,85,141,255,49,166,182,255,144,70,84,1,85,182,7,0,46,53,93,0,9,166,161,255,55,162,178,255,45,184,188,0,146,28,44,254,169,90,49,0,120,178,241,1,14,123,127,255,7,241,199,1,189,66,50,255,198,143,101,254,189,243,135,255,141,24,24,254,75,97,87,0,118,251,154,1,237,54,156,0,171,146,207,255,131,196,246,255,136,64,113,1,151,232,57,0,240,218,115,0,49,61,27,255,64,129,73,1,252,169,27,255,40,132,10,1,90,201,193,255,252,121,240,1,186,206,41,0,43,198,97,0,145,100,183,0,204,216,80,254,172,150,65,0,249,229,196,254,104,123,73,255,77,104,96,254,130,180,8,0,104,123,57,0,220,202,229,255,102,249,211,0,86,14,232,255,182,78,209,0,239,225,164,0,106,13,32,255,120,73,17,255,134,67,233,0,83,254,181,0,183,236,112,1,48,64,131,255,241,216,243,255,65,193,226,0,206,241,100,254,100,134,166,255,237,202,197,0,55,13,81,0,32,124,102,255,40,228,177,0,118,181,31,1,231,160,134,255,119,187,202,0,0,142,60,255,128,38,189,255,166,201,150,0,207,120,26,1,54,184,172,0,12,242,204,254,133,66,230,0,34,38,31,1,184,112,80,0,32,51,165,254,191,243,55,0,58,73,146,254,155,167,205,255,100,104,152,255,197,254,207,255,173,19,247,0,238,10,202,0,239,151,242,0,94,59,39,255,240,29,102,255,10,92,154,255,229,84,219,255,161,129,80,0,208,90,204,1,240,219,174,255,158,102,145,1,53,178,76,255,52,108,168,1,83,222,107,0,211,36,109,0,118,58,56,0,8,29,22,0,237,160,199,0,170,209,157,0,137,71,47,0,143,86,32,0,198,242,2,0,212,48,136,1,92,172,186,0,230,151,105,1,96,191,229,0,138,80,191,254,240,216,130,255,98,43,6,254,168,196,49,0,253,18,91,1,144,73,121,0,61,146,39,1,63,104,24,255,184,165,112,254,126,235,98,0,80,213,98,255,123,60,87,255,82,140,245,1,223,120,173,255,15,198,134,1,206,60,239,0,231,234,92,255,33,238,19,255,165,113,142,1,176,119,38,0,160,43,166,254,239,91,105,0,107,61,194,1,25,4,68,0,15,139,51,0,164,132,106,255,34,116,46,254,168,95,197,0,137,212,23,0,72,156,58,0,137,112,69,254,150,105,154,255,236,201,157,0,23,212,154,255,136,82,227,254,226,59,221,255,95,149,192,0,81,118,52,255,33,43,215,1,14,147,75,255,89,156,121,254,14,18,79,0,147,208,139,1,151,218,62,255,156,88,8,1,210,184,98,255,20,175,123,255,102,83,229,0,220,65,116,1,150,250,4,255,92,142,220,255,34,247,66,255,204,225,179,254,151,81,151,0,71,40,236,255,138,63,62,0,6,79,240,255,183,185,181,0,118,50,27,0,63,227,192,0,123,99,58,1,50,224,155,255,17,225,223,254,220,224,77,255,14,44,123,1,141,128,175,0,248,212,200,0,150,59,183,255,147,97,29,0,150,204,181,0,253,37,71,0,145,85,119,0,154,200,186,0,2,128,249,255,83,24,124,0,14,87,143,0,168,51,245,1,124,151,231,255,208,240,197,1,124,190,185,0,48,58,246,0,20,233,232,0,125,18,98,255,13,254,31,255,245,177,130,255,108,142,35,0,171,125,242,254,140,12,34,255,165,161,162,0,206,205,101,0,247,25,34,1,100,145,57,0,39,70,57,0,118,204,203,255,242,0,162,0,165,244,30,0,198,116,226,0,128,111,153,255,140,54,182,1,60,122,15,255,155,58,57,1,54,50,198,0,171,211,29,255,107,138,167,255,173,107,199,255,109,161,193,0,89,72,242,255,206,115,89,255,250,254,142,254,177,202,94,255,81,89,50,0,7,105,66,255,25,254,255,254,203,64,23,255,79,222,108,255,39,249,75,0,241,124,50,0,239,152,133,0,221,241,105,0,147,151,98,0,213,161,121,254,242,49,137,0,233,37,249,254,42,183,27,0,184,119,230,255,217,32,163,255,208,251,228,1,137,62,131,255,79,64,9,254,94,48,113,0,17,138,50,254,193,255,22,0,247,18,197,1,67,55,104,0,16,205,95,255,48,37,66,0,55,156,63,1,64,82,74,255,200,53,71,254,239,67,125,0,26,224,222,0,223,137,93,255,30,224,202,255,9,220,132,0,198,38,235,1,102,141,86,0,60,43,81,1,136,28,26,0,233,36,8,254,207,242,148,0,164,162,63,0,51,46,224,255,114,48,79,255,9,175,226,0,222,3,193,255,47,160,232,255,255,93,105,254,14,42,230,0,26,138,82,1,208,43,244,0,27,39,38,255,98,208,127,255,64,149,182,255,5,250,209,0,187,60,28,254,49,25,218,255,169,116,205,255,119,18,120,0,156,116,147,255,132,53,109,255,13,10,202,0,110,83,167,0,157,219,137,255,6,3,130,255,50,167,30,255,60,159,47,255,129,128,157,254,94,3,189,0,3,166,68,0,83,223,215,0,150,90,194,1,15,168,65,0,227,83,51,255,205,171,66,255,54,187,60,1,152,102,45,255,119,154,225,0,240,247,136,0,100,197,178,255,139,71,223,255,204,82,16,1,41,206,42,255,156,192,221,255,216,123,244,255,218,218,185,255,187,186,239,255,252,172,160,255,195,52,22,0,144,174,181,254,187,100,115,255,211,78,176,255,27,7,193,0,147,213,104,255,90,201,10,255,80,123,66,1,22,33,186,0,1,7,99,254,30,206,10,0,229,234,5,0,53,30,210,0,138,8,220,254,71,55,167,0,72,225,86,1,118,190,188,0,254,193,101,1,171,249,172,255,94,158,183,254,93,2,108,255,176,93,76,255,73,99,79,255,74,64,129,254,246,46,65,0,99,241,127,254,246,151,102,255,44,53,208,254,59,102,234,0,154,175,164,255,88,242,32,0,111,38,1,0,255,182,190,255,115,176,15,254,169,60,129,0,122,237,241,0,90,76,63,0,62,74,120,255,122,195,110,0,119,4,178,0,222,242,210,0,130,33,46,254,156,40,41,0,167,146,112,1,49,163,111,255,121,176,235,0,76,207,14,255,3,25,198,1,41,235,213,0,85,36,214,1,49,92,109,255,200,24,30,254,168,236,195,0,145,39,124,1,236,195,149,0,90,36,184,255,67,85,170,255,38,35,26,254,131,124,68,255,239,155,35,255,54,201,164,0,196,22,117,255,49,15,205,0,24,224,29,1,126,113,144,0,117,21,182,0,203,159,141,0,223,135,77,0,176,230,176,255,190,229,215,255,99,37,181,255,51,21,138,255,25,189,89,255,49,48,165,254,152,45,247,0,170,108,222,0,80,202,5,0,27,69,103,254,204,22,129,255,180,252,62,254,210,1,91,255,146,110,254,255,219,162,28,0,223,252,213,1,59,8,33,0,206,16,244,0,129,211,48,0,107,160,208,0,112,59,209,0,109,77,216,254,34,21,185,255,246,99,56,255,179,139,19,255,185,29,50,255,84,89,19,0,74,250,98,255,225,42,200,255,192,217,205,255,210,16,167,0,99,132,95,1,43,230,57,0,254,11,203,255,99,188,63,255,119,193,251,254,80,105,54,0,232,181,189,1,183,69,112,255,208,171,165,255,47,109,180,255,123,83,165,0,146,162,52,255,154,11,4,255,151,227,90,255,146,137,97,254,61,233,41,255,94,42,55,255,108,164,236,0,152,68,254,0,10,140,131,255,10,106,79,254,243,158,137,0,67,178,66,254,177,123,198,255,15,62,34,0,197,88,42,255,149,95,177,255,152,0,198,255,149,254,113,255,225,90,163,255,125,217,247,0,18,17,224,0,128,66,120,254,192,25,9,255,50,221,205,0,49,212,70,0,233,255,164,0,2,209,9,0,221,52,219,254,172,224,244,255,94,56,206,1,242,179,2,255,31,91,164,1,230,46,138,255,189,230,220,0,57,47,61,255,111,11,157,0,177,91,152,0,28,230,98,0,97,87,126,0,198,89,145,255,167,79,107,0,249,77,160,1,29,233,230,255,150,21,86,254,60,11,193,0,151,37,36,254,185,150,243,255,228,212,83,1,172,151,180,0,201,169,155,0,244,60,234,0,142,235,4,1,67,218,60,0,192,113,75,1,116,243,207,255,65,172,155,0,81,30,156,255,80,72,33,254,18,231,109,255,142,107,21,254,125,26,132,255,176,16,59,255,150,201,58,0,206,169,201,0,208,121,226,0,40,172,14,255,150,61,94,255,56,57,156,255,141,60,145,255,45,108,149,255,238,145,155,255,209,85,31,254,192,12,210,0,99,98,93,254,152,16,151,0,225,185,220,0,141,235,44,255,160,172,21,254,71,26,31,255,13,64,93,254,28,56,198,0,177,62,248,1,182,8,241,0,166,101,148,255,78,81,133,255,129,222,215,1,188,169,129,255,232,7,97,0,49,112,60,255,217,229,251,0,119,108,138,0,39,19,123,254,131,49,235,0,132,84,145,0,130,230,148,255,25,74,187,0,5,245,54,255,185,219,241,1,18,194,228,255,241,202,102,0,105,113,202,0,155,235,79,0,21,9,178,255,156,1,239,0,200,148,61,0,115,247,210,255,49,221,135,0,58,189,8,1,35,46,9,0,81,65,5,255,52,158,185,255,125,116,46,255,74,140,13,255,210,92,172,254,147,23,71,0,217,224,253,254,115,108,180,255,145,58,48,254,219,177,24,255,156,255,60,1,154,147,242,0,253,134,87,0,53,75,229,0,48,195,222,255,31,175,50,255,156,210,120,255,208,35,222,255,18,248,179,1,2,10,101,255,157,194,248,255,158,204,101,255,104,254,197,255,79,62,4,0,178,172,101,1,96,146,251,255,65,10,156,0,2,137,165,255,116,4,231,0,242,215,1,0,19,35,29,255,43,161,79,0,59,149,246,1,251,66,176,0,200,33,3,255,80,110,142,255,195,161,17,1,228,56,66,255,123,47,145,254,132,4,164,0,67,174,172,0,25,253,114,0,87,97,87,1,250,220,84,0,96,91,200,255,37,125,59,0,19,65,118,0,161,52,241,255,237,172,6,255,176,191,255,255,1,65,130,254,223,190,230,0,101,253,231,255,146,35,109,0,250,29,77,1,49,0,19,0,123,90,155,1,22,86,32,255,218,213,65,0,111,93,127,0,60,93,169,255,8,127,182,0,17,186,14,254,253,137,246,255,213,25,48,254,76,238,0,255,248,92,70,255,99,224,139,0,184,9,255,1,7,164,208,0,205,131,198,1,87,214,199,0,130,214,95,0,221,149,222,0,23,38,171,254,197,110,213,0,43,115,140,254,215,177,118,0,96,52,66,1,117,158,237,0,14,64,182,255,46,63,174,255,158,95,190,255,225,205,177,255,43,5,142,255,172,99,212,255,244,187,147,0,29,51,153,255,228,116,24,254,30,101,207,0,19,246,150,255,134,231,5,0,125,134,226,1,77,65,98,0,236,130,33,255,5,110,62,0,69,108,127,255,7,113,22,0,145,20,83,254,194,161,231,255,131,181,60,0,217,209,177,255,229,148,212,254,3,131,184,0,117,177,187,1,28,14,31,255,176,102,80,0,50,84,151,255,125,31,54,255,21,157,133,255,19,179,139,1,224,232,26,0,34,117,170,255,167,252,171,255,73,141,206,254,129,250,35,0,72,79,236,1,220,229,20,255,41,202,173,255,99,76,238,255,198,22,224,255,108,198,195,255,36,141,96,1,236,158,59,255,106,100,87,0,110,226,2,0,227,234,222,0,154,93,119,255,74,112,164,255,67,91,2,255,21,145,33,255,102,214,137,255,175,230,103,254,163,246,166,0,93,247,116,254,167,224,28,255,220,2,57,1,171,206,84,0,123,228,17,255,27,120,119,0,119,11,147,1,180,47,225,255,104,200,185,254,165,2,114,0,77,78,212,0,45,154,177,255,24,196,121,254,82,157,182,0,90,16,190,1,12,147,197,0,95,239,152,255,11,235,71,0,86,146,119,255,172,134,214,0,60,131,196,0,161,225,129,0,31,130,120,254,95,200,51,0,105,231,210,255,58,9,148,255,43,168,221,255,124,237,142,0,198,211,50,254,46,245,103,0,164,248,84,0,152,70,208,255,180,117,177,0,70,79,185,0,243,74,32,0,149,156,207,0,197,196,161,1,245,53,239,0,15,93,246,254,139,240,49,255,196,88,36,255,162,38,123,0,128,200,157,1,174,76,103,255,173,169,34,254,216,1,171,255,114,51,17,0,136,228,194,0,110,150,56,254,106,246,159,0,19,184,79,255,150,77,240,255,155,80,162,0,0,53,169,255,29,151,86,0,68,94,16,0,92,7,110,254,98,117,149,255,249,77,230,255,253,10,140,0,214,124,92,254,35,118,235,0,89,48,57,1,22,53,166,0,184,144,61,255,179,255,194,0,214,248,61,254,59,110,246,0,121,21,81,254,166,3,228,0,106,64,26,255,69,232,134,255,242,220,53,254,46,220,85,0,113,149,247,255,97,179,103,255,190,127,11,0,135,209,182,0,95,52,129,1,170,144,206,255,122,200,204,255,168,100,146,0,60,144,149,254,70,60,40,0,122,52,177,255,246,211,101,255,174,237,8,0,7,51,120,0,19,31,173,0,126,239,156,255,143,189,203,0,196,128,88,255,233,133,226,255,30,125,173,255,201,108,50,0,123,100,59,255,254,163,3,1,221,148,181,255,214,136,57,254,222,180,137,255,207,88,54,255,28,33,251,255,67,214,52,1,210,208,100,0,81,170,94,0,145,40,53,0,224,111,231,254,35,28,244,255,226,199,195,254,238,17,230,0,217,217,164,254,169,157,221,0,218,46,162,1,199,207,163,255,108,115,162,1,14,96,187,255,118,60,76,0,184,159,152,0,209,231,71,254,42,164,186,255,186,153,51,254,221,171,182,255,162,142,173,0,235,47,193,0,7,139,16,1,95,164,64,255,16,221,166,0,219,197,16,0,132,29,44,255,100,69,117,255,60,235,88,254,40,81,173,0,71,190,61,255,187,88,157,0,231,11,23,0,237,117,164,0,225,168,223,255,154,114,116,255,163,152,242,1,24,32,170,0,125,98,113,254,168,19,76,0,17,157,220,254,155,52,5,0,19,111,161,255,71,90,252,255,173,110,240,0,10,198,121,255,253,255,240,255,66,123,210,0,221,194,215,254,121,163,17,255,225,7,99,0,190,49,182,0,115,9,133,1,232,26,138,255,213,68,132,0,44,119,122,255,179,98,51,0,149,90,106,0,71,50,230,255,10,153,118,255,177,70,25,0,165,87,205,0,55,138,234,0,238,30,97,0,113,155,207,0,98,153,127,0,34,107,219,254,117,114,172,255,76,180,255,254,242,57,179,255,221,34,172,254,56,162,49,255,83,3,255,255,113,221,189,255,188,25,228,254,16,88,89,255,71,28,198,254,22,17,149,255,243,121,254,255,107,202,99,255,9,206,14,1,220,47,153,0,107,137,39,1,97,49,194,255,149,51,197,254,186,58,11,255,107,43,232,1,200,6,14,255,181,133,65,254,221,228,171,255,123,62,231,1,227,234,179,255,34,189,212,254,244,187,249,0,190,13,80,1,130,89,1,0,223,133,173,0,9,222,198,255,66,127,74,0,167,216,93,255,155,168,198,1,66,145,0,0,68,102,46,1,172,90,154,0,216,128,75,255,160,40,51,0,158,17,27,1,124,240,49,0,236,202,176,255,151,124,192,255,38,193,190,0,95,182,61,0,163,147,124,255,255,165,51,255,28,40,17,254,215,96,78,0,86,145,218,254,31,36,202,255,86,9,5,0,111,41,200,255,237,108,97,0,57,62,44,0,117,184,15,1,45,241,116,0,152,1,220,255,157,165,188,0,250,15,131,1,60,44,125,255,65,220,251,255,75,50,184,0,53,90,128,255,231,80,194,255,136,129,127,1,21,18,187,255,45,58,161,255,71,147,34,0,174,249,11,254,35,141,29,0,239,68,177,255,115,110,58,0,238,190,177,1,87,245,166,255,190,49,247,255,146,83,184,255,173,14,39,255,146,215,104,0,142,223,120,0,149,200,155,255,212,207,145,1,16,181,217,0,173,32,87,255,255,35,181,0,119,223,161,1,200,223,94,255,70,6,186,255,192,67,85,255,50,169,152,0,144,26,123,255,56,243,179,254,20,68,136,0,39,140,188,254,253,208,5,255,200,115,135,1,43,172,229,255,156,104,187,0,151,251,167,0,52,135,23,0,151,153,72,0,147,197,107,254,148,158,5,255,238,143,206,0,126,153,137,255,88,152,197,254,7,68,167,0,252,159,165,255,239,78,54,255,24,63,55,255,38,222,94,0,237,183,12,255,206,204,210,0,19,39,246,254,30,74,231,0,135,108,29,1,179,115,0,0,117,118,116,1,132,6,252,255,145,129,161,1,105,67,141,0,82,37,226,255,238,226,228,255,204,214,129,254,162,123,100,255,185,121,234,0,45,108,231,0,66,8,56,255,132,136,128,0,172,224,66,254,175,157,188,0,230,223,226,254,242,219,69,0,184,14,119,1,82,162,56,0,114,123,20,0,162,103,85,255,49,239,99,254,156,135,215,0,111,255,167,254,39,196,214,0,144,38,79,1,249,168,125,0,155,97,156,255,23,52,219,255,150,22,144,0,44,149,165,255,40,127,183,0,196,77,233,255,118,129,210,255,170,135,230,255,214,119,198,0,233,240,35,0,253,52,7,255,117,102,48,255,21,204,154,255,179,136,177,255,23,2,3,1,149,130,89,255,252,17,159,1,70,60,26,0,144,107,17,0,180,190,60,255,56,182,59,255,110,71,54,255,198,18,129,255,149,224,87,255,223,21,152,255,138,22,182,255,250,156,205,0,236,45,208,255,79,148,242,1,101,70,209,0,103,78,174,0,101,144,172,255,152,136,237,1,191,194,136,0,113,80,125,1,152,4,141,0,155,150,53,255,196,116,245,0,239,114,73,254,19,82,17,255,124,125,234,255,40,52,191,0,42,210,158,255,155,132,165,0,178,5,42,1,64,92,40,255,36,85,77,255,178,228,118,0,137,66,96,254,115,226,66,0,110,240,69,254,151,111,80,0,167,174,236,255,227,108,107,255,188,242,65,255,183,81,255,0,57,206,181,255,47,34,181,255,213,240,158,1,71,75,95,0,156,40,24,255,102,210,81,0,171,199,228,255,154,34,41,0,227,175,75,0,21,239,195,0,138,229,95,1,76,192,49,0,117,123,87,1,227,225,130,0,125,62,63,255,2,198,171,0,254,36,13,254,145,186,206,0,148,255,244,255,35,0,166,0,30,150,219,1,92,228,212,0,92,198,60,254,62,133,200,255,201,41,59,0,125,238,109,255,180,163,238,1,140,122,82,0,9,22,88,255,197,157,47,255,153,94,57,0,88,30,182,0,84,161,85,0,178,146,124,0,166,166,7,255,21,208,223,0,156,182,242,0,155,121,185,0,83,156,174,254,154,16,118,255,186,83,232,1,223,58,121,255,29,23,88,0,35,125,127,255,170,5,149,254,164,12,130,255,155,196,29,0,161,96,136,0,7,35,29,1,162,37,251,0,3,46,242,255,0,217,188,0,57,174,226,1,206,233,2,0,57,187,136,254,123,189,9,255,201,117,127,255,186,36,204,0,231,25,216,0,80,78,105,0,19,134,129,255,148,203,68,0,141,81,125,254,248,165,200,255,214,144,135,0,151,55,166,255,38,235,91,0,21,46,154,0,223,254,150,255,35,153,180,255,125,176,29,1,43,98,30,255,216,122,230,255,233,160,12,0,57,185,12,254,240,113,7,255,5,9,16,254,26,91,108,0,109,198,203,0,8,147,40,0,129,134,228,255,124,186,40,255,114,98,132,254,166,132,23,0,99,69,44,0,9,242,238,255,184,53,59,0,132,129,102,255,52,32,243,254,147,223,200,255,123,83,179,254,135,144,201,255,141,37,56,1,151,60,227,255,90,73,156,1,203,172,187,0,80,151,47,255,94,137,231,255,36,191,59,255,225,209,181,255,74,215,213,254,6,118,179,255,153,54,193,1,50,0,231,0,104,157,72,1,140,227,154,255,182,226,16,254,96,225,92,255,115,20,170,254,6,250,78,0,248,75,173,255,53,89,6,255,0,180,118,0,72,173,1,0,64,8,206,1,174,133,223,0,185,62,133,255,214,11,98,0,197,31,208,0,171,167,244,255,22,231,181,1,150,218,185,0,247,169,97,1,165,139,247,255,47,120,149,1,103,248,51,0,60,69,28,254,25,179,196,0,124,7,218,254,58,107,81,0,184,233,156,255,252,74,36,0,118,188,67,0,141,95,53,255,222,94,165,254,46,61,53,0,206,59,115,255,47,236,250,255,74,5,32,1,129,154,238,255,106,32,226,0,121,187,61,255,3,166,241,254,67,170,172,255,29,216,178,255,23,201,252,0,253,110,243,0,200,125,57,0,109,192,96,255,52,115,238,0,38,121,243,255,201,56,33,0,194,118,130,0,75,96,25,255,170,30,230,254,39,63,253,0,36,45,250,255,251,1,239,0,160,212,92,1,45,209,237,0,243,33,87,254,237,84,201,255,212,18,157,254,212,99,127,255,217,98,16,254,139,172,239,0,168,201,130,255,143,193,169,255,238,151,193,1,215,104,41,0,239,61,165,254,2,3,242,0,22,203,177,254,177,204,22,0,149,129,213,254,31,11,41,255,0,159,121,254,160,25,114,255,162,80,200,0,157,151,11,0,154,134,78,1,216,54,252,0,48,103,133,0,105,220,197,0,253,168,77,254,53,179,23,0,24,121,240,1,255,46,96,255,107,60,135,254,98,205,249,255,63,249,119,255,120,59,211,255,114,180,55,254,91,85,237,0,149,212,77,1,56,73,49,0,86,198,150,0,93,209,160,0,69,205,182,255,244,90,43,0,20,36,176,0,122,116,221,0,51,167,39,1,231,1,63,255,13,197,134,0,3,209,34,255,135,59,202,0,167,100,78,0,47,223,76,0,185,60,62,0,178,166,123,1,132,12,161,255,61,174,43,0,195,69,144,0,127,47,191,1,34,44,78,0,57,234,52,1,255,22,40,255,246,94,146,0,83,228,128,0,60,78,224,255,0,96,210,255,153,175,236,0,159,21,73,0,180,115,196,254,131,225,106,0,255,167,134,0,159,8,112,255,120,68,194,255,176,196,198,255,118,48,168,255,93,169,1,0,112,200,102,1,74,24,254,0,19,141,4,254,142,62,63,0,131,179,187,255,77,156,155,255,119,86,164,0,170,208,146,255,208,133,154,255,148,155,58,255,162,120,232,254,252,213,155,0,241,13,42,0,94,50,131,0,179,170,112,0,140,83,151,255,55,119,84,1,140,35,239,255,153,45,67,1,236,175,39,0,54,151,103,255,158,42,65,255,196,239,135,254,86,53,203,0,149,97,47,254,216,35,17,255,70,3,70,1,103,36,90,255,40,26,173,0,184,48,13,0,163,219,217,255,81,6,1,255,221,170,108,254,233,208,93,0,100,201,249,254,86,36,35,255,209,154,30,1,227,201,251,255,2,189,167,254,100,57,3,0,13,128,41,0,197,100,75,0,150,204,235,255,145,174,59,0,120,248,149,255,85,55,225,0,114,210,53,254,199,204,119,0,14,247,74,1,63,251,129,0,67,104,151,1,135,130,80,0,79,89,55,255,117,230,157,255,25,96,143,0,213,145,5,0,69,241,120,1,149,243,95,255,114,42,20,0,131,72,2,0,154,53,20,255,73,62,109,0,196,102,152,0,41,12,204,255,122,38,11,1,250,10,145,0,207,125,148,0,246,244,222,255,41,32,85,1,112,213,126,0,162,249,86,1,71,198,127,255,81,9,21,1,98,39,4,255,204,71,45,1,75,111,137,0,234,59,231,0,32,48,95,255,204,31,114,1,29,196,181,255,51,241,167,254,93,109,142,0,104,144,45,0,235,12,181,255,52,112,164,0,76,254,202,255,174,14,162,0,61,235,147,255,43,64,185,254,233,125,217,0,243,88,167,254,74,49,8,0,156,204,66,0,124,214,123,0,38,221,118,1,146,112,236,0,114,98,177,0,151,89,199,0,87,197,112,0,185,149,161,0,44,96,165,0,248,179,20,255,188,219,216,254,40,62,13,0,243,142,141,0,229,227,206,255,172,202,35,255,117,176,225,255,82,110,38,1,42,245,14,255,20,83,97,0,49,171,10,0,242,119,120,0,25,232,61,0,212,240,147,255,4,115,56,255,145,17,239,254,202,17,251,255,249,18,245,255,99,117,239,0,184,4,179,255,246,237,51,255,37,239,137,255,166,112,166,255,81,188,33,255,185,250,142,255,54,187,173,0,208,112,201,0,246,43,228,1,104,184,88,255,212,52,196,255,51,117,108,255,254,117,155,0,46,91,15,255,87,14,144,255,87,227,204,0,83,26,83,1,159,76,227,0,159,27,213,1,24,151,108,0,117,144,179,254,137,209,82,0,38,159,10,0,115,133,201,0,223,182,156,1,110,196,93,255,57,60,233,0,5,167,105,255,154,197,164,0,96,34,186,255,147,133,37,1,220,99,190,0,1,167,84,255,20,145,171,0,194,197,251,254,95,78,133,255,252,248,243,255,225,93,131,255,187,134,196,255,216,153,170,0,20,118,158,254,140,1,118,0,86,158,15,1,45,211,41,255,147,1,100,254,113,116,76,255,211,127,108,1,103,15,48,0,193,16,102,1,69,51,95,255,107,128,157,0,137,171,233,0,90,124,144,1,106,161,182,0,175,76,236,1,200,141,172,255,163,58,104,0,233,180,52,255,240,253,14,255,162,113,254,255,38,239,138,254,52,46,166,0,241,101,33,254,131,186,156,0,111,208,62,255,124,94,160,255,31,172,254,0,112,174,56,255,188,99,27,255,67,138,251,0,125,58,128,1,156,152,174,255,178,12,247,255,252,84,158,0,82,197,14,254,172,200,83,255,37,39,46,1,106,207,167,0,24,189,34,0,131,178,144,0,206,213,4,0,161,226,210,0,72,51,105,255,97,45,187,255,78,184,223,255,176,29,251,0,79,160,86,255,116,37,178,0,82,77,213,1,82,84,141,255,226,101,212,1,175,88,199,255,245,94,247,1,172,118,109,255,166,185,190,0,131,181,120,0,87,254,93,255,134,240,73,255,32,245,143,255,139,162,103,255,179,98,18,254,217,204,112,0,147,223,120,255,53,10,243,0,166,140,150,0,125,80,200,255,14,109,219,255,91,218,1,255,252,252,47,254,109,156,116,255,115,49,127,1,204,87,211,255,148,202,217,255,26,85,249,255,14,245,134,1,76,89,169,255,242,45,230,0,59,98,172,255,114,73,132,254,78,155,49,255,158,126,84,0,49,175,43,255,16,182,84,255,157,103,35,0,104,193,109,255,67,221,154,0,201,172,1,254,8,162,88,0,165,1,29,255,125,155,229,255,30,154,220,1,103,239,92,0,220,1,109,255,202,198,1,0,94,2,142,1,36,54,44,0,235,226,158,255,170,251,214,255,185,77,9,0,97,74,242,0,219,163,149,255,240,35,118,255,223,114,88,254,192,199,3,0,106,37,24,255,201,161,118,255,97,89,99,1,224,58,103,255,101,199,147,254,222,60,99,0,234,25,59,1,52,135,27,0,102,3,91,254,168,216,235,0,229,232,136,0,104,60,129,0,46,168,238,0,39,191,67,0,75,163,47,0,143,97,98,255,56,216,168,1,168,233,252,255,35,111,22,255,92,84,43,0,26,200,87,1,91,253,152,0,202,56,70,0,142,8,77,0,80,10,175,1,252,199,76,0,22,110,82,255,129,1,194,0,11,128,61,1,87,14,145,255,253,222,190,1,15,72,174,0,85,163,86,254,58,99,44,255,45,24,188,254,26,205,15,0,19,229,210,254,248,67,195,0,99,71,184,0,154,199,37,255,151,243,121,255,38,51,75,255,201,85,130,254,44,65,250,0,57,147,243,254,146,43,59,255,89,28,53,0,33,84,24,255,179,51,18,254,189,70,83,0,11,156,179,1,98,134,119,0,158,111,111,0,119,154,73,255,200,63,140,254,45,13,13,255,154,192,2,254,81,72,42,0,46,160,185,254,44,112,6,0,146,215,149,1,26,176,104,0,68,28,87,1,236,50,153,255,179,128,250,254,206,193,191,255,166,92,137,254,53,40,239,0,210,1,204,254,168,173,35,0,141,243,45,1,36,50,109,255,15,242,194,255,227,159,122,255,176,175,202,254,70,57,72,0,40,223,56,0,208,162,58,255,183,98,93,0,15,111,12,0,30,8,76,255,132,127,246,255,45,242,103,0,69,181,15,255,10,209,30,0,3,179,121,0,241,232,218,1,123,199,88,255,2,210,202,1,188,130,81,255,94,101,208,1,103,36,45,0,76,193,24,1,95,26,241,255,165,162,187,0,36,114,140,0,202,66,5,255,37,56,147,0,152,11,243,1,127,85,232,255,250,135,212,1,185,177,113,0,90,220,75,255,69,248,146,0,50,111,50,0,92,22,80,0,244,36,115,254,163,100,82,255,25,193,6,1,127,61,36,0,253,67,30,254,65,236,170,255,161,17,215,254,63,175,140,0,55,127,4,0,79,112,233,0,109,160,40,0,143,83,7,255,65,26,238,255,217,169,140,255,78,94,189,255,0,147,190,255,147,71,186,254,106,77,127,255,233,157,233,1,135,87,237,255,208,13,236,1,155,109,36,255,180,100,218,0,180,163,18,0,190,110,9,1,17,63,123,255,179,136,180,255,165,123,123,255,144,188,81,254,71,240,108,255,25,112,11,255,227,218,51,255,167,50,234,255,114,79,108,255,31,19,115,255,183,240,99,0,227,87,143,255,72,217,248,255,102,169,95,1,129,149,149,0,238,133,12,1,227,204,35,0,208,115,26,1,102,8,234,0,112,88,143,1,144,249,14,0,240,158,172,254,100,112,119,0,194,141,153,254,40,56,83,255,121,176,46,0,42,53,76,255,158,191,154,0,91,209,92,0,173,13,16,1,5,72,226,255,204,254,149,0,80,184,207,0,100,9,122,254,118,101,171,255,252,203,0,254,160,207,54,0,56,72,249,1,56,140,13,255,10,64,107,254,91,101,52,255,225,181,248,1,139,255,132,0,230,145,17,0,233,56,23,0,119,1,241,255,213,169,151,255,99,99,9,254,185,15,191,255,173,103,109,1,174,13,251,255,178,88,7,254,27,59,68,255,10,33,2,255,248,97,59,0,26,30,146,1,176,147,10,0,95,121,207,1,188,88,24,0,185,94,254,254,115,55,201,0,24,50,70,0,120,53,6,0,142,66,146,0,228,226,249,255,104,192,222,1,173,68,219,0,162,184,36,255,143,102,137,255,157,11,23,0,125,45,98,0,235,93,225,254,56,112,160,255,70,116,243,1,153,249,55,255,129,39,17,1,241,80,244,0,87,69,21,1,94,228,73,255,78,66,65,255,194,227,231,0,61,146,87,255,173,155,23,255,112,116,219,254,216,38,11,255,131,186,133,0,94,212,187,0,100,47,91,0,204,254,175,255,222,18,215,254,173,68,108,255,227,228,79,255,38,221,213,0,163,227,150,254,31,190,18,0,160,179,11,1,10,90,94,255,220,174,88,0,163,211,229,255,199,136,52,0,130,95,221,255,140,188,231,254,139,113,128,255,117,171,236,254,49,220,20,255,59,20,171,255,228,109,188,0,20,225,32,254,195,16,174,0,227,254,136,1,135,39,105,0,150,77,206,255,210,238,226],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+10240);allocate([55,212,132,254,239,57,124,0,170,194,93,255,249,16,247,255,24,151,62,255,10,151,10,0,79,139,178,255,120,242,202,0,26,219,213,0,62,125,35,255,144,2,108,255,230,33,83,255,81,45,216,1,224,62,17,0,214,217,125,0,98,153,153,255,179,176,106,254,131,93,138,255,109,62,36,255,178,121,32,255,120,252,70,0,220,248,37,0,204,88,103,1,128,220,251,255,236,227,7,1,106,49,198,255,60,56,107,0,99,114,238,0,220,204,94,1,73,187,1,0,89,154,34,0,78,217,165,255,14,195,249,255,9,230,253,255,205,135,245,0,26,252,7,255,84,205,27,1,134,2,112,0,37,158,32,0,231,91,237,255,191,170,204,255,152,7,222,0,109,192,49,0,193,166,146,255,232,19,181,255,105,142,52,255,103,16,27,1,253,200,165,0,195,217,4,255,52,189,144,255,123,155,160,254,87,130,54,255,78,120,61,255,14,56,41,0,25,41,125,255,87,168,245,0,214,165,70,0,212,169,6,255,219,211,194,254,72,93,164,255,197,33,103,255,43,142,141,0,131,225,172,0,244,105,28,0,68,68,225,0,136,84,13,255,130,57,40,254,139,77,56,0,84,150,53,0,54,95,157,0,144,13,177,254,95,115,186,0,117,23,118,255,244,166,241,255,11,186,135,0,178,106,203,255,97,218,93,0,43,253,45,0,164,152,4,0,139,118,239,0,96,1,24,254,235,153,211,255,168,110,20,255,50,239,176,0,114,41,232,0,193,250,53,0,254,160,111,254,136,122,41,255,97,108,67,0,215,152,23,255,140,209,212,0,42,189,163,0,202,42,50,255,106,106,189,255,190,68,217,255,233,58,117,0,229,220,243,1,197,3,4,0,37,120,54,254,4,156,134,255,36,61,171,254,165,136,100,255,212,232,14,0,90,174,10,0,216,198,65,255,12,3,64,0,116,113,115,255,248,103,8,0,231,125,18,255,160,28,197,0,30,184,35,1,223,73,249,255,123,20,46,254,135,56,37,255,173,13,229,1,119,161,34,255,245,61,73,0,205,125,112,0,137,104,134,0,217,246,30,255,237,142,143,0,65,159,102,255,108,164,190,0,219,117,173,255,34,37,120,254,200,69,80,0,31,124,218,254,74,27,160,255,186,154,199,255,71,199,252,0,104,81,159,1,17,200,39,0,211,61,192,1,26,238,91,0,148,217,12,0,59,91,213,255,11,81,183,255,129,230,122,255,114,203,145,1,119,180,66,255,72,138,180,0,224,149,106,0,119,82,104,255,208,140,43,0,98,9,182,255,205,101,134,255,18,101,38,0,95,197,166,255,203,241,147,0,62,208,145,255,133,246,251,0,2,169,14,0,13,247,184,0,142,7,254,0,36,200,23,255,88,205,223,0,91,129,52,255,21,186,30,0,143,228,210,1,247,234,248,255,230,69,31,254,176,186,135,255,238,205,52,1,139,79,43,0,17,176,217,254,32,243,67,0,242,111,233,0,44,35,9,255,227,114,81,1,4,71,12,255,38,105,191,0,7,117,50,255,81,79,16,0,63,68,65,255,157,36,110,255,77,241,3,255,226,45,251,1,142,25,206,0,120,123,209,1,28,254,238,255,5,128,126,255,91,222,215,255,162,15,191,0,86,240,73,0,135,185,81,254,44,241,163,0,212,219,210,255,112,162,155,0,207,101,118,0,168,72,56,255,196,5,52,0,72,172,242,255,126,22,157,255,146,96,59,255,162,121,152,254,140,16,95,0,195,254,200,254,82,150,162,0,119,43,145,254,204,172,78,255,166,224,159,0,104,19,237,255,245,126,208,255,226,59,213,0,117,217,197,0,152,72,237,0,220,31,23,254,14,90,231,255,188,212,64,1,60,101,246,255,85,24,86,0,1,177,109,0,146,83,32,1,75,182,192,0,119,241,224,0,185,237,27,255,184,101,82,1,235,37,77,255,253,134,19,0,232,246,122,0,60,106,179,0,195,11,12,0,109,66,235,1,125,113,59,0,61,40,164,0,175,104,240,0,2,47,187,255,50,12,141,0,194,139,181,255,135,250,104,0,97,92,222,255,217,149,201,255,203,241,118,255,79,151,67,0,122,142,218,255,149,245,239,0,138,42,200,254,80,37,97,255,124,112,167,255,36,138,87,255,130,29,147,255,241,87,78,255,204,97,19,1,177,209,22,255,247,227,127,254,99,119,83,255,212,25,198,1,16,179,179,0,145,77,172,254,89,153,14,255,218,189,167,0,107,233,59,255,35,33,243,254,44,112,112,255,161,127,79,1,204,175,10,0,40,21,138,254,104,116,228,0,199,95,137,255,133,190,168,255,146,165,234,1,183,99,39,0,183,220,54,254,255,222,133,0,162,219,121,254,63,239,6,0,225,102,54,255,251,18,246,0,4,34,129,1,135,36,131,0,206,50,59,1,15,97,183,0,171,216,135,255,101,152,43,255,150,251,91,0,38,145,95,0,34,204,38,254,178,140,83,255,25,129,243,255,76,144,37,0,106,36,26,254,118,144,172,255,68,186,229,255,107,161,213,255,46,163,68,255,149,170,253,0,187,17,15,0,218,160,165,255,171,35,246,1,96,13,19,0,165,203,117,0,214,107,192,255,244,123,177,1,100,3,104,0,178,242,97,255,251,76,130,255,211,77,42,1,250,79,70,255,63,244,80,1,105,101,246,0,61,136,58,1,238,91,213,0,14,59,98,255,167,84,77,0,17,132,46,254,57,175,197,255,185,62,184,0,76,64,207,0,172,175,208,254,175,74,37,0,138,27,211,254,148,125,194,0,10,89,81,0,168,203,101,255,43,213,209,1,235,245,54,0,30,35,226,255,9,126,70,0,226,125,94,254,156,117,20,255,57,248,112,1,230,48,64,255,164,92,166,1,224,214,230,255,36,120,143,0,55,8,43,255,251,1,245,1,106,98,165,0,74,107,106,254,53,4,54,255,90,178,150,1,3,120,123,255,244,5,89,1,114,250,61,255,254,153,82,1,77,15,17,0,57,238,90,1,95,223,230,0,236,52,47,254,103,148,164,255,121,207,36,1,18,16,185,255,75,20,74,0,187,11,101,0,46,48,129,255,22,239,210,255,77,236,129,255,111,77,204,255,61,72,97,255,199,217,251,255,42,215,204,0,133,145,201,255,57,230,146,1,235,100,198,0,146,73,35,254,108,198,20,255,182,79,210,255,82,103,136,0,246,108,176,0,34,17,60,255,19,74,114,254,168,170,78,255,157,239,20,255,149,41,168,0,58,121,28,0,79,179,134,255,231,121,135,255,174,209,98,255,243,122,190,0,171,166,205,0,212,116,48,0,29,108,66,255,162,222,182,1,14,119,21,0,213,39,249,255,254,223,228,255,183,165,198,0,133,190,48,0,124,208,109,255,119,175,85,255,9,209,121,1,48,171,189,255,195,71,134,1,136,219,51,255,182,91,141,254,49,159,72,0,35,118,245,255,112,186,227,255,59,137,31,0,137,44,163,0,114,103,60,254,8,213,150,0,162,10,113,255,194,104,72,0,220,131,116,255,178,79,92,0,203,250,213,254,93,193,189,255,130,255,34,254,212,188,151,0,136,17,20,255,20,101,83,255,212,206,166,0,229,238,73,255,151,74,3,255,168,87,215,0,155,188,133,255,166,129,73,0,240,79,133,255,178,211,81,255,203,72,163,254,193,168,165,0,14,164,199,254,30,255,204,0,65,72,91,1,166,74,102,255,200,42,0,255,194,113,227,255,66,23,208,0,229,216,100,255,24,239,26,0,10,233,62,255,123,10,178,1,26,36,174,255,119,219,199,1,45,163,190,0,16,168,42,0,166,57,198,255,28,26,26,0,126,165,231,0,251,108,100,255,61,229,121,255,58,118,138,0,76,207,17,0,13,34,112,254,89,16,168,0,37,208,105,255,35,201,215,255,40,106,101,254,6,239,114,0,40,103,226,254,246,127,110,255,63,167,58,0,132,240,142,0,5,158,88,255,129,73,158,255,94,89,146,0,230,54,146,0,8,45,173,0,79,169,1,0,115,186,247,0,84,64,131,0,67,224,253,255,207,189,64,0,154,28,81,1,45,184,54,255,87,212,224,255,0,96,73,255,129,33,235,1,52,66,80,255,251,174,155,255,4,179,37,0,234,164,93,254,93,175,253,0,198,69,87,255,224,106,46,0,99,29,210,0,62,188,114,255,44,234,8,0,169,175,247,255,23,109,137,255,229,182,39,0,192,165,94,254,245,101,217,0,191,88,96,0,196,94,99,255,106,238,11,254,53,126,243,0,94,1,101,255,46,147,2,0,201,124,124,255,141,12,218,0,13,166,157,1,48,251,237,255,155,250,124,255,106,148,146,255,182,13,202,0,28,61,167,0,217,152,8,254,220,130,45,255,200,230,255,1,55,65,87,255,93,191,97,254,114,251,14,0,32,105,92,1,26,207,141,0,24,207,13,254,21,50,48,255,186,148,116,255,211,43,225,0,37,34,162,254,164,210,42,255,68,23,96,255,182,214,8,255,245,117,137,255,66,195,50,0,75,12,83,254,80,140,164,0,9,165,36,1,228,110,227,0,241,17,90,1,25,52,212,0,6,223,12,255,139,243,57,0,12,113,75,1,246,183,191,255,213,191,69,255,230,15,142,0,1,195,196,255,138,171,47,255,64,63,106,1,16,169,214,255,207,174,56,1,88,73,133,255,182,133,140,0,177,14,25,255,147,184,53,255,10,227,161,255,120,216,244,255,73,77,233,0,157,238,139,1,59,65,233,0,70,251,216,1,41,184,153,255,32,203,112,0,146,147,253,0,87,101,109,1,44,82,133,255,244,150,53,255,94,152,232,255,59,93,39,255,88,147,220,255,78,81,13,1,32,47,252,255,160,19,114,255,93,107,39,255,118,16,211,1,185,119,209,255,227,219,127,254,88,105,236,255,162,110,23,255,36,166,110,255,91,236,221,255,66,234,116,0,111,19,244,254,10,233,26,0,32,183,6,254,2,191,242,0,218,156,53,254,41,60,70,255,168,236,111,0,121,185,126,255,238,142,207,255,55,126,52,0,220,129,208,254,80,204,164,255,67,23,144,254,218,40,108,255,127,202,164,0,203,33,3,255,2,158,0,0,37,96,188,255,192,49,74,0,109,4,0,0,111,167,10,254,91,218,135,255,203,66,173,255,150,194,226,0,201,253,6,255,174,102,121,0,205,191,110,0,53,194,4,0,81,40,45,254,35,102,143,255,12,108,198,255,16,27,232,255,252,71,186,1,176,110,114,0,142,3,117,1,113,77,142,0,19,156,197,1,92,47,252,0,53,232,22,1,54,18,235,0,46,35,189,255,236,212,129,0,2,96,208,254,200,238,199,255,59,175,164,255,146,43,231,0,194,217,52,255,3,223,12,0,138,54,178,254,85,235,207,0,232,207,34,0,49,52,50,255,166,113,89,255,10,45,216,255,62,173,28,0,111,165,246,0,118,115,91,255,128,84,60,0,167,144,203,0,87,13,243,0,22,30,228,1,177,113,146,255,129,170,230,254,252,153,129,255,145,225,43,0,70,231,5,255,122,105,126,254,86,246,148,255,110,37,154,254,209,3,91,0,68,145,62,0,228,16,165,255,55,221,249,254,178,210,91,0,83,146,226,254,69,146,186,0,93,210,104,254,16,25,173,0,231,186,38,0,189,122,140,255,251,13,112,255,105,110,93,0,251,72,170,0,192,23,223,255,24,3,202,1,225,93,228,0,153,147,199,254,109,170,22,0,248,101,246,255,178,124,12,255,178,254,102,254,55,4,65,0,125,214,180,0,183,96,147,0,45,117,23,254,132,191,249,0,143,176,203,254,136,183,54,255,146,234,177,0,146,101,86,255,44,123,143,1,33,209,152,0,192,90,41,254,83,15,125,255,213,172,82,0,215,169,144,0,16,13,34,0,32,209,100,255,84,18,249,1,197,17,236,255,217,186,230,0,49,160,176,255,111,118,97,255,237,104,235,0,79,59,92,254,69,249,11,255,35,172,74,1,19,118,68,0,222,124,165,255,180,66,35,255,86,174,246,0,43,74,111,255,126,144,86,255,228,234,91,0,242,213,24,254,69,44,235,255,220,180,35,0,8,248,7,255,102,47,92,255,240,205,102,255,113,230,171,1,31,185,201,255,194,246,70,255,122,17,187,0,134,70,199,255,149,3,150,255,117,63,103,0,65,104,123,255,212,54,19,1,6,141,88,0,83,134,243,255,136,53,103,0,169,27,180,0,177,49,24,0,111,54,167,0,195,61,215,255,31,1,108,1,60,42,70,0,185,3,162,255,194,149,40,255,246,127,38,254,190,119,38,255,61,119,8,1,96,161,219,255,42,203,221,1,177,242,164,255,245,159,10,0,116,196,0,0,5,93,205,254,128,127,179,0,125,237,246,255,149,162,217,255,87,37,20,254,140,238,192,0,9,9,193,0,97,1,226,0,29,38,10,0,0,136,63,255,229,72,210,254,38,134,92,255,78,218,208,1,104,36,84,255,12,5,193,255,242,175,61,255,191,169,46,1,179,147,147,255,113,190,139,254,125,172,31,0,3,75,252,254,215,36,15,0,193,27,24,1,255,69,149,255,110,129,118,0,203,93,249,0,138,137,64,254,38,70,6,0,153,116,222,0,161,74,123,0,193,99,79,255,118,59,94,255,61,12,43,1,146,177,157,0,46,147,191,0,16,255,38,0,11,51,31,1,60,58,98,255,111,194,77,1,154,91,244,0,140,40,144,1,173,10,251,0,203,209,50,254,108,130,78,0,228,180,90,0,174,7,250,0,31,174,60,0,41,171,30,0,116,99,82,255,118,193,139,255,187,173,198,254,218,111,56,0,185,123,216,0,249,158,52,0,52,180,93,255,201,9,91,255,56,45,166,254,132,155,203,255,58,232,110,0,52,211,89,255,253,0,162,1,9,87,183,0,145,136,44,1,94,122,245,0,85,188,171,1,147,92,198,0,0,8,104,0,30,95,174,0,221,230,52,1,247,247,235,255,137,174,53,255,35,21,204,255,71,227,214,1,232,82,194,0,11,48,227,255,170,73,184,255,198,251,252,254,44,112,34,0,131,101,131,255,72,168,187,0,132,135,125,255,138,104,97,255,238,184,168,255,243,104,84,255,135,216,226,255,139,144,237,0,188,137,150,1,80,56,140,255,86,169,167,255,194,78,25,255,220,17,180,255,17,13,193,0,117,137,212,255,141,224,151,0,49,244,175,0,193,99,175,255,19,99,154,1,255,65,62,255,156,210,55,255,242,244,3,255,250,14,149,0,158,88,217,255,157,207,134,254,251,232,28,0,46,156,251,255,171,56,184,255,239,51,234,0,142,138,131,255,25,254,243,1,10,201,194,0,63,97,75,0,210,239,162,0,192,200,31,1,117,214,243,0,24,71,222,254,54,40,232,255,76,183,111,254,144,14,87,255,214,79,136,255,216,196,212,0,132,27,140,254,131,5,253,0,124,108,19,255,28,215,75,0,76,222,55,254,233,182,63,0,68,171,191,254,52,111,222,255,10,105,77,255,80,170,235,0,143,24,88,255,45,231,121,0,148,129,224,1,61,246,84,0,253,46,219,255,239,76,33,0,49,148,18,254,230,37,69,0,67,134,22,254,142,155,94,0,31,157,211,254,213,42,30,255,4,228,247,254,252,176,13,255,39,0,31,254,241,244,255,255,170,45,10,254,253,222,249,0,222,114,132,0,255,47,6,255,180,163,179,1,84,94,151,255,89,209,82,254,229,52,169,255,213,236,0,1,214,56,228,255,135,119,151,255,112,201,193,0,83,160,53,254,6,151,66,0,18,162,17,0,233,97,91,0,131,5,78,1,181,120,53,255,117,95,63,255,237,117,185,0,191,126,136,255,144,119,233,0,183,57,97,1,47,201,187,255,167,165,119,1,45,100,126,0,21,98,6,254,145,150,95,255,120,54,152,0,209,98,104,0,143,111,30,254,184,148,249,0,235,216,46,0,248,202,148,255,57,95,22,0,242,225,163,0,233,247,232,255,71,171,19,255,103,244,49,255,84,103,93,255,68,121,244,1,82,224,13,0,41,79,43,255,249,206,167,255,215,52,21,254,192,32,22,255,247,111,60,0,101,74,38,255,22,91,84,254,29,28,13,255,198,231,215,254,244,154,200,0,223,137,237,0,211,132,14,0,95,64,206,255,17,62,247,255,233,131,121,1,93,23,77,0,205,204,52,254,81,189,136,0,180,219,138,1,143,18,94,0,204,43,140,254,188,175,219,0,111,98,143,255,151,63,162,255,211,50,71,254,19,146,53,0,146,45,83,254,178,82,238,255,16,133,84,255,226,198,93,255,201,97,20,255,120,118,35,255,114,50,231,255,162,229,156,255,211,26,12,0,114,39,115,255,206,212,134,0,197,217,160,255,116,129,94,254,199,215,219,255,75,223,249,1,253,116,181,255,232,215,104,255,228,130,246,255,185,117,86,0,14,5,8,0,239,29,61,1,237,87,133,255,125,146,137,254,204,168,223,0,46,168,245,0,154,105,22,0,220,212,161,255,107,69,24,255,137,218,181,255,241,84,198,255,130,122,211,255,141,8,153,255,190,177,118,0,96,89,178,0,255,16,48,254,122,96,105,255,117,54,232,255,34,126,105,255,204,67,166,0,232,52,138,255,211,147,12,0,25,54,7,0,44,15,215,254,51,236,45,0,190,68,129,1,106,147,225,0,28,93,45,254,236,141,15,255,17,61,161,0,220,115,192,0,236,145,24,254,111,168,169,0,224,58,63,255,127,164,188,0,82,234,75,1,224,158,134,0,209,68,110,1,217,166,217,0,70,225,166,1,187,193,143,255,16,7,88,255,10,205,140,0,117,192,156,1,17,56,38,0,27,124,108,1,171,215,55,255,95,253,212,0,155,135,168,255,246,178,153,254,154,68,74,0,232,61,96,254,105,132,59,0,33,76,199,1,189,176,130,255,9,104,25,254,75,198,102,255,233,1,112,0,108,220,20,255,114,230,70,0,140,194,133,255,57,158,164,254,146,6,80,255,169,196,97,1,85,183,130,0,70,158,222,1,59,237,234,255,96,25,26,255,232,175,97,255,11,121,248,254,88,35,194,0,219,180,252,254,74,8,227,0,195,227,73,1,184,110,161,255,49,233,164,1,128,53,47,0,82,14,121,255,193,190,58,0,48,174,117,255,132,23,32,0,40,10,134,1,22,51,25,255,240,11,176,255,110,57,146,0,117,143,239,1,157,101,118,255,54,84,76,0,205,184,18,255,47,4,72,255,78,112,85,255,193,50,66,1,93,16,52,255,8,105,134,0,12,109,72,255,58,156,251,0,144,35,204,0,44,160,117,254,50,107,194,0,1,68,165,255,111,110,162,0,158,83,40,254,76,214,234,0,58,216,205,255,171,96,147,255,40,227,114,1,176,227,241,0,70,249,183,1,136,84,139,255,60,122,247,254,143,9,117,255,177,174,137,254,73,247,143,0,236,185,126,255,62,25,247,255,45,64,56,255,161,244,6,0,34,57,56,1,105,202,83,0,128,147,208,0,6,103,10,255,74,138,65,255,97,80,100,255,214,174,33,255,50,134,74,255,110,151,130,254,111,84,172,0,84,199,75,254,248,59,112,255,8,216,178,1,9,183,95,0,238,27,8,254,170,205,220,0,195,229,135,0,98,76,237,255,226,91,26,1,82,219,39,255,225,190,199,1,217,200,121,255,81,179,8,255,140,65,206,0,178,207,87,254,250,252,46,255,104,89,110,1,253,189,158,255,144,214,158,255,160,245,54,255,53,183,92,1,21,200,194,255,146,33,113,1,209,1,255,0,235,106,43,255,167,52,232,0,157,229,221,0,51,30,25,0,250,221,27,1,65,147,87,255,79,123,196,0,65,196,223,255,76,44,17,1,85,241,68,0,202,183,249,255,65,212,212,255,9,33,154,1,71,59,80,0,175,194,59,255,141,72,9,0,100,160,244,0,230,208,56,0,59,25,75,254,80,194,194,0,18,3,200,254,160,159,115,0,132,143,247,1,111,93,57,255,58,237,11,1,134,222,135,255,122,163,108,1,123,43,190,255,251,189,206,254,80,182,72,255,208,246,224,1,17,60,9,0,161,207,38,0,141,109,91,0,216,15,211,255,136,78,110,0,98,163,104,255,21,80,121,255,173,178,183,1,127,143,4,0,104,60,82,254,214,16,13,255,96,238,33,1,158,148,230,255,127,129,62,255,51,255,210,255,62,141,236,254,157,55,224,255,114,39,244,0,192,188,250,255,228,76,53,0,98,84,81,255,173,203,61,254,147,50,55,255,204,235,191,0,52,197,244,0,88,43,211,254,27,191,119,0,188,231,154,0,66,81,161,0,92,193,160,1,250,227,120,0,123,55,226,0,184,17,72,0,133,168,10,254,22,135,156,255,41,25,103,255,48,202,58,0,186,149,81,255,188,134,239,0,235,181,189,254,217,139,188,255,74,48,82,0,46,218,229,0,189,253,251,0,50,229,12,255,211,141,191,1,128,244,25,255,169,231,122,254,86,47,189,255,132,183,23,255,37,178,150,255,51,137,253,0,200,78,31,0,22,105,50,0,130,60,0,0,132,163,91,254,23,231,187,0,192,79,239,0,157,102,164,255,192,82,20,1,24,181,103,255,240,9,234,0,1,123,164,255,133,233,0,255,202,242,242,0,60,186,245,0,241,16,199,255,224,116,158,254,191,125,91,255,224,86,207,0,121,37,231,255,227,9,198,255,15,153,239,255,121,232,217,254,75,112,82,0,95,12,57,254,51,214,105,255,148,220,97,1,199,98,36,0,156,209,12,254,10,212,52,0,217,180,55,254,212,170,232,255,216,20,84,255,157,250,135,0,157,99,127,254,1,206,41,0,149,36,70,1,54,196,201,255,87,116,0,254,235,171,150,0,27,163,234,0,202,135,180,0,208,95,0,254,123,156,93,0,183,62,75,0,137,235,182,0,204,225,255,255,214,139,210,255,2,115,8,255,29,12,111,0,52,156,1,0,253,21,251,255,37,165,31,254,12,130,211,0,106,18,53,254,42,99,154,0,14,217,61,254,216,11,92,255,200,197,112,254,147,38,199,0,36,252,120,254,107,169,77,0,1,123,159,255,207,75,102,0,163,175,196,0,44,1,240,0,120,186,176,254,13,98,76,255,237,124,241,255,232,146,188,255,200,96,224,0,204,31,41,0,208,200,13,0,21,225,96,255,175,156,196,0,247,208,126,0,62,184,244,254,2,171,81,0,85,115,158,0,54,64,45,255,19,138,114,0,135,71,205,0,227,47,147,1,218,231,66,0,253,209,28,0,244,15,173,255,6,15,118,254,16,150,208,255,185,22,50,255,86,112,207,255,75,113,215,1,63,146,43,255,4,225,19,254,227,23,62,255,14,255,214,254,45,8,205,255,87,197,151,254,210,82,215,255,245,248,247,255,128,248,70,0,225,247,87,0,90,120,70,0,213,245,92,0,13,133,226,0,47,181,5,1,92,163,105,255,6,30,133,254,232,178,61,255,230,149,24,255,18,49,158,0,228,100,61,254,116,243,251,255,77,75,92,1,81,219,147,255,76,163,254,254,141,213,246,0,232,37,152,254,97,44,100,0,201,37,50,1,212,244,57,0,174,171,183,255,249,74,112,0,166,156,30,0,222,221,97,255,243,93,73,254,251,101,100,255,216,217,93,255,254,138,187,255,142,190,52,255,59,203,177,255,200,94,52,0,115,114,158,255,165,152,104,1,126,99,226,255,118,157,244,1,107,200,16,0,193,90,229,0,121,6,88,0,156,32,93,254,125,241,211,255,14,237,157,255,165,154,21,255,184,224,22,255,250,24,152,255,113,77,31,0,247,171,23,255,237,177,204,255,52,137,145,255,194,182,114,0,224,234,149,0,10,111,103,1,201,129,4,0,238,142,78,0,52,6,40,255,110,213,165,254,60,207,253,0,62,215,69,0,96,97,0,255,49,45,202,0,120,121,22,255,235,139,48,1,198,45,34,255,182,50,27,1,131,210,91,255,46,54,128,0,175,123,105,255,198,141,78,254,67,244,239,255,245,54,103,254,78,38,242,255,2,92,249,254,251,174,87,255,139,63,144,0,24,108,27,255,34,102,18,1,34,22,152,0,66,229,118,254,50,143,99,0,144,169,149,1,118,30,152,0,178,8,121,1,8,159,18,0,90,101,230,255,129,29,119,0,68,36,11,1,232,183,55,0,23,255,96,255,161,41,193,255,63,139,222,0,15,179,243,0,255,100,15,255,82,53,135,0,137,57,149,1,99,240,170,255,22,230,228,254,49,180,82,255,61,82,43,0,110,245,217,0,199,125,61,0,46,253,52,0,141,197,219,0,211,159,193,0,55,121,105,254,183,20,129,0,169,119,170,255,203,178,139,255,135,40,182,255,172,13,202,255,65,178,148,0,8,207,43,0,122,53,127,1,74,161,48,0,227,214,128,254,86,11,243,255,100,86,7,1,245,68,134,255,61,43,21,1,152,84,94,255,190,60,250,254,239,118,232,255,214,136,37,1,113,76,107,255,93,104,100,1,144,206,23,255,110,150,154,1,228,103,185,0,218,49,50,254,135,77,139,255,185,1,78,0,0,161,148,255,97,29,233,255,207,148,149,255,160,168,0,0,91,128,171,255,6,28,19,254,11,111,247,0,39,187,150,255,138,232,149,0,117,62,68,255,63,216,188,255,235,234,32,254,29,57,160,255,25,12,241,1,169,60,191,0,32,131,141,255,237,159,123,255,94,197,94,254,116,254,3,255,92,179,97,254,121,97,92,255,170,112,14,0,21,149,248,0,248,227,3,0,80,96,109,0,75,192,74,1,12,90,226,255,161,106,68,1,208,114,127,255,114,42,255,254,74,26,74,255,247,179,150,254,121,140,60,0,147,70,200,255,214,40,161,255,161,188,201,255,141,65,135,255,242,115,252,0,62,47,202,0,180,149,255,254,130,55,237,0,165,17,186,255,10,169,194,0,156,109,218,255,112,140,123,255,104,128,223,254,177,142,108,255,121,37,219,255,128,77,18,255,111,108,23,1,91,192,75,0,174,245,22,255,4,236,62,255,43,64,153,1,227,173,254,0,237,122,132,1,127,89,186,255,142,82,128,254,252,84,174,0,90,179,177,1,243,214,87,255,103,60,162,255,208,130,14,255,11,130,139,0,206,129,219,255,94,217,157,255,239,230,230,255,116,115,159,254,164,107,95,0,51,218,2,1,216,125,198,255,140,202,128,254,11,95,68,255,55,9,93,254,174,153,6,255,204,172,96,0,69,160,110,0,213,38,49,254,27,80,213,0,118,125,114,0,70,70,67,255,15,142,73,255,131,122,185,255,243,20,50,254,130,237,40,0,210,159,140,1,197,151,65,255,84,153,66,0,195,126,90,0,16,238,236,1,118,187,102,255,3,24,133,255,187,69,230,0,56,197,92,1,213,69,94,255,80,138,229,1,206,7,230,0,222,111,230,1,91,233,119,255,9,89,7,1,2,98,1,0,148,74,133,255,51,246,180,255,228,177,112,1,58,189,108,255,194,203,237,254,21,209,195,0,147,10,35,1,86,157,226,0,31,163,139,254,56,7,75,255,62,90,116,0,181,60,169,0,138,162,212,254,81,167,31,0,205,90,112,255,33,112,227,0,83,151,117,1,177,224,73,255,174,144,217,255,230,204,79,255,22,77,232,255,114,78,234,0,224,57,126,254,9,49,141,0,242,147,165,1,104,182,140,255,167,132,12,1,123,68,127,0,225,87,39,1,251,108,8,0,198,193,143,1,121,135,207,255,172,22,70,0,50,68,116,255,101,175,40,255,248,105,233,0,166,203,7,0,110,197,218,0,215,254,26,254,168,226,253,0,31,143,96,0,11,103,41,0,183,129,203,254,100,247,74,255,213,126,132,0,210,147,44,0,199,234,27,1,148,47,181,0,155,91,158,1,54,105,175,255,2,78,145,254,102,154,95,0,128,207,127,254,52,124,236,255,130,84,71,0,221,243,211,0,152,170,207,0,222,106,199,0,183,84,94,254,92,200,56,255,138,182,115,1,142,96,146,0,133,136,228,0,97,18,150,0,55,251,66,0,140,102,4,0,202,103,151,0,30,19,248,255,51,184,207,0,202,198,89,0,55,197,225,254,169,95,249,255,66,65,68,255,188,234,126,0,166,223,100,1,112,239,244,0,144,23,194,0,58,39,182,0,244,44,24,254,175,68,179,255,152,118,154,1,176,162,130,0,217,114,204,254,173,126,78,255,33,222,30,255,36,2,91,255,2,143,243,0,9,235,215,0,3,171,151,1,24,215,245,255,168,47,164,254,241,146,207,0,69,129,180,0,68,243,113,0,144,53,72,254,251,45,14,0,23,110,168,0,68,68,79,255,110,70,95,254,174,91,144,255,33,206,95,255,137,41,7,255,19,187,153,254,35,255,112,255,9,145,185,254,50,157,37,0,11,112,49,1,102,8,190,255,234,243,169,1,60,85,23,0,74,39,189,0,116,49,239,0,173,213,210,0,46,161,108,255,159,150,37,0,196,120,185,255,34,98,6,255,153,195,62,255,97,230,71,255,102,61,76,0,26,212,236,255,164,97,16,0,198,59,146,0,163,23,196,0,56,24,61,0,181,98,193,0,251,147,229,255,98,189,24,255,46,54,206,255,234,82,246,0,183,103,38,1,109,62,204,0,10,240,224,0,146,22,117,255,142,154,120,0,69,212,35,0,208,99,118,1,121,255,3,255,72,6,194,0,117,17,197,255,125,15,23,0,154,79,153,0,214,94,197,255,185,55,147,255,62,254,78,254,127,82,153,0,110,102,63,255,108,82,161,255,105,187,212,1,80,138,39,0,60,255,93,255,72,12,186,0,210,251,31,1,190,167,144,255,228,44,19,254,128,67,232,0,214,249,107,254,136,145,86,255,132,46,176,0,189,187,227,255,208,22,140,0,217,211,116,0,50,81,186,254,139,250,31,0,30,64,198,1,135,155,100,0,160,206,23,254,187,162,211,255,16,188,63,0,254,208,49,0,85,84,191,0,241,192,242,255,153,126,145,1,234,162,162,255,230,97,216,1,64,135,126,0,190,148,223,1,52,0,43,255,28,39,189,1,64,136,238,0,175,196,185,0,98,226,213,255,127,159,244,1,226,175,60,0,160,233,142,1,180,243,207,255,69,152,89,1,31,101,21,0,144,25,164,254,139,191,209,0,91,25,121,0,32,147,5,0,39,186,123,255,63,115,230,255,93,167,198,255,143,213,220,255,179,156,19,255,25,66,122,0,214,160,217,255,2,45,62,255,106,79,146,254,51,137,99,255,87,100,231,255,175,145,232,255,101,184,1,255,174,9,125,0,82,37,161,1,36,114,141,255,48,222,142,255,245,186,154,0,5,174,221,254,63,114,155,255,135,55,160,1,80,31,135,0,126,250,179,1,236,218,45,0,20,28,145,1,16,147,73,0,249,189,132,1,17,189,192,255,223,142,198,255,72,20,15,255,250,53,237,254,15,11,18,0,27,211,113,254,213,107,56,255,174,147,146,255,96,126,48,0,23,193,109,1,37,162,94,0,199,157,249,254,24,128,187,255,205,49,178,254,93,164,42,255,43,119,235,1,88,183,237,255,218,210,1,255,107,254,42,0,230,10,99,255,162,0,226,0,219,237,91,0,129,178,203,0,208,50,95,254,206,208,95,255,247,191,89,254,110,234,79,255,165,61,243,0,20,122,112,255,246,246,185,254,103,4,123,0,233,99,230,1,219,91,252,255,199,222,22,255,179,245,233,255,211,241,234,0,111,250,192,255,85,84,136,0,101,58,50,255,131,173,156,254,119,45,51,255,118,233,16,254,242,90,214,0,94,159,219,1,3,3,234,255,98,76,92,254,80,54,230,0,5,228,231,254,53,24,223,255,113,56,118,1,20,132,1,255,171,210,236,0,56,241,158,255,186,115,19,255,8,229,174,0,48,44,0,1,114,114,166,255,6,73,226,255,205,89,244,0,137,227,75,1,248,173,56,0,74,120,246,254,119,3,11,255,81,120,198,255,136,122,98,255,146,241,221,1,109,194,78,255,223,241,70,1,214,200,169,255,97,190,47,255,47,103,174,255,99,92,72,254,118,233,180,255,193,35,233,254,26,229,32,255,222,252,198,0,204,43,71,255,199,84,172,0,134,102,190,0,111,238,97,254,230,40,230,0,227,205,64,254,200,12,225,0,166,25,222,0,113,69,51,255,143,159,24,0,167,184,74,0,29,224,116,254,158,208,233,0,193,116,126,255,212,11,133,255,22,58,140,1,204,36,51,255,232,30,43,0,235,70,181,255,64,56,146,254,169,18,84,255,226,1,13,255,200,50,176,255,52,213,245,254,168,209,97,0,191,71,55,0,34,78,156,0,232,144,58,1,185,74,189,0,186,142,149,254,64,69,127,255,161,203,147,255,176,151,191,0,136,231,203,254,163,182,137,0,161,126,251,254,233,32,66,0,68,207,66,0,30,28,37,0,93,114,96,1,254,92,247,255,44,171,69,0,202,119,11,255,188,118,50,1,255,83,136,255,71,82,26,0,70,227,2,0,32,235,121,1,181,41,154,0,71,134,229,254,202,255,36,0,41,152,5,0,154,63,73,255,34,182,124,0,121,221,150,255,26,204,213,1,41,172,87,0,90,157,146,255,109,130,20,0,71,107,200,255,243,102,189,0,1,195,145,254,46,88,117,0,8,206,227,0,191,110,253,255,109,128,20,254,134,85,51,255,137,177,112,1,216,34,22,255,131,16,208,255,121,149,170,0,114,19,23,1,166,80,31,255,113,240,122,0,232,179,250,0,68,110,180,254,210,170,119,0,223,108,164,255,207,79,233,255,27,229,226,254,209,98,81,255,79,68,7,0,131,185,100,0,170,29,162,255,17,162,107,255,57,21,11,1,100,200,181,255,127,65,166,1,165,134,204,0,104,167,168,0,1,164,79,0,146,135,59,1,70,50,128,255,102,119,13,254,227,6,135,0,162,142,179,255,160,100,222,0,27,224,219,1,158,93,195,255,234,141,137,0,16,24,125,255,238,206,47,255,97,17,98,255,116,110,12,255,96,115,77,0,91,227,232,255,248,254,79,255,92,229,6,254,88,198,139,0,206,75,129,0,250,77,206,255,141,244,123,1,138,69,220,0,32,151,6,1,131,167,22,255,237,68,167,254,199,189,150,0,163,171,138,255,51,188,6,255,95,29,137,254,148,226,179,0,181,107,208,255,134,31,82,255,151,101,45,255,129,202,225,0,224,72,147,0,48,138,151,255,195,64,206,254,237,218,158,0,106,29,137,254,253,189,233,255,103,15,17,255,194,97,255,0,178,45,169,254,198,225,155,0,39,48,117,255,135,106,115,0,97,38,181,0,150,47,65,255,83,130,229,254,246,38,129,0,92,239,154,254,91,99,127,0,161,111,33,255,238,217,242,255,131,185,195,255,213,191,158,255,41,150,218,0,132,169,131,0,89,84,252,1,171,70,128,255,163,248,203,254,1,50,180,255,124,76,85,1,251,111,80,0,99,66,239,255,154,237,182,255,221,126,133,254,74,204,99,255,65,147,119,255,99,56,167,255,79,248,149,255,116,155,228,255,237,43,14,254,69,137,11,255,22,250,241,1,91,122,143,255,205,249,243,0,212,26,60,255,48,182,176,1,48,23,191,255,203,121,152,254,45,74,213,255,62,90,18,254,245,163,230,255,185,106,116,255,83,35,159,0,12,33,2,255,80,34,62,0,16,87,174,255,173,101,85,0,202,36,81,254,160,69,204,255,64,225,187,0,58,206,94,0,86,144,47,0,229,86,245,0,63,145,190,1,37,5,39,0,109,251,26,0,137,147,234,0,162,121,145,255,144,116,206,255,197,232,185,255,183,190,140,255,73,12,254,255,139,20,242,255,170,90,239,255,97,66,187,255,245,181,135,254,222,136,52,0,245,5,51,254,203,47,78,0,152,101,216,0,73,23,125,0,254,96,33,1,235,210,73,255,43,209,88,1,7,129,109,0,122,104,228,254,170,242,203,0,242,204,135,255,202,28,233,255,65,6,127,0,159,144,71,0,100,140,95,0,78,150,13,0,251,107,118,1,182,58,125,255,1,38,108,255,141,189,209,255,8,155,125,1,113,163,91,255,121,79,190,255,134,239,108,255,76,47,248,0,163,228,239,0,17,111,10,0,88,149,75,255,215,235,239,0,167,159,24,255,47,151,108,255,107,209,188,0,233,231,99,254,28,202,148,255,174,35,138,255,110,24,68,255,2,69,181,0,107,102,82,0,102,237,7,0,92,36,237,255,221,162,83,1,55,202,6,255,135,234,135,255,24,250,222,0,65,94,168,254,245,248,210,255,167,108,201,254,255,161,111,0,205,8,254,0,136,13,116,0,100,176,132,255,43,215,126,255,177,133,130,255,158,79,148,0,67,224,37,1,12,206,21,255,62,34,110,1,237,104,175,255,80,132,111,255,142,174,72,0,84,229,180,254,105,179,140,0,64,248,15,255,233,138,16,0,245,67,123,254,218,121,212,255,63,95,218,1,213,133,137,255,143,182,82,255,48,28,11,0,244,114,141,1,209,175,76,255,157,181,150,255,186,229,3,255,164,157,111,1,231,189,139,0,119,202,190,255,218,106,64,255,68,235,63,254,96,26,172,255,187,47,11,1,215,18,251,255,81,84,89,0,68,58,128,0,94,113,5,1,92,129,208,255,97,15,83,254,9,28,188,0,239,9,164,0,60,205,152,0,192,163,98,255,184,18,60,0,217,182,139,0,109,59,120,255,4,192,251,0,169,210,240,255,37,172,92,254,148,211,245,255,179,65,52,0,253,13,115,0,185,174,206,1,114,188,149,255,237,90,173,0,43,199,192,255,88,108,113,0,52,35,76,0,66,25,148,255,221,4,7,255,151,241,114,255,190,209,232,0,98,50,199,0,151,150,213,255,18,74,36,1,53,40,7,0,19,135,65,255,26,172,69,0,174,237,85,0,99,95,41,0,3,56,16,0,39,160,177,255,200,106,218,254,185,68,84,255,91,186,61,254,67,143,141,255,13,244,166,255,99,114,198,0,199,110,163,255,193,18,186,0,124,239,246,1,110,68,22,0,2,235,46,1,212,60,107,0,105,42,105,1,14,230,152,0,7,5,131,0,141,104,154,255,213,3,6,0,131,228,162,255,179,100,28,1,231,123,85,255,206,14,223,1,253,96,230,0,38,152,149,1,98,137,122,0,214,205,3,255,226,152,179,255,6,133,137,0,158,69,140,255,113,162,154,255,180,243,172,255,27,189,115,255,143,46,220,255,213,134,225,255,126,29,69,0,188,43,137,1,242,70,9,0,90,204,255,255,231,170,147,0,23,56,19,254,56,125,157,255,48,179,218,255,79,182,253,255,38,212,191,1,41,235,124,0,96,151,28,0,135,148,190,0,205,249,39,254,52,96,136,255,212,44,136,255,67,209,131,255,252,130,23,255,219,128,20,255,198,129,118,0,108,101,11,0,178,5,146,1,62,7,100,255,181,236,94,254,28,26,164,0,76,22,112,255,120,102,79,0,202,192,229,1,200,176,215,0,41,64,244,255,206,184,78,0,167,45,63,1,160,35,0,255,59,12,142,255,204,9,144,255,219,94,229,1,122,27,112,0,189,105,109,255,64,208,74,255,251,127,55,1,2,226,198,0,44,76,209,0,151,152,77,255,210,23,46,1,201,171,69,255,44,211,231,0,190,37,224,255,245,196,62,255,169,181,222,255,34,211,17,0,119,241,197,255,229,35,152,1,21,69,40,255,178,226,161,0,148,179,193,0,219,194,254,1,40,206,51,255,231,92,250,1,67,153,170,0,21,148,241,0,170,69,82,255,121,18,231,255,92,114,3,0,184,62,230,0,225,201,87,255,146,96,162,255,181,242,220,0,173,187,221,1,226,62,170,255,56,126,217,1,117,13,227,255,179,44,239,0,157,141,155,255,144,221,83,0,235,209,208,0,42,17,165,1,251,81,133,0,124,245,201,254,97,211,24,255,83,214,166,0,154,36,9,255,248,47,127,0,90,219,140,255,161,217,38,254,212,147,63,255,66,84,148,1,207,3,1,0,230,134,89,1,127,78,122,255,224,155,1,255,82,136,74,0,178,156,208,255,186,25,49,255,222,3,210,1,229,150,190,255,85,162,52,255,41,84,141,255,73,123,84,254,93,17,150,0,119,19,28,1,32,22,215,255,28,23,204,255,142,241,52,255,228,52,125,0,29,76,207,0,215,167,250,254,175,164,230,0,55,207,105,1,109,187,245,255,161,44,220,1,41,101,128,255,167,16,94,0,93,214,107,255,118,72,0,254,80,61,234,255,121,175,125,0,139,169,251,0,97,39,147,254,250,196,49,255,165,179,110,254,223,70,187,255,22,142,125,1,154,179,138,255,118,176,42,1,10,174,153,0,156,92,102,0,168,13,161,255,143,16,32,0,250,197,180,255,203,163,44,1,87,32,36,0,161,153,20,255,123,252,15,0,25,227,80,0,60,88,142,0,17,22,201,1,154,205,77,255,39,63,47,0,8,122,141,0,128,23,182,254,204,39,19,255,4,112,29,255,23,36,140,255,210,234,116,254,53,50,63,255,121,171,104,255,160,219,94,0,87,82,14,254,231,42,5,0,165,139,127,254,86,78,38,0,130,60,66,254,203,30,45,255,46,196,122,1,249,53,162,255,136,143,103,254,215,210,114,0,231,7,160,254,169,152,42,255,111,45,246,0,142,131,135,255,131,71,204,255,36,226,11,0,0,28,242,255,225,138,213,255,247,46,216,254,245,3,183,0,108,252,74,1,206,26,48,255,205,54,246,255,211,198,36,255,121,35,50,0,52,216,202,255,38,139,129,254,242,73,148,0,67,231,141,255,42,47,204,0,78,116,25,1,4,225,191,255,6,147,228,0,58,88,177,0,122,165,229,255,252,83,201,255,224,167,96,1,177,184,158,255,242,105,179,1,248,198,240,0,133,66,203,1,254,36,47,0,45,24,115,255,119,62,254,0,196,225,186,254,123,141,172,0,26,85,41,255,226,111,183,0,213,231,151,0,4,59,7,255,238,138,148,0,66,147,33,255,31,246,141,255,209,141,116,255,104,112,31,0,88,161,172,0,83,215,230,254,47,111,151,0,45,38,52,1,132,45,204,0,138,128,109,254,233,117,134,255,243,190,173,254,241,236,240,0,82,127,236,254,40,223,161,255,110,182,225,255,123,174,239,0,135,242,145,1,51,209,154,0,150,3,115,254,217,164,252,255,55,156,69,1,84,94,255,255,232,73,45,1,20,19,212,255,96,197,59,254,96,251,33,0,38,199,73,1,64,172,247,255,117,116,56,255,228,17,18,0,62,138,103,1,246,229,164,255,244,118,201,254,86,32,159,255,109,34,137,1,85,211,186,0,10,193,193,254,122,194,177,0,122,238,102,255,162,218,171,0,108,217,161,1,158,170,34,0,176,47,155,1,181,228,11,255,8,156,0,0,16,75,93,0,206,98,255,1,58,154,35,0,12,243,184,254,67,117,66,255,230,229,123,0,201,42,110,0,134,228,178,254,186,108,118,255,58,19,154,255,82,169,62,255,114,143,115,1,239,196,50,255,173,48,193,255,147,2,84,255,150,134,147,254,95,232,73,0,109,227,52,254,191,137,10,0,40,204,30,254,76,52,97,255,164,235,126,0,254,124,188,0,74,182,21,1,121,29,35,255,241,30,7,254,85,218,214,255,7,84,150,254,81,27,117,255,160,159,152,254,66,24,221,255,227,10,60,1,141,135,102,0,208,189,150,1,117,179,92,0,132,22,136,255,120,199,28,0,21,129,79,254,182,9,65,0,218,163,169,0,246,147,198,255,107,38,144,1,78,175,205,255,214,5,250,254,47,88,29,255,164,47,204,255,43,55,6,255,131,134,207,254,116,100,214,0,96,140,75,1,106,220,144,0,195,32,28,1,172,81,5,255,199,179,52,255,37,84,203,0,170,112,174,0,11,4,91,0,69,244,27,1,117,131,92,0,33,152,175,255,140,153,107,255,251,135,43,254,87,138,4,255,198,234,147,254,121,152,84,255,205,101,155,1,157,9,25,0,72,106,17,254,108,153,0,255,189,229,186,0,193,8,176,255,174,149,209,0,238,130,29,0,233,214,126,1,61,226,102,0,57,163,4,1,198,111,51,255,45,79,78,1,115,210,10,255,218,9,25,255,158,139,198,255,211,82,187,254,80,133,83,0,157,129,230,1,243,133,134,255,40,136,16,0,77,107,79,255,183,85,92,1,177,204,202,0,163,71,147,255,152,69,190,0,172,51,188,1,250,210,172,255,211,242,113,1,89,89,26,255,64,66,111,254,116,152,42,0,161,39,27,255,54,80,254,0,106,209,115,1,103,124,97,0,221,230,98,255,31,231,6,0,178,192,120,254,15,217,203,255,124,158,79,0,112,145,247,0,92,250,48,1,163,181,193,255,37,47,142,254,144,189,165,255,46,146,240,0,6,75,128,0,41,157,200,254,87,121,213,0,1,113,236,0,5,45,250,0,144,12,82,0,31,108,231,0,225,239,119,255,167,7,189,255,187,228,132,255,110,189,34,0,94,44,204,1,162,52,197,0,78,188,241,254,57,20,141,0,244,146,47,1,206,100,51,0,125,107,148,254,27,195,77,0,152,253,90,1,7,143,144,255,51,37,31,0,34,119,38,255,7,197,118,0,153,188,211,0,151,20,116,254,245,65,52,255,180,253,110,1,47,177,209,0,161,99,17,255,118,222,202,0,125,179,252,1,123,54,126,255,145,57,191,0,55,186,121,0,10,243,138,0,205,211,229,255,125,156,241,254,148,156,185,255,227,19,188,255,124,41,32,255,31,34,206,254,17,57,83,0,204,22,37,255,42,96,98,0,119,102,184,1,3,190,28],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+20480);allocate([110,82,218,255,200,204,192,255,201,145,118,0,117,204,146,0,132,32,98,1,192,194,121,0,106,161,248,1,237,88,124,0,23,212,26,0,205,171,90,255,248,48,216,1,141,37,230,255,124,203,0,254,158,168,30,255,214,248,21,0,112,187,7,255,75,133,239,255,74,227,243,255,250,147,70,0,214,120,162,0,167,9,179,255,22,158,18,0,218,77,209,1,97,109,81,255,244,33,179,255,57,52,57,255,65,172,210,255,249,71,209,255,142,169,238,0,158,189,153,255,174,254,103,254,98,33,14,0,141,76,230,255,113,139,52,255,15,58,212,0,168,215,201,255,248,204,215,1,223,68,160,255,57,154,183,254,47,231,121,0,106,166,137,0,81,136,138,0,165,43,51,0,231,139,61,0,57,95,59,254,118,98,25,255,151,63,236,1,94,190,250,255,169,185,114,1,5,250,58,255,75,105,97,1,215,223,134,0,113,99,163,1,128,62,112,0,99,106,147,0,163,195,10,0,33,205,182,0,214,14,174,255,129,38,231,255,53,182,223,0,98,42,159,255,247,13,40,0,188,210,177,1,6,21,0,255,255,61,148,254,137,45,129,255,89,26,116,254,126,38,114,0,251,50,242,254,121,134,128,255,204,249,167,254,165,235,215,0,202,177,243,0,133,141,62,0,240,130,190,1,110,175,255,0,0,20,146,1,37,210,121,255,7,39,130,0,142,250,84,255,141,200,207,0,9,95,104,255,11,244,174,0,134,232,126,0,167,1,123,254,16,193,149,255,232,233,239,1,213,70,112,255,252,116,160,254,242,222,220,255,205,85,227,0,7,185,58,0,118,247,63,1,116,77,177,255,62,245,200,254,63,18,37,255,107,53,232,254,50,221,211,0,162,219,7,254,2,94,43,0,182,62,182,254,160,78,200,255,135,140,170,0,235,184,228,0,175,53,138,254,80,58,77,255,152,201,2,1,63,196,34,0,5,30,184,0,171,176,154,0,121,59,206,0,38,99,39,0,172,80,77,254,0,134,151,0,186,33,241,254,94,253,223,255,44,114,252,0,108,126,57,255,201,40,13,255,39,229,27,255,39,239,23,1,151,121,51,255,153,150,248,0,10,234,174,255,118,246,4,254,200,245,38,0,69,161,242,1,16,178,150,0,113,56,130,0,171,31,105,0,26,88,108,255,49,42,106,0,251,169,66,0,69,93,149,0,20,57,254,0,164,25,111,0,90,188,90,255,204,4,197,0,40,213,50,1,212,96,132,255,88,138,180,254,228,146,124,255,184,246,247,0,65,117,86,255,253,102,210,254,254,121,36,0,137,115,3,255,60,24,216,0,134,18,29,0,59,226,97,0,176,142,71,0,7,209,161,0,189,84,51,254,155,250,72,0,213,84,235,255,45,222,224,0,238,148,143,255,170,42,53,255,78,167,117,0,186,0,40,255,125,177,103,255,69,225,66,0,227,7,88,1,75,172,6,0,169,45,227,1,16,36,70,255,50,2,9,255,139,193,22,0,143,183,231,254,218,69,50,0,236,56,161,1,213,131,42,0,138,145,44,254,136,229,40,255,49,63,35,255,61,145,245,255,101,192,2,254,232,167,113,0,152,104,38,1,121,185,218,0,121,139,211,254,119,240,35,0,65,189,217,254,187,179,162,255,160,187,230,0,62,248,14,255,60,78,97,0,255,247,163,255,225,59,91,255,107,71,58,255,241,47,33,1,50,117,236,0,219,177,63,254,244,90,179,0,35,194,215,255,189,67,50,255,23,135,129,0,104,189,37,255,185,57,194,0,35,62,231,255,220,248,108,0,12,231,178,0,143,80,91,1,131,93,101,255,144,39,2,1,255,250,178,0,5,17,236,254,139,32,46,0,204,188,38,254,245,115,52,255,191,113,73,254,191,108,69,255,22,69,245,1,23,203,178,0,170,99,170,0,65,248,111,0,37,108,153,255,64,37,69,0,0,88,62,254,89,148,144,255,191,68,224,1,241,39,53,0,41,203,237,255,145,126,194,255,221,42,253,255,25,99,151,0,97,253,223,1,74,115,49,255,6,175,72,255,59,176,203,0,124,183,249,1,228,228,99,0,129,12,207,254,168,192,195,255,204,176,16,254,152,234,171,0,77,37,85,255,33,120,135,255,142,194,227,1,31,214,58,0,213,187,125,255,232,46,60,255,190,116,42,254,151,178,19,255,51,62,237,254,204,236,193,0,194,232,60,0,172,34,157,255,189,16,184,254,103,3,95,255,141,233,36,254,41,25,11,255,21,195,166,0,118,245,45,0,67,213,149,255,159,12,18,255,187,164,227,1,160,25,5,0,12,78,195,1,43,197,225,0,48,142,41,254,196,155,60,255,223,199,18,1,145,136,156,0,252,117,169,254,145,226,238,0,239,23,107,0,109,181,188,255,230,112,49,254,73,170,237,255,231,183,227,255,80,220,20,0,194,107,127,1,127,205,101,0,46,52,197,1,210,171,36,255,88,3,90,255,56,151,141,0,96,187,255,255,42,78,200,0,254,70,70,1,244,125,168,0,204,68,138,1,124,215,70,0,102,66,200,254,17,52,228,0,117,220,143,254,203,248,123,0,56,18,174,255,186,151,164,255,51,232,208,1,160,228,43,255,249,29,25,1,68,190,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,124,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,19,0,0,0,65,132,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,111,117,116,108,101,110,32,60,61,32,85,73,78,84,56,95,77,65,88,0,99,114,121,112,116,111,95,103,101,110,101,114,105,99,104,97,115,104,47,98,108,97,107,101,50,47,114,101,102,47,103,101,110,101,114,105,99,104,97,115,104,95,98,108,97,107,101,50,98,46,99,0,99,114,121,112,116,111,95,103,101,110,101,114,105,99,104,97,115,104,95,98,108,97,107,101,50,98,0,107,101,121,108,101,110,32,60,61,32,85,73,78,84,56,95,77,65,88,0,99,114,121,112,116,111,95,103,101,110,101,114,105,99,104,97,115,104,95,98,108,97,107,101,50,98,95,105,110,105,116,0,99,114,121,112,116,111,95,103,101,110,101,114,105,99,104,97,115,104,95,98,108,97,107,101,50,98,95,102,105,110,97,108,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,55,36,0,101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,32,114,101,116,117,114,110,32,77,111,100,117,108,101,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,40,41,59,32,125,0,123,32,105,102,32,40,77,111,100,117,108,101,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,32,61,61,61,32,117,110,100,101,102,105,110,101,100,41,32,123,32,116,114,121,32,123,32,118,97,114,32,119,105,110,100,111,119,95,32,61,32,34,111,98,106,101,99,116,34,32,61,61,61,32,116,121,112,101,111,102,32,119,105,110,100,111,119,32,63,32,119,105,110,100,111,119,32,58,32,115,101,108,102,44,32,99,114,121,112,116,111,95,32,61,32,116,121,112,101,111,102,32,119,105,110,100,111,119,95,46,99,114,121,112,116,111,32,33,61,61,32,34,117,110,100,101,102,105,110,101,100,34,32,63,32,119,105,110,100,111,119,95,46,99,114,121,112,116,111,32,58,32,119,105,110,100,111,119,95,46,109,115,67,114,121,112,116,111,44,32,114,97,110,100,111,109,86,97,108,117,101,115,83,116,97,110,100,97,114,100,32,61,32,102,117,110,99,116,105,111,110,40,41,32,123,32,118,97,114,32,98,117,102,32,61,32,110,101,119,32,85,105,110,116,51,50,65,114,114,97,121,40,49,41,59,32,99,114,121,112,116,111,95,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,115,40,98,117,102,41,59,32,114,101,116,117,114,110,32,98,117,102,91,48,93,32,62,62,62,32,48,59,32,125,59,32,114,97,110,100,111,109,86,97,108,117,101,115,83,116,97,110,100,97,114,100,40,41,59,32,77,111,100,117,108,101,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,32,61,32,114,97,110,100,111,109,86,97,108,117,101,115,83,116,97,110,100,97,114,100,59,32,125,32,99,97,116,99,104,32,40,101,41,32,123,32,116,114,121,32,123,32,118,97,114,32,99,114,121,112,116,111,32,61,32,114,101,113,117,105,114,101,40,39,99,114,121,112,116,111,39,41,44,32,114,97,110,100,111,109,86,97,108,117,101,78,111,100,101,74,83,32,61,32,102,117,110,99,116,105,111,110,40,41,32,123,32,118,97,114,32,98,117,102,32,61,32,99,114,121,112,116,111,46,114,97,110,100,111,109,66,121,116,101,115,40,52,41,59,32,114,101,116,117,114,110,32,40,98,117,102,91,48,93,32,60,60,32,50,52,32,124,32,98,117,102,91,49,93,32,60,60,32,49,54,32,124,32,98,117,102,91,50,93,32,60,60,32,56,32,124,32,98,117,102,91,51,93,41,32,62,62,62,32,48,59,32,125,59,32,114,97,110,100,111,109,86,97,108,117,101,78,111,100,101,74,83,40,41,59,32,77,111,100,117,108,101,46,103,101,116,82,97,110,100,111,109,86,97,108,117,101,32,61,32,114,97,110,100,111,109,86,97,108,117,101,78,111,100,101,74,83,59,32,125,32,99,97,116,99,104,32,40,101,41,32,123,32,116,104,114,111,119,32,39,78,111,32,115,101,99,117,114,101,32,114,97,110,100,111,109,32,110,117,109,98,101,114,32,103,101,110,101,114,97,116,111,114,32,102,111,117,110,100,39,59,32,125,32,125,32,125,32,125,0,49,46,48,46,54,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+30720);allocate([46,47,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+34873);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);assert(tempDoublePtr%8==0);function copyTempFloat(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3]}function copyTempDouble(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3];HEAP8[tempDoublePtr+4]=HEAP8[ptr+4];HEAP8[tempDoublePtr+5]=HEAP8[ptr+5];HEAP8[tempDoublePtr+6]=HEAP8[ptr+6];HEAP8[tempDoublePtr+7]=HEAP8[ptr+7]}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 85:return totalMemory/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}Module["_i64Subtract"]=_i64Subtract;Module["_i64Add"]=_i64Add;Module["_bitshift64Ashr"]=_bitshift64Ashr;Module["_memset"]=_memset;function _pthread_cleanup_push(routine,arg){__ATEXIT__.push((function(){Runtime.dynCall("vi",routine,[arg])}));_pthread_cleanup_push.level=__ATEXIT__.length}Module["_bitshift64Lshr"]=_bitshift64Lshr;Module["_bitshift64Shl"]=_bitshift64Shl;function _pthread_cleanup_pop(){assert(_pthread_cleanup_push.level==__ATEXIT__.length,"cannot pop if something else added meanwhile!");__ATEXIT__.pop();_pthread_cleanup_push.level=__ATEXIT__.length}function _abort(){Module["abort"]()}function ___lock(){}function ___unlock(){}var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.buffer.byteLength:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var errored=false;var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:(function(flags){flags&=~32768;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var _stdin=allocate(1,"i32*",ALLOC_STATIC);var _stdout=allocate(1,"i32*",ALLOC_STATIC);var _stderr=allocate(1,"i32*",ALLOC_STATIC);var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if((flags&2097155)!==0||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}var mounts=FS.getMounts(FS.root.mount);var completed=0;function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=mounts.length){callback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdev:(function(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,"w");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate["willMovePath"]){FS.trackingDelegate["willMovePath"](old_path,new_path)}}catch(e){console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate["onMovePath"])FS.trackingDelegate["onMovePath"](old_path,new_path)}catch(e){console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){if(err===ERRNO_CODES.EISDIR)err=ERRNO_CODES.EPERM;throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.nodePermissions(node,"w");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===""){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof flags==="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode==="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path==="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;Module["printErr"]("read file: "+path)}}try{if(FS.trackingDelegate["onOpenFile"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate["onOpenFile"](path,trackingFlags)}}catch(e){console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: "+e.message)}return stream}),close:(function(stream){if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}}),llseek:(function(stream,offset,whence){if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var seeking=true;if(typeof position==="undefined"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=true;if(typeof position==="undefined"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate["onWriteToFile"])FS.trackingDelegate["onWriteToFile"](stream.path)}catch(e){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: "+e.message)}return bytesWritten}),allocate:(function(stream,offset,length){if(offset<0||length<=0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)}),munmap:(function(stream){return 0}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)}return stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||"r";opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret}),writeFile:(function(path,data,opts){opts=opts||{};opts.flags=opts.flags||"w";opts.encoding=opts.encoding||"utf8";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var stream=FS.open(path,opts.flags,opts.mode);if(opts.encoding==="utf8"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,0,opts.canOwn)}else if(opts.encoding==="binary"){FS.write(stream,data,0,data.length,0,opts.canOwn)}FS.close(stream)}),cwd:(function(){return FS.currentPath}),chdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}var err=FS.nodePermissions(lookup.node,"x");if(err){throw new FS.ErrnoError(err)}FS.currentPath=lookup.path}),createDefaultDirectories:(function(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")}),createDefaultDevices:(function(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:(function(){return 0}),write:(function(stream,buffer,offset,length,pos){return length})});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device;if(typeof crypto!=="undefined"){var randomBuffer=new Uint8Array(1);random_device=(function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]})}else if(ENVIRONMENT_IS_NODE){random_device=(function(){return require("crypto").randomBytes(1)[0]})}else{random_device=(function(){return Math.random()*256|0})}FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")}),createSpecialDirectories:(function(){FS.mkdir("/proc");FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:(function(){var node=FS.createNode("/proc/self","fd",16384|511,73);node.node_ops={lookup:(function(parent,name){var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:(function(){return stream.path})}};ret.parent=ret;return ret})};return node})},{},"/proc/self/fd")}),createStandardStreams:(function(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin","r");assert(stdin.fd===0,"invalid handle for stdin ("+stdin.fd+")");var stdout=FS.open("/dev/stdout","w");assert(stdout.fd===1,"invalid handle for stdout ("+stdout.fd+")");var stderr=FS.open("/dev/stderr","w");assert(stderr.fd===2,"invalid handle for stderr ("+stderr.fd+")")}),ensureErrnoError:(function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=(function(errno){this.errno=errno;for(var key in ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}});this.setErrno(errno);this.message=ERRNO_MESSAGES[errno]};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""}))}),staticInit:(function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"IDBFS":IDBFS,"NODEFS":NODEFS,"WORKERFS":WORKERFS}}),init:(function(input,output,error){assert(!FS.init.initialized,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;var fflush=Module["_fflush"];if(fflush)fflush(0);for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperty(lazyArray,"length",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})});Object.defineProperty(lazyArray,"chunkSize",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperty(node,"usedBytes",{get:(function(){return this.contents.length})});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);ret=ret.slice(0,Math.max(0,bufsize));writeStringToMemory(ret,buf,true);return ret.length}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var _emscripten_asm_const=true;function ___assert_fail(condition,filename,line,func){ABORT=true;throw"Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"]+" at "+stackTrace()}function _sbrk(bytes){var self=_sbrk;if(!self.called){DYNAMICTOP=alignMemoryPage(DYNAMICTOP);self.called=true;assert(Runtime.dynamicAlloc);self.alloc=Runtime.dynamicAlloc;Runtime.dynamicAlloc=(function(){abort("cannot dynamically allocate, sbrk now has control")})}var ret=DYNAMICTOP;if(bytes!=0){var success=self.alloc(bytes);if(!success)return-1>>>0}return ret}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;Module["_memmove"]=_memmove;var _emscripten_asm_const_int=true;function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function _pthread_self(){return 0}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);staticSealed=true;STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=DYNAMICTOP=Runtime.alignMemory(STACK_MAX);assert(DYNAMIC_BASE>0]|0;M=Hd(d[e+1>>0]|0|0,0,8)|0;J=C;r=Hd(d[e+2>>0]|0|0,0,16)|0;J=J|C;s=Hd(d[e+3>>0]|0|0,0,24)|0;J=J|C;I=a[e+6>>0]|0;L=d[e+4>>0]|0;p=Hd(d[e+5>>0]|0|0,0,8)|0;K=C;I=Hd(I&255|0,0,16)|0;K=Hd(p|L|I|0,K|C|0,6)|0;I=C;L=a[e+9>>0]|0;p=d[e+7>>0]|0;f=Hd(d[e+8>>0]|0|0,0,8)|0;w=C;L=Hd(L&255|0,0,16)|0;w=Hd(f|p|L|0,w|C|0,5)|0;L=C;p=a[e+12>>0]|0;f=d[e+10>>0]|0;y=Hd(d[e+11>>0]|0|0,0,8)|0;n=C;p=Hd(p&255|0,0,16)|0;n=Hd(y|f|p|0,n|C|0,3)|0;p=C;f=a[e+15>>0]|0;y=d[e+13>>0]|0;F=Hd(d[e+14>>0]|0|0,0,8)|0;A=C;f=Hd(f&255|0,0,16)|0;A=Hd(F|y|f|0,A|C|0,2)|0;f=C;y=d[e+16>>0]|0;F=Hd(d[e+17>>0]|0|0,0,8)|0;u=C;h=Hd(d[e+18>>0]|0|0,0,16)|0;u=u|C;t=Hd(d[e+19>>0]|0|0,0,24)|0;t=F|y|h|t;u=u|C;h=a[e+22>>0]|0;y=d[e+20>>0]|0;F=Hd(d[e+21>>0]|0|0,0,8)|0;E=C;h=Hd(h&255|0,0,16)|0;E=Hd(F|y|h|0,E|C|0,7)|0;h=C;y=a[e+25>>0]|0;F=d[e+23>>0]|0;N=Hd(d[e+24>>0]|0|0,0,8)|0;x=C;y=Hd(y&255|0,0,16)|0;x=Hd(N|F|y|0,x|C|0,5)|0;y=C;F=a[e+28>>0]|0;N=d[e+26>>0]|0;g=Hd(d[e+27>>0]|0|0,0,8)|0;G=C;F=Hd(F&255|0,0,16)|0;G=Hd(g|N|F|0,G|C|0,4)|0;F=C;N=e+31|0;g=a[N>>0]|0;D=d[e+29>>0]|0;v=Hd(d[e+30>>0]|0|0,0,8)|0;B=C;g=Hd(g&255|0,0,16)|0;B=Hd(v|D|g|0,B|C|0,2)|0;B=B&33554428;g=Dd(B|0,0,16777216,0)|0;g=Gd(g|0,C|0,25)|0;D=C;v=Cd(0,0,g|0,D|0)|0;J=Dd(v&19|0,0,M|T|r|s|0,J|0)|0;s=C;D=Hd(g|0,D|0,25)|0;g=C;r=Dd(K|0,I|0,16777216,0)|0;r=Gd(r|0,C|0,25)|0;T=C;L=Dd(w|0,L|0,r|0,T|0)|0;w=C;T=Hd(r|0,T|0,25)|0;T=Cd(K|0,I|0,T|0,C|0)|0;I=C;K=Dd(n|0,p|0,16777216,0)|0;K=Gd(K|0,C|0,25)|0;r=C;f=Dd(A|0,f|0,K|0,r|0)|0;A=C;r=Hd(K|0,r|0,25)|0;K=C;M=Dd(t|0,u|0,16777216,0)|0;M=Gd(M|0,C|0,25)|0;v=C;h=Dd(E|0,h|0,M|0,v|0)|0;E=C;v=Hd(M|0,v|0,25)|0;M=C;e=Dd(x|0,y|0,16777216,0)|0;e=Gd(e|0,C|0,25)|0;z=C;F=Dd(G|0,F|0,e|0,z|0)|0;G=C;z=Hd(e|0,z|0,25)|0;e=C;S=Dd(J|0,s|0,33554432,0)|0;S=Ed(S|0,C|0,26)|0;H=C;I=Dd(T|0,I|0,S|0,H|0)|0;H=Hd(S|0,H|0,26)|0;H=Cd(J|0,s|0,H|0,C|0)|0;s=Dd(L|0,w|0,33554432,0)|0;s=Ed(s|0,C|0,26)|0;J=C;p=Dd(s|0,J|0,n|0,p|0)|0;K=Cd(p|0,C|0,r|0,K|0)|0;J=Hd(s|0,J|0,26)|0;J=Cd(L|0,w|0,J|0,C|0)|0;w=Dd(f|0,A|0,33554432,0)|0;w=Ed(w|0,C|0,26)|0;L=C;u=Dd(w|0,L|0,t|0,u|0)|0;M=Cd(u|0,C|0,v|0,M|0)|0;L=Hd(w|0,L|0,26)|0;L=Cd(f|0,A|0,L|0,C|0)|0;A=Dd(h|0,E|0,33554432,0)|0;A=Ed(A|0,C|0,26)|0;f=C;y=Dd(A|0,f|0,x|0,y|0)|0;e=Cd(y|0,C|0,z|0,e|0)|0;f=Hd(A|0,f|0,26)|0;f=Cd(h|0,E|0,f|0,C|0)|0;E=Dd(F|0,G|0,33554432,0)|0;E=Ed(E|0,C|0,26)|0;h=C;B=Dd(B|0,0,E|0,h|0)|0;g=Cd(B|0,C|0,D|0,g|0)|0;h=Hd(E|0,h|0,26)|0;h=Cd(F|0,G|0,h|0,C|0)|0;c[O>>2]=H;c[b+44>>2]=I;c[b+48>>2]=J;c[b+52>>2]=K;c[b+56>>2]=L;c[b+60>>2]=M;c[b+64>>2]=f;c[b+68>>2]=e;c[b+72>>2]=h;c[b+76>>2]=g;g=b+80|0;c[g>>2]=1;h=b+84|0;e=h;f=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));Kc(q,O);Jc(l,q,1064);f=q+4|0;n=q+8|0;p=q+12|0;r=q+16|0;s=q+20|0;v=q+24|0;x=q+28|0;z=q+32|0;B=q+36|0;g=c[g>>2]|0;t=c[h>>2]|0;w=c[b+88>>2]|0;A=c[b+92>>2]|0;E=c[b+96>>2]|0;G=c[b+100>>2]|0;I=c[b+104>>2]|0;K=c[b+108>>2]|0;M=c[b+112>>2]|0;T=c[b+116>>2]|0;e=(c[f>>2]|0)-t|0;S=(c[n>>2]|0)-w|0;L=(c[p>>2]|0)-A|0;J=(c[r>>2]|0)-E|0;H=(c[s>>2]|0)-G|0;F=(c[v>>2]|0)-I|0;D=(c[x>>2]|0)-K|0;y=(c[z>>2]|0)-M|0;u=(c[B>>2]|0)-T|0;c[q>>2]=(c[q>>2]|0)-g;c[f>>2]=e;c[n>>2]=S;c[p>>2]=L;c[r>>2]=J;c[s>>2]=H;c[v>>2]=F;c[x>>2]=D;c[z>>2]=y;c[B>>2]=u;u=l+4|0;y=l+8|0;D=l+12|0;F=l+16|0;H=l+20|0;J=l+24|0;L=l+28|0;S=l+32|0;e=l+36|0;t=t+(c[u>>2]|0)|0;w=w+(c[y>>2]|0)|0;A=A+(c[D>>2]|0)|0;E=E+(c[F>>2]|0)|0;G=G+(c[H>>2]|0)|0;I=I+(c[J>>2]|0)|0;K=K+(c[L>>2]|0)|0;M=M+(c[S>>2]|0)|0;T=T+(c[e>>2]|0)|0;c[l>>2]=g+(c[l>>2]|0);c[u>>2]=t;c[y>>2]=w;c[D>>2]=A;c[F>>2]=E;c[H>>2]=G;c[J>>2]=I;c[L>>2]=K;c[S>>2]=M;c[e>>2]=T;Kc(m,l);Jc(m,m,l);Kc(b,m);Jc(b,b,l);Jc(b,b,q);Kc(Q,b);Kc(k,Q);Kc(k,k);Jc(k,b,k);Jc(Q,Q,k);Kc(Q,Q);Jc(Q,k,Q);Kc(k,Q);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Jc(Q,k,Q);Kc(k,Q);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Jc(k,k,Q);Kc(j,k);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Kc(j,j);Jc(k,j,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Kc(k,k);Jc(Q,k,Q);Kc(k,Q);e=1;do{Kc(k,k);e=e+1|0}while((e|0)!=50);Jc(k,k,Q);Kc(j,k);e=1;do{Kc(j,j);e=e+1|0}while((e|0)!=100);Jc(k,j,k);Kc(k,k);e=1;do{Kc(k,k);e=e+1|0}while((e|0)!=50);Jc(Q,k,Q);Kc(Q,Q);Kc(Q,Q);Jc(b,Q,b);Jc(b,b,m);Jc(b,b,q);Kc(o,b);Jc(o,o,l);E=c[o>>2]|0;F=c[o+4>>2]|0;G=c[o+8>>2]|0;H=c[o+12>>2]|0;I=c[o+16>>2]|0;J=c[o+20>>2]|0;K=c[o+24>>2]|0;L=c[o+28>>2]|0;M=c[o+32>>2]|0;D=c[o+36>>2]|0;A=c[q>>2]|0;y=c[f>>2]|0;w=c[n>>2]|0;u=c[p>>2]|0;t=c[r>>2]|0;s=c[s>>2]|0;r=c[v>>2]|0;q=c[x>>2]|0;p=c[z>>2]|0;e=c[B>>2]|0;c[P>>2]=E-A;f=P+4|0;c[f>>2]=F-y;g=P+8|0;c[g>>2]=G-w;h=P+12|0;c[h>>2]=H-u;j=P+16|0;c[j>>2]=I-t;k=P+20|0;c[k>>2]=J-s;l=P+24|0;c[l>>2]=K-r;m=P+28|0;c[m>>2]=L-q;n=P+32|0;c[n>>2]=M-p;o=P+36|0;c[o>>2]=D-e;Lc(Q,P);do if(Yc(Q,33004)|0){c[P>>2]=A+E;c[f>>2]=y+F;c[g>>2]=w+G;c[h>>2]=u+H;c[j>>2]=t+I;c[k>>2]=s+J;c[l>>2]=r+K;c[m>>2]=q+L;c[n>>2]=p+M;c[o>>2]=e+D;Lc(Q,P);if(!(Yc(Q,33004)|0)){Jc(b,b,1104);break}else{T=-1;i=R;return T|0}}while(0);Lc(Q,b);if(((d[Q>>0]|0)&1|0)==((d[N>>0]|0)>>>7|0)){A=b+4|0;D=b+8|0;F=b+12|0;H=b+16|0;J=b+20|0;L=b+24|0;N=b+28|0;Q=b+32|0;T=b+36|0;z=0-(c[A>>2]|0)|0;B=0-(c[D>>2]|0)|0;E=0-(c[F>>2]|0)|0;G=0-(c[H>>2]|0)|0;I=0-(c[J>>2]|0)|0;K=0-(c[L>>2]|0)|0;M=0-(c[N>>2]|0)|0;P=0-(c[Q>>2]|0)|0;S=0-(c[T>>2]|0)|0;c[b>>2]=0-(c[b>>2]|0);c[A>>2]=z;c[D>>2]=B;c[F>>2]=E;c[H>>2]=G;c[J>>2]=I;c[L>>2]=K;c[N>>2]=M;c[Q>>2]=P;c[T>>2]=S}Jc(b+120|0,b,O);T=0;i=R;return T|0}function Oc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;V=b+40|0;j=b+44|0;m=b+48|0;p=b+52|0;s=b+56|0;v=b+60|0;y=b+64|0;B=b+68|0;E=b+72|0;C=b+76|0;S=b+4|0;P=b+8|0;e=b+12|0;l=b+16|0;n=b+20|0;u=b+24|0;w=b+28|0;D=b+32|0;O=b+36|0;ga=(c[S>>2]|0)+(c[j>>2]|0)|0;fa=(c[P>>2]|0)+(c[m>>2]|0)|0;ea=(c[e>>2]|0)+(c[p>>2]|0)|0;da=(c[l>>2]|0)+(c[s>>2]|0)|0;ca=(c[n>>2]|0)+(c[v>>2]|0)|0;ba=(c[u>>2]|0)+(c[y>>2]|0)|0;aa=(c[w>>2]|0)+(c[B>>2]|0)|0;$=(c[D>>2]|0)+(c[E>>2]|0)|0;Y=(c[O>>2]|0)+(c[C>>2]|0)|0;c[a>>2]=(c[b>>2]|0)+(c[V>>2]|0);ha=a+4|0;c[ha>>2]=ga;ga=a+8|0;c[ga>>2]=fa;fa=a+12|0;c[fa>>2]=ea;ea=a+16|0;c[ea>>2]=da;da=a+20|0;c[da>>2]=ca;ca=a+24|0;c[ca>>2]=ba;ba=a+28|0;c[ba>>2]=aa;aa=a+32|0;c[aa>>2]=$;$=a+36|0;c[$>>2]=Y;Y=a+40|0;S=(c[j>>2]|0)-(c[S>>2]|0)|0;P=(c[m>>2]|0)-(c[P>>2]|0)|0;e=(c[p>>2]|0)-(c[e>>2]|0)|0;l=(c[s>>2]|0)-(c[l>>2]|0)|0;n=(c[v>>2]|0)-(c[n>>2]|0)|0;u=(c[y>>2]|0)-(c[u>>2]|0)|0;w=(c[B>>2]|0)-(c[w>>2]|0)|0;D=(c[E>>2]|0)-(c[D>>2]|0)|0;O=(c[C>>2]|0)-(c[O>>2]|0)|0;c[Y>>2]=(c[V>>2]|0)-(c[b>>2]|0);V=a+44|0;c[V>>2]=S;S=a+48|0;c[S>>2]=P;P=a+52|0;c[P>>2]=e;e=a+56|0;c[e>>2]=l;l=a+60|0;c[l>>2]=n;n=a+64|0;c[n>>2]=u;u=a+68|0;c[u>>2]=w;w=a+72|0;c[w>>2]=D;D=a+76|0;c[D>>2]=O;O=a+80|0;Jc(O,a,d);Jc(Y,Y,d+40|0);C=a+120|0;Jc(C,d+80|0,b+120|0);E=c[b+80>>2]<<1;B=c[b+84>>2]<<1;y=c[b+88>>2]<<1;v=c[b+92>>2]<<1;s=c[b+96>>2]<<1;p=c[b+100>>2]<<1;m=c[b+104>>2]<<1;j=c[b+108>>2]<<1;g=c[b+112>>2]<<1;b=c[b+116>>2]<<1;Z=c[O>>2]|0;N=a+84|0;W=c[N>>2]|0;M=a+88|0;T=c[M>>2]|0;L=a+92|0;Q=c[L>>2]|0;K=a+96|0;f=c[K>>2]|0;J=a+100|0;h=c[J>>2]|0;I=a+104|0;o=c[I>>2]|0;H=a+108|0;q=c[H>>2]|0;G=a+112|0;x=c[G>>2]|0;F=a+116|0;z=c[F>>2]|0;_=c[Y>>2]|0;X=c[V>>2]|0;U=c[S>>2]|0;R=c[P>>2]|0;d=c[e>>2]|0;i=c[l>>2]|0;k=c[n>>2]|0;r=c[u>>2]|0;t=c[w>>2]|0;A=c[D>>2]|0;c[a>>2]=Z-_;c[ha>>2]=W-X;c[ga>>2]=T-U;c[fa>>2]=Q-R;c[ea>>2]=f-d;c[da>>2]=h-i;c[ca>>2]=o-k;c[ba>>2]=q-r;c[aa>>2]=x-t;c[$>>2]=z-A;c[Y>>2]=_+Z;c[V>>2]=X+W;c[S>>2]=U+T;c[P>>2]=R+Q;c[e>>2]=d+f;c[l>>2]=i+h;c[n>>2]=k+o;c[u>>2]=r+q;c[w>>2]=t+x;c[D>>2]=A+z;D=c[C>>2]|0;z=a+124|0;A=c[z>>2]|0;w=a+128|0;x=c[w>>2]|0;t=a+132|0;u=c[t>>2]|0;q=a+136|0;r=c[q>>2]|0;n=a+140|0;o=c[n>>2]|0;k=a+144|0;l=c[k>>2]|0;h=a+148|0;i=c[h>>2]|0;e=a+152|0;f=c[e>>2]|0;a=a+156|0;d=c[a>>2]|0;c[O>>2]=D+E;c[N>>2]=A+B;c[M>>2]=x+y;c[L>>2]=u+v;c[K>>2]=r+s;c[J>>2]=o+p;c[I>>2]=l+m;c[H>>2]=i+j;c[G>>2]=f+g;c[F>>2]=d+b;c[C>>2]=E-D;c[z>>2]=B-A;c[w>>2]=y-x;c[t>>2]=v-u;c[q>>2]=s-r;c[n>>2]=p-o;c[k>>2]=m-l;c[h>>2]=j-i;c[e>>2]=g-f;c[a>>2]=b-d;return}function Pc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0;d=i;S=i=i+63&-64;i=i+48|0;Kc(a,b);aa=a+80|0;ta=b+40|0;Kc(aa,ta);v=a+120|0;ib=c[b+80>>2]|0;Sa=c[b+84>>2]|0;p=c[b+88>>2]|0;x=c[b+92>>2]|0;f=c[b+96>>2]|0;kb=c[b+100>>2]|0;_=c[b+104>>2]|0;wa=c[b+108>>2]|0;l=c[b+112>>2]|0;ua=c[b+116>>2]|0;t=ib<<1;ra=Sa<<1;cb=p<<1;g=x<<1;Ma=f<<1;e=kb<<1;va=_<<1;n=wa<<1;bb=kb*38|0;Qa=_*19|0;Q=wa*38|0;H=l*19|0;nb=ua*38|0;jb=((ib|0)<0)<<31>>31;jb=Od(ib|0,jb|0,ib|0,jb|0)|0;ib=C;qa=((t|0)<0)<<31>>31;Ta=((Sa|0)<0)<<31>>31;$a=Od(t|0,qa|0,Sa|0,Ta|0)|0;_a=C;r=((p|0)<0)<<31>>31;Va=Od(p|0,r|0,t|0,qa|0)|0;Ua=C;R=((x|0)<0)<<31>>31;La=Od(x|0,R|0,t|0,qa|0)|0;Ka=C;ka=((f|0)<0)<<31>>31;za=Od(f|0,ka|0,t|0,qa|0)|0;ya=C;lb=((kb|0)<0)<<31>>31;K=Od(kb|0,lb|0,t|0,qa|0)|0;M=C;j=((_|0)<0)<<31>>31;k=Od(_|0,j|0,t|0,qa|0)|0;F=C;xa=((wa|0)<0)<<31>>31;u=Od(wa|0,xa|0,t|0,qa|0)|0;P=C;ma=((l|0)<0)<<31>>31;W=Od(l|0,ma|0,t|0,qa|0)|0;fa=C;oa=((ua|0)<0)<<31>>31;qa=Od(ua|0,oa|0,t|0,qa|0)|0;t=C;pa=((ra|0)<0)<<31>>31;Ta=Od(ra|0,pa|0,Sa|0,Ta|0)|0;Sa=C;Ja=Od(ra|0,pa|0,p|0,r|0)|0;Ia=C;ja=((g|0)<0)<<31>>31;Da=Od(g|0,ja|0,ra|0,pa|0)|0;Ca=C;B=Od(f|0,ka|0,ra|0,pa|0)|0;E=C;la=((e|0)<0)<<31>>31;h=Od(e|0,la|0,ra|0,pa|0)|0;D=C;s=Od(_|0,j|0,ra|0,pa|0)|0;N=C;$=((n|0)<0)<<31>>31;V=Od(n|0,$|0,ra|0,pa|0)|0;ea=C;sa=Od(l|0,ma|0,ra|0,pa|0)|0;na=C;mb=((nb|0)<0)<<31>>31;pa=Od(nb|0,mb|0,ra|0,pa|0)|0;ra=C;Ba=Od(p|0,r|0,p|0,r|0)|0;Aa=C;db=((cb|0)<0)<<31>>31;G=Od(cb|0,db|0,x|0,R|0)|0;I=C;y=Od(f|0,ka|0,cb|0,db|0)|0;A=C;o=Od(kb|0,lb|0,cb|0,db|0)|0;J=C;w=Od(_|0,j|0,cb|0,db|0)|0;ba=C;Z=Od(wa|0,xa|0,cb|0,db|0)|0;ia=C;m=((H|0)<0)<<31>>31;db=Od(H|0,m|0,cb|0,db|0)|0;cb=C;r=Od(nb|0,mb|0,p|0,r|0)|0;p=C;R=Od(g|0,ja|0,x|0,R|0)|0;x=C;q=Od(g|0,ja|0,f|0,ka|0)|0;L=C;U=Od(e|0,la|0,g|0,ja|0)|0;da=C;X=Od(_|0,j|0,g|0,ja|0)|0;ga=C;O=((Q|0)<0)<<31>>31;fb=Od(Q|0,O|0,g|0,ja|0)|0;eb=C;Xa=Od(H|0,m|0,g|0,ja|0)|0;Wa=C;ja=Od(nb|0,mb|0,g|0,ja|0)|0;g=C;T=Od(f|0,ka|0,f|0,ka|0)|0;ca=C;Na=((Ma|0)<0)<<31>>31;Y=Od(Ma|0,Na|0,kb|0,lb|0)|0;ha=C;Ra=((Qa|0)<0)<<31>>31;hb=Od(Qa|0,Ra|0,Ma|0,Na|0)|0;gb=C;Za=Od(Q|0,O|0,f|0,ka|0)|0;Ya=C;Na=Od(H|0,m|0,Ma|0,Na|0)|0;Ma=C;ka=Od(nb|0,mb|0,f|0,ka|0)|0;f=C;lb=Od(bb|0,((bb|0)<0)<<31>>31|0,kb|0,lb|0)|0;kb=C;bb=Od(Qa|0,Ra|0,e|0,la|0)|0;ab=C;Pa=Od(Q|0,O|0,e|0,la|0)|0;Oa=C;Fa=Od(H|0,m|0,e|0,la|0)|0;Ea=C;la=Od(nb|0,mb|0,e|0,la|0)|0;e=C;Ra=Od(Qa|0,Ra|0,_|0,j|0)|0;Qa=C;Ha=Od(Q|0,O|0,_|0,j|0)|0;Ga=C;va=Od(H|0,m|0,va|0,((va|0)<0)<<31>>31|0)|0;z=C;j=Od(nb|0,mb|0,_|0,j|0)|0;_=C;xa=Od(Q|0,O|0,wa|0,xa|0)|0;wa=C;O=Od(H|0,m|0,n|0,$|0)|0;Q=C;$=Od(nb|0,mb|0,n|0,$|0)|0;n=C;m=Od(H|0,m|0,l|0,ma|0)|0;H=C;ma=Od(nb|0,mb|0,l|0,ma|0)|0;l=C;oa=Od(nb|0,mb|0,ua|0,oa|0)|0;ua=C;ib=Dd(lb|0,kb|0,jb|0,ib|0)|0;gb=Dd(ib|0,C|0,hb|0,gb|0)|0;eb=Dd(gb|0,C|0,fb|0,eb|0)|0;cb=Dd(eb|0,C|0,db|0,cb|0)|0;ra=Dd(cb|0,C|0,pa|0,ra|0)|0;pa=C;_a=Dd(bb|0,ab|0,$a|0,_a|0)|0;Ya=Dd(_a|0,C|0,Za|0,Ya|0)|0;Wa=Dd(Ya|0,C|0,Xa|0,Wa|0)|0;p=Dd(Wa|0,C|0,r|0,p|0)|0;r=C;Sa=Dd(Va|0,Ua|0,Ta|0,Sa|0)|0;Qa=Dd(Sa|0,C|0,Ra|0,Qa|0)|0;Oa=Dd(Qa|0,C|0,Pa|0,Oa|0)|0;Ma=Dd(Oa|0,C|0,Na|0,Ma|0)|0;g=Dd(Ma|0,C|0,ja|0,g|0)|0;ja=C;Ia=Dd(La|0,Ka|0,Ja|0,Ia|0)|0;Ga=Dd(Ia|0,C|0,Ha|0,Ga|0)|0;Ea=Dd(Ga|0,C|0,Fa|0,Ea|0)|0;f=Dd(Ea|0,C|0,ka|0,f|0)|0;ka=C;Aa=Dd(Da|0,Ca|0,Ba|0,Aa|0)|0;ya=Dd(Aa|0,C|0,za|0,ya|0)|0;wa=Dd(ya|0,C|0,xa|0,wa|0)|0;z=Dd(wa|0,C|0,va|0,z|0)|0;e=Dd(z|0,C|0,la|0,e|0)|0;la=C;I=Dd(B|0,E|0,G|0,I|0)|0;M=Dd(I|0,C|0,K|0,M|0)|0;Q=Dd(M|0,C|0,O|0,Q|0)|0;_=Dd(Q|0,C|0,j|0,_|0)|0;j=C;A=Dd(R|0,x|0,y|0,A|0)|0;D=Dd(A|0,C|0,h|0,D|0)|0;F=Dd(D|0,C|0,k|0,F|0)|0;H=Dd(F|0,C|0,m|0,H|0)|0;n=Dd(H|0,C|0,$|0,n|0)|0;$=C;L=Dd(o|0,J|0,q|0,L|0)|0;N=Dd(L|0,C|0,s|0,N|0)|0;P=Dd(N|0,C|0,u|0,P|0)|0;l=Dd(P|0,C|0,ma|0,l|0)|0;ma=C;ca=Dd(w|0,ba|0,T|0,ca|0)|0;da=Dd(ca|0,C|0,U|0,da|0)|0;ea=Dd(da|0,C|0,V|0,ea|0)|0;fa=Dd(ea|0,C|0,W|0,fa|0)|0;ua=Dd(fa|0,C|0,oa|0,ua|0)|0;oa=C;ha=Dd(X|0,ga|0,Y|0,ha|0)|0;ia=Dd(ha|0,C|0,Z|0,ia|0)|0;na=Dd(ia|0,C|0,sa|0,na|0)|0;t=Dd(na|0,C|0,qa|0,t|0)|0;qa=C;pa=Hd(ra|0,pa|0,1)|0;ra=C;r=Hd(p|0,r|0,1)|0;p=C;ja=Hd(g|0,ja|0,1)|0;g=C;ka=Hd(f|0,ka|0,1)|0;f=C;la=Hd(e|0,la|0,1)|0;e=C;j=Hd(_|0,j|0,1)|0;_=C;$=Hd(n|0,$|0,1)|0;n=C;ma=Hd(l|0,ma|0,1)|0;l=C;oa=Hd(ua|0,oa|0,1)|0;ua=C;qa=Hd(t|0,qa|0,1)|0;t=C;na=Dd(pa|0,ra|0,33554432,0)|0;na=Ed(na|0,C|0,26)|0;sa=C;p=Dd(na|0,sa|0,r|0,p|0)|0;r=C;sa=Hd(na|0,sa|0,26)|0;sa=Cd(pa|0,ra|0,sa|0,C|0)|0;ra=C;pa=Dd(la|0,e|0,33554432,0)|0;pa=Ed(pa|0,C|0,26)|0;na=C;_=Dd(pa|0,na|0,j|0,_|0)|0;j=C;na=Hd(pa|0,na|0,26)|0;na=Cd(la|0,e|0,na|0,C|0)|0;e=C;la=Dd(p|0,r|0,16777216,0)|0;la=Ed(la|0,C|0,25)|0;pa=C;g=Dd(la|0,pa|0,ja|0,g|0)|0;ja=C;pa=Hd(la|0,pa|0,25)|0;pa=Cd(p|0,r|0,pa|0,C|0)|0;r=C;p=Dd(_|0,j|0,16777216,0)|0;p=Ed(p|0,C|0,25)|0;la=C;n=Dd(p|0,la|0,$|0,n|0)|0;$=C;la=Hd(p|0,la|0,25)|0;la=Cd(_|0,j|0,la|0,C|0)|0;j=C;_=Dd(g|0,ja|0,33554432,0)|0;_=Ed(_|0,C|0,26)|0;p=C;f=Dd(_|0,p|0,ka|0,f|0)|0;ka=C;p=Hd(_|0,p|0,26)|0;p=Cd(g|0,ja|0,p|0,C|0)|0;ja=Dd(n|0,$|0,33554432,0)|0;ja=Ed(ja|0,C|0,26)|0;g=C;l=Dd(ja|0,g|0,ma|0,l|0)|0;ma=C;g=Hd(ja|0,g|0,26)|0;g=Cd(n|0,$|0,g|0,C|0)|0;$=Dd(f|0,ka|0,16777216,0)|0;$=Ed($|0,C|0,25)|0;n=C;e=Dd($|0,n|0,na|0,e|0)|0;na=C;n=Hd($|0,n|0,25)|0;n=Cd(f|0,ka|0,n|0,C|0)|0;ka=Dd(l|0,ma|0,16777216,0)|0;ka=Ed(ka|0,C|0,25)|0;f=C;ua=Dd(ka|0,f|0,oa|0,ua|0)|0;oa=C;f=Hd(ka|0,f|0,25)|0;f=Cd(l|0,ma|0,f|0,C|0)|0;ma=Dd(e|0,na|0,33554432,0)|0;ma=Ed(ma|0,C|0,26)|0;l=C;j=Dd(la|0,j|0,ma|0,l|0)|0;l=Hd(ma|0,l|0,26)|0;l=Cd(e|0,na|0,l|0,C|0)|0;na=Dd(ua|0,oa|0,33554432,0)|0;na=Ed(na|0,C|0,26)|0;e=C;t=Dd(na|0,e|0,qa|0,t|0)|0;qa=C;e=Hd(na|0,e|0,26)|0;e=Cd(ua|0,oa|0,e|0,C|0)|0;oa=Dd(t|0,qa|0,16777216,0)|0;oa=Ed(oa|0,C|0,25)|0;ua=C;na=Od(oa|0,ua|0,19,0)|0;ra=Dd(na|0,C|0,sa|0,ra|0)|0;sa=C;ua=Hd(oa|0,ua|0,25)|0;ua=Cd(t|0,qa|0,ua|0,C|0)|0;qa=Dd(ra|0,sa|0,33554432,0)|0;qa=Ed(qa|0,C|0,26)|0;t=C;r=Dd(pa|0,r|0,qa|0,t|0)|0;t=Hd(qa|0,t|0,26)|0;t=Cd(ra|0,sa|0,t|0,C|0)|0;c[v>>2]=t;t=a+124|0;c[t>>2]=r;r=a+128|0;c[r>>2]=p;p=a+132|0;c[p>>2]=n;n=a+136|0;c[n>>2]=l;l=a+140|0;c[l>>2]=j;j=a+144|0;c[j>>2]=g;g=a+148|0;c[g>>2]=f;f=a+152|0;c[f>>2]=e;e=a+156|0;c[e>>2]=ua;ua=a+40|0;sa=(c[b+44>>2]|0)+(c[b+4>>2]|0)|0;ra=(c[b+48>>2]|0)+(c[b+8>>2]|0)|0;qa=(c[b+52>>2]|0)+(c[b+12>>2]|0)|0;pa=(c[b+56>>2]|0)+(c[b+16>>2]|0)|0;oa=(c[b+60>>2]|0)+(c[b+20>>2]|0)|0;na=(c[b+64>>2]|0)+(c[b+24>>2]|0)|0;ma=(c[b+68>>2]|0)+(c[b+28>>2]|0)|0;la=(c[b+72>>2]|0)+(c[b+32>>2]|0)|0;ka=(c[b+76>>2]|0)+(c[b+36>>2]|0)|0;c[ua>>2]=(c[ta>>2]|0)+(c[b>>2]|0);ta=a+44|0;c[ta>>2]=sa;sa=a+48|0;c[sa>>2]=ra;ra=a+52|0;c[ra>>2]=qa;qa=a+56|0;c[qa>>2]=pa;pa=a+60|0;c[pa>>2]=oa;oa=a+64|0;c[oa>>2]=na;na=a+68|0;c[na>>2]=ma;ma=a+72|0;c[ma>>2]=la;la=a+76|0;c[la>>2]=ka;Kc(S,ua);ka=c[aa>>2]|0;$=a+84|0;ja=c[$>>2]|0;_=a+88|0;ia=c[_>>2]|0;Z=a+92|0;ha=c[Z>>2]|0;Y=a+96|0;ga=c[Y>>2]|0;X=a+100|0;fa=c[X>>2]|0;W=a+104|0;ea=c[W>>2]|0;V=a+108|0;da=c[V>>2]|0;U=a+112|0;ca=c[U>>2]|0;T=a+116|0;ba=c[T>>2]|0;w=c[a>>2]|0;P=a+4|0;u=c[P>>2]|0;N=a+8|0;s=c[N>>2]|0;L=a+12|0;q=c[L>>2]|0;J=a+16|0;o=c[J>>2]|0;H=a+20|0;m=c[H>>2]|0;F=a+24|0;k=c[F>>2]|0;D=a+28|0;h=c[D>>2]|0;A=a+32|0;b=c[A>>2]|0;y=a+36|0;x=c[y>>2]|0;R=w+ka|0;Q=u+ja|0;O=s+ia|0;M=q+ha|0;K=o+ga|0;I=m+fa|0;G=k+ea|0;E=h+da|0;B=b+ca|0;z=x+ba|0;c[ua>>2]=R;c[ta>>2]=Q;c[sa>>2]=O;c[ra>>2]=M;c[qa>>2]=K;c[pa>>2]=I;c[oa>>2]=G;c[na>>2]=E;c[ma>>2]=B;c[la>>2]=z;w=ka-w|0;u=ja-u|0;s=ia-s|0;q=ha-q|0;o=ga-o|0;m=fa-m|0;k=ea-k|0;h=da-h|0;b=ca-b|0;x=ba-x|0;c[aa>>2]=w;c[$>>2]=u;c[_>>2]=s;c[Z>>2]=q;c[Y>>2]=o;c[X>>2]=m;c[W>>2]=k;c[V>>2]=h;c[U>>2]=b;c[T>>2]=x;Q=(c[S+4>>2]|0)-Q|0;O=(c[S+8>>2]|0)-O|0;M=(c[S+12>>2]|0)-M|0;K=(c[S+16>>2]|0)-K|0;I=(c[S+20>>2]|0)-I|0;G=(c[S+24>>2]|0)-G|0;E=(c[S+28>>2]|0)-E|0;B=(c[S+32>>2]|0)-B|0;z=(c[S+36>>2]|0)-z|0;c[a>>2]=(c[S>>2]|0)-R;c[P>>2]=Q;c[N>>2]=O;c[L>>2]=M;c[J>>2]=K;c[H>>2]=I;c[F>>2]=G;c[D>>2]=E;c[A>>2]=B;c[y>>2]=z;u=(c[t>>2]|0)-u|0;s=(c[r>>2]|0)-s|0;q=(c[p>>2]|0)-q|0;o=(c[n>>2]|0)-o|0;m=(c[l>>2]|0)-m|0;k=(c[j>>2]|0)-k|0;h=(c[g>>2]|0)-h|0;b=(c[f>>2]|0)-b|0;a=(c[e>>2]|0)-x|0;c[v>>2]=(c[v>>2]|0)-w;c[t>>2]=u;c[r>>2]=s;c[p>>2]=q;c[n>>2]=o;c[l>>2]=m;c[j>>2]=k;c[g>>2]=h;c[f>>2]=b;c[e>>2]=a;i=d;return}function Qc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;m=b+40|0;v=b+44|0;u=b+48|0;t=b+52|0;s=b+56|0;r=b+60|0;q=b+64|0;p=b+68|0;o=b+72|0;n=b+76|0;d=b+4|0;e=b+8|0;f=b+12|0;g=b+16|0;h=b+20|0;i=b+24|0;j=b+28|0;k=b+32|0;l=b+36|0;E=(c[d>>2]|0)+(c[v>>2]|0)|0;D=(c[e>>2]|0)+(c[u>>2]|0)|0;C=(c[f>>2]|0)+(c[t>>2]|0)|0;B=(c[g>>2]|0)+(c[s>>2]|0)|0;A=(c[h>>2]|0)+(c[r>>2]|0)|0;z=(c[i>>2]|0)+(c[q>>2]|0)|0;y=(c[j>>2]|0)+(c[p>>2]|0)|0;x=(c[k>>2]|0)+(c[o>>2]|0)|0;w=(c[l>>2]|0)+(c[n>>2]|0)|0;c[a>>2]=(c[b>>2]|0)+(c[m>>2]|0);c[a+4>>2]=E;c[a+8>>2]=D;c[a+12>>2]=C;c[a+16>>2]=B;c[a+20>>2]=A;c[a+24>>2]=z;c[a+28>>2]=y;c[a+32>>2]=x;c[a+36>>2]=w;d=(c[v>>2]|0)-(c[d>>2]|0)|0;e=(c[u>>2]|0)-(c[e>>2]|0)|0;f=(c[t>>2]|0)-(c[f>>2]|0)|0;g=(c[s>>2]|0)-(c[g>>2]|0)|0;h=(c[r>>2]|0)-(c[h>>2]|0)|0;i=(c[q>>2]|0)-(c[i>>2]|0)|0;j=(c[p>>2]|0)-(c[j>>2]|0)|0;k=(c[o>>2]|0)-(c[k>>2]|0)|0;l=(c[n>>2]|0)-(c[l>>2]|0)|0;c[a+40>>2]=(c[m>>2]|0)-(c[b>>2]|0);c[a+44>>2]=d;c[a+48>>2]=e;c[a+52>>2]=f;c[a+56>>2]=g;c[a+60>>2]=h;c[a+64>>2]=i;c[a+68>>2]=j;c[a+72>>2]=k;c[a+76>>2]=l;l=c[b+84>>2]|0;k=c[b+88>>2]|0;j=c[b+92>>2]|0;i=c[b+96>>2]|0;h=c[b+100>>2]|0;g=c[b+104>>2]|0;f=c[b+108>>2]|0;e=c[b+112>>2]|0;d=c[b+116>>2]|0;c[a+80>>2]=c[b+80>>2];c[a+84>>2]=l;c[a+88>>2]=k;c[a+92>>2]=j;c[a+96>>2]=i;c[a+100>>2]=h;c[a+104>>2]=g;c[a+108>>2]=f;c[a+112>>2]=e;c[a+116>>2]=d;Jc(a+120|0,b+120|0,1144);return}function Rc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;u=i;t=i=i+63&-64;i=i+592|0;p=t+400|0;r=t+520|0;s=t+240|0;q=t+120|0;f=0;do{n=a[e+f>>0]|0;o=f<<1;a[r+o>>0]=n&15;a[r+(o|1)>>0]=(n&255)>>>4;f=f+1|0}while((f|0)!=32);e=0;f=0;do{o=r+f|0;n=(d[o>>0]|0)+e|0;e=(n<<24)+134217728>>28;a[o>>0]=n-(e<<4);f=f+1|0}while((f|0)!=63);f=r+63|0;a[f>>0]=(d[f>>0]|0)+e;e=b;f=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));j=b+40|0;c[j>>2]=1;g=b+44|0;e=g;f=e+36|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));k=b+80|0;c[k>>2]=1;h=b+84|0;l=b+120|0;m=s+120|0;n=s+40|0;o=s+80|0;e=h;f=e+76|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(f|0));e=1;do{Sc(t,(e|0)/2|0,a[r+e>>0]|0);Oc(s,b,t);Jc(b,s,m);Jc(j,n,o);Jc(k,o,m);Jc(l,s,n);e=e+2|0}while((e|0)<64);B=c[b+4>>2]|0;z=c[b+8>>2]|0;y=c[b+12>>2]|0;x=c[b+16>>2]|0;w=c[b+20>>2]|0;v=c[b+24>>2]|0;f=c[b+28>>2]|0;e=c[b+32>>2]|0;A=c[b+36>>2]|0;c[p>>2]=c[b>>2];c[p+4>>2]=B;c[p+8>>2]=z;c[p+12>>2]=y;c[p+16>>2]=x;c[p+20>>2]=w;c[p+24>>2]=v;c[p+28>>2]=f;c[p+32>>2]=e;c[p+36>>2]=A;A=c[g>>2]|0;e=c[b+48>>2]|0;g=c[b+52>>2]|0;f=c[b+56>>2]|0;v=c[b+60>>2]|0;w=c[b+64>>2]|0;x=c[b+68>>2]|0;y=c[b+72>>2]|0;z=c[b+76>>2]|0;c[p+40>>2]=c[j>>2];c[p+44>>2]=A;c[p+48>>2]=e;c[p+52>>2]=g;c[p+56>>2]=f;c[p+60>>2]=v;c[p+64>>2]=w;c[p+68>>2]=x;c[p+72>>2]=y;c[p+76>>2]=z;z=c[h>>2]|0;y=c[b+88>>2]|0;x=c[b+92>>2]|0;w=c[b+96>>2]|0;v=c[b+100>>2]|0;f=c[b+104>>2]|0;g=c[b+108>>2]|0;h=c[b+112>>2]|0;e=c[b+116>>2]|0;c[p+80>>2]=c[k>>2];c[p+84>>2]=z;c[p+88>>2]=y;c[p+92>>2]=x;c[p+96>>2]=w;c[p+100>>2]=v;c[p+104>>2]=f;c[p+108>>2]=g;c[p+112>>2]=h;c[p+116>>2]=e;Pc(s,p);Jc(q,s,m);p=q+40|0;Jc(p,n,o);e=q+80|0;Jc(e,o,m);Pc(s,q);Jc(q,s,m);Jc(p,n,o);Jc(e,o,m);Pc(s,q);Jc(q,s,m);Jc(p,n,o);Jc(e,o,m);Pc(s,q);Jc(b,s,m);Jc(j,n,o);Jc(k,o,m);Jc(l,s,n);e=0;do{Sc(t,(e|0)/2|0,a[r+e>>0]|0);Oc(s,b,t);Jc(b,s,m);Jc(j,n,o);Jc(k,o,m);Jc(l,s,n);e=e+2|0}while((e|0)<64);i=u;return}function Sc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;s=d<<24>>24;s=Gd(s|0,((s|0)<0)<<31>>31|0,63)|0;h=d<<24>>24;s=0-s|0;d=a+4|0;c[d>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;e=a+40|0;c[e>>2]=1;f=a+44|0;g=a+80|0;h=h-((h&s)<<1)&255;i=(h^1)+-1|0;j=1184+(b*960|0)|0;k=a+8|0;l=a+12|0;m=a+16|0;n=a+20|0;o=a+24|0;p=a+28|0;q=a+32|0;r=a+36|0;t=f;u=t+76|0;do{c[t>>2]=0;t=t+4|0}while((t|0)<(u|0));H=i>>31;A=c[1184+(b*960|0)+4>>2]&H;I=c[1184+(b*960|0)+8>>2]&H;K=c[1184+(b*960|0)+12>>2]&H;M=c[1184+(b*960|0)+16>>2]&H;O=c[1184+(b*960|0)+20>>2]&H;Q=c[1184+(b*960|0)+24>>2]&H;S=c[1184+(b*960|0)+28>>2]&H;U=c[1184+(b*960|0)+32>>2]&H;W=c[1184+(b*960|0)+36>>2]&H;c[a>>2]=(c[j>>2]^1)&H^1;c[d>>2]=A;c[k>>2]=I;c[l>>2]=K;c[m>>2]=M;c[n>>2]=O;c[o>>2]=Q;c[p>>2]=S;c[q>>2]=U;c[r>>2]=W;W=a+48|0;U=a+52|0;S=a+56|0;Q=a+60|0;O=a+64|0;M=a+68|0;K=a+72|0;I=a+76|0;A=c[1184+(b*960|0)+44>>2]&H;z=c[1184+(b*960|0)+48>>2]&H;w=c[1184+(b*960|0)+52>>2]&H;B=c[1184+(b*960|0)+56>>2]&H;ia=c[1184+(b*960|0)+60>>2]&H;D=c[1184+(b*960|0)+64>>2]&H;ea=c[1184+(b*960|0)+68>>2]&H;F=c[1184+(b*960|0)+72>>2]&H;ga=c[1184+(b*960|0)+76>>2]&H;c[e>>2]=(c[1184+(b*960|0)+40>>2]^1)&H^1;c[f>>2]=A;c[W>>2]=z;c[U>>2]=w;c[S>>2]=B;c[Q>>2]=ia;c[O>>2]=D;c[M>>2]=ea;c[K>>2]=F;c[I>>2]=ga;ga=c[g>>2]|0;F=a+84|0;ea=c[F>>2]|0;D=a+88|0;ia=c[D>>2]|0;B=a+92|0;w=c[B>>2]|0;z=a+96|0;A=c[z>>2]|0;x=a+100|0;fa=c[x>>2]|0;v=a+104|0;ba=c[v>>2]|0;i=a+108|0;G=c[i>>2]|0;t=a+112|0;_=c[t>>2]|0;u=a+116|0;da=c[u>>2]|0;$=(c[1184+(b*960|0)+84>>2]^ea)&H;aa=(c[1184+(b*960|0)+88>>2]^ia)&H;y=(c[1184+(b*960|0)+92>>2]^w)&H;j=(c[1184+(b*960|0)+96>>2]^A)&H;ha=(c[1184+(b*960|0)+100>>2]^fa)&H;Z=(c[1184+(b*960|0)+104>>2]^ba)&H;ca=(c[1184+(b*960|0)+108>>2]^G)&H;C=(c[1184+(b*960|0)+112>>2]^_)&H;E=(c[1184+(b*960|0)+116>>2]^da)&H;c[g>>2]=(c[1184+(b*960|0)+80>>2]^ga)&H^ga;c[F>>2]=$^ea;c[D>>2]=aa^ia;c[B>>2]=y^w;c[z>>2]=j^A;c[x>>2]=ha^fa;c[v>>2]=Z^ba;c[i>>2]=ca^G;c[t>>2]=C^_;c[u>>2]=E^da;da=c[a>>2]|0;E=c[d>>2]|0;_=c[k>>2]|0;C=c[l>>2]|0;G=c[m>>2]|0;ca=c[n>>2]|0;ba=c[o>>2]|0;Z=c[p>>2]|0;fa=c[q>>2]|0;ha=c[r>>2]|0;A=(h^2)+-1>>31;j=(c[1184+(b*960|0)+124>>2]^E)&A;w=(c[1184+(b*960|0)+128>>2]^_)&A;y=(c[1184+(b*960|0)+132>>2]^C)&A;ia=(c[1184+(b*960|0)+136>>2]^G)&A;aa=(c[1184+(b*960|0)+140>>2]^ca)&A;ea=(c[1184+(b*960|0)+144>>2]^ba)&A;$=(c[1184+(b*960|0)+148>>2]^Z)&A;ga=(c[1184+(b*960|0)+152>>2]^fa)&A;H=(c[1184+(b*960|0)+156>>2]^ha)&A;c[a>>2]=(c[1184+(b*960|0)+120>>2]^da)&A^da;c[d>>2]=j^E;c[k>>2]=w^_;c[l>>2]=y^C;c[m>>2]=ia^G;c[n>>2]=aa^ca;c[o>>2]=ea^ba;c[p>>2]=$^Z;c[q>>2]=ga^fa;c[r>>2]=H^ha;ha=c[e>>2]|0;H=c[f>>2]|0;fa=c[W>>2]|0;ga=c[U>>2]|0;Z=c[S>>2]|0;$=c[Q>>2]|0;ba=c[O>>2]|0;ea=c[M>>2]|0;ca=c[K>>2]|0;aa=c[I>>2]|0;G=(c[1184+(b*960|0)+164>>2]^H)&A;ia=(c[1184+(b*960|0)+168>>2]^fa)&A;C=(c[1184+(b*960|0)+172>>2]^ga)&A;y=(c[1184+(b*960|0)+176>>2]^Z)&A;_=(c[1184+(b*960|0)+180>>2]^$)&A;w=(c[1184+(b*960|0)+184>>2]^ba)&A;E=(c[1184+(b*960|0)+188>>2]^ea)&A;j=(c[1184+(b*960|0)+192>>2]^ca)&A;da=(c[1184+(b*960|0)+196>>2]^aa)&A;c[e>>2]=(c[1184+(b*960|0)+160>>2]^ha)&A^ha;c[f>>2]=G^H;c[W>>2]=ia^fa;c[U>>2]=C^ga;c[S>>2]=y^Z;c[Q>>2]=_^$;c[O>>2]=w^ba;c[M>>2]=E^ea;c[K>>2]=j^ca;c[I>>2]=da^aa;aa=c[g>>2]|0;da=c[F>>2]|0;ca=c[D>>2]|0;j=c[B>>2]|0;ea=c[z>>2]|0;E=c[x>>2]|0;ba=c[v>>2]|0;w=c[i>>2]|0;$=c[t>>2]|0;_=c[u>>2]|0;Z=(c[1184+(b*960|0)+204>>2]^da)&A;y=(c[1184+(b*960|0)+208>>2]^ca)&A;ga=(c[1184+(b*960|0)+212>>2]^j)&A;C=(c[1184+(b*960|0)+216>>2]^ea)&A;fa=(c[1184+(b*960|0)+220>>2]^E)&A;ia=(c[1184+(b*960|0)+224>>2]^ba)&A;H=(c[1184+(b*960|0)+228>>2]^w)&A;G=(c[1184+(b*960|0)+232>>2]^$)&A;ha=(c[1184+(b*960|0)+236>>2]^_)&A;c[g>>2]=(c[1184+(b*960|0)+200>>2]^aa)&A^aa;c[F>>2]=Z^da;c[D>>2]=y^ca;c[B>>2]=ga^j;c[z>>2]=C^ea;c[x>>2]=fa^E;c[v>>2]=ia^ba;c[i>>2]=H^w;c[t>>2]=G^$;c[u>>2]=ha^_;_=c[a>>2]|0;ha=c[d>>2]|0;$=c[k>>2]|0;G=c[l>>2]|0;w=c[m>>2]|0;H=c[n>>2]|0;ba=c[o>>2]|0;ia=c[p>>2]|0;E=c[q>>2]|0;fa=c[r>>2]|0;ea=(h^3)+-1>>31;C=(c[1184+(b*960|0)+244>>2]^ha)&ea;j=(c[1184+(b*960|0)+248>>2]^$)&ea;ga=(c[1184+(b*960|0)+252>>2]^G)&ea;ca=(c[1184+(b*960|0)+256>>2]^w)&ea;y=(c[1184+(b*960|0)+260>>2]^H)&ea;da=(c[1184+(b*960|0)+264>>2]^ba)&ea;Z=(c[1184+(b*960|0)+268>>2]^ia)&ea;aa=(c[1184+(b*960|0)+272>>2]^E)&ea;A=(c[1184+(b*960|0)+276>>2]^fa)&ea;c[a>>2]=(c[1184+(b*960|0)+240>>2]^_)&ea^_;c[d>>2]=C^ha;c[k>>2]=j^$;c[l>>2]=ga^G;c[m>>2]=ca^w;c[n>>2]=y^H;c[o>>2]=da^ba;c[p>>2]=Z^ia;c[q>>2]=aa^E;c[r>>2]=A^fa;fa=c[e>>2]|0;A=c[f>>2]|0;E=c[W>>2]|0;aa=c[U>>2]|0;ia=c[S>>2]|0;Z=c[Q>>2]|0;ba=c[O>>2]|0;da=c[M>>2]|0;H=c[K>>2]|0;y=c[I>>2]|0;w=(c[1184+(b*960|0)+284>>2]^A)&ea;ca=(c[1184+(b*960|0)+288>>2]^E)&ea;G=(c[1184+(b*960|0)+292>>2]^aa)&ea;ga=(c[1184+(b*960|0)+296>>2]^ia)&ea;$=(c[1184+(b*960|0)+300>>2]^Z)&ea;j=(c[1184+(b*960|0)+304>>2]^ba)&ea;ha=(c[1184+(b*960|0)+308>>2]^da)&ea;C=(c[1184+(b*960|0)+312>>2]^H)&ea;_=(c[1184+(b*960|0)+316>>2]^y)&ea;c[e>>2]=(c[1184+(b*960|0)+280>>2]^fa)&ea^fa;c[f>>2]=w^A;c[W>>2]=ca^E;c[U>>2]=G^aa;c[S>>2]=ga^ia;c[Q>>2]=$^Z;c[O>>2]=j^ba;c[M>>2]=ha^da;c[K>>2]=C^H;c[I>>2]=_^y;y=c[g>>2]|0;_=c[F>>2]|0;H=c[D>>2]|0;C=c[B>>2]|0;da=c[z>>2]|0;ha=c[x>>2]|0;ba=c[v>>2]|0;j=c[i>>2]|0;Z=c[t>>2]|0;$=c[u>>2]|0;ia=(c[1184+(b*960|0)+324>>2]^_)&ea;ga=(c[1184+(b*960|0)+328>>2]^H)&ea;aa=(c[1184+(b*960|0)+332>>2]^C)&ea;G=(c[1184+(b*960|0)+336>>2]^da)&ea;E=(c[1184+(b*960|0)+340>>2]^ha)&ea;ca=(c[1184+(b*960|0)+344>>2]^ba)&ea;A=(c[1184+(b*960|0)+348>>2]^j)&ea;w=(c[1184+(b*960|0)+352>>2]^Z)&ea;fa=(c[1184+(b*960|0)+356>>2]^$)&ea;c[g>>2]=(c[1184+(b*960|0)+320>>2]^y)&ea^y;c[F>>2]=ia^_;c[D>>2]=ga^H;c[B>>2]=aa^C;c[z>>2]=G^da;c[x>>2]=E^ha;c[v>>2]=ca^ba;c[i>>2]=A^j;c[t>>2]=w^Z;c[u>>2]=fa^$;$=c[a>>2]|0;fa=c[d>>2]|0;Z=c[k>>2]|0;w=c[l>>2]|0;j=c[m>>2]|0;A=c[n>>2]|0;ba=c[o>>2]|0;ca=c[p>>2]|0;ha=c[q>>2]|0;E=c[r>>2]|0;da=(h^4)+-1>>31;G=(c[1184+(b*960|0)+364>>2]^fa)&da;C=(c[1184+(b*960|0)+368>>2]^Z)&da;aa=(c[1184+(b*960|0)+372>>2]^w)&da;H=(c[1184+(b*960|0)+376>>2]^j)&da;ga=(c[1184+(b*960|0)+380>>2]^A)&da;_=(c[1184+(b*960|0)+384>>2]^ba)&da;ia=(c[1184+(b*960|0)+388>>2]^ca)&da;y=(c[1184+(b*960|0)+392>>2]^ha)&da;ea=(c[1184+(b*960|0)+396>>2]^E)&da;c[a>>2]=(c[1184+(b*960|0)+360>>2]^$)&da^$;c[d>>2]=G^fa;c[k>>2]=C^Z;c[l>>2]=aa^w;c[m>>2]=H^j;c[n>>2]=ga^A;c[o>>2]=_^ba;c[p>>2]=ia^ca;c[q>>2]=y^ha;c[r>>2]=ea^E;E=c[e>>2]|0;ea=c[f>>2]|0;ha=c[W>>2]|0;y=c[U>>2]|0;ca=c[S>>2]|0;ia=c[Q>>2]|0;ba=c[O>>2]|0;_=c[M>>2]|0;A=c[K>>2]|0;ga=c[I>>2]|0;j=(c[1184+(b*960|0)+404>>2]^ea)&da;H=(c[1184+(b*960|0)+408>>2]^ha)&da;w=(c[1184+(b*960|0)+412>>2]^y)&da;aa=(c[1184+(b*960|0)+416>>2]^ca)&da;Z=(c[1184+(b*960|0)+420>>2]^ia)&da;C=(c[1184+(b*960|0)+424>>2]^ba)&da;fa=(c[1184+(b*960|0)+428>>2]^_)&da;G=(c[1184+(b*960|0)+432>>2]^A)&da;$=(c[1184+(b*960|0)+436>>2]^ga)&da;c[e>>2]=(c[1184+(b*960|0)+400>>2]^E)&da^E;c[f>>2]=j^ea;c[W>>2]=H^ha;c[U>>2]=w^y;c[S>>2]=aa^ca;c[Q>>2]=Z^ia;c[O>>2]=C^ba;c[M>>2]=fa^_;c[K>>2]=G^A;c[I>>2]=$^ga;ga=c[g>>2]|0;$=c[F>>2]|0;A=c[D>>2]|0;G=c[B>>2]|0;_=c[z>>2]|0;fa=c[x>>2]|0;ba=c[v>>2]|0;C=c[i>>2]|0;ia=c[t>>2]|0;Z=c[u>>2]|0;ca=(c[1184+(b*960|0)+444>>2]^$)&da;aa=(c[1184+(b*960|0)+448>>2]^A)&da;y=(c[1184+(b*960|0)+452>>2]^G)&da;w=(c[1184+(b*960|0)+456>>2]^_)&da;ha=(c[1184+(b*960|0)+460>>2]^fa)&da;H=(c[1184+(b*960|0)+464>>2]^ba)&da;ea=(c[1184+(b*960|0)+468>>2]^C)&da;j=(c[1184+(b*960|0)+472>>2]^ia)&da;E=(c[1184+(b*960|0)+476>>2]^Z)&da;c[g>>2]=(c[1184+(b*960|0)+440>>2]^ga)&da^ga;c[F>>2]=ca^$;c[D>>2]=aa^A;c[B>>2]=y^G;c[z>>2]=w^_;c[x>>2]=ha^fa;c[v>>2]=H^ba;c[i>>2]=ea^C;c[t>>2]=j^ia;c[u>>2]=E^Z;Z=c[a>>2]|0;E=c[d>>2]|0;ia=c[k>>2]|0;j=c[l>>2]|0;C=c[m>>2]|0;ea=c[n>>2]|0;ba=c[o>>2]|0;H=c[p>>2]|0;fa=c[q>>2]|0;ha=c[r>>2]|0;_=(h^5)+-1>>31;w=(c[1184+(b*960|0)+484>>2]^E)&_;G=(c[1184+(b*960|0)+488>>2]^ia)&_;y=(c[1184+(b*960|0)+492>>2]^j)&_;A=(c[1184+(b*960|0)+496>>2]^C)&_;aa=(c[1184+(b*960|0)+500>>2]^ea)&_;$=(c[1184+(b*960|0)+504>>2]^ba)&_;ca=(c[1184+(b*960|0)+508>>2]^H)&_;ga=(c[1184+(b*960|0)+512>>2]^fa)&_;da=(c[1184+(b*960|0)+516>>2]^ha)&_;c[a>>2]=(c[1184+(b*960|0)+480>>2]^Z)&_^Z;c[d>>2]=w^E;c[k>>2]=G^ia;c[l>>2]=y^j;c[m>>2]=A^C;c[n>>2]=aa^ea;c[o>>2]=$^ba;c[p>>2]=ca^H;c[q>>2]=ga^fa;c[r>>2]=da^ha;ha=c[e>>2]|0;da=c[f>>2]|0;fa=c[W>>2]|0;ga=c[U>>2]|0;H=c[S>>2]|0;ca=c[Q>>2]|0;ba=c[O>>2]|0;$=c[M>>2]|0;ea=c[K>>2]|0;aa=c[I>>2]|0;C=(c[1184+(b*960|0)+524>>2]^da)&_;A=(c[1184+(b*960|0)+528>>2]^fa)&_;j=(c[1184+(b*960|0)+532>>2]^ga)&_;y=(c[1184+(b*960|0)+536>>2]^H)&_;ia=(c[1184+(b*960|0)+540>>2]^ca)&_;G=(c[1184+(b*960|0)+544>>2]^ba)&_;E=(c[1184+(b*960|0)+548>>2]^$)&_;w=(c[1184+(b*960|0)+552>>2]^ea)&_;Z=(c[1184+(b*960|0)+556>>2]^aa)&_;c[e>>2]=(c[1184+(b*960|0)+520>>2]^ha)&_^ha;c[f>>2]=C^da;c[W>>2]=A^fa;c[U>>2]=j^ga;c[S>>2]=y^H;c[Q>>2]=ia^ca;c[O>>2]=G^ba;c[M>>2]=E^$;c[K>>2]=w^ea;c[I>>2]=Z^aa;aa=c[g>>2]|0;Z=c[F>>2]|0;ea=c[D>>2]|0;w=c[B>>2]|0;$=c[z>>2]|0;E=c[x>>2]|0;ba=c[v>>2]|0;G=c[i>>2]|0;ca=c[t>>2]|0;ia=c[u>>2]|0;H=(c[1184+(b*960|0)+564>>2]^Z)&_;y=(c[1184+(b*960|0)+568>>2]^ea)&_;ga=(c[1184+(b*960|0)+572>>2]^w)&_;j=(c[1184+(b*960|0)+576>>2]^$)&_;fa=(c[1184+(b*960|0)+580>>2]^E)&_;A=(c[1184+(b*960|0)+584>>2]^ba)&_;da=(c[1184+(b*960|0)+588>>2]^G)&_;C=(c[1184+(b*960|0)+592>>2]^ca)&_;ha=(c[1184+(b*960|0)+596>>2]^ia)&_;c[g>>2]=(c[1184+(b*960|0)+560>>2]^aa)&_^aa;c[F>>2]=H^Z;c[D>>2]=y^ea;c[B>>2]=ga^w;c[z>>2]=j^$;c[x>>2]=fa^E;c[v>>2]=A^ba;c[i>>2]=da^G;c[t>>2]=C^ca;c[u>>2]=ha^ia;ia=c[a>>2]|0;ha=c[d>>2]|0;ca=c[k>>2]|0;C=c[l>>2]|0;G=c[m>>2]|0;da=c[n>>2]|0;ba=c[o>>2]|0;A=c[p>>2]|0;E=c[q>>2]|0;fa=c[r>>2]|0;$=(h^6)+-1>>31;j=(c[1184+(b*960|0)+604>>2]^ha)&$;w=(c[1184+(b*960|0)+608>>2]^ca)&$;ga=(c[1184+(b*960|0)+612>>2]^C)&$;ea=(c[1184+(b*960|0)+616>>2]^G)&$;y=(c[1184+(b*960|0)+620>>2]^da)&$;Z=(c[1184+(b*960|0)+624>>2]^ba)&$;H=(c[1184+(b*960|0)+628>>2]^A)&$;aa=(c[1184+(b*960|0)+632>>2]^E)&$;_=(c[1184+(b*960|0)+636>>2]^fa)&$;c[a>>2]=(c[1184+(b*960|0)+600>>2]^ia)&$^ia;c[d>>2]=j^ha;c[k>>2]=w^ca;c[l>>2]=ga^C;c[m>>2]=ea^G;c[n>>2]=y^da;c[o>>2]=Z^ba;c[p>>2]=H^A;c[q>>2]=aa^E;c[r>>2]=_^fa;fa=c[e>>2]|0;_=c[f>>2]|0;E=c[W>>2]|0;aa=c[U>>2]|0;A=c[S>>2]|0;H=c[Q>>2]|0;ba=c[O>>2]|0;Z=c[M>>2]|0;da=c[K>>2]|0;y=c[I>>2]|0;G=(c[1184+(b*960|0)+644>>2]^_)&$;ea=(c[1184+(b*960|0)+648>>2]^E)&$;C=(c[1184+(b*960|0)+652>>2]^aa)&$;ga=(c[1184+(b*960|0)+656>>2]^A)&$;ca=(c[1184+(b*960|0)+660>>2]^H)&$;w=(c[1184+(b*960|0)+664>>2]^ba)&$;ha=(c[1184+(b*960|0)+668>>2]^Z)&$;j=(c[1184+(b*960|0)+672>>2]^da)&$;ia=(c[1184+(b*960|0)+676>>2]^y)&$;c[e>>2]=(c[1184+(b*960|0)+640>>2]^fa)&$^fa;c[f>>2]=G^_;c[W>>2]=ea^E;c[U>>2]=C^aa;c[S>>2]=ga^A;c[Q>>2]=ca^H;c[O>>2]=w^ba;c[M>>2]=ha^Z;c[K>>2]=j^da;c[I>>2]=ia^y;y=c[g>>2]|0;ia=c[F>>2]|0;da=c[D>>2]|0;j=c[B>>2]|0;Z=c[z>>2]|0;ha=c[x>>2]|0;ba=c[v>>2]|0;w=c[i>>2]|0;H=c[t>>2]|0;ca=c[u>>2]|0;A=(c[1184+(b*960|0)+684>>2]^ia)&$;ga=(c[1184+(b*960|0)+688>>2]^da)&$;aa=(c[1184+(b*960|0)+692>>2]^j)&$;C=(c[1184+(b*960|0)+696>>2]^Z)&$;E=(c[1184+(b*960|0)+700>>2]^ha)&$;ea=(c[1184+(b*960|0)+704>>2]^ba)&$;_=(c[1184+(b*960|0)+708>>2]^w)&$;G=(c[1184+(b*960|0)+712>>2]^H)&$;fa=(c[1184+(b*960|0)+716>>2]^ca)&$;c[g>>2]=(c[1184+(b*960|0)+680>>2]^y)&$^y;c[F>>2]=A^ia;c[D>>2]=ga^da;c[B>>2]=aa^j;c[z>>2]=C^Z;c[x>>2]=E^ha;c[v>>2]=ea^ba;c[i>>2]=_^w;c[t>>2]=G^H;c[u>>2]=fa^ca;ca=c[a>>2]|0;fa=c[d>>2]|0;H=c[k>>2]|0;G=c[l>>2]|0;w=c[m>>2]|0;_=c[n>>2]|0;ba=c[o>>2]|0;ea=c[p>>2]|0;ha=c[q>>2]|0;E=c[r>>2]|0;Z=(h^7)+-1>>31;C=(c[1184+(b*960|0)+724>>2]^fa)&Z;j=(c[1184+(b*960|0)+728>>2]^H)&Z;aa=(c[1184+(b*960|0)+732>>2]^G)&Z;da=(c[1184+(b*960|0)+736>>2]^w)&Z;ga=(c[1184+(b*960|0)+740>>2]^_)&Z;ia=(c[1184+(b*960|0)+744>>2]^ba)&Z;A=(c[1184+(b*960|0)+748>>2]^ea)&Z;y=(c[1184+(b*960|0)+752>>2]^ha)&Z;$=(c[1184+(b*960|0)+756>>2]^E)&Z;c[a>>2]=(c[1184+(b*960|0)+720>>2]^ca)&Z^ca;c[d>>2]=C^fa;c[k>>2]=j^H;c[l>>2]=aa^G;c[m>>2]=da^w;c[n>>2]=ga^_;c[o>>2]=ia^ba;c[p>>2]=A^ea;c[q>>2]=y^ha;c[r>>2]=$^E;E=c[e>>2]|0;$=c[f>>2]|0;ha=c[W>>2]|0;y=c[U>>2]|0;ea=c[S>>2]|0;A=c[Q>>2]|0;ba=c[O>>2]|0;ia=c[M>>2]|0;_=c[K>>2]|0;ga=c[I>>2]|0;w=(c[1184+(b*960|0)+764>>2]^$)&Z;da=(c[1184+(b*960|0)+768>>2]^ha)&Z;G=(c[1184+(b*960|0)+772>>2]^y)&Z;aa=(c[1184+(b*960|0)+776>>2]^ea)&Z;H=(c[1184+(b*960|0)+780>>2]^A)&Z;j=(c[1184+(b*960|0)+784>>2]^ba)&Z;fa=(c[1184+(b*960|0)+788>>2]^ia)&Z;C=(c[1184+(b*960|0)+792>>2]^_)&Z;ca=(c[1184+(b*960|0)+796>>2]^ga)&Z;c[e>>2]=(c[1184+(b*960|0)+760>>2]^E)&Z^E;c[f>>2]=w^$;c[W>>2]=da^ha;c[U>>2]=G^y;c[S>>2]=aa^ea;c[Q>>2]=H^A;c[O>>2]=j^ba;c[M>>2]=fa^ia;c[K>>2]=C^_;c[I>>2]=ca^ga;ga=c[g>>2]|0;ca=c[F>>2]|0;_=c[D>>2]|0;C=c[B>>2]|0;ia=c[z>>2]|0;fa=c[x>>2]|0;ba=c[v>>2]|0;j=c[i>>2]|0;A=c[t>>2]|0;H=c[u>>2]|0;ea=(c[1184+(b*960|0)+804>>2]^ca)&Z;aa=(c[1184+(b*960|0)+808>>2]^_)&Z;y=(c[1184+(b*960|0)+812>>2]^C)&Z;G=(c[1184+(b*960|0)+816>>2]^ia)&Z;ha=(c[1184+(b*960|0)+820>>2]^fa)&Z;da=(c[1184+(b*960|0)+824>>2]^ba)&Z;$=(c[1184+(b*960|0)+828>>2]^j)&Z;w=(c[1184+(b*960|0)+832>>2]^A)&Z;E=(c[1184+(b*960|0)+836>>2]^H)&Z;c[g>>2]=(c[1184+(b*960|0)+800>>2]^ga)&Z^ga;c[F>>2]=ea^ca;c[D>>2]=aa^_;c[B>>2]=y^C;c[z>>2]=G^ia;c[x>>2]=ha^fa;c[v>>2]=da^ba;c[i>>2]=$^j;c[t>>2]=w^A;c[u>>2]=E^H;H=c[a>>2]|0;E=c[d>>2]|0;A=c[k>>2]|0;w=c[l>>2]|0;j=c[m>>2]|0;$=c[n>>2]|0;ba=c[o>>2]|0;da=c[p>>2]|0;fa=c[q>>2]|0;ha=c[r>>2]|0;ia=(h^8)+-1>>31;G=(c[1184+(b*960|0)+844>>2]^E)&ia;C=(c[1184+(b*960|0)+848>>2]^A)&ia;y=(c[1184+(b*960|0)+852>>2]^w)&ia;h=(c[1184+(b*960|0)+856>>2]^j)&ia;_=(c[1184+(b*960|0)+860>>2]^$)&ia;aa=(c[1184+(b*960|0)+864>>2]^ba)&ia;ca=(c[1184+(b*960|0)+868>>2]^da)&ia;ea=(c[1184+(b*960|0)+872>>2]^fa)&ia;ga=(c[1184+(b*960|0)+876>>2]^ha)&ia;c[a>>2]=(c[1184+(b*960|0)+840>>2]^H)&ia^H;c[d>>2]=G^E;c[k>>2]=C^A;c[l>>2]=y^w;c[m>>2]=h^j;c[n>>2]=_^$;c[o>>2]=aa^ba;c[p>>2]=ca^da;c[q>>2]=ea^fa;c[r>>2]=ga^ha;ha=c[e>>2]|0;ga=c[f>>2]|0;fa=c[W>>2]|0;ea=c[U>>2]|0;da=c[S>>2]|0;ca=c[Q>>2]|0;ba=c[O>>2]|0;aa=c[M>>2]|0;$=c[K>>2]|0;_=c[I>>2]|0;j=(c[1184+(b*960|0)+884>>2]^ga)&ia;h=(c[1184+(b*960|0)+888>>2]^fa)&ia;w=(c[1184+(b*960|0)+892>>2]^ea)&ia;y=(c[1184+(b*960|0)+896>>2]^da)&ia;A=(c[1184+(b*960|0)+900>>2]^ca)&ia;C=(c[1184+(b*960|0)+904>>2]^ba)&ia;E=(c[1184+(b*960|0)+908>>2]^aa)&ia;G=(c[1184+(b*960|0)+912>>2]^$)&ia;H=(c[1184+(b*960|0)+916>>2]^_)&ia;ha=(c[1184+(b*960|0)+880>>2]^ha)&ia^ha;c[e>>2]=ha;ga=j^ga;c[f>>2]=ga;fa=h^fa;c[W>>2]=fa;ea=w^ea;c[U>>2]=ea;da=y^da;c[S>>2]=da;ca=A^ca;c[Q>>2]=ca;ba=C^ba;c[O>>2]=ba;aa=E^aa;c[M>>2]=aa;$=G^$;c[K>>2]=$;_=H^_;c[I>>2]=_;H=c[g>>2]|0;G=c[F>>2]|0;E=c[D>>2]|0;C=c[B>>2]|0;A=c[z>>2]|0;y=c[x>>2]|0;w=c[v>>2]|0;h=c[i>>2]|0;j=c[t>>2]|0;Z=c[u>>2]|0;J=(c[1184+(b*960|0)+924>>2]^G)&ia;L=(c[1184+(b*960|0)+928>>2]^E)&ia;N=(c[1184+(b*960|0)+932>>2]^C)&ia;P=(c[1184+(b*960|0)+936>>2]^A)&ia;R=(c[1184+(b*960|0)+940>>2]^y)&ia;T=(c[1184+(b*960|0)+944>>2]^w)&ia;V=(c[1184+(b*960|0)+948>>2]^h)&ia;X=(c[1184+(b*960|0)+952>>2]^j)&ia;Y=(c[1184+(b*960|0)+956>>2]^Z)&ia;H=(c[1184+(b*960|0)+920>>2]^H)&ia^H;c[g>>2]=H;G=J^G;c[F>>2]=G;E=L^E;c[D>>2]=E;C=N^C;c[B>>2]=C;A=P^A;c[z>>2]=A;y=R^y;c[x>>2]=y;w=T^w;c[v>>2]=w;h=V^h;c[i>>2]=h;j=X^j;c[t>>2]=j;b=Y^Z;c[u>>2]=b;Z=c[a>>2]|0;Y=c[d>>2]|0;X=c[k>>2]|0;V=c[l>>2]|0;T=c[m>>2]|0;R=c[n>>2]|0;P=c[o>>2]|0;N=c[p>>2]|0;L=c[q>>2]|0;J=c[r>>2]|0;c[a>>2]=(ha^Z)&s^Z;c[d>>2]=(ga^Y)&s^Y;c[k>>2]=(fa^X)&s^X;c[l>>2]=(ea^V)&s^V;c[m>>2]=(da^T)&s^T;c[n>>2]=(ca^R)&s^R;c[o>>2]=(ba^P)&s^P;c[p>>2]=(aa^N)&s^N;c[q>>2]=($^L)&s^L;c[r>>2]=(_^J)&s^J;d=c[e>>2]|0;a=c[f>>2]|0;r=c[W>>2]|0;q=c[U>>2]|0;p=c[S>>2]|0;o=c[Q>>2]|0;n=c[O>>2]|0;m=c[M>>2]|0;l=c[K>>2]|0;k=c[I>>2]|0;c[e>>2]=(Z^d)&s^d;c[f>>2]=(Y^a)&s^a;c[W>>2]=(X^r)&s^r;c[U>>2]=(V^q)&s^q;c[S>>2]=(T^p)&s^p;c[Q>>2]=(R^o)&s^o;c[O>>2]=(P^n)&s^n;c[M>>2]=(N^m)&s^m;c[K>>2]=(L^l)&s^l;c[I>>2]=(J^k)&s^k;f=c[g>>2]|0;k=c[F>>2]|0;l=c[D>>2]|0;m=c[B>>2]|0;n=c[z>>2]|0;o=c[x>>2]|0;p=c[v>>2]|0;q=c[i>>2]|0;r=c[t>>2]|0;a=c[u>>2]|0;c[g>>2]=(f^0-H)&s^f;c[F>>2]=(k^0-G)&s^k;c[D>>2]=(l^0-E)&s^l;c[B>>2]=(m^0-C)&s^m;c[z>>2]=(n^0-A)&s^n;c[x>>2]=(o^0-y)&s^o;c[v>>2]=(p^0-w)&s^p;c[i>>2]=(q^0-h)&s^q;c[t>>2]=(r^0-j)&s^r;c[u>>2]=(a^0-b)&s^a;return}function Tc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=i;e=i=i+63&-64;i=i+240|0;d=e+80|0;f=e+40|0;if(Nc(d,b)|0){f=-1;i=g;return f|0}y=e+4|0;c[y>>2]=0;c[y+4>>2]=0;c[y+8>>2]=0;c[y+12>>2]=0;c[y+16>>2]=0;c[y+20>>2]=0;c[y+24>>2]=0;c[y+28>>2]=0;q=d+40|0;p=d+44|0;n=d+48|0;m=d+52|0;l=d+56|0;k=d+60|0;j=d+64|0;h=d+68|0;r=d+72|0;b=d+76|0;z=0-(c[p>>2]|0)|0;x=0-(c[n>>2]|0)|0;w=0-(c[m>>2]|0)|0;v=0-(c[l>>2]|0)|0;u=0-(c[k>>2]|0)|0;t=0-(c[j>>2]|0)|0;s=0-(c[h>>2]|0)|0;d=0-(c[r>>2]|0)|0;o=0-(c[b>>2]|0)|0;c[e>>2]=1-(c[q>>2]|0);c[y>>2]=z;c[e+8>>2]=x;c[e+12>>2]=w;c[e+16>>2]=v;c[e+20>>2]=u;c[e+24>>2]=t;c[e+28>>2]=s;c[e+32>>2]=d;c[e+36>>2]=o;Ic(e,e);o=f+4|0;c[o>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[o+20>>2]=0;c[o+24>>2]=0;c[o+28>>2]=0;p=c[p>>2]|0;n=c[n>>2]|0;m=c[m>>2]|0;l=c[l>>2]|0;k=c[k>>2]|0;j=c[j>>2]|0;h=c[h>>2]|0;d=c[r>>2]|0;b=c[b>>2]|0;c[f>>2]=(c[q>>2]|0)+1;c[o>>2]=p;c[f+8>>2]=n;c[f+12>>2]=m;c[f+16>>2]=l;c[f+20>>2]=k;c[f+24>>2]=j;c[f+28>>2]=h;c[f+32>>2]=d;c[f+36>>2]=b;Jc(f,f,e);Lc(a,f);f=0;i=g;return f|0}function Uc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;k=i;g=i=i+63&-64;i=i+272|0;h=g;g=g+208|0;f=h+64|0;j=h;l=8;m=j+64|0;do{c[j>>2]=c[l>>2];j=j+4|0;l=l+4|0}while((j|0)<(m|0));j=h+72|0;c[j>>2]=256;c[j+4>>2]=0;j=f;c[j>>2]=0;c[j+4>>2]=0;j=h+80|0;l=e;m=j+32|0;do{a[j>>0]=a[l>>0]|0;j=j+1|0;l=l+1|0}while((j|0)<(m|0));Gb(h,g);a[g>>0]=(d[g>>0]|0)&248;j=g+31|0;a[j>>0]=(d[j>>0]|0)&63|64;j=b;l=g;m=j+32|0;do{a[j>>0]=a[l>>0]|0;j=j+1|0;l=l+1|0}while((j|0)<(m|0));i=k;return 0}function Vc(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0;Qa=i;j=i=i+63&-64;i=i+3024|0;Ma=j+2800|0;Na=j+2544|0;Oa=j+2288|0;k=j+2248|0;Ja=j+968|0;Ka=j+808|0;La=j+648|0;t=j+488|0;n=j;p=j+2952|0;Pa=j+2920|0;s=j+328|0;j=j+208|0;if((d[b+63>>0]|0)>31){b=-1;i=Qa;return b|0}if(Nc(s,h)|0){b=-1;i=Qa;return b|0}if(!((a[h+31>>0]|(a[h+30>>0]|(a[h+29>>0]|(a[h+28>>0]|(a[h+27>>0]|(a[h+26>>0]|(a[h+25>>0]|(a[h+24>>0]|(a[h+23>>0]|(a[h+22>>0]|(a[h+21>>0]|(a[h+20>>0]|(a[h+19>>0]|(a[h+18>>0]|(a[h+17>>0]|(a[h+16>>0]|(a[h+15>>0]|(a[h+14>>0]|(a[h+13>>0]|(a[h+12>>0]|(a[h+11>>0]|(a[h+10>>0]|(a[h+9>>0]|(a[h+8>>0]|(a[h+7>>0]|(a[h+6>>0]|(a[h+5>>0]|(a[h+4>>0]|(a[h+3>>0]|(a[h+2>>0]|(a[h+1>>0]|a[h>>0])))))))))))))))))))))))))))))))<<24>>24)){b=-1;i=Qa;return b|0}l=n+64|0;q=l;c[q>>2]=0;c[q+4>>2]=0;q=n;o=8;r=q+64|0;do{c[q>>2]=c[o>>2];q=q+4|0;o=o+4|0}while((q|0)<(r|0));m=n+72|0;q=m;c[q>>2]=256;c[q+4>>2]=0;q=l;c[q>>2]=0;c[q+4>>2]=0;q=n+80|0;o=b;r=q+32|0;do{a[q>>0]=a[o>>0]|0;q=q+1|0;o=o+1|0}while((q|0)<(r|0));q=m;c[q>>2]=512;c[q+4>>2]=0;q=l;c[q>>2]=0;c[q+4>>2]=0;q=n+112|0;o=h;r=q+32|0;do{a[q>>0]=a[o>>0]|0;q=q+1|0;o=o+1|0}while((q|0)<(r|0));Fb(n,e,f,g);Gb(n,p);Wc(p);f=0;do{a[Na+f>>0]=(d[p+(f>>3)>>0]|0)>>>(f&7)&1;f=f+1|0}while((f|0)!=256);p=b+32|0;o=0;while(1){e=Na+o|0;a:do if(a[e>>0]|0){h=1;do{g=h+o|0;if((g|0)>=256)break a;m=Na+g|0;f=a[m>>0]|0;b:do if(f<<24>>24){n=a[e>>0]|0;f=f<<24>>24<>0]=l;a[m>>0]=0;break}f=n-f|0;if((f|0)<=-16)break a;a[e>>0]=f;while(1){f=Na+g|0;if(!(a[f>>0]|0))break;a[f>>0]=0;g=g+1|0;if((g|0)>=256)break b}a[f>>0]=1}while(0);h=h+1|0}while((h|0)<7)}while(0);o=o+1|0;if((o|0)==256){f=0;break}}do{a[Oa+f>>0]=(d[p+(f>>3)>>0]|0)>>>(f&7)&1;f=f+1|0}while((f|0)!=256);o=0;do{e=Oa+o|0;c:do if(a[e>>0]|0){h=1;do{g=h+o|0;if((g|0)>=256)break c;m=Oa+g|0;f=a[m>>0]|0;d:do if(f<<24>>24){n=a[e>>0]|0;f=f<<24>>24<>0]=l;a[m>>0]=0;break}f=n-f|0;if((f|0)<=-16)break c;a[e>>0]=f;while(1){f=Oa+g|0;if(!(a[f>>0]|0))break;a[f>>0]=0;g=g+1|0;if((g|0)>=256)break d}a[f>>0]=1}while(0);h=h+1|0}while((h|0)<7)}while(0);o=o+1|0}while((o|0)!=256);Qc(Ja,s);Ia=c[s+4>>2]|0;r=c[s+8>>2]|0;q=c[s+12>>2]|0;Ga=c[s+16>>2]|0;Fa=c[s+20>>2]|0;Ea=c[s+24>>2]|0;Da=c[s+28>>2]|0;Ca=c[s+32>>2]|0;Ba=c[s+36>>2]|0;c[Ma>>2]=c[s>>2];c[Ma+4>>2]=Ia;c[Ma+8>>2]=r;c[Ma+12>>2]=q;c[Ma+16>>2]=Ga;c[Ma+20>>2]=Fa;c[Ma+24>>2]=Ea;c[Ma+28>>2]=Da;c[Ma+32>>2]=Ca;c[Ma+36>>2]=Ba;Ba=c[s+44>>2]|0;Ca=c[s+48>>2]|0;Da=c[s+52>>2]|0;Ea=c[s+56>>2]|0;Fa=c[s+60>>2]|0;Ga=c[s+64>>2]|0;q=c[s+68>>2]|0;r=c[s+72>>2]|0;Ia=c[s+76>>2]|0;c[Ma+40>>2]=c[s+40>>2];c[Ma+44>>2]=Ba;c[Ma+48>>2]=Ca;c[Ma+52>>2]=Da;c[Ma+56>>2]=Ea;c[Ma+60>>2]=Fa;c[Ma+64>>2]=Ga;c[Ma+68>>2]=q;c[Ma+72>>2]=r;c[Ma+76>>2]=Ia;Ia=c[s+84>>2]|0;r=c[s+88>>2]|0;q=c[s+92>>2]|0;Ga=c[s+96>>2]|0;Fa=c[s+100>>2]|0;Ea=c[s+104>>2]|0;Da=c[s+108>>2]|0;Ca=c[s+112>>2]|0;Ba=c[s+116>>2]|0;c[Ma+80>>2]=c[s+80>>2];c[Ma+84>>2]=Ia;c[Ma+88>>2]=r;c[Ma+92>>2]=q;c[Ma+96>>2]=Ga;c[Ma+100>>2]=Fa;c[Ma+104>>2]=Ea;c[Ma+108>>2]=Da;c[Ma+112>>2]=Ca;c[Ma+116>>2]=Ba;Pc(Ka,Ma);Ba=Ka+120|0;Jc(t,Ka,Ba);Ca=Ka+40|0;Da=Ka+80|0;Jc(t+40|0,Ca,Da);Jc(t+80|0,Da,Ba);Jc(t+120|0,Ka,Ca);Mc(Ka,t,Ja);Jc(La,Ka,Ba);Ea=La+40|0;Jc(Ea,Ca,Da);Fa=La+80|0;Jc(Fa,Da,Ba);Ga=La+120|0;Jc(Ga,Ka,Ca);q=Ja+160|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);q=Ja+320|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);q=Ja+480|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);q=Ja+640|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);q=Ja+800|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);q=Ja+960|0;Qc(q,La);Mc(Ka,t,q);Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);Qc(Ja+1120|0,La);q=j;r=q+40|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(r|0));Ha=j+40|0;c[Ha>>2]=1;q=j+44|0;r=q+36|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(r|0));Ia=j+80|0;c[Ia>>2]=1;q=j+84|0;r=q+36|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(r|0));g=255;while(1){if(a[Na+g>>0]|0){f=g;break}if(a[Oa+g>>0]|0){f=g;break}f=g+-1|0;if((g|0)>0)g=f;else break}if((f|0)>-1){l=La+44|0;m=La+48|0;n=La+52|0;e=La+56|0;h=La+60|0;o=La+64|0;p=La+68|0;q=La+72|0;r=La+76|0;s=La+4|0;t=La+8|0;u=La+12|0;v=La+16|0;w=La+20|0;x=La+24|0;y=La+28|0;z=La+32|0;A=La+36|0;B=Ka+4|0;C=Ka+8|0;D=Ka+12|0;E=Ka+16|0;F=Ka+20|0;G=Ka+24|0;H=Ka+28|0;I=Ka+32|0;J=Ka+36|0;K=Ka+44|0;L=Ka+48|0;M=Ka+52|0;N=Ka+56|0;O=Ka+60|0;P=Ka+64|0;Q=Ka+68|0;R=Ka+72|0;S=Ka+76|0;T=La+84|0;U=La+88|0;V=La+92|0;W=La+96|0;X=La+100|0;Y=La+104|0;Z=La+108|0;_=La+112|0;$=La+116|0;aa=k+4|0;ba=k+8|0;ca=k+12|0;da=k+16|0;ea=k+20|0;fa=k+24|0;ga=k+28|0;ha=k+32|0;ia=k+36|0;ja=Ka+84|0;ka=Ka+88|0;la=Ka+92|0;ma=Ka+96|0;na=Ka+100|0;oa=Ka+104|0;pa=Ka+108|0;qa=Ka+112|0;ra=Ka+116|0;sa=Ka+124|0;ta=Ka+128|0;ua=Ka+132|0;va=Ka+136|0;wa=Ka+140|0;xa=Ka+144|0;ya=Ka+148|0;za=Ka+152|0;Aa=Ka+156|0;while(1){Pc(Ka,j);g=a[Na+f>>0]|0;if(g<<24>>24<=0){if(g<<24>>24<0){Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);hb=(g<<24>>24|0)/-2|0;rb=c[Ea>>2]|0;Xa=c[l>>2]|0;Ta=c[m>>2]|0;ib=c[n>>2]|0;mb=c[e>>2]|0;qb=c[h>>2]|0;$a=c[o>>2]|0;bb=c[p>>2]|0;db=c[q>>2]|0;fb=c[r>>2]|0;Za=c[La>>2]|0;Va=c[s>>2]|0;Ra=c[t>>2]|0;kb=c[u>>2]|0;ob=c[v>>2]|0;_a=c[w>>2]|0;ab=c[x>>2]|0;cb=c[y>>2]|0;eb=c[z>>2]|0;gb=c[A>>2]|0;c[Ka>>2]=Za+rb;c[B>>2]=Va+Xa;c[C>>2]=Ra+Ta;c[D>>2]=kb+ib;c[E>>2]=ob+mb;c[F>>2]=_a+qb;c[G>>2]=ab+$a;c[H>>2]=cb+bb;c[I>>2]=eb+db;c[J>>2]=gb+fb;c[Ca>>2]=rb-Za;c[K>>2]=Xa-Va;c[L>>2]=Ta-Ra;c[M>>2]=ib-kb;c[N>>2]=mb-ob;c[O>>2]=qb-_a;c[P>>2]=$a-ab;c[Q>>2]=bb-cb;c[R>>2]=db-eb;c[S>>2]=fb-gb;Jc(Da,Ka,Ja+(hb*160|0)+40|0);Jc(Ca,Ca,Ja+(hb*160|0)|0);Jc(Ba,Ja+(hb*160|0)+120|0,Ga);Jc(Ka,Fa,Ja+(hb*160|0)+80|0);hb=c[Ka>>2]<<1;gb=c[B>>2]<<1;fb=c[C>>2]<<1;eb=c[D>>2]<<1;db=c[E>>2]<<1;cb=c[F>>2]<<1;bb=c[G>>2]<<1;ab=c[H>>2]<<1;$a=c[I>>2]<<1;_a=c[J>>2]<<1;c[k>>2]=hb;c[aa>>2]=gb;c[ba>>2]=fb;c[ca>>2]=eb;c[da>>2]=db;c[ea>>2]=cb;c[fa>>2]=bb;c[ga>>2]=ab;c[ha>>2]=$a;c[ia>>2]=_a;qb=c[Da>>2]|0;ob=c[ja>>2]|0;mb=c[ka>>2]|0;kb=c[la>>2]|0;ib=c[ma>>2]|0;Ra=c[na>>2]|0;Ta=c[oa>>2]|0;Va=c[pa>>2]|0;Xa=c[qa>>2]|0;Za=c[ra>>2]|0;rb=c[Ca>>2]|0;pb=c[K>>2]|0;nb=c[L>>2]|0;lb=c[M>>2]|0;jb=c[N>>2]|0;g=c[O>>2]|0;Sa=c[P>>2]|0;Ua=c[Q>>2]|0;Wa=c[R>>2]|0;Ya=c[S>>2]|0;c[Ka>>2]=qb-rb;c[B>>2]=ob-pb;c[C>>2]=mb-nb;c[D>>2]=kb-lb;c[E>>2]=ib-jb;c[F>>2]=Ra-g;c[G>>2]=Ta-Sa;c[H>>2]=Va-Ua;c[I>>2]=Xa-Wa;c[J>>2]=Za-Ya;c[Ca>>2]=rb+qb;c[K>>2]=pb+ob;c[L>>2]=nb+mb;c[M>>2]=lb+kb;c[N>>2]=jb+ib;c[O>>2]=g+Ra;c[P>>2]=Sa+Ta;c[Q>>2]=Ua+Va;c[R>>2]=Wa+Xa;c[S>>2]=Ya+Za;Za=c[Ba>>2]|0;Ya=c[sa>>2]|0;Xa=c[ta>>2]|0;Wa=c[ua>>2]|0;Va=c[va>>2]|0;Ua=c[wa>>2]|0;Ta=c[xa>>2]|0;Sa=c[ya>>2]|0;Ra=c[za>>2]|0;g=c[Aa>>2]|0;c[Da>>2]=hb-Za;c[ja>>2]=gb-Ya;c[ka>>2]=fb-Xa;c[la>>2]=eb-Wa;c[ma>>2]=db-Va;c[na>>2]=cb-Ua;c[oa>>2]=bb-Ta;c[pa>>2]=ab-Sa;c[qa>>2]=$a-Ra;c[ra>>2]=_a-g;Ya=Ya+(c[aa>>2]|0)|0;Xa=Xa+(c[ba>>2]|0)|0;Wa=Wa+(c[ca>>2]|0)|0;Va=Va+(c[da>>2]|0)|0;Ua=Ua+(c[ea>>2]|0)|0;Ta=Ta+(c[fa>>2]|0)|0;Sa=Sa+(c[ga>>2]|0)|0;Ra=Ra+(c[ha>>2]|0)|0;g=g+(c[ia>>2]|0)|0;c[Ba>>2]=Za+(c[k>>2]|0);c[sa>>2]=Ya;c[ta>>2]=Xa;c[ua>>2]=Wa;c[va>>2]=Va;c[wa>>2]=Ua;c[xa>>2]=Ta;c[ya>>2]=Sa;c[za>>2]=Ra;c[Aa>>2]=g}}else{Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);Mc(Ka,La,Ja+(((g<<24>>24|0)/2|0)*160|0)|0)}g=a[Oa+f>>0]|0;if(g<<24>>24<=0){if(g<<24>>24<0){Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);_a=(g<<24>>24|0)/-2|0;g=c[Ea>>2]|0;kb=c[l>>2]|0;ob=c[m>>2]|0;Za=c[n>>2]|0;Va=c[e>>2]|0;Ra=c[h>>2]|0;gb=c[o>>2]|0;eb=c[p>>2]|0;cb=c[q>>2]|0;ab=c[r>>2]|0;ib=c[La>>2]|0;mb=c[s>>2]|0;qb=c[t>>2]|0;Xa=c[u>>2]|0;Ta=c[v>>2]|0;hb=c[w>>2]|0;fb=c[x>>2]|0;db=c[y>>2]|0;bb=c[z>>2]|0;$a=c[A>>2]|0;c[Ka>>2]=ib+g;c[B>>2]=mb+kb;c[C>>2]=qb+ob;c[D>>2]=Xa+Za;c[E>>2]=Ta+Va;c[F>>2]=hb+Ra;c[G>>2]=fb+gb;c[H>>2]=db+eb;c[I>>2]=bb+cb;c[J>>2]=$a+ab;c[Ca>>2]=g-ib;c[K>>2]=kb-mb;c[L>>2]=ob-qb;c[M>>2]=Za-Xa;c[N>>2]=Va-Ta;c[O>>2]=Ra-hb;c[P>>2]=gb-fb;c[Q>>2]=eb-db;c[R>>2]=cb-bb;c[S>>2]=ab-$a;Jc(Da,Ka,104+(_a*120|0)+40|0);Jc(Ca,Ca,104+(_a*120|0)|0);Jc(Ba,104+(_a*120|0)+80|0,Ga);_a=c[Fa>>2]<<1;$a=c[T>>2]<<1;ab=c[U>>2]<<1;bb=c[V>>2]<<1;cb=c[W>>2]<<1;db=c[X>>2]<<1;eb=c[Y>>2]<<1;fb=c[Z>>2]<<1;gb=c[_>>2]<<1;hb=c[$>>2]<<1;c[k>>2]=_a;c[aa>>2]=$a;c[ba>>2]=ab;c[ca>>2]=bb;c[da>>2]=cb;c[ea>>2]=db;c[fa>>2]=eb;c[ga>>2]=fb;c[ha>>2]=gb;c[ia>>2]=hb;Ra=c[Da>>2]|0;Ta=c[ja>>2]|0;Va=c[ka>>2]|0;Xa=c[la>>2]|0;Za=c[ma>>2]|0;qb=c[na>>2]|0;ob=c[oa>>2]|0;mb=c[pa>>2]|0;kb=c[qa>>2]|0;ib=c[ra>>2]|0;g=c[Ca>>2]|0;Sa=c[K>>2]|0;Ua=c[L>>2]|0;Wa=c[M>>2]|0;Ya=c[N>>2]|0;rb=c[O>>2]|0;pb=c[P>>2]|0;nb=c[Q>>2]|0;lb=c[R>>2]|0;jb=c[S>>2]|0;c[Ka>>2]=Ra-g;c[B>>2]=Ta-Sa;c[C>>2]=Va-Ua;c[D>>2]=Xa-Wa;c[E>>2]=Za-Ya;c[F>>2]=qb-rb;c[G>>2]=ob-pb;c[H>>2]=mb-nb;c[I>>2]=kb-lb;c[J>>2]=ib-jb;c[Ca>>2]=g+Ra;c[K>>2]=Sa+Ta;c[L>>2]=Ua+Va;c[M>>2]=Wa+Xa;c[N>>2]=Ya+Za;c[O>>2]=rb+qb;c[P>>2]=pb+ob;c[Q>>2]=nb+mb;c[R>>2]=lb+kb;c[S>>2]=jb+ib;ib=c[Ba>>2]|0;jb=c[sa>>2]|0;kb=c[ta>>2]|0;lb=c[ua>>2]|0;mb=c[va>>2]|0;nb=c[wa>>2]|0;ob=c[xa>>2]|0;pb=c[ya>>2]|0;qb=c[za>>2]|0;rb=c[Aa>>2]|0;c[Da>>2]=_a-ib;c[ja>>2]=$a-jb;c[ka>>2]=ab-kb;c[la>>2]=bb-lb;c[ma>>2]=cb-mb;c[na>>2]=db-nb;c[oa>>2]=eb-ob;c[pa>>2]=fb-pb;c[qa>>2]=gb-qb;c[ra>>2]=hb-rb;jb=jb+(c[aa>>2]|0)|0;kb=kb+(c[ba>>2]|0)|0;lb=lb+(c[ca>>2]|0)|0;mb=mb+(c[da>>2]|0)|0;nb=nb+(c[ea>>2]|0)|0;ob=ob+(c[fa>>2]|0)|0;pb=pb+(c[ga>>2]|0)|0;qb=qb+(c[ha>>2]|0)|0;rb=rb+(c[ia>>2]|0)|0;c[Ba>>2]=ib+(c[k>>2]|0);c[sa>>2]=jb;c[ta>>2]=kb;c[ua>>2]=lb;c[va>>2]=mb;c[wa>>2]=nb;c[xa>>2]=ob;c[ya>>2]=pb;c[za>>2]=qb;c[Aa>>2]=rb}}else{Jc(La,Ka,Ba);Jc(Ea,Ca,Da);Jc(Fa,Da,Ba);Jc(Ga,Ka,Ca);Oc(Ka,La,104+(((g<<24>>24|0)/2|0)*120|0)|0)}Jc(j,Ka,Ba);Jc(Ha,Ca,Da);Jc(Ia,Da,Ba);if((f|0)>0)f=f+-1|0;else break}}Ic(k,Ia);Jc(Na,j,k);Jc(Oa,Ha,k);Lc(Pa,Oa);Lc(Ma,Na);j=Pa+31|0;a[j>>0]=d[j>>0]^d[Ma>>0]<<7;j=Yc(Pa,b)|0;k=(Pa|0)==(b|0);f=0;g=0;do{f=a[Pa+g>>0]^a[b+g>>0]|f;g=g+1|0}while((g|0)!=32);rb=(k?-1:j)|(((f&255)+511|0)>>>8&1)+-1;i=Qa;return rb|0}function Wc(b){b=b|0;var c=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0;ea=b+1|0;ba=b+2|0;D=a[ba>>0]|0;f=d[b>>0]|0;n=Hd(d[ea>>0]|0|0,0,8)|0;va=C;D=D&255;V=Hd(D|0,0,16)|0;aa=b+3|0;y=Hd(d[aa>>0]|0|0,0,8)|0;ga=C;$=b+4|0;U=Hd(d[$>>0]|0|0,0,16)|0;ga=ga|C;Y=b+5|0;N=d[Y>>0]|0;X=Hd(N|0,0,24)|0;ga=Gd(y|D|U|X|0,ga|C|0,5)|0;X=b+6|0;U=b+7|0;D=a[U>>0]|0;y=Hd(d[X>>0]|0|0,0,8)|0;Ba=C;D=D&255;T=Hd(D|0,0,16)|0;Ba=Gd(y|N|T|0,Ba|C|0,2)|0;T=b+8|0;N=Hd(d[T>>0]|0|0,0,8)|0;y=C;S=b+9|0;Ca=Hd(d[S>>0]|0|0,0,16)|0;y=y|C;P=b+10|0;Sa=d[P>>0]|0;O=Hd(Sa|0,0,24)|0;y=Gd(N|D|Ca|O|0,y|C|0,7)|0;O=b+11|0;Ca=Hd(d[O>>0]|0|0,0,8)|0;D=C;N=b+12|0;G=Hd(d[N>>0]|0|0,0,16)|0;D=D|C;K=b+13|0;u=d[K>>0]|0;J=Hd(u|0,0,24)|0;D=Gd(Ca|Sa|G|J|0,D|C|0,4)|0;J=b+14|0;G=b+15|0;Sa=a[G>>0]|0;Ca=Hd(d[J>>0]|0|0,0,8)|0;Da=C;Sa=Sa&255;F=Hd(Sa|0,0,16)|0;Da=Gd(Ca|u|F|0,Da|C|0,1)|0;F=b+16|0;u=Hd(d[F>>0]|0|0,0,8)|0;Ca=C;E=b+17|0;w=Hd(d[E>>0]|0|0,0,16)|0;Ca=Ca|C;A=b+18|0;v=d[A>>0]|0;z=Hd(v|0,0,24)|0;Ca=Gd(u|Sa|w|z|0,Ca|C|0,6)|0;z=b+19|0;w=b+20|0;Sa=a[w>>0]|0;u=Hd(d[z>>0]|0|0,0,8)|0;Ta=C;Sa=Hd(Sa&255|0,0,16)|0;Ta=Gd(u|v|Sa|0,Ta|C|0,3)|0;Sa=C;v=b+21|0;u=b+22|0;r=b+23|0;na=a[r>>0]|0;ab=d[v>>0]|0;bb=Hd(d[u>>0]|0|0,0,8)|0;_a=C;na=na&255;$a=Hd(na|0,0,16)|0;q=b+24|0;Ka=Hd(d[q>>0]|0|0,0,8)|0;Pa=C;p=b+25|0;i=Hd(d[p>>0]|0|0,0,16)|0;Pa=Pa|C;m=b+26|0;xa=d[m>>0]|0;l=Hd(xa|0,0,24)|0;Pa=Gd(Ka|na|i|l|0,Pa|C|0,5)|0;l=b+27|0;i=b+28|0;na=a[i>>0]|0;Ka=Hd(d[l>>0]|0|0,0,8)|0;Za=C;na=na&255;h=Hd(na|0,0,16)|0;Za=Gd(Ka|xa|h|0,Za|C|0,2)|0;h=b+29|0;xa=Hd(d[h>>0]|0|0,0,8)|0;Ka=C;g=b+30|0;fb=Hd(d[g>>0]|0|0,0,16)|0;Ka=Ka|C;c=b+31|0;qa=d[c>>0]|0;oa=Hd(qa|0,0,24)|0;Ka=Gd(xa|na|fb|oa|0,Ka|C|0,7)|0;oa=Hd(d[b+32>>0]|0|0,0,8)|0;fb=C;na=Hd(d[b+33>>0]|0|0,0,16)|0;fb=fb|C;xa=d[b+34>>0]|0;la=Hd(xa|0,0,24)|0;fb=Gd(oa|qa|na|la|0,fb|C|0,4)|0;la=a[b+36>>0]|0;na=Hd(d[b+35>>0]|0|0,0,8)|0;qa=C;la=la&255;oa=Hd(la|0,0,16)|0;qa=Gd(na|xa|oa|0,qa|C|0,1)|0;oa=Hd(d[b+37>>0]|0|0,0,8)|0;xa=C;na=Hd(d[b+38>>0]|0|0,0,16)|0;xa=xa|C;Ma=d[b+39>>0]|0;fa=Hd(Ma|0,0,24)|0;xa=Gd(oa|la|na|fa|0,xa|C|0,6)|0;fa=a[b+41>>0]|0;na=Hd(d[b+40>>0]|0|0,0,8)|0;la=C;fa=Hd(fa&255|0,0,16)|0;la=Gd(na|Ma|fa|0,la|C|0,3)|0;fa=C;Ma=a[b+44>>0]|0;na=d[b+42>>0]|0;oa=Hd(d[b+43>>0]|0|0,0,8)|0;j=C;Ma=Ma&255;za=Hd(Ma|0,0,16)|0;ja=Hd(d[b+45>>0]|0|0,0,8)|0;L=C;W=Hd(d[b+46>>0]|0|0,0,16)|0;L=L|C;gb=d[b+47>>0]|0;o=Hd(gb|0,0,24)|0;L=Gd(ja|Ma|W|o|0,L|C|0,5)|0;o=a[b+49>>0]|0;W=Hd(d[b+48>>0]|0|0,0,8)|0;Ma=C;o=o&255;ja=Hd(o|0,0,16)|0;Ma=Gd(W|gb|ja|0,Ma|C|0,2)|0;Ma=Ma&2097151;ja=Hd(d[b+50>>0]|0|0,0,8)|0;gb=C;W=Hd(d[b+51>>0]|0|0,0,16)|0;gb=gb|C;Aa=d[b+52>>0]|0;M=Hd(Aa|0,0,24)|0;gb=Gd(ja|o|W|M|0,gb|C|0,7)|0;gb=gb&2097151;M=Hd(d[b+53>>0]|0|0,0,8)|0;W=C;o=Hd(d[b+54>>0]|0|0,0,16)|0;W=W|C;ja=d[b+55>>0]|0;R=Hd(ja|0,0,24)|0;W=Gd(M|Aa|o|R|0,W|C|0,4)|0;W=W&2097151;R=a[b+57>>0]|0;o=Hd(d[b+56>>0]|0|0,0,8)|0;Aa=C;R=R&255;M=Hd(R|0,0,16)|0;Aa=Gd(o|ja|M|0,Aa|C|0,1)|0;Aa=Aa&2097151;M=Hd(d[b+58>>0]|0|0,0,8)|0;ja=C;o=Hd(d[b+59>>0]|0|0,0,16)|0;ja=ja|C;ha=d[b+60>>0]|0;Q=Hd(ha|0,0,24)|0;ja=Gd(M|R|o|Q|0,ja|C|0,6)|0;ja=ja&2097151;Q=Hd(d[b+61>>0]|0|0,0,8)|0;o=C;R=Hd(d[b+62>>0]|0|0,0,16)|0;o=o|C;M=Hd(d[b+63>>0]|0|0,0,24)|0;o=Gd(Q|ha|R|M|0,o|C|0,3)|0;M=C;R=Od(o|0,M|0,666643,0)|0;ha=C;Q=Od(o|0,M|0,470296,0)|0;I=C;ca=Od(o|0,M|0,654183,0)|0;ta=C;Ea=Od(o|0,M|0,-997805,-1)|0;t=C;k=Od(o|0,M|0,136657,0)|0;B=C;M=Od(o|0,M|0,-683901,-1)|0;j=Dd(M|0,C|0,oa|na|za&2031616|0,j|0)|0;za=C;na=Od(ja|0,0,666643,0)|0;oa=C;M=Od(ja|0,0,470296,0)|0;o=C;Va=Od(ja|0,0,654183,0)|0;s=C;ma=Od(ja|0,0,-997805,-1)|0;_=C;ya=Od(ja|0,0,136657,0)|0;sa=C;ja=Od(ja|0,0,-683901,-1)|0;H=C;e=Od(Aa|0,0,666643,0)|0;ra=C;wa=Od(Aa|0,0,470296,0)|0;La=C;Fa=Od(Aa|0,0,654183,0)|0;da=C;cb=Od(Aa|0,0,-997805,-1)|0;Ua=C;ka=Od(Aa|0,0,136657,0)|0;x=C;Aa=Od(Aa|0,0,-683901,-1)|0;xa=Dd(Aa|0,C|0,xa&2097151|0,0)|0;sa=Dd(xa|0,C|0,ya|0,sa|0)|0;t=Dd(sa|0,C|0,Ea|0,t|0)|0;Ea=C;sa=Od(W|0,0,666643,0)|0;ya=C;xa=Od(W|0,0,470296,0)|0;Aa=C;Wa=Od(W|0,0,654183,0)|0;Z=C;Ha=Od(W|0,0,-997805,-1)|0;Ga=C;eb=Od(W|0,0,136657,0)|0;db=C;W=Od(W|0,0,-683901,-1)|0;pa=C;ia=Od(gb|0,0,666643,0)|0;ua=C;Qa=Od(gb|0,0,470296,0)|0;Ra=C;Oa=Od(gb|0,0,654183,0)|0;Na=C;Ya=Od(gb|0,0,-997805,-1)|0;Xa=C;Ja=Od(gb|0,0,136657,0)|0;Ia=C;gb=Od(gb|0,0,-683901,-1)|0;fb=Dd(gb|0,C|0,fb&2097151|0,0)|0;db=Dd(fb|0,C|0,eb|0,db|0)|0;Ua=Dd(db|0,C|0,cb|0,Ua|0)|0;s=Dd(Ua|0,C|0,Va|0,s|0)|0;I=Dd(s|0,C|0,Q|0,I|0)|0;Q=C;s=Od(Ma|0,0,666643,0)|0;Ca=Dd(s|0,C|0,Ca&2097151|0,0)|0;s=C;Va=Od(Ma|0,0,470296,0)|0;Ua=C;cb=Od(Ma|0,0,654183,0)|0;_a=Dd(cb|0,C|0,bb|ab|$a&2031616|0,_a|0)|0;Ra=Dd(_a|0,C|0,Qa|0,Ra|0)|0;ya=Dd(Ra|0,C|0,sa|0,ya|0)|0;sa=C;Ra=Od(Ma|0,0,-997805,-1)|0;Qa=C;_a=Od(Ma|0,0,136657,0)|0;Za=Dd(_a|0,C|0,Za&2097151|0,0)|0;Xa=Dd(Za|0,C|0,Ya|0,Xa|0)|0;Z=Dd(Xa|0,C|0,Wa|0,Z|0)|0;La=Dd(Z|0,C|0,wa|0,La|0)|0;oa=Dd(La|0,C|0,na|0,oa|0)|0;na=C;Ma=Od(Ma|0,0,-683901,-1)|0;La=C;wa=Dd(Ca|0,s|0,1048576,0)|0;wa=Gd(wa|0,C|0,21)|0;Z=C;Sa=Dd(Va|0,Ua|0,Ta|0,Sa|0)|0;Sa=Dd(Sa|0,C|0,wa|0,Z|0)|0;ua=Dd(Sa|0,C|0,ia|0,ua|0)|0;ia=C;Z=Hd(wa|0,Z|0,21)|0;Z=Cd(Ca|0,s|0,Z|0,C|0)|0;s=C;Ca=Dd(ya|0,sa|0,1048576,0)|0;Ca=Gd(Ca|0,C|0,21)|0;wa=C;Pa=Dd(Ra|0,Qa|0,Pa&2097151|0,0)|0;Na=Dd(Pa|0,C|0,Oa|0,Na|0)|0;Aa=Dd(Na|0,C|0,xa|0,Aa|0)|0;ra=Dd(Aa|0,C|0,e|0,ra|0)|0;ra=Dd(ra|0,C|0,Ca|0,wa|0)|0;e=C;wa=Hd(Ca|0,wa|0,21)|0;Ca=C;Aa=Dd(oa|0,na|0,1048576,0)|0;Aa=Ed(Aa|0,C|0,21)|0;xa=C;Ka=Dd(Ma|0,La|0,Ka&2097151|0,0)|0;Ia=Dd(Ka|0,C|0,Ja|0,Ia|0)|0;Ga=Dd(Ia|0,C|0,Ha|0,Ga|0)|0;da=Dd(Ga|0,C|0,Fa|0,da|0)|0;o=Dd(da|0,C|0,M|0,o|0)|0;ha=Dd(o|0,C|0,R|0,ha|0)|0;ha=Dd(ha|0,C|0,Aa|0,xa|0)|0;R=C;xa=Hd(Aa|0,xa|0,21)|0;Aa=C;o=Dd(I|0,Q|0,1048576,0)|0;o=Ed(o|0,C|0,21)|0;M=C;qa=Dd(W|0,pa|0,qa&2097151|0,0)|0;x=Dd(qa|0,C|0,ka|0,x|0)|0;_=Dd(x|0,C|0,ma|0,_|0)|0;ta=Dd(_|0,C|0,ca|0,ta|0)|0;ta=Dd(ta|0,C|0,o|0,M|0)|0;ca=C;M=Hd(o|0,M|0,21)|0;M=Cd(I|0,Q|0,M|0,C|0)|0;Q=C;I=Dd(t|0,Ea|0,1048576,0)|0;I=Ed(I|0,C|0,21)|0;o=C;fa=Dd(ja|0,H|0,la|0,fa|0)|0;B=Dd(fa|0,C|0,k|0,B|0)|0;B=Dd(B|0,C|0,I|0,o|0)|0;k=C;o=Hd(I|0,o|0,21)|0;o=Cd(t|0,Ea|0,o|0,C|0)|0;Ea=C;t=Dd(j|0,za|0,1048576,0)|0;t=Ed(t|0,C|0,21)|0;I=C;L=Dd(t|0,I|0,L&2097151|0,0)|0;fa=C;I=Hd(t|0,I|0,21)|0;I=Cd(j|0,za|0,I|0,C|0)|0;za=C;j=Dd(ua|0,ia|0,1048576,0)|0;j=Gd(j|0,C|0,21)|0;t=C;la=Hd(j|0,t|0,21)|0;la=Cd(ua|0,ia|0,la|0,C|0)|0;ia=C;ua=Dd(ra|0,e|0,1048576,0)|0;ua=Ed(ua|0,C|0,21)|0;H=C;ja=Hd(ua|0,H|0,21)|0;ja=Cd(ra|0,e|0,ja|0,C|0)|0;e=C;ra=Dd(ha|0,R|0,1048576,0)|0;ra=Ed(ra|0,C|0,21)|0;_=C;Q=Dd(M|0,Q|0,ra|0,_|0)|0;M=C;_=Hd(ra|0,_|0,21)|0;_=Cd(ha|0,R|0,_|0,C|0)|0;R=C;ha=Dd(ta|0,ca|0,1048576,0)|0;ha=Ed(ha|0,C|0,21)|0;ra=C;Ea=Dd(ha|0,ra|0,o|0,Ea|0)|0;o=C;ra=Hd(ha|0,ra|0,21)|0;ra=Cd(ta|0,ca|0,ra|0,C|0)|0;ca=C;ta=Dd(B|0,k|0,1048576,0)|0;ta=Ed(ta|0,C|0,21)|0;ha=C;za=Dd(ta|0,ha|0,I|0,za|0)|0;I=C;ha=Hd(ta|0,ha|0,21)|0;ha=Cd(B|0,k|0,ha|0,C|0)|0;k=C;B=Od(L|0,fa|0,666643,0)|0;Da=Dd(B|0,C|0,Da&2097151|0,0)|0;B=C;ta=Od(L|0,fa|0,470296,0)|0;ta=Dd(Z|0,s|0,ta|0,C|0)|0;s=C;Z=Od(L|0,fa|0,654183,0)|0;Z=Dd(la|0,ia|0,Z|0,C|0)|0;ia=C;la=Od(L|0,fa|0,-997805,-1)|0;ma=C;x=Od(L|0,fa|0,136657,0)|0;x=Dd(ja|0,e|0,x|0,C|0)|0;e=C;fa=Od(L|0,fa|0,-683901,-1)|0;L=C;H=Dd(oa|0,na|0,ua|0,H|0)|0;Aa=Cd(H|0,C|0,xa|0,Aa|0)|0;L=Dd(Aa|0,C|0,fa|0,L|0)|0;fa=C;Aa=Od(za|0,I|0,666643,0)|0;D=Dd(Aa|0,C|0,D&2097151|0,0)|0;Aa=C;xa=Od(za|0,I|0,470296,0)|0;xa=Dd(Da|0,B|0,xa|0,C|0)|0;B=C;Da=Od(za|0,I|0,654183,0)|0;Da=Dd(ta|0,s|0,Da|0,C|0)|0;s=C;ta=Od(za|0,I|0,-997805,-1)|0;ta=Dd(Z|0,ia|0,ta|0,C|0)|0;ia=C;Z=Od(za|0,I|0,136657,0)|0;H=C;I=Od(za|0,I|0,-683901,-1)|0;I=Dd(x|0,e|0,I|0,C|0)|0;e=C;x=Od(ha|0,k|0,666643,0)|0;y=Dd(x|0,C|0,y&2097151|0,0)|0;x=C;za=Od(ha|0,k|0,470296,0)|0;za=Dd(D|0,Aa|0,za|0,C|0)|0;Aa=C;D=Od(ha|0,k|0,654183,0)|0;D=Dd(xa|0,B|0,D|0,C|0)|0;B=C;xa=Od(ha|0,k|0,-997805,-1)|0;xa=Dd(Da|0,s|0,xa|0,C|0)|0;s=C;Da=Od(ha|0,k|0,136657,0)|0;Da=Dd(ta|0,ia|0,Da|0,C|0)|0;ia=C;k=Od(ha|0,k|0,-683901,-1)|0;ha=C;t=Dd(ya|0,sa|0,j|0,t|0)|0;Ca=Cd(t|0,C|0,wa|0,Ca|0)|0;ma=Dd(Ca|0,C|0,la|0,ma|0)|0;H=Dd(ma|0,C|0,Z|0,H|0)|0;ha=Dd(H|0,C|0,k|0,ha|0)|0;k=C;H=Od(Ea|0,o|0,666643,0)|0;Z=C;ma=Od(Ea|0,o|0,470296,0)|0;la=C;Ca=Od(Ea|0,o|0,654183,0)|0;wa=C;t=Od(Ea|0,o|0,-997805,-1)|0;j=C;sa=Od(Ea|0,o|0,136657,0)|0;sa=Dd(xa|0,s|0,sa|0,C|0)|0;s=C;o=Od(Ea|0,o|0,-683901,-1)|0;o=Dd(Da|0,ia|0,o|0,C|0)|0;ia=C;Da=Od(ra|0,ca|0,666643,0)|0;Ea=C;xa=Od(ra|0,ca|0,470296,0)|0;ya=C;ta=Od(ra|0,ca|0,654183,0)|0;ua=C;na=Od(ra|0,ca|0,-997805,-1)|0;oa=C;ja=Od(ra|0,ca|0,136657,0)|0;ka=C;ca=Od(ra|0,ca|0,-683901,-1)|0;ca=Dd(sa|0,s|0,ca|0,C|0)|0;s=C;sa=Od(Q|0,M|0,666643,0)|0;va=Dd(sa|0,C|0,n|f|V&2031616|0,va|0)|0;V=C;f=Od(Q|0,M|0,470296,0)|0;n=C;sa=Od(Q|0,M|0,654183,0)|0;Ba=Dd(sa|0,C|0,Ba&2097151|0,0)|0;Z=Dd(Ba|0,C|0,H|0,Z|0)|0;ya=Dd(Z|0,C|0,xa|0,ya|0)|0;xa=C;Z=Od(Q|0,M|0,-997805,-1)|0;H=C;Ba=Od(Q|0,M|0,136657,0)|0;Ba=Dd(za|0,Aa|0,Ba|0,C|0)|0;wa=Dd(Ba|0,C|0,Ca|0,wa|0)|0;oa=Dd(wa|0,C|0,na|0,oa|0)|0;na=C;M=Od(Q|0,M|0,-683901,-1)|0;Q=C;wa=Dd(va|0,V|0,1048576,0)|0;wa=Ed(wa|0,C|0,21)|0;Ca=C;ga=Dd(f|0,n|0,ga&2097151|0,0)|0;Ea=Dd(ga|0,C|0,Da|0,Ea|0)|0;Ea=Dd(Ea|0,C|0,wa|0,Ca|0)|0;Da=C;Ca=Hd(wa|0,Ca|0,21)|0;Ca=Cd(va|0,V|0,Ca|0,C|0)|0;V=C;va=Dd(ya|0,xa|0,1048576,0)|0;va=Ed(va|0,C|0,21)|0;wa=C;H=Dd(y|0,x|0,Z|0,H|0)|0;la=Dd(H|0,C|0,ma|0,la|0)|0;ua=Dd(la|0,C|0,ta|0,ua|0)|0;ua=Dd(ua|0,C|0,va|0,wa|0)|0;ta=C;wa=Hd(va|0,wa|0,21)|0;va=C;la=Dd(oa|0,na|0,1048576,0)|0;la=Ed(la|0,C|0,21)|0;ma=C;Q=Dd(D|0,B|0,M|0,Q|0)|0;j=Dd(Q|0,C|0,t|0,j|0)|0;ka=Dd(j|0,C|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,la|0,ma|0)|0;ja=C;ma=Hd(la|0,ma|0,21)|0;la=C;j=Dd(ca|0,s|0,1048576,0)|0;j=Ed(j|0,C|0,21)|0;t=C;ia=Dd(o|0,ia|0,j|0,t|0)|0;o=C;t=Hd(j|0,t|0,21)|0;t=Cd(ca|0,s|0,t|0,C|0)|0;s=C;ca=Dd(ha|0,k|0,1048576,0)|0;ca=Ed(ca|0,C|0,21)|0;j=C;e=Dd(I|0,e|0,ca|0,j|0)|0;I=C;j=Hd(ca|0,j|0,21)|0;j=Cd(ha|0,k|0,j|0,C|0)|0;k=C;ha=Dd(L|0,fa|0,1048576,0)|0;ha=Ed(ha|0,C|0,21)|0;ca=C;R=Dd(_|0,R|0,ha|0,ca|0)|0;_=C;ca=Hd(ha|0,ca|0,21)|0;ca=Cd(L|0,fa|0,ca|0,C|0)|0;fa=C;L=Dd(Ea|0,Da|0,1048576,0)|0;L=Ed(L|0,C|0,21)|0;ha=C;Q=Hd(L|0,ha|0,21)|0;M=C;B=Dd(ua|0,ta|0,1048576,0)|0;B=Ed(B|0,C|0,21)|0;D=C;H=Hd(B|0,D|0,21)|0;Z=C;x=Dd(ka|0,ja|0,1048576,0)|0;x=Ed(x|0,C|0,21)|0;y=C;s=Dd(t|0,s|0,x|0,y|0)|0;t=C;y=Hd(x|0,y|0,21)|0;x=C;ga=Dd(ia|0,o|0,1048576,0)|0;ga=Ed(ga|0,C|0,21)|0;n=C;k=Dd(j|0,k|0,ga|0,n|0)|0;j=C;n=Hd(ga|0,n|0,21)|0;n=Cd(ia|0,o|0,n|0,C|0)|0;o=C;ia=Dd(e|0,I|0,1048576,0)|0;ia=Ed(ia|0,C|0,21)|0;ga=C;fa=Dd(ca|0,fa|0,ia|0,ga|0)|0;ca=C;ga=Hd(ia|0,ga|0,21)|0;ga=Cd(e|0,I|0,ga|0,C|0)|0;I=C;e=Dd(R|0,_|0,1048576,0)|0;e=Ed(e|0,C|0,21)|0;ia=C;f=Hd(e|0,ia|0,21)|0;f=Cd(R|0,_|0,f|0,C|0)|0;_=C;R=Od(e|0,ia|0,666643,0)|0;R=Dd(Ca|0,V|0,R|0,C|0)|0;V=C;Ca=Od(e|0,ia|0,470296,0)|0;Ba=C;Aa=Od(e|0,ia|0,654183,0)|0;za=C;sa=Od(e|0,ia|0,-997805,-1)|0;ra=C;qa=Od(e|0,ia|0,136657,0)|0;pa=C;ia=Od(e|0,ia|0,-683901,-1)|0;e=C;W=Ed(R|0,V|0,21)|0;da=C;Ba=Dd(Ea|0,Da|0,Ca|0,Ba|0)|0;Ba=Dd(Ba|0,C|0,W|0,da|0)|0;M=Cd(Ba|0,C|0,Q|0,M|0)|0;Q=C;da=Hd(W|0,da|0,21)|0;da=Cd(R|0,V|0,da|0,C|0)|0;V=C;R=Ed(M|0,Q|0,21)|0;W=C;xa=Dd(Aa|0,za|0,ya|0,xa|0)|0;va=Cd(xa|0,C|0,wa|0,va|0)|0;ha=Dd(va|0,C|0,L|0,ha|0)|0;ha=Dd(ha|0,C|0,R|0,W|0)|0;L=C;W=Hd(R|0,W|0,21)|0;W=Cd(M|0,Q|0,W|0,C|0)|0;Q=C;M=Ed(ha|0,L|0,21)|0;R=C;ra=Dd(ua|0,ta|0,sa|0,ra|0)|0;Z=Cd(ra|0,C|0,H|0,Z|0)|0;Z=Dd(Z|0,C|0,M|0,R|0)|0;H=C;R=Hd(M|0,R|0,21)|0;R=Cd(ha|0,L|0,R|0,C|0)|0;L=C;ha=Ed(Z|0,H|0,21)|0;M=C;na=Dd(qa|0,pa|0,oa|0,na|0)|0;la=Cd(na|0,C|0,ma|0,la|0)|0;D=Dd(la|0,C|0,B|0,D|0)|0;D=Dd(D|0,C|0,ha|0,M|0)|0;B=C;M=Hd(ha|0,M|0,21)|0;M=Cd(Z|0,H|0,M|0,C|0)|0;H=C;Z=Ed(D|0,B|0,21)|0;ha=C;e=Dd(ka|0,ja|0,ia|0,e|0)|0;x=Cd(e|0,C|0,y|0,x|0)|0;x=Dd(x|0,C|0,Z|0,ha|0)|0;y=C;ha=Hd(Z|0,ha|0,21)|0;ha=Cd(D|0,B|0,ha|0,C|0)|0;B=C;D=Ed(x|0,y|0,21)|0;Z=C;t=Dd(s|0,t|0,D|0,Z|0)|0;s=C;Z=Hd(D|0,Z|0,21)|0;Z=Cd(x|0,y|0,Z|0,C|0)|0;y=C;x=Ed(t|0,s|0,21)|0;D=C;o=Dd(x|0,D|0,n|0,o|0)|0;n=C;D=Hd(x|0,D|0,21)|0;D=Cd(t|0,s|0,D|0,C|0)|0;s=C;t=Ed(o|0,n|0,21)|0;x=C;j=Dd(k|0,j|0,t|0,x|0)|0;k=C;x=Hd(t|0,x|0,21)|0;x=Cd(o|0,n|0,x|0,C|0)|0;n=C;o=Ed(j|0,k|0,21)|0;t=C;I=Dd(o|0,t|0,ga|0,I|0)|0;ga=C;t=Hd(o|0,t|0,21)|0;t=Cd(j|0,k|0,t|0,C|0)|0;k=C;j=Ed(I|0,ga|0,21)|0;o=C;ca=Dd(fa|0,ca|0,j|0,o|0)|0;fa=C;o=Hd(j|0,o|0,21)|0;o=Cd(I|0,ga|0,o|0,C|0)|0;ga=C;I=Ed(ca|0,fa|0,21)|0;j=C;_=Dd(I|0,j|0,f|0,_|0)|0;f=C;j=Hd(I|0,j|0,21)|0;j=Cd(ca|0,fa|0,j|0,C|0)|0;fa=C;ca=Ed(_|0,f|0,21)|0;I=C;e=Hd(ca|0,I|0,21)|0;e=Cd(_|0,f|0,e|0,C|0)|0;f=C;_=Od(ca|0,I|0,666643,0)|0;V=Dd(_|0,C|0,da|0,V|0)|0;da=C;_=Od(ca|0,I|0,470296,0)|0;_=Dd(W|0,Q|0,_|0,C|0)|0;Q=C;W=Od(ca|0,I|0,654183,0)|0;W=Dd(R|0,L|0,W|0,C|0)|0;L=C;R=Od(ca|0,I|0,-997805,-1)|0;R=Dd(M|0,H|0,R|0,C|0)|0;H=C;M=Od(ca|0,I|0,136657,0)|0;M=Dd(ha|0,B|0,M|0,C|0)|0;B=C;I=Od(ca|0,I|0,-683901,-1)|0;I=Dd(Z|0,y|0,I|0,C|0)|0;y=C;Z=Ed(V|0,da|0,21)|0;ca=C;Q=Dd(_|0,Q|0,Z|0,ca|0)|0;_=C;ca=Hd(Z|0,ca|0,21)|0;ca=Cd(V|0,da|0,ca|0,C|0)|0;da=C;V=Ed(Q|0,_|0,21)|0;Z=C;L=Dd(W|0,L|0,V|0,Z|0)|0;W=C;Z=Hd(V|0,Z|0,21)|0;Z=Cd(Q|0,_|0,Z|0,C|0)|0;_=C;Q=Ed(L|0,W|0,21)|0;V=C;H=Dd(R|0,H|0,Q|0,V|0)|0;R=C;V=Hd(Q|0,V|0,21)|0;V=Cd(L|0,W|0,V|0,C|0)|0;W=C;L=Ed(H|0,R|0,21)|0;Q=C;B=Dd(M|0,B|0,L|0,Q|0)|0;M=C;Q=Hd(L|0,Q|0,21)|0;Q=Cd(H|0,R|0,Q|0,C|0)|0;R=C;H=Ed(B|0,M|0,21)|0;L=C;y=Dd(I|0,y|0,H|0,L|0)|0;I=C;L=Hd(H|0,L|0,21)|0;L=Cd(B|0,M|0,L|0,C|0)|0;M=C;B=Ed(y|0,I|0,21)|0;H=C;s=Dd(B|0,H|0,D|0,s|0)|0;D=C;H=Hd(B|0,H|0,21)|0;H=Cd(y|0,I|0,H|0,C|0)|0;I=C;y=Ed(s|0,D|0,21)|0;B=C;n=Dd(y|0,B|0,x|0,n|0)|0;x=C;B=Hd(y|0,B|0,21)|0;B=Cd(s|0,D|0,B|0,C|0)|0;D=C;s=Ed(n|0,x|0,21)|0;y=C;k=Dd(s|0,y|0,t|0,k|0)|0;t=C;y=Hd(s|0,y|0,21)|0;y=Cd(n|0,x|0,y|0,C|0)|0;x=C;n=Ed(k|0,t|0,21)|0;s=C;ga=Dd(n|0,s|0,o|0,ga|0)|0;o=C;s=Hd(n|0,s|0,21)|0;s=Cd(k|0,t|0,s|0,C|0)|0;t=C;k=Ed(ga|0,o|0,21)|0;n=C;fa=Dd(k|0,n|0,j|0,fa|0)|0;j=C;n=Hd(k|0,n|0,21)|0;n=Cd(ga|0,o|0,n|0,C|0)|0;o=C;ga=Ed(fa|0,j|0,21)|0;k=C;f=Dd(ga|0,k|0,e|0,f|0)|0;e=C;k=Hd(ga|0,k|0,21)|0;k=Cd(fa|0,j|0,k|0,C|0)|0;j=C;a[b>>0]=ca;b=Gd(ca|0,da|0,8)|0;a[ea>>0]=b;b=Gd(ca|0,da|0,16)|0;da=C;ca=Hd(Z|0,_|0,5)|0;a[ba>>0]=ca|b;b=Gd(Z|0,_|0,3)|0;a[aa>>0]=b;b=Gd(Z|0,_|0,11)|0;a[$>>0]=b;b=Gd(Z|0,_|0,19)|0;_=C;Z=Hd(V|0,W|0,2)|0;a[Y>>0]=Z|b;b=Gd(V|0,W|0,6)|0;a[X>>0]=b;b=Gd(V|0,W|0,14)|0;W=C;V=Hd(Q|0,R|0,7)|0;a[U>>0]=V|b;b=Gd(Q|0,R|0,1)|0;a[T>>0]=b;b=Gd(Q|0,R|0,9)|0;a[S>>0]=b;b=Gd(Q|0,R|0,17)|0;R=C;Q=Hd(L|0,M|0,4)|0;a[P>>0]=Q|b;b=Gd(L|0,M|0,4)|0;a[O>>0]=b;b=Gd(L|0,M|0,12)|0;a[N>>0]=b;b=Gd(L|0,M|0,20)|0;M=C;L=Hd(H|0,I|0,1)|0;a[K>>0]=L|b;b=Gd(H|0,I|0,7)|0;a[J>>0]=b;b=Gd(H|0,I|0,15)|0;I=C;H=Hd(B|0,D|0,6)|0;a[G>>0]=H|b;b=Gd(B|0,D|0,2)|0;a[F>>0]=b;b=Gd(B|0,D|0,10)|0;a[E>>0]=b;b=Gd(B|0,D|0,18)|0;D=C;B=Hd(y|0,x|0,3)|0;a[A>>0]=B|b;b=Gd(y|0,x|0,5)|0;a[z>>0]=b;b=Gd(y|0,x|0,13)|0;a[w>>0]=b;a[v>>0]=s;b=Gd(s|0,t|0,8)|0;a[u>>0]=b;b=Gd(s|0,t|0,16)|0;t=C;s=Hd(n|0,o|0,5)|0;a[r>>0]=s|b;b=Gd(n|0,o|0,3)|0;a[q>>0]=b;b=Gd(n|0,o|0,11)|0;a[p>>0]=b;b=Gd(n|0,o|0,19)|0;o=C;n=Hd(k|0,j|0,2)|0;a[m>>0]=n|b;b=Gd(k|0,j|0,6)|0;a[l>>0]=b;j=Gd(k|0,j|0,14)|0;k=C;b=Hd(f|0,e|0,7)|0;a[i>>0]=j|b;b=Gd(f|0,e|0,1)|0;a[h>>0]=b;b=Gd(f|0,e|0,9)|0;a[g>>0]=b;b=Gd(f|0,e|0,17)|0;a[c>>0]=b;return}function Xc(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0;z=i;p=i=i+63&-64;i=i+896|0;v=p+208|0;u=p+656|0;w=p+616|0;x=p+576|0;s=p;q=p+824|0;t=p+760|0;r=p+696|0;p=p+416|0;k=v+64|0;y=v;A=8;B=y+64|0;do{c[y>>2]=c[A>>2];y=y+4|0;A=A+4|0}while((y|0)<(B|0));y=v+72|0;c[y>>2]=256;c[y+4>>2]=0;y=k;c[y>>2]=0;c[y+4>>2]=0;y=v+80|0;A=j;B=y+32|0;do{a[y>>0]=a[A>>0]|0;y=y+1|0;A=A+1|0}while((y|0)<(B|0));Gb(v,q);a[q>>0]=(d[q>>0]|0)&248;k=q+31|0;a[k>>0]=(d[k>>0]|0)&63|64;l=s+64|0;y=l;c[y>>2]=0;c[y+4>>2]=0;y=s;A=8;B=y+64|0;do{c[y>>2]=c[A>>2];y=y+4|0;A=A+4|0}while((y|0)<(B|0));m=s+72|0;n=m;c[n>>2]=256;c[n+4>>2]=0;n=l;c[n>>2]=0;c[n+4>>2]=0;n=s+80|0;y=n;A=q+32|0;B=y+32|0;do{a[y>>0]=a[A>>0]|0;y=y+1|0;A=A+1|0}while((y|0)<(B|0));Fb(s,f,g,h);Gb(s,t);o=b+32|0;Jd(o|0,j+32|0,32)|0;Wc(t);Rc(p,t);Ic(u,p+80|0);Jc(w,p,u);Jc(x,p+40|0,u);Lc(b,x);Lc(v,w);y=b+31|0;a[y>>0]=(d[y>>0]|0)^(d[v>>0]|0)<<7;y=l;c[y>>2]=0;c[y+4>>2]=0;y=s;A=8;B=y+64|0;do{c[y>>2]=c[A>>2];y=y+4|0;A=A+4|0}while((y|0)<(B|0));y=m;c[y>>2]=512;c[y+4>>2]=0;y=l;c[y>>2]=0;c[y+4>>2]=0;y=n;A=b;B=y+64|0;do{a[y>>0]=a[A>>0]|0;y=y+1|0;A=A+1|0}while((y|0)<(B|0));Fb(s,f,g,h);Gb(s,r);Wc(r);J=a[r+2>>0]|0;Ta=d[r>>0]|0;xb=Hd(d[r+1>>0]|0|0,0,8)|0;qb=C;J=J&255;kb=Hd(J|0,0,16)|0;kb=xb|Ta|kb&2031616;Ta=Hd(d[r+3>>0]|0|0,0,8)|0;xb=C;F=Hd(d[r+4>>0]|0|0,0,16)|0;xb=xb|C;ub=d[r+5>>0]|0;db=Hd(ub|0,0,24)|0;xb=Gd(Ta|J|F|db|0,xb|C|0,5)|0;xb=xb&2097151;db=a[r+7>>0]|0;F=Hd(d[r+6>>0]|0|0,0,8)|0;J=C;db=db&255;Ta=Hd(db|0,0,16)|0;J=Gd(F|ub|Ta|0,J|C|0,2)|0;J=J&2097151;Ta=Hd(d[r+8>>0]|0|0,0,8)|0;ub=C;F=Hd(d[r+9>>0]|0|0,0,16)|0;ub=ub|C;v=d[r+10>>0]|0;Sa=Hd(v|0,0,24)|0;ub=Gd(Ta|db|F|Sa|0,ub|C|0,7)|0;ub=ub&2097151;Sa=Hd(d[r+11>>0]|0|0,0,8)|0;F=C;db=Hd(d[r+12>>0]|0|0,0,16)|0;F=F|C;Ta=d[r+13>>0]|0;y=Hd(Ta|0,0,24)|0;F=Gd(Sa|v|db|y|0,F|C|0,4)|0;F=F&2097151;y=a[r+15>>0]|0;db=Hd(d[r+14>>0]|0|0,0,8)|0;v=C;y=y&255;Sa=Hd(y|0,0,16)|0;v=Gd(db|Ta|Sa|0,v|C|0,1)|0;v=v&2097151;Sa=Hd(d[r+16>>0]|0|0,0,8)|0;Ta=C;db=Hd(d[r+17>>0]|0|0,0,16)|0;Ta=Ta|C;Bc=d[r+18>>0]|0;ja=Hd(Bc|0,0,24)|0;Ta=Gd(Sa|y|db|ja|0,Ta|C|0,6)|0;Ta=Ta&2097151;ja=a[r+20>>0]|0;db=Hd(d[r+19>>0]|0|0,0,8)|0;y=C;ja=Hd(ja&255|0,0,16)|0;y=Gd(db|Bc|ja|0,y|C|0,3)|0;ja=C;Bc=a[r+23>>0]|0;db=d[r+21>>0]|0;Sa=Hd(d[r+22>>0]|0|0,0,8)|0;sb=C;Bc=Bc&255;Qa=Hd(Bc|0,0,16)|0;Qa=Sa|db|Qa&2031616;db=Hd(d[r+24>>0]|0|0,0,8)|0;Sa=C;m=Hd(d[r+25>>0]|0|0,0,16)|0;Sa=Sa|C;p=d[r+26>>0]|0;s=Hd(p|0,0,24)|0;Sa=Gd(db|Bc|m|s|0,Sa|C|0,5)|0;Sa=Sa&2097151;s=a[r+28>>0]|0;m=Hd(d[r+27>>0]|0|0,0,8)|0;Bc=C;s=s&255;db=Hd(s|0,0,16)|0;Bc=Gd(m|p|db|0,Bc|C|0,2)|0;Bc=Bc&2097151;db=Hd(d[r+29>>0]|0|0,0,8)|0;p=C;m=Hd(d[r+30>>0]|0|0,0,16)|0;p=p|C;Ka=Hd(d[r+31>>0]|0|0,0,24)|0;p=Gd(db|s|m|Ka|0,p|C|0,7)|0;Ka=C;m=a[q+2>>0]|0;s=d[q>>0]|0;db=Hd(d[q+1>>0]|0|0,0,8)|0;ia=C;m=m&255;ha=Hd(m|0,0,16)|0;ha=db|s|ha&2031616;s=Hd(d[q+3>>0]|0|0,0,8)|0;db=C;la=Hd(d[q+4>>0]|0|0,0,16)|0;db=db|C;h=d[q+5>>0]|0;yc=Hd(h|0,0,24)|0;db=Gd(s|m|la|yc|0,db|C|0,5)|0;db=db&2097151;yc=a[q+7>>0]|0;la=Hd(d[q+6>>0]|0|0,0,8)|0;m=C;yc=yc&255;s=Hd(yc|0,0,16)|0;m=Gd(la|h|s|0,m|C|0,2)|0;m=m&2097151;s=Hd(d[q+8>>0]|0|0,0,8)|0;h=C;la=Hd(d[q+9>>0]|0|0,0,16)|0;h=h|C;_a=d[q+10>>0]|0;Pa=Hd(_a|0,0,24)|0;h=Gd(s|yc|la|Pa|0,h|C|0,7)|0;h=h&2097151;Pa=Hd(d[q+11>>0]|0|0,0,8)|0;la=C;yc=Hd(d[q+12>>0]|0|0,0,16)|0;la=la|C;s=d[q+13>>0]|0;Ec=Hd(s|0,0,24)|0;la=Gd(Pa|_a|yc|Ec|0,la|C|0,4)|0;la=la&2097151;Ec=a[q+15>>0]|0;yc=Hd(d[q+14>>0]|0|0,0,8)|0;_a=C;Ec=Ec&255;Pa=Hd(Ec|0,0,16)|0;_a=Gd(yc|s|Pa|0,_a|C|0,1)|0;_a=_a&2097151;Pa=Hd(d[q+16>>0]|0|0,0,8)|0;s=C;yc=Hd(d[q+17>>0]|0|0,0,16)|0;s=s|C;R=d[q+18>>0]|0;Bb=Hd(R|0,0,24)|0;s=Gd(Pa|Ec|yc|Bb|0,s|C|0,6)|0;s=s&2097151;Bb=a[q+20>>0]|0;yc=Hd(d[q+19>>0]|0|0,0,8)|0;Ec=C;Bb=Hd(Bb&255|0,0,16)|0;Ec=Gd(yc|R|Bb|0,Ec|C|0,3)|0;Bb=C;R=a[q+23>>0]|0;yc=d[q+21>>0]|0;Pa=Hd(d[q+22>>0]|0|0,0,8)|0;Da=C;R=R&255;ua=Hd(R|0,0,16)|0;ua=Pa|yc|ua&2031616;yc=Hd(d[q+24>>0]|0|0,0,8)|0;Pa=C;Ma=Hd(d[q+25>>0]|0|0,0,16)|0;Pa=Pa|C;D=d[q+26>>0]|0;zc=Hd(D|0,0,24)|0;Pa=Gd(yc|R|Ma|zc|0,Pa|C|0,5)|0;Pa=Pa&2097151;zc=a[q+28>>0]|0;Ma=Hd(d[q+27>>0]|0|0,0,8)|0;R=C;zc=zc&255;yc=Hd(zc|0,0,16)|0;R=Gd(Ma|D|yc|0,R|C|0,2)|0;R=R&2097151;yc=Hd(d[q+29>>0]|0|0,0,8)|0;D=C;Ma=Hd(d[q+30>>0]|0|0,0,16)|0;D=D|C;Ia=Hd(d[k>>0]|0|0,0,24)|0;D=Gd(yc|zc|Ma|Ia|0,D|C|0,7)|0;Ia=C;Ma=a[t+2>>0]|0;zc=d[t>>0]|0;yc=Hd(d[t+1>>0]|0|0,0,8)|0;ba=C;Ma=Ma&255;Ac=Hd(Ma|0,0,16)|0;Xa=Hd(d[t+3>>0]|0|0,0,8)|0;Ea=C;Ga=Hd(d[t+4>>0]|0|0,0,16)|0;Ea=Ea|C;pb=d[t+5>>0]|0;za=Hd(pb|0,0,24)|0;Ea=Gd(Xa|Ma|Ga|za|0,Ea|C|0,5)|0;za=a[t+7>>0]|0;Ga=Hd(d[t+6>>0]|0|0,0,8)|0;Ma=C;za=za&255;Xa=Hd(za|0,0,16)|0;Ma=Gd(Ga|pb|Xa|0,Ma|C|0,2)|0;Xa=Hd(d[t+8>>0]|0|0,0,8)|0;pb=C;Ga=Hd(d[t+9>>0]|0|0,0,16)|0;pb=pb|C;X=d[t+10>>0]|0;O=Hd(X|0,0,24)|0;pb=Gd(Xa|za|Ga|O|0,pb|C|0,7)|0;O=Hd(d[t+11>>0]|0|0,0,8)|0;Ga=C;za=Hd(d[t+12>>0]|0|0,0,16)|0;Ga=Ga|C;Xa=d[t+13>>0]|0;H=Hd(Xa|0,0,24)|0;Ga=Gd(O|X|za|H|0,Ga|C|0,4)|0;H=a[t+15>>0]|0;za=Hd(d[t+14>>0]|0|0,0,8)|0;X=C;H=H&255;O=Hd(H|0,0,16)|0;X=Gd(za|Xa|O|0,X|C|0,1)|0;O=Hd(d[t+16>>0]|0|0,0,8)|0;Xa=C;za=Hd(d[t+17>>0]|0|0,0,16)|0;Xa=Xa|C;U=d[t+18>>0]|0;w=Hd(U|0,0,24)|0;Xa=Gd(O|H|za|w|0,Xa|C|0,6)|0;w=a[t+20>>0]|0;za=Hd(d[t+19>>0]|0|0,0,8)|0;H=C;w=Hd(w&255|0,0,16)|0;H=Gd(za|U|w|0,H|C|0,3)|0;w=C;U=a[t+23>>0]|0;za=d[t+21>>0]|0;O=Hd(d[t+22>>0]|0|0,0,8)|0;da=C;U=U&255;ea=Hd(U|0,0,16)|0;Ba=Hd(d[t+24>>0]|0|0,0,8)|0;N=C;Ha=Hd(d[t+25>>0]|0|0,0,16)|0;N=N|C;A=d[t+26>>0]|0;ta=Hd(A|0,0,24)|0;N=Gd(Ba|U|Ha|ta|0,N|C|0,5)|0;ta=a[t+28>>0]|0;Ha=Hd(d[t+27>>0]|0|0,0,8)|0;U=C;ta=ta&255;Ba=Hd(ta|0,0,16)|0;U=Gd(Ha|A|Ba|0,U|C|0,2)|0;Ba=Hd(d[t+29>>0]|0|0,0,8)|0;A=C;Ha=Hd(d[t+30>>0]|0|0,0,16)|0;A=A|C;j=Hd(d[t+31>>0]|0|0,0,24)|0;A=Gd(Ba|ta|Ha|j|0,A|C|0,7)|0;j=C;Ha=Od(ha|0,ia|0,kb|0,qb|0)|0;Ha=Dd(yc|zc|Ac&2031616|0,ba|0,Ha|0,C|0)|0;ba=C;Ac=Od(db|0,0,kb|0,qb|0)|0;zc=C;yc=Od(ha|0,ia|0,xb|0,0)|0;ta=C;Ba=Od(m|0,0,kb|0,qb|0)|0;La=C;Ca=Od(db|0,0,xb|0,0)|0;tc=C;pa=Od(ha|0,ia|0,J|0,0)|0;pa=Dd(Ca|0,tc|0,pa|0,C|0)|0;La=Dd(pa|0,C|0,Ba|0,La|0)|0;Ma=Dd(La|0,C|0,Ma&2097151|0,0)|0;La=C;Ba=Od(h|0,0,kb|0,qb|0)|0;pa=C;tc=Od(m|0,0,xb|0,0)|0;Ca=C;xc=Od(db|0,0,J|0,0)|0;wc=C;vc=Od(ha|0,ia|0,ub|0,0)|0;uc=C;Oa=Od(la|0,0,kb|0,qb|0)|0;Fa=C;kc=Od(h|0,0,xb|0,0)|0;Y=C;mc=Od(m|0,0,J|0,0)|0;Na=C;nc=Od(db|0,0,ub|0,0)|0;oc=C;lc=Od(ha|0,ia|0,F|0,0)|0;lc=Dd(nc|0,oc|0,lc|0,C|0)|0;Na=Dd(lc|0,C|0,mc|0,Na|0)|0;Y=Dd(Na|0,C|0,kc|0,Y|0)|0;Fa=Dd(Y|0,C|0,Oa|0,Fa|0)|0;Ga=Dd(Fa|0,C|0,Ga&2097151|0,0)|0;Fa=C;Oa=Od(_a|0,0,kb|0,qb|0)|0;Y=C;kc=Od(la|0,0,xb|0,0)|0;Na=C;mc=Od(h|0,0,J|0,0)|0;lc=C;oc=Od(m|0,0,ub|0,0)|0;nc=C;sc=Od(db|0,0,F|0,0)|0;rc=C;qc=Od(ha|0,ia|0,v|0,0)|0;pc=C;ca=Od(s|0,0,kb|0,qb|0)|0;Ya=C;Zb=Od(_a|0,0,xb|0,0)|0;ka=C;$b=Od(la|0,0,J|0,0)|0;Yb=C;bc=Od(h|0,0,ub|0,0)|0;_b=C;dc=Od(m|0,0,F|0,0)|0;ac=C;ec=Od(db|0,0,v|0,0)|0;fc=C;cc=Od(ha|0,ia|0,Ta|0,0)|0;cc=Dd(ec|0,fc|0,cc|0,C|0)|0;ac=Dd(cc|0,C|0,dc|0,ac|0)|0;_b=Dd(ac|0,C|0,bc|0,_b|0)|0;Yb=Dd(_b|0,C|0,$b|0,Yb|0)|0;ka=Dd(Yb|0,C|0,Zb|0,ka|0)|0;Ya=Dd(ka|0,C|0,ca|0,Ya|0)|0;Xa=Dd(Ya|0,C|0,Xa&2097151|0,0)|0;Ya=C;ca=Od(Ec|0,Bb|0,kb|0,qb|0)|0;ka=C;Zb=Od(s|0,0,xb|0,0)|0;Yb=C;$b=Od(_a|0,0,J|0,0)|0;_b=C;bc=Od(la|0,0,ub|0,0)|0;ac=C;dc=Od(h|0,0,F|0,0)|0;cc=C;fc=Od(m|0,0,v|0,0)|0;ec=C;jc=Od(db|0,0,Ta|0,0)|0;ic=C;hc=Od(ha|0,ia|0,y|0,ja|0)|0;gc=C;Aa=Od(ua|0,Da|0,kb|0,qb|0)|0;Hb=C;Ib=Od(Ec|0,Bb|0,xb|0,0)|0;Jb=C;Kb=Od(s|0,0,J|0,0)|0;Lb=C;Mb=Od(_a|0,0,ub|0,0)|0;Nb=C;Ob=Od(la|0,0,F|0,0)|0;Pb=C;Qb=Od(h|0,0,v|0,0)|0;Rb=C;Sb=Od(m|0,0,Ta|0,0)|0;Tb=C;Vb=Od(db|0,0,y|0,ja|0)|0;Wb=C;Xb=Od(ha|0,ia|0,Qa|0,sb|0)|0;Xb=Dd(Vb|0,Wb|0,Xb|0,C|0)|0;Tb=Dd(Xb|0,C|0,Sb|0,Tb|0)|0;Rb=Dd(Tb|0,C|0,Qb|0,Rb|0)|0;Pb=Dd(Rb|0,C|0,Ob|0,Pb|0)|0;Nb=Dd(Pb|0,C|0,Mb|0,Nb|0)|0;Lb=Dd(Nb|0,C|0,Kb|0,Lb|0)|0;Jb=Dd(Lb|0,C|0,Ib|0,Jb|0)|0;Hb=Dd(Jb|0,C|0,Aa|0,Hb|0)|0;da=Dd(Hb|0,C|0,O|za|ea&2031616|0,da|0)|0;ea=C;za=Od(Pa|0,0,kb|0,qb|0)|0;O=C;Hb=Od(ua|0,Da|0,xb|0,0)|0;Aa=C;Jb=Od(Ec|0,Bb|0,J|0,0)|0;Ib=C;Lb=Od(s|0,0,ub|0,0)|0;Kb=C;Nb=Od(_a|0,0,F|0,0)|0;Mb=C;Pb=Od(la|0,0,v|0,0)|0;Ob=C;Rb=Od(h|0,0,Ta|0,0)|0;Qb=C;Tb=Od(m|0,0,y|0,ja|0)|0;Sb=C;Xb=Od(db|0,0,Qa|0,sb|0)|0;Wb=C;Vb=Od(ha|0,ia|0,Sa|0,0)|0;Ub=C;V=Od(R|0,0,kb|0,qb|0)|0;T=C;hb=Od(Pa|0,0,xb|0,0)|0;W=C;I=Od(ua|0,Da|0,J|0,0)|0;ib=C;vb=Od(Ec|0,Bb|0,ub|0,0)|0;E=C;Q=Od(s|0,0,F|0,0)|0;wb=C;Va=Od(_a|0,0,v|0,0)|0;K=C;nb=Od(la|0,0,Ta|0,0)|0;Wa=C;$=Od(h|0,0,y|0,ja|0)|0;ob=C;bb=Od(m|0,0,Qa|0,sb|0)|0;aa=C;Db=Od(db|0,0,Sa|0,0)|0;Eb=C;cb=Od(ha|0,ia|0,Bc|0,0)|0;cb=Dd(Db|0,Eb|0,cb|0,C|0)|0;aa=Dd(cb|0,C|0,bb|0,aa|0)|0;ob=Dd(aa|0,C|0,$|0,ob|0)|0;Wa=Dd(ob|0,C|0,nb|0,Wa|0)|0;K=Dd(Wa|0,C|0,Va|0,K|0)|0;wb=Dd(K|0,C|0,Q|0,wb|0)|0;E=Dd(wb|0,C|0,vb|0,E|0)|0;ib=Dd(E|0,C|0,I|0,ib|0)|0;W=Dd(ib|0,C|0,hb|0,W|0)|0;T=Dd(W|0,C|0,V|0,T|0)|0;U=Dd(T|0,C|0,U&2097151|0,0)|0;T=C;qb=Od(D|0,Ia|0,kb|0,qb|0)|0;kb=C;V=Od(R|0,0,xb|0,0)|0;W=C;hb=Od(Pa|0,0,J|0,0)|0;ib=C;I=Od(ua|0,Da|0,ub|0,0)|0;E=C;vb=Od(Ec|0,Bb|0,F|0,0)|0;wb=C;Q=Od(s|0,0,v|0,0)|0;K=C;Va=Od(_a|0,0,Ta|0,0)|0;Wa=C;nb=Od(la|0,0,y|0,ja|0)|0;ob=C;$=Od(h|0,0,Qa|0,sb|0)|0;aa=C;bb=Od(m|0,0,Sa|0,0)|0;cb=C;Eb=Od(db|0,0,Bc|0,0)|0;Db=C;ia=Od(ha|0,ia|0,p|0,Ka|0)|0;ha=C;xb=Od(D|0,Ia|0,xb|0,0)|0;yb=C;lb=Od(R|0,0,J|0,0)|0;G=C;ma=Od(Pa|0,0,ub|0,0)|0;mb=C;oa=Od(ua|0,Da|0,F|0,0)|0;ga=C;zb=Od(Ec|0,Bb|0,v|0,0)|0;rb=C;sa=Od(s|0,0,Ta|0,0)|0;Ab=C;xa=Od(_a|0,0,y|0,ja|0)|0;ra=C;Ua=Od(la|0,0,Qa|0,sb|0)|0;wa=C;eb=Od(h|0,0,Sa|0,0)|0;na=C;tb=Od(m|0,0,Bc|0,0)|0;l=C;db=Od(db|0,0,p|0,Ka|0)|0;db=Dd(tb|0,l|0,db|0,C|0)|0;na=Dd(db|0,C|0,eb|0,na|0)|0;wa=Dd(na|0,C|0,Ua|0,wa|0)|0;ra=Dd(wa|0,C|0,xa|0,ra|0)|0;Ab=Dd(ra|0,C|0,sa|0,Ab|0)|0;rb=Dd(Ab|0,C|0,zb|0,rb|0)|0;ga=Dd(rb|0,C|0,oa|0,ga|0)|0;mb=Dd(ga|0,C|0,ma|0,mb|0)|0;G=Dd(mb|0,C|0,lb|0,G|0)|0;yb=Dd(G|0,C|0,xb|0,yb|0)|0;xb=C;J=Od(D|0,Ia|0,J|0,0)|0;G=C;lb=Od(R|0,0,ub|0,0)|0;mb=C;ma=Od(Pa|0,0,F|0,0)|0;ga=C;oa=Od(ua|0,Da|0,v|0,0)|0;rb=C;zb=Od(Ec|0,Bb|0,Ta|0,0)|0;Ab=C;sa=Od(s|0,0,y|0,ja|0)|0;ra=C;xa=Od(_a|0,0,Qa|0,sb|0)|0;wa=C;Ua=Od(la|0,0,Sa|0,0)|0;na=C;eb=Od(h|0,0,Bc|0,0)|0;db=C;m=Od(m|0,0,p|0,Ka|0)|0;l=C;ub=Od(D|0,Ia|0,ub|0,0)|0;tb=C;fb=Od(R|0,0,F|0,0)|0;g=C;L=Od(Pa|0,0,v|0,0)|0;gb=C;r=Od(ua|0,Da|0,Ta|0,0)|0;n=C;fa=Od(Ec|0,Bb|0,y|0,ja|0)|0;x=C;qa=Od(s|0,0,Qa|0,sb|0)|0;k=C;va=Od(_a|0,0,Sa|0,0)|0;M=C;Cb=Od(la|0,0,Bc|0,0)|0;f=C;h=Od(h|0,0,p|0,Ka|0)|0;h=Dd(Cb|0,f|0,h|0,C|0)|0;M=Dd(h|0,C|0,va|0,M|0)|0;k=Dd(M|0,C|0,qa|0,k|0)|0;x=Dd(k|0,C|0,fa|0,x|0)|0;n=Dd(x|0,C|0,r|0,n|0)|0;gb=Dd(n|0,C|0,L|0,gb|0)|0;g=Dd(gb|0,C|0,fb|0,g|0)|0;tb=Dd(g|0,C|0,ub|0,tb|0)|0;ub=C;F=Od(D|0,Ia|0,F|0,0)|0;g=C;fb=Od(R|0,0,v|0,0)|0;gb=C;L=Od(Pa|0,0,Ta|0,0)|0;n=C;r=Od(ua|0,Da|0,y|0,ja|0)|0;x=C;fa=Od(Ec|0,Bb|0,Qa|0,sb|0)|0;k=C;qa=Od(s|0,0,Sa|0,0)|0;M=C;va=Od(_a|0,0,Bc|0,0)|0;h=C;la=Od(la|0,0,p|0,Ka|0)|0;f=C;v=Od(D|0,Ia|0,v|0,0)|0;Cb=C;B=Od(R|0,0,Ta|0,0)|0;S=C;_=Od(Pa|0,0,y|0,ja|0)|0;Ra=C;ab=Od(ua|0,Da|0,Qa|0,sb|0)|0;Z=C;Za=Od(Ec|0,Bb|0,Sa|0,0)|0;$a=C;P=Od(s|0,0,Bc|0,0)|0;u=C;_a=Od(_a|0,0,p|0,Ka|0)|0;_a=Dd(P|0,u|0,_a|0,C|0)|0;$a=Dd(_a|0,C|0,Za|0,$a|0)|0;Z=Dd($a|0,C|0,ab|0,Z|0)|0;Ra=Dd(Z|0,C|0,_|0,Ra|0)|0;S=Dd(Ra|0,C|0,B|0,S|0)|0;Cb=Dd(S|0,C|0,v|0,Cb|0)|0;v=C;Ta=Od(D|0,Ia|0,Ta|0,0)|0;S=C;B=Od(R|0,0,y|0,ja|0)|0;Ra=C;_=Od(Pa|0,0,Qa|0,sb|0)|0;Z=C;ab=Od(ua|0,Da|0,Sa|0,0)|0;$a=C;Za=Od(Ec|0,Bb|0,Bc|0,0)|0;_a=C;s=Od(s|0,0,p|0,Ka|0)|0;u=C;ja=Od(D|0,Ia|0,y|0,ja|0)|0;y=C;P=Od(R|0,0,Qa|0,sb|0)|0;Ja=C;ya=Od(Pa|0,0,Sa|0,0)|0;jb=C;Cc=Od(ua|0,Da|0,Bc|0,0)|0;Dc=C;Bb=Od(Ec|0,Bb|0,p|0,Ka|0)|0;Bb=Dd(Cc|0,Dc|0,Bb|0,C|0)|0;jb=Dd(Bb|0,C|0,ya|0,jb|0)|0;Ja=Dd(jb|0,C|0,P|0,Ja|0)|0;y=Dd(Ja|0,C|0,ja|0,y|0)|0;ja=C;sb=Od(D|0,Ia|0,Qa|0,sb|0)|0;Qa=C;Ja=Od(R|0,0,Sa|0,0)|0;P=C;jb=Od(Pa|0,0,Bc|0,0)|0;ya=C;Da=Od(ua|0,Da|0,p|0,Ka|0)|0;ua=C;Sa=Od(D|0,Ia|0,Sa|0,0)|0;Bb=C;Dc=Od(R|0,0,Bc|0,0)|0;Cc=C;Pa=Od(Pa|0,0,p|0,Ka|0)|0;Pa=Dd(Dc|0,Cc|0,Pa|0,C|0)|0;Bb=Dd(Pa|0,C|0,Sa|0,Bb|0)|0;Sa=C;Bc=Od(D|0,Ia|0,Bc|0,0)|0;Pa=C;R=Od(R|0,0,p|0,Ka|0)|0;R=Dd(Bc|0,Pa|0,R|0,C|0)|0;Pa=C;Ka=Od(D|0,Ia|0,p|0,Ka|0)|0;p=C;Ia=Dd(Ha|0,ba|0,1048576,0)|0;Ia=Gd(Ia|0,C|0,21)|0;D=C;ta=Dd(Ac|0,zc|0,yc|0,ta|0)|0;ta=Dd(ta|0,C|0,Ia|0,D|0)|0;Ea=Dd(ta|0,C|0,Ea&2097151|0,0)|0;ta=C;D=Hd(Ia|0,D|0,21)|0;D=Cd(Ha|0,ba|0,D|0,C|0)|0;ba=C;Ha=Dd(Ma|0,La|0,1048576,0)|0;Ha=Gd(Ha|0,C|0,21)|0;Ia=C;uc=Dd(xc|0,wc|0,vc|0,uc|0)|0;Ca=Dd(uc|0,C|0,tc|0,Ca|0)|0;pa=Dd(Ca|0,C|0,Ba|0,pa|0)|0;pb=Dd(pa|0,C|0,pb&2097151|0,0)|0;pb=Dd(pb|0,C|0,Ha|0,Ia|0)|0;pa=C;Ia=Hd(Ha|0,Ia|0,21)|0;Ha=C;Ba=Dd(Ga|0,Fa|0,1048576,0)|0;Ba=Ed(Ba|0,C|0,21)|0;Ca=C;pc=Dd(sc|0,rc|0,qc|0,pc|0)|0;nc=Dd(pc|0,C|0,oc|0,nc|0)|0;lc=Dd(nc|0,C|0,mc|0,lc|0)|0;Na=Dd(lc|0,C|0,kc|0,Na|0)|0;Y=Dd(Na|0,C|0,Oa|0,Y|0)|0;X=Dd(Y|0,C|0,X&2097151|0,0)|0;X=Dd(X|0,C|0,Ba|0,Ca|0)|0;Y=C;Ca=Hd(Ba|0,Ca|0,21)|0;Ba=C;Oa=Dd(Xa|0,Ya|0,1048576,0)|0;Oa=Ed(Oa|0,C|0,21)|0;Na=C;gc=Dd(jc|0,ic|0,hc|0,gc|0)|0;ec=Dd(gc|0,C|0,fc|0,ec|0)|0;cc=Dd(ec|0,C|0,dc|0,cc|0)|0;ac=Dd(cc|0,C|0,bc|0,ac|0)|0;_b=Dd(ac|0,C|0,$b|0,_b|0)|0;Yb=Dd(_b|0,C|0,Zb|0,Yb|0)|0;ka=Dd(Yb|0,C|0,ca|0,ka|0)|0;w=Dd(ka|0,C|0,H|0,w|0)|0;w=Dd(w|0,C|0,Oa|0,Na|0)|0;H=C;Na=Hd(Oa|0,Na|0,21)|0;Oa=C;ka=Dd(da|0,ea|0,1048576,0)|0;ka=Ed(ka|0,C|0,21)|0;ca=C;Ub=Dd(Xb|0,Wb|0,Vb|0,Ub|0)|0;Sb=Dd(Ub|0,C|0,Tb|0,Sb|0)|0;Qb=Dd(Sb|0,C|0,Rb|0,Qb|0)|0;Ob=Dd(Qb|0,C|0,Pb|0,Ob|0)|0;Mb=Dd(Ob|0,C|0,Nb|0,Mb|0)|0;Kb=Dd(Mb|0,C|0,Lb|0,Kb|0)|0;Ib=Dd(Kb|0,C|0,Jb|0,Ib|0)|0;Aa=Dd(Ib|0,C|0,Hb|0,Aa|0)|0;O=Dd(Aa|0,C|0,za|0,O|0)|0;N=Dd(O|0,C|0,N&2097151|0,0)|0;N=Dd(N|0,C|0,ka|0,ca|0)|0;O=C;ca=Hd(ka|0,ca|0,21)|0;ka=C;za=Dd(U|0,T|0,1048576,0)|0;za=Ed(za|0,C|0,21)|0;Aa=C;ha=Dd(Eb|0,Db|0,ia|0,ha|0)|0;cb=Dd(ha|0,C|0,bb|0,cb|0)|0;aa=Dd(cb|0,C|0,$|0,aa|0)|0;ob=Dd(aa|0,C|0,nb|0,ob|0)|0;Wa=Dd(ob|0,C|0,Va|0,Wa|0)|0;K=Dd(Wa|0,C|0,Q|0,K|0)|0;wb=Dd(K|0,C|0,vb|0,wb|0)|0;E=Dd(wb|0,C|0,I|0,E|0)|0;ib=Dd(E|0,C|0,hb|0,ib|0)|0;W=Dd(ib|0,C|0,V|0,W|0)|0;kb=Dd(W|0,C|0,qb|0,kb|0)|0;j=Dd(kb|0,C|0,A|0,j|0)|0;j=Dd(j|0,C|0,za|0,Aa|0)|0;A=C;Aa=Hd(za|0,Aa|0,21)|0;za=C;kb=Dd(yb|0,xb|0,1048576,0)|0;kb=Ed(kb|0,C|0,21)|0;qb=C;l=Dd(eb|0,db|0,m|0,l|0)|0;na=Dd(l|0,C|0,Ua|0,na|0)|0;wa=Dd(na|0,C|0,xa|0,wa|0)|0;ra=Dd(wa|0,C|0,sa|0,ra|0)|0;Ab=Dd(ra|0,C|0,zb|0,Ab|0)|0;rb=Dd(Ab|0,C|0,oa|0,rb|0)|0;ga=Dd(rb|0,C|0,ma|0,ga|0)|0;mb=Dd(ga|0,C|0,lb|0,mb|0)|0;G=Dd(mb|0,C|0,J|0,G|0)|0;G=Dd(G|0,C|0,kb|0,qb|0)|0;J=C;qb=Hd(kb|0,qb|0,21)|0;kb=C;mb=Dd(tb|0,ub|0,1048576,0)|0;mb=Ed(mb|0,C|0,21)|0;lb=C;f=Dd(va|0,h|0,la|0,f|0)|0;M=Dd(f|0,C|0,qa|0,M|0)|0;k=Dd(M|0,C|0,fa|0,k|0)|0;x=Dd(k|0,C|0,r|0,x|0)|0;n=Dd(x|0,C|0,L|0,n|0)|0;gb=Dd(n|0,C|0,fb|0,gb|0)|0;g=Dd(gb|0,C|0,F|0,g|0)|0;g=Dd(g|0,C|0,mb|0,lb|0)|0;F=C;lb=Hd(mb|0,lb|0,21)|0;mb=C;gb=Dd(Cb|0,v|0,1048576,0)|0;gb=Ed(gb|0,C|0,21)|0;fb=C;u=Dd(Za|0,_a|0,s|0,u|0)|0;$a=Dd(u|0,C|0,ab|0,$a|0)|0;Z=Dd($a|0,C|0,_|0,Z|0)|0;Ra=Dd(Z|0,C|0,B|0,Ra|0)|0;S=Dd(Ra|0,C|0,Ta|0,S|0)|0;S=Dd(S|0,C|0,gb|0,fb|0)|0;Ta=C;fb=Hd(gb|0,fb|0,21)|0;gb=C;Ra=Dd(y|0,ja|0,1048576,0)|0;Ra=Ed(Ra|0,C|0,21)|0;B=C;ua=Dd(jb|0,ya|0,Da|0,ua|0)|0;P=Dd(ua|0,C|0,Ja|0,P|0)|0;Qa=Dd(P|0,C|0,sb|0,Qa|0)|0;Qa=Dd(Qa|0,C|0,Ra|0,B|0)|0;sb=C;B=Hd(Ra|0,B|0,21)|0;B=Cd(y|0,ja|0,B|0,C|0)|0;ja=C;y=Dd(Bb|0,Sa|0,1048576,0)|0;y=Ed(y|0,C|0,21)|0;Ra=C;Pa=Dd(R|0,Pa|0,y|0,Ra|0)|0;R=C;Ra=Hd(y|0,Ra|0,21)|0;Ra=Cd(Bb|0,Sa|0,Ra|0,C|0)|0;Sa=C;Bb=Dd(Ka|0,p|0,1048576,0)|0;Bb=Ed(Bb|0,C|0,21)|0;y=C;P=Hd(Bb|0,y|0,21)|0;P=Cd(Ka|0,p|0,P|0,C|0)|0;p=C;Ka=Dd(Ea|0,ta|0,1048576,0)|0;Ka=Gd(Ka|0,C|0,21)|0;Ja=C;ua=Hd(Ka|0,Ja|0,21)|0;ua=Cd(Ea|0,ta|0,ua|0,C|0)|0;ta=C;Ea=Dd(pb|0,pa|0,1048576,0)|0;Ea=Ed(Ea|0,C|0,21)|0;Da=C;ya=Hd(Ea|0,Da|0,21)|0;ya=Cd(pb|0,pa|0,ya|0,C|0)|0;pa=C;pb=Dd(X|0,Y|0,1048576,0)|0;pb=Ed(pb|0,C|0,21)|0;jb=C;Z=Hd(pb|0,jb|0,21)|0;_=C;$a=Dd(w|0,H|0,1048576,0)|0;$a=Ed($a|0,C|0,21)|0;ab=C;u=Hd($a|0,ab|0,21)|0;s=C;_a=Dd(N|0,O|0,1048576,0)|0;_a=Ed(_a|0,C|0,21)|0;Za=C;n=Hd(_a|0,Za|0,21)|0;L=C;x=Dd(j|0,A|0,1048576,0)|0;x=Ed(x|0,C|0,21)|0;r=C;k=Hd(x|0,r|0,21)|0;fa=C;M=Dd(G|0,J|0,1048576,0)|0;M=Ed(M|0,C|0,21)|0;qa=C;f=Hd(M|0,qa|0,21)|0;la=C;h=Dd(g|0,F|0,1048576,0)|0;h=Ed(h|0,C|0,21)|0;va=C;ga=Hd(h|0,va|0,21)|0;ma=C;rb=Dd(S|0,Ta|0,1048576,0)|0;rb=Ed(rb|0,C|0,21)|0;oa=C;ja=Dd(rb|0,oa|0,B|0,ja|0)|0;B=C;oa=Hd(rb|0,oa|0,21)|0;oa=Cd(S|0,Ta|0,oa|0,C|0)|0;Ta=C;S=Dd(Qa|0,sb|0,1048576,0)|0;S=Ed(S|0,C|0,21)|0;rb=C;Sa=Dd(S|0,rb|0,Ra|0,Sa|0)|0;Ra=C;rb=Hd(S|0,rb|0,21)|0;rb=Cd(Qa|0,sb|0,rb|0,C|0)|0;sb=C;Qa=Dd(Pa|0,R|0,1048576,0)|0;Qa=Ed(Qa|0,C|0,21)|0;S=C;p=Dd(Qa|0,S|0,P|0,p|0)|0;P=C;S=Hd(Qa|0,S|0,21)|0;S=Cd(Pa|0,R|0,S|0,C|0)|0;R=C;Pa=Od(Bb|0,y|0,666643,0)|0;Qa=C;Ab=Od(Bb|0,y|0,470296,0)|0;zb=C;ra=Od(Bb|0,y|0,654183,0)|0;sa=C;wa=Od(Bb|0,y|0,-997805,-1)|0;xa=C;na=Od(Bb|0,y|0,136657,0)|0;Ua=C;y=Od(Bb|0,y|0,-683901,-1)|0;y=Dd(Cb|0,v|0,y|0,C|0)|0;gb=Cd(y|0,C|0,fb|0,gb|0)|0;va=Dd(gb|0,C|0,h|0,va|0)|0;h=C;gb=Od(p|0,P|0,666643,0)|0;fb=C;y=Od(p|0,P|0,470296,0)|0;v=C;Cb=Od(p|0,P|0,654183,0)|0;Bb=C;l=Od(p|0,P|0,-997805,-1)|0;m=C;db=Od(p|0,P|0,136657,0)|0;eb=C;P=Od(p|0,P|0,-683901,-1)|0;p=C;W=Od(S|0,R|0,666643,0)|0;V=C;ib=Od(S|0,R|0,470296,0)|0;hb=C;E=Od(S|0,R|0,654183,0)|0;I=C;wb=Od(S|0,R|0,-997805,-1)|0;vb=C;K=Od(S|0,R|0,136657,0)|0;Q=C;R=Od(S|0,R|0,-683901,-1)|0;S=C;xa=Dd(tb|0,ub|0,wa|0,xa|0)|0;eb=Dd(xa|0,C|0,db|0,eb|0)|0;S=Dd(eb|0,C|0,R|0,S|0)|0;mb=Cd(S|0,C|0,lb|0,mb|0)|0;qa=Dd(mb|0,C|0,M|0,qa|0)|0;M=C;mb=Od(Sa|0,Ra|0,666643,0)|0;lb=C;S=Od(Sa|0,Ra|0,470296,0)|0;R=C;eb=Od(Sa|0,Ra|0,654183,0)|0;db=C;xa=Od(Sa|0,Ra|0,-997805,-1)|0;wa=C;ub=Od(Sa|0,Ra|0,136657,0)|0;tb=C;Ra=Od(Sa|0,Ra|0,-683901,-1)|0;Sa=C;Wa=Od(rb|0,sb|0,666643,0)|0;Va=C;ob=Od(rb|0,sb|0,470296,0)|0;nb=C;aa=Od(rb|0,sb|0,654183,0)|0;$=C;cb=Od(rb|0,sb|0,-997805,-1)|0;bb=C;ha=Od(rb|0,sb|0,136657,0)|0;ia=C;sb=Od(rb|0,sb|0,-683901,-1)|0;rb=C;zb=Dd(Cb|0,Bb|0,Ab|0,zb|0)|0;xb=Dd(zb|0,C|0,yb|0,xb|0)|0;vb=Dd(xb|0,C|0,wb|0,vb|0)|0;tb=Dd(vb|0,C|0,ub|0,tb|0)|0;rb=Dd(tb|0,C|0,sb|0,rb|0)|0;kb=Cd(rb|0,C|0,qb|0,kb|0)|0;r=Dd(kb|0,C|0,x|0,r|0)|0;x=C;kb=Od(ja|0,B|0,666643,0)|0;kb=Dd(pb|0,jb|0,kb|0,C|0)|0;Ya=Dd(kb|0,C|0,Xa|0,Ya|0)|0;Oa=Cd(Ya|0,C|0,Na|0,Oa|0)|0;Na=C;Ya=Od(ja|0,B|0,470296,0)|0;Xa=C;kb=Od(ja|0,B|0,654183,0)|0;jb=C;lb=Dd(ob|0,nb|0,mb|0,lb|0)|0;jb=Dd(lb|0,C|0,kb|0,jb|0)|0;ab=Dd(jb|0,C|0,$a|0,ab|0)|0;ea=Dd(ab|0,C|0,da|0,ea|0)|0;ka=Cd(ea|0,C|0,ca|0,ka|0)|0;ca=C;ea=Od(ja|0,B|0,-997805,-1)|0;da=C;ab=Od(ja|0,B|0,136657,0)|0;$a=C;fb=Dd(ib|0,hb|0,gb|0,fb|0)|0;db=Dd(fb|0,C|0,eb|0,db|0)|0;bb=Dd(db|0,C|0,cb|0,bb|0)|0;$a=Dd(bb|0,C|0,ab|0,$a|0)|0;Za=Dd($a|0,C|0,_a|0,Za|0)|0;T=Dd(Za|0,C|0,U|0,T|0)|0;za=Cd(T|0,C|0,Aa|0,za|0)|0;Aa=C;B=Od(ja|0,B|0,-683901,-1)|0;ja=C;T=Dd(Oa|0,Na|0,1048576,0)|0;T=Ed(T|0,C|0,21)|0;U=C;Va=Dd(Ya|0,Xa|0,Wa|0,Va|0)|0;H=Dd(Va|0,C|0,w|0,H|0)|0;s=Cd(H|0,C|0,u|0,s|0)|0;s=Dd(s|0,C|0,T|0,U|0)|0;u=C;U=Hd(T|0,U|0,21)|0;T=C;H=Dd(ka|0,ca|0,1048576,0)|0;H=Ed(H|0,C|0,21)|0;w=C;V=Dd(S|0,R|0,W|0,V|0)|0;$=Dd(V|0,C|0,aa|0,$|0)|0;da=Dd($|0,C|0,ea|0,da|0)|0;O=Dd(da|0,C|0,N|0,O|0)|0;L=Cd(O|0,C|0,n|0,L|0)|0;L=Dd(L|0,C|0,H|0,w|0)|0;n=C;w=Hd(H|0,w|0,21)|0;H=C;O=Dd(za|0,Aa|0,1048576,0)|0;O=Ed(O|0,C|0,21)|0;N=C;Qa=Dd(y|0,v|0,Pa|0,Qa|0)|0;I=Dd(Qa|0,C|0,E|0,I|0)|0;wa=Dd(I|0,C|0,xa|0,wa|0)|0;ia=Dd(wa|0,C|0,ha|0,ia|0)|0;ja=Dd(ia|0,C|0,B|0,ja|0)|0;A=Dd(ja|0,C|0,j|0,A|0)|0;fa=Cd(A|0,C|0,k|0,fa|0)|0;fa=Dd(fa|0,C|0,O|0,N|0)|0;k=C;N=Hd(O|0,N|0,21)|0;O=C;A=Dd(r|0,x|0,1048576,0)|0;A=Ed(A|0,C|0,21)|0;j=C;sa=Dd(l|0,m|0,ra|0,sa|0)|0;Q=Dd(sa|0,C|0,K|0,Q|0)|0;Sa=Dd(Q|0,C|0,Ra|0,Sa|0)|0;J=Dd(Sa|0,C|0,G|0,J|0)|0;la=Cd(J|0,C|0,f|0,la|0)|0;la=Dd(la|0,C|0,A|0,j|0)|0;f=C;j=Hd(A|0,j|0,21)|0;j=Cd(r|0,x|0,j|0,C|0)|0;x=C;r=Dd(qa|0,M|0,1048576,0)|0;r=Ed(r|0,C|0,21)|0;A=C;Ua=Dd(P|0,p|0,na|0,Ua|0)|0;F=Dd(Ua|0,C|0,g|0,F|0)|0;ma=Cd(F|0,C|0,ga|0,ma|0)|0;ma=Dd(ma|0,C|0,r|0,A|0)|0;ga=C;A=Hd(r|0,A|0,21)|0;A=Cd(qa|0,M|0,A|0,C|0)|0;M=C;qa=Dd(va|0,h|0,1048576,0)|0;qa=Ed(qa|0,C|0,21)|0;r=C;Ta=Dd(qa|0,r|0,oa|0,Ta|0)|0;oa=C;r=Hd(qa|0,r|0,21)|0;r=Cd(va|0,h|0,r|0,C|0)|0;h=C;va=Dd(s|0,u|0,1048576,0)|0;va=Ed(va|0,C|0,21)|0;qa=C;F=Hd(va|0,qa|0,21)|0;g=C;Ua=Dd(L|0,n|0,1048576,0)|0;Ua=Ed(Ua|0,C|0,21)|0;na=C;p=Hd(Ua|0,na|0,21)|0;P=C;J=Dd(fa|0,k|0,1048576,0)|0;J=Ed(J|0,C|0,21)|0;G=C;x=Dd(J|0,G|0,j|0,x|0)|0;j=C;G=Hd(J|0,G|0,21)|0;G=Cd(fa|0,k|0,G|0,C|0)|0;k=C;fa=Dd(la|0,f|0,1048576,0)|0;fa=Ed(fa|0,C|0,21)|0;J=C;M=Dd(fa|0,J|0,A|0,M|0)|0;A=C;J=Hd(fa|0,J|0,21)|0;J=Cd(la|0,f|0,J|0,C|0)|0;f=C;la=Dd(ma|0,ga|0,1048576,0)|0;la=Ed(la|0,C|0,21)|0;fa=C;h=Dd(la|0,fa|0,r|0,h|0)|0;r=C;fa=Hd(la|0,fa|0,21)|0;fa=Cd(ma|0,ga|0,fa|0,C|0)|0;ga=C;ma=Od(Ta|0,oa|0,666643,0)|0;la=C;Sa=Od(Ta|0,oa|0,470296,0)|0;Ra=C;Q=Od(Ta|0,oa|0,654183,0)|0;K=C;sa=Od(Ta|0,oa|0,-997805,-1)|0;ra=C;m=Od(Ta|0,oa|0,136657,0)|0;l=C;oa=Od(Ta|0,oa|0,-683901,-1)|0;oa=Dd(Ua|0,na|0,oa|0,C|0)|0;Aa=Dd(oa|0,C|0,za|0,Aa|0)|0;O=Cd(Aa|0,C|0,N|0,O|0)|0;N=C;Aa=Od(h|0,r|0,666643,0)|0;za=C;oa=Od(h|0,r|0,470296,0)|0;na=C;Ua=Od(h|0,r|0,654183,0)|0;Ta=C;ja=Od(h|0,r|0,-997805,-1)|0;B=C;ia=Od(h|0,r|0,136657,0)|0;ha=C;r=Od(h|0,r|0,-683901,-1)|0;h=C;wa=Od(fa|0,ga|0,666643,0)|0;wa=Dd(ya|0,pa|0,wa|0,C|0)|0;pa=C;ya=Od(fa|0,ga|0,470296,0)|0;xa=C;I=Od(fa|0,ga|0,654183,0)|0;E=C;Qa=Od(fa|0,ga|0,-997805,-1)|0;Pa=C;v=Od(fa|0,ga|0,136657,0)|0;y=C;ga=Od(fa|0,ga|0,-683901,-1)|0;fa=C;ra=Dd(ia|0,ha|0,sa|0,ra|0)|0;fa=Dd(ra|0,C|0,ga|0,fa|0)|0;qa=Dd(fa|0,C|0,va|0,qa|0)|0;ca=Dd(qa|0,C|0,ka|0,ca|0)|0;H=Cd(ca|0,C|0,w|0,H|0)|0;w=C;ca=Od(M|0,A|0,666643,0)|0;ka=C;qa=Od(M|0,A|0,470296,0)|0;qa=Dd(wa|0,pa|0,qa|0,C|0)|0;pa=C;wa=Od(M|0,A|0,654183,0)|0;va=C;fa=Od(M|0,A|0,-997805,-1)|0;ga=C;ra=Od(M|0,A|0,136657,0)|0;sa=C;A=Od(M|0,A|0,-683901,-1)|0;M=C;ha=Od(J|0,f|0,666643,0)|0;ia=C;da=Od(J|0,f|0,470296,0)|0;ea=C;$=Od(J|0,f|0,654183,0)|0;aa=C;V=Od(J|0,f|0,-997805,-1)|0;W=C;R=Od(J|0,f|0,136657,0)|0;S=C;f=Od(J|0,f|0,-683901,-1)|0;J=C;Ra=Dd(Ua|0,Ta|0,Sa|0,Ra|0)|0;Pa=Dd(Ra|0,C|0,Qa|0,Pa|0)|0;Na=Dd(Pa|0,C|0,Oa|0,Na|0)|0;T=Cd(Na|0,C|0,U|0,T|0)|0;sa=Dd(T|0,C|0,ra|0,sa|0)|0;J=Dd(sa|0,C|0,f|0,J|0)|0;f=C;sa=Od(x|0,j|0,666643,0)|0;ba=Dd(sa|0,C|0,D|0,ba|0)|0;D=C;sa=Od(x|0,j|0,470296,0)|0;ra=C;T=Od(x|0,j|0,654183,0)|0;U=C;Ja=Dd(Ma|0,La|0,Ka|0,Ja|0)|0;Ha=Cd(Ja|0,C|0,Ia|0,Ha|0)|0;ka=Dd(Ha|0,C|0,ca|0,ka|0)|0;U=Dd(ka|0,C|0,T|0,U|0)|0;ea=Dd(U|0,C|0,da|0,ea|0)|0;da=C;U=Od(x|0,j|0,-997805,-1)|0;T=C;ka=Od(x|0,j|0,136657,0)|0;ca=C;Da=Dd(Ga|0,Fa|0,Ea|0,Da|0)|0;Ba=Cd(Da|0,C|0,Ca|0,Ba|0)|0;za=Dd(Ba|0,C|0,Aa|0,za|0)|0;xa=Dd(za|0,C|0,ya|0,xa|0)|0;va=Dd(xa|0,C|0,wa|0,va|0)|0;ca=Dd(va|0,C|0,ka|0,ca|0)|0;W=Dd(ca|0,C|0,V|0,W|0)|0;V=C;j=Od(x|0,j|0,-683901,-1)|0;x=C;ca=Dd(ba|0,D|0,1048576,0)|0;ca=Ed(ca|0,C|0,21)|0;ka=C;ra=Dd(ua|0,ta|0,sa|0,ra|0)|0;ia=Dd(ra|0,C|0,ha|0,ia|0)|0;ia=Dd(ia|0,C|0,ca|0,ka|0)|0;ha=C;ka=Hd(ca|0,ka|0,21)|0;ka=Cd(ba|0,D|0,ka|0,C|0)|0;D=C;ba=Dd(ea|0,da|0,1048576,0)|0;ba=Ed(ba|0,C|0,21)|0;ca=C;T=Dd(qa|0,pa|0,U|0,T|0)|0;aa=Dd(T|0,C|0,$|0,aa|0)|0;aa=Dd(aa|0,C|0,ba|0,ca|0)|0;$=C;ca=Hd(ba|0,ca|0,21)|0;ba=C;T=Dd(W|0,V|0,1048576,0)|0;T=Ed(T|0,C|0,21)|0;U=C;la=Dd(oa|0,na|0,ma|0,la|0)|0;E=Dd(la|0,C|0,I|0,E|0)|0;Y=Dd(E|0,C|0,X|0,Y|0)|0;_=Cd(Y|0,C|0,Z|0,_|0)|0;ga=Dd(_|0,C|0,fa|0,ga|0)|0;x=Dd(ga|0,C|0,j|0,x|0)|0;S=Dd(x|0,C|0,R|0,S|0)|0;S=Dd(S|0,C|0,T|0,U|0)|0;R=C;U=Hd(T|0,U|0,21)|0;T=C;x=Dd(J|0,f|0,1048576,0)|0;x=Ed(x|0,C|0,21)|0;j=C;K=Dd(ja|0,B|0,Q|0,K|0)|0;y=Dd(K|0,C|0,v|0,y|0)|0;u=Dd(y|0,C|0,s|0,u|0)|0;g=Cd(u|0,C|0,F|0,g|0)|0;M=Dd(g|0,C|0,A|0,M|0)|0;M=Dd(M|0,C|0,x|0,j|0)|0;A=C;j=Hd(x|0,j|0,21)|0;j=Cd(J|0,f|0,j|0,C|0)|0;f=C;J=Dd(H|0,w|0,1048576,0)|0;J=Ed(J|0,C|0,21)|0;x=C;l=Dd(r|0,h|0,m|0,l|0)|0;n=Dd(l|0,C|0,L|0,n|0)|0;n=Dd(n|0,C|0,J|0,x|0)|0;P=Cd(n|0,C|0,p|0,P|0)|0;p=C;x=Hd(J|0,x|0,21)|0;x=Cd(H|0,w|0,x|0,C|0)|0;w=C;H=Dd(O|0,N|0,1048576,0)|0;H=Ed(H|0,C|0,21)|0;J=C;k=Dd(G|0,k|0,H|0,J|0)|0;G=C;J=Hd(H|0,J|0,21)|0;H=C;n=Dd(ia|0,ha|0,1048576,0)|0;n=Ed(n|0,C|0,21)|0;L=C;l=Hd(n|0,L|0,21)|0;m=C;h=Dd(aa|0,$|0,1048576,0)|0;h=Ed(h|0,C|0,21)|0;r=C;g=Hd(h|0,r|0,21)|0;F=C;u=Dd(S|0,R|0,1048576,0)|0;u=Ed(u|0,C|0,21)|0;s=C;f=Dd(j|0,f|0,u|0,s|0)|0;j=C;s=Hd(u|0,s|0,21)|0;u=C;y=Dd(M|0,A|0,1048576,0)|0;y=Ed(y|0,C|0,21)|0;v=C;w=Dd(x|0,w|0,y|0,v|0)|0;x=C;v=Hd(y|0,v|0,21)|0;v=Cd(M|0,A|0,v|0,C|0)|0;A=C;M=Dd(P|0,p|0,1048576,0)|0;M=Ed(M|0,C|0,21)|0;y=C;K=Hd(M|0,y|0,21)|0;K=Cd(P|0,p|0,K|0,C|0)|0;p=C;P=Dd(k|0,G|0,1048576,0)|0;P=Ed(P|0,C|0,21)|0;Q=C;B=Hd(P|0,Q|0,21)|0;B=Cd(k|0,G|0,B|0,C|0)|0;G=C;k=Od(P|0,Q|0,666643,0)|0;k=Dd(ka|0,D|0,k|0,C|0)|0;D=C;ka=Od(P|0,Q|0,470296,0)|0;ja=C;ga=Od(P|0,Q|0,654183,0)|0;fa=C;_=Od(P|0,Q|0,-997805,-1)|0;Z=C;Y=Od(P|0,Q|0,136657,0)|0;X=C;Q=Od(P|0,Q|0,-683901,-1)|0;P=C;E=Ed(k|0,D|0,21)|0;I=C;ha=Dd(ka|0,ja|0,ia|0,ha|0)|0;m=Cd(ha|0,C|0,l|0,m|0)|0;m=Dd(m|0,C|0,E|0,I|0)|0;l=C;I=Hd(E|0,I|0,21)|0;I=Cd(k|0,D|0,I|0,C|0)|0;D=C;k=Ed(m|0,l|0,21)|0;E=C;da=Dd(ga|0,fa|0,ea|0,da|0)|0;ba=Cd(da|0,C|0,ca|0,ba|0)|0;L=Dd(ba|0,C|0,n|0,L|0)|0;L=Dd(L|0,C|0,k|0,E|0)|0;n=C;E=Hd(k|0,E|0,21)|0;E=Cd(m|0,l|0,E|0,C|0)|0;l=C;m=Ed(L|0,n|0,21)|0;k=C;Z=Dd(aa|0,$|0,_|0,Z|0)|0;F=Cd(Z|0,C|0,g|0,F|0)|0;F=Dd(F|0,C|0,m|0,k|0)|0;g=C;k=Hd(m|0,k|0,21)|0;k=Cd(L|0,n|0,k|0,C|0)|0;n=C;L=Ed(F|0,g|0,21)|0;m=C;V=Dd(Y|0,X|0,W|0,V|0)|0;T=Cd(V|0,C|0,U|0,T|0)|0;r=Dd(T|0,C|0,h|0,r|0)|0;r=Dd(r|0,C|0,L|0,m|0)|0;h=C;m=Hd(L|0,m|0,21)|0;m=Cd(F|0,g|0,m|0,C|0)|0;g=C;F=Ed(r|0,h|0,21)|0;L=C;P=Dd(S|0,R|0,Q|0,P|0)|0;u=Cd(P|0,C|0,s|0,u|0)|0;u=Dd(u|0,C|0,F|0,L|0)|0;s=C;L=Hd(F|0,L|0,21)|0;L=Cd(r|0,h|0,L|0,C|0)|0;h=C;r=Ed(u|0,s|0,21)|0;F=C;j=Dd(f|0,j|0,r|0,F|0)|0;f=C;F=Hd(r|0,F|0,21)|0;F=Cd(u|0,s|0,F|0,C|0)|0;s=C;u=Ed(j|0,f|0,21)|0;r=C;A=Dd(u|0,r|0,v|0,A|0)|0;v=C;r=Hd(u|0,r|0,21)|0;r=Cd(j|0,f|0,r|0,C|0)|0;f=C;j=Ed(A|0,v|0,21)|0;u=C;x=Dd(w|0,x|0,j|0,u|0)|0;w=C;u=Hd(j|0,u|0,21)|0;u=Cd(A|0,v|0,u|0,C|0)|0;v=C;A=Ed(x|0,w|0,21)|0;j=C;p=Dd(A|0,j|0,K|0,p|0)|0;K=C;j=Hd(A|0,j|0,21)|0;j=Cd(x|0,w|0,j|0,C|0)|0;w=C;x=Ed(p|0,K|0,21)|0;A=C;y=Dd(O|0,N|0,M|0,y|0)|0;H=Cd(y|0,C|0,J|0,H|0)|0;H=Dd(H|0,C|0,x|0,A|0)|0;J=C;A=Hd(x|0,A|0,21)|0;A=Cd(p|0,K|0,A|0,C|0)|0;K=C;p=Ed(H|0,J|0,21)|0;x=C;G=Dd(p|0,x|0,B|0,G|0)|0;B=C;x=Hd(p|0,x|0,21)|0;x=Cd(H|0,J|0,x|0,C|0)|0;J=C;H=Ed(G|0,B|0,21)|0;p=C;y=Hd(H|0,p|0,21)|0;y=Cd(G|0,B|0,y|0,C|0)|0;B=C;G=Od(H|0,p|0,666643,0)|0;D=Dd(G|0,C|0,I|0,D|0)|0;I=C;G=Od(H|0,p|0,470296,0)|0;G=Dd(E|0,l|0,G|0,C|0)|0;l=C;E=Od(H|0,p|0,654183,0)|0;E=Dd(k|0,n|0,E|0,C|0)|0;n=C;k=Od(H|0,p|0,-997805,-1)|0;k=Dd(m|0,g|0,k|0,C|0)|0;g=C;m=Od(H|0,p|0,136657,0)|0;m=Dd(L|0,h|0,m|0,C|0)|0;h=C;p=Od(H|0,p|0,-683901,-1)|0;p=Dd(F|0,s|0,p|0,C|0)|0;s=C;F=Ed(D|0,I|0,21)|0;H=C;l=Dd(G|0,l|0,F|0,H|0)|0;G=C;H=Hd(F|0,H|0,21)|0;H=Cd(D|0,I|0,H|0,C|0)|0;I=C;D=Ed(l|0,G|0,21)|0;F=C;n=Dd(E|0,n|0,D|0,F|0)|0;E=C;F=Hd(D|0,F|0,21)|0;F=Cd(l|0,G|0,F|0,C|0)|0;G=C;l=Ed(n|0,E|0,21)|0;D=C;g=Dd(k|0,g|0,l|0,D|0)|0;k=C;D=Hd(l|0,D|0,21)|0;D=Cd(n|0,E|0,D|0,C|0)|0;E=C;n=Ed(g|0,k|0,21)|0;l=C;h=Dd(m|0,h|0,n|0,l|0)|0;m=C;l=Hd(n|0,l|0,21)|0;l=Cd(g|0,k|0,l|0,C|0)|0;k=C;g=Ed(h|0,m|0,21)|0;n=C;s=Dd(p|0,s|0,g|0,n|0)|0;p=C;n=Hd(g|0,n|0,21)|0;n=Cd(h|0,m|0,n|0,C|0)|0;m=C;h=Ed(s|0,p|0,21)|0;g=C;f=Dd(h|0,g|0,r|0,f|0)|0;r=C;g=Hd(h|0,g|0,21)|0;g=Cd(s|0,p|0,g|0,C|0)|0;p=C;s=Ed(f|0,r|0,21)|0;h=C;v=Dd(s|0,h|0,u|0,v|0)|0;u=C;h=Hd(s|0,h|0,21)|0;h=Cd(f|0,r|0,h|0,C|0)|0;r=C;f=Ed(v|0,u|0,21)|0;s=C;w=Dd(f|0,s|0,j|0,w|0)|0;j=C;s=Hd(f|0,s|0,21)|0;s=Cd(v|0,u|0,s|0,C|0)|0;u=C;v=Ed(w|0,j|0,21)|0;f=C;K=Dd(v|0,f|0,A|0,K|0)|0;A=C;f=Hd(v|0,f|0,21)|0;f=Cd(w|0,j|0,f|0,C|0)|0;j=C;w=Ed(K|0,A|0,21)|0;v=C;J=Dd(w|0,v|0,x|0,J|0)|0;x=C;v=Hd(w|0,v|0,21)|0;v=Cd(K|0,A|0,v|0,C|0)|0;A=C;K=Ed(J|0,x|0,21)|0;w=C;B=Dd(K|0,w|0,y|0,B|0)|0;y=C;w=Hd(K|0,w|0,21)|0;w=Cd(J|0,x|0,w|0,C|0)|0;x=C;a[o>>0]=H;o=Gd(H|0,I|0,8)|0;a[b+33>>0]=o;o=Gd(H|0,I|0,16)|0;I=C;H=Hd(F|0,G|0,5)|0;a[b+34>>0]=H|o;o=Gd(F|0,G|0,3)|0;a[b+35>>0]=o;o=Gd(F|0,G|0,11)|0;a[b+36>>0]=o;o=Gd(F|0,G|0,19)|0;G=C;F=Hd(D|0,E|0,2)|0;a[b+37>>0]=F|o;o=Gd(D|0,E|0,6)|0;a[b+38>>0]=o;o=Gd(D|0,E|0,14)|0;E=C;D=Hd(l|0,k|0,7)|0;a[b+39>>0]=D|o;o=Gd(l|0,k|0,1)|0;a[b+40>>0]=o;o=Gd(l|0,k|0,9)|0;a[b+41>>0]=o;o=Gd(l|0,k|0,17)|0;k=C;l=Hd(n|0,m|0,4)|0;a[b+42>>0]=l|o;o=Gd(n|0,m|0,4)|0;a[b+43>>0]=o;o=Gd(n|0,m|0,12)|0;a[b+44>>0]=o;o=Gd(n|0,m|0,20)|0;m=C;n=Hd(g|0,p|0,1)|0;a[b+45>>0]=n|o;o=Gd(g|0,p|0,7)|0;a[b+46>>0]=o;p=Gd(g|0,p|0,15)|0;o=C;g=Hd(h|0,r|0,6)|0;a[b+47>>0]=g|p;p=Gd(h|0,r|0,2)|0;a[b+48>>0]=p;p=Gd(h|0,r|0,10)|0;a[b+49>>0]=p;r=Gd(h|0,r|0,18)|0;h=C;p=Hd(s|0,u|0,3)|0;a[b+50>>0]=p|r;r=Gd(s|0,u|0,5)|0;a[b+51>>0]=r;u=Gd(s|0,u|0,13)|0;a[b+52>>0]=u;a[b+53>>0]=f;u=Gd(f|0,j|0,8)|0;a[b+54>>0]=u;j=Gd(f|0,j|0,16)|0;f=C;u=Hd(v|0,A|0,5)|0;a[b+55>>0]=u|j;j=Gd(v|0,A|0,3)|0;a[b+56>>0]=j;j=Gd(v|0,A|0,11)|0;a[b+57>>0]=j;A=Gd(v|0,A|0,19)|0;v=C;j=Hd(w|0,x|0,2)|0;a[b+58>>0]=j|A;A=Gd(w|0,x|0,6)|0;a[b+59>>0]=A;x=Gd(w|0,x|0,14)|0;w=C;A=Hd(B|0,y|0,7)|0;a[b+60>>0]=x|A;A=Gd(B|0,y|0,1)|0;a[b+61>>0]=A;A=Gd(B|0,y|0,9)|0;a[b+62>>0]=A;y=Gd(B|0,y|0,17)|0;a[b+63>>0]=y;y=q;B=y+64|0;do{a[y>>0]=0;y=y+1|0}while((y|0)<(B|0));y=t;B=y+64|0;do{a[y>>0]=0;y=y+1|0}while((y|0)<(B|0));if(!e){i=z;return}Ec=e;c[Ec>>2]=64;c[Ec+4>>2]=0;i=z;return}function Yc(b,c){b=b|0;c=c|0;return ((((a[c+1>>0]^a[b+1>>0]|a[c>>0]^a[b>>0]|a[c+2>>0]^a[b+2>>0]|a[c+3>>0]^a[b+3>>0]|a[c+4>>0]^a[b+4>>0]|a[c+5>>0]^a[b+5>>0]|a[c+6>>0]^a[b+6>>0]|a[c+7>>0]^a[b+7>>0]|a[c+8>>0]^a[b+8>>0]|a[c+9>>0]^a[b+9>>0]|a[c+10>>0]^a[b+10>>0]|a[c+11>>0]^a[b+11>>0]|a[c+12>>0]^a[b+12>>0]|a[c+13>>0]^a[b+13>>0]|a[c+14>>0]^a[b+14>>0]|a[c+15>>0]^a[b+15>>0]|a[c+16>>0]^a[b+16>>0]|a[c+17>>0]^a[b+17>>0]|a[c+18>>0]^a[b+18>>0]|a[c+19>>0]^a[b+19>>0]|a[c+20>>0]^a[b+20>>0]|a[c+21>>0]^a[b+21>>0]|a[c+22>>0]^a[b+22>>0]|a[c+23>>0]^a[b+23>>0]|a[c+24>>0]^a[b+24>>0]|a[c+25>>0]^a[b+25>>0]|a[c+26>>0]^a[b+26>>0]|a[c+27>>0]^a[b+27>>0]|a[c+28>>0]^a[b+28>>0]|a[c+29>>0]^a[b+29>>0]|a[c+30>>0]^a[b+30>>0]|a[c+31>>0]^a[b+31>>0])&255)+511|0)>>>8&1)+-1|0}function Zc(a){a=a|0;c[7976]=a;return 0}function _c(){return Ba(0)|0}function $c(){Ba(1);return}function ad(a){a=a|0;var b=0,d=0;b=c[7976]|0;if((b|0)!=0?(d=c[b+12>>2]|0,(d|0)!=0):0){a=Ea[d&31](a)|0;return a|0}if(a>>>0<2){a=0;return a|0}b=((0-a|0)>>>0)%(a>>>0)|0;do d=Ba(0)|0;while(d>>>0>>0);a=(d>>>0)%(a>>>0)|0;return a|0}function bd(b,c){b=b|0;c=c|0;var d=0;if(!c)return;else d=0;do{a[b+d>>0]=Ba(0)|0;d=d+1|0}while((d|0)!=(c|0));return}function cd(){var a=0;a=c[7976]|0;if(!a){a=0;return a|0}a=c[a+20>>2]|0;if(!a){a=0;return a|0}a=Da[a&31]()|0;return a|0}function dd(){var a=0,b=0;if(c[7977]|0){b=1;return b|0}Ba(1);a=na(30)|0;if((a|0)>0)c[7978]=a;else a=c[7978]|0;if(a>>>0<16)ra();else b=0;do{Ba(0)|0;b=b+1|0}while((b|0)!=16);c[7977]=1;b=0;return b|0}function ed(a,b){a=a|0;b=b|0;Fd(a|0,0,b|0)|0;return}function fd(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=f<<1;if(!(f>>>0<2147483647&g>>>0>>0))ra();if(!f){f=0;f=b+f|0;a[f>>0]=0;return b|0}else c=0;do{j=d[e+c>>0]|0;i=j&15;j=j>>>4;h=c<<1;a[b+h>>0]=j+87+((j+65526|0)>>>8&217);a[b+(h|1)>>0]=((i<<8)+22272+(i+65526&55552)|0)>>>8;c=c+1|0}while((c|0)!=(f|0));j=b+g|0;a[j>>0]=0;return b|0}function gd(b,e,f,g,h,i,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;a:do if(!g){n=0;l=0;o=0;k=0}else{b:do if(!h){n=0;r=0;l=0;k=0;while(1){p=d[f+l>>0]|0;m=p^48;o=(m+65526|0)>>>8;p=(p&223)+201|0;q=p&255;q=(q+65526^q+65520)>>>8;if(!((q|o)&255)){o=0;break a}m=q&p|o&m;if(n>>>0>=e>>>0){m=k;break b}if(!(k<<24>>24))m=m<<4&255;else{a[b+n>>0]=m|r&255;n=n+1|0;m=r}k=(k&255^255)&255;l=l+1|0;if(l>>>0>>0)r=m;else{o=0;break a}}}else{n=0;u=0;l=0;k=0;while(1){t=k<<24>>24==0;c:do if(!t){q=d[f+l>>0]|0;m=q^48;o=(m+65526|0)>>>8;q=(q&223)+201|0;p=q&255;p=(p+65526^p+65520)>>>8;if(!((p|o)&255)){o=0;break a}}else while(1){q=a[f+l>>0]|0;r=q&255;m=r^48;o=(m+65526|0)>>>8;s=(r&223)+201|0;p=s&255;p=(p+65526^p+65520)>>>8;if((p|o)&255){q=s;break c}s=ud(h,r)|0;if((s|0)==0?1:(a[s>>0]|0)!=q<<24>>24){o=0;k=0;break a}l=l+1|0;if(l>>>0>=g>>>0){o=0;k=0;break a}}while(0);m=p&q|o&m;if(n>>>0>=e>>>0){m=k;break b}if(t)m=m<<4&255;else{a[b+n>>0]=m|u&255;n=n+1|0;m=u}k=(k&255^255)&255;l=l+1|0;if(l>>>0>>0)u=m;else{o=0;break a}}}while(0);if(!(c[7979]|0))k=31964;else k=c[(oa()|0)+60>>2]|0;c[k>>2]=34;o=-1;k=m}while(0);if(j)c[j>>2]=f+(((k<<24>>24!=0)<<31>>31)+l);if(!i)return o|0;c[i>>2]=n;return o|0}function hd(){return 33779}function id(){return 8}function jd(){return 0}function kd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0;l=c[b>>2]|0;s=c[b+4>>2]|0;j=c[b+8>>2]|0;Rb=c[b+12>>2]|0;e=c[b+16>>2]|0;za=c[b+20>>2]|0;ya=c[b+24>>2]|0;zb=c[b+28>>2]|0;h=c[b+32>>2]|0;ga=c[b+36>>2]|0;H=c[d>>2]|0;J=c[d+4>>2]|0;F=c[d+8>>2]|0;D=c[d+12>>2]|0;A=c[d+16>>2]|0;y=c[d+20>>2]|0;w=c[d+24>>2]|0;u=c[d+28>>2]|0;k=c[d+32>>2]|0;t=c[d+36>>2]|0;Oc=J*19|0;bc=F*19|0;rb=D*19|0;Ha=A*19|0;jc=y*19|0;Db=w*19|0;Ta=u*19|0;Sc=k*19|0;Qc=t*19|0;p=s<<1;f=Rb<<1;M=za<<1;i=zb<<1;d=ga<<1;o=((l|0)<0)<<31>>31;I=((H|0)<0)<<31>>31;Mc=Od(H|0,I|0,l|0,o|0)|0;Lc=C;K=((J|0)<0)<<31>>31;wc=Od(J|0,K|0,l|0,o|0)|0;vc=C;G=((F|0)<0)<<31>>31;ub=Od(F|0,G|0,l|0,o|0)|0;tb=C;E=((D|0)<0)<<31>>31;Ka=Od(D|0,E|0,l|0,o|0)|0;Ja=C;B=((A|0)<0)<<31>>31;mc=Od(A|0,B|0,l|0,o|0)|0;lc=C;z=((y|0)<0)<<31>>31;Gb=Od(y|0,z|0,l|0,o|0)|0;Fb=C;x=((w|0)<0)<<31>>31;Wa=Od(w|0,x|0,l|0,o|0)|0;Va=C;v=((u|0)<0)<<31>>31;ja=Od(u|0,v|0,l|0,o|0)|0;ia=C;Pc=((k|0)<0)<<31>>31;P=Od(k|0,Pc|0,l|0,o|0)|0;O=C;o=Od(t|0,((t|0)<0)<<31>>31|0,l|0,o|0)|0;l=C;t=((s|0)<0)<<31>>31;dc=Od(H|0,I|0,s|0,t|0)|0;ec=C;n=((p|0)<0)<<31>>31;yb=Od(J|0,K|0,p|0,n|0)|0;xb=C;Ma=Od(F|0,G|0,s|0,t|0)|0;La=C;oc=Od(D|0,E|0,p|0,n|0)|0;nc=C;Ib=Od(A|0,B|0,s|0,t|0)|0;Hb=C;Ya=Od(y|0,z|0,p|0,n|0)|0;Xa=C;la=Od(w|0,x|0,s|0,t|0)|0;ka=C;R=Od(u|0,v|0,p|0,n|0)|0;Q=C;t=Od(k|0,Pc|0,s|0,t|0)|0;s=C;Pc=((Qc|0)<0)<<31>>31;n=Od(Qc|0,Pc|0,p|0,n|0)|0;p=C;k=((j|0)<0)<<31>>31;wb=Od(H|0,I|0,j|0,k|0)|0;vb=C;Qa=Od(J|0,K|0,j|0,k|0)|0;Pa=C;qc=Od(F|0,G|0,j|0,k|0)|0;pc=C;Kb=Od(D|0,E|0,j|0,k|0)|0;Jb=C;_a=Od(A|0,B|0,j|0,k|0)|0;Za=C;na=Od(y|0,z|0,j|0,k|0)|0;ma=C;T=Od(w|0,x|0,j|0,k|0)|0;S=C;v=Od(u|0,v|0,j|0,k|0)|0;u=C;Rc=((Sc|0)<0)<<31>>31;yc=Od(Sc|0,Rc|0,j|0,k|0)|0;xc=C;k=Od(Qc|0,Pc|0,j|0,k|0)|0;j=C;Sb=((Rb|0)<0)<<31>>31;Oa=Od(H|0,I|0,Rb|0,Sb|0)|0;Na=C;fa=((f|0)<0)<<31>>31;uc=Od(J|0,K|0,f|0,fa|0)|0;tc=C;Mb=Od(F|0,G|0,Rb|0,Sb|0)|0;Lb=C;ab=Od(D|0,E|0,f|0,fa|0)|0;$a=C;pa=Od(A|0,B|0,Rb|0,Sb|0)|0;oa=C;V=Od(y|0,z|0,f|0,fa|0)|0;U=C;x=Od(w|0,x|0,Rb|0,Sb|0)|0;w=C;Ua=((Ta|0)<0)<<31>>31;Ac=Od(Ta|0,Ua|0,f|0,fa|0)|0;zc=C;Sb=Od(Sc|0,Rc|0,Rb|0,Sb|0)|0;Rb=C;fa=Od(Qc|0,Pc|0,f|0,fa|0)|0;f=C;N=((e|0)<0)<<31>>31;sc=Od(H|0,I|0,e|0,N|0)|0;rc=C;Qb=Od(J|0,K|0,e|0,N|0)|0;Pb=C;cb=Od(F|0,G|0,e|0,N|0)|0;bb=C;ra=Od(D|0,E|0,e|0,N|0)|0;qa=C;X=Od(A|0,B|0,e|0,N|0)|0;W=C;z=Od(y|0,z|0,e|0,N|0)|0;y=C;Eb=((Db|0)<0)<<31>>31;Cc=Od(Db|0,Eb|0,e|0,N|0)|0;Bc=C;Ub=Od(Ta|0,Ua|0,e|0,N|0)|0;Tb=C;ib=Od(Sc|0,Rc|0,e|0,N|0)|0;hb=C;N=Od(Qc|0,Pc|0,e|0,N|0)|0;e=C;Aa=((za|0)<0)<<31>>31;Ob=Od(H|0,I|0,za|0,Aa|0)|0;Nb=C;b=((M|0)<0)<<31>>31;gb=Od(J|0,K|0,M|0,b|0)|0;fb=C;ta=Od(F|0,G|0,za|0,Aa|0)|0;sa=C;Z=Od(D|0,E|0,M|0,b|0)|0;Y=C;B=Od(A|0,B|0,za|0,Aa|0)|0;A=C;kc=((jc|0)<0)<<31>>31;Ec=Od(jc|0,kc|0,M|0,b|0)|0;Dc=C;Wb=Od(Db|0,Eb|0,za|0,Aa|0)|0;Vb=C;kb=Od(Ta|0,Ua|0,M|0,b|0)|0;jb=C;Aa=Od(Sc|0,Rc|0,za|0,Aa|0)|0;za=C;b=Od(Qc|0,Pc|0,M|0,b|0)|0;M=C;g=((ya|0)<0)<<31>>31;eb=Od(H|0,I|0,ya|0,g|0)|0;db=C;xa=Od(J|0,K|0,ya|0,g|0)|0;wa=C;$=Od(F|0,G|0,ya|0,g|0)|0;_=C;E=Od(D|0,E|0,ya|0,g|0)|0;D=C;Ia=((Ha|0)<0)<<31>>31;Gc=Od(Ha|0,Ia|0,ya|0,g|0)|0;Fc=C;Yb=Od(jc|0,kc|0,ya|0,g|0)|0;Xb=C;mb=Od(Db|0,Eb|0,ya|0,g|0)|0;lb=C;Ca=Od(Ta|0,Ua|0,ya|0,g|0)|0;Ba=C;m=Od(Sc|0,Rc|0,ya|0,g|0)|0;r=C;g=Od(Qc|0,Pc|0,ya|0,g|0)|0;ya=C;Ab=((zb|0)<0)<<31>>31;va=Od(H|0,I|0,zb|0,Ab|0)|0;ua=C;ea=((i|0)<0)<<31>>31;da=Od(J|0,K|0,i|0,ea|0)|0;ca=C;G=Od(F|0,G|0,zb|0,Ab|0)|0;F=C;sb=((rb|0)<0)<<31>>31;Ic=Od(rb|0,sb|0,i|0,ea|0)|0;Hc=C;_b=Od(Ha|0,Ia|0,zb|0,Ab|0)|0;Zb=C;ob=Od(jc|0,kc|0,i|0,ea|0)|0;nb=C;Ea=Od(Db|0,Eb|0,zb|0,Ab|0)|0;Da=C;gc=Od(Ta|0,Ua|0,i|0,ea|0)|0;fc=C;Ab=Od(Sc|0,Rc|0,zb|0,Ab|0)|0;zb=C;ea=Od(Qc|0,Pc|0,i|0,ea|0)|0;i=C;L=((h|0)<0)<<31>>31;ba=Od(H|0,I|0,h|0,L|0)|0;aa=C;K=Od(J|0,K|0,h|0,L|0)|0;J=C;cc=((bc|0)<0)<<31>>31;Kc=Od(bc|0,cc|0,h|0,L|0)|0;Jc=C;ac=Od(rb|0,sb|0,h|0,L|0)|0;$b=C;qb=Od(Ha|0,Ia|0,h|0,L|0)|0;pb=C;Ga=Od(jc|0,kc|0,h|0,L|0)|0;Fa=C;ic=Od(Db|0,Eb|0,h|0,L|0)|0;hc=C;Cb=Od(Ta|0,Ua|0,h|0,L|0)|0;Bb=C;Sa=Od(Sc|0,Rc|0,h|0,L|0)|0;Ra=C;L=Od(Qc|0,Pc|0,h|0,L|0)|0;h=C;ha=((ga|0)<0)<<31>>31;I=Od(H|0,I|0,ga|0,ha|0)|0;H=C;q=((d|0)<0)<<31>>31;Oc=Od(Oc|0,((Oc|0)<0)<<31>>31|0,d|0,q|0)|0;Nc=C;cc=Od(bc|0,cc|0,ga|0,ha|0)|0;bc=C;sb=Od(rb|0,sb|0,d|0,q|0)|0;rb=C;Ia=Od(Ha|0,Ia|0,ga|0,ha|0)|0;Ha=C;kc=Od(jc|0,kc|0,d|0,q|0)|0;jc=C;Eb=Od(Db|0,Eb|0,ga|0,ha|0)|0;Db=C;Ua=Od(Ta|0,Ua|0,d|0,q|0)|0;Ta=C;ha=Od(Sc|0,Rc|0,ga|0,ha|0)|0;ga=C;q=Od(Qc|0,Pc|0,d|0,q|0)|0;d=C;Lc=Dd(Oc|0,Nc|0,Mc|0,Lc|0)|0;Jc=Dd(Lc|0,C|0,Kc|0,Jc|0)|0;Hc=Dd(Jc|0,C|0,Ic|0,Hc|0)|0;Fc=Dd(Hc|0,C|0,Gc|0,Fc|0)|0;Dc=Dd(Fc|0,C|0,Ec|0,Dc|0)|0;Bc=Dd(Dc|0,C|0,Cc|0,Bc|0)|0;zc=Dd(Bc|0,C|0,Ac|0,zc|0)|0;xc=Dd(zc|0,C|0,yc|0,xc|0)|0;p=Dd(xc|0,C|0,n|0,p|0)|0;n=C;ec=Dd(wc|0,vc|0,dc|0,ec|0)|0;dc=C;rc=Dd(uc|0,tc|0,sc|0,rc|0)|0;pc=Dd(rc|0,C|0,qc|0,pc|0)|0;nc=Dd(pc|0,C|0,oc|0,nc|0)|0;lc=Dd(nc|0,C|0,mc|0,lc|0)|0;jc=Dd(lc|0,C|0,kc|0,jc|0)|0;hc=Dd(jc|0,C|0,ic|0,hc|0)|0;fc=Dd(hc|0,C|0,gc|0,fc|0)|0;r=Dd(fc|0,C|0,m|0,r|0)|0;M=Dd(r|0,C|0,b|0,M|0)|0;b=C;r=Dd(p|0,n|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;m=C;bc=Dd(ec|0,dc|0,cc|0,bc|0)|0;$b=Dd(bc|0,C|0,ac|0,$b|0)|0;Zb=Dd($b|0,C|0,_b|0,Zb|0)|0;Xb=Dd(Zb|0,C|0,Yb|0,Xb|0)|0;Vb=Dd(Xb|0,C|0,Wb|0,Vb|0)|0;Tb=Dd(Vb|0,C|0,Ub|0,Tb|0)|0;Rb=Dd(Tb|0,C|0,Sb|0,Rb|0)|0;j=Dd(Rb|0,C|0,k|0,j|0)|0;j=Dd(j|0,C|0,r|0,m|0)|0;k=C;m=Hd(r|0,m|0,26)|0;m=Cd(p|0,n|0,m|0,C|0)|0;n=C;p=Dd(M|0,b|0,33554432,0)|0;p=Ed(p|0,C|0,26)|0;r=C;Nb=Dd(Qb|0,Pb|0,Ob|0,Nb|0)|0;Lb=Dd(Nb|0,C|0,Mb|0,Lb|0)|0;Jb=Dd(Lb|0,C|0,Kb|0,Jb|0)|0;Hb=Dd(Jb|0,C|0,Ib|0,Hb|0)|0;Fb=Dd(Hb|0,C|0,Gb|0,Fb|0)|0;Db=Dd(Fb|0,C|0,Eb|0,Db|0)|0;Bb=Dd(Db|0,C|0,Cb|0,Bb|0)|0;zb=Dd(Bb|0,C|0,Ab|0,zb|0)|0;ya=Dd(zb|0,C|0,g|0,ya|0)|0;ya=Dd(ya|0,C|0,p|0,r|0)|0;g=C;r=Hd(p|0,r|0,26)|0;r=Cd(M|0,b|0,r|0,C|0)|0;b=C;M=Dd(j|0,k|0,16777216,0)|0;M=Ed(M|0,C|0,25)|0;p=C;vb=Dd(yb|0,xb|0,wb|0,vb|0)|0;tb=Dd(vb|0,C|0,ub|0,tb|0)|0;rb=Dd(tb|0,C|0,sb|0,rb|0)|0;pb=Dd(rb|0,C|0,qb|0,pb|0)|0;nb=Dd(pb|0,C|0,ob|0,nb|0)|0;lb=Dd(nb|0,C|0,mb|0,lb|0)|0;jb=Dd(lb|0,C|0,kb|0,jb|0)|0;hb=Dd(jb|0,C|0,ib|0,hb|0)|0;f=Dd(hb|0,C|0,fa|0,f|0)|0;f=Dd(f|0,C|0,M|0,p|0)|0;fa=C;p=Hd(M|0,p|0,25)|0;p=Cd(j|0,k|0,p|0,C|0)|0;k=C;j=Dd(ya|0,g|0,16777216,0)|0;j=Ed(j|0,C|0,25)|0;M=C;db=Dd(gb|0,fb|0,eb|0,db|0)|0;bb=Dd(db|0,C|0,cb|0,bb|0)|0;$a=Dd(bb|0,C|0,ab|0,$a|0)|0;Za=Dd($a|0,C|0,_a|0,Za|0)|0;Xa=Dd(Za|0,C|0,Ya|0,Xa|0)|0;Va=Dd(Xa|0,C|0,Wa|0,Va|0)|0;Ta=Dd(Va|0,C|0,Ua|0,Ta|0)|0;Ra=Dd(Ta|0,C|0,Sa|0,Ra|0)|0;i=Dd(Ra|0,C|0,ea|0,i|0)|0;i=Dd(i|0,C|0,j|0,M|0)|0;ea=C;M=Hd(j|0,M|0,25)|0;M=Cd(ya|0,g|0,M|0,C|0)|0;g=C;ya=Dd(f|0,fa|0,33554432,0)|0;ya=Ed(ya|0,C|0,26)|0;j=C;Na=Dd(Qa|0,Pa|0,Oa|0,Na|0)|0;La=Dd(Na|0,C|0,Ma|0,La|0)|0;Ja=Dd(La|0,C|0,Ka|0,Ja|0)|0;Ha=Dd(Ja|0,C|0,Ia|0,Ha|0)|0;Fa=Dd(Ha|0,C|0,Ga|0,Fa|0)|0;Da=Dd(Fa|0,C|0,Ea|0,Da|0)|0;Ba=Dd(Da|0,C|0,Ca|0,Ba|0)|0;za=Dd(Ba|0,C|0,Aa|0,za|0)|0;e=Dd(za|0,C|0,N|0,e|0)|0;e=Dd(e|0,C|0,ya|0,j|0)|0;N=C;j=Hd(ya|0,j|0,26)|0;j=Cd(f|0,fa|0,j|0,C|0)|0;fa=Dd(i|0,ea|0,33554432,0)|0;fa=Ed(fa|0,C|0,26)|0;f=C;ua=Dd(xa|0,wa|0,va|0,ua|0)|0;sa=Dd(ua|0,C|0,ta|0,sa|0)|0;qa=Dd(sa|0,C|0,ra|0,qa|0)|0;oa=Dd(qa|0,C|0,pa|0,oa|0)|0;ma=Dd(oa|0,C|0,na|0,ma|0)|0;ka=Dd(ma|0,C|0,la|0,ka|0)|0;ia=Dd(ka|0,C|0,ja|0,ia|0)|0;ga=Dd(ia|0,C|0,ha|0,ga|0)|0;h=Dd(ga|0,C|0,L|0,h|0)|0;h=Dd(h|0,C|0,fa|0,f|0)|0;L=C;f=Hd(fa|0,f|0,26)|0;f=Cd(i|0,ea|0,f|0,C|0)|0;ea=Dd(e|0,N|0,16777216,0)|0;ea=Ed(ea|0,C|0,25)|0;i=C;b=Dd(ea|0,i|0,r|0,b|0)|0;r=C;i=Hd(ea|0,i|0,25)|0;i=Cd(e|0,N|0,i|0,C|0)|0;N=Dd(h|0,L|0,16777216,0)|0;N=Ed(N|0,C|0,25)|0;e=C;aa=Dd(da|0,ca|0,ba|0,aa|0)|0;_=Dd(aa|0,C|0,$|0,_|0)|0;Y=Dd(_|0,C|0,Z|0,Y|0)|0;W=Dd(Y|0,C|0,X|0,W|0)|0;U=Dd(W|0,C|0,V|0,U|0)|0;S=Dd(U|0,C|0,T|0,S|0)|0;Q=Dd(S|0,C|0,R|0,Q|0)|0;O=Dd(Q|0,C|0,P|0,O|0)|0;d=Dd(O|0,C|0,q|0,d|0)|0;d=Dd(d|0,C|0,N|0,e|0)|0;q=C;e=Hd(N|0,e|0,25)|0;e=Cd(h|0,L|0,e|0,C|0)|0;L=Dd(b|0,r|0,33554432,0)|0;L=Ed(L|0,C|0,26)|0;h=C;g=Dd(M|0,g|0,L|0,h|0)|0;h=Hd(L|0,h|0,26)|0;h=Cd(b|0,r|0,h|0,C|0)|0;r=Dd(d|0,q|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;b=C;H=Dd(K|0,J|0,I|0,H|0)|0;F=Dd(H|0,C|0,G|0,F|0)|0;D=Dd(F|0,C|0,E|0,D|0)|0;A=Dd(D|0,C|0,B|0,A|0)|0;y=Dd(A|0,C|0,z|0,y|0)|0;w=Dd(y|0,C|0,x|0,w|0)|0;u=Dd(w|0,C|0,v|0,u|0)|0;s=Dd(u|0,C|0,t|0,s|0)|0;l=Dd(s|0,C|0,o|0,l|0)|0;l=Dd(l|0,C|0,r|0,b|0)|0;o=C;b=Hd(r|0,b|0,26)|0;b=Cd(d|0,q|0,b|0,C|0)|0;q=Dd(l|0,o|0,16777216,0)|0;q=Ed(q|0,C|0,25)|0;d=C;r=Od(q|0,d|0,19,0)|0;n=Dd(r|0,C|0,m|0,n|0)|0;m=C;d=Hd(q|0,d|0,25)|0;d=Cd(l|0,o|0,d|0,C|0)|0;o=Dd(n|0,m|0,33554432,0)|0;o=Ed(o|0,C|0,26)|0;l=C;k=Dd(p|0,k|0,o|0,l|0)|0;l=Hd(o|0,l|0,26)|0;l=Cd(n|0,m|0,l|0,C|0)|0;c[a>>2]=l;c[a+4>>2]=k;c[a+8>>2]=j;c[a+12>>2]=i;c[a+16>>2]=h;c[a+20>>2]=g;c[a+24>>2]=f;c[a+28>>2]=e;c[a+32>>2]=b;c[a+36>>2]=d;return}function ld(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0;bb=c[b>>2]|0;ua=c[b+4>>2]|0;j=c[b+8>>2]|0;la=c[b+12>>2]|0;e=c[b+16>>2]|0;db=c[b+20>>2]|0;Y=c[b+24>>2]|0;La=c[b+28>>2]|0;h=c[b+32>>2]|0;b=c[b+36>>2]|0;l=bb<<1;p=ua<<1;Xa=j<<1;f=la<<1;na=e<<1;B=db<<1;m=Y<<1;i=La<<1;Ka=db*38|0;ra=Y*19|0;va=La*38|0;da=h*19|0;gb=b*38|0;cb=((bb|0)<0)<<31>>31;cb=Od(bb|0,cb|0,bb|0,cb|0)|0;bb=C;o=((l|0)<0)<<31>>31;ta=((ua|0)<0)<<31>>31;Ia=Od(l|0,o|0,ua|0,ta|0)|0;Ha=C;k=((j|0)<0)<<31>>31;Wa=Od(j|0,k|0,l|0,o|0)|0;Va=C;ma=((la|0)<0)<<31>>31;Ua=Od(la|0,ma|0,l|0,o|0)|0;Ta=C;D=((e|0)<0)<<31>>31;Oa=Od(e|0,D|0,l|0,o|0)|0;Na=C;eb=((db|0)<0)<<31>>31;ya=Od(db|0,eb|0,l|0,o|0)|0;xa=C;g=((Y|0)<0)<<31>>31;ga=Od(Y|0,g|0,l|0,o|0)|0;fa=C;Ma=((La|0)<0)<<31>>31;R=Od(La|0,Ma|0,l|0,o|0)|0;Q=C;A=((h|0)<0)<<31>>31;F=Od(h|0,A|0,l|0,o|0)|0;E=C;q=((b|0)<0)<<31>>31;o=Od(b|0,q|0,l|0,o|0)|0;l=C;n=((p|0)<0)<<31>>31;ta=Od(p|0,n|0,ua|0,ta|0)|0;ua=C;ba=Od(p|0,n|0,j|0,k|0)|0;ca=C;P=((f|0)<0)<<31>>31;Sa=Od(f|0,P|0,p|0,n|0)|0;Ra=C;Ca=Od(e|0,D|0,p|0,n|0)|0;Ba=C;d=((B|0)<0)<<31>>31;ia=Od(B|0,d|0,p|0,n|0)|0;ha=C;T=Od(Y|0,g|0,p|0,n|0)|0;S=C;O=((i|0)<0)<<31>>31;H=Od(i|0,O|0,p|0,n|0)|0;G=C;t=Od(h|0,A|0,p|0,n|0)|0;s=C;fb=((gb|0)<0)<<31>>31;n=Od(gb|0,fb|0,p|0,n|0)|0;p=C;Qa=Od(j|0,k|0,j|0,k|0)|0;Pa=C;Ya=((Xa|0)<0)<<31>>31;Aa=Od(Xa|0,Ya|0,la|0,ma|0)|0;za=C;ka=Od(e|0,D|0,Xa|0,Ya|0)|0;ja=C;X=Od(db|0,eb|0,Xa|0,Ya|0)|0;W=C;N=Od(Y|0,g|0,Xa|0,Ya|0)|0;M=C;v=Od(La|0,Ma|0,Xa|0,Ya|0)|0;u=C;ea=((da|0)<0)<<31>>31;Ya=Od(da|0,ea|0,Xa|0,Ya|0)|0;Xa=C;k=Od(gb|0,fb|0,j|0,k|0)|0;j=C;ma=Od(f|0,P|0,la|0,ma|0)|0;la=C;V=Od(f|0,P|0,e|0,D|0)|0;U=C;J=Od(B|0,d|0,f|0,P|0)|0;I=C;z=Od(Y|0,g|0,f|0,P|0)|0;y=C;wa=((va|0)<0)<<31>>31;_a=Od(va|0,wa|0,f|0,P|0)|0;Za=C;Ea=Od(da|0,ea|0,f|0,P|0)|0;Da=C;P=Od(gb|0,fb|0,f|0,P|0)|0;f=C;L=Od(e|0,D|0,e|0,D|0)|0;K=C;oa=((na|0)<0)<<31>>31;x=Od(na|0,oa|0,db|0,eb|0)|0;w=C;sa=((ra|0)<0)<<31>>31;ab=Od(ra|0,sa|0,na|0,oa|0)|0;$a=C;Ga=Od(va|0,wa|0,e|0,D|0)|0;Fa=C;oa=Od(da|0,ea|0,na|0,oa|0)|0;na=C;D=Od(gb|0,fb|0,e|0,D|0)|0;e=C;eb=Od(Ka|0,((Ka|0)<0)<<31>>31|0,db|0,eb|0)|0;db=C;Ka=Od(ra|0,sa|0,B|0,d|0)|0;Ja=C;qa=Od(va|0,wa|0,B|0,d|0)|0;pa=C;_=Od(da|0,ea|0,B|0,d|0)|0;Z=C;d=Od(gb|0,fb|0,B|0,d|0)|0;B=C;sa=Od(ra|0,sa|0,Y|0,g|0)|0;ra=C;aa=Od(va|0,wa|0,Y|0,g|0)|0;$=C;m=Od(da|0,ea|0,m|0,((m|0)<0)<<31>>31|0)|0;r=C;g=Od(gb|0,fb|0,Y|0,g|0)|0;Y=C;Ma=Od(va|0,wa|0,La|0,Ma|0)|0;La=C;wa=Od(da|0,ea|0,i|0,O|0)|0;va=C;O=Od(gb|0,fb|0,i|0,O|0)|0;i=C;ea=Od(da|0,ea|0,h|0,A|0)|0;da=C;A=Od(gb|0,fb|0,h|0,A|0)|0;h=C;q=Od(gb|0,fb|0,b|0,q|0)|0;b=C;bb=Dd(eb|0,db|0,cb|0,bb|0)|0;$a=Dd(bb|0,C|0,ab|0,$a|0)|0;Za=Dd($a|0,C|0,_a|0,Za|0)|0;Xa=Dd(Za|0,C|0,Ya|0,Xa|0)|0;p=Dd(Xa|0,C|0,n|0,p|0)|0;n=C;ua=Dd(Wa|0,Va|0,ta|0,ua|0)|0;ta=C;ca=Dd(Ua|0,Ta|0,ba|0,ca|0)|0;ba=C;Pa=Dd(Sa|0,Ra|0,Qa|0,Pa|0)|0;Na=Dd(Pa|0,C|0,Oa|0,Na|0)|0;La=Dd(Na|0,C|0,Ma|0,La|0)|0;r=Dd(La|0,C|0,m|0,r|0)|0;B=Dd(r|0,C|0,d|0,B|0)|0;d=C;r=Dd(p|0,n|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;m=C;Ha=Dd(Ka|0,Ja|0,Ia|0,Ha|0)|0;Fa=Dd(Ha|0,C|0,Ga|0,Fa|0)|0;Da=Dd(Fa|0,C|0,Ea|0,Da|0)|0;j=Dd(Da|0,C|0,k|0,j|0)|0;j=Dd(j|0,C|0,r|0,m|0)|0;k=C;m=Hd(r|0,m|0,26)|0;m=Cd(p|0,n|0,m|0,C|0)|0;n=C;p=Dd(B|0,d|0,33554432,0)|0;p=Ed(p|0,C|0,26)|0;r=C;za=Dd(Ca|0,Ba|0,Aa|0,za|0)|0;xa=Dd(za|0,C|0,ya|0,xa|0)|0;va=Dd(xa|0,C|0,wa|0,va|0)|0;Y=Dd(va|0,C|0,g|0,Y|0)|0;Y=Dd(Y|0,C|0,p|0,r|0)|0;g=C;r=Hd(p|0,r|0,26)|0;r=Cd(B|0,d|0,r|0,C|0)|0;d=C;B=Dd(j|0,k|0,16777216,0)|0;B=Ed(B|0,C|0,25)|0;p=C;ra=Dd(ua|0,ta|0,sa|0,ra|0)|0;pa=Dd(ra|0,C|0,qa|0,pa|0)|0;na=Dd(pa|0,C|0,oa|0,na|0)|0;f=Dd(na|0,C|0,P|0,f|0)|0;f=Dd(f|0,C|0,B|0,p|0)|0;P=C;p=Hd(B|0,p|0,25)|0;p=Cd(j|0,k|0,p|0,C|0)|0;k=C;j=Dd(Y|0,g|0,16777216,0)|0;j=Ed(j|0,C|0,25)|0;B=C;ja=Dd(ma|0,la|0,ka|0,ja|0)|0;ha=Dd(ja|0,C|0,ia|0,ha|0)|0;fa=Dd(ha|0,C|0,ga|0,fa|0)|0;da=Dd(fa|0,C|0,ea|0,da|0)|0;i=Dd(da|0,C|0,O|0,i|0)|0;i=Dd(i|0,C|0,j|0,B|0)|0;O=C;B=Hd(j|0,B|0,25)|0;B=Cd(Y|0,g|0,B|0,C|0)|0;g=C;Y=Dd(f|0,P|0,33554432,0)|0;Y=Ed(Y|0,C|0,26)|0;j=C;$=Dd(ca|0,ba|0,aa|0,$|0)|0;Z=Dd($|0,C|0,_|0,Z|0)|0;e=Dd(Z|0,C|0,D|0,e|0)|0;e=Dd(e|0,C|0,Y|0,j|0)|0;D=C;j=Hd(Y|0,j|0,26)|0;j=Cd(f|0,P|0,j|0,C|0)|0;P=Dd(i|0,O|0,33554432,0)|0;P=Ed(P|0,C|0,26)|0;f=C;U=Dd(X|0,W|0,V|0,U|0)|0;S=Dd(U|0,C|0,T|0,S|0)|0;Q=Dd(S|0,C|0,R|0,Q|0)|0;h=Dd(Q|0,C|0,A|0,h|0)|0;h=Dd(h|0,C|0,P|0,f|0)|0;A=C;f=Hd(P|0,f|0,26)|0;f=Cd(i|0,O|0,f|0,C|0)|0;O=Dd(e|0,D|0,16777216,0)|0;O=Ed(O|0,C|0,25)|0;i=C;d=Dd(O|0,i|0,r|0,d|0)|0;r=C;i=Hd(O|0,i|0,25)|0;i=Cd(e|0,D|0,i|0,C|0)|0;D=Dd(h|0,A|0,16777216,0)|0;D=Ed(D|0,C|0,25)|0;e=C;K=Dd(N|0,M|0,L|0,K|0)|0;I=Dd(K|0,C|0,J|0,I|0)|0;G=Dd(I|0,C|0,H|0,G|0)|0;E=Dd(G|0,C|0,F|0,E|0)|0;b=Dd(E|0,C|0,q|0,b|0)|0;b=Dd(b|0,C|0,D|0,e|0)|0;q=C;e=Hd(D|0,e|0,25)|0;e=Cd(h|0,A|0,e|0,C|0)|0;A=Dd(d|0,r|0,33554432,0)|0;A=Ed(A|0,C|0,26)|0;h=C;g=Dd(B|0,g|0,A|0,h|0)|0;h=Hd(A|0,h|0,26)|0;h=Cd(d|0,r|0,h|0,C|0)|0;r=Dd(b|0,q|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;d=C;w=Dd(z|0,y|0,x|0,w|0)|0;u=Dd(w|0,C|0,v|0,u|0)|0;s=Dd(u|0,C|0,t|0,s|0)|0;l=Dd(s|0,C|0,o|0,l|0)|0;l=Dd(l|0,C|0,r|0,d|0)|0;o=C;d=Hd(r|0,d|0,26)|0;d=Cd(b|0,q|0,d|0,C|0)|0;q=Dd(l|0,o|0,16777216,0)|0;q=Ed(q|0,C|0,25)|0;b=C;r=Od(q|0,b|0,19,0)|0;n=Dd(r|0,C|0,m|0,n|0)|0;m=C;b=Hd(q|0,b|0,25)|0;b=Cd(l|0,o|0,b|0,C|0)|0;o=Dd(n|0,m|0,33554432,0)|0;o=Ed(o|0,C|0,26)|0;l=C;k=Dd(p|0,k|0,o|0,l|0)|0;l=Hd(o|0,l|0,26)|0;l=Cd(n|0,m|0,l|0,C|0)|0;c[a>>2]=l;c[a+4>>2]=k;c[a+8>>2]=j;c[a+12>>2]=i;c[a+16>>2]=h;c[a+20>>2]=g;c[a+24>>2]=f;c[a+28>>2]=e;c[a+32>>2]=d;c[a+36>>2]=b;return}function md(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0;Ya=i;Oa=i=i+63&-64;i=i+480|0;Ta=Oa+400|0;Ua=Oa+360|0;Va=Oa+320|0;Sa=Oa+280|0;Ma=Oa+440|0;Pa=Oa+240|0;Wa=Oa+200|0;Xa=Oa+160|0;Qa=Oa+120|0;Ra=Oa+80|0;Na=Oa+40|0;h=Ma;g=h+32|0;do{a[h>>0]=a[e>>0]|0;h=h+1|0;e=e+1|0}while((h|0)<(g|0));a[Ma>>0]=(d[Ma>>0]|0)&248;m=Ma+31|0;a[m>>0]=(d[m>>0]|0)&63|64;m=d[f>>0]|0;Da=Hd(d[f+1>>0]|0|0,0,8)|0;j=C;va=Hd(d[f+2>>0]|0|0,0,16)|0;j=j|C;Aa=Hd(d[f+3>>0]|0|0,0,24)|0;j=j|C;k=a[f+6>>0]|0;l=d[f+4>>0]|0;ya=Hd(d[f+5>>0]|0|0,0,8)|0;za=C;k=Hd(k&255|0,0,16)|0;za=Hd(ya|l|k|0,za|C|0,6)|0;k=C;l=a[f+9>>0]|0;ya=d[f+7>>0]|0;n=Hd(d[f+8>>0]|0|0,0,8)|0;Ea=C;l=Hd(l&255|0,0,16)|0;Ea=Hd(n|ya|l|0,Ea|C|0,5)|0;l=C;ya=a[f+12>>0]|0;n=d[f+10>>0]|0;Ga=Hd(d[f+11>>0]|0|0,0,8)|0;xa=C;ya=Hd(ya&255|0,0,16)|0;xa=Hd(Ga|n|ya|0,xa|C|0,3)|0;ya=C;n=a[f+15>>0]|0;Ga=d[f+13>>0]|0;h=Hd(d[f+14>>0]|0|0,0,8)|0;Ia=C;n=Hd(n&255|0,0,16)|0;Ia=Hd(h|Ga|n|0,Ia|C|0,2)|0;n=C;Ga=d[f+16>>0]|0;h=Hd(d[f+17>>0]|0|0,0,8)|0;Ca=C;p=Hd(d[f+18>>0]|0|0,0,16)|0;Ca=Ca|C;Ba=Hd(d[f+19>>0]|0|0,0,24)|0;Ba=h|Ga|p|Ba;Ca=Ca|C;p=a[f+22>>0]|0;Ga=d[f+20>>0]|0;h=Hd(d[f+21>>0]|0|0,0,8)|0;g=C;p=Hd(p&255|0,0,16)|0;g=Hd(h|Ga|p|0,g|C|0,7)|0;p=C;Ga=a[f+25>>0]|0;h=d[f+23>>0]|0;q=Hd(d[f+24>>0]|0|0,0,8)|0;Fa=C;Ga=Hd(Ga&255|0,0,16)|0;Fa=Hd(q|h|Ga|0,Fa|C|0,5)|0;Ga=C;h=a[f+28>>0]|0;q=d[f+26>>0]|0;Ka=Hd(d[f+27>>0]|0|0,0,8)|0;La=C;h=Hd(h&255|0,0,16)|0;La=Hd(Ka|q|h|0,La|C|0,4)|0;h=C;q=a[f+31>>0]|0;Ka=d[f+29>>0]|0;f=Hd(d[f+30>>0]|0|0,0,8)|0;Ja=C;q=Hd(q&255|0,0,16)|0;Ja=Hd(f|Ka|q|0,Ja|C|0,2)|0;Ja=Ja&33554428;q=Dd(Ja|0,0,16777216,0)|0;q=Gd(q|0,C|0,25)|0;Ka=C;f=Cd(0,0,q|0,Ka|0)|0;j=Dd(f&19|0,0,Da|m|va|Aa|0,j|0)|0;Aa=C;Ka=Hd(q|0,Ka|0,25)|0;q=C;f=Dd(za|0,k|0,16777216,0)|0;f=Gd(f|0,C|0,25)|0;va=C;l=Dd(Ea|0,l|0,f|0,va|0)|0;Ea=C;va=Hd(f|0,va|0,25)|0;va=Cd(za|0,k|0,va|0,C|0)|0;f=C;k=Dd(xa|0,ya|0,16777216,0)|0;k=Gd(k|0,C|0,25)|0;za=C;n=Dd(Ia|0,n|0,k|0,za|0)|0;Ia=C;za=Hd(k|0,za|0,25)|0;k=C;m=Dd(Ba|0,Ca|0,16777216,0)|0;m=Gd(m|0,C|0,25)|0;Da=C;p=Dd(g|0,p|0,m|0,Da|0)|0;g=C;Da=Hd(m|0,Da|0,25)|0;m=C;o=Dd(Fa|0,Ga|0,16777216,0)|0;o=Gd(o|0,C|0,25)|0;Ha=C;h=Dd(La|0,h|0,o|0,Ha|0)|0;La=C;Ha=Hd(o|0,Ha|0,25)|0;o=C;wa=Dd(j|0,Aa|0,33554432,0)|0;wa=Ed(wa|0,C|0,26)|0;e=C;f=Dd(va|0,f|0,wa|0,e|0)|0;e=Hd(wa|0,e|0,26)|0;e=Cd(j|0,Aa|0,e|0,C|0)|0;Aa=Dd(l|0,Ea|0,33554432,0)|0;Aa=Ed(Aa|0,C|0,26)|0;j=C;ya=Dd(Aa|0,j|0,xa|0,ya|0)|0;k=Cd(ya|0,C|0,za|0,k|0)|0;j=Hd(Aa|0,j|0,26)|0;j=Cd(l|0,Ea|0,j|0,C|0)|0;Ea=Dd(n|0,Ia|0,33554432,0)|0;Ea=Ed(Ea|0,C|0,26)|0;l=C;Ca=Dd(Ea|0,l|0,Ba|0,Ca|0)|0;m=Cd(Ca|0,C|0,Da|0,m|0)|0;l=Hd(Ea|0,l|0,26)|0;l=Cd(n|0,Ia|0,l|0,C|0)|0;Ia=Dd(p|0,g|0,33554432,0)|0;Ia=Ed(Ia|0,C|0,26)|0;n=C;Ga=Dd(Ia|0,n|0,Fa|0,Ga|0)|0;o=Cd(Ga|0,C|0,Ha|0,o|0)|0;n=Hd(Ia|0,n|0,26)|0;n=Cd(p|0,g|0,n|0,C|0)|0;g=Dd(h|0,La|0,33554432,0)|0;g=Ed(g|0,C|0,26)|0;p=C;Ja=Dd(Ja|0,0,g|0,p|0)|0;q=Cd(Ja|0,C|0,Ka|0,q|0)|0;p=Hd(g|0,p|0,26)|0;p=Cd(h|0,La|0,p|0,C|0)|0;c[Pa>>2]=e;c[Pa+4>>2]=f;c[Pa+8>>2]=j;c[Pa+12>>2]=k;c[Pa+16>>2]=l;c[Pa+20>>2]=m;c[Pa+24>>2]=n;c[Pa+28>>2]=o;c[Pa+32>>2]=p;c[Pa+36>>2]=q;c[Wa>>2]=1;La=Wa+4|0;h=La;g=h+36|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(g|0));h=Xa;g=h+40|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(g|0));c[Qa>>2]=e;ta=Qa+4|0;c[ta>>2]=f;ua=Qa+8|0;c[ua>>2]=j;va=Qa+12|0;c[va>>2]=k;wa=Qa+16|0;c[wa>>2]=l;xa=Qa+20|0;c[xa>>2]=m;ya=Qa+24|0;c[ya>>2]=n;za=Qa+28|0;c[za>>2]=o;Aa=Qa+32|0;c[Aa>>2]=p;Ba=Qa+36|0;c[Ba>>2]=q;c[Ra>>2]=1;Ca=Ra+4|0;h=Ca;g=h+36|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(g|0));Da=Wa+8|0;Ea=Wa+12|0;Fa=Wa+16|0;Ga=Wa+20|0;Ha=Wa+24|0;Ia=Wa+28|0;Ja=Wa+32|0;Ka=Wa+36|0;M=Xa+4|0;N=Xa+8|0;O=Xa+12|0;P=Xa+16|0;Q=Xa+20|0;R=Xa+24|0;S=Xa+28|0;T=Xa+32|0;U=Xa+36|0;V=Ra+8|0;W=Ra+12|0;X=Ra+16|0;Y=Ra+20|0;Z=Ra+24|0;_=Ra+28|0;$=Ra+32|0;aa=Ra+36|0;ba=Na+4|0;ca=Na+8|0;da=Na+12|0;ea=Na+16|0;fa=Na+20|0;ga=Na+24|0;ha=Na+28|0;ia=Na+32|0;ja=Na+36|0;ka=Oa+4|0;la=Oa+8|0;ma=Oa+12|0;na=Oa+16|0;oa=Oa+20|0;pa=Oa+24|0;qa=Oa+28|0;ra=Oa+32|0;sa=Oa+36|0;L=1;K=0;J=0;I=0;H=0;G=0;F=0;E=0;D=0;h=0;r=0;s=0;t=0;u=0;v=0;w=0;x=0;y=0;z=0;A=254;B=0;while(1){g=(d[Ma+((A|0)/8|0)>>0]|0)>>>(A&7)&1;nb=0-(g^B)|0;bb=(e^L)&nb;ab=(f^K)&nb;$a=(j^J)&nb;_a=(k^I)&nb;Za=(l^H)&nb;kb=(m^G)&nb;mb=(n^F)&nb;B=(o^E)&nb;jb=(p^D)&nb;lb=(q^h)&nb;c[Wa>>2]=bb^L;c[La>>2]=ab^K;c[Da>>2]=$a^J;c[Ea>>2]=_a^I;c[Fa>>2]=Za^H;c[Ga>>2]=kb^G;c[Ha>>2]=mb^F;c[Ia>>2]=B^E;c[Ja>>2]=jb^D;c[Ka>>2]=lb^h;bb=bb^e;c[Qa>>2]=bb;ab=ab^f;c[ta>>2]=ab;$a=$a^j;c[ua>>2]=$a;_a=_a^k;c[va>>2]=_a;Za=Za^l;c[wa>>2]=Za;I=kb^m;c[xa>>2]=I;E=mb^n;c[ya>>2]=E;l=B^o;c[za>>2]=l;j=jb^p;c[Aa>>2]=j;f=lb^q;c[Ba>>2]=f;K=c[U>>2]|0;lb=c[Ra>>2]|0;jb=c[Ca>>2]|0;B=c[V>>2]|0;p=c[W>>2]|0;q=c[X>>2]|0;D=c[Y>>2]|0;F=c[Z>>2]|0;H=c[_>>2]|0;J=c[$>>2]|0;L=c[aa>>2]|0;mb=(lb^r)&nb;kb=(jb^s)&nb;ib=(B^t)&nb;hb=(p^u)&nb;gb=(q^v)&nb;fb=(D^w)&nb;eb=(F^x)&nb;db=(H^y)&nb;cb=(J^z)&nb;o=(L^K)&nb;e=mb^r;c[Xa>>2]=e;h=kb^s;c[M>>2]=h;k=ib^t;c[N>>2]=k;m=hb^u;c[O>>2]=m;n=gb^v;c[P>>2]=n;r=fb^w;c[Q>>2]=r;v=eb^x;c[R>>2]=v;x=db^y;c[S>>2]=x;G=cb^z;c[T>>2]=G;K=o^K;c[U>>2]=K;s=mb^lb;c[Ra>>2]=s;u=kb^jb;c[Ca>>2]=u;B=ib^B;c[V>>2]=B;p=hb^p;c[W>>2]=p;q=gb^q;c[X>>2]=q;D=fb^D;c[Y>>2]=D;F=eb^F;c[Z>>2]=F;H=db^H;c[_>>2]=H;J=cb^J;c[$>>2]=J;L=o^L;c[aa>>2]=L;c[Na>>2]=bb-s;c[ba>>2]=ab-u;c[ca>>2]=$a-B;c[da>>2]=_a-p;c[ea>>2]=Za-q;c[fa>>2]=I-D;c[ga>>2]=E-F;c[ha>>2]=l-H;c[ia>>2]=j-J;c[ja>>2]=f-L;f=c[Wa>>2]|0;j=c[La>>2]|0;l=c[Da>>2]|0;w=c[Ea>>2]|0;o=c[Fa>>2]|0;t=c[Ga>>2]|0;z=c[Ha>>2]|0;E=c[Ia>>2]|0;I=c[Ja>>2]|0;y=c[Ka>>2]|0;c[Oa>>2]=f-e;c[ka>>2]=j-h;c[la>>2]=l-k;c[ma>>2]=w-m;c[na>>2]=o-n;c[oa>>2]=t-r;c[pa>>2]=z-v;c[qa>>2]=E-x;c[ra>>2]=I-G;c[sa>>2]=y-K;c[Wa>>2]=e+f;c[La>>2]=h+j;c[Da>>2]=k+l;c[Ea>>2]=m+w;c[Fa>>2]=n+o;c[Ga>>2]=r+t;c[Ha>>2]=v+z;c[Ia>>2]=x+E;c[Ja>>2]=G+I;c[Ka>>2]=K+y;u=u+(c[ta>>2]|0)|0;B=B+(c[ua>>2]|0)|0;p=p+(c[va>>2]|0)|0;q=q+(c[wa>>2]|0)|0;D=D+(c[xa>>2]|0)|0;F=F+(c[ya>>2]|0)|0;H=H+(c[za>>2]|0)|0;J=J+(c[Aa>>2]|0)|0;L=L+(c[Ba>>2]|0)|0;c[Xa>>2]=s+(c[Qa>>2]|0);c[M>>2]=u;c[N>>2]=B;c[O>>2]=p;c[P>>2]=q;c[Q>>2]=D;c[R>>2]=F;c[S>>2]=H;c[T>>2]=J;c[U>>2]=L;kd(Ra,Na,Wa);kd(Xa,Xa,Oa);ld(Na,Oa);ld(Oa,Wa);L=c[Ra>>2]|0;J=c[Ca>>2]|0;H=c[V>>2]|0;F=c[W>>2]|0;D=c[X>>2]|0;q=c[Y>>2]|0;p=c[Z>>2]|0;B=c[_>>2]|0;u=c[$>>2]|0;s=c[aa>>2]|0;y=c[Xa>>2]|0;K=c[M>>2]|0;I=c[N>>2]|0;G=c[O>>2]|0;E=c[P>>2]|0;z=c[Q>>2]|0;x=c[R>>2]|0;v=c[S>>2]|0;t=c[T>>2]|0;r=c[U>>2]|0;c[Qa>>2]=y+L;c[ta>>2]=K+J;c[ua>>2]=I+H;c[va>>2]=G+F;c[wa>>2]=E+D;c[xa>>2]=z+q;c[ya>>2]=x+p;c[za>>2]=v+B;c[Aa>>2]=t+u;c[Ba>>2]=r+s;c[Xa>>2]=L-y;c[M>>2]=J-K;c[N>>2]=H-I;c[O>>2]=F-G;c[P>>2]=D-E;c[Q>>2]=q-z;c[R>>2]=p-x;c[S>>2]=B-v;c[T>>2]=u-t;c[U>>2]=s-r;kd(Wa,Oa,Na);r=(c[Oa>>2]|0)-(c[Na>>2]|0)|0;s=(c[ka>>2]|0)-(c[ba>>2]|0)|0;t=(c[la>>2]|0)-(c[ca>>2]|0)|0;u=(c[ma>>2]|0)-(c[da>>2]|0)|0;v=(c[na>>2]|0)-(c[ea>>2]|0)|0;B=(c[oa>>2]|0)-(c[fa>>2]|0)|0;x=(c[pa>>2]|0)-(c[ga>>2]|0)|0;p=(c[qa>>2]|0)-(c[ha>>2]|0)|0;z=(c[ra>>2]|0)-(c[ia>>2]|0)|0;q=(c[sa>>2]|0)-(c[ja>>2]|0)|0;c[Oa>>2]=r;c[ka>>2]=s;c[la>>2]=t;c[ma>>2]=u;c[na>>2]=v;c[oa>>2]=B;c[pa>>2]=x;c[qa>>2]=p;c[ra>>2]=z;c[sa>>2]=q;ld(Xa,Xa);r=Od(r|0,((r|0)<0)<<31>>31|0,121666,0)|0;E=C;s=Od(s|0,((s|0)<0)<<31>>31|0,121666,0)|0;D=C;t=Od(t|0,((t|0)<0)<<31>>31|0,121666,0)|0;G=C;u=Od(u|0,((u|0)<0)<<31>>31|0,121666,0)|0;F=C;v=Od(v|0,((v|0)<0)<<31>>31|0,121666,0)|0;I=C;B=Od(B|0,((B|0)<0)<<31>>31|0,121666,0)|0;H=C;x=Od(x|0,((x|0)<0)<<31>>31|0,121666,0)|0;K=C;p=Od(p|0,((p|0)<0)<<31>>31|0,121666,0)|0;J=C;z=Od(z|0,((z|0)<0)<<31>>31|0,121666,0)|0;y=C;q=Od(q|0,((q|0)<0)<<31>>31|0,121666,0)|0;L=C;o=Dd(q|0,L|0,16777216,0)|0;o=Ed(o|0,C|0,25)|0;w=C;n=Od(o|0,w|0,19,0)|0;E=Dd(n|0,C|0,r|0,E|0)|0;r=C;w=Hd(o|0,w|0,25)|0;w=Cd(q|0,L|0,w|0,C|0)|0;L=C;q=Dd(s|0,D|0,16777216,0)|0;q=Ed(q|0,C|0,25)|0;o=C;G=Dd(q|0,o|0,t|0,G|0)|0;t=C;o=Hd(q|0,o|0,25)|0;o=Cd(s|0,D|0,o|0,C|0)|0;D=C;s=Dd(u|0,F|0,16777216,0)|0;s=Ed(s|0,C|0,25)|0;q=C;I=Dd(s|0,q|0,v|0,I|0)|0;v=C;q=Hd(s|0,q|0,25)|0;q=Cd(u|0,F|0,q|0,C|0)|0;F=C;u=Dd(B|0,H|0,16777216,0)|0;u=Ed(u|0,C|0,25)|0;s=C;K=Dd(u|0,s|0,x|0,K|0)|0;x=C;s=Hd(u|0,s|0,25)|0;s=Cd(B|0,H|0,s|0,C|0)|0;H=C;B=Dd(p|0,J|0,16777216,0)|0;B=Ed(B|0,C|0,25)|0;u=C;y=Dd(B|0,u|0,z|0,y|0)|0;z=C;u=Hd(B|0,u|0,25)|0;u=Cd(p|0,J|0,u|0,C|0)|0;J=C;p=Dd(E|0,r|0,33554432,0)|0;p=Ed(p|0,C|0,26)|0;B=C;D=Dd(o|0,D|0,p|0,B|0)|0;B=Hd(p|0,B|0,26)|0;B=Cd(E|0,r|0,B|0,C|0)|0;r=Dd(G|0,t|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;E=C;F=Dd(q|0,F|0,r|0,E|0)|0;E=Hd(r|0,E|0,26)|0;E=Cd(G|0,t|0,E|0,C|0)|0;t=Dd(I|0,v|0,33554432,0)|0;t=Ed(t|0,C|0,26)|0;G=C;H=Dd(s|0,H|0,t|0,G|0)|0;G=Hd(t|0,G|0,26)|0;G=Cd(I|0,v|0,G|0,C|0)|0;v=Dd(K|0,x|0,33554432,0)|0;v=Ed(v|0,C|0,26)|0;I=C;J=Dd(u|0,J|0,v|0,I|0)|0;I=Hd(v|0,I|0,26)|0;I=Cd(K|0,x|0,I|0,C|0)|0;x=Dd(y|0,z|0,33554432,0)|0;x=Ed(x|0,C|0,26)|0;K=C;L=Dd(w|0,L|0,x|0,K|0)|0;K=Hd(x|0,K|0,26)|0;K=Cd(y|0,z|0,K|0,C|0)|0;c[Ra>>2]=B;c[Ca>>2]=D;c[V>>2]=E;c[W>>2]=F;c[X>>2]=G;c[Y>>2]=H;c[Z>>2]=I;c[_>>2]=J;c[$>>2]=K;c[aa>>2]=L;ld(Qa,Qa);D=D+(c[ba>>2]|0)|0;E=E+(c[ca>>2]|0)|0;F=F+(c[da>>2]|0)|0;G=G+(c[ea>>2]|0)|0;H=H+(c[fa>>2]|0)|0;I=I+(c[ga>>2]|0)|0;J=J+(c[ha>>2]|0)|0;K=K+(c[ia>>2]|0)|0;L=L+(c[ja>>2]|0)|0;c[Na>>2]=B+(c[Na>>2]|0);c[ba>>2]=D;c[ca>>2]=E;c[da>>2]=F;c[ea>>2]=G;c[fa>>2]=H;c[ga>>2]=I;c[ha>>2]=J;c[ia>>2]=K;c[ja>>2]=L;kd(Ra,Pa,Xa);kd(Xa,Oa,Na);if((A|0)<=0)break;e=c[Qa>>2]|0;L=c[Wa>>2]|0;f=c[ta>>2]|0;K=c[La>>2]|0;j=c[ua>>2]|0;J=c[Da>>2]|0;k=c[va>>2]|0;I=c[Ea>>2]|0;l=c[wa>>2]|0;H=c[Fa>>2]|0;m=c[xa>>2]|0;G=c[Ga>>2]|0;n=c[ya>>2]|0;F=c[Ha>>2]|0;o=c[za>>2]|0;E=c[Ia>>2]|0;p=c[Aa>>2]|0;D=c[Ja>>2]|0;q=c[Ba>>2]|0;h=c[Ka>>2]|0;r=c[Xa>>2]|0;s=c[M>>2]|0;t=c[N>>2]|0;u=c[O>>2]|0;v=c[P>>2]|0;w=c[Q>>2]|0;x=c[R>>2]|0;y=c[S>>2]|0;z=c[T>>2]|0;A=A+-1|0;B=g}ka=c[Wa>>2]|0;la=c[La>>2]|0;ma=c[Da>>2]|0;na=c[Ea>>2]|0;oa=c[Fa>>2]|0;pa=c[Ga>>2]|0;qa=c[Ha>>2]|0;ra=c[Ia>>2]|0;sa=c[Ja>>2]|0;lb=c[Ka>>2]|0;hb=c[Qa>>2]|0;db=c[ta>>2]|0;$a=c[ua>>2]|0;Pa=c[va>>2]|0;mb=c[wa>>2]|0;ib=c[xa>>2]|0;eb=c[ya>>2]|0;ab=c[za>>2]|0;Oa=c[Aa>>2]|0;Ma=c[Ba>>2]|0;nb=0-g|0;jb=(hb^ka)&nb;fb=(db^la)&nb;bb=($a^ma)&nb;Za=(Pa^na)&nb;e=(mb^oa)&nb;kb=(ib^pa)&nb;gb=(eb^qa)&nb;cb=(ab^ra)&nb;_a=(Oa^sa)&nb;Na=(Ma^lb)&nb;c[Wa>>2]=jb^ka;c[La>>2]=fb^la;c[Da>>2]=bb^ma;c[Ea>>2]=Za^na;c[Fa>>2]=e^oa;c[Ga>>2]=kb^pa;c[Ha>>2]=gb^qa;c[Ia>>2]=cb^ra;c[Ja>>2]=_a^sa;c[Ka>>2]=Na^lb;c[Qa>>2]=jb^hb;c[ta>>2]=fb^db;c[ua>>2]=bb^$a;c[va>>2]=Za^Pa;c[wa>>2]=e^mb;c[xa>>2]=kb^ib;c[ya>>2]=gb^eb;c[za>>2]=cb^ab;c[Aa>>2]=_a^Oa;c[Ba>>2]=Na^Ma;va=c[Xa>>2]|0;wa=c[M>>2]|0;xa=c[N>>2]|0;ya=c[O>>2]|0;za=c[P>>2]|0;Aa=c[Q>>2]|0;Ba=c[R>>2]|0;Ma=c[S>>2]|0;Na=c[T>>2]|0;Oa=c[U>>2]|0;Qa=c[Ra>>2]|0;_a=c[Ca>>2]|0;ab=c[V>>2]|0;cb=c[W>>2]|0;eb=c[X>>2]|0;gb=c[Y>>2]|0;ib=c[Z>>2]|0;kb=c[_>>2]|0;mb=c[$>>2]|0;e=c[aa>>2]|0;Pa=(Qa^va)&nb;Za=(_a^wa)&nb;$a=(ab^xa)&nb;bb=(cb^ya)&nb;db=(eb^za)&nb;fb=(gb^Aa)&nb;hb=(ib^Ba)&nb;jb=(kb^Ma)&nb;lb=(mb^Na)&nb;nb=(e^Oa)&nb;c[Xa>>2]=Pa^va;c[M>>2]=Za^wa;c[N>>2]=$a^xa;c[O>>2]=bb^ya;c[P>>2]=db^za;c[Q>>2]=fb^Aa;c[R>>2]=hb^Ba;c[S>>2]=jb^Ma;c[T>>2]=lb^Na;c[U>>2]=nb^Oa;c[Ra>>2]=Pa^Qa;c[Ca>>2]=Za^_a;c[V>>2]=$a^ab;c[W>>2]=bb^cb;c[X>>2]=db^eb;c[Y>>2]=fb^gb;c[Z>>2]=hb^ib;c[_>>2]=jb^kb;c[$>>2]=lb^mb;c[aa>>2]=nb^e;ld(Ta,Xa);ld(Ua,Ta);ld(Ua,Ua);kd(Ua,Xa,Ua);kd(Ta,Ta,Ua);ld(Va,Ta);kd(Ua,Ua,Va);ld(Va,Ua);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);kd(Ua,Va,Ua);ld(Va,Ua);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);kd(Va,Va,Ua);ld(Sa,Va);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);ld(Sa,Sa);kd(Va,Sa,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);ld(Va,Va);kd(Ua,Va,Ua);ld(Va,Ua);e=1;do{ld(Va,Va);e=e+1|0}while((e|0)!=50);kd(Va,Va,Ua);ld(Sa,Va);e=1;do{ld(Sa,Sa);e=e+1|0}while((e|0)!=100);kd(Va,Sa,Va);ld(Va,Va);e=1;do{ld(Va,Va);e=e+1|0}while((e|0)!=50);kd(Ua,Va,Ua);ld(Ua,Ua);ld(Ua,Ua);ld(Ua,Ua);ld(Ua,Ua);ld(Ua,Ua);kd(Xa,Ua,Ta);kd(Wa,Wa,Xa);eb=c[Wa>>2]|0;fb=c[La>>2]|0;gb=c[Da>>2]|0;hb=c[Ea>>2]|0;ib=c[Fa>>2]|0;jb=c[Ga>>2]|0;kb=c[Ha>>2]|0;lb=c[Ia>>2]|0;nb=c[Ja>>2]|0;mb=c[Ka>>2]|0;eb=(((((((((((((mb*19|0)+16777216>>25)+eb>>26)+fb>>25)+gb>>26)+hb>>25)+ib>>26)+jb>>25)+kb>>26)+lb>>25)+nb>>26)+mb>>25)*19|0)+eb|0;db=eb>>26;fb=db+fb|0;db=eb-(db<<26)|0;eb=fb>>25;gb=eb+gb|0;eb=fb-(eb<<25)|0;fb=gb>>26;hb=fb+hb|0;fb=gb-(fb<<26)|0;gb=hb>>25;ib=gb+ib|0;gb=hb-(gb<<25)|0;hb=ib>>26;jb=hb+jb|0;hb=ib-(hb<<26)|0;ib=jb>>25;kb=ib+kb|0;ib=jb-(ib<<25)|0;jb=kb>>26;lb=jb+lb|0;jb=kb-(jb<<26)|0;kb=lb>>25;nb=kb+nb|0;kb=lb-(kb<<25)|0;lb=nb>>26;mb=lb+mb|0;lb=nb-(lb<<26)|0;nb=mb&33554431;a[b>>0]=db;a[b+1>>0]=db>>>8;a[b+2>>0]=db>>>16;a[b+3>>0]=eb<<2|db>>>24;a[b+4>>0]=eb>>>6;a[b+5>>0]=eb>>>14;a[b+6>>0]=fb<<3|eb>>>22;a[b+7>>0]=fb>>>5;a[b+8>>0]=fb>>>13;a[b+9>>0]=gb<<5|fb>>>21;a[b+10>>0]=gb>>>3;a[b+11>>0]=gb>>>11;a[b+12>>0]=hb<<6|gb>>>19;a[b+13>>0]=hb>>>2;a[b+14>>0]=hb>>>10;a[b+15>>0]=hb>>>18;a[b+16>>0]=ib;a[b+17>>0]=ib>>>8;a[b+18>>0]=ib>>>16;a[b+19>>0]=jb<<1|ib>>>24;a[b+20>>0]=jb>>>7;a[b+21>>0]=jb>>>15;a[b+22>>0]=kb<<3|jb>>>23;a[b+23>>0]=kb>>>5;a[b+24>>0]=kb>>>13;a[b+25>>0]=lb<<4|kb>>>21;a[b+26>>0]=lb>>>4;a[b+27>>0]=lb>>>12;a[b+28>>0]=lb>>>20|nb<<6;a[b+29>>0]=mb>>>2;a[b+30>>0]=mb>>>10;a[b+31>>0]=nb>>>18;i=Ya;return}function nd(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0;D=i;B=i=i+63&-64;i=i+112|0;v=B;A=B+48|0;B=B+16|0;if((f|0)==0&(g|0)==0){i=D;return}n=B;m=n+32|0;do{a[n>>0]=a[l>>0]|0;n=n+1|0;l=l+1|0}while((n|0)<(m|0));s=h;p=s;s=s+4|0;s=d[s>>0]|d[s+1>>0]<<8|d[s+2>>0]<<16|d[s+3>>0]<<24;o=v;c[o>>2]=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;c[o+4>>2]=s;o=v+8|0;a[o>>0]=j;s=Gd(j|0,k|0,8)|0;p=v+9|0;a[p>>0]=s;s=Gd(j|0,k|0,16)|0;q=v+10|0;a[q>>0]=s;s=Gd(j|0,k|0,24)|0;r=v+11|0;a[r>>0]=s;s=v+12|0;a[s>>0]=k;n=Gd(j|0,k|0,40)|0;t=v+13|0;a[t>>0]=n;n=Gd(j|0,k|0,48)|0;u=v+14|0;a[u>>0]=n;k=Gd(j|0,k|0,56)|0;j=v+15|0;a[j>>0]=k;if(g>>>0>0|(g|0)==0&f>>>0>63){n=e;h=f;l=g;do{ob(A,v,B,33833);m=0;do{a[b+m>>0]=a[A+m>>0]^a[n+m>>0];m=m+1|0}while((m|0)!=64);f=c[o>>2]|0;g=(f&255)+1|0;a[o>>0]=g;g=(f>>>8&255)+(g>>>8)|0;a[p>>0]=g;g=(f>>>16&255)+(g>>>8)|0;a[q>>0]=g;g=(f>>>24)+(g>>>8)|0;a[r>>0]=g;f=c[s>>2]|0;g=(f&255)+(g>>>8)|0;a[s>>0]=g;g=(f>>>8&255)+(g>>>8)|0;a[t>>0]=g;g=(f>>>16&255)+(g>>>8)|0;a[u>>0]=g;a[j>>0]=(f>>>24)+(g>>>8);h=Dd(h|0,l|0,-64,-1)|0;l=C;b=b+64|0;n=n+64|0}while(l>>>0>0|(l|0)==0&h>>>0>63);if(!((h|0)==0&(l|0)==0)){x=b;y=h;z=n;w=8}}else{x=b;y=f;z=e;w=8}if((w|0)==8?(ob(A,v,B,33833),(y|0)!=0):0){l=0;do{a[x+l>>0]=a[A+l>>0]^a[z+l>>0];l=l+1|0}while((l|0)!=(y|0))}n=A;m=n+64|0;do{a[n>>0]=0;n=n+1|0}while((n|0)<(m|0));n=B;m=n+32|0;do{a[n>>0]=0;n=n+1|0}while((n|0)<(m|0));i=D;return}function od(){var a=0;if(!(c[7979]|0))a=31964;else a=c[(oa()|0)+60>>2]|0;return a|0}function pd(a){a=a|0;var b=0,d=0;d=i;b=i=i+63&-64;i=i+16|0;c[b>>2]=c[a+60>>2];a=pa(6,b|0)|0;if(a>>>0>4294963200){if(!(c[7979]|0))b=31964;else b=c[(oa()|0)+60>>2]|0;c[b>>2]=0-a;a=-1}i=d;return a|0}function qd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=i;e=i=i+63&-64;i=i+32|0;h=e;e=e+20|0;c[h>>2]=c[a+60>>2];c[h+4>>2]=0;c[h+8>>2]=b;c[h+12>>2]=e;c[h+16>>2]=d;b=ya(140,h|0)|0;if(b>>>0<=4294963200)if((b|0)<0)f=7;else a=c[e>>2]|0;else{if(!(c[7979]|0))a=31964;else a=c[(oa()|0)+60>>2]|0;c[a>>2]=0-b;f=7}if((f|0)==7){c[e>>2]=-1;a=-1}i=g;return a|0}function rd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;k=i=i+63&-64;i=i+48|0;n=k+16|0;m=k;k=k+32|0;o=a+28|0;g=c[o>>2]|0;c[k>>2]=g;p=a+20|0;g=(c[p>>2]|0)-g|0;c[k+4>>2]=g;c[k+8>>2]=b;c[k+12>>2]=d;j=a+60|0;l=a+44|0;f=2;g=g+d|0;while(1){if(!(c[7979]|0)){c[n>>2]=c[j>>2];c[n+4>>2]=k;c[n+8>>2]=f;b=Aa(146,n|0)|0;if(b>>>0>4294963200){if(!(c[7979]|0))e=31964;else e=c[(oa()|0)+60>>2]|0;c[e>>2]=0-b;b=-1}}else{ua(18,a|0);c[m>>2]=c[j>>2];c[m+4>>2]=k;c[m+8>>2]=f;b=Aa(146,m|0)|0;if(b>>>0>4294963200){if(!(c[7979]|0))e=31964;else e=c[(oa()|0)+60>>2]|0;c[e>>2]=0-b;b=-1}la(0)}if((g|0)==(b|0)){b=13;break}if((b|0)<0){b=15;break}g=g-b|0;e=c[k+4>>2]|0;if(b>>>0<=e>>>0)if((f|0)==2){c[o>>2]=(c[o>>2]|0)+b;h=e;e=k;f=2}else{h=e;e=k}else{h=c[l>>2]|0;c[o>>2]=h;c[p>>2]=h;h=c[k+12>>2]|0;b=b-e|0;e=k+8|0;f=f+-1|0}c[e>>2]=(c[e>>2]|0)+b;c[e+4>>2]=h-b;k=e}if((b|0)==13){n=c[l>>2]|0;c[a+16>>2]=n+(c[a+48>>2]|0);a=n;c[o>>2]=a;c[p>>2]=a}else if((b|0)==15){c[a+16>>2]=0;c[o>>2]=0;c[p>>2]=0;c[a>>2]=c[a>>2]|32;if((f|0)==2)d=0;else d=d-(c[k+4>>2]|0)|0}i=q;return d|0}function sd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=i;h=i=i+63&-64;i=i+80|0;f=h;c[b+36>>2]=20;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21505,c[f+8>>2]=h+12,(wa(54,f|0)|0)!=0):0)a[b+75>>0]=-1;h=rd(b,d,e)|0;i=g;return h|0}function td(a){a=a|0;var b=0;if(!a){if(!(c[7990]|0))a=0;else a=td(c[7990]|0)|0;ma(31944);b=c[7985]|0;if(b)do{if((c[b+20>>2]|0)>>>0>(c[b+28>>2]|0)>>>0)a=xd(b)|0|a;b=c[b+56>>2]|0}while((b|0)!=0);xa(31944)}else a=xd(a)|0;return a|0}function ud(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(vd(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=_(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009)break b;b=b+4|0;e=c[b>>2]|0}while(((e&-2139062144^-2139062144)&e+-16843009|0)==0);while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function vd(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=4;else{d=b;b=f;while(1){if(!(a[d>>0]|0))break a;d=d+1|0;b=d;if(!(b&3)){b=d;e=4;break}}}while(0);if((e|0)==4){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function wd(a){a=a|0;return}function xd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+20|0;g=a+28|0;if((c[b>>2]|0)>>>0>(c[g>>2]|0)>>>0?(Fa[c[a+36>>2]&31](a,0,0)|0,(c[b>>2]|0)==0):0)b=-1;else{h=a+4|0;d=c[h>>2]|0;e=a+8|0;f=c[e>>2]|0;if(d>>>0>>0)Fa[c[a+40>>2]&31](a,d-f|0,1)|0;c[a+16>>2]=0;c[g>>2]=0;c[b>>2]=0;c[e>>2]=0;c[h>>2]=0;b=0}return b|0} function Hb(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;h=i;g=i=i+63&-64;i=i+640|0;e=0;do{j=b+(e<<3)|0;o=d[j+7>>0]|0;p=Hd(d[j+6>>0]|0|0,0,8)|0;f=C;n=Hd(d[j+5>>0]|0|0,0,16)|0;f=f|C;m=Hd(d[j+4>>0]|0|0,0,24)|0;f=f|C|(d[j+3>>0]|0);l=Hd(d[j+2>>0]|0|0,0,40)|0;f=f|C;k=Hd(d[j+1>>0]|0|0,0,48)|0;k=Dd(p|o|n|m|l|0,f|0,k|0,C|0)|0;f=C;j=Hd(d[j>>0]|0|0,0,56)|0;j=Dd(k|0,f|0,j|0,C|0)|0;f=g+(e<<3)|0;c[f>>2]=j;c[f+4>>2]=C;e=e+1|0}while((e|0)!=16);e=g;b=c[e>>2]|0;e=c[e+4>>2]|0;f=16;do{s=g+(f+-2<<3)|0;w=c[s>>2]|0;s=c[s+4>>2]|0;r=Gd(w|0,s|0,19)|0;j=C;q=Hd(w|0,s|0,45)|0;j=j|C;u=Gd(w|0,s|0,61)|0;v=C;t=Hd(w|0,s|0,3)|0;v=v|C;s=Gd(w|0,s|0,6)|0;j=v^C^j;v=g+(f+-7<<3)|0;w=c[v>>2]|0;v=c[v+4>>2]|0;n=g+(f+-15<<3)|0;y=b;b=c[n>>2]|0;x=e;e=c[n+4>>2]|0;n=Gd(b|0,e|0,1)|0;o=C;p=Hd(b|0,e|0,63)|0;o=o|C;k=Gd(b|0,e|0,8)|0;z=C;l=Hd(b|0,e|0,56)|0;z=z|C;m=Gd(b|0,e|0,7)|0;o=z^C^o;v=Dd(y|0,x|0,w|0,v|0)|0;j=Dd(v|0,C|0,(u|t)^s^(r|q)|0,j|0)|0;o=Dd(j|0,C|0,(k|l)^m^(n|p)|0,o|0)|0;p=g+(f<<3)|0;c[p>>2]=o;c[p+4>>2]=C;f=f+1|0}while((f|0)!=80);K=a;I=c[K>>2]|0;K=c[K+4>>2]|0;e=a+8|0;A=e;B=c[A>>2]|0;A=c[A+4>>2]|0;k=a+16|0;f=k;b=c[f>>2]|0;f=c[f+4>>2]|0;n=a+24|0;l=n;j=c[l>>2]|0;l=c[l+4>>2]|0;q=a+32|0;m=q;p=c[m>>2]|0;m=c[m+4>>2]|0;t=a+40|0;o=t;s=c[o>>2]|0;o=c[o+4>>2]|0;w=a+48|0;r=w;v=c[r>>2]|0;r=c[r+4>>2]|0;z=a+56|0;u=z;y=c[u>>2]|0;u=c[u+4>>2]|0;H=Gd(p|0,m|0,14)|0;D=C;x=Hd(p|0,m|0,50)|0;D=D|C;M=Gd(p|0,m|0,18)|0;E=C;L=Hd(p|0,m|0,46)|0;E=D^(E|C);D=Gd(p|0,m|0,41)|0;G=C;J=Hd(p|0,m|0,23)|0;G=E^(G|C);E=g;F=c[E>>2]|0;E=c[E+4>>2]|0;u=Dd(y|0,u|0,-685199838,1116352408)|0;E=Dd(u|0,C|0,F|0,E|0)|0;G=Dd(E|0,C|0,(H|x)^(M|L)^(D|J)|0,G|0)|0;G=Dd(G|0,C|0,(v^s)&p^v|0,(r^o)&m^r|0)|0;J=C;D=Gd(I|0,K|0,28)|0;L=C;M=Hd(I|0,K|0,36)|0;L=L|C;x=Gd(I|0,K|0,34)|0;H=C;E=Hd(I|0,K|0,30)|0;H=L^(H|C);L=Gd(I|0,K|0,39)|0;F=C;u=Hd(I|0,K|0,25)|0;F=Dd((b|B)&I|b&B|0,(f|A)&K|f&A|0,(D|M)^(x|E)^(L|u)|0,H^(F|C)|0)|0;H=C;l=Dd(j|0,l|0,G|0,J|0)|0;j=C;J=Dd(F|0,H|0,G|0,J|0)|0;G=C;H=Gd(l|0,j|0,14)|0;F=C;u=Hd(l|0,j|0,50)|0;F=F|C;L=Gd(l|0,j|0,18)|0;E=C;x=Hd(l|0,j|0,46)|0;E=F^(E|C);F=Gd(l|0,j|0,41)|0;M=C;D=Hd(l|0,j|0,23)|0;M=E^(M|C);E=g+8|0;y=c[E>>2]|0;E=c[E+4>>2]|0;r=Dd(v|0,r|0,602891725,1899447441)|0;E=Dd(r|0,C|0,y|0,E|0)|0;M=Dd(E|0,C|0,(H|u)^(L|x)^(F|D)|0,M|0)|0;M=Dd(M|0,C|0,(s^p)&l^s|0,(o^m)&j^o|0)|0;D=C;F=Gd(J|0,G|0,28)|0;x=C;L=Hd(J|0,G|0,36)|0;x=x|C;u=Gd(J|0,G|0,34)|0;H=C;E=Hd(J|0,G|0,30)|0;H=x^(H|C);x=Gd(J|0,G|0,39)|0;y=C;r=Hd(J|0,G|0,25)|0;y=Dd((B|I)&J|B&I|0,(A|K)&G|A&K|0,(F|L)^(u|E)^(x|r)|0,H^(y|C)|0)|0;H=C;f=Dd(b|0,f|0,M|0,D|0)|0;b=C;D=Dd(y|0,H|0,M|0,D|0)|0;M=C;H=Gd(f|0,b|0,14)|0;y=C;r=Hd(f|0,b|0,50)|0;y=y|C;x=Gd(f|0,b|0,18)|0;E=C;u=Hd(f|0,b|0,46)|0;E=y^(E|C);y=Gd(f|0,b|0,41)|0;L=C;F=Hd(f|0,b|0,23)|0;L=E^(L|C);E=g+16|0;v=c[E>>2]|0;E=c[E+4>>2]|0;o=Dd(s|0,o|0,-330482897,-1245643825)|0;E=Dd(o|0,C|0,v|0,E|0)|0;L=Dd(E|0,C|0,(H|r)^(x|u)^(y|F)|0,L|0)|0;L=Dd(L|0,C|0,(p^l)&f^p|0,(m^j)&b^m|0)|0;F=C;y=Gd(D|0,M|0,28)|0;u=C;x=Hd(D|0,M|0,36)|0;u=u|C;r=Gd(D|0,M|0,34)|0;H=C;E=Hd(D|0,M|0,30)|0;H=u^(H|C);u=Gd(D|0,M|0,39)|0;v=C;o=Hd(D|0,M|0,25)|0;v=Dd((I|J)&D|I&J|0,(K|G)&M|K&G|0,(y|x)^(r|E)^(u|o)|0,H^(v|C)|0)|0;H=C;A=Dd(B|0,A|0,L|0,F|0)|0;B=C;F=Dd(v|0,H|0,L|0,F|0)|0;L=C;H=Gd(A|0,B|0,14)|0;v=C;o=Hd(A|0,B|0,50)|0;v=v|C;u=Gd(A|0,B|0,18)|0;E=C;r=Hd(A|0,B|0,46)|0;E=v^(E|C);v=Gd(A|0,B|0,41)|0;x=C;y=Hd(A|0,B|0,23)|0;x=E^(x|C);E=g+24|0;s=c[E>>2]|0;E=c[E+4>>2]|0;m=Dd(p|0,m|0,-2121671748,-373957723)|0;E=Dd(m|0,C|0,s|0,E|0)|0;x=Dd(E|0,C|0,(H|o)^(u|r)^(v|y)|0,x|0)|0;x=Dd(x|0,C|0,(l^f)&A^l|0,(j^b)&B^j|0)|0;y=C;v=Gd(F|0,L|0,28)|0;r=C;u=Hd(F|0,L|0,36)|0;r=r|C;o=Gd(F|0,L|0,34)|0;H=C;E=Hd(F|0,L|0,30)|0;H=r^(H|C);r=Gd(F|0,L|0,39)|0;s=C;m=Hd(F|0,L|0,25)|0;s=Dd((J|D)&F|J&D|0,(G|M)&L|G&M|0,(v|u)^(o|E)^(r|m)|0,H^(s|C)|0)|0;H=C;K=Dd(I|0,K|0,x|0,y|0)|0;I=C;y=Dd(s|0,H|0,x|0,y|0)|0;x=C;H=Gd(K|0,I|0,14)|0;s=C;m=Hd(K|0,I|0,50)|0;s=s|C;r=Gd(K|0,I|0,18)|0;E=C;o=Hd(K|0,I|0,46)|0;E=s^(E|C);s=Gd(K|0,I|0,41)|0;u=C;v=Hd(K|0,I|0,23)|0;u=E^(u|C);E=g+32|0;p=c[E>>2]|0;E=c[E+4>>2]|0;j=Dd(l|0,j|0,-213338824,961987163)|0;E=Dd(j|0,C|0,p|0,E|0)|0;u=Dd(E|0,C|0,(H|m)^(r|o)^(s|v)|0,u|0)|0;u=Dd(u|0,C|0,(f^A)&K^f|0,(b^B)&I^b|0)|0;v=C;s=Gd(y|0,x|0,28)|0;o=C;r=Hd(y|0,x|0,36)|0;o=o|C;m=Gd(y|0,x|0,34)|0;H=C;E=Hd(y|0,x|0,30)|0;H=o^(H|C);o=Gd(y|0,x|0,39)|0;p=C;j=Hd(y|0,x|0,25)|0;p=Dd((D|F)&y|D&F|0,(M|L)&x|M&L|0,(s|r)^(m|E)^(o|j)|0,H^(p|C)|0)|0;H=C;G=Dd(J|0,G|0,u|0,v|0)|0;J=C;v=Dd(p|0,H|0,u|0,v|0)|0;u=C;H=Gd(G|0,J|0,14)|0;p=C;j=Hd(G|0,J|0,50)|0;p=p|C;o=Gd(G|0,J|0,18)|0;E=C;m=Hd(G|0,J|0,46)|0;E=p^(E|C);p=Gd(G|0,J|0,41)|0;r=C;s=Hd(G|0,J|0,23)|0;r=E^(r|C);E=g+40|0;l=c[E>>2]|0;E=c[E+4>>2]|0;b=Dd(f|0,b|0,-1241133031,1508970993)|0;E=Dd(b|0,C|0,l|0,E|0)|0;r=Dd(E|0,C|0,(H|j)^(o|m)^(p|s)|0,r|0)|0;r=Dd(r|0,C|0,(A^K)&G^A|0,(B^I)&J^B|0)|0;s=C;p=Gd(v|0,u|0,28)|0;m=C;o=Hd(v|0,u|0,36)|0;m=m|C;j=Gd(v|0,u|0,34)|0;H=C;E=Hd(v|0,u|0,30)|0;H=m^(H|C);m=Gd(v|0,u|0,39)|0;l=C;b=Hd(v|0,u|0,25)|0;l=Dd((F|y)&v|F&y|0,(L|x)&u|L&x|0,(p|o)^(j|E)^(m|b)|0,H^(l|C)|0)|0;H=C;M=Dd(D|0,M|0,r|0,s|0)|0;D=C;s=Dd(l|0,H|0,r|0,s|0)|0;r=C;H=Gd(M|0,D|0,14)|0;l=C;b=Hd(M|0,D|0,50)|0;l=l|C;m=Gd(M|0,D|0,18)|0;E=C;j=Hd(M|0,D|0,46)|0;E=l^(E|C);l=Gd(M|0,D|0,41)|0;o=C;p=Hd(M|0,D|0,23)|0;o=E^(o|C);E=g+48|0;f=c[E>>2]|0;E=c[E+4>>2]|0;B=Dd(A|0,B|0,-1357295717,-1841331548)|0;E=Dd(B|0,C|0,f|0,E|0)|0;o=Dd(E|0,C|0,(H|b)^(m|j)^(l|p)|0,o|0)|0;o=Dd(o|0,C|0,(K^G)&M^K|0,(I^J)&D^I|0)|0;p=C;l=Gd(s|0,r|0,28)|0;j=C;m=Hd(s|0,r|0,36)|0;j=j|C;b=Gd(s|0,r|0,34)|0;H=C;E=Hd(s|0,r|0,30)|0;H=j^(H|C);j=Gd(s|0,r|0,39)|0;f=C;B=Hd(s|0,r|0,25)|0;f=Dd((y|v)&s|y&v|0,(x|u)&r|x&u|0,(l|m)^(b|E)^(j|B)|0,H^(f|C)|0)|0;H=C;L=Dd(F|0,L|0,o|0,p|0)|0;F=C;p=Dd(f|0,H|0,o|0,p|0)|0;o=C;H=Gd(L|0,F|0,14)|0;f=C;B=Hd(L|0,F|0,50)|0;f=f|C;j=Gd(L|0,F|0,18)|0;E=C;b=Hd(L|0,F|0,46)|0;E=f^(E|C);f=Gd(L|0,F|0,41)|0;m=C;l=Hd(L|0,F|0,23)|0;m=E^(m|C);E=g+56|0;A=c[E>>2]|0;E=c[E+4>>2]|0;I=Dd(K|0,I|0,-630357736,-1424204075)|0;E=Dd(I|0,C|0,A|0,E|0)|0;m=Dd(E|0,C|0,(H|B)^(j|b)^(f|l)|0,m|0)|0;m=Dd(m|0,C|0,(G^M)&L^G|0,(J^D)&F^J|0)|0;l=C;f=Gd(p|0,o|0,28)|0;b=C;j=Hd(p|0,o|0,36)|0;b=b|C;B=Gd(p|0,o|0,34)|0;H=C;E=Hd(p|0,o|0,30)|0;H=b^(H|C);b=Gd(p|0,o|0,39)|0;A=C;I=Hd(p|0,o|0,25)|0;A=Dd((v|s)&p|v&s|0,(u|r)&o|u&r|0,(f|j)^(B|E)^(b|I)|0,H^(A|C)|0)|0;H=C;x=Dd(y|0,x|0,m|0,l|0)|0;y=C;l=Dd(A|0,H|0,m|0,l|0)|0;m=C;H=Gd(x|0,y|0,14)|0;A=C;I=Hd(x|0,y|0,50)|0;A=A|C;b=Gd(x|0,y|0,18)|0;E=C;B=Hd(x|0,y|0,46)|0;E=A^(E|C);A=Gd(x|0,y|0,41)|0;j=C;f=Hd(x|0,y|0,23)|0;j=E^(j|C);E=g+64|0;K=c[E>>2]|0;E=c[E+4>>2]|0;J=Dd(G|0,J|0,-1560083902,-670586216)|0;E=Dd(J|0,C|0,K|0,E|0)|0;j=Dd(E|0,C|0,(H|I)^(b|B)^(A|f)|0,j|0)|0;j=Dd(j|0,C|0,(M^L)&x^M|0,(D^F)&y^D|0)|0;f=C;A=Gd(l|0,m|0,28)|0;B=C;b=Hd(l|0,m|0,36)|0;B=B|C;I=Gd(l|0,m|0,34)|0;H=C;E=Hd(l|0,m|0,30)|0;H=B^(H|C);B=Gd(l|0,m|0,39)|0;K=C;J=Hd(l|0,m|0,25)|0;K=Dd((s|p)&l|s&p|0,(r|o)&m|r&o|0,(A|b)^(I|E)^(B|J)|0,H^(K|C)|0)|0;H=C;u=Dd(v|0,u|0,j|0,f|0)|0;v=C;f=Dd(K|0,H|0,j|0,f|0)|0;j=C;H=Gd(u|0,v|0,14)|0;K=C;J=Hd(u|0,v|0,50)|0;K=K|C;B=Gd(u|0,v|0,18)|0;E=C;I=Hd(u|0,v|0,46)|0;E=K^(E|C);K=Gd(u|0,v|0,41)|0;b=C;A=Hd(u|0,v|0,23)|0;b=E^(b|C);E=g+72|0;G=c[E>>2]|0;E=c[E+4>>2]|0;D=Dd(M|0,D|0,1164996542,310598401)|0;E=Dd(D|0,C|0,G|0,E|0)|0;b=Dd(E|0,C|0,(H|J)^(B|I)^(K|A)|0,b|0)|0;b=Dd(b|0,C|0,(L^x)&u^L|0,(F^y)&v^F|0)|0;A=C;K=Gd(f|0,j|0,28)|0;I=C;B=Hd(f|0,j|0,36)|0;I=I|C;J=Gd(f|0,j|0,34)|0;H=C;E=Hd(f|0,j|0,30)|0;H=I^(H|C);I=Gd(f|0,j|0,39)|0;G=C;D=Hd(f|0,j|0,25)|0;G=Dd((p|l)&f|p&l|0,(o|m)&j|o&m|0,(K|B)^(J|E)^(I|D)|0,H^(G|C)|0)|0;H=C;r=Dd(s|0,r|0,b|0,A|0)|0;s=C;A=Dd(G|0,H|0,b|0,A|0)|0;b=C;H=Gd(r|0,s|0,14)|0;G=C;D=Hd(r|0,s|0,50)|0;G=G|C;I=Gd(r|0,s|0,18)|0;E=C;J=Hd(r|0,s|0,46)|0;E=G^(E|C);G=Gd(r|0,s|0,41)|0;B=C;K=Hd(r|0,s|0,23)|0;B=E^(B|C);E=g+80|0;M=c[E>>2]|0;E=c[E+4>>2]|0;F=Dd(L|0,F|0,1323610764,607225278)|0;E=Dd(F|0,C|0,M|0,E|0)|0;B=Dd(E|0,C|0,(H|D)^(I|J)^(G|K)|0,B|0)|0;B=Dd(B|0,C|0,(x^u)&r^x|0,(y^v)&s^y|0)|0;K=C;G=Gd(A|0,b|0,28)|0;J=C;I=Hd(A|0,b|0,36)|0;J=J|C;D=Gd(A|0,b|0,34)|0;H=C;E=Hd(A|0,b|0,30)|0;H=J^(H|C);J=Gd(A|0,b|0,39)|0;M=C;F=Hd(A|0,b|0,25)|0;M=Dd((l|f)&A|l&f|0,(m|j)&b|m&j|0,(G|I)^(D|E)^(J|F)|0,H^(M|C)|0)|0;H=C;o=Dd(p|0,o|0,B|0,K|0)|0;p=C;K=Dd(M|0,H|0,B|0,K|0)|0;B=C;H=Gd(o|0,p|0,14)|0;M=C;F=Hd(o|0,p|0,50)|0;M=M|C;J=Gd(o|0,p|0,18)|0;E=C;D=Hd(o|0,p|0,46)|0;E=M^(E|C);M=Gd(o|0,p|0,41)|0;I=C;G=Hd(o|0,p|0,23)|0;I=E^(I|C);E=g+88|0;L=c[E>>2]|0;E=c[E+4>>2]|0;y=Dd(x|0,y|0,-704662302,1426881987)|0;E=Dd(y|0,C|0,L|0,E|0)|0;I=Dd(E|0,C|0,(H|F)^(J|D)^(M|G)|0,I|0)|0;I=Dd(I|0,C|0,(u^r)&o^u|0,(v^s)&p^v|0)|0;G=C;M=Gd(K|0,B|0,28)|0;D=C;J=Hd(K|0,B|0,36)|0;D=D|C;F=Gd(K|0,B|0,34)|0;H=C;E=Hd(K|0,B|0,30)|0;H=D^(H|C);D=Gd(K|0,B|0,39)|0;L=C;y=Hd(K|0,B|0,25)|0;L=Dd((f|A)&K|f&A|0,(j|b)&B|j&b|0,(M|J)^(F|E)^(D|y)|0,H^(L|C)|0)|0;H=C;m=Dd(l|0,m|0,I|0,G|0)|0;l=C;G=Dd(L|0,H|0,I|0,G|0)|0;I=C;H=Gd(m|0,l|0,14)|0;L=C;y=Hd(m|0,l|0,50)|0;L=L|C;D=Gd(m|0,l|0,18)|0;E=C;F=Hd(m|0,l|0,46)|0;E=L^(E|C);L=Gd(m|0,l|0,41)|0;J=C;M=Hd(m|0,l|0,23)|0;J=E^(J|C);E=g+96|0;x=c[E>>2]|0;E=c[E+4>>2]|0;v=Dd(u|0,v|0,-226784913,1925078388)|0;E=Dd(v|0,C|0,x|0,E|0)|0;J=Dd(E|0,C|0,(H|y)^(D|F)^(L|M)|0,J|0)|0;J=Dd(J|0,C|0,(r^o)&m^r|0,(s^p)&l^s|0)|0;M=C;L=Gd(G|0,I|0,28)|0;F=C;D=Hd(G|0,I|0,36)|0;F=F|C;y=Gd(G|0,I|0,34)|0;H=C;E=Hd(G|0,I|0,30)|0;H=F^(H|C);F=Gd(G|0,I|0,39)|0;x=C;v=Hd(G|0,I|0,25)|0;x=Dd((A|K)&G|A&K|0,(b|B)&I|b&B|0,(L|D)^(y|E)^(F|v)|0,H^(x|C)|0)|0;H=C;j=Dd(f|0,j|0,J|0,M|0)|0;f=C;M=Dd(x|0,H|0,J|0,M|0)|0;J=C;H=Gd(j|0,f|0,14)|0;x=C;v=Hd(j|0,f|0,50)|0;x=x|C;F=Gd(j|0,f|0,18)|0;E=C;y=Hd(j|0,f|0,46)|0;E=x^(E|C);x=Gd(j|0,f|0,41)|0;D=C;L=Hd(j|0,f|0,23)|0;D=E^(D|C);E=g+104|0;u=c[E>>2]|0;E=c[E+4>>2]|0;s=Dd(r|0,s|0,991336113,-2132889090)|0;E=Dd(s|0,C|0,u|0,E|0)|0;D=Dd(E|0,C|0,(H|v)^(F|y)^(x|L)|0,D|0)|0;D=Dd(D|0,C|0,(o^m)&j^o|0,(p^l)&f^p|0)|0;L=C;x=Gd(M|0,J|0,28)|0;y=C;F=Hd(M|0,J|0,36)|0;y=y|C;v=Gd(M|0,J|0,34)|0;H=C;E=Hd(M|0,J|0,30)|0;H=y^(H|C);y=Gd(M|0,J|0,39)|0;u=C;s=Hd(M|0,J|0,25)|0;u=Dd((K|G)&M|K&G|0,(B|I)&J|B&I|0,(x|F)^(v|E)^(y|s)|0,H^(u|C)|0)|0;H=C;b=Dd(A|0,b|0,D|0,L|0)|0;A=C;L=Dd(u|0,H|0,D|0,L|0)|0;D=C;H=Gd(b|0,A|0,14)|0;u=C;s=Hd(b|0,A|0,50)|0;u=u|C;y=Gd(b|0,A|0,18)|0;E=C;v=Hd(b|0,A|0,46)|0;E=u^(E|C);u=Gd(b|0,A|0,41)|0;F=C;x=Hd(b|0,A|0,23)|0;F=E^(F|C);E=g+112|0;r=c[E>>2]|0;E=c[E+4>>2]|0;p=Dd(o|0,p|0,633803317,-1680079193)|0;E=Dd(p|0,C|0,r|0,E|0)|0;F=Dd(E|0,C|0,(H|s)^(y|v)^(u|x)|0,F|0)|0;F=Dd(F|0,C|0,(m^j)&b^m|0,(l^f)&A^l|0)|0;x=C;u=Gd(L|0,D|0,28)|0;v=C;y=Hd(L|0,D|0,36)|0;v=v|C;s=Gd(L|0,D|0,34)|0;H=C;E=Hd(L|0,D|0,30)|0;H=v^(H|C);v=Gd(L|0,D|0,39)|0;r=C;p=Hd(L|0,D|0,25)|0;r=Dd((G|M)&L|G&M|0,(I|J)&D|I&J|0,(u|y)^(s|E)^(v|p)|0,H^(r|C)|0)|0;H=C;B=Dd(K|0,B|0,F|0,x|0)|0;K=C;x=Dd(r|0,H|0,F|0,x|0)|0;F=C;H=Gd(B|0,K|0,14)|0;r=C;p=Hd(B|0,K|0,50)|0;r=r|C;v=Gd(B|0,K|0,18)|0;E=C;s=Hd(B|0,K|0,46)|0;E=r^(E|C);r=Gd(B|0,K|0,41)|0;y=C;u=Hd(B|0,K|0,23)|0;y=E^(y|C);E=g+120|0;o=c[E>>2]|0;E=c[E+4>>2]|0;l=Dd(m|0,l|0,-815192428,-1046744716)|0;E=Dd(l|0,C|0,o|0,E|0)|0;y=Dd(E|0,C|0,(H|p)^(v|s)^(r|u)|0,y|0)|0;y=Dd(y|0,C|0,(j^b)&B^j|0,(f^A)&K^f|0)|0;u=C;r=Gd(x|0,F|0,28)|0;s=C;v=Hd(x|0,F|0,36)|0;s=s|C;p=Gd(x|0,F|0,34)|0;H=C;E=Hd(x|0,F|0,30)|0;H=s^(H|C);s=Gd(x|0,F|0,39)|0;o=C;l=Hd(x|0,F|0,25)|0;o=Dd((M|L)&x|M&L|0,(J|D)&F|J&D|0,(r|v)^(p|E)^(s|l)|0,H^(o|C)|0)|0;H=C;I=Dd(G|0,I|0,y|0,u|0)|0;G=C;u=Dd(o|0,H|0,y|0,u|0)|0;y=C;H=Gd(I|0,G|0,14)|0;o=C;l=Hd(I|0,G|0,50)|0;o=o|C;s=Gd(I|0,G|0,18)|0;E=C;p=Hd(I|0,G|0,46)|0;E=o^(E|C);o=Gd(I|0,G|0,41)|0;v=C;r=Hd(I|0,G|0,23)|0;v=E^(v|C);E=g+128|0;m=c[E>>2]|0;E=c[E+4>>2]|0;f=Dd(j|0,f|0,-1628353838,-459576895)|0;E=Dd(f|0,C|0,m|0,E|0)|0;v=Dd(E|0,C|0,(H|l)^(s|p)^(o|r)|0,v|0)|0;v=Dd(v|0,C|0,(b^B)&I^b|0,(A^K)&G^A|0)|0;r=C;o=Gd(u|0,y|0,28)|0;p=C;s=Hd(u|0,y|0,36)|0;p=p|C;l=Gd(u|0,y|0,34)|0;H=C;E=Hd(u|0,y|0,30)|0;H=p^(H|C);p=Gd(u|0,y|0,39)|0;m=C;f=Hd(u|0,y|0,25)|0;m=Dd((L|x)&u|L&x|0,(D|F)&y|D&F|0,(o|s)^(l|E)^(p|f)|0,H^(m|C)|0)|0;H=C;J=Dd(M|0,J|0,v|0,r|0)|0;M=C;r=Dd(m|0,H|0,v|0,r|0)|0;v=C;H=Gd(J|0,M|0,14)|0;m=C;f=Hd(J|0,M|0,50)|0;m=m|C;p=Gd(J|0,M|0,18)|0;E=C;l=Hd(J|0,M|0,46)|0;E=m^(E|C);m=Gd(J|0,M|0,41)|0;s=C;o=Hd(J|0,M|0,23)|0;s=E^(s|C);E=g+136|0;j=c[E>>2]|0;E=c[E+4>>2]|0;A=Dd(b|0,A|0,944711139,-272742522)|0;E=Dd(A|0,C|0,j|0,E|0)|0;s=Dd(E|0,C|0,(H|f)^(p|l)^(m|o)|0,s|0)|0;s=Dd(s|0,C|0,(B^I)&J^B|0,(K^G)&M^K|0)|0;o=C;m=Gd(r|0,v|0,28)|0;l=C;p=Hd(r|0,v|0,36)|0;l=l|C;f=Gd(r|0,v|0,34)|0;H=C;E=Hd(r|0,v|0,30)|0;H=l^(H|C);l=Gd(r|0,v|0,39)|0;j=C;A=Hd(r|0,v|0,25)|0;j=Dd((x|u)&r|x&u|0,(F|y)&v|F&y|0,(m|p)^(f|E)^(l|A)|0,H^(j|C)|0)|0;H=C;D=Dd(L|0,D|0,s|0,o|0)|0;L=C;o=Dd(j|0,H|0,s|0,o|0)|0;s=C;H=Gd(D|0,L|0,14)|0;j=C;A=Hd(D|0,L|0,50)|0;j=j|C;l=Gd(D|0,L|0,18)|0;E=C;f=Hd(D|0,L|0,46)|0;E=j^(E|C);j=Gd(D|0,L|0,41)|0;p=C;m=Hd(D|0,L|0,23)|0;p=E^(p|C);E=g+144|0;b=c[E>>2]|0;E=c[E+4>>2]|0;K=Dd(B|0,K|0,-1953704523,264347078)|0;E=Dd(K|0,C|0,b|0,E|0)|0;p=Dd(E|0,C|0,(H|A)^(l|f)^(j|m)|0,p|0)|0;p=Dd(p|0,C|0,(I^J)&D^I|0,(G^M)&L^G|0)|0;m=C;j=Gd(o|0,s|0,28)|0;f=C;l=Hd(o|0,s|0,36)|0;f=f|C;A=Gd(o|0,s|0,34)|0;H=C;E=Hd(o|0,s|0,30)|0;H=f^(H|C);f=Gd(o|0,s|0,39)|0;b=C;K=Hd(o|0,s|0,25)|0;b=Dd((u|r)&o|u&r|0,(y|v)&s|y&v|0,(j|l)^(A|E)^(f|K)|0,H^(b|C)|0)|0;H=C;F=Dd(x|0,F|0,p|0,m|0)|0;x=C;m=Dd(b|0,H|0,p|0,m|0)|0;p=C;H=Gd(F|0,x|0,14)|0;b=C;K=Hd(F|0,x|0,50)|0;b=b|C;f=Gd(F|0,x|0,18)|0;E=C;A=Hd(F|0,x|0,46)|0;E=b^(E|C);b=Gd(F|0,x|0,41)|0;l=C;j=Hd(F|0,x|0,23)|0;l=E^(l|C);E=g+152|0;B=c[E>>2]|0;E=c[E+4>>2]|0;G=Dd(I|0,G|0,2007800933,604807628)|0;E=Dd(G|0,C|0,B|0,E|0)|0;l=Dd(E|0,C|0,(H|K)^(f|A)^(b|j)|0,l|0)|0;l=Dd(l|0,C|0,(J^D)&F^J|0,(M^L)&x^M|0)|0;j=C;b=Gd(m|0,p|0,28)|0;A=C;f=Hd(m|0,p|0,36)|0;A=A|C;K=Gd(m|0,p|0,34)|0;H=C;E=Hd(m|0,p|0,30)|0;H=A^(H|C);A=Gd(m|0,p|0,39)|0;B=C;G=Hd(m|0,p|0,25)|0;B=Dd((r|o)&m|r&o|0,(v|s)&p|v&s|0,(b|f)^(K|E)^(A|G)|0,H^(B|C)|0)|0;H=C;y=Dd(u|0,y|0,l|0,j|0)|0;u=C;j=Dd(B|0,H|0,l|0,j|0)|0;l=C;H=Gd(y|0,u|0,14)|0;B=C;G=Hd(y|0,u|0,50)|0;B=B|C;A=Gd(y|0,u|0,18)|0;E=C;K=Hd(y|0,u|0,46)|0;E=B^(E|C);B=Gd(y|0,u|0,41)|0;f=C;b=Hd(y|0,u|0,23)|0;f=E^(f|C);E=g+160|0;I=c[E>>2]|0;E=c[E+4>>2]|0;M=Dd(J|0,M|0,1495990901,770255983)|0;E=Dd(M|0,C|0,I|0,E|0)|0;f=Dd(E|0,C|0,(H|G)^(A|K)^(B|b)|0,f|0)|0;f=Dd(f|0,C|0,(D^F)&y^D|0,(L^x)&u^L|0)|0;b=C;B=Gd(j|0,l|0,28)|0;K=C;A=Hd(j|0,l|0,36)|0;K=K|C;G=Gd(j|0,l|0,34)|0;H=C;E=Hd(j|0,l|0,30)|0;H=K^(H|C);K=Gd(j|0,l|0,39)|0;I=C;M=Hd(j|0,l|0,25)|0;I=Dd((o|m)&j|o&m|0,(s|p)&l|s&p|0,(B|A)^(G|E)^(K|M)|0,H^(I|C)|0)|0;H=C;v=Dd(r|0,v|0,f|0,b|0)|0;r=C;b=Dd(I|0,H|0,f|0,b|0)|0;f=C;H=Gd(v|0,r|0,14)|0;I=C;M=Hd(v|0,r|0,50)|0;I=I|C;K=Gd(v|0,r|0,18)|0;E=C;G=Hd(v|0,r|0,46)|0;E=I^(E|C);I=Gd(v|0,r|0,41)|0;A=C;B=Hd(v|0,r|0,23)|0;A=E^(A|C);E=g+168|0;J=c[E>>2]|0;E=c[E+4>>2]|0;L=Dd(D|0,L|0,1856431235,1249150122)|0;E=Dd(L|0,C|0,J|0,E|0)|0;A=Dd(E|0,C|0,(H|M)^(K|G)^(I|B)|0,A|0)|0;A=Dd(A|0,C|0,(F^y)&v^F|0,(x^u)&r^x|0)|0;B=C;I=Gd(b|0,f|0,28)|0;G=C;K=Hd(b|0,f|0,36)|0;G=G|C;M=Gd(b|0,f|0,34)|0;H=C;E=Hd(b|0,f|0,30)|0;H=G^(H|C);G=Gd(b|0,f|0,39)|0;J=C;L=Hd(b|0,f|0,25)|0;J=Dd((m|j)&b|m&j|0,(p|l)&f|p&l|0,(I|K)^(M|E)^(G|L)|0,H^(J|C)|0)|0;H=C;s=Dd(o|0,s|0,A|0,B|0)|0;o=C;B=Dd(J|0,H|0,A|0,B|0)|0;A=C;H=Gd(s|0,o|0,14)|0;J=C;L=Hd(s|0,o|0,50)|0;J=J|C;G=Gd(s|0,o|0,18)|0;E=C;M=Hd(s|0,o|0,46)|0;E=J^(E|C);J=Gd(s|0,o|0,41)|0;K=C;I=Hd(s|0,o|0,23)|0;K=E^(K|C);E=g+176|0;D=c[E>>2]|0;E=c[E+4>>2]|0;x=Dd(F|0,x|0,-1119749164,1555081692)|0;E=Dd(x|0,C|0,D|0,E|0)|0;K=Dd(E|0,C|0,(H|L)^(G|M)^(J|I)|0,K|0)|0;K=Dd(K|0,C|0,(y^v)&s^y|0,(u^r)&o^u|0)|0;I=C;J=Gd(B|0,A|0,28)|0;M=C;G=Hd(B|0,A|0,36)|0;M=M|C;L=Gd(B|0,A|0,34)|0;H=C;E=Hd(B|0,A|0,30)|0;H=M^(H|C);M=Gd(B|0,A|0,39)|0;D=C;x=Hd(B|0,A|0,25)|0;D=Dd((j|b)&B|j&b|0,(l|f)&A|l&f|0,(J|G)^(L|E)^(M|x)|0,H^(D|C)|0)|0;H=C;p=Dd(m|0,p|0,K|0,I|0)|0;m=C;I=Dd(D|0,H|0,K|0,I|0)|0;K=C;H=Gd(p|0,m|0,14)|0;D=C;x=Hd(p|0,m|0,50)|0;D=D|C;M=Gd(p|0,m|0,18)|0;E=C;L=Hd(p|0,m|0,46)|0;E=D^(E|C);D=Gd(p|0,m|0,41)|0;G=C;J=Hd(p|0,m|0,23)|0;G=E^(G|C);E=g+184|0;F=c[E>>2]|0;E=c[E+4>>2]|0;u=Dd(y|0,u|0,-2096016459,1996064986)|0;E=Dd(u|0,C|0,F|0,E|0)|0;G=Dd(E|0,C|0,(H|x)^(M|L)^(D|J)|0,G|0)|0;G=Dd(G|0,C|0,(v^s)&p^v|0,(r^o)&m^r|0)|0;J=C;D=Gd(I|0,K|0,28)|0;L=C;M=Hd(I|0,K|0,36)|0;L=L|C;x=Gd(I|0,K|0,34)|0;H=C;E=Hd(I|0,K|0,30)|0;H=L^(H|C);L=Gd(I|0,K|0,39)|0;F=C;u=Hd(I|0,K|0,25)|0;F=Dd((b|B)&I|b&B|0,(f|A)&K|f&A|0,(D|M)^(x|E)^(L|u)|0,H^(F|C)|0)|0;H=C;l=Dd(j|0,l|0,G|0,J|0)|0;j=C;J=Dd(F|0,H|0,G|0,J|0)|0;G=C;H=Gd(l|0,j|0,14)|0;F=C;u=Hd(l|0,j|0,50)|0;F=F|C;L=Gd(l|0,j|0,18)|0;E=C;x=Hd(l|0,j|0,46)|0;E=F^(E|C);F=Gd(l|0,j|0,41)|0;M=C;D=Hd(l|0,j|0,23)|0;M=E^(M|C);E=g+192|0;y=c[E>>2]|0;E=c[E+4>>2]|0;r=Dd(v|0,r|0,-295247957,-1740746414)|0;E=Dd(r|0,C|0,y|0,E|0)|0;M=Dd(E|0,C|0,(H|u)^(L|x)^(F|D)|0,M|0)|0;M=Dd(M|0,C|0,(s^p)&l^s|0,(o^m)&j^o|0)|0;D=C;F=Gd(J|0,G|0,28)|0;x=C;L=Hd(J|0,G|0,36)|0;x=x|C;u=Gd(J|0,G|0,34)|0;H=C;E=Hd(J|0,G|0,30)|0;H=x^(H|C);x=Gd(J|0,G|0,39)|0;y=C;r=Hd(J|0,G|0,25)|0;y=Dd((B|I)&J|B&I|0,(A|K)&G|A&K|0,(F|L)^(u|E)^(x|r)|0,H^(y|C)|0)|0;H=C;f=Dd(b|0,f|0,M|0,D|0)|0;b=C;D=Dd(y|0,H|0,M|0,D|0)|0;M=C;H=Gd(f|0,b|0,14)|0;y=C;r=Hd(f|0,b|0,50)|0;y=y|C;x=Gd(f|0,b|0,18)|0;E=C;u=Hd(f|0,b|0,46)|0;E=y^(E|C);y=Gd(f|0,b|0,41)|0;L=C;F=Hd(f|0,b|0,23)|0;L=E^(L|C);E=g+200|0;v=c[E>>2]|0;E=c[E+4>>2]|0;o=Dd(s|0,o|0,766784016,-1473132947)|0;E=Dd(o|0,C|0,v|0,E|0)|0;L=Dd(E|0,C|0,(H|r)^(x|u)^(y|F)|0,L|0)|0;L=Dd(L|0,C|0,(p^l)&f^p|0,(m^j)&b^m|0)|0;F=C;y=Gd(D|0,M|0,28)|0;u=C;x=Hd(D|0,M|0,36)|0;u=u|C;r=Gd(D|0,M|0,34)|0;H=C;E=Hd(D|0,M|0,30)|0;H=u^(H|C);u=Gd(D|0,M|0,39)|0;v=C;o=Hd(D|0,M|0,25)|0;v=Dd((I|J)&D|I&J|0,(K|G)&M|K&G|0,(y|x)^(r|E)^(u|o)|0,H^(v|C)|0)|0;H=C;A=Dd(B|0,A|0,L|0,F|0)|0;B=C;F=Dd(v|0,H|0,L|0,F|0)|0;L=C;H=Gd(A|0,B|0,14)|0;v=C;o=Hd(A|0,B|0,50)|0;v=v|C;u=Gd(A|0,B|0,18)|0;E=C;r=Hd(A|0,B|0,46)|0;E=v^(E|C);v=Gd(A|0,B|0,41)|0;x=C;y=Hd(A|0,B|0,23)|0;x=E^(x|C);E=g+208|0;s=c[E>>2]|0;E=c[E+4>>2]|0;m=Dd(p|0,m|0,-1728372417,-1341970488)|0;E=Dd(m|0,C|0,s|0,E|0)|0;x=Dd(E|0,C|0,(H|o)^(u|r)^(v|y)|0,x|0)|0;x=Dd(x|0,C|0,(l^f)&A^l|0,(j^b)&B^j|0)|0;y=C;v=Gd(F|0,L|0,28)|0;r=C;u=Hd(F|0,L|0,36)|0;r=r|C;o=Gd(F|0,L|0,34)|0;H=C;E=Hd(F|0,L|0,30)|0;H=r^(H|C);r=Gd(F|0,L|0,39)|0;s=C;m=Hd(F|0,L|0,25)|0;s=Dd((J|D)&F|J&D|0,(G|M)&L|G&M|0,(v|u)^(o|E)^(r|m)|0,H^(s|C)|0)|0;H=C;K=Dd(I|0,K|0,x|0,y|0)|0;I=C;y=Dd(s|0,H|0,x|0,y|0)|0;x=C;H=Gd(K|0,I|0,14)|0;s=C;m=Hd(K|0,I|0,50)|0;s=s|C;r=Gd(K|0,I|0,18)|0;E=C;o=Hd(K|0,I|0,46)|0;E=s^(E|C);s=Gd(K|0,I|0,41)|0;u=C;v=Hd(K|0,I|0,23)|0;u=E^(u|C);E=g+216|0;p=c[E>>2]|0;E=c[E+4>>2]|0;j=Dd(l|0,j|0,-1091629340,-1084653625)|0;E=Dd(j|0,C|0,p|0,E|0)|0;u=Dd(E|0,C|0,(H|m)^(r|o)^(s|v)|0,u|0)|0;u=Dd(u|0,C|0,(f^A)&K^f|0,(b^B)&I^b|0)|0;v=C;s=Gd(y|0,x|0,28)|0;o=C;r=Hd(y|0,x|0,36)|0;o=o|C;m=Gd(y|0,x|0,34)|0;H=C;E=Hd(y|0,x|0,30)|0;H=o^(H|C);o=Gd(y|0,x|0,39)|0;p=C;j=Hd(y|0,x|0,25)|0;p=Dd((D|F)&y|D&F|0,(M|L)&x|M&L|0,(s|r)^(m|E)^(o|j)|0,H^(p|C)|0)|0;H=C;G=Dd(J|0,G|0,u|0,v|0)|0;J=C;v=Dd(p|0,H|0,u|0,v|0)|0;u=C;H=Gd(G|0,J|0,14)|0;p=C;j=Hd(G|0,J|0,50)|0;p=p|C;o=Gd(G|0,J|0,18)|0;E=C;m=Hd(G|0,J|0,46)|0;E=p^(E|C);p=Gd(G|0,J|0,41)|0;r=C;s=Hd(G|0,J|0,23)|0;r=E^(r|C);E=g+224|0;l=c[E>>2]|0;E=c[E+4>>2]|0;b=Dd(f|0,b|0,1034457026,-958395405)|0;E=Dd(b|0,C|0,l|0,E|0)|0;r=Dd(E|0,C|0,(H|j)^(o|m)^(p|s)|0,r|0)|0;r=Dd(r|0,C|0,(A^K)&G^A|0,(B^I)&J^B|0)|0;s=C;p=Gd(v|0,u|0,28)|0;m=C;o=Hd(v|0,u|0,36)|0;m=m|C;j=Gd(v|0,u|0,34)|0;H=C;E=Hd(v|0,u|0,30)|0;H=m^(H|C);m=Gd(v|0,u|0,39)|0;l=C;b=Hd(v|0,u|0,25)|0;l=Dd((F|y)&v|F&y|0,(L|x)&u|L&x|0,(p|o)^(j|E)^(m|b)|0,H^(l|C)|0)|0;H=C;M=Dd(D|0,M|0,r|0,s|0)|0;D=C;s=Dd(l|0,H|0,r|0,s|0)|0;r=C;H=Gd(M|0,D|0,14)|0;l=C;b=Hd(M|0,D|0,50)|0;l=l|C;m=Gd(M|0,D|0,18)|0;E=C;j=Hd(M|0,D|0,46)|0;E=l^(E|C);l=Gd(M|0,D|0,41)|0;o=C;p=Hd(M|0,D|0,23)|0;o=E^(o|C);E=g+232|0;f=c[E>>2]|0;E=c[E+4>>2]|0;B=Dd(A|0,B|0,-1828018395,-710438585)|0;E=Dd(B|0,C|0,f|0,E|0)|0;o=Dd(E|0,C|0,(H|b)^(m|j)^(l|p)|0,o|0)|0;o=Dd(o|0,C|0,(K^G)&M^K|0,(I^J)&D^I|0)|0;p=C;l=Gd(s|0,r|0,28)|0;j=C;m=Hd(s|0,r|0,36)|0;j=j|C;b=Gd(s|0,r|0,34)|0;H=C;E=Hd(s|0,r|0,30)|0;H=j^(H|C);j=Gd(s|0,r|0,39)|0;f=C;B=Hd(s|0,r|0,25)|0;f=Dd((y|v)&s|y&v|0,(x|u)&r|x&u|0,(l|m)^(b|E)^(j|B)|0,H^(f|C)|0)|0;H=C;L=Dd(F|0,L|0,o|0,p|0)|0;F=C;p=Dd(f|0,H|0,o|0,p|0)|0;o=C;H=Gd(L|0,F|0,14)|0;f=C;B=Hd(L|0,F|0,50)|0;f=f|C;j=Gd(L|0,F|0,18)|0;E=C;b=Hd(L|0,F|0,46)|0;E=f^(E|C);f=Gd(L|0,F|0,41)|0;m=C;l=Hd(L|0,F|0,23)|0;m=E^(m|C);E=g+240|0;A=c[E>>2]|0;E=c[E+4>>2]|0;I=Dd(K|0,I|0,-536640913,113926993)|0;E=Dd(I|0,C|0,A|0,E|0)|0;m=Dd(E|0,C|0,(H|B)^(j|b)^(f|l)|0,m|0)|0;m=Dd(m|0,C|0,(G^M)&L^G|0,(J^D)&F^J|0)|0;l=C;f=Gd(p|0,o|0,28)|0;b=C;j=Hd(p|0,o|0,36)|0;b=b|C;B=Gd(p|0,o|0,34)|0;H=C;E=Hd(p|0,o|0,30)|0;H=b^(H|C);b=Gd(p|0,o|0,39)|0;A=C;I=Hd(p|0,o|0,25)|0;A=Dd((v|s)&p|v&s|0,(u|r)&o|u&r|0,(f|j)^(B|E)^(b|I)|0,H^(A|C)|0)|0;H=C;x=Dd(y|0,x|0,m|0,l|0)|0;y=C;l=Dd(A|0,H|0,m|0,l|0)|0;m=C;H=Gd(x|0,y|0,14)|0;A=C;I=Hd(x|0,y|0,50)|0;A=A|C;b=Gd(x|0,y|0,18)|0;E=C;B=Hd(x|0,y|0,46)|0;E=A^(E|C);A=Gd(x|0,y|0,41)|0;j=C;f=Hd(x|0,y|0,23)|0;j=E^(j|C);E=g+248|0;K=c[E>>2]|0;E=c[E+4>>2]|0;J=Dd(G|0,J|0,168717936,338241895)|0;E=Dd(J|0,C|0,K|0,E|0)|0;j=Dd(E|0,C|0,(H|I)^(b|B)^(A|f)|0,j|0)|0;j=Dd(j|0,C|0,(M^L)&x^M|0,(D^F)&y^D|0)|0;f=C;A=Gd(l|0,m|0,28)|0;B=C;b=Hd(l|0,m|0,36)|0;B=B|C;I=Gd(l|0,m|0,34)|0;H=C;E=Hd(l|0,m|0,30)|0;H=B^(H|C);B=Gd(l|0,m|0,39)|0;K=C;J=Hd(l|0,m|0,25)|0;K=Dd((s|p)&l|s&p|0,(r|o)&m|r&o|0,(A|b)^(I|E)^(B|J)|0,H^(K|C)|0)|0;H=C;u=Dd(v|0,u|0,j|0,f|0)|0;v=C;f=Dd(K|0,H|0,j|0,f|0)|0;j=C;H=Gd(u|0,v|0,14)|0;K=C;J=Hd(u|0,v|0,50)|0;K=K|C;B=Gd(u|0,v|0,18)|0;E=C;I=Hd(u|0,v|0,46)|0;E=K^(E|C);K=Gd(u|0,v|0,41)|0;b=C;A=Hd(u|0,v|0,23)|0;b=E^(b|C);E=g+256|0;G=c[E>>2]|0;E=c[E+4>>2]|0;D=Dd(M|0,D|0,1188179964,666307205)|0;E=Dd(D|0,C|0,G|0,E|0)|0;b=Dd(E|0,C|0,(H|J)^(B|I)^(K|A)|0,b|0)|0;b=Dd(b|0,C|0,(L^x)&u^L|0,(F^y)&v^F|0)|0;A=C;K=Gd(f|0,j|0,28)|0;I=C;B=Hd(f|0,j|0,36)|0;I=I|C;J=Gd(f|0,j|0,34)|0;H=C;E=Hd(f|0,j|0,30)|0;H=I^(H|C);I=Gd(f|0,j|0,39)|0;G=C;D=Hd(f|0,j|0,25)|0;G=Dd((p|l)&f|p&l|0,(o|m)&j|o&m|0,(K|B)^(J|E)^(I|D)|0,H^(G|C)|0)|0;H=C;r=Dd(s|0,r|0,b|0,A|0)|0;s=C;A=Dd(G|0,H|0,b|0,A|0)|0;b=C;H=Gd(r|0,s|0,14)|0;G=C;D=Hd(r|0,s|0,50)|0;G=G|C;I=Gd(r|0,s|0,18)|0;E=C;J=Hd(r|0,s|0,46)|0;E=G^(E|C);G=Gd(r|0,s|0,41)|0;B=C;K=Hd(r|0,s|0,23)|0;B=E^(B|C);E=g+264|0;M=c[E>>2]|0;E=c[E+4>>2]|0;F=Dd(L|0,F|0,1546045734,773529912)|0;E=Dd(F|0,C|0,M|0,E|0)|0;B=Dd(E|0,C|0,(H|D)^(I|J)^(G|K)|0,B|0)|0;B=Dd(B|0,C|0,(x^u)&r^x|0,(y^v)&s^y|0)|0;K=C;G=Gd(A|0,b|0,28)|0;J=C;I=Hd(A|0,b|0,36)|0;J=J|C;D=Gd(A|0,b|0,34)|0;H=C;E=Hd(A|0,b|0,30)|0;H=J^(H|C);J=Gd(A|0,b|0,39)|0;M=C;F=Hd(A|0,b|0,25)|0;M=Dd((l|f)&A|l&f|0,(m|j)&b|m&j|0,(G|I)^(D|E)^(J|F)|0,H^(M|C)|0)|0;H=C;o=Dd(p|0,o|0,B|0,K|0)|0;p=C;K=Dd(M|0,H|0,B|0,K|0)|0;B=C;H=Gd(o|0,p|0,14)|0;M=C;F=Hd(o|0,p|0,50)|0;M=M|C;J=Gd(o|0,p|0,18)|0;E=C;D=Hd(o|0,p|0,46)|0;E=M^(E|C);M=Gd(o|0,p|0,41)|0;I=C;G=Hd(o|0,p|0,23)|0;I=E^(I|C);E=g+272|0;L=c[E>>2]|0;E=c[E+4>>2]|0;y=Dd(x|0,y|0,1522805485,1294757372)|0;E=Dd(y|0,C|0,L|0,E|0)|0;I=Dd(E|0,C|0,(H|F)^(J|D)^(M|G)|0,I|0)|0;I=Dd(I|0,C|0,(u^r)&o^u|0,(v^s)&p^v|0)|0;G=C;M=Gd(K|0,B|0,28)|0;D=C;J=Hd(K|0,B|0,36)|0;D=D|C;F=Gd(K|0,B|0,34)|0;H=C;E=Hd(K|0,B|0,30)|0;H=D^(H|C);D=Gd(K|0,B|0,39)|0;L=C;y=Hd(K|0,B|0,25)|0;L=Dd((f|A)&K|f&A|0,(j|b)&B|j&b|0,(M|J)^(F|E)^(D|y)|0,H^(L|C)|0)|0;H=C;m=Dd(l|0,m|0,I|0,G|0)|0;l=C;G=Dd(L|0,H|0,I|0,G|0)|0;I=C;H=Gd(m|0,l|0,14)|0;L=C;y=Hd(m|0,l|0,50)|0;L=L|C;D=Gd(m|0,l|0,18)|0;E=C;F=Hd(m|0,l|0,46)|0;E=L^(E|C);L=Gd(m|0,l|0,41)|0;J=C;M=Hd(m|0,l|0,23)|0;J=E^(J|C);E=g+280|0;x=c[E>>2]|0;E=c[E+4>>2]|0;v=Dd(u|0,v|0,-1651133473,1396182291)|0;E=Dd(v|0,C|0,x|0,E|0)|0;J=Dd(E|0,C|0,(H|y)^(D|F)^(L|M)|0,J|0)|0;J=Dd(J|0,C|0,(r^o)&m^r|0,(s^p)&l^s|0)|0;M=C;L=Gd(G|0,I|0,28)|0;F=C;D=Hd(G|0,I|0,36)|0;F=F|C;y=Gd(G|0,I|0,34)|0;H=C;E=Hd(G|0,I|0,30)|0;H=F^(H|C);F=Gd(G|0,I|0,39)|0;x=C;v=Hd(G|0,I|0,25)|0;x=Dd((A|K)&G|A&K|0,(b|B)&I|b&B|0,(L|D)^(y|E)^(F|v)|0,H^(x|C)|0)|0;H=C;j=Dd(f|0,j|0,J|0,M|0)|0;f=C;M=Dd(x|0,H|0,J|0,M|0)|0;J=C;H=Gd(j|0,f|0,14)|0;x=C;v=Hd(j|0,f|0,50)|0;x=x|C;F=Gd(j|0,f|0,18)|0;E=C;y=Hd(j|0,f|0,46)|0;E=x^(E|C);x=Gd(j|0,f|0,41)|0;D=C;L=Hd(j|0,f|0,23)|0;D=E^(D|C);E=g+288|0;u=c[E>>2]|0;E=c[E+4>>2]|0;s=Dd(r|0,s|0,-1951439906,1695183700)|0;E=Dd(s|0,C|0,u|0,E|0)|0;D=Dd(E|0,C|0,(H|v)^(F|y)^(x|L)|0,D|0)|0;D=Dd(D|0,C|0,(o^m)&j^o|0,(p^l)&f^p|0)|0;L=C;x=Gd(M|0,J|0,28)|0;y=C;F=Hd(M|0,J|0,36)|0;y=y|C;v=Gd(M|0,J|0,34)|0;H=C;E=Hd(M|0,J|0,30)|0;H=y^(H|C);y=Gd(M|0,J|0,39)|0;u=C;s=Hd(M|0,J|0,25)|0;u=Dd((K|G)&M|K&G|0,(B|I)&J|B&I|0,(x|F)^(v|E)^(y|s)|0,H^(u|C)|0)|0;H=C;b=Dd(A|0,b|0,D|0,L|0)|0;A=C;L=Dd(u|0,H|0,D|0,L|0)|0;D=C;H=Gd(b|0,A|0,14)|0;u=C;s=Hd(b|0,A|0,50)|0;u=u|C;y=Gd(b|0,A|0,18)|0;E=C;v=Hd(b|0,A|0,46)|0;E=u^(E|C);u=Gd(b|0,A|0,41)|0;F=C;x=Hd(b|0,A|0,23)|0;F=E^(F|C);E=g+296|0;r=c[E>>2]|0;E=c[E+4>>2]|0;p=Dd(o|0,p|0,1014477480,1986661051)|0;E=Dd(p|0,C|0,r|0,E|0)|0;F=Dd(E|0,C|0,(H|s)^(y|v)^(u|x)|0,F|0)|0;F=Dd(F|0,C|0,(m^j)&b^m|0,(l^f)&A^l|0)|0;x=C;u=Gd(L|0,D|0,28)|0;v=C;y=Hd(L|0,D|0,36)|0;v=v|C;s=Gd(L|0,D|0,34)|0;H=C;E=Hd(L|0,D|0,30)|0;H=v^(H|C);v=Gd(L|0,D|0,39)|0;r=C;p=Hd(L|0,D|0,25)|0;r=Dd((G|M)&L|G&M|0,(I|J)&D|I&J|0,(u|y)^(s|E)^(v|p)|0,H^(r|C)|0)|0;H=C;B=Dd(K|0,B|0,F|0,x|0)|0;K=C;x=Dd(r|0,H|0,F|0,x|0)|0;F=C;H=Gd(B|0,K|0,14)|0;r=C;p=Hd(B|0,K|0,50)|0;r=r|C;v=Gd(B|0,K|0,18)|0;E=C;s=Hd(B|0,K|0,46)|0;E=r^(E|C);r=Gd(B|0,K|0,41)|0;y=C;u=Hd(B|0,K|0,23)|0;y=E^(y|C);E=g+304|0;o=c[E>>2]|0;E=c[E+4>>2]|0;l=Dd(m|0,l|0,1206759142,-2117940946)|0;E=Dd(l|0,C|0,o|0,E|0)|0;y=Dd(E|0,C|0,(H|p)^(v|s)^(r|u)|0,y|0)|0;y=Dd(y|0,C|0,(j^b)&B^j|0,(f^A)&K^f|0)|0;u=C;r=Gd(x|0,F|0,28)|0;s=C;v=Hd(x|0,F|0,36)|0;s=s|C;p=Gd(x|0,F|0,34)|0;H=C;E=Hd(x|0,F|0,30)|0;H=s^(H|C);s=Gd(x|0,F|0,39)|0;o=C;l=Hd(x|0,F|0,25)|0;o=Dd((M|L)&x|M&L|0,(J|D)&F|J&D|0,(r|v)^(p|E)^(s|l)|0,H^(o|C)|0)|0;H=C;I=Dd(G|0,I|0,y|0,u|0)|0;G=C;u=Dd(o|0,H|0,y|0,u|0)|0;y=C;H=Gd(I|0,G|0,14)|0;o=C;l=Hd(I|0,G|0,50)|0;o=o|C;s=Gd(I|0,G|0,18)|0;E=C;p=Hd(I|0,G|0,46)|0;E=o^(E|C);o=Gd(I|0,G|0,41)|0;v=C;r=Hd(I|0,G|0,23)|0;v=E^(v|C);E=g+312|0;m=c[E>>2]|0;E=c[E+4>>2]|0;f=Dd(j|0,f|0,344077627,-1838011259)|0;E=Dd(f|0,C|0,m|0,E|0)|0;v=Dd(E|0,C|0,(H|l)^(s|p)^(o|r)|0,v|0)|0;v=Dd(v|0,C|0,(b^B)&I^b|0,(A^K)&G^A|0)|0;r=C;o=Gd(u|0,y|0,28)|0;p=C;s=Hd(u|0,y|0,36)|0;p=p|C;l=Gd(u|0,y|0,34)|0;H=C;E=Hd(u|0,y|0,30)|0;H=p^(H|C);p=Gd(u|0,y|0,39)|0;m=C;f=Hd(u|0,y|0,25)|0;m=Dd((L|x)&u|L&x|0,(D|F)&y|D&F|0,(o|s)^(l|E)^(p|f)|0,H^(m|C)|0)|0;H=C;J=Dd(M|0,J|0,v|0,r|0)|0;M=C;r=Dd(m|0,H|0,v|0,r|0)|0;v=C;H=Gd(J|0,M|0,14)|0;m=C;f=Hd(J|0,M|0,50)|0;m=m|C;p=Gd(J|0,M|0,18)|0;E=C;l=Hd(J|0,M|0,46)|0;E=m^(E|C);m=Gd(J|0,M|0,41)|0;s=C;o=Hd(J|0,M|0,23)|0;s=E^(s|C);E=g+320|0;j=c[E>>2]|0;E=c[E+4>>2]|0;A=Dd(b|0,A|0,1290863460,-1564481375)|0;E=Dd(A|0,C|0,j|0,E|0)|0;s=Dd(E|0,C|0,(H|f)^(p|l)^(m|o)|0,s|0)|0;s=Dd(s|0,C|0,(B^I)&J^B|0,(K^G)&M^K|0)|0;o=C;m=Gd(r|0,v|0,28)|0;l=C;p=Hd(r|0,v|0,36)|0;l=l|C;f=Gd(r|0,v|0,34)|0;H=C;E=Hd(r|0,v|0,30)|0;H=l^(H|C);l=Gd(r|0,v|0,39)|0;j=C;A=Hd(r|0,v|0,25)|0;j=Dd((x|u)&r|x&u|0,(F|y)&v|F&y|0,(m|p)^(f|E)^(l|A)|0,H^(j|C)|0)|0;H=C;D=Dd(L|0,D|0,s|0,o|0)|0;L=C;o=Dd(j|0,H|0,s|0,o|0)|0;s=C;H=Gd(D|0,L|0,14)|0;j=C;A=Hd(D|0,L|0,50)|0;j=j|C;l=Gd(D|0,L|0,18)|0;E=C;f=Hd(D|0,L|0,46)|0;E=j^(E|C);j=Gd(D|0,L|0,41)|0;p=C;m=Hd(D|0,L|0,23)|0;p=E^(p|C);E=g+328|0;b=c[E>>2]|0;E=c[E+4>>2]|0;K=Dd(B|0,K|0,-1136513023,-1474664885)|0;E=Dd(K|0,C|0,b|0,E|0)|0;p=Dd(E|0,C|0,(H|A)^(l|f)^(j|m)|0,p|0)|0;p=Dd(p|0,C|0,(I^J)&D^I|0,(G^M)&L^G|0)|0;m=C;j=Gd(o|0,s|0,28)|0;f=C;l=Hd(o|0,s|0,36)|0;f=f|C;A=Gd(o|0,s|0,34)|0;H=C;E=Hd(o|0,s|0,30)|0;H=f^(H|C);f=Gd(o|0,s|0,39)|0;b=C;K=Hd(o|0,s|0,25)|0;b=Dd((u|r)&o|u&r|0,(y|v)&s|y&v|0,(j|l)^(A|E)^(f|K)|0,H^(b|C)|0)|0;H=C;F=Dd(x|0,F|0,p|0,m|0)|0;x=C;m=Dd(b|0,H|0,p|0,m|0)|0;p=C;H=Gd(F|0,x|0,14)|0;b=C;K=Hd(F|0,x|0,50)|0;b=b|C;f=Gd(F|0,x|0,18)|0;E=C;A=Hd(F|0,x|0,46)|0;E=b^(E|C);b=Gd(F|0,x|0,41)|0;l=C;j=Hd(F|0,x|0,23)|0;l=E^(l|C);E=g+336|0;B=c[E>>2]|0;E=c[E+4>>2]|0;G=Dd(I|0,G|0,-789014639,-1035236496)|0;E=Dd(G|0,C|0,B|0,E|0)|0;l=Dd(E|0,C|0,(H|K)^(f|A)^(b|j)|0,l|0)|0;l=Dd(l|0,C|0,(J^D)&F^J|0,(M^L)&x^M|0)|0;j=C;b=Gd(m|0,p|0,28)|0;A=C;f=Hd(m|0,p|0,36)|0;A=A|C;K=Gd(m|0,p|0,34)|0;H=C;E=Hd(m|0,p|0,30)|0;H=A^(H|C);A=Gd(m|0,p|0,39)|0;B=C;G=Hd(m|0,p|0,25)|0;B=Dd((r|o)&m|r&o|0,(v|s)&p|v&s|0,(b|f)^(K|E)^(A|G)|0,H^(B|C)|0)|0;H=C;y=Dd(u|0,y|0,l|0,j|0)|0;u=C;j=Dd(B|0,H|0,l|0,j|0)|0;l=C;H=Gd(y|0,u|0,14)|0;B=C;G=Hd(y|0,u|0,50)|0;B=B|C;A=Gd(y|0,u|0,18)|0;E=C;K=Hd(y|0,u|0,46)|0;E=B^(E|C);B=Gd(y|0,u|0,41)|0;f=C;b=Hd(y|0,u|0,23)|0;f=E^(f|C);E=g+344|0;I=c[E>>2]|0;E=c[E+4>>2]|0;M=Dd(J|0,M|0,106217008,-949202525)|0;E=Dd(M|0,C|0,I|0,E|0)|0;f=Dd(E|0,C|0,(H|G)^(A|K)^(B|b)|0,f|0)|0;f=Dd(f|0,C|0,(D^F)&y^D|0,(L^x)&u^L|0)|0;b=C;B=Gd(j|0,l|0,28)|0;K=C;A=Hd(j|0,l|0,36)|0;K=K|C;G=Gd(j|0,l|0,34)|0;H=C;E=Hd(j|0,l|0,30)|0;H=K^(H|C);K=Gd(j|0,l|0,39)|0;I=C;M=Hd(j|0,l|0,25)|0;I=Dd((o|m)&j|o&m|0,(s|p)&l|s&p|0,(B|A)^(G|E)^(K|M)|0,H^(I|C)|0)|0;H=C;v=Dd(r|0,v|0,f|0,b|0)|0;r=C;b=Dd(I|0,H|0,f|0,b|0)|0;f=C;H=Gd(v|0,r|0,14)|0;I=C;M=Hd(v|0,r|0,50)|0;I=I|C;K=Gd(v|0,r|0,18)|0;E=C;G=Hd(v|0,r|0,46)|0;E=I^(E|C);I=Gd(v|0,r|0,41)|0;A=C;B=Hd(v|0,r|0,23)|0;A=E^(A|C);E=g+352|0;J=c[E>>2]|0;E=c[E+4>>2]|0;L=Dd(D|0,L|0,-688958952,-778901479)|0;E=Dd(L|0,C|0,J|0,E|0)|0;A=Dd(E|0,C|0,(H|M)^(K|G)^(I|B)|0,A|0)|0;A=Dd(A|0,C|0,(F^y)&v^F|0,(x^u)&r^x|0)|0;B=C;I=Gd(b|0,f|0,28)|0;G=C;K=Hd(b|0,f|0,36)|0;G=G|C;M=Gd(b|0,f|0,34)|0;H=C;E=Hd(b|0,f|0,30)|0;H=G^(H|C);G=Gd(b|0,f|0,39)|0;J=C;L=Hd(b|0,f|0,25)|0;J=Dd((m|j)&b|m&j|0,(p|l)&f|p&l|0,(I|K)^(M|E)^(G|L)|0,H^(J|C)|0)|0;H=C;s=Dd(o|0,s|0,A|0,B|0)|0;o=C;B=Dd(J|0,H|0,A|0,B|0)|0;A=C;H=Gd(s|0,o|0,14)|0;J=C;L=Hd(s|0,o|0,50)|0;J=J|C;G=Gd(s|0,o|0,18)|0;E=C;M=Hd(s|0,o|0,46)|0;E=J^(E|C);J=Gd(s|0,o|0,41)|0;K=C;I=Hd(s|0,o|0,23)|0;K=E^(K|C);E=g+360|0;D=c[E>>2]|0;E=c[E+4>>2]|0;x=Dd(F|0,x|0,1432725776,-694614492)|0;E=Dd(x|0,C|0,D|0,E|0)|0;K=Dd(E|0,C|0,(H|L)^(G|M)^(J|I)|0,K|0)|0;K=Dd(K|0,C|0,(y^v)&s^y|0,(u^r)&o^u|0)|0;I=C;J=Gd(B|0,A|0,28)|0;M=C;G=Hd(B|0,A|0,36)|0;M=M|C;L=Gd(B|0,A|0,34)|0;H=C;E=Hd(B|0,A|0,30)|0;H=M^(H|C);M=Gd(B|0,A|0,39)|0;D=C;x=Hd(B|0,A|0,25)|0;D=Dd((j|b)&B|j&b|0,(l|f)&A|l&f|0,(J|G)^(L|E)^(M|x)|0,H^(D|C)|0)|0;H=C;p=Dd(m|0,p|0,K|0,I|0)|0;m=C;I=Dd(D|0,H|0,K|0,I|0)|0;K=C;H=Gd(p|0,m|0,14)|0;D=C;x=Hd(p|0,m|0,50)|0;D=D|C;M=Gd(p|0,m|0,18)|0;E=C;L=Hd(p|0,m|0,46)|0;E=D^(E|C);D=Gd(p|0,m|0,41)|0;G=C;J=Hd(p|0,m|0,23)|0;G=E^(G|C);E=g+368|0;F=c[E>>2]|0;E=c[E+4>>2]|0;u=Dd(y|0,u|0,1467031594,-200395387)|0;E=Dd(u|0,C|0,F|0,E|0)|0;G=Dd(E|0,C|0,(H|x)^(M|L)^(D|J)|0,G|0)|0;G=Dd(G|0,C|0,(v^s)&p^v|0,(r^o)&m^r|0)|0;J=C;D=Gd(I|0,K|0,28)|0;L=C;M=Hd(I|0,K|0,36)|0;L=L|C;x=Gd(I|0,K|0,34)|0;H=C;E=Hd(I|0,K|0,30)|0;H=L^(H|C);L=Gd(I|0,K|0,39)|0;F=C;u=Hd(I|0,K|0,25)|0;F=Dd((b|B)&I|b&B|0,(f|A)&K|f&A|0,(D|M)^(x|E)^(L|u)|0,H^(F|C)|0)|0;H=C;l=Dd(j|0,l|0,G|0,J|0)|0;j=C;J=Dd(F|0,H|0,G|0,J|0)|0;G=C;H=Gd(l|0,j|0,14)|0;F=C;u=Hd(l|0,j|0,50)|0;F=F|C;L=Gd(l|0,j|0,18)|0;E=C;x=Hd(l|0,j|0,46)|0;E=F^(E|C);F=Gd(l|0,j|0,41)|0;M=C;D=Hd(l|0,j|0,23)|0;M=E^(M|C);E=g+376|0;y=c[E>>2]|0;E=c[E+4>>2]|0;r=Dd(v|0,r|0,851169720,275423344)|0;E=Dd(r|0,C|0,y|0,E|0)|0;M=Dd(E|0,C|0,(H|u)^(L|x)^(F|D)|0,M|0)|0;M=Dd(M|0,C|0,(s^p)&l^s|0,(o^m)&j^o|0)|0;D=C;F=Gd(J|0,G|0,28)|0;x=C;L=Hd(J|0,G|0,36)|0;x=x|C;u=Gd(J|0,G|0,34)|0;H=C;E=Hd(J|0,G|0,30)|0;H=x^(H|C);x=Gd(J|0,G|0,39)|0;y=C;r=Hd(J|0,G|0,25)|0;y=Dd((B|I)&J|B&I|0,(A|K)&G|A&K|0,(F|L)^(u|E)^(x|r)|0,H^(y|C)|0)|0;H=C;f=Dd(b|0,f|0,M|0,D|0)|0;b=C;D=Dd(y|0,H|0,M|0,D|0)|0;M=C;H=Gd(f|0,b|0,14)|0;y=C;r=Hd(f|0,b|0,50)|0;y=y|C;x=Gd(f|0,b|0,18)|0;E=C;u=Hd(f|0,b|0,46)|0;E=y^(E|C);y=Gd(f|0,b|0,41)|0;L=C;F=Hd(f|0,b|0,23)|0;L=E^(L|C);E=g+384|0;v=c[E>>2]|0;E=c[E+4>>2]|0;o=Dd(s|0,o|0,-1194143544,430227734)|0;E=Dd(o|0,C|0,v|0,E|0)|0;L=Dd(E|0,C|0,(H|r)^(x|u)^(y|F)|0,L|0)|0;L=Dd(L|0,C|0,(p^l)&f^p|0,(m^j)&b^m|0)|0;F=C;y=Gd(D|0,M|0,28)|0;u=C;x=Hd(D|0,M|0,36)|0;u=u|C;r=Gd(D|0,M|0,34)|0;H=C;E=Hd(D|0,M|0,30)|0;H=u^(H|C);u=Gd(D|0,M|0,39)|0;v=C;o=Hd(D|0,M|0,25)|0;v=Dd((I|J)&D|I&J|0,(K|G)&M|K&G|0,(y|x)^(r|E)^(u|o)|0,H^(v|C)|0)|0;H=C;A=Dd(B|0,A|0,L|0,F|0)|0;B=C;F=Dd(v|0,H|0,L|0,F|0)|0;L=C;H=Gd(A|0,B|0,14)|0;v=C;o=Hd(A|0,B|0,50)|0;v=v|C;u=Gd(A|0,B|0,18)|0;E=C;r=Hd(A|0,B|0,46)|0;E=v^(E|C);v=Gd(A|0,B|0,41)|0;x=C;y=Hd(A|0,B|0,23)|0;x=E^(x|C);E=g+392|0;s=c[E>>2]|0;E=c[E+4>>2]|0;m=Dd(p|0,m|0,1363258195,506948616)|0;E=Dd(m|0,C|0,s|0,E|0)|0;x=Dd(E|0,C|0,(H|o)^(u|r)^(v|y)|0,x|0)|0;x=Dd(x|0,C|0,(l^f)&A^l|0,(j^b)&B^j|0)|0;y=C;v=Gd(F|0,L|0,28)|0;r=C;u=Hd(F|0,L|0,36)|0;r=r|C;o=Gd(F|0,L|0,34)|0;H=C;E=Hd(F|0,L|0,30)|0;H=r^(H|C);r=Gd(F|0,L|0,39)|0;s=C;m=Hd(F|0,L|0,25)|0;s=Dd((J|D)&F|J&D|0,(G|M)&L|G&M|0,(v|u)^(o|E)^(r|m)|0,H^(s|C)|0)|0;H=C;K=Dd(I|0,K|0,x|0,y|0)|0;I=C;y=Dd(s|0,H|0,x|0,y|0)|0;x=C;H=Gd(K|0,I|0,14)|0;s=C;m=Hd(K|0,I|0,50)|0;s=s|C;r=Gd(K|0,I|0,18)|0;E=C;o=Hd(K|0,I|0,46)|0;E=s^(E|C);s=Gd(K|0,I|0,41)|0;u=C;v=Hd(K|0,I|0,23)|0;u=E^(u|C);E=g+400|0;p=c[E>>2]|0;E=c[E+4>>2]|0;j=Dd(l|0,j|0,-544281703,659060556)|0;E=Dd(j|0,C|0,p|0,E|0)|0;u=Dd(E|0,C|0,(H|m)^(r|o)^(s|v)|0,u|0)|0;u=Dd(u|0,C|0,(f^A)&K^f|0,(b^B)&I^b|0)|0;v=C;s=Gd(y|0,x|0,28)|0;o=C;r=Hd(y|0,x|0,36)|0;o=o|C;m=Gd(y|0,x|0,34)|0;H=C;E=Hd(y|0,x|0,30)|0;H=o^(H|C);o=Gd(y|0,x|0,39)|0;p=C;j=Hd(y|0,x|0,25)|0;p=Dd((D|F)&y|D&F|0,(M|L)&x|M&L|0,(s|r)^(m|E)^(o|j)|0,H^(p|C)|0)|0;H=C;G=Dd(J|0,G|0,u|0,v|0)|0;J=C;v=Dd(p|0,H|0,u|0,v|0)|0;u=C;H=Gd(G|0,J|0,14)|0;p=C;j=Hd(G|0,J|0,50)|0;p=p|C;o=Gd(G|0,J|0,18)|0;E=C;m=Hd(G|0,J|0,46)|0;E=p^(E|C);p=Gd(G|0,J|0,41)|0;r=C;s=Hd(G|0,J|0,23)|0;r=E^(r|C);E=g+408|0;l=c[E>>2]|0;E=c[E+4>>2]|0;b=Dd(f|0,b|0,-509917016,883997877)|0;E=Dd(b|0,C|0,l|0,E|0)|0;r=Dd(E|0,C|0,(H|j)^(o|m)^(p|s)|0,r|0)|0;r=Dd(r|0,C|0,(A^K)&G^A|0,(B^I)&J^B|0)|0;s=C;p=Gd(v|0,u|0,28)|0;m=C;o=Hd(v|0,u|0,36)|0;m=m|C;j=Gd(v|0,u|0,34)|0;H=C;E=Hd(v|0,u|0,30)|0;H=m^(H|C);m=Gd(v|0,u|0,39)|0;l=C;b=Hd(v|0,u|0,25)|0;l=Dd((F|y)&v|F&y|0,(L|x)&u|L&x|0,(p|o)^(j|E)^(m|b)|0,H^(l|C)|0)|0;H=C;M=Dd(D|0,M|0,r|0,s|0)|0;D=C;s=Dd(l|0,H|0,r|0,s|0)|0;r=C;H=Gd(M|0,D|0,14)|0;l=C;b=Hd(M|0,D|0,50)|0;l=l|C;m=Gd(M|0,D|0,18)|0;E=C;j=Hd(M|0,D|0,46)|0;E=l^(E|C);l=Gd(M|0,D|0,41)|0;o=C;p=Hd(M|0,D|0,23)|0;o=E^(o|C);E=g+416|0;f=c[E>>2]|0;E=c[E+4>>2]|0;B=Dd(A|0,B|0,-976659869,958139571)|0;E=Dd(B|0,C|0,f|0,E|0)|0;o=Dd(E|0,C|0,(H|b)^(m|j)^(l|p)|0,o|0)|0;o=Dd(o|0,C|0,(K^G)&M^K|0,(I^J)&D^I|0)|0;p=C;l=Gd(s|0,r|0,28)|0;j=C;m=Hd(s|0,r|0,36)|0;j=j|C;b=Gd(s|0,r|0,34)|0;H=C;E=Hd(s|0,r|0,30)|0;H=j^(H|C);j=Gd(s|0,r|0,39)|0;f=C;B=Hd(s|0,r|0,25)|0;f=Dd((y|v)&s|y&v|0,(x|u)&r|x&u|0,(l|m)^(b|E)^(j|B)|0,H^(f|C)|0)|0;H=C;L=Dd(F|0,L|0,o|0,p|0)|0;F=C;p=Dd(f|0,H|0,o|0,p|0)|0;o=C;H=Gd(L|0,F|0,14)|0;f=C;B=Hd(L|0,F|0,50)|0;f=f|C;j=Gd(L|0,F|0,18)|0;E=C;b=Hd(L|0,F|0,46)|0;E=f^(E|C);f=Gd(L|0,F|0,41)|0;m=C;l=Hd(L|0,F|0,23)|0;m=E^(m|C);E=g+424|0;A=c[E>>2]|0;E=c[E+4>>2]|0;I=Dd(K|0,I|0,-482243893,1322822218)|0;E=Dd(I|0,C|0,A|0,E|0)|0;m=Dd(E|0,C|0,(H|B)^(j|b)^(f|l)|0,m|0)|0;m=Dd(m|0,C|0,(G^M)&L^G|0,(J^D)&F^J|0)|0;l=C;f=Gd(p|0,o|0,28)|0;b=C;j=Hd(p|0,o|0,36)|0;b=b|C;B=Gd(p|0,o|0,34)|0;H=C;E=Hd(p|0,o|0,30)|0;H=b^(H|C);b=Gd(p|0,o|0,39)|0;A=C;I=Hd(p|0,o|0,25)|0;A=Dd((v|s)&p|v&s|0,(u|r)&o|u&r|0,(f|j)^(B|E)^(b|I)|0,H^(A|C)|0)|0;H=C;x=Dd(y|0,x|0,m|0,l|0)|0;y=C;l=Dd(A|0,H|0,m|0,l|0)|0;m=C;H=Gd(x|0,y|0,14)|0;A=C;I=Hd(x|0,y|0,50)|0;A=A|C;b=Gd(x|0,y|0,18)|0;E=C;B=Hd(x|0,y|0,46)|0;E=A^(E|C);A=Gd(x|0,y|0,41)|0;j=C;f=Hd(x|0,y|0,23)|0;j=E^(j|C);E=g+432|0;K=c[E>>2]|0;E=c[E+4>>2]|0;J=Dd(G|0,J|0,2003034995,1537002063)|0;E=Dd(J|0,C|0,K|0,E|0)|0;j=Dd(E|0,C|0,(H|I)^(b|B)^(A|f)|0,j|0)|0;j=Dd(j|0,C|0,(M^L)&x^M|0,(D^F)&y^D|0)|0;f=C;A=Gd(l|0,m|0,28)|0;B=C;b=Hd(l|0,m|0,36)|0;B=B|C;I=Gd(l|0,m|0,34)|0;H=C;E=Hd(l|0,m|0,30)|0;H=B^(H|C);B=Gd(l|0,m|0,39)|0;K=C;J=Hd(l|0,m|0,25)|0;K=Dd((s|p)&l|s&p|0,(r|o)&m|r&o|0,(A|b)^(I|E)^(B|J)|0,H^(K|C)|0)|0;H=C;u=Dd(v|0,u|0,j|0,f|0)|0;v=C;f=Dd(K|0,H|0,j|0,f|0)|0;j=C;H=Gd(u|0,v|0,14)|0;K=C;J=Hd(u|0,v|0,50)|0;K=K|C;B=Gd(u|0,v|0,18)|0;E=C;I=Hd(u|0,v|0,46)|0;E=K^(E|C);K=Gd(u|0,v|0,41)|0;b=C;A=Hd(u|0,v|0,23)|0;b=E^(b|C);E=g+440|0;G=c[E>>2]|0;E=c[E+4>>2]|0;D=Dd(M|0,D|0,-692930397,1747873779)|0;E=Dd(D|0,C|0,G|0,E|0)|0;b=Dd(E|0,C|0,(H|J)^(B|I)^(K|A)|0,b|0)|0;b=Dd(b|0,C|0,(L^x)&u^L|0,(F^y)&v^F|0)|0;A=C;K=Gd(f|0,j|0,28)|0;I=C;B=Hd(f|0,j|0,36)|0;I=I|C;J=Gd(f|0,j|0,34)|0;H=C;E=Hd(f|0,j|0,30)|0;H=I^(H|C);I=Gd(f|0,j|0,39)|0;G=C;D=Hd(f|0,j|0,25)|0;G=Dd((p|l)&f|p&l|0,(o|m)&j|o&m|0,(K|B)^(J|E)^(I|D)|0,H^(G|C)|0)|0;H=C;r=Dd(s|0,r|0,b|0,A|0)|0;s=C;A=Dd(G|0,H|0,b|0,A|0)|0;b=C;H=Gd(r|0,s|0,14)|0;G=C;D=Hd(r|0,s|0,50)|0;G=G|C;I=Gd(r|0,s|0,18)|0;E=C;J=Hd(r|0,s|0,46)|0;E=G^(E|C);G=Gd(r|0,s|0,41)|0;B=C;K=Hd(r|0,s|0,23)|0;B=E^(B|C);E=g+448|0;M=c[E>>2]|0;E=c[E+4>>2]|0;F=Dd(L|0,F|0,1575990012,1955562222)|0;E=Dd(F|0,C|0,M|0,E|0)|0;B=Dd(E|0,C|0,(H|D)^(I|J)^(G|K)|0,B|0)|0;B=Dd(B|0,C|0,(x^u)&r^x|0,(y^v)&s^y|0)|0;K=C;G=Gd(A|0,b|0,28)|0;J=C;I=Hd(A|0,b|0,36)|0;J=J|C;D=Gd(A|0,b|0,34)|0;H=C;E=Hd(A|0,b|0,30)|0;H=J^(H|C);J=Gd(A|0,b|0,39)|0;M=C;F=Hd(A|0,b|0,25)|0;M=Dd((l|f)&A|l&f|0,(m|j)&b|m&j|0,(G|I)^(D|E)^(J|F)|0,H^(M|C)|0)|0;H=C;o=Dd(p|0,o|0,B|0,K|0)|0;p=C;K=Dd(M|0,H|0,B|0,K|0)|0;B=C;H=Gd(o|0,p|0,14)|0;M=C;F=Hd(o|0,p|0,50)|0;M=M|C;J=Gd(o|0,p|0,18)|0;E=C;D=Hd(o|0,p|0,46)|0;E=M^(E|C);M=Gd(o|0,p|0,41)|0;I=C;G=Hd(o|0,p|0,23)|0;I=E^(I|C);E=g+456|0;L=c[E>>2]|0;E=c[E+4>>2]|0;y=Dd(x|0,y|0,1125592928,2024104815)|0;E=Dd(y|0,C|0,L|0,E|0)|0;I=Dd(E|0,C|0,(H|F)^(J|D)^(M|G)|0,I|0)|0;I=Dd(I|0,C|0,(u^r)&o^u|0,(v^s)&p^v|0)|0;G=C;M=Gd(K|0,B|0,28)|0;D=C;J=Hd(K|0,B|0,36)|0;D=D|C;F=Gd(K|0,B|0,34)|0;H=C;E=Hd(K|0,B|0,30)|0;H=D^(H|C);D=Gd(K|0,B|0,39)|0;L=C;y=Hd(K|0,B|0,25)|0;L=Dd((f|A)&K|f&A|0,(j|b)&B|j&b|0,(M|J)^(F|E)^(D|y)|0,H^(L|C)|0)|0;H=C;m=Dd(l|0,m|0,I|0,G|0)|0;l=C;G=Dd(L|0,H|0,I|0,G|0)|0;I=C;H=Gd(m|0,l|0,14)|0;L=C;y=Hd(m|0,l|0,50)|0;L=L|C;D=Gd(m|0,l|0,18)|0;E=C;F=Hd(m|0,l|0,46)|0;E=L^(E|C);L=Gd(m|0,l|0,41)|0;J=C;M=Hd(m|0,l|0,23)|0;J=E^(J|C);E=g+464|0;x=c[E>>2]|0;E=c[E+4>>2]|0;v=Dd(u|0,v|0,-1578062990,-2067236844)|0;E=Dd(v|0,C|0,x|0,E|0)|0;J=Dd(E|0,C|0,(H|y)^(D|F)^(L|M)|0,J|0)|0;J=Dd(J|0,C|0,(r^o)&m^r|0,(s^p)&l^s|0)|0;M=C;L=Gd(G|0,I|0,28)|0;F=C;D=Hd(G|0,I|0,36)|0;F=F|C;y=Gd(G|0,I|0,34)|0;H=C;E=Hd(G|0,I|0,30)|0;H=F^(H|C);F=Gd(G|0,I|0,39)|0;x=C;v=Hd(G|0,I|0,25)|0;x=Dd((A|K)&G|A&K|0,(b|B)&I|b&B|0,(L|D)^(y|E)^(F|v)|0,H^(x|C)|0)|0;H=C;j=Dd(f|0,j|0,J|0,M|0)|0;f=C;M=Dd(x|0,H|0,J|0,M|0)|0;J=C;H=Gd(j|0,f|0,14)|0;x=C;v=Hd(j|0,f|0,50)|0;x=x|C;F=Gd(j|0,f|0,18)|0;E=C;y=Hd(j|0,f|0,46)|0;E=x^(E|C);x=Gd(j|0,f|0,41)|0;D=C;L=Hd(j|0,f|0,23)|0;D=E^(D|C);E=g+472|0;u=c[E>>2]|0;E=c[E+4>>2]|0;s=Dd(r|0,s|0,442776044,-1933114872)|0;E=Dd(s|0,C|0,u|0,E|0)|0;D=Dd(E|0,C|0,(H|v)^(F|y)^(x|L)|0,D|0)|0;D=Dd(D|0,C|0,(o^m)&j^o|0,(p^l)&f^p|0)|0;L=C;x=Gd(M|0,J|0,28)|0;y=C;F=Hd(M|0,J|0,36)|0;y=y|C;v=Gd(M|0,J|0,34)|0;H=C;E=Hd(M|0,J|0,30)|0;H=y^(H|C);y=Gd(M|0,J|0,39)|0;u=C;s=Hd(M|0,J|0,25)|0;u=Dd((K|G)&M|K&G|0,(B|I)&J|B&I|0,(x|F)^(v|E)^(y|s)|0,H^(u|C)|0)|0;H=C;b=Dd(A|0,b|0,D|0,L|0)|0;A=C;L=Dd(u|0,H|0,D|0,L|0)|0;D=C;H=Gd(b|0,A|0,14)|0;u=C;s=Hd(b|0,A|0,50)|0;u=u|C;y=Gd(b|0,A|0,18)|0;E=C;v=Hd(b|0,A|0,46)|0;E=u^(E|C);u=Gd(b|0,A|0,41)|0;F=C;x=Hd(b|0,A|0,23)|0;F=E^(F|C);E=g+480|0;r=c[E>>2]|0;E=c[E+4>>2]|0;p=Dd(o|0,p|0,593698344,-1866530822)|0;E=Dd(p|0,C|0,r|0,E|0)|0;F=Dd(E|0,C|0,(H|s)^(y|v)^(u|x)|0,F|0)|0;F=Dd(F|0,C|0,(m^j)&b^m|0,(l^f)&A^l|0)|0;x=C;u=Gd(L|0,D|0,28)|0;v=C;y=Hd(L|0,D|0,36)|0;v=v|C;s=Gd(L|0,D|0,34)|0;H=C;E=Hd(L|0,D|0,30)|0;H=v^(H|C);v=Gd(L|0,D|0,39)|0;r=C;p=Hd(L|0,D|0,25)|0;r=Dd((G|M)&L|G&M|0,(I|J)&D|I&J|0,(u|y)^(s|E)^(v|p)|0,H^(r|C)|0)|0;H=C;B=Dd(K|0,B|0,F|0,x|0)|0;K=C;x=Dd(r|0,H|0,F|0,x|0)|0;F=C;H=Gd(B|0,K|0,14)|0;r=C;p=Hd(B|0,K|0,50)|0;r=r|C;v=Gd(B|0,K|0,18)|0;E=C;s=Hd(B|0,K|0,46)|0;E=r^(E|C);r=Gd(B|0,K|0,41)|0;y=C;u=Hd(B|0,K|0,23)|0;y=E^(y|C);E=g+488|0;o=c[E>>2]|0;E=c[E+4>>2]|0;l=Dd(m|0,l|0,-561857047,-1538233109)|0;E=Dd(l|0,C|0,o|0,E|0)|0;y=Dd(E|0,C|0,(H|p)^(v|s)^(r|u)|0,y|0)|0;y=Dd(y|0,C|0,(j^b)&B^j|0,(f^A)&K^f|0)|0;u=C;r=Gd(x|0,F|0,28)|0;s=C;v=Hd(x|0,F|0,36)|0;s=s|C;p=Gd(x|0,F|0,34)|0;H=C;E=Hd(x|0,F|0,30)|0;H=s^(H|C);s=Gd(x|0,F|0,39)|0;o=C;l=Hd(x|0,F|0,25)|0;o=Dd((M|L)&x|M&L|0,(J|D)&F|J&D|0,(r|v)^(p|E)^(s|l)|0,H^(o|C)|0)|0;H=C;I=Dd(G|0,I|0,y|0,u|0)|0;G=C;u=Dd(o|0,H|0,y|0,u|0)|0;y=C;H=Gd(I|0,G|0,14)|0;o=C;l=Hd(I|0,G|0,50)|0;o=o|C;s=Gd(I|0,G|0,18)|0;E=C;p=Hd(I|0,G|0,46)|0;E=o^(E|C);o=Gd(I|0,G|0,41)|0;v=C;r=Hd(I|0,G|0,23)|0;v=E^(v|C);E=g+496|0;m=c[E>>2]|0;E=c[E+4>>2]|0;f=Dd(j|0,f|0,-1295615723,-1090935817)|0;E=Dd(f|0,C|0,m|0,E|0)|0;v=Dd(E|0,C|0,(H|l)^(s|p)^(o|r)|0,v|0)|0;v=Dd(v|0,C|0,(b^B)&I^b|0,(A^K)&G^A|0)|0;r=C;o=Gd(u|0,y|0,28)|0;p=C;s=Hd(u|0,y|0,36)|0;p=p|C;l=Gd(u|0,y|0,34)|0;H=C;E=Hd(u|0,y|0,30)|0;H=p^(H|C);p=Gd(u|0,y|0,39)|0;m=C;f=Hd(u|0,y|0,25)|0;m=Dd((L|x)&u|L&x|0,(D|F)&y|D&F|0,(o|s)^(l|E)^(p|f)|0,H^(m|C)|0)|0;H=C;J=Dd(M|0,J|0,v|0,r|0)|0;M=C;r=Dd(m|0,H|0,v|0,r|0)|0;v=C;H=Gd(J|0,M|0,14)|0;m=C;f=Hd(J|0,M|0,50)|0;m=m|C;p=Gd(J|0,M|0,18)|0;E=C;l=Hd(J|0,M|0,46)|0;E=m^(E|C);m=Gd(J|0,M|0,41)|0;s=C;o=Hd(J|0,M|0,23)|0;s=E^(s|C);E=g+504|0;j=c[E>>2]|0;E=c[E+4>>2]|0;A=Dd(b|0,A|0,-479046869,-965641998)|0;E=Dd(A|0,C|0,j|0,E|0)|0;s=Dd(E|0,C|0,(H|f)^(p|l)^(m|o)|0,s|0)|0;s=Dd(s|0,C|0,(B^I)&J^B|0,(K^G)&M^K|0)|0;o=C;m=Gd(r|0,v|0,28)|0;l=C;p=Hd(r|0,v|0,36)|0;l=l|C;f=Gd(r|0,v|0,34)|0;H=C;E=Hd(r|0,v|0,30)|0;H=l^(H|C);l=Gd(r|0,v|0,39)|0;j=C;A=Hd(r|0,v|0,25)|0;j=Dd((x|u)&r|x&u|0,(F|y)&v|F&y|0,(m|p)^(f|E)^(l|A)|0,H^(j|C)|0)|0;H=C;D=Dd(L|0,D|0,s|0,o|0)|0;L=C;o=Dd(j|0,H|0,s|0,o|0)|0;s=C;H=Gd(D|0,L|0,14)|0;j=C;A=Hd(D|0,L|0,50)|0;j=j|C;l=Gd(D|0,L|0,18)|0;E=C;f=Hd(D|0,L|0,46)|0;E=j^(E|C);j=Gd(D|0,L|0,41)|0;p=C;m=Hd(D|0,L|0,23)|0;p=E^(p|C);E=g+512|0;b=c[E>>2]|0;E=c[E+4>>2]|0;K=Dd(B|0,K|0,-366583396,-903397682)|0;E=Dd(K|0,C|0,b|0,E|0)|0;p=Dd(E|0,C|0,(H|A)^(l|f)^(j|m)|0,p|0)|0;p=Dd(p|0,C|0,(I^J)&D^I|0,(G^M)&L^G|0)|0;m=C;j=Gd(o|0,s|0,28)|0;f=C;l=Hd(o|0,s|0,36)|0;f=f|C;A=Gd(o|0,s|0,34)|0;H=C;E=Hd(o|0,s|0,30)|0;H=f^(H|C);f=Gd(o|0,s|0,39)|0;b=C;K=Hd(o|0,s|0,25)|0;b=Dd((u|r)&o|u&r|0,(y|v)&s|y&v|0,(j|l)^(A|E)^(f|K)|0,H^(b|C)|0)|0;H=C;F=Dd(x|0,F|0,p|0,m|0)|0;x=C;m=Dd(b|0,H|0,p|0,m|0)|0;p=C;H=Gd(F|0,x|0,14)|0;b=C;K=Hd(F|0,x|0,50)|0;b=b|C;f=Gd(F|0,x|0,18)|0;E=C;A=Hd(F|0,x|0,46)|0;E=b^(E|C);b=Gd(F|0,x|0,41)|0;l=C;j=Hd(F|0,x|0,23)|0;l=E^(l|C);E=g+520|0;B=c[E>>2]|0;E=c[E+4>>2]|0;G=Dd(I|0,G|0,566280711,-779700025)|0;E=Dd(G|0,C|0,B|0,E|0)|0;l=Dd(E|0,C|0,(H|K)^(f|A)^(b|j)|0,l|0)|0;l=Dd(l|0,C|0,(J^D)&F^J|0,(M^L)&x^M|0)|0;j=C;b=Gd(m|0,p|0,28)|0;A=C;f=Hd(m|0,p|0,36)|0;A=A|C;K=Gd(m|0,p|0,34)|0;H=C;E=Hd(m|0,p|0,30)|0;H=A^(H|C);A=Gd(m|0,p|0,39)|0;B=C;G=Hd(m|0,p|0,25)|0;B=Dd((r|o)&m|r&o|0,(v|s)&p|v&s|0,(b|f)^(K|E)^(A|G)|0,H^(B|C)|0)|0;H=C;y=Dd(u|0,y|0,l|0,j|0)|0;u=C;j=Dd(B|0,H|0,l|0,j|0)|0;l=C;H=Gd(y|0,u|0,14)|0;B=C;G=Hd(y|0,u|0,50)|0;B=B|C;A=Gd(y|0,u|0,18)|0;E=C;K=Hd(y|0,u|0,46)|0;E=B^(E|C);B=Gd(y|0,u|0,41)|0;f=C;b=Hd(y|0,u|0,23)|0;f=E^(f|C);E=g+528|0;I=c[E>>2]|0;E=c[E+4>>2]|0;M=Dd(J|0,M|0,-840897762,-354779690)|0;E=Dd(M|0,C|0,I|0,E|0)|0;f=Dd(E|0,C|0,(H|G)^(A|K)^(B|b)|0,f|0)|0;f=Dd(f|0,C|0,(D^F)&y^D|0,(L^x)&u^L|0)|0;b=C;B=Gd(j|0,l|0,28)|0;K=C;A=Hd(j|0,l|0,36)|0;K=K|C;G=Gd(j|0,l|0,34)|0;H=C;E=Hd(j|0,l|0,30)|0;H=K^(H|C);K=Gd(j|0,l|0,39)|0;I=C;M=Hd(j|0,l|0,25)|0;I=Dd((o|m)&j|o&m|0,(s|p)&l|s&p|0,(B|A)^(G|E)^(K|M)|0,H^(I|C)|0)|0;H=C;v=Dd(r|0,v|0,f|0,b|0)|0;r=C;b=Dd(I|0,H|0,f|0,b|0)|0;f=C;H=Gd(v|0,r|0,14)|0;I=C;M=Hd(v|0,r|0,50)|0;I=I|C;K=Gd(v|0,r|0,18)|0;E=C;G=Hd(v|0,r|0,46)|0;E=I^(E|C);I=Gd(v|0,r|0,41)|0;A=C;B=Hd(v|0,r|0,23)|0;A=E^(A|C);E=g+536|0;J=c[E>>2]|0;E=c[E+4>>2]|0;L=Dd(D|0,L|0,-294727304,-176337025)|0;E=Dd(L|0,C|0,J|0,E|0)|0;A=Dd(E|0,C|0,(H|M)^(K|G)^(I|B)|0,A|0)|0;A=Dd(A|0,C|0,(F^y)&v^F|0,(x^u)&r^x|0)|0;B=C;I=Gd(b|0,f|0,28)|0;G=C;K=Hd(b|0,f|0,36)|0;G=G|C;M=Gd(b|0,f|0,34)|0;H=C;E=Hd(b|0,f|0,30)|0;H=G^(H|C);G=Gd(b|0,f|0,39)|0;J=C;L=Hd(b|0,f|0,25)|0;J=Dd((m|j)&b|m&j|0,(p|l)&f|p&l|0,(I|K)^(M|E)^(G|L)|0,H^(J|C)|0)|0;H=C;s=Dd(o|0,s|0,A|0,B|0)|0;o=C;B=Dd(J|0,H|0,A|0,B|0)|0;A=C;H=Gd(s|0,o|0,14)|0;J=C;L=Hd(s|0,o|0,50)|0;J=J|C;G=Gd(s|0,o|0,18)|0;E=C;M=Hd(s|0,o|0,46)|0;E=J^(E|C);J=Gd(s|0,o|0,41)|0;K=C;I=Hd(s|0,o|0,23)|0;K=E^(K|C);E=g+544|0;D=c[E>>2]|0;E=c[E+4>>2]|0;x=Dd(F|0,x|0,1914138554,116418474)|0;E=Dd(x|0,C|0,D|0,E|0)|0;K=Dd(E|0,C|0,(H|L)^(G|M)^(J|I)|0,K|0)|0;K=Dd(K|0,C|0,(y^v)&s^y|0,(u^r)&o^u|0)|0;I=C;J=Gd(B|0,A|0,28)|0;M=C;G=Hd(B|0,A|0,36)|0;M=M|C;L=Gd(B|0,A|0,34)|0;H=C;E=Hd(B|0,A|0,30)|0;H=M^(H|C);M=Gd(B|0,A|0,39)|0;D=C;x=Hd(B|0,A|0,25)|0;D=Dd((j|b)&B|j&b|0,(l|f)&A|l&f|0,(J|G)^(L|E)^(M|x)|0,H^(D|C)|0)|0;H=C;p=Dd(m|0,p|0,K|0,I|0)|0;m=C;I=Dd(D|0,H|0,K|0,I|0)|0;K=C;H=Gd(p|0,m|0,14)|0;D=C;x=Hd(p|0,m|0,50)|0;D=D|C;M=Gd(p|0,m|0,18)|0;E=C;L=Hd(p|0,m|0,46)|0;E=D^(E|C);D=Gd(p|0,m|0,41)|0;G=C;J=Hd(p|0,m|0,23)|0;G=E^(G|C);E=g+552|0;F=c[E>>2]|0;E=c[E+4>>2]|0;u=Dd(y|0,u|0,-1563912026,174292421)|0;E=Dd(u|0,C|0,F|0,E|0)|0;G=Dd(E|0,C|0,(H|x)^(M|L)^(D|J)|0,G|0)|0;G=Dd(G|0,C|0,(v^s)&p^v|0,(r^o)&m^r|0)|0;J=C;D=Gd(I|0,K|0,28)|0;L=C;M=Hd(I|0,K|0,36)|0;L=L|C;x=Gd(I|0,K|0,34)|0;H=C;E=Hd(I|0,K|0,30)|0;H=L^(H|C);L=Gd(I|0,K|0,39)|0;F=C;u=Hd(I|0,K|0,25)|0;F=Dd((b|B)&I|b&B|0,(f|A)&K|f&A|0,(D|M)^(x|E)^(L|u)|0,H^(F|C)|0)|0;H=C;l=Dd(j|0,l|0,G|0,J|0)|0;j=C;J=Dd(F|0,H|0,G|0,J|0)|0;G=C;H=Gd(l|0,j|0,14)|0;F=C;u=Hd(l|0,j|0,50)|0;F=F|C;L=Gd(l|0,j|0,18)|0;E=C;x=Hd(l|0,j|0,46)|0;E=F^(E|C);F=Gd(l|0,j|0,41)|0;M=C;D=Hd(l|0,j|0,23)|0;M=E^(M|C);E=g+560|0;y=c[E>>2]|0;E=c[E+4>>2]|0;r=Dd(v|0,r|0,-1090974290,289380356)|0;E=Dd(r|0,C|0,y|0,E|0)|0;M=Dd(E|0,C|0,(H|u)^(L|x)^(F|D)|0,M|0)|0;M=Dd(M|0,C|0,(s^p)&l^s|0,(o^m)&j^o|0)|0;D=C;F=Gd(J|0,G|0,28)|0;x=C;L=Hd(J|0,G|0,36)|0;x=x|C;u=Gd(J|0,G|0,34)|0;H=C;E=Hd(J|0,G|0,30)|0;H=x^(H|C);x=Gd(J|0,G|0,39)|0;y=C;r=Hd(J|0,G|0,25)|0;y=Dd((B|I)&J|B&I|0,(A|K)&G|A&K|0,(F|L)^(u|E)^(x|r)|0,H^(y|C)|0)|0;H=C;f=Dd(b|0,f|0,M|0,D|0)|0;b=C;D=Dd(y|0,H|0,M|0,D|0)|0;M=C;H=Gd(f|0,b|0,14)|0;y=C;r=Hd(f|0,b|0,50)|0;y=y|C;x=Gd(f|0,b|0,18)|0;E=C;u=Hd(f|0,b|0,46)|0;E=y^(E|C);y=Gd(f|0,b|0,41)|0;L=C;F=Hd(f|0,b|0,23)|0;L=E^(L|C);E=g+568|0;v=c[E>>2]|0;E=c[E+4>>2]|0;o=Dd(s|0,o|0,320620315,460393269)|0;E=Dd(o|0,C|0,v|0,E|0)|0;L=Dd(E|0,C|0,(H|r)^(x|u)^(y|F)|0,L|0)|0;L=Dd(L|0,C|0,(p^l)&f^p|0,(m^j)&b^m|0)|0;F=C;y=Gd(D|0,M|0,28)|0;u=C;x=Hd(D|0,M|0,36)|0;u=u|C;r=Gd(D|0,M|0,34)|0;H=C;E=Hd(D|0,M|0,30)|0;H=u^(H|C);u=Gd(D|0,M|0,39)|0;v=C;o=Hd(D|0,M|0,25)|0;v=Dd((I|J)&D|I&J|0,(K|G)&M|K&G|0,(y|x)^(r|E)^(u|o)|0,H^(v|C)|0)|0;H=C;A=Dd(B|0,A|0,L|0,F|0)|0;B=C;F=Dd(v|0,H|0,L|0,F|0)|0;L=C;H=Gd(A|0,B|0,14)|0;v=C;o=Hd(A|0,B|0,50)|0;v=v|C;u=Gd(A|0,B|0,18)|0;E=C;r=Hd(A|0,B|0,46)|0;E=v^(E|C);v=Gd(A|0,B|0,41)|0;x=C;y=Hd(A|0,B|0,23)|0;x=E^(x|C);E=g+576|0;s=c[E>>2]|0;E=c[E+4>>2]|0;m=Dd(p|0,m|0,587496836,685471733)|0;E=Dd(m|0,C|0,s|0,E|0)|0;x=Dd(E|0,C|0,(H|o)^(u|r)^(v|y)|0,x|0)|0;x=Dd(x|0,C|0,(l^f)&A^l|0,(j^b)&B^j|0)|0;y=C;v=Gd(F|0,L|0,28)|0;r=C;u=Hd(F|0,L|0,36)|0;r=r|C;o=Gd(F|0,L|0,34)|0;H=C;E=Hd(F|0,L|0,30)|0;H=r^(H|C);r=Gd(F|0,L|0,39)|0;s=C;m=Hd(F|0,L|0,25)|0;s=Dd((J|D)&F|J&D|0,(G|M)&L|G&M|0,(v|u)^(o|E)^(r|m)|0,H^(s|C)|0)|0;H=C;K=Dd(I|0,K|0,x|0,y|0)|0;I=C;y=Dd(s|0,H|0,x|0,y|0)|0;x=C;H=Gd(K|0,I|0,14)|0;s=C;m=Hd(K|0,I|0,50)|0;s=s|C;r=Gd(K|0,I|0,18)|0;E=C;o=Hd(K|0,I|0,46)|0;E=s^(E|C);s=Gd(K|0,I|0,41)|0;u=C;v=Hd(K|0,I|0,23)|0;u=E^(u|C);E=g+584|0;p=c[E>>2]|0;E=c[E+4>>2]|0;j=Dd(l|0,j|0,1086792851,852142971)|0;E=Dd(j|0,C|0,p|0,E|0)|0;u=Dd(E|0,C|0,(H|m)^(r|o)^(s|v)|0,u|0)|0;u=Dd(u|0,C|0,(f^A)&K^f|0,(b^B)&I^b|0)|0;v=C;s=Gd(y|0,x|0,28)|0;o=C;r=Hd(y|0,x|0,36)|0;o=o|C;m=Gd(y|0,x|0,34)|0;H=C;E=Hd(y|0,x|0,30)|0;H=o^(H|C);o=Gd(y|0,x|0,39)|0;p=C;j=Hd(y|0,x|0,25)|0;p=Dd((D|F)&y|D&F|0,(M|L)&x|M&L|0,(s|r)^(m|E)^(o|j)|0,H^(p|C)|0)|0;H=C;G=Dd(J|0,G|0,u|0,v|0)|0;J=C;v=Dd(p|0,H|0,u|0,v|0)|0;u=C;H=Gd(G|0,J|0,14)|0;p=C;j=Hd(G|0,J|0,50)|0;p=p|C;o=Gd(G|0,J|0,18)|0;E=C;m=Hd(G|0,J|0,46)|0;E=p^(E|C);p=Gd(G|0,J|0,41)|0;r=C;s=Hd(G|0,J|0,23)|0;r=E^(r|C);E=g+592|0;l=c[E>>2]|0;E=c[E+4>>2]|0;b=Dd(f|0,b|0,365543100,1017036298)|0;E=Dd(b|0,C|0,l|0,E|0)|0;r=Dd(E|0,C|0,(H|j)^(o|m)^(p|s)|0,r|0)|0;r=Dd(r|0,C|0,(A^K)&G^A|0,(B^I)&J^B|0)|0;s=C;p=Gd(v|0,u|0,28)|0;m=C;o=Hd(v|0,u|0,36)|0;m=m|C;j=Gd(v|0,u|0,34)|0;H=C;E=Hd(v|0,u|0,30)|0;H=m^(H|C);m=Gd(v|0,u|0,39)|0;l=C;b=Hd(v|0,u|0,25)|0;l=Dd((F|y)&v|F&y|0,(L|x)&u|L&x|0,(p|o)^(j|E)^(m|b)|0,H^(l|C)|0)|0;H=C;M=Dd(D|0,M|0,r|0,s|0)|0;D=C;s=Dd(l|0,H|0,r|0,s|0)|0;r=C;H=Gd(M|0,D|0,14)|0;l=C;b=Hd(M|0,D|0,50)|0;l=l|C;m=Gd(M|0,D|0,18)|0;E=C;j=Hd(M|0,D|0,46)|0;E=l^(E|C);l=Gd(M|0,D|0,41)|0;o=C;p=Hd(M|0,D|0,23)|0;o=E^(o|C);E=g+600|0;f=c[E>>2]|0;E=c[E+4>>2]|0;B=Dd(A|0,B|0,-1676669620,1126000580)|0;E=Dd(B|0,C|0,f|0,E|0)|0;o=Dd(E|0,C|0,(H|b)^(m|j)^(l|p)|0,o|0)|0;o=Dd(o|0,C|0,(K^G)&M^K|0,(I^J)&D^I|0)|0;p=C;l=Gd(s|0,r|0,28)|0;j=C;m=Hd(s|0,r|0,36)|0;j=j|C;b=Gd(s|0,r|0,34)|0;H=C;E=Hd(s|0,r|0,30)|0;H=j^(H|C);j=Gd(s|0,r|0,39)|0;f=C;B=Hd(s|0,r|0,25)|0;f=Dd((y|v)&s|y&v|0,(x|u)&r|x&u|0,(l|m)^(b|E)^(j|B)|0,H^(f|C)|0)|0;H=C;L=Dd(F|0,L|0,o|0,p|0)|0;F=C;p=Dd(f|0,H|0,o|0,p|0)|0;o=C;H=Gd(L|0,F|0,14)|0;f=C;B=Hd(L|0,F|0,50)|0;f=f|C;j=Gd(L|0,F|0,18)|0;E=C;b=Hd(L|0,F|0,46)|0;E=f^(E|C);f=Gd(L|0,F|0,41)|0;m=C;l=Hd(L|0,F|0,23)|0;m=E^(m|C);E=g+608|0;A=c[E>>2]|0;E=c[E+4>>2]|0;I=Dd(K|0,I|0,-885112138,1288033470)|0;E=Dd(I|0,C|0,A|0,E|0)|0;m=Dd(E|0,C|0,(H|B)^(j|b)^(f|l)|0,m|0)|0;m=Dd(m|0,C|0,(G^M)&L^G|0,(J^D)&F^J|0)|0;l=C;f=Gd(p|0,o|0,28)|0;b=C;j=Hd(p|0,o|0,36)|0;b=b|C;B=Gd(p|0,o|0,34)|0;H=C;E=Hd(p|0,o|0,30)|0;H=b^(H|C);b=Gd(p|0,o|0,39)|0;A=C;I=Hd(p|0,o|0,25)|0;A=Dd((v|s)&p|v&s|0,(u|r)&o|u&r|0,(f|j)^(B|E)^(b|I)|0,H^(A|C)|0)|0;H=C;x=Dd(y|0,x|0,m|0,l|0)|0;y=C;l=Dd(A|0,H|0,m|0,l|0)|0;m=C;H=Gd(x|0,y|0,14)|0;A=C;I=Hd(x|0,y|0,50)|0;A=A|C;b=Gd(x|0,y|0,18)|0;E=C;B=Hd(x|0,y|0,46)|0;E=A^(E|C);A=Gd(x|0,y|0,41)|0;j=C;f=Hd(x|0,y|0,23)|0;j=E^(j|C);E=g+616|0;K=c[E>>2]|0;E=c[E+4>>2]|0;J=Dd(G|0,J|0,-60457430,1501505948)|0;E=Dd(J|0,C|0,K|0,E|0)|0;j=Dd(E|0,C|0,(H|I)^(b|B)^(A|f)|0,j|0)|0;j=Dd(j|0,C|0,(M^L)&x^M|0,(D^F)&y^D|0)|0;f=C;A=Gd(l|0,m|0,28)|0;B=C;b=Hd(l|0,m|0,36)|0;B=B|C;I=Gd(l|0,m|0,34)|0;H=C;E=Hd(l|0,m|0,30)|0;H=B^(H|C);B=Gd(l|0,m|0,39)|0;K=C;J=Hd(l|0,m|0,25)|0;K=Dd((s|p)&l|s&p|0,(r|o)&m|r&o|0,(A|b)^(I|E)^(B|J)|0,H^(K|C)|0)|0;H=C;u=Dd(v|0,u|0,j|0,f|0)|0;v=C;f=Dd(K|0,H|0,j|0,f|0)|0;j=C;H=Gd(u|0,v|0,14)|0;K=C;J=Hd(u|0,v|0,50)|0;K=K|C;B=Gd(u|0,v|0,18)|0;E=C;I=Hd(u|0,v|0,46)|0;E=K^(E|C);K=Gd(u|0,v|0,41)|0;b=C;A=Hd(u|0,v|0,23)|0;b=E^(b|C);E=g+624|0;G=c[E>>2]|0;E=c[E+4>>2]|0;D=Dd(M|0,D|0,987167468,1607167915)|0;E=Dd(D|0,C|0,G|0,E|0)|0;b=Dd(E|0,C|0,(H|J)^(B|I)^(K|A)|0,b|0)|0;b=Dd(b|0,C|0,(L^x)&u^L|0,(F^y)&v^F|0)|0;A=C;K=Gd(f|0,j|0,28)|0;I=C;B=Hd(f|0,j|0,36)|0;I=I|C;J=Gd(f|0,j|0,34)|0;H=C;E=Hd(f|0,j|0,30)|0;H=I^(H|C);I=Gd(f|0,j|0,39)|0;G=C;D=Hd(f|0,j|0,25)|0;G=Dd((p|l)&f|p&l|0,(o|m)&j|o&m|0,(K|B)^(J|E)^(I|D)|0,H^(G|C)|0)|0;H=C;r=Dd(s|0,r|0,b|0,A|0)|0;s=C;A=Dd(G|0,H|0,b|0,A|0)|0;b=C;H=Gd(r|0,s|0,14)|0;G=C;D=Hd(r|0,s|0,50)|0;G=G|C;I=Gd(r|0,s|0,18)|0;E=C;J=Hd(r|0,s|0,46)|0;E=G^(E|C);G=Gd(r|0,s|0,41)|0;B=C;K=Hd(r|0,s|0,23)|0;B=E^(B|C);g=g+632|0;E=c[g>>2]|0;g=c[g+4>>2]|0;F=Dd(L|0,F|0,1246189591,1816402316)|0;g=Dd(F|0,C|0,E|0,g|0)|0;g=Dd(g|0,C|0,(H|D)^(I|J)^(G|K)|0,B|0)|0;g=Dd(g|0,C|0,(x^u)&r^x|0,(y^v)&s^y|0)|0;B=C;K=Gd(A|0,b|0,28)|0;G=C;J=Hd(A|0,b|0,36)|0;G=G|C;I=Gd(A|0,b|0,34)|0;D=C;H=Hd(A|0,b|0,30)|0;D=G^(D|C);G=Gd(A|0,b|0,39)|0;E=C;F=Hd(A|0,b|0,25)|0;E=Dd((l|f)&A|l&f|0,(m|j)&b|m&j|0,(K|J)^(I|H)^(G|F)|0,D^(E|C)|0)|0;D=C;o=Dd(p|0,o|0,g|0,B|0)|0;p=C;B=Dd(E|0,D|0,g|0,B|0)|0;g=a;B=Dd(c[g>>2]|0,c[g+4>>2]|0,B|0,C|0)|0;g=a;c[g>>2]=B;c[g+4>>2]=C;g=e;g=Dd(c[g>>2]|0,c[g+4>>2]|0,A|0,b|0)|0;a=e;c[a>>2]=g;c[a+4>>2]=C;a=k;j=Dd(c[a>>2]|0,c[a+4>>2]|0,f|0,j|0)|0;c[k>>2]=j;c[k+4>>2]=C;k=n;m=Dd(c[k>>2]|0,c[k+4>>2]|0,l|0,m|0)|0;c[n>>2]=m;c[n+4>>2]=C;n=q;p=Dd(c[n>>2]|0,c[n+4>>2]|0,o|0,p|0)|0;c[q>>2]=p;c[q+4>>2]=C;q=t;s=Dd(c[q>>2]|0,c[q+4>>2]|0,r|0,s|0)|0;c[t>>2]=s;c[t+4>>2]=C;t=w;v=Dd(c[t>>2]|0,c[t+4>>2]|0,u|0,v|0)|0;c[w>>2]=v;c[w+4>>2]=C;w=z;y=Dd(c[w>>2]|0,c[w+4>>2]|0,x|0,y|0)|0;c[z>>2]=y;c[z+4>>2]=C;i=h;return}function Ib(){return 144}function Jb(){return 16}function Kb(){return 32}function Lb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=i=i+63&-64;i=i+144|0;Ub(g,e);Tb(g,b,c,d);Rb(g,a);i=f;return 0}function Mb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Qb(a,b,c,d,e)|0}function Nb(a,b){a=a|0;b=b|0;Ub(a,b);return 0}function Ob(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Tb(a,b,c,d);return 0}function Pb(a,b){a=a|0;b=b|0;Rb(a,b);return 0}function Qb(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;h=i;g=i=i+63&-64;i=i+160|0;j=g;g=g+144|0;Ub(j,f);Tb(j,c,d,e);Rb(j,g);i=h;return ((((a[g+1>>0]^a[b+1>>0]|a[g>>0]^a[b>>0]|a[g+2>>0]^a[b+2>>0]|a[g+3>>0]^a[b+3>>0]|a[g+4>>0]^a[b+4>>0]|a[g+5>>0]^a[b+5>>0]|a[g+6>>0]^a[b+6>>0]|a[g+7>>0]^a[b+7>>0]|a[g+8>>0]^a[b+8>>0]|a[g+9>>0]^a[b+9>>0]|a[g+10>>0]^a[b+10>>0]|a[g+11>>0]^a[b+11>>0]|a[g+12>>0]^a[b+12>>0]|a[g+13>>0]^a[b+13>>0]|a[g+14>>0]^a[b+14>>0]|a[g+15>>0]^a[b+15>>0])&255)+511|0)>>>8&1)+-1|0}function Rb(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=b+56|0;g=c[h>>2]|0;h=c[h+4>>2]|0;if(!((g|0)==0&(h|0)==0)){e=b+64|0;a[e+g>>0]=1;f=Dd(g|0,h|0,1,0)|0;i=C;if(i>>>0<0|(i|0)==0&f>>>0<16){i=Cd(14,0,g|0,h|0)|0;Fd(b+(f+64)|0,0,i+1|0)|0}a[b+80>>0]=1;Sb(b,e,16,0)}i=c[b+24>>2]|0;p=(c[b+28>>2]|0)+(i>>>26)|0;e=p&67108863;n=(p>>>26)+(c[b+32>>2]|0)|0;m=n&67108863;f=(n>>>26)+(c[b+36>>2]|0)|0;h=((f>>>26)*5|0)+(c[b+20>>2]|0)|0;g=h&67108863;i=(h>>>26)+(i&67108863)|0;r=((g+5|0)>>>26)+i|0;q=r>>>26;o=(q+e|0)>>>26;k=(f|-67108864)+((o+m|0)>>>26)|0;l=(k>>>31)+-1|0;j=k>>31;i=r&67108863&l|j&i;e=q+p&67108863&l|j&e;m=o+n&67108863&l|j&m;g=Dd(h+5&67108863&l|j&g|i<<26|0,0,c[b+40>>2]|0,0)|0;h=C;i=Dd(i>>>6|e<<20|0,0,c[b+44>>2]|0,0)|0;h=Dd(i|0,C|0,h|0,0)|0;i=C;e=Dd(e>>>12|m<<14|0,0,c[b+48>>2]|0,0)|0;i=Dd(e|0,C|0,i|0,0)|0;e=C;f=Dd(m>>>18|(l&k|j&f)<<8|0,0,c[b+52>>2]|0,0)|0;e=Dd(f|0,C|0,e|0,0)|0;a[d>>0]=g;a[d+1>>0]=g>>>8;a[d+2>>0]=g>>>16;a[d+3>>0]=g>>>24;a[d+4>>0]=h;a[d+5>>0]=h>>>8;a[d+6>>0]=h>>>16;a[d+7>>0]=h>>>24;a[d+8>>0]=i;a[d+9>>0]=i>>>8;a[d+10>>0]=i>>>16;a[d+11>>0]=i>>>24;a[d+12>>0]=e;a[d+13>>0]=e>>>8;a[d+14>>0]=e>>>16;a[d+15>>0]=e>>>24;e=b+88|0;do{a[b>>0]=0;b=b+1|0}while((b|0)<(e|0));return}function Sb(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;s=(a[b+80>>0]|0)!=0?0:16777216;t=c[b+4>>2]|0;u=c[b+8>>2]|0;m=c[b+12>>2]|0;n=c[b+16>>2]|0;v=b+20|0;l=c[v>>2]|0;w=b+24|0;k=c[w>>2]|0;x=b+28|0;j=c[x>>2]|0;y=b+32|0;i=c[y>>2]|0;z=b+36|0;h=c[z>>2]|0;if(!(g>>>0>0|(g|0)==0&f>>>0>15)){q=l;r=k;s=j;t=i;u=h;c[v>>2]=q;c[w>>2]=r;c[x>>2]=s;c[y>>2]=t;c[z>>2]=u;return}o=n*5|0;p=m*5|0;q=u*5|0;r=t*5|0;b=c[b>>2]|0;while(1){J=d[e+3>>0]|0;B=(d[e+1>>0]<<8|d[e>>0]|d[e+2>>0]<<16|J<<24&50331648)+l|0;H=d[e+6>>0]|0;J=((d[e+4>>0]<<8|J|d[e+5>>0]<<16|H<<24)>>>2&67108863)+k|0;G=d[e+9>>0]|0;H=((d[e+7>>0]<<8|H|d[e+8>>0]<<16|G<<24)>>>4&67108863)+j|0;G=((d[e+10>>0]<<8|G|d[e+11>>0]<<16|d[e+12>>0]<<24)>>>6)+i|0;l=(d[e+13>>0]|s|d[e+14>>0]<<8|d[e+15>>0]<<16)+h|0;k=Od(B|0,0,b|0,0)|0;j=C;A=Od(J|0,0,o|0,0)|0;j=Dd(A|0,C|0,k|0,j|0)|0;k=C;A=Od(H|0,0,p|0,0)|0;A=Dd(j|0,k|0,A|0,C|0)|0;k=C;j=Od(G|0,0,q|0,0)|0;j=Dd(A|0,k|0,j|0,C|0)|0;k=C;A=Od(l|0,0,r|0,0)|0;A=Dd(j|0,k|0,A|0,C|0)|0;k=C;j=Od(B|0,0,t|0,0)|0;i=C;F=Od(J|0,0,b|0,0)|0;i=Dd(F|0,C|0,j|0,i|0)|0;j=C;F=Od(H|0,0,o|0,0)|0;F=Dd(i|0,j|0,F|0,C|0)|0;j=C;i=Od(G|0,0,p|0,0)|0;i=Dd(F|0,j|0,i|0,C|0)|0;j=C;F=Od(l|0,0,q|0,0)|0;F=Dd(i|0,j|0,F|0,C|0)|0;j=C;i=Od(B|0,0,u|0,0)|0;h=C;E=Od(J|0,0,t|0,0)|0;h=Dd(E|0,C|0,i|0,h|0)|0;i=C;E=Od(H|0,0,b|0,0)|0;E=Dd(h|0,i|0,E|0,C|0)|0;i=C;h=Od(G|0,0,o|0,0)|0;h=Dd(E|0,i|0,h|0,C|0)|0;i=C;E=Od(l|0,0,p|0,0)|0;E=Dd(h|0,i|0,E|0,C|0)|0;i=C;h=Od(B|0,0,m|0,0)|0;I=C;D=Od(J|0,0,u|0,0)|0;I=Dd(D|0,C|0,h|0,I|0)|0;h=C;D=Od(H|0,0,t|0,0)|0;D=Dd(I|0,h|0,D|0,C|0)|0;h=C;I=Od(G|0,0,b|0,0)|0;I=Dd(D|0,h|0,I|0,C|0)|0;h=C;D=Od(l|0,0,o|0,0)|0;D=Dd(I|0,h|0,D|0,C|0)|0;h=C;B=Od(B|0,0,n|0,0)|0;I=C;J=Od(J|0,0,m|0,0)|0;I=Dd(J|0,C|0,B|0,I|0)|0;B=C;H=Od(H|0,0,u|0,0)|0;H=Dd(I|0,B|0,H|0,C|0)|0;B=C;G=Od(G|0,0,t|0,0)|0;G=Dd(H|0,B|0,G|0,C|0)|0;B=C;l=Od(l|0,0,b|0,0)|0;l=Dd(G|0,B|0,l|0,C|0)|0;B=C;k=Gd(A|0,k|0,26)|0;k=Dd(F|0,j|0,k|0,0)|0;j=Gd(k|0,C|0,26)|0;j=Dd(E|0,i|0,j|0,0)|0;i=Gd(j|0,C|0,26)|0;j=j&67108863;i=Dd(D|0,h|0,i|0,0)|0;h=Gd(i|0,C|0,26)|0;i=i&67108863;h=Dd(l|0,B|0,h|0,0)|0;B=Gd(h|0,C|0,26)|0;h=h&67108863;B=B*5|0;l=B+A&67108863;k=((B+(A&67108863)|0)>>>26)+(k&67108863)|0;f=Dd(f|0,g|0,-16,-1)|0;g=C;if(!(g>>>0>0|(g|0)==0&f>>>0>15))break;else e=e+16|0}c[v>>2]=l;c[w>>2]=k;c[x>>2]=j;c[y>>2]=i;c[z>>2]=h;return}function Tb(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;n=b+56|0;g=n;h=c[g>>2]|0;g=c[g+4>>2]|0;do if(!((h|0)==0&(g|0)==0)){l=Cd(16,0,h|0,g|0)|0;m=C;k=m>>>0>f>>>0|(m|0)==(f|0)&l>>>0>e>>>0;l=k?e:l;m=k?f:m;if(!((l|0)==0&(m|0)==0)){j=b+64|0;k=0;i=0;do{o=a[d+k>>0]|0;g=Dd(h|0,g|0,k|0,i|0)|0;a[j+g>>0]=o;k=Dd(k|0,i|0,1,0)|0;i=C;g=n;h=c[g>>2]|0;g=c[g+4>>2]|0}while(i>>>0>>0|(i|0)==(m|0)&k>>>0>>0)}o=Dd(h|0,g|0,l|0,m|0)|0;k=C;j=n;c[j>>2]=o;c[j+4>>2]=k;if(k>>>0<0|(k|0)==0&o>>>0<16)return;else{e=Cd(e|0,f|0,l|0,m|0)|0;f=C;Sb(b,b+64|0,16,0);o=n;c[o>>2]=0;c[o+4>>2]=0;d=d+l|0;break}}while(0);if(f>>>0>0|(f|0)==0&e>>>0>15){i=e&-16;Sb(b,d,i,f);e=Cd(e|0,f|0,i|0,f|0)|0;d=d+i|0;i=C}else i=f;if((e|0)==0&(i|0)==0)return;f=b+64|0;g=0;h=0;do{b=a[d+g>>0]|0;o=n;o=Dd(c[o>>2]|0,c[o+4>>2]|0,g|0,h|0)|0;a[f+o>>0]=b;g=Dd(g|0,h|0,1,0)|0;h=C}while(h>>>0>>0|(h|0)==(i|0)&g>>>0>>0);b=n;b=Dd(c[b>>2]|0,c[b+4>>2]|0,e|0,i|0)|0;o=n;c[o>>2]=b;c[o+4>>2]=C;return}function Ub(b,e){b=b|0;e=e|0;var f=0,g=0;f=e+3|0;c[b>>2]=(d[e+1>>0]|0)<<8|(d[e>>0]|0)|(d[e+2>>0]|0)<<16|(d[f>>0]|0)<<24&50331648;g=e+6|0;c[b+4>>2]=((d[e+4>>0]|0)<<8|(d[f>>0]|0)|(d[e+5>>0]|0)<<16|(d[g>>0]|0)<<24)>>>2&67108611;f=e+9|0;c[b+8>>2]=((d[e+7>>0]|0)<<8|(d[g>>0]|0)|(d[e+8>>0]|0)<<16|(d[f>>0]|0)<<24)>>>4&67092735;c[b+12>>2]=((d[e+10>>0]|0)<<8|(d[f>>0]|0)|(d[e+11>>0]|0)<<16|(d[e+12>>0]|0)<<24)>>>6&66076671;c[b+16>>2]=(d[e+14>>0]|0)<<8|(d[e+13>>0]|0)|(d[e+15>>0]|0)<<16&983040;f=b+20|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[b+40>>2]=(d[e+17>>0]|0)<<8|(d[e+16>>0]|0)|(d[e+18>>0]|0)<<16|(d[e+19>>0]|0)<<24;c[b+44>>2]=(d[e+21>>0]|0)<<8|(d[e+20>>0]|0)|(d[e+22>>0]|0)<<16|(d[e+23>>0]|0)<<24;c[b+48>>2]=(d[e+25>>0]|0)<<8|(d[e+24>>0]|0)|(d[e+26>>0]|0)<<16|(d[e+27>>0]|0)<<24;c[b+52>>2]=(d[e+29>>0]|0)<<8|(d[e+28>>0]|0)|(d[e+30>>0]|0)<<16|(d[e+31>>0]|0)<<24;e=b+56|0;c[e>>2]=0;c[e+4>>2]=0;a[b+80>>0]=0;return}function Vb(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=i;t=i=i+63&-64;i=i+48|0;j=t+8|0;u=t+4|0;if((a[g>>0]|0)!=36){h=0;i=w;return h|0}if((a[g+1>>0]|0)!=55){h=0;i=w;return h|0}if((a[g+2>>0]|0)!=36){h=0;i=w;return h|0}o=a[g+3>>0]|0;n=o&255;a:do if(1){l=65;k=34881;do{if((a[k>>0]|0)==o<<24>>24)break a;k=k+1|0;l=l+-1|0;m=(l|0)!=0}while(m&(k&3|0)!=0);if(!m){h=0;i=w;return h|0}}else{l=65;k=34881}while(0);b:do if((a[k>>0]|0)!=o<<24>>24){m=_(n,16843009)|0;c:do if(l>>>0>3)while(1){s=c[k>>2]^m;if((s&-2139062144^-2139062144)&s+-16843009)break c;k=k+4|0;l=l+-4|0;if(l>>>0<=3){v=12;break}}else v=12;while(0);if((v|0)==12)if(!l){h=0;i=w;return h|0}while(1){if((a[k>>0]|0)==o<<24>>24)break b;l=l+-1|0;if(!l){j=0;break}else k=k+1|0}i=w;return j|0}while(0);if((k|0)==0|(l|0)==0){h=0;i=w;return h|0}r=Hd(1,0,k-34881|0)|0;s=C;k=Xb(u,g+4|0)|0;if(!k){h=0;i=w;return h|0}q=Xb(t,k)|0;if(!q){h=0;i=w;return h|0}o=q;p=o-g|0;n=(o&3|0)==0;d:do if(n){k=q;v=22}else{l=q;k=o;while(1){if(!(a[l>>0]|0))break d;l=l+1|0;k=l;if(!(k&3)){k=l;v=22;break}}}while(0);if((v|0)==22){while(1){l=c[k>>2]|0;if(!((l&-2139062144^-2139062144)&l+-16843009))k=k+4|0;else break}if((l&255)<<24>>24)do k=k+1|0;while((a[k>>0]|0)!=0)}l=k-o+1|0;while(1){k=l+-1|0;if(!l){v=32;break}m=q+k|0;if((a[m>>0]|0)==36){v=30;break}else l=k}if((v|0)==30)if(!m)v=32;else l=l+-1|0;if((v|0)==32){e:do if(n){k=q;v=35}else{k=q;l=o;while(1){if(!(a[k>>0]|0)){k=l;break e}k=k+1|0;l=k;if(!(l&3)){v=35;break}}}while(0);if((v|0)==35){while(1){l=c[k>>2]|0;if(!((l&-2139062144^-2139062144)&l+-16843009))k=k+4|0;else break}if((l&255)<<24>>24)do k=k+1|0;while((a[k>>0]|0)!=0)}l=k-o|0}k=l+p|0;p=k+45|0;if(p>>>0>102|p>>>0>>0){h=0;i=w;return h|0}if(hc(b,e,f,q,l,r,s,c[u>>2]|0,c[t>>2]|0,j,32)|0){h=0;i=w;return h|0}Id(h|0,g|0,k|0)|0;s=h+k|0;r=s+1|0;a[s>>0]=36;s=r;r=h+102-r|0;k=0;f:while(1){if(k>>>0<32){p=0;q=k;k=0}else break;do{g=q;q=q+1|0;k=d[j+g>>0]<>>0<32&p>>>0<24);if(!p)k=s;else{l=k;m=r;n=s;o=0;while(1){if(!m){v=50;break f}k=n+1|0;a[n>>0]=a[34881+(l&63)>>0]|0;o=o+6|0;if(o>>>0>=p>>>0)break;else{l=l>>>6;m=m+-1|0;n=k}}}g=(k|0)==0;r=(g?0:s-k|0)+r|0;if(g){v=50;break}else{s=k;k=q}}if((v|0)==50){k=j+32|0;do{a[j>>0]=0;j=j+1|0}while((j|0)<(k|0));h=0;i=w;return h|0}k=j+32|0;do{a[j>>0]=0;j=j+1|0}while((j|0)<(k|0));if(!((s|0)!=0&s>>>0<(h+102|0)>>>0)){h=0;i=w;return h|0}a[s>>0]=0;i=w;return h|0}function Wb(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;m=i;n=i=i+63&-64;i=i+16|0;c[n+4>>2]=0;c[n>>2]=0;c[n+8>>2]=0;f=hc(n,a,b,d,e,f,g,h,j,k,l)|0;g=c[n>>2]|0;if(!g){i=m;return f|0}zd(g);i=m;return f|0}function Xb(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;i=a[d>>0]|0;h=i&255;a:do if(1){e=65;f=34881;do{if((a[f>>0]|0)==i<<24>>24)break a;f=f+1|0;e=e+-1|0;g=(e|0)!=0}while(g&(f&3|0)!=0);if(!g){d=0;n=0;c[b>>2]=n;return d|0}}else{e=65;f=34881}while(0);b:do if((a[f>>0]|0)!=i<<24>>24){g=_(h,16843009)|0;c:do if(e>>>0>3)while(1){m=c[f>>2]^g;if((m&-2139062144^-2139062144)&m+-16843009)break c;f=f+4|0;e=e+-4|0;if(e>>>0<=3){n=9;break}}else n=9;while(0);if((n|0)==9)if(!e){d=0;n=0;c[b>>2]=n;return d|0}while(1){if((a[f>>0]|0)==i<<24>>24)break b;e=e+-1|0;if(!e){e=0;f=0;break}else f=f+1|0}c[b>>2]=f;return e|0}while(0);if((f|0)==0|(e|0)==0){d=0;n=0;c[b>>2]=n;return d|0}j=a[d+1>>0]|0;i=j&255;d:do if(1){e=65;g=34881;do{if((a[g>>0]|0)==j<<24>>24)break d;g=g+1|0;e=e+-1|0;h=(e|0)!=0}while(h&(g&3|0)!=0);if(!h){d=0;n=0;c[b>>2]=n;return d|0}}else{e=65;g=34881}while(0);e:do if((a[g>>0]|0)!=j<<24>>24){h=_(i,16843009)|0;f:do if(e>>>0>3)while(1){m=c[g>>2]^h;if((m&-2139062144^-2139062144)&m+-16843009)break f;g=g+4|0;e=e+-4|0;if(e>>>0<=3){n=22;break}}else n=22;while(0);if((n|0)==22)if(!e){d=0;n=0;c[b>>2]=n;return d|0}while(1){if((a[g>>0]|0)==j<<24>>24)break e;e=e+-1|0;if(!e){e=0;f=0;break}else g=g+1|0}c[b>>2]=f;return e|0}while(0);if((g|0)==0|(e|0)==0){d=0;n=0;c[b>>2]=n;return d|0}k=a[d+2>>0]|0;j=k&255;g:do if(1){e=65;h=34881;do{if((a[h>>0]|0)==k<<24>>24)break g;h=h+1|0;e=e+-1|0;i=(e|0)!=0}while(i&(h&3|0)!=0);if(!i){d=0;n=0;c[b>>2]=n;return d|0}}else{e=65;h=34881}while(0);h:do if((a[h>>0]|0)!=k<<24>>24){i=_(j,16843009)|0;i:do if(e>>>0>3)while(1){m=c[h>>2]^i;if((m&-2139062144^-2139062144)&m+-16843009)break i;h=h+4|0;e=e+-4|0;if(e>>>0<=3){n=36;break}}else n=36;while(0);if((n|0)==36)if(!e){d=0;n=0;c[b>>2]=n;return d|0}while(1){if((a[h>>0]|0)==k<<24>>24)break h;e=e+-1|0;if(!e){e=0;f=0;break}else h=h+1|0}c[b>>2]=f;return e|0}while(0);if((h|0)==0|(e|0)==0){d=0;n=0;c[b>>2]=n;return d|0}l=a[d+3>>0]|0;k=l&255;j:do if(1){e=65;i=34881;do{if((a[i>>0]|0)==l<<24>>24)break j;i=i+1|0;e=e+-1|0;j=(e|0)!=0}while(j&(i&3|0)!=0);if(!j){d=0;n=0;c[b>>2]=n;return d|0}}else{e=65;i=34881}while(0);k:do if((a[i>>0]|0)==l<<24>>24)m=i;else{j=_(k,16843009)|0;l:do if(e>>>0>3)while(1){m=c[i>>2]^j;if((m&-2139062144^-2139062144)&m+-16843009)break l;i=i+4|0;e=e+-4|0;if(e>>>0<=3){n=49;break}}else n=49;while(0);if((n|0)==49)if(!e){d=0;n=0;c[b>>2]=n;return d|0}while(1){if((a[i>>0]|0)==l<<24>>24){m=i;break k}e=e+-1|0;if(!e){e=0;f=0;break}else i=i+1|0}c[b>>2]=f;return e|0}while(0);if((m|0)==0|(e|0)==0){d=0;n=0;c[b>>2]=n;return d|0}l=a[d+4>>0]|0;k=l&255;m:do if(1){i=65;e=34881;do{if((a[e>>0]|0)==l<<24>>24)break m;e=e+1|0;i=i+-1|0;j=(i|0)!=0}while(j&(e&3|0)!=0);if(!j){d=0;n=0;c[b>>2]=n;return d|0}}else{i=65;e=34881}while(0);n:do if((a[e>>0]|0)!=l<<24>>24){j=_(k,16843009)|0;o:do if(i>>>0>3)while(1){k=c[e>>2]^j;if((k&-2139062144^-2139062144)&k+-16843009)break o;e=e+4|0;i=i+-4|0;if(i>>>0<=3){n=62;break}}else n=62;while(0);if((n|0)==62)if(!i){d=0;n=0;c[b>>2]=n;return d|0}while(1){if((a[e>>0]|0)==l<<24>>24)break n;i=i+-1|0;if(!i){e=0;f=0;break}else e=e+1|0}c[b>>2]=f;return e|0}while(0);if((e|0)==0|(i|0)==0){d=0;n=0;c[b>>2]=n;return d|0}d=d+5|0;n=e-34881<<24|(m-34881<<18|(h-34881<<12|(g-34881<<6|f-34881)));c[b>>2]=n;return d|0}function Yb(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=i;w=i=i+63&-64;i=i+560|0;r=w+488|0;z=w+456|0;v=w+208|0;x=w;y=w+416|0;w=w+424|0;n=v+32|0;if(d>>>0<=64){p=n;c[p>>2]=0;c[p+4>>2]=0;c[v>>2]=c[18];c[v+4>>2]=c[19];c[v+8>>2]=c[20];c[v+12>>2]=c[21];c[v+16>>2]=c[22];c[v+20>>2]=c[23];c[v+24>>2]=c[24];c[v+28>>2]=c[25];p=r;q=p+64|0;do{a[p>>0]=54;p=p+1|0}while((p|0)<(q|0));l=(d|0)==0;if(!l){j=d;k=n;a[r>>0]=a[b>>0]^54;if((j|0)==1)d=j;else{d=j;m=8}}else k=n}else{c[v>>2]=c[18];c[v+4>>2]=c[19];c[v+8>>2]=c[20];c[v+12>>2]=c[21];c[v+16>>2]=c[22];c[v+20>>2]=c[23];c[v+24>>2]=c[24];c[v+28>>2]=c[25];p=Hd(d|0,0,3)|0;l=n;c[l>>2]=p;c[l+4>>2]=C;l=v+40|0;p=l;m=b;q=p+64|0;do{a[p>>0]=a[m>>0]|0;p=p+1|0;m=m+1|0}while((p|0)<(q|0));Eb(v,l);j=b+64|0;k=Dd(d|0,0,-64,-1)|0;b=C;if(b>>>0>0|(b|0)==0&k>>>0>63){do{Eb(v,j);j=j+64|0;k=Dd(k|0,b|0,-64,-1)|0;b=C}while(b>>>0>0|(b|0)==0&k>>>0>63);b=k}else b=k;Id(l|0,j|0,b|0)|0;Db(v,z);p=n;c[p>>2]=0;c[p+4>>2]=0;c[v>>2]=c[18];c[v+4>>2]=c[19];c[v+8>>2]=c[20];c[v+12>>2]=c[21];c[v+16>>2]=c[22];c[v+20>>2]=c[23];c[v+24>>2]=c[24];c[v+28>>2]=c[25];p=r;q=p+64|0;do{a[p>>0]=54;p=p+1|0}while((p|0)<(q|0));a[r>>0]=a[z>>0]^54;d=32;b=z;k=n;l=0;m=8}if((m|0)==8){j=1;do{u=r+j|0;a[u>>0]=a[u>>0]^a[b+j>>0];j=j+1|0}while((j|0)!=(d|0))}o=k;c[o>>2]=512;c[o+4>>2]=0;o=v+40|0;p=o;m=r;q=p+64|0;do{a[p>>0]=a[m>>0]|0;p=p+1|0;m=m+1|0}while((p|0)<(q|0));Eb(v,o);n=v+104|0;m=v+136|0;p=m;c[p>>2]=0;c[p+4>>2]=0;c[n>>2]=c[18];c[n+4>>2]=c[19];c[n+8>>2]=c[20];c[n+12>>2]=c[21];c[n+16>>2]=c[22];c[n+20>>2]=c[23];c[n+24>>2]=c[24];c[n+28>>2]=c[25];p=r;q=p+64|0;do{a[p>>0]=92;p=p+1|0}while((p|0)<(q|0));if(!l?(a[r>>0]=a[b>>0]^92,(d|0)!=1):0){j=1;do{u=r+j|0;a[u>>0]=a[u>>0]^a[b+j>>0];j=j+1|0}while((j|0)!=(d|0))}j=m;c[j>>2]=512;c[j+4>>2]=0;j=v+144|0;p=j;m=r;q=p+64|0;do{a[p>>0]=a[m>>0]|0;p=p+1|0;m=m+1|0}while((p|0)<(q|0));Eb(n,j);do if(f){b=k;t=c[b>>2]|0;b=c[b+4>>2]|0;j=Gd(t|0,b|0,3)|0;j=j&63;u=Hd(f|0,0,3)|0;u=Dd(t|0,b|0,u|0,C|0)|0;b=k;c[b>>2]=u;c[b+4>>2]=C;b=64-j|0;j=v+40+j|0;if(b>>>0>f>>>0){Id(j|0,e|0,f|0)|0;break}Id(j|0,e|0,b|0)|0;Eb(v,o);j=e+b|0;k=Cd(f|0,0,b|0,0)|0;b=C;if(b>>>0>0|(b|0)==0&k>>>0>63){do{Eb(v,j);j=j+64|0;k=Dd(k|0,b|0,-64,-1)|0;b=C}while(b>>>0>0|(b|0)==0&k>>>0>63);b=k}else b=k;Id(o|0,j|0,b|0)|0}while(0);if(!h){i=A;return}l=y+3|0;d=y+2|0;n=y+1|0;o=x+32|0;r=x+104|0;e=x+136|0;f=x+144|0;s=x+40|0;t=0;u=0;do{u=u+1|0;a[l>>0]=u;a[d>>0]=u>>>8;a[n>>0]=u>>>16;a[y>>0]=u>>>24;Id(x|0,v|0,208)|0;q=o;b=c[q>>2]|0;q=c[q+4>>2]|0;j=Gd(b|0,q|0,3)|0;j=j&63;q=Dd(b|0,q|0,32,0)|0;b=o;c[b>>2]=q;c[b+4>>2]=C;b=64-j|0;j=x+40+j|0;if(b>>>0>4){q=c[y>>2]|0;a[j>>0]=q;a[j+1>>0]=q>>8;a[j+2>>0]=q>>16;a[j+3>>0]=q>>24}else{Id(j|0,y|0,b|0)|0;Eb(x,s);j=y+b|0;k=Cd(4,0,b|0,0)|0;b=C;if(b>>>0>0|(b|0)==0&k>>>0>63){do{Eb(x,j);j=j+64|0;k=Dd(k|0,b|0,-64,-1)|0;b=C}while(b>>>0>0|(b|0)==0&k>>>0>63);b=k}else b=k;Id(s|0,j|0,b|0)|0}Db(x,z);q=e;b=c[q>>2]|0;q=c[q+4>>2]|0;j=Gd(b|0,q|0,3)|0;j=j&63;q=Dd(b|0,q|0,256,0)|0;b=e;c[b>>2]=q;c[b+4>>2]=C;b=64-j|0;j=x+144+j|0;if(b>>>0>32){p=j;m=z;q=p+32|0;do{a[p>>0]=a[m>>0]|0;p=p+1|0;m=m+1|0}while((p|0)<(q|0))}else{Id(j|0,z|0,b|0)|0;Eb(r,f);j=z+b|0;k=Cd(32,0,b|0,0)|0;b=C;if(b>>>0>0|(b|0)==0&k>>>0>63){do{Eb(r,j);j=j+64|0;k=Dd(k|0,b|0,-64,-1)|0;b=C}while(b>>>0>0|(b|0)==0&k>>>0>63);b=k}else b=k;Id(f|0,j|0,b|0)|0}Db(r,w);q=h-t|0;Id(g+t|0,w|0,(q>>>0>32?32:q)|0)|0;t=u<<5}while(t>>>0>>0);i=A;return}function Zb(){return 32}function _b(){return 102}function $b(){return 32984}function ac(){return 524288}function bc(){return 16777216}function cc(){return 33554432}function dc(){return 1073741824}function ec(a,b,d,e,f,g,h,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0;o=i;n=i=i+63&-64;i=i+16|0;Fd(a|0,0,b|0)|0;m=g|d;if(m>>>0>0|(m|0)==0&(f|b)>>>0>4294967295){if(!(c[7979]|0))d=31964;else d=c[(oa()|0)+60>>2]|0;c[d>>2]=27;n=-1;i=o;return n|0}g=k>>>0<0|(k|0)==0&j>>>0<32768;m=g?32768:j;k=g?0:k;a:do if(k>>>0<0|(k|0)==0&m>>>0>>5>>>0){g=Gd(m|0,k|0,6)|0;j=C;k=1;while(1){m=Hd(1,0,k|0)|0;l=C;d=k+1|0;if(l>>>0>j>>>0|(l|0)==(j|0)&m>>>0>g>>>0){d=k;g=1;break a}if(d>>>0<63)k=d;else{g=1;break}}}else{g=l>>>11;j=1;while(1){l=Hd(1,0,j|0)|0;p=C;d=j+1|0;if(p>>>0>0|(p|0)==0&l>>>0>g>>>0){d=j;break}if(d>>>0<63)j=d;else break}g=Gd(m|0,k|0,2)|0;g=Gd(g|0,C|0,d|0)|0;p=C;m=p>>>0>0|(p|0)==0&g>>>0>1073741823;g=m?1073741823:g;g=g>>>3}while(0);d=Hd(1,0,d|0)|0;c[n+4>>2]=0;c[n>>2]=0;c[n+8>>2]=0;g=hc(n,e,f,h,32,d,C,8,g,a,b)|0;d=c[n>>2]|0;if(d)zd(d);p=g;i=o;return p|0}function fc(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=i;v=i=i+63&-64;i=i+112|0;t=v+72|0;u=v+12|0;l=b;m=l+102|0;do{a[l>>0]=0;l=l+1|0}while((l|0)<(m|0));if(g>>>0>0|(g|0)==0&f>>>0>4294967295){if(!(c[7979]|0))g=31964;else g=c[(oa()|0)+60>>2]|0;c[g>>2]=27;v=-1;i=w;return v|0}m=j>>>0<0|(j|0)==0&h>>>0<32768;n=m?32768:h;m=m?0:j;a:do if(m>>>0<0|(m|0)==0&n>>>0>>5>>>0){h=Gd(n|0,m|0,6)|0;l=C;m=1;while(1){k=Hd(1,0,m|0)|0;n=C;g=m+1|0;if(n>>>0>l>>>0|(n|0)==(l|0)&k>>>0>h>>>0){g=m;h=1;break a}if(g>>>0<63)m=g;else{h=1;break}}}else{h=k>>>11;l=1;while(1){k=Hd(1,0,l|0)|0;j=C;g=l+1|0;if(j>>>0>0|(j|0)==0&k>>>0>h>>>0){g=l;break}if(g>>>0<63)l=g;else break}h=Gd(n|0,m|0,2)|0;h=Gd(h|0,C|0,g|0)|0;k=C;n=k>>>0>0|(k|0)==0&h>>>0>1073741823;h=n?1073741823:h;h=h>>>3}while(0);l=0;do{a[t+l>>0]=Ba(0)|0;l=l+1|0}while((l|0)!=32);b:do if((((((((g>>>0<=63?(k=Hd(h|0,0,3)|0,n=C,!(n>>>0>0|(n|0)==0&k>>>0>1073741823)):0)?(a[u>>0]=36,a[u+1>>0]=55,a[u+2>>0]=36,a[u+3>>0]=a[34881+g>>0]|0,a[u+4>>0]=54,k=u+5|0,o=u+9|0,a[k>>0]=46,a[k+1>>0]=46,a[k+2>>0]=46,a[k+3>>0]=46,(o|0)!=0):0)?(p=o,r=u+58|0,(r|0)!=(p|0)):0)?(q=r-p|0,a[o>>0]=a[34881+(h&63)>>0]|0,(q|0)!=1):0)?(a[u+10>>0]=a[34881+(h>>>6&63)>>0]|0,(q|0)!=2):0)?(a[u+11>>0]=a[34881+(h>>>12&63)>>0]|0,(q|0)!=3):0)?(a[u+12>>0]=a[34881+(h>>>18&63)>>0]|0,(q|0)!=4):0)?(s=u+14|0,a[u+13>>0]=a[34881+(h>>>24)>>0]|0,(s|0)!=0):0){p=s;o=r-s|0;g=0;while(1){if(g>>>0<32){n=0;k=g;g=0}else break;do{s=k;k=k+1|0;g=(d[t+s>>0]|0)<>>0<32&n>>>0<24);if(!n)g=p;else{h=g;l=o;m=p;j=0;while(1){if(!l)break b;g=m+1|0;a[m>>0]=a[34881+(h&63)>>0]|0;j=j+6|0;if(j>>>0>=n>>>0)break;else{h=h>>>6;l=l+-1|0;m=g}}}s=(g|0)==0;o=(s?0:p-g|0)+o|0;if(s)break b;else{p=g;g=k}}if(p>>>0<(u+58|0)>>>0){a[p>>0]=0;l=v+4|0;c[l>>2]=0;c[v>>2]=0;m=v+8|0;c[m>>2]=0;g=(Vb(v,e,f,u,b)|0)==0;h=c[v>>2]|0;if(h)zd(h);c[l>>2]=0;c[v>>2]=0;c[m>>2]=0;if(!g){v=0;i=w;return v|0}if(!(c[7979]|0))g=31964;else g=c[(oa()|0)+60>>2]|0;c[g>>2]=22;v=-1;i=w;return v|0}}while(0);if(!(c[7979]|0))g=31964;else g=c[(oa()|0)+60>>2]|0;c[g>>2]=22;v=-1;i=w;return v|0}function gc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;m=i;l=i=i+63&-64;i=i+128|0;f=l+12|0;a:do if(b&3){g=102;h=b;do{if(!(a[h>>0]|0)){k=5;break a}h=h+1|0;g=g+-1|0;j=(g|0)!=0}while(j&(h&3|0)!=0);if(j)k=5;else g=0}else{g=102;h=b;k=5}while(0);b:do if((k|0)==5)if(a[h>>0]|0){c:do if(g>>>0>3)while(1){j=c[h>>2]|0;if((j&-2139062144^-2139062144)&j+-16843009)break;h=h+4|0;g=g+-4|0;if(g>>>0<=3){k=10;break c}}else k=10;while(0);if((k|0)==10)if(!g){g=0;break}while(1){if(!(a[h>>0]|0))break b;h=h+1|0;g=g+-1|0;if(!g){g=0;break}}}while(0);if((((g|0)!=0?h:0)|0)!=(b+101|0)){b=-1;i=m;return b|0}j=l+4|0;c[j>>2]=0;c[l>>2]=0;k=l+8|0;c[k>>2]=0;g=(Vb(l,d,e,b,f)|0)==0;h=c[l>>2]|0;if(h)zd(h);c[j>>2]=0;c[l>>2]=0;c[k>>2]=0;if(g){b=-1;i=m;return b|0}else{g=0;h=0}do{g=a[b+h>>0]^a[f+h>>0]|g;h=h+1|0}while((h|0)!=102);h=(((g&255)+511|0)>>>8&1)+-1|0;g=f+102|0;do{a[f>>0]=0;f=f+1|0}while((f|0)<(g|0));b=h;i=m;return b|0}function hc(b,e,f,g,h,i,j,k,l,m,n){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;J=Od(l|0,0,k|0,0)|0;I=C;if(I>>>0>0|(I|0)==0&J>>>0>1073741823){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=27;f=-1;return f|0}if(j>>>0>0|(j|0)==0&i>>>0>4294967295){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=27;f=-1;return f|0}G=Dd(i|0,j|0,-1,-1)|0;H=C;if(j>>>0<0|(j|0)==0&i>>>0<2|((G&i|0)!=0|(H&j|0)!=0)){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=22;f=-1;return f|0}if((k|0)==0|(l|0)==0){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=22;f=-1;return f|0}if(!(k>>>0>16777215?1:(33554431/(l>>>0)|0)>>>0>>0)?!(0>>0|(0==(j|0)?(33554431/(k>>>0)|0)>>>0>>0:0)):0){I=k<<7;J=_(I,l)|0;y=Od(I|0,0,i|0,j|0)|0;o=y+J|0;if(o>>>0>>0){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=12;f=-1;return f|0}F=k<<8|64;w=o+F|0;if(w>>>0>>0){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=12;f=-1;return f|0}x=b+8|0;do if((c[x>>2]|0)>>>0>>0){o=c[b>>2]|0;if(o)zd(o);v=b+4|0;c[v>>2]=0;c[b>>2]=0;c[x>>2]=0;do if(w>>>0<=4294967168){if(w>>>0>=4294967168){if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=12;q=12;o=0;break}t=w|8;o=yd(t+76|0)|0;if(o){s=o+-8|0;do if(o&63){r=o+63&-64;F=r+-8|0;q=s;r=(F-q|0)>>>0>15?F:r+56|0;q=r-q|0;o=o+-4|0;F=c[o>>2]|0;p=(F&-8)-q|0;if(!(F&3)){c[r>>2]=(c[s>>2]|0)+q;c[r+4>>2]=p;break}else{F=r+4|0;c[F>>2]=p|c[F>>2]&1|2;E=r+p+4|0;c[E>>2]=c[E>>2]|1;c[o>>2]=q|c[o>>2]&1|2;c[F>>2]=c[F>>2]|1;Ad(s,q);break}}else r=s;while(0);o=r+4|0;p=c[o>>2]|0;if((p&3|0)!=0?(u=p&-8,u>>>0>(t+16|0)>>>0):0){F=u-t|0;E=r+t|0;c[o>>2]=t|p&1|2;c[E+4>>2]=F|3;D=E+F+4|0;c[D>>2]=c[D>>2]|1;Ad(E,F)}q=0;o=r+8|0}else{q=12;o=0}}else{q=12;o=0}while(0);if(!(c[7979]|0))p=31964;else p=c[(oa()|0)+60>>2]|0;c[p>>2]=q;if(!q){c[b>>2]=o;c[v>>2]=o;c[x>>2]=(o|0)!=0?w:0;if(!o)o=-1;else break;return o|0}else{c[b>>2]=0;c[v>>2]=0;c[x>>2]=0;f=-1;return f|0}}else o=c[b+4>>2]|0;while(0);F=o+J|0;E=F+y|0;Yb(e,f,g,h,o,J);t=k<<5;u=E+(t<<2)|0;v=E+(k<<6<<2)|0;w=(t|0)==0;x=(i|0)==0&(j|0)==0;b=t&1073741792;y=(b|0)==0;h=I+-64|0;g=E+h|0;h=u+h|0;z=h+4|0;A=g+4|0;D=0;do{B=o+(_(I,D)|0)|0;if(!w){p=0;do{s=B+(p<<2)|0;c[E+(p<<2)>>2]=(d[s+1>>0]|0)<<8|(d[s>>0]|0)|(d[s+2>>0]|0)<<16|(d[s+3>>0]|0)<<24;p=p+1|0}while((p|0)!=(t|0))}a:do if(!x){if(y){p=0;q=0;do{ic(E,u,v,k);ic(u,E,v,k);p=Dd(p|0,q|0,2,0)|0;q=C}while(q>>>0>>0|(q|0)==(j|0)&p>>>0>>0)}else{r=0;s=0;do{p=Od(r|0,s|0,t|0,0)|0;p=F+(p<<2)|0;q=0;do{c[p+(q<<2)>>2]=c[E+(q<<2)>>2];q=q+1|0}while((q|0)!=(b|0));ic(E,u,v,k);p=Od(r|1|0,s|0,t|0,0)|0;p=F+(p<<2)|0;q=0;do{c[p+(q<<2)>>2]=c[u+(q<<2)>>2];q=q+1|0}while((q|0)!=(b|0));ic(u,E,v,k);r=Dd(r|0,s|0,2,0)|0;s=C}while(s>>>0>>0|(s|0)==(j|0)&r>>>0>>0)}if(y){p=0;q=0;while(1){ic(E,u,v,k);ic(u,E,v,k);p=Dd(p|0,q|0,2,0)|0;q=C;if(!(q>>>0>>0|(q|0)==(j|0)&p>>>0>>0))break a}}else{r=0;s=0}do{p=Od(c[g>>2]&G|0,c[A>>2]&H|0,t|0,0)|0;p=F+(p<<2)|0;q=0;do{K=E+(q<<2)|0;c[K>>2]=c[K>>2]^c[p+(q<<2)>>2];q=q+1|0}while((q|0)!=(b|0));ic(E,u,v,k);p=Od(c[h>>2]&G|0,c[z>>2]&H|0,t|0,0)|0;p=F+(p<<2)|0;q=0;do{K=u+(q<<2)|0;c[K>>2]=c[K>>2]^c[p+(q<<2)>>2];q=q+1|0}while((q|0)!=(b|0));ic(u,E,v,k);r=Dd(r|0,s|0,2,0)|0;s=C}while(s>>>0>>0|(s|0)==(j|0)&r>>>0>>0)}while(0);if(!w){p=0;do{K=B+(p<<2)|0;s=c[E+(p<<2)>>2]|0;a[K>>0]=s;a[K+1>>0]=s>>>8;a[K+2>>0]=s>>>16;a[K+3>>0]=s>>>24;p=p+1|0}while((p|0)!=(t|0))}D=D+1|0}while((D|0)!=(l|0));Yb(e,f,o,J,m,n);K=0;return K|0}if(!(c[7979]|0))o=31964;else o=c[(oa()|0)+60>>2]|0;c[o>>2]=12;K=-1;return K|0}function ic(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;w=e<<1;m=a+((e<<5)+-16<<2)|0;o=c[m>>2]|0;c[d>>2]=o;q=c[m+4>>2]|0;L=d+4|0;c[L>>2]=q;t=c[m+8>>2]|0;x=d+8|0;c[x>>2]=t;u=c[m+12>>2]|0;y=d+12|0;c[y>>2]=u;s=c[m+16>>2]|0;z=d+16|0;c[z>>2]=s;r=c[m+20>>2]|0;A=d+20|0;c[A>>2]=r;p=c[m+24>>2]|0;B=d+24|0;c[B>>2]=p;n=c[m+28>>2]|0;C=d+28|0;c[C>>2]=n;l=c[m+32>>2]|0;D=d+32|0;c[D>>2]=l;j=c[m+36>>2]|0;E=d+36|0;c[E>>2]=j;h=c[m+40>>2]|0;F=d+40|0;c[F>>2]=h;f=c[m+44>>2]|0;G=d+44|0;c[G>>2]=f;g=c[m+48>>2]|0;H=d+48|0;c[H>>2]=g;i=c[m+52>>2]|0;I=d+52|0;c[I>>2]=i;k=c[m+56>>2]|0;J=d+56|0;c[J>>2]=k;m=c[m+60>>2]|0;K=d+60|0;c[K>>2]=m;if(!w)return;v=e<<4;e=0;while(1){M=e<<4;N=a+(M<<2)|0;c[d>>2]=o^c[N>>2];c[L>>2]=q^c[N+4>>2];c[x>>2]=t^c[N+8>>2];c[y>>2]=u^c[N+12>>2];c[z>>2]=s^c[N+16>>2];c[A>>2]=r^c[N+20>>2];c[B>>2]=p^c[N+24>>2];c[C>>2]=n^c[N+28>>2];c[D>>2]=l^c[N+32>>2];c[E>>2]=j^c[N+36>>2];c[F>>2]=h^c[N+40>>2];c[G>>2]=f^c[N+44>>2];c[H>>2]=g^c[N+48>>2];c[I>>2]=i^c[N+52>>2];c[J>>2]=k^c[N+56>>2];c[K>>2]=m^c[N+60>>2];jc(d);u=e<<3;t=b+(u<<2)|0;c[t>>2]=c[d>>2];c[t+4>>2]=c[L>>2];c[t+8>>2]=c[x>>2];c[t+12>>2]=c[y>>2];c[t+16>>2]=c[z>>2];c[t+20>>2]=c[A>>2];c[t+24>>2]=c[B>>2];c[t+28>>2]=c[C>>2];c[t+32>>2]=c[D>>2];c[t+36>>2]=c[E>>2];c[t+40>>2]=c[F>>2];c[t+44>>2]=c[G>>2];c[t+48>>2]=c[H>>2];c[t+52>>2]=c[I>>2];c[t+56>>2]=c[J>>2];c[t+60>>2]=c[K>>2];t=a+((M|16)<<2)|0;c[d>>2]=c[d>>2]^c[t>>2];c[L>>2]=c[L>>2]^c[t+4>>2];c[x>>2]=c[x>>2]^c[t+8>>2];c[y>>2]=c[y>>2]^c[t+12>>2];c[z>>2]=c[z>>2]^c[t+16>>2];c[A>>2]=c[A>>2]^c[t+20>>2];c[B>>2]=c[B>>2]^c[t+24>>2];c[C>>2]=c[C>>2]^c[t+28>>2];c[D>>2]=c[D>>2]^c[t+32>>2];c[E>>2]=c[E>>2]^c[t+36>>2];c[F>>2]=c[F>>2]^c[t+40>>2];c[G>>2]=c[G>>2]^c[t+44>>2];c[H>>2]=c[H>>2]^c[t+48>>2];c[I>>2]=c[I>>2]^c[t+52>>2];c[J>>2]=c[J>>2]^c[t+56>>2];c[K>>2]=c[K>>2]^c[t+60>>2];jc(d);u=b+(u+v<<2)|0;c[u>>2]=c[d>>2];c[u+4>>2]=c[L>>2];c[u+8>>2]=c[x>>2];c[u+12>>2]=c[y>>2];c[u+16>>2]=c[z>>2];c[u+20>>2]=c[A>>2];c[u+24>>2]=c[B>>2];c[u+28>>2]=c[C>>2];c[u+32>>2]=c[D>>2];c[u+36>>2]=c[E>>2];c[u+40>>2]=c[F>>2];c[u+44>>2]=c[G>>2];c[u+48>>2]=c[H>>2];c[u+52>>2]=c[I>>2];c[u+56>>2]=c[J>>2];c[u+60>>2]=c[K>>2];e=e+2|0;if(e>>>0>=w>>>0)break;f=c[G>>2]|0;g=c[H>>2]|0;i=c[I>>2]|0;k=c[J>>2]|0;m=c[K>>2]|0;o=c[d>>2]|0;q=c[L>>2]|0;t=c[x>>2]|0;u=c[y>>2]|0;s=c[z>>2]|0;r=c[A>>2]|0;p=c[B>>2]|0;n=c[C>>2]|0;l=c[D>>2]|0;j=c[E>>2]|0;h=c[F>>2]|0}return}function jc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;b=a+4|0;z=a+8|0;A=a+12|0;B=a+16|0;F=a+20|0;f=a+24|0;k=a+28|0;n=a+32|0;s=a+36|0;t=a+40|0;u=a+44|0;v=a+48|0;w=a+52|0;x=a+56|0;y=a+60|0;d=c[b>>2]|0;e=c[F>>2]|0;g=c[s>>2]|0;h=c[w>>2]|0;i=c[f>>2]|0;j=c[t>>2]|0;l=c[x>>2]|0;m=c[z>>2]|0;o=c[u>>2]|0;p=c[y>>2]|0;q=c[A>>2]|0;r=c[k>>2]|0;C=c[v>>2]|0;D=c[a>>2]|0;E=c[B>>2]|0;G=c[n>>2]|0;H=0;do{R=C+D|0;R=(R<<7|R>>>25)^E;O=R+D|0;O=(O<<9|O>>>23)^G;L=O+R|0;L=(L<<13|L>>>19)^C;U=L+O|0;U=(U<<18|U>>>14)^D;N=d+e|0;N=(N<<7|N>>>25)^g;K=N+e|0;K=(K<<9|K>>>23)^h;X=K+N|0;X=(X<<13|X>>>19)^d;Q=X+K|0;Q=(Q<<18|Q>>>14)^e;J=i+j|0;J=(J<<7|J>>>25)^l;W=J+j|0;W=(W<<9|W>>>23)^m;T=W+J|0;T=(T<<13|T>>>19)^i;M=T+W|0;M=(M<<18|M>>>14)^j;V=o+p|0;V=(V<<7|V>>>25)^q;S=V+p|0;S=(S<<9|S>>>23)^r;P=S+V|0;P=(P<<13|P>>>19)^o;I=P+S|0;I=(I<<18|I>>>14)^p;Y=V+U|0;d=(Y<<7|Y>>>25)^X;X=d+U|0;m=(X<<9|X>>>23)^W;W=m+d|0;q=(W<<13|W>>>19)^V;V=q+m|0;D=(V<<18|V>>>14)^U;U=R+Q|0;i=(U<<7|U>>>25)^T;T=i+Q|0;r=(T<<9|T>>>23)^S;S=r+i|0;E=(S<<13|S>>>19)^R;R=E+r|0;e=(R<<18|R>>>14)^Q;Q=N+M|0;o=(Q<<7|Q>>>25)^P;P=o+M|0;G=(P<<9|P>>>23)^O;O=G+o|0;g=(O<<13|O>>>19)^N;N=g+G|0;j=(N<<18|N>>>14)^M;M=J+I|0;C=(M<<7|M>>>25)^L;L=C+I|0;h=(L<<9|L>>>23)^K;K=h+C|0;l=(K<<13|K>>>19)^J;J=l+h|0;p=(J<<18|J>>>14)^I;H=H+2|0}while(H>>>0<8);c[a>>2]=(c[a>>2]|0)+D;c[b>>2]=(c[b>>2]|0)+d;c[z>>2]=(c[z>>2]|0)+m;c[A>>2]=(c[A>>2]|0)+q;c[B>>2]=(c[B>>2]|0)+E;c[F>>2]=(c[F>>2]|0)+e;c[f>>2]=(c[f>>2]|0)+i;c[k>>2]=(c[k>>2]|0)+r;c[n>>2]=(c[n>>2]|0)+G;c[s>>2]=(c[s>>2]|0)+g;c[t>>2]=(c[t>>2]|0)+j;c[u>>2]=(c[u>>2]|0)+o;c[v>>2]=(c[v>>2]|0)+C;c[w>>2]=(c[w>>2]|0)+h;c[x>>2]=(c[x>>2]|0)+l;c[y>>2]=(c[y>>2]|0)+p;return}function kc(){return 32}function lc(){return 32}function mc(a,b){a=a|0;b=b|0;md(a,b,33785);return 0}function nc(a,b,c){a=a|0;b=b|0;c=c|0;md(a,b,c);return 0}function oc(){return 32}function pc(){return 24}function qc(){return 16}function rc(b,c,d,e,f,g,h){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;r=i;q=i=i+63&-64;i=i+240|0;p=q;o=q+176|0;q=q+144|0;nb(q,g,h,32988);h=b;j=d;if(b>>>0>=d>>>0?0>>0|0==(f|0)&(h-j|0)>>>0>>0:0)k=5;else if(d>>>0>=b>>>0?0>>0|0==(f|0)&(j-h|0)>>>0>>0:0)k=5;if((k|0)==5){Jd(b|0,d|0,e|0)|0;d=b}h=o;k=h+32|0;do{a[h>>0]=0;h=h+1|0}while((h|0)<(k|0));l=f>>>0>0|(f|0)==0&e>>>0>32;m=l?32:e;n=l?0:f;h=(m|0)==0&(n|0)==0;if(!h){k=f>>>0<0|(f|0)==0&e>>>0<32;k=Dd((k?e:32)|0,(k?f:0)|0,-1,0)|0;Id(o+32|0,d|0,k+1|0)|0}k=Dd(m|0,n|0,32,0)|0;j=g+16|0;nd(o,o,k,C,j,0,0,q);Ub(p,o);if(!h){g=f>>>0<0|(f|0)==0&e>>>0<32;g=Dd((g?e:32)|0,(g?f:0)|0,-1,0)|0;Id(b|0,o+32|0,g+1|0)|0}h=o;k=h+64|0;do{a[h>>0]=0;h=h+1|0}while((h|0)<(k|0));if(!l){Tb(p,b,e,f);Rb(p,c);i=r;return 0}o=Cd(e|0,f|0,m|0,n|0)|0;nd(b+m|0,d+m|0,o,C,j,1,0,q);Tb(p,b,e,f);Rb(p,c);i=r;return 0}function sc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(d>>>0>0|(d|0)==0&c>>>0>4294967279){e=-1;return e|0}rc(a+16|0,a,b,c,d,e,f)|0;e=0;return e|0}function tc(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;t=i;s=i=i+63&-64;i=i+208|0;m=s;o=s+144|0;n=s+112|0;r=s+48|0;s=s+16|0;nb(s,j,k,32988);q=j+16|0;k=n;j=s;l=k+32|0;do{a[k>>0]=a[j>>0]|0;k=k+1|0;j=j+1|0}while((k|0)<(l|0));l=q;j=l;l=l+4|0;l=d[l>>0]|d[l+1>>0]<<8|d[l+2>>0]<<16|d[l+3>>0]<<24;k=m;c[k>>2]=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;c[k+4>>2]=l;k=m+8|0;c[k>>2]=0;c[k+4>>2]=0;ob(o,m,n,33817);k=0;do{a[r+k>>0]=a[o+k>>0]|0;k=k+1|0}while((k|0)!=32);if(Qb(f,e,g,h,r)|0){k=s;l=k+32|0;do{a[k>>0]=0;k=k+1|0}while((k|0)<(l|0));s=-1;i=t;return s|0}k=e;j=b;if(e>>>0>=b>>>0?0>>0|0==(h|0)&(k-j|0)>>>0>>0:0)p=9;else if(b>>>0>=e>>>0?0>>0|0==(h|0)&(j-k|0)>>>0>>0:0)p=9;if((p|0)==9){Jd(b|0,e|0,g|0)|0;e=b}k=h>>>0>0|(h|0)==0&g>>>0>32;j=k?32:g;l=k?0:h;if((j|0)==0&(l|0)==0)nd(r,r,32,0,q,0,0,s);else{f=r+32|0;p=h>>>0<0|(h|0)==0&g>>>0<32;p=Dd((p?g:32)|0,(p?h:0)|0,-1,0)|0;p=p+1|0;Id(f|0,e|0,p|0)|0;o=Dd(j|0,l|0,32,0)|0;nd(r,r,o,C,q,0,0,s);Id(b|0,f|0,p|0)|0}if(k){r=Cd(g|0,h|0,j|0,l|0)|0;nd(b+j|0,e+j|0,r,C,q,1,0,s)}k=s;l=k+32|0;do{a[k>>0]=0;k=k+1|0}while((k|0)<(l|0));s=0;i=t;return s|0}function uc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(d>>>0<0|(d|0)==0&c>>>0<16){e=-1;return e|0}d=Dd(c|0,d|0,-16,-1)|0;e=tc(a,b+16|0,b,d,C,e,f)|0;return e|0}function vc(){return 8}function wc(){return 16}function xc(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;h=d[g>>0]|0;o=Hd(d[g+1>>0]|0|0,0,8)|0;n=C;j=Hd(d[g+2>>0]|0|0,0,16)|0;n=n|C;k=Hd(d[g+3>>0]|0|0,0,24)|0;n=n|C|(d[g+4>>0]|0);r=Hd(d[g+5>>0]|0|0,0,40)|0;n=n|C;i=Hd(d[g+6>>0]|0|0,0,48)|0;n=n|C;l=Hd(d[g+7>>0]|0|0,0,56)|0;l=o|h|j|k|r|i|l;n=n|C;i=d[g+8>>0]|0;r=Hd(d[g+9>>0]|0|0,0,8)|0;k=C;j=Hd(d[g+10>>0]|0|0,0,16)|0;k=k|C;h=Hd(d[g+11>>0]|0|0,0,24)|0;k=k|C|(d[g+12>>0]|0);o=Hd(d[g+13>>0]|0|0,0,40)|0;k=k|C;p=Hd(d[g+14>>0]|0|0,0,48)|0;k=k|C;m=Hd(d[g+15>>0]|0|0,0,56)|0;m=r|i|j|h|o|p|m;k=k|C;p=e&7;o=c+e+(0-p)|0;e=Hd(e|0,f|0,56)|0;g=C;h=m^2037671283;j=k^1952801890;i=l^1852142177;f=n^1819895653;m=m^1852075885;k=k^1685025377;l=l^1886610805;n=n^1936682341;if((o|0)!=(c|0)){do{x=d[c>>0]|0;y=Hd(d[c+1>>0]|0|0,0,8)|0;r=C;w=Hd(d[c+2>>0]|0|0,0,16)|0;r=r|C;t=Hd(d[c+3>>0]|0|0,0,24)|0;r=r|C|(d[c+4>>0]|0);u=Hd(d[c+5>>0]|0|0,0,40)|0;r=r|C;v=Hd(d[c+6>>0]|0|0,0,48)|0;r=r|C;s=Hd(d[c+7>>0]|0|0,0,56)|0;s=y|x|w|t|u|v|s;r=r|C;v=s^h;u=r^j;n=Dd(l|0,n|0,m|0,k|0)|0;l=C;t=Hd(m|0,k|0,13)|0;h=C;m=Gd(m|0,k|0,51)|0;m=(t|m)^n;h=(h|C)^l;f=Dd(v|0,u|0,i|0,f|0)|0;i=C;t=Hd(v|0,u|0,16)|0;j=C;u=Gd(v|0,u|0,48)|0;u=(t|u)^f;j=(j|C)^i;n=Dd(u|0,j|0,l|0,n|0)|0;l=C;t=Hd(u|0,j|0,21)|0;k=C;j=Gd(u|0,j|0,43)|0;j=(t|j)^n;k=(k|C)^l;i=Dd(f|0,i|0,m|0,h|0)|0;f=C;t=Hd(m|0,h|0,17)|0;u=C;h=Gd(m|0,h|0,47)|0;h=i^(t|h);u=f^(u|C);l=Dd(n|0,l|0,h|0,u|0)|0;n=C;t=Hd(h|0,u|0,13)|0;m=C;u=Gd(h|0,u|0,51)|0;u=(t|u)^l;m=(m|C)^n;i=Dd(j|0,k|0,f|0,i|0)|0;f=C;t=Hd(j|0,k|0,16)|0;h=C;k=Gd(j|0,k|0,48)|0;k=(t|k)^i;h=(h|C)^f;l=Dd(k|0,h|0,n|0,l|0)|0;n=C;t=Hd(k|0,h|0,21)|0;j=C;h=Gd(k|0,h|0,43)|0;h=(t|h)^l;j=(j|C)^n;f=Dd(i|0,f|0,u|0,m|0)|0;i=C;t=Hd(u|0,m|0,17)|0;k=C;m=Gd(u|0,m|0,47)|0;m=(t|m)^f;k=(k|C)^i;l=l^s;n=n^r;c=c+8|0}while((c|0)!=(o|0));c=o}switch(p|0){case 7:{e=Hd(d[c+6>>0]|0|0,0,48)|0|e;g=C|g;q=5;break}case 6:{q=5;break}case 5:{q=6;break}case 4:{q=7;break}case 3:{q=8;break}case 2:{q=9;break}case 1:{q=10;break}default:{}}if((q|0)==5){y=Hd(d[c+5>>0]|0|0,0,40)|0;g=C|g;e=y|e;q=6}if((q|0)==6){g=d[c+4>>0]|0|g;q=7}if((q|0)==7){y=Hd(d[c+3>>0]|0|0,0,24)|0;e=y|e;g=C|g;q=8}if((q|0)==8){y=Hd(d[c+2>>0]|0|0,0,16)|0;e=y|e;g=C|g;q=9}if((q|0)==9){y=Hd(d[c+1>>0]|0|0,0,8)|0;e=y|e;g=C|g;q=10}if((q|0)==10)e=d[c>>0]|0|e;y=e^h;r=g^j;s=Dd(l|0,n|0,m|0,k|0)|0;q=C;w=Hd(m|0,k|0,13)|0;t=C;x=Gd(m|0,k|0,51)|0;x=(w|x)^s;t=(t|C)^q;w=Dd(y|0,r|0,i|0,f|0)|0;v=C;u=Hd(y|0,r|0,16)|0;p=C;r=Gd(y|0,r|0,48)|0;r=(u|r)^w;p=(p|C)^v;s=Dd(r|0,p|0,q|0,s|0)|0;q=C;u=Hd(r|0,p|0,21)|0;y=C;p=Gd(r|0,p|0,43)|0;p=(u|p)^s;y=(y|C)^q;v=Dd(w|0,v|0,x|0,t|0)|0;w=C;u=Hd(x|0,t|0,17)|0;r=C;t=Gd(x|0,t|0,47)|0;t=v^(u|t);r=w^(r|C);q=Dd(s|0,q|0,t|0,r|0)|0;s=C;u=Hd(t|0,r|0,13)|0;x=C;r=Gd(t|0,r|0,51)|0;r=(u|r)^q;x=(x|C)^s;v=Dd(p|0,y|0,w|0,v|0)|0;w=C;u=Hd(p|0,y|0,16)|0;t=C;y=Gd(p|0,y|0,48)|0;y=(u|y)^v;t=(t|C)^w;q=Dd(y|0,t|0,s|0,q|0)|0;s=C;u=Hd(y|0,t|0,21)|0;p=C;t=Gd(y|0,t|0,43)|0;t=(u|t)^q;p=(p|C)^s;w=Dd(v|0,w|0,r|0,x|0)|0;v=C;u=Hd(r|0,x|0,17)|0;y=C;x=Gd(r|0,x|0,47)|0;x=(u|x)^w;y=(y|C)^v;s=Dd(q^e|0,s^g|0,x|0,y|0)|0;q=C;u=Hd(x|0,y|0,13)|0;r=C;y=Gd(x|0,y|0,51)|0;y=s^(u|y);r=q^(r|C);w=Dd(t|0,p|0,v^255|0,w|0)|0;v=C;u=Hd(t|0,p|0,16)|0;x=C;p=Gd(t|0,p|0,48)|0;p=(u|p)^w;x=(x|C)^v;s=Dd(p|0,x|0,q|0,s|0)|0;q=C;u=Hd(p|0,x|0,21)|0;t=C;x=Gd(p|0,x|0,43)|0;x=(u|x)^s;t=(t|C)^q;v=Dd(w|0,v|0,y|0,r|0)|0;w=C;u=Hd(y|0,r|0,17)|0;p=C;r=Gd(y|0,r|0,47)|0;r=(u|r)^v;p=(p|C)^w;q=Dd(s|0,q|0,r|0,p|0)|0;s=C;u=Hd(r|0,p|0,13)|0;y=C;p=Gd(r|0,p|0,51)|0;p=(u|p)^q;y=(y|C)^s;v=Dd(x|0,t|0,w|0,v|0)|0;w=C;u=Hd(x|0,t|0,16)|0;r=C;t=Gd(x|0,t|0,48)|0;t=(u|t)^v;r=(r|C)^w;q=Dd(t|0,r|0,s|0,q|0)|0;s=C;u=Hd(t|0,r|0,21)|0;x=C;r=Gd(t|0,r|0,43)|0;r=(u|r)^q;x=(x|C)^s;w=Dd(v|0,w|0,p|0,y|0)|0;v=C;u=Hd(p|0,y|0,17)|0;t=C;y=Gd(p|0,y|0,47)|0;y=(u|y)^w;t=(t|C)^v;s=Dd(q|0,s|0,y|0,t|0)|0;q=C;u=Hd(y|0,t|0,13)|0;p=C;t=Gd(y|0,t|0,51)|0;t=(u|t)^s;p=(p|C)^q;w=Dd(r|0,x|0,v|0,w|0)|0;v=C;u=Hd(r|0,x|0,16)|0;y=C;x=Gd(r|0,x|0,48)|0;x=(u|x)^w;y=(y|C)^v;s=Dd(x|0,y|0,q|0,s|0)|0;q=C;u=Hd(x|0,y|0,21)|0;r=C;y=Gd(x|0,y|0,43)|0;y=(u|y)^s;r=(r|C)^q;v=Dd(w|0,v|0,t|0,p|0)|0;w=C;u=Hd(t|0,p|0,17)|0;x=C;p=Gd(t|0,p|0,47)|0;p=(u|p)^v;x=(x|C)^w;q=Dd(s|0,q|0,p|0,x|0)|0;s=C;u=Hd(p|0,x|0,13)|0;t=C;x=Gd(p|0,x|0,51)|0;q=(u|x)^q;s=(t|C)^s;v=Dd(y|0,r|0,w|0,v|0)|0;w=C;t=Hd(y|0,r|0,16)|0;x=C;r=Gd(y|0,r|0,48)|0;r=(t|r)^v;x=(x|C)^w;t=Hd(r|0,x|0,21)|0;y=C;x=Gd(r|0,x|0,43)|0;y=y|C;w=Dd(v|0,w|0,q|0,s|0)|0;v=C;r=Hd(q|0,s|0,17)|0;u=C;s=Gd(q|0,s|0,47)|0;x=(r|s)^w^v^(t|x);y=(u|C)^v^w^y;a[b>>0]=x;a[b+1>>0]=x>>>8;a[b+2>>0]=x>>>16;a[b+3>>0]=x>>>24;a[b+4>>0]=y;w=Gd(x|0,y|0,40)|0;a[b+5>>0]=w;w=Gd(x|0,y|0,48)|0;a[b+6>>0]=w;y=Gd(x|0,y|0,56)|0;a[b+7>>0]=y;return 0}function yc(){return 64}function zc(){return 32}function Ac(){return 32}function Bc(){return 64}function Cc(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=i;h=i=i+63&-64;i=i+496|0;k=h;j=h+448|0;l=h+408|0;m=h+368|0;h=h+208|0;g=k+64|0;n=k;p=8;q=n+64|0;do{c[n>>2]=c[p>>2];n=n+4|0;p=p+4|0}while((n|0)<(q|0));n=k+72|0;c[n>>2]=256;c[n+4>>2]=0;n=g;c[n>>2]=0;c[n+4>>2]=0;n=k+80|0;p=f;q=n+32|0;do{a[n>>0]=a[p>>0]|0;n=n+1|0;p=p+1|0}while((n|0)<(q|0));Gb(k,e);a[e>>0]=(d[e>>0]|0)&248;q=e+31|0;a[q>>0]=(d[q>>0]|0)&63|64;Rc(h,e);Ic(j,h+80|0);Jc(l,h,j);Jc(m,h+40|0,j);Lc(b,m);Lc(k,l);q=b+31|0;a[q>>0]=(d[q>>0]|0)^(d[k>>0]|0)<<7;Jd(e|0,f|0,32)|0;Jd(e+32|0,b|0,32)|0;i=o;return 0}function Dc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=i;n=i=i+63&-64;i=i+528|0;m=n;l=n+448|0;o=n+408|0;p=n+368|0;k=n+208|0;n=n+488|0;f=0;do{a[n+f>>0]=Ba(0)|0;f=f+1|0}while((f|0)!=32);f=m+64|0;g=m;h=8;j=g+64|0;do{c[g>>2]=c[h>>2];g=g+4|0;h=h+4|0}while((g|0)<(j|0));g=m+72|0;c[g>>2]=256;c[g+4>>2]=0;g=f;c[g>>2]=0;c[g+4>>2]=0;g=m+80|0;h=n;j=g+32|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(j|0));Gb(m,e);a[e>>0]=(d[e>>0]|0)&248;g=e+31|0;a[g>>0]=(d[g>>0]|0)&63|64;Rc(k,e);Ic(l,k+80|0);Jc(o,k,l);Jc(p,k+40|0,l);Lc(b,p);Lc(m,o);g=b+31|0;a[g>>0]=(d[g>>0]|0)^(d[m>>0]|0)<<7;g=e;h=n;j=g+32|0;do{a[g>>0]=a[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(j|0));Jd(e+32|0,b|0,32)|0;i=q;return 0}function Ec(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;h=i;j=i=i+63&-64;i=i+16|0;k=a+64|0;Jd(k|0,d|0,e|0)|0;Xc(a,j,k,e,f,g);g=j;d=(b|0)!=0;if((c[g>>2]|0)==64&(c[g+4>>2]|0)==0){if(!d){k=0;i=h;return k|0}j=Dd(e|0,f|0,64,0)|0;k=b;c[k>>2]=j;c[k+4>>2]=C;k=0;i=h;return k|0}else{if(d){k=b;c[k>>2]=0;c[k+4>>2]=0}k=Dd(e|0,f|0,64,0)|0;Fd(a|0,0,k|0)|0;k=-1;i=h;return k|0}return 0}function Fc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;e=Dd(e|0,f|0,-64,-1)|0;f=C;do if(!(f>>>0>0|(f|0)==0&e>>>0>4294967231)){h=d+64|0;if(Vc(d,h,e,f,g)|0){Fd(a|0,0,e|0)|0;break}if(b){d=b;c[d>>2]=e;c[d+4>>2]=f}Jd(a|0,h|0,e|0)|0;d=0;return d|0}while(0);if(!b){d=-1;return d|0}d=b;c[d>>2]=0;c[d+4>>2]=0;d=-1;return d|0}function Gc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Xc(a,b,c,d,e,f);return 0}function Hc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Vc(a,b,c,d,e)|0}function Ic(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;g=i;c=i=i+63&-64;i=i+160|0;d=c+120|0;e=c+80|0;f=c+40|0;Kc(d,b);Kc(e,d);Kc(e,e);Jc(e,b,e);Jc(d,d,e);Kc(f,d);Jc(e,e,f);Kc(f,e);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Jc(e,f,e);Kc(f,e);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Jc(f,f,e);Kc(c,f);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Kc(c,c);Jc(f,c,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Kc(f,f);Jc(e,f,e);Kc(f,e);b=1;do{Kc(f,f);b=b+1|0}while((b|0)!=50);Jc(f,f,e);Kc(c,f);b=1;do{Kc(c,c);b=b+1|0}while((b|0)!=100);Jc(f,c,f);Kc(f,f);b=1;do{Kc(f,f);b=b+1|0}while((b|0)!=50);Jc(e,f,e);Kc(e,e);Kc(e,e);Kc(e,e);Kc(e,e);Kc(e,e);Jc(a,e,d);i=g;return}function Jc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0;l=c[b>>2]|0;s=c[b+4>>2]|0;j=c[b+8>>2]|0;Rb=c[b+12>>2]|0;e=c[b+16>>2]|0;za=c[b+20>>2]|0;ya=c[b+24>>2]|0;zb=c[b+28>>2]|0;h=c[b+32>>2]|0;ga=c[b+36>>2]|0;H=c[d>>2]|0;J=c[d+4>>2]|0;F=c[d+8>>2]|0;D=c[d+12>>2]|0;A=c[d+16>>2]|0;y=c[d+20>>2]|0;w=c[d+24>>2]|0;u=c[d+28>>2]|0;k=c[d+32>>2]|0;t=c[d+36>>2]|0;Oc=J*19|0;bc=F*19|0;rb=D*19|0;Ha=A*19|0;jc=y*19|0;Db=w*19|0;Ta=u*19|0;Sc=k*19|0;Qc=t*19|0;p=s<<1;f=Rb<<1;M=za<<1;i=zb<<1;d=ga<<1;o=((l|0)<0)<<31>>31;I=((H|0)<0)<<31>>31;Mc=Od(H|0,I|0,l|0,o|0)|0;Lc=C;K=((J|0)<0)<<31>>31;wc=Od(J|0,K|0,l|0,o|0)|0;vc=C;G=((F|0)<0)<<31>>31;ub=Od(F|0,G|0,l|0,o|0)|0;tb=C;E=((D|0)<0)<<31>>31;Ka=Od(D|0,E|0,l|0,o|0)|0;Ja=C;B=((A|0)<0)<<31>>31;mc=Od(A|0,B|0,l|0,o|0)|0;lc=C;z=((y|0)<0)<<31>>31;Gb=Od(y|0,z|0,l|0,o|0)|0;Fb=C;x=((w|0)<0)<<31>>31;Wa=Od(w|0,x|0,l|0,o|0)|0;Va=C;v=((u|0)<0)<<31>>31;ja=Od(u|0,v|0,l|0,o|0)|0;ia=C;Pc=((k|0)<0)<<31>>31;P=Od(k|0,Pc|0,l|0,o|0)|0;O=C;o=Od(t|0,((t|0)<0)<<31>>31|0,l|0,o|0)|0;l=C;t=((s|0)<0)<<31>>31;dc=Od(H|0,I|0,s|0,t|0)|0;ec=C;n=((p|0)<0)<<31>>31;yb=Od(J|0,K|0,p|0,n|0)|0;xb=C;Ma=Od(F|0,G|0,s|0,t|0)|0;La=C;oc=Od(D|0,E|0,p|0,n|0)|0;nc=C;Ib=Od(A|0,B|0,s|0,t|0)|0;Hb=C;Ya=Od(y|0,z|0,p|0,n|0)|0;Xa=C;la=Od(w|0,x|0,s|0,t|0)|0;ka=C;R=Od(u|0,v|0,p|0,n|0)|0;Q=C;t=Od(k|0,Pc|0,s|0,t|0)|0;s=C;Pc=((Qc|0)<0)<<31>>31;n=Od(Qc|0,Pc|0,p|0,n|0)|0;p=C;k=((j|0)<0)<<31>>31;wb=Od(H|0,I|0,j|0,k|0)|0;vb=C;Qa=Od(J|0,K|0,j|0,k|0)|0;Pa=C;qc=Od(F|0,G|0,j|0,k|0)|0;pc=C;Kb=Od(D|0,E|0,j|0,k|0)|0;Jb=C;_a=Od(A|0,B|0,j|0,k|0)|0;Za=C;na=Od(y|0,z|0,j|0,k|0)|0;ma=C;T=Od(w|0,x|0,j|0,k|0)|0;S=C;v=Od(u|0,v|0,j|0,k|0)|0;u=C;Rc=((Sc|0)<0)<<31>>31;yc=Od(Sc|0,Rc|0,j|0,k|0)|0;xc=C;k=Od(Qc|0,Pc|0,j|0,k|0)|0;j=C;Sb=((Rb|0)<0)<<31>>31;Oa=Od(H|0,I|0,Rb|0,Sb|0)|0;Na=C;fa=((f|0)<0)<<31>>31;uc=Od(J|0,K|0,f|0,fa|0)|0;tc=C;Mb=Od(F|0,G|0,Rb|0,Sb|0)|0;Lb=C;ab=Od(D|0,E|0,f|0,fa|0)|0;$a=C;pa=Od(A|0,B|0,Rb|0,Sb|0)|0;oa=C;V=Od(y|0,z|0,f|0,fa|0)|0;U=C;x=Od(w|0,x|0,Rb|0,Sb|0)|0;w=C;Ua=((Ta|0)<0)<<31>>31;Ac=Od(Ta|0,Ua|0,f|0,fa|0)|0;zc=C;Sb=Od(Sc|0,Rc|0,Rb|0,Sb|0)|0;Rb=C;fa=Od(Qc|0,Pc|0,f|0,fa|0)|0;f=C;N=((e|0)<0)<<31>>31;sc=Od(H|0,I|0,e|0,N|0)|0;rc=C;Qb=Od(J|0,K|0,e|0,N|0)|0;Pb=C;cb=Od(F|0,G|0,e|0,N|0)|0;bb=C;ra=Od(D|0,E|0,e|0,N|0)|0;qa=C;X=Od(A|0,B|0,e|0,N|0)|0;W=C;z=Od(y|0,z|0,e|0,N|0)|0;y=C;Eb=((Db|0)<0)<<31>>31;Cc=Od(Db|0,Eb|0,e|0,N|0)|0;Bc=C;Ub=Od(Ta|0,Ua|0,e|0,N|0)|0;Tb=C;ib=Od(Sc|0,Rc|0,e|0,N|0)|0;hb=C;N=Od(Qc|0,Pc|0,e|0,N|0)|0;e=C;Aa=((za|0)<0)<<31>>31;Ob=Od(H|0,I|0,za|0,Aa|0)|0;Nb=C;b=((M|0)<0)<<31>>31;gb=Od(J|0,K|0,M|0,b|0)|0;fb=C;ta=Od(F|0,G|0,za|0,Aa|0)|0;sa=C;Z=Od(D|0,E|0,M|0,b|0)|0;Y=C;B=Od(A|0,B|0,za|0,Aa|0)|0;A=C;kc=((jc|0)<0)<<31>>31;Ec=Od(jc|0,kc|0,M|0,b|0)|0;Dc=C;Wb=Od(Db|0,Eb|0,za|0,Aa|0)|0;Vb=C;kb=Od(Ta|0,Ua|0,M|0,b|0)|0;jb=C;Aa=Od(Sc|0,Rc|0,za|0,Aa|0)|0;za=C;b=Od(Qc|0,Pc|0,M|0,b|0)|0;M=C;g=((ya|0)<0)<<31>>31;eb=Od(H|0,I|0,ya|0,g|0)|0;db=C;xa=Od(J|0,K|0,ya|0,g|0)|0;wa=C;$=Od(F|0,G|0,ya|0,g|0)|0;_=C;E=Od(D|0,E|0,ya|0,g|0)|0;D=C;Ia=((Ha|0)<0)<<31>>31;Gc=Od(Ha|0,Ia|0,ya|0,g|0)|0;Fc=C;Yb=Od(jc|0,kc|0,ya|0,g|0)|0;Xb=C;mb=Od(Db|0,Eb|0,ya|0,g|0)|0;lb=C;Ca=Od(Ta|0,Ua|0,ya|0,g|0)|0;Ba=C;m=Od(Sc|0,Rc|0,ya|0,g|0)|0;r=C;g=Od(Qc|0,Pc|0,ya|0,g|0)|0;ya=C;Ab=((zb|0)<0)<<31>>31;va=Od(H|0,I|0,zb|0,Ab|0)|0;ua=C;ea=((i|0)<0)<<31>>31;da=Od(J|0,K|0,i|0,ea|0)|0;ca=C;G=Od(F|0,G|0,zb|0,Ab|0)|0;F=C;sb=((rb|0)<0)<<31>>31;Ic=Od(rb|0,sb|0,i|0,ea|0)|0;Hc=C;_b=Od(Ha|0,Ia|0,zb|0,Ab|0)|0;Zb=C;ob=Od(jc|0,kc|0,i|0,ea|0)|0;nb=C;Ea=Od(Db|0,Eb|0,zb|0,Ab|0)|0;Da=C;gc=Od(Ta|0,Ua|0,i|0,ea|0)|0;fc=C;Ab=Od(Sc|0,Rc|0,zb|0,Ab|0)|0;zb=C;ea=Od(Qc|0,Pc|0,i|0,ea|0)|0;i=C;L=((h|0)<0)<<31>>31;ba=Od(H|0,I|0,h|0,L|0)|0;aa=C;K=Od(J|0,K|0,h|0,L|0)|0;J=C;cc=((bc|0)<0)<<31>>31;Kc=Od(bc|0,cc|0,h|0,L|0)|0;Jc=C;ac=Od(rb|0,sb|0,h|0,L|0)|0;$b=C;qb=Od(Ha|0,Ia|0,h|0,L|0)|0;pb=C;Ga=Od(jc|0,kc|0,h|0,L|0)|0;Fa=C;ic=Od(Db|0,Eb|0,h|0,L|0)|0;hc=C;Cb=Od(Ta|0,Ua|0,h|0,L|0)|0;Bb=C;Sa=Od(Sc|0,Rc|0,h|0,L|0)|0;Ra=C;L=Od(Qc|0,Pc|0,h|0,L|0)|0;h=C;ha=((ga|0)<0)<<31>>31;I=Od(H|0,I|0,ga|0,ha|0)|0;H=C;q=((d|0)<0)<<31>>31;Oc=Od(Oc|0,((Oc|0)<0)<<31>>31|0,d|0,q|0)|0;Nc=C;cc=Od(bc|0,cc|0,ga|0,ha|0)|0;bc=C;sb=Od(rb|0,sb|0,d|0,q|0)|0;rb=C;Ia=Od(Ha|0,Ia|0,ga|0,ha|0)|0;Ha=C;kc=Od(jc|0,kc|0,d|0,q|0)|0;jc=C;Eb=Od(Db|0,Eb|0,ga|0,ha|0)|0;Db=C;Ua=Od(Ta|0,Ua|0,d|0,q|0)|0;Ta=C;ha=Od(Sc|0,Rc|0,ga|0,ha|0)|0;ga=C;q=Od(Qc|0,Pc|0,d|0,q|0)|0;d=C;Lc=Dd(Oc|0,Nc|0,Mc|0,Lc|0)|0;Jc=Dd(Lc|0,C|0,Kc|0,Jc|0)|0;Hc=Dd(Jc|0,C|0,Ic|0,Hc|0)|0;Fc=Dd(Hc|0,C|0,Gc|0,Fc|0)|0;Dc=Dd(Fc|0,C|0,Ec|0,Dc|0)|0;Bc=Dd(Dc|0,C|0,Cc|0,Bc|0)|0;zc=Dd(Bc|0,C|0,Ac|0,zc|0)|0;xc=Dd(zc|0,C|0,yc|0,xc|0)|0;p=Dd(xc|0,C|0,n|0,p|0)|0;n=C;ec=Dd(wc|0,vc|0,dc|0,ec|0)|0;dc=C;rc=Dd(uc|0,tc|0,sc|0,rc|0)|0;pc=Dd(rc|0,C|0,qc|0,pc|0)|0;nc=Dd(pc|0,C|0,oc|0,nc|0)|0;lc=Dd(nc|0,C|0,mc|0,lc|0)|0;jc=Dd(lc|0,C|0,kc|0,jc|0)|0;hc=Dd(jc|0,C|0,ic|0,hc|0)|0;fc=Dd(hc|0,C|0,gc|0,fc|0)|0;r=Dd(fc|0,C|0,m|0,r|0)|0;M=Dd(r|0,C|0,b|0,M|0)|0;b=C;r=Dd(p|0,n|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;m=C;bc=Dd(ec|0,dc|0,cc|0,bc|0)|0;$b=Dd(bc|0,C|0,ac|0,$b|0)|0;Zb=Dd($b|0,C|0,_b|0,Zb|0)|0;Xb=Dd(Zb|0,C|0,Yb|0,Xb|0)|0;Vb=Dd(Xb|0,C|0,Wb|0,Vb|0)|0;Tb=Dd(Vb|0,C|0,Ub|0,Tb|0)|0;Rb=Dd(Tb|0,C|0,Sb|0,Rb|0)|0;j=Dd(Rb|0,C|0,k|0,j|0)|0;j=Dd(j|0,C|0,r|0,m|0)|0;k=C;m=Hd(r|0,m|0,26)|0;m=Cd(p|0,n|0,m|0,C|0)|0;n=C;p=Dd(M|0,b|0,33554432,0)|0;p=Ed(p|0,C|0,26)|0;r=C;Nb=Dd(Qb|0,Pb|0,Ob|0,Nb|0)|0;Lb=Dd(Nb|0,C|0,Mb|0,Lb|0)|0;Jb=Dd(Lb|0,C|0,Kb|0,Jb|0)|0;Hb=Dd(Jb|0,C|0,Ib|0,Hb|0)|0;Fb=Dd(Hb|0,C|0,Gb|0,Fb|0)|0;Db=Dd(Fb|0,C|0,Eb|0,Db|0)|0;Bb=Dd(Db|0,C|0,Cb|0,Bb|0)|0;zb=Dd(Bb|0,C|0,Ab|0,zb|0)|0;ya=Dd(zb|0,C|0,g|0,ya|0)|0;ya=Dd(ya|0,C|0,p|0,r|0)|0;g=C;r=Hd(p|0,r|0,26)|0;r=Cd(M|0,b|0,r|0,C|0)|0;b=C;M=Dd(j|0,k|0,16777216,0)|0;M=Ed(M|0,C|0,25)|0;p=C;vb=Dd(yb|0,xb|0,wb|0,vb|0)|0;tb=Dd(vb|0,C|0,ub|0,tb|0)|0;rb=Dd(tb|0,C|0,sb|0,rb|0)|0;pb=Dd(rb|0,C|0,qb|0,pb|0)|0;nb=Dd(pb|0,C|0,ob|0,nb|0)|0;lb=Dd(nb|0,C|0,mb|0,lb|0)|0;jb=Dd(lb|0,C|0,kb|0,jb|0)|0;hb=Dd(jb|0,C|0,ib|0,hb|0)|0;f=Dd(hb|0,C|0,fa|0,f|0)|0;f=Dd(f|0,C|0,M|0,p|0)|0;fa=C;p=Hd(M|0,p|0,25)|0;p=Cd(j|0,k|0,p|0,C|0)|0;k=C;j=Dd(ya|0,g|0,16777216,0)|0;j=Ed(j|0,C|0,25)|0;M=C;db=Dd(gb|0,fb|0,eb|0,db|0)|0;bb=Dd(db|0,C|0,cb|0,bb|0)|0;$a=Dd(bb|0,C|0,ab|0,$a|0)|0;Za=Dd($a|0,C|0,_a|0,Za|0)|0;Xa=Dd(Za|0,C|0,Ya|0,Xa|0)|0;Va=Dd(Xa|0,C|0,Wa|0,Va|0)|0;Ta=Dd(Va|0,C|0,Ua|0,Ta|0)|0;Ra=Dd(Ta|0,C|0,Sa|0,Ra|0)|0;i=Dd(Ra|0,C|0,ea|0,i|0)|0;i=Dd(i|0,C|0,j|0,M|0)|0;ea=C;M=Hd(j|0,M|0,25)|0;M=Cd(ya|0,g|0,M|0,C|0)|0;g=C;ya=Dd(f|0,fa|0,33554432,0)|0;ya=Ed(ya|0,C|0,26)|0;j=C;Na=Dd(Qa|0,Pa|0,Oa|0,Na|0)|0;La=Dd(Na|0,C|0,Ma|0,La|0)|0;Ja=Dd(La|0,C|0,Ka|0,Ja|0)|0;Ha=Dd(Ja|0,C|0,Ia|0,Ha|0)|0;Fa=Dd(Ha|0,C|0,Ga|0,Fa|0)|0;Da=Dd(Fa|0,C|0,Ea|0,Da|0)|0;Ba=Dd(Da|0,C|0,Ca|0,Ba|0)|0;za=Dd(Ba|0,C|0,Aa|0,za|0)|0;e=Dd(za|0,C|0,N|0,e|0)|0;e=Dd(e|0,C|0,ya|0,j|0)|0;N=C;j=Hd(ya|0,j|0,26)|0;j=Cd(f|0,fa|0,j|0,C|0)|0;fa=Dd(i|0,ea|0,33554432,0)|0;fa=Ed(fa|0,C|0,26)|0;f=C;ua=Dd(xa|0,wa|0,va|0,ua|0)|0;sa=Dd(ua|0,C|0,ta|0,sa|0)|0;qa=Dd(sa|0,C|0,ra|0,qa|0)|0;oa=Dd(qa|0,C|0,pa|0,oa|0)|0;ma=Dd(oa|0,C|0,na|0,ma|0)|0;ka=Dd(ma|0,C|0,la|0,ka|0)|0;ia=Dd(ka|0,C|0,ja|0,ia|0)|0;ga=Dd(ia|0,C|0,ha|0,ga|0)|0;h=Dd(ga|0,C|0,L|0,h|0)|0;h=Dd(h|0,C|0,fa|0,f|0)|0;L=C;f=Hd(fa|0,f|0,26)|0;f=Cd(i|0,ea|0,f|0,C|0)|0;ea=Dd(e|0,N|0,16777216,0)|0;ea=Ed(ea|0,C|0,25)|0;i=C;b=Dd(ea|0,i|0,r|0,b|0)|0;r=C;i=Hd(ea|0,i|0,25)|0;i=Cd(e|0,N|0,i|0,C|0)|0;N=Dd(h|0,L|0,16777216,0)|0;N=Ed(N|0,C|0,25)|0;e=C;aa=Dd(da|0,ca|0,ba|0,aa|0)|0;_=Dd(aa|0,C|0,$|0,_|0)|0;Y=Dd(_|0,C|0,Z|0,Y|0)|0;W=Dd(Y|0,C|0,X|0,W|0)|0;U=Dd(W|0,C|0,V|0,U|0)|0;S=Dd(U|0,C|0,T|0,S|0)|0;Q=Dd(S|0,C|0,R|0,Q|0)|0;O=Dd(Q|0,C|0,P|0,O|0)|0;d=Dd(O|0,C|0,q|0,d|0)|0;d=Dd(d|0,C|0,N|0,e|0)|0;q=C;e=Hd(N|0,e|0,25)|0;e=Cd(h|0,L|0,e|0,C|0)|0;L=Dd(b|0,r|0,33554432,0)|0;L=Ed(L|0,C|0,26)|0;h=C;g=Dd(M|0,g|0,L|0,h|0)|0;h=Hd(L|0,h|0,26)|0;h=Cd(b|0,r|0,h|0,C|0)|0;r=Dd(d|0,q|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;b=C;H=Dd(K|0,J|0,I|0,H|0)|0;F=Dd(H|0,C|0,G|0,F|0)|0;D=Dd(F|0,C|0,E|0,D|0)|0;A=Dd(D|0,C|0,B|0,A|0)|0;y=Dd(A|0,C|0,z|0,y|0)|0;w=Dd(y|0,C|0,x|0,w|0)|0;u=Dd(w|0,C|0,v|0,u|0)|0;s=Dd(u|0,C|0,t|0,s|0)|0;l=Dd(s|0,C|0,o|0,l|0)|0;l=Dd(l|0,C|0,r|0,b|0)|0;o=C;b=Hd(r|0,b|0,26)|0;b=Cd(d|0,q|0,b|0,C|0)|0;q=Dd(l|0,o|0,16777216,0)|0;q=Ed(q|0,C|0,25)|0;d=C;r=Od(q|0,d|0,19,0)|0;n=Dd(r|0,C|0,m|0,n|0)|0;m=C;d=Hd(q|0,d|0,25)|0;d=Cd(l|0,o|0,d|0,C|0)|0;o=Dd(n|0,m|0,33554432,0)|0;o=Ed(o|0,C|0,26)|0;l=C;k=Dd(p|0,k|0,o|0,l|0)|0;l=Hd(o|0,l|0,26)|0;l=Cd(n|0,m|0,l|0,C|0)|0;c[a>>2]=l;c[a+4>>2]=k;c[a+8>>2]=j;c[a+12>>2]=i;c[a+16>>2]=h;c[a+20>>2]=g;c[a+24>>2]=f;c[a+28>>2]=e;c[a+32>>2]=b;c[a+36>>2]=d;return}function Kc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0;bb=c[b>>2]|0;ua=c[b+4>>2]|0;j=c[b+8>>2]|0;la=c[b+12>>2]|0;e=c[b+16>>2]|0;db=c[b+20>>2]|0;Y=c[b+24>>2]|0;La=c[b+28>>2]|0;h=c[b+32>>2]|0;b=c[b+36>>2]|0;l=bb<<1;p=ua<<1;Xa=j<<1;f=la<<1;na=e<<1;B=db<<1;m=Y<<1;i=La<<1;Ka=db*38|0;ra=Y*19|0;va=La*38|0;da=h*19|0;gb=b*38|0;cb=((bb|0)<0)<<31>>31;cb=Od(bb|0,cb|0,bb|0,cb|0)|0;bb=C;o=((l|0)<0)<<31>>31;ta=((ua|0)<0)<<31>>31;Ia=Od(l|0,o|0,ua|0,ta|0)|0;Ha=C;k=((j|0)<0)<<31>>31;Wa=Od(j|0,k|0,l|0,o|0)|0;Va=C;ma=((la|0)<0)<<31>>31;Ua=Od(la|0,ma|0,l|0,o|0)|0;Ta=C;D=((e|0)<0)<<31>>31;Oa=Od(e|0,D|0,l|0,o|0)|0;Na=C;eb=((db|0)<0)<<31>>31;ya=Od(db|0,eb|0,l|0,o|0)|0;xa=C;g=((Y|0)<0)<<31>>31;ga=Od(Y|0,g|0,l|0,o|0)|0;fa=C;Ma=((La|0)<0)<<31>>31;R=Od(La|0,Ma|0,l|0,o|0)|0;Q=C;A=((h|0)<0)<<31>>31;F=Od(h|0,A|0,l|0,o|0)|0;E=C;q=((b|0)<0)<<31>>31;o=Od(b|0,q|0,l|0,o|0)|0;l=C;n=((p|0)<0)<<31>>31;ta=Od(p|0,n|0,ua|0,ta|0)|0;ua=C;ba=Od(p|0,n|0,j|0,k|0)|0;ca=C;P=((f|0)<0)<<31>>31;Sa=Od(f|0,P|0,p|0,n|0)|0;Ra=C;Ca=Od(e|0,D|0,p|0,n|0)|0;Ba=C;d=((B|0)<0)<<31>>31;ia=Od(B|0,d|0,p|0,n|0)|0;ha=C;T=Od(Y|0,g|0,p|0,n|0)|0;S=C;O=((i|0)<0)<<31>>31;H=Od(i|0,O|0,p|0,n|0)|0;G=C;t=Od(h|0,A|0,p|0,n|0)|0;s=C;fb=((gb|0)<0)<<31>>31;n=Od(gb|0,fb|0,p|0,n|0)|0;p=C;Qa=Od(j|0,k|0,j|0,k|0)|0;Pa=C;Ya=((Xa|0)<0)<<31>>31;Aa=Od(Xa|0,Ya|0,la|0,ma|0)|0;za=C;ka=Od(e|0,D|0,Xa|0,Ya|0)|0;ja=C;X=Od(db|0,eb|0,Xa|0,Ya|0)|0;W=C;N=Od(Y|0,g|0,Xa|0,Ya|0)|0;M=C;v=Od(La|0,Ma|0,Xa|0,Ya|0)|0;u=C;ea=((da|0)<0)<<31>>31;Ya=Od(da|0,ea|0,Xa|0,Ya|0)|0;Xa=C;k=Od(gb|0,fb|0,j|0,k|0)|0;j=C;ma=Od(f|0,P|0,la|0,ma|0)|0;la=C;V=Od(f|0,P|0,e|0,D|0)|0;U=C;J=Od(B|0,d|0,f|0,P|0)|0;I=C;z=Od(Y|0,g|0,f|0,P|0)|0;y=C;wa=((va|0)<0)<<31>>31;_a=Od(va|0,wa|0,f|0,P|0)|0;Za=C;Ea=Od(da|0,ea|0,f|0,P|0)|0;Da=C;P=Od(gb|0,fb|0,f|0,P|0)|0;f=C;L=Od(e|0,D|0,e|0,D|0)|0;K=C;oa=((na|0)<0)<<31>>31;x=Od(na|0,oa|0,db|0,eb|0)|0;w=C;sa=((ra|0)<0)<<31>>31;ab=Od(ra|0,sa|0,na|0,oa|0)|0;$a=C;Ga=Od(va|0,wa|0,e|0,D|0)|0;Fa=C;oa=Od(da|0,ea|0,na|0,oa|0)|0;na=C;D=Od(gb|0,fb|0,e|0,D|0)|0;e=C;eb=Od(Ka|0,((Ka|0)<0)<<31>>31|0,db|0,eb|0)|0;db=C;Ka=Od(ra|0,sa|0,B|0,d|0)|0;Ja=C;qa=Od(va|0,wa|0,B|0,d|0)|0;pa=C;_=Od(da|0,ea|0,B|0,d|0)|0;Z=C;d=Od(gb|0,fb|0,B|0,d|0)|0;B=C;sa=Od(ra|0,sa|0,Y|0,g|0)|0;ra=C;aa=Od(va|0,wa|0,Y|0,g|0)|0;$=C;m=Od(da|0,ea|0,m|0,((m|0)<0)<<31>>31|0)|0;r=C;g=Od(gb|0,fb|0,Y|0,g|0)|0;Y=C;Ma=Od(va|0,wa|0,La|0,Ma|0)|0;La=C;wa=Od(da|0,ea|0,i|0,O|0)|0;va=C;O=Od(gb|0,fb|0,i|0,O|0)|0;i=C;ea=Od(da|0,ea|0,h|0,A|0)|0;da=C;A=Od(gb|0,fb|0,h|0,A|0)|0;h=C;q=Od(gb|0,fb|0,b|0,q|0)|0;b=C;bb=Dd(eb|0,db|0,cb|0,bb|0)|0;$a=Dd(bb|0,C|0,ab|0,$a|0)|0;Za=Dd($a|0,C|0,_a|0,Za|0)|0;Xa=Dd(Za|0,C|0,Ya|0,Xa|0)|0;p=Dd(Xa|0,C|0,n|0,p|0)|0;n=C;ua=Dd(Wa|0,Va|0,ta|0,ua|0)|0;ta=C;ca=Dd(Ua|0,Ta|0,ba|0,ca|0)|0;ba=C;Pa=Dd(Sa|0,Ra|0,Qa|0,Pa|0)|0;Na=Dd(Pa|0,C|0,Oa|0,Na|0)|0;La=Dd(Na|0,C|0,Ma|0,La|0)|0;r=Dd(La|0,C|0,m|0,r|0)|0;B=Dd(r|0,C|0,d|0,B|0)|0;d=C;r=Dd(p|0,n|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;m=C;Ha=Dd(Ka|0,Ja|0,Ia|0,Ha|0)|0;Fa=Dd(Ha|0,C|0,Ga|0,Fa|0)|0;Da=Dd(Fa|0,C|0,Ea|0,Da|0)|0;j=Dd(Da|0,C|0,k|0,j|0)|0;j=Dd(j|0,C|0,r|0,m|0)|0;k=C;m=Hd(r|0,m|0,26)|0;m=Cd(p|0,n|0,m|0,C|0)|0;n=C;p=Dd(B|0,d|0,33554432,0)|0;p=Ed(p|0,C|0,26)|0;r=C;za=Dd(Ca|0,Ba|0,Aa|0,za|0)|0;xa=Dd(za|0,C|0,ya|0,xa|0)|0;va=Dd(xa|0,C|0,wa|0,va|0)|0;Y=Dd(va|0,C|0,g|0,Y|0)|0;Y=Dd(Y|0,C|0,p|0,r|0)|0;g=C;r=Hd(p|0,r|0,26)|0;r=Cd(B|0,d|0,r|0,C|0)|0;d=C;B=Dd(j|0,k|0,16777216,0)|0;B=Ed(B|0,C|0,25)|0;p=C;ra=Dd(ua|0,ta|0,sa|0,ra|0)|0;pa=Dd(ra|0,C|0,qa|0,pa|0)|0;na=Dd(pa|0,C|0,oa|0,na|0)|0;f=Dd(na|0,C|0,P|0,f|0)|0;f=Dd(f|0,C|0,B|0,p|0)|0;P=C;p=Hd(B|0,p|0,25)|0;p=Cd(j|0,k|0,p|0,C|0)|0;k=C;j=Dd(Y|0,g|0,16777216,0)|0;j=Ed(j|0,C|0,25)|0;B=C;ja=Dd(ma|0,la|0,ka|0,ja|0)|0;ha=Dd(ja|0,C|0,ia|0,ha|0)|0;fa=Dd(ha|0,C|0,ga|0,fa|0)|0;da=Dd(fa|0,C|0,ea|0,da|0)|0;i=Dd(da|0,C|0,O|0,i|0)|0;i=Dd(i|0,C|0,j|0,B|0)|0;O=C;B=Hd(j|0,B|0,25)|0;B=Cd(Y|0,g|0,B|0,C|0)|0;g=C;Y=Dd(f|0,P|0,33554432,0)|0;Y=Ed(Y|0,C|0,26)|0;j=C;$=Dd(ca|0,ba|0,aa|0,$|0)|0;Z=Dd($|0,C|0,_|0,Z|0)|0;e=Dd(Z|0,C|0,D|0,e|0)|0;e=Dd(e|0,C|0,Y|0,j|0)|0;D=C;j=Hd(Y|0,j|0,26)|0;j=Cd(f|0,P|0,j|0,C|0)|0;P=Dd(i|0,O|0,33554432,0)|0;P=Ed(P|0,C|0,26)|0;f=C;U=Dd(X|0,W|0,V|0,U|0)|0;S=Dd(U|0,C|0,T|0,S|0)|0;Q=Dd(S|0,C|0,R|0,Q|0)|0;h=Dd(Q|0,C|0,A|0,h|0)|0;h=Dd(h|0,C|0,P|0,f|0)|0;A=C;f=Hd(P|0,f|0,26)|0;f=Cd(i|0,O|0,f|0,C|0)|0;O=Dd(e|0,D|0,16777216,0)|0;O=Ed(O|0,C|0,25)|0;i=C;d=Dd(O|0,i|0,r|0,d|0)|0;r=C;i=Hd(O|0,i|0,25)|0;i=Cd(e|0,D|0,i|0,C|0)|0;D=Dd(h|0,A|0,16777216,0)|0;D=Ed(D|0,C|0,25)|0;e=C;K=Dd(N|0,M|0,L|0,K|0)|0;I=Dd(K|0,C|0,J|0,I|0)|0;G=Dd(I|0,C|0,H|0,G|0)|0;E=Dd(G|0,C|0,F|0,E|0)|0;b=Dd(E|0,C|0,q|0,b|0)|0;b=Dd(b|0,C|0,D|0,e|0)|0;q=C;e=Hd(D|0,e|0,25)|0;e=Cd(h|0,A|0,e|0,C|0)|0;A=Dd(d|0,r|0,33554432,0)|0;A=Ed(A|0,C|0,26)|0;h=C;g=Dd(B|0,g|0,A|0,h|0)|0;h=Hd(A|0,h|0,26)|0;h=Cd(d|0,r|0,h|0,C|0)|0;r=Dd(b|0,q|0,33554432,0)|0;r=Ed(r|0,C|0,26)|0;d=C;w=Dd(z|0,y|0,x|0,w|0)|0;u=Dd(w|0,C|0,v|0,u|0)|0;s=Dd(u|0,C|0,t|0,s|0)|0;l=Dd(s|0,C|0,o|0,l|0)|0;l=Dd(l|0,C|0,r|0,d|0)|0;o=C;d=Hd(r|0,d|0,26)|0;d=Cd(b|0,q|0,d|0,C|0)|0;q=Dd(l|0,o|0,16777216,0)|0;q=Ed(q|0,C|0,25)|0;b=C;r=Od(q|0,b|0,19,0)|0;n=Dd(r|0,C|0,m|0,n|0)|0;m=C;b=Hd(q|0,b|0,25)|0;b=Cd(l|0,o|0,b|0,C|0)|0;o=Dd(n|0,m|0,33554432,0)|0;o=Ed(o|0,C|0,26)|0;l=C;k=Dd(p|0,k|0,o|0,l|0)|0;l=Hd(o|0,l|0,26)|0;l=Cd(n|0,m|0,l|0,C|0)|0;c[a>>2]=l;c[a+4>>2]=k;c[a+8>>2]=j;c[a+12>>2]=i;c[a+16>>2]=h;c[a+20>>2]=g;c[a+24>>2]=f;c[a+28>>2]=e;c[a+32>>2]=d;c[a+36>>2]=b;return}function Lc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=c[d>>2]|0;l=c[d+4>>2]|0;k=c[d+8>>2]|0;j=c[d+12>>2]|0;i=c[d+16>>2]|0;h=c[d+20>>2]|0;g=c[d+24>>2]|0;f=c[d+28>>2]|0;o=c[d+32>>2]|0;e=c[d+36>>2]|0;m=(((((((((((((e*19|0)+16777216>>25)+m>>26)+l>>25)+k>>26)+j>>25)+i>>26)+h>>25)+g>>26)+f>>25)+o>>26)+e>>25)*19|0)+m|0;n=m>>26;l=n+l|0;n=m-(n<<26)|0;m=l>>25;k=m+k|0;m=l-(m<<25)|0;l=k>>26;j=l+j|0;l=k-(l<<26)|0;k=j>>25;i=k+i|0;k=j-(k<<25)|0;j=i>>26;h=j+h|0;j=i-(j<<26)|0;i=h>>25;g=i+g|0;i=h-(i<<25)|0;h=g>>26;f=h+f|0;h=g-(h<<26)|0;g=f>>25;d=g+o|0;g=f-(g<<25)|0;f=d>>26;e=f+e|0;f=d-(f<<26)|0;d=e&33554431;a[b>>0]=n;a[b+1>>0]=n>>>8;a[b+2>>0]=n>>>16;a[b+3>>0]=m<<2|n>>>24;a[b+4>>0]=m>>>6;a[b+5>>0]=m>>>14;a[b+6>>0]=l<<3|m>>>22;a[b+7>>0]=l>>>5;a[b+8>>0]=l>>>13;a[b+9>>0]=k<<5|l>>>21;a[b+10>>0]=k>>>3;a[b+11>>0]=k>>>11;a[b+12>>0]=j<<6|k>>>19;a[b+13>>0]=j>>>2;a[b+14>>0]=j>>>10;a[b+15>>0]=j>>>18;a[b+16>>0]=i;a[b+17>>0]=i>>>8;a[b+18>>0]=i>>>16;a[b+19>>0]=h<<1|i>>>24;a[b+20>>0]=h>>>7;a[b+21>>0]=h>>>15;a[b+22>>0]=g<<3|h>>>23;a[b+23>>0]=g>>>5;a[b+24>>0]=g>>>13;a[b+25>>0]=f<<4|g>>>21;a[b+26>>0]=f>>>4;a[b+27>>0]=f>>>12;a[b+28>>0]=f>>>20|d<<6;a[b+29>>0]=e>>>2;a[b+30>>0]=e>>>10;a[b+31>>0]=d>>>18;return}function Mc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;V=b+40|0;j=b+44|0;m=b+48|0;p=b+52|0;s=b+56|0;v=b+60|0;y=b+64|0;B=b+68|0;E=b+72|0;C=b+76|0;S=b+4|0;P=b+8|0;e=b+12|0;l=b+16|0;n=b+20|0;u=b+24|0;w=b+28|0;D=b+32|0;O=b+36|0;ga=(c[S>>2]|0)+(c[j>>2]|0)|0;fa=(c[P>>2]|0)+(c[m>>2]|0)|0;ea=(c[e>>2]|0)+(c[p>>2]|0)|0;da=(c[l>>2]|0)+(c[s>>2]|0)|0;ca=(c[n>>2]|0)+(c[v>>2]|0)|0;ba=(c[u>>2]|0)+(c[y>>2]|0)|0;aa=(c[w>>2]|0)+(c[B>>2]|0)|0;$=(c[D>>2]|0)+(c[E>>2]|0)|0;Y=(c[O>>2]|0)+(c[C>>2]|0)|0;c[a>>2]=(c[b>>2]|0)+(c[V>>2]|0);ha=a+4|0;c[ha>>2]=ga;ga=a+8|0;c[ga>>2]=fa;fa=a+12|0;c[fa>>2]=ea;ea=a+16|0;c[ea>>2]=da;da=a+20|0;c[da>>2]=ca;ca=a+24|0;c[ca>>2]=ba;ba=a+28|0;c[ba>>2]=aa;aa=a+32|0;c[aa>>2]=$;$=a+36|0;c[$>>2]=Y;Y=a+40|0;S=(c[j>>2]|0)-(c[S>>2]|0)|0;P=(c[m>>2]|0)-(c[P>>2]|0)|0;e=(c[p>>2]|0)-(c[e>>2]|0)|0;l=(c[s>>2]|0)-(c[l>>2]|0)|0;n=(c[v>>2]|0)-(c[n>>2]|0)|0;u=(c[y>>2]|0)-(c[u>>2]|0)|0;w=(c[B>>2]|0)-(c[w>>2]|0)|0;D=(c[E>>2]|0)-(c[D>>2]|0)|0;O=(c[C>>2]|0)-(c[O>>2]|0)|0;c[Y>>2]=(c[V>>2]|0)-(c[b>>2]|0);V=a+44|0;c[V>>2]=S;S=a+48|0;c[S>>2]=P;P=a+52|0;c[P>>2]=e;e=a+56|0;c[e>>2]=l;l=a+60|0;c[l>>2]=n;n=a+64|0;c[n>>2]=u;u=a+68|0;c[u>>2]=w;w=a+72|0;c[w>>2]=D;D=a+76|0;c[D>>2]=O;O=a+80|0;Jc(O,a,d);Jc(Y,Y,d+40|0);C=a+120|0;Jc(C,d+120|0,b+120|0);Jc(a,b+80|0,d+80|0);E=c[a>>2]<<1;B=c[ha>>2]<<1;y=c[ga>>2]<<1;v=c[fa>>2]<<1;s=c[ea>>2]<<1;p=c[da>>2]<<1;m=c[ca>>2]<<1;j=c[ba>>2]<<1;g=c[aa>>2]<<1;b=c[$>>2]<<1;Z=c[O>>2]|0;N=a+84|0;W=c[N>>2]|0;M=a+88|0;T=c[M>>2]|0;L=a+92|0;Q=c[L>>2]|0;K=a+96|0;f=c[K>>2]|0;J=a+100|0;h=c[J>>2]|0;I=a+104|0;o=c[I>>2]|0;H=a+108|0;q=c[H>>2]|0;G=a+112|0;x=c[G>>2]|0;F=a+116|0;z=c[F>>2]|0;_=c[Y>>2]|0;X=c[V>>2]|0;U=c[S>>2]|0;R=c[P>>2]|0;d=c[e>>2]|0;i=c[l>>2]|0;k=c[n>>2]|0;r=c[u>>2]|0;t=c[w>>2]|0;A=c[D>>2]|0;c[a>>2]=Z-_;c[ha>>2]=W-X;c[ga>>2]=T-U;c[fa>>2]=Q-R;c[ea>>2]=f-d;c[da>>2]=h-i;c[ca>>2]=o-k;c[ba>>2]=q-r;c[aa>>2]=x-t;c[$>>2]=z-A;c[Y>>2]=_+Z;c[V>>2]=X+W;c[S>>2]=U+T;c[P>>2]=R+Q;c[e>>2]=d+f;c[l>>2]=i+h;c[n>>2]=k+o;c[u>>2]=r+q;c[w>>2]=t+x;c[D>>2]=A+z;D=c[C>>2]|0;z=a+124|0;A=c[z>>2]|0;w=a+128|0;x=c[w>>2]|0;t=a+132|0;u=c[t>>2]|0;q=a+136|0;r=c[q>>2]|0;n=a+140|0;o=c[n>>2]|0;k=a+144|0;l=c[k>>2]|0;h=a+148|0;i=c[h>>2]|0;e=a+152|0;f=c[e>>2]|0;a=a+156|0;d=c[a>>2]|0;c[O>>2]=D+E;c[N>>2]=A+B;c[M>>2]=x+y;c[L>>2]=u+v;c[K>>2]=r+s;c[J>>2]=o+p;c[I>>2]=l+m;c[H>>2]=i+j;c[G>>2]=f+g;c[F>>2]=d+b;c[C>>2]=E-D;c[z>>2]=B-A;c[w>>2]=y-x;c[t>>2]=v-u;c[q>>2]=s-r;c[n>>2]=p-o;c[k>>2]=m-l;c[h>>2]=j-i;c[e>>2]=g-f;c[a>>2]=b-d;return} function Ha(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+15&-16;return b|0}function Ia(){return i|0}function Ja(a){a=a|0;i=a}function Ka(a,b){a=a|0;b=b|0;i=a;j=b}function La(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function Ma(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0]}function Na(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0];a[k+4>>0]=a[b+4>>0];a[k+5>>0]=a[b+5>>0];a[k+6>>0]=a[b+6>>0];a[k+7>>0]=a[b+7>>0]}function Oa(a){a=a|0;C=a}function Pa(){return C|0}function Qa(){return 32}function Ra(){return 32}function Sa(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ua(a,b,c,d,e);return 0}function Ta(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=i;i=i+32|0;g=h;Ua(g,c,d,e,f);d=Yc(b,g)|0;e=(g|0)==(b|0);c=0;f=0;do{c=a[b+f>>0]^a[g+f>>0]|c;f=f+1|0}while((f|0)!=32);i=h;return (e?-1:d)|(((c&255)+511|0)>>>8&1)+-1|0}function Ua(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=i;i=i+608|0;r=s+480|0;o=s+416|0;n=s;j=n+64|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;h=n;k=8;l=h+64|0;do{c[h>>2]=c[k>>2];h=h+4|0;k=k+4|0}while((h|0)<(l|0));h=r;l=h+128|0;do{a[h>>0]=54;h=h+1|0}while((h|0)<(l|0));a[r>>0]=a[g>>0]^54;h=1;do{q=r+h|0;a[q>>0]=a[q>>0]^a[g+h>>0];h=h+1|0}while((h|0)!=32);h=n+72|0;c[h>>2]=1024;c[h+4>>2]=0;c[j>>2]=0;c[j+4>>2]=0;j=n+80|0;h=j;k=r;l=h+128|0;do{a[h>>0]=a[k>>0]|0;h=h+1|0;k=k+1|0}while((h|0)<(l|0));Hb(n,j);j=a[g>>0]|0;q=n+208|0;m=n+272|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;h=q;k=8;l=h+64|0;do{c[h>>2]=c[k>>2];h=h+4|0;k=k+4|0}while((h|0)<(l|0));h=r;l=h+128|0;do{a[h>>0]=92;h=h+1|0}while((h|0)<(l|0));a[r>>0]=j^92;h=1;do{p=r+h|0;a[p>>0]=a[p>>0]^a[g+h>>0];h=h+1|0}while((h|0)!=32);j=n+280|0;p=j;c[p>>2]=1024;c[p+4>>2]=0;p=m;c[p>>2]=0;c[p+4>>2]=0;p=n+288|0;h=p;k=r;l=h+128|0;do{a[h>>0]=a[k>>0]|0;h=h+1|0;k=k+1|0}while((h|0)<(l|0));Hb(q,p);Fb(n,d,e,f);Gb(n,o);f=j;d=c[f>>2]|0;f=c[f+4>>2]|0;k=Gd(d|0,f|0,3)|0;k=k&127;h=Dd(d|0,f|0,512,0)|0;c[j>>2]=h;c[j+4>>2]=C;j=m;h=c[j>>2]|0;j=c[j+4>>2]|0;if(f>>>0>4294967295|(f|0)==-1&d>>>0>4294966783){h=Dd(h|0,j|0,1,0)|0;j=C;d=m;c[d>>2]=h;c[d+4>>2]=j}g=m;c[g>>2]=h;c[g+4>>2]=j;j=Cd(128,0,k|0,0)|0;g=C;h=n+288+k|0;if(g>>>0>0|(g|0)==0&j>>>0>64){k=o;l=h+64|0;do{a[h>>0]=a[k>>0]|0;h=h+1|0;k=k+1|0}while((h|0)<(l|0));Gb(q,r);h=b;k=r;l=h+32|0;do{a[h>>0]=a[k>>0]|0;h=h+1|0;k=k+1|0}while((h|0)<(l|0));i=s;return}Id(h|0,o|0,j|0)|0;Hb(q,p);h=o+j|0;j=Cd(64,0,j|0,g|0)|0;g=C;if(g>>>0>0|(g|0)==0&j>>>0>127)do{Hb(q,h);h=h+128|0;j=Dd(j|0,g|0,-128,-1)|0;g=C}while(g>>>0>0|(g|0)==0&j>>>0>127);Id(p|0,h|0,j|0)|0;Gb(q,r);h=b;k=r;l=h+32|0;do{a[h>>0]=a[k>>0]|0;h=h+1|0;k=k+1|0}while((h|0)<(l|0));i=s;return}function Va(){return 32}function Wa(){return 32}function Xa(){return 32}function Ya(){return 32}function Za(){return 24}function _a(){return 16}function $a(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;k=i;i=i+272|0;h=k;g=k+208|0;f=h+64|0;j=h;l=8;m=j+64|0;do{c[j>>2]=c[l>>2];j=j+4|0;l=l+4|0}while((j|0)<(m|0));j=h+72|0;c[j>>2]=256;c[j+4>>2]=0;j=f;c[j>>2]=0;c[j+4>>2]=0;j=h+80|0;l=e;m=j+32|0;do{a[j>>0]=a[l>>0]|0;j=j+1|0;l=l+1|0}while((j|0)<(m|0));Gb(h,g);j=d;l=g;m=j+32|0;do{a[j>>0]=a[l>>0]|0;j=j+1|0;l=l+1|0}while((j|0)<(m|0));md(b,d,33785);i=k;return 0}function ab(b,c){b=b|0;c=c|0;var d=0;d=0;do{a[c+d>>0]=Ba(0)|0;d=d+1|0}while((d|0)!=32);md(b,c,33785);return 0}function bb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;i=i+32|0;e=d;md(e,c,b);nb(a,32576,e,32592);i=d;return 0}function cb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;rc(a,b,c,d,e,f,g)|0;return 0}function db(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;i=i+64|0;l=j+32|0;k=j;md(l,h,g);nb(k,32576,l,32592);rc(a,b,c,d,e,f,k)|0;i=j;return 0}function eb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(d>>>0>0|(d|0)==0&c>>>0>4294967279){e=-1;return e|0}rc(a+16|0,a,b,c,d,e,f)|0;e=0;return e|0}function fb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;k=i;i=i+64|0;j=k+32|0;h=k;if(d>>>0>0|(d|0)==0&c>>>0>4294967279){g=-1;i=k;return g|0}md(j,g,f);nb(h,32576,j,32592);rc(a+16|0,a,b,c,d,e,h)|0;g=0;i=k;return g|0}function gb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return tc(a,b,c,d,e,f,g)|0}function hb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;i=i+64|0;l=j+32|0;k=j;md(l,h,g);nb(k,32576,l,32592);h=tc(a,b,c,d,e,f,k)|0;i=j;return h|0}function ib(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(d>>>0<0|(d|0)==0&c>>>0<16){e=-1;return e|0}d=Dd(c|0,d|0,-16,-1)|0;e=tc(a,b+16|0,b,d,C,e,f)|0;return e|0}function jb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;k=i;i=i+64|0;j=k+32|0;h=k;if(d>>>0<0|(d|0)==0&c>>>0<16){g=-1;i=k;return g|0}c=Dd(c|0,d|0,-16,-1)|0;d=C;md(j,g,f);nb(h,32576,j,32592);g=tc(a,b+16|0,b,c,d,e,h)|0;i=k;return g|0}function kb(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=i;v=i=i+63&-64;i=i+480|0;y=v;w=v+448|0;x=v+424|0;j=v+392|0;v=v+360|0;h=0;do{a[v+h>>0]=Ba(0)|0;h=h+1|0}while((h|0)!=32);md(j,v,33785);h=b;o=j;p=h+32|0;do{a[h>>0]=a[o>>0]|0;h=h+1|0;o=o+1|0}while((h|0)<(p|0));Fd(y|0,0,357)|0;q=y;c[q>>2]=-222443248;c[q+4>>2]=1779033703;q=y+8|0;c[q>>2]=-2067093701;c[q+4>>2]=-1150833019;q=y+16|0;c[q>>2]=-23791573;c[q+4>>2]=1013904242;q=y+24|0;c[q>>2]=1595750129;c[q+4>>2]=-1521486534;q=y+32|0;c[q>>2]=-1377402159;c[q+4>>2]=1359893119;q=y+40|0;c[q>>2]=725511199;c[q+4>>2]=-1694144372;q=y+48|0;c[q>>2]=-79577749;c[q+4>>2]=528734635;q=y+56|0;c[q>>2]=327033209;c[q+4>>2]=1541459225;q=y+352|0;r=y+96|0;s=y+64|0;t=y+72|0;u=y+224|0;h=0;m=0;n=32;while(1){l=256-h|0;h=y+96+h|0;if(!(m>>>0>0|(m|0)==0&n>>>0>l>>>0)){z=5;break}Id(h|0,j|0,l|0)|0;c[q>>2]=(c[q>>2]|0)+l;p=s;h=c[p>>2]|0;p=c[p+4>>2]|0;k=Dd(h|0,p|0,128,0)|0;o=s;c[o>>2]=k;c[o+4>>2]=C;o=t;o=Dd((p>>>0>4294967295|(p|0)==-1&h>>>0>4294967167)&1|0,0,c[o>>2]|0,c[o+4>>2]|0)|0;h=t;c[h>>2]=o;c[h+4>>2]=C;Ab(y,r);h=r;o=u;p=h+128|0;do{c[h>>2]=c[o>>2];h=h+4|0;o=o+4|0}while((h|0)<(p|0));h=(c[q>>2]|0)+-128|0;c[q>>2]=h;k=Cd(n|0,m|0,l|0,0)|0;if((n|0)==(l|0)&(m|0)==0){n=g;l=0;m=32;break}else{j=j+l|0;m=C;n=k}}if((z|0)==5){Id(h|0,j|0,n|0)|0;h=Dd(c[q>>2]|0,0,n|0,m|0)|0;c[q>>2]=h;n=g;l=0;m=32}while(1){k=256-h|0;h=y+96+h|0;if(!(l>>>0>0|(l|0)==0&m>>>0>k>>>0)){z=8;break}Id(h|0,n|0,k|0)|0;c[q>>2]=(c[q>>2]|0)+k;p=s;h=c[p>>2]|0;p=c[p+4>>2]|0;j=Dd(h|0,p|0,128,0)|0;o=s;c[o>>2]=j;c[o+4>>2]=C;o=t;o=Dd((p>>>0>4294967295|(p|0)==-1&h>>>0>4294967167)&1|0,0,c[o>>2]|0,c[o+4>>2]|0)|0;h=t;c[h>>2]=o;c[h+4>>2]=C;Ab(y,r);h=r;o=u;p=h+128|0;do{c[h>>2]=c[o>>2];h=h+4|0;o=o+4|0}while((h|0)<(p|0));h=(c[q>>2]|0)+-128|0;c[q>>2]=h;j=Cd(m|0,l|0,k|0,0)|0;if((m|0)==(k|0)&(l|0)==0)break;else{n=n+k|0;l=C;m=j}}if((z|0)==8){Id(h|0,n|0,m|0)|0;z=Dd(c[q>>2]|0,0,m|0,l|0)|0;c[q>>2]=z}zb(y,x,24)|0;if(f>>>0>0|(f|0)==0&e>>>0>4294967279){z=-1;i=A;return z|0}md(y,v,g);nb(w,32576,y,32592);rc(b+48|0,b+32|0,d,e,f,x,w)|0;z=0;i=A;return z|0}function lb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;y=i;v=i=i+63&-64;i=i+416|0;w=v;u=v+384|0;v=v+360|0;if(e>>>0<0|(e|0)==0&d>>>0<48){x=-1;i=y;return x|0}Fd(w|0,0,357)|0;p=w;c[p>>2]=-222443248;c[p+4>>2]=1779033703;p=w+8|0;c[p>>2]=-2067093701;c[p+4>>2]=-1150833019;p=w+16|0;c[p>>2]=-23791573;c[p+4>>2]=1013904242;p=w+24|0;c[p>>2]=1595750129;c[p+4>>2]=-1521486534;p=w+32|0;c[p>>2]=-1377402159;c[p+4>>2]=1359893119;p=w+40|0;c[p>>2]=725511199;c[p+4>>2]=-1694144372;p=w+48|0;c[p>>2]=-79577749;c[p+4>>2]=528734635;p=w+56|0;c[p>>2]=327033209;c[p+4>>2]=1541459225;p=w+352|0;q=w+96|0;r=w+64|0;s=w+72|0;t=w+224|0;k=b;h=0;m=0;n=32;while(1){l=256-h|0;h=w+96+h|0;if(!(m>>>0>0|(m|0)==0&n>>>0>l>>>0)){x=4;break}Id(h|0,k|0,l|0)|0;c[p>>2]=(c[p>>2]|0)+l;o=r;h=c[o>>2]|0;o=c[o+4>>2]|0;z=Dd(h|0,o|0,128,0)|0;j=r;c[j>>2]=z;c[j+4>>2]=C;j=s;j=Dd((o>>>0>4294967295|(o|0)==-1&h>>>0>4294967167)&1|0,0,c[j>>2]|0,c[j+4>>2]|0)|0;h=s;c[h>>2]=j;c[h+4>>2]=C;Ab(w,q);h=q;j=t;o=h+128|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(o|0));h=(c[p>>2]|0)+-128|0;c[p>>2]=h;j=Cd(n|0,m|0,l|0,0)|0;if((n|0)==(l|0)&(m|0)==0){l=0;m=32;break}else{k=k+l|0;m=C;n=j}}if((x|0)==4){Id(h|0,k|0,n|0)|0;h=Dd(c[p>>2]|0,0,n|0,m|0)|0;c[p>>2]=h;l=0;m=32}while(1){k=256-h|0;h=w+96+h|0;if(!(l>>>0>0|(l|0)==0&m>>>0>k>>>0)){x=7;break}Id(h|0,f|0,k|0)|0;c[p>>2]=(c[p>>2]|0)+k;o=r;h=c[o>>2]|0;o=c[o+4>>2]|0;z=Dd(h|0,o|0,128,0)|0;j=r;c[j>>2]=z;c[j+4>>2]=C;j=s;j=Dd((o>>>0>4294967295|(o|0)==-1&h>>>0>4294967167)&1|0,0,c[j>>2]|0,c[j+4>>2]|0)|0;h=s;c[h>>2]=j;c[h+4>>2]=C;Ab(w,q);h=q;j=t;o=h+128|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(o|0));h=(c[p>>2]|0)+-128|0;c[p>>2]=h;j=Cd(m|0,l|0,k|0,0)|0;if((m|0)==(k|0)&(l|0)==0)break;else{f=f+k|0;l=C;m=j}}if((x|0)==7){Id(h|0,f|0,m|0)|0;z=Dd(c[p>>2]|0,0,m|0,l|0)|0;c[p>>2]=z}zb(w,v,24)|0;if((d&-16|0)==32&(e|0)==0){z=-1;i=y;return z|0}x=Dd(d|0,e|0,-48,-1)|0;z=C;md(w,g,b);nb(u,32576,w,32592);z=tc(a,b+48|0,b+32|0,x,z,v,u)|0;i=y;return z|0}function mb(){return 48}function nb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;k=20;l=(d[f+1>>0]|0)<<8|(d[f>>0]|0)|(d[f+2>>0]|0)<<16|(d[f+3>>0]|0)<<24;m=(d[e+1>>0]|0)<<8|(d[e>>0]|0)|(d[e+2>>0]|0)<<16|(d[e+3>>0]|0)<<24;n=(d[f+9>>0]|0)<<8|(d[f+8>>0]|0)|(d[f+10>>0]|0)<<16|(d[f+11>>0]|0)<<24;o=(d[e+17>>0]|0)<<8|(d[e+16>>0]|0)|(d[e+18>>0]|0)<<16|(d[e+19>>0]|0)<<24;p=(d[e+21>>0]|0)<<8|(d[e+20>>0]|0)|(d[e+22>>0]|0)<<16|(d[e+23>>0]|0)<<24;q=(d[e+25>>0]|0)<<8|(d[e+24>>0]|0)|(d[e+26>>0]|0)<<16|(d[e+27>>0]|0)<<24;r=(d[e+29>>0]|0)<<8|(d[e+28>>0]|0)|(d[e+30>>0]|0)<<16|(d[e+31>>0]|0)<<24;s=(d[f+13>>0]|0)<<8|(d[f+12>>0]|0)|(d[f+14>>0]|0)<<16|(d[f+15>>0]|0)<<24;t=(d[e+5>>0]|0)<<8|(d[e+4>>0]|0)|(d[e+6>>0]|0)<<16|(d[e+7>>0]|0)<<24;u=(d[e+9>>0]|0)<<8|(d[e+8>>0]|0)|(d[e+10>>0]|0)<<16|(d[e+11>>0]|0)<<24;j=(d[e+13>>0]|0)<<8|(d[e+12>>0]|0)|(d[e+14>>0]|0)<<16|(d[e+15>>0]|0)<<24;f=(d[f+5>>0]|0)<<8|(d[f+4>>0]|0)|(d[f+6>>0]|0)<<16|(d[f+7>>0]|0)<<24;g=(d[c+1>>0]|0)<<8|(d[c>>0]|0)|(d[c+2>>0]|0)<<16|(d[c+3>>0]|0)<<24;h=(d[c+5>>0]|0)<<8|(d[c+4>>0]|0)|(d[c+6>>0]|0)<<16|(d[c+7>>0]|0)<<24;i=(d[c+9>>0]|0)<<8|(d[c+8>>0]|0)|(d[c+10>>0]|0)<<16|(d[c+11>>0]|0)<<24;e=(d[c+13>>0]|0)<<8|(d[c+12>>0]|0)|(d[c+14>>0]|0)<<16|(d[c+15>>0]|0)<<24;while(1){D=p+l|0;D=(D>>>25|D<<7)^j;A=D+l|0;A=(A>>>23|A<<9)^i;x=A+D|0;x=(x>>>19|x<<13)^p;G=x+A|0;G=(G>>>14|G<<18)^l;z=f+m|0;z=e^(z>>>25|z<<7);w=z+f|0;w=q^(w>>>23|w<<9);J=w+z|0;J=(J>>>19|J<<13)^m;C=J+w|0;C=(C>>>14|C<<18)^f;v=n+g|0;v=r^(v>>>25|v<<7);I=v+n|0;I=(I>>>23|I<<9)^t;F=I+v|0;F=(F>>>19|F<<13)^g;y=F+I|0;y=(y>>>14|y<<18)^n;H=s+o|0;H=(H>>>25|H<<7)^u;E=H+s|0;E=(E>>>23|E<<9)^h;B=E+H|0;B=(B>>>19|B<<13)^o;c=B+E|0;c=(c>>>14|c<<18)^s;K=G+H|0;m=(K>>>25|K<<7)^J;J=m+G|0;t=(J>>>23|J<<9)^I;I=t+m|0;u=(I>>>19|I<<13)^H;H=u+t|0;l=(H>>>14|H<<18)^G;G=C+D|0;g=(G>>>25|G<<7)^F;F=g+C|0;h=(F>>>23|F<<9)^E;E=h+g|0;j=(E>>>19|E<<13)^D;D=j+h|0;f=(D>>>14|D<<18)^C;C=y+z|0;o=(C>>>25|C<<7)^B;B=o+y|0;i=(B>>>23|B<<9)^A;A=i+o|0;e=(A>>>19|A<<13)^z;z=e+i|0;n=(z>>>14|z<<18)^y;y=c+v|0;p=(y>>>25|y<<7)^x;x=p+c|0;q=(x>>>23|x<<9)^w;w=q+p|0;r=(w>>>19|w<<13)^v;v=r+q|0;s=(v>>>14|v<<18)^c;if((k|0)<=2)break;else k=k+-2|0}a[b>>0]=l;a[b+1>>0]=l>>>8;a[b+2>>0]=l>>>16;a[b+3>>0]=l>>>24;a[b+4>>0]=f;a[b+5>>0]=f>>>8;a[b+6>>0]=f>>>16;a[b+7>>0]=f>>>24;a[b+8>>0]=n;a[b+9>>0]=n>>>8;a[b+10>>0]=n>>>16;a[b+11>>0]=n>>>24;a[b+12>>0]=s;a[b+13>>0]=s>>>8;a[b+14>>0]=s>>>16;a[b+15>>0]=s>>>24;a[b+16>>0]=g;a[b+17>>0]=g>>>8;a[b+18>>0]=g>>>16;a[b+19>>0]=g>>>24;a[b+20>>0]=h;a[b+21>>0]=h>>>8;a[b+22>>0]=h>>>16;a[b+23>>0]=h>>>24;a[b+24>>0]=i;a[b+25>>0]=i>>>8;a[b+26>>0]=i>>>16;a[b+27>>0]=i>>>24;a[b+28>>0]=e;a[b+29>>0]=e>>>8;a[b+30>>0]=e>>>16;a[b+31>>0]=e>>>24;return}function ob(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;F=(d[f+1>>0]|0)<<8|(d[f>>0]|0)|(d[f+2>>0]|0)<<16|(d[f+3>>0]|0)<<24;G=(d[e+1>>0]|0)<<8|(d[e>>0]|0)|(d[e+2>>0]|0)<<16|(d[e+3>>0]|0)<<24;H=(d[e+5>>0]|0)<<8|(d[e+4>>0]|0)|(d[e+6>>0]|0)<<16|(d[e+7>>0]|0)<<24;I=(d[e+9>>0]|0)<<8|(d[e+8>>0]|0)|(d[e+10>>0]|0)<<16|(d[e+11>>0]|0)<<24;J=(d[e+13>>0]|0)<<8|(d[e+12>>0]|0)|(d[e+14>>0]|0)<<16|(d[e+15>>0]|0)<<24;B=(d[f+5>>0]|0)<<8|(d[f+4>>0]|0)|(d[f+6>>0]|0)<<16|(d[f+7>>0]|0)<<24;C=(d[c+1>>0]|0)<<8|(d[c>>0]|0)|(d[c+2>>0]|0)<<16|(d[c+3>>0]|0)<<24;D=(d[c+5>>0]|0)<<8|(d[c+4>>0]|0)|(d[c+6>>0]|0)<<16|(d[c+7>>0]|0)<<24;E=(d[c+9>>0]|0)<<8|(d[c+8>>0]|0)|(d[c+10>>0]|0)<<16|(d[c+11>>0]|0)<<24;w=(d[c+13>>0]|0)<<8|(d[c+12>>0]|0)|(d[c+14>>0]|0)<<16|(d[c+15>>0]|0)<<24;x=(d[f+9>>0]|0)<<8|(d[f+8>>0]|0)|(d[f+10>>0]|0)<<16|(d[f+11>>0]|0)<<24;y=(d[e+17>>0]|0)<<8|(d[e+16>>0]|0)|(d[e+18>>0]|0)<<16|(d[e+19>>0]|0)<<24;z=(d[e+21>>0]|0)<<8|(d[e+20>>0]|0)|(d[e+22>>0]|0)<<16|(d[e+23>>0]|0)<<24;A=(d[e+25>>0]|0)<<8|(d[e+24>>0]|0)|(d[e+26>>0]|0)<<16|(d[e+27>>0]|0)<<24;v=(d[e+29>>0]|0)<<8|(d[e+28>>0]|0)|(d[e+30>>0]|0)<<16|(d[e+31>>0]|0)<<24;c=(d[f+13>>0]|0)<<8|(d[f+12>>0]|0)|(d[f+14>>0]|0)<<16|(d[f+15>>0]|0)<<24;e=20;f=F;g=G;h=x;i=y;j=z;k=A;l=v;m=c;n=H;o=I;p=J;q=B;r=C;s=D;t=E;u=w;while(1){T=f+j|0;T=(T>>>25|T<<7)^p;Q=T+f|0;Q=(Q>>>23|Q<<9)^t;N=Q+T|0;N=(N>>>19|N<<13)^j;W=N+Q|0;W=(W>>>14|W<<18)^f;P=g+q|0;P=(P>>>25|P<<7)^u;M=P+q|0;M=(M>>>23|M<<9)^k;Z=M+P|0;Z=(Z>>>19|Z<<13)^g;S=Z+M|0;S=(S>>>14|S<<18)^q;L=r+h|0;L=(L>>>25|L<<7)^l;Y=L+h|0;Y=(Y>>>23|Y<<9)^n;V=Y+L|0;V=(V>>>19|V<<13)^r;O=V+Y|0;O=(O>>>14|O<<18)^h;X=i+m|0;X=o^(X>>>25|X<<7);U=X+m|0;U=(U>>>23|U<<9)^s;R=U+X|0;R=(R>>>19|R<<13)^i;K=R+U|0;K=(K>>>14|K<<18)^m;_=W+X|0;g=(_>>>25|_<<7)^Z;Z=g+W|0;n=(Z>>>23|Z<<9)^Y;Y=n+g|0;o=(Y>>>19|Y<<13)^X;X=o+n|0;f=(X>>>14|X<<18)^W;W=S+T|0;r=(W>>>25|W<<7)^V;V=r+S|0;s=(V>>>23|V<<9)^U;U=s+r|0;p=(U>>>19|U<<13)^T;T=p+s|0;q=(T>>>14|T<<18)^S;S=O+P|0;i=(S>>>25|S<<7)^R;R=i+O|0;t=(R>>>23|R<<9)^Q;Q=t+i|0;u=(Q>>>19|Q<<13)^P;P=u+t|0;h=(P>>>14|P<<18)^O;O=K+L|0;j=(O>>>25|O<<7)^N;N=j+K|0;k=(N>>>23|N<<9)^M;M=k+j|0;l=(M>>>19|M<<13)^L;L=l+k|0;m=(L>>>14|L<<18)^K;if((e|0)<=2)break;else e=e+-2|0}L=f+F|0;M=g+G|0;N=n+H|0;O=o+I|0;P=p+J|0;Q=q+B|0;R=r+C|0;S=s+D|0;T=t+E|0;U=u+w|0;V=h+x|0;W=i+y|0;X=j+z|0;Y=k+A|0;Z=l+v|0;_=m+c|0;a[b>>0]=L;a[b+1>>0]=L>>>8;a[b+2>>0]=L>>>16;a[b+3>>0]=L>>>24;a[b+4>>0]=M;a[b+5>>0]=M>>>8;a[b+6>>0]=M>>>16;a[b+7>>0]=M>>>24;a[b+8>>0]=N;a[b+9>>0]=N>>>8;a[b+10>>0]=N>>>16;a[b+11>>0]=N>>>24;a[b+12>>0]=O;a[b+13>>0]=O>>>8;a[b+14>>0]=O>>>16;a[b+15>>0]=O>>>24;a[b+16>>0]=P;a[b+17>>0]=P>>>8;a[b+18>>0]=P>>>16;a[b+19>>0]=P>>>24;a[b+20>>0]=Q;a[b+21>>0]=Q>>>8;a[b+22>>0]=Q>>>16;a[b+23>>0]=Q>>>24;a[b+24>>0]=R;a[b+25>>0]=R>>>8;a[b+26>>0]=R>>>16;a[b+27>>0]=R>>>24;a[b+28>>0]=S;a[b+29>>0]=S>>>8;a[b+30>>0]=S>>>16;a[b+31>>0]=S>>>24;a[b+32>>0]=T;a[b+33>>0]=T>>>8;a[b+34>>0]=T>>>16;a[b+35>>0]=T>>>24;a[b+36>>0]=U;a[b+37>>0]=U>>>8;a[b+38>>0]=U>>>16;a[b+39>>0]=U>>>24;a[b+40>>0]=V;a[b+41>>0]=V>>>8;a[b+42>>0]=V>>>16;a[b+43>>0]=V>>>24;a[b+44>>0]=W;a[b+45>>0]=W>>>8;a[b+46>>0]=W>>>16;a[b+47>>0]=W>>>24;a[b+48>>0]=X;a[b+49>>0]=X>>>8;a[b+50>>0]=X>>>16;a[b+51>>0]=X>>>24;a[b+52>>0]=Y;a[b+53>>0]=Y>>>8;a[b+54>>0]=Y>>>16;a[b+55>>0]=Y>>>24;a[b+56>>0]=Z;a[b+57>>0]=Z>>>8;a[b+58>>0]=Z>>>16;a[b+59>>0]=Z>>>24;a[b+60>>0]=_;a[b+61>>0]=_>>>8;a[b+62>>0]=_>>>16;a[b+63>>0]=_>>>24;return}function pb(){return 16}function qb(){return 64}function rb(){return 32}function sb(){return 16}function tb(){return 64}function ub(){return 32}function vb(){return 384}function wb(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=i;t=i=i+63&-64;i=i+496|0;n=t+360|0;if((e+-1|0)>>>0>63|k>>>0>64){u=-1;i=v;return u|0}if(e>>>0>=256)za(32608,32628,18,32680);if(k>>>0>=256)za(32707,32628,19,32680);m=k&255;do if(!((b|0)==0|(f|0)==0&((g|0)!=0|(h|0)!=0)|((e&255)+-1&255)>63)?(l=m<<24>>24==0,!((m&255)>64|((j|0)!=0|l)^1)):0){if(l){Fd(t|0,0,357)|0;m=t;c[m>>2]=e&255^-222443256;c[m+4>>2]=1779033703;m=t+8|0;c[m>>2]=-2067093701;c[m+4>>2]=-1150833019;m=t+16|0;c[m>>2]=-23791573;c[m+4>>2]=1013904242;m=t+24|0;c[m>>2]=1595750129;c[m+4>>2]=-1521486534;m=t+32|0;c[m>>2]=-1377402159;c[m+4>>2]=1359893119;m=t+40|0;c[m>>2]=725511199;c[m+4>>2]=-1694144372;m=t+48|0;c[m>>2]=-79577749;c[m+4>>2]=528734635;m=t+56|0;c[m>>2]=327033209;c[m+4>>2]=1541459225;m=0}else{if((j|0)==0|(m+-1&255)>63){l=-1;break}l=k&255;Fd(t|0,0,357)|0;s=Hd(l|0,0,8)|0;o=t;c[o>>2]=(s|e&255)^-222443256;c[o+4>>2]=C^1779033703;o=t+8|0;c[o>>2]=-2067093701;c[o+4>>2]=-1150833019;o=t+16|0;c[o>>2]=-23791573;c[o+4>>2]=1013904242;o=t+24|0;c[o>>2]=1595750129;c[o+4>>2]=-1521486534;o=t+32|0;c[o>>2]=-1377402159;c[o+4>>2]=1359893119;o=t+40|0;c[o>>2]=725511199;c[o+4>>2]=-1694144372;o=t+48|0;c[o>>2]=-79577749;c[o+4>>2]=528734635;o=t+56|0;c[o>>2]=327033209;c[o+4>>2]=1541459225;Fd(n+l|0,0,(m<<24>>24<0?0:128-l|0)|0)|0;Id(n|0,j|0,l|0)|0;l=t+352|0;o=t+96|0;m=o+128|0;do{a[o>>0]=a[n>>0]|0;o=o+1|0;n=n+1|0}while((o|0)<(m|0));c[l>>2]=128;m=128}k=t+352|0;if(!((g|0)==0&(h|0)==0)){q=t+96|0;j=t+64|0;r=t+72|0;s=t+224|0;p=f;while(1){f=256-m|0;l=t+96+m|0;if(!(h>>>0>0|(h|0)==0&g>>>0>f>>>0)){u=16;break}Id(l|0,p|0,f|0)|0;c[k>>2]=(c[k>>2]|0)+f;m=j;o=c[m>>2]|0;m=c[m+4>>2]|0;l=Dd(o|0,m|0,128,0)|0;n=j;c[n>>2]=l;c[n+4>>2]=C;n=r;n=Dd((m>>>0>4294967295|(m|0)==-1&o>>>0>4294967167)&1|0,0,c[n>>2]|0,c[n+4>>2]|0)|0;o=r;c[o>>2]=n;c[o+4>>2]=C;Ab(t,q);o=q;n=s;m=o+128|0;do{c[o>>2]=c[n>>2];o=o+4|0;n=n+4|0}while((o|0)<(m|0));m=(c[k>>2]|0)+-128|0;c[k>>2]=m;l=Cd(g|0,h|0,f|0,0)|0;if((g|0)==(f|0)&(h|0)==0)break;else{p=p+f|0;h=C;g=l}}if((u|0)==16){Id(l|0,p|0,g|0)|0;m=Dd(c[k>>2]|0,0,g|0,h|0)|0;c[k>>2]=m}l=e&255;if(m>>>0>128){s=j;e=c[s>>2]|0;s=c[s+4>>2]|0;m=Dd(e|0,s|0,128,0)|0;n=j;c[n>>2]=m;c[n+4>>2]=C;n=t+72|0;m=n;m=Dd((s>>>0>4294967295|(s|0)==-1&e>>>0>4294967167)&1|0,0,c[m>>2]|0,c[m+4>>2]|0)|0;e=n;c[e>>2]=m;c[e+4>>2]=C;e=t+96|0;Ab(t,e);m=(c[k>>2]|0)+-128|0;c[k>>2]=m;Jd(e|0,t+224|0,m|0)|0;m=c[k>>2]|0}else u=19}else{j=t+64|0;l=e&255;u=19}if((u|0)==19)n=t+72|0;u=j;u=Dd(c[u>>2]|0,c[u+4>>2]|0,m|0,0)|0;s=C;r=j;c[r>>2]=u;c[r+4>>2]=s;r=n;e=r;r=r+4|0;r=Dd((s>>>0<0|(s|0)==0&u>>>0>>0)&1|0,0,d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24|0,d[r>>0]|d[r+1>>0]<<8|d[r+2>>0]<<16|d[r+3>>0]<<24|0)|0;e=C;u=n;s=u;a[s>>0]=r;a[s+1>>0]=r>>8;a[s+2>>0]=r>>16;a[s+3>>0]=r>>24;u=u+4|0;a[u>>0]=e;a[u+1>>0]=e>>8;a[u+2>>0]=e>>16;a[u+3>>0]=e>>24;if(a[t+356>>0]|0){u=t+88|0;c[u>>2]=-1;c[u+4>>2]=-1}u=t+80|0;c[u>>2]=-1;c[u+4>>2]=-1;Fd(t+96+m|0,0,256-m|0)|0;Ab(t,t+96|0);Id(b|0,t|0,l|0)|0;l=0}else l=-1;while(0);u=l;i=v;return u|0}function xb(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;j=i;f=i=i+63&-64;i=i+128|0;if(d>>>0>64|(e+-1|0)>>>0>63){b=-1;i=j;return b|0}if(e>>>0>=256)za(32608,32628,53,32727);if(d>>>0>=256)za(32707,32628,54,32727);h=e&255;if((c|0)==0|(d|0)==0){if((h+-1&255)>63){b=-1;i=j;return b|0}Fd(b|0,0,357)|0;c=e&255^-222443256;e=b;d=e;a[d>>0]=c;a[d+1>>0]=c>>8;a[d+2>>0]=c>>16;a[d+3>>0]=c>>24;e=e+4|0;a[e>>0]=103;a[e+1>>0]=230;a[e+2>>0]=9;a[e+3>>0]=106;e=b+8|0;d=e;a[d>>0]=-2067093701;a[d+1>>0]=-2067093701>>8;a[d+2>>0]=-2067093701>>16;a[d+3>>0]=-2067093701>>24;e=e+4|0;a[e>>0]=-1150833019;a[e+1>>0]=-1150833019>>8;a[e+2>>0]=-1150833019>>16;a[e+3>>0]=-1150833019>>24;e=b+16|0;d=e;a[d>>0]=-23791573;a[d+1>>0]=-23791573>>8;a[d+2>>0]=-23791573>>16;a[d+3>>0]=-23791573>>24;e=e+4|0;a[e>>0]=114;a[e+1>>0]=243;a[e+2>>0]=110;a[e+3>>0]=60;e=b+24|0;d=e;a[d>>0]=241;a[d+1>>0]=54;a[d+2>>0]=29;a[d+3>>0]=95;e=e+4|0;a[e>>0]=-1521486534;a[e+1>>0]=-1521486534>>8;a[e+2>>0]=-1521486534>>16;a[e+3>>0]=-1521486534>>24;e=b+32|0;d=e;a[d>>0]=-1377402159;a[d+1>>0]=-1377402159>>8;a[d+2>>0]=-1377402159>>16;a[d+3>>0]=-1377402159>>24;e=e+4|0;a[e>>0]=127;a[e+1>>0]=82;a[e+2>>0]=14;a[e+3>>0]=81;e=b+40|0;d=e;a[d>>0]=31;a[d+1>>0]=108;a[d+2>>0]=62;a[d+3>>0]=43;e=e+4|0;a[e>>0]=-1694144372;a[e+1>>0]=-1694144372>>8;a[e+2>>0]=-1694144372>>16;a[e+3>>0]=-1694144372>>24;e=b+48|0;d=e;a[d>>0]=-79577749;a[d+1>>0]=-79577749>>8;a[d+2>>0]=-79577749>>16;a[d+3>>0]=-79577749>>24;e=e+4|0;a[e>>0]=171;a[e+1>>0]=217;a[e+2>>0]=131;a[e+3>>0]=31;b=b+56|0;e=b;a[e>>0]=121;a[e+1>>0]=33;a[e+2>>0]=126;a[e+3>>0]=19;b=b+4|0;a[b>>0]=25;a[b+1>>0]=205;a[b+2>>0]=224;a[b+3>>0]=91;b=0;i=j;return b|0}else{g=d&255;if((h+-1&255)>63|(g+-1&255)>63){b=-1;i=j;return b|0}h=d&255;Fd(b|0,0,357)|0;l=Hd(h|0,0,8)|0;l=(l|e&255)^-222443256;d=C^1779033703;e=b;k=e;a[k>>0]=l;a[k+1>>0]=l>>8;a[k+2>>0]=l>>16;a[k+3>>0]=l>>24;e=e+4|0;a[e>>0]=d;a[e+1>>0]=d>>8;a[e+2>>0]=d>>16;a[e+3>>0]=d>>24;e=b+8|0;d=e;a[d>>0]=-2067093701;a[d+1>>0]=-2067093701>>8;a[d+2>>0]=-2067093701>>16;a[d+3>>0]=-2067093701>>24;e=e+4|0;a[e>>0]=-1150833019;a[e+1>>0]=-1150833019>>8;a[e+2>>0]=-1150833019>>16;a[e+3>>0]=-1150833019>>24;e=b+16|0;d=e;a[d>>0]=-23791573;a[d+1>>0]=-23791573>>8;a[d+2>>0]=-23791573>>16;a[d+3>>0]=-23791573>>24;e=e+4|0;a[e>>0]=114;a[e+1>>0]=243;a[e+2>>0]=110;a[e+3>>0]=60;e=b+24|0;d=e;a[d>>0]=241;a[d+1>>0]=54;a[d+2>>0]=29;a[d+3>>0]=95;e=e+4|0;a[e>>0]=-1521486534;a[e+1>>0]=-1521486534>>8;a[e+2>>0]=-1521486534>>16;a[e+3>>0]=-1521486534>>24;e=b+32|0;d=e;a[d>>0]=-1377402159;a[d+1>>0]=-1377402159>>8;a[d+2>>0]=-1377402159>>16;a[d+3>>0]=-1377402159>>24;e=e+4|0;a[e>>0]=127;a[e+1>>0]=82;a[e+2>>0]=14;a[e+3>>0]=81;e=b+40|0;d=e;a[d>>0]=31;a[d+1>>0]=108;a[d+2>>0]=62;a[d+3>>0]=43;e=e+4|0;a[e>>0]=-1694144372;a[e+1>>0]=-1694144372>>8;a[e+2>>0]=-1694144372>>16;a[e+3>>0]=-1694144372>>24;e=b+48|0;d=e;a[d>>0]=-79577749;a[d+1>>0]=-79577749>>8;a[d+2>>0]=-79577749>>16;a[d+3>>0]=-79577749>>24;e=e+4|0;a[e>>0]=171;a[e+1>>0]=217;a[e+2>>0]=131;a[e+3>>0]=31;e=b+56|0;d=e;a[d>>0]=121;a[d+1>>0]=33;a[d+2>>0]=126;a[d+3>>0]=19;e=e+4|0;a[e>>0]=25;a[e+1>>0]=205;a[e+2>>0]=224;a[e+3>>0]=91;Fd(f+h|0,0,(g<<24>>24<0?0:128-h|0)|0)|0;Id(f|0,c|0,h|0)|0;c=b+352|0;h=b+96|0;g=h+128|0;do{a[h>>0]=a[f>>0]|0;h=h+1|0;f=f+1|0}while((h|0)<(g|0));a[c>>0]=128;a[c+1>>0]=0;a[c+2>>0]=0;a[c+3>>0]=0;l=0;i=j;return l|0}return 0}function yb(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if((e|0)==0&(f|0)==0)return 0;k=b+352|0;l=b+96|0;m=b+64|0;n=b+72|0;o=b+224|0;g=d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24;j=e;while(1){i=256-g|0;e=b+96+g|0;if(!(f>>>0>0|(f|0)==0&j>>>0>i>>>0))break;Id(e|0,c|0,i|0)|0;h=(d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24)+i|0;a[k>>0]=h;a[k+1>>0]=h>>8;a[k+2>>0]=h>>16;a[k+3>>0]=h>>24;h=m;e=h;e=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;h=h+4|0;h=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;s=Dd(e|0,h|0,128,0)|0;g=C;q=m;r=q;a[r>>0]=s;a[r+1>>0]=s>>8;a[r+2>>0]=s>>16;a[r+3>>0]=s>>24;q=q+4|0;a[q>>0]=g;a[q+1>>0]=g>>8;a[q+2>>0]=g>>16;a[q+3>>0]=g>>24;q=n;g=q;q=q+4|0;q=Dd((h>>>0>4294967295|(h|0)==-1&e>>>0>4294967167)&1|0,0,d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24|0,d[q>>0]|d[q+1>>0]<<8|d[q+2>>0]<<16|d[q+3>>0]<<24|0)|0;g=C;e=n;h=e;a[h>>0]=q;a[h+1>>0]=q>>8;a[h+2>>0]=q>>16;a[h+3>>0]=q>>24;e=e+4|0;a[e>>0]=g;a[e+1>>0]=g>>8;a[e+2>>0]=g>>16;a[e+3>>0]=g>>24;Ab(b,l);e=l;g=o;h=e+128|0;do{a[e>>0]=a[g>>0]|0;e=e+1|0;g=g+1|0}while((e|0)<(h|0));g=(d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24)+-128|0;a[k>>0]=g;a[k+1>>0]=g>>8;a[k+2>>0]=g>>16;a[k+3>>0]=g>>24;e=Cd(j|0,f|0,i|0,0)|0;if((j|0)==(i|0)&(f|0)==0){p=6;break}else{c=c+i|0;f=C;j=e}}if((p|0)==6)return 0;Id(e|0,c|0,j|0)|0;s=Dd(d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24|0,0,j|0,f|0)|0;a[k>>0]=s;a[k+1>>0]=s>>8;a[k+2>>0]=s>>16;a[k+3>>0]=s>>24;return 0}function zb(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(e>>>0>=256)za(32608,32628,106,32759);f=e&255;if(!(f<<24>>24)){b=-1;return b|0}if((f&255)>64){b=-1;return b|0}g=b+352|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;i=b+64|0;if(f>>>0>128){k=i;j=k;j=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;k=k+4|0;k=d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24;m=Dd(j|0,k|0,128,0)|0;l=C;h=i;f=h;a[f>>0]=m;a[f+1>>0]=m>>8;a[f+2>>0]=m>>16;a[f+3>>0]=m>>24;h=h+4|0;a[h>>0]=l;a[h+1>>0]=l>>8;a[h+2>>0]=l>>16;a[h+3>>0]=l>>24;h=b+72|0;l=h;f=l;l=l+4|0;l=Dd((k>>>0>4294967295|(k|0)==-1&j>>>0>4294967167)&1|0,0,d[f>>0]|d[f+1>>0]<<8|d[f+2>>0]<<16|d[f+3>>0]<<24|0,d[l>>0]|d[l+1>>0]<<8|d[l+2>>0]<<16|d[l+3>>0]<<24|0)|0;f=C;j=h;k=j;a[k>>0]=l;a[k+1>>0]=l>>8;a[k+2>>0]=l>>16;a[k+3>>0]=l>>24;j=j+4|0;a[j>>0]=f;a[j+1>>0]=f>>8;a[j+2>>0]=f>>16;a[j+3>>0]=f>>24;j=b+96|0;Ab(b,j);f=(d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24)+-128|0;a[g>>0]=f;a[g+1>>0]=f>>8;a[g+2>>0]=f>>16;a[g+3>>0]=f>>24;Jd(j|0,b+224|0,f|0)|0;f=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24}else h=b+72|0;m=i;k=m;m=m+4|0;m=Dd(d[k>>0]|d[k+1>>0]<<8|d[k+2>>0]<<16|d[k+3>>0]<<24|0,d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24|0,f|0,0)|0;k=C;j=i;l=j;a[l>>0]=m;a[l+1>>0]=m>>8;a[l+2>>0]=m>>16;a[l+3>>0]=m>>24;j=j+4|0;a[j>>0]=k;a[j+1>>0]=k>>8;a[j+2>>0]=k>>16;a[j+3>>0]=k>>24;j=h;l=j;j=j+4|0;j=Dd((k>>>0<0|(k|0)==0&m>>>0>>0)&1|0,0,d[l>>0]|d[l+1>>0]<<8|d[l+2>>0]<<16|d[l+3>>0]<<24|0,d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24|0)|0;l=C;m=h;k=m;a[k>>0]=j;a[k+1>>0]=j>>8;a[k+2>>0]=j>>16;a[k+3>>0]=j>>24;m=m+4|0;a[m>>0]=l;a[m+1>>0]=l>>8;a[m+2>>0]=l>>16;a[m+3>>0]=l>>24;if(a[b+356>>0]|0){m=b+88|0;l=m;a[l>>0]=-1;a[l+1>>0]=-1>>8;a[l+2>>0]=-1>>16;a[l+3>>0]=-1>>24;m=m+4|0;a[m>>0]=-1;a[m+1>>0]=-1>>8;a[m+2>>0]=-1>>16;a[m+3>>0]=-1>>24}m=b+80|0;l=m;a[l>>0]=-1;a[l+1>>0]=-1>>8;a[l+2>>0]=-1>>16;a[l+3>>0]=-1>>24;m=m+4|0;a[m>>0]=-1;a[m+1>>0]=-1>>8;a[m+2>>0]=-1>>16;a[m+3>>0]=-1>>24;Fd(b+96+f|0,0,256-f|0)|0;Ab(b,b+96|0);Id(c|0,b|0,e&255|0)|0;m=0;return m|0}function Ab(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;P=c;R=P;R=d[R>>0]|d[R+1>>0]<<8|d[R+2>>0]<<16|d[R+3>>0]<<24;P=P+4|0;P=d[P>>0]|d[P+1>>0]<<8|d[P+2>>0]<<16|d[P+3>>0]<<24;U=c+8|0;W=U;W=d[W>>0]|d[W+1>>0]<<8|d[W+2>>0]<<16|d[W+3>>0]<<24;U=U+4|0;U=d[U>>0]|d[U+1>>0]<<8|d[U+2>>0]<<16|d[U+3>>0]<<24;x=c+16|0;t=x;t=d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24;x=x+4|0;x=d[x>>0]|d[x+1>>0]<<8|d[x+2>>0]<<16|d[x+3>>0]<<24;l=c+24|0;h=l;h=d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24;l=l+4|0;l=d[l>>0]|d[l+1>>0]<<8|d[l+2>>0]<<16|d[l+3>>0]<<24;$=c+32|0;p=$;p=d[p>>0]|d[p+1>>0]<<8|d[p+2>>0]<<16|d[p+3>>0]<<24;$=$+4|0;$=d[$>>0]|d[$+1>>0]<<8|d[$+2>>0]<<16|d[$+3>>0]<<24;F=c+40|0;H=F;H=d[H>>0]|d[H+1>>0]<<8|d[H+2>>0]<<16|d[H+3>>0]<<24;F=F+4|0;F=d[F>>0]|d[F+1>>0]<<8|d[F+2>>0]<<16|d[F+3>>0]<<24;u=c+48|0;s=u;s=d[s>>0]|d[s+1>>0]<<8|d[s+2>>0]<<16|d[s+3>>0]<<24;u=u+4|0;u=d[u>>0]|d[u+1>>0]<<8|d[u+2>>0]<<16|d[u+3>>0]<<24;r=c+56|0;n=r;n=d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24;r=r+4|0;r=d[r>>0]|d[r+1>>0]<<8|d[r+2>>0]<<16|d[r+3>>0]<<24;i=c+64|0;g=i;g=d[g>>0]|d[g+1>>0]<<8|d[g+2>>0]<<16|d[g+3>>0]<<24;i=i+4|0;i=d[i>>0]|d[i+1>>0]<<8|d[i+2>>0]<<16|d[i+3>>0]<<24;Y=c+72|0;j=Y;j=d[j>>0]|d[j+1>>0]<<8|d[j+2>>0]<<16|d[j+3>>0]<<24;Y=Y+4|0;Y=d[Y>>0]|d[Y+1>>0]<<8|d[Y+2>>0]<<16|d[Y+3>>0]<<24;o=c+80|0;m=o;m=d[m>>0]|d[m+1>>0]<<8|d[m+2>>0]<<16|d[m+3>>0]<<24;o=o+4|0;o=d[o>>0]|d[o+1>>0]<<8|d[o+2>>0]<<16|d[o+3>>0]<<24;K=c+88|0;M=K;M=d[M>>0]|d[M+1>>0]<<8|d[M+2>>0]<<16|d[M+3>>0]<<24;K=K+4|0;K=d[K>>0]|d[K+1>>0]<<8|d[K+2>>0]<<16|d[K+3>>0]<<24;f=c+96|0;e=f;e=d[e>>0]|d[e+1>>0]<<8|d[e+2>>0]<<16|d[e+3>>0]<<24;f=f+4|0;f=d[f>>0]|d[f+1>>0]<<8|d[f+2>>0]<<16|d[f+3>>0]<<24;S=c+104|0;B=S;B=d[B>>0]|d[B+1>>0]<<8|d[B+2>>0]<<16|d[B+3>>0]<<24;S=S+4|0;S=d[S>>0]|d[S+1>>0]<<8|d[S+2>>0]<<16|d[S+3>>0]<<24;sa=c+112|0;ra=sa;ra=d[ra>>0]|d[ra+1>>0]<<8|d[ra+2>>0]<<16|d[ra+3>>0]<<24;sa=sa+4|0;sa=d[sa>>0]|d[sa+1>>0]<<8|d[sa+2>>0]<<16|d[sa+3>>0]<<24;A=c+120|0;y=A;y=d[y>>0]|d[y+1>>0]<<8|d[y+2>>0]<<16|d[y+3>>0]<<24;A=A+4|0;A=d[A>>0]|d[A+1>>0]<<8|d[A+2>>0]<<16|d[A+3>>0]<<24;ca=b;v=ca;ca=ca+4|0;N=b+8|0;oa=N;na=oa;na=d[na>>0]|d[na+1>>0]<<8|d[na+2>>0]<<16|d[na+3>>0]<<24;oa=oa+4|0;oa=d[oa>>0]|d[oa+1>>0]<<8|d[oa+2>>0]<<16|d[oa+3>>0]<<24;I=b+16|0;ka=I;ja=ka;ja=d[ja>>0]|d[ja+1>>0]<<8|d[ja+2>>0]<<16|d[ja+3>>0]<<24;ka=ka+4|0;ka=d[ka>>0]|d[ka+1>>0]<<8|d[ka+2>>0]<<16|d[ka+3>>0]<<24;D=b+24|0;ga=D;fa=ga;fa=d[fa>>0]|d[fa+1>>0]<<8|d[fa+2>>0]<<16|d[fa+3>>0]<<24;ga=ga+4|0;ga=d[ga>>0]|d[ga+1>>0]<<8|d[ga+2>>0]<<16|d[ga+3>>0]<<24;w=b+32|0;ma=w;la=ma;la=d[la>>0]|d[la+1>>0]<<8|d[la+2>>0]<<16|d[la+3>>0]<<24;ma=ma+4|0;ma=d[ma>>0]|d[ma+1>>0]<<8|d[ma+2>>0]<<16|d[ma+3>>0]<<24;q=b+40|0;ia=q;ha=ia;ha=d[ha>>0]|d[ha+1>>0]<<8|d[ha+2>>0]<<16|d[ha+3>>0]<<24;ia=ia+4|0;ia=d[ia>>0]|d[ia+1>>0]<<8|d[ia+2>>0]<<16|d[ia+3>>0]<<24;k=b+48|0;ua=k;ta=ua;ta=d[ta>>0]|d[ta+1>>0]<<8|d[ta+2>>0]<<16|d[ta+3>>0]<<24;ua=ua+4|0;ua=d[ua>>0]|d[ua+1>>0]<<8|d[ua+2>>0]<<16|d[ua+3>>0]<<24;c=b+56|0;qa=c;pa=qa;pa=d[pa>>0]|d[pa+1>>0]<<8|d[pa+2>>0]<<16|d[pa+3>>0]<<24;qa=qa+4|0;qa=d[qa>>0]|d[qa+1>>0]<<8|d[qa+2>>0]<<16|d[qa+3>>0]<<24;ba=b+64|0;aa=ba;ba=ba+4|0;aa=(d[aa>>0]|d[aa+1>>0]<<8|d[aa+2>>0]<<16|d[aa+3>>0]<<24)^-1377402159;ba=(d[ba>>0]|d[ba+1>>0]<<8|d[ba+2>>0]<<16|d[ba+3>>0]<<24)^1359893119;_=b+72|0;Z=_;_=_+4|0;Z=(d[Z>>0]|d[Z+1>>0]<<8|d[Z+2>>0]<<16|d[Z+3>>0]<<24)^725511199;_=(d[_>>0]|d[_+1>>0]<<8|d[_+2>>0]<<16|d[_+3>>0]<<24)^-1694144372;X=b+80|0;V=X;X=X+4|0;V=(d[V>>0]|d[V+1>>0]<<8|d[V+2>>0]<<16|d[V+3>>0]<<24)^-79577749;X=(d[X>>0]|d[X+1>>0]<<8|d[X+2>>0]<<16|d[X+3>>0]<<24)^528734635;ea=b+88|0;da=ea;ea=ea+4|0;da=(d[da>>0]|d[da+1>>0]<<8|d[da+2>>0]<<16|d[da+3>>0]<<24)^327033209;ea=(d[ea>>0]|d[ea+1>>0]<<8|d[ea+2>>0]<<16|d[ea+3>>0]<<24)^1541459225;ca=Dd(la|0,ma|0,d[v>>0]|d[v+1>>0]<<8|d[v+2>>0]<<16|d[v+3>>0]<<24|0,d[ca>>0]|d[ca+1>>0]<<8|d[ca+2>>0]<<16|d[ca+3>>0]<<24|0)|0;ca=Dd(ca|0,C|0,R|0,P|0)|0;v=C;aa=aa^ca;ba=ba^v;Q=Dd(ba|0,aa|0,-205731576,1779033703)|0;T=C;la=Q^la;ma=T^ma;O=Gd(la|0,ma|0,24)|0;L=C;ma=Hd(la|0,ma|0,40)|0;O=ma|O;L=C|L;v=Dd(W|0,U|0,ca|0,v|0)|0;v=Dd(v|0,C|0,O|0,L|0)|0;ca=C;ba=v^ba;aa=ca^aa;ma=Gd(ba|0,aa|0,16)|0;la=C;aa=Hd(ba|0,aa|0,48)|0;ma=aa|ma;la=C|la;T=Dd(ma|0,la|0,Q|0,T|0)|0;Q=C;O=T^O;L=Q^L;aa=Gd(O|0,L|0,63)|0;ba=C;L=Hd(O|0,L|0,1)|0;aa=L|aa;ba=C|ba;oa=Dd(ha|0,ia|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,t|0,x|0)|0;na=C;Z=Z^oa;_=_^na;L=Dd(_|0,Z|0,-2067093701,-1150833019)|0;O=C;ha=L^ha;ia=O^ia;J=Gd(ha|0,ia|0,24)|0;G=C;ia=Hd(ha|0,ia|0,40)|0;J=ia|J;G=C|G;na=Dd(h|0,l|0,oa|0,na|0)|0;na=Dd(na|0,C|0,J|0,G|0)|0;oa=C;_=na^_;Z=oa^Z;ia=Gd(_|0,Z|0,16)|0;ha=C;Z=Hd(_|0,Z|0,48)|0;ia=Z|ia;ha=C|ha;O=Dd(ia|0,ha|0,L|0,O|0)|0;L=C;J=O^J;G=L^G;Z=Gd(J|0,G|0,63)|0;_=C;G=Hd(J|0,G|0,1)|0;Z=G|Z;_=C|_;ka=Dd(ta|0,ua|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,p|0,$|0)|0;ja=C;V=V^ka;X=X^ja;G=Dd(X|0,V|0,-23791573,1013904242)|0;J=C;ta=G^ta;ua=J^ua;E=Gd(ta|0,ua|0,24)|0;z=C;ua=Hd(ta|0,ua|0,40)|0;E=ua|E;z=C|z;ja=Dd(H|0,F|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,E|0,z|0)|0;ka=C;X=ja^X;V=ka^V;ua=Gd(X|0,V|0,16)|0;ta=C;V=Hd(X|0,V|0,48)|0;ua=V|ua;ta=C|ta;J=Dd(ua|0,ta|0,G|0,J|0)|0;G=C;E=J^E;z=G^z;V=Gd(E|0,z|0,63)|0;X=C;z=Hd(E|0,z|0,1)|0;V=z|V;X=C|X;ga=Dd(pa|0,qa|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,s|0,u|0)|0;fa=C;da=da^ga;ea=ea^fa;z=Dd(ea|0,da|0,1595750129,-1521486534)|0;E=C;pa=z^pa;qa=E^qa;wa=Gd(pa|0,qa|0,24)|0;va=C;qa=Hd(pa|0,qa|0,40)|0;wa=qa|wa;va=C|va;fa=Dd(n|0,r|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ea=fa^ea;da=ga^da;qa=Gd(ea|0,da|0,16)|0;pa=C;da=Hd(ea|0,da|0,48)|0;qa=da|qa;pa=C|pa;E=Dd(qa|0,pa|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;da=Gd(wa|0,va|0,63)|0;ea=C;va=Hd(wa|0,va|0,1)|0;da=va|da;ea=C|ea;ca=Dd(Z|0,_|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,g|0,i|0)|0;v=C;qa=qa^ca;pa=pa^v;G=Dd(pa|0,qa|0,J|0,G|0)|0;J=C;Z=G^Z;_=J^_;va=Gd(Z|0,_|0,24)|0;wa=C;_=Hd(Z|0,_|0,40)|0;va=_|va;wa=C|wa;v=Dd(j|0,Y|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;pa=v^pa;qa=ca^qa;_=Gd(pa|0,qa|0,16)|0;Z=C;qa=Hd(pa|0,qa|0,48)|0;_=qa|_;Z=C|Z;J=Dd(_|0,Z|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;qa=Gd(va|0,wa|0,63)|0;pa=C;wa=Hd(va|0,wa|0,1)|0;qa=wa|qa;pa=C|pa;oa=Dd(V|0,X|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,m|0,o|0)|0;na=C;ma=ma^oa;la=la^na;z=Dd(la|0,ma|0,E|0,z|0)|0;E=C;V=z^V;X=E^X;wa=Gd(V|0,X|0,24)|0;va=C;X=Hd(V|0,X|0,40)|0;wa=X|wa;va=C|va;na=Dd(M|0,K|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;la=na^la;ma=oa^ma;X=Gd(la|0,ma|0,16)|0;V=C;ma=Hd(la|0,ma|0,48)|0;X=ma|X;V=C|V;E=Dd(X|0,V|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ma=Gd(wa|0,va|0,63)|0;la=C;va=Hd(wa|0,va|0,1)|0;ma=va|ma;la=C|la;ka=Dd(da|0,ea|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,e|0,f|0)|0;ja=C;ia=ia^ka;ha=ha^ja;Q=Dd(ha|0,ia|0,T|0,Q|0)|0;T=C;da=Q^da;ea=T^ea;va=Gd(da|0,ea|0,24)|0;wa=C;ea=Hd(da|0,ea|0,40)|0;va=ea|va;wa=C|wa;ja=Dd(B|0,S|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;ha=ja^ha;ia=ka^ia;ea=Gd(ha|0,ia|0,16)|0;da=C;ia=Hd(ha|0,ia|0,48)|0;ea=ia|ea;da=C|da;T=Dd(ea|0,da|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;ia=Gd(va|0,wa|0,63)|0;ha=C;wa=Hd(va|0,wa|0,1)|0;ia=wa|ia;ha=C|ha;ga=Dd(aa|0,ba|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,ra|0,sa|0)|0;fa=C;ua=ua^ga;ta=ta^fa;L=Dd(ta|0,ua|0,O|0,L|0)|0;O=C;aa=L^aa;ba=O^ba;wa=Gd(aa|0,ba|0,24)|0;va=C;ba=Hd(aa|0,ba|0,40)|0;wa=ba|wa;va=C|va;fa=Dd(y|0,A|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ta=fa^ta;ua=ga^ua;ba=Gd(ta|0,ua|0,16)|0;aa=C;ua=Hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=C|aa;O=Dd(ba|0,aa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ua=Gd(wa|0,va|0,63)|0;ta=C;va=Hd(wa|0,va|0,1)|0;ua=va|ua;ta=C|ta;ca=Dd(ra|0,sa|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,ua|0,ta|0)|0;v=C;X=ca^X;V=v^V;Q=Dd(V|0,X|0,T|0,Q|0)|0;T=C;ua=Q^ua;ta=T^ta;va=Gd(ua|0,ta|0,24)|0;wa=C;ta=Hd(ua|0,ta|0,40)|0;va=ta|va;wa=C|wa;v=Dd(m|0,o|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;V=v^V;X=ca^X;ta=Gd(V|0,X|0,16)|0;ua=C;X=Hd(V|0,X|0,48)|0;ta=X|ta;ua=C|ua;T=Dd(ta|0,ua|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;X=Gd(va|0,wa|0,63)|0;V=C;wa=Hd(va|0,wa|0,1)|0;X=wa|X;V=C|V;oa=Dd(qa|0,pa|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,p|0,$|0)|0;na=C;ea=ea^oa;da=da^na;L=Dd(da|0,ea|0,O|0,L|0)|0;O=C;qa=L^qa;pa=O^pa;wa=Gd(qa|0,pa|0,24)|0;va=C;pa=Hd(qa|0,pa|0,40)|0;wa=pa|wa;va=C|va;na=Dd(g|0,i|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;da=na^da;ea=oa^ea;pa=Gd(da|0,ea|0,16)|0;qa=C;ea=Hd(da|0,ea|0,48)|0;pa=ea|pa;qa=C|qa;O=Dd(pa|0,qa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ea=Gd(wa|0,va|0,63)|0;da=C;va=Hd(wa|0,va|0,1)|0;ea=va|ea;da=C|da;ka=Dd(ma|0,la|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,j|0,Y|0)|0;ja=C;ba=ba^ka;aa=aa^ja;G=Dd(aa|0,ba|0,J|0,G|0)|0;J=C;ma=G^ma;la=J^la;va=Gd(ma|0,la|0,24)|0;wa=C;la=Hd(ma|0,la|0,40)|0;va=la|va;wa=C|wa;ja=Dd(y|0,A|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;aa=ja^aa;ba=ka^ba;la=Gd(aa|0,ba|0,16)|0;ma=C;ba=Hd(aa|0,ba|0,48)|0;la=ba|la;ma=C|ma;J=Dd(la|0,ma|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;ba=Gd(va|0,wa|0,63)|0;aa=C;wa=Hd(va|0,wa|0,1)|0;ba=wa|ba;aa=C|aa;ga=Dd(ia|0,ha|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,B|0,S|0)|0;fa=C;_=_^ga;Z=Z^fa;z=Dd(Z|0,_|0,E|0,z|0)|0;E=C;ia=z^ia;ha=E^ha;wa=Gd(ia|0,ha|0,24)|0;va=C;ha=Hd(ia|0,ha|0,40)|0;wa=ha|wa;va=C|va;fa=Dd(s|0,u|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;Z=fa^Z;_=ga^_;ha=Gd(Z|0,_|0,16)|0;ia=C;_=Hd(Z|0,_|0,48)|0;ha=_|ha;ia=C|ia;E=Dd(ha|0,ia|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;_=Gd(wa|0,va|0,63)|0;Z=C;va=Hd(wa|0,va|0,1)|0;_=va|_;Z=C|Z;ca=Dd(ea|0,da|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,W|0,U|0)|0;v=C;ha=ha^ca;ia=ia^v;G=Dd(ia|0,ha|0,J|0,G|0)|0;J=C;ea=G^ea;da=J^da;va=Gd(ea|0,da|0,24)|0;wa=C;da=Hd(ea|0,da|0,40)|0;va=da|va;wa=C|wa;v=Dd(e|0,f|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;ia=v^ia;ha=ca^ha;da=Gd(ia|0,ha|0,16)|0;ea=C;ha=Hd(ia|0,ha|0,48)|0;da=ha|da;ea=C|ea;J=Dd(da|0,ea|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;ha=Gd(va|0,wa|0,63)|0;ia=C;wa=Hd(va|0,wa|0,1)|0;ha=wa|ha;ia=C|ia;oa=Dd(ba|0,aa|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,R|0,P|0)|0;na=C;ta=ta^oa;ua=ua^na;z=Dd(ua|0,ta|0,E|0,z|0)|0;E=C;ba=z^ba;aa=E^aa;wa=Gd(ba|0,aa|0,24)|0;va=C;aa=Hd(ba|0,aa|0,40)|0;wa=aa|wa;va=C|va;na=Dd(t|0,x|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;ua=na^ua;ta=oa^ta;aa=Gd(ua|0,ta|0,16)|0;ba=C;ta=Hd(ua|0,ta|0,48)|0;aa=ta|aa;ba=C|ba;E=Dd(aa|0,ba|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ta=Gd(wa|0,va|0,63)|0;ua=C;va=Hd(wa|0,va|0,1)|0;ta=va|ta;ua=C|ua;ka=Dd(_|0,Z|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,M|0,K|0)|0;ja=C;pa=pa^ka;qa=qa^ja;Q=Dd(qa|0,pa|0,T|0,Q|0)|0;T=C;_=Q^_;Z=T^Z;va=Gd(_|0,Z|0,24)|0;wa=C;Z=Hd(_|0,Z|0,40)|0;va=Z|va;wa=C|wa;ja=Dd(n|0,r|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;qa=ja^qa;pa=ka^pa;Z=Gd(qa|0,pa|0,16)|0;_=C;pa=Hd(qa|0,pa|0,48)|0;Z=pa|Z;_=C|_;T=Dd(Z|0,_|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;pa=Gd(va|0,wa|0,63)|0;qa=C;wa=Hd(va|0,wa|0,1)|0;pa=wa|pa;qa=C|qa;ga=Dd(X|0,V|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,H|0,F|0)|0;fa=C;la=la^ga;ma=ma^fa;L=Dd(ma|0,la|0,O|0,L|0)|0;O=C;X=L^X;V=O^V;wa=Gd(X|0,V|0,24)|0;va=C;V=Hd(X|0,V|0,40)|0;wa=V|wa;va=C|va;fa=Dd(h|0,l|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ma=fa^ma;la=ga^la;V=Gd(ma|0,la|0,16)|0;X=C;la=Hd(ma|0,la|0,48)|0;V=la|V;X=C|X;O=Dd(V|0,X|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;la=Gd(wa|0,va|0,63)|0;ma=C;va=Hd(wa|0,va|0,1)|0;la=va|la;ma=C|ma;ca=Dd(M|0,K|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,la|0,ma|0)|0;v=C;aa=ca^aa;ba=v^ba;Q=Dd(ba|0,aa|0,T|0,Q|0)|0;T=C;la=Q^la;ma=T^ma;va=Gd(la|0,ma|0,24)|0;wa=C;ma=Hd(la|0,ma|0,40)|0;va=ma|va;wa=C|wa;v=Dd(g|0,i|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;ba=v^ba;aa=ca^aa;ma=Gd(ba|0,aa|0,16)|0;la=C;aa=Hd(ba|0,aa|0,48)|0;ma=aa|ma;la=C|la;T=Dd(ma|0,la|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;aa=Gd(va|0,wa|0,63)|0;ba=C;wa=Hd(va|0,wa|0,1)|0;aa=wa|aa;ba=C|ba;oa=Dd(ha|0,ia|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,e|0,f|0)|0;na=C;Z=Z^oa;_=_^na;L=Dd(_|0,Z|0,O|0,L|0)|0;O=C;ha=L^ha;ia=O^ia;wa=Gd(ha|0,ia|0,24)|0;va=C;ia=Hd(ha|0,ia|0,40)|0;wa=ia|wa;va=C|va;na=Dd(R|0,P|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;_=na^_;Z=oa^Z;ia=Gd(_|0,Z|0,16)|0;ha=C;Z=Hd(_|0,Z|0,48)|0;ia=Z|ia;ha=C|ha;O=Dd(ia|0,ha|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;Z=Gd(wa|0,va|0,63)|0;_=C;va=Hd(wa|0,va|0,1)|0;Z=va|Z;_=C|_;ka=Dd(ta|0,ua|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,H|0,F|0)|0;ja=C;V=V^ka;X=X^ja;G=Dd(X|0,V|0,J|0,G|0)|0;J=C;ta=G^ta;ua=J^ua;va=Gd(ta|0,ua|0,24)|0;wa=C;ua=Hd(ta|0,ua|0,40)|0;va=ua|va;wa=C|wa;ja=Dd(t|0,x|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;X=ja^X;V=ka^V;ua=Gd(X|0,V|0,16)|0;ta=C;V=Hd(X|0,V|0,48)|0;ua=V|ua;ta=C|ta;J=Dd(ua|0,ta|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;V=Gd(va|0,wa|0,63)|0;X=C;wa=Hd(va|0,wa|0,1)|0;V=wa|V;X=C|X;ga=Dd(pa|0,qa|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,y|0,A|0)|0;fa=C;da=da^ga;ea=ea^fa;z=Dd(ea|0,da|0,E|0,z|0)|0;E=C;pa=z^pa;qa=E^qa;wa=Gd(pa|0,qa|0,24)|0;va=C;qa=Hd(pa|0,qa|0,40)|0;wa=qa|wa;va=C|va;fa=Dd(B|0,S|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ea=fa^ea;da=ga^da;qa=Gd(ea|0,da|0,16)|0;pa=C;da=Hd(ea|0,da|0,48)|0;qa=da|qa;pa=C|pa;E=Dd(qa|0,pa|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;da=Gd(wa|0,va|0,63)|0;ea=C;va=Hd(wa|0,va|0,1)|0;da=va|da;ea=C|ea;ca=Dd(Z|0,_|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,m|0,o|0)|0;v=C;qa=qa^ca;pa=pa^v;G=Dd(pa|0,qa|0,J|0,G|0)|0;J=C;Z=G^Z;_=J^_;va=Gd(Z|0,_|0,24)|0;wa=C;_=Hd(Z|0,_|0,40)|0;va=_|va;wa=C|wa;v=Dd(ra|0,sa|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;pa=v^pa;qa=ca^qa;_=Gd(pa|0,qa|0,16)|0;Z=C;qa=Hd(pa|0,qa|0,48)|0;_=qa|_;Z=C|Z;J=Dd(_|0,Z|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;qa=Gd(va|0,wa|0,63)|0;pa=C;wa=Hd(va|0,wa|0,1)|0;qa=wa|qa;pa=C|pa;oa=Dd(V|0,X|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,h|0,l|0)|0;na=C;ma=ma^oa;la=la^na;z=Dd(la|0,ma|0,E|0,z|0)|0;E=C;V=z^V;X=E^X;wa=Gd(V|0,X|0,24)|0;va=C;X=Hd(V|0,X|0,40)|0;wa=X|wa;va=C|va;na=Dd(s|0,u|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;la=na^la;ma=oa^ma;X=Gd(la|0,ma|0,16)|0;V=C;ma=Hd(la|0,ma|0,48)|0;X=ma|X;V=C|V;E=Dd(X|0,V|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ma=Gd(wa|0,va|0,63)|0;la=C;va=Hd(wa|0,va|0,1)|0;ma=va|ma;la=C|la;ka=Dd(da|0,ea|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,n|0,r|0)|0;ja=C;ia=ia^ka;ha=ha^ja;Q=Dd(ha|0,ia|0,T|0,Q|0)|0;T=C;da=Q^da;ea=T^ea;va=Gd(da|0,ea|0,24)|0;wa=C;ea=Hd(da|0,ea|0,40)|0;va=ea|va;wa=C|wa;ja=Dd(W|0,U|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;ha=ja^ha;ia=ka^ia;ea=Gd(ha|0,ia|0,16)|0;da=C;ia=Hd(ha|0,ia|0,48)|0;ea=ia|ea;da=C|da;T=Dd(ea|0,da|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;ia=Gd(va|0,wa|0,63)|0;ha=C;wa=Hd(va|0,wa|0,1)|0;ia=wa|ia;ha=C|ha;ga=Dd(aa|0,ba|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,j|0,Y|0)|0;fa=C;ua=ua^ga;ta=ta^fa;L=Dd(ta|0,ua|0,O|0,L|0)|0;O=C;aa=L^aa;ba=O^ba;wa=Gd(aa|0,ba|0,24)|0;va=C;ba=Hd(aa|0,ba|0,40)|0;wa=ba|wa;va=C|va;fa=Dd(p|0,$|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ta=fa^ta;ua=ga^ua;ba=Gd(ta|0,ua|0,16)|0;aa=C;ua=Hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=C|aa;O=Dd(ba|0,aa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ua=Gd(wa|0,va|0,63)|0;ta=C;va=Hd(wa|0,va|0,1)|0;ua=va|ua;ta=C|ta;ca=Dd(n|0,r|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,ua|0,ta|0)|0;v=C;X=ca^X;V=v^V;Q=Dd(V|0,X|0,T|0,Q|0)|0;T=C;ua=Q^ua;ta=T^ta;va=Gd(ua|0,ta|0,24)|0;wa=C;ta=Hd(ua|0,ta|0,40)|0;va=ta|va;wa=C|wa;v=Dd(j|0,Y|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;V=v^V;X=ca^X;ta=Gd(V|0,X|0,16)|0;ua=C;X=Hd(V|0,X|0,48)|0;ta=X|ta;ua=C|ua;T=Dd(ta|0,ua|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;X=Gd(va|0,wa|0,63)|0;V=C;wa=Hd(va|0,wa|0,1)|0;X=wa|X;V=C|V;oa=Dd(qa|0,pa|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,h|0,l|0)|0;na=C;ea=ea^oa;da=da^na;L=Dd(da|0,ea|0,O|0,L|0)|0;O=C;qa=L^qa;pa=O^pa;wa=Gd(qa|0,pa|0,24)|0;va=C;pa=Hd(qa|0,pa|0,40)|0;wa=pa|wa;va=C|va;na=Dd(W|0,U|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;da=na^da;ea=oa^ea;pa=Gd(da|0,ea|0,16)|0;qa=C;ea=Hd(da|0,ea|0,48)|0;pa=ea|pa;qa=C|qa;O=Dd(pa|0,qa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ea=Gd(wa|0,va|0,63)|0;da=C;va=Hd(wa|0,va|0,1)|0;ea=va|ea;da=C|da;ka=Dd(ma|0,la|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,B|0,S|0)|0;ja=C;ba=ba^ka;aa=aa^ja;G=Dd(aa|0,ba|0,J|0,G|0)|0;J=C;ma=G^ma;la=J^la;va=Gd(ma|0,la|0,24)|0;wa=C;la=Hd(ma|0,la|0,40)|0;va=la|va;wa=C|wa;ja=Dd(e|0,f|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;aa=ja^aa;ba=ka^ba;la=Gd(aa|0,ba|0,16)|0;ma=C;ba=Hd(aa|0,ba|0,48)|0;la=ba|la;ma=C|ma;J=Dd(la|0,ma|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;ba=Gd(va|0,wa|0,63)|0;aa=C;wa=Hd(va|0,wa|0,1)|0;ba=wa|ba;aa=C|aa;ga=Dd(ia|0,ha|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,M|0,K|0)|0;fa=C;_=_^ga;Z=Z^fa;z=Dd(Z|0,_|0,E|0,z|0)|0;E=C;ia=z^ia;ha=E^ha;wa=Gd(ia|0,ha|0,24)|0;va=C;ha=Hd(ia|0,ha|0,40)|0;wa=ha|wa;va=C|va;fa=Dd(ra|0,sa|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;Z=fa^Z;_=ga^_;ha=Gd(Z|0,_|0,16)|0;ia=C;_=Hd(Z|0,_|0,48)|0;ha=_|ha;ia=C|ia;E=Dd(ha|0,ia|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;_=Gd(wa|0,va|0,63)|0;Z=C;va=Hd(wa|0,va|0,1)|0;_=va|_;Z=C|Z;ca=Dd(ea|0,da|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,t|0,x|0)|0;v=C;ha=ha^ca;ia=ia^v;G=Dd(ia|0,ha|0,J|0,G|0)|0;J=C;ea=G^ea;da=J^da;va=Gd(ea|0,da|0,24)|0;wa=C;da=Hd(ea|0,da|0,40)|0;va=da|va;wa=C|wa;v=Dd(s|0,u|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;ia=v^ia;ha=ca^ha;da=Gd(ia|0,ha|0,16)|0;ea=C;ha=Hd(ia|0,ha|0,48)|0;da=ha|da;ea=C|ea;J=Dd(da|0,ea|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;ha=Gd(va|0,wa|0,63)|0;ia=C;wa=Hd(va|0,wa|0,1)|0;ha=wa|ha;ia=C|ia;oa=Dd(ba|0,aa|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,H|0,F|0)|0;na=C;ta=ta^oa;ua=ua^na;z=Dd(ua|0,ta|0,E|0,z|0)|0;E=C;ba=z^ba;aa=E^aa;wa=Gd(ba|0,aa|0,24)|0;va=C;aa=Hd(ba|0,aa|0,40)|0;wa=aa|wa;va=C|va;na=Dd(m|0,o|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;ua=na^ua;ta=oa^ta;aa=Gd(ua|0,ta|0,16)|0;ba=C;ta=Hd(ua|0,ta|0,48)|0;aa=ta|aa;ba=C|ba;E=Dd(aa|0,ba|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ta=Gd(wa|0,va|0,63)|0;ua=C;va=Hd(wa|0,va|0,1)|0;ta=va|ta;ua=C|ua;ka=Dd(_|0,Z|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,p|0,$|0)|0;ja=C;pa=pa^ka;qa=qa^ja;Q=Dd(qa|0,pa|0,T|0,Q|0)|0;T=C;_=Q^_;Z=T^Z;va=Gd(_|0,Z|0,24)|0;wa=C;Z=Hd(_|0,Z|0,40)|0;va=Z|va;wa=C|wa;ja=Dd(R|0,P|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;qa=ja^qa;pa=ka^pa;Z=Gd(qa|0,pa|0,16)|0;_=C;pa=Hd(qa|0,pa|0,48)|0;Z=pa|Z;_=C|_;T=Dd(Z|0,_|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;pa=Gd(va|0,wa|0,63)|0;qa=C;wa=Hd(va|0,wa|0,1)|0;pa=wa|pa;qa=C|qa;ga=Dd(X|0,V|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,y|0,A|0)|0;fa=C;la=la^ga;ma=ma^fa;L=Dd(ma|0,la|0,O|0,L|0)|0;O=C;X=L^X;V=O^V;wa=Gd(X|0,V|0,24)|0;va=C;V=Hd(X|0,V|0,40)|0;wa=V|wa;va=C|va;fa=Dd(g|0,i|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ma=fa^ma;la=ga^la;V=Gd(ma|0,la|0,16)|0;X=C;la=Hd(ma|0,la|0,48)|0;V=la|V;X=C|X;O=Dd(V|0,X|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;la=Gd(wa|0,va|0,63)|0;ma=C;va=Hd(wa|0,va|0,1)|0;la=va|la;ma=C|ma;ca=Dd(j|0,Y|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,la|0,ma|0)|0;v=C;aa=ca^aa;ba=v^ba;Q=Dd(ba|0,aa|0,T|0,Q|0)|0;T=C;la=Q^la;ma=T^ma;va=Gd(la|0,ma|0,24)|0;wa=C;ma=Hd(la|0,ma|0,40)|0;va=ma|va;wa=C|wa;v=Dd(R|0,P|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;ba=v^ba;aa=ca^aa;ma=Gd(ba|0,aa|0,16)|0;la=C;aa=Hd(ba|0,aa|0,48)|0;ma=aa|ma;la=C|la;T=Dd(ma|0,la|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;aa=Gd(va|0,wa|0,63)|0;ba=C;wa=Hd(va|0,wa|0,1)|0;aa=wa|aa;ba=C|ba;oa=Dd(ha|0,ia|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,H|0,F|0)|0;na=C;Z=Z^oa;_=_^na;L=Dd(_|0,Z|0,O|0,L|0)|0;O=C;ha=L^ha;ia=O^ia;wa=Gd(ha|0,ia|0,24)|0;va=C;ia=Hd(ha|0,ia|0,40)|0;wa=ia|wa;va=C|va;na=Dd(n|0,r|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;_=na^_;Z=oa^Z;ia=Gd(_|0,Z|0,16)|0;ha=C;Z=Hd(_|0,Z|0,48)|0;ia=Z|ia;ha=C|ha;O=Dd(ia|0,ha|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;Z=Gd(wa|0,va|0,63)|0;_=C;va=Hd(wa|0,va|0,1)|0;Z=va|Z;_=C|_;ka=Dd(ta|0,ua|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,t|0,x|0)|0;ja=C;V=V^ka;X=X^ja;G=Dd(X|0,V|0,J|0,G|0)|0;J=C;ta=G^ta;ua=J^ua;va=Gd(ta|0,ua|0,24)|0;wa=C;ua=Hd(ta|0,ua|0,40)|0;va=ua|va;wa=C|wa;ja=Dd(p|0,$|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;X=ja^X;V=ka^V;ua=Gd(X|0,V|0,16)|0;ta=C;V=Hd(X|0,V|0,48)|0;ua=V|ua;ta=C|ta;J=Dd(ua|0,ta|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;V=Gd(va|0,wa|0,63)|0;X=C;wa=Hd(va|0,wa|0,1)|0;V=wa|V;X=C|X;ga=Dd(pa|0,qa|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,m|0,o|0)|0;fa=C;da=da^ga;ea=ea^fa;z=Dd(ea|0,da|0,E|0,z|0)|0;E=C;pa=z^pa;qa=E^qa;wa=Gd(pa|0,qa|0,24)|0;va=C;qa=Hd(pa|0,qa|0,40)|0;wa=qa|wa;va=C|va;fa=Dd(y|0,A|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ea=fa^ea;da=ga^da;qa=Gd(ea|0,da|0,16)|0;pa=C;da=Hd(ea|0,da|0,48)|0;qa=da|qa;pa=C|pa;E=Dd(qa|0,pa|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;da=Gd(wa|0,va|0,63)|0;ea=C;va=Hd(wa|0,va|0,1)|0;da=va|da;ea=C|ea;ca=Dd(Z|0,_|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,ra|0,sa|0)|0;v=C;qa=qa^ca;pa=pa^v;G=Dd(pa|0,qa|0,J|0,G|0)|0;J=C;Z=G^Z;_=J^_;va=Gd(Z|0,_|0,24)|0;wa=C;_=Hd(Z|0,_|0,40)|0;va=_|va;wa=C|wa;v=Dd(W|0,U|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;pa=v^pa;qa=ca^qa;_=Gd(pa|0,qa|0,16)|0;Z=C;qa=Hd(pa|0,qa|0,48)|0;_=qa|_;Z=C|Z;J=Dd(_|0,Z|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;qa=Gd(va|0,wa|0,63)|0;pa=C;wa=Hd(va|0,wa|0,1)|0;qa=wa|qa;pa=C|pa;oa=Dd(V|0,X|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,M|0,K|0)|0;na=C;ma=ma^oa;la=la^na;z=Dd(la|0,ma|0,E|0,z|0)|0;E=C;V=z^V;X=E^X;wa=Gd(V|0,X|0,24)|0;va=C;X=Hd(V|0,X|0,40)|0;wa=X|wa;va=C|va;na=Dd(e|0,f|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;la=na^la;ma=oa^ma;X=Gd(la|0,ma|0,16)|0;V=C;ma=Hd(la|0,ma|0,48)|0;X=ma|X;V=C|V;E=Dd(X|0,V|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ma=Gd(wa|0,va|0,63)|0;la=C;va=Hd(wa|0,va|0,1)|0;ma=va|ma;la=C|la;ka=Dd(da|0,ea|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,s|0,u|0)|0;ja=C;ia=ia^ka;ha=ha^ja;Q=Dd(ha|0,ia|0,T|0,Q|0)|0;T=C;da=Q^da;ea=T^ea;va=Gd(da|0,ea|0,24)|0;wa=C;ea=Hd(da|0,ea|0,40)|0;va=ea|va;wa=C|wa;ja=Dd(g|0,i|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;ha=ja^ha;ia=ka^ia;ea=Gd(ha|0,ia|0,16)|0;da=C;ia=Hd(ha|0,ia|0,48)|0;ea=ia|ea;da=C|da;T=Dd(ea|0,da|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;ia=Gd(va|0,wa|0,63)|0;ha=C;wa=Hd(va|0,wa|0,1)|0;ia=wa|ia;ha=C|ha;ga=Dd(aa|0,ba|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,h|0,l|0)|0;fa=C;ua=ua^ga;ta=ta^fa;L=Dd(ta|0,ua|0,O|0,L|0)|0;O=C;aa=L^aa;ba=O^ba;wa=Gd(aa|0,ba|0,24)|0;va=C;ba=Hd(aa|0,ba|0,40)|0;wa=ba|wa;va=C|va;fa=Dd(B|0,S|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ta=fa^ta;ua=ga^ua;ba=Gd(ta|0,ua|0,16)|0;aa=C;ua=Hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=C|aa;O=Dd(ba|0,aa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ua=Gd(wa|0,va|0,63)|0;ta=C;va=Hd(wa|0,va|0,1)|0;ua=va|ua;ta=C|ta;ca=Dd(t|0,x|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,ua|0,ta|0)|0;v=C;X=ca^X;V=v^V;Q=Dd(V|0,X|0,T|0,Q|0)|0;T=C;ua=Q^ua;ta=T^ta;va=Gd(ua|0,ta|0,24)|0;wa=C;ta=Hd(ua|0,ta|0,40)|0;va=ta|va;wa=C|wa;v=Dd(e|0,f|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;V=v^V;X=ca^X;ta=Gd(V|0,X|0,16)|0;ua=C;X=Hd(V|0,X|0,48)|0;ta=X|ta;ua=C|ua;T=Dd(ta|0,ua|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;X=Gd(va|0,wa|0,63)|0;V=C;wa=Hd(va|0,wa|0,1)|0;X=wa|X;V=C|V;oa=Dd(qa|0,pa|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,s|0,u|0)|0;na=C;ea=ea^oa;da=da^na;L=Dd(da|0,ea|0,O|0,L|0)|0;O=C;qa=L^qa;pa=O^pa;wa=Gd(qa|0,pa|0,24)|0;va=C;pa=Hd(qa|0,pa|0,40)|0;wa=pa|wa;va=C|va;na=Dd(m|0,o|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;da=na^da;ea=oa^ea;pa=Gd(da|0,ea|0,16)|0;qa=C;ea=Hd(da|0,ea|0,48)|0;pa=ea|pa;qa=C|qa;O=Dd(pa|0,qa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ea=Gd(wa|0,va|0,63)|0;da=C;va=Hd(wa|0,va|0,1)|0;ea=va|ea;da=C|da;ka=Dd(ma|0,la|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,R|0,P|0)|0;ja=C;ba=ba^ka;aa=aa^ja;G=Dd(aa|0,ba|0,J|0,G|0)|0;J=C;ma=G^ma;la=J^la;va=Gd(ma|0,la|0,24)|0;wa=C;la=Hd(ma|0,la|0,40)|0;va=la|va;wa=C|wa;ja=Dd(M|0,K|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;aa=ja^aa;ba=ka^ba;la=Gd(aa|0,ba|0,16)|0;ma=C;ba=Hd(aa|0,ba|0,48)|0;la=ba|la;ma=C|ma;J=Dd(la|0,ma|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;ba=Gd(va|0,wa|0,63)|0;aa=C;wa=Hd(va|0,wa|0,1)|0;ba=wa|ba;aa=C|aa;ga=Dd(ia|0,ha|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,g|0,i|0)|0;fa=C;_=_^ga;Z=Z^fa;z=Dd(Z|0,_|0,E|0,z|0)|0;E=C;ia=z^ia;ha=E^ha;wa=Gd(ia|0,ha|0,24)|0;va=C;ha=Hd(ia|0,ha|0,40)|0;wa=ha|wa;va=C|va;fa=Dd(h|0,l|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;Z=fa^Z;_=ga^_;ha=Gd(Z|0,_|0,16)|0;ia=C;_=Hd(Z|0,_|0,48)|0;ha=_|ha;ia=C|ia;E=Dd(ha|0,ia|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;_=Gd(wa|0,va|0,63)|0;Z=C;va=Hd(wa|0,va|0,1)|0;_=va|_;Z=C|Z;ca=Dd(ea|0,da|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,p|0,$|0)|0;v=C;ha=ha^ca;ia=ia^v;G=Dd(ia|0,ha|0,J|0,G|0)|0;J=C;ea=G^ea;da=J^da;va=Gd(ea|0,da|0,24)|0;wa=C;da=Hd(ea|0,da|0,40)|0;va=da|va;wa=C|wa;v=Dd(B|0,S|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;ia=v^ia;ha=ca^ha;da=Gd(ia|0,ha|0,16)|0;ea=C;ha=Hd(ia|0,ha|0,48)|0;da=ha|da;ea=C|ea;J=Dd(da|0,ea|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;ha=Gd(va|0,wa|0,63)|0;ia=C;wa=Hd(va|0,wa|0,1)|0;ha=wa|ha;ia=C|ia;oa=Dd(ba|0,aa|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,n|0,r|0)|0;na=C;ta=ta^oa;ua=ua^na;z=Dd(ua|0,ta|0,E|0,z|0)|0;E=C;ba=z^ba;aa=E^aa;wa=Gd(ba|0,aa|0,24)|0;va=C;aa=Hd(ba|0,aa|0,40)|0;wa=aa|wa;va=C|va;na=Dd(H|0,F|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;ua=na^ua;ta=oa^ta;aa=Gd(ua|0,ta|0,16)|0;ba=C;ta=Hd(ua|0,ta|0,48)|0;aa=ta|aa;ba=C|ba;E=Dd(aa|0,ba|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ta=Gd(wa|0,va|0,63)|0;ua=C;va=Hd(wa|0,va|0,1)|0;ta=va|ta;ua=C|ua;ka=Dd(_|0,Z|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,y|0,A|0)|0;ja=C;pa=pa^ka;qa=qa^ja;Q=Dd(qa|0,pa|0,T|0,Q|0)|0;T=C;_=Q^_;Z=T^Z;va=Gd(_|0,Z|0,24)|0;wa=C;Z=Hd(_|0,Z|0,40)|0;va=Z|va;wa=C|wa;ja=Dd(ra|0,sa|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;qa=ja^qa;pa=ka^pa;Z=Gd(qa|0,pa|0,16)|0;_=C;pa=Hd(qa|0,pa|0,48)|0;Z=pa|Z;_=C|_;T=Dd(Z|0,_|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;pa=Gd(va|0,wa|0,63)|0;qa=C;wa=Hd(va|0,wa|0,1)|0;pa=wa|pa;qa=C|qa;ga=Dd(X|0,V|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,W|0,U|0)|0;fa=C;la=la^ga;ma=ma^fa;L=Dd(ma|0,la|0,O|0,L|0)|0;O=C;X=L^X;V=O^V;wa=Gd(X|0,V|0,24)|0;va=C;V=Hd(X|0,V|0,40)|0;wa=V|wa;va=C|va;fa=Dd(j|0,Y|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ma=fa^ma;la=ga^la;V=Gd(ma|0,la|0,16)|0;X=C;la=Hd(ma|0,la|0,48)|0;V=la|V;X=C|X;O=Dd(V|0,X|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;la=Gd(wa|0,va|0,63)|0;ma=C;va=Hd(wa|0,va|0,1)|0;la=va|la;ma=C|ma;ca=Dd(e|0,f|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,la|0,ma|0)|0;v=C;aa=ca^aa;ba=v^ba;Q=Dd(ba|0,aa|0,T|0,Q|0)|0;T=C;la=Q^la;ma=T^ma;va=Gd(la|0,ma|0,24)|0;wa=C;ma=Hd(la|0,ma|0,40)|0;va=ma|va;wa=C|wa;v=Dd(H|0,F|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;ba=v^ba;aa=ca^aa;ma=Gd(ba|0,aa|0,16)|0;la=C;aa=Hd(ba|0,aa|0,48)|0;ma=aa|ma;la=C|la;T=Dd(ma|0,la|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;aa=Gd(va|0,wa|0,63)|0;ba=C;wa=Hd(va|0,wa|0,1)|0;aa=wa|aa;ba=C|ba;oa=Dd(ha|0,ia|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,W|0,U|0)|0;na=C;Z=Z^oa;_=_^na;L=Dd(_|0,Z|0,O|0,L|0)|0;O=C;ha=L^ha;ia=O^ia;wa=Gd(ha|0,ia|0,24)|0;va=C;ia=Hd(ha|0,ia|0,40)|0;wa=ia|wa;va=C|va;na=Dd(y|0,A|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;_=na^_;Z=oa^Z;ia=Gd(_|0,Z|0,16)|0;ha=C;Z=Hd(_|0,Z|0,48)|0;ia=Z|ia;ha=C|ha;O=Dd(ia|0,ha|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;Z=Gd(wa|0,va|0,63)|0;_=C;va=Hd(wa|0,va|0,1)|0;Z=va|Z;_=C|_;ka=Dd(ta|0,ua|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,ra|0,sa|0)|0;ja=C;V=V^ka;X=X^ja;G=Dd(X|0,V|0,J|0,G|0)|0;J=C;ta=G^ta;ua=J^ua;va=Gd(ta|0,ua|0,24)|0;wa=C;ua=Hd(ta|0,ua|0,40)|0;va=ua|va;wa=C|wa;ja=Dd(B|0,S|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;X=ja^X;V=ka^V;ua=Gd(X|0,V|0,16)|0;ta=C;V=Hd(X|0,V|0,48)|0;ua=V|ua;ta=C|ta;J=Dd(ua|0,ta|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;V=Gd(va|0,wa|0,63)|0;X=C;wa=Hd(va|0,wa|0,1)|0;V=wa|V;X=C|X;ga=Dd(pa|0,qa|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,p|0,$|0)|0;fa=C;da=da^ga;ea=ea^fa;z=Dd(ea|0,da|0,E|0,z|0)|0;E=C;pa=z^pa;qa=E^qa;wa=Gd(pa|0,qa|0,24)|0;va=C;qa=Hd(pa|0,qa|0,40)|0;wa=qa|wa;va=C|va;fa=Dd(m|0,o|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ea=fa^ea;da=ga^da;qa=Gd(ea|0,da|0,16)|0;pa=C;da=Hd(ea|0,da|0,48)|0;qa=da|qa;pa=C|pa;E=Dd(qa|0,pa|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;da=Gd(wa|0,va|0,63)|0;ea=C;va=Hd(wa|0,va|0,1)|0;da=va|da;ea=C|ea;ca=Dd(Z|0,_|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,R|0,P|0)|0;v=C;qa=qa^ca;pa=pa^v;G=Dd(pa|0,qa|0,J|0,G|0)|0;J=C;Z=G^Z;_=J^_;va=Gd(Z|0,_|0,24)|0;wa=C;_=Hd(Z|0,_|0,40)|0;va=_|va;wa=C|wa;v=Dd(n|0,r|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;pa=v^pa;qa=ca^qa;_=Gd(pa|0,qa|0,16)|0;Z=C;qa=Hd(pa|0,qa|0,48)|0;_=qa|_;Z=C|Z;J=Dd(_|0,Z|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;qa=Gd(va|0,wa|0,63)|0;pa=C;wa=Hd(va|0,wa|0,1)|0;qa=wa|qa;pa=C|pa;oa=Dd(V|0,X|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,s|0,u|0)|0;na=C;ma=ma^oa;la=la^na;z=Dd(la|0,ma|0,E|0,z|0)|0;E=C;V=z^V;X=E^X;wa=Gd(V|0,X|0,24)|0;va=C;X=Hd(V|0,X|0,40)|0;wa=X|wa;va=C|va;na=Dd(h|0,l|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;la=na^la;ma=oa^ma;X=Gd(la|0,ma|0,16)|0;V=C;ma=Hd(la|0,ma|0,48)|0;X=ma|X;V=C|V;E=Dd(X|0,V|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ma=Gd(wa|0,va|0,63)|0;la=C;va=Hd(wa|0,va|0,1)|0;ma=va|ma;la=C|la;ka=Dd(da|0,ea|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,j|0,Y|0)|0;ja=C;ia=ia^ka;ha=ha^ja;Q=Dd(ha|0,ia|0,T|0,Q|0)|0;T=C;da=Q^da;ea=T^ea;va=Gd(da|0,ea|0,24)|0;wa=C;ea=Hd(da|0,ea|0,40)|0;va=ea|va;wa=C|wa;ja=Dd(t|0,x|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;ha=ja^ha;ia=ka^ia;ea=Gd(ha|0,ia|0,16)|0;da=C;ia=Hd(ha|0,ia|0,48)|0;ea=ia|ea;da=C|da;T=Dd(ea|0,da|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;ia=Gd(va|0,wa|0,63)|0;ha=C;wa=Hd(va|0,wa|0,1)|0;ia=wa|ia;ha=C|ha;ga=Dd(aa|0,ba|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,g|0,i|0)|0;fa=C;ua=ua^ga;ta=ta^fa;L=Dd(ta|0,ua|0,O|0,L|0)|0;O=C;aa=L^aa;ba=O^ba;wa=Gd(aa|0,ba|0,24)|0;va=C;ba=Hd(aa|0,ba|0,40)|0;wa=ba|wa;va=C|va;fa=Dd(M|0,K|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ta=fa^ta;ua=ga^ua;ba=Gd(ta|0,ua|0,16)|0;aa=C;ua=Hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=C|aa;O=Dd(ba|0,aa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ua=Gd(wa|0,va|0,63)|0;ta=C;va=Hd(wa|0,va|0,1)|0;ua=va|ua;ta=C|ta;ca=Dd(B|0,S|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,ua|0,ta|0)|0;v=C;X=ca^X;V=v^V;Q=Dd(V|0,X|0,T|0,Q|0)|0;T=C;ua=Q^ua;ta=T^ta;va=Gd(ua|0,ta|0,24)|0;wa=C;ta=Hd(ua|0,ta|0,40)|0;va=ta|va;wa=C|wa;v=Dd(M|0,K|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;V=v^V;X=ca^X;ta=Gd(V|0,X|0,16)|0;ua=C;X=Hd(V|0,X|0,48)|0;ta=X|ta;ua=C|ua;T=Dd(ta|0,ua|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;X=Gd(va|0,wa|0,63)|0;V=C;wa=Hd(va|0,wa|0,1)|0;X=wa|X;V=C|V;oa=Dd(qa|0,pa|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,n|0,r|0)|0;na=C;ea=ea^oa;da=da^na;L=Dd(da|0,ea|0,O|0,L|0)|0;O=C;qa=L^qa;pa=O^pa;wa=Gd(qa|0,pa|0,24)|0;va=C;pa=Hd(qa|0,pa|0,40)|0;wa=pa|wa;va=C|va;na=Dd(ra|0,sa|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;da=na^da;ea=oa^ea;pa=Gd(da|0,ea|0,16)|0;qa=C;ea=Hd(da|0,ea|0,48)|0;pa=ea|pa;qa=C|qa;O=Dd(pa|0,qa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ea=Gd(wa|0,va|0,63)|0;da=C;va=Hd(wa|0,va|0,1)|0;ea=va|ea;da=C|da;ka=Dd(ma|0,la|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,e|0,f|0)|0;ja=C;ba=ba^ka;aa=aa^ja;G=Dd(aa|0,ba|0,J|0,G|0)|0;J=C;ma=G^ma;la=J^la;va=Gd(ma|0,la|0,24)|0;wa=C;la=Hd(ma|0,la|0,40)|0;va=la|va;wa=C|wa;ja=Dd(W|0,U|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;aa=ja^aa;ba=ka^ba;la=Gd(aa|0,ba|0,16)|0;ma=C;ba=Hd(aa|0,ba|0,48)|0;la=ba|la;ma=C|ma;J=Dd(la|0,ma|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;ba=Gd(va|0,wa|0,63)|0;aa=C;wa=Hd(va|0,wa|0,1)|0;ba=wa|ba;aa=C|aa;ga=Dd(ia|0,ha|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,h|0,l|0)|0;fa=C;_=_^ga;Z=Z^fa;z=Dd(Z|0,_|0,E|0,z|0)|0;E=C;ia=z^ia;ha=E^ha;wa=Gd(ia|0,ha|0,24)|0;va=C;ha=Hd(ia|0,ha|0,40)|0;wa=ha|wa;va=C|va;fa=Dd(j|0,Y|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;Z=fa^Z;_=ga^_;ha=Gd(Z|0,_|0,16)|0;ia=C;_=Hd(Z|0,_|0,48)|0;ha=_|ha;ia=C|ia;E=Dd(ha|0,ia|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;_=Gd(wa|0,va|0,63)|0;Z=C;va=Hd(wa|0,va|0,1)|0;_=va|_;Z=C|Z;ca=Dd(ea|0,da|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,H|0,F|0)|0;v=C;ha=ha^ca;ia=ia^v;G=Dd(ia|0,ha|0,J|0,G|0)|0;J=C;ea=G^ea;da=J^da;va=Gd(ea|0,da|0,24)|0;wa=C;da=Hd(ea|0,da|0,40)|0;va=da|va;wa=C|wa;v=Dd(R|0,P|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;ia=v^ia;ha=ca^ha;da=Gd(ia|0,ha|0,16)|0;ea=C;ha=Hd(ia|0,ha|0,48)|0;da=ha|da;ea=C|ea;J=Dd(da|0,ea|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;ha=Gd(va|0,wa|0,63)|0;ia=C;wa=Hd(va|0,wa|0,1)|0;ha=wa|ha;ia=C|ia;oa=Dd(ba|0,aa|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,y|0,A|0)|0;na=C;ta=ta^oa;ua=ua^na;z=Dd(ua|0,ta|0,E|0,z|0)|0;E=C;ba=z^ba;aa=E^aa;wa=Gd(ba|0,aa|0,24)|0;va=C;aa=Hd(ba|0,aa|0,40)|0;wa=aa|wa;va=C|va;na=Dd(p|0,$|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;ua=na^ua;ta=oa^ta;aa=Gd(ua|0,ta|0,16)|0;ba=C;ta=Hd(ua|0,ta|0,48)|0;aa=ta|aa;ba=C|ba;E=Dd(aa|0,ba|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ta=Gd(wa|0,va|0,63)|0;ua=C;va=Hd(wa|0,va|0,1)|0;ta=va|ta;ua=C|ua;ka=Dd(_|0,Z|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,g|0,i|0)|0;ja=C;pa=pa^ka;qa=qa^ja;Q=Dd(qa|0,pa|0,T|0,Q|0)|0;T=C;_=Q^_;Z=T^Z;va=Gd(_|0,Z|0,24)|0;wa=C;Z=Hd(_|0,Z|0,40)|0;va=Z|va;wa=C|wa;ja=Dd(s|0,u|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;qa=ja^qa;pa=ka^pa;Z=Gd(qa|0,pa|0,16)|0;_=C;pa=Hd(qa|0,pa|0,48)|0;Z=pa|Z;_=C|_;T=Dd(Z|0,_|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;pa=Gd(va|0,wa|0,63)|0;qa=C;wa=Hd(va|0,wa|0,1)|0;pa=wa|pa;qa=C|qa;ga=Dd(X|0,V|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,t|0,x|0)|0;fa=C;la=la^ga;ma=ma^fa;L=Dd(ma|0,la|0,O|0,L|0)|0;O=C;X=L^X;V=O^V;wa=Gd(X|0,V|0,24)|0;va=C;V=Hd(X|0,V|0,40)|0;wa=V|wa;va=C|va;fa=Dd(m|0,o|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ma=fa^ma;la=ga^la;V=Gd(ma|0,la|0,16)|0;X=C;la=Hd(ma|0,la|0,48)|0;V=la|V;X=C|X;O=Dd(V|0,X|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;la=Gd(wa|0,va|0,63)|0;ma=C;va=Hd(wa|0,va|0,1)|0;la=va|la;ma=C|ma;ca=Dd(s|0,u|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,la|0,ma|0)|0;v=C;aa=ca^aa;ba=v^ba;Q=Dd(ba|0,aa|0,T|0,Q|0)|0;T=C;la=Q^la;ma=T^ma;va=Gd(la|0,ma|0,24)|0;wa=C;ma=Hd(la|0,ma|0,40)|0;va=ma|va;wa=C|wa;v=Dd(y|0,A|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;ba=v^ba;aa=ca^aa;ma=Gd(ba|0,aa|0,16)|0;la=C;aa=Hd(ba|0,aa|0,48)|0;ma=aa|ma;la=C|la;T=Dd(ma|0,la|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;aa=Gd(va|0,wa|0,63)|0;ba=C;wa=Hd(va|0,wa|0,1)|0;aa=wa|aa;ba=C|ba;oa=Dd(ha|0,ia|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,ra|0,sa|0)|0;na=C;Z=Z^oa;_=_^na;L=Dd(_|0,Z|0,O|0,L|0)|0;O=C;ha=L^ha;ia=O^ia;wa=Gd(ha|0,ia|0,24)|0;va=C;ia=Hd(ha|0,ia|0,40)|0;wa=ia|wa;va=C|va;na=Dd(j|0,Y|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;_=na^_;Z=oa^Z;ia=Gd(_|0,Z|0,16)|0;ha=C;Z=Hd(_|0,Z|0,48)|0;ia=Z|ia;ha=C|ha;O=Dd(ia|0,ha|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;Z=Gd(wa|0,va|0,63)|0;_=C;va=Hd(wa|0,va|0,1)|0;Z=va|Z;_=C|_;ka=Dd(ta|0,ua|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,M|0,K|0)|0;ja=C;V=V^ka;X=X^ja;G=Dd(X|0,V|0,J|0,G|0)|0;J=C;ta=G^ta;ua=J^ua;va=Gd(ta|0,ua|0,24)|0;wa=C;ua=Hd(ta|0,ua|0,40)|0;va=ua|va;wa=C|wa;ja=Dd(h|0,l|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;X=ja^X;V=ka^V;ua=Gd(X|0,V|0,16)|0;ta=C;V=Hd(X|0,V|0,48)|0;ua=V|ua;ta=C|ta;J=Dd(ua|0,ta|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;V=Gd(va|0,wa|0,63)|0;X=C;wa=Hd(va|0,wa|0,1)|0;V=wa|V;X=C|X;ga=Dd(pa|0,qa|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,R|0,P|0)|0;fa=C;da=da^ga;ea=ea^fa;z=Dd(ea|0,da|0,E|0,z|0)|0;E=C;pa=z^pa;qa=E^qa;wa=Gd(pa|0,qa|0,24)|0;va=C;qa=Hd(pa|0,qa|0,40)|0;wa=qa|wa;va=C|va;fa=Dd(g|0,i|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ea=fa^ea;da=ga^da;qa=Gd(ea|0,da|0,16)|0;pa=C;da=Hd(ea|0,da|0,48)|0;qa=da|qa;pa=C|pa;E=Dd(qa|0,pa|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;da=Gd(wa|0,va|0,63)|0;ea=C;va=Hd(wa|0,va|0,1)|0;da=va|da;ea=C|ea;ca=Dd(Z|0,_|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,e|0,f|0)|0;v=C;qa=qa^ca;pa=pa^v;G=Dd(pa|0,qa|0,J|0,G|0)|0;J=C;Z=G^Z;_=J^_;va=Gd(Z|0,_|0,24)|0;wa=C;_=Hd(Z|0,_|0,40)|0;va=_|va;wa=C|wa;v=Dd(t|0,x|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;pa=v^pa;qa=ca^qa;_=Gd(pa|0,qa|0,16)|0;Z=C;qa=Hd(pa|0,qa|0,48)|0;_=qa|_;Z=C|Z;J=Dd(_|0,Z|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;qa=Gd(va|0,wa|0,63)|0;pa=C;wa=Hd(va|0,wa|0,1)|0;qa=wa|qa;pa=C|pa;oa=Dd(V|0,X|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,B|0,S|0)|0;na=C;ma=ma^oa;la=la^na;z=Dd(la|0,ma|0,E|0,z|0)|0;E=C;V=z^V;X=E^X;wa=Gd(V|0,X|0,24)|0;va=C;X=Hd(V|0,X|0,40)|0;wa=X|wa;va=C|va;na=Dd(n|0,r|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;la=na^la;ma=oa^ma;X=Gd(la|0,ma|0,16)|0;V=C;ma=Hd(la|0,ma|0,48)|0;X=ma|X;V=C|V;E=Dd(X|0,V|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ma=Gd(wa|0,va|0,63)|0;la=C;va=Hd(wa|0,va|0,1)|0;ma=va|ma;la=C|la;ka=Dd(da|0,ea|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,W|0,U|0)|0;ja=C;ia=ia^ka;ha=ha^ja;Q=Dd(ha|0,ia|0,T|0,Q|0)|0;T=C;da=Q^da;ea=T^ea;va=Gd(da|0,ea|0,24)|0;wa=C;ea=Hd(da|0,ea|0,40)|0;va=ea|va;wa=C|wa;ja=Dd(p|0,$|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;ha=ja^ha;ia=ka^ia;ea=Gd(ha|0,ia|0,16)|0;da=C;ia=Hd(ha|0,ia|0,48)|0;ea=ia|ea;da=C|da;T=Dd(ea|0,da|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;ia=Gd(va|0,wa|0,63)|0;ha=C;wa=Hd(va|0,wa|0,1)|0;ia=wa|ia;ha=C|ha;ga=Dd(aa|0,ba|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,m|0,o|0)|0;fa=C;ua=ua^ga;ta=ta^fa;L=Dd(ta|0,ua|0,O|0,L|0)|0;O=C;aa=L^aa;ba=O^ba;wa=Gd(aa|0,ba|0,24)|0;va=C;ba=Hd(aa|0,ba|0,40)|0;wa=ba|wa;va=C|va;fa=Dd(H|0,F|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ta=fa^ta;ua=ga^ua;ba=Gd(ta|0,ua|0,16)|0;aa=C;ua=Hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=C|aa;O=Dd(ba|0,aa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ua=Gd(wa|0,va|0,63)|0;ta=C;va=Hd(wa|0,va|0,1)|0;ua=va|ua;ta=C|ta;ca=Dd(m|0,o|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,ua|0,ta|0)|0;v=C;X=ca^X;V=v^V;Q=Dd(V|0,X|0,T|0,Q|0)|0;T=C;ua=Q^ua;ta=T^ta;va=Gd(ua|0,ta|0,24)|0;wa=C;ta=Hd(ua|0,ta|0,40)|0;va=ta|va;wa=C|wa;v=Dd(t|0,x|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;V=v^V;X=ca^X;ta=Gd(V|0,X|0,16)|0;ua=C;X=Hd(V|0,X|0,48)|0;ta=X|ta;ua=C|ua;T=Dd(ta|0,ua|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;X=Gd(va|0,wa|0,63)|0;V=C;wa=Hd(va|0,wa|0,1)|0;X=wa|X;V=C|V;oa=Dd(qa|0,pa|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,g|0,i|0)|0;na=C;ea=ea^oa;da=da^na;L=Dd(da|0,ea|0,O|0,L|0)|0;O=C;qa=L^qa;pa=O^pa;wa=Gd(qa|0,pa|0,24)|0;va=C;pa=Hd(qa|0,pa|0,40)|0;wa=pa|wa;va=C|va;na=Dd(p|0,$|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;da=na^da;ea=oa^ea;pa=Gd(da|0,ea|0,16)|0;qa=C;ea=Hd(da|0,ea|0,48)|0;pa=ea|pa;qa=C|qa;O=Dd(pa|0,qa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ea=Gd(wa|0,va|0,63)|0;da=C;va=Hd(wa|0,va|0,1)|0;ea=va|ea;da=C|da;ka=Dd(ma|0,la|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,n|0,r|0)|0;ja=C;ba=ba^ka;aa=aa^ja;G=Dd(aa|0,ba|0,J|0,G|0)|0;J=C;ma=G^ma;la=J^la;va=Gd(ma|0,la|0,24)|0;wa=C;la=Hd(ma|0,la|0,40)|0;va=la|va;wa=C|wa;ja=Dd(s|0,u|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;aa=ja^aa;ba=ka^ba;la=Gd(aa|0,ba|0,16)|0;ma=C;ba=Hd(aa|0,ba|0,48)|0;la=ba|la;ma=C|ma;J=Dd(la|0,ma|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;ba=Gd(va|0,wa|0,63)|0;aa=C;wa=Hd(va|0,wa|0,1)|0;ba=wa|ba;aa=C|aa;ga=Dd(ia|0,ha|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,W|0,U|0)|0;fa=C;_=_^ga;Z=Z^fa;z=Dd(Z|0,_|0,E|0,z|0)|0;E=C;ia=z^ia;ha=E^ha;wa=Gd(ia|0,ha|0,24)|0;va=C;ha=Hd(ia|0,ha|0,40)|0;wa=ha|wa;va=C|va;fa=Dd(H|0,F|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;Z=fa^Z;_=ga^_;ha=Gd(Z|0,_|0,16)|0;ia=C;_=Hd(Z|0,_|0,48)|0;ha=_|ha;ia=C|ia;E=Dd(ha|0,ia|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;_=Gd(wa|0,va|0,63)|0;Z=C;va=Hd(wa|0,va|0,1)|0;_=va|_;Z=C|Z;ca=Dd(ea|0,da|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,y|0,A|0)|0;v=C;ha=ha^ca;ia=ia^v;G=Dd(ia|0,ha|0,J|0,G|0)|0;J=C;ea=G^ea;da=J^da;va=Gd(ea|0,da|0,24)|0;wa=C;da=Hd(ea|0,da|0,40)|0;va=da|va;wa=C|wa;v=Dd(M|0,K|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;ia=v^ia;ha=ca^ha;da=Gd(ia|0,ha|0,16)|0;ea=C;ha=Hd(ia|0,ha|0,48)|0;da=ha|da;ea=C|ea;J=Dd(da|0,ea|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;ha=Gd(va|0,wa|0,63)|0;ia=C;wa=Hd(va|0,wa|0,1)|0;ha=wa|ha;ia=C|ia;oa=Dd(ba|0,aa|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,j|0,Y|0)|0;na=C;ta=ta^oa;ua=ua^na;z=Dd(ua|0,ta|0,E|0,z|0)|0;E=C;ba=z^ba;aa=E^aa;wa=Gd(ba|0,aa|0,24)|0;va=C;aa=Hd(ba|0,aa|0,40)|0;wa=aa|wa;va=C|va;na=Dd(ra|0,sa|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;ua=na^ua;ta=oa^ta;aa=Gd(ua|0,ta|0,16)|0;ba=C;ta=Hd(ua|0,ta|0,48)|0;aa=ta|aa;ba=C|ba;E=Dd(aa|0,ba|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ta=Gd(wa|0,va|0,63)|0;ua=C;va=Hd(wa|0,va|0,1)|0;ta=va|ta;ua=C|ua;ka=Dd(_|0,Z|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,h|0,l|0)|0;ja=C;pa=pa^ka;qa=qa^ja;Q=Dd(qa|0,pa|0,T|0,Q|0)|0;T=C;_=Q^_;Z=T^Z;va=Gd(_|0,Z|0,24)|0;wa=C;Z=Hd(_|0,Z|0,40)|0;va=Z|va;wa=C|wa;ja=Dd(e|0,f|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;qa=ja^qa;pa=ka^pa;Z=Gd(qa|0,pa|0,16)|0;_=C;pa=Hd(qa|0,pa|0,48)|0;Z=pa|Z;_=C|_;T=Dd(Z|0,_|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;pa=Gd(va|0,wa|0,63)|0;qa=C;wa=Hd(va|0,wa|0,1)|0;pa=wa|pa;qa=C|qa;ga=Dd(X|0,V|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,B|0,S|0)|0;fa=C;la=la^ga;ma=ma^fa;L=Dd(ma|0,la|0,O|0,L|0)|0;O=C;X=L^X;V=O^V;wa=Gd(X|0,V|0,24)|0;va=C;V=Hd(X|0,V|0,40)|0;wa=V|wa;va=C|va;fa=Dd(R|0,P|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ma=fa^ma;la=ga^la;V=Gd(ma|0,la|0,16)|0;X=C;la=Hd(ma|0,la|0,48)|0;V=la|V;X=C|X;O=Dd(V|0,X|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;la=Gd(wa|0,va|0,63)|0;ma=C;va=Hd(wa|0,va|0,1)|0;la=va|la;ma=C|ma;ca=Dd(R|0,P|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,la|0,ma|0)|0;v=C;aa=ca^aa;ba=v^ba;Q=Dd(ba|0,aa|0,T|0,Q|0)|0;T=C;la=Q^la;ma=T^ma;va=Gd(la|0,ma|0,24)|0;wa=C;ma=Hd(la|0,ma|0,40)|0;va=ma|va;wa=C|wa;v=Dd(W|0,U|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;ba=v^ba;aa=ca^aa;ma=Gd(ba|0,aa|0,16)|0;la=C;aa=Hd(ba|0,aa|0,48)|0;ma=aa|ma;la=C|la;T=Dd(ma|0,la|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;aa=Gd(va|0,wa|0,63)|0;ba=C;wa=Hd(va|0,wa|0,1)|0;aa=wa|aa;ba=C|ba;oa=Dd(ha|0,ia|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,t|0,x|0)|0;na=C;Z=Z^oa;_=_^na;L=Dd(_|0,Z|0,O|0,L|0)|0;O=C;ha=L^ha;ia=O^ia;wa=Gd(ha|0,ia|0,24)|0;va=C;ia=Hd(ha|0,ia|0,40)|0;wa=ia|wa;va=C|va;na=Dd(h|0,l|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;_=na^_;Z=oa^Z;ia=Gd(_|0,Z|0,16)|0;ha=C;Z=Hd(_|0,Z|0,48)|0;ia=Z|ia;ha=C|ha;O=Dd(ia|0,ha|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;Z=Gd(wa|0,va|0,63)|0;_=C;va=Hd(wa|0,va|0,1)|0;Z=va|Z;_=C|_;ka=Dd(ta|0,ua|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,p|0,$|0)|0;ja=C;V=V^ka;X=X^ja;G=Dd(X|0,V|0,J|0,G|0)|0;J=C;ta=G^ta;ua=J^ua;va=Gd(ta|0,ua|0,24)|0;wa=C;ua=Hd(ta|0,ua|0,40)|0;va=ua|va;wa=C|wa;ja=Dd(H|0,F|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;X=ja^X;V=ka^V;ua=Gd(X|0,V|0,16)|0;ta=C;V=Hd(X|0,V|0,48)|0;ua=V|ua;ta=C|ta;J=Dd(ua|0,ta|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;V=Gd(va|0,wa|0,63)|0;X=C;wa=Hd(va|0,wa|0,1)|0;V=wa|V;X=C|X;ga=Dd(pa|0,qa|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,s|0,u|0)|0;fa=C;da=da^ga;ea=ea^fa;z=Dd(ea|0,da|0,E|0,z|0)|0;E=C;pa=z^pa;qa=E^qa;wa=Gd(pa|0,qa|0,24)|0;va=C;qa=Hd(pa|0,qa|0,40)|0;wa=qa|wa;va=C|va;fa=Dd(n|0,r|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ea=fa^ea;da=ga^da;qa=Gd(ea|0,da|0,16)|0;pa=C;da=Hd(ea|0,da|0,48)|0;qa=da|qa;pa=C|pa;E=Dd(qa|0,pa|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;da=Gd(wa|0,va|0,63)|0;ea=C;va=Hd(wa|0,va|0,1)|0;da=va|da;ea=C|ea;ca=Dd(Z|0,_|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,g|0,i|0)|0;v=C;qa=qa^ca;pa=pa^v;G=Dd(pa|0,qa|0,J|0,G|0)|0;J=C;Z=G^Z;_=J^_;va=Gd(Z|0,_|0,24)|0;wa=C;_=Hd(Z|0,_|0,40)|0;va=_|va;wa=C|wa;v=Dd(j|0,Y|0,ca|0,v|0)|0;v=Dd(v|0,C|0,va|0,wa|0)|0;ca=C;pa=v^pa;qa=ca^qa;_=Gd(pa|0,qa|0,16)|0;Z=C;qa=Hd(pa|0,qa|0,48)|0;_=qa|_;Z=C|Z;J=Dd(_|0,Z|0,G|0,J|0)|0;G=C;va=J^va;wa=G^wa;qa=Gd(va|0,wa|0,63)|0;pa=C;wa=Hd(va|0,wa|0,1)|0;qa=wa|qa;pa=C|pa;oa=Dd(V|0,X|0,na|0,oa|0)|0;oa=Dd(oa|0,C|0,m|0,o|0)|0;na=C;ma=ma^oa;la=la^na;z=Dd(la|0,ma|0,E|0,z|0)|0;E=C;V=z^V;X=E^X;wa=Gd(V|0,X|0,24)|0;va=C;X=Hd(V|0,X|0,40)|0;wa=X|wa;va=C|va;na=Dd(M|0,K|0,oa|0,na|0)|0;na=Dd(na|0,C|0,wa|0,va|0)|0;oa=C;la=na^la;ma=oa^ma;X=Gd(la|0,ma|0,16)|0;V=C;ma=Hd(la|0,ma|0,48)|0;X=ma|X;V=C|V;E=Dd(X|0,V|0,z|0,E|0)|0;z=C;wa=E^wa;va=z^va;ma=Gd(wa|0,va|0,63)|0;la=C;va=Hd(wa|0,va|0,1)|0;ma=va|ma;la=C|la;ka=Dd(da|0,ea|0,ja|0,ka|0)|0;ka=Dd(ka|0,C|0,e|0,f|0)|0;ja=C;ia=ia^ka;ha=ha^ja;Q=Dd(ha|0,ia|0,T|0,Q|0)|0;T=C;da=Q^da;ea=T^ea;va=Gd(da|0,ea|0,24)|0;wa=C;ea=Hd(da|0,ea|0,40)|0;va=ea|va;wa=C|wa;ja=Dd(B|0,S|0,ka|0,ja|0)|0;ja=Dd(ja|0,C|0,va|0,wa|0)|0;ka=C;ha=ja^ha;ia=ka^ia;ea=Gd(ha|0,ia|0,16)|0;da=C;ia=Hd(ha|0,ia|0,48)|0;ea=ia|ea;da=C|da;T=Dd(ea|0,da|0,Q|0,T|0)|0;Q=C;va=T^va;wa=Q^wa;ia=Gd(va|0,wa|0,63)|0;ha=C;wa=Hd(va|0,wa|0,1)|0;ia=wa|ia;ha=C|ha;ga=Dd(aa|0,ba|0,fa|0,ga|0)|0;ga=Dd(ga|0,C|0,ra|0,sa|0)|0;fa=C;ua=ua^ga;ta=ta^fa;L=Dd(ta|0,ua|0,O|0,L|0)|0;O=C;aa=L^aa;ba=O^ba;wa=Gd(aa|0,ba|0,24)|0;va=C;ba=Hd(aa|0,ba|0,40)|0;wa=ba|wa;va=C|va;fa=Dd(y|0,A|0,ga|0,fa|0)|0;fa=Dd(fa|0,C|0,wa|0,va|0)|0;ga=C;ta=fa^ta;ua=ga^ua;ba=Gd(ta|0,ua|0,16)|0;aa=C;ua=Hd(ta|0,ua|0,48)|0;ba=ua|ba;aa=C|aa;O=Dd(ba|0,aa|0,L|0,O|0)|0;L=C;wa=O^wa;va=L^va;ua=Gd(wa|0,va|0,63)|0;ta=C;va=Hd(wa|0,va|0,1)|0;ua=va|ua;ta=C|ta;ca=Dd(ra|0,sa|0,v|0,ca|0)|0;ca=Dd(ca|0,C|0,ua|0,ta|0)|0;v=C;X=ca^X;V=v^V;Q=Dd(V|0,X|0,T|0,Q|0)|0;T=C;ua=Q^ua;ta=T^ta;sa=Gd(ua|0,ta|0,24)|0;ra=C;ta=Hd(ua|0,ta|0,40)|0;sa=ta|sa;ra=C|ra;v=Dd(m|0,o|0,ca|0,v|0)|0;v=Dd(v|0,C|0,sa|0,ra|0)|0;ca=C;V=v^V;X=ca^X;o=Gd(V|0,X|0,16)|0;m=C;X=Hd(V|0,X|0,48)|0;o=X|o;m=C|m;T=Dd(o|0,m|0,Q|0,T|0)|0;Q=C;sa=T^sa;ra=Q^ra;X=Gd(sa|0,ra|0,63)|0;V=C;ra=Hd(sa|0,ra|0,1)|0;X=ra|X;V=C|V;oa=Dd(qa|0,pa|0,na|0,oa|0)|0;$=Dd(oa|0,C|0,p|0,$|0)|0;p=C;ea=ea^$;da=da^p;L=Dd(da|0,ea|0,O|0,L|0)|0;O=C;qa=L^qa;pa=O^pa;oa=Gd(qa|0,pa|0,24)|0;na=C;pa=Hd(qa|0,pa|0,40)|0;oa=pa|oa;na=C|na;p=Dd(g|0,i|0,$|0,p|0)|0;p=Dd(p|0,C|0,oa|0,na|0)|0;$=C;da=p^da;ea=$^ea;i=Gd(da|0,ea|0,16)|0;g=C;ea=Hd(da|0,ea|0,48)|0;i=ea|i;g=C|g;O=Dd(i|0,g|0,L|0,O|0)|0;L=C;oa=O^oa;na=L^na;ea=Gd(oa|0,na|0,63)|0;da=C;na=Hd(oa|0,na|0,1)|0;ea=na|ea;da=C|da;ka=Dd(ma|0,la|0,ja|0,ka|0)|0;Y=Dd(ka|0,C|0,j|0,Y|0)|0;j=C;ba=ba^Y;aa=aa^j;G=Dd(aa|0,ba|0,J|0,G|0)|0;J=C;ma=G^ma;la=J^la;ka=Gd(ma|0,la|0,24)|0;ja=C;la=Hd(ma|0,la|0,40)|0;ka=la|ka;ja=C|ja;j=Dd(y|0,A|0,Y|0,j|0)|0;j=Dd(j|0,C|0,ka|0,ja|0)|0;Y=C;aa=j^aa;ba=Y^ba;A=Gd(aa|0,ba|0,16)|0;y=C;ba=Hd(aa|0,ba|0,48)|0;A=ba|A;y=C|y;J=Dd(A|0,y|0,G|0,J|0)|0;G=C;ka=J^ka;ja=G^ja;ba=Gd(ka|0,ja|0,63)|0;aa=C;ja=Hd(ka|0,ja|0,1)|0;ba=ja|ba;aa=C|aa;ga=Dd(ia|0,ha|0,fa|0,ga|0)|0;S=Dd(ga|0,C|0,B|0,S|0)|0;B=C;_=_^S;Z=Z^B;z=Dd(Z|0,_|0,E|0,z|0)|0;E=C;ia=z^ia;ha=E^ha;ga=Gd(ia|0,ha|0,24)|0;fa=C;ha=Hd(ia|0,ha|0,40)|0;ga=ha|ga;fa=C|fa;B=Dd(s|0,u|0,S|0,B|0)|0;B=Dd(B|0,C|0,ga|0,fa|0)|0;S=C;Z=B^Z;_=S^_;u=Gd(Z|0,_|0,16)|0;s=C;_=Hd(Z|0,_|0,48)|0;u=_|u;s=C|s;E=Dd(u|0,s|0,z|0,E|0)|0;z=C;ga=E^ga;fa=z^fa;_=Gd(ga|0,fa|0,63)|0;Z=C;fa=Hd(ga|0,fa|0,1)|0;_=fa|_;Z=C|Z;ca=Dd(ea|0,da|0,v|0,ca|0)|0;U=Dd(ca|0,C|0,W|0,U|0)|0;W=C;u=u^U;s=s^W;G=Dd(s|0,u|0,J|0,G|0)|0;J=C;ea=G^ea;da=J^da;ca=Gd(ea|0,da|0,24)|0;v=C;da=Hd(ea|0,da|0,40)|0;ca=da|ca;v=C|v;W=Dd(e|0,f|0,U|0,W|0)|0;W=Dd(W|0,C|0,ca|0,v|0)|0;U=C;s=W^s;u=U^u;f=Gd(s|0,u|0,16)|0;e=C;u=Hd(s|0,u|0,48)|0;f=u|f;e=C|e;J=Dd(f|0,e|0,G|0,J|0)|0;G=C;ca=J^ca;v=G^v;u=Gd(ca|0,v|0,63)|0;s=C;v=Hd(ca|0,v|0,1)|0;s=C|s;$=Dd(ba|0,aa|0,p|0,$|0)|0;P=Dd($|0,C|0,R|0,P|0)|0;R=C;o=o^P;m=m^R;z=Dd(m|0,o|0,E|0,z|0)|0;E=C;ba=z^ba;aa=E^aa;$=Gd(ba|0,aa|0,24)|0;p=C;aa=Hd(ba|0,aa|0,40)|0;$=aa|$;p=C|p;R=Dd(t|0,x|0,P|0,R|0)|0;R=Dd(R|0,C|0,$|0,p|0)|0;P=C;m=R^m;o=P^o;x=Gd(m|0,o|0,16)|0;t=C;o=Hd(m|0,o|0,48)|0;x=o|x;t=C|t;E=Dd(x|0,t|0,z|0,E|0)|0;z=C;$=E^$;p=z^p;o=Gd($|0,p|0,63)|0;m=C;p=Hd($|0,p|0,1)|0;m=C|m;Y=Dd(_|0,Z|0,j|0,Y|0)|0;K=Dd(Y|0,C|0,M|0,K|0)|0;M=C;i=i^K;g=g^M;Q=Dd(g|0,i|0,T|0,Q|0)|0;T=C;_=Q^_;Z=T^Z;Y=Gd(_|0,Z|0,24)|0;j=C;Z=Hd(_|0,Z|0,40)|0;Y=Z|Y;j=C|j;M=Dd(n|0,r|0,K|0,M|0)|0;M=Dd(M|0,C|0,Y|0,j|0)|0;K=C;g=M^g;i=K^i;r=Gd(g|0,i|0,16)|0;n=C;i=Hd(g|0,i|0,48)|0;r=i|r;n=C|n;T=Dd(r|0,n|0,Q|0,T|0)|0;Q=C;Y=T^Y;j=Q^j;i=Gd(Y|0,j|0,63)|0;g=C;j=Hd(Y|0,j|0,1)|0;g=C|g;S=Dd(X|0,V|0,B|0,S|0)|0;F=Dd(S|0,C|0,H|0,F|0)|0;H=C;A=A^F;y=y^H;L=Dd(y|0,A|0,O|0,L|0)|0;O=C;X=L^X;V=O^V;S=Gd(X|0,V|0,24)|0;B=C;V=Hd(X|0,V|0,40)|0;S=V|S;B=C|B;H=Dd(h|0,l|0,F|0,H|0)|0;H=Dd(H|0,C|0,S|0,B|0)|0;F=C;y=H^y;A=F^A;l=Gd(y|0,A|0,16)|0;h=C;A=Hd(y|0,A|0,48)|0;l=A|l;h=C|h;O=Dd(l|0,h|0,L|0,O|0)|0;L=C;S=O^S;B=L^B;A=Gd(S|0,B|0,63)|0;y=C;B=Hd(S|0,B|0,1)|0;S=b;V=S;S=S+4|0;T=W^(d[V>>0]|d[V+1>>0]<<8|d[V+2>>0]<<16|d[V+3>>0]<<24)^T;Q=U^(d[S>>0]|d[S+1>>0]<<8|d[S+2>>0]<<16|d[S+3>>0]<<24)^Q;S=b;a[S>>0]=T;a[S+1>>0]=T>>8;a[S+2>>0]=T>>16;a[S+3>>0]=T>>24;b=b+4|0;a[b>>0]=Q;a[b+1>>0]=Q>>8;a[b+2>>0]=Q>>16;a[b+3>>0]=Q>>24;b=N;Q=b;b=b+4|0;O=R^(d[Q>>0]|d[Q+1>>0]<<8|d[Q+2>>0]<<16|d[Q+3>>0]<<24)^O;L=P^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^L;b=N;N=b;a[N>>0]=O;a[N+1>>0]=O>>8;a[N+2>>0]=O>>16;a[N+3>>0]=O>>24;b=b+4|0;a[b>>0]=L;a[b+1>>0]=L>>8;a[b+2>>0]=L>>16;a[b+3>>0]=L>>24;b=I;L=b;b=b+4|0;J=M^(d[L>>0]|d[L+1>>0]<<8|d[L+2>>0]<<16|d[L+3>>0]<<24)^J;G=K^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^G;b=I;I=b;a[I>>0]=J;a[I+1>>0]=J>>8;a[I+2>>0]=J>>16;a[I+3>>0]=J>>24;b=b+4|0;a[b>>0]=G;a[b+1>>0]=G>>8;a[b+2>>0]=G>>16;a[b+3>>0]=G>>24;b=D;G=b;b=b+4|0;E=H^(d[G>>0]|d[G+1>>0]<<8|d[G+2>>0]<<16|d[G+3>>0]<<24)^E;z=F^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^z;b=D;D=b;a[D>>0]=E;a[D+1>>0]=E>>8;a[D+2>>0]=E>>16;a[D+3>>0]=E>>24;b=b+4|0;a[b>>0]=z;a[b+1>>0]=z>>8;a[b+2>>0]=z>>16;a[b+3>>0]=z>>24;b=w;z=b;b=b+4|0;x=(B|A)^(d[z>>0]|d[z+1>>0]<<8|d[z+2>>0]<<16|d[z+3>>0]<<24)^x;t=(C|y)^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^t;b=w;w=b;a[w>>0]=x;a[w+1>>0]=x>>8;a[w+2>>0]=x>>16;a[w+3>>0]=x>>24;b=b+4|0;a[b>>0]=t;a[b+1>>0]=t>>8;a[b+2>>0]=t>>16;a[b+3>>0]=t>>24;b=q;t=b;b=b+4|0;r=(v|u)^(d[t>>0]|d[t+1>>0]<<8|d[t+2>>0]<<16|d[t+3>>0]<<24)^r;n=s^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^n;b=q;q=b;a[q>>0]=r;a[q+1>>0]=r>>8;a[q+2>>0]=r>>16;a[q+3>>0]=r>>24;b=b+4|0;a[b>>0]=n;a[b+1>>0]=n>>8;a[b+2>>0]=n>>16;a[b+3>>0]=n>>24;b=k;n=b;b=b+4|0;l=(p|o)^(d[n>>0]|d[n+1>>0]<<8|d[n+2>>0]<<16|d[n+3>>0]<<24)^l;h=m^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^h;b=k;k=b;a[k>>0]=l;a[k+1>>0]=l>>8;a[k+2>>0]=l>>16;a[k+3>>0]=l>>24;b=b+4|0;a[b>>0]=h;a[b+1>>0]=h>>8;a[b+2>>0]=h>>16;a[b+3>>0]=h>>24;b=c;h=b;b=b+4|0;f=(j|i)^(d[h>>0]|d[h+1>>0]<<8|d[h+2>>0]<<16|d[h+3>>0]<<24)^f;b=g^(d[b>>0]|d[b+1>>0]<<8|d[b+2>>0]<<16|d[b+3>>0]<<24)^e;e=c;a[e>>0]=f;a[e+1>>0]=f>>8;a[e+2>>0]=f>>16;a[e+3>>0]=f>>24;c=c+4|0;a[c>>0]=b;a[c+1>>0]=b>>8;a[c+2>>0]=b>>16;a[c+3>>0]=b>>24;return}function Bb(){return 64}function Cb(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;m=i=i+63&-64;i=i+208|0;g=m+64|0;h=m;j=8;k=h+64|0;do{c[h>>2]=c[j>>2];h=h+4|0;j=j+4|0}while((h|0)<(k|0));h=Hd(e|0,f|0,3)|0;j=C;k=Gd(e|0,f|0,61)|0;l=m+72|0;c[l>>2]=h;c[l+4>>2]=j;l=g;c[l>>2]=k;c[l+4>>2]=C;l=m+80|0;if(f>>>0<0|(f|0)==0&e>>>0<128){Id(l|0,d|0,e|0)|0;Gb(m,b);i=n;return 0}h=l;j=d;k=h+128|0;do{a[h>>0]=a[j>>0]|0;h=h+1|0;j=j+1|0}while((h|0)<(k|0));Hb(m,l);g=d+128|0;d=Dd(e|0,f|0,-128,-1)|0;h=C;if(h>>>0>0|(h|0)==0&d>>>0>127)do{Hb(m,g);g=g+128|0;d=Dd(d|0,h|0,-128,-1)|0;h=C}while(h>>>0>0|(h|0)==0&d>>>0>127);Id(l|0,g|0,d|0)|0;Gb(m,b);i=n;return 0}function Db(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;n=i;m=i=i+63&-64;i=i+16|0;l=b+32|0;e=l;f=c[e>>2]|0;e=c[e+4>>2]|0;a[m+7>>0]=f;g=Gd(f|0,e|0,8)|0;a[m+6>>0]=g;g=Gd(f|0,e|0,16)|0;a[m+5>>0]=g;g=Gd(f|0,e|0,24)|0;a[m+4>>0]=g;a[m+3>>0]=e;g=Gd(f|0,e|0,40)|0;a[m+2>>0]=g;g=Gd(f|0,e|0,48)|0;a[m+1>>0]=g;g=Gd(f|0,e|0,56)|0;a[m>>0]=g;g=Gd(f|0,e|0,3)|0;g=g&63;k=g>>>0<56?56:120;j=k-g|0;do if((k|0)!=(g|0)){h=Hd(j|0,0,3)|0;f=Dd(h|0,C|0,f|0,e|0)|0;e=C;h=l;c[h>>2]=f;c[h+4>>2]=e;h=64-g|0;g=b+40+g|0;if(j>>>0>>0){Id(g|0,32792,j|0)|0;break}Id(g|0,32792,h|0)|0;k=b+40|0;Eb(b,k);e=32792+h|0;g=Cd(j|0,0,h|0,0)|0;f=C;if(f>>>0>0|(f|0)==0&g>>>0>63){do{Eb(b,e);e=e+64|0;g=Dd(g|0,f|0,-64,-1)|0;f=C}while(f>>>0>0|(f|0)==0&g>>>0>63);f=g}else f=g;Id(k|0,e|0,f|0)|0;e=l;f=c[e>>2]|0;e=c[e+4>>2]|0}while(0);k=Gd(f|0,e|0,3)|0;k=k&63;e=Dd(f|0,e|0,64,0)|0;f=l;c[f>>2]=e;c[f+4>>2]=C;f=64-k|0;e=b+40+k|0;if(f>>>0>8){k=c[m>>2]|0;m=c[m+4>>2]|0;l=e;a[l>>0]=k;a[l+1>>0]=k>>8;a[l+2>>0]=k>>16;a[l+3>>0]=k>>24;e=e+4|0;a[e>>0]=m;a[e+1>>0]=m>>8;a[e+2>>0]=m>>16;a[e+3>>0]=m>>24;e=b}else{Id(e|0,m|0,f|0)|0;h=b+40|0;Eb(b,h);e=m+f|0;g=Cd(8,0,f|0,0)|0;f=C;if(f>>>0>0|(f|0)==0&g>>>0>63){do{Eb(b,e);e=e+64|0;g=Dd(g|0,f|0,-64,-1)|0;f=C}while(f>>>0>0|(f|0)==0&g>>>0>63);f=g}else f=g;Id(h|0,e|0,f|0)|0;e=b}e=c[e>>2]|0;a[d+3>>0]=e;a[d+2>>0]=e>>>8;a[d+1>>0]=e>>>16;a[d>>0]=e>>>24;e=c[b+4>>2]|0;a[d+7>>0]=e;a[d+6>>0]=e>>>8;a[d+5>>0]=e>>>16;a[d+4>>0]=e>>>24;e=c[b+8>>2]|0;a[d+11>>0]=e;a[d+10>>0]=e>>>8;a[d+9>>0]=e>>>16;a[d+8>>0]=e>>>24;e=c[b+12>>2]|0;a[d+15>>0]=e;a[d+14>>0]=e>>>8;a[d+13>>0]=e>>>16;a[d+12>>0]=e>>>24;e=c[b+16>>2]|0;a[d+19>>0]=e;a[d+18>>0]=e>>>8;a[d+17>>0]=e>>>16;a[d+16>>0]=e>>>24;e=c[b+20>>2]|0;a[d+23>>0]=e;a[d+22>>0]=e>>>8;a[d+21>>0]=e>>>16;a[d+20>>0]=e>>>24;e=c[b+24>>2]|0;a[d+27>>0]=e;a[d+26>>0]=e>>>8;a[d+25>>0]=e>>>16;a[d+24>>0]=e>>>24;e=c[b+28>>2]|0;a[d+31>>0]=e;a[d+30>>0]=e>>>8;a[d+29>>0]=e>>>16;a[d+28>>0]=e>>>24;e=b+104|0;do{a[b>>0]=0;b=b+1|0}while((b|0)<(e|0));i=n;return}function Eb(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=i;f=i=i+63&-64;i=i+256|0;e=0;do{h=b+(e<<2)|0;c[f+(e<<2)>>2]=(d[h+2>>0]|0)<<8|(d[h+3>>0]|0)|(d[h+1>>0]|0)<<16|(d[h>>0]|0)<<24;e=e+1|0}while((e|0)!=16);b=c[f>>2]|0;e=16;do{h=c[f+(e+-2<<2)>>2]|0;j=b;b=c[f+(e+-15<<2)>>2]|0;c[f+(e<<2)>>2]=j+(c[f+(e+-7<<2)>>2]|0)+((h>>>19|h<<13)^h>>>10^(h>>>17|h<<15))+((b>>>18|b<<14)^b>>>3^(b>>>7|b<<25));e=e+1|0}while((e|0)!=64);u=c[a>>2]|0;s=a+4|0;t=c[s>>2]|0;q=a+8|0;r=c[q>>2]|0;o=a+12|0;m=a+16|0;n=c[m>>2]|0;k=a+20|0;l=c[k>>2]|0;e=a+24|0;b=c[e>>2]|0;j=a+28|0;h=(c[j>>2]|0)+1116352408+(c[f>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=(c[o>>2]|0)+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+1899447441+(c[f+4>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+-1245643825+(c[f+8>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+-373957723+(c[f+12>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+961987163+(c[f+16>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+1508970993+(c[f+20>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+-1841331548+(c[f+24>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+-1424204075+(c[f+28>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+-670586216+(c[f+32>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+310598401+(c[f+36>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+607225278+(c[f+40>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+1426881987+(c[f+44>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+1925078388+(c[f+48>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+-2132889090+(c[f+52>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+-1680079193+(c[f+56>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+-1046744716+(c[f+60>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+-459576895+(c[f+64>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+-272742522+(c[f+68>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+264347078+(c[f+72>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+604807628+(c[f+76>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+770255983+(c[f+80>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+1249150122+(c[f+84>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+1555081692+(c[f+88>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+1996064986+(c[f+92>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+-1740746414+(c[f+96>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+-1473132947+(c[f+100>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+-1341970488+(c[f+104>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+-1084653625+(c[f+108>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+-958395405+(c[f+112>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+-710438585+(c[f+116>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+113926993+(c[f+120>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+338241895+(c[f+124>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+666307205+(c[f+128>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+773529912+(c[f+132>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+1294757372+(c[f+136>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+1396182291+(c[f+140>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+1695183700+(c[f+144>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+1986661051+(c[f+148>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+-2117940946+(c[f+152>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+-1838011259+(c[f+156>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+-1564481375+(c[f+160>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+-1474664885+(c[f+164>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+-1035236496+(c[f+168>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+-949202525+(c[f+172>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+-778901479+(c[f+176>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+-694614492+(c[f+180>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+-200395387+(c[f+184>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+275423344+(c[f+188>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+430227734+(c[f+192>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+506948616+(c[f+196>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+659060556+(c[f+200>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+883997877+(c[f+204>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+958139571+(c[f+208>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+1322822218+(c[f+212>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+1537002063+(c[f+216>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;u=u+1747873779+(c[f+220>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;n=n+u|0;u=((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+u|0;h=h+1955562222+(c[f+224>>2]|0)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))+((b^l)&n^b)|0;p=p+h|0;h=((r|t)&u|r&t)+((u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10))+h|0;b=b+2024104815+(c[f+228>>2]|0)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))+((l^n)&p^l)|0;r=r+b|0;b=((t|u)&h|t&u)+((h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10))+b|0;l=l+-2067236844+(c[f+232>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((n^p)&r^n)|0;t=t+l|0;l=((u|h)&b|u&h)+((b>>>2|b<<30)^(b>>>13|b<<19)^(b>>>22|b<<10))+l|0;n=n+-1933114872+(c[f+236>>2]|0)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))+((p^r)&t^p)|0;u=u+n|0;n=((h|b)&l|h&b)+((l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10))+n|0;p=p+-1866530822+(c[f+240>>2]|0)+((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((r^t)&u^r)|0;h=h+p|0;p=((b|l)&n|b&l)+((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+p|0;r=r+-1538233109+(c[f+244>>2]|0)+((h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7))+((t^u)&h^t)|0;b=b+r|0;r=((l|n)&p|l&n)+((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+r|0;t=t+-1090935817+(c[f+248>>2]|0)+((b>>>6|b<<26)^(b>>>11|b<<21)^(b>>>25|b<<7))+((u^h)&b^u)|0;l=l+t|0;t=((n|p)&r|n&p)+((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+t|0;f=u+-965641998+(c[f+252>>2]|0)+((l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+((h^b)&l^h)|0;c[a>>2]=(c[a>>2]|0)+(((p|r)&t|p&r)+((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+f);c[s>>2]=(c[s>>2]|0)+t;c[q>>2]=(c[q>>2]|0)+r;c[o>>2]=(c[o>>2]|0)+p;c[m>>2]=(c[m>>2]|0)+(n+f);c[k>>2]=(c[k>>2]|0)+l;c[e>>2]=(c[e>>2]|0)+b;c[j>>2]=(c[j>>2]|0)+h;i=g;return}function Fb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=a+72|0;m=j;o=c[m>>2]|0;m=c[m+4>>2]|0;k=Gd(o|0,m|0,3)|0;k=k&127;l=Hd(d|0,e|0,3)|0;n=C;h=Gd(d|0,e|0,61)|0;i=C;m=Dd(o|0,m|0,l|0,n|0)|0;o=C;c[j>>2]=m;c[j+4>>2]=o;j=a+64|0;g=j;f=c[g>>2]|0;g=c[g+4>>2]|0;if(o>>>0>>0|(o|0)==(n|0)&m>>>0>>0){f=Dd(f|0,g|0,1,0)|0;g=C;o=j;c[o>>2]=f;c[o+4>>2]=g}h=Dd(f|0,g|0,h|0,i|0)|0;g=j;c[g>>2]=h;c[g+4>>2]=C;g=Cd(128,0,k|0,0)|0;h=C;f=a+80+k|0;if(h>>>0>e>>>0|(h|0)==(e|0)&g>>>0>d>>>0){Id(f|0,b|0,d|0)|0;return}Id(f|0,b|0,g|0)|0;i=a+80|0;Hb(a,i);f=b+g|0;g=Cd(d|0,e|0,g|0,h|0)|0;h=C;if(h>>>0>0|(h|0)==0&g>>>0>127)do{Hb(a,f);f=f+128|0;g=Dd(g|0,h|0,-128,-1)|0;h=C}while(h>>>0>0|(h|0)==0&g>>>0>127);Id(i|0,f|0,g|0)|0;return}function Gb(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;s=i;e=i=i+63&-64;i=i+16|0;r=b+64|0;f=r;g=c[f>>2]|0;f=c[f+4>>2]|0;a[e+7>>0]=g;q=Gd(g|0,f|0,8)|0;a[e+6>>0]=q;q=Gd(g|0,f|0,16)|0;a[e+5>>0]=q;q=Gd(g|0,f|0,24)|0;a[e+4>>0]=q;a[e+3>>0]=f;q=Gd(g|0,f|0,40)|0;a[e+2>>0]=q;q=Gd(g|0,f|0,48)|0;a[e+1>>0]=q;q=Gd(g|0,f|0,56)|0;a[e>>0]=q;q=b+72|0;j=q;h=c[j>>2]|0;j=c[j+4>>2]|0;a[e+15>>0]=h;n=Gd(h|0,j|0,8)|0;a[e+14>>0]=n;n=Gd(h|0,j|0,16)|0;a[e+13>>0]=n;n=Gd(h|0,j|0,24)|0;a[e+12>>0]=n;a[e+11>>0]=j;n=Gd(h|0,j|0,40)|0;a[e+10>>0]=n;n=Gd(h|0,j|0,48)|0;a[e+9>>0]=n;n=Gd(h|0,j|0,56)|0;a[e+8>>0]=n;n=Gd(h|0,j|0,3)|0;n=n&127;o=0<0|0==0&n>>>0<112;o=Cd((o?112:240)|0,(o?0:0)|0,n|0,0)|0;p=C;m=Hd(o|0,p|0,3)|0;t=C;k=Gd(o|0,p|0,61)|0;l=C;j=Dd(m|0,t|0,h|0,j|0)|0;h=C;u=q;c[u>>2]=j;c[u+4>>2]=h;if(h>>>0>>0|(h|0)==(t|0)&j>>>0>>0){g=Dd(g|0,f|0,1,0)|0;f=C;u=r;c[u>>2]=g;c[u+4>>2]=f}g=Dd(g|0,f|0,k|0,l|0)|0;f=C;l=r;c[l>>2]=g;c[l+4>>2]=f;l=Cd(128,0,n|0,0)|0;m=C;k=b+80+n|0;if(p>>>0>>0|(p|0)==(m|0)&o>>>0>>0)Id(k|0,32856,o|0)|0;else{Id(k|0,32856,l|0)|0;j=b+80|0;Hb(b,j);f=32856+l|0;g=Cd(o|0,p|0,l|0,m|0)|0;h=C;if(h>>>0>0|(h|0)==0&g>>>0>127)do{Hb(b,f);f=f+128|0;g=Dd(g|0,h|0,-128,-1)|0;h=C}while(h>>>0>0|(h|0)==0&g>>>0>127);Id(j|0,f|0,g|0)|0;h=q;f=r;j=c[h>>2]|0;h=c[h+4>>2]|0;g=c[f>>2]|0;f=c[f+4>>2]|0}k=Gd(j|0,h|0,3)|0;k=k&127;t=Dd(j|0,h|0,128,0)|0;u=q;c[u>>2]=t;c[u+4>>2]=C;if(h>>>0>4294967295|(h|0)==-1&j>>>0>4294967167){g=Dd(g|0,f|0,1,0)|0;f=C;u=r;c[u>>2]=g;c[u+4>>2]=f}h=r;c[h>>2]=g;c[h+4>>2]=f;g=Cd(128,0,k|0,0)|0;h=C;f=b+80+k|0;if(h>>>0>0|(h|0)==0&g>>>0>16){g=f;f=g+16|0;do{a[g>>0]=a[e>>0]|0;g=g+1|0;e=e+1|0}while((g|0)<(f|0))}else{Id(f|0,e|0,g|0)|0;j=b+80|0;Hb(b,j);e=e+g|0;f=Cd(16,0,g|0,h|0)|0;g=C;if(g>>>0>0|(g|0)==0&f>>>0>127)do{Hb(b,e);e=e+128|0;f=Dd(f|0,g|0,-128,-1)|0;g=C}while(g>>>0>0|(g|0)==0&f>>>0>127);Id(j|0,e|0,f|0)|0}e=0;do{u=d+(e<<3)|0;t=b+(e<<3)|0;r=c[t>>2]|0;t=c[t+4>>2]|0;a[u+7>>0]=r;q=Gd(r|0,t|0,8)|0;a[u+6>>0]=q;q=Gd(r|0,t|0,16)|0;a[u+5>>0]=q;q=Gd(r|0,t|0,24)|0;a[u+4>>0]=q;a[u+3>>0]=t;q=Gd(r|0,t|0,40)|0;a[u+2>>0]=q;q=Gd(r|0,t|0,48)|0;a[u+1>>0]=q;t=Gd(r|0,t|0,56)|0;a[u>>0]=t;e=e+1|0}while((e|0)!=8);Fd(b|0,0,208)|0;i=s;return} function yd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;j=c[8020]|0;b=j>>>a;if(b&3){b=(b&1^1)+a|0;d=32120+(b<<1<<2)|0;e=d+8|0;f=c[e>>2]|0;g=f+8|0;h=c[g>>2]|0;do if((d|0)!=(h|0)){if(h>>>0<(c[8024]|0)>>>0)ra();a=h+12|0;if((c[a>>2]|0)==(f|0)){c[a>>2]=d;c[e>>2]=h;break}else ra()}else c[8020]=j&~(1<>2]=G|3;G=f+G+4|0;c[G>>2]=c[G>>2]|1;G=g;return G|0}h=c[8022]|0;if(o>>>0>h>>>0){if(b){d=2<>>12&16;d=d>>>i;f=d>>>5&8;d=d>>>f;g=d>>>2&4;d=d>>>g;e=d>>>1&2;d=d>>>e;b=d>>>1&1;b=(f|i|g|e|b)+(d>>>b)|0;d=32120+(b<<1<<2)|0;e=d+8|0;g=c[e>>2]|0;i=g+8|0;f=c[i>>2]|0;do if((d|0)!=(f|0)){if(f>>>0<(c[8024]|0)>>>0)ra();a=f+12|0;if((c[a>>2]|0)==(g|0)){c[a>>2]=d;c[e>>2]=f;k=c[8022]|0;break}else ra()}else{c[8020]=j&~(1<>2]=o|3;e=g+o|0;c[e+4>>2]=h|1;c[e+h>>2]=h;if(k){f=c[8025]|0;b=k>>>3;d=32120+(b<<1<<2)|0;a=c[8020]|0;b=1<>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();else{l=a;m=b}}else{c[8020]=a|b;l=d+8|0;m=d}c[l>>2]=f;c[m+12>>2]=f;c[f+8>>2]=m;c[f+12>>2]=d}c[8022]=h;c[8025]=e;G=i;return G|0}a=c[8021]|0;if(a){i=(a&0-a)+-1|0;F=i>>>12&16;i=i>>>F;E=i>>>5&8;i=i>>>E;G=i>>>2&4;i=i>>>G;b=i>>>1&2;i=i>>>b;j=i>>>1&1;j=c[32384+((E|F|G|b|j)+(i>>>j)<<2)>>2]|0;i=(c[j+4>>2]&-8)-o|0;b=j;while(1){a=c[b+16>>2]|0;if(!a){a=c[b+20>>2]|0;if(!a)break}b=(c[a+4>>2]&-8)-o|0;G=b>>>0>>0;i=G?b:i;b=a;j=G?a:j}f=c[8024]|0;if(j>>>0>>0)ra();h=j+o|0;if(j>>>0>=h>>>0)ra();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){b=j+20|0;a=c[b>>2]|0;if(!a){b=j+16|0;a=c[b>>2]|0;if(!a){n=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0>>0)ra();else{c[b>>2]=0;n=a;break}}else{e=c[j+8>>2]|0;if(e>>>0>>0)ra();a=e+12|0;if((c[a>>2]|0)!=(j|0))ra();b=d+8|0;if((c[b>>2]|0)==(j|0)){c[a>>2]=d;c[b>>2]=e;n=d;break}else ra()}while(0);do if(g){a=c[j+28>>2]|0;b=32384+(a<<2)|0;if((j|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();a=g+16|0;if((c[a>>2]|0)==(j|0))c[a>>2]=n;else c[g+20>>2]=n;if(!n)break}b=c[8024]|0;if(n>>>0>>0)ra();c[n+24>>2]=g;a=c[j+16>>2]|0;do if(a)if(a>>>0>>0)ra();else{c[n+16>>2]=a;c[a+24>>2]=n;break}while(0);a=c[j+20>>2]|0;if(a)if(a>>>0<(c[8024]|0)>>>0)ra();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}while(0);if(i>>>0<16){G=i+o|0;c[j+4>>2]=G|3;G=j+G+4|0;c[G>>2]=c[G>>2]|1}else{c[j+4>>2]=o|3;c[h+4>>2]=i|1;c[h+i>>2]=i;a=c[8022]|0;if(a){e=c[8025]|0;b=a>>>3;d=32120+(b<<1<<2)|0;a=c[8020]|0;b=1<>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();else{p=a;q=b}}else{c[8020]=a|b;p=d+8|0;q=d}c[p>>2]=e;c[q+12>>2]=e;c[e+8>>2]=q;c[e+12>>2]=d}c[8022]=i;c[8025]=h}G=j+8|0;return G|0}}}else if(a>>>0<=4294967231){a=a+11|0;o=a&-8;k=c[8021]|0;if(k){d=0-o|0;a=a>>>8;if(a)if(o>>>0>16777215)j=31;else{q=(a+1048320|0)>>>16&8;z=a<>>16&4;z=z<>>16&2;j=14-(p|q|j)+(z<>>15)|0;j=o>>>(j+7|0)&1|j<<1}else j=0;b=c[32384+(j<<2)>>2]|0;a:do if(!b){a=0;b=0;z=86}else{f=d;a=0;h=o<<((j|0)==31?0:25-(j>>>1)|0);i=b;b=0;while(1){e=c[i+4>>2]&-8;d=e-o|0;if(d>>>0>>0)if((e|0)==(o|0)){a=i;b=i;z=90;break a}else b=i;else d=f;e=c[i+20>>2]|0;i=c[i+16+(h>>>31<<2)>>2]|0;a=(e|0)==0|(e|0)==(i|0)?a:e;e=(i|0)==0;if(e){z=86;break}else{f=d;h=h<<(e&1^1)}}}while(0);if((z|0)==86){if((a|0)==0&(b|0)==0){a=2<>>12&16;q=q>>>m;l=q>>>5&8;q=q>>>l;n=q>>>2&4;q=q>>>n;p=q>>>1&2;q=q>>>p;a=q>>>1&1;a=c[32384+((l|m|n|p|a)+(q>>>a)<<2)>>2]|0}if(!a){i=d;j=b}else z=90}if((z|0)==90)while(1){z=0;q=(c[a+4>>2]&-8)-o|0;e=q>>>0>>0;d=e?q:d;b=e?a:b;e=c[a+16>>2]|0;if(e){a=e;z=90;continue}a=c[a+20>>2]|0;if(!a){i=d;j=b;break}else z=90}if((j|0)!=0?i>>>0<((c[8022]|0)-o|0)>>>0:0){f=c[8024]|0;if(j>>>0>>0)ra();h=j+o|0;if(j>>>0>=h>>>0)ra();g=c[j+24>>2]|0;d=c[j+12>>2]|0;do if((d|0)==(j|0)){b=j+20|0;a=c[b>>2]|0;if(!a){b=j+16|0;a=c[b>>2]|0;if(!a){s=0;break}}while(1){d=a+20|0;e=c[d>>2]|0;if(e){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0>>0)ra();else{c[b>>2]=0;s=a;break}}else{e=c[j+8>>2]|0;if(e>>>0>>0)ra();a=e+12|0;if((c[a>>2]|0)!=(j|0))ra();b=d+8|0;if((c[b>>2]|0)==(j|0)){c[a>>2]=d;c[b>>2]=e;s=d;break}else ra()}while(0);do if(g){a=c[j+28>>2]|0;b=32384+(a<<2)|0;if((j|0)==(c[b>>2]|0)){c[b>>2]=s;if(!s){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();a=g+16|0;if((c[a>>2]|0)==(j|0))c[a>>2]=s;else c[g+20>>2]=s;if(!s)break}b=c[8024]|0;if(s>>>0>>0)ra();c[s+24>>2]=g;a=c[j+16>>2]|0;do if(a)if(a>>>0>>0)ra();else{c[s+16>>2]=a;c[a+24>>2]=s;break}while(0);a=c[j+20>>2]|0;if(a)if(a>>>0<(c[8024]|0)>>>0)ra();else{c[s+20>>2]=a;c[a+24>>2]=s;break}}while(0);do if(i>>>0>=16){c[j+4>>2]=o|3;c[h+4>>2]=i|1;c[h+i>>2]=i;a=i>>>3;if(i>>>0<256){d=32120+(a<<1<<2)|0;b=c[8020]|0;a=1<>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();else{t=a;v=b}}else{c[8020]=b|a;t=d+8|0;v=d}c[t>>2]=h;c[v+12>>2]=h;c[h+8>>2]=v;c[h+12>>2]=d;break}a=i>>>8;if(a)if(i>>>0>16777215)d=31;else{F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;d=14-(E|F|d)+(G<>>15)|0;d=i>>>(d+7|0)&1|d<<1}else d=0;e=32384+(d<<2)|0;c[h+28>>2]=d;a=h+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[8021]|0;b=1<>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}d=i<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(i|0)){z=148;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){z=145;break}else{d=d<<1;e=a}}if((z|0)==145)if(b>>>0<(c[8024]|0)>>>0)ra();else{c[b>>2]=h;c[h+24>>2]=e;c[h+12>>2]=h;c[h+8>>2]=h;break}else if((z|0)==148){a=e+8|0;b=c[a>>2]|0;G=c[8024]|0;if(b>>>0>=G>>>0&e>>>0>=G>>>0){c[b+12>>2]=h;c[a>>2]=h;c[h+8>>2]=b;c[h+12>>2]=e;c[h+24>>2]=0;break}else ra()}}else{G=i+o|0;c[j+4>>2]=G|3;G=j+G+4|0;c[G>>2]=c[G>>2]|1}while(0);G=j+8|0;return G|0}}}else o=-1;while(0);d=c[8022]|0;if(d>>>0>=o>>>0){a=d-o|0;b=c[8025]|0;if(a>>>0>15){G=b+o|0;c[8025]=G;c[8022]=a;c[G+4>>2]=a|1;c[G+a>>2]=a;c[b+4>>2]=o|3}else{c[8022]=0;c[8025]=0;c[b+4>>2]=d|3;G=b+d+4|0;c[G>>2]=c[G>>2]|1}G=b+8|0;return G|0}a=c[8023]|0;if(a>>>0>o>>>0){E=a-o|0;c[8023]=E;G=c[8026]|0;F=G+o|0;c[8026]=F;c[F+4>>2]=E|1;c[G+4>>2]=o|3;G=G+8|0;return G|0}do if(!(c[8138]|0)){a=na(30)|0;if(!(a+-1&a)){c[8140]=a;c[8139]=a;c[8141]=-1;c[8142]=-1;c[8143]=0;c[8131]=0;c[8138]=(ta(0)|0)&-16^1431655768;break}else ra()}while(0);h=o+48|0;e=c[8140]|0;i=o+47|0;d=e+i|0;e=0-e|0;j=d&e;if(j>>>0<=o>>>0){G=0;return G|0}a=c[8130]|0;if((a|0)!=0?(t=c[8128]|0,v=t+j|0,v>>>0<=t>>>0|v>>>0>a>>>0):0){G=0;return G|0}b:do if(!(c[8131]&4)){b=c[8026]|0;c:do if(b){f=32528;while(1){a=c[f>>2]|0;if(a>>>0<=b>>>0?(r=f+4|0,(a+(c[r>>2]|0)|0)>>>0>b>>>0):0)break;a=c[f+8>>2]|0;if(!a){z=173;break c}else f=a}a=d-(c[8023]|0)&e;if(a>>>0<2147483647){b=sa(a|0)|0;if((b|0)==((c[f>>2]|0)+(c[r>>2]|0)|0)){if((b|0)!=(-1|0)){h=b;g=a;z=193;break b}}else z=183}}else z=173;while(0);do if((z|0)==173?(u=sa(0)|0,(u|0)!=(-1|0)):0){a=u;b=c[8139]|0;d=b+-1|0;if(!(d&a))a=j;else a=j-a+(d+a&0-b)|0;b=c[8128]|0;d=b+a|0;if(a>>>0>o>>>0&a>>>0<2147483647){v=c[8130]|0;if((v|0)!=0?d>>>0<=b>>>0|d>>>0>v>>>0:0)break;b=sa(a|0)|0;if((b|0)==(u|0)){h=u;g=a;z=193;break b}else z=183}}while(0);d:do if((z|0)==183){d=0-a|0;do if(h>>>0>a>>>0&(a>>>0<2147483647&(b|0)!=(-1|0))?(w=c[8140]|0,w=i-a+w&0-w,w>>>0<2147483647):0)if((sa(w|0)|0)==(-1|0)){sa(d|0)|0;break d}else{a=w+a|0;break}while(0);if((b|0)!=(-1|0)){h=b;g=a;z=193;break b}}while(0);c[8131]=c[8131]|4;z=190}else z=190;while(0);if((((z|0)==190?j>>>0<2147483647:0)?(x=sa(j|0)|0,y=sa(0)|0,x>>>0>>0&((x|0)!=(-1|0)&(y|0)!=(-1|0))):0)?(g=y-x|0,g>>>0>(o+40|0)>>>0):0){h=x;z=193}if((z|0)==193){a=(c[8128]|0)+g|0;c[8128]=a;if(a>>>0>(c[8129]|0)>>>0)c[8129]=a;k=c[8026]|0;do if(k){f=32528;while(1){a=c[f>>2]|0;b=f+4|0;d=c[b>>2]|0;if((h|0)==(a+d|0)){z=203;break}e=c[f+8>>2]|0;if(!e)break;else f=e}if(((z|0)==203?(c[f+12>>2]&8|0)==0:0)?k>>>0>>0&k>>>0>=a>>>0:0){c[b>>2]=d+g;G=k+8|0;G=(G&7|0)==0?0:0-G&7;F=k+G|0;G=g-G+(c[8023]|0)|0;c[8026]=F;c[8023]=G;c[F+4>>2]=G|1;c[F+G+4>>2]=40;c[8027]=c[8142];break}a=c[8024]|0;if(h>>>0
>>0){c[8024]=h;i=h}else i=a;b=h+g|0;a=32528;while(1){if((c[a>>2]|0)==(b|0)){z=211;break}a=c[a+8>>2]|0;if(!a){b=32528;break}}if((z|0)==211)if(!(c[a+12>>2]&8)){c[a>>2]=h;m=a+4|0;c[m>>2]=(c[m>>2]|0)+g;m=h+8|0;m=h+((m&7|0)==0?0:0-m&7)|0;a=b+8|0;a=b+((a&7|0)==0?0:0-a&7)|0;l=m+o|0;j=a-m-o|0;c[m+4>>2]=o|3;do if((a|0)!=(k|0)){if((a|0)==(c[8025]|0)){G=(c[8022]|0)+j|0;c[8022]=G;c[8025]=l;c[l+4>>2]=G|1;c[l+G>>2]=G;break}b=c[a+4>>2]|0;if((b&3|0)==1){h=b&-8;f=b>>>3;e:do if(b>>>0>=256){g=c[a+24>>2]|0;e=c[a+12>>2]|0;do if((e|0)==(a|0)){e=a+16|0;d=e+4|0;b=c[d>>2]|0;if(!b){b=c[e>>2]|0;if(!b){E=0;break}else d=e}while(1){e=b+20|0;f=c[e>>2]|0;if(f){b=f;d=e;continue}e=b+16|0;f=c[e>>2]|0;if(!f)break;else{b=f;d=e}}if(d>>>0>>0)ra();else{c[d>>2]=0;E=b;break}}else{f=c[a+8>>2]|0;if(f>>>0>>0)ra();b=f+12|0;if((c[b>>2]|0)!=(a|0))ra();d=e+8|0;if((c[d>>2]|0)==(a|0)){c[b>>2]=e;c[d>>2]=f;E=e;break}else ra()}while(0);if(!g)break;b=c[a+28>>2]|0;d=32384+(b<<2)|0;do if((a|0)!=(c[d>>2]|0)){if(g>>>0<(c[8024]|0)>>>0)ra();b=g+16|0;if((c[b>>2]|0)==(a|0))c[b>>2]=E;else c[g+20>>2]=E;if(!E)break e}else{c[d>>2]=E;if(E)break;c[8021]=c[8021]&~(1<>>0>>0)ra();c[E+24>>2]=g;b=a+16|0;d=c[b>>2]|0;do if(d)if(d>>>0>>0)ra();else{c[E+16>>2]=d;c[d+24>>2]=E;break}while(0);b=c[b+4>>2]|0;if(!b)break;if(b>>>0<(c[8024]|0)>>>0)ra();else{c[E+20>>2]=b;c[b+24>>2]=E;break}}else{d=c[a+8>>2]|0;e=c[a+12>>2]|0;b=32120+(f<<1<<2)|0;do if((d|0)!=(b|0)){if(d>>>0>>0)ra();if((c[d+12>>2]|0)==(a|0))break;ra()}while(0);if((e|0)==(d|0)){c[8020]=c[8020]&~(1<>>0>>0)ra();b=e+8|0;if((c[b>>2]|0)==(a|0)){B=b;break}ra()}while(0);c[d+12>>2]=e;c[B>>2]=d}while(0);a=a+h|0;f=h+j|0}else f=j;a=a+4|0;c[a>>2]=c[a>>2]&-2;c[l+4>>2]=f|1;c[l+f>>2]=f;a=f>>>3;if(f>>>0<256){d=32120+(a<<1<<2)|0;b=c[8020]|0;a=1<>2]|0;if(b>>>0>=(c[8024]|0)>>>0){F=a;G=b;break}ra()}while(0);c[F>>2]=l;c[G+12>>2]=l;c[l+8>>2]=G;c[l+12>>2]=d;break}a=f>>>8;do if(!a)d=0;else{if(f>>>0>16777215){d=31;break}F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;d=14-(E|F|d)+(G<>>15)|0;d=f>>>(d+7|0)&1|d<<1}while(0);e=32384+(d<<2)|0;c[l+28>>2]=d;a=l+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[8021]|0;b=1<>2]=l;c[l+24>>2]=e;c[l+12>>2]=l;c[l+8>>2]=l;break}d=f<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){z=281;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){z=278;break}else{d=d<<1;e=a}}if((z|0)==278)if(b>>>0<(c[8024]|0)>>>0)ra();else{c[b>>2]=l;c[l+24>>2]=e;c[l+12>>2]=l;c[l+8>>2]=l;break}else if((z|0)==281){a=e+8|0;b=c[a>>2]|0;G=c[8024]|0;if(b>>>0>=G>>>0&e>>>0>=G>>>0){c[b+12>>2]=l;c[a>>2]=l;c[l+8>>2]=b;c[l+12>>2]=e;c[l+24>>2]=0;break}else ra()}}else{G=(c[8023]|0)+j|0;c[8023]=G;c[8026]=l;c[l+4>>2]=G|1}while(0);G=m+8|0;return G|0}else b=32528;while(1){a=c[b>>2]|0;if(a>>>0<=k>>>0?(A=a+(c[b+4>>2]|0)|0,A>>>0>k>>>0):0)break;b=c[b+8>>2]|0}f=A+-47|0;b=f+8|0;b=f+((b&7|0)==0?0:0-b&7)|0;f=k+16|0;b=b>>>0>>0?k:b;a=b+8|0;d=h+8|0;d=(d&7|0)==0?0:0-d&7;G=h+d|0;d=g+-40-d|0;c[8026]=G;c[8023]=d;c[G+4>>2]=d|1;c[G+d+4>>2]=40;c[8027]=c[8142];d=b+4|0;c[d>>2]=27;c[a>>2]=c[8132];c[a+4>>2]=c[8133];c[a+8>>2]=c[8134];c[a+12>>2]=c[8135];c[8132]=h;c[8133]=g;c[8135]=0;c[8134]=a;a=b+24|0;do{a=a+4|0;c[a>>2]=7}while((a+4|0)>>>0>>0);if((b|0)!=(k|0)){g=b-k|0;c[d>>2]=c[d>>2]&-2;c[k+4>>2]=g|1;c[b>>2]=g;a=g>>>3;if(g>>>0<256){d=32120+(a<<1<<2)|0;b=c[8020]|0;a=1<>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();else{C=a;D=b}}else{c[8020]=b|a;C=d+8|0;D=d}c[C>>2]=k;c[D+12>>2]=k;c[k+8>>2]=D;c[k+12>>2]=d;break}a=g>>>8;if(a)if(g>>>0>16777215)d=31;else{F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;d=14-(E|F|d)+(G<>>15)|0;d=g>>>(d+7|0)&1|d<<1}else d=0;e=32384+(d<<2)|0;c[k+28>>2]=d;c[k+20>>2]=0;c[f>>2]=0;a=c[8021]|0;b=1<>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}d=g<<((d|0)==31?0:25-(d>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(g|0)){z=307;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){z=304;break}else{d=d<<1;e=a}}if((z|0)==304)if(b>>>0<(c[8024]|0)>>>0)ra();else{c[b>>2]=k;c[k+24>>2]=e;c[k+12>>2]=k;c[k+8>>2]=k;break}else if((z|0)==307){a=e+8|0;b=c[a>>2]|0;G=c[8024]|0;if(b>>>0>=G>>>0&e>>>0>=G>>>0){c[b+12>>2]=k;c[a>>2]=k;c[k+8>>2]=b;c[k+12>>2]=e;c[k+24>>2]=0;break}else ra()}}}else{G=c[8024]|0;if((G|0)==0|h>>>0>>0)c[8024]=h;c[8132]=h;c[8133]=g;c[8135]=0;c[8029]=c[8138];c[8028]=-1;a=0;do{G=32120+(a<<1<<2)|0;c[G+12>>2]=G;c[G+8>>2]=G;a=a+1|0}while((a|0)!=32);G=h+8|0;G=(G&7|0)==0?0:0-G&7;F=h+G|0;G=g+-40-G|0;c[8026]=F;c[8023]=G;c[F+4>>2]=G|1;c[F+G+4>>2]=40;c[8027]=c[8142]}while(0);a=c[8023]|0;if(a>>>0>o>>>0){E=a-o|0;c[8023]=E;G=c[8026]|0;F=G+o|0;c[8026]=F;c[F+4>>2]=E|1;c[G+4>>2]=o|3;G=G+8|0;return G|0}}if(!(c[7979]|0))a=31964;else a=c[(oa()|0)+60>>2]|0;c[a>>2]=12;G=0;return G|0}function zd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!a)return;d=a+-8|0;h=c[8024]|0;if(d>>>0>>0)ra();a=c[a+-4>>2]|0;b=a&3;if((b|0)==1)ra();e=a&-8;m=d+e|0;do if(!(a&1)){a=c[d>>2]|0;if(!b)return;k=d+(0-a)|0;j=a+e|0;if(k>>>0>>0)ra();if((k|0)==(c[8025]|0)){a=m+4|0;b=c[a>>2]|0;if((b&3|0)!=3){q=k;f=j;break}c[8022]=j;c[a>>2]=b&-2;c[k+4>>2]=j|1;c[k+j>>2]=j;return}e=a>>>3;if(a>>>0<256){b=c[k+8>>2]|0;d=c[k+12>>2]|0;a=32120+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0>>0)ra();if((c[b+12>>2]|0)!=(k|0))ra()}if((d|0)==(b|0)){c[8020]=c[8020]&~(1<>>0>>0)ra();a=d+8|0;if((c[a>>2]|0)==(k|0))g=a;else ra()}else g=d+8|0;c[b+12>>2]=d;c[g>>2]=b;q=k;f=j;break}g=c[k+24>>2]|0;d=c[k+12>>2]|0;do if((d|0)==(k|0)){d=k+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){i=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0>>0)ra();else{c[b>>2]=0;i=a;break}}else{e=c[k+8>>2]|0;if(e>>>0>>0)ra();a=e+12|0;if((c[a>>2]|0)!=(k|0))ra();b=d+8|0;if((c[b>>2]|0)==(k|0)){c[a>>2]=d;c[b>>2]=e;i=d;break}else ra()}while(0);if(g){a=c[k+28>>2]|0;b=32384+(a<<2)|0;if((k|0)==(c[b>>2]|0)){c[b>>2]=i;if(!i){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();a=g+16|0;if((c[a>>2]|0)==(k|0))c[a>>2]=i;else c[g+20>>2]=i;if(!i){q=k;f=j;break}}d=c[8024]|0;if(i>>>0>>0)ra();c[i+24>>2]=g;a=k+16|0;b=c[a>>2]|0;do if(b)if(b>>>0>>0)ra();else{c[i+16>>2]=b;c[b+24>>2]=i;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[8024]|0)>>>0)ra();else{c[i+20>>2]=a;c[a+24>>2]=i;q=k;f=j;break}else{q=k;f=j}}else{q=k;f=j}}else{q=d;f=e}while(0);if(q>>>0>=m>>>0)ra();a=m+4|0;b=c[a>>2]|0;if(!(b&1))ra();if(!(b&2)){if((m|0)==(c[8026]|0)){p=(c[8023]|0)+f|0;c[8023]=p;c[8026]=q;c[q+4>>2]=p|1;if((q|0)!=(c[8025]|0))return;c[8025]=0;c[8022]=0;return}if((m|0)==(c[8025]|0)){p=(c[8022]|0)+f|0;c[8022]=p;c[8025]=q;c[q+4>>2]=p|1;c[q+p>>2]=p;return}f=(b&-8)+f|0;e=b>>>3;do if(b>>>0>=256){g=c[m+24>>2]|0;a=c[m+12>>2]|0;do if((a|0)==(m|0)){d=m+16|0;b=d+4|0;a=c[b>>2]|0;if(!a){a=c[d>>2]|0;if(!a){n=0;break}else b=d}while(1){d=a+20|0;e=c[d>>2]|0;if(e){a=e;b=d;continue}d=a+16|0;e=c[d>>2]|0;if(!e)break;else{a=e;b=d}}if(b>>>0<(c[8024]|0)>>>0)ra();else{c[b>>2]=0;n=a;break}}else{b=c[m+8>>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();d=b+12|0;if((c[d>>2]|0)!=(m|0))ra();e=a+8|0;if((c[e>>2]|0)==(m|0)){c[d>>2]=a;c[e>>2]=b;n=a;break}else ra()}while(0);if(g){a=c[m+28>>2]|0;b=32384+(a<<2)|0;if((m|0)==(c[b>>2]|0)){c[b>>2]=n;if(!n){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();a=g+16|0;if((c[a>>2]|0)==(m|0))c[a>>2]=n;else c[g+20>>2]=n;if(!n)break}d=c[8024]|0;if(n>>>0>>0)ra();c[n+24>>2]=g;a=m+16|0;b=c[a>>2]|0;do if(b)if(b>>>0>>0)ra();else{c[n+16>>2]=b;c[b+24>>2]=n;break}while(0);a=c[a+4>>2]|0;if(a)if(a>>>0<(c[8024]|0)>>>0)ra();else{c[n+20>>2]=a;c[a+24>>2]=n;break}}}else{b=c[m+8>>2]|0;d=c[m+12>>2]|0;a=32120+(e<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(c[8024]|0)>>>0)ra();if((c[b+12>>2]|0)!=(m|0))ra()}if((d|0)==(b|0)){c[8020]=c[8020]&~(1<>>0<(c[8024]|0)>>>0)ra();a=d+8|0;if((c[a>>2]|0)==(m|0))l=a;else ra()}else l=d+8|0;c[b+12>>2]=d;c[l>>2]=b}while(0);c[q+4>>2]=f|1;c[q+f>>2]=f;if((q|0)==(c[8025]|0)){c[8022]=f;return}}else{c[a>>2]=b&-2;c[q+4>>2]=f|1;c[q+f>>2]=f}a=f>>>3;if(f>>>0<256){d=32120+(a<<1<<2)|0;b=c[8020]|0;a=1<>2]|0;if(b>>>0<(c[8024]|0)>>>0)ra();else{o=a;p=b}}else{c[8020]=b|a;o=d+8|0;p=d}c[o>>2]=q;c[p+12>>2]=q;c[q+8>>2]=p;c[q+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)d=31;else{o=(a+1048320|0)>>>16&8;p=a<>>16&4;p=p<>>16&2;d=14-(n|o|d)+(p<>>15)|0;d=f>>>(d+7|0)&1|d<<1}else d=0;e=32384+(d<<2)|0;c[q+28>>2]=d;c[q+20>>2]=0;c[q+16>>2]=0;a=c[8021]|0;b=1<>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){a=130;break}b=e+16+(d>>>31<<2)|0;a=c[b>>2]|0;if(!a){a=127;break}else{d=d<<1;e=a}}if((a|0)==127)if(b>>>0<(c[8024]|0)>>>0)ra();else{c[b>>2]=q;c[q+24>>2]=e;c[q+12>>2]=q;c[q+8>>2]=q;break}else if((a|0)==130){a=e+8|0;b=c[a>>2]|0;p=c[8024]|0;if(b>>>0>=p>>>0&e>>>0>=p>>>0){c[b+12>>2]=q;c[a>>2]=q;c[q+8>>2]=b;c[q+12>>2]=e;c[q+24>>2]=0;break}else ra()}}else{c[8021]=a|b;c[e>>2]=q;c[q+24>>2]=e;c[q+12>>2]=q;c[q+8>>2]=q}while(0);q=(c[8028]|0)+-1|0;c[8028]=q;if(!q)a=32536;else return;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[8028]=-1;return}function Ad(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=a+b|0;d=c[a+4>>2]|0;do if(!(d&1)){g=c[a>>2]|0;if(!(d&3))return;l=a+(0-g)|0;k=g+b|0;i=c[8024]|0;if(l>>>0>>0)ra();if((l|0)==(c[8025]|0)){a=o+4|0;d=c[a>>2]|0;if((d&3|0)!=3){r=l;f=k;break}c[8022]=k;c[a>>2]=d&-2;c[l+4>>2]=k|1;c[l+k>>2]=k;return}e=g>>>3;if(g>>>0<256){a=c[l+8>>2]|0;b=c[l+12>>2]|0;d=32120+(e<<1<<2)|0;if((a|0)!=(d|0)){if(a>>>0>>0)ra();if((c[a+12>>2]|0)!=(l|0))ra()}if((b|0)==(a|0)){c[8020]=c[8020]&~(1<>>0>>0)ra();d=b+8|0;if((c[d>>2]|0)==(l|0))h=d;else ra()}else h=b+8|0;c[a+12>>2]=b;c[h>>2]=a;r=l;f=k;break}g=c[l+24>>2]|0;b=c[l+12>>2]|0;do if((b|0)==(l|0)){b=l+16|0;a=b+4|0;d=c[a>>2]|0;if(!d){d=c[b>>2]|0;if(!d){j=0;break}else a=b}while(1){b=d+20|0;e=c[b>>2]|0;if(e){d=e;a=b;continue}b=d+16|0;e=c[b>>2]|0;if(!e)break;else{d=e;a=b}}if(a>>>0>>0)ra();else{c[a>>2]=0;j=d;break}}else{e=c[l+8>>2]|0;if(e>>>0>>0)ra();d=e+12|0;if((c[d>>2]|0)!=(l|0))ra();a=b+8|0;if((c[a>>2]|0)==(l|0)){c[d>>2]=b;c[a>>2]=e;j=b;break}else ra()}while(0);if(g){d=c[l+28>>2]|0;a=32384+(d<<2)|0;if((l|0)==(c[a>>2]|0)){c[a>>2]=j;if(!j){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();d=g+16|0;if((c[d>>2]|0)==(l|0))c[d>>2]=j;else c[g+20>>2]=j;if(!j){r=l;f=k;break}}b=c[8024]|0;if(j>>>0>>0)ra();c[j+24>>2]=g;d=l+16|0;a=c[d>>2]|0;do if(a)if(a>>>0>>0)ra();else{c[j+16>>2]=a;c[a+24>>2]=j;break}while(0);d=c[d+4>>2]|0;if(d)if(d>>>0<(c[8024]|0)>>>0)ra();else{c[j+20>>2]=d;c[d+24>>2]=j;r=l;f=k;break}else{r=l;f=k}}else{r=l;f=k}}else{r=a;f=b}while(0);h=c[8024]|0;if(o>>>0>>0)ra();d=o+4|0;a=c[d>>2]|0;if(!(a&2)){if((o|0)==(c[8026]|0)){q=(c[8023]|0)+f|0;c[8023]=q;c[8026]=r;c[r+4>>2]=q|1;if((r|0)!=(c[8025]|0))return;c[8025]=0;c[8022]=0;return}if((o|0)==(c[8025]|0)){q=(c[8022]|0)+f|0;c[8022]=q;c[8025]=r;c[r+4>>2]=q|1;c[r+q>>2]=q;return}f=(a&-8)+f|0;e=a>>>3;do if(a>>>0>=256){g=c[o+24>>2]|0;b=c[o+12>>2]|0;do if((b|0)==(o|0)){b=o+16|0;a=b+4|0;d=c[a>>2]|0;if(!d){d=c[b>>2]|0;if(!d){n=0;break}else a=b}while(1){b=d+20|0;e=c[b>>2]|0;if(e){d=e;a=b;continue}b=d+16|0;e=c[b>>2]|0;if(!e)break;else{d=e;a=b}}if(a>>>0>>0)ra();else{c[a>>2]=0;n=d;break}}else{e=c[o+8>>2]|0;if(e>>>0>>0)ra();d=e+12|0;if((c[d>>2]|0)!=(o|0))ra();a=b+8|0;if((c[a>>2]|0)==(o|0)){c[d>>2]=b;c[a>>2]=e;n=b;break}else ra()}while(0);if(g){d=c[o+28>>2]|0;a=32384+(d<<2)|0;if((o|0)==(c[a>>2]|0)){c[a>>2]=n;if(!n){c[8021]=c[8021]&~(1<>>0<(c[8024]|0)>>>0)ra();d=g+16|0;if((c[d>>2]|0)==(o|0))c[d>>2]=n;else c[g+20>>2]=n;if(!n)break}b=c[8024]|0;if(n>>>0>>0)ra();c[n+24>>2]=g;d=o+16|0;a=c[d>>2]|0;do if(a)if(a>>>0>>0)ra();else{c[n+16>>2]=a;c[a+24>>2]=n;break}while(0);d=c[d+4>>2]|0;if(d)if(d>>>0<(c[8024]|0)>>>0)ra();else{c[n+20>>2]=d;c[d+24>>2]=n;break}}}else{a=c[o+8>>2]|0;b=c[o+12>>2]|0;d=32120+(e<<1<<2)|0;if((a|0)!=(d|0)){if(a>>>0>>0)ra();if((c[a+12>>2]|0)!=(o|0))ra()}if((b|0)==(a|0)){c[8020]=c[8020]&~(1<>>0>>0)ra();d=b+8|0;if((c[d>>2]|0)==(o|0))m=d;else ra()}else m=b+8|0;c[a+12>>2]=b;c[m>>2]=a}while(0);c[r+4>>2]=f|1;c[r+f>>2]=f;if((r|0)==(c[8025]|0)){c[8022]=f;return}}else{c[d>>2]=a&-2;c[r+4>>2]=f|1;c[r+f>>2]=f}d=f>>>3;if(f>>>0<256){b=32120+(d<<1<<2)|0;a=c[8020]|0;d=1<>2]|0;if(a>>>0<(c[8024]|0)>>>0)ra();else{p=d;q=a}}else{c[8020]=a|d;p=b+8|0;q=b}c[p>>2]=r;c[q+12>>2]=r;c[r+8>>2]=q;c[r+12>>2]=b;return}d=f>>>8;if(d)if(f>>>0>16777215)b=31;else{p=(d+1048320|0)>>>16&8;q=d<>>16&4;q=q<>>16&2;b=14-(o|p|b)+(q<>>15)|0;b=f>>>(b+7|0)&1|b<<1}else b=0;e=32384+(b<<2)|0;c[r+28>>2]=b;c[r+20>>2]=0;c[r+16>>2]=0;d=c[8021]|0;a=1<>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}b=f<<((b|0)==31?0:25-(b>>>1)|0);e=c[e>>2]|0;while(1){if((c[e+4>>2]&-8|0)==(f|0)){d=127;break}a=e+16+(b>>>31<<2)|0;d=c[a>>2]|0;if(!d){d=124;break}else{b=b<<1;e=d}}if((d|0)==124){if(a>>>0<(c[8024]|0)>>>0)ra();c[a>>2]=r;c[r+24>>2]=e;c[r+12>>2]=r;c[r+8>>2]=r;return}else if((d|0)==127){d=e+8|0;a=c[d>>2]|0;q=c[8024]|0;if(!(a>>>0>=q>>>0&e>>>0>=q>>>0))ra();c[a+12>>2]=r;c[d>>2]=r;c[r+8>>2]=a;c[r+12>>2]=e;c[r+24>>2]=0;return}}function Bd(){}function Cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (C=d,a-c>>>0|0)|0}function Dd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (C=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function Ed(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b>>c;return a>>>c|(b&(1<>c-32|0}function Fd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;h=b&3;i=d|d<<8|d<<16|d<<24;g=f&~3;if(h){h=b+4-h|0;while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}}while((b|0)<(g|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return b-e|0}function Gd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b>>>c;return a>>>c|(b&(1<>>c-32|0}function Hd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){C=b<>>32-c;return a<=4096)return va(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if(!e)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function Jd(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else Id(b,c,d)|0;return b|0}function Kd(b){b=b|0;var c=0;c=a[m+(b&255)>>0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (a[m+(b>>>24)>>0]|0)+24|0}function Ld(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=_(e,f)|0;d=a>>>16;a=(c>>>16)+(_(e,d)|0)|0;e=b>>>16;b=_(e,f)|0;return (C=(a>>>16)+(_(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function Md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=Cd(j^a,i^b,j,i)|0;g=C;a=f^j;b=e^i;return Cd((Rd(h,g,Cd(f^c,e^d,f,e)|0,C,0)|0)^a,C^b,a,b)|0}function Nd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+16|0;j=f|0;h=b>>31|((b|0)<0?-1:0)<<1;g=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;l=e>>31|((e|0)<0?-1:0)<<1;k=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=Cd(h^a,g^b,h,g)|0;b=C;Rd(a,b,Cd(l^d,k^e,l,k)|0,C,j)|0;e=Cd(c[j>>2]^h,c[j+4>>2]^g,h,g)|0;d=C;i=f;return (C=d,e)|0}function Od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=Ld(e,f)|0;a=C;return (C=(_(b,f)|0)+(_(d,e)|0)+a|a&0,c|0|0)|0}function Pd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Rd(a,b,c,d,0)|0}function Qd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=i;i=i+16|0;f=g|0;Rd(a,b,d,e,f)|0;i=g;return (C=c[f+4>>2]|0,c[f>>2]|0)|0}function Rd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (C=n,f)|0}else{if(!g){n=0;f=0;return (C=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (C=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(aa(i|0)|0)-(aa(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<>>(m>>>0)&b;g=0;i=l<>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (C=n,f)|0}g=h-1|0;if(g&h){i=(aa(h|0)|0)+33-(aa(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<>>(o>>>0))&j|l<>31;break}if(f){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (C=o,p)|0}else{p=Kd(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (C=o,p)|0}}else{if(g){if(f){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (C=o,p)|0}if(!l){if(f){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (C=o,p)|0}g=i-1|0;if(!(g&i)){if(f){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((Kd(i|0)|0)>>>0);return (C=o,p)|0}g=(aa(i|0)|0)-(aa(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (C=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=Dd(m|0,l|0,-1,-1)|0;d=C;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;Cd(k,d,e,n)|0;p=C;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=Cd(e,n,o&m,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l)|0;b=C;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (C=o,p)|0}function Sd(a){a=a|0;return Da[a&31]()|0}function Td(){return ea(0)|0}function Ud(){return ea(1)|0}function Vd(){return ea(2)|0}function Wd(){return ea(3)|0}function Xd(){return ea(4)|0}function Yd(){return ea(5)|0}function Zd(){return ea(6)|0}function _d(){return ea(7)|0}function $d(a,b){a=a|0;b=b|0;return Ea[a&31](b|0)|0}function ae(a){a=a|0;return ga(0,a|0)|0}function be(a){a=a|0;return ga(1,a|0)|0}function ce(a){a=a|0;return ga(2,a|0)|0}function de(a){a=a|0;return ga(3,a|0)|0}function ee(a){a=a|0;return ga(4,a|0)|0}function fe(a){a=a|0;return ga(5,a|0)|0}function ge(a){a=a|0;return ga(6,a|0)|0}function he(a){a=a|0;return ga(7,a|0)|0}function ie(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Fa[a&31](b|0,c|0,d|0)|0}function je(a,b,c){a=a|0;b=b|0;c=c|0;return ia(0,a|0,b|0,c|0)|0}function ke(a,b,c){a=a|0;b=b|0;c=c|0;return ia(1,a|0,b|0,c|0)|0}function le(a,b,c){a=a|0;b=b|0;c=c|0;return ia(2,a|0,b|0,c|0)|0}function me(a,b,c){a=a|0;b=b|0;c=c|0;return ia(3,a|0,b|0,c|0)|0}function ne(a,b,c){a=a|0;b=b|0;c=c|0;return ia(4,a|0,b|0,c|0)|0}function oe(a,b,c){a=a|0;b=b|0;c=c|0;return ia(5,a|0,b|0,c|0)|0}function pe(a,b,c){a=a|0;b=b|0;c=c|0;return ia(6,a|0,b|0,c|0)|0}function qe(a,b,c){a=a|0;b=b|0;c=c|0;return ia(7,a|0,b|0,c|0)|0}function re(a,b){a=a|0;b=b|0;Ga[a&31](b|0)}function se(a){a=a|0;ka(0,a|0)}function te(a){a=a|0;ka(1,a|0)}function ue(a){a=a|0;ka(2,a|0)}function ve(a){a=a|0;ka(3,a|0)}function we(a){a=a|0;ka(4,a|0)}function xe(a){a=a|0;ka(5,a|0)}function ye(a){a=a|0;ka(6,a|0)}function ze(a){a=a|0;ka(7,a|0)}function Ae(){ba(0);return 0}function Be(a){a=a|0;ba(1);return 0}function Ce(a,b,c){a=a|0;b=b|0;c=c|0;ba(2);return 0}function De(a){a=a|0;ba(3)} // EMSCRIPTEN_END_FUNCS var Da=[Ae,Ae,Td,Ae,Ud,Ae,Vd,Ae,Wd,Ae,Xd,Ae,Yd,Ae,Zd,Ae,_d,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae,Ae];var Ea=[Be,Be,ae,Be,be,Be,ce,Be,de,Be,ee,Be,fe,Be,ge,Be,he,Be,pd,Be,Be,Be,Be,Be,Be,Be,Be,Be,Be,Be,Be,Be];var Fa=[Ce,Ce,je,Ce,ke,Ce,le,Ce,me,Ce,ne,Ce,oe,Ce,pe,Ce,qe,Ce,sd,qd,rd,Ce,Ce,Ce,Ce,Ce,Ce,Ce,Ce,Ce,Ce,Ce];var Ga=[De,De,se,De,te,De,ue,De,ve,De,we,De,xe,De,ye,De,ze,De,wd,De,De,De,De,De,De,De,De,De,De,De,De,De];return{_sodium_library_version_minor:jd,_crypto_onetimeauth_bytes:Jb,_sodium_version_string:hd,_sodium_hex2bin:gd,_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive:dc,_bitshift64Lshr:Gd,_crypto_pwhash_scryptsalsa208sha256:ec,_crypto_box_noncebytes:Za,_crypto_box_beforenm:bb,_crypto_scalarmult_base:mc,_crypto_auth_bytes:Qa,_crypto_sign_open:Fc,_memcpy:Id,_crypto_box_seed_keypair:$a,_crypto_pwhash_scryptsalsa208sha256_memlimit_interactive:bc,_crypto_box_open_easy_afternm:ib,_crypto_sign_ed25519_sk_to_curve25519:Uc,_sodium_memzero:ed,_crypto_box_seal:kb,_free:zd,_crypto_shorthash:xc,_crypto_auth_keybytes:Ra,_crypto_pwhash_scryptsalsa208sha256_saltbytes:Zb,_crypto_sign_seedbytes:zc,_crypto_box_detached_afternm:cb,_crypto_auth:Sa,_randombytes_random:_c,_crypto_sign_keypair:Dc,_crypto_shorthash_keybytes:wc,_crypto_generichash_statebytes:vb,_crypto_pwhash_scryptsalsa208sha256_str_verify:gc,_crypto_generichash_init:xb,_crypto_generichash_keybytes_max:tb,_crypto_sign_ed25519_pk_to_curve25519:Tc,_crypto_box_beforenmbytes:Ya,_crypto_generichash:wb,_sodium_library_version_major:id,_randombytes_stir:$c,_randombytes_close:cd,_crypto_onetimeauth_keybytes:Kb,_crypto_onetimeauth:Lb,_crypto_shorthash_bytes:vc,_crypto_box_secretkeybytes:Xa,_crypto_onetimeauth_update:Ob,_crypto_pwhash_scryptsalsa208sha256_ll:Wb,_crypto_box_detached:db,_randombytes_buf:bd,_crypto_pwhash_scryptsalsa208sha256_str:fc,_bitshift64Ashr:Ed,_crypto_box_open_detached:hb,_crypto_scalarmult_bytes:kc,_crypto_auth_verify:Ta,_crypto_box_seal_open:lb,_crypto_secretbox_detached:rc,_crypto_secretbox_easy:sc,_crypto_pwhash_scryptsalsa208sha256_strbytes:_b,_memset:Fd,_crypto_box_open_detached_afternm:gb,_crypto_box_sealbytes:mb,_i64Subtract:Cd,_crypto_pwhash_scryptsalsa208sha256_strprefix:$b,_crypto_box_seedbytes:Va,_crypto_hash:Cb,_crypto_box_easy_afternm:eb,_crypto_box_macbytes:_a,_crypto_box_publickeybytes:Wa,_sodium_bin2hex:fd,_crypto_sign_secretkeybytes:Bc,_crypto_scalarmult_scalarbytes:lc,_crypto_onetimeauth_statebytes:Ib,_crypto_generichash_keybytes_min:sb,_malloc:yd,_memmove:Jd,_crypto_sign:Ec,_crypto_secretbox_noncebytes:pc,_randombytes_set_implementation:Zc,_crypto_box_keypair:ab,_crypto_generichash_keybytes:ub,_crypto_generichash_bytes_min:pb,_sodium_init:dd,_crypto_secretbox_macbytes:qc,_crypto_secretbox_keybytes:oc,_bitshift64Shl:Hd,_crypto_hash_bytes:Bb,_fflush:td,_crypto_generichash_bytes:rb,_crypto_generichash_bytes_max:qb,_crypto_secretbox_open_detached:tc,_crypto_sign_verify_detached:Hc,_crypto_onetimeauth_verify:Mb,_crypto_box_open_easy:jb,_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive:cc,_crypto_sign_publickeybytes:Ac,_i64Add:Dd,_crypto_sign_bytes:yc,_crypto_generichash_update:yb,_crypto_scalarmult:nc,_crypto_sign_detached:Gc,_crypto_box_easy:fb,___errno_location:od,_crypto_onetimeauth_final:Pb,_crypto_secretbox_open_easy:uc,_crypto_generichash_final:zb,_randombytes_uniform:ad,_crypto_sign_seed_keypair:Cc,_crypto_pwhash_scryptsalsa208sha256_opslimit_interactive:ac,_crypto_onetimeauth_init:Nb,runPostSets:Bd,stackAlloc:Ha,stackSave:Ia,stackRestore:Ja,establishStackSpace:Ka,setThrew:La,setTempRet0:Oa,getTempRet0:Pa,dynCall_i:Sd,dynCall_ii:$d,dynCall_iiii:ie,dynCall_vi:re}}) // EMSCRIPTEN_END_ASM (Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _sodium_library_version_minor=Module["_sodium_library_version_minor"]=asm["_sodium_library_version_minor"];var _crypto_onetimeauth_bytes=Module["_crypto_onetimeauth_bytes"]=asm["_crypto_onetimeauth_bytes"];var _crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive=Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive"]=asm["_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _crypto_pwhash_scryptsalsa208sha256=Module["_crypto_pwhash_scryptsalsa208sha256"]=asm["_crypto_pwhash_scryptsalsa208sha256"];var _crypto_box_noncebytes=Module["_crypto_box_noncebytes"]=asm["_crypto_box_noncebytes"];var _crypto_box_beforenm=Module["_crypto_box_beforenm"]=asm["_crypto_box_beforenm"];var _crypto_scalarmult_base=Module["_crypto_scalarmult_base"]=asm["_crypto_scalarmult_base"];var _crypto_auth_bytes=Module["_crypto_auth_bytes"]=asm["_crypto_auth_bytes"];var _crypto_sign_open=Module["_crypto_sign_open"]=asm["_crypto_sign_open"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _crypto_box_seed_keypair=Module["_crypto_box_seed_keypair"]=asm["_crypto_box_seed_keypair"];var _crypto_pwhash_scryptsalsa208sha256_memlimit_interactive=Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_interactive"]=asm["_crypto_pwhash_scryptsalsa208sha256_memlimit_interactive"];var _crypto_box_open_easy_afternm=Module["_crypto_box_open_easy_afternm"]=asm["_crypto_box_open_easy_afternm"];var _crypto_sign_ed25519_sk_to_curve25519=Module["_crypto_sign_ed25519_sk_to_curve25519"]=asm["_crypto_sign_ed25519_sk_to_curve25519"];var _sodium_memzero=Module["_sodium_memzero"]=asm["_sodium_memzero"];var _crypto_box_seal=Module["_crypto_box_seal"]=asm["_crypto_box_seal"];var _free=Module["_free"]=asm["_free"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _crypto_shorthash=Module["_crypto_shorthash"]=asm["_crypto_shorthash"];var _crypto_auth_keybytes=Module["_crypto_auth_keybytes"]=asm["_crypto_auth_keybytes"];var _crypto_pwhash_scryptsalsa208sha256_saltbytes=Module["_crypto_pwhash_scryptsalsa208sha256_saltbytes"]=asm["_crypto_pwhash_scryptsalsa208sha256_saltbytes"];var _crypto_sign_seedbytes=Module["_crypto_sign_seedbytes"]=asm["_crypto_sign_seedbytes"];var _crypto_box_detached_afternm=Module["_crypto_box_detached_afternm"]=asm["_crypto_box_detached_afternm"];var _crypto_auth=Module["_crypto_auth"]=asm["_crypto_auth"];var _randombytes_random=Module["_randombytes_random"]=asm["_randombytes_random"];var _crypto_sign_keypair=Module["_crypto_sign_keypair"]=asm["_crypto_sign_keypair"];var _crypto_generichash_keybytes_min=Module["_crypto_generichash_keybytes_min"]=asm["_crypto_generichash_keybytes_min"];var _crypto_generichash_statebytes=Module["_crypto_generichash_statebytes"]=asm["_crypto_generichash_statebytes"];var _crypto_pwhash_scryptsalsa208sha256_str_verify=Module["_crypto_pwhash_scryptsalsa208sha256_str_verify"]=asm["_crypto_pwhash_scryptsalsa208sha256_str_verify"];var _sodium_version_string=Module["_sodium_version_string"]=asm["_sodium_version_string"];var _crypto_generichash_keybytes_max=Module["_crypto_generichash_keybytes_max"]=asm["_crypto_generichash_keybytes_max"];var _crypto_sign_ed25519_pk_to_curve25519=Module["_crypto_sign_ed25519_pk_to_curve25519"]=asm["_crypto_sign_ed25519_pk_to_curve25519"];var _crypto_sign_publickeybytes=Module["_crypto_sign_publickeybytes"]=asm["_crypto_sign_publickeybytes"];var _crypto_box_beforenmbytes=Module["_crypto_box_beforenmbytes"]=asm["_crypto_box_beforenmbytes"];var _crypto_generichash=Module["_crypto_generichash"]=asm["_crypto_generichash"];var _sodium_library_version_major=Module["_sodium_library_version_major"]=asm["_sodium_library_version_major"];var _randombytes_stir=Module["_randombytes_stir"]=asm["_randombytes_stir"];var _crypto_shorthash_keybytes=Module["_crypto_shorthash_keybytes"]=asm["_crypto_shorthash_keybytes"];var _randombytes_close=Module["_randombytes_close"]=asm["_randombytes_close"];var _crypto_onetimeauth_keybytes=Module["_crypto_onetimeauth_keybytes"]=asm["_crypto_onetimeauth_keybytes"];var _crypto_onetimeauth=Module["_crypto_onetimeauth"]=asm["_crypto_onetimeauth"];var _crypto_shorthash_bytes=Module["_crypto_shorthash_bytes"]=asm["_crypto_shorthash_bytes"];var _crypto_box_secretkeybytes=Module["_crypto_box_secretkeybytes"]=asm["_crypto_box_secretkeybytes"];var _crypto_onetimeauth_update=Module["_crypto_onetimeauth_update"]=asm["_crypto_onetimeauth_update"];var _crypto_pwhash_scryptsalsa208sha256_ll=Module["_crypto_pwhash_scryptsalsa208sha256_ll"]=asm["_crypto_pwhash_scryptsalsa208sha256_ll"];var _crypto_box_detached=Module["_crypto_box_detached"]=asm["_crypto_box_detached"];var _randombytes_buf=Module["_randombytes_buf"]=asm["_randombytes_buf"];var _crypto_pwhash_scryptsalsa208sha256_strbytes=Module["_crypto_pwhash_scryptsalsa208sha256_strbytes"]=asm["_crypto_pwhash_scryptsalsa208sha256_strbytes"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _crypto_box_open_detached=Module["_crypto_box_open_detached"]=asm["_crypto_box_open_detached"];var _crypto_scalarmult_bytes=Module["_crypto_scalarmult_bytes"]=asm["_crypto_scalarmult_bytes"];var _crypto_auth_verify=Module["_crypto_auth_verify"]=asm["_crypto_auth_verify"];var _crypto_sign_detached=Module["_crypto_sign_detached"]=asm["_crypto_sign_detached"];var _crypto_secretbox_detached=Module["_crypto_secretbox_detached"]=asm["_crypto_secretbox_detached"];var _crypto_secretbox_easy=Module["_crypto_secretbox_easy"]=asm["_crypto_secretbox_easy"];var _crypto_pwhash_scryptsalsa208sha256_str=Module["_crypto_pwhash_scryptsalsa208sha256_str"]=asm["_crypto_pwhash_scryptsalsa208sha256_str"];var _memset=Module["_memset"]=asm["_memset"];var _crypto_box_open_detached_afternm=Module["_crypto_box_open_detached_afternm"]=asm["_crypto_box_open_detached_afternm"];var _crypto_box_sealbytes=Module["_crypto_box_sealbytes"]=asm["_crypto_box_sealbytes"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _crypto_pwhash_scryptsalsa208sha256_strprefix=Module["_crypto_pwhash_scryptsalsa208sha256_strprefix"]=asm["_crypto_pwhash_scryptsalsa208sha256_strprefix"];var _crypto_box_seedbytes=Module["_crypto_box_seedbytes"]=asm["_crypto_box_seedbytes"];var _crypto_hash=Module["_crypto_hash"]=asm["_crypto_hash"];var _crypto_box_easy_afternm=Module["_crypto_box_easy_afternm"]=asm["_crypto_box_easy_afternm"];var _crypto_box_macbytes=Module["_crypto_box_macbytes"]=asm["_crypto_box_macbytes"];var _crypto_box_publickeybytes=Module["_crypto_box_publickeybytes"]=asm["_crypto_box_publickeybytes"];var _sodium_bin2hex=Module["_sodium_bin2hex"]=asm["_sodium_bin2hex"];var _crypto_sign_secretkeybytes=Module["_crypto_sign_secretkeybytes"]=asm["_crypto_sign_secretkeybytes"];var _crypto_scalarmult_scalarbytes=Module["_crypto_scalarmult_scalarbytes"]=asm["_crypto_scalarmult_scalarbytes"];var _crypto_onetimeauth_statebytes=Module["_crypto_onetimeauth_statebytes"]=asm["_crypto_onetimeauth_statebytes"];var _crypto_generichash_bytes_min=Module["_crypto_generichash_bytes_min"]=asm["_crypto_generichash_bytes_min"];var _malloc=Module["_malloc"]=asm["_malloc"];var _crypto_secretbox_open_easy=Module["_crypto_secretbox_open_easy"]=asm["_crypto_secretbox_open_easy"];var _crypto_sign=Module["_crypto_sign"]=asm["_crypto_sign"];var _crypto_secretbox_noncebytes=Module["_crypto_secretbox_noncebytes"]=asm["_crypto_secretbox_noncebytes"];var _randombytes_set_implementation=Module["_randombytes_set_implementation"]=asm["_randombytes_set_implementation"];var _crypto_box_keypair=Module["_crypto_box_keypair"]=asm["_crypto_box_keypair"];var _crypto_generichash_keybytes=Module["_crypto_generichash_keybytes"]=asm["_crypto_generichash_keybytes"];var _sodium_hex2bin=Module["_sodium_hex2bin"]=asm["_sodium_hex2bin"];var _sodium_init=Module["_sodium_init"]=asm["_sodium_init"];var _crypto_secretbox_macbytes=Module["_crypto_secretbox_macbytes"]=asm["_crypto_secretbox_macbytes"];var _crypto_secretbox_keybytes=Module["_crypto_secretbox_keybytes"]=asm["_crypto_secretbox_keybytes"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _crypto_hash_bytes=Module["_crypto_hash_bytes"]=asm["_crypto_hash_bytes"];var _fflush=Module["_fflush"]=asm["_fflush"];var _crypto_generichash_bytes=Module["_crypto_generichash_bytes"]=asm["_crypto_generichash_bytes"];var _crypto_generichash_bytes_max=Module["_crypto_generichash_bytes_max"]=asm["_crypto_generichash_bytes_max"];var _crypto_secretbox_open_detached=Module["_crypto_secretbox_open_detached"]=asm["_crypto_secretbox_open_detached"];var _crypto_sign_verify_detached=Module["_crypto_sign_verify_detached"]=asm["_crypto_sign_verify_detached"];var _crypto_onetimeauth_verify=Module["_crypto_onetimeauth_verify"]=asm["_crypto_onetimeauth_verify"];var _crypto_box_open_easy=Module["_crypto_box_open_easy"]=asm["_crypto_box_open_easy"];var _crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive=Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive"]=asm["_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive"];var _crypto_generichash_init=Module["_crypto_generichash_init"]=asm["_crypto_generichash_init"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _crypto_sign_bytes=Module["_crypto_sign_bytes"]=asm["_crypto_sign_bytes"];var _crypto_generichash_update=Module["_crypto_generichash_update"]=asm["_crypto_generichash_update"];var _crypto_scalarmult=Module["_crypto_scalarmult"]=asm["_crypto_scalarmult"];var _crypto_box_seal_open=Module["_crypto_box_seal_open"]=asm["_crypto_box_seal_open"];var _crypto_box_easy=Module["_crypto_box_easy"]=asm["_crypto_box_easy"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _crypto_onetimeauth_final=Module["_crypto_onetimeauth_final"]=asm["_crypto_onetimeauth_final"];var _memmove=Module["_memmove"]=asm["_memmove"];var _crypto_generichash_final=Module["_crypto_generichash_final"]=asm["_crypto_generichash_final"];var _randombytes_uniform=Module["_randombytes_uniform"]=asm["_randombytes_uniform"];var _crypto_sign_seed_keypair=Module["_crypto_sign_seed_keypair"]=asm["_crypto_sign_seed_keypair"];var _crypto_pwhash_scryptsalsa208sha256_opslimit_interactive=Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_interactive"]=asm["_crypto_pwhash_scryptsalsa208sha256_opslimit_interactive"];var _crypto_onetimeauth_init=Module["_crypto_onetimeauth_init"]=asm["_crypto_onetimeauth_init"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run() return Module; }); }).call(this,require('_process'),require("buffer").Buffer,"/node_modules/libsodium/dist/modules") },{"_process":295,"buffer":61,"crypto":110,"fs":58,"path":290}],224:[function(require,module,exports){ 'use strict'; /** * Get the count of the longest repeating streak of * `character` in `value`. * * @example * longestStreak('` foo `` bar `', '`') // 2 * * @param {string} value - Content, coerced to string. * @param {string} character - Single character to look * for. * @return {number} - Number of characters at the place * where `character` occurs in its longest streak in * `value`. * @throws {Error} - when `character` is not a single * character. */ function longestStreak(value, character) { var count = 0; var maximum = 0; var index = -1; var length; value = String(value); length = value.length; if (typeof character !== 'string' || character.length !== 1) { throw new Error('Expected character'); } while (++index < length) { if (value.charAt(index) === character) { count++; if (count > maximum) { maximum = count; } } else { count = 0; } } return maximum; } /* * Expose. */ module.exports = longestStreak; },{}],225:[function(require,module,exports){ var looper = module.exports = function (fun) { return function next (a, b, c) { var loop = true, returned = false, sync = false do { sync = true; loop = false fun.call(function (x, y, z) { if(sync) { a = x; b = y; c = z loop = true } else next(x, y, z) }, a, b, c) sync = false } while(loop) } } },{}],226:[function(require,module,exports){ (function (Buffer){ exports.compare = function (a, b) { if(Buffer.isBuffer(a)) { var l = Math.min(a.length, b.length) for(var i = 0; i < l; i++) { var cmp = a[i] - b[i] if(cmp) return cmp } return a.length - b.length } return a < b ? -1 : a > b ? 1 : 0 } function has(obj, key) { return Object.hasOwnProperty.call(obj, key) } // to be compatible with the current abstract-leveldown tests // nullish or empty strings. // I could use !!val but I want to permit numbers and booleans, // if possible. function isDef (val) { return val !== undefined && val !== '' } function has (range, name) { return Object.hasOwnProperty.call(range, name) } function hasKey(range, name) { return Object.hasOwnProperty.call(range, name) && name } var lowerBoundKey = exports.lowerBoundKey = function (range) { return ( hasKey(range, 'gt') || hasKey(range, 'gte') || hasKey(range, 'min') || (range.reverse ? hasKey(range, 'end') : hasKey(range, 'start')) || undefined ) } var lowerBound = exports.lowerBound = function (range) { var k = lowerBoundKey(range) return k && range[k] return ( has(range, 'gt') ? range.gt : has(range, 'gte') ? range.gte : has(range, 'min') ? range.min : has(range, 'start') && !range.reverse ? range.start : has(range, 'end') && range.reverse ? range.end : undefined ) } exports.lowerBoundInclusive = function (range) { return has(range, 'gt') ? false : true } exports.upperBoundInclusive = function (range) { return has(range, 'lt') || !range.minEx ? false : true } var lowerBoundExclusive = exports.lowerBoundExclusive = function (range) { return has(range, 'gt') || range.minEx ? true : false } var upperBoundExclusive = exports.upperBoundExclusive = function (range) { return has(range, 'lt') ? true : false } var upperBoundKey = exports.upperBoundKey = function (range) { return ( hasKey(range, 'lt') || hasKey(range, 'lte') || hasKey(range, 'max') || (range.reverse ? hasKey(range, 'start') : hasKey(range, 'end')) || undefined ) } var upperBound = exports.upperBound = function (range) { var k = upperBoundKey(range) return k && range[k] } function id (e) { return e } exports.toLtgt = function (range, _range, map, lower, upper) { _range = _range || {} map = map || id var defaults = arguments.length > 3 var lb = exports.lowerBoundKey(range) var ub = exports.upperBoundKey(range) if(lb) { if(lb === 'gt') _range.gt = map(range.gt) else _range.gte = map(range[lb]) } else if(defaults) _range.gte = map(lower) if(ub) { if(ub === 'lt') _range.lt = map(range.lt) else _range.lte = map(range[ub]) } else if(defaults) _range.lte = map(upper) if(range.reverse != null) _range.reverse = !!range.reverse return _range } exports.contains = function (range, key, compare) { compare = compare || exports.compare var lb = lowerBound(range) if(isDef(lb)) { var cmp = compare(key, lb) if(cmp < 0 || (cmp === 0 && lowerBoundExclusive(range))) return false } var ub = upperBound(range) if(isDef(ub)) { var cmp = compare(key, ub) if(cmp > 0 || (cmp === 0) && upperBoundExclusive(range)) return false } return true } exports.filter = function (range, compare) { return function (key) { return exports.contains(range, key, compare) } } }).call(this,{"isBuffer":require("../is-buffer/index.js")}) },{"../is-buffer/index.js":170}],227:[function(require,module,exports){ module.exports = { $count: function (a, b) { if(b === undefined) return (a||0) return (a||0)+1 }, $sum: function (a, b) { if(b === undefined) return (a||0) return (a||0)+(b||0) }, $max: function (a, b) { if(b === undefined) a if(a === undefined) return b return Math.max(a, b) }, $min: function (a, b) { if(b === undefined) a if(a === undefined) return b return Math.min(a, b) }, $collect: function (a, b) { if(!a) a = a || [] if(!Array.isArray(a)) a = [a] if(b == undefined) return a a.push(b) return a } } },{}],228:[function(require,module,exports){ var u = require('./util') var isBasic = u.isBasic var isRange = u.isRange var isString = u.isString var isLtgt = u.isLtgt var isObject = u.isObject var isArray = u.isArray var has = u.has var map = u.map function exact(q) { return function (v) { return q === v } } function prefix(p) { if(isString(p)) return function (v) { return isString(v) && v.substring(0, p.length) === p } if(isArray(p)) { if(!p.every(isBasic)) throw new Error('{$prefix: array} must have exact elements in the array') return function (v) { if(!isArray(v) || v.length < p.length) return false for(var i = 0; i < p.length; i++) if(v[i] !== p[i]) return false return true } } } function lt (q) { return function (v) { return v < q } } function gt (q) { return function (v) { return v > q } } function lte (q) { return function (v) { return v <= q } } function gte (q) { return function (v) { return v >= q } } function combine(f, g) { if(!g) return f return function (v) { return f(v) && g(v) } } function ltgt (q) { var filter = null if(has(q, '$lt')) filter = lt(q.$lt) if(has(q, '$lte')) filter = combine(lte(q.$lte), filter) if(has(q, '$gt')) filter = combine(gt(q.$gt), filter) if(has(q, '$gte')) filter = combine(gte(q.$gte), filter) return filter } function all (q) { return function (v) { if(v == null) return false for(var k in q) if(!q[k](v[k])) return false return true } } function absent (v) { return v == null } function never () { return false } function make (q) { return ( isBasic(q) ? exact(q) : has(q, '$prefix') ? prefix(q.$prefix) : isLtgt(q) ? ltgt(q) : u.isObject(q) || u.isArray(q) ? all(map(q, make)) : isNullish(q) ? absent : never ) } module.exports = make },{"./util":238}],229:[function(require,module,exports){ var pull = require('pull-stream') var filter = require('./filter') var map = require('./map') var reduce = require('./reduce') var SinkThrough = require('pull-sink-through') function first (q) { for(var k in q) return k } function get (q) { var k = first(q) var s = k.substring(1) if(k[0] == '$' && exports[s]) return exports[s](q[k]) throw new Error('unknown function:'+ k) } function last (l) { return l[l.length - 1] } exports = module.exports = function (q, cb) { q = q.filter(Boolean) if(last(q).$reduce && cb) { return pull.apply(null, q.slice(0, q.length - 1).map(get) .concat(exports.reduce(last(q).$reduce, cb)) ) } else if(Array.isArray(q)) return pull.apply(null, q.map(get)) else return get(q) } exports.filter = function (q) { return pull.filter(filter(q)) } exports.map = function (q) { return pull(pull.map(map(q)),pull.filter()) } exports.reduce = function (q, cb) { if(cb) return pull.reduce(reduce(q), null, cb) return SinkThrough(function (cb) { return pull.reduce(reduce(q), null, cb) }) } },{"./filter":228,"./map":231,"./reduce":237,"pull-sink-through":379,"pull-stream":232}],230:[function(require,module,exports){ var u = require('./util') var isArray = u.isArray var isString = u.isString var extractors = { $filter: function (query) { var o = {} for(var k in query) o[k] = true return o }, $reduce: function (query) { var o = {} if(isArray(query.$group)) query.$group.forEach(function (path) { o[isArray(path) ? path[0]: path] = true }) //TODO: check what paths the other reduces touch. return o }, $map: function (query) { var o = {} for(var k in query) if(isArray(query[k])) o[query[k][0]] = true else if(isString(query[k])) o[query[k]] = true return o } } function merge (a, b) { var o = {} for(var k in a) o[k] = true for(var k in b) o[k] = true return o } function first(q) { for(var k in q) return k } function keys (query) { var keys = {} for(var i = query.length - 1; i >= 0; i--) { var k = first(query[i]) keys = merge(extractors[k](query[i][k]), keys) } return keys } module.exports = keys },{"./util":238}],231:[function(require,module,exports){ var u = require('./util') var map = u.map function id (v, k) { return k ? v[k] : v } function isNull (n) { return n == null } function key(q) { return function (v) { if(isNull(v)) return undefined return v[q] } } function path (q) { return q.reduce(function (map1, map2) { return function (v) { return map2(map1(v)) } }) } function notEmpty (o) { for(var k in o) return o return undefined } function obj (q) { return function (v) { if(isNull(v)) return undefined return notEmpty(map(q, function (fn, k, o) { return fn(v, k) })) } } function make(q) { if(true === q) return id if(isNull(q)) return isNull if(u.isString(q) || u.isNumber(q)) return key(q) if(u.isArray(q)) return path(q.map(make)) if(u.isObject(q)) return obj(map(q, make)) throw new Error('no match - should never mappen') } module.exports = make },{"./util":238}],232:[function(require,module,exports){ var sources = require('./sources') var sinks = require('./sinks') var throughs = require('./throughs') exports = module.exports = require('./pull') for(var k in sources) exports[k] = sources[k] for(var k in throughs) exports[k] = throughs[k] for(var k in sinks) exports[k] = sinks[k] },{"./pull":233,"./sinks":234,"./sources":235,"./throughs":236}],233:[function(require,module,exports){ module.exports = function pull (a) { var length = arguments.length if (typeof a === 'function' && a.length === 1) { var args = new Array(length) for(var i = 0; i < length; i++) args[i] = arguments[i] return function (read) { args.unshift(read) return pull.apply(null, args) } } var read = a if (read && typeof read.source === 'function') { read = read.source } for (var i = 1; i < length; i++) { var s = arguments[i] if (typeof s === 'function') { read = s(read) } else if (s && typeof s === 'object') { s.sink(read) read = s.source } } return read } },{}],234:[function(require,module,exports){ 'use strict' function id (item) { return item } function prop (key) { return ( 'string' == typeof key ? function (data) { return data[key] } : key && 'object' === typeof key && 'function' === typeof key.exec //regexp ? function (data) { var v = map.exec(data); return v && v[0] } : key || id ) } var drain = exports.drain = function (op, done) { var read, abort function sink (_read) { read = _read if(abort) return sink.abort() //this function is much simpler to write if you //just use recursion, but by using a while loop //we do not blow the stack if the stream happens to be sync. ;(function next() { var loop = true, cbed = false while(loop) { cbed = false read(null, function (end, data) { cbed = true if(end = end || abort) { loop = false if(done) done(end === true ? null : end) else if(end && end !== true) throw end } else if(op && false === op(data) || abort) { loop = false read(abort || true, done || function () {}) } else if(!loop){ next() } }) if(!cbed) { loop = false return } } })() } sink.abort = function (err, cb) { if('function' == typeof err) cb = err, err = true abort = err || true if(read) return read(abort, cb || function () {}) } return sink } var onEnd = exports.onEnd = function (done) { return drain(null, done) } var log = exports.log = function (done) { return drain(function (data) { console.log(data) }, done) } var find = exports.find = function (test, cb) { var ended = false if(!cb) cb = test, test = id else test = prop(test) || id return drain(function (data) { if(test(data)) { ended = true cb(null, data) return false } }, function (err) { if(ended) return //already called back cb(err === true ? null : err, null) }) } var reduce = exports.reduce = function (reduce, acc, cb) { return drain(function (data) { acc = reduce(acc, data) }, function (err) { cb(err, acc) }) } var collect = exports.collect = function (cb) { return reduce(function (arr, item) { arr.push(item) return arr }, [], cb) } var concat = exports.concat = function (cb) { return reduce(function (a, b) { return a + b }, '', cb) } },{}],235:[function(require,module,exports){ var keys = exports.keys = function (object) { return values(Object.keys(object)) } function abortCb(cb, abort, onAbort) { cb(abort) onAbort && onAbort(abort === true ? null: abort) return } var once = exports.once = function (value, onAbort) { return function (abort, cb) { if(abort) return abortCb(cb, abort, onAbort) if(value != null) { var _value = value; value = null cb(null, _value) } else cb(true) } } var values = exports.values = exports.readArray = function (array, onAbort) { if(!array) return function (abort, cb) { if(abort) return abortCb(cb, abort, onAbort) return cb(true) } if(!Array.isArray(array)) array = Object.keys(array).map(function (k) { return array[k] }) var i = 0 return function (abort, cb) { if(abort) return abortCb(cb, abort, onAbort) cb(i >= array.length || null, array[i++]) } } var count = exports.count = function (max) { var i = 0; max = max || Infinity return function (end, cb) { if(end) return cb && cb(end) if(i > max) return cb(true) cb(null, i++) } } var infinite = exports.infinite = function (generate) { generate = generate || Math.random return function (end, cb) { if(end) return cb && cb(end) return cb(null, generate()) } } //a stream that ends immediately. var empty = exports.empty = function () { return function (abort, cb) { cb(true) } } //a stream that errors immediately. var error = exports.error = function (err) { return function (abort, cb) { cb(err) } } },{}],236:[function(require,module,exports){ 'use strict'; function id (item) { return item } function prop (key) { return ( 'string' == typeof key ? function (data) { return data[key] } : 'object' === typeof key && 'function' === typeof key.exec //regexp ? function (data) { var v = map.exec(data); return v && v[0] } : key ) } function tester (test) { return ( 'object' === typeof test && 'function' === typeof test.test //regexp ? function (data) { return test.test(data) } : prop (test) || id ) } var sources = require('./sources') var sinks = require('./sinks') var map = exports.map = function (map) { if(!map) return id map = prop(map) return function (read) { return function (abort, cb) { read(abort, function (end, data) { try { data = !end ? map(data) : null } catch (err) { return read(err, function () { return cb(err) }) } cb(end, data) }) } } } var asyncMap = exports.asyncMap = function async (map) { if(!map) return id map = prop(map) var busy = false, abortCb, aborted return function (read) { return function next (abort, cb) { if(aborted) return cb(aborted) if(abort) { aborted = abort if(!busy) read(abort, cb) else read(abort, function () { //if we are still busy, wait for the mapper to complete. if(busy) abortCb = cb else cb(abort) }) } else read(null, function (end, data) { if(end) { cb(end) if(abortCb) cb(end, data) } else { busy = true map(data, function (err, data) { busy = false if(aborted) { cb(aborted) abortCb(aborted) } else if(err) next (err, cb) else cb(null, data) }) } }) } } } function asyncMap (map) { if(!map) return id //when read is passed, pass it on. return function (read) { return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } } var filter = exports.filter = function (test) { //regexp test = tester(test) return function (read) { return function next (end, cb) { var sync, loop = true while(loop) { loop = false sync = true read(end, function (end, data) { if(!end && !test(data)) return sync ? loop = true : next(end, cb) cb(end, data) }) sync = false } } } } var filterNot = exports.filterNot = function (test) { test = tester(test) return filter(function (data) { return !test(data) }) } //a pass through stream that doesn't change the value. var through = exports.through = function (op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (read) { return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } } //read a number of items and then stop. var take = exports.take = function (test, opts) { opts = opts || {} var last = opts.last || false // whether the first item for which !test(item) should still pass var ended = false if('number' === typeof test) { last = true var n = test; test = function () { return --n } } return function (read) { function terminate (cb) { read(true, function (err) { last = false; cb(err || true) }) } return function (end, cb) { if(ended) last ? terminate(cb) : cb(ended) else if(ended = end) read(ended, cb) else read(null, function (end, data) { if(ended = ended || end) { //last ? terminate(cb) : cb(ended) } else if(!test(data)) { ended = true last ? cb(null, data) : terminate(cb) } else cb(null, data) }) } } } //drop items you have already seen. var unique = exports.unique = function (field, invert) { field = prop(field) || id var seen = {} return filter(function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } //passes an item through when you see it for the second time. var nonUnique = exports.nonUnique = function (field) { return unique(field, true) } //convert a stream of arrays or streams into just a stream. var flatten = exports.flatten = function () { return function (read) { var _read return function (abort, cb) { if (abort) { //abort the current stream, and then stream of streams. _read ? _read(abort, function(err) { read(err || abort, cb) }) : read(abort, cb) } else if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (err, data) { if (err === true) nextStream() else if (err) { read(true, function(abortErr) { // TODO: what do we do with the abortErr? cb(err) }) } else cb(null, data) }) } function nextStream () { _read = null read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream) || stream && 'object' === typeof stream) stream = sources.values(stream) else if('function' != typeof stream) stream = sources.once(stream) _read = stream nextChunk() }) } } } } },{"./sinks":234,"./sources":235}],237:[function(require,module,exports){ var u = require('./util') var map = u.map var simple = require('./basic') function isFunction (f) { return 'function' === typeof f } function isSimple(query) { for(var k in simple) if(u.has(query, k)) return k } function lookup(reduce, path) { if(path === true) return reduce return function (a, b) { return reduce(a, u.get(b, path)) } } function multi(obj) { return function (a, b) { return map(obj, function (reduce, k) { return reduce(a[k], b) }, a = a || {}) } } function each(list, iter) { if(u.isString(list)) return iter(list) for(var i = 0; i < list.length; i++) iter(list[i], (list.length - i - 1)) } //instead of taking the query, //this should take a path, and a reduce function. function group (g, reduce) { return function (a, b) { var A = a = a || {} each(g, function (k, notLast) { var v = u.get(b, k) A[v] = !notLast ? reduce(A[v], b) : A[v] || {} A = A[v] }) return a } } function make (query) { var k = isSimple(query) if(k) return lookup(simple[k], query[k]) else if(u.isObject(query)) return multi(map(query, function (q, k) { if(k == '$group') return undefined return gmake(query[k]) })) } function gmake (query) { return query.$group ? group(query.$group, make(query)) : make(query) } module.exports = gmake },{"./basic":227,"./util":238}],238:[function(require,module,exports){ 'use strict' function isString(s) { return 'string' === typeof s } function isNumber(n) { return !isNaN(+n) } function isBoolean (b) { return 'boolean' === typeof b } function isBasic (p) { return isString(p) || isNumber(p) || isBoolean(p) } var isArray = Array.isArray function isObject (o) { return o && 'object' === typeof o } function has(o, k) { return Object.hasOwnProperty.call(o, k) } function isExact (v) { if(isBasic(v)) return true if(isArray(v)) return v.every(isExact) return isObject(v) && has(v, '$eq') } function isLtgt (v) { return has(v, '$lt') || has(v, '$gt') || has(v, '$lte') || has(v, '$gte') } function isRange (v) { if(!isObject(v)) return false if(isString(v.$prefix)) return true if(isArray(v)) return find(v, isRange) return isLtgt(v) } function find (ary, test) { for(var i = 0; i < ary.length; i++) if(test(ary[i], i, ary)) return true return false } function lower (v) { if(isBasic(v)) return v if(isObject(v)) { if(isArray(v.$prefix)) return v.$prefix.concat(exports.HI) if(isString(v.$prefix)) return v.$prefix if(has(v, '$lt')) return v.$lt if(has(v, '$lte')) return v.$lte } if(isArray(v)) return v.map(lower) } function upper (v) { if(isBasic(v)) return v if(isObject(v)) { if(isArray(v.$prefix)) return v.$prefix.concat(exports.LO) if(isString(v.$prefix)) return v.$prefix+'\uffff' if(has(v, '$gt')) return v.$gt if(has(v, '$gte')) return v.$gte } if(isArray(v)) return v.map(upper) } function get(obj, path) { if(isString(path)) return obj[path] if(isArray(path)) { for(var i = 0; i < path.length; i++) { if(obj == null) return undefined obj = obj[path[i]] } return obj } if(path === true) return obj return undefined } function map(obj, iter, o) { if(Array.isArray(obj)) return obj.map(iter) o = o || {} for(var k in obj) { var v = iter(obj[k], k, obj) if(v !== undefined) o[k] = v } return o } exports.isString = isString exports.isNumber = isNumber exports.isBasic = isBasic exports.isArray = isArray exports.isObject = isObject exports.isRange = isRange exports.isExact = isExact exports.isLtgt = isLtgt exports.has = has exports.get = get exports.map = map exports.upper = upper exports.lower = lower exports.HI = undefined exports.LO = null },{}],239:[function(require,module,exports){ function isObject(o) { return o && 'object' === typeof o } var isArray = Array.isArray function isUndefined (u) { return 'undefined' === typeof u } var find = exports.find = function find(ary, test) { for(var i in ary) if(test(ary[i], i, ary)) return ary[i] } exports = module.exports = merge exports.merge = exports var clone = exports.clone = function clone (obj, mapper) { function map(v, k) { return isObject(v) ? clone(v, mapper) : mapper(v, k) } if(isArray(obj)) return obj.map(map) else if(isObject(obj)) { var o = {} for(var k in obj) o[k] = map(obj[k], k) return o } else return map(obj) } var mergeKeys = exports.mergeKeys = function (a, b, iter) { var o = {} for(var k in a) { if(!isUndefined(a[k])) o[k] = iter(a[k], b[k], k) } for(var k in b) { if(isUndefined(a[k])) o[k] = iter(undefined, b[k], k) } return o } var mergeArrays = exports.mergeArrays = function (a, b, iter) { var o = [] a.forEach(function (v, i) { var j = b.indexOf(v) o.push(iter(v, b[j], o.length)) }) b.forEach(function (v, i) { var j = a.indexOf(v) if(!~j) o.push(iter(undefined, b[i], o.length)) }) return o } function merge (a, b, merge) { //merge a and b objects merge = merge || function (x, y) { return y == null ? x : y } function merger(a, b, k) { if(isArray(a) && isArray(b)) return mergeArrays(a, b, merger) else if(isObject(a) && isObject(b)) { return mergeKeys(a, b, merger) } else return merge(a, b, k) } return merger(a, b, undefined) } },{}],240:[function(require,module,exports){ 'use strict'; /* * Useful expressions. */ var EXPRESSION_DOT = /\./; var EXPRESSION_LAST_DOT = /\.[^.]*$/; /* * Allowed alignment values. */ var LEFT = 'l'; var RIGHT = 'r'; var CENTER = 'c'; var DOT = '.'; var NULL = ''; var ALLIGNMENT = [LEFT, RIGHT, CENTER, DOT, NULL]; /* * Characters. */ var COLON = ':'; var DASH = '-'; var PIPE = '|'; var SPACE = ' '; var NEW_LINE = '\n'; /** * Get the length of `value`. * * @param {string} value * @return {number} */ function lengthNoop(value) { return String(value).length; } /** * Get a string consisting of `length` `character`s. * * @param {number} length * @param {string} [character=' '] * @return {string} */ function pad(length, character) { return Array(length + 1).join(character || SPACE); } /** * Get the position of the last dot in `value`. * * @param {string} value * @return {number} */ function dotindex(value) { var match = EXPRESSION_LAST_DOT.exec(value); return match ? match.index + 1 : value.length; } /** * Create a table from a matrix of strings. * * @param {Array.>} table * @param {Object?} options * @param {boolean?} [options.rule=true] * @param {string?} [options.delimiter=" | "] * @param {string?} [options.start="| "] * @param {string?} [options.end=" |"] * @param {Array.?} options.align * @param {function(string)?} options.stringLength * @return {string} Pretty table */ function markdownTable(table, options) { var settings = options || {}; var delimiter = settings.delimiter; var start = settings.start; var end = settings.end; var alignment = settings.align; var calculateStringLength = settings.stringLength || lengthNoop; var cellCount = 0; var rowIndex = -1; var rowLength = table.length; var sizes = []; var align; var rule; var rows; var row; var cells; var index; var position; var size; var value; var spacing; var before; var after; alignment = alignment ? alignment.concat() : []; if (delimiter === null || delimiter === undefined) { delimiter = SPACE + PIPE + SPACE; } if (start === null || start === undefined) { start = PIPE + SPACE; } if (end === null || end === undefined) { end = SPACE + PIPE; } while (++rowIndex < rowLength) { row = table[rowIndex]; index = -1; if (row.length > cellCount) { cellCount = row.length; } while (++index < cellCount) { position = row[index] ? dotindex(row[index]) : null; if (!sizes[index]) { sizes[index] = 3; } if (position > sizes[index]) { sizes[index] = position; } } } if (typeof alignment === 'string') { alignment = pad(cellCount, alignment).split(''); } /* * Make sure only valid alignments are used. */ index = -1; while (++index < cellCount) { align = alignment[index]; if (typeof align === 'string') { align = align.charAt(0).toLowerCase(); } if (ALLIGNMENT.indexOf(align) === -1) { align = NULL; } alignment[index] = align; } rowIndex = -1; rows = []; while (++rowIndex < rowLength) { row = table[rowIndex]; index = -1; cells = []; while (++index < cellCount) { value = row[index]; if (value === null || value === undefined) { value = ''; } else { value = String(value); } if (alignment[index] !== DOT) { cells[index] = value; } else { position = dotindex(value); size = sizes[index] + (EXPRESSION_DOT.test(value) ? 0 : 1) - (calculateStringLength(value) - position); cells[index] = value + pad(size - 1); } } rows[rowIndex] = cells; } sizes = []; rowIndex = -1; while (++rowIndex < rowLength) { cells = rows[rowIndex]; index = -1; while (++index < cellCount) { value = cells[index]; if (!sizes[index]) { sizes[index] = 3; } size = calculateStringLength(value); if (size > sizes[index]) { sizes[index] = size; } } } rowIndex = -1; while (++rowIndex < rowLength) { cells = rows[rowIndex]; index = -1; while (++index < cellCount) { value = cells[index]; position = sizes[index] - (calculateStringLength(value) || 0); spacing = pad(position); if (alignment[index] === RIGHT || alignment[index] === DOT) { value = spacing + value; } else if (alignment[index] !== CENTER) { value = value + spacing; } else { position = position / 2; if (position % 1 === 0) { before = position; after = position; } else { before = position + 0.5; after = position - 0.5; } value = pad(before) + value + pad(after); } cells[index] = value; } rows[rowIndex] = cells.join(delimiter); } if (settings.rule !== false) { index = -1; rule = []; while (++index < cellCount) { align = alignment[index]; /* * When `align` is left, don't add colons. */ value = align === RIGHT || align === NULL ? DASH : COLON; value += pad(sizes[index] - 2, DASH); value += align !== LEFT && align !== NULL ? COLON : DASH; rule[index] = value; } rows.splice(1, 0, rule.join(delimiter)); } return start + rows.join(end + NEW_LINE + start) + end; } /* * Expose `markdownTable`. */ module.exports = markdownTable; },{}],241:[function(require,module,exports){ var assert = require('assert') var remark = require('remark') var html = require('remark-html') // - obj: object // - path: array, a list of keys // - value: any // will create any subobject needed // eg var x = {}; set(x, ['foo', 'bar'], 5); x.foo.bar == 5 function set (obj, path, value) { while (path.length > 1) { var k = path.shift() if (!obj[k]) obj[k] = {} obj = obj[k] } obj[path[0]] = value } function fill (str, n) { if (n > str.length) return str + ' '.repeat(n - str.length) return str } function methodTable (methods, nameWidth) { // figure out how long the names column needs to be if (!nameWidth) { nameWidth = 1 methods.forEach(function (m) { if (m.name.length > nameWidth) nameWidth = m.name.length }) } return methods.map(function (m) { return ' ' + fill(m.name, nameWidth) + ' ' + m.desc }).join('').trim() } function parseMethodHeading (token, prefix) { var textToken = token.children[0] assert.equal(textToken.type, 'text', 'Headings should not have any markup') var parts = textToken.value.split(': ') assert.equal(parts.length, 2, 'Heading "'+textToken.value+'" should be of form `method: type`') var name = parts[0], type = parts[1] assert(nameRegex.test(name), 'Function name "'+name+'" does nots match '+nameRegex) assert(nameRegex.test(type), 'Function type "'+type+'" does not match '+typeRegex) if (prefix) parts[0] = prefix + '.' + parts[0] return parts } var nameRegex = /^[a-z][a-z0-9\.\-_]*$/i var typeRegex = /^[a-z]+$/i module.exports.manifest = function (text) { assert.equal(typeof text, 'string', 'Input should be a markdown string') var manifest = {} remark().parse(text).children.forEach(function (token, i) { if (token.type === 'heading' && token.depth === 2) { var parts = parseMethodHeading(token) set(manifest, parts[0].split('.'), parts[1]) } }) return manifest } module.exports.usage = function (text, cmd, opts) { assert.equal(typeof text, 'string', 'Input should be a markdown string') opts = opts || {} var lexer = remark() var tokens = lexer.parse(text).children if (!cmd) { // toplevel usage var inSummary = true // in the api summary? var toplevelParas = [] var methods = [] var currentMethod tokens.forEach(function (token) { if (token.type == 'paragraph' && inSummary) { // a para in the api's toplevel summary toplevelParas.push(lexer.stringify({ type: 'root', children: token.children })) } else if (token.type == 'heading' && token.depth == 2) { // a method heading inSummary = false // no longer in the api summary var parts = parseMethodHeading(token, opts.prefix) currentMethod = parts[0] } else if (token.type == 'paragraph' && currentMethod) { // the first para in a method methods.push({ name: currentMethod, desc: lexer.stringify({ type: 'root', children: token.children })}) currentMethod = null } }) if (currentMethod) methods.push({ name: currentMethod }) return toplevelParas.join('\n') + '\nCommands:\n ' + methodTable(methods, opts.nameWidth) } // method usage var inMethod = false // in the method? var elems = [] for (var i=0; i < tokens.length; i++) { var token = tokens[i] if (token.type == 'heading') { // a heading if (inMethod) break // done pulling from the method's summary if (token.depth == 2 && parseMethodHeading(token)[0] == cmd) inMethod = true // we're in the target method's summary } else if (inMethod) { if (token.type == 'code') { // only include code examples for the CLI if (token.lang == 'bash' || token.lang == 'sh' || token.lang == 'shell' || !token.lang) { token.type = 'text' elems.push(token) } } else elems.push(token) } } return lexer .stringify({ type: 'root', children: elems }) .trim() .replace(/\\\[/g, '[') // dont escape '[' } module.exports.html = function (text) { assert.equal(typeof text, 'string', 'Input should be a markdown string') return remark().use(html).process(text) } },{"assert":15,"remark":415,"remark-html":411}],242:[function(require,module,exports){ var bn = require('bn.js'); var brorand = require('brorand'); function MillerRabin(rand) { this.rand = rand || new brorand.Rand(); } module.exports = MillerRabin; MillerRabin.create = function create(rand) { return new MillerRabin(rand); }; MillerRabin.prototype._rand = function _rand(n) { var len = n.bitLength(); var buf = this.rand.generate(Math.ceil(len / 8)); // Set low bits buf[0] |= 3; // Mask high bits var mask = len & 0x7; if (mask !== 0) buf[buf.length - 1] >>= 7 - mask; return new bn(buf); } MillerRabin.prototype.test = function test(n, k, cb) { var len = n.bitLength(); var red = bn.mont(n); var rone = new bn(1).toRed(red); if (!k) k = Math.max(1, (len / 48) | 0); // Find d and s, (n - 1) = (2 ^ s) * d; var n1 = n.subn(1); var n2 = n1.subn(1); for (var s = 0; !n1.testn(s); s++) {} var d = n.shrn(s); var rn1 = n1.toRed(red); var prime = true; for (; k > 0; k--) { var a = this._rand(n2); if (cb) cb(a); var x = a.toRed(red).redPow(d); if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) continue; for (var i = 1; i < s; i++) { x = x.redSqr(); if (x.cmp(rone) === 0) return false; if (x.cmp(rn1) === 0) break; } if (i === s) return false; } return prime; }; MillerRabin.prototype.getDivisor = function getDivisor(n, k) { var len = n.bitLength(); var red = bn.mont(n); var rone = new bn(1).toRed(red); if (!k) k = Math.max(1, (len / 48) | 0); // Find d and s, (n - 1) = (2 ^ s) * d; var n1 = n.subn(1); var n2 = n1.subn(1); for (var s = 0; !n1.testn(s); s++) {} var d = n.shrn(s); var rn1 = n1.toRed(red); for (; k > 0; k--) { var a = this._rand(n2); var g = n.gcd(a); if (g.cmpn(1) !== 0) return g; var x = a.toRed(red).redPow(d); if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) continue; for (var i = 1; i < s; i++) { x = x.redSqr(); if (x.cmp(rone) === 0) return x.fromRed().subn(1).gcd(n); if (x.cmp(rn1) === 0) break; } if (i === s) { x = x.redSqr(); return x.fromRed().subn(1).gcd(n); } } return false; }; },{"bn.js":29,"brorand":32}],243:[function(require,module,exports){ module.exports={ "application/1d-interleaved-parityfec": { "source": "iana" }, "application/3gpdash-qoe-report+xml": { "source": "iana" }, "application/3gpp-ims+xml": { "source": "iana" }, "application/a2l": { "source": "iana" }, "application/activemessage": { "source": "iana" }, "application/alto-costmap+json": { "source": "iana", "compressible": true }, "application/alto-costmapfilter+json": { "source": "iana", "compressible": true }, "application/alto-directory+json": { "source": "iana", "compressible": true }, "application/alto-endpointcost+json": { "source": "iana", "compressible": true }, "application/alto-endpointcostparams+json": { "source": "iana", "compressible": true }, "application/alto-endpointprop+json": { "source": "iana", "compressible": true }, "application/alto-endpointpropparams+json": { "source": "iana", "compressible": true }, "application/alto-error+json": { "source": "iana", "compressible": true }, "application/alto-networkmap+json": { "source": "iana", "compressible": true }, "application/alto-networkmapfilter+json": { "source": "iana", "compressible": true }, "application/aml": { "source": "iana" }, "application/andrew-inset": { "source": "iana", "extensions": ["ez"] }, "application/applefile": { "source": "iana" }, "application/applixware": { "source": "apache", "extensions": ["aw"] }, "application/atf": { "source": "iana" }, "application/atfx": { "source": "iana" }, "application/atom+xml": { "source": "iana", "compressible": true, "extensions": ["atom"] }, "application/atomcat+xml": { "source": "iana", "extensions": ["atomcat"] }, "application/atomdeleted+xml": { "source": "iana" }, "application/atomicmail": { "source": "iana" }, "application/atomsvc+xml": { "source": "iana", "extensions": ["atomsvc"] }, "application/atxml": { "source": "iana" }, "application/auth-policy+xml": { "source": "iana" }, "application/bacnet-xdd+zip": { "source": "iana" }, "application/batch-smtp": { "source": "iana" }, "application/bdoc": { "compressible": false, "extensions": ["bdoc"] }, "application/beep+xml": { "source": "iana" }, "application/calendar+json": { "source": "iana", "compressible": true }, "application/calendar+xml": { "source": "iana" }, "application/call-completion": { "source": "iana" }, "application/cals-1840": { "source": "iana" }, "application/cbor": { "source": "iana" }, "application/ccmp+xml": { "source": "iana" }, "application/ccxml+xml": { "source": "iana", "extensions": ["ccxml"] }, "application/cdfx+xml": { "source": "iana" }, "application/cdmi-capability": { "source": "iana", "extensions": ["cdmia"] }, "application/cdmi-container": { "source": "iana", "extensions": ["cdmic"] }, "application/cdmi-domain": { "source": "iana", "extensions": ["cdmid"] }, "application/cdmi-object": { "source": "iana", "extensions": ["cdmio"] }, "application/cdmi-queue": { "source": "iana", "extensions": ["cdmiq"] }, "application/cdni": { "source": "iana" }, "application/cea": { "source": "iana" }, "application/cea-2018+xml": { "source": "iana" }, "application/cellml+xml": { "source": "iana" }, "application/cfw": { "source": "iana" }, "application/cms": { "source": "iana" }, "application/cnrp+xml": { "source": "iana" }, "application/coap-group+json": { "source": "iana", "compressible": true }, "application/commonground": { "source": "iana" }, "application/conference-info+xml": { "source": "iana" }, "application/cpl+xml": { "source": "iana" }, "application/csrattrs": { "source": "iana" }, "application/csta+xml": { "source": "iana" }, "application/cstadata+xml": { "source": "iana" }, "application/csvm+json": { "source": "iana", "compressible": true }, "application/cu-seeme": { "source": "apache", "extensions": ["cu"] }, "application/cybercash": { "source": "iana" }, "application/dart": { "compressible": true }, "application/dash+xml": { "source": "iana", "extensions": ["mpd"] }, "application/dashdelta": { "source": "iana" }, "application/davmount+xml": { "source": "iana", "extensions": ["davmount"] }, "application/dca-rft": { "source": "iana" }, "application/dcd": { "source": "iana" }, "application/dec-dx": { "source": "iana" }, "application/dialog-info+xml": { "source": "iana" }, "application/dicom": { "source": "iana" }, "application/dii": { "source": "iana" }, "application/dit": { "source": "iana" }, "application/dns": { "source": "iana" }, "application/docbook+xml": { "source": "apache", "extensions": ["dbk"] }, "application/dskpp+xml": { "source": "iana" }, "application/dssc+der": { "source": "iana", "extensions": ["dssc"] }, "application/dssc+xml": { "source": "iana", "extensions": ["xdssc"] }, "application/dvcs": { "source": "iana" }, "application/ecmascript": { "source": "iana", "compressible": true, "extensions": ["ecma"] }, "application/edi-consent": { "source": "iana" }, "application/edi-x12": { "source": "iana", "compressible": false }, "application/edifact": { "source": "iana", "compressible": false }, "application/emergencycalldata.comment+xml": { "source": "iana" }, "application/emergencycalldata.deviceinfo+xml": { "source": "iana" }, "application/emergencycalldata.providerinfo+xml": { "source": "iana" }, "application/emergencycalldata.serviceinfo+xml": { "source": "iana" }, "application/emergencycalldata.subscriberinfo+xml": { "source": "iana" }, "application/emma+xml": { "source": "iana", "extensions": ["emma"] }, "application/emotionml+xml": { "source": "iana" }, "application/encaprtp": { "source": "iana" }, "application/epp+xml": { "source": "iana" }, "application/epub+zip": { "source": "iana", "extensions": ["epub"] }, "application/eshop": { "source": "iana" }, "application/exi": { "source": "iana", "extensions": ["exi"] }, "application/fastinfoset": { "source": "iana" }, "application/fastsoap": { "source": "iana" }, "application/fdt+xml": { "source": "iana" }, "application/fits": { "source": "iana" }, "application/font-sfnt": { "source": "iana" }, "application/font-tdpfr": { "source": "iana", "extensions": ["pfr"] }, "application/font-woff": { "source": "iana", "compressible": false, "extensions": ["woff"] }, "application/font-woff2": { "compressible": false, "extensions": ["woff2"] }, "application/framework-attributes+xml": { "source": "iana" }, "application/gml+xml": { "source": "apache", "extensions": ["gml"] }, "application/gpx+xml": { "source": "apache", "extensions": ["gpx"] }, "application/gxf": { "source": "apache", "extensions": ["gxf"] }, "application/gzip": { "source": "iana", "compressible": false }, "application/h224": { "source": "iana" }, "application/held+xml": { "source": "iana" }, "application/http": { "source": "iana" }, "application/hyperstudio": { "source": "iana", "extensions": ["stk"] }, "application/ibe-key-request+xml": { "source": "iana" }, "application/ibe-pkg-reply+xml": { "source": "iana" }, "application/ibe-pp-data": { "source": "iana" }, "application/iges": { "source": "iana" }, "application/im-iscomposing+xml": { "source": "iana" }, "application/index": { "source": "iana" }, "application/index.cmd": { "source": "iana" }, "application/index.obj": { "source": "iana" }, "application/index.response": { "source": "iana" }, "application/index.vnd": { "source": "iana" }, "application/inkml+xml": { "source": "iana", "extensions": ["ink","inkml"] }, "application/iotp": { "source": "iana" }, "application/ipfix": { "source": "iana", "extensions": ["ipfix"] }, "application/ipp": { "source": "iana" }, "application/isup": { "source": "iana" }, "application/its+xml": { "source": "iana" }, "application/java-archive": { "source": "apache", "compressible": false, "extensions": ["jar","war","ear"] }, "application/java-serialized-object": { "source": "apache", "compressible": false, "extensions": ["ser"] }, "application/java-vm": { "source": "apache", "compressible": false, "extensions": ["class"] }, "application/javascript": { "source": "iana", "charset": "UTF-8", "compressible": true, "extensions": ["js"] }, "application/jose": { "source": "iana" }, "application/jose+json": { "source": "iana", "compressible": true }, "application/jrd+json": { "source": "iana", "compressible": true }, "application/json": { "source": "iana", "charset": "UTF-8", "compressible": true, "extensions": ["json","map"] }, "application/json-patch+json": { "source": "iana", "compressible": true }, "application/json-seq": { "source": "iana" }, "application/json5": { "extensions": ["json5"] }, "application/jsonml+json": { "source": "apache", "compressible": true, "extensions": ["jsonml"] }, "application/jwk+json": { "source": "iana", "compressible": true }, "application/jwk-set+json": { "source": "iana", "compressible": true }, "application/jwt": { "source": "iana" }, "application/kpml-request+xml": { "source": "iana" }, "application/kpml-response+xml": { "source": "iana" }, "application/ld+json": { "source": "iana", "compressible": true, "extensions": ["jsonld"] }, "application/link-format": { "source": "iana" }, "application/load-control+xml": { "source": "iana" }, "application/lost+xml": { "source": "iana", "extensions": ["lostxml"] }, "application/lostsync+xml": { "source": "iana" }, "application/lxf": { "source": "iana" }, "application/mac-binhex40": { "source": "iana", "extensions": ["hqx"] }, "application/mac-compactpro": { "source": "apache", "extensions": ["cpt"] }, "application/macwriteii": { "source": "iana" }, "application/mads+xml": { "source": "iana", "extensions": ["mads"] }, "application/manifest+json": { "charset": "UTF-8", "compressible": true, "extensions": ["webmanifest"] }, "application/marc": { "source": "iana", "extensions": ["mrc"] }, "application/marcxml+xml": { "source": "iana", "extensions": ["mrcx"] }, "application/mathematica": { "source": "iana", "extensions": ["ma","nb","mb"] }, "application/mathml+xml": { "source": "iana", "extensions": ["mathml"] }, "application/mathml-content+xml": { "source": "iana" }, "application/mathml-presentation+xml": { "source": "iana" }, "application/mbms-associated-procedure-description+xml": { "source": "iana" }, "application/mbms-deregister+xml": { "source": "iana" }, "application/mbms-envelope+xml": { "source": "iana" }, "application/mbms-msk+xml": { "source": "iana" }, "application/mbms-msk-response+xml": { "source": "iana" }, "application/mbms-protection-description+xml": { "source": "iana" }, "application/mbms-reception-report+xml": { "source": "iana" }, "application/mbms-register+xml": { "source": "iana" }, "application/mbms-register-response+xml": { "source": "iana" }, "application/mbms-schedule+xml": { "source": "iana" }, "application/mbms-user-service-description+xml": { "source": "iana" }, "application/mbox": { "source": "iana", "extensions": ["mbox"] }, "application/media-policy-dataset+xml": { "source": "iana" }, "application/media_control+xml": { "source": "iana" }, "application/mediaservercontrol+xml": { "source": "iana", "extensions": ["mscml"] }, "application/merge-patch+json": { "source": "iana", "compressible": true }, "application/metalink+xml": { "source": "apache", "extensions": ["metalink"] }, "application/metalink4+xml": { "source": "iana", "extensions": ["meta4"] }, "application/mets+xml": { "source": "iana", "extensions": ["mets"] }, "application/mf4": { "source": "iana" }, "application/mikey": { "source": "iana" }, "application/mods+xml": { "source": "iana", "extensions": ["mods"] }, "application/moss-keys": { "source": "iana" }, "application/moss-signature": { "source": "iana" }, "application/mosskey-data": { "source": "iana" }, "application/mosskey-request": { "source": "iana" }, "application/mp21": { "source": "iana", "extensions": ["m21","mp21"] }, "application/mp4": { "source": "iana", "extensions": ["mp4s","m4p"] }, "application/mpeg4-generic": { "source": "iana" }, "application/mpeg4-iod": { "source": "iana" }, "application/mpeg4-iod-xmt": { "source": "iana" }, "application/mrb-consumer+xml": { "source": "iana" }, "application/mrb-publish+xml": { "source": "iana" }, "application/msc-ivr+xml": { "source": "iana" }, "application/msc-mixer+xml": { "source": "iana" }, "application/msword": { "source": "iana", "compressible": false, "extensions": ["doc","dot"] }, "application/mxf": { "source": "iana", "extensions": ["mxf"] }, "application/nasdata": { "source": "iana" }, "application/news-checkgroups": { "source": "iana" }, "application/news-groupinfo": { "source": "iana" }, "application/news-transmission": { "source": "iana" }, "application/nlsml+xml": { "source": "iana" }, "application/nss": { "source": "iana" }, "application/ocsp-request": { "source": "iana" }, "application/ocsp-response": { "source": "iana" }, "application/octet-stream": { "source": "iana", "compressible": false, "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"] }, "application/oda": { "source": "iana", "extensions": ["oda"] }, "application/odx": { "source": "iana" }, "application/oebps-package+xml": { "source": "iana", "extensions": ["opf"] }, "application/ogg": { "source": "iana", "compressible": false, "extensions": ["ogx"] }, "application/omdoc+xml": { "source": "apache", "extensions": ["omdoc"] }, "application/onenote": { "source": "apache", "extensions": ["onetoc","onetoc2","onetmp","onepkg"] }, "application/oxps": { "source": "iana", "extensions": ["oxps"] }, "application/p2p-overlay+xml": { "source": "iana" }, "application/parityfec": { "source": "iana" }, "application/patch-ops-error+xml": { "source": "iana", "extensions": ["xer"] }, "application/pdf": { "source": "iana", "compressible": false, "extensions": ["pdf"] }, "application/pdx": { "source": "iana" }, "application/pgp-encrypted": { "source": "iana", "compressible": false, "extensions": ["pgp"] }, "application/pgp-keys": { "source": "iana" }, "application/pgp-signature": { "source": "iana", "extensions": ["asc","sig"] }, "application/pics-rules": { "source": "apache", "extensions": ["prf"] }, "application/pidf+xml": { "source": "iana" }, "application/pidf-diff+xml": { "source": "iana" }, "application/pkcs10": { "source": "iana", "extensions": ["p10"] }, "application/pkcs12": { "source": "iana" }, "application/pkcs7-mime": { "source": "iana", "extensions": ["p7m","p7c"] }, "application/pkcs7-signature": { "source": "iana", "extensions": ["p7s"] }, "application/pkcs8": { "source": "iana", "extensions": ["p8"] }, "application/pkix-attr-cert": { "source": "iana", "extensions": ["ac"] }, "application/pkix-cert": { "source": "iana", "extensions": ["cer"] }, "application/pkix-crl": { "source": "iana", "extensions": ["crl"] }, "application/pkix-pkipath": { "source": "iana", "extensions": ["pkipath"] }, "application/pkixcmp": { "source": "iana", "extensions": ["pki"] }, "application/pls+xml": { "source": "iana", "extensions": ["pls"] }, "application/poc-settings+xml": { "source": "iana" }, "application/postscript": { "source": "iana", "compressible": true, "extensions": ["ai","eps","ps"] }, "application/ppsp-tracker+json": { "source": "iana", "compressible": true }, "application/problem+json": { "source": "iana", "compressible": true }, "application/problem+xml": { "source": "iana" }, "application/provenance+xml": { "source": "iana" }, "application/prs.alvestrand.titrax-sheet": { "source": "iana" }, "application/prs.cww": { "source": "iana", "extensions": ["cww"] }, "application/prs.hpub+zip": { "source": "iana" }, "application/prs.nprend": { "source": "iana" }, "application/prs.plucker": { "source": "iana" }, "application/prs.rdf-xml-crypt": { "source": "iana" }, "application/prs.xsf+xml": { "source": "iana" }, "application/pskc+xml": { "source": "iana", "extensions": ["pskcxml"] }, "application/qsig": { "source": "iana" }, "application/raptorfec": { "source": "iana" }, "application/rdap+json": { "source": "iana", "compressible": true }, "application/rdf+xml": { "source": "iana", "compressible": true, "extensions": ["rdf"] }, "application/reginfo+xml": { "source": "iana", "extensions": ["rif"] }, "application/relax-ng-compact-syntax": { "source": "iana", "extensions": ["rnc"] }, "application/remote-printing": { "source": "iana" }, "application/reputon+json": { "source": "iana", "compressible": true }, "application/resource-lists+xml": { "source": "iana", "extensions": ["rl"] }, "application/resource-lists-diff+xml": { "source": "iana", "extensions": ["rld"] }, "application/rfc+xml": { "source": "iana" }, "application/riscos": { "source": "iana" }, "application/rlmi+xml": { "source": "iana" }, "application/rls-services+xml": { "source": "iana", "extensions": ["rs"] }, "application/rpki-ghostbusters": { "source": "iana", "extensions": ["gbr"] }, "application/rpki-manifest": { "source": "iana", "extensions": ["mft"] }, "application/rpki-roa": { "source": "iana", "extensions": ["roa"] }, "application/rpki-updown": { "source": "iana" }, "application/rsd+xml": { "source": "apache", "extensions": ["rsd"] }, "application/rss+xml": { "source": "apache", "compressible": true, "extensions": ["rss"] }, "application/rtf": { "source": "iana", "compressible": true, "extensions": ["rtf"] }, "application/rtploopback": { "source": "iana" }, "application/rtx": { "source": "iana" }, "application/samlassertion+xml": { "source": "iana" }, "application/samlmetadata+xml": { "source": "iana" }, "application/sbml+xml": { "source": "iana", "extensions": ["sbml"] }, "application/scaip+xml": { "source": "iana" }, "application/scim+json": { "source": "iana", "compressible": true }, "application/scvp-cv-request": { "source": "iana", "extensions": ["scq"] }, "application/scvp-cv-response": { "source": "iana", "extensions": ["scs"] }, "application/scvp-vp-request": { "source": "iana", "extensions": ["spq"] }, "application/scvp-vp-response": { "source": "iana", "extensions": ["spp"] }, "application/sdp": { "source": "iana", "extensions": ["sdp"] }, "application/sep+xml": { "source": "iana" }, "application/sep-exi": { "source": "iana" }, "application/session-info": { "source": "iana" }, "application/set-payment": { "source": "iana" }, "application/set-payment-initiation": { "source": "iana", "extensions": ["setpay"] }, "application/set-registration": { "source": "iana" }, "application/set-registration-initiation": { "source": "iana", "extensions": ["setreg"] }, "application/sgml": { "source": "iana" }, "application/sgml-open-catalog": { "source": "iana" }, "application/shf+xml": { "source": "iana", "extensions": ["shf"] }, "application/sieve": { "source": "iana" }, "application/simple-filter+xml": { "source": "iana" }, "application/simple-message-summary": { "source": "iana" }, "application/simplesymbolcontainer": { "source": "iana" }, "application/slate": { "source": "iana" }, "application/smil": { "source": "iana" }, "application/smil+xml": { "source": "iana", "extensions": ["smi","smil"] }, "application/smpte336m": { "source": "iana" }, "application/soap+fastinfoset": { "source": "iana" }, "application/soap+xml": { "source": "iana", "compressible": true }, "application/sparql-query": { "source": "iana", "extensions": ["rq"] }, "application/sparql-results+xml": { "source": "iana", "extensions": ["srx"] }, "application/spirits-event+xml": { "source": "iana" }, "application/sql": { "source": "iana" }, "application/srgs": { "source": "iana", "extensions": ["gram"] }, "application/srgs+xml": { "source": "iana", "extensions": ["grxml"] }, "application/sru+xml": { "source": "iana", "extensions": ["sru"] }, "application/ssdl+xml": { "source": "apache", "extensions": ["ssdl"] }, "application/ssml+xml": { "source": "iana", "extensions": ["ssml"] }, "application/tamp-apex-update": { "source": "iana" }, "application/tamp-apex-update-confirm": { "source": "iana" }, "application/tamp-community-update": { "source": "iana" }, "application/tamp-community-update-confirm": { "source": "iana" }, "application/tamp-error": { "source": "iana" }, "application/tamp-sequence-adjust": { "source": "iana" }, "application/tamp-sequence-adjust-confirm": { "source": "iana" }, "application/tamp-status-query": { "source": "iana" }, "application/tamp-status-response": { "source": "iana" }, "application/tamp-update": { "source": "iana" }, "application/tamp-update-confirm": { "source": "iana" }, "application/tar": { "compressible": true }, "application/tei+xml": { "source": "iana", "extensions": ["tei","teicorpus"] }, "application/thraud+xml": { "source": "iana", "extensions": ["tfi"] }, "application/timestamp-query": { "source": "iana" }, "application/timestamp-reply": { "source": "iana" }, "application/timestamped-data": { "source": "iana", "extensions": ["tsd"] }, "application/ttml+xml": { "source": "iana" }, "application/tve-trigger": { "source": "iana" }, "application/ulpfec": { "source": "iana" }, "application/urc-grpsheet+xml": { "source": "iana" }, "application/urc-ressheet+xml": { "source": "iana" }, "application/urc-targetdesc+xml": { "source": "iana" }, "application/urc-uisocketdesc+xml": { "source": "iana" }, "application/vcard+json": { "source": "iana", "compressible": true }, "application/vcard+xml": { "source": "iana" }, "application/vemmi": { "source": "iana" }, "application/vividence.scriptfile": { "source": "apache" }, "application/vnd.3gpp-prose+xml": { "source": "iana" }, "application/vnd.3gpp-prose-pc3ch+xml": { "source": "iana" }, "application/vnd.3gpp.access-transfer-events+xml": { "source": "iana" }, "application/vnd.3gpp.bsf+xml": { "source": "iana" }, "application/vnd.3gpp.mid-call+xml": { "source": "iana" }, "application/vnd.3gpp.pic-bw-large": { "source": "iana", "extensions": ["plb"] }, "application/vnd.3gpp.pic-bw-small": { "source": "iana", "extensions": ["psb"] }, "application/vnd.3gpp.pic-bw-var": { "source": "iana", "extensions": ["pvb"] }, "application/vnd.3gpp.sms": { "source": "iana" }, "application/vnd.3gpp.srvcc-ext+xml": { "source": "iana" }, "application/vnd.3gpp.srvcc-info+xml": { "source": "iana" }, "application/vnd.3gpp.state-and-event-info+xml": { "source": "iana" }, "application/vnd.3gpp.ussd+xml": { "source": "iana" }, "application/vnd.3gpp2.bcmcsinfo+xml": { "source": "iana" }, "application/vnd.3gpp2.sms": { "source": "iana" }, "application/vnd.3gpp2.tcap": { "source": "iana", "extensions": ["tcap"] }, "application/vnd.3m.post-it-notes": { "source": "iana", "extensions": ["pwn"] }, "application/vnd.accpac.simply.aso": { "source": "iana", "extensions": ["aso"] }, "application/vnd.accpac.simply.imp": { "source": "iana", "extensions": ["imp"] }, "application/vnd.acucobol": { "source": "iana", "extensions": ["acu"] }, "application/vnd.acucorp": { "source": "iana", "extensions": ["atc","acutc"] }, "application/vnd.adobe.air-application-installer-package+zip": { "source": "apache", "extensions": ["air"] }, "application/vnd.adobe.flash.movie": { "source": "iana" }, "application/vnd.adobe.formscentral.fcdt": { "source": "iana", "extensions": ["fcdt"] }, "application/vnd.adobe.fxp": { "source": "iana", "extensions": ["fxp","fxpl"] }, "application/vnd.adobe.partial-upload": { "source": "iana" }, "application/vnd.adobe.xdp+xml": { "source": "iana", "extensions": ["xdp"] }, "application/vnd.adobe.xfdf": { "source": "iana", "extensions": ["xfdf"] }, "application/vnd.aether.imp": { "source": "iana" }, "application/vnd.ah-barcode": { "source": "iana" }, "application/vnd.ahead.space": { "source": "iana", "extensions": ["ahead"] }, "application/vnd.airzip.filesecure.azf": { "source": "iana", "extensions": ["azf"] }, "application/vnd.airzip.filesecure.azs": { "source": "iana", "extensions": ["azs"] }, "application/vnd.amazon.ebook": { "source": "apache", "extensions": ["azw"] }, "application/vnd.americandynamics.acc": { "source": "iana", "extensions": ["acc"] }, "application/vnd.amiga.ami": { "source": "iana", "extensions": ["ami"] }, "application/vnd.amundsen.maze+xml": { "source": "iana" }, "application/vnd.android.package-archive": { "source": "apache", "compressible": false, "extensions": ["apk"] }, "application/vnd.anki": { "source": "iana" }, "application/vnd.anser-web-certificate-issue-initiation": { "source": "iana", "extensions": ["cii"] }, "application/vnd.anser-web-funds-transfer-initiation": { "source": "apache", "extensions": ["fti"] }, "application/vnd.antix.game-component": { "source": "iana", "extensions": ["atx"] }, "application/vnd.apache.thrift.binary": { "source": "iana" }, "application/vnd.apache.thrift.compact": { "source": "iana" }, "application/vnd.apache.thrift.json": { "source": "iana" }, "application/vnd.api+json": { "source": "iana", "compressible": true }, "application/vnd.apple.installer+xml": { "source": "iana", "extensions": ["mpkg"] }, "application/vnd.apple.mpegurl": { "source": "iana", "extensions": ["m3u8"] }, "application/vnd.apple.pkpass": { "compressible": false, "extensions": ["pkpass"] }, "application/vnd.arastra.swi": { "source": "iana" }, "application/vnd.aristanetworks.swi": { "source": "iana", "extensions": ["swi"] }, "application/vnd.artsquare": { "source": "iana" }, "application/vnd.astraea-software.iota": { "source": "iana", "extensions": ["iota"] }, "application/vnd.audiograph": { "source": "iana", "extensions": ["aep"] }, "application/vnd.autopackage": { "source": "iana" }, "application/vnd.avistar+xml": { "source": "iana" }, "application/vnd.balsamiq.bmml+xml": { "source": "iana" }, "application/vnd.balsamiq.bmpr": { "source": "iana" }, "application/vnd.bekitzur-stech+json": { "source": "iana", "compressible": true }, "application/vnd.biopax.rdf+xml": { "source": "iana" }, "application/vnd.blueice.multipass": { "source": "iana", "extensions": ["mpm"] }, "application/vnd.bluetooth.ep.oob": { "source": "iana" }, "application/vnd.bluetooth.le.oob": { "source": "iana" }, "application/vnd.bmi": { "source": "iana", "extensions": ["bmi"] }, "application/vnd.businessobjects": { "source": "iana", "extensions": ["rep"] }, "application/vnd.cab-jscript": { "source": "iana" }, "application/vnd.canon-cpdl": { "source": "iana" }, "application/vnd.canon-lips": { "source": "iana" }, "application/vnd.cendio.thinlinc.clientconf": { "source": "iana" }, "application/vnd.century-systems.tcp_stream": { "source": "iana" }, "application/vnd.chemdraw+xml": { "source": "iana", "extensions": ["cdxml"] }, "application/vnd.chipnuts.karaoke-mmd": { "source": "iana", "extensions": ["mmd"] }, "application/vnd.cinderella": { "source": "iana", "extensions": ["cdy"] }, "application/vnd.cirpack.isdn-ext": { "source": "iana" }, "application/vnd.citationstyles.style+xml": { "source": "iana" }, "application/vnd.claymore": { "source": "iana", "extensions": ["cla"] }, "application/vnd.cloanto.rp9": { "source": "iana", "extensions": ["rp9"] }, "application/vnd.clonk.c4group": { "source": "iana", "extensions": ["c4g","c4d","c4f","c4p","c4u"] }, "application/vnd.cluetrust.cartomobile-config": { "source": "iana", "extensions": ["c11amc"] }, "application/vnd.cluetrust.cartomobile-config-pkg": { "source": "iana", "extensions": ["c11amz"] }, "application/vnd.coffeescript": { "source": "iana" }, "application/vnd.collection+json": { "source": "iana", "compressible": true }, "application/vnd.collection.doc+json": { "source": "iana", "compressible": true }, "application/vnd.collection.next+json": { "source": "iana", "compressible": true }, "application/vnd.commerce-battelle": { "source": "iana" }, "application/vnd.commonspace": { "source": "iana", "extensions": ["csp"] }, "application/vnd.contact.cmsg": { "source": "iana", "extensions": ["cdbcmsg"] }, "application/vnd.cosmocaller": { "source": "iana", "extensions": ["cmc"] }, "application/vnd.crick.clicker": { "source": "iana", "extensions": ["clkx"] }, "application/vnd.crick.clicker.keyboard": { "source": "iana", "extensions": ["clkk"] }, "application/vnd.crick.clicker.palette": { "source": "iana", "extensions": ["clkp"] }, "application/vnd.crick.clicker.template": { "source": "iana", "extensions": ["clkt"] }, "application/vnd.crick.clicker.wordbank": { "source": "iana", "extensions": ["clkw"] }, "application/vnd.criticaltools.wbs+xml": { "source": "iana", "extensions": ["wbs"] }, "application/vnd.ctc-posml": { "source": "iana", "extensions": ["pml"] }, "application/vnd.ctct.ws+xml": { "source": "iana" }, "application/vnd.cups-pdf": { "source": "iana" }, "application/vnd.cups-postscript": { "source": "iana" }, "application/vnd.cups-ppd": { "source": "iana", "extensions": ["ppd"] }, "application/vnd.cups-raster": { "source": "iana" }, "application/vnd.cups-raw": { "source": "iana" }, "application/vnd.curl": { "source": "iana" }, "application/vnd.curl.car": { "source": "apache", "extensions": ["car"] }, "application/vnd.curl.pcurl": { "source": "apache", "extensions": ["pcurl"] }, "application/vnd.cyan.dean.root+xml": { "source": "iana" }, "application/vnd.cybank": { "source": "iana" }, "application/vnd.dart": { "source": "iana", "compressible": true, "extensions": ["dart"] }, "application/vnd.data-vision.rdz": { "source": "iana", "extensions": ["rdz"] }, "application/vnd.debian.binary-package": { "source": "iana" }, "application/vnd.dece.data": { "source": "iana", "extensions": ["uvf","uvvf","uvd","uvvd"] }, "application/vnd.dece.ttml+xml": { "source": "iana", "extensions": ["uvt","uvvt"] }, "application/vnd.dece.unspecified": { "source": "iana", "extensions": ["uvx","uvvx"] }, "application/vnd.dece.zip": { "source": "iana", "extensions": ["uvz","uvvz"] }, "application/vnd.denovo.fcselayout-link": { "source": "iana", "extensions": ["fe_launch"] }, "application/vnd.desmume-movie": { "source": "iana" }, "application/vnd.dir-bi.plate-dl-nosuffix": { "source": "iana" }, "application/vnd.dm.delegation+xml": { "source": "iana" }, "application/vnd.dna": { "source": "iana", "extensions": ["dna"] }, "application/vnd.document+json": { "source": "iana", "compressible": true }, "application/vnd.dolby.mlp": { "source": "apache", "extensions": ["mlp"] }, "application/vnd.dolby.mobile.1": { "source": "iana" }, "application/vnd.dolby.mobile.2": { "source": "iana" }, "application/vnd.doremir.scorecloud-binary-document": { "source": "iana" }, "application/vnd.dpgraph": { "source": "iana", "extensions": ["dpg"] }, "application/vnd.dreamfactory": { "source": "iana", "extensions": ["dfac"] }, "application/vnd.drive+json": { "source": "iana", "compressible": true }, "application/vnd.ds-keypoint": { "source": "apache", "extensions": ["kpxx"] }, "application/vnd.dtg.local": { "source": "iana" }, "application/vnd.dtg.local.flash": { "source": "iana" }, "application/vnd.dtg.local.html": { "source": "iana" }, "application/vnd.dvb.ait": { "source": "iana", "extensions": ["ait"] }, "application/vnd.dvb.dvbj": { "source": "iana" }, "application/vnd.dvb.esgcontainer": { "source": "iana" }, "application/vnd.dvb.ipdcdftnotifaccess": { "source": "iana" }, "application/vnd.dvb.ipdcesgaccess": { "source": "iana" }, "application/vnd.dvb.ipdcesgaccess2": { "source": "iana" }, "application/vnd.dvb.ipdcesgpdd": { "source": "iana" }, "application/vnd.dvb.ipdcroaming": { "source": "iana" }, "application/vnd.dvb.iptv.alfec-base": { "source": "iana" }, "application/vnd.dvb.iptv.alfec-enhancement": { "source": "iana" }, "application/vnd.dvb.notif-aggregate-root+xml": { "source": "iana" }, "application/vnd.dvb.notif-container+xml": { "source": "iana" }, "application/vnd.dvb.notif-generic+xml": { "source": "iana" }, "application/vnd.dvb.notif-ia-msglist+xml": { "source": "iana" }, "application/vnd.dvb.notif-ia-registration-request+xml": { "source": "iana" }, "application/vnd.dvb.notif-ia-registration-response+xml": { "source": "iana" }, "application/vnd.dvb.notif-init+xml": { "source": "iana" }, "application/vnd.dvb.pfr": { "source": "iana" }, "application/vnd.dvb.service": { "source": "iana", "extensions": ["svc"] }, "application/vnd.dxr": { "source": "iana" }, "application/vnd.dynageo": { "source": "iana", "extensions": ["geo"] }, "application/vnd.dzr": { "source": "iana" }, "application/vnd.easykaraoke.cdgdownload": { "source": "iana" }, "application/vnd.ecdis-update": { "source": "iana" }, "application/vnd.ecowin.chart": { "source": "iana", "extensions": ["mag"] }, "application/vnd.ecowin.filerequest": { "source": "iana" }, "application/vnd.ecowin.fileupdate": { "source": "iana" }, "application/vnd.ecowin.series": { "source": "iana" }, "application/vnd.ecowin.seriesrequest": { "source": "iana" }, "application/vnd.ecowin.seriesupdate": { "source": "iana" }, "application/vnd.emclient.accessrequest+xml": { "source": "iana" }, "application/vnd.enliven": { "source": "iana", "extensions": ["nml"] }, "application/vnd.enphase.envoy": { "source": "iana" }, "application/vnd.eprints.data+xml": { "source": "iana" }, "application/vnd.epson.esf": { "source": "iana", "extensions": ["esf"] }, "application/vnd.epson.msf": { "source": "iana", "extensions": ["msf"] }, "application/vnd.epson.quickanime": { "source": "iana", "extensions": ["qam"] }, "application/vnd.epson.salt": { "source": "iana", "extensions": ["slt"] }, "application/vnd.epson.ssf": { "source": "iana", "extensions": ["ssf"] }, "application/vnd.ericsson.quickcall": { "source": "iana" }, "application/vnd.eszigno3+xml": { "source": "iana", "extensions": ["es3","et3"] }, "application/vnd.etsi.aoc+xml": { "source": "iana" }, "application/vnd.etsi.asic-e+zip": { "source": "iana" }, "application/vnd.etsi.asic-s+zip": { "source": "iana" }, "application/vnd.etsi.cug+xml": { "source": "iana" }, "application/vnd.etsi.iptvcommand+xml": { "source": "iana" }, "application/vnd.etsi.iptvdiscovery+xml": { "source": "iana" }, "application/vnd.etsi.iptvprofile+xml": { "source": "iana" }, "application/vnd.etsi.iptvsad-bc+xml": { "source": "iana" }, "application/vnd.etsi.iptvsad-cod+xml": { "source": "iana" }, "application/vnd.etsi.iptvsad-npvr+xml": { "source": "iana" }, "application/vnd.etsi.iptvservice+xml": { "source": "iana" }, "application/vnd.etsi.iptvsync+xml": { "source": "iana" }, "application/vnd.etsi.iptvueprofile+xml": { "source": "iana" }, "application/vnd.etsi.mcid+xml": { "source": "iana" }, "application/vnd.etsi.mheg5": { "source": "iana" }, "application/vnd.etsi.overload-control-policy-dataset+xml": { "source": "iana" }, "application/vnd.etsi.pstn+xml": { "source": "iana" }, "application/vnd.etsi.sci+xml": { "source": "iana" }, "application/vnd.etsi.simservs+xml": { "source": "iana" }, "application/vnd.etsi.timestamp-token": { "source": "iana" }, "application/vnd.etsi.tsl+xml": { "source": "iana" }, "application/vnd.etsi.tsl.der": { "source": "iana" }, "application/vnd.eudora.data": { "source": "iana" }, "application/vnd.ezpix-album": { "source": "iana", "extensions": ["ez2"] }, "application/vnd.ezpix-package": { "source": "iana", "extensions": ["ez3"] }, "application/vnd.f-secure.mobile": { "source": "iana" }, "application/vnd.fastcopy-disk-image": { "source": "iana" }, "application/vnd.fdf": { "source": "iana", "extensions": ["fdf"] }, "application/vnd.fdsn.mseed": { "source": "iana", "extensions": ["mseed"] }, "application/vnd.fdsn.seed": { "source": "iana", "extensions": ["seed","dataless"] }, "application/vnd.ffsns": { "source": "iana" }, "application/vnd.filmit.zfc": { "source": "iana" }, "application/vnd.fints": { "source": "iana" }, "application/vnd.firemonkeys.cloudcell": { "source": "iana" }, "application/vnd.flographit": { "source": "iana", "extensions": ["gph"] }, "application/vnd.fluxtime.clip": { "source": "iana", "extensions": ["ftc"] }, "application/vnd.font-fontforge-sfd": { "source": "iana" }, "application/vnd.framemaker": { "source": "iana", "extensions": ["fm","frame","maker","book"] }, "application/vnd.frogans.fnc": { "source": "iana", "extensions": ["fnc"] }, "application/vnd.frogans.ltf": { "source": "iana", "extensions": ["ltf"] }, "application/vnd.fsc.weblaunch": { "source": "iana", "extensions": ["fsc"] }, "application/vnd.fujitsu.oasys": { "source": "iana", "extensions": ["oas"] }, "application/vnd.fujitsu.oasys2": { "source": "iana", "extensions": ["oa2"] }, "application/vnd.fujitsu.oasys3": { "source": "iana", "extensions": ["oa3"] }, "application/vnd.fujitsu.oasysgp": { "source": "iana", "extensions": ["fg5"] }, "application/vnd.fujitsu.oasysprs": { "source": "iana", "extensions": ["bh2"] }, "application/vnd.fujixerox.art-ex": { "source": "iana" }, "application/vnd.fujixerox.art4": { "source": "iana" }, "application/vnd.fujixerox.ddd": { "source": "iana", "extensions": ["ddd"] }, "application/vnd.fujixerox.docuworks": { "source": "iana", "extensions": ["xdw"] }, "application/vnd.fujixerox.docuworks.binder": { "source": "iana", "extensions": ["xbd"] }, "application/vnd.fujixerox.docuworks.container": { "source": "iana" }, "application/vnd.fujixerox.hbpl": { "source": "iana" }, "application/vnd.fut-misnet": { "source": "iana" }, "application/vnd.fuzzysheet": { "source": "iana", "extensions": ["fzs"] }, "application/vnd.genomatix.tuxedo": { "source": "iana", "extensions": ["txd"] }, "application/vnd.geo+json": { "source": "iana", "compressible": true }, "application/vnd.geocube+xml": { "source": "iana" }, "application/vnd.geogebra.file": { "source": "iana", "extensions": ["ggb"] }, "application/vnd.geogebra.tool": { "source": "iana", "extensions": ["ggt"] }, "application/vnd.geometry-explorer": { "source": "iana", "extensions": ["gex","gre"] }, "application/vnd.geonext": { "source": "iana", "extensions": ["gxt"] }, "application/vnd.geoplan": { "source": "iana", "extensions": ["g2w"] }, "application/vnd.geospace": { "source": "iana", "extensions": ["g3w"] }, "application/vnd.gerber": { "source": "iana" }, "application/vnd.globalplatform.card-content-mgt": { "source": "iana" }, "application/vnd.globalplatform.card-content-mgt-response": { "source": "iana" }, "application/vnd.gmx": { "source": "iana", "extensions": ["gmx"] }, "application/vnd.google-apps.document": { "compressible": false, "extensions": ["gdoc"] }, "application/vnd.google-apps.presentation": { "compressible": false, "extensions": ["gslides"] }, "application/vnd.google-apps.spreadsheet": { "compressible": false, "extensions": ["gsheet"] }, "application/vnd.google-earth.kml+xml": { "source": "iana", "compressible": true, "extensions": ["kml"] }, "application/vnd.google-earth.kmz": { "source": "iana", "compressible": false, "extensions": ["kmz"] }, "application/vnd.gov.sk.e-form+xml": { "source": "iana" }, "application/vnd.gov.sk.e-form+zip": { "source": "iana" }, "application/vnd.gov.sk.xmldatacontainer+xml": { "source": "iana" }, "application/vnd.grafeq": { "source": "iana", "extensions": ["gqf","gqs"] }, "application/vnd.gridmp": { "source": "iana" }, "application/vnd.groove-account": { "source": "iana", "extensions": ["gac"] }, "application/vnd.groove-help": { "source": "iana", "extensions": ["ghf"] }, "application/vnd.groove-identity-message": { "source": "iana", "extensions": ["gim"] }, "application/vnd.groove-injector": { "source": "iana", "extensions": ["grv"] }, "application/vnd.groove-tool-message": { "source": "iana", "extensions": ["gtm"] }, "application/vnd.groove-tool-template": { "source": "iana", "extensions": ["tpl"] }, "application/vnd.groove-vcard": { "source": "iana", "extensions": ["vcg"] }, "application/vnd.hal+json": { "source": "iana", "compressible": true }, "application/vnd.hal+xml": { "source": "iana", "extensions": ["hal"] }, "application/vnd.handheld-entertainment+xml": { "source": "iana", "extensions": ["zmm"] }, "application/vnd.hbci": { "source": "iana", "extensions": ["hbci"] }, "application/vnd.hcl-bireports": { "source": "iana" }, "application/vnd.hdt": { "source": "iana" }, "application/vnd.heroku+json": { "source": "iana", "compressible": true }, "application/vnd.hhe.lesson-player": { "source": "iana", "extensions": ["les"] }, "application/vnd.hp-hpgl": { "source": "iana", "extensions": ["hpgl"] }, "application/vnd.hp-hpid": { "source": "iana", "extensions": ["hpid"] }, "application/vnd.hp-hps": { "source": "iana", "extensions": ["hps"] }, "application/vnd.hp-jlyt": { "source": "iana", "extensions": ["jlt"] }, "application/vnd.hp-pcl": { "source": "iana", "extensions": ["pcl"] }, "application/vnd.hp-pclxl": { "source": "iana", "extensions": ["pclxl"] }, "application/vnd.httphone": { "source": "iana" }, "application/vnd.hydrostatix.sof-data": { "source": "iana", "extensions": ["sfd-hdstx"] }, "application/vnd.hyperdrive+json": { "source": "iana", "compressible": true }, "application/vnd.hzn-3d-crossword": { "source": "iana" }, "application/vnd.ibm.afplinedata": { "source": "iana" }, "application/vnd.ibm.electronic-media": { "source": "iana" }, "application/vnd.ibm.minipay": { "source": "iana", "extensions": ["mpy"] }, "application/vnd.ibm.modcap": { "source": "iana", "extensions": ["afp","listafp","list3820"] }, "application/vnd.ibm.rights-management": { "source": "iana", "extensions": ["irm"] }, "application/vnd.ibm.secure-container": { "source": "iana", "extensions": ["sc"] }, "application/vnd.iccprofile": { "source": "iana", "extensions": ["icc","icm"] }, "application/vnd.ieee.1905": { "source": "iana" }, "application/vnd.igloader": { "source": "iana", "extensions": ["igl"] }, "application/vnd.immervision-ivp": { "source": "iana", "extensions": ["ivp"] }, "application/vnd.immervision-ivu": { "source": "iana", "extensions": ["ivu"] }, "application/vnd.ims.imsccv1p1": { "source": "iana" }, "application/vnd.ims.imsccv1p2": { "source": "iana" }, "application/vnd.ims.imsccv1p3": { "source": "iana" }, "application/vnd.ims.lis.v2.result+json": { "source": "iana", "compressible": true }, "application/vnd.ims.lti.v2.toolconsumerprofile+json": { "source": "iana", "compressible": true }, "application/vnd.ims.lti.v2.toolproxy+json": { "source": "iana", "compressible": true }, "application/vnd.ims.lti.v2.toolproxy.id+json": { "source": "iana", "compressible": true }, "application/vnd.ims.lti.v2.toolsettings+json": { "source": "iana", "compressible": true }, "application/vnd.ims.lti.v2.toolsettings.simple+json": { "source": "iana", "compressible": true }, "application/vnd.informedcontrol.rms+xml": { "source": "iana" }, "application/vnd.informix-visionary": { "source": "iana" }, "application/vnd.infotech.project": { "source": "iana" }, "application/vnd.infotech.project+xml": { "source": "iana" }, "application/vnd.innopath.wamp.notification": { "source": "iana" }, "application/vnd.insors.igm": { "source": "iana", "extensions": ["igm"] }, "application/vnd.intercon.formnet": { "source": "iana", "extensions": ["xpw","xpx"] }, "application/vnd.intergeo": { "source": "iana", "extensions": ["i2g"] }, "application/vnd.intertrust.digibox": { "source": "iana" }, "application/vnd.intertrust.nncp": { "source": "iana" }, "application/vnd.intu.qbo": { "source": "iana", "extensions": ["qbo"] }, "application/vnd.intu.qfx": { "source": "iana", "extensions": ["qfx"] }, "application/vnd.iptc.g2.catalogitem+xml": { "source": "iana" }, "application/vnd.iptc.g2.conceptitem+xml": { "source": "iana" }, "application/vnd.iptc.g2.knowledgeitem+xml": { "source": "iana" }, "application/vnd.iptc.g2.newsitem+xml": { "source": "iana" }, "application/vnd.iptc.g2.newsmessage+xml": { "source": "iana" }, "application/vnd.iptc.g2.packageitem+xml": { "source": "iana" }, "application/vnd.iptc.g2.planningitem+xml": { "source": "iana" }, "application/vnd.ipunplugged.rcprofile": { "source": "iana", "extensions": ["rcprofile"] }, "application/vnd.irepository.package+xml": { "source": "iana", "extensions": ["irp"] }, "application/vnd.is-xpr": { "source": "iana", "extensions": ["xpr"] }, "application/vnd.isac.fcs": { "source": "iana", "extensions": ["fcs"] }, "application/vnd.jam": { "source": "iana", "extensions": ["jam"] }, "application/vnd.japannet-directory-service": { "source": "iana" }, "application/vnd.japannet-jpnstore-wakeup": { "source": "iana" }, "application/vnd.japannet-payment-wakeup": { "source": "iana" }, "application/vnd.japannet-registration": { "source": "iana" }, "application/vnd.japannet-registration-wakeup": { "source": "iana" }, "application/vnd.japannet-setstore-wakeup": { "source": "iana" }, "application/vnd.japannet-verification": { "source": "iana" }, "application/vnd.japannet-verification-wakeup": { "source": "iana" }, "application/vnd.jcp.javame.midlet-rms": { "source": "iana", "extensions": ["rms"] }, "application/vnd.jisp": { "source": "iana", "extensions": ["jisp"] }, "application/vnd.joost.joda-archive": { "source": "iana", "extensions": ["joda"] }, "application/vnd.jsk.isdn-ngn": { "source": "iana" }, "application/vnd.kahootz": { "source": "iana", "extensions": ["ktz","ktr"] }, "application/vnd.kde.karbon": { "source": "iana", "extensions": ["karbon"] }, "application/vnd.kde.kchart": { "source": "iana", "extensions": ["chrt"] }, "application/vnd.kde.kformula": { "source": "iana", "extensions": ["kfo"] }, "application/vnd.kde.kivio": { "source": "iana", "extensions": ["flw"] }, "application/vnd.kde.kontour": { "source": "iana", "extensions": ["kon"] }, "application/vnd.kde.kpresenter": { "source": "iana", "extensions": ["kpr","kpt"] }, "application/vnd.kde.kspread": { "source": "iana", "extensions": ["ksp"] }, "application/vnd.kde.kword": { "source": "iana", "extensions": ["kwd","kwt"] }, "application/vnd.kenameaapp": { "source": "iana", "extensions": ["htke"] }, "application/vnd.kidspiration": { "source": "iana", "extensions": ["kia"] }, "application/vnd.kinar": { "source": "iana", "extensions": ["kne","knp"] }, "application/vnd.koan": { "source": "iana", "extensions": ["skp","skd","skt","skm"] }, "application/vnd.kodak-descriptor": { "source": "iana", "extensions": ["sse"] }, "application/vnd.las.las+xml": { "source": "iana", "extensions": ["lasxml"] }, "application/vnd.liberty-request+xml": { "source": "iana" }, "application/vnd.llamagraphics.life-balance.desktop": { "source": "iana", "extensions": ["lbd"] }, "application/vnd.llamagraphics.life-balance.exchange+xml": { "source": "iana", "extensions": ["lbe"] }, "application/vnd.lotus-1-2-3": { "source": "iana", "extensions": ["123"] }, "application/vnd.lotus-approach": { "source": "iana", "extensions": ["apr"] }, "application/vnd.lotus-freelance": { "source": "iana", "extensions": ["pre"] }, "application/vnd.lotus-notes": { "source": "iana", "extensions": ["nsf"] }, "application/vnd.lotus-organizer": { "source": "iana", "extensions": ["org"] }, "application/vnd.lotus-screencam": { "source": "iana", "extensions": ["scm"] }, "application/vnd.lotus-wordpro": { "source": "iana", "extensions": ["lwp"] }, "application/vnd.macports.portpkg": { "source": "iana", "extensions": ["portpkg"] }, "application/vnd.mapbox-vector-tile": { "source": "iana" }, "application/vnd.marlin.drm.actiontoken+xml": { "source": "iana" }, "application/vnd.marlin.drm.conftoken+xml": { "source": "iana" }, "application/vnd.marlin.drm.license+xml": { "source": "iana" }, "application/vnd.marlin.drm.mdcf": { "source": "iana" }, "application/vnd.mason+json": { "source": "iana", "compressible": true }, "application/vnd.maxmind.maxmind-db": { "source": "iana" }, "application/vnd.mcd": { "source": "iana", "extensions": ["mcd"] }, "application/vnd.medcalcdata": { "source": "iana", "extensions": ["mc1"] }, "application/vnd.mediastation.cdkey": { "source": "iana", "extensions": ["cdkey"] }, "application/vnd.meridian-slingshot": { "source": "iana" }, "application/vnd.mfer": { "source": "iana", "extensions": ["mwf"] }, "application/vnd.mfmp": { "source": "iana", "extensions": ["mfm"] }, "application/vnd.micro+json": { "source": "iana", "compressible": true }, "application/vnd.micrografx.flo": { "source": "iana", "extensions": ["flo"] }, "application/vnd.micrografx.igx": { "source": "iana", "extensions": ["igx"] }, "application/vnd.microsoft.portable-executable": { "source": "iana" }, "application/vnd.miele+json": { "source": "iana", "compressible": true }, "application/vnd.mif": { "source": "iana", "extensions": ["mif"] }, "application/vnd.minisoft-hp3000-save": { "source": "iana" }, "application/vnd.mitsubishi.misty-guard.trustweb": { "source": "iana" }, "application/vnd.mobius.daf": { "source": "iana", "extensions": ["daf"] }, "application/vnd.mobius.dis": { "source": "iana", "extensions": ["dis"] }, "application/vnd.mobius.mbk": { "source": "iana", "extensions": ["mbk"] }, "application/vnd.mobius.mqy": { "source": "iana", "extensions": ["mqy"] }, "application/vnd.mobius.msl": { "source": "iana", "extensions": ["msl"] }, "application/vnd.mobius.plc": { "source": "iana", "extensions": ["plc"] }, "application/vnd.mobius.txf": { "source": "iana", "extensions": ["txf"] }, "application/vnd.mophun.application": { "source": "iana", "extensions": ["mpn"] }, "application/vnd.mophun.certificate": { "source": "iana", "extensions": ["mpc"] }, "application/vnd.motorola.flexsuite": { "source": "iana" }, "application/vnd.motorola.flexsuite.adsi": { "source": "iana" }, "application/vnd.motorola.flexsuite.fis": { "source": "iana" }, "application/vnd.motorola.flexsuite.gotap": { "source": "iana" }, "application/vnd.motorola.flexsuite.kmr": { "source": "iana" }, "application/vnd.motorola.flexsuite.ttc": { "source": "iana" }, "application/vnd.motorola.flexsuite.wem": { "source": "iana" }, "application/vnd.motorola.iprm": { "source": "iana" }, "application/vnd.mozilla.xul+xml": { "source": "iana", "compressible": true, "extensions": ["xul"] }, "application/vnd.ms-3mfdocument": { "source": "iana" }, "application/vnd.ms-artgalry": { "source": "iana", "extensions": ["cil"] }, "application/vnd.ms-asf": { "source": "iana" }, "application/vnd.ms-cab-compressed": { "source": "iana", "extensions": ["cab"] }, "application/vnd.ms-color.iccprofile": { "source": "apache" }, "application/vnd.ms-excel": { "source": "iana", "compressible": false, "extensions": ["xls","xlm","xla","xlc","xlt","xlw"] }, "application/vnd.ms-excel.addin.macroenabled.12": { "source": "iana", "extensions": ["xlam"] }, "application/vnd.ms-excel.sheet.binary.macroenabled.12": { "source": "iana", "extensions": ["xlsb"] }, "application/vnd.ms-excel.sheet.macroenabled.12": { "source": "iana", "extensions": ["xlsm"] }, "application/vnd.ms-excel.template.macroenabled.12": { "source": "iana", "extensions": ["xltm"] }, "application/vnd.ms-fontobject": { "source": "iana", "compressible": true, "extensions": ["eot"] }, "application/vnd.ms-htmlhelp": { "source": "iana", "extensions": ["chm"] }, "application/vnd.ms-ims": { "source": "iana", "extensions": ["ims"] }, "application/vnd.ms-lrm": { "source": "iana", "extensions": ["lrm"] }, "application/vnd.ms-office.activex+xml": { "source": "iana" }, "application/vnd.ms-officetheme": { "source": "iana", "extensions": ["thmx"] }, "application/vnd.ms-opentype": { "source": "apache", "compressible": true }, "application/vnd.ms-package.obfuscated-opentype": { "source": "apache" }, "application/vnd.ms-pki.seccat": { "source": "apache", "extensions": ["cat"] }, "application/vnd.ms-pki.stl": { "source": "apache", "extensions": ["stl"] }, "application/vnd.ms-playready.initiator+xml": { "source": "iana" }, "application/vnd.ms-powerpoint": { "source": "iana", "compressible": false, "extensions": ["ppt","pps","pot"] }, "application/vnd.ms-powerpoint.addin.macroenabled.12": { "source": "iana", "extensions": ["ppam"] }, "application/vnd.ms-powerpoint.presentation.macroenabled.12": { "source": "iana", "extensions": ["pptm"] }, "application/vnd.ms-powerpoint.slide.macroenabled.12": { "source": "iana", "extensions": ["sldm"] }, "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { "source": "iana", "extensions": ["ppsm"] }, "application/vnd.ms-powerpoint.template.macroenabled.12": { "source": "iana", "extensions": ["potm"] }, "application/vnd.ms-printdevicecapabilities+xml": { "source": "iana" }, "application/vnd.ms-printing.printticket+xml": { "source": "apache" }, "application/vnd.ms-printschematicket+xml": { "source": "iana" }, "application/vnd.ms-project": { "source": "iana", "extensions": ["mpp","mpt"] }, "application/vnd.ms-tnef": { "source": "iana" }, "application/vnd.ms-windows.devicepairing": { "source": "iana" }, "application/vnd.ms-windows.nwprinting.oob": { "source": "iana" }, "application/vnd.ms-windows.printerpairing": { "source": "iana" }, "application/vnd.ms-windows.wsd.oob": { "source": "iana" }, "application/vnd.ms-wmdrm.lic-chlg-req": { "source": "iana" }, "application/vnd.ms-wmdrm.lic-resp": { "source": "iana" }, "application/vnd.ms-wmdrm.meter-chlg-req": { "source": "iana" }, "application/vnd.ms-wmdrm.meter-resp": { "source": "iana" }, "application/vnd.ms-word.document.macroenabled.12": { "source": "iana", "extensions": ["docm"] }, "application/vnd.ms-word.template.macroenabled.12": { "source": "iana", "extensions": ["dotm"] }, "application/vnd.ms-works": { "source": "iana", "extensions": ["wps","wks","wcm","wdb"] }, "application/vnd.ms-wpl": { "source": "iana", "extensions": ["wpl"] }, "application/vnd.ms-xpsdocument": { "source": "iana", "compressible": false, "extensions": ["xps"] }, "application/vnd.msa-disk-image": { "source": "iana" }, "application/vnd.mseq": { "source": "iana", "extensions": ["mseq"] }, "application/vnd.msign": { "source": "iana" }, "application/vnd.multiad.creator": { "source": "iana" }, "application/vnd.multiad.creator.cif": { "source": "iana" }, "application/vnd.music-niff": { "source": "iana" }, "application/vnd.musician": { "source": "iana", "extensions": ["mus"] }, "application/vnd.muvee.style": { "source": "iana", "extensions": ["msty"] }, "application/vnd.mynfc": { "source": "iana", "extensions": ["taglet"] }, "application/vnd.ncd.control": { "source": "iana" }, "application/vnd.ncd.reference": { "source": "iana" }, "application/vnd.nervana": { "source": "iana" }, "application/vnd.netfpx": { "source": "iana" }, "application/vnd.neurolanguage.nlu": { "source": "iana", "extensions": ["nlu"] }, "application/vnd.nintendo.nitro.rom": { "source": "iana" }, "application/vnd.nintendo.snes.rom": { "source": "iana" }, "application/vnd.nitf": { "source": "iana", "extensions": ["ntf","nitf"] }, "application/vnd.noblenet-directory": { "source": "iana", "extensions": ["nnd"] }, "application/vnd.noblenet-sealer": { "source": "iana", "extensions": ["nns"] }, "application/vnd.noblenet-web": { "source": "iana", "extensions": ["nnw"] }, "application/vnd.nokia.catalogs": { "source": "iana" }, "application/vnd.nokia.conml+wbxml": { "source": "iana" }, "application/vnd.nokia.conml+xml": { "source": "iana" }, "application/vnd.nokia.iptv.config+xml": { "source": "iana" }, "application/vnd.nokia.isds-radio-presets": { "source": "iana" }, "application/vnd.nokia.landmark+wbxml": { "source": "iana" }, "application/vnd.nokia.landmark+xml": { "source": "iana" }, "application/vnd.nokia.landmarkcollection+xml": { "source": "iana" }, "application/vnd.nokia.n-gage.ac+xml": { "source": "iana" }, "application/vnd.nokia.n-gage.data": { "source": "iana", "extensions": ["ngdat"] }, "application/vnd.nokia.n-gage.symbian.install": { "source": "iana", "extensions": ["n-gage"] }, "application/vnd.nokia.ncd": { "source": "iana" }, "application/vnd.nokia.pcd+wbxml": { "source": "iana" }, "application/vnd.nokia.pcd+xml": { "source": "iana" }, "application/vnd.nokia.radio-preset": { "source": "iana", "extensions": ["rpst"] }, "application/vnd.nokia.radio-presets": { "source": "iana", "extensions": ["rpss"] }, "application/vnd.novadigm.edm": { "source": "iana", "extensions": ["edm"] }, "application/vnd.novadigm.edx": { "source": "iana", "extensions": ["edx"] }, "application/vnd.novadigm.ext": { "source": "iana", "extensions": ["ext"] }, "application/vnd.ntt-local.content-share": { "source": "iana" }, "application/vnd.ntt-local.file-transfer": { "source": "iana" }, "application/vnd.ntt-local.ogw_remote-access": { "source": "iana" }, "application/vnd.ntt-local.sip-ta_remote": { "source": "iana" }, "application/vnd.ntt-local.sip-ta_tcp_stream": { "source": "iana" }, "application/vnd.oasis.opendocument.chart": { "source": "iana", "extensions": ["odc"] }, "application/vnd.oasis.opendocument.chart-template": { "source": "iana", "extensions": ["otc"] }, "application/vnd.oasis.opendocument.database": { "source": "iana", "extensions": ["odb"] }, "application/vnd.oasis.opendocument.formula": { "source": "iana", "extensions": ["odf"] }, "application/vnd.oasis.opendocument.formula-template": { "source": "iana", "extensions": ["odft"] }, "application/vnd.oasis.opendocument.graphics": { "source": "iana", "compressible": false, "extensions": ["odg"] }, "application/vnd.oasis.opendocument.graphics-template": { "source": "iana", "extensions": ["otg"] }, "application/vnd.oasis.opendocument.image": { "source": "iana", "extensions": ["odi"] }, "application/vnd.oasis.opendocument.image-template": { "source": "iana", "extensions": ["oti"] }, "application/vnd.oasis.opendocument.presentation": { "source": "iana", "compressible": false, "extensions": ["odp"] }, "application/vnd.oasis.opendocument.presentation-template": { "source": "iana", "extensions": ["otp"] }, "application/vnd.oasis.opendocument.spreadsheet": { "source": "iana", "compressible": false, "extensions": ["ods"] }, "application/vnd.oasis.opendocument.spreadsheet-template": { "source": "iana", "extensions": ["ots"] }, "application/vnd.oasis.opendocument.text": { "source": "iana", "compressible": false, "extensions": ["odt"] }, "application/vnd.oasis.opendocument.text-master": { "source": "iana", "extensions": ["odm"] }, "application/vnd.oasis.opendocument.text-template": { "source": "iana", "extensions": ["ott"] }, "application/vnd.oasis.opendocument.text-web": { "source": "iana", "extensions": ["oth"] }, "application/vnd.obn": { "source": "iana" }, "application/vnd.oftn.l10n+json": { "source": "iana", "compressible": true }, "application/vnd.oipf.contentaccessdownload+xml": { "source": "iana" }, "application/vnd.oipf.contentaccessstreaming+xml": { "source": "iana" }, "application/vnd.oipf.cspg-hexbinary": { "source": "iana" }, "application/vnd.oipf.dae.svg+xml": { "source": "iana" }, "application/vnd.oipf.dae.xhtml+xml": { "source": "iana" }, "application/vnd.oipf.mippvcontrolmessage+xml": { "source": "iana" }, "application/vnd.oipf.pae.gem": { "source": "iana" }, "application/vnd.oipf.spdiscovery+xml": { "source": "iana" }, "application/vnd.oipf.spdlist+xml": { "source": "iana" }, "application/vnd.oipf.ueprofile+xml": { "source": "iana" }, "application/vnd.oipf.userprofile+xml": { "source": "iana" }, "application/vnd.olpc-sugar": { "source": "iana", "extensions": ["xo"] }, "application/vnd.oma-scws-config": { "source": "iana" }, "application/vnd.oma-scws-http-request": { "source": "iana" }, "application/vnd.oma-scws-http-response": { "source": "iana" }, "application/vnd.oma.bcast.associated-procedure-parameter+xml": { "source": "iana" }, "application/vnd.oma.bcast.drm-trigger+xml": { "source": "iana" }, "application/vnd.oma.bcast.imd+xml": { "source": "iana" }, "application/vnd.oma.bcast.ltkm": { "source": "iana" }, "application/vnd.oma.bcast.notification+xml": { "source": "iana" }, "application/vnd.oma.bcast.provisioningtrigger": { "source": "iana" }, "application/vnd.oma.bcast.sgboot": { "source": "iana" }, "application/vnd.oma.bcast.sgdd+xml": { "source": "iana" }, "application/vnd.oma.bcast.sgdu": { "source": "iana" }, "application/vnd.oma.bcast.simple-symbol-container": { "source": "iana" }, "application/vnd.oma.bcast.smartcard-trigger+xml": { "source": "iana" }, "application/vnd.oma.bcast.sprov+xml": { "source": "iana" }, "application/vnd.oma.bcast.stkm": { "source": "iana" }, "application/vnd.oma.cab-address-book+xml": { "source": "iana" }, "application/vnd.oma.cab-feature-handler+xml": { "source": "iana" }, "application/vnd.oma.cab-pcc+xml": { "source": "iana" }, "application/vnd.oma.cab-subs-invite+xml": { "source": "iana" }, "application/vnd.oma.cab-user-prefs+xml": { "source": "iana" }, "application/vnd.oma.dcd": { "source": "iana" }, "application/vnd.oma.dcdc": { "source": "iana" }, "application/vnd.oma.dd2+xml": { "source": "iana", "extensions": ["dd2"] }, "application/vnd.oma.drm.risd+xml": { "source": "iana" }, "application/vnd.oma.group-usage-list+xml": { "source": "iana" }, "application/vnd.oma.pal+xml": { "source": "iana" }, "application/vnd.oma.poc.detailed-progress-report+xml": { "source": "iana" }, "application/vnd.oma.poc.final-report+xml": { "source": "iana" }, "application/vnd.oma.poc.groups+xml": { "source": "iana" }, "application/vnd.oma.poc.invocation-descriptor+xml": { "source": "iana" }, "application/vnd.oma.poc.optimized-progress-report+xml": { "source": "iana" }, "application/vnd.oma.push": { "source": "iana" }, "application/vnd.oma.scidm.messages+xml": { "source": "iana" }, "application/vnd.oma.xcap-directory+xml": { "source": "iana" }, "application/vnd.omads-email+xml": { "source": "iana" }, "application/vnd.omads-file+xml": { "source": "iana" }, "application/vnd.omads-folder+xml": { "source": "iana" }, "application/vnd.omaloc-supl-init": { "source": "iana" }, "application/vnd.openblox.game+xml": { "source": "iana" }, "application/vnd.openblox.game-binary": { "source": "iana" }, "application/vnd.openeye.oeb": { "source": "iana" }, "application/vnd.openofficeorg.extension": { "source": "apache", "extensions": ["oxt"] }, "application/vnd.openxmlformats-officedocument.custom-properties+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.drawing+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.extended-properties+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml-template": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.presentation": { "source": "iana", "compressible": false, "extensions": ["pptx"] }, "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.slide": { "source": "iana", "extensions": ["sldx"] }, "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { "source": "iana", "extensions": ["ppsx"] }, "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.template": { "source": "apache", "extensions": ["potx"] }, "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml-template": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { "source": "iana", "compressible": false, "extensions": ["xlsx"] }, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { "source": "apache", "extensions": ["xltx"] }, "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.theme+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.themeoverride+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.vmldrawing": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml-template": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { "source": "iana", "compressible": false, "extensions": ["docx"] }, "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { "source": "apache", "extensions": ["dotx"] }, "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": { "source": "iana" }, "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": { "source": "iana" }, "application/vnd.openxmlformats-package.core-properties+xml": { "source": "iana" }, "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { "source": "iana" }, "application/vnd.openxmlformats-package.relationships+xml": { "source": "iana" }, "application/vnd.oracle.resource+json": { "source": "iana", "compressible": true }, "application/vnd.orange.indata": { "source": "iana" }, "application/vnd.osa.netdeploy": { "source": "iana" }, "application/vnd.osgeo.mapguide.package": { "source": "iana", "extensions": ["mgp"] }, "application/vnd.osgi.bundle": { "source": "iana" }, "application/vnd.osgi.dp": { "source": "iana", "extensions": ["dp"] }, "application/vnd.osgi.subsystem": { "source": "iana", "extensions": ["esa"] }, "application/vnd.otps.ct-kip+xml": { "source": "iana" }, "application/vnd.oxli.countgraph": { "source": "iana" }, "application/vnd.pagerduty+json": { "source": "iana", "compressible": true }, "application/vnd.palm": { "source": "iana", "extensions": ["pdb","pqa","oprc"] }, "application/vnd.panoply": { "source": "iana" }, "application/vnd.paos+xml": { "source": "iana" }, "application/vnd.paos.xml": { "source": "apache" }, "application/vnd.pawaafile": { "source": "iana", "extensions": ["paw"] }, "application/vnd.pcos": { "source": "iana" }, "application/vnd.pg.format": { "source": "iana", "extensions": ["str"] }, "application/vnd.pg.osasli": { "source": "iana", "extensions": ["ei6"] }, "application/vnd.piaccess.application-licence": { "source": "iana" }, "application/vnd.picsel": { "source": "iana", "extensions": ["efif"] }, "application/vnd.pmi.widget": { "source": "iana", "extensions": ["wg"] }, "application/vnd.poc.group-advertisement+xml": { "source": "iana" }, "application/vnd.pocketlearn": { "source": "iana", "extensions": ["plf"] }, "application/vnd.powerbuilder6": { "source": "iana", "extensions": ["pbd"] }, "application/vnd.powerbuilder6-s": { "source": "iana" }, "application/vnd.powerbuilder7": { "source": "iana" }, "application/vnd.powerbuilder7-s": { "source": "iana" }, "application/vnd.powerbuilder75": { "source": "iana" }, "application/vnd.powerbuilder75-s": { "source": "iana" }, "application/vnd.preminet": { "source": "iana" }, "application/vnd.previewsystems.box": { "source": "iana", "extensions": ["box"] }, "application/vnd.proteus.magazine": { "source": "iana", "extensions": ["mgz"] }, "application/vnd.publishare-delta-tree": { "source": "iana", "extensions": ["qps"] }, "application/vnd.pvi.ptid1": { "source": "iana", "extensions": ["ptid"] }, "application/vnd.pwg-multiplexed": { "source": "iana" }, "application/vnd.pwg-xhtml-print+xml": { "source": "iana" }, "application/vnd.qualcomm.brew-app-res": { "source": "iana" }, "application/vnd.quark.quarkxpress": { "source": "iana", "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"] }, "application/vnd.quobject-quoxdocument": { "source": "iana" }, "application/vnd.radisys.moml+xml": { "source": "iana" }, "application/vnd.radisys.msml+xml": { "source": "iana" }, "application/vnd.radisys.msml-audit+xml": { "source": "iana" }, "application/vnd.radisys.msml-audit-conf+xml": { "source": "iana" }, "application/vnd.radisys.msml-audit-conn+xml": { "source": "iana" }, "application/vnd.radisys.msml-audit-dialog+xml": { "source": "iana" }, "application/vnd.radisys.msml-audit-stream+xml": { "source": "iana" }, "application/vnd.radisys.msml-conf+xml": { "source": "iana" }, "application/vnd.radisys.msml-dialog+xml": { "source": "iana" }, "application/vnd.radisys.msml-dialog-base+xml": { "source": "iana" }, "application/vnd.radisys.msml-dialog-fax-detect+xml": { "source": "iana" }, "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { "source": "iana" }, "application/vnd.radisys.msml-dialog-group+xml": { "source": "iana" }, "application/vnd.radisys.msml-dialog-speech+xml": { "source": "iana" }, "application/vnd.radisys.msml-dialog-transform+xml": { "source": "iana" }, "application/vnd.rainstor.data": { "source": "iana" }, "application/vnd.rapid": { "source": "iana" }, "application/vnd.realvnc.bed": { "source": "iana", "extensions": ["bed"] }, "application/vnd.recordare.musicxml": { "source": "iana", "extensions": ["mxl"] }, "application/vnd.recordare.musicxml+xml": { "source": "iana", "extensions": ["musicxml"] }, "application/vnd.renlearn.rlprint": { "source": "iana" }, "application/vnd.rig.cryptonote": { "source": "iana", "extensions": ["cryptonote"] }, "application/vnd.rim.cod": { "source": "apache", "extensions": ["cod"] }, "application/vnd.rn-realmedia": { "source": "apache", "extensions": ["rm"] }, "application/vnd.rn-realmedia-vbr": { "source": "apache", "extensions": ["rmvb"] }, "application/vnd.route66.link66+xml": { "source": "iana", "extensions": ["link66"] }, "application/vnd.rs-274x": { "source": "iana" }, "application/vnd.ruckus.download": { "source": "iana" }, "application/vnd.s3sms": { "source": "iana" }, "application/vnd.sailingtracker.track": { "source": "iana", "extensions": ["st"] }, "application/vnd.sbm.cid": { "source": "iana" }, "application/vnd.sbm.mid2": { "source": "iana" }, "application/vnd.scribus": { "source": "iana" }, "application/vnd.sealed.3df": { "source": "iana" }, "application/vnd.sealed.csf": { "source": "iana" }, "application/vnd.sealed.doc": { "source": "iana" }, "application/vnd.sealed.eml": { "source": "iana" }, "application/vnd.sealed.mht": { "source": "iana" }, "application/vnd.sealed.net": { "source": "iana" }, "application/vnd.sealed.ppt": { "source": "iana" }, "application/vnd.sealed.tiff": { "source": "iana" }, "application/vnd.sealed.xls": { "source": "iana" }, "application/vnd.sealedmedia.softseal.html": { "source": "iana" }, "application/vnd.sealedmedia.softseal.pdf": { "source": "iana" }, "application/vnd.seemail": { "source": "iana", "extensions": ["see"] }, "application/vnd.sema": { "source": "iana", "extensions": ["sema"] }, "application/vnd.semd": { "source": "iana", "extensions": ["semd"] }, "application/vnd.semf": { "source": "iana", "extensions": ["semf"] }, "application/vnd.shana.informed.formdata": { "source": "iana", "extensions": ["ifm"] }, "application/vnd.shana.informed.formtemplate": { "source": "iana", "extensions": ["itp"] }, "application/vnd.shana.informed.interchange": { "source": "iana", "extensions": ["iif"] }, "application/vnd.shana.informed.package": { "source": "iana", "extensions": ["ipk"] }, "application/vnd.simtech-mindmapper": { "source": "iana", "extensions": ["twd","twds"] }, "application/vnd.siren+json": { "source": "iana", "compressible": true }, "application/vnd.smaf": { "source": "iana", "extensions": ["mmf"] }, "application/vnd.smart.notebook": { "source": "iana" }, "application/vnd.smart.teacher": { "source": "iana", "extensions": ["teacher"] }, "application/vnd.software602.filler.form+xml": { "source": "iana" }, "application/vnd.software602.filler.form-xml-zip": { "source": "iana" }, "application/vnd.solent.sdkm+xml": { "source": "iana", "extensions": ["sdkm","sdkd"] }, "application/vnd.spotfire.dxp": { "source": "iana", "extensions": ["dxp"] }, "application/vnd.spotfire.sfs": { "source": "iana", "extensions": ["sfs"] }, "application/vnd.sss-cod": { "source": "iana" }, "application/vnd.sss-dtf": { "source": "iana" }, "application/vnd.sss-ntf": { "source": "iana" }, "application/vnd.stardivision.calc": { "source": "apache", "extensions": ["sdc"] }, "application/vnd.stardivision.draw": { "source": "apache", "extensions": ["sda"] }, "application/vnd.stardivision.impress": { "source": "apache", "extensions": ["sdd"] }, "application/vnd.stardivision.math": { "source": "apache", "extensions": ["smf"] }, "application/vnd.stardivision.writer": { "source": "apache", "extensions": ["sdw","vor"] }, "application/vnd.stardivision.writer-global": { "source": "apache", "extensions": ["sgl"] }, "application/vnd.stepmania.package": { "source": "iana", "extensions": ["smzip"] }, "application/vnd.stepmania.stepchart": { "source": "iana", "extensions": ["sm"] }, "application/vnd.street-stream": { "source": "iana" }, "application/vnd.sun.wadl+xml": { "source": "iana" }, "application/vnd.sun.xml.calc": { "source": "apache", "extensions": ["sxc"] }, "application/vnd.sun.xml.calc.template": { "source": "apache", "extensions": ["stc"] }, "application/vnd.sun.xml.draw": { "source": "apache", "extensions": ["sxd"] }, "application/vnd.sun.xml.draw.template": { "source": "apache", "extensions": ["std"] }, "application/vnd.sun.xml.impress": { "source": "apache", "extensions": ["sxi"] }, "application/vnd.sun.xml.impress.template": { "source": "apache", "extensions": ["sti"] }, "application/vnd.sun.xml.math": { "source": "apache", "extensions": ["sxm"] }, "application/vnd.sun.xml.writer": { "source": "apache", "extensions": ["sxw"] }, "application/vnd.sun.xml.writer.global": { "source": "apache", "extensions": ["sxg"] }, "application/vnd.sun.xml.writer.template": { "source": "apache", "extensions": ["stw"] }, "application/vnd.sus-calendar": { "source": "iana", "extensions": ["sus","susp"] }, "application/vnd.svd": { "source": "iana", "extensions": ["svd"] }, "application/vnd.swiftview-ics": { "source": "iana" }, "application/vnd.symbian.install": { "source": "apache", "extensions": ["sis","sisx"] }, "application/vnd.syncml+xml": { "source": "iana", "extensions": ["xsm"] }, "application/vnd.syncml.dm+wbxml": { "source": "iana", "extensions": ["bdm"] }, "application/vnd.syncml.dm+xml": { "source": "iana", "extensions": ["xdm"] }, "application/vnd.syncml.dm.notification": { "source": "iana" }, "application/vnd.syncml.dmddf+wbxml": { "source": "iana" }, "application/vnd.syncml.dmddf+xml": { "source": "iana" }, "application/vnd.syncml.dmtnds+wbxml": { "source": "iana" }, "application/vnd.syncml.dmtnds+xml": { "source": "iana" }, "application/vnd.syncml.ds.notification": { "source": "iana" }, "application/vnd.tao.intent-module-archive": { "source": "iana", "extensions": ["tao"] }, "application/vnd.tcpdump.pcap": { "source": "iana", "extensions": ["pcap","cap","dmp"] }, "application/vnd.tmd.mediaflex.api+xml": { "source": "iana" }, "application/vnd.tml": { "source": "iana" }, "application/vnd.tmobile-livetv": { "source": "iana", "extensions": ["tmo"] }, "application/vnd.trid.tpt": { "source": "iana", "extensions": ["tpt"] }, "application/vnd.triscape.mxs": { "source": "iana", "extensions": ["mxs"] }, "application/vnd.trueapp": { "source": "iana", "extensions": ["tra"] }, "application/vnd.truedoc": { "source": "iana" }, "application/vnd.ubisoft.webplayer": { "source": "iana" }, "application/vnd.ufdl": { "source": "iana", "extensions": ["ufd","ufdl"] }, "application/vnd.uiq.theme": { "source": "iana", "extensions": ["utz"] }, "application/vnd.umajin": { "source": "iana", "extensions": ["umj"] }, "application/vnd.unity": { "source": "iana", "extensions": ["unityweb"] }, "application/vnd.uoml+xml": { "source": "iana", "extensions": ["uoml"] }, "application/vnd.uplanet.alert": { "source": "iana" }, "application/vnd.uplanet.alert-wbxml": { "source": "iana" }, "application/vnd.uplanet.bearer-choice": { "source": "iana" }, "application/vnd.uplanet.bearer-choice-wbxml": { "source": "iana" }, "application/vnd.uplanet.cacheop": { "source": "iana" }, "application/vnd.uplanet.cacheop-wbxml": { "source": "iana" }, "application/vnd.uplanet.channel": { "source": "iana" }, "application/vnd.uplanet.channel-wbxml": { "source": "iana" }, "application/vnd.uplanet.list": { "source": "iana" }, "application/vnd.uplanet.list-wbxml": { "source": "iana" }, "application/vnd.uplanet.listcmd": { "source": "iana" }, "application/vnd.uplanet.listcmd-wbxml": { "source": "iana" }, "application/vnd.uplanet.signal": { "source": "iana" }, "application/vnd.uri-map": { "source": "iana" }, "application/vnd.valve.source.material": { "source": "iana" }, "application/vnd.vcx": { "source": "iana", "extensions": ["vcx"] }, "application/vnd.vd-study": { "source": "iana" }, "application/vnd.vectorworks": { "source": "iana" }, "application/vnd.verimatrix.vcas": { "source": "iana" }, "application/vnd.vidsoft.vidconference": { "source": "iana" }, "application/vnd.visio": { "source": "iana", "extensions": ["vsd","vst","vss","vsw"] }, "application/vnd.visionary": { "source": "iana", "extensions": ["vis"] }, "application/vnd.vividence.scriptfile": { "source": "iana" }, "application/vnd.vsf": { "source": "iana", "extensions": ["vsf"] }, "application/vnd.wap.sic": { "source": "iana" }, "application/vnd.wap.slc": { "source": "iana" }, "application/vnd.wap.wbxml": { "source": "iana", "extensions": ["wbxml"] }, "application/vnd.wap.wmlc": { "source": "iana", "extensions": ["wmlc"] }, "application/vnd.wap.wmlscriptc": { "source": "iana", "extensions": ["wmlsc"] }, "application/vnd.webturbo": { "source": "iana", "extensions": ["wtb"] }, "application/vnd.wfa.p2p": { "source": "iana" }, "application/vnd.wfa.wsc": { "source": "iana" }, "application/vnd.windows.devicepairing": { "source": "iana" }, "application/vnd.wmc": { "source": "iana" }, "application/vnd.wmf.bootstrap": { "source": "iana" }, "application/vnd.wolfram.mathematica": { "source": "iana" }, "application/vnd.wolfram.mathematica.package": { "source": "iana" }, "application/vnd.wolfram.player": { "source": "iana", "extensions": ["nbp"] }, "application/vnd.wordperfect": { "source": "iana", "extensions": ["wpd"] }, "application/vnd.wqd": { "source": "iana", "extensions": ["wqd"] }, "application/vnd.wrq-hp3000-labelled": { "source": "iana" }, "application/vnd.wt.stf": { "source": "iana", "extensions": ["stf"] }, "application/vnd.wv.csp+wbxml": { "source": "iana" }, "application/vnd.wv.csp+xml": { "source": "iana" }, "application/vnd.wv.ssp+xml": { "source": "iana" }, "application/vnd.xacml+json": { "source": "iana", "compressible": true }, "application/vnd.xara": { "source": "iana", "extensions": ["xar"] }, "application/vnd.xfdl": { "source": "iana", "extensions": ["xfdl"] }, "application/vnd.xfdl.webform": { "source": "iana" }, "application/vnd.xmi+xml": { "source": "iana" }, "application/vnd.xmpie.cpkg": { "source": "iana" }, "application/vnd.xmpie.dpkg": { "source": "iana" }, "application/vnd.xmpie.plan": { "source": "iana" }, "application/vnd.xmpie.ppkg": { "source": "iana" }, "application/vnd.xmpie.xlim": { "source": "iana" }, "application/vnd.yamaha.hv-dic": { "source": "iana", "extensions": ["hvd"] }, "application/vnd.yamaha.hv-script": { "source": "iana", "extensions": ["hvs"] }, "application/vnd.yamaha.hv-voice": { "source": "iana", "extensions": ["hvp"] }, "application/vnd.yamaha.openscoreformat": { "source": "iana", "extensions": ["osf"] }, "application/vnd.yamaha.openscoreformat.osfpvg+xml": { "source": "iana", "extensions": ["osfpvg"] }, "application/vnd.yamaha.remote-setup": { "source": "iana" }, "application/vnd.yamaha.smaf-audio": { "source": "iana", "extensions": ["saf"] }, "application/vnd.yamaha.smaf-phrase": { "source": "iana", "extensions": ["spf"] }, "application/vnd.yamaha.through-ngn": { "source": "iana" }, "application/vnd.yamaha.tunnel-udpencap": { "source": "iana" }, "application/vnd.yaoweme": { "source": "iana" }, "application/vnd.yellowriver-custom-menu": { "source": "iana", "extensions": ["cmp"] }, "application/vnd.zul": { "source": "iana", "extensions": ["zir","zirz"] }, "application/vnd.zzazz.deck+xml": { "source": "iana", "extensions": ["zaz"] }, "application/voicexml+xml": { "source": "iana", "extensions": ["vxml"] }, "application/vq-rtcpxr": { "source": "iana" }, "application/watcherinfo+xml": { "source": "iana" }, "application/whoispp-query": { "source": "iana" }, "application/whoispp-response": { "source": "iana" }, "application/widget": { "source": "iana", "extensions": ["wgt"] }, "application/winhlp": { "source": "apache", "extensions": ["hlp"] }, "application/wita": { "source": "iana" }, "application/wordperfect5.1": { "source": "iana" }, "application/wsdl+xml": { "source": "iana", "extensions": ["wsdl"] }, "application/wspolicy+xml": { "source": "iana", "extensions": ["wspolicy"] }, "application/x-7z-compressed": { "source": "apache", "compressible": false, "extensions": ["7z"] }, "application/x-abiword": { "source": "apache", "extensions": ["abw"] }, "application/x-ace-compressed": { "source": "apache", "extensions": ["ace"] }, "application/x-amf": { "source": "apache" }, "application/x-apple-diskimage": { "source": "apache", "extensions": ["dmg"] }, "application/x-authorware-bin": { "source": "apache", "extensions": ["aab","x32","u32","vox"] }, "application/x-authorware-map": { "source": "apache", "extensions": ["aam"] }, "application/x-authorware-seg": { "source": "apache", "extensions": ["aas"] }, "application/x-bcpio": { "source": "apache", "extensions": ["bcpio"] }, "application/x-bdoc": { "compressible": false, "extensions": ["bdoc"] }, "application/x-bittorrent": { "source": "apache", "extensions": ["torrent"] }, "application/x-blorb": { "source": "apache", "extensions": ["blb","blorb"] }, "application/x-bzip": { "source": "apache", "compressible": false, "extensions": ["bz"] }, "application/x-bzip2": { "source": "apache", "compressible": false, "extensions": ["bz2","boz"] }, "application/x-cbr": { "source": "apache", "extensions": ["cbr","cba","cbt","cbz","cb7"] }, "application/x-cdlink": { "source": "apache", "extensions": ["vcd"] }, "application/x-cfs-compressed": { "source": "apache", "extensions": ["cfs"] }, "application/x-chat": { "source": "apache", "extensions": ["chat"] }, "application/x-chess-pgn": { "source": "apache", "extensions": ["pgn"] }, "application/x-chrome-extension": { "extensions": ["crx"] }, "application/x-cocoa": { "source": "nginx", "extensions": ["cco"] }, "application/x-compress": { "source": "apache" }, "application/x-conference": { "source": "apache", "extensions": ["nsc"] }, "application/x-cpio": { "source": "apache", "extensions": ["cpio"] }, "application/x-csh": { "source": "apache", "extensions": ["csh"] }, "application/x-deb": { "compressible": false }, "application/x-debian-package": { "source": "apache", "extensions": ["deb","udeb"] }, "application/x-dgc-compressed": { "source": "apache", "extensions": ["dgc"] }, "application/x-director": { "source": "apache", "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"] }, "application/x-doom": { "source": "apache", "extensions": ["wad"] }, "application/x-dtbncx+xml": { "source": "apache", "extensions": ["ncx"] }, "application/x-dtbook+xml": { "source": "apache", "extensions": ["dtb"] }, "application/x-dtbresource+xml": { "source": "apache", "extensions": ["res"] }, "application/x-dvi": { "source": "apache", "compressible": false, "extensions": ["dvi"] }, "application/x-envoy": { "source": "apache", "extensions": ["evy"] }, "application/x-eva": { "source": "apache", "extensions": ["eva"] }, "application/x-font-bdf": { "source": "apache", "extensions": ["bdf"] }, "application/x-font-dos": { "source": "apache" }, "application/x-font-framemaker": { "source": "apache" }, "application/x-font-ghostscript": { "source": "apache", "extensions": ["gsf"] }, "application/x-font-libgrx": { "source": "apache" }, "application/x-font-linux-psf": { "source": "apache", "extensions": ["psf"] }, "application/x-font-otf": { "source": "apache", "compressible": true, "extensions": ["otf"] }, "application/x-font-pcf": { "source": "apache", "extensions": ["pcf"] }, "application/x-font-snf": { "source": "apache", "extensions": ["snf"] }, "application/x-font-speedo": { "source": "apache" }, "application/x-font-sunos-news": { "source": "apache" }, "application/x-font-ttf": { "source": "apache", "compressible": true, "extensions": ["ttf","ttc"] }, "application/x-font-type1": { "source": "apache", "extensions": ["pfa","pfb","pfm","afm"] }, "application/x-font-vfont": { "source": "apache" }, "application/x-freearc": { "source": "apache", "extensions": ["arc"] }, "application/x-futuresplash": { "source": "apache", "extensions": ["spl"] }, "application/x-gca-compressed": { "source": "apache", "extensions": ["gca"] }, "application/x-glulx": { "source": "apache", "extensions": ["ulx"] }, "application/x-gnumeric": { "source": "apache", "extensions": ["gnumeric"] }, "application/x-gramps-xml": { "source": "apache", "extensions": ["gramps"] }, "application/x-gtar": { "source": "apache", "extensions": ["gtar"] }, "application/x-gzip": { "source": "apache" }, "application/x-hdf": { "source": "apache", "extensions": ["hdf"] }, "application/x-httpd-php": { "compressible": true, "extensions": ["php"] }, "application/x-install-instructions": { "source": "apache", "extensions": ["install"] }, "application/x-iso9660-image": { "source": "apache", "extensions": ["iso"] }, "application/x-java-archive-diff": { "source": "nginx", "extensions": ["jardiff"] }, "application/x-java-jnlp-file": { "source": "apache", "compressible": false, "extensions": ["jnlp"] }, "application/x-javascript": { "compressible": true }, "application/x-latex": { "source": "apache", "compressible": false, "extensions": ["latex"] }, "application/x-lua-bytecode": { "extensions": ["luac"] }, "application/x-lzh-compressed": { "source": "apache", "extensions": ["lzh","lha"] }, "application/x-makeself": { "source": "nginx", "extensions": ["run"] }, "application/x-mie": { "source": "apache", "extensions": ["mie"] }, "application/x-mobipocket-ebook": { "source": "apache", "extensions": ["prc","mobi"] }, "application/x-mpegurl": { "compressible": false }, "application/x-ms-application": { "source": "apache", "extensions": ["application"] }, "application/x-ms-shortcut": { "source": "apache", "extensions": ["lnk"] }, "application/x-ms-wmd": { "source": "apache", "extensions": ["wmd"] }, "application/x-ms-wmz": { "source": "apache", "extensions": ["wmz"] }, "application/x-ms-xbap": { "source": "apache", "extensions": ["xbap"] }, "application/x-msaccess": { "source": "apache", "extensions": ["mdb"] }, "application/x-msbinder": { "source": "apache", "extensions": ["obd"] }, "application/x-mscardfile": { "source": "apache", "extensions": ["crd"] }, "application/x-msclip": { "source": "apache", "extensions": ["clp"] }, "application/x-msdos-program": { "extensions": ["exe"] }, "application/x-msdownload": { "source": "apache", "extensions": ["exe","dll","com","bat","msi"] }, "application/x-msmediaview": { "source": "apache", "extensions": ["mvb","m13","m14"] }, "application/x-msmetafile": { "source": "apache", "extensions": ["wmf","wmz","emf","emz"] }, "application/x-msmoney": { "source": "apache", "extensions": ["mny"] }, "application/x-mspublisher": { "source": "apache", "extensions": ["pub"] }, "application/x-msschedule": { "source": "apache", "extensions": ["scd"] }, "application/x-msterminal": { "source": "apache", "extensions": ["trm"] }, "application/x-mswrite": { "source": "apache", "extensions": ["wri"] }, "application/x-netcdf": { "source": "apache", "extensions": ["nc","cdf"] }, "application/x-ns-proxy-autoconfig": { "compressible": true, "extensions": ["pac"] }, "application/x-nzb": { "source": "apache", "extensions": ["nzb"] }, "application/x-perl": { "source": "nginx", "extensions": ["pl","pm"] }, "application/x-pilot": { "source": "nginx", "extensions": ["prc","pdb"] }, "application/x-pkcs12": { "source": "apache", "compressible": false, "extensions": ["p12","pfx"] }, "application/x-pkcs7-certificates": { "source": "apache", "extensions": ["p7b","spc"] }, "application/x-pkcs7-certreqresp": { "source": "apache", "extensions": ["p7r"] }, "application/x-rar-compressed": { "source": "apache", "compressible": false, "extensions": ["rar"] }, "application/x-redhat-package-manager": { "source": "nginx", "extensions": ["rpm"] }, "application/x-research-info-systems": { "source": "apache", "extensions": ["ris"] }, "application/x-sea": { "source": "nginx", "extensions": ["sea"] }, "application/x-sh": { "source": "apache", "compressible": true, "extensions": ["sh"] }, "application/x-shar": { "source": "apache", "extensions": ["shar"] }, "application/x-shockwave-flash": { "source": "apache", "compressible": false, "extensions": ["swf"] }, "application/x-silverlight-app": { "source": "apache", "extensions": ["xap"] }, "application/x-sql": { "source": "apache", "extensions": ["sql"] }, "application/x-stuffit": { "source": "apache", "compressible": false, "extensions": ["sit"] }, "application/x-stuffitx": { "source": "apache", "extensions": ["sitx"] }, "application/x-subrip": { "source": "apache", "extensions": ["srt"] }, "application/x-sv4cpio": { "source": "apache", "extensions": ["sv4cpio"] }, "application/x-sv4crc": { "source": "apache", "extensions": ["sv4crc"] }, "application/x-t3vm-image": { "source": "apache", "extensions": ["t3"] }, "application/x-tads": { "source": "apache", "extensions": ["gam"] }, "application/x-tar": { "source": "apache", "compressible": true, "extensions": ["tar"] }, "application/x-tcl": { "source": "apache", "extensions": ["tcl","tk"] }, "application/x-tex": { "source": "apache", "extensions": ["tex"] }, "application/x-tex-tfm": { "source": "apache", "extensions": ["tfm"] }, "application/x-texinfo": { "source": "apache", "extensions": ["texinfo","texi"] }, "application/x-tgif": { "source": "apache", "extensions": ["obj"] }, "application/x-ustar": { "source": "apache", "extensions": ["ustar"] }, "application/x-wais-source": { "source": "apache", "extensions": ["src"] }, "application/x-web-app-manifest+json": { "compressible": true, "extensions": ["webapp"] }, "application/x-www-form-urlencoded": { "source": "iana", "compressible": true }, "application/x-x509-ca-cert": { "source": "apache", "extensions": ["der","crt","pem"] }, "application/x-xfig": { "source": "apache", "extensions": ["fig"] }, "application/x-xliff+xml": { "source": "apache", "extensions": ["xlf"] }, "application/x-xpinstall": { "source": "apache", "compressible": false, "extensions": ["xpi"] }, "application/x-xz": { "source": "apache", "extensions": ["xz"] }, "application/x-zmachine": { "source": "apache", "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"] }, "application/x400-bp": { "source": "iana" }, "application/xacml+xml": { "source": "iana" }, "application/xaml+xml": { "source": "apache", "extensions": ["xaml"] }, "application/xcap-att+xml": { "source": "iana" }, "application/xcap-caps+xml": { "source": "iana" }, "application/xcap-diff+xml": { "source": "iana", "extensions": ["xdf"] }, "application/xcap-el+xml": { "source": "iana" }, "application/xcap-error+xml": { "source": "iana" }, "application/xcap-ns+xml": { "source": "iana" }, "application/xcon-conference-info+xml": { "source": "iana" }, "application/xcon-conference-info-diff+xml": { "source": "iana" }, "application/xenc+xml": { "source": "iana", "extensions": ["xenc"] }, "application/xhtml+xml": { "source": "iana", "compressible": true, "extensions": ["xhtml","xht"] }, "application/xhtml-voice+xml": { "source": "apache" }, "application/xml": { "source": "iana", "compressible": true, "extensions": ["xml","xsl","xsd","rng"] }, "application/xml-dtd": { "source": "iana", "compressible": true, "extensions": ["dtd"] }, "application/xml-external-parsed-entity": { "source": "iana" }, "application/xml-patch+xml": { "source": "iana" }, "application/xmpp+xml": { "source": "iana" }, "application/xop+xml": { "source": "iana", "compressible": true, "extensions": ["xop"] }, "application/xproc+xml": { "source": "apache", "extensions": ["xpl"] }, "application/xslt+xml": { "source": "iana", "extensions": ["xslt"] }, "application/xspf+xml": { "source": "apache", "extensions": ["xspf"] }, "application/xv+xml": { "source": "iana", "extensions": ["mxml","xhvml","xvml","xvm"] }, "application/yang": { "source": "iana", "extensions": ["yang"] }, "application/yin+xml": { "source": "iana", "extensions": ["yin"] }, "application/zip": { "source": "iana", "compressible": false, "extensions": ["zip"] }, "application/zlib": { "source": "iana" }, "audio/1d-interleaved-parityfec": { "source": "iana" }, "audio/32kadpcm": { "source": "iana" }, "audio/3gpp": { "source": "iana" }, "audio/3gpp2": { "source": "iana" }, "audio/ac3": { "source": "iana" }, "audio/adpcm": { "source": "apache", "extensions": ["adp"] }, "audio/amr": { "source": "iana" }, "audio/amr-wb": { "source": "iana" }, "audio/amr-wb+": { "source": "iana" }, "audio/aptx": { "source": "iana" }, "audio/asc": { "source": "iana" }, "audio/atrac-advanced-lossless": { "source": "iana" }, "audio/atrac-x": { "source": "iana" }, "audio/atrac3": { "source": "iana" }, "audio/basic": { "source": "iana", "compressible": false, "extensions": ["au","snd"] }, "audio/bv16": { "source": "iana" }, "audio/bv32": { "source": "iana" }, "audio/clearmode": { "source": "iana" }, "audio/cn": { "source": "iana" }, "audio/dat12": { "source": "iana" }, "audio/dls": { "source": "iana" }, "audio/dsr-es201108": { "source": "iana" }, "audio/dsr-es202050": { "source": "iana" }, "audio/dsr-es202211": { "source": "iana" }, "audio/dsr-es202212": { "source": "iana" }, "audio/dv": { "source": "iana" }, "audio/dvi4": { "source": "iana" }, "audio/eac3": { "source": "iana" }, "audio/encaprtp": { "source": "iana" }, "audio/evrc": { "source": "iana" }, "audio/evrc-qcp": { "source": "iana" }, "audio/evrc0": { "source": "iana" }, "audio/evrc1": { "source": "iana" }, "audio/evrcb": { "source": "iana" }, "audio/evrcb0": { "source": "iana" }, "audio/evrcb1": { "source": "iana" }, "audio/evrcnw": { "source": "iana" }, "audio/evrcnw0": { "source": "iana" }, "audio/evrcnw1": { "source": "iana" }, "audio/evrcwb": { "source": "iana" }, "audio/evrcwb0": { "source": "iana" }, "audio/evrcwb1": { "source": "iana" }, "audio/evs": { "source": "iana" }, "audio/fwdred": { "source": "iana" }, "audio/g711-0": { "source": "iana" }, "audio/g719": { "source": "iana" }, "audio/g722": { "source": "iana" }, "audio/g7221": { "source": "iana" }, "audio/g723": { "source": "iana" }, "audio/g726-16": { "source": "iana" }, "audio/g726-24": { "source": "iana" }, "audio/g726-32": { "source": "iana" }, "audio/g726-40": { "source": "iana" }, "audio/g728": { "source": "iana" }, "audio/g729": { "source": "iana" }, "audio/g7291": { "source": "iana" }, "audio/g729d": { "source": "iana" }, "audio/g729e": { "source": "iana" }, "audio/gsm": { "source": "iana" }, "audio/gsm-efr": { "source": "iana" }, "audio/gsm-hr-08": { "source": "iana" }, "audio/ilbc": { "source": "iana" }, "audio/ip-mr_v2.5": { "source": "iana" }, "audio/isac": { "source": "apache" }, "audio/l16": { "source": "iana" }, "audio/l20": { "source": "iana" }, "audio/l24": { "source": "iana", "compressible": false }, "audio/l8": { "source": "iana" }, "audio/lpc": { "source": "iana" }, "audio/midi": { "source": "apache", "extensions": ["mid","midi","kar","rmi"] }, "audio/mobile-xmf": { "source": "iana" }, "audio/mp4": { "source": "iana", "compressible": false, "extensions": ["m4a","mp4a"] }, "audio/mp4a-latm": { "source": "iana" }, "audio/mpa": { "source": "iana" }, "audio/mpa-robust": { "source": "iana" }, "audio/mpeg": { "source": "iana", "compressible": false, "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"] }, "audio/mpeg4-generic": { "source": "iana" }, "audio/musepack": { "source": "apache" }, "audio/ogg": { "source": "iana", "compressible": false, "extensions": ["oga","ogg","spx"] }, "audio/opus": { "source": "iana" }, "audio/parityfec": { "source": "iana" }, "audio/pcma": { "source": "iana" }, "audio/pcma-wb": { "source": "iana" }, "audio/pcmu": { "source": "iana" }, "audio/pcmu-wb": { "source": "iana" }, "audio/prs.sid": { "source": "iana" }, "audio/qcelp": { "source": "iana" }, "audio/raptorfec": { "source": "iana" }, "audio/red": { "source": "iana" }, "audio/rtp-enc-aescm128": { "source": "iana" }, "audio/rtp-midi": { "source": "iana" }, "audio/rtploopback": { "source": "iana" }, "audio/rtx": { "source": "iana" }, "audio/s3m": { "source": "apache", "extensions": ["s3m"] }, "audio/silk": { "source": "apache", "extensions": ["sil"] }, "audio/smv": { "source": "iana" }, "audio/smv-qcp": { "source": "iana" }, "audio/smv0": { "source": "iana" }, "audio/sp-midi": { "source": "iana" }, "audio/speex": { "source": "iana" }, "audio/t140c": { "source": "iana" }, "audio/t38": { "source": "iana" }, "audio/telephone-event": { "source": "iana" }, "audio/tone": { "source": "iana" }, "audio/uemclip": { "source": "iana" }, "audio/ulpfec": { "source": "iana" }, "audio/vdvi": { "source": "iana" }, "audio/vmr-wb": { "source": "iana" }, "audio/vnd.3gpp.iufp": { "source": "iana" }, "audio/vnd.4sb": { "source": "iana" }, "audio/vnd.audiokoz": { "source": "iana" }, "audio/vnd.celp": { "source": "iana" }, "audio/vnd.cisco.nse": { "source": "iana" }, "audio/vnd.cmles.radio-events": { "source": "iana" }, "audio/vnd.cns.anp1": { "source": "iana" }, "audio/vnd.cns.inf1": { "source": "iana" }, "audio/vnd.dece.audio": { "source": "iana", "extensions": ["uva","uvva"] }, "audio/vnd.digital-winds": { "source": "iana", "extensions": ["eol"] }, "audio/vnd.dlna.adts": { "source": "iana" }, "audio/vnd.dolby.heaac.1": { "source": "iana" }, "audio/vnd.dolby.heaac.2": { "source": "iana" }, "audio/vnd.dolby.mlp": { "source": "iana" }, "audio/vnd.dolby.mps": { "source": "iana" }, "audio/vnd.dolby.pl2": { "source": "iana" }, "audio/vnd.dolby.pl2x": { "source": "iana" }, "audio/vnd.dolby.pl2z": { "source": "iana" }, "audio/vnd.dolby.pulse.1": { "source": "iana" }, "audio/vnd.dra": { "source": "iana", "extensions": ["dra"] }, "audio/vnd.dts": { "source": "iana", "extensions": ["dts"] }, "audio/vnd.dts.hd": { "source": "iana", "extensions": ["dtshd"] }, "audio/vnd.dvb.file": { "source": "iana" }, "audio/vnd.everad.plj": { "source": "iana" }, "audio/vnd.hns.audio": { "source": "iana" }, "audio/vnd.lucent.voice": { "source": "iana", "extensions": ["lvp"] }, "audio/vnd.ms-playready.media.pya": { "source": "iana", "extensions": ["pya"] }, "audio/vnd.nokia.mobile-xmf": { "source": "iana" }, "audio/vnd.nortel.vbk": { "source": "iana" }, "audio/vnd.nuera.ecelp4800": { "source": "iana", "extensions": ["ecelp4800"] }, "audio/vnd.nuera.ecelp7470": { "source": "iana", "extensions": ["ecelp7470"] }, "audio/vnd.nuera.ecelp9600": { "source": "iana", "extensions": ["ecelp9600"] }, "audio/vnd.octel.sbc": { "source": "iana" }, "audio/vnd.qcelp": { "source": "iana" }, "audio/vnd.rhetorex.32kadpcm": { "source": "iana" }, "audio/vnd.rip": { "source": "iana", "extensions": ["rip"] }, "audio/vnd.rn-realaudio": { "compressible": false }, "audio/vnd.sealedmedia.softseal.mpeg": { "source": "iana" }, "audio/vnd.vmx.cvsd": { "source": "iana" }, "audio/vnd.wave": { "compressible": false }, "audio/vorbis": { "source": "iana", "compressible": false }, "audio/vorbis-config": { "source": "iana" }, "audio/wav": { "compressible": false, "extensions": ["wav"] }, "audio/wave": { "compressible": false, "extensions": ["wav"] }, "audio/webm": { "source": "apache", "compressible": false, "extensions": ["weba"] }, "audio/x-aac": { "source": "apache", "compressible": false, "extensions": ["aac"] }, "audio/x-aiff": { "source": "apache", "extensions": ["aif","aiff","aifc"] }, "audio/x-caf": { "source": "apache", "compressible": false, "extensions": ["caf"] }, "audio/x-flac": { "source": "apache", "extensions": ["flac"] }, "audio/x-m4a": { "source": "nginx", "extensions": ["m4a"] }, "audio/x-matroska": { "source": "apache", "extensions": ["mka"] }, "audio/x-mpegurl": { "source": "apache", "extensions": ["m3u"] }, "audio/x-ms-wax": { "source": "apache", "extensions": ["wax"] }, "audio/x-ms-wma": { "source": "apache", "extensions": ["wma"] }, "audio/x-pn-realaudio": { "source": "apache", "extensions": ["ram","ra"] }, "audio/x-pn-realaudio-plugin": { "source": "apache", "extensions": ["rmp"] }, "audio/x-realaudio": { "source": "nginx", "extensions": ["ra"] }, "audio/x-tta": { "source": "apache" }, "audio/x-wav": { "source": "apache", "extensions": ["wav"] }, "audio/xm": { "source": "apache", "extensions": ["xm"] }, "chemical/x-cdx": { "source": "apache", "extensions": ["cdx"] }, "chemical/x-cif": { "source": "apache", "extensions": ["cif"] }, "chemical/x-cmdf": { "source": "apache", "extensions": ["cmdf"] }, "chemical/x-cml": { "source": "apache", "extensions": ["cml"] }, "chemical/x-csml": { "source": "apache", "extensions": ["csml"] }, "chemical/x-pdb": { "source": "apache" }, "chemical/x-xyz": { "source": "apache", "extensions": ["xyz"] }, "font/opentype": { "compressible": true, "extensions": ["otf"] }, "image/bmp": { "source": "apache", "compressible": true, "extensions": ["bmp"] }, "image/cgm": { "source": "iana", "extensions": ["cgm"] }, "image/fits": { "source": "iana" }, "image/g3fax": { "source": "iana", "extensions": ["g3"] }, "image/gif": { "source": "iana", "compressible": false, "extensions": ["gif"] }, "image/ief": { "source": "iana", "extensions": ["ief"] }, "image/jp2": { "source": "iana" }, "image/jpeg": { "source": "iana", "compressible": false, "extensions": ["jpeg","jpg","jpe"] }, "image/jpm": { "source": "iana" }, "image/jpx": { "source": "iana" }, "image/ktx": { "source": "iana", "extensions": ["ktx"] }, "image/naplps": { "source": "iana" }, "image/pjpeg": { "compressible": false }, "image/png": { "source": "iana", "compressible": false, "extensions": ["png"] }, "image/prs.btif": { "source": "iana", "extensions": ["btif"] }, "image/prs.pti": { "source": "iana" }, "image/pwg-raster": { "source": "iana" }, "image/sgi": { "source": "apache", "extensions": ["sgi"] }, "image/svg+xml": { "source": "iana", "compressible": true, "extensions": ["svg","svgz"] }, "image/t38": { "source": "iana" }, "image/tiff": { "source": "iana", "compressible": false, "extensions": ["tiff","tif"] }, "image/tiff-fx": { "source": "iana" }, "image/vnd.adobe.photoshop": { "source": "iana", "compressible": true, "extensions": ["psd"] }, "image/vnd.airzip.accelerator.azv": { "source": "iana" }, "image/vnd.cns.inf2": { "source": "iana" }, "image/vnd.dece.graphic": { "source": "iana", "extensions": ["uvi","uvvi","uvg","uvvg"] }, "image/vnd.djvu": { "source": "iana", "extensions": ["djvu","djv"] }, "image/vnd.dvb.subtitle": { "source": "iana", "extensions": ["sub"] }, "image/vnd.dwg": { "source": "iana", "extensions": ["dwg"] }, "image/vnd.dxf": { "source": "iana", "extensions": ["dxf"] }, "image/vnd.fastbidsheet": { "source": "iana", "extensions": ["fbs"] }, "image/vnd.fpx": { "source": "iana", "extensions": ["fpx"] }, "image/vnd.fst": { "source": "iana", "extensions": ["fst"] }, "image/vnd.fujixerox.edmics-mmr": { "source": "iana", "extensions": ["mmr"] }, "image/vnd.fujixerox.edmics-rlc": { "source": "iana", "extensions": ["rlc"] }, "image/vnd.globalgraphics.pgb": { "source": "iana" }, "image/vnd.microsoft.icon": { "source": "iana" }, "image/vnd.mix": { "source": "iana" }, "image/vnd.mozilla.apng": { "source": "iana" }, "image/vnd.ms-modi": { "source": "iana", "extensions": ["mdi"] }, "image/vnd.ms-photo": { "source": "apache", "extensions": ["wdp"] }, "image/vnd.net-fpx": { "source": "iana", "extensions": ["npx"] }, "image/vnd.radiance": { "source": "iana" }, "image/vnd.sealed.png": { "source": "iana" }, "image/vnd.sealedmedia.softseal.gif": { "source": "iana" }, "image/vnd.sealedmedia.softseal.jpg": { "source": "iana" }, "image/vnd.svf": { "source": "iana" }, "image/vnd.tencent.tap": { "source": "iana" }, "image/vnd.valve.source.texture": { "source": "iana" }, "image/vnd.wap.wbmp": { "source": "iana", "extensions": ["wbmp"] }, "image/vnd.xiff": { "source": "iana", "extensions": ["xif"] }, "image/vnd.zbrush.pcx": { "source": "iana" }, "image/webp": { "source": "apache", "extensions": ["webp"] }, "image/x-3ds": { "source": "apache", "extensions": ["3ds"] }, "image/x-cmu-raster": { "source": "apache", "extensions": ["ras"] }, "image/x-cmx": { "source": "apache", "extensions": ["cmx"] }, "image/x-freehand": { "source": "apache", "extensions": ["fh","fhc","fh4","fh5","fh7"] }, "image/x-icon": { "source": "apache", "compressible": true, "extensions": ["ico"] }, "image/x-jng": { "source": "nginx", "extensions": ["jng"] }, "image/x-mrsid-image": { "source": "apache", "extensions": ["sid"] }, "image/x-ms-bmp": { "source": "nginx", "compressible": true, "extensions": ["bmp"] }, "image/x-pcx": { "source": "apache", "extensions": ["pcx"] }, "image/x-pict": { "source": "apache", "extensions": ["pic","pct"] }, "image/x-portable-anymap": { "source": "apache", "extensions": ["pnm"] }, "image/x-portable-bitmap": { "source": "apache", "extensions": ["pbm"] }, "image/x-portable-graymap": { "source": "apache", "extensions": ["pgm"] }, "image/x-portable-pixmap": { "source": "apache", "extensions": ["ppm"] }, "image/x-rgb": { "source": "apache", "extensions": ["rgb"] }, "image/x-tga": { "source": "apache", "extensions": ["tga"] }, "image/x-xbitmap": { "source": "apache", "extensions": ["xbm"] }, "image/x-xcf": { "compressible": false }, "image/x-xpixmap": { "source": "apache", "extensions": ["xpm"] }, "image/x-xwindowdump": { "source": "apache", "extensions": ["xwd"] }, "message/cpim": { "source": "iana" }, "message/delivery-status": { "source": "iana" }, "message/disposition-notification": { "source": "iana" }, "message/external-body": { "source": "iana" }, "message/feedback-report": { "source": "iana" }, "message/global": { "source": "iana" }, "message/global-delivery-status": { "source": "iana" }, "message/global-disposition-notification": { "source": "iana" }, "message/global-headers": { "source": "iana" }, "message/http": { "source": "iana", "compressible": false }, "message/imdn+xml": { "source": "iana", "compressible": true }, "message/news": { "source": "iana" }, "message/partial": { "source": "iana", "compressible": false }, "message/rfc822": { "source": "iana", "compressible": true, "extensions": ["eml","mime"] }, "message/s-http": { "source": "iana" }, "message/sip": { "source": "iana" }, "message/sipfrag": { "source": "iana" }, "message/tracking-status": { "source": "iana" }, "message/vnd.si.simp": { "source": "iana" }, "message/vnd.wfa.wsc": { "source": "iana" }, "model/iges": { "source": "iana", "compressible": false, "extensions": ["igs","iges"] }, "model/mesh": { "source": "iana", "compressible": false, "extensions": ["msh","mesh","silo"] }, "model/vnd.collada+xml": { "source": "iana", "extensions": ["dae"] }, "model/vnd.dwf": { "source": "iana", "extensions": ["dwf"] }, "model/vnd.flatland.3dml": { "source": "iana" }, "model/vnd.gdl": { "source": "iana", "extensions": ["gdl"] }, "model/vnd.gs-gdl": { "source": "apache" }, "model/vnd.gs.gdl": { "source": "iana" }, "model/vnd.gtw": { "source": "iana", "extensions": ["gtw"] }, "model/vnd.moml+xml": { "source": "iana" }, "model/vnd.mts": { "source": "iana", "extensions": ["mts"] }, "model/vnd.opengex": { "source": "iana" }, "model/vnd.parasolid.transmit.binary": { "source": "iana" }, "model/vnd.parasolid.transmit.text": { "source": "iana" }, "model/vnd.rosette.annotated-data-model": { "source": "iana" }, "model/vnd.valve.source.compiled-map": { "source": "iana" }, "model/vnd.vtu": { "source": "iana", "extensions": ["vtu"] }, "model/vrml": { "source": "iana", "compressible": false, "extensions": ["wrl","vrml"] }, "model/x3d+binary": { "source": "apache", "compressible": false, "extensions": ["x3db","x3dbz"] }, "model/x3d+fastinfoset": { "source": "iana" }, "model/x3d+vrml": { "source": "apache", "compressible": false, "extensions": ["x3dv","x3dvz"] }, "model/x3d+xml": { "source": "iana", "compressible": true, "extensions": ["x3d","x3dz"] }, "model/x3d-vrml": { "source": "iana" }, "multipart/alternative": { "source": "iana", "compressible": false }, "multipart/appledouble": { "source": "iana" }, "multipart/byteranges": { "source": "iana" }, "multipart/digest": { "source": "iana" }, "multipart/encrypted": { "source": "iana", "compressible": false }, "multipart/form-data": { "source": "iana", "compressible": false }, "multipart/header-set": { "source": "iana" }, "multipart/mixed": { "source": "iana", "compressible": false }, "multipart/parallel": { "source": "iana" }, "multipart/related": { "source": "iana", "compressible": false }, "multipart/report": { "source": "iana" }, "multipart/signed": { "source": "iana", "compressible": false }, "multipart/voice-message": { "source": "iana" }, "multipart/x-mixed-replace": { "source": "iana" }, "text/1d-interleaved-parityfec": { "source": "iana" }, "text/cache-manifest": { "source": "iana", "compressible": true, "extensions": ["appcache","manifest"] }, "text/calendar": { "source": "iana", "extensions": ["ics","ifb"] }, "text/calender": { "compressible": true }, "text/cmd": { "compressible": true }, "text/coffeescript": { "extensions": ["coffee","litcoffee"] }, "text/css": { "source": "iana", "compressible": true, "extensions": ["css"] }, "text/csv": { "source": "iana", "compressible": true, "extensions": ["csv"] }, "text/csv-schema": { "source": "iana" }, "text/directory": { "source": "iana" }, "text/dns": { "source": "iana" }, "text/ecmascript": { "source": "iana" }, "text/encaprtp": { "source": "iana" }, "text/enriched": { "source": "iana" }, "text/fwdred": { "source": "iana" }, "text/grammar-ref-list": { "source": "iana" }, "text/hjson": { "extensions": ["hjson"] }, "text/html": { "source": "iana", "compressible": true, "extensions": ["html","htm","shtml"] }, "text/jade": { "extensions": ["jade"] }, "text/javascript": { "source": "iana", "compressible": true }, "text/jcr-cnd": { "source": "iana" }, "text/jsx": { "compressible": true, "extensions": ["jsx"] }, "text/less": { "extensions": ["less"] }, "text/markdown": { "source": "iana" }, "text/mathml": { "source": "nginx", "extensions": ["mml"] }, "text/mizar": { "source": "iana" }, "text/n3": { "source": "iana", "compressible": true, "extensions": ["n3"] }, "text/parameters": { "source": "iana" }, "text/parityfec": { "source": "iana" }, "text/plain": { "source": "iana", "compressible": true, "extensions": ["txt","text","conf","def","list","log","in","ini"] }, "text/provenance-notation": { "source": "iana" }, "text/prs.fallenstein.rst": { "source": "iana" }, "text/prs.lines.tag": { "source": "iana", "extensions": ["dsc"] }, "text/raptorfec": { "source": "iana" }, "text/red": { "source": "iana" }, "text/rfc822-headers": { "source": "iana" }, "text/richtext": { "source": "iana", "compressible": true, "extensions": ["rtx"] }, "text/rtf": { "source": "iana", "compressible": true, "extensions": ["rtf"] }, "text/rtp-enc-aescm128": { "source": "iana" }, "text/rtploopback": { "source": "iana" }, "text/rtx": { "source": "iana" }, "text/sgml": { "source": "iana", "extensions": ["sgml","sgm"] }, "text/slim": { "extensions": ["slim","slm"] }, "text/stylus": { "extensions": ["stylus","styl"] }, "text/t140": { "source": "iana" }, "text/tab-separated-values": { "source": "iana", "compressible": true, "extensions": ["tsv"] }, "text/troff": { "source": "iana", "extensions": ["t","tr","roff","man","me","ms"] }, "text/turtle": { "source": "iana", "extensions": ["ttl"] }, "text/ulpfec": { "source": "iana" }, "text/uri-list": { "source": "iana", "compressible": true, "extensions": ["uri","uris","urls"] }, "text/vcard": { "source": "iana", "compressible": true, "extensions": ["vcard"] }, "text/vnd.a": { "source": "iana" }, "text/vnd.abc": { "source": "iana" }, "text/vnd.curl": { "source": "iana", "extensions": ["curl"] }, "text/vnd.curl.dcurl": { "source": "apache", "extensions": ["dcurl"] }, "text/vnd.curl.mcurl": { "source": "apache", "extensions": ["mcurl"] }, "text/vnd.curl.scurl": { "source": "apache", "extensions": ["scurl"] }, "text/vnd.debian.copyright": { "source": "iana" }, "text/vnd.dmclientscript": { "source": "iana" }, "text/vnd.dvb.subtitle": { "source": "iana", "extensions": ["sub"] }, "text/vnd.esmertec.theme-descriptor": { "source": "iana" }, "text/vnd.fly": { "source": "iana", "extensions": ["fly"] }, "text/vnd.fmi.flexstor": { "source": "iana", "extensions": ["flx"] }, "text/vnd.graphviz": { "source": "iana", "extensions": ["gv"] }, "text/vnd.in3d.3dml": { "source": "iana", "extensions": ["3dml"] }, "text/vnd.in3d.spot": { "source": "iana", "extensions": ["spot"] }, "text/vnd.iptc.newsml": { "source": "iana" }, "text/vnd.iptc.nitf": { "source": "iana" }, "text/vnd.latex-z": { "source": "iana" }, "text/vnd.motorola.reflex": { "source": "iana" }, "text/vnd.ms-mediapackage": { "source": "iana" }, "text/vnd.net2phone.commcenter.command": { "source": "iana" }, "text/vnd.radisys.msml-basic-layout": { "source": "iana" }, "text/vnd.si.uricatalogue": { "source": "iana" }, "text/vnd.sun.j2me.app-descriptor": { "source": "iana", "extensions": ["jad"] }, "text/vnd.trolltech.linguist": { "source": "iana" }, "text/vnd.wap.si": { "source": "iana" }, "text/vnd.wap.sl": { "source": "iana" }, "text/vnd.wap.wml": { "source": "iana", "extensions": ["wml"] }, "text/vnd.wap.wmlscript": { "source": "iana", "extensions": ["wmls"] }, "text/vtt": { "charset": "UTF-8", "compressible": true, "extensions": ["vtt"] }, "text/x-asm": { "source": "apache", "extensions": ["s","asm"] }, "text/x-c": { "source": "apache", "extensions": ["c","cc","cxx","cpp","h","hh","dic"] }, "text/x-component": { "source": "nginx", "extensions": ["htc"] }, "text/x-fortran": { "source": "apache", "extensions": ["f","for","f77","f90"] }, "text/x-gwt-rpc": { "compressible": true }, "text/x-handlebars-template": { "extensions": ["hbs"] }, "text/x-java-source": { "source": "apache", "extensions": ["java"] }, "text/x-jquery-tmpl": { "compressible": true }, "text/x-lua": { "extensions": ["lua"] }, "text/x-markdown": { "compressible": true, "extensions": ["markdown","md","mkd"] }, "text/x-nfo": { "source": "apache", "extensions": ["nfo"] }, "text/x-opml": { "source": "apache", "extensions": ["opml"] }, "text/x-pascal": { "source": "apache", "extensions": ["p","pas"] }, "text/x-processing": { "compressible": true, "extensions": ["pde"] }, "text/x-sass": { "extensions": ["sass"] }, "text/x-scss": { "extensions": ["scss"] }, "text/x-setext": { "source": "apache", "extensions": ["etx"] }, "text/x-sfv": { "source": "apache", "extensions": ["sfv"] }, "text/x-suse-ymp": { "compressible": true, "extensions": ["ymp"] }, "text/x-uuencode": { "source": "apache", "extensions": ["uu"] }, "text/x-vcalendar": { "source": "apache", "extensions": ["vcs"] }, "text/x-vcard": { "source": "apache", "extensions": ["vcf"] }, "text/xml": { "source": "iana", "compressible": true, "extensions": ["xml"] }, "text/xml-external-parsed-entity": { "source": "iana" }, "text/yaml": { "extensions": ["yaml","yml"] }, "video/1d-interleaved-parityfec": { "source": "apache" }, "video/3gpp": { "source": "apache", "extensions": ["3gp","3gpp"] }, "video/3gpp-tt": { "source": "apache" }, "video/3gpp2": { "source": "apache", "extensions": ["3g2"] }, "video/bmpeg": { "source": "apache" }, "video/bt656": { "source": "apache" }, "video/celb": { "source": "apache" }, "video/dv": { "source": "apache" }, "video/h261": { "source": "apache", "extensions": ["h261"] }, "video/h263": { "source": "apache", "extensions": ["h263"] }, "video/h263-1998": { "source": "apache" }, "video/h263-2000": { "source": "apache" }, "video/h264": { "source": "apache", "extensions": ["h264"] }, "video/h264-rcdo": { "source": "apache" }, "video/h264-svc": { "source": "apache" }, "video/jpeg": { "source": "apache", "extensions": ["jpgv"] }, "video/jpeg2000": { "source": "apache" }, "video/jpm": { "source": "apache", "extensions": ["jpm","jpgm"] }, "video/mj2": { "source": "apache", "extensions": ["mj2","mjp2"] }, "video/mp1s": { "source": "apache" }, "video/mp2p": { "source": "apache" }, "video/mp2t": { "source": "apache", "extensions": ["ts"] }, "video/mp4": { "source": "apache", "compressible": false, "extensions": ["mp4","mp4v","mpg4"] }, "video/mp4v-es": { "source": "apache" }, "video/mpeg": { "source": "apache", "compressible": false, "extensions": ["mpeg","mpg","mpe","m1v","m2v"] }, "video/mpeg4-generic": { "source": "apache" }, "video/mpv": { "source": "apache" }, "video/nv": { "source": "apache" }, "video/ogg": { "source": "apache", "compressible": false, "extensions": ["ogv"] }, "video/parityfec": { "source": "apache" }, "video/pointer": { "source": "apache" }, "video/quicktime": { "source": "apache", "compressible": false, "extensions": ["qt","mov"] }, "video/raw": { "source": "apache" }, "video/rtp-enc-aescm128": { "source": "apache" }, "video/rtx": { "source": "apache" }, "video/smpte292m": { "source": "apache" }, "video/ulpfec": { "source": "apache" }, "video/vc1": { "source": "apache" }, "video/vnd.cctv": { "source": "apache" }, "video/vnd.dece.hd": { "source": "apache", "extensions": ["uvh","uvvh"] }, "video/vnd.dece.mobile": { "source": "apache", "extensions": ["uvm","uvvm"] }, "video/vnd.dece.mp4": { "source": "apache" }, "video/vnd.dece.pd": { "source": "apache", "extensions": ["uvp","uvvp"] }, "video/vnd.dece.sd": { "source": "apache", "extensions": ["uvs","uvvs"] }, "video/vnd.dece.video": { "source": "apache", "extensions": ["uvv","uvvv"] }, "video/vnd.directv.mpeg": { "source": "apache" }, "video/vnd.directv.mpeg-tts": { "source": "apache" }, "video/vnd.dlna.mpeg-tts": { "source": "apache" }, "video/vnd.dvb.file": { "source": "apache", "extensions": ["dvb"] }, "video/vnd.fvt": { "source": "apache", "extensions": ["fvt"] }, "video/vnd.hns.video": { "source": "apache" }, "video/vnd.iptvforum.1dparityfec-1010": { "source": "apache" }, "video/vnd.iptvforum.1dparityfec-2005": { "source": "apache" }, "video/vnd.iptvforum.2dparityfec-1010": { "source": "apache" }, "video/vnd.iptvforum.2dparityfec-2005": { "source": "apache" }, "video/vnd.iptvforum.ttsavc": { "source": "apache" }, "video/vnd.iptvforum.ttsmpeg2": { "source": "apache" }, "video/vnd.motorola.video": { "source": "apache" }, "video/vnd.motorola.videop": { "source": "apache" }, "video/vnd.mpegurl": { "source": "apache", "extensions": ["mxu","m4u"] }, "video/vnd.ms-playready.media.pyv": { "source": "apache", "extensions": ["pyv"] }, "video/vnd.nokia.interleaved-multimedia": { "source": "apache" }, "video/vnd.nokia.videovoip": { "source": "apache" }, "video/vnd.objectvideo": { "source": "apache" }, "video/vnd.sealed.mpeg1": { "source": "apache" }, "video/vnd.sealed.mpeg4": { "source": "apache" }, "video/vnd.sealed.swf": { "source": "apache" }, "video/vnd.sealedmedia.softseal.mov": { "source": "apache" }, "video/vnd.uvvu.mp4": { "source": "apache", "extensions": ["uvu","uvvu"] }, "video/vnd.vivo": { "source": "apache", "extensions": ["viv"] }, "video/webm": { "source": "apache", "compressible": false, "extensions": ["webm"] }, "video/x-f4v": { "source": "apache", "extensions": ["f4v"] }, "video/x-fli": { "source": "apache", "extensions": ["fli"] }, "video/x-flv": { "source": "apache", "compressible": false, "extensions": ["flv"] }, "video/x-m4v": { "source": "apache", "extensions": ["m4v"] }, "video/x-matroska": { "source": "apache", "compressible": false, "extensions": ["mkv","mk3d","mks"] }, "video/x-mng": { "source": "apache", "extensions": ["mng"] }, "video/x-ms-asf": { "source": "apache", "extensions": ["asf","asx"] }, "video/x-ms-vob": { "source": "apache", "extensions": ["vob"] }, "video/x-ms-wm": { "source": "apache", "extensions": ["wm"] }, "video/x-ms-wmv": { "source": "apache", "compressible": false, "extensions": ["wmv"] }, "video/x-ms-wmx": { "source": "apache", "extensions": ["wmx"] }, "video/x-ms-wvx": { "source": "apache", "extensions": ["wvx"] }, "video/x-msvideo": { "source": "apache", "extensions": ["avi"] }, "video/x-sgi-movie": { "source": "apache", "extensions": ["movie"] }, "video/x-smv": { "source": "apache", "extensions": ["smv"] }, "x-conference/x-cooltalk": { "source": "apache", "extensions": ["ice"] }, "x-shader/x-fragment": { "compressible": true }, "x-shader/x-vertex": { "compressible": true } } },{}],244:[function(require,module,exports){ /*! * mime-db * Copyright(c) 2014 Jonathan Ong * MIT Licensed */ /** * Module exports. */ module.exports = require('./db.json') },{"./db.json":243}],245:[function(require,module,exports){ /*! * mime-types * Copyright(c) 2014 Jonathan Ong * Copyright(c) 2015 Douglas Christopher Wilson * MIT Licensed */ 'use strict' /** * Module dependencies. * @private */ var db = require('mime-db') var extname = require('path').extname /** * Module variables. * @private */ var extractTypeRegExp = /^\s*([^;\s]*)(?:;|\s|$)/ var textTypeRegExp = /^text\//i /** * Module exports. * @public */ exports.charset = charset exports.charsets = { lookup: charset } exports.contentType = contentType exports.extension = extension exports.extensions = Object.create(null) exports.lookup = lookup exports.types = Object.create(null) // Populate the extensions/types maps populateMaps(exports.extensions, exports.types) /** * Get the default charset for a MIME type. * * @param {string} type * @return {boolean|string} */ function charset(type) { if (!type || typeof type !== 'string') { return false } // TODO: use media-typer var match = extractTypeRegExp.exec(type) var mime = match && db[match[1].toLowerCase()] if (mime && mime.charset) { return mime.charset } // default text/* to utf-8 if (match && textTypeRegExp.test(match[1])) { return 'UTF-8' } return false } /** * Create a full Content-Type header given a MIME type or extension. * * @param {string} str * @return {boolean|string} */ function contentType(str) { // TODO: should this even be in this module? if (!str || typeof str !== 'string') { return false } var mime = str.indexOf('/') === -1 ? exports.lookup(str) : str if (!mime) { return false } // TODO: use content-type or other module if (mime.indexOf('charset') === -1) { var charset = exports.charset(mime) if (charset) mime += '; charset=' + charset.toLowerCase() } return mime } /** * Get the default extension for a MIME type. * * @param {string} type * @return {boolean|string} */ function extension(type) { if (!type || typeof type !== 'string') { return false } // TODO: use media-typer var match = extractTypeRegExp.exec(type) // get extensions var exts = match && exports.extensions[match[1].toLowerCase()] if (!exts || !exts.length) { return false } return exts[0] } /** * Lookup the MIME type for a file path/extension. * * @param {string} path * @return {boolean|string} */ function lookup(path) { if (!path || typeof path !== 'string') { return false } // get the extension ("ext" or ".ext" or full path) var extension = extname('x.' + path) .toLowerCase() .substr(1) if (!extension) { return false } return exports.types[extension] || false } /** * Populate the extensions and types maps. * @private */ function populateMaps(extensions, types) { // source preference (least -> most) var preference = ['nginx', 'apache', undefined, 'iana'] Object.keys(db).forEach(function forEachMimeType(type) { var mime = db[type] var exts = mime.extensions if (!exts || !exts.length) { return } // mime -> extensions extensions[type] = exts // extension -> mime for (var i = 0; i < exts.length; i++) { var extension = exts[i] if (types[extension]) { var from = preference.indexOf(db[types[extension]].source) var to = preference.indexOf(mime.source) if (types[extension] !== 'application/octet-stream' && from > to || (from === to && types[extension].substr(0, 12) === 'application/')) { // skip the remapping continue } } // set the extension -> mime types[extension] = type } }) } },{"mime-db":244,"path":290}],246:[function(require,module,exports){ module.exports = assert; function assert(val, msg) { if (!val) throw new Error(msg || 'Assertion failed'); } assert.equal = function assertEqual(l, r, msg) { if (l != r) throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r)); }; },{}],247:[function(require,module,exports){ module.exports = minimatch minimatch.Minimatch = Minimatch var path = { sep: '/' } try { path = require('path') } catch (er) {} var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} var expand = require('brace-expansion') // any single thing other than / // don't need to escape / when using new RegExp() var qmark = '[^/]' // * => any number of characters var star = qmark + '*?' // ** when dots are allowed. Anything goes, except .. and . // not (^ or / followed by one or two dots followed by $ or /), // followed by anything, any number of times. var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' // not a ^ or / followed by a dot, // followed by anything, any number of times. var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' // characters that need to be escaped in RegExp. var reSpecials = charSet('().*{}+?[]^$\\!') // "abc" -> { a:true, b:true, c:true } function charSet (s) { return s.split('').reduce(function (set, c) { set[c] = true return set }, {}) } // normalizes slashes. var slashSplit = /\/+/ minimatch.filter = filter function filter (pattern, options) { options = options || {} return function (p, i, list) { return minimatch(p, pattern, options) } } function ext (a, b) { a = a || {} b = b || {} var t = {} Object.keys(b).forEach(function (k) { t[k] = b[k] }) Object.keys(a).forEach(function (k) { t[k] = a[k] }) return t } minimatch.defaults = function (def) { if (!def || !Object.keys(def).length) return minimatch var orig = minimatch var m = function minimatch (p, pattern, options) { return orig.minimatch(p, pattern, ext(def, options)) } m.Minimatch = function Minimatch (pattern, options) { return new orig.Minimatch(pattern, ext(def, options)) } return m } Minimatch.defaults = function (def) { if (!def || !Object.keys(def).length) return Minimatch return minimatch.defaults(def).Minimatch } function minimatch (p, pattern, options) { if (typeof pattern !== 'string') { throw new TypeError('glob pattern string required') } if (!options) options = {} // shortcut: comments match nothing. if (!options.nocomment && pattern.charAt(0) === '#') { return false } // "" only matches "" if (pattern.trim() === '') return p === '' return new Minimatch(pattern, options).match(p) } function Minimatch (pattern, options) { if (!(this instanceof Minimatch)) { return new Minimatch(pattern, options) } if (typeof pattern !== 'string') { throw new TypeError('glob pattern string required') } if (!options) options = {} pattern = pattern.trim() // windows support: need to use /, not \ if (path.sep !== '/') { pattern = pattern.split(path.sep).join('/') } this.options = options this.set = [] this.pattern = pattern this.regexp = null this.negate = false this.comment = false this.empty = false // make the set of regexps etc. this.make() } Minimatch.prototype.debug = function () {} Minimatch.prototype.make = make function make () { // don't do it more than once. if (this._made) return var pattern = this.pattern var options = this.options // empty patterns and comments match nothing. if (!options.nocomment && pattern.charAt(0) === '#') { this.comment = true return } if (!pattern) { this.empty = true return } // step 1: figure out negation, etc. this.parseNegate() // step 2: expand braces var set = this.globSet = this.braceExpand() if (options.debug) this.debug = console.error this.debug(this.pattern, set) // step 3: now we have a set, so turn each one into a series of path-portion // matching patterns. // These will be regexps, except in the case of "**", which is // set to the GLOBSTAR object for globstar behavior, // and will not contain any / characters set = this.globParts = set.map(function (s) { return s.split(slashSplit) }) this.debug(this.pattern, set) // glob --> regexps set = set.map(function (s, si, set) { return s.map(this.parse, this) }, this) this.debug(this.pattern, set) // filter out everything that didn't compile properly. set = set.filter(function (s) { return s.indexOf(false) === -1 }) this.debug(this.pattern, set) this.set = set } Minimatch.prototype.parseNegate = parseNegate function parseNegate () { var pattern = this.pattern var negate = false var options = this.options var negateOffset = 0 if (options.nonegate) return for (var i = 0, l = pattern.length ; i < l && pattern.charAt(i) === '!' ; i++) { negate = !negate negateOffset++ } if (negateOffset) this.pattern = pattern.substr(negateOffset) this.negate = negate } // Brace expansion: // a{b,c}d -> abd acd // a{b,}c -> abc ac // a{0..3}d -> a0d a1d a2d a3d // a{b,c{d,e}f}g -> abg acdfg acefg // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg // // Invalid sets are not expanded. // a{2..}b -> a{2..}b // a{b}c -> a{b}c minimatch.braceExpand = function (pattern, options) { return braceExpand(pattern, options) } Minimatch.prototype.braceExpand = braceExpand function braceExpand (pattern, options) { if (!options) { if (this instanceof Minimatch) { options = this.options } else { options = {} } } pattern = typeof pattern === 'undefined' ? this.pattern : pattern if (typeof pattern === 'undefined') { throw new Error('undefined pattern') } if (options.nobrace || !pattern.match(/\{.*\}/)) { // shortcut. no need to expand. return [pattern] } return expand(pattern) } // parse a component of the expanded set. // At this point, no pattern may contain "/" in it // so we're going to return a 2d array, where each entry is the full // pattern, split on '/', and then turned into a regular expression. // A regexp is made at the end which joins each array with an // escaped /, and another full one which joins each regexp with |. // // Following the lead of Bash 4.1, note that "**" only has special meaning // when it is the *only* thing in a path portion. Otherwise, any series // of * is equivalent to a single *. Globstar behavior is enabled by // default, and can be disabled by setting options.noglobstar. Minimatch.prototype.parse = parse var SUBPARSE = {} function parse (pattern, isSub) { var options = this.options // shortcuts if (!options.noglobstar && pattern === '**') return GLOBSTAR if (pattern === '') return '' var re = '' var hasMagic = !!options.nocase var escaping = false // ? => one single character var patternListStack = [] var negativeLists = [] var plType var stateChar var inClass = false var reClassStart = -1 var classStart = -1 // . and .. never match anything that doesn't start with ., // even when options.dot is set. var patternStart = pattern.charAt(0) === '.' ? '' // anything // not (start or / followed by . or .. followed by / or end) : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' : '(?!\\.)' var self = this function clearStateChar () { if (stateChar) { // we had some state-tracking character // that wasn't consumed by this pass. switch (stateChar) { case '*': re += star hasMagic = true break case '?': re += qmark hasMagic = true break default: re += '\\' + stateChar break } self.debug('clearStateChar %j %j', stateChar, re) stateChar = false } } for (var i = 0, len = pattern.length, c ; (i < len) && (c = pattern.charAt(i)) ; i++) { this.debug('%s\t%s %s %j', pattern, i, re, c) // skip over any that are escaped. if (escaping && reSpecials[c]) { re += '\\' + c escaping = false continue } switch (c) { case '/': // completely not allowed, even escaped. // Should already be path-split by now. return false case '\\': clearStateChar() escaping = true continue // the various stateChar values // for the "extglob" stuff. case '?': case '*': case '+': case '@': case '!': this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) // all of those are literals inside a class, except that // the glob [!a] means [^a] in regexp if (inClass) { this.debug(' in class') if (c === '!' && i === classStart + 1) c = '^' re += c continue } // if we already have a stateChar, then it means // that there was something like ** or +? in there. // Handle the stateChar, then proceed with this one. self.debug('call clearStateChar %j', stateChar) clearStateChar() stateChar = c // if extglob is disabled, then +(asdf|foo) isn't a thing. // just clear the statechar *now*, rather than even diving into // the patternList stuff. if (options.noext) clearStateChar() continue case '(': if (inClass) { re += '(' continue } if (!stateChar) { re += '\\(' continue } plType = stateChar patternListStack.push({ type: plType, start: i - 1, reStart: re.length }) // negation is (?:(?!js)[^/]*) re += stateChar === '!' ? '(?:(?!(?:' : '(?:' this.debug('plType %j %j', stateChar, re) stateChar = false continue case ')': if (inClass || !patternListStack.length) { re += '\\)' continue } clearStateChar() hasMagic = true re += ')' var pl = patternListStack.pop() plType = pl.type // negation is (?:(?!js)[^/]*) // The others are (?:) switch (plType) { case '!': negativeLists.push(pl) re += ')[^/]*?)' pl.reEnd = re.length break case '?': case '+': case '*': re += plType break case '@': break // the default anyway } continue case '|': if (inClass || !patternListStack.length || escaping) { re += '\\|' escaping = false continue } clearStateChar() re += '|' continue // these are mostly the same in regexp and glob case '[': // swallow any state-tracking char before the [ clearStateChar() if (inClass) { re += '\\' + c continue } inClass = true classStart = i reClassStart = re.length re += c continue case ']': // a right bracket shall lose its special // meaning and represent itself in // a bracket expression if it occurs // first in the list. -- POSIX.2 2.8.3.2 if (i === classStart + 1 || !inClass) { re += '\\' + c escaping = false continue } // handle the case where we left a class open. // "[z-a]" is valid, equivalent to "\[z-a\]" if (inClass) { // split where the last [ was, make sure we don't have // an invalid re. if so, re-walk the contents of the // would-be class to re-translate any characters that // were passed through as-is // TODO: It would probably be faster to determine this // without a try/catch and a new RegExp, but it's tricky // to do safely. For now, this is safe and works. var cs = pattern.substring(classStart + 1, i) try { RegExp('[' + cs + ']') } catch (er) { // not a valid class! var sp = this.parse(cs, SUBPARSE) re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' hasMagic = hasMagic || sp[1] inClass = false continue } } // finish up the class. hasMagic = true inClass = false re += c continue default: // swallow any state char that wasn't consumed clearStateChar() if (escaping) { // no need escaping = false } else if (reSpecials[c] && !(c === '^' && inClass)) { re += '\\' } re += c } // switch } // for // handle the case where we left a class open. // "[abc" is valid, equivalent to "\[abc" if (inClass) { // split where the last [ was, and escape it // this is a huge pita. We now have to re-walk // the contents of the would-be class to re-translate // any characters that were passed through as-is cs = pattern.substr(classStart + 1) sp = this.parse(cs, SUBPARSE) re = re.substr(0, reClassStart) + '\\[' + sp[0] hasMagic = hasMagic || sp[1] } // handle the case where we had a +( thing at the *end* // of the pattern. // each pattern list stack adds 3 chars, and we need to go through // and escape any | chars that were passed through as-is for the regexp. // Go through and escape them, taking care not to double-escape any // | chars that were already escaped. for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { var tail = re.slice(pl.reStart + 3) // maybe some even number of \, then maybe 1 \, followed by a | tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { if (!$2) { // the | isn't already escaped, so escape it. $2 = '\\' } // need to escape all those slashes *again*, without escaping the // one that we need for escaping the | character. As it works out, // escaping an even number of slashes can be done by simply repeating // it exactly after itself. That's why this trick works. // // I am sorry that you have to see this. return $1 + $1 + $2 + '|' }) this.debug('tail=%j\n %s', tail, tail) var t = pl.type === '*' ? star : pl.type === '?' ? qmark : '\\' + pl.type hasMagic = true re = re.slice(0, pl.reStart) + t + '\\(' + tail } // handle trailing things that only matter at the very end. clearStateChar() if (escaping) { // trailing \\ re += '\\\\' } // only need to apply the nodot start if the re starts with // something that could conceivably capture a dot var addPatternStart = false switch (re.charAt(0)) { case '.': case '[': case '(': addPatternStart = true } // Hack to work around lack of negative lookbehind in JS // A pattern like: *.!(x).!(y|z) needs to ensure that a name // like 'a.xyz.yz' doesn't match. So, the first negative // lookahead, has to look ALL the way ahead, to the end of // the pattern. for (var n = negativeLists.length - 1; n > -1; n--) { var nl = negativeLists[n] var nlBefore = re.slice(0, nl.reStart) var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) var nlAfter = re.slice(nl.reEnd) nlLast += nlAfter // Handle nested stuff like *(*.js|!(*.json)), where open parens // mean that we should *not* include the ) in the bit that is considered // "after" the negated section. var openParensBefore = nlBefore.split('(').length - 1 var cleanAfter = nlAfter for (i = 0; i < openParensBefore; i++) { cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') } nlAfter = cleanAfter var dollar = '' if (nlAfter === '' && isSub !== SUBPARSE) { dollar = '$' } var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast re = newRe } // if the re is not "" at this point, then we need to make sure // it doesn't match against an empty path part. // Otherwise a/* will match a/, which it should not. if (re !== '' && hasMagic) { re = '(?=.)' + re } if (addPatternStart) { re = patternStart + re } // parsing just a piece of a larger pattern. if (isSub === SUBPARSE) { return [re, hasMagic] } // skip the regexp for non-magical patterns // unescape anything in it, though, so that it'll be // an exact match against a file etc. if (!hasMagic) { return globUnescape(pattern) } var flags = options.nocase ? 'i' : '' var regExp = new RegExp('^' + re + '$', flags) regExp._glob = pattern regExp._src = re return regExp } minimatch.makeRe = function (pattern, options) { return new Minimatch(pattern, options || {}).makeRe() } Minimatch.prototype.makeRe = makeRe function makeRe () { if (this.regexp || this.regexp === false) return this.regexp // at this point, this.set is a 2d array of partial // pattern strings, or "**". // // It's better to use .match(). This function shouldn't // be used, really, but it's pretty convenient sometimes, // when you just want to work with a regex. var set = this.set if (!set.length) { this.regexp = false return this.regexp } var options = this.options var twoStar = options.noglobstar ? star : options.dot ? twoStarDot : twoStarNoDot var flags = options.nocase ? 'i' : '' var re = set.map(function (pattern) { return pattern.map(function (p) { return (p === GLOBSTAR) ? twoStar : (typeof p === 'string') ? regExpEscape(p) : p._src }).join('\\\/') }).join('|') // must match entire pattern // ending in a * or ** will make it less strict. re = '^(?:' + re + ')$' // can match anything, as long as it's not this. if (this.negate) re = '^(?!' + re + ').*$' try { this.regexp = new RegExp(re, flags) } catch (ex) { this.regexp = false } return this.regexp } minimatch.match = function (list, pattern, options) { options = options || {} var mm = new Minimatch(pattern, options) list = list.filter(function (f) { return mm.match(f) }) if (mm.options.nonull && !list.length) { list.push(pattern) } return list } Minimatch.prototype.match = match function match (f, partial) { this.debug('match', f, this.pattern) // short-circuit in the case of busted things. // comments, etc. if (this.comment) return false if (this.empty) return f === '' if (f === '/' && partial) return true var options = this.options // windows: need to use /, not \ if (path.sep !== '/') { f = f.split(path.sep).join('/') } // treat the test path as a set of pathparts. f = f.split(slashSplit) this.debug(this.pattern, 'split', f) // just ONE of the pattern sets in this.set needs to match // in order for it to be valid. If negating, then just one // match means that we have failed. // Either way, return on the first hit. var set = this.set this.debug(this.pattern, 'set', set) // Find the basename of the path by looking for the last non-empty segment var filename var i for (i = f.length - 1; i >= 0; i--) { filename = f[i] if (filename) break } for (i = 0; i < set.length; i++) { var pattern = set[i] var file = f if (options.matchBase && pattern.length === 1) { file = [filename] } var hit = this.matchOne(file, pattern, partial) if (hit) { if (options.flipNegate) return true return !this.negate } } // didn't get any hits. this is success if it's a negative // pattern, failure otherwise. if (options.flipNegate) return false return this.negate } // set partial to true to test if, for example, // "/a/b" matches the start of "/*/b/*/d" // Partial means, if you run out of file before you run // out of pattern, then that's fine, as long as all // the parts match. Minimatch.prototype.matchOne = function (file, pattern, partial) { var options = this.options this.debug('matchOne', { 'this': this, file: file, pattern: pattern }) this.debug('matchOne', file.length, pattern.length) for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length ; (fi < fl) && (pi < pl) ; fi++, pi++) { this.debug('matchOne loop') var p = pattern[pi] var f = file[fi] this.debug(pattern, p, f) // should be impossible. // some invalid regexp stuff in the set. if (p === false) return false if (p === GLOBSTAR) { this.debug('GLOBSTAR', [pattern, p, f]) // "**" // a/**/b/**/c would match the following: // a/b/x/y/z/c // a/x/y/z/b/c // a/b/x/b/x/c // a/b/c // To do this, take the rest of the pattern after // the **, and see if it would match the file remainder. // If so, return success. // If not, the ** "swallows" a segment, and try again. // This is recursively awful. // // a/**/b/**/c matching a/b/x/y/z/c // - a matches a // - doublestar // - matchOne(b/x/y/z/c, b/**/c) // - b matches b // - doublestar // - matchOne(x/y/z/c, c) -> no // - matchOne(y/z/c, c) -> no // - matchOne(z/c, c) -> no // - matchOne(c, c) yes, hit var fr = fi var pr = pi + 1 if (pr === pl) { this.debug('** at the end') // a ** at the end will just swallow the rest. // We have found a match. // however, it will not swallow /.x, unless // options.dot is set. // . and .. are *never* matched by **, for explosively // exponential reasons. for (; fi < fl; fi++) { if (file[fi] === '.' || file[fi] === '..' || (!options.dot && file[fi].charAt(0) === '.')) return false } return true } // ok, let's see if we can swallow whatever we can. while (fr < fl) { var swallowee = file[fr] this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) // XXX remove this slice. Just pass the start index. if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { this.debug('globstar found match!', fr, fl, swallowee) // found a match. return true } else { // can't swallow "." or ".." ever. // can only swallow ".foo" when explicitly asked. if (swallowee === '.' || swallowee === '..' || (!options.dot && swallowee.charAt(0) === '.')) { this.debug('dot detected!', file, fr, pattern, pr) break } // ** swallows a segment, and continue. this.debug('globstar swallow a segment, and continue') fr++ } } // no match was found. // However, in partial mode, we can't say this is necessarily over. // If there's more *pattern* left, then if (partial) { // ran out of file this.debug('\n>>> no match, partial?', file, fr, pattern, pr) if (fr === fl) return true } return false } // something other than ** // non-magic patterns just have to match exactly // patterns with magic have been turned into regexps. var hit if (typeof p === 'string') { if (options.nocase) { hit = f.toLowerCase() === p.toLowerCase() } else { hit = f === p } this.debug('string match', p, f, hit) } else { hit = f.match(p) this.debug('pattern match', p, f, hit) } if (!hit) return false } // Note: ending in / means that we'll get a final "" // at the end of the pattern. This can only match a // corresponding "" at the end of the file. // If the file ends in /, then it can only match a // a pattern that ends in /, unless the pattern just // doesn't have any more for it. But, a/b/ should *not* // match "a/b/*", even though "" matches against the // [^/]*? pattern, except in partial mode, where it might // simply not be reached yet. // However, a/b/ should still satisfy a/* // now either we fell off the end of the pattern, or we're done. if (fi === fl && pi === pl) { // ran out of pattern and filename at the same time. // an exact hit! return true } else if (fi === fl) { // ran out of file, but still had pattern left. // this is ok if we're doing the match as part of // a glob fs traversal. return partial } else if (pi === pl) { // ran out of pattern, still have file left. // this is only acceptable if we're on the very last // empty segment of a file with a trailing slash. // a/* should match a/b/ var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') return emptyFileEnd } // should be unreachable. throw new Error('wtf?') } // replace stuff like \* with * function globUnescape (s) { return s.replace(/\\(.)/g, '$1') } function regExpEscape (s) { return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') } },{"brace-expansion":30,"path":290}],248:[function(require,module,exports){ (function (process){ var path = require('path'); var fs = require('fs'); var _0777 = parseInt('0777', 8); module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; function mkdirP (p, opts, f, made) { if (typeof opts === 'function') { f = opts; opts = {}; } else if (!opts || typeof opts !== 'object') { opts = { mode: opts }; } var mode = opts.mode; var xfs = opts.fs || fs; if (mode === undefined) { mode = _0777 & (~process.umask()); } if (!made) made = null; var cb = f || function () {}; p = path.resolve(p); xfs.mkdir(p, mode, function (er) { if (!er) { made = made || p; return cb(null, made); } switch (er.code) { case 'ENOENT': mkdirP(path.dirname(p), opts, function (er, made) { if (er) cb(er, made); else mkdirP(p, opts, cb, made); }); break; // In the case of any other error, just see if there's a dir // there already. If so, then hooray! If not, then something // is borked. default: xfs.stat(p, function (er2, stat) { // if the stat fails, then that's super weird. // let the original error be the failure reason. if (er2 || !stat.isDirectory()) cb(er, made) else cb(null, made); }); break; } }); } mkdirP.sync = function sync (p, opts, made) { if (!opts || typeof opts !== 'object') { opts = { mode: opts }; } var mode = opts.mode; var xfs = opts.fs || fs; if (mode === undefined) { mode = _0777 & (~process.umask()); } if (!made) made = null; p = path.resolve(p); try { xfs.mkdirSync(p, mode); made = made || p; } catch (err0) { switch (err0.code) { case 'ENOENT' : made = sync(path.dirname(p), opts, made); sync(p, opts, made); break; // In the case of any other error, just see if there's a dir // there already. If so, then hooray! If not, then something // is borked. default: var stat; try { stat = xfs.statSync(p); } catch (err1) { throw err0; } if (!stat.isDirectory()) throw err0; break; } } return made; }; }).call(this,require('_process')) },{"_process":295,"fs":58,"path":290}],249:[function(require,module,exports){ // If `Date.now()` is invoked twice quickly, it's possible to get two // identical time stamps. To avoid generation duplications, subsequent // calls are manually ordered to force uniqueness. var _last = 0 var _count = 1 var adjusted = 0 var _adjusted = 0 module.exports = function timestamp() { /** Returns NOT an accurate representation of the current time. Since js only measures time as ms, if you call `Date.now()` twice quickly, it's possible to get two identical time stamps. This function guarantees unique but maybe inaccurate results on each call. **/ //uncomment this wen var time = Date.now() //time = ~~ (time / 1000) //^^^uncomment when testing... /** If time returned is same as in last call, adjust it by adding a number based on the counter. Counter is incremented so that next call get's adjusted properly. Because floats have restricted precision, may need to step past some values... **/ if (_last === time) { do { adjusted = time + ((_count++) / (_count + 999)) } while (adjusted === _adjusted) _adjusted = adjusted } // If last time was different reset timer back to `1`. else { _count = 1 adjusted = time } _adjusted = adjusted _last = time return adjusted } },{}],250:[function(require,module,exports){ (function (Buffer){ var cont = require('cont') var pull = require('pull-stream') var defer = require('pull-defer') var path = require('path') var explain = require('explain-error') var mkdirp = require('mkdirp') var rimraf = require('rimraf') var fs = require('fs') var glob = require('pull-glob') var paramap = require('pull-paramap') var cat = require('pull-cat') var Notify = require('pull-notify') var Write = require('pull-write-file') var Read = require('pull-file') var u = require('./util') var createHash = u.createHash function write (filename, cb) { return WriteFile(filename, cb) return toPull.sink(fs.createWriteStream(filename), cb) } function read (filename) { return ReadFile(filename) // return toPull.source(fs.createReadStream(filename)) } function toArray (h) { return Array.isArray(h) ? h : [h] } var Blobs = module.exports = function (config) { var dir if('string' === typeof config) dir = config, config = {dir: dir} var encode = config.encode || u.encode var decode = config.decode || u.decode var isHash = config.isHash || u.isHash function toPath (dir, string) { var d = decode(string) var h = d.hash.toString('hex') return path.join(dir, d.alg, h.substring(0,2), h.substring(2)) } function toHash(filename) { var parts = path.relative(dir, filename).split(path.sep) var alg = parts.shift() return encode(new Buffer(parts.join(''), 'hex'), alg) } var newBlob = Notify() config = config || {} var alg = config.hash = config.hash || config.alg || 'blake2s' dir = config.dir var n = 0 var waiting = [], tmp = false, clean = false function init (cb) { if(tmp) return cb() else waiting.push(cb) } var tmpdir = path.join(dir, 'tmp') rimraf(tmpdir, function () { mkdirp(tmpdir, function () { tmp = true; while(waiting.length) waiting.shift()() }) }) function has (hash) { return function (cb) { fs.stat(toPath(dir, hash), function (err, stat) { cb(null, !!stat) }) } } function size (hash) { return function (cb) { fs.stat(toPath(dir, hash), function (err, stat) { cb(null, stat ? stat.size : null) }) } } function createTester (test) { return function (hashes, cb) { var n = !Array.isArray(hashes) cont.para(toArray(hashes).map(test)) (function (_, ary) { // This will only error if the hash is not present, // so never callback an error. // PS. if you have a situation where you never error // add a comment like this one to explain why. if(n) cb(null, ary[0]) else cb(null, ary) }) return cb } } var listeners = [] return { get: function (opts) { if(isHash(opts)) return Read(toPath(dir, opts)) var hash = opts.key || opts.hash if(!isHash(hash)) return pull.error(new Error( 'multiblob.get: {hash} is mandatory' )) var stream = defer.source() fs.stat(toPath(dir, hash), function (err, stat) { if(opts.size != null && opts.size !== stat.size) stream.abort(new Error('incorrect file length,' + ' requested:' + opts.size + ' file was:' + stat.size + ' for file:' + hash )) else if(opts.max != null && opts.max < stat.size) stream.abort(new Error('incorrect file length,' + ' requested:' + opts.size + ' file was:' + stat.size + ' for file:' + hash )) else stream.resolve(Read(toPath(dir, hash))) }) return stream }, size: createTester(size), has: createTester(has), add: function (hash, cb) { if(!cb) cb = hash, hash = null if(!cb) cb = function (err) { if(err) explain(err, 'no callback provided') } var deferred = defer.sink() init(function () { var tmpfile = path.join(dir, 'tmp', Date.now() + '-' + n++) var hasher = createHash(alg, true) var size = 0 deferred.resolve(pull( hasher, pull.through(function (data) { size += data.length }), Write(tmpfile, function (err) { if(err) return cb(explain(err, 'could not write to tmpfile')) var _hash = encode(hasher.digest, alg) if(hash && hash !== _hash) return cb(new Error('actual hash:'+ _hash + ' did not match expected hash:'+hash), _hash) var p = toPath(dir, hash || _hash) mkdirp(path.dirname(p), function () { fs.rename(tmpfile, p, function (err) { if(err) cb(explain(err, 'could not move file')) else newBlob({id:toHash(p), size: size, ts: Date.now()}), cb(null, _hash) }) }) }) )) }) return deferred }, ls: function (opts) { opts = opts || {} var long = (opts.size || opts.long) var source = pull( glob(path.join(dir, '*', '*', '*')), long ? paramap(function (filename, cb) { fs.stat(filename, function (err, stat) { cb(err, {id: toHash(filename), size: stat.size, ts: +stat.ctime}) }) }, 32) : pull.map(toHash) ) if(!opts.live) return source return cat([ source, pull.once({sync: true}), long ? newBlob.listen() : pull(newBlob.listen(), pull.map(function (e) { return e.id })) ]) }, rm: function (hash, cb) { fs.unlink(toPath(dir, hash), cb) }, resolve: function (hash) { return toPath(dir, hash) } } } }).call(this,require("buffer").Buffer) },{"./util":258,"buffer":61,"cont":86,"explain-error":146,"fs":58,"mkdirp":248,"path":290,"pull-cat":305,"pull-defer":308,"pull-file":312,"pull-glob":321,"pull-notify":251,"pull-paramap":363,"pull-stream":252,"pull-write-file":392,"rimraf":257}],251:[function(require,module,exports){ var pushable = require('pull-pushable') module.exports = function () { var listeners = {}, n = 0 function notify (msg) { for(var k in listeners) listeners[k].push(msg) } notify.listen = function () { var k = ++n return listeners[k] = pushable(function () { delete listeners[k] }) } notify.abort = function (err) { for(var k in listeners) listeners[k].end(err) } notify.end = function () { return notify.abort(true) } return notify } },{"pull-pushable":370}],252:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":253,"./sinks":254,"./sources":255,"./throughs":256,"dup":232}],253:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],254:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],255:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],256:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":254,"./sources":255,"dup":236}],257:[function(require,module,exports){ (function (process){ module.exports = rimraf rimraf.sync = rimrafSync var assert = require("assert") var path = require("path") var fs = require("fs") // for EMFILE handling var timeout = 0 exports.EMFILE_MAX = 1000 exports.BUSYTRIES_MAX = 3 var isWindows = (process.platform === "win32") function defaults (options) { var methods = [ 'unlink', 'chmod', 'stat', 'rmdir', 'readdir' ] methods.forEach(function(m) { options[m] = options[m] || fs[m] m = m + 'Sync' options[m] = options[m] || fs[m] }) } function rimraf (p, options, cb) { if (typeof options === 'function') { cb = options options = {} } assert(p) assert(options) assert(typeof cb === 'function') defaults(options) if (!cb) throw new Error("No callback passed to rimraf()") var busyTries = 0 rimraf_(p, options, function CB (er) { if (er) { if (isWindows && (er.code === "EBUSY" || er.code === "ENOTEMPTY") && busyTries < exports.BUSYTRIES_MAX) { busyTries ++ var time = busyTries * 100 // try again, with the same exact callback as this one. return setTimeout(function () { rimraf_(p, options, CB) }, time) } // this one won't happen if graceful-fs is used. if (er.code === "EMFILE" && timeout < exports.EMFILE_MAX) { return setTimeout(function () { rimraf_(p, options, CB) }, timeout ++) } // already gone if (er.code === "ENOENT") er = null } timeout = 0 cb(er) }) } // Two possible strategies. // 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR // 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR // // Both result in an extra syscall when you guess wrong. However, there // are likely far more normal files in the world than directories. This // is based on the assumption that a the average number of files per // directory is >= 1. // // If anyone ever complains about this, then I guess the strategy could // be made configurable somehow. But until then, YAGNI. function rimraf_ (p, options, cb) { assert(p) assert(options) assert(typeof cb === 'function') options.unlink(p, function (er) { if (er) { if (er.code === "ENOENT") return cb(null) if (er.code === "EPERM") return (isWindows) ? fixWinEPERM(p, options, er, cb) : rmdir(p, options, er, cb) if (er.code === "EISDIR") return rmdir(p, options, er, cb) } return cb(er) }) } function fixWinEPERM (p, options, er, cb) { assert(p) assert(options) assert(typeof cb === 'function') if (er) assert(er instanceof Error) options.chmod(p, 666, function (er2) { if (er2) cb(er2.code === "ENOENT" ? null : er) else options.stat(p, function(er3, stats) { if (er3) cb(er3.code === "ENOENT" ? null : er) else if (stats.isDirectory()) rmdir(p, options, er, cb) else options.unlink(p, cb) }) }) } function fixWinEPERMSync (p, options, er) { assert(p) assert(options) if (er) assert(er instanceof Error) try { options.chmodSync(p, 666) } catch (er2) { if (er2.code === "ENOENT") return else throw er } try { var stats = options.statSync(p) } catch (er3) { if (er3.code === "ENOENT") return else throw er } if (stats.isDirectory()) rmdirSync(p, options, er) else options.unlinkSync(p) } function rmdir (p, options, originalEr, cb) { assert(p) assert(options) if (originalEr) assert(originalEr instanceof Error) assert(typeof cb === 'function') // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) // if we guessed wrong, and it's not a directory, then // raise the original error. options.rmdir(p, function (er) { if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) rmkids(p, options, cb) else if (er && er.code === "ENOTDIR") cb(originalEr) else cb(er) }) } function rmkids(p, options, cb) { assert(p) assert(options) assert(typeof cb === 'function') options.readdir(p, function (er, files) { if (er) return cb(er) var n = files.length if (n === 0) return options.rmdir(p, cb) var errState files.forEach(function (f) { rimraf(path.join(p, f), options, function (er) { if (errState) return if (er) return cb(errState = er) if (--n === 0) options.rmdir(p, cb) }) }) }) } // this looks simpler, and is strictly *faster*, but will // tie up the JavaScript thread and fail on excessively // deep directory trees. function rimrafSync (p, options) { options = options || {} defaults(options) assert(p) assert(options) try { options.unlinkSync(p) } catch (er) { if (er.code === "ENOENT") return if (er.code === "EPERM") return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) if (er.code !== "EISDIR") throw er rmdirSync(p, options, er) } } function rmdirSync (p, options, originalEr) { assert(p) assert(options) if (originalEr) assert(originalEr instanceof Error) try { options.rmdirSync(p) } catch (er) { if (er.code === "ENOENT") return if (er.code === "ENOTDIR") throw originalEr if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") rmkidsSync(p, options) } } function rmkidsSync (p, options) { assert(p) assert(options) options.readdirSync(p).forEach(function (f) { rimrafSync(path.join(p, f), options) }) options.rmdirSync(p, options) } }).call(this,require('_process')) },{"_process":295,"assert":15,"fs":58,"path":290}],258:[function(require,module,exports){ (function (Buffer){ var Blake2s = require('blake2s') var createHash = require('crypto').createHash var hash = require('crypto') var path = require('path') var pull = require('pull-stream') var isBuffer = Buffer.isBuffer var algs = { blake2s: function () { return new Blake2s() }, sha256: function () { return createHash('sha256') } } exports.encode = function (buf, alg) { if(!isBuffer(buf)) throw new Error('hash should be a buffer, was:'+buf) return buf.toString('base64')+'.'+alg } exports.decode = function (str) { var i = str.indexOf('.') var alg = str.substring(i+1) return {hash: new Buffer(str.substring(0, i), 'base64'), alg: alg} } exports.createHash = function (alg, noCompat) { alg = alg || 'blake2s' var hash = algs[alg]() var hasher = pull.through(function (data) { data = isBuffer(data) ? data : new Buffer(data) hasher.size += data.length hash.update(data) }, function () { return hasher.digest = noCompat === true ? hash.digest() : hash.digest('base64') + '.' + alg // hasher.digest = digest }) hasher.size = 0 return hasher } function isString (s) { return 'string' === typeof s } exports.isHash = function (data) { return isString(data) && /^[A-Za-z0-9\/+]{43}=\.(?:blake2s|sha256)$/.test(data) } }).call(this,require("buffer").Buffer) },{"blake2s":28,"buffer":61,"crypto":110,"path":290,"pull-stream":252}],259:[function(require,module,exports){ var zerr = require('zerr') var pull = require('pull-stream') module.exports = function (addedValidators) { var api = {} var validators = {} // validator control api.get = function (name) { return validators[name] } api.set = function (name, fn) { if (name && typeof name == 'object') for (var k in name) api.set(k, name[k].bind(api)) else validators[name] = fn } // set validator registry api.set({ number: function (param, n) { var asNum = +param if (isNaN(asNum) || asNum != param) return 'type' }, string: function (param, n) { var asString = ''+param if (asString != param) return 'type' }, boolean: function (param, n) { if (typeof param != 'boolean') return 'type' }, object: function (param, n) { if (typeof param != 'object' || !param) return 'type' }, array: function (param, n) { if (!Array.isArray(param)) return 'type' }, function: function (param, n) { if (typeof param != 'function') return 'type' } }) api.set(addedValidators) // rpc method wrappers api.sync = function (fn) { var spec = Array.prototype.slice.call(arguments, 1) return function () { var args = Array.prototype.slice.call(arguments) // run validation var err = validate(args, spec) if (err) throw err // run sync fn return apply(this, fn, args) } } api.sink = api.async = function (fn) { var spec = Array.prototype.slice.call(arguments, 1) return function () { var args = Array.prototype.slice.call(arguments) var hasCb = (typeof args[args.length - 1] == 'function') // get cb var cb = (hasCb) ? args[args.length - 1] : function (err) { if (err) { throw err; } } // run validation var err = validate((hasCb) ? args.slice(0,args.length-1) : args, spec) if (err) return cb(err) // run async fn return apply(this, fn, args) } } api.source = function (fn) { var spec = Array.prototype.slice.call(arguments, 1) return function () { var args = Array.prototype.slice.call(arguments) // run validation var err = validate(args, spec) if (err) return pull.error(err) // run stream fn return apply(this, fn, args) } } // run validation against a spec function validate (args, spec) { var err // multiple specs? if (Array.isArray(spec[0])) { for (var i=0; i < spec.length; i++) { err = validate(args, spec[i]) if (!err) return false // spec passed } return err // give the last error } // iterate the spec for (var i=0; i < spec.length; i++) { var types = parse(spec[i]) for (var j=0; j < types.length; j++) { var type = types[j] // falsey? if (!args[i]) { err = (type.optional) ? false : errs.MissingParam(''+i) break } // get & run validator var validator = validators[type.name] if (!validator) throw new Error('Validator not found: ' + type.name) err = validator(args[i], ''+i) // did the validator pass? break out of this type if (!err) break // error aliases if (err == 'type') err = errs.Type(''+i, type.name) } // none of the types passed? return the error if (err) return err } return false } return api } var errs = module.exports.errors = { MissingParam: zerr('Usage', 'Param % is required'), Type: zerr('Type', 'Param % must by of type %') } // parse spec token function parse (token) { return token.split('|').map(function (token) { if (token.charAt(token.length - 1) == '?') return { name: token.slice(0, token.length - 1), optional: true } return { name: token, optional: false } }) } // helper to avoid apply, for performance function apply (self, fn, args) { if (args.length == 0) return fn.call(self) if (args.length == 1) return fn.call(self, args[0]) if (args.length == 2) return fn.call(self, args[0], args[1]) if (args.length == 3) return fn.call(self, args[0], args[1], args[2]) if (args.length == 4) return fn.call(self, args[0], args[1], args[2], args[3]) return fn.apply(self, args) } },{"pull-stream":381,"zerr":643}],260:[function(require,module,exports){ 'use strict'; var EventEmitter = require('events').EventEmitter var u = require('./util') var explain = require('explain-error') function isFunction (f) { return 'function' === typeof f } function isObject (o) { return o && 'object' === typeof o } function noop (err) { if (err) throw explain(err, 'callback not provided') } module.exports = function (path, remoteApi, _remoteCall) { var emitter = new EventEmitter() function remoteCall(type, name, args) { var cb = isFunction (args[args.length - 1]) ? args.pop() : noop var value try { value = _remoteCall(type, name, args, cb) } catch(err) { return u.errorAsStreamOrCb(type, err, cb)} return value } //add all the api methods to emitter recursively ;(function recurse (obj, api, path) { for(var name in api) (function (name, type) { var _path = path ? path.concat(name) : [name] obj[name] = isObject(type) ? recurse({}, type, _path) : function () { return remoteCall(type, _path, [].slice.call(arguments)) } })(name, api[name]) return obj })(emitter, remoteApi, path) //legacy local emit, from when remote emit was supported. emitter._emit = emitter.emit return emitter } },{"./util":271,"events":144,"explain-error":146}],261:[function(require,module,exports){ 'use strict' var PSC = require('packet-stream-codec') var u = require('./util') var initStream = require('./stream') var createApi = require('./api') var createLocalCall = require('./local-api') function createMuxrpc (remoteApi, localApi, local, id, perms, codec, legacy) { localApi = localApi || {} remoteApi = remoteApi || {} var emitter if(!codec) codec = PSC //pass the manifest to the permissions so that it can know //what something should be. var _cb, ws var context = { _emit: function (event, value) { emitter && emitter._emit(event, value) return context }, id: id } var ws = initStream( createLocalCall(local, localApi, perms).bind(context), codec, function (err) { if(emitter.closed) return emitter.closed = true emitter.emit('closed') if(_cb) { var cb = _cb; _cb = null; cb(err) } } ) emitter = createApi([], remoteApi, function (type, name, args, cb) { if(ws.closed) throw new Error('stream is closed') return ws.remoteCall(type, name, args, cb) }) if(legacy) { Object.__defineGetter__.call(emitter, 'id', function () { return context.id }) Object.__defineSetter__.call(emitter, 'id', function (value) { context.id = value }) var first = true emitter.createStream = function (cb) { _cb = cb if(first) { first = false; return ws } else throw new Error('one stream per rpc') } } else emitter.stream = ws emitter.closed = false emitter.close = function (err, cb) { ws.close(err, cb) return this } return emitter } module.exports = function (remoteApi, localApi, codec) { if(arguments.length > 3) return createMuxrpc.apply(this, arguments) return function (local, perms, id) { return createMuxrpc(remoteApi, localApi, local, id, perms, codec, true) } } },{"./api":260,"./local-api":262,"./stream":270,"./util":271,"packet-stream-codec":283}],262:[function(require,module,exports){ var Permissions = require('./permissions') var u = require('./util') module.exports = function createLocalCall(local, localApi, perms) { perms = Permissions(perms) function has(type, name) { return type === u.get(localApi, name) } function localCall(type, name, args) { if(name === 'emit') throw new Error('emit has been removed') //is there a way to know whether it's sync or async? if(type === 'async') if(has('sync', name)) { var cb = args.pop(), value try { value = u.get(local, name).apply(this, args) } catch (err) { return cb(err) } return cb(null, value) } if (!has(type, name)) throw new Error('no '+type+':'+name) return u.get(local, name).apply(this, args) } return function (type, name, args) { var err = perms.pre(name, args) if(err) throw err return localCall.call(this, type, name, args) } } },{"./permissions":268,"./util":271}],263:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":264,"./sinks":265,"./sources":266,"./throughs":267,"dup":232}],264:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],265:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],266:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],267:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":265,"./sources":266,"dup":236}],268:[function(require,module,exports){ 'use strict'; var u = require('./util') var isArray = Array.isArray function isFunction (f) { return 'function' === typeof f } function join (str) { return Array.isArray(str) ? str.join('.') : str } function toArray(str) { return isArray(str) ? str : str.split('.') } function isPerms (p) { return ( p && isFunction(p.pre) && isFunction(p.test) && isFunction(p.post) ) } /* perms: a given capability may be permitted to call a particular api. but only if a perms function returns true for the arguments it passes. suppose, an app may be given access, but may only create functions with it's own properties. create perms: { allow: ['add', 'query'], deny: [...], rules: { add: { call: function (value) { return (value.type === 'task' || value.type === '_task') }, query: { call: function (value) { safe.contains(value, {path: ['content', 'type'], eq: 'task'}) || safe.contains(value, {path: ['content', 'type'], eq: '_task'}) }, filter: function (value) { return (value.type === 'task' || value.type === '_task') } } } } */ module.exports = function (opts) { if(isPerms(opts)) return opts if(isFunction(opts)) return {pre: opts} var allow = null var deny = {} function perms (opts) { if(opts.allow) { allow = {} opts.allow.forEach(function (path) { u.set(allow, toArray(path), true) }) } else allow = null if(opts.deny) opts.deny.forEach(function (path) { u.set(deny, toArray(path), true) }) else deny = {} return this } if(opts) perms(opts) perms.pre = function (name, args) { name = isArray(name) ? name : [name] if(allow && !u.prefix(allow, name)) return new Error('method:'+name + ' is not on whitelist') if(deny && u.prefix(deny, name)) return new Error('method:'+name + ' is on blacklist') } perms.post = function (err, value) { //TODO } //alias for pre, used in tests. perms.test = function (name, args) { return perms.pre(name, args) } perms.get = function () { return {allow: allow, deny: deny} } return perms } },{"./util":271}],269:[function(require,module,exports){ 'use strict' var pull = require('pull-stream') // wrap pull streams around packet-stream's weird streams. function once (fn) { var done = false return function (err, val) { if(done) return done = true fn(err, val) } } module.exports = function (weird, _done) { var buffer = [], ended = false, waiting, abort var done = once(function (err, v) { _done && _done(err, v) // deallocate weird = null _done = null waiting = null if(abort) abort(err || true, function () {}) }) weird.read = function (data, end) { ended = ended || end if(waiting) { var cb = waiting waiting = null cb(ended, data) } else if(!ended) buffer.push(data) if(ended) done(ended !== true ? ended : null) } return { source: function (abort, cb) { if(abort) { weird && weird.write(null, abort) cb(abort); done(abort !== true ? abort : null) } else if(buffer.length) cb(null, buffer.shift()) else if(ended) cb(ended) else waiting = cb }, sink : function (read) { if(ended) return read(ended, function () {}), abort = null abort = read pull.drain(function (data) { //TODO: make this should only happen on a UNIPLEX stream. if(ended) return false weird.write(data) }, function (err) { if(weird && !weird.writeEnd) weird.write(null, err || true) done && done(err) }) (read) } } } function uniplex (s, done) { return module.exports(s, function (err) { if(!s.writeEnd) s.write(null, err || true) if(done) done(err) }) } module.exports.source = function (s) { return uniplex(s).source } module.exports.sink = function (s, done) { return uniplex(s, done).sink } module.exports.duplex = module.exports },{"pull-stream":263}],270:[function(require,module,exports){ 'use strict'; var PacketStream = require('packet-stream') var pull = require('pull-stream') var pullWeird = require('./pull-weird') var goodbye = require('pull-goodbye') var u = require('./util') var explain = require('explain-error') function isFunction (f) { return 'function' === typeof f } function isString (s) { return 'string' === typeof s } function isObject (o) { return o && 'object' === typeof o } function isSource (t) { return 'source' === t } function isSink (t) { return 'sink' === t } function isDuplex (t) { return 'duplex' === t } function isSync (t) { return 'sync' === t } function isAsync (t) { return 'async' === t } function isRequest (t) { return isSync(t) || isAsync(t) } function isStream (t) { return isSource(t) || isSink(t) || isDuplex(t) } module.exports = function initStream (localCall, codec, onClose) { var ps = PacketStream({ message: function (msg) { // if(isString(msg)) return // if(msg.length > 0 && isString(msg[0])) // localCall('msg', 'emit', msg) }, request: function (opts, cb) { var name = opts.name, args = opts.args var inCB = false, called = false, async = false, value args.push(function (err, value) { called = true inCB = true; cb(err, value) }) try { value = localCall('async', name, args) } catch (err) { if(inCB || called) throw explain(err, 'no callback provided to muxrpc async funtion') return cb(err) } }, stream: function (stream) { stream.read = function (data, end) { var name = data.name var type = data.type var err, value stream.read = null if(!isStream(type)) return stream.write(null, new Error('unsupported stream type:'+type)) //how would this actually happen? if(end) return stream.write(null, end) try { value = localCall(type, name, data.args) } catch (_err) { err = _err } var _stream = pullWeird[ {source: 'sink', sink: 'source'}[type] || 'duplex' ](stream) return u.pipeToStream( type, _stream, err ? u.errorAsStream(type, err) : value ) // if(isSource(type)) // _stream(err ? pull.error(err) : value) // else if (isSink(type)) // (err ? abortSink(err) : value)(_stream) // else if (isDuplex(type)) // pull(_stream, err ? abortDuplex(err) : value, _stream) } }, close: function (err) { ps = null // deallocate ws.ended = true if(ws.closed) return ws.closed = true if(onClose) { var close = onClose; onClose = null; close(err) } } }) var ws = goodbye(pullWeird(ps, function (_) { //this error will be handled in PacketStream.close })) ws = codec ? codec(ws) : ws ws.remoteCall = function (type, name, args, cb) { if(name === 'emit') return ps.message(args) if(!(isRequest(type) || isStream(type))) throw new Error('unsupported type:' + JSON.stringify(type)) if(isRequest(type)) return ps.request({name: name, args: args}, cb) var ws = ps.stream(), s = pullWeird[type](ws, cb) ws.write({name: name, args: args, type: type}) return s } //hack to work around ordering in setting ps.ended. //Question: if an object has subobjects, which //all have close events, should the subobjects fire close //before the parent? or should parents close after? //should there be a preclose event on the parent //that fires when it's about to close all the children? ws.isOpen = function () { return !ps.ended } ws.close = function (err, cb) { if(isFunction(err)) cb = err, err = false if(!ps) return (cb && cb()) if(err) return ps.destroy(err), (cb && cb()) ps.close(function (err) { if(cb) cb(err) else if(err) throw explain(err, 'no callback provided for muxrpc close') }) return this } ws.closed = false return ws } },{"./pull-weird":269,"./util":271,"explain-error":146,"packet-stream":284,"pull-goodbye":328,"pull-stream":263}],271:[function(require,module,exports){ 'use strict'; var pull = require('pull-stream') function isString (s) { return 'string' === typeof s } var isArray = Array.isArray function isObject (o) { return o && 'object' === typeof o && !isArray(o) } function isEmpty (obj) { for(var k in obj) return false; return true } //I wrote set as part of permissions.js //and then later mount, they do nearly the same thing //but not quite. this should be refactored sometime. //what differs is that set updates the last key in the path //to the new value, but mount merges the last value //which makes sense if it's an object, and set makes sense if it's //a string/number/boolean. exports.set = function (obj, path, value) { var _obj, _k for(var i = 0; i < path.length; i++) { var k = path[i] obj[k] = obj[k] || {} _obj = obj; _k = k obj = obj[k] } _obj[_k] = value } exports.get = function (obj, path) { if(isString(path)) return obj[path] var value for(var i = 0; i < path.length; i++) { var k = path[i] value = obj = obj[k] if(null == obj) return obj } return value } exports.prefix = function (obj, path) { var value, parent = obj for(var i = 0; i < path.length; i++) { var k = path[i] value = obj = obj[k] if('object' !== typeof obj) { return obj } parent = obj } return 'object' !== typeof value ? !!value : false } function mkPath(obj, path) { for(var i in path) { var key = path[i] if(!obj[key]) obj[key]={} obj = obj[key] } return obj } function rmPath (obj, path) { (function r (obj, i) { var key = path[i] if(!obj) return else if(path.length - 1 === i) delete obj[key] else if(i < path.length) r(obj[key], i+1) if(isEmpty(obj[key])) delete obj[key] })(obj, 0) } function merge (obj, _obj) { for(var k in _obj) obj[k] = _obj[k] return obj } var mount = exports.mount = function (obj, path, _obj) { if(!Array.isArray(path)) throw new Error('path must be array of strings') return merge(mkPath(obj, path), _obj) } var unmount = exports.unmount = function (obj, path) { return rmPath(obj, path) } function isSource (t) { return 'source' === t } function isSink (t) { return 'sink' === t } function isDuplex (t) { return 'duplex' === t } function isSync (t) { return 'sync' === t } function isAsync (t) { return 'async' === t } function isRequest (t) { return isSync(t) || isAsync(t) } function isStream (t) { return isSource(t) || isSink(t) || isDuplex(t) } function abortSink (err) { return function (read) { read(err || true, function () {}) } } function abortDuplex (err) { return {source: pull.error(err), sink: abortSink(err)} } exports.errorAsStream = function (type, err) { return ( isSource(type) ? pull.error(err) : isSink(type) ? abortSink(err) : abortDuplex(err) ) } exports.errorAsStreamOrCb = function (type, err, cb) { return ( isRequest(type) ? cb(err) : isSource(type) ? pull.error(err) : isSink(type) ? abortSink(err) : cb(err), abortDuplex(err) ) } exports.pipeToStream = function (type, _stream, stream) { if(isSource(type)) _stream(stream) else if (isSink(type)) stream(_stream) else if (isDuplex(type)) pull(_stream, stream, _stream) } },{"pull-stream":263}],272:[function(require,module,exports){ (function (process){ var os = require('os') var ip = require('ip') //pick the first reasonable looking host. //this should *just work* when running on a vps. var isPrivate = ip.isPrivate function isNonPrivate (e) { return !isPrivate(e) } module.exports = function (inter, filter) { inter = inter || os.networkInterfaces() filter = filter || isNonPrivate for(var k in inter) { for(var i in inter[k]) { var e = inter[k][i] // find a reasonable looking address if(!e.internal && filter(e.address)) return e.address } } } module.exports.private = function (inter) { return module.exports(inter, isPrivate) } if(!module.parent) { var h = module.exports() if(!h) { console.error('no non-private address') console.error('private:', module.exports.private()) process.exit(1) } console.log(h) } }).call(this,require('_process')) },{"_process":295,"ip":169,"os":279}],273:[function(require,module,exports){ 'use strict'; /** * Normalize `uri`. This only works when both `encodeURI` * and `decodeURI` are available, and when * decoding/encoding fails, just returns `uri`. * * @example * normalizeURI('foo bar'); // 'foo%20bar' * normalizeURI('foo%20bar'); // 'foo%20bar' * * @param {string} uri - Value with and/or without * encoded, entities. * @return {string} - Encoded URI (when encoding succeeds, * or `uri`). */ function normalizeURI(uri) { try { uri = encodeURI(decodeURI(uri)); } catch (exception) { /* empty */ } return uri; } /* * Expose. */ module.exports = normalizeURI; },{}],274:[function(require,module,exports){ /* eslint-disable no-unused-vars */ 'use strict'; var hasOwnProperty = Object.prototype.hasOwnProperty; var propIsEnumerable = Object.prototype.propertyIsEnumerable; function toObject(val) { if (val === null || val === undefined) { throw new TypeError('Object.assign cannot be called with null or undefined'); } return Object(val); } module.exports = Object.assign || function (target, source) { var from; var to = toObject(target); var symbols; for (var s = 1; s < arguments.length; s++) { from = Object(arguments[s]); for (var key in from) { if (hasOwnProperty.call(from, key)) { to[key] = from[key]; } } if (Object.getOwnPropertySymbols) { symbols = Object.getOwnPropertySymbols(from); for (var i = 0; i < symbols.length; i++) { if (propIsEnumerable.call(from, symbols[i])) { to[symbols[i]] = from[symbols[i]]; } } } } return to; }; },{}],275:[function(require,module,exports){ var Observ = require('observ') module.exports = function (delay) { delay = delay || 200 var o = Observ(), set = o.set, ts = 0, timer, v o.set = function (v) { value = v var next = (ts + delay) - Date.now() if(next >= 0) { if(!timer) timer = setTimeout(function () { timer = null ts = Date.now() set(value) }, next) return } ts = Date.now() set(v) } o.immediate = function (v) { ts = 0 clearTimeout(timer) return o.set(v) } return o } },{"observ":276}],276:[function(require,module,exports){ module.exports = Observable function Observable(value) { var listeners = [] value = value === undefined ? null : value observable.set = function (v) { value = v listeners.forEach(function (f) { f(v) }) } return observable function observable(listener) { if (!listener) { return value } listeners.push(listener) return function remove() { listeners.splice(listeners.indexOf(listener), 1) } } } },{}],277:[function(require,module,exports){ var sleepCheckInterval var lastSleepCheck = false var SLEEP_CHECK_INTERVAL = 10e3 var NUM_MISSABLE_INTERVALS = 3 var EE = require('events') var emitter = new EE() module.exports = function (cb) { emitter.on('wakeup', cb) if (!sleepCheckInterval) { // setup interval sleepCheckInterval = setInterval(function () { var t = Date.now() if (lastSleepCheck && (t - lastSleepCheck) > SLEEP_CHECK_INTERVAL*NUM_MISSABLE_INTERVALS) emitter.emit('wakeup') // missed NUM_MISSABLE_INTERVALS checks, let's run the callbacks lastSleepCheck = t }, SLEEP_CHECK_INTERVAL) } // unreference the timer so that the program can close if (sleepCheckInterval.unref) sleepCheckInterval.unref() return sleepCheckInterval } },{"events":144}],278:[function(require,module,exports){ var wrappy = require('wrappy') module.exports = wrappy(once) once.proto = once(function () { Object.defineProperty(Function.prototype, 'once', { value: function () { return once(this) }, configurable: true }) }) function once (fn) { var f = function () { if (f.called) return f.value f.called = true return f.value = fn.apply(this, arguments) } f.called = false return f } },{"wrappy":641}],279:[function(require,module,exports){ exports.endianness = function () { return 'LE' }; exports.hostname = function () { if (typeof location !== 'undefined') { return location.hostname } else return ''; }; exports.loadavg = function () { return [] }; exports.uptime = function () { return 0 }; exports.freemem = function () { return Number.MAX_VALUE; }; exports.totalmem = function () { return Number.MAX_VALUE; }; exports.cpus = function () { return [] }; exports.type = function () { return 'Browser' }; exports.release = function () { if (typeof navigator !== 'undefined') { return navigator.appVersion; } return ''; }; exports.networkInterfaces = exports.getNetworkInterfaces = function () { return {} }; exports.arch = function () { return 'javascript' }; exports.platform = function () { return 'browser' }; exports.tmpdir = exports.tmpDir = function () { return '/tmp'; }; exports.EOL = '\n'; },{}],280:[function(require,module,exports){ (function (process){ 'use strict'; var os = require('os'); function homedir() { var env = process.env; var home = env.HOME; var user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME; if (process.platform === 'win32') { return env.USERPROFILE || env.HOMEDRIVE + env.HOMEPATH || home || null; } if (process.platform === 'darwin') { return home || (user ? '/Users/' + user : null); } if (process.platform === 'linux') { return home || (process.getuid() === 0 ? '/root' : (user ? '/home/' + user : null)); } return home || null; } module.exports = typeof os.homedir === 'function' ? os.homedir : homedir; }).call(this,require('_process')) },{"_process":295,"os":279}],281:[function(require,module,exports){ (function (process){ 'use strict'; var isWindows = process.platform === 'win32'; var trailingSlashRe = isWindows ? /[^:]\\$/ : /.\/$/; // https://github.com/nodejs/io.js/blob/3e7a14381497a3b73dda68d05b5130563cdab420/lib/os.js#L25-L43 module.exports = function () { var path; if (isWindows) { path = process.env.TEMP || process.env.TMP || (process.env.SystemRoot || process.env.windir) + '\\temp'; } else { path = process.env.TMPDIR || process.env.TMP || process.env.TEMP || '/tmp'; } if (trailingSlashRe.test(path)) { path = path.slice(0, -1); } return path; }; }).call(this,require('_process')) },{"_process":295}],282:[function(require,module,exports){ (function (process){ var isWindows = process.platform === 'win32' var path = require('path') var exec = require('child_process').exec var osTmpdir = require('os-tmpdir') var osHomedir = require('os-homedir') // looking up envs is a bit costly. // Also, sometimes we want to have a fallback // Pass in a callback to wait for the fallback on failures // After the first lookup, always returns the same thing. function memo (key, lookup, fallback) { var fell = false var falling = false exports[key] = function (cb) { var val = lookup() if (!val && !fell && !falling && fallback) { fell = true falling = true exec(fallback, function (er, output, stderr) { falling = false if (er) return // oh well, we tried val = output.trim() }) } exports[key] = function (cb) { if (cb) process.nextTick(cb.bind(null, null, val)) return val } if (cb && !falling) process.nextTick(cb.bind(null, null, val)) return val } } memo('user', function () { return ( isWindows ? process.env.USERDOMAIN + '\\' + process.env.USERNAME : process.env.USER ) }, 'whoami') memo('prompt', function () { return isWindows ? process.env.PROMPT : process.env.PS1 }) memo('hostname', function () { return isWindows ? process.env.COMPUTERNAME : process.env.HOSTNAME }, 'hostname') memo('tmpdir', function () { return osTmpdir() }) memo('home', function () { return osHomedir() }) memo('path', function () { return (process.env.PATH || process.env.Path || process.env.path).split(isWindows ? ';' : ':') }) memo('editor', function () { return process.env.EDITOR || process.env.VISUAL || (isWindows ? 'notepad.exe' : 'vi') }) memo('shell', function () { return isWindows ? process.env.ComSpec || 'cmd' : process.env.SHELL || 'bash' }) }).call(this,require('_process')) },{"_process":295,"child_process":58,"os-homedir":280,"os-tmpdir":281,"path":290}],283:[function(require,module,exports){ (function (Buffer){ var Through = require('pull-through') var Reader = require('pull-reader') var BUFFER = 0, STRING = 1, OBJECT = 2 var GOODBYE = 'GOODBYE' var isBuffer = Buffer.isBuffer function isString (s) { return 'string' === typeof s } function encodePair (msg) { var head = new Buffer(9) var flags = 0 var value = msg.value !== undefined ? msg.value : msg.end //final packet if(isString(msg) && msg === GOODBYE) { head.fill(0) return [head, null] } if(isString(value)) { flags = STRING value = new Buffer(value) } else if(isBuffer(value)) { flags = BUFFER } else { flags = OBJECT value = new Buffer(JSON.stringify(value)) } // does this frame represent a msg, a req, or a stream? //end, stream flags = msg.stream << 3 | msg.end << 2 | flags head[0] = flags head.writeUInt32BE(value.length, 1) head.writeInt32BE(msg.req || 0, 5) return [head, value] } function decodeHead (bytes) { if(bytes.length != 9) throw new Error('expected header to be 9 bytes long') var flags = bytes[0] var length = bytes.readUInt32BE(1) var req = bytes.readInt32BE(5) return { req : req, stream : !!(flags & 8), end : !!(flags & 4), value : null, length : length, type : flags & 3 } } function decodeBody (bytes, msg) { if(bytes.length !== msg.length) throw new Error('incorrect length, expected:'+msg.length+' found:'+bytes.length) if(BUFFER === msg.type) msg.value = bytes else if(STRING === msg.type) msg.value = bytes.toString() else if(OBJECT === msg.type) msg.value = JSON.parse(bytes.toString()) else throw new Error('unknown message type') return msg } function encode () { return Through(function (d) { var c = encodePair(d) this.queue(c[0]) if(c[1] !== null) this.queue(c[1]) }) } function decode () { var reader = Reader(), ended = false return function (read) { reader(read) return function (abort, cb) { if(ended) return cb(true) if(abort) return reader.abort(abort, cb) reader.read(9, function (err, head) { if(err) return cb(err) var msg = decodeHead(head) if(msg.length === 0) { //final packet ended = true return cb(null, GOODBYE) } reader.read(msg.length, function (err, body) { if(err) return cb(err) decodeBody(body, msg) cb(null, msg) }) }) } } } exports = module.exports = function (stream) { return { source: encode()(stream.source), sink: function (read) { return stream.sink(decode()(read)) } } } exports.encodePair = encodePair exports.decodeHead = decodeHead exports.decodeBody = decodeBody exports.encode = encode exports.decode = decode }).call(this,require("buffer").Buffer) },{"buffer":61,"pull-reader":372,"pull-through":386}],284:[function(require,module,exports){ function flat(err) { if(!err) return err if(err === true) return true return {message: err.message, name: err.name, stack: err.stack} } module.exports = function (opts) { return new PacketStream(opts) } function PacketStream (opts) { this.ended = false this.opts = opts // must release, may capture `this` this._req_counter = 1 this._requests = {} // must release, may capture `this` this._instreams = {} // must release, may capture `this` this._outstreams = {} // must release, may capture `this` this._closecbs = [] // must release, may capture `this` this._closing = false this._closed = false if (opts.close) this._closecbs.push(opts.close) } // Sends a single message to the other end PacketStream.prototype.message = function (obj) { this.read({req: 0, stream: false, end: false, value: obj}) } // Sends a message to the other end, expects an (err, obj) response PacketStream.prototype.request = function (obj, cb) { var rid = this._req_counter++ var self = this this._requests[rid] = function (err, value) { delete self._requests[rid] cb(err, value) self._maybedone() } this.read({ req:rid, stream: false, end: false, value: obj }) } // Sends a request to the other end for a stream PacketStream.prototype.stream = function () { var rid = this._req_counter++ var self = this this._outstreams[rid] = new PacketStreamSubstream(rid, this, function() { delete self._outstreams[rid] }) return this._outstreams[rid] } // Marks the packetstream to close when all current IO is finished PacketStream.prototype.close = function (cb) { if(!cb) throw new Error('packet-stream.close *must* have callback') if (this._closed) return cb() this._closecbs.push(cb) this._closing = true this._maybedone() } // Forces immediate close of the PacketStream // - usually triggered by an `end` packet from the other end PacketStream.prototype.destroy = function (end) { end = end || flat(end) this.ended = end var err = (end === true) ? new Error('unexpected end of parent stream') : end // force-close all requests and substreams var numended = 0 for (var k in this._requests) { numended++; this._requests[k](err) } for (var k in this._instreams) { numended++; this._instreams[k].destroy(err) } for (var k in this._outstreams) { numended++; this._outstreams[k].destroy(err) } //from the perspective of the outside stream it's not an error //if the stream was in a state that where end was okay. (no open requests/streams) if (numended === 0 && end === true) err = null this._closing = true this._maybedone(err) } PacketStream.prototype._maybedone = function (err) { if (this._closed || !this._closing) return // check if all requests and streams finished if (Object.keys(this._requests).length !== 0 || Object.keys(this._instreams).length !== 0 || Object.keys(this._outstreams).length !== 0) return // not yet // close this._closed = true this._closecbs.forEach(function (cb) { cb(err) }) this.read(null, err || true) // deallocate this.opts = null this._closecbs.length = 0 this.read = closedread } function closedread (msg) { console.error('packet-stream asked to read after closed', msg) } // Sends data out to the other end // - to be overridden by the PacketStream consumer PacketStream.prototype.read = function (msg) { console.error('please overwrite read method to do IO', msg) } // Accepts data from the other end PacketStream.prototype.write = function (msg, end) { if (this.ended) return if (end) this.destroy(end) else if (msg.req && !msg.stream) this._onrequest(msg) else if (msg.req && msg.stream) this._onstream(msg) else this._onmessage(msg) } // Internal handler of incoming message msgs PacketStream.prototype._onmessage = function (msg) { if (this.opts && 'function' === typeof this.opts.message) this.opts.message(msg.value) } // Internal handler of incoming request msgs PacketStream.prototype._onrequest = function (msg) { var rid = msg.req*-1 if(msg.req < 0) { // A incoming response if (typeof this._requests[rid] == 'function') this._requests[rid]( msg.end ? msg.value: null, msg.end ? null : msg.value ) } else { // An incoming request if (this.opts && typeof this.opts.request == 'function') { var once = false var self = this this.opts.request(msg.value, function (err, value) { if(once) throw new Error('cb called twice from local api') once = true if(err) self.read({ value: flat(err), end: true, req: rid }) else self.read({ value: value, end: false, req: rid }) self._maybedone() }) } else { if (this.ended) { var err = (this.ended === true) ? new Error('unexpected end of parent stream') : this.ended this.read({ value: flat(err), end: true, stream: false, req: rid }) } else this.read({ value: { message: 'Unable to handle requests', name: 'NO_REQUEST_HANDLER', stack: null }, end: true, stream: false, req: rid }) this._maybedone() } } } // Internal handler of incoming stream msgs PacketStream.prototype._onstream = function (msg) { if(msg.req < 0) { // Incoming stream data var rid = msg.req*-1 var outs = this._outstreams[rid] if (!outs) return console.error('no stream for incoming msg', msg) if (msg.end) { if (outs.writeEnd) delete this._outstreams[rid] outs.readEnd = true outs.read(null, msg.value) this._maybedone() } else outs.read(msg.value) } else { // Incoming stream request var rid = msg.req var ins = this._instreams[rid] if (!ins) { // New stream var self = this ins = this._instreams[rid] = new PacketStreamSubstream(rid*-1, this, function() { delete self._instreams[rid] }) if (this.opts && typeof this.opts.stream == 'function') this.opts.stream(ins) } if (!ins.read) return console.error('no .read for stream:', ins.id, 'dropped:', msg) if (msg.end) { if (ins.writeEnd) delete this._instreams[rid] ins.readEnd = true ins.read(null, msg.value) this._maybedone() } else ins.read(msg.value) } } function PacketStreamSubstream (id, ps, remove) { this.id = id this.read = null // must release, may capture `this` this.writeEnd = null this.readEnd = null this._ps = ps // must release, may capture `this` this._remove = remove // must release, may capture `this` this._seq_counter = 1 } PacketStreamSubstream.prototype.write = function (data, err) { if (err) { this.writeEnd = err var ps = this._ps if (ps) { ps.read({ req: this.id, stream: true, end: true, value: flat(err) }) if (this.readEnd) this.destroy() ps._maybedone() } } else { if (this._ps) this._ps.read({ req: this.id, stream: true, end: false, value: data }) } } // Send the `end` message for the substream PacketStreamSubstream.prototype.end = function (err) { this.write(null, flat(err || true)) } PacketStreamSubstream.prototype.destroy = function (err) { if (!this.writeEnd) { this.writeEnd = true if (!this.readEnd) { this.readEnd = true try { // catch errors to ensure cleanup this.read(null, err) } catch (e) { console.error('Exception thrown by PacketStream substream end handler', e) console.error(e.stack) } } this.write(null, err) } else if (!this.readEnd) { this.readEnd = true try { // catch errors to ensure cleanup this.read(null, err) } catch (e) { console.error('Exception thrown by PacketStream substream end handler', e) console.error(e.stack) } } // deallocate if (this._ps) { this._remove() this._remove = null this.read = closedread this._ps = null } } },{}],285:[function(require,module,exports){ module.exports={"2.16.840.1.101.3.4.1.1": "aes-128-ecb", "2.16.840.1.101.3.4.1.2": "aes-128-cbc", "2.16.840.1.101.3.4.1.3": "aes-128-ofb", "2.16.840.1.101.3.4.1.4": "aes-128-cfb", "2.16.840.1.101.3.4.1.21": "aes-192-ecb", "2.16.840.1.101.3.4.1.22": "aes-192-cbc", "2.16.840.1.101.3.4.1.23": "aes-192-ofb", "2.16.840.1.101.3.4.1.24": "aes-192-cfb", "2.16.840.1.101.3.4.1.41": "aes-256-ecb", "2.16.840.1.101.3.4.1.42": "aes-256-cbc", "2.16.840.1.101.3.4.1.43": "aes-256-ofb", "2.16.840.1.101.3.4.1.44": "aes-256-cfb" } },{}],286:[function(require,module,exports){ // from https://github.com/indutny/self-signed/blob/gh-pages/lib/asn1.js // Fedor, you are amazing. var asn1 = require('asn1.js') var RSAPrivateKey = asn1.define('RSAPrivateKey', function () { this.seq().obj( this.key('version').int(), this.key('modulus').int(), this.key('publicExponent').int(), this.key('privateExponent').int(), this.key('prime1').int(), this.key('prime2').int(), this.key('exponent1').int(), this.key('exponent2').int(), this.key('coefficient').int() ) }) exports.RSAPrivateKey = RSAPrivateKey var RSAPublicKey = asn1.define('RSAPublicKey', function () { this.seq().obj( this.key('modulus').int(), this.key('publicExponent').int() ) }) exports.RSAPublicKey = RSAPublicKey var PublicKey = asn1.define('SubjectPublicKeyInfo', function () { this.seq().obj( this.key('algorithm').use(AlgorithmIdentifier), this.key('subjectPublicKey').bitstr() ) }) exports.PublicKey = PublicKey var AlgorithmIdentifier = asn1.define('AlgorithmIdentifier', function () { this.seq().obj( this.key('algorithm').objid(), this.key('none').null_().optional(), this.key('curve').objid().optional(), this.key('params').seq().obj( this.key('p').int(), this.key('q').int(), this.key('g').int() ).optional() ) }) var PrivateKeyInfo = asn1.define('PrivateKeyInfo', function () { this.seq().obj( this.key('version').int(), this.key('algorithm').use(AlgorithmIdentifier), this.key('subjectPrivateKey').octstr() ) }) exports.PrivateKey = PrivateKeyInfo var EncryptedPrivateKeyInfo = asn1.define('EncryptedPrivateKeyInfo', function () { this.seq().obj( this.key('algorithm').seq().obj( this.key('id').objid(), this.key('decrypt').seq().obj( this.key('kde').seq().obj( this.key('id').objid(), this.key('kdeparams').seq().obj( this.key('salt').octstr(), this.key('iters').int() ) ), this.key('cipher').seq().obj( this.key('algo').objid(), this.key('iv').octstr() ) ) ), this.key('subjectPrivateKey').octstr() ) }) exports.EncryptedPrivateKey = EncryptedPrivateKeyInfo var DSAPrivateKey = asn1.define('DSAPrivateKey', function () { this.seq().obj( this.key('version').int(), this.key('p').int(), this.key('q').int(), this.key('g').int(), this.key('pub_key').int(), this.key('priv_key').int() ) }) exports.DSAPrivateKey = DSAPrivateKey exports.DSAparam = asn1.define('DSAparam', function () { this.int() }) var ECPrivateKey = asn1.define('ECPrivateKey', function () { this.seq().obj( this.key('version').int(), this.key('privateKey').octstr(), this.key('parameters').optional().explicit(0).use(ECParameters), this.key('publicKey').optional().explicit(1).bitstr() ) }) exports.ECPrivateKey = ECPrivateKey var ECParameters = asn1.define('ECParameters', function () { this.choice({ namedCurve: this.objid() }) }) exports.signature = asn1.define('signature', function () { this.seq().obj( this.key('r').int(), this.key('s').int() ) }) },{"asn1.js":1}],287:[function(require,module,exports){ (function (Buffer){ // adapted from https://github.com/apatil/pemstrip var findProc = /Proc-Type: 4,ENCRYPTED\r?\nDEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)\r?\n\r?\n([0-9A-z\n\r\+\/\=]+)\r?\n/m var startRegex = /^-----BEGIN (.*) KEY-----\r?\n/m var fullRegex = /^-----BEGIN (.*) KEY-----\r?\n([0-9A-z\n\r\+\/\=]+)\r?\n-----END \1 KEY-----$/m var evp = require('evp_bytestokey') var ciphers = require('browserify-aes') module.exports = function (okey, password) { var key = okey.toString() var match = key.match(findProc) var decrypted if (!match) { var match2 = key.match(fullRegex) decrypted = new Buffer(match2[2].replace(/\r?\n/g, ''), 'base64') } else { var suite = 'aes' + match[1] var iv = new Buffer(match[2], 'hex') var cipherText = new Buffer(match[3].replace(/\r?\n/g, ''), 'base64') var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key var out = [] var cipher = ciphers.createDecipheriv(suite, cipherKey, iv) out.push(cipher.update(cipherText)) out.push(cipher.final()) decrypted = Buffer.concat(out) } var tag = key.match(startRegex)[1] + ' KEY' return { tag: tag, data: decrypted } } }).call(this,require("buffer").Buffer) },{"browserify-aes":36,"buffer":61,"evp_bytestokey":145}],288:[function(require,module,exports){ (function (Buffer){ var asn1 = require('./asn1') var aesid = require('./aesid.json') var fixProc = require('./fixProc') var ciphers = require('browserify-aes') var compat = require('pbkdf2') module.exports = parseKeys function parseKeys (buffer) { var password if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) { password = buffer.passphrase buffer = buffer.key } if (typeof buffer === 'string') { buffer = new Buffer(buffer) } var stripped = fixProc(buffer, password) var type = stripped.tag var data = stripped.data var subtype, ndata switch (type) { case 'PUBLIC KEY': ndata = asn1.PublicKey.decode(data, 'der') subtype = ndata.algorithm.algorithm.join('.') switch (subtype) { case '1.2.840.113549.1.1.1': return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der') case '1.2.840.10045.2.1': ndata.subjectPrivateKey = ndata.subjectPublicKey return { type: 'ec', data: ndata } case '1.2.840.10040.4.1': ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der') return { type: 'dsa', data: ndata.algorithm.params } default: throw new Error('unknown key id ' + subtype) } throw new Error('unknown key type ' + type) case 'ENCRYPTED PRIVATE KEY': data = asn1.EncryptedPrivateKey.decode(data, 'der') data = decrypt(data, password) // falls through case 'PRIVATE KEY': ndata = asn1.PrivateKey.decode(data, 'der') subtype = ndata.algorithm.algorithm.join('.') switch (subtype) { case '1.2.840.113549.1.1.1': return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der') case '1.2.840.10045.2.1': return { curve: ndata.algorithm.curve, privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey } case '1.2.840.10040.4.1': ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der') return { type: 'dsa', params: ndata.algorithm.params } default: throw new Error('unknown key id ' + subtype) } throw new Error('unknown key type ' + type) case 'RSA PUBLIC KEY': return asn1.RSAPublicKey.decode(data, 'der') case 'RSA PRIVATE KEY': return asn1.RSAPrivateKey.decode(data, 'der') case 'DSA PRIVATE KEY': return { type: 'dsa', params: asn1.DSAPrivateKey.decode(data, 'der') } case 'EC PRIVATE KEY': data = asn1.ECPrivateKey.decode(data, 'der') return { curve: data.parameters.value, privateKey: data.privateKey } default: throw new Error('unknown key type ' + type) } } parseKeys.signature = asn1.signature function decrypt (data, password) { var salt = data.algorithm.decrypt.kde.kdeparams.salt var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10) var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')] var iv = data.algorithm.decrypt.cipher.iv var cipherText = data.subjectPrivateKey var keylen = parseInt(algo.split('-')[1], 10) / 8 var key = compat.pbkdf2Sync(password, salt, iters, keylen) var cipher = ciphers.createDecipheriv(algo, key, iv) var out = [] out.push(cipher.update(cipherText)) out.push(cipher.final()) return Buffer.concat(out) } }).call(this,require("buffer").Buffer) },{"./aesid.json":285,"./asn1":286,"./fixProc":287,"browserify-aes":36,"buffer":61,"pbkdf2":292}],289:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module parse-entities * @fileoverview Parse HTML character references: fast, spec-compliant, * positional information. */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var characterEntities = require('character-entities'); var legacy = require('character-entities-legacy'); var invalid = require('character-reference-invalid'); /* * Methods. */ var fromCharCode = String.fromCharCode; var has = Object.prototype.hasOwnProperty; var noop = Function.prototype; /* * Reference types. */ var NAMED = 'named'; var HEXADECIMAL = 'hexadecimal'; var DECIMAL = 'decimal'; /* * Map of bases. */ var BASE = {}; BASE[HEXADECIMAL] = 16; BASE[DECIMAL] = 10; /* * Warning messages. */ var NUMERIC_REFERENCE = 'Numeric character references'; var NAMED_REFERENCE = 'Named character references'; var TERMINATED = ' must be terminated by a semicolon'; var VOID = ' cannot be empty'; var NAMED_NOT_TERMINATED = 1; var NUMERIC_NOT_TERMINATED = 2; var NAMED_EMPTY = 3; var NUMERIC_EMPTY = 4; var NAMED_UNKNOWN = 5; var NUMERIC_DISALLOWED = 6; var NUMERIC_PROHIBITED = 7; var MESSAGES = {}; MESSAGES[NAMED_NOT_TERMINATED] = NAMED_REFERENCE + TERMINATED; MESSAGES[NUMERIC_NOT_TERMINATED] = NUMERIC_REFERENCE + TERMINATED; MESSAGES[NAMED_EMPTY] = NAMED_REFERENCE + VOID; MESSAGES[NUMERIC_EMPTY] = NUMERIC_REFERENCE + VOID; MESSAGES[NAMED_UNKNOWN] = NAMED_REFERENCE + ' must be known'; MESSAGES[NUMERIC_DISALLOWED] = NUMERIC_REFERENCE + ' cannot be disallowed'; MESSAGES[NUMERIC_PROHIBITED] = NUMERIC_REFERENCE + ' cannot be outside the ' + 'permissible Unicode range'; /* * Characters. */ var REPLACEMENT = '\uFFFD'; var FORM_FEED = '\f'; var AMPERSAND = '&'; var OCTOTHORP = '#'; var SEMICOLON = ';'; var NEWLINE = '\n'; var X_LOWER = 'x'; var X_UPPER = 'X'; var SPACE = ' '; var LESS_THAN = '<'; var EQUAL = '='; var EMPTY = ''; var TAB = '\t'; /** * Get the character-code at the first indice in * `character`. * * @param {string} character - Value. * @return {number} - Character-code at the first indice * in `character`. */ function charCode(character) { return character.charCodeAt(0); } /** * Check whether `character` is a decimal. * * @param {string} character - Value. * @return {boolean} - Whether `character` is a decimal. */ function isDecimal(character) { var code = charCode(character); return code >= 48 /* 0 */ && code <= 57 /* 9 */; } /** * Check whether `character` is a hexadecimal. * * @param {string} character - Value. * @return {boolean} - Whether `character` is a * hexadecimal. */ function isHexadecimal(character) { var code = charCode(character); return (code >= 48 /* 0 */ && code <= 57 /* 9 */) || (code >= 65 /* A */ && code <= 70 /* F */) || (code >= 97 /* a */ && code <= 102 /* f */); } /** * Check whether `character` is an alphanumeric. * * @param {string} character - Value. * @return {boolean} - Whether `character` is an * alphanumeric. */ function isAlphanumeric(character) { var code = charCode(character); return (code >= 48 /* 0 */ && code <= 57 /* 9 */) || (code >= 65 /* A */ && code <= 90 /* Z */) || (code >= 97 /* a */ && code <= 122 /* z */); } /** * Check whether `character` is outside the permissible * unicode range. * * @param {number} characterCode - Value. * @return {boolean} - Whether `character` is an * outside the permissible unicode range. */ function isProhibited(characterCode) { return (characterCode >= 0xD800 && characterCode <= 0xDFFF) || (characterCode > 0x10FFFF); } /** * Check whether `character` is disallowed. * * @param {number} characterCode - Value. * @return {boolean} - Whether `character` is disallowed. */ function isWarning(characterCode) { return (characterCode >= 0x0001 && characterCode <= 0x0008) || (characterCode >= 0x000D && characterCode <= 0x001F) || (characterCode >= 0x007F && characterCode <= 0x009F) || (characterCode >= 0xFDD0 && characterCode <= 0xFDEF) || characterCode === 0x000B || characterCode === 0xFFFE || characterCode === 0xFFFF || characterCode === 0x1FFFE || characterCode === 0x1FFFF || characterCode === 0x2FFFE || characterCode === 0x2FFFF || characterCode === 0x3FFFE || characterCode === 0x3FFFF || characterCode === 0x4FFFE || characterCode === 0x4FFFF || characterCode === 0x5FFFE || characterCode === 0x5FFFF || characterCode === 0x6FFFE || characterCode === 0x6FFFF || characterCode === 0x7FFFE || characterCode === 0x7FFFF || characterCode === 0x8FFFE || characterCode === 0x8FFFF || characterCode === 0x9FFFE || characterCode === 0x9FFFF || characterCode === 0xAFFFE || characterCode === 0xAFFFF || characterCode === 0xBFFFE || characterCode === 0xBFFFF || characterCode === 0xCFFFE || characterCode === 0xCFFFF || characterCode === 0xDFFFE || characterCode === 0xDFFFF || characterCode === 0xEFFFE || characterCode === 0xEFFFF || characterCode === 0xFFFFE || characterCode === 0xFFFFF || characterCode === 0x10FFFE || characterCode === 0x10FFFF; } /* * Map of types to tests. Each type of character reference * accepts different characters. This test is used to * detect whether a reference has ended (as the semicolon * is not strictly needed). */ var TESTS = {}; TESTS[NAMED] = isAlphanumeric; TESTS[DECIMAL] = isDecimal; TESTS[HEXADECIMAL] = isHexadecimal; /** * Parse entities. * * @param {string} value - Value to tokenise. * @param {Object?} [settings] - Configuration. */ function parse(value, settings) { var additional = settings.additional; var handleText = settings.text; var handleReference = settings.reference; var handleWarning = settings.warning; var textContext = settings.textContext; var referenceContext = settings.referenceContext; var warningContext = settings.warningContext; var pos = settings.position; var indent = settings.indent || []; var length = value.length; var index = 0; var lines = -1; var column = pos.column || 1; var line = pos.line || 1; var queue = EMPTY; var result = []; var entityCharacters; var terminated; var characters; var character; var reference; var following; var warning; var reason; var output; var entity; var begin; var start; var type; var test; var prev; var next; var diff; var end; /** * Get current position. * * @return {Object} - Positional information of a * single point. */ function now() { return { 'line': line, 'column': column, 'offset': index + (pos.offset || 0) }; } /** * “Throw” a parse-error: a warning. * * @param {number} code - Identifier of reason for * failing. * @param {number} offset - Offset in characters from * the current position point at which the * parse-error ocurred, cannot point past newlines. */ function parseError(code, offset) { var position = now(); position.column += offset; position.offset += offset; handleWarning.call(warningContext, MESSAGES[code], position, code); } /** * Get character at position. * * @param {number} position - Indice of character in `value`. * @return {string} - Character at `position` in * `value`. */ function at(position) { return value.charAt(position); } /** * Flush `queue` (normal text). Macro invoked before * each entity and at the end of `value`. * * Does nothing when `queue` is empty. */ function flush() { if (queue) { result.push(queue); if (handleText) { handleText.call(textContext, queue, { 'start': prev, 'end': now() }); } queue = EMPTY; } } /* * Cache the current point. */ prev = now(); /* * Wrap `handleWarning`. */ warning = handleWarning ? parseError : noop; /* * Ensure the algorithm walks over the first character * and the end (inclusive). */ index--; length++; while (++index < length) { /* * If the previous character was a newline. */ if (character === NEWLINE) { column = indent[lines] || 1; } character = at(index); /* * Handle anything other than an ampersand, * including newlines and EOF. */ if (character !== AMPERSAND) { if (character === NEWLINE) { line++; lines++; column = 0; } if (character) { queue += character; column++; } else { flush(); } } else { following = at(index + 1); /* * The behaviour depends on the identity of the next character. */ if ( following === TAB || following === NEWLINE || following === FORM_FEED || following === SPACE || following === LESS_THAN || following === AMPERSAND || following === EMPTY || (additional && following === additional) ) { /* * Not a character reference. No characters * are consumed, and nothing is returned. * This is not an error, either. */ queue += character; column++; continue; } start = begin = end = index + 1; /* * Numerical entity. */ if (following !== OCTOTHORP) { type = NAMED; } else { end = ++begin; /* * The behaviour further depends on the * character after the U+0023 NUMBER SIGN. */ following = at(end); if (following === X_LOWER || following === X_UPPER) { /* * ASCII hex digits. */ type = HEXADECIMAL; end = ++begin; } else { /* * ASCII digits. */ type = DECIMAL; } } entityCharacters = entity = characters = EMPTY; test = TESTS[type]; end--; while (++end < length) { following = at(end); if (!test(following)) { break; } characters += following; /* * Check if we can match a legacy named * reference. If so, we cache that as the * last viable named reference. This * ensures we do not need to walk backwards * later. */ if ( type === NAMED && has.call(legacy, characters) ) { entityCharacters = characters; entity = legacy[characters]; } } terminated = at(end) === SEMICOLON; if (terminated) { end++; if ( type === NAMED && has.call(characterEntities, characters) ) { entityCharacters = characters; entity = characterEntities[characters]; } } diff = 1 + end - start; if (!characters) { /* * An empty (possible) entity is valid, unless * its numeric (thus an ampersand followed by * an octothorp). */ if (type !== NAMED) { warning(NUMERIC_EMPTY, diff); } } else if (type === NAMED) { /* * An ampersand followed by anything * unknown, and not terminated, is invalid. */ if (terminated && !entity) { warning(NAMED_UNKNOWN, 1); } else { /* * If theres something after an entity * name which is not known, cap the * reference. */ if (entityCharacters !== characters) { end = begin + entityCharacters.length; diff = 1 + end - begin; terminated = false; } /* * If the reference is not terminated, * warn. */ if (!terminated) { reason = entityCharacters ? NAMED_NOT_TERMINATED : NAMED_EMPTY; if (!settings.attribute) { warning(reason, diff); } else { following = at(end); if (following === EQUAL) { warning(reason, diff); entity = null; } else if (isAlphanumeric(following)) { entity = null; } else { warning(reason, diff); } } } } reference = entity; } else { if (!terminated) { /* * All non-terminated numeric entities are * not rendered, and trigger a warning. */ warning(NUMERIC_NOT_TERMINATED, diff); } /* * When terminated and number, parse as * either hexadecimal or decimal. */ reference = parseInt(characters, BASE[type]); /* * Trigger a warning when the parsed number * is prohibited, and replace with * replacement character. */ if (isProhibited(reference)) { warning(NUMERIC_PROHIBITED, diff); reference = REPLACEMENT; } else if (reference in invalid) { /* * Trigger a warning when the parsed number * is disallowed, and replace by an * alternative. */ warning(NUMERIC_DISALLOWED, diff); reference = invalid[reference]; } else { /* * Parse the number. */ output = EMPTY; /* * Trigger a warning when the parsed * number should not be used. */ if (isWarning(reference)) { warning(NUMERIC_DISALLOWED, diff); } /* * Stringify the number. */ if (reference > 0xFFFF) { reference -= 0x10000; output += fromCharCode( reference >>> 10 & 0x3FF | 0xD800 ); reference = 0xDC00 | reference & 0x3FF; } reference = output + fromCharCode(reference); } } /* * If we could not find a reference, queue the * checked characters (as normal characters), * and move the pointer to their end. This is * possible because we can be certain neither * newlines nor ampersands are included. */ if (!reference) { characters = value.slice(start - 1, end); queue += characters; column += characters.length; index = end - 1; } else { /* * Found it! First eat the queued * characters as normal text, then eat * an entity. */ flush(); prev = now(); index = end - 1; column += end - start + 1; result.push(reference); next = now(); next.offset++; if (handleReference) { handleReference.call(referenceContext, reference, { 'start': prev, 'end': next }, value.slice(start - 1, end)); } prev = next; } } } /* * Return the reduced nodes, and any possible warnings. */ return result.join(EMPTY); } var defaults = { 'warning': null, 'reference': null, 'text': null, 'warningContext': null, 'referenceContext': null, 'textContext': null, 'position': {}, 'additional': null, 'attribute': false }; /** * Wrap to ensure clean parameters are given to `parse`. * * @param {string} value - Value with entities. * @param {Object?} [options] - Configuration. */ function wrapper(value, options) { var settings = {}; var key; if (!options) { options = {}; } for (key in defaults) { settings[key] = options[key] || defaults[key]; } if (settings.position.indent || settings.position.start) { settings.indent = settings.position.indent || []; settings.position = settings.position.start; } return parse(value, settings); } /* * Expose. */ module.exports = wrapper; },{"character-entities":75,"character-entities-legacy":73,"character-reference-invalid":77}],290:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // resolves . and .. elements in a path array with directory names there // must be no slashes, empty elements, or device names (c:\) in the array // (so also no leading and trailing slashes - it does not distinguish // relative and absolute paths) function normalizeArray(parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === '.') { parts.splice(i, 1); } else if (last === '..') { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up--; up) { parts.unshift('..'); } } return parts; } // Split a filename into [root, dir, basename, ext], unix version // 'root' is just a slash, or nothing. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; var splitPath = function(filename) { return splitPathRe.exec(filename).slice(1); }; // path.resolve([from ...], to) // posix version exports.resolve = function() { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : process.cwd(); // Skip empty and invalid entries if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings'); } else if (!path) { continue; } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) // Normalize the path resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; }; // path.normalize(path) // posix version exports.normalize = function(path) { var isAbsolute = exports.isAbsolute(path), trailingSlash = substr(path, -1) === '/'; // Normalize the path path = normalizeArray(filter(path.split('/'), function(p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; }; // posix version exports.isAbsolute = function(path) { return path.charAt(0) === '/'; }; // posix version exports.join = function() { var paths = Array.prototype.slice.call(arguments, 0); return exports.normalize(filter(paths, function(p, index) { if (typeof p !== 'string') { throw new TypeError('Arguments to path.join must be strings'); } return p; }).join('/')); }; // path.relative(from, to) // posix version exports.relative = function(from, to) { from = exports.resolve(from).substr(1); to = exports.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== '') break; } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== '') break; } if (start > end) return []; return arr.slice(start, end - start + 1); } var fromParts = trim(from.split('/')); var toParts = trim(to.split('/')); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break; } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push('..'); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/'); }; exports.sep = '/'; exports.delimiter = ':'; exports.dirname = function(path) { var result = splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { // No dirname whatsoever return '.'; } if (dir) { // It has a dirname, strip trailing slash dir = dir.substr(0, dir.length - 1); } return root + dir; }; exports.basename = function(path, ext) { var f = splitPath(path)[2]; // TODO: make this comparison case-insensitive on windows? if (ext && f.substr(-1 * ext.length) === ext) { f = f.substr(0, f.length - ext.length); } return f; }; exports.extname = function(path) { return splitPath(path)[3]; }; function filter (xs, f) { if (xs.filter) return xs.filter(f); var res = []; for (var i = 0; i < xs.length; i++) { if (f(xs[i], i, xs)) res.push(xs[i]); } return res; } // String.prototype.substr - negative index don't work in IE8 var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) { return str.substr(start, len) } : function (str, start, len) { if (start < 0) start = str.length + start; return str.substr(start, len); } ; }).call(this,require('_process')) },{"_process":295}],291:[function(require,module,exports){ (function (process){ 'use strict'; function posix(path) { return path.charAt(0) === '/'; }; function win32(path) { // https://github.com/joyent/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; var result = splitDeviceRe.exec(path); var device = result[1] || ''; var isUnc = !!device && device.charAt(1) !== ':'; // UNC paths are always absolute return !!result[2] || isUnc; }; module.exports = process.platform === 'win32' ? win32 : posix; module.exports.posix = posix; module.exports.win32 = win32; }).call(this,require('_process')) },{"_process":295}],292:[function(require,module,exports){ (function (Buffer){ var createHmac = require('create-hmac') var MAX_ALLOC = Math.pow(2, 30) - 1 // default in iojs exports.pbkdf2 = pbkdf2 function pbkdf2 (password, salt, iterations, keylen, digest, callback) { if (typeof digest === 'function') { callback = digest digest = undefined } if (typeof callback !== 'function') { throw new Error('No callback provided to pbkdf2') } var result = pbkdf2Sync(password, salt, iterations, keylen, digest) setTimeout(function () { callback(undefined, result) }) } exports.pbkdf2Sync = pbkdf2Sync function pbkdf2Sync (password, salt, iterations, keylen, digest) { if (typeof iterations !== 'number') { throw new TypeError('Iterations not a number') } if (iterations < 0) { throw new TypeError('Bad iterations') } if (typeof keylen !== 'number') { throw new TypeError('Key length not a number') } if (keylen < 0 || keylen > MAX_ALLOC) { throw new TypeError('Bad key length') } digest = digest || 'sha1' if (!Buffer.isBuffer(password)) password = new Buffer(password, 'binary') if (!Buffer.isBuffer(salt)) salt = new Buffer(salt, 'binary') var hLen var l = 1 var DK = new Buffer(keylen) var block1 = new Buffer(salt.length + 4) salt.copy(block1, 0, 0, salt.length) var r var T for (var i = 1; i <= l; i++) { block1.writeUInt32BE(i, salt.length) var U = createHmac(digest, password).update(block1).digest() if (!hLen) { hLen = U.length T = new Buffer(hLen) l = Math.ceil(keylen / hLen) r = keylen - (l - 1) * hLen } U.copy(T, 0, 0, hLen) for (var j = 1; j < iterations; j++) { U = createHmac(digest, password).update(U).digest() for (var k = 0; k < hLen; k++) { T[k] ^= U[k] } } var destPos = (i - 1) * hLen var len = (i === l ? r : hLen) T.copy(DK, destPos, 0, len) } return DK } }).call(this,require("buffer").Buffer) },{"buffer":61,"create-hmac":109}],293:[function(require,module,exports){ (function (Buffer){ var sodium = require('chloride') var crypto = require('crypto') var scalarmult = sodium.crypto_scalarmult var box = sodium.crypto_box_easy var secretbox = sodium.crypto_secretbox_easy var secretbox_open = sodium.crypto_secretbox_open_easy var keypair = sodium.crypto_box_keypair var concat = Buffer.concat function randombytes(n) { return crypto.randomBytes(n) } const MAX = 7 exports.multibox = function (msg, recipients) { if(recipients.length > MAX) throw new Error('max recipients is:'+MAX+' found:'+recipients.length) var nonce = randombytes(24) var key = randombytes(32) var onetime = keypair() var _key = concat([new Buffer([recipients.length & MAX]), key]) return concat([ nonce, onetime.publicKey, concat(recipients.map(function (r_pk, i) { return secretbox(_key, nonce, scalarmult(onetime.secretKey, r_pk)) })), secretbox(msg, nonce, key) ]) } function get_key(ctxt, my_key) { } exports.multibox_open = function (ctxt, sk) { //, groups... var nonce = ctxt.slice(0, 24) var onetime_pk = ctxt.slice(24, 24+32) var my_key = scalarmult(sk, onetime_pk) var _key, key, length, start = 24+32, size = 32+1+16 for(var i = 0; i <= MAX; i++) { var s = start+size*i if(s + size > (ctxt.length - 16)) continue _key = secretbox_open(ctxt.slice(s, s + size), nonce, my_key) if(_key) { length = _key[0] key = _key.slice(1) continue } } if(!key) return return secretbox_open(ctxt.slice(start+length*size), nonce, key) } }).call(this,require("buffer").Buffer) },{"buffer":61,"chloride":80,"crypto":110}],294:[function(require,module,exports){ (function (process){ 'use strict'; if (!process.version || process.version.indexOf('v0.') === 0 || process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { module.exports = nextTick; } else { module.exports = process.nextTick; } function nextTick(fn) { var args = new Array(arguments.length - 1); var i = 0; while (i < args.length) { args[i++] = arguments[i]; } process.nextTick(function afterTick() { fn.apply(null, args); }); } }).call(this,require('_process')) },{"_process":295}],295:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = setTimeout(cleanUpNextTick); draining = true; var len = queue.length; while(len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; clearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { setTimeout(drainQueue, 0); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; },{}],296:[function(require,module,exports){ arguments[4][196][0].apply(exports,arguments) },{"dup":196}],297:[function(require,module,exports){ exports.publicEncrypt = require('./publicEncrypt'); exports.privateDecrypt = require('./privateDecrypt'); exports.privateEncrypt = function privateEncrypt(key, buf) { return exports.publicEncrypt(key, buf, true); }; exports.publicDecrypt = function publicDecrypt(key, buf) { return exports.privateDecrypt(key, buf, true); }; },{"./privateDecrypt":299,"./publicEncrypt":300}],298:[function(require,module,exports){ (function (Buffer){ var createHash = require('create-hash'); module.exports = function (seed, len) { var t = new Buffer(''); var i = 0, c; while (t.length < len) { c = i2ops(i++); t = Buffer.concat([t, createHash('sha1').update(seed).update(c).digest()]); } return t.slice(0, len); }; function i2ops(c) { var out = new Buffer(4); out.writeUInt32BE(c,0); return out; } }).call(this,require("buffer").Buffer) },{"buffer":61,"create-hash":106}],299:[function(require,module,exports){ (function (Buffer){ var parseKeys = require('parse-asn1'); var mgf = require('./mgf'); var xor = require('./xor'); var bn = require('bn.js'); var crt = require('browserify-rsa'); var createHash = require('create-hash'); var withPublic = require('./withPublic'); module.exports = function privateDecrypt(private_key, enc, reverse) { var padding; if (private_key.padding) { padding = private_key.padding; } else if (reverse) { padding = 1; } else { padding = 4; } var key = parseKeys(private_key); var k = key.modulus.byteLength(); if (enc.length > k || new bn(enc).cmp(key.modulus) >= 0) { throw new Error('decryption error'); } var msg; if (reverse) { msg = withPublic(new bn(enc), key); } else { msg = crt(enc, key); } var zBuffer = new Buffer(k - msg.length); zBuffer.fill(0); msg = Buffer.concat([zBuffer, msg], k); if (padding === 4) { return oaep(key, msg); } else if (padding === 1) { return pkcs1(key, msg, reverse); } else if (padding === 3) { return msg; } else { throw new Error('unknown padding'); } }; function oaep(key, msg){ var n = key.modulus; var k = key.modulus.byteLength(); var mLen = msg.length; var iHash = createHash('sha1').update(new Buffer('')).digest(); var hLen = iHash.length; var hLen2 = 2 * hLen; if (msg[0] !== 0) { throw new Error('decryption error'); } var maskedSeed = msg.slice(1, hLen + 1); var maskedDb = msg.slice(hLen + 1); var seed = xor(maskedSeed, mgf(maskedDb, hLen)); var db = xor(maskedDb, mgf(seed, k - hLen - 1)); if (compare(iHash, db.slice(0, hLen))) { throw new Error('decryption error'); } var i = hLen; while (db[i] === 0) { i++; } if (db[i++] !== 1) { throw new Error('decryption error'); } return db.slice(i); } function pkcs1(key, msg, reverse){ var p1 = msg.slice(0, 2); var i = 2; var status = 0; while (msg[i++] !== 0) { if (i >= msg.length) { status++; break; } } var ps = msg.slice(2, i - 1); var p2 = msg.slice(i - 1, i); if ((p1.toString('hex') !== '0002' && !reverse) || (p1.toString('hex') !== '0001' && reverse)){ status++; } if (ps.length < 8) { status++; } if (status) { throw new Error('decryption error'); } return msg.slice(i); } function compare(a, b){ a = new Buffer(a); b = new Buffer(b); var dif = 0; var len = a.length; if (a.length !== b.length) { dif++; len = Math.min(a.length, b.length); } var i = -1; while (++i < len) { dif += (a[i] ^ b[i]); } return dif; } }).call(this,require("buffer").Buffer) },{"./mgf":298,"./withPublic":301,"./xor":302,"bn.js":29,"browserify-rsa":52,"buffer":61,"create-hash":106,"parse-asn1":288}],300:[function(require,module,exports){ (function (Buffer){ var parseKeys = require('parse-asn1'); var randomBytes = require('randombytes'); var createHash = require('create-hash'); var mgf = require('./mgf'); var xor = require('./xor'); var bn = require('bn.js'); var withPublic = require('./withPublic'); var crt = require('browserify-rsa'); var constants = { RSA_PKCS1_OAEP_PADDING: 4, RSA_PKCS1_PADDIN: 1, RSA_NO_PADDING: 3 }; module.exports = function publicEncrypt(public_key, msg, reverse) { var padding; if (public_key.padding) { padding = public_key.padding; } else if (reverse) { padding = 1; } else { padding = 4; } var key = parseKeys(public_key); var paddedMsg; if (padding === 4) { paddedMsg = oaep(key, msg); } else if (padding === 1) { paddedMsg = pkcs1(key, msg, reverse); } else if (padding === 3) { paddedMsg = new bn(msg); if (paddedMsg.cmp(key.modulus) >= 0) { throw new Error('data too long for modulus'); } } else { throw new Error('unknown padding'); } if (reverse) { return crt(paddedMsg, key); } else { return withPublic(paddedMsg, key); } }; function oaep(key, msg){ var k = key.modulus.byteLength(); var mLen = msg.length; var iHash = createHash('sha1').update(new Buffer('')).digest(); var hLen = iHash.length; var hLen2 = 2 * hLen; if (mLen > k - hLen2 - 2) { throw new Error('message too long'); } var ps = new Buffer(k - mLen - hLen2 - 2); ps.fill(0); var dblen = k - hLen - 1; var seed = randomBytes(hLen); var maskedDb = xor(Buffer.concat([iHash, ps, new Buffer([1]), msg], dblen), mgf(seed, dblen)); var maskedSeed = xor(seed, mgf(maskedDb, hLen)); return new bn(Buffer.concat([new Buffer([0]), maskedSeed, maskedDb], k)); } function pkcs1(key, msg, reverse){ var mLen = msg.length; var k = key.modulus.byteLength(); if (mLen > k - 11) { throw new Error('message too long'); } var ps; if (reverse) { ps = new Buffer(k - mLen - 3); ps.fill(0xff); } else { ps = nonZero(k - mLen - 3); } return new bn(Buffer.concat([new Buffer([0, reverse?1:2]), ps, new Buffer([0]), msg], k)); } function nonZero(len, crypto) { var out = new Buffer(len); var i = 0; var cache = randomBytes(len*2); var cur = 0; var num; while (i < len) { if (cur === cache.length) { cache = randomBytes(len*2); cur = 0; } num = cache[cur++]; if (num) { out[i++] = num; } } return out; } }).call(this,require("buffer").Buffer) },{"./mgf":298,"./withPublic":301,"./xor":302,"bn.js":29,"browserify-rsa":52,"buffer":61,"create-hash":106,"parse-asn1":288,"randombytes":403}],301:[function(require,module,exports){ (function (Buffer){ var bn = require('bn.js'); function withPublic(paddedMsg, key) { return new Buffer(paddedMsg .toRed(bn.mont(key.modulus)) .redPow(new bn(key.publicExponent)) .fromRed() .toArray()); } module.exports = withPublic; }).call(this,require("buffer").Buffer) },{"bn.js":29,"buffer":61}],302:[function(require,module,exports){ module.exports = function xor(a, b) { var len = a.length; var i = -1; while (++i < len) { a[i] ^= b[i]; } return a }; },{}],303:[function(require,module,exports){ function abortable(onEnd) { var aborted = false, reading = false, ended = false, _cb, _read function terminate (err) { if(onEnd) onEnd(ended === true ? null : ended) var cb = _cb; _cb = null if(cb) cb(ended) } function cancel () { ended = ended || true terminate(aborted || ended) _read(aborted, function (err) { if(_cb) _cb(err) }) } function reader (read) { _read = read return function (abort, cb) { _cb = cb if(abort) aborted = abort if(ended) return cb(ended) if(aborted) return reading = true read(abort, function (end, data) { reading = false if(aborted) return !abort && read(aborted, function () {}) if(!_cb) return var cb = _cb _cb = null if(end) { ended = end onEnd && onEnd(ended === true ? null : ended) cb(end) } else { cb(end, data) } }) } } reader.abort = function () { aborted = true if(ended) return cancel() } return reader } module.exports = abortable },{}],304:[function(require,module,exports){ (function (Buffer){ 'use strict' var sodium = require('chloride') var Reader = require('pull-reader') var increment = require('increment-buffer') var through = require('pull-through') var split = require('split-buffer') var isBuffer = Buffer.isBuffer var concat = Buffer.concat var box = sodium.crypto_secretbox_easy var unbox = sodium.crypto_secretbox_open_easy function unbox_detached (mac, boxed, nonce, key) { return sodium.crypto_secretbox_open_easy(concat([mac, boxed]), nonce, key) } var max = 1024*4 var NONCE_LEN = 24 var HEADER_LEN = 2+16+16 function isZeros(b) { for(var i = 0; i < b.length; i++) if(b[i] !== 0) return false return true } function randomSecret(n) { var rand = new Buffer(n) sodium.randombytes(rand) return rand } function copy (a) { var b = new Buffer(a.length) a.copy(b, 0, 0, a.length) return b } exports.createBoxStream = exports.createEncryptStream = function (key, init_nonce) { if(key.length === 56) { init_nonce = key.slice(32, 56) key = key.slice(0, 32) } else if(!(key.length === 32 && init_nonce.length === 24)) throw new Error('nonce must be 24 bytes') // we need two nonces because increment mutates, // and we need the next for the header, // and the next next nonce for the packet var nonce1 = copy(init_nonce), nonce2 = copy(init_nonce) var head = new Buffer(18) return through(function (data) { if('string' === typeof data) data = new Buffer(data, 'utf8') else if(!isBuffer(data)) return this.emit('error', new Error('must be buffer')) if(data.length === 0) return var input = split(data, max) for(var i = 0; i < input.length; i++) { head.writeUInt16BE(input[i].length, 0) var boxed = box(input[i], increment(nonce2), key) //write the mac into the header. boxed.copy(head, 2, 0, 16) this.queue(box(head, nonce1, key)) this.queue(boxed.slice(16, 16 + input[i].length)) increment(increment(nonce1)); increment(nonce2) } }, function (err) { if(err) return this.queue(null) //handle special-case of empty session //final header is same length as header except all zeros (inside box) var final = new Buffer(2+16); final.fill(0) this.queue(box(final, nonce1, key)) this.queue(null) }) } exports.createUnboxStream = exports.createDecryptStream = function (key, nonce) { if(key.length == 56) { nonce = key.slice(32, 56) key = key.slice(0, 32) } else if(!(key.length === 32 && nonce.length === 24)) throw new Error('nonce must be 24 bytes') var reader = Reader(), first = true, ended var first = true return function (read) { reader(read) return function (end, cb) { if(end) return reader.abort(end, cb) //use abort when the input was invalid, //but the source hasn't actually ended yet. function abort(err) { reader.abort(ended = err || true, cb) } if(ended) return cb(ended) reader.read(HEADER_LEN, function (err, cipherheader) { if(err === true) return cb(ended = new Error('unexpected hangup')) if(err) return cb(ended = err) var header = unbox(cipherheader, nonce, key) if(!header) return abort(new Error('invalid header')) //valid end of stream if(isZeros(header)) return cb(ended = true) var length = header.readUInt16BE(0) var mac = header.slice(2, 34) reader.read(length, function (err, cipherpacket) { if(err) return cb(ended = err) //recreate a valid packet //TODO: PR to sodium bindings for detached box/open var plainpacket = unbox_detached(mac, cipherpacket, increment(nonce), key) if(!plainpacket) return abort(new Error('invalid packet')) increment(nonce) cb(null, plainpacket) }) }) } } } }).call(this,require("buffer").Buffer) },{"buffer":61,"chloride":80,"increment-buffer":164,"pull-reader":372,"pull-through":386,"split-buffer":516}],305:[function(require,module,exports){ var noop = function () {} function abortAll(ary, abort, cb) { var n = ary.length if(!n) return cb(abort) ary.forEach(function (f) { if(f) f(abort, next) else next() }) function next() { if(--n) return cb(abort) } if(!n) next() } module.exports = function (streams) { return function (abort, cb) { ;(function next () { if(abort) abortAll(streams, abort, cb) else if(!streams.length) cb(true) else if(!streams[0]) streams.shift(), next() else streams[0](null, function (err, data) { if(err) { streams.shift() //drop the first, has already ended. if(err === true) next() else abortAll(streams, err, cb) } else cb(null, data) }) })() } } },{}],306:[function(require,module,exports){ exports.id = function (item) { return item } exports.prop = function (map) { if('string' == typeof map) { var key = map return function (data) { return data[key] } } return map } exports.tester = function (test) { if(!test) return exports.id if('object' === typeof test && 'function' === typeof test.test) return test.test.bind(test) return exports.prop(test) || exports.id } exports.addPipe = addPipe function addPipe(read) { if('function' !== typeof read) return read read.pipe = read.pipe || function (reader) { if('function' != typeof reader && 'function' != typeof reader.sink) throw new Error('must pipe to reader') var pipe = addPipe(reader.sink ? reader.sink(read) : reader(read)) return reader.source || pipe; } read.type = 'Source' return read } var Source = exports.Source = function Source (createRead) { function s() { var args = [].slice.call(arguments) return addPipe(createRead.apply(null, args)) } s.type = 'Source' return s } var Through = exports.Through = function (createRead) { return function () { var args = [].slice.call(arguments) var piped = [] function reader (read) { args.unshift(read) read = createRead.apply(null, args) while(piped.length) read = piped.shift()(read) return read //pipeing to from this reader should compose... } reader.pipe = function (read) { piped.push(read) if(read.type === 'Source') throw new Error('cannot pipe ' + reader.type + ' to Source') reader.type = read.type === 'Sink' ? 'Sink' : 'Through' return reader } reader.type = 'Through' return reader } } var Sink = exports.Sink = function Sink(createReader) { return function () { var args = [].slice.call(arguments) if(!createReader) throw new Error('must be createReader function') function s (read) { args.unshift(read) return createReader.apply(null, args) } s.type = 'Sink' return s } } exports.maybeSink = exports.maybeDrain = function (createSink, cb) { if(!cb) return Through(function (read) { var ended return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) createSink(function (err, data) { ended = err || true if(!err) cb(null, data) else cb(ended) }) (read) } })() return Sink(function (read) { return createSink(cb) (read) })() } },{}],307:[function(require,module,exports){ var Source = require('./source') var Sink = require('./sink') module.exports = function () { var source = Source() var sink = Sink() return { source: source, sink: sink, resolve: function (duplex) { source.resolve(duplex.source) sink.resolve(duplex.sink) } } } },{"./sink":309,"./source":310}],308:[function(require,module,exports){ exports.source = require('./source') exports.through = require('./through') exports.sink = require('./sink') exports.duplex = require('./duplex') },{"./duplex":307,"./sink":309,"./source":310,"./through":311}],309:[function(require,module,exports){ module.exports = function (stream) { var read, started = false, id = Math.random() function consume (_read) { if(!_read) throw new Error('must be passed a readable') read = _read if(started) stream(read) } consume.resolve = consume.ready = consume.start = function (_stream) { started = true; stream = _stream || stream if(read) stream(read) return consume } return consume } },{}],310:[function(require,module,exports){ module.exports = function () { var _read, _cb, abortCb, _end var read = function (end, cb) { if(!_read) { if(end) { _end = end abortCb = cb } else _cb = cb } else _read(end, cb) } read.resolve = function (read) { if(_read) throw new Error('already resolved') _read = read if(!_read) throw new Error('no read cannot resolve!' + _read) if(_cb) read(null, _cb) if(abortCb) read(_end, abortCb) } read.abort = function(err) { read.resolve(function (_, cb) { cb(err || true) }) } return read } },{}],311:[function(require,module,exports){ module.exports = function () { var read, reader, cb, abort, stream function delayed (_read) { //if we already have the stream, go! if(stream) return stream(_read) read = _read return function (_abort, _cb) { if(reader) reader(_abort, _cb) else abort = _abort, cb = _cb } } delayed.resolve = function (_stream) { if(stream) throw new Error('already resolved') stream = _stream if(!stream) throw new Error('resolve *must* be passed a transform stream') if(read) { reader = stream(read) if(cb) reader(abort, cb) } } return delayed } },{}],312:[function(require,module,exports){ (function (Buffer){ /* jshint node: true */ 'use strict'; var fs = require('fs'); var Decoder = require('pull-utf8-decoder') /** # pull-file This is a simple module which uses raw file reading methods available in the node `fs` module to read files on-demand. It's a work in progress and feedback is welcome :) ## Example Usage <<< examples/ipsum-chunks.js **/ module.exports = function(filename, opts) { var mode = opts && opts.mode || 0x1B6; // 0666 var bufferSize = opts && opts.bufferSize || 1024*64; var start = opts && opts.start || 0 var end = opts && opts.end || Number.MAX_SAFE_INTEGER var fd = opts && opts.fd var ended, closeNext, busy, _cb; var _buffer = new Buffer(bufferSize) var flags = opts && opts.flags || 'r' function readNext(cb) { if(closeNext) return close(cb) var toRead = Math.min(end - start, bufferSize); busy = true fs.read( fd, _buffer, 0, toRead, start, function(err, count, buffer) { busy = false start += count; // if we have received an end noticiation, just discard this data if(closeNext) { close(_cb) return cb(closeNext) } if (ended) { return cb(err || ended); } // if we encountered a read error pass it on if (err) { return cb(err); } if(count === buffer.length) { cb(null, buffer); } else { closeNext = true; cb(null, buffer.slice(0, count)); } } ); _buffer = new Buffer(Math.min(end - start, bufferSize)) } function open(cb) { busy = true fs.open(filename, flags, mode, function(err, descriptor) { // save the file descriptor fd = descriptor; busy = false if(closeNext) { close(_cb) return cb(closeNext) } if (err) { return cb(err); } // read the next bytes return readNext(cb); }); } function close (cb) { //if auto close is disabled, then user manages fd. if(opts && opts.autoClose === false) return cb(true) //wait until we have got out of bed, then go back to bed. //or if we are reading, wait till we read, then go back to bed. else if(busy) { _cb = cb return closeNext = true } //first read was close, don't even get out of bed. else if(!fd) { return cb(true) } //go back to bed else { fs.close(fd, function(err) { fd = null; cb(err || true); }); } } function source (end, cb) { if (end) { ended = end; close(cb); } // if we have already received the end notification, abort further else if (ended) { cb(ended) } else if (! fd) { open(cb); } else readNext(cb); }; //read directly to text if(opts && opts.encoding) return Decoder(opts.encoding)(source) return source }; }).call(this,require("buffer").Buffer) },{"buffer":61,"fs":58,"pull-utf8-decoder":389}],313:[function(require,module,exports){ var pull = require('pull-stream') var fs = require('fs') var path = require('path') var Read = require('pull-file') var Write = require('pull-write-file') var readdir = exports.readdir = function (dir, match, ignore) { var ls, ended = false match = ( !match ? null : 'function' === typeof match ? match : 'function' === typeof match.test ? match.test.bind(match) : null ) return function (abort, cb) { if(ended || abort) { cb(ended = ended || abort) } else if(!ls) fs.readdir(dir, function (err, _ls) { if(err && err.code == 'ENOTDIR') cb(ended = true) else if(err) cb(ended = err) else if(!_ls.length) cb(ended = true) else { if(match) _ls = _ls.filter(match) ls = _ls.map(function (f) { return path.resolve(dir, f) }) if(ls.length) cb(null, ls.shift()) else cb(true) } }) else if(!ls.length) cb(ended = true) else cb(null, ls.shift()) } } var blocksize = 512 var read = exports.read = Read var write = exports.write = Write var exists = exports.exists = function (test) { test = test || function (e) { return !!e } return pull( pull.asyncMap(function (e, cb) { fs.stat(e, function (err, stat) { if(stat && test(stat)) cb(null, e) else cb(null, null) }) }), pull.filter(Boolean) ) } function testStat(test) { return function () { return exists(test) } } var isFile = exports.isFile = testStat(function (e) { return e.isFile() }) var isDirectory = exports.isDirectory = testStat(function (e) { return e.isDirectory() }) var isBlockDevice = exports.isBlockDevice = testStat(function (e) { return e.isBlockDevice() }) var isCharacterDevice = exports.isCharacterDevice = testStat(function (e) { return e.isCharacterDevice() }) var isSymbolicLink = exports.isSymbolicLink = testStat(function (e) { return e.isSymbolicLink() }) var isFIFO = exports.isFIFO = testStat(function (e) { return e.isFIFO() }) var isSocket = exports.isSocket = testStat(function (e) { return e.isSocket() }) },{"fs":58,"path":290,"pull-file":312,"pull-stream":315,"pull-write-file":392}],314:[function(require,module,exports){ var core = require('./core') var util = require('./util') for(var k in core) exports[k] = core[k] for(var k in util) exports[k] = util[k] },{"./core":313,"./util":320}],315:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":316,"./sinks":317,"./sources":318,"./throughs":319,"dup":232}],316:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],317:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],318:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],319:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":317,"./sources":318,"dup":236}],320:[function(require,module,exports){ (function (process){ var path = require('path') var pull = require('pull-stream') var core = require('./core') var fs = require('fs') var DepthFirst = require('pull-traverse').depthFirst var ancestors = exports.ancestors = function (dir) { dir = dir || process.cwd() var paths = [] while(dir) { paths.push(dir) dir = path.dirname(dir) if(dir === '/') { paths.push(dir) break } } return pull.values(paths) } var star = exports.star = function (match) { return pull( pull.map(function (dir) { return core.readdir(dir, match) }), pull.flatten(), pull.filter() ) } var starStar = exports.starStar = function (match) { var seen = {} return pull( pull.map(function (dir) { var first = true return DepthFirst(path.resolve(dir), function (_dir) { return pull( core.readdir(_dir, match, true), pull.filter(function (e) { if(seen[e]) return false return seen[e] = true }) ) }) }), pull.flatten(), pull.filter() ) } var resolve = exports.resolve = function (rel) { return pull.map(function (dir) { //map to $dir/node_modules if(rel) return path.resolve(dir, rel) return path.resolve(dir) }) } var relative = exports.relative = function (rel) { rel = rel || process.cwd() return pull.map(function (file) { return path.relative(rel, file) }) } var absolute = exports.absolute = function () { return resolve() } var readFile = exports.readFile = function (parse) { return pull.asyncMap(function (file, cb) { fs.readFile(file, 'utf-8', function (err, data) { if(err) return cb(err) try { data = parse ? parse(data) : data } catch (err) { return cb(err) } return cb(null, data) }) }) } if(!module.parent) { pull( pull.values(['.']), starStar(), pull.drain(console.log) ) } }).call(this,require('_process')) },{"./core":313,"_process":295,"fs":58,"path":290,"pull-stream":315,"pull-traverse":388}],321:[function(require,module,exports){ (function (process){ var pfs = require('pull-fs') var pull = require('pull-stream') var path = require('path') var glob = module.exports = function (x) { var rest = path.normalize(x).split('/') var stream var pipe = [] if(rest[0] == '...') { pipe.push(pfs.ancestors()) rest.shift() } else if(rest[0] === '~' || rest[0] === '') { pipe.push(pull.values([rest.shift() ? process.env.HOME : '/'])) } else { pipe.push(pull.values(['.'])) } //this should be tidied up. //need a more betterer glob parser //that handles escapes... rest.forEach(function (e) { if('**' === e) { pipe.push(pfs.starStar()) } else if(/[*?{}]/.test(e)) { //literal e = e .split('.').join('\\.') .split('?').join('.') .split(/({.*?})/).map(function (e, i) { if(i % 2) return e.replace('{', '(?:') .replace('}', ')') .split(',').join('|') return e }).join('') var x = new RegExp('^'+e.split('*').join('.*')+'$') pipe.push(pfs.star(x)) } else if(e === '') //will only happen in the last position //if you do */ pipe.push(pfs.isDirectory()) else pipe.push(pull(pfs.resolve(e), pfs.exists())) }) return pull.apply(null, pipe) } }).call(this,require('_process')) },{"_process":295,"path":290,"pull-fs":314,"pull-stream":322}],322:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":323,"./sinks":324,"./sources":325,"./throughs":326,"dup":232}],323:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],324:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],325:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],326:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":324,"./sources":325,"dup":236}],327:[function(require,module,exports){ module.exports = function endable (goodbye) { var ended, waiting, sentEnd function h (read) { return function (abort, cb) { read(abort, function (end, data) { if(end && !sentEnd) { sentEnd = true return cb(null, goodbye) } //send end message... if(end && ended) cb(end) else if(end) waiting = cb else cb(null, data) }) } } h.end = function () { ended = true if(waiting) waiting(ended) return h } return h } },{}],328:[function(require,module,exports){ var endable = require('./endable') var pull = require('pull-stream') module.exports = function (stream, goodbye) { goodbye = goodbye || 'GOODBYE' var e = endable(goodbye) return { // when the source ends, // send the goodbye and then wait to recieve // the other goodbye. source: pull(stream.source, e), sink: pull( //when the goodbye is received, allow the source to end. pull.filter(function (data) { if(data !== goodbye) return true e.end() }), stream.sink ) } } },{"./endable":327,"pull-stream":381}],329:[function(require,module,exports){ var Reader = require('pull-reader') var pull = require('pull-stream') var deferred = require('pull-defer') var Writer = require('pull-pushable') var cat = require('pull-cat') var pair = require('pull-pair') function once (cb) { var called = 0 return function (a, b, c) { if(called++) return cb(a, b, c) } } function isFunction (f) { return 'function' === typeof f } module.exports = function (opts, _cb) { if(isFunction(opts)) _cb = opts, opts = {} _cb = once(_cb) var reader = Reader(opts && opts.timeout || 5e3) var writer = Writer(function (err) { if(err) _cb(err) }) var source = deferred.source() var p = pair() return { handshake: { read: reader.read, abort: function (err) { writer.end(err) reader.abort(err, function (err) { }) _cb(err) }, write: writer.push, rest: function () { writer.end() return { source: reader.read(), sink: p.sink } } }, sink: reader, source: cat([writer, p.source]) } } },{"pull-cat":305,"pull-defer":308,"pull-pair":362,"pull-pushable":370,"pull-reader":372,"pull-stream":330}],330:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":331,"./sinks":332,"./sources":333,"./throughs":334,"dup":232}],331:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],332:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],333:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],334:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":332,"./sources":333,"dup":236}],335:[function(require,module,exports){ (function (Buffer){ var pull = require('pull-stream') var mns = require('./magic-numbers') module.exports = function (cb) { var done = false return pull.through(function (buf) { if (done) return done = true if (!Buffer.isBuffer(buf)) return cb(false) // compare the first bytes against the magic numbers var hex = buf.slice(0, (buf.length > 10) ? 10 : buf.length).toString('hex') for (var magicNumber in mns) { if (hex.indexOf(magicNumber) === 0) return cb(mns[magicNumber]) } // convert to string, check the plaintext types var asStr = buf.slice(0, (buf.length > 512) ? 512 : buf.length).toString('utf-8') if (asStr.indexOf('= highWaterMark) return reading = true return read(ended || ending, function (end, data) { reading = false ending = ending || end if(data != null) buffer.push(data) next(); readAhead() }) } process.nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } var flatMap = exports.flatMap = function (read, mapper) { mapper = mapper || id var queue = [], ended return function (abort, cb) { if(queue.length) return cb(null, queue.shift()) else if(ended) return cb(ended) read(abort, function next (end, data) { if(end) ended = end else { var add = mapper(data) while(add && add.length) queue.push(add.shift()) } if(queue.length) cb(null, queue.shift()) else if(ended) cb(ended) else read(null, next) }) } } }).call(this,require('_process')) },{"./sinks":340,"./sources":341,"_process":295,"pull-core":306}],343:[function(require,module,exports){ var pull = require('pull-stream') function rate (s) { var recent = [] var stream = pull.through(function (d) { stream.ts = Date.now() recent.push({size: d.length, ts: stream.ts}) if(recent.length > 5) recent.shift() }) stream.ts = Date.now() stream.rate = function () { var ts = Date.now() if(recent.length > 1) { var rate = (recent.reduce(function (size, item) { return size + item.size }, 0)/1000000) / ((ts - recent[0].ts)/1000) return rate } } return stream } module.exports = rate },{"pull-stream":338}],344:[function(require,module,exports){ var pull = require('pull-stream') var toPull = require('stream-to-pull-stream') var pushable = require('pull-pushable') var cat = require('pull-cat') var pw = require('pull-window') var post = require('level-post') function read(db, opts) { return toPull.read1(db.createReadStream(opts)) } var live = exports.live = function (db, opts) { opts = opts || {} var l = pushable() var cleanup = post(db, opts, function (ch) { if(opts.keys === false) l.push(ch.value) else if(opts.values === false) l.push(ch.key) else l.push(ch) }) return pull(l, pull.through(null, cleanup)) } exports.read = exports.readStream = exports.createReadStream = function (db, opts) { opts = opts || {} if(!(opts.tail || opts.live)) return read(db, opts) //optionally notify when we switch from reading history to realtime var sync = opts.onSync && function (abort, cb) { opts.onSync(abort); cb(abort || true) } return cat([read(db, opts), sync, live(db, opts)]) } exports.write = exports.writeStream = exports.createWriteStream = function (db, opts, done) { if('function' === typeof opts) done = opts, opts = null opts = opts || {} return pull( pull.map(function (e) { if(e.type) return e return { key : e.key, value : e.value, type : e.value == null ? 'del' : 'put' } }), pw.recent(opts.windowSize, opts.windowTime), pull.asyncMap(function (batch, cb) { db.batch(batch, cb) }), pull.drain(null, done) ) } },{"level-post":198,"pull-cat":305,"pull-pushable":346,"pull-stream":381,"pull-window":390,"stream-to-pull-stream":352}],345:[function(require,module,exports){ exports.id = function (item) { return item } exports.prop = function (map) { if('string' == typeof map) { var key = map return function (data) { return data[key] } } return map } exports.tester = function (test) { if(!test) return exports.id if('object' === typeof test && 'function' === typeof test.test) return test.test.bind(test) return exports.prop(test) || exports.id } exports.addPipe = addPipe function addPipe(read) { if('function' !== typeof read) return read read.pipe = read.pipe || function (reader) { if('function' != typeof reader) throw new Error('must pipe to reader') return addPipe(reader(read)) } read.type = 'Source' return read } var Source = exports.Source = function Source (createRead) { function s() { var args = [].slice.call(arguments) return addPipe(createRead.apply(null, args)) } s.type = 'Source' return s } var Through = exports.Through = function (createRead) { return function () { var args = [].slice.call(arguments) var piped = [] function reader (read) { args.unshift(read) read = createRead.apply(null, args) while(piped.length) read = piped.shift()(read) return read //pipeing to from this reader should compose... } reader.pipe = function (read) { piped.push(read) if(read.type === 'Source') throw new Error('cannot pipe ' + reader.type + ' to Source') reader.type = read.type === 'Sink' ? 'Sink' : 'Through' return reader } reader.type = 'Through' return reader } } var Sink = exports.Sink = function Sink(createReader) { return function () { var args = [].slice.call(arguments) if(!createReader) throw new Error('must be createReader function') function s (read) { args.unshift(read) return createReader.apply(null, args) } s.type = 'Sink' return s } } exports.maybeSink = exports.maybeDrain = function (createSink, cb) { if(!cb) return Through(function (read) { var ended return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) createSink(function (err, data) { ended = err || true if(!err) cb(null, data) else cb(ended) }) (read) } })() return Sink(function (read) { return createSink(cb) (read) })() } },{}],346:[function(require,module,exports){ var pull = require('pull-stream') module.exports = pull.Source(function (onClose) { var buffer = [], cbs = [], waiting = [], ended function drain() { var l while(waiting.length && ((l = buffer.length) || ended)) { var data = buffer.shift() var cb = cbs.shift() waiting.shift()(l ? null : ended, data) cb && cb(ended === true ? null : ended) } } function read (end, cb) { ended = ended || end waiting.push(cb) drain() if(ended) onClose && onClose(ended === true ? null : ended) } read.push = function (data, cb) { if(ended) return cb && cb(ended === true ? null : ended) buffer.push(data); cbs.push(cb) drain() } read.end = function (end, cb) { if('function' === typeof end) cb = end, end = true ended = ended || end || true; if(cb) cbs.push(cb) drain() if(ended) onClose && onClose(ended === true ? null : ended) } return read }) },{"pull-stream":347}],347:[function(require,module,exports){ var sources = require('./sources') var sinks = require('./sinks') var throughs = require('./throughs') var u = require('pull-core') for(var k in sources) exports[k] = u.Source(sources[k]) for(var k in throughs) exports[k] = u.Through(throughs[k]) for(var k in sinks) exports[k] = u.Sink(sinks[k]) var maybe = require('./maybe')(exports) for(var k in maybe) exports[k] = maybe[k] exports.Duplex = exports.Through = exports.pipeable = u.Through exports.Source = exports.pipeableSource = u.Source exports.Sink = exports.pipeableSink = u.Sink },{"./maybe":348,"./sinks":349,"./sources":350,"./throughs":351,"pull-core":345}],348:[function(require,module,exports){ var u = require('pull-core') var prop = u.prop var id = u.id var maybeSink = u.maybeSink module.exports = function (pull) { var exports = {} var drain = pull.drain var find = exports.find = function (test, cb) { return maybeSink(function (cb) { var ended = false if(!cb) cb = test, test = id else test = prop(test) || id return drain(function (data) { if(test(data)) { ended = true cb(null, data) return false } }, function (err) { if(ended) return //already called back cb(err === true ? null : err, null) }) }, cb) } var reduce = exports.reduce = function (reduce, acc, cb) { return maybeSink(function (cb) { return drain(function (data) { acc = reduce(acc, data) }, function (err) { cb(err, acc) }) }, cb) } var collect = exports.collect = exports.writeArray = function (cb) { return reduce(function (arr, item) { arr.push(item) return arr }, [], cb) } return exports } },{"pull-core":345}],349:[function(require,module,exports){ var drain = exports.drain = function (read, op, done) { ;(function next() { var loop = true, cbed = false while(loop) { cbed = false read(null, function (end, data) { cbed = true if(end) { loop = false done && done(end === true ? null : end) } else if(op && false === op(data)) { loop = false read(true, done || function () {}) } else if(!loop){ next() } }) if(!cbed) { loop = false return } } })() } var onEnd = exports.onEnd = function (read, done) { return drain(read, null, done) } var log = exports.log = function (read, done) { return drain(read, function (data) { console.log(data) }, done) } },{}],350:[function(require,module,exports){ var keys = exports.keys = function (object) { return values(Object.keys(object)) } var once = exports.once = function (value) { return function (abort, cb) { if(abort) return cb(abort) if(value != null) { var _value = value; value = null cb(null, _value) } else cb(true) } } var values = exports.values = exports.readArray = function (array) { if(!Array.isArray(array)) array = Object.keys(array).map(function (k) { return array[k] }) var i = 0 return function (end, cb) { if(end) return cb && cb(end) cb(i >= array.length || null, array[i++]) } } var count = exports.count = function (max) { var i = 0; max = max || Infinity return function (end, cb) { if(end) return cb && cb(end) if(i > max) return cb(true) cb(null, i++) } } var infinite = exports.infinite = function (generate) { generate = generate || Math.random return function (end, cb) { if(end) return cb && cb(end) return cb(null, generate()) } } var defer = exports.defer = function () { var _read, cbs = [], _end var read = function (end, cb) { if(!_read) { _end = end cbs.push(cb) } else _read(end, cb) } read.resolve = function (read) { if(_read) throw new Error('already resolved') _read = read if(!_read) throw new Error('no read cannot resolve!' + _read) while(cbs.length) _read(_end, cbs.shift()) } read.abort = function(err) { read.resolve(function (_, cb) { cb(err || true) }) } return read } var empty = exports.empty = function () { return function (abort, cb) { cb(true) } } var depthFirst = exports.depthFirst = function (start, createStream) { var reads = [] reads.unshift(once(start)) return function next (end, cb) { if(!reads.length) return cb(true) reads[0](end, function (end, data) { if(end) { //if this stream has ended, go to the next queue reads.shift() return next(null, cb) } reads.unshift(createStream(data)) cb(end, data) }) } } //width first is just like depth first, //but push each new stream onto the end of the queue var widthFirst = exports.widthFirst = function (start, createStream) { var reads = [] reads.push(once(start)) return function next (end, cb) { if(!reads.length) return cb(true) reads[0](end, function (end, data) { if(end) { reads.shift() return next(null, cb) } reads.push(createStream(data)) cb(end, data) }) } } //this came out different to the first (strm) //attempt at leafFirst, but it's still a valid //topological sort. var leafFirst = exports.leafFirst = function (start, createStream) { var reads = [] var output = [] reads.push(once(start)) return function next (end, cb) { reads[0](end, function (end, data) { if(end) { reads.shift() if(!output.length) return cb(true) return cb(null, output.shift()) } reads.unshift(createStream(data)) output.unshift(data) next(null, cb) }) } } },{}],351:[function(require,module,exports){ (function (process){ var u = require('pull-core') var sources = require('./sources') var sinks = require('./sinks') var prop = u.prop var id = u.id var tester = u.tester var map = exports.map = function (read, map) { map = prop(map) || id return function (end, cb) { read(end, function (end, data) { var data = !end ? map(data) : null cb(end, data) }) } } var asyncMap = exports.asyncMap = function (read, map) { if(!map) return read return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } var paraMap = exports.paraMap = function (read, map, width) { if(!map) return read var ended = false, queue = [], _cb function drain () { if(!_cb) return var cb = _cb _cb = null if(queue.length) return cb(null, queue.shift()) else if(ended && !n) return cb(ended) _cb = cb } function pull () { read(null, function (end, data) { if(end) { ended = end return drain() } n++ map(data, function (err, data) { n-- queue.push(data) drain() }) if(n < width && !ended) pull() }) } var n = 0 return function (end, cb) { if(end) return read(end, cb) //abort //continue to read while there are less than 3 maps in flight _cb = cb if(queue.length || ended) pull(), drain() else pull() } return highWaterMark(asyncMap(read, map), width) } var filter = exports.filter = function (read, test) { //regexp test = tester(test) return function next (end, cb) { read(end, function (end, data) { if(!end && !test(data)) return next(end, cb) cb(end, data) }) } } var filterNot = exports.filterNot = function (read, test) { test = tester(test) return filter(read, function (e) { return !test(e) }) } var through = exports.through = function (read, op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } var take = exports.take = function (read, test) { var ended = false if('number' === typeof test) { var n = test; test = function () { return n -- } } return function (end, cb) { if(ended) return cb(ended) if(ended = end) return read(ended, cb) read(null, function (end, data) { if(ended = ended || end) return cb(ended) if(!test(data)) { ended = true read(true, function (end, data) { cb(ended, data) }) } else cb(null, data) }) } } var unique = exports.unique = function (read, field, invert) { field = prop(field) || id var seen = {} return filter(read, function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } var nonUnique = exports.nonUnique = function (read, field) { return unique(read, field, true) } var group = exports.group = function (read, size) { var ended; size = size || 5 var queue = [] return function (end, cb) { //this means that the upstream is sending an error. if(end) return read(ended = end, cb) //this means that we read an end before. if(ended) return cb(ended) read(null, function next(end, data) { if(ended = ended || end) { if(!queue.length) return cb(ended) var _queue = queue; queue = [] return cb(null, _queue) } queue.push(data) if(queue.length < size) return read(null, next) var _queue = queue; queue = [] cb(null, _queue) }) } } var flatten = exports.flatten = function (read) { var _read return function (abort, cb) { if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (end, data) { if(end) nextStream() else cb(null, data) }) } function nextStream () { read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream)) stream = sources.values(stream) else if('function' != typeof stream) throw new Error('expected stream of streams') _read = stream nextChunk() }) } } } var prepend = exports.prepend = function (read, head) { return function (abort, cb) { if(head !== null) { if(abort) return read(abort, cb) var _head = head head = null cb(null, _head) } else { read(abort, cb) } } } //var drainIf = exports.drainIf = function (op, done) { // sinks.drain( //} var _reduce = exports._reduce = function (read, reduce, initial) { return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) sinks.drain(function (item) { initial = reduce(initial, item) }, function (err, data) { ended = err || true if(!err) cb(null, initial) else cb(ended) }) (read) } } var nextTick = process.nextTick var highWaterMark = exports.highWaterMark = function (read, highWaterMark) { var buffer = [], waiting = [], ended, reading = false highWaterMark = highWaterMark || 10 function readAhead () { while(waiting.length && (buffer.length || ended)) waiting.shift()(ended, ended ? null : buffer.shift()) } function next () { if(ended || reading || buffer.length >= highWaterMark) return reading = true return read(ended, function (end, data) { reading = false ended = ended || end if(data != null) buffer.push(data) next(); readAhead() }) } nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } }).call(this,require('_process')) },{"./sinks":349,"./sources":350,"_process":295,"pull-core":345}],352:[function(require,module,exports){ (function (process){ var pull = require('pull-core') function destroy(stream, cb) { function onClose () { cleanup(); cb() } function onError (err) { cleanup(); cb(err) } function cleanup() { stream.removeListener('close', onClose) stream.removeListener('error', onError) } stream.on('close', onClose) stream.on('error', onError) } function write(read, stream) { var ended function onClose () { cleanup() if(!ended) read(ended = true, function () {}) } function onError (err) { cleanup() if(!ended) read(ended = err, function () {}) } function cleanup() { stream.removeListener('close', onClose) stream.removeListener('error', onError) } stream.on('close', onClose) stream.on('error', onError) process.nextTick(function next() { read(null, function (end, data) { if(end === true) return stream._isStdio || stream.end() if(ended = ended || end) return stream.emit('error', end) var pause = stream.write(data) if(pause === false) stream.once('drain', next) else next() }) }) } function first (emitter, events, handler) { function listener (val) { events.forEach(function (e) { emitter.removeListener(e, listener) }) handler(val) } events.forEach(function (e) { emitter.on(e, listener) }) return emitter } function read2(stream) { var ended = false, waiting = false var _cb function read () { var data = stream.read() if(data !== null && _cb) { var cb = _cb; _cb = null cb(null, data) } } stream.on('readable', function () { waiting = true _cb && read() }) .on('end', function () { ended = true _cb && _cb(ended) }) .on('error', function (err) { ended = err _cb && _cb(ended) }) return function (end, cb) { _cb = cb if(ended) cb(ended) else if(waiting) read() } } function read1(stream) { var buffer = [], cbs = [], ended, paused = false var draining function drain() { while((buffer.length || ended) && cbs.length) cbs.shift()(buffer.length ? null : ended, buffer.shift()) if(!buffer.length && (paused)) { paused = false stream.resume() } } stream.on('data', function (data) { buffer.push(data) drain() if(buffer.length && stream.pause) { paused = true stream.pause() } }) stream.on('end', function () { ended = true drain() }) stream.on('error', function (err) { ended = err drain() }) return function (abort, cb) { if(!cb) throw new Error('*must* provide cb') if(abort) { stream.once('close', function () { cb(abort) }) stream.destroy() } cbs.push(cb) drain() } } function read (stream) { if('function' === typeof stream.read) return read2(stream) return read1(stream) } var sink = function (stream) { return pull.Sink(function (read) { return write(read, stream) })() } var source = function (stream) { return pull.Source(function () { return read(stream) })() } exports = module.exports = function (stream) { return ( stream.writable ? stream.readable ? pull.Through(function(_read) { write(_read, stream); return read(stream) })() : sink(stream) : source(stream) ) } exports.sink = sink exports.source = source exports.read = read exports.read1 = read1 exports.read2 = read2 }).call(this,require('_process')) },{"_process":295,"pull-core":345}],353:[function(require,module,exports){ /* all pull streams have these states: { START: { read: READING, abort: ABORTING }, READY: { read: READING, abort: ABORTING }, READING: { cb: READY, err: ERROR, end: END }, ABORTING: { cb: END }, ERROR: {}, END: {} } this module takes a collection of pull-streams, and interleaves their states. if all the streams have ended, it ends. If it is in reading state, and one stream goes has READING->cb it goes into READY on read, trigger read on every stream in START or READY on abort, trigger abort on every stream in START or READY if a stream is in READY, and big stream is in ABORT, trigger abort if every stream is in END or ERROR, trigger end or error could you describe this declaritively or something? */ module.exports = function (ary) { var capped = !!ary var inputs = (ary || []).map(create), i = 0, abort, cb function create (stream) { return {ready: false, reading: false, ended: false, read: stream, data: null} } function check () { if(!cb) return clean() var l = inputs.length var _cb = cb if(l === 0 && (abort || capped)) { cb = null; _cb(abort || true) return } //scan the inputs to check whether there is one we can use. for(var j = 0; j < l; j++) { var current = inputs[(i + j) % l] if(current.ready && !current.ended) { var data = current.data current.ready = false current.data = null i ++; cb = null return _cb(null, data) } } } function clean () { var l = inputs.length //iterate backwards so that we can remove items. while(l--) { if(inputs[l].ended) inputs.splice(l, 1) } } function next () { var l = inputs.length while(l--) (function (current) { //read the next item if we aren't already if(l > inputs.length) throw new Error('this should never happen') if(current.reading || current.ended || current.ready) return current.reading = true var sync = true current.read(abort, function next (end, data) { current.data = data current.ready = true current.reading = false if(end === true || abort) current.ended = true else if(end) abort = current.ended = end //check whether we need to abort this stream. if(abort && !end) current.read(abort, next) if(!sync) check() }) sync = false })(inputs[l]) //scan the feed check() } function read (_abort, _cb) { abort = abort || _abort; cb = _cb; next() } read.add = function (stream) { if(!stream) { //the stream will now end when all the streams end. capped = true //we just changed state, so we may need to cb return next() } inputs.push(create(stream)) next() } read.cap = function (err) { read.add(null) } return read } },{}],354:[function(require,module,exports){ arguments[4][251][0].apply(exports,arguments) },{"dup":251,"pull-pushable":356}],355:[function(require,module,exports){ arguments[4][345][0].apply(exports,arguments) },{"dup":345}],356:[function(require,module,exports){ arguments[4][346][0].apply(exports,arguments) },{"dup":346,"pull-stream":357}],357:[function(require,module,exports){ arguments[4][347][0].apply(exports,arguments) },{"./maybe":358,"./sinks":359,"./sources":360,"./throughs":361,"dup":347,"pull-core":355}],358:[function(require,module,exports){ arguments[4][348][0].apply(exports,arguments) },{"dup":348,"pull-core":355}],359:[function(require,module,exports){ arguments[4][349][0].apply(exports,arguments) },{"dup":349}],360:[function(require,module,exports){ arguments[4][350][0].apply(exports,arguments) },{"dup":350}],361:[function(require,module,exports){ (function (process){ var u = require('pull-core') var sources = require('./sources') var sinks = require('./sinks') var prop = u.prop var id = u.id var tester = u.tester var map = exports.map = function (read, map) { map = prop(map) || id return function (end, cb) { read(end, function (end, data) { var data = !end ? map(data) : null cb(end, data) }) } } var asyncMap = exports.asyncMap = function (read, map) { if(!map) return read return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } var paraMap = exports.paraMap = function (read, map, width) { if(!map) return read var ended = false, queue = [], _cb function drain () { if(!_cb) return var cb = _cb _cb = null if(queue.length) return cb(null, queue.shift()) else if(ended && !n) return cb(ended) _cb = cb } function pull () { read(null, function (end, data) { if(end) { ended = end return drain() } n++ map(data, function (err, data) { n-- queue.push(data) drain() }) if(n < width && !ended) pull() }) } var n = 0 return function (end, cb) { if(end) return read(end, cb) //abort //continue to read while there are less than 3 maps in flight _cb = cb if(queue.length || ended) pull(), drain() else pull() } return highWaterMark(asyncMap(read, map), width) } var filter = exports.filter = function (read, test) { //regexp test = tester(test) return function next (end, cb) { read(end, function (end, data) { if(!end && !test(data)) return next(end, cb) cb(end, data) }) } } var filterNot = exports.filterNot = function (read, test) { test = tester(test) return filter(read, function (e) { return !test(e) }) } var through = exports.through = function (read, op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } var take = exports.take = function (read, test) { var ended = false if('number' === typeof test) { var n = test; test = function () { return n -- } } return function (end, cb) { if(ended) return cb(ended) if(ended = end) return read(ended, cb) read(null, function (end, data) { if(ended = ended || end) return cb(ended) if(!test(data)) { ended = true read(true, function (end, data) { cb(ended, data) }) } else cb(null, data) }) } } var unique = exports.unique = function (read, field, invert) { field = prop(field) || id var seen = {} return filter(read, function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } var nonUnique = exports.nonUnique = function (read, field) { return unique(read, field, true) } var group = exports.group = function (read, size) { var ended; size = size || 5 var queue = [] return function (end, cb) { //this means that the upstream is sending an error. if(end) return read(ended = end, cb) //this means that we read an end before. if(ended) return cb(ended) read(null, function next(end, data) { if(ended = ended || end) { if(!queue.length) return cb(ended) var _queue = queue; queue = [] return cb(null, _queue) } queue.push(data) if(queue.length < size) return read(null, next) var _queue = queue; queue = [] cb(null, _queue) }) } } var flatten = exports.flatten = function (read) { var _read return function (abort, cb) { if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (end, data) { if(end) nextStream() else cb(null, data) }) } function nextStream () { read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream)) stream = sources.values(stream) else if('function' != typeof stream) throw new Error('expected stream of streams') _read = stream nextChunk() }) } } } var prepend = exports.prepend = function (read, head) { return function (abort, cb) { if(head !== null) { if(abort) return read(abort, cb) var _head = head head = null cb(null, _head) } else { read(abort, cb) } } } //var drainIf = exports.drainIf = function (op, done) { // sinks.drain( //} var _reduce = exports._reduce = function (read, reduce, initial) { return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) sinks.drain(function (item) { initial = reduce(initial, item) }, function (err, data) { ended = err || true if(!err) cb(null, initial) else cb(ended) }) (read) } } var nextTick = process.nextTick var highWaterMark = exports.highWaterMark = function (read, highWaterMark) { var buffer = [], waiting = [], ended, reading = false highWaterMark = highWaterMark || 10 function readAhead () { while(waiting.length && (buffer.length || ended)) waiting.shift()(ended, ended ? null : buffer.shift()) } function next () { if(ended || reading || buffer.length >= highWaterMark) return reading = true return read(ended, function (end, data) { reading = false ended = ended || end if(data != null) buffer.push(data) next(); readAhead() }) } nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } }).call(this,require('_process')) },{"./sinks":359,"./sources":360,"_process":295,"pull-core":355}],362:[function(require,module,exports){ 'use strict' //a pair of pull streams where one drains from the other module.exports = function () { var _read, waiting function sink (read) { if('function' !== typeof read) throw new Error('read must be function') if(_read) throw new Error('already piped') _read = read if(waiting) { var _waiting = waiting waiting = null _read.apply(null, _waiting) } } function source (abort, cb) { if(_read) _read(abort, cb) else waiting = [abort, cb] } return { source: source, sink: sink } } },{}],363:[function(require,module,exports){ module.exports = function (map, width) { var reading = false, abort return function (read) { var i = 0, j = 0, last = 0 var seen = [], started = false, ended = false, _cb, error function drain () { if(_cb) { var cb = _cb if(error) { _cb = null return cb(error) } if(Object.hasOwnProperty.call(seen, j)) { _cb = null var data = seen[j]; delete seen[j]; j++ cb(null, data) if(width) start() } else if(j >= last && ended) { _cb = null cb(true) } } } function start () { started = true if(ended) return drain() if(reading || width && (i - width >= j)) return reading = true read(abort, function (end, data) { reading = false if(end) { last = i; ended = end drain() } else { var k = i++ map(data, function (err, data) { seen[k] = data if(err) error = err drain() }) if(!ended) start() } }) } return function (_abort, cb) { if(_abort) { return read(ended = abort = _abort, function (err) { if(_cb) return cb(err) }) } _cb = cb if(!started) start() drain() } } } },{}],364:[function(require,module,exports){ var Pushable = require('pull-pushable') var Stats = require('statistics') var pull = require('pull-stream') module.exports = function (opts) { var timeout = opts && opts.timeout || 5*60*1000 //default: 5 minutes var serve = false, timer var source = Pushable() var rtt = Stats(), skew = Stats() function ping () { //serve the ping pong, opponent //will volley it back to us, keeping connection alive //and revealing clock skew. serve = true source.push(ts = Date.now()) } //we send the first ping if(opts && opts.serve) ping() return { source: source, sink: pull.drain(function (remote_ts) { if(serve) { var ts2 = Date.now() rtt.value(ts2 - ts) //if their time is behind half a round trip behing ts2 //consider that to be negative skew. skew.value(remote_ts - ((ts2 + ts)/2)) serve = false } else { //volley timestamp back to opponent. source.push(ts = Date.now()) //we'll serve next time. timer = setTimeout(ping, timeout) } }, function (err) { clearTimeout(timer) }), rtt: rtt, skew: skew } } },{"pull-pushable":370,"pull-stream":365,"statistics":575}],365:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":366,"./sinks":367,"./sources":368,"./throughs":369,"dup":232}],366:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],367:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],368:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],369:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":367,"./sources":368,"dup":236}],370:[function(require,module,exports){ module.exports = function (onClose) { var buffer = [], ended, abort, cb function callback (err, val) { var _cb = cb if(err && onClose) { var c = onClose onClose = null c(err === true ? null : err) } cb = null _cb(err, val) } function drain() { if(!cb) return if(abort) callback(abort) else if(!buffer.length && ended) callback(ended) else if(buffer.length) callback(null, buffer.shift()) } function read (_abort, _cb) { if(_abort) { abort = _abort //if there is already a cb waiting, abort it. if(cb) callback(abort) } cb = _cb drain() } read.push = function (data) { if(ended) return buffer.push(data) drain() } read.end = function (end) { ended = ended || end || true; drain() } return read } },{}],371:[function(require,module,exports){ (function (Buffer){ var BufferList = require('bl') module.exports = function () { var bl = new BufferList() function get (n) { var len = n == null ? bl.length : n var data = bl.slice(0, len) bl.consume(n) return data } return { data: bl, add: function (data) { bl.append(data) return this }, has: function (n) { if(n == null) return bl.length > 0 return bl.length >= n }, get: function (n) { if(n == null) return get() if(!this.has(n)) throw new Error( 'current length is:'+bl.length + ', could not get:'+n + ' bytes' ) return get(n) } } var soFar = new Buffer(0) return { data: soFar, add: function (data) { if(!Buffer.isBuffer(data)) throw new Error('data must be a buffer, was: ' + JSON.stringify(data)) this.data = soFar = Buffer.concat([soFar, data]) return this }, has: function (n) { if(null == n) return soFar.length > 0 return soFar.length - (n || 0) >= 0 }, get: function (n) { var next if(null == n) { next = soFar soFar = new Buffer(0) return next } next = soFar.slice(0, n) if(soFar.length < n) throw new Error('current length is:'+soFar.length + ', could not get:'+n + ' bytes') soFar = soFar.slice(n, soFar.length) return next } } } }).call(this,require("buffer").Buffer) },{"bl":22,"buffer":61}],372:[function(require,module,exports){ 'use strict' var State = require('./bl-state') function isInteger (i) { return Number.isFinite(i) } function isFunction (f) { return 'function' === typeof f } function maxDelay(fn, delay) { if(!delay) return fn return function (a, cb) { var timer = setTimeout(function () { fn(new Error('pull-reader: read exceeded timeout'), cb) }, delay) fn(a, function (err, value) { clearTimeout(timer) cb(err, value) }) } } module.exports = function (timeout) { var queue = [], read, readTimed, reading = false var state = State(), ended, streaming, abort function drain () { while (queue.length) { if(null == queue[0].length && state.has(1)) { queue.shift().cb(null, state.get()) } else if(state.has(queue[0].length)) { var next = queue.shift() next.cb(null, state.get(next.length)) } else if(ended) queue.shift().cb(ended) else return !!queue.length } //always read a little data return queue.length || !state.has(1) || abort } function more () { var d = drain() if(d && !reading) if(read && !reading && !streaming) { reading = true readTimed (null, function (err, data) { reading = false if(err) { ended = err return drain() } state.add(data) more() }) } } function reader (_read) { if(abort) { while(queue.length) queue.shift().cb(abort) return cb && cb(abort) } readTimed = maxDelay(_read, timeout) read = _read more() } reader.abort = function (err, cb) { abort = err || true if(read) { reading = true read(abort, function () { while(queue.length) queue.shift().cb(abort) cb && cb(abort) }) } else cb() } reader.read = function (len, timeout, cb) { if(isFunction(timeout)) cb = timeout, timeout = 0 if(isFunction(cb)) { queue.push({length: isInteger(len) ? len : null, cb: cb}) more() } else { //switch into streaming mode for the rest of the stream. streaming = true //wait for the current read to complete return function (abort, cb) { //if there is anything still in the queue, if(reading || state.has(1)) { if(abort) return read(abort, cb) queue.push({length: null, cb: cb}) more() } else maxDelay(read, timeout)(abort, function (err, data) { cb(err, data) }) } } } return reader } },{"./bl-state":371}],373:[function(require,module,exports){ var pull = require('pull-stream') var splitter = require('pull-split') module.exports = function (ps, _JSON, opts) { _JSON = _JSON || JSON opts = opts || {} var separator = opts.separator || '\n' return { sink: pull( splitter(separator), pull.map(function(data) { if (data === '') return data try { return _JSON.parse(data) } catch (e) { if (!opts.ignoreErrors) throw e } }), pull.filter(), ps.sink ), source: pull( ps.source, pull.map(function(data) { if (data !== void 0) return _JSON.stringify(data) + separator }) ) } } },{"pull-split":380,"pull-stream":374}],374:[function(require,module,exports){ arguments[4][179][0].apply(exports,arguments) },{"./maybe":375,"./sinks":376,"./sources":377,"./throughs":378,"dup":179,"pull-core":306}],375:[function(require,module,exports){ arguments[4][180][0].apply(exports,arguments) },{"dup":180,"pull-core":306}],376:[function(require,module,exports){ arguments[4][181][0].apply(exports,arguments) },{"dup":181}],377:[function(require,module,exports){ arguments[4][182][0].apply(exports,arguments) },{"dup":182}],378:[function(require,module,exports){ (function (process){ var u = require('pull-core') var sources = require('./sources') var sinks = require('./sinks') var prop = u.prop var id = u.id var tester = u.tester var map = exports.map = function (read, map) { map = prop(map) || id return function (abort, cb) { read(abort, function (end, data) { try { data = !end ? map(data) : null } catch (err) { return read(err, function () { return cb(err) }) } cb(end, data) }) } } var asyncMap = exports.asyncMap = function (read, map) { if(!map) return read return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } var paraMap = exports.paraMap = function (read, map, width) { if(!map) return read var ended = false, queue = [], _cb function drain () { if(!_cb) return var cb = _cb _cb = null if(queue.length) return cb(null, queue.shift()) else if(ended && !n) return cb(ended) _cb = cb } function pull () { read(null, function (end, data) { if(end) { ended = end return drain() } n++ map(data, function (err, data) { n-- queue.push(data) drain() }) if(n < width && !ended) pull() }) } var n = 0 return function (end, cb) { if(end) return read(end, cb) //abort //continue to read while there are less than 3 maps in flight _cb = cb if(queue.length || ended) pull(), drain() else pull() } return highWaterMark(asyncMap(read, map), width) } var filter = exports.filter = function (read, test) { //regexp test = tester(test) return function next (end, cb) { var sync, loop = true while(loop) { loop = false sync = true read(end, function (end, data) { if(!end && !test(data)) return sync ? loop = true : next(end, cb) cb(end, data) }) sync = false } } } var filterNot = exports.filterNot = function (read, test) { test = tester(test) return filter(read, function (e) { return !test(e) }) } var through = exports.through = function (read, op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } var take = exports.take = function (read, test) { var ended = false if('number' === typeof test) { var n = test; test = function () { return n -- } } return function (end, cb) { if(ended) return cb(ended) if(ended = end) return read(ended, cb) read(null, function (end, data) { if(ended = ended || end) return cb(ended) if(!test(data)) { ended = true read(true, function (end, data) { cb(ended, data) }) } else cb(null, data) }) } } var unique = exports.unique = function (read, field, invert) { field = prop(field) || id var seen = {} return filter(read, function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } var nonUnique = exports.nonUnique = function (read, field) { return unique(read, field, true) } var group = exports.group = function (read, size) { var ended; size = size || 5 var queue = [] return function (end, cb) { //this means that the upstream is sending an error. if(end) return read(ended = end, cb) //this means that we read an end before. if(ended) return cb(ended) read(null, function next(end, data) { if(ended = ended || end) { if(!queue.length) return cb(ended) var _queue = queue; queue = [] return cb(null, _queue) } queue.push(data) if(queue.length < size) return read(null, next) var _queue = queue; queue = [] cb(null, _queue) }) } } var flatten = exports.flatten = function (read) { var _read return function (abort, cb) { if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (end, data) { if(end) nextStream() else cb(null, data) }) } function nextStream () { read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream) || stream && 'object' === typeof stream) stream = sources.values(stream) else if('function' != typeof stream) throw new Error('expected stream of streams') _read = stream nextChunk() }) } } } var prepend = exports.prepend = function (read, head) { return function (abort, cb) { if(head !== null) { if(abort) return read(abort, cb) var _head = head head = null cb(null, _head) } else { read(abort, cb) } } } //var drainIf = exports.drainIf = function (op, done) { // sinks.drain( //} var _reduce = exports._reduce = function (read, reduce, initial) { return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) sinks.drain(function (item) { initial = reduce(initial, item) }, function (err, data) { ended = err || true if(!err) cb(null, initial) else cb(ended) }) (read) } } var nextTick = process.nextTick var highWaterMark = exports.highWaterMark = function (read, highWaterMark) { var buffer = [], waiting = [], ended, ending, reading = false highWaterMark = highWaterMark || 10 function readAhead () { while(waiting.length && (buffer.length || ended)) waiting.shift()(ended, ended ? null : buffer.shift()) if (!buffer.length && ending) ended = ending; } function next () { if(ended || ending || reading || buffer.length >= highWaterMark) return reading = true return read(ended || ending, function (end, data) { reading = false ending = ending || end if(data != null) buffer.push(data) next(); readAhead() }) } process.nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } var flatMap = exports.flatMap = function (read, mapper) { mapper = mapper || id var queue = [], ended return function (abort, cb) { if(queue.length) return cb(null, queue.shift()) else if(ended) return cb(ended) read(abort, function next (end, data) { if(end) ended = end else { var add = mapper(data) while(add && add.length) queue.push(add.shift()) } if(queue.length) cb(null, queue.shift()) else if(ended) cb(ended) else read(null, next) }) } } }).call(this,require('_process')) },{"./sinks":376,"./sources":377,"_process":295,"pull-core":306}],379:[function(require,module,exports){ module.exports = function (create) { var reader = null return function (read) { if('function' !== typeof read) throw new Error('read must be function') return function (abort, cb) { if(abort) (reader ? reader.abort : read)(abort, cb) else if(!reader) (reader = create(cb))(read) else //there will only be one value, so assume this is the end cb(true) } } } },{}],380:[function(require,module,exports){ var through = require('pull-through') module.exports = function split (matcher, mapper, reverse) { var soFar = '' if('function' === typeof matcher) mapper = matcher, matcher = null if (!matcher) matcher = '\n' return through(function (buffer) { var stream = this , pieces = ( reverse ? buffer + soFar : soFar + buffer ).split(matcher) soFar = reverse ? pieces.shift() : pieces.pop() var l = pieces.length for (var i = 0; i < l; i++) { var piece = pieces[reverse ? l - 1 - i : i ] if(mapper) { piece = mapper(piece) if('undefined' !== typeof piece) stream.queue(piece) } else stream.queue(piece) } }, function () { if(soFar != null) this.queue(soFar) this.queue(null) }) } },{"pull-through":386}],381:[function(require,module,exports){ arguments[4][179][0].apply(exports,arguments) },{"./maybe":382,"./sinks":383,"./sources":384,"./throughs":385,"dup":179,"pull-core":306}],382:[function(require,module,exports){ arguments[4][180][0].apply(exports,arguments) },{"dup":180,"pull-core":306}],383:[function(require,module,exports){ arguments[4][181][0].apply(exports,arguments) },{"dup":181}],384:[function(require,module,exports){ var keys = exports.keys = function (object) { return values(Object.keys(object)) } function abortCb(cb, abort, onAbort) { cb(abort) onAbort && onAbort(abort === true ? null: abort) return } var once = exports.once = function (value, onAbort) { return function (abort, cb) { if(abort) return abortCb(cb, abort, onAbort) if(value != null) { var _value = value; value = null cb(null, _value) } else cb(true) } } var values = exports.values = exports.readArray = function (array, onAbort) { if(!array) return function (abort, cb) { if(abort) return abortCb(cb, abort, onAbort) return cb(true) } if(!Array.isArray(array)) array = Object.keys(array).map(function (k) { return array[k] }) var i = 0 return function (abort, cb) { if(abort) return abortCb(cb, abort, onAbort) cb(i >= array.length || null, array[i++]) } } var count = exports.count = function (max) { var i = 0; max = max || Infinity return function (end, cb) { if(end) return cb && cb(end) if(i > max) return cb(true) cb(null, i++) } } var infinite = exports.infinite = function (generate) { generate = generate || Math.random return function (end, cb) { if(end) return cb && cb(end) return cb(null, generate()) } } var defer = exports.defer = function () { var _read, cbs = [], _end var read = function (end, cb) { if(!_read) { _end = end cbs.push(cb) } else _read(end, cb) } read.resolve = function (read) { if(_read) throw new Error('already resolved') _read = read if(!_read) throw new Error('no read cannot resolve!' + _read) while(cbs.length) _read(_end, cbs.shift()) } read.abort = function(err) { read.resolve(function (_, cb) { cb(err || true) }) } return read } var empty = exports.empty = function () { return function (abort, cb) { cb(true) } } var error = exports.error = function (err) { return function (abort, cb) { cb(err) } } var depthFirst = exports.depthFirst = function (start, createStream) { var reads = [] reads.unshift(once(start)) return function next (end, cb) { if(!reads.length) return cb(true) reads[0](end, function (end, data) { if(end) { //if this stream has ended, go to the next queue reads.shift() return next(null, cb) } reads.unshift(createStream(data)) cb(end, data) }) } } //width first is just like depth first, //but push each new stream onto the end of the queue var widthFirst = exports.widthFirst = function (start, createStream) { var reads = [] reads.push(once(start)) return function next (end, cb) { if(!reads.length) return cb(true) reads[0](end, function (end, data) { if(end) { reads.shift() return next(null, cb) } reads.push(createStream(data)) cb(end, data) }) } } //this came out different to the first (strm) //attempt at leafFirst, but it's still a valid //topological sort. var leafFirst = exports.leafFirst = function (start, createStream) { var reads = [] var output = [] reads.push(once(start)) return function next (end, cb) { reads[0](end, function (end, data) { if(end) { reads.shift() if(!output.length) return cb(true) return cb(null, output.shift()) } reads.unshift(createStream(data)) output.unshift(data) next(null, cb) }) } } },{}],385:[function(require,module,exports){ (function (process){ var u = require('pull-core') var sources = require('./sources') var sinks = require('./sinks') var prop = u.prop var id = u.id var tester = u.tester var map = exports.map = function (read, map) { map = prop(map) || id return function (abort, cb) { read(abort, function (end, data) { try { data = !end ? map(data) : null } catch (err) { return read(err, function () { return cb(err) }) } cb(end, data) }) } } var asyncMap = exports.asyncMap = function (read, map) { if(!map) return read return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } var paraMap = exports.paraMap = function (read, map, width) { if(!map) return read var ended = false, queue = [], _cb function drain () { if(!_cb) return var cb = _cb _cb = null if(queue.length) return cb(null, queue.shift()) else if(ended && !n) return cb(ended) _cb = cb } function pull () { read(null, function (end, data) { if(end) { ended = end return drain() } n++ map(data, function (err, data) { n-- queue.push(data) drain() }) if(n < width && !ended) pull() }) } var n = 0 return function (end, cb) { if(end) return read(end, cb) //abort //continue to read while there are less than 3 maps in flight _cb = cb if(queue.length || ended) pull(), drain() else pull() } return highWaterMark(asyncMap(read, map), width) } var filter = exports.filter = function (read, test) { //regexp test = tester(test) return function next (end, cb) { var sync, loop = true while(loop) { loop = false sync = true read(end, function (end, data) { if(!end && !test(data)) return sync ? loop = true : next(end, cb) cb(end, data) }) sync = false } } } var filterNot = exports.filterNot = function (read, test) { test = tester(test) return filter(read, function (e) { return !test(e) }) } var through = exports.through = function (read, op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } var take = exports.take = function (read, test, opts) { opts = opts || {} var last = opts.last || false // whether the first item for which !test(item) should still pass var ended = false if('number' === typeof test) { last = true var n = test; test = function () { return --n } } function terminate (cb) { read(true, function (err) { last = false; cb(err || true) }) } return function (end, cb) { if(ended) last ? terminate(cb) : cb(ended) else if(ended = end) read(ended, cb) else read(null, function (end, data) { if(ended = ended || end) { //last ? terminate(cb) : cb(ended) } else if(!test(data)) { ended = true last ? cb(null, data) : terminate(cb) } else cb(null, data) }) } } var unique = exports.unique = function (read, field, invert) { field = prop(field) || id var seen = {} return filter(read, function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } var nonUnique = exports.nonUnique = function (read, field) { return unique(read, field, true) } var group = exports.group = function (read, size) { var ended; size = size || 5 var queue = [] return function (end, cb) { //this means that the upstream is sending an error. if(end) return read(ended = end, cb) //this means that we read an end before. if(ended) return cb(ended) read(null, function next(end, data) { if(ended = ended || end) { if(!queue.length) return cb(ended) var _queue = queue; queue = [] return cb(null, _queue) } queue.push(data) if(queue.length < size) return read(null, next) var _queue = queue; queue = [] cb(null, _queue) }) } } var flatten = exports.flatten = function (read) { var _read return function (abort, cb) { if (abort) { _read ? _read(abort, function(err) { read(err || abort, cb) }) : read(abort, cb) } else if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (err, data) { if (err === true) nextStream() else if (err) { read(true, function(abortErr) { // TODO: what do we do with the abortErr? cb(err) }) } else cb(null, data) }) } function nextStream () { read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream) || stream && 'object' === typeof stream) stream = sources.values(stream) else if('function' != typeof stream) throw new Error('expected stream of streams') _read = stream nextChunk() }) } } } var prepend = exports.prepend = function (read, head) { return function (abort, cb) { if(head !== null) { if(abort) return read(abort, cb) var _head = head head = null cb(null, _head) } else { read(abort, cb) } } } //var drainIf = exports.drainIf = function (op, done) { // sinks.drain( //} var _reduce = exports._reduce = function (read, reduce, initial) { return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) sinks.drain(function (item) { initial = reduce(initial, item) }, function (err, data) { ended = err || true if(!err) cb(null, initial) else cb(ended) }) (read) } } var nextTick = process.nextTick var highWaterMark = exports.highWaterMark = function (read, highWaterMark) { var buffer = [], waiting = [], ended, ending, reading = false highWaterMark = highWaterMark || 10 function readAhead () { while(waiting.length && (buffer.length || ended)) waiting.shift()(ended, ended ? null : buffer.shift()) if (!buffer.length && ending) ended = ending; } function next () { if(ended || ending || reading || buffer.length >= highWaterMark) return reading = true return read(ended || ending, function (end, data) { reading = false ending = ending || end if(data != null) buffer.push(data) next(); readAhead() }) } process.nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } var flatMap = exports.flatMap = function (read, mapper) { mapper = mapper || id var queue = [], ended return function (abort, cb) { if(queue.length) return cb(null, queue.shift()) else if(ended) return cb(ended) read(abort, function next (end, data) { if(end) ended = end else { var add = mapper(data) while(add && add.length) queue.push(add.shift()) } if(queue.length) cb(null, queue.shift()) else if(ended) cb(ended) else read(null, next) }) } } }).call(this,require('_process')) },{"./sinks":383,"./sources":384,"_process":295,"pull-core":306}],386:[function(require,module,exports){ var looper = require('looper') module.exports = function (writer, ender) { return function (read) { var queue = [], ended, error function enqueue (data) { queue.push(data) } writer = writer || function (data) { this.queue(data) } ender = ender || function () { this.queue(null) } var emitter = { emit: function (event, data) { if(event == 'data') enqueue(data) if(event == 'end') ended = true, enqueue(null) if(event == 'error') error = data }, queue: enqueue } var _cb return function (end, cb) { ended = ended || end if(end) return read(end, function () { if(_cb) { var t = _cb; _cb = null; t(end) } cb(end) }) _cb = cb looper(function pull (next) { //if it's an error if(!_cb) return cb = _cb if(error) _cb = null, cb(error) else if(queue.length) { var data = queue.shift() _cb = null,cb(data === null, data) } else { read(ended, function (end, data) { //null has no special meaning for pull-stream if(end && end !== true) { error = end; return next() } if(ended = ended || end) ender.call(emitter) else if(data !== null) { writer.call(emitter, data) if(error || ended) return read(error || ended, function () { _cb = null; cb(error || ended) }) } next(pull) }) } }) } } } },{"looper":387}],387:[function(require,module,exports){ var looper = module.exports = function (fun) { (function next () { var loop = true, returned = false, sync = false do { sync = true; loop = false fun.call(this, function () { if(sync) loop = true else next() }) sync = false } while(loop) })() } },{}],388:[function(require,module,exports){ var once = exports.once = function (value) { return function (abort, cb) { if(abort) return cb(abort) if(value != null) { var _value = value; value = null cb(null, _value) } else cb(true) } } var depthFirst = exports.depthFirst = function (start, createStream) { var reads = [], ended reads.unshift(once(start)) return function next (end, cb) { if(!reads.length) return cb(true) if(ended) return cb(ended) reads[0](end, function (end, data) { if(end) { if(end !== true) { ended = end reads.shift() while(reads.length) reads.shift()(end, function () {}) return cb(end) } //if this stream has ended, go to the next queue reads.shift() return next(null, cb) } reads.unshift(createStream(data)) cb(end, data) }) } } //width first is just like depth first, //but push each new stream onto the end of the queue var widthFirst = exports.widthFirst = function (start, createStream) { var reads = [] reads.push(once(start)) return function next (end, cb) { if(!reads.length) return cb(true) reads[0](end, function (end, data) { if(end) { reads.shift() return next(null, cb) } reads.push(createStream(data)) cb(end, data) }) } } //this came out different to the first (strm) //attempt at leafFirst, but it's still a valid //topological sort. var leafFirst = exports.leafFirst = function (start, createStream) { var reads = [] var output = [] reads.push(once(start)) return function next (end, cb) { reads[0](end, function (end, data) { if(end) { reads.shift() if(!output.length) return cb(true) return cb(null, output.shift()) } reads.unshift(createStream(data)) output.unshift(data) next(null, cb) }) } } },{}],389:[function(require,module,exports){ var Decode = require('string_decoder').StringDecoder module.exports = function (enc) { var decoder = new Decode(enc), ended return function (read) { return function (abort, cb) { if(ended) return cb(ended) read(abort, function (end, data) { ended = end if(true === end) { if(data = decoder.end()) cb(null, data) else cb(true) } else if(end && (true !== end)) cb(end) else cb(null, decoder.write(data)) }) } } } },{"string_decoder":616}],390:[function(require,module,exports){ var looper = require('looper') var Through = require('pull-core').Through var window = module.exports = Through(function (read, init, start) { start = start || function (start, data) { return {start: start, data: data} } var windows = [], output = [], ended = null var data, end var j = 0 return function (abort, cb) { if(output.length) return cb(null, output.shift()) if(ended) return cb(ended) var i = 0 var k = j ++ read(abort, looper(function (end, data) { var next = this var reduce, update, once = false if(end) ended = end function _update (end, _data) { if(once) return once = true delete windows[windows.indexOf(update)] output.push(start(data, _data)) } if(!ended) update = init(data, _update) if(update) windows.push(update) else //don't allow data unless a window started here! once = true windows.forEach(function (update, i) { update(end, data) }) if(output.length) return cb(null, output.shift()) else if(ended) return cb(ended) else read(null, next) })) } }) window.recent = function (size, time) { var current = null return window(function (data, cb) { if(current) return current = [] var timer function done () { var _current = current current = null clearTimeout(timer) cb(null, _current) } if(time) timer = setTimeout(done, time) return function (end, data) { if(end) return done() current.push(data) if(size != null && current.length >= size) done() } }, function (_, data) { return data }) } window.sliding = function (reduce, width) { width = width || 10 var k = 0 return window(function (data, cb) { var acc var i = 0 var l = k++ return function (end, data) { if(end) return acc = reduce(acc, data) if(width <= ++ i) cb(null, acc) } }) } },{"looper":225,"pull-core":391}],391:[function(require,module,exports){ arguments[4][345][0].apply(exports,arguments) },{"dup":345}],392:[function(require,module,exports){ var fs = require('fs') module.exports = function (path, opts, cb) { if('function' == typeof opts) cb = opts, opts = null var flags = opts && opts.flags || 'w' var mode = opts && opts.mode || 0666 var pos = 0 return function (read) { fs.open(path, flags, mode, function (err, fd) { read(null, function next (end, data) { if(end === true) fs.close(fd, cb) else if(end) cb(end) //error! else fs.write(fd, data, 0, data.length, pos, function (err, bytes) { if(err) read(err, function () { fs.close(fd, cb) }) else pos += bytes, read(null, next) }) }) }) } } },{"fs":58}],393:[function(require,module,exports){ //another idea: buffer 2* the max, but only call write with half of that, //this could manage cases where the read ahead is latent. Hmm, we probably //shouldn't guess at that here, just handle write latency. //how would we measure this anyway? function append (array, item) { (array = array || []).push(item) return array } module.exports = function (write, reduce, max, cb) { reduce = reduce || append var ended return function (read) { var queue = null, writing = false, length = 0 function flush () { if(writing) return var _queue = queue queue = null; writing = true; length = 0 write(_queue, function (err) { writing = false if(ended === true && !length) cb(err) else if(ended && ended !== true) cb(err || ended) else if(err) read(ended = err, cb) //abort upstream. else if(length) flush() else read(null, next) }) } function next (end, data) { if(ended) return ended = end if(!ended) { queue = reduce(queue, data) length = (queue && queue.length) || 0 if(queue != null) flush() if(length < max) read(null, next) } else if(!writing) cb(ended === true ? null : ended) } read(null, next) } } },{}],394:[function(require,module,exports){ 'use strict'; var ws = require('pull-ws') var WebSocket = require('ws') var url = require('url') function isFunction (f) { return 'function' === typeof f } exports.connect = function (addr, opts) { var stream if(isFunction(opts)) { var cb = opts var called = false opts = { onOpen: function () { if(called) return called = true cb(null, stream) }, onClose: function (err) { if(called) return called = true cb(err) } } } var u = ( 'string' === typeof addr ? addr : url.format({ protocol: 'ws', slashes: true, hostname: addr.host || addr.hostname, port: addr.port, pathname: addr.pathname }) ) var socket = new WebSocket(u) stream = ws(socket) stream.remoteAddress = u if (opts && typeof opts.onOpen == 'function') { socket.addEventListener('open', opts.onOpen) } if (opts && typeof opts.onClose == 'function') { socket.addEventListener('close', opts.onClose) } stream.close = function (cb) { if (cb && typeof cb == 'function') socket.addEventListener('close', cb) socket.close() } return stream } },{"pull-ws":395,"url":632,"ws":642}],395:[function(require,module,exports){ exports = module.exports = duplex; exports.source = require('./source'); exports.sink = require('./sink'); function duplex (ws, opts) { return { source: exports.source(ws), sink: exports.sink(ws, opts) }; }; },{"./sink":397,"./source":398}],396:[function(require,module,exports){ module.exports = function(socket, callback) { var remove = socket && (socket.removeEventListener || socket.removeListener); function cleanup () { if (typeof remove == 'function') { remove.call(socket, 'open', handleOpen); remove.call(socket, 'error', handleErr); } } function handleOpen(evt) { cleanup(); callback(); } function handleErr (evt) { cleanup(); callback(evt); } // if the socket is closing or closed, return end if (socket.readyState >= 2) { return callback(true); } // if open, trigger the callback if (socket.readyState === 1) { return callback(); } socket.addEventListener('open', handleOpen); socket.addEventListener('error', handleErr); }; },{}],397:[function(require,module,exports){ (function (process){ var pull = require('pull-core'); var ready = require('./ready'); /** ### `sink(socket, opts?)` Create a pull-stream `Sink` that will write data to the `socket`. <<< examples/write.js **/ module.exports = pull.Sink(function(read, socket, opts) { opts = opts || {} var closeOnEnd = opts.closeOnEnd !== false; var onClose = 'function' === typeof opts ? opts : opts.onClose; function next(end, data) { // if the stream has ended, simply return if (end) { if (closeOnEnd && socket.readyState <= 1) { if(onClose) socket.addEventListener('close', function (ev) { if(ev.wasClean) onClose() else { var err = new Error('ws error') err.event = ev onClose(err) } }); socket.close(); } return; } // socket ready? ready(socket, function(end) { if (end) { return read(end, function () {}); } socket.send(data); process.nextTick(function() { read(null, next); }); }); } read(null, next); }); }).call(this,require('_process')) },{"./ready":396,"_process":295,"pull-core":306}],398:[function(require,module,exports){ var pull = require('pull-core'); var ready = require('./ready'); /** ### `source(socket)` Create a pull-stream `Source` that will read data from the `socket`. <<< examples/read.js **/ module.exports = pull.Source(function(socket) { var buffer = []; var receiver; var ended; socket.addEventListener('message', function(evt) { if (receiver) { return receiver(null, evt.data); } buffer.push(evt.data); }); socket.addEventListener('close', function(evt) { if (ended) return; if (receiver) { return receiver(ended = true); } }); socket.addEventListener('error', function (evt) { if (ended) return; ended = evt; if (receiver) { receiver(ended); } }); function read(abort, cb) { receiver = null; //if stream has already ended. if (ended) return cb(ended) // if ended, abort if (abort) { //this will callback when socket closes receiver = cb return socket.close() } ready(socket, function(end) { if (end) { return cb(ended = end); } // read from the socket if (ended && ended !== true) { return cb(ended); } else if (buffer.length > 0) { return cb(null, buffer.shift()); } else if (ended) { return cb(true); } receiver = cb; }); }; return read; }); },{"./ready":396,"pull-core":306}],399:[function(require,module,exports){ (function (global){ /*! https://mths.be/punycode v1.3.2 by @mathias */ ;(function(root) { /** Detect free variables */ var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; var freeModule = typeof module == 'object' && module && !module.nodeType && module; var freeGlobal = typeof global == 'object' && global; if ( freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal ) { root = freeGlobal; } /** * The `punycode` object. * @name punycode * @type Object */ var punycode, /** Highest positive signed 32-bit float value */ maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 /** Bootstring parameters */ base = 36, tMin = 1, tMax = 26, skew = 38, damp = 700, initialBias = 72, initialN = 128, // 0x80 delimiter = '-', // '\x2D' /** Regular expressions */ regexPunycode = /^xn--/, regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators /** Error messages */ errors = { 'overflow': 'Overflow: input needs wider integers to process', 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', 'invalid-input': 'Invalid input' }, /** Convenience shortcuts */ baseMinusTMin = base - tMin, floor = Math.floor, stringFromCharCode = String.fromCharCode, /** Temporary variable */ key; /*--------------------------------------------------------------------------*/ /** * A generic error utility function. * @private * @param {String} type The error type. * @returns {Error} Throws a `RangeError` with the applicable error message. */ function error(type) { throw RangeError(errors[type]); } /** * A generic `Array#map` utility function. * @private * @param {Array} array The array to iterate over. * @param {Function} callback The function that gets called for every array * item. * @returns {Array} A new array of values returned by the callback function. */ function map(array, fn) { var length = array.length; var result = []; while (length--) { result[length] = fn(array[length]); } return result; } /** * A simple `Array#map`-like wrapper to work with domain name strings or email * addresses. * @private * @param {String} domain The domain name or email address. * @param {Function} callback The function that gets called for every * character. * @returns {Array} A new string of characters returned by the callback * function. */ function mapDomain(string, fn) { var parts = string.split('@'); var result = ''; if (parts.length > 1) { // In email addresses, only the domain name should be punycoded. Leave // the local part (i.e. everything up to `@`) intact. result = parts[0] + '@'; string = parts[1]; } // Avoid `split(regex)` for IE8 compatibility. See #17. string = string.replace(regexSeparators, '\x2E'); var labels = string.split('.'); var encoded = map(labels, fn).join('.'); return result + encoded; } /** * Creates an array containing the numeric code points of each Unicode * character in the string. While JavaScript uses UCS-2 internally, * this function will convert a pair of surrogate halves (each of which * UCS-2 exposes as separate characters) into a single code point, * matching UTF-16. * @see `punycode.ucs2.encode` * @see * @memberOf punycode.ucs2 * @name decode * @param {String} string The Unicode input string (UCS-2). * @returns {Array} The new array of code points. */ function ucs2decode(string) { var output = [], counter = 0, length = string.length, value, extra; while (counter < length) { value = string.charCodeAt(counter++); if (value >= 0xD800 && value <= 0xDBFF && counter < length) { // high surrogate, and there is a next character extra = string.charCodeAt(counter++); if ((extra & 0xFC00) == 0xDC00) { // low surrogate output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); } else { // unmatched surrogate; only append this code unit, in case the next // code unit is the high surrogate of a surrogate pair output.push(value); counter--; } } else { output.push(value); } } return output; } /** * Creates a string based on an array of numeric code points. * @see `punycode.ucs2.decode` * @memberOf punycode.ucs2 * @name encode * @param {Array} codePoints The array of numeric code points. * @returns {String} The new Unicode string (UCS-2). */ function ucs2encode(array) { return map(array, function(value) { var output = ''; if (value > 0xFFFF) { value -= 0x10000; output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); value = 0xDC00 | value & 0x3FF; } output += stringFromCharCode(value); return output; }).join(''); } /** * Converts a basic code point into a digit/integer. * @see `digitToBasic()` * @private * @param {Number} codePoint The basic numeric code point value. * @returns {Number} The numeric value of a basic code point (for use in * representing integers) in the range `0` to `base - 1`, or `base` if * the code point does not represent a value. */ function basicToDigit(codePoint) { if (codePoint - 48 < 10) { return codePoint - 22; } if (codePoint - 65 < 26) { return codePoint - 65; } if (codePoint - 97 < 26) { return codePoint - 97; } return base; } /** * Converts a digit/integer into a basic code point. * @see `basicToDigit()` * @private * @param {Number} digit The numeric value of a basic code point. * @returns {Number} The basic code point whose value (when used for * representing integers) is `digit`, which needs to be in the range * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is * used; else, the lowercase form is used. The behavior is undefined * if `flag` is non-zero and `digit` has no uppercase form. */ function digitToBasic(digit, flag) { // 0..25 map to ASCII a..z or A..Z // 26..35 map to ASCII 0..9 return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); } /** * Bias adaptation function as per section 3.4 of RFC 3492. * http://tools.ietf.org/html/rfc3492#section-3.4 * @private */ function adapt(delta, numPoints, firstTime) { var k = 0; delta = firstTime ? floor(delta / damp) : delta >> 1; delta += floor(delta / numPoints); for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { delta = floor(delta / baseMinusTMin); } return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); } /** * Converts a Punycode string of ASCII-only symbols to a string of Unicode * symbols. * @memberOf punycode * @param {String} input The Punycode string of ASCII-only symbols. * @returns {String} The resulting string of Unicode symbols. */ function decode(input) { // Don't use UCS-2 var output = [], inputLength = input.length, out, i = 0, n = initialN, bias = initialBias, basic, j, index, oldi, w, k, digit, t, /** Cached calculation results */ baseMinusT; // Handle the basic code points: let `basic` be the number of input code // points before the last delimiter, or `0` if there is none, then copy // the first basic code points to the output. basic = input.lastIndexOf(delimiter); if (basic < 0) { basic = 0; } for (j = 0; j < basic; ++j) { // if it's not a basic code point if (input.charCodeAt(j) >= 0x80) { error('not-basic'); } output.push(input.charCodeAt(j)); } // Main decoding loop: start just after the last delimiter if any basic code // points were copied; start at the beginning otherwise. for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { // `index` is the index of the next character to be consumed. // Decode a generalized variable-length integer into `delta`, // which gets added to `i`. The overflow checking is easier // if we increase `i` as we go, then subtract off its starting // value at the end to obtain `delta`. for (oldi = i, w = 1, k = base; /* no condition */; k += base) { if (index >= inputLength) { error('invalid-input'); } digit = basicToDigit(input.charCodeAt(index++)); if (digit >= base || digit > floor((maxInt - i) / w)) { error('overflow'); } i += digit * w; t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); if (digit < t) { break; } baseMinusT = base - t; if (w > floor(maxInt / baseMinusT)) { error('overflow'); } w *= baseMinusT; } out = output.length + 1; bias = adapt(i - oldi, out, oldi == 0); // `i` was supposed to wrap around from `out` to `0`, // incrementing `n` each time, so we'll fix that now: if (floor(i / out) > maxInt - n) { error('overflow'); } n += floor(i / out); i %= out; // Insert `n` at position `i` of the output output.splice(i++, 0, n); } return ucs2encode(output); } /** * Converts a string of Unicode symbols (e.g. a domain name label) to a * Punycode string of ASCII-only symbols. * @memberOf punycode * @param {String} input The string of Unicode symbols. * @returns {String} The resulting Punycode string of ASCII-only symbols. */ function encode(input) { var n, delta, handledCPCount, basicLength, bias, j, m, q, k, t, currentValue, output = [], /** `inputLength` will hold the number of code points in `input`. */ inputLength, /** Cached calculation results */ handledCPCountPlusOne, baseMinusT, qMinusT; // Convert the input in UCS-2 to Unicode input = ucs2decode(input); // Cache the length inputLength = input.length; // Initialize the state n = initialN; delta = 0; bias = initialBias; // Handle the basic code points for (j = 0; j < inputLength; ++j) { currentValue = input[j]; if (currentValue < 0x80) { output.push(stringFromCharCode(currentValue)); } } handledCPCount = basicLength = output.length; // `handledCPCount` is the number of code points that have been handled; // `basicLength` is the number of basic code points. // Finish the basic string - if it is not empty - with a delimiter if (basicLength) { output.push(delimiter); } // Main encoding loop: while (handledCPCount < inputLength) { // All non-basic code points < n have been handled already. Find the next // larger one: for (m = maxInt, j = 0; j < inputLength; ++j) { currentValue = input[j]; if (currentValue >= n && currentValue < m) { m = currentValue; } } // Increase `delta` enough to advance the decoder's state to , // but guard against overflow handledCPCountPlusOne = handledCPCount + 1; if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { error('overflow'); } delta += (m - n) * handledCPCountPlusOne; n = m; for (j = 0; j < inputLength; ++j) { currentValue = input[j]; if (currentValue < n && ++delta > maxInt) { error('overflow'); } if (currentValue == n) { // Represent delta as a generalized variable-length integer for (q = delta, k = base; /* no condition */; k += base) { t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); if (q < t) { break; } qMinusT = q - t; baseMinusT = base - t; output.push( stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) ); q = floor(qMinusT / baseMinusT); } output.push(stringFromCharCode(digitToBasic(q, 0))); bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); delta = 0; ++handledCPCount; } } ++delta; ++n; } return output.join(''); } /** * Converts a Punycode string representing a domain name or an email address * to Unicode. Only the Punycoded parts of the input will be converted, i.e. * it doesn't matter if you call it on a string that has already been * converted to Unicode. * @memberOf punycode * @param {String} input The Punycoded domain name or email address to * convert to Unicode. * @returns {String} The Unicode representation of the given Punycode * string. */ function toUnicode(input) { return mapDomain(input, function(string) { return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; }); } /** * Converts a Unicode string representing a domain name or an email address to * Punycode. Only the non-ASCII parts of the domain name will be converted, * i.e. it doesn't matter if you call it with a domain that's already in * ASCII. * @memberOf punycode * @param {String} input The domain name or email address to convert, as a * Unicode string. * @returns {String} The Punycode representation of the given domain name or * email address. */ function toASCII(input) { return mapDomain(input, function(string) { return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; }); } /*--------------------------------------------------------------------------*/ /** Define the public API */ punycode = { /** * A string representing the current Punycode.js version number. * @memberOf punycode * @type String */ 'version': '1.3.2', /** * An object of methods to convert from JavaScript's internal character * representation (UCS-2) to Unicode code points, and back. * @see * @memberOf punycode * @type Object */ 'ucs2': { 'decode': ucs2decode, 'encode': ucs2encode }, 'decode': decode, 'encode': encode, 'toASCII': toASCII, 'toUnicode': toUnicode }; /** Expose `punycode` */ // Some AMD build optimizers, like r.js, check for specific condition patterns // like the following: if ( typeof define == 'function' && typeof define.amd == 'object' && define.amd ) { define('punycode', function() { return punycode; }); } else if (freeExports && freeModule) { if (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+ freeModule.exports = punycode; } else { // in Narwhal or RingoJS v0.7.0- for (key in punycode) { punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); } } } else { // in Rhino or a web browser root.punycode = punycode; } }(this)); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],400:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; // If obj.hasOwnProperty has been overridden, then calling // obj.hasOwnProperty(prop) will break. // See: https://github.com/joyent/node/issues/1707 function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } module.exports = function(qs, sep, eq, options) { sep = sep || '&'; eq = eq || '='; var obj = {}; if (typeof qs !== 'string' || qs.length === 0) { return obj; } var regexp = /\+/g; qs = qs.split(sep); var maxKeys = 1000; if (options && typeof options.maxKeys === 'number') { maxKeys = options.maxKeys; } var len = qs.length; // maxKeys <= 0 means that we should not limit keys count if (maxKeys > 0 && len > maxKeys) { len = maxKeys; } for (var i = 0; i < len; ++i) { var x = qs[i].replace(regexp, '%20'), idx = x.indexOf(eq), kstr, vstr, k, v; if (idx >= 0) { kstr = x.substr(0, idx); vstr = x.substr(idx + 1); } else { kstr = x; vstr = ''; } k = decodeURIComponent(kstr); v = decodeURIComponent(vstr); if (!hasOwnProperty(obj, k)) { obj[k] = v; } else if (isArray(obj[k])) { obj[k].push(v); } else { obj[k] = [obj[k], v]; } } return obj; }; var isArray = Array.isArray || function (xs) { return Object.prototype.toString.call(xs) === '[object Array]'; }; },{}],401:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; var stringifyPrimitive = function(v) { switch (typeof v) { case 'string': return v; case 'boolean': return v ? 'true' : 'false'; case 'number': return isFinite(v) ? v : ''; default: return ''; } }; module.exports = function(obj, sep, eq, name) { sep = sep || '&'; eq = eq || '='; if (obj === null) { obj = undefined; } if (typeof obj === 'object') { return map(objectKeys(obj), function(k) { var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; if (isArray(obj[k])) { return map(obj[k], function(v) { return ks + encodeURIComponent(stringifyPrimitive(v)); }).join(sep); } else { return ks + encodeURIComponent(stringifyPrimitive(obj[k])); } }).join(sep); } if (!name) return ''; return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj)); }; var isArray = Array.isArray || function (xs) { return Object.prototype.toString.call(xs) === '[object Array]'; }; function map (xs, f) { if (xs.map) return xs.map(f); var res = []; for (var i = 0; i < xs.length; i++) { res.push(f(xs[i], i)); } return res; } var objectKeys = Object.keys || function (obj) { var res = []; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); } return res; }; },{}],402:[function(require,module,exports){ 'use strict'; exports.decode = exports.parse = require('./decode'); exports.encode = exports.stringify = require('./encode'); },{"./decode":400,"./encode":401}],403:[function(require,module,exports){ (function (process,global,Buffer){ 'use strict' function oldBrowser () { throw new Error('secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11') } var crypto = global.crypto || global.msCrypto if (crypto && crypto.getRandomValues) { module.exports = randomBytes } else { module.exports = oldBrowser } function randomBytes (size, cb) { // phantomjs needs to throw if (size > 65536) throw new Error('requested too many random bytes') // in case browserify isn't using the Uint8Array version var rawBytes = new global.Uint8Array(size) // This will not work in older browsers. // See https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues if (size > 0) { // getRandomValues fails on IE if size == 0 crypto.getRandomValues(rawBytes) } // phantomjs doesn't like a buffer being passed here var bytes = new Buffer(rawBytes.buffer) if (typeof cb === 'function') { return process.nextTick(function () { cb(null, bytes) }) } return bytes } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) },{"_process":295,"buffer":61}],404:[function(require,module,exports){ // when this is loaded into the browser, // just use the defaults... module.exports = function (name, defaults) { return defaults } },{}],405:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. module.exports = Duplex; /**/ var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) keys.push(key); return keys; } /**/ /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Readable = require('./_stream_readable'); var Writable = require('./_stream_writable'); util.inherits(Duplex, Readable); forEach(objectKeys(Writable.prototype), function(method) { if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; }); function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); Readable.call(this, options); Writable.call(this, options); if (options && options.readable === false) this.readable = false; if (options && options.writable === false) this.writable = false; this.allowHalfOpen = true; if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; this.once('end', onend); } // the no-half-open enforcer function onend() { // if we allow half-open state, or if the writable side ended, // then we're ok. if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. process.nextTick(this.end.bind(this)); } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } }).call(this,require('_process')) },{"./_stream_readable":407,"./_stream_writable":409,"_process":295,"core-util-is":104,"inherits":167}],406:[function(require,module,exports){ arguments[4][215][0].apply(exports,arguments) },{"./_stream_transform":408,"core-util-is":104,"dup":215,"inherits":167}],407:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. module.exports = Readable; /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events').EventEmitter; /**/ if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { return emitter.listeners(type).length; }; /**/ var Stream = require('stream'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var StringDecoder; /**/ var debug = require('util'); if (debug && debug.debuglog) { debug = debug.debuglog('stream'); } else { debug = function () {}; } /**/ util.inherits(Readable, Stream); function ReadableState(options, stream) { var Duplex = require('./_stream_duplex'); options = options || {}; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = options.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } function Readable(options) { var Duplex = require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { var state = this._readableState; if (util.isString(chunk) && !state.objectMode) { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function(chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (util.isNullOrUndefined(chunk)) { state.reading = false; if (!state.ended) onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { if (state.decoder && !addToFront && !encoding) chunk = state.decoder.write(chunk); if (!addToFront) state.reading = false; // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk); else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function(enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 128MB var MAX_HWM = 0x800000; function roundUpToNextPowerOf2(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; for (var p = 1; p < 32; p <<= 1) n |= n >> p; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (isNaN(n) || util.isNull(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length; else return state.length; } if (n <= 0) return 0; // If we're asking for more than the target buffer level, // then raise the water mark. Bump up to the next highest // power of 2, to prevent increasing it excessively in tiny // amounts. if (n > state.highWaterMark) state.highWaterMark = roundUpToNextPowerOf2(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else return state.length; } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function(n) { debug('read', n); var state = this._readableState; var nOrig = n; if (!util.isNumber(n) || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this); else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state); else ret = null; if (util.isNull(ret)) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (!util.isNull(ret)) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!util.isBuffer(chunk) && !util.isString(chunk) && !util.isNullOrUndefined(chunk) && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) process.nextTick(function() { emitReadable_(stream); }); else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; process.nextTick(function() { maybeReadMore_(stream, state); }); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break; else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= n in length. // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. Readable.prototype._read = function(n) { this.emit('error', new Error('not implemented')); }; Readable.prototype.pipe = function(dest, pipeOpts) { var src = this; var state = this._readableState; switch (state.pipesCount) { case 0: state.pipes = dest; break; case 1: state.pipes = [state.pipes, dest]; break; default: state.pipes.push(dest); break; } state.pipesCount += 1; debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var endFn = doEnd ? onend : cleanup; if (state.endEmitted) process.nextTick(endFn); else src.once('end', endFn); dest.on('unpipe', onunpipe); function onunpipe(readable) { debug('onunpipe'); if (readable === src) { cleanup(); } } function onend() { debug('onend'); dest.end(); } // when the dest drains, it reduces the awaitDrain counter // on the source. This would be more elegant with a .once() // handler in flow(), but adding and removing repeatedly is // too slow. var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); function cleanup() { debug('cleanup'); // cleanup event handlers once the pipe is broken dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); dest.removeListener('error', onerror); dest.removeListener('unpipe', onunpipe); src.removeListener('end', onend); src.removeListener('end', cleanup); src.removeListener('data', ondata); // if the reader is waiting for a drain event from this // specific writer, then it would cause it to never start // flowing again. // So, if this is awaiting a drain, then we just call it now. // If we don't know, then assume that we are waiting for one. if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } src.on('data', ondata); function ondata(chunk) { debug('ondata'); var ret = dest.write(chunk); if (false === ret) { debug('false write response, pause', src._readableState.awaitDrain); src._readableState.awaitDrain++; src.pause(); } } // if the dest has an error, then stop piping into it. // however, don't suppress the throwing behavior for this. function onerror(er) { debug('onerror', er); unpipe(); dest.removeListener('error', onerror); if (EE.listenerCount(dest, 'error') === 0) dest.emit('error', er); } // This is a brutally ugly hack to make sure that our error handler // is attached before any userland ones. NEVER DO THIS. if (!dest._events || !dest._events.error) dest.on('error', onerror); else if (isArray(dest._events.error)) dest._events.error.unshift(onerror); else dest._events.error = [onerror, dest._events.error]; // Both close and finish should trigger unpipe, but only once. function onclose() { dest.removeListener('finish', onfinish); unpipe(); } dest.once('close', onclose); function onfinish() { debug('onfinish'); dest.removeListener('close', onclose); unpipe(); } dest.once('finish', onfinish); function unpipe() { debug('unpipe'); src.unpipe(dest); } // tell the dest that it's being piped to dest.emit('pipe', src); // start the flow if it hasn't been started already. if (!state.flowing) { debug('pipe resume'); src.resume(); } return dest; }; function pipeOnDrain(src) { return function() { var state = src._readableState; debug('pipeOnDrain', state.awaitDrain); if (state.awaitDrain) state.awaitDrain--; if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) { state.flowing = true; flow(src); } }; } Readable.prototype.unpipe = function(dest) { var state = this._readableState; // if we're not piping anywhere, then do nothing. if (state.pipesCount === 0) return this; // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; if (!dest) dest = state.pipes; // got a match. state.pipes = null; state.pipesCount = 0; state.flowing = false; if (dest) dest.emit('unpipe', this); return this; } // slow case. multiple pipe destinations. if (!dest) { // remove all. var dests = state.pipes; var len = state.pipesCount; state.pipes = null; state.pipesCount = 0; state.flowing = false; for (var i = 0; i < len; i++) dests[i].emit('unpipe', this); return this; } // try to find the right one. var i = indexOf(state.pipes, dest); if (i === -1) return this; state.pipes.splice(i, 1); state.pipesCount -= 1; if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this); return this; }; // set up data events if they are asked for // Ensure readable listeners eventually get something Readable.prototype.on = function(ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); // If listening to data, and it has not explicitly been paused, // then call resume to start the flow of data on the next tick. if (ev === 'data' && false !== this._readableState.flowing) { this.resume(); } if (ev === 'readable' && this.readable) { var state = this._readableState; if (!state.readableListening) { state.readableListening = true; state.emittedReadable = false; state.needReadable = true; if (!state.reading) { var self = this; process.nextTick(function() { debug('readable nexttick read 0'); self.read(0); }); } else if (state.length) { emitReadable(this, state); } } } return res; }; Readable.prototype.addListener = Readable.prototype.on; // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. Readable.prototype.resume = function() { var state = this._readableState; if (!state.flowing) { debug('resume'); state.flowing = true; if (!state.reading) { debug('resume read 0'); this.read(0); } resume(this, state); } return this; }; function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; process.nextTick(function() { resume_(stream, state); }); } } function resume_(stream, state) { state.resumeScheduled = false; stream.emit('resume'); flow(stream); if (state.flowing && !state.reading) stream.read(0); } Readable.prototype.pause = function() { debug('call pause flowing=%j', this._readableState.flowing); if (false !== this._readableState.flowing) { debug('pause'); this._readableState.flowing = false; this.emit('pause'); } return this; }; function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); if (state.flowing) { do { var chunk = stream.read(); } while (null !== chunk && state.flowing); } } // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. Readable.prototype.wrap = function(stream) { var state = this._readableState; var paused = false; var self = this; stream.on('end', function() { debug('wrapped end'); if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) self.push(chunk); } self.push(null); }); stream.on('data', function(chunk) { debug('wrapped data'); if (state.decoder) chunk = state.decoder.write(chunk); if (!chunk || !state.objectMode && !chunk.length) return; var ret = self.push(chunk); if (!ret) { paused = true; stream.pause(); } }); // proxy all the other methods. // important when wrapping filters and duplexes. for (var i in stream) { if (util.isFunction(stream[i]) && util.isUndefined(this[i])) { this[i] = function(method) { return function() { return stream[method].apply(stream, arguments); }}(i); } } // proxy certain important events. var events = ['error', 'close', 'destroy', 'pause', 'resume']; forEach(events, function(ev) { stream.on(ev, self.emit.bind(self, ev)); }); // when we try to consume some more bytes, simply unpause the // underlying stream. self._read = function(n) { debug('wrapped _read', n); if (paused) { paused = false; stream.resume(); } }; return self; }; // exposed for testing purposes only. Readable._fromList = fromList; // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. function fromList(n, state) { var list = state.buffer; var length = state.length; var stringMode = !!state.decoder; var objectMode = !!state.objectMode; var ret; // nothing in the list, definitely empty. if (list.length === 0) return null; if (length === 0) ret = null; else if (objectMode) ret = list.shift(); else if (!n || n >= length) { // read it all, truncate the array. if (stringMode) ret = list.join(''); else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = ''; else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy); else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy); else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; process.nextTick(function() { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } }); } } function forEach (xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf (xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":405,"_process":295,"buffer":61,"core-util-is":104,"events":144,"inherits":167,"isarray":172,"stream":576,"string_decoder/":616,"util":33}],408:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where // some bits pass through, and others are simply ignored. (That would // be a valid example of a transform, of course.) // // While the output is causally related to the input, it's not a // necessarily symmetric or synchronous transformation. For example, // a zlib stream might take multiple plain-text writes(), and then // emit a single compressed chunk some time in the future. // // Here's how this works: // // The Transform stream has all the aspects of the readable and writable // stream classes. When you write(chunk), that calls _write(chunk,cb) // internally, and returns false if there's a lot of pending writes // buffered up. When you call read(), that calls _read(n) until // there's enough pending readable data buffered up. // // In a transform stream, the written data is placed in a buffer. When // _read(n) is called, it transforms the queued up data, calling the // buffered _write cb's as it consumes chunks. If consuming a single // written chunk would result in multiple output chunks, then the first // outputted bit calls the readcb, and subsequent chunks just go into // the read buffer, and will cause it to emit 'readable' if necessary. // // This way, back-pressure is actually determined by the reading side, // since _read has to be called to start processing a new chunk. However, // a pathological inflate type of transform can cause excessive buffering // here. For example, imagine a stream where every byte of input is // interpreted as an integer from 0-255, and then results in that many // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in // 1kb of data being output. In this case, you could write a very small // amount of input, and end up with a very large amount of output. In // such a pathological inflating mechanism, there'd be no way to tell // the system to stop doing the transform. A single 4MB write could // cause the system to run out of memory. // // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. module.exports = Transform; var Duplex = require('./_stream_duplex'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(Transform, Duplex); function TransformState(options, stream) { this.afterTransform = function(er, data) { return afterTransform(stream, er, data); }; this.needTransform = false; this.transforming = false; this.writecb = null; this.writechunk = null; } function afterTransform(stream, er, data) { var ts = stream._transformState; ts.transforming = false; var cb = ts.writecb; if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); ts.writechunk = null; ts.writecb = null; if (!util.isNullOrUndefined(data)) stream.push(data); if (cb) cb(er); var rs = stream._readableState; rs.reading = false; if (rs.needReadable || rs.length < rs.highWaterMark) { stream._read(rs.highWaterMark); } } function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); this._transformState = new TransformState(options, this); // when the writable side finishes, then flush out anything remaining. var stream = this; // start out asking for a readable event once data is transformed. this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. this._readableState.sync = false; this.once('prefinish', function() { if (util.isFunction(this._flush)) this._flush(function(er) { done(stream, er); }); else done(stream); }); } Transform.prototype.push = function(chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); }; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // // Call `push(newChunk)` to pass along transformed output // to the readable side. You may call 'push' zero or more times. // // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. Transform.prototype._transform = function(chunk, encoding, cb) { throw new Error('not implemented'); }; Transform.prototype._write = function(chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } }; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. Transform.prototype._read = function(n) { var ts = this._transformState; if (!util.isNull(ts.writechunk) && ts.writecb && !ts.transforming) { ts.transforming = true; this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in // will get processed, now that we've asked for it. ts.needTransform = true; } }; function done(stream, er) { if (er) return stream.emit('error', er); // if there's nothing in the write buffer, then that means // that nothing more will ever be provided var ws = stream._writableState; var ts = stream._transformState; if (ws.length) throw new Error('calling transform done when ws.length != 0'); if (ts.transforming) throw new Error('calling transform done when still transforming'); return stream.push(null); } },{"./_stream_duplex":405,"core-util-is":104,"inherits":167}],409:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // A bit simpler than readable streams. // Implement an async ._write(chunk, cb), and it'll handle all // the drain event emission and buffering. module.exports = Writable; /**/ var Buffer = require('buffer').Buffer; /**/ Writable.WritableState = WritableState; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Stream = require('stream'); util.inherits(Writable, Stream); function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; } function WritableState(options, stream) { var Duplex = require('./_stream_duplex'); options = options || {}; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() var hwm = options.highWaterMark; var defaultHwm = options.objectMode ? 16 : 16 * 1024; this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // cast to ints. this.highWaterMark = ~~this.highWaterMark; this.needDrain = false; // at the start of calling end() this.ending = false; // when end() has been called, and returned this.ended = false; // when 'finish' is emitted this.finished = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. var noDecode = options.decodeStrings === false; this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. this.length = 0; // a flag to see when we're in the middle of a write. this.writing = false; // when true all writes will be buffered until .uncork() call this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) this.onwrite = function(er) { onwrite(stream, er); }; // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; // the amount that is being written when _write is called. this.writelen = 0; this.buffer = []; // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams this.prefinished = false; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; } function Writable(options) { var Duplex = require('./_stream_duplex'); // Writable ctor is applied to Duplexes, though they're not // instanceof Writable, they're instanceof Readable. if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); this._writableState = new WritableState(options, this); // legacy. this.writable = true; Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function() { this.emit('error', new Error('Cannot pipe. Not readable.')); }; function writeAfterEnd(stream, state, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); process.nextTick(function() { cb(er); }); } // If we get something that is not a buffer, string, null, or undefined, // and we're not in objectMode, then that's an error. // Otherwise stream chunks are all considered to be of length=1, and the // watermarks determine how many objects to keep in the buffer, rather than // how many bytes or characters. function validChunk(stream, state, chunk, cb) { var valid = true; if (!util.isBuffer(chunk) && !util.isString(chunk) && !util.isNullOrUndefined(chunk) && !state.objectMode) { var er = new TypeError('Invalid non-string/buffer chunk'); stream.emit('error', er); process.nextTick(function() { cb(er); }); valid = false; } return valid; } Writable.prototype.write = function(chunk, encoding, cb) { var state = this._writableState; var ret = false; if (util.isFunction(encoding)) { cb = encoding; encoding = null; } if (util.isBuffer(chunk)) encoding = 'buffer'; else if (!encoding) encoding = state.defaultEncoding; if (!util.isFunction(cb)) cb = function() {}; if (state.ended) writeAfterEnd(this, state, cb); else if (validChunk(this, state, chunk, cb)) { state.pendingcb++; ret = writeOrBuffer(this, state, chunk, encoding, cb); } return ret; }; Writable.prototype.cork = function() { var state = this._writableState; state.corked++; }; Writable.prototype.uncork = function() { var state = this._writableState; if (state.corked) { state.corked--; if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.buffer.length) clearBuffer(this, state); } }; function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && util.isString(chunk)) { chunk = new Buffer(chunk, encoding); } return chunk; } // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, chunk, encoding, cb) { chunk = decodeChunk(state, chunk, encoding); if (util.isBuffer(chunk)) encoding = 'buffer'; var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing || state.corked) state.buffer.push(new WriteReq(chunk, encoding, cb)); else doWrite(stream, state, false, len, chunk, encoding, cb); return ret; } function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; if (writev) stream._writev(chunk, state.onwrite); else stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { if (sync) process.nextTick(function() { state.pendingcb--; cb(er); }); else { state.pendingcb--; cb(er); } stream._writableState.errorEmitted = true; stream.emit('error', er); } function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; onwriteStateUpdate(state); if (er) onwriteError(stream, state, sync, er, cb); else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(stream, state); if (!finished && !state.corked && !state.bufferProcessing && state.buffer.length) { clearBuffer(stream, state); } if (sync) { process.nextTick(function() { afterWrite(stream, state, finished, cb); }); } else { afterWrite(stream, state, finished, cb); } } } function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); state.pendingcb--; cb(); finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } } // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; if (stream._writev && state.buffer.length > 1) { // Fast case, write everything using _writev() var cbs = []; for (var c = 0; c < state.buffer.length; c++) cbs.push(state.buffer[c].callback); // count the one we are adding, as well. // TODO(isaacs) clean this up state.pendingcb++; doWrite(stream, state, true, state.length, state.buffer, '', function(err) { for (var i = 0; i < cbs.length; i++) { state.pendingcb--; cbs[i](err); } }); // Clear buffer state.buffer = []; } else { // Slow case, write chunks one-by-one for (var c = 0; c < state.buffer.length; c++) { var entry = state.buffer[c]; var chunk = entry.chunk; var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, false, len, chunk, encoding, cb); // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. if (state.writing) { c++; break; } } if (c < state.buffer.length) state.buffer = state.buffer.slice(c); else state.buffer.length = 0; } state.bufferProcessing = false; } Writable.prototype._write = function(chunk, encoding, cb) { cb(new Error('not implemented')); }; Writable.prototype._writev = null; Writable.prototype.end = function(chunk, encoding, cb) { var state = this._writableState; if (util.isFunction(chunk)) { cb = chunk; chunk = null; encoding = null; } else if (util.isFunction(encoding)) { cb = encoding; encoding = null; } if (!util.isNullOrUndefined(chunk)) this.write(chunk, encoding); // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); } // ignore unnecessary end() calls. if (!state.ending && !state.finished) endWritable(this, state, cb); }; function needFinish(stream, state) { return (state.ending && state.length === 0 && !state.finished && !state.writing); } function prefinish(stream, state) { if (!state.prefinished) { state.prefinished = true; stream.emit('prefinish'); } } function finishMaybe(stream, state) { var need = needFinish(stream, state); if (need) { if (state.pendingcb === 0) { prefinish(stream, state); state.finished = true; stream.emit('finish'); } else prefinish(stream, state); } return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { if (state.finished) process.nextTick(cb); else stream.once('finish', cb); } state.ended = true; } }).call(this,require('_process')) },{"./_stream_duplex":405,"_process":295,"buffer":61,"core-util-is":104,"inherits":167,"stream":576}],410:[function(require,module,exports){ (function (process){ exports = module.exports = require('./lib/_stream_readable.js'); exports.Stream = require('stream'); exports.Readable = exports; exports.Writable = require('./lib/_stream_writable.js'); exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); if (!process.browser && process.env.READABLE_STREAM === 'disable') { module.exports = require('stream'); } }).call(this,require('_process')) },{"./lib/_stream_duplex.js":405,"./lib/_stream_passthrough.js":406,"./lib/_stream_readable.js":407,"./lib/_stream_transform.js":408,"./lib/_stream_writable.js":409,"_process":295,"stream":576}],411:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module remark:html * @fileoverview Compile Markdown to HTML with remark. */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var compilers = require('./lib/compilers'); var transformer = require('./lib/transformer'); /** * Attach an HTML compiler. * * @param {Remark} remark - Instance. * @param {Object?} [options] - Configuration. */ function plugin(remark, options) { var MarkdownCompiler = remark.Compiler; var ancestor = MarkdownCompiler.prototype; var proto; var key; /** * Extensible prototype. */ function HTMLCompilerPrototype() {} HTMLCompilerPrototype.prototype = ancestor; proto = new HTMLCompilerPrototype(); proto.options.xhtml = false; proto.options.sanitize = false; proto.options.entities = 'true'; /** * Extensible constructor. * * @param {VFile} file - Virtual file. */ function HTMLCompiler(file) { if (file.extension) { file.move({ 'extension': 'html' }); } MarkdownCompiler.apply(this, [file, options]); } HTMLCompiler.prototype = proto; /* * Expose compilers. */ for (key in compilers) { proto[key] = compilers[key]; } remark.Compiler = HTMLCompiler; return transformer; } /* * Expose `plugin`. */ module.exports = plugin; },{"./lib/compilers":412,"./lib/transformer":414}],412:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module remark:html:compilers * @fileoverview Compilers to transform mdast nodes to HTML. */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var trim = require('trim'); var detab = require('detab'); var collapse = require('collapse-white-space'); var normalizeURI = require('normalize-uri'); var trimLines = require('trim-lines'); var visit = require('unist-util-visit'); var h = require('./h.js'); /* * Compilers. */ var visitors = {}; /** * Return the content of a reference without definition * as markdown. * * @example * failsafe({ * identifier: 'foo', * referenceType: 'shortcut', * children: [ * { * type: 'text', * value: 'foo' * } * ] * }, {}); // '[foo]' * * @param {Node} node - Node to compile. * @param {Node?} definition - Definition node, when * existing. * @param {HTMLCompiler} context - Instance. * @return {string?} - If without definition, returns a * string, returns nothing otherwise. */ function failsafe(node, definition, context) { var result; if (node.referenceType === 'shortcut' && !definition.link) { result = node.children ? context.all(node).join('') : node.alt; return (node.type === 'imageReference' ? '!' : '') + '[' + result + ']'; } return ''; } /** * Stringify all footnote definitions, if any. * * @example * generateFootnotes(); // '
\n
\n...' * * @return {string} - Compiled footnotes, if any. * @this {HTMLCompiler} */ function generateFootnotes() { var self = this; var definitions = self.footnotes; var length = definitions.length; var index = -1; var results = []; var def; if (!length) { return ''; } while (++index < length) { def = definitions[index]; results[index] = self.listItem({ 'type': 'listItem', 'data': { 'htmlAttributes': { 'id': 'fn-' + def.identifier } }, 'children': def.children.concat({ 'type': 'link', 'href': '#fnref-' + def.identifier, 'data': { 'htmlAttributes': { 'class': 'footnote-backref' } }, 'children': [{ 'type': 'text', 'value': '↩' }] }), 'position': def.position }, {}); } return h(self, null, { 'name': 'div', 'attributes': { 'class': 'footnotes' }, 'content': h(self, null, { 'name': 'hr' }) + '\n' + h(self, null, { 'name': 'ol', 'content': results.join('\n') }, null, true) }, null, true) + '\n'; } /** * Stringify an unknown node. * * @example * unknown({ * data: { * htmlName: 'section' * }, * children: [ * { * type: 'text', * value: 'foo' * } * ] * }); // '
foo
' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function unknown(node) { var content = 'children' in node ? this.all(node).join('') : node.value; return h(this, node, { 'name': 'div', 'content': content || '' }, node.data); } /** * Visit a node. * * @example * var compiler = new Compiler(); * * compiler.visit({ * type: 'strong', * children: [{ * type: 'text', * value: 'Foo' * }] * }); * // '**Foo**' * * @param {Object} node - Node. * @param {Object?} [parent] - `node`s parent. * @return {string} - Compiled `node`. */ function one(node, parent) { var self = this; var type = node && node.type; var fn = typeof self[type] === 'function' ? type : 'unknown'; if (!type) { self.file.fail('Expected node `' + node + '`'); } return self[fn](node, parent); } /** * Stringify the children of `node`. * * @example * all({ * children: [ * { * type: 'text', * value: 'foo' * } * ] * }); // 'foo' * * @param {Node} parent - Parent to visit. * @return {Array.} - List of compiled nodes. * @this {HTMLCompiler} */ function all(parent) { var self = this; var nodes = parent.children; var values = []; var index = -1; var length = nodes.length; var value; var prev; while (++index < length) { value = self.visit(nodes[index], parent); if (value) { if (prev && prev.type === 'break') { value = trim.left(value); } values.push(value); } prev = nodes[index]; } return values; } /** * Stringify a root object. * * @example * // This will additionally include defined footnotes, * // when applicable. * root({ * children: [ * { * type: 'paragraph', * children: [ * { * type: 'text', * value: 'foo' * } * ] * } * ] * }); // '

foo

\n' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function root(node) { var self = this; var definitions = {}; var footnotes = []; var result; self.definitions = definitions; self.footnotes = footnotes; visit(node, 'definition', function (definition) { definitions[definition.identifier.toUpperCase()] = definition; }); visit(node, 'footnoteDefinition', function (definition) { footnotes.push(definition); }); result = self.all(node).join('\n'); return (result ? result + '\n' : '') + self.generateFootnotes(); } /** * Stringify a block quote. * * @example * blockquote({ * children: [ * { * type: 'paragraph', * children: [ * { * type: 'text', * value: 'foo' * } * ] * } * ] * }); // '
\n

foo

\n
' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function blockquote(node) { return h(this, node, { 'name': 'blockquote', 'content': this.all(node).join('\n') }, node.data, true); } /** * Stringify an inline footnote. * * @example * // This additionally adds a definition at the bottem * // of the document. * footnote({ * children: [ * { * type: 'text', * value: 'foo' * } * ] * }); // '
1' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function footnote(node) { var self = this; var definitions = self.footnotes; var index = -1; var length = definitions.length; var identifiers = []; var identifier; while (++index < length) { identifiers[index] = definitions[index].identifier; } index = -1; identifier = 1; while (identifiers.indexOf(String(identifier)) !== -1) { identifier++; } identifier = String(identifier); self.footnotes.push({ 'type': 'footnoteDefinition', 'identifier': identifier, 'children': node.children, 'position': node.position }); return self.footnoteReference({ 'type': 'footnoteReference', 'identifier': identifier, 'position': node.position }); } /** * Stringify a list. * * @example * list({ * ordered: true * loose: false * children: [ * { * type: 'listItem', * children: [ * { * type: 'paragraph', * children: [ * { * type: 'text', * value: 'foo' * } * ] * } * ] * } * ] * }); // '
    \n
  1. foo
  2. \n
' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function list(node) { return h(this, node, { 'name': node.ordered ? 'ol' : 'ul', 'attributes': { 'start': node.start !== 1 ? node.start : null }, 'content': this.all(node).join('\n') }, node.data, true); } /** * Stringify a list-item. * * @example * listItem({ * children: [ * { * type: 'paragraph', * children: [ * { * type: 'text', * value: 'foo' * } * ] * } * ] * }, { * loose: false * }); // '
  • foo
  • ' * * @param {Node} node - Node to compile. * @param {Node} parent - Parent of `node`. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function listItem(node, parent) { var single; var result; single = !parent.loose && node.children.length === 1 && node.children[0].children; result = this.all(single ? node.children[0] : node) .join(single ? '' : '\n'); return h(this, node, { 'name': 'li', 'content': result }, node.data, !single); } /** * Stringify a heading. * * @example * heading({ * depth: 3, * children: [ * { * type: 'text', * value: 'foo' * } * ] * }); // '

    foo

    ' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function heading(node) { return h(this, node, { 'name': 'h' + node.depth, 'content': this.all(node).join('') }, node.data); } /** * Stringify a paragraph. * * @example * paragraph({ * children: [ * { * type: 'text', * value: 'foo' * } * ] * }); // 'foo' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function paragraph(node) { return h(this, node, { 'name': 'p', 'content': trim(detab(this.all(node).join(''))) }, node.data); } /** * Stringify a code block. * * @example * code({ * value: 'foo & bar;' * }); // '
    foo &amp; bar\n
    ' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function code(node) { var self = this; var value = node.value ? detab(node.value + '\n') : ''; return h(self, node, { 'name': 'pre', 'content': h(self, node, { 'name': 'code', 'content': self.encode(value) }, node.data) }); } /** * Stringify a table. * * @example * table({ * children: [ * { * type: 'tableRow', * ... * } * ] * }); // '...' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function table(node) { var self = this; var rows = node.children; var index = rows.length; var align = node.align; var alignLength = align.length; var pos; var result = []; var row; var out; var name; var cell; while (index--) { pos = alignLength; row = rows[index].children; out = []; name = index === 0 ? 'th' : 'td'; while (pos--) { cell = row[pos]; out[pos] = h(self, cell, { 'name': name, 'attributes': { 'align': align[pos] }, 'content': cell ? self.all(cell).join('\n') : '' }, cell && cell.data); } result[index] = h(self, rows[index], { 'name': 'tr', 'content': out.join('\n') }, rows[index], true); } return h(self, node, { 'name': 'table', 'content': h(self, node, { 'name': 'thead', 'content': result[0] }, null, true) + '\n' + h(self, node, { 'name': 'tbody', 'content': result.slice(1).join('\n') }, null, true) }, node.data, true); } /** * Stringify a literal HTML. * * @example * html({ * value: 'italic' * }); // 'italic' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function html(node) { return this.options.sanitize ? this.encode(node.value) : node.value; } /** * Stringify a horizontal rule. * * @example * rule(); // '
    ' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function rule(node) { return h(this, node, { 'name': 'hr' }, node.data); } /** * Stringify inline code. * * @example * inlineCode({ * value: 'foo & bar;' * }); // 'foo &amp; bar;' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function inlineCode(node) { return h(this, node, { 'name': 'code', 'content': collapse(this.encode(node.value)) }, node.data); } /** * Stringify strongly emphasised content. * * @example * strong({ * children: [ * { * type: 'text', * value: 'foo' * } * ] * }); // 'foo' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function strong(node) { return h(this, node, { 'name': 'strong', 'content': this.all(node).join('') }, node.data); } /** * Stringify emphasised content. * * @example * emphasis({ * children: [ * { * type: 'text', * value: 'foo' * } * ] * }); // 'foo' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function emphasis(node) { return h(this, node, { 'name': 'em', 'content': this.all(node).join('') }, node.data); } /** * Stringify an inline break. * * @example * hardBreak(); // '
    \n' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function hardBreak(node) { return h(this, node, { 'name': 'br' }, node.data) + '\n'; } /** * Stringify a link. * * @example * link({ * href: 'http://example.com', * children: [ * { * type: 'text', * value: 'foo' * } * ] * }); // 'foo' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function link(node) { return h(this, node, { 'name': 'a', 'attributes': { 'href': normalizeURI(node.href), 'title': node.title }, 'content': this.all(node).join('') }, node.data); } /** * Stringify a reference to a footnote. * * @example * // If a definition was added previously: * footnoteReference({ * identifier: 'foo' * }); * // * // foo * // * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function footnoteReference(node) { var identifier = node.identifier; return h(this, node, { 'name': 'sup', 'attributes': { 'id': 'fnref-' + identifier }, 'content': h(this, node, { 'name': 'a', 'attributes': { 'href': '#fn-' + identifier, 'class': 'footnote-ref' }, 'content': identifier }) }, node.data); } /** * Stringify a reference to a link. * * @example * // If a definition was added previously: * linkReference({ * identifier: 'foo' * }); // '' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function linkReference(node) { var self = this; var def = self.definitions[node.identifier.toUpperCase()] || {}; return failsafe(node, def, self) || h(self, node, { 'name': 'a', 'attributes': { 'href': normalizeURI(def.link || ''), 'title': def.title }, 'content': self.all(node).join('') }, node.data); } /** * Stringify a reference to an image. * * @example * // If a definition was added previously: * imageReference({ * identifier: 'foo' * }); // '' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function imageReference(node) { var self = this; var def = self.definitions[node.identifier.toUpperCase()] || {}; return failsafe(node, def, self) || h(self, node, { 'name': 'img', 'attributes': { 'src': normalizeURI(def.link || ''), 'alt': node.alt || '', 'title': def.title } }, node.data); } /** * Stringify an image. * * @example * image({ * src: 'http://example.com/fav.ico' * }); // '' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function image(node) { return h(this, node, { 'name': 'img', 'attributes': { 'src': normalizeURI(node.src), 'alt': node.alt || '', 'title': node.title } }, node.data); } /** * Stringify a deletion. * * @example * strikethrough({ * children: [ * { * type: 'text', * value: 'foo' * } * ] * }); // 'foo' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function strikethrough(node) { return h(this, node, { 'name': 'del', 'content': this.all(node).join('') }, node.data); } /** * Stringify text. * * @example * text({value: '&'}); // '&' * * text({value: 'foo'}); // 'foo' * * @param {Node} node - Node to compile. * @return {string} - Compiled node. * @this {HTMLCompiler} */ function text(node) { return trimLines(this.encode(node.value)); } /** * Return an empty string for nodes which are ignored. * * @example * ignore(); // '' * * @return {string} - Empty string. * @this {HTMLCompiler} */ function ignore() { return ''; } /* * Helpers. */ visitors.visit = one; visitors.all = all; visitors.unknown = unknown; visitors.generateFootnotes = generateFootnotes; /* * Ignored nodes. */ visitors.yaml = ignore; visitors.definition = ignore; visitors.footnoteDefinition = ignore; /* * Compilers. */ visitors.footnote = footnote; visitors.root = root; visitors.blockquote = blockquote; visitors.list = list; visitors.listItem = listItem; visitors.paragraph = paragraph; visitors.heading = heading; visitors.table = table; visitors.code = code; visitors.html = html; visitors.horizontalRule = rule; visitors.inlineCode = inlineCode; visitors.strong = strong; visitors.emphasis = emphasis; visitors.break = hardBreak; visitors.link = link; visitors.image = image; visitors.footnoteReference = footnoteReference; visitors.linkReference = linkReference; visitors.imageReference = imageReference; visitors.delete = strikethrough; visitors.text = text; visitors.escape = escape; /* * Expose. */ module.exports = visitors; },{"./h.js":413,"collapse-white-space":84,"detab":119,"normalize-uri":273,"trim":622,"trim-lines":620,"unist-util-visit":631}],413:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module remark:html:h * @fileoverview * Create HTML nodes. Loosely inspired by * https://github.com/Matt-Esch/virtual-dom/blob/master/ * virtual-hyperscript/index.js */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var assign = require('object-assign'); /* * Constants. */ var LINE = '\n'; var EMPTY = ''; var SPACE = ' '; var GT = '>'; var LT = '<'; var SLASH = '/'; var QUOTE = '"'; var EQUALS = '='; /* * List of self-closing tags. */ var CLOSING = ['hr', 'img', 'br']; /** * Compile attributes. * * @param {Object?} attributes - Map of attributes. * @param {function(string): string} encode - Strategy * to use. * @param {Node} node - mdast node currently being * compiled. * @return {string} - HTML attributes. */ function toAttributes(attributes, encode, node) { var parameters = []; var key; var value; for (key in attributes) { value = attributes[key]; if (value !== null && value !== undefined) { value = encode(String(value || EMPTY), node); parameters.push(key + EQUALS + QUOTE + value + QUOTE); } } return parameters.length ? parameters.join(SPACE) : EMPTY; } /** * Compile a `node`, in `context`, into HTML. * * @example * h(compiler, { * 'type': 'break' * 'attributes': { * 'id': 'foo' * } * }, 'br') // '
    ' * * h(compiler, { * 'type': 'break' * }, 'br', { * 'id': 'foo' * }) // '
    ' * * @param {HTMLCompiler} context - Context compiler. * @param {Node} node - mdast node. Used for positions * on errors. * @param {Object?} [defaults] - Default HTML configuration. * @param {Object?} [defaults.attributes] - Default Attributes. * @param {Object?} [defaults.content] - Default content. * @param {Object?} [defaults.name] - Default tag-name. * @param {Object?} [data] - Node configuration. * @param {Object?} [data.htmlAttributes] - HTML Attributes. * @param {Object?} [data.htmlContent] - Content of element. * @param {Object?} [data.htmlName] - Tag-name. * @param {boolean} [loose] - Whether to add an initial and * a trailing newline character inside the opening and * closing tags. * @return {string} - HTML representation of `node`, based * on the given options. */ function h(context, node, defaults, data, loose) { var name; var value; var parameters; var content; if (!data) { data = {}; } name = context.encode(data.htmlName || defaults.name); if (data.htmlContent && !context.options.sanitize) { content = data.htmlContent; } else { content = defaults.content || EMPTY; } parameters = toAttributes( assign({}, defaults.attributes, data.htmlAttributes ), context.encode, node); value = LT + name + (parameters ? SPACE + parameters : EMPTY); if (CLOSING.indexOf(name) !== -1) { return value + (context.options.xhtml ? SPACE + SLASH : EMPTY) + GT; } return value + GT + (loose ? LINE : EMPTY) + content + (loose && content ? LINE : EMPTY) + LT + SLASH + name + GT; } /* * Expose. */ module.exports = h; },{"object-assign":274}],414:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module remark:html:compilers * @fileoverview AST transformer for HTML. */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var visit = require('unist-util-visit'); /* * Constants. */ var FIRST_WORD = /^[^\ \t]+(?=[\ \t]|$)/; /** * Helper to get/set `htmlAttributes`. * * @param {Node} node - Node to get data from. * @return {Object} - Attributes. */ function getAttributes(node) { var data = node.data || (node.data = {}); return data.htmlAttributes || (data.htmlAttributes = {}); } /** * Augment a code node. * * @param {Node} node - Code node. */ function code(node) { var lang = node.lang && node.lang.match(FIRST_WORD); var attrs; if (!lang) { return; } attrs = getAttributes(node); attrs.class = (attrs.class ? attrs.class + ' ' : '') + 'language-' + lang; } /* * Map of node-type handlers. */ var handlers = {}; handlers.code = code; /** * Transform `ast`. * * @param {Node} ast - Tree. */ function transformer(ast) { visit(ast, function (node) { if (node.type in handlers) { handlers[node.type](node); } }); } /* * Expose. */ module.exports = transformer; },{"unist-util-visit":631}],415:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015-2016 Titus Wormer * @license MIT * @module remark * @version 3.2.2 * @fileoverview Markdown processor powered by plugins. */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var unified = require('unified'); var Parser = require('./lib/parse.js'); var Compiler = require('./lib/stringify.js'); var escape = require('./lib/escape.json'); /* * Exports. */ module.exports = unified({ 'name': 'mdast', 'Parser': Parser, 'Compiler': Compiler, 'data': { 'escape': escape } }); },{"./lib/escape.json":418,"./lib/parse.js":419,"./lib/stringify.js":420,"unified":630}],416:[function(require,module,exports){ module.exports=[ "article", "header", "aside", "hgroup", "blockquote", "hr", "iframe", "body", "li", "map", "button", "object", "canvas", "ol", "caption", "output", "col", "p", "colgroup", "pre", "dd", "progress", "div", "section", "dl", "table", "td", "dt", "tbody", "embed", "textarea", "fieldset", "tfoot", "figcaption", "th", "figure", "thead", "footer", "tr", "form", "ul", "h1", "h2", "h3", "h4", "h5", "h6", "video", "script", "style" ] },{}],417:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015-2016 Titus Wormer * @license MIT * @module remark:defaults * @version 3.2.2 * @fileoverview Default values for parse and * stringification settings. */ 'use strict'; /* eslint-env commonjs */ /* * Note that `stringify.entities` is a string. */ module.exports = { 'parse': { 'position': true, 'gfm': true, 'yaml': true, 'commonmark': false, 'footnotes': false, 'pedantic': false, 'breaks': false }, 'stringify': { 'gfm': true, 'commonmark': false, 'entities': 'false', 'setext': false, 'closeAtx': false, 'looseTable': false, 'spacedTable': true, 'incrementListMarker': true, 'fences': false, 'fence': '`', 'bullet': '-', 'listItemIndent': 'tab', 'rule': '*', 'ruleSpaces': true, 'ruleRepetition': 3, 'strong': '*', 'emphasis': '_' } }; },{}],418:[function(require,module,exports){ module.exports={ "default": [ "\\", "`", "*", "{", "}", "[", "]", "(", ")", "#", "+", "-", ".", "!", "_", ">" ], "gfm": [ "\\", "`", "*", "{", "}", "[", "]", "(", ")", "#", "+", "-", ".", "!", "_", ">", "~", "|" ], "commonmark": [ "\\", "`", "*", "{", "}", "[", "]", "(", ")", "#", "+", "-", ".", "!", "_", ">", "~", "|", "\n", "\"", "$", "%", "&", "'", ",", "/", ":", ";", "<", "=", "?", "@", "^" ] } },{}],419:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015-2016 Titus Wormer * @license MIT * @module remark:parse * @version 3.2.2 * @fileoverview Parse a markdown document into an * abstract syntax tree. */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var decode = require('parse-entities'); var repeat = require('repeat-string'); var trim = require('trim'); var trimTrailingLines = require('trim-trailing-lines'); var extend = require('extend.js'); var utilities = require('./utilities.js'); var defaultOptions = require('./defaults.js').parse; var blockElements = require('./block-elements.json'); /* * Methods. */ var raise = utilities.raise; var clean = utilities.clean; var validate = utilities.validate; var normalize = utilities.normalizeIdentifier; var stateToggler = utilities.stateToggler; var mergeable = utilities.mergeable; var MERGEABLE_NODES = utilities.MERGEABLE_NODES; var has = {}.hasOwnProperty; /* * Numeric constants. */ var SPACE_SIZE = 1; var TAB_SIZE = 4; var CODE_INDENT_LENGTH = 4; var MIN_FENCE_COUNT = 3; var MAX_ATX_COUNT = 6; var MAX_LINE_HEADING_INDENT = 3; var HORIZONTAL_RULE_MARKER_COUNT = 3; var MIN_CLOSING_HTML_NEWLINE_COUNT = 2; var MIN_BREAK_LENGTH = 2; var MIN_TABLE_COLUMNS = 2; var MIN_TABLE_ROWS = 2; /* * Error messages. */ var ERR_INFINITE_LOOP = 'Infinite loop'; var ERR_MISSING_LOCATOR = 'Missing locator: '; var ERR_INCORRECTLY_EATEN = 'Incorrectly eaten value: please report this ' + 'warning on http://git.io/vUYWz'; /* * Expressions. */ var EXPRESSION_BULLET = /^([ \t]*)([*+-]|\d+[.)])( {1,4}(?! )| |\t|$|(?=\n))([^\n]*)/; var EXPRESSION_PEDANTIC_BULLET = /^([ \t]*)([*+-]|\d+[.)])([ \t]+)/; var EXPRESSION_INITIAL_INDENT = /^( {1,4}|\t)?/gm; var EXPRESSION_INITIAL_TAB = /^( {4}|\t)?/gm; var EXPRESSION_HTML_LINK_OPEN = /^/i; var EXPRESSION_LOOSE_LIST_ITEM = /\n\n(?!\s*$)/; var EXPRESSION_TASK_ITEM = /^\[([\ \t]|x|X)\][\ \t]/; /* * Characters. */ var C_BACKSLASH = '\\'; var C_UNDERSCORE = '_'; var C_ASTERISK = '*'; var C_TICK = '`'; var C_AT_SIGN = '@'; var C_HASH = '#'; var C_PLUS = '+'; var C_DASH = '-'; var C_DOT = '.'; var C_PIPE = '|'; var C_DOUBLE_QUOTE = '"'; var C_SINGLE_QUOTE = '\''; var C_COMMA = ','; var C_SLASH = '/'; var C_COLON = ':'; var C_SEMI_COLON = ';'; var C_QUESTION_MARK = '?'; var C_CARET = '^'; var C_EQUALS = '='; var C_EXCLAMATION_MARK = '!'; var C_TILDE = '~'; var C_LT = '<'; var C_GT = '>'; var C_BRACKET_OPEN = '['; var C_BRACKET_CLOSE = ']'; var C_PAREN_OPEN = '('; var C_PAREN_CLOSE = ')'; var C_SPACE = ' '; var C_FORM_FEED = '\f'; var C_NEWLINE = '\n'; var C_CARRIAGE_RETURN = '\r'; var C_TAB = '\t'; var C_VERTICAL_TAB = '\v'; var C_NO_BREAK_SPACE = '\u00a0'; var C_OGHAM_SPACE = '\u1680'; var C_MONGOLIAN_VOWEL_SEPARATOR = '\u180e'; var C_EN_QUAD = '\u2000'; var C_EM_QUAD = '\u2001'; var C_EN_SPACE = '\u2002'; var C_EM_SPACE = '\u2003'; var C_THREE_PER_EM_SPACE = '\u2004'; var C_FOUR_PER_EM_SPACE = '\u2005'; var C_SIX_PER_EM_SPACE = '\u2006'; var C_FIGURE_SPACE = '\u2007'; var C_PUNCTUATION_SPACE = '\u2008'; var C_THIN_SPACE = '\u2009'; var C_HAIR_SPACE = '\u200a'; var C_LINE_SEPARATOR = '​\u2028'; var C_PARAGRAPH_SEPARATOR = '​\u2029'; var C_NARROW_NO_BREAK_SPACE = '\u202f'; var C_IDEOGRAPHIC_SPACE = '\u3000'; var C_ZERO_WIDTH_NO_BREAK_SPACE = '\ufeff'; var C_X_LOWER = 'x'; /* * Character codes. */ var CC_A_LOWER = 'a'.charCodeAt(0); var CC_A_UPPER = 'A'.charCodeAt(0); var CC_Z_LOWER = 'z'.charCodeAt(0); var CC_Z_UPPER = 'Z'.charCodeAt(0); var CC_0 = '0'.charCodeAt(0); var CC_9 = '9'.charCodeAt(0); /* * Protocols. */ var HTTP_PROTOCOL = 'http://'; var HTTPS_PROTOCOL = 'https://'; var MAILTO_PROTOCOL = 'mailto:'; var PROTOCOLS = [ HTTP_PROTOCOL, HTTPS_PROTOCOL, MAILTO_PROTOCOL ]; var PROTOCOLS_LENGTH = PROTOCOLS.length; /* * Textual constants. */ var YAML_FENCE = repeat(C_DASH, 3); var CODE_INDENT = repeat(C_SPACE, CODE_INDENT_LENGTH); var EMPTY = ''; var BLOCK = 'block'; var INLINE = 'inline'; var COMMENT_START = ''; var CDATA_START = ''; var COMMENT_END_CHAR = COMMENT_END.charAt(0); var CDATA_END_CHAR = CDATA_END.charAt(0); var COMMENT_START_LENGTH = COMMENT_START.length; var COMMENT_END_LENGTH = COMMENT_END.length; var CDATA_START_LENGTH = CDATA_START.length; var CDATA_END_LENGTH = CDATA_END.length; /* * Node types. */ var T_HORIZONTAL_RULE = 'horizontalRule'; var T_HTML = 'html'; var T_YAML = 'yaml'; var T_TABLE = 'table'; var T_TABLE_CELL = 'tableCell'; var T_TABLE_HEADER = 'tableHeader'; var T_TABLE_ROW = 'tableRow'; var T_PARAGRAPH = 'paragraph'; var T_TEXT = 'text'; var T_CODE = 'code'; var T_LIST = 'list'; var T_LIST_ITEM = 'listItem'; var T_DEFINITION = 'definition'; var T_FOOTNOTE_DEFINITION = 'footnoteDefinition'; var T_HEADING = 'heading'; var T_BLOCKQUOTE = 'blockquote'; var T_LINK = 'link'; var T_IMAGE = 'image'; var T_FOOTNOTE = 'footnote'; var T_STRONG = 'strong'; var T_EMPHASIS = 'emphasis'; var T_DELETE = 'delete'; var T_INLINE_CODE = 'inlineCode'; var T_BREAK = 'break'; var T_ROOT = 'root'; /* * Available table alignments. */ var TABLE_ALIGN_LEFT = 'left'; var TABLE_ALIGN_CENTER = 'center'; var TABLE_ALIGN_RIGHT = 'right'; var TABLE_ALIGN_NONE = null; /* * Available reference types. */ var REFERENCE_TYPE_SHORTCUT = 'shortcut'; var REFERENCE_TYPE_COLLAPSED = 'collapsed'; var REFERENCE_TYPE_FULL = 'full'; /* * A map of characters, and their column length, * which can be used as indentation. */ var INDENTATION_CHARACTERS = {}; INDENTATION_CHARACTERS[C_SPACE] = SPACE_SIZE; INDENTATION_CHARACTERS[C_TAB] = TAB_SIZE; /* * A map of characters, which can be used to mark emphasis. */ var EMPHASIS_MARKERS = {}; EMPHASIS_MARKERS[C_ASTERISK] = true; EMPHASIS_MARKERS[C_UNDERSCORE] = true; /* * A map of characters, which can be used to mark rules. */ var RULE_MARKERS = {}; RULE_MARKERS[C_ASTERISK] = true; RULE_MARKERS[C_UNDERSCORE] = true; RULE_MARKERS[C_DASH] = true; /* * A map of characters which can be used to mark * list-items. */ var LIST_UNORDERED_MARKERS = {}; LIST_UNORDERED_MARKERS[C_ASTERISK] = true; LIST_UNORDERED_MARKERS[C_PLUS] = true; LIST_UNORDERED_MARKERS[C_DASH] = true; /* * A map of characters which can be used to mark * list-items after a digit. */ var LIST_ORDERED_MARKERS = {}; LIST_ORDERED_MARKERS[C_DOT] = true; /* * A map of characters which can be used to mark * list-items after a digit. */ var LIST_ORDERED_COMMONMARK_MARKERS = {}; LIST_ORDERED_COMMONMARK_MARKERS[C_DOT] = true; LIST_ORDERED_COMMONMARK_MARKERS[C_PAREN_CLOSE] = true; /* * A map of characters, which can be used to mark link * and image titles. */ var LINK_TITLE_MARKERS = {}; LINK_TITLE_MARKERS[C_DOUBLE_QUOTE] = C_DOUBLE_QUOTE; LINK_TITLE_MARKERS[C_SINGLE_QUOTE] = C_SINGLE_QUOTE; /* * A map of characters, which can be used to mark link * and image titles in commonmark-mode. */ var COMMONMARK_LINK_TITLE_MARKERS = {}; COMMONMARK_LINK_TITLE_MARKERS[C_DOUBLE_QUOTE] = C_DOUBLE_QUOTE; COMMONMARK_LINK_TITLE_MARKERS[C_SINGLE_QUOTE] = C_SINGLE_QUOTE; COMMONMARK_LINK_TITLE_MARKERS[C_PAREN_OPEN] = C_PAREN_CLOSE; /* * A map of characters which can be used to mark setext * headers, mapping to their corresponding depth. */ var SETEXT_MARKERS = {}; SETEXT_MARKERS[C_EQUALS] = 1; SETEXT_MARKERS[C_DASH] = 2; /* * A map of two functions which can create list items. */ var LIST_ITEM_MAP = {}; LIST_ITEM_MAP.true = renderPedanticListItem; LIST_ITEM_MAP.false = renderNormalListItem; /** * Check whether `character` is alphabetic. * * @param {string} character - Single character to check. * @return {boolean} - Whether or not `character` is * alphabetic. */ function isAlphabetic(character) { var code = character.charCodeAt(0); return (code >= CC_A_LOWER && code <= CC_Z_LOWER) || (code >= CC_A_UPPER && code <= CC_Z_UPPER); } /** * Check whether `character` is numeric. * * @param {string} character - Single character to check. * @return {boolean} - Whether or not `character` is * numeric. */ function isNumeric(character) { var code = character.charCodeAt(0); return code >= CC_0 && code <= CC_9; } /** * Check whether `character` is a word character. * * @param {string} character - Single character to check. * @return {boolean} - Whether or not `character` is a * word character. */ function isWordCharacter(character) { return character === C_UNDERSCORE || isAlphabetic(character) || isNumeric(character); } /** * Check whether `character` is white-space. * * @param {string} character - Single character to check. * @return {boolean} - Whether or not `character` is * white-space. */ function isWhiteSpace(character) { return character === C_SPACE || character === C_FORM_FEED || character === C_NEWLINE || character === C_CARRIAGE_RETURN || character === C_TAB || character === C_VERTICAL_TAB || character === C_NO_BREAK_SPACE || character === C_OGHAM_SPACE || character === C_MONGOLIAN_VOWEL_SEPARATOR || character === C_EN_QUAD || character === C_EM_QUAD || character === C_EN_SPACE || character === C_EM_SPACE || character === C_THREE_PER_EM_SPACE || character === C_FOUR_PER_EM_SPACE || character === C_SIX_PER_EM_SPACE || character === C_FIGURE_SPACE || character === C_PUNCTUATION_SPACE || character === C_THIN_SPACE || character === C_HAIR_SPACE || character === C_LINE_SEPARATOR || character === C_PARAGRAPH_SEPARATOR || character === C_NARROW_NO_BREAK_SPACE || character === C_IDEOGRAPHIC_SPACE || character === C_ZERO_WIDTH_NO_BREAK_SPACE; } /** * Check whether `character` can be inside an unquoted * attribute value. * * @param {string} character - Single character to check. * @return {boolean} - Whether or not `character` can be * inside an unquoted attribute value. */ function isUnquotedAttributeCharacter(character) { return character !== C_DOUBLE_QUOTE && character !== C_SINGLE_QUOTE && character !== C_EQUALS && character !== C_LT && character !== C_GT && character !== C_TICK; } /** * Check whether `character` can be inside a double-quoted * attribute value. * * @property {string} delimiter - Closing delimiter. * @param {string} character - Single character to check. * @return {boolean} - Whether or not `character` can be * inside a double-quoted attribute value. */ function isDoubleQuotedAttributeCharacter(character) { return character !== C_DOUBLE_QUOTE; } isDoubleQuotedAttributeCharacter.delimiter = C_DOUBLE_QUOTE; /** * Check whether `character` can be inside a single-quoted * attribute value. * * @property {string} delimiter - Closing delimiter. * @param {string} character - Single character to check. * @return {boolean} - Whether or not `character` can be * inside a single-quoted attribute value. */ function isSingleQuotedAttributeCharacter(character) { return character !== C_SINGLE_QUOTE; } isSingleQuotedAttributeCharacter.delimiter = C_SINGLE_QUOTE; /** * Check whether `character` can be inside an enclosed * URI. * * @property {string} delimiter - Closing delimiter. * @param {string} character - Character to test. * @return {boolean} - Whether or not `character` can be * inside an enclosed URI. */ function isEnclosedURLCharacter(character) { return character !== C_GT && character !== C_BRACKET_OPEN && character !== C_BRACKET_CLOSE; } isEnclosedURLCharacter.delimiter = C_GT; /** * Check whether `character` can be inside an unclosed * URI. * * @param {string} character - Character to test. * @return {boolean} - Whether or not `character` can be * inside an unclosed URI. */ function isUnclosedURLCharacter(character) { return character !== C_BRACKET_OPEN && character !== C_BRACKET_CLOSE && !isWhiteSpace(character); } /** * Factory to create an entity decoder. * * @param {Object} context - Context to attach to, e.g., * a parser. * @return {Function} - See `decode`. */ function decodeFactory(context) { /** * Normalize `position` to add an `indent`. * * @param {Position} position - Reference * @return {Position} - Augmented with `indent`. */ function normalize(position) { return { 'start': position, 'indent': context.getIndent(position.line) }; } /** * Handle a warning. * * @this {VFile} - Virtual file. * @param {string} reason - Reason for warning. * @param {Position} position - Place of warning. * @param {number} code - Code for warning. */ function handleWarning(reason, position, code) { if (code === 3) { return; } context.file.warn(reason, position); } /** * Decode `value` (at `position`) into text-nodes. * * @param {string} value - Value to parse. * @param {Position} position - Position to start parsing at. * @param {Function} handler - Node handler. */ function decoder(value, position, handler) { var hasPosition = context.options.position; decode(value, { 'position': position && normalize(position), 'warning': hasPosition && handleWarning, 'text': handler, 'reference': handler, 'textContext': context, 'referenceContext': context }); } /** * Decode `value` (at `position`) into a string. * * @param {string} value - Value to parse. * @param {Position} position - Position to start * parsing at. * @return {string} - Plain-text. */ function decodeRaw(value, position) { return decode(value, { 'position': position && normalize(position), 'warning': context.options.position && handleWarning }); } decoder.raw = decodeRaw; return decoder; } /** * Factory to de-escape a value, based on a list at `key` * in `scope`. * * @example * var scope = {escape: ['a']} * var descape = descapeFactory(scope, 'escape'); * * @param {Object} scope - List of escapable characters. * @param {string} key - Key in `map` at which the list * exists. * @return {function(string): string} - Function which * takes a value and returns its unescaped version. */ function descapeFactory(scope, key) { /** * De-escape a string using the expression at `key` * in `scope`. * * @example * var scope = {escape: ['a']} * var descape = descapeFactory(scope, 'escape'); * descape('\a \b'); // 'a \b' * * @param {string} value - Escaped string. * @return {string} - Unescaped string. */ function descape(value) { var prev = 0; var index = value.indexOf(C_BACKSLASH); var escape = scope[key]; var queue = []; var character; while (index !== -1) { queue.push(value.slice(prev, index)); prev = index + 1; character = value.charAt(prev); /* * If the following character is not a valid escape, * add the slash. */ if (!character || escape.indexOf(character) === -1) { queue.push(C_BACKSLASH); } index = value.indexOf(C_BACKSLASH, prev); } queue.push(value.slice(prev)); return queue.join(EMPTY); } return descape; } /** * Gets indentation information for a line. * * @example * getIndent(' foo'); * // {indent: 2, stops: {1: 0, 2: 1}} * * getIndent('\tfoo'); * // {indent: 4, stops: {4: 0}} * * getIndent(' \tfoo'); * // {indent: 4, stops: {1: 0, 2: 1, 4: 2}} * * getIndent('\t foo') * // {indent: 6, stops: {4: 0, 5: 1, 6: 2}} * * @param {string} value - Indented line. * @return {Object} - Indetation information. */ function getIndent(value) { var index = 0; var indent = 0; var character = value.charAt(index); var stops = {}; var size; while (character in INDENTATION_CHARACTERS) { size = INDENTATION_CHARACTERS[character]; indent += size; if (size > 1) { indent = Math.floor(indent / size) * size; } stops[indent] = index; character = value.charAt(++index); } return { 'indent': indent, 'stops': stops }; } /** * Remove the minimum indent from every line in `value`. * Supports both tab, spaced, and mixed indentation (as * well as possible). * * @example * removeIndentation(' foo'); // 'foo' * removeIndentation(' foo', 2); // ' foo' * removeIndentation('\tfoo', 2); // ' foo' * removeIndentation(' foo\n bar'); // ' foo\n bar' * * @param {string} value - Value to trim. * @param {number?} [maximum] - Maximum indentation * to remove. * @return {string} - Unindented `value`. */ function removeIndentation(value, maximum) { var values = value.split(C_NEWLINE); var position = values.length + 1; var minIndent = Infinity; var matrix = []; var index; var indentation; var stops; var padding; values.unshift(repeat(C_SPACE, maximum) + C_EXCLAMATION_MARK); while (position--) { indentation = getIndent(values[position]); matrix[position] = indentation.stops; if (trim(values[position]).length === 0) { continue; } if (indentation.indent) { if (indentation.indent > 0 && indentation.indent < minIndent) { minIndent = indentation.indent; } } else { minIndent = Infinity; break; } } if (minIndent !== Infinity) { position = values.length; while (position--) { stops = matrix[position]; index = minIndent; while (index && !(index in stops)) { index--; } if ( trim(values[position]).length !== 0 && minIndent && index !== minIndent ) { padding = C_TAB; } else { padding = EMPTY; } values[position] = padding + values[position].slice( index in stops ? stops[index] + 1 : 0 ); } } values.shift(); return values.join(C_NEWLINE); } /** * Tokenise a line. * * @example * tokenizeNewline(eat, '\n\n'); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {boolean?} - `true` when matching. */ function tokenizeNewline(eat, value, silent) { var character = value.charAt(0); var length; var subvalue; var queue; var index; if (character !== C_NEWLINE) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } index = 1; length = value.length; subvalue = C_NEWLINE; queue = EMPTY; while (index < length) { character = value.charAt(index); if (!isWhiteSpace(character)) { break; } queue += character; if (character === C_NEWLINE) { subvalue += queue; queue = EMPTY; } index++; } eat(subvalue); } /** * Tokenise an indented code block. * * @example * tokenizeCode(eat, '\tfoo'); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `code` node. */ function tokenizeCode(eat, value, silent) { var self = this; var index = -1; var length = value.length; var character; var subvalue = EMPTY; var content = EMPTY; var subvalueQueue = EMPTY; var contentQueue = EMPTY; var blankQueue; var indent; while (++index < length) { character = value.charAt(index); if (indent) { indent = false; subvalue += subvalueQueue; content += contentQueue; subvalueQueue = contentQueue = EMPTY; if (character === C_NEWLINE) { subvalueQueue = contentQueue = character; } else { subvalue += character; content += character; while (++index < length) { character = value.charAt(index); if (!character || character === C_NEWLINE) { contentQueue = subvalueQueue = character; break; } subvalue += character; content += character; } } } else if ( character === C_SPACE && value.charAt(index + 1) === C_SPACE && value.charAt(index + 2) === C_SPACE && value.charAt(index + 3) === C_SPACE ) { subvalueQueue += CODE_INDENT; index += 3; indent = true; } else if (character === C_TAB) { subvalueQueue += character; indent = true; } else { blankQueue = EMPTY; while (character === C_TAB || character === C_SPACE) { blankQueue += character; character = value.charAt(++index); } if (character !== C_NEWLINE) { break; } subvalueQueue += blankQueue + character; contentQueue += character; } } if (content) { if (silent) { return true; } return eat(subvalue)(self.renderCodeBlock(content)); } } /** * Tokenise a fenced code block. * * @example * tokenizeFences(eat, '```js\nfoo()\n```'); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `code` node. */ function tokenizeFences(eat, value, silent) { var self = this; var settings = self.options; var length = value.length + 1; var index = 0; var subvalue = EMPTY; var fenceCount; var marker; var character; var flag; var queue; var content; var exdentedContent; var closing; var exdentedClosing; var indent; var now; if (!settings.gfm) { return; } /* * Eat initial spacing. */ while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } subvalue += character; index++; } indent = index; // TODO: CHECK. /* * Eat the fence. */ character = value.charAt(index); if (character !== C_TILDE && character !== C_TICK) { return; } index++; marker = character; fenceCount = 1; subvalue += character; while (index < length) { character = value.charAt(index); if (character !== marker) { break; } subvalue += character; fenceCount++; index++; } if (fenceCount < MIN_FENCE_COUNT) { return; } /* * Eat spacing before flag. */ while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } subvalue += character; index++; } /* * Eat flag. */ flag = queue = EMPTY; while (index < length) { character = value.charAt(index); if ( character === C_NEWLINE || character === C_TILDE || character === C_TICK ) { break; } if (character === C_SPACE || character === C_TAB) { queue += character; } else { flag += queue + character; queue = EMPTY; } index++; } character = value.charAt(index); if (character && character !== C_NEWLINE) { return; } if (silent) { return true; } now = eat.now(); now.column += subvalue.length; subvalue += flag; flag = self.decode.raw(self.descape(flag), now); if (queue) { subvalue += queue; } queue = closing = exdentedClosing = content = exdentedContent = EMPTY; /* * Eat content. */ while (index < length) { character = value.charAt(index); content += closing; exdentedContent += exdentedClosing; closing = exdentedClosing = EMPTY; if (character !== C_NEWLINE) { content += character; exdentedClosing += character; index++; continue; } /* * Add the newline to `subvalue` if its the first * character. Otherwise, add it to the `closing` * queue. */ if (!content) { subvalue += character; } else { closing += character; exdentedClosing += character; } queue = EMPTY; index++; while (index < length) { character = value.charAt(index); if (character !== C_SPACE) { break; } queue += character; index++; } closing += queue; exdentedClosing += queue.slice(indent); if (queue.length >= CODE_INDENT_LENGTH) { continue; } queue = EMPTY; while (index < length) { character = value.charAt(index); if (character !== marker) { break; } queue += character; index++; } closing += queue; exdentedClosing += queue; if (queue.length < fenceCount) { continue; } queue = EMPTY; while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } closing += character; exdentedClosing += character; index++; } if (!character || character === C_NEWLINE) { break; } } subvalue += content + closing; return eat(subvalue)(self.renderCodeBlock(exdentedContent, flag)); } /** * Tokenise an ATX-style heading. * * @example * tokenizeHeading(eat, ' # foo'); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `heading` node. */ function tokenizeHeading(eat, value, silent) { var self = this; var settings = self.options; var length = value.length + 1; var index = -1; var now = eat.now(); var subvalue = EMPTY; var content = EMPTY; var character; var queue; var depth; /* * Eat initial spacing. */ while (++index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { index--; break; } subvalue += character; } /* * Eat hashes. */ depth = 0; length = index + MAX_ATX_COUNT + 1; while (++index <= length) { character = value.charAt(index); if (character !== C_HASH) { index--; break; } subvalue += character; depth++; } if ( !depth || (!settings.pedantic && value.charAt(index + 1) === C_HASH) ) { return; } length = value.length + 1; /* * Eat intermediate white-space. */ queue = EMPTY; while (++index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { index--; break; } queue += character; } /* * Exit when not in pedantic mode without spacing. */ if ( !settings.pedantic && !queue.length && character && character !== C_NEWLINE ) { return; } if (silent) { return true; } /* * Eat content. */ subvalue += queue; queue = content = EMPTY; while (++index < length) { character = value.charAt(index); if (!character || character === C_NEWLINE) { break; } if ( character !== C_SPACE && character !== C_TAB && character !== C_HASH ) { content += queue + character; queue = EMPTY; continue; } while (character === C_SPACE || character === C_TAB) { queue += character; character = value.charAt(++index); } while (character === C_HASH) { queue += character; character = value.charAt(++index); } while (character === C_SPACE || character === C_TAB) { queue += character; character = value.charAt(++index); } index--; } now.column += subvalue.length; subvalue += content + queue; return eat(subvalue)(self.renderHeading(content, depth, now)); } /** * Tokenise a Setext-style heading. * * @example * tokenizeLineHeading(eat, 'foo\n==='); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `heading` node. */ function tokenizeLineHeading(eat, value, silent) { var self = this; var now = eat.now(); var length = value.length; var index = -1; var subvalue = EMPTY; var content; var queue; var character; var marker; var depth; /* * Eat initial indentation. */ while (++index < length) { character = value.charAt(index); if (character !== C_SPACE || index >= MAX_LINE_HEADING_INDENT) { index--; break; } subvalue += character; } /* * Eat content. */ content = queue = EMPTY; while (++index < length) { character = value.charAt(index); if (character === C_NEWLINE) { index--; break; } if (character === C_SPACE || character === C_TAB) { queue += character; } else { content += queue + character; queue = EMPTY; } } now.column += subvalue.length; subvalue += content + queue; /* * Ensure the content is followed by a newline and a * valid marker. */ character = value.charAt(++index); marker = value.charAt(++index); if ( character !== C_NEWLINE || !SETEXT_MARKERS[marker] ) { return; } if (silent) { return true; } subvalue += character; /* * Eat Setext-line. */ queue = marker; depth = SETEXT_MARKERS[marker]; while (++index < length) { character = value.charAt(index); if (character !== marker) { if (character !== C_NEWLINE) { return; } index--; break; } queue += character; } return eat(subvalue + queue)(self.renderHeading(content, depth, now)); } /** * Tokenise a horizontal rule. * * @example * tokenizeHorizontalRule(eat, '***'); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `horizontalRule` node. */ function tokenizeHorizontalRule(eat, value, silent) { var self = this; var index = -1; var length = value.length + 1; var subvalue = EMPTY; var character; var marker; var markerCount; var queue; while (++index < length) { character = value.charAt(index); if (character !== C_TAB && character !== C_SPACE) { break; } subvalue += character; } if (RULE_MARKERS[character] !== true) { return; } marker = character; subvalue += character; markerCount = 1; queue = EMPTY; while (++index < length) { character = value.charAt(index); if (character === marker) { markerCount++; subvalue += queue + marker; queue = EMPTY; } else if (character === C_SPACE) { queue += character; } else if ( markerCount >= HORIZONTAL_RULE_MARKER_COUNT && (!character || character === C_NEWLINE) ) { subvalue += queue; if (silent) { return true; } return eat(subvalue)(self.renderVoid(T_HORIZONTAL_RULE)); } else { return; } } } /** * Tokenise a blockquote. * * @example * tokenizeBlockquote(eat, '> Foo'); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `blockquote` node. */ function tokenizeBlockquote(eat, value, silent) { var self = this; var commonmark = self.options.commonmark; var now = eat.now(); var indent = self.indent(now.line); var length = value.length; var values = []; var contents = []; var indents = []; var add; var tokenizers; var index = 0; var character; var rest; var nextIndex; var content; var line; var startIndex; var prefixed; while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } index++; } if (value.charAt(index) !== C_GT) { return; } if (silent) { return true; } tokenizers = self.blockTokenizers; index = 0; while (index < length) { nextIndex = value.indexOf(C_NEWLINE, index); startIndex = index; prefixed = false; if (nextIndex === -1) { nextIndex = length; } while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } index++; } if (value.charAt(index) === C_GT) { index++; prefixed = true; if (value.charAt(index) === C_SPACE) { index++; } } else { index = startIndex; } content = value.slice(index, nextIndex); if (!prefixed && !trim(content)) { index = startIndex; break; } if (!prefixed) { rest = value.slice(index); if ( commonmark && ( tokenizers.code.call(self, eat, rest, true) || tokenizers.fences.call(self, eat, rest, true) || tokenizers.heading.call(self, eat, rest, true) || tokenizers.lineHeading.call(self, eat, rest, true) || tokenizers.horizontalRule.call(self, eat, rest, true) || tokenizers.html.call(self, eat, rest, true) || tokenizers.list.call(self, eat, rest, true) ) ) { break; } if ( !commonmark && ( tokenizers.definition.call(self, eat, rest, true) || tokenizers.footnoteDefinition.call(self, eat, rest, true) ) ) { break; } } line = startIndex === index ? content : value.slice(startIndex, nextIndex); indents.push(index - startIndex); values.push(line); contents.push(content); index = nextIndex + 1; } index = -1; length = indents.length; add = eat(values.join(C_NEWLINE)); while (++index < length) { indent(indents[index]); } return add(self.renderBlockquote(contents.join(C_NEWLINE), now)); } /** * Tokenise a list. * * @example * tokenizeList(eat, '- Foo'); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `list` node. */ function tokenizeList(eat, value, silent) { var self = this; var commonmark = self.options.commonmark; var pedantic = self.options.pedantic; var tokenizers = self.blockTokenizers; var markers; var index = 0; var length = value.length; var start = null; var queue; var ordered; var character; var marker; var nextIndex; var startIndex; var prefixed; var currentMarker; var content; var line; var prevEmpty; var empty; var items; var allLines; var emptyLines; var item; var enterTop; var exitBlockquote; var isLoose; var node; var now; var end; var indented; var size; while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } index++; } character = value.charAt(index); markers = commonmark ? LIST_ORDERED_COMMONMARK_MARKERS : LIST_ORDERED_MARKERS; if (LIST_UNORDERED_MARKERS[character] === true) { marker = character; ordered = false; } else { ordered = true; queue = EMPTY; while (index < length) { character = value.charAt(index); if (!isNumeric(character)) { break; } queue += character; index++; } character = value.charAt(index); if (!queue || markers[character] !== true) { return; } start = parseInt(queue, 10); marker = character; } character = value.charAt(++index); if (character !== C_SPACE && character !== C_TAB) { return; } if (silent) { return true; } index = 0; items = []; allLines = []; emptyLines = []; while (index < length) { nextIndex = value.indexOf(C_NEWLINE, index); startIndex = index; prefixed = false; indented = false; if (nextIndex === -1) { nextIndex = length; } end = index + TAB_SIZE; size = 0; while (index < length) { character = value.charAt(index); if (character === C_TAB) { size += TAB_SIZE - size % TAB_SIZE; } else if (character === C_SPACE) { size++; } else { break; } index++; } if (size >= TAB_SIZE) { indented = true; } if (item && size >= item.indent) { indented = true; } character = value.charAt(index); currentMarker = null; if (!indented) { if (LIST_UNORDERED_MARKERS[character] === true) { currentMarker = character; index++; size++; } else { queue = EMPTY; while (index < length) { character = value.charAt(index); if (!isNumeric(character)) { break; } queue += character; index++; } character = value.charAt(index); index++; if (queue && markers[character] === true) { currentMarker = character; size += queue.length + 1; } } if (currentMarker) { character = value.charAt(index); if (character === C_TAB) { size += TAB_SIZE - size % TAB_SIZE; index++; } else if (character === C_SPACE) { end = index + TAB_SIZE; while (index < end) { if (value.charAt(index) !== C_SPACE) { break; } index++; size++; } if (index === end && value.charAt(index) === C_SPACE) { index -= TAB_SIZE - 1; size -= TAB_SIZE - 1; } } else if ( character !== C_NEWLINE && character !== EMPTY ) { currentMarker = null; } } } if (currentMarker) { if (commonmark && marker !== currentMarker) { break; } prefixed = true; } else { if ( !commonmark && !indented && value.charAt(startIndex) === C_SPACE ) { indented = true; } else if ( commonmark && item ) { indented = size >= item.indent || size > TAB_SIZE; } prefixed = false; index = startIndex; } line = value.slice(startIndex, nextIndex); content = startIndex === index ? line : value.slice(index, nextIndex); if (currentMarker && RULE_MARKERS[currentMarker] === true) { if ( tokenizers.horizontalRule.call(self, eat, line, true) ) { break; } } prevEmpty = empty; empty = !trim(content).length; if (indented && item) { item.value = item.value.concat(emptyLines, line); allLines = allLines.concat(emptyLines, line); emptyLines = []; } else if (prefixed) { if (emptyLines.length) { item.value.push(EMPTY); item.trail = emptyLines.concat(); } item = { // 'bullet': value.slice(startIndex, index), 'value': [line], 'indent': size, 'trail': [] }; items.push(item); allLines = allLines.concat(emptyLines, line); emptyLines = []; } else if (empty) { // TODO: disable when in pedantic-mode. if (prevEmpty) { break; } emptyLines.push(line); } else { if (prevEmpty) { break; } if ( !pedantic && tokenizers.horizontalRule.call(self, eat, line, true) ) { break; } if (!commonmark) { if ( tokenizers.definition.call(self, eat, line, true) || tokenizers.footnoteDefinition.call(self, eat, line, true) ) { break; } } item.value = item.value.concat(emptyLines, line); allLines = allLines.concat(emptyLines, line); emptyLines = []; } index = nextIndex + 1; } node = eat(allLines.join(C_NEWLINE)).reset({ 'type': T_LIST, 'ordered': ordered, 'start': start, 'loose': null, 'children': [] }); enterTop = self.exitTop(); exitBlockquote = self.enterBlockquote(); isLoose = false; index = -1; length = items.length; while (++index < length) { item = items[index].value.join(C_NEWLINE); now = eat.now(); item = eat(item)(self.renderListItem(item, now), node); if (item.loose) { isLoose = true; } item = items[index].trail.join(C_NEWLINE); if (index !== length - 1) { item += C_NEWLINE; } eat(item); } enterTop(); exitBlockquote(); node.loose = isLoose; return node; } /** * Try to match comment. * * @param {string} value - Value to parse. * @param {Object} settings - Configuration as available on * a parser. * @return {string?} - When applicable, the comment at the * start of `value`. */ function eatHTMLComment(value, settings) { var index = COMMENT_START_LENGTH; var queue = COMMENT_START; var length = value.length; var commonmark = settings.commonmark; var character; var hasNonDash; if (value.slice(0, index) === queue) { while (index < length) { character = value.charAt(index); if ( character === COMMENT_END_CHAR && value.slice(index, index + COMMENT_END_LENGTH) === COMMENT_END ) { return queue + COMMENT_END; } if (commonmark) { if (character === C_GT && !hasNonDash) { return; } if (character === C_DASH) { if (value.charAt(index + 1) === C_DASH) { return; } } else { hasNonDash = true; } } queue += character; index++; } } } /** * Try to match CDATA. * * @param {string} value - Value to parse. * @return {string?} - When applicable, the CDATA at the * start of `value`. */ function eatHTMLCDATA(value) { var index = CDATA_START_LENGTH; var queue = value.slice(0, index); var length = value.length; var character; if (queue.toUpperCase() === CDATA_START) { while (index < length) { character = value.charAt(index); if ( character === CDATA_END_CHAR && value.slice(index, index + CDATA_END_LENGTH) === CDATA_END ) { return queue + CDATA_END; } queue += character; index++; } } } /** * Try to match a processing instruction. * * @param {string} value - Value to parse. * @return {string?} - When applicable, the processing * instruction at the start of `value`. */ function eatHTMLProcessingInstruction(value) { var index = 0; var queue = EMPTY; var length = value.length; var character; if ( value.charAt(index) === C_LT && value.charAt(++index) === C_QUESTION_MARK ) { queue = C_LT + C_QUESTION_MARK; index++; while (index < length) { character = value.charAt(index); if ( character === C_QUESTION_MARK && value.charAt(index + 1) === C_GT ) { return queue + character + C_GT; } queue += character; index++; } } } /** * Try to match a declaration. * * @param {string} value - Value to parse. * @return {string?} - When applicable, the declaration at * the start of `value`. */ function eatHTMLDeclaration(value) { var index = 0; var length = value.length; var queue = EMPTY; var subqueue = EMPTY; var character; if ( value.charAt(index) === C_LT && value.charAt(++index) === C_EXCLAMATION_MARK ) { queue = C_LT + C_EXCLAMATION_MARK; index++; /* * Eat as many alphabetic characters as * possible. */ while (index < length) { character = value.charAt(index); if (!isAlphabetic(character)) { break; } subqueue += character; index++; } character = value.charAt(index); if (!subqueue || !isWhiteSpace(character)) { return; } queue += subqueue + character; index++; while (index < length) { character = value.charAt(index); if (character === C_GT) { return queue; } queue += character; index++; } } } /** * Try to match a closing tag. * * @param {string} value - Value to parse. * @param {boolean?} [isBlock] - Whether the tag-name * must be a known block-level node to match. * @return {string?} - When applicable, the closing tag at * the start of `value`. */ function eatHTMLClosingTag(value, isBlock) { var index = 0; var length = value.length; var queue = EMPTY; var subqueue = EMPTY; var character; if ( value.charAt(index) === C_LT && value.charAt(++index) === C_SLASH ) { queue = C_LT + C_SLASH; subqueue = character = value.charAt(++index); if (!isAlphabetic(character)) { return; } index++; /* * Eat as many alphabetic characters as * possible. */ while (index < length) { character = value.charAt(index); if (!isAlphabetic(character) && !isNumeric(character)) { break; } subqueue += character; index++; } if (isBlock && blockElements.indexOf(subqueue.toLowerCase()) === -1) { return; } queue += subqueue; /* * Eat white-space. */ while (index < length) { character = value.charAt(index); if (!isWhiteSpace(character)) { break; } queue += character; index++; } if (value.charAt(index) === C_GT) { return queue + C_GT; } } } /** * Try to match an opening tag. * * @param {string} value - Value to parse. * @param {boolean?} [isBlock] - Whether the tag-name * must be a known block-level node to match. * @return {string?} - When applicable, the opening tag at * the start of `value`. */ function eatHTMLOpeningTag(value, isBlock) { var index = 0; var length = value.length; var queue = EMPTY; var subqueue = EMPTY; var character = value.charAt(index); var hasEquals; var test; if (character === C_LT) { queue = character; subqueue = character = value.charAt(++index); if (!isAlphabetic(character)) { return; } index++; /* * Eat as many alphabetic characters as * possible. */ while (index < length) { character = value.charAt(index); if (!isAlphabetic(character) && !isNumeric(character)) { break; } subqueue += character; index++; } if (isBlock && blockElements.indexOf(subqueue.toLowerCase()) === -1) { return; } queue += subqueue; subqueue = EMPTY; /* * Find attributes. */ while (index < length) { /* * Eat white-space. */ while (index < length) { character = value.charAt(index); if (!isWhiteSpace(character)) { break; } subqueue += character; index++; } if (!subqueue) { break; } /* * Eat an attribute name. */ queue += subqueue; subqueue = EMPTY; character = value.charAt(index); if ( isAlphabetic(character) || character === C_UNDERSCORE || character === C_COLON ) { subqueue = character; index++; while (index < length) { character = value.charAt(index); if ( !isAlphabetic(character) && !isNumeric(character) && character !== C_UNDERSCORE && character !== C_COLON && character !== C_DOT && character !== C_DASH ) { break; } subqueue += character; index++; } } if (!subqueue) { break; } queue += subqueue; subqueue = EMPTY; hasEquals = false; /* * Eat zero or more white-space and one * equals sign. */ while (index < length) { character = value.charAt(index); if (!isWhiteSpace(character)) { if (!hasEquals && character === C_EQUALS) { hasEquals = true; } else { break; } } subqueue += character; index++; } queue += subqueue; subqueue = EMPTY; if (!hasEquals) { queue += subqueue; } else { character = value.charAt(index); queue += subqueue; if (character === C_DOUBLE_QUOTE) { test = isDoubleQuotedAttributeCharacter; subqueue = character; index++; } else if (character === C_SINGLE_QUOTE) { test = isSingleQuotedAttributeCharacter; subqueue = character; index++; } else { test = isUnquotedAttributeCharacter; subqueue = EMPTY; } while (index < length) { character = value.charAt(index); if (!test(character)) { break; } subqueue += character; index++; } character = value.charAt(index); index++; if (!test.delimiter) { if (!subqueue.length) { return; } index--; } else if (character === test.delimiter) { subqueue += character; } else { return; } queue += subqueue; subqueue = EMPTY; } } /* * More white-space is already eaten by the * attributes subroutine. */ character = value.charAt(index); /* * Eat an optional backslash (for self-closing * tags). */ if (character === C_SLASH) { queue += character; character = value.charAt(++index); } return character === C_GT ? queue + character : null; } } /** * Tokenise HTML. * * @example * tokenizeHTML(eat, 'foo'); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `html` node. */ function tokenizeHTML(eat, value, silent) { var self = this; var index = 0; var length = value.length; var subvalue = EMPTY; var offset; var lineCount; var character; var queue; /* * Eat initial spacing. */ while (index < length) { character = value.charAt(index); if (character !== C_TAB && character !== C_SPACE) { break; } subvalue += character; index++; } offset = index; value = value.slice(offset); /* * Try to eat an HTML thing. */ queue = eatHTMLComment(value, self.options) || eatHTMLCDATA(value) || eatHTMLProcessingInstruction(value) || eatHTMLDeclaration(value) || eatHTMLClosingTag(value, true) || eatHTMLOpeningTag(value, true); if (!queue) { return; } if (silent) { return true; } subvalue += queue; index = subvalue.length - offset; queue = EMPTY; while (index < length) { character = value.charAt(index); if (character === C_NEWLINE) { queue += character; lineCount++; } else if (queue.length < MIN_CLOSING_HTML_NEWLINE_COUNT) { subvalue += queue + character; queue = EMPTY; } else { break; } index++; } return eat(subvalue)(self.renderRaw(T_HTML, subvalue)); } /** * Tokenise a definition. * * @example * var value = '[foo]: http://example.com "Example Domain"'; * tokenizeDefinition(eat, value); * * @property {boolean} onlyAtTop * @property {boolean} notInBlockquote * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `definition` node. */ function tokenizeDefinition(eat, value, silent) { var self = this; var commonmark = self.options.commonmark; var index = 0; var length = value.length; var subvalue = EMPTY; var beforeURL; var beforeTitle; var queue; var character; var test; var identifier; var url; var title; while (index < length) { character = value.charAt(index); if (character !== C_SPACE && character !== C_TAB) { break; } subvalue += character; index++; } character = value.charAt(index); if (character !== C_BRACKET_OPEN) { return; } index++; subvalue += character; queue = EMPTY; while (index < length) { character = value.charAt(index); if (character === C_BRACKET_CLOSE) { break; } else if (character === C_BACKSLASH) { queue += character; index++; character = value.charAt(index); } queue += character; index++; } if ( !queue || value.charAt(index) !== C_BRACKET_CLOSE || value.charAt(index + 1) !== C_COLON ) { return; } identifier = queue; subvalue += queue + C_BRACKET_CLOSE + C_COLON; index = subvalue.length; queue = EMPTY; while (index < length) { character = value.charAt(index); if ( character !== C_TAB && character !== C_SPACE && character !== C_NEWLINE ) { break; } subvalue += character; index++; } character = value.charAt(index); queue = EMPTY; beforeURL = subvalue; if (character === C_LT) { index++; while (index < length) { character = value.charAt(index); if (!isEnclosedURLCharacter(character)) { break; } queue += character; index++; } character = value.charAt(index); if (character !== isEnclosedURLCharacter.delimiter) { if (commonmark) { return; } index -= queue.length + 1; queue = EMPTY; } else { subvalue += C_LT + queue + character; index++; } } if (!queue) { while (index < length) { character = value.charAt(index); if (!isUnclosedURLCharacter(character)) { break; } queue += character; index++; } subvalue += queue; } if (!queue) { return; } url = queue; queue = EMPTY; while (index < length) { character = value.charAt(index); if ( character !== C_TAB && character !== C_SPACE && character !== C_NEWLINE ) { break; } queue += character; index++; } character = value.charAt(index); test = null; if (character === C_DOUBLE_QUOTE) { test = C_DOUBLE_QUOTE; } else if (character === C_SINGLE_QUOTE) { test = C_SINGLE_QUOTE; } else if (character === C_PAREN_OPEN) { test = C_PAREN_CLOSE; } if (!test) { queue = EMPTY; index = subvalue.length; } else if (!queue) { return; } else { subvalue += queue + character; index = subvalue.length; queue = EMPTY; while (index < length) { character = value.charAt(index); if (character === test) { break; } if (character === C_NEWLINE) { index++; character = value.charAt(index); if (character === C_NEWLINE || character === test) { return; } queue += C_NEWLINE; } queue += character; index++; } character = value.charAt(index); if (character !== test) { return; } beforeTitle = subvalue; subvalue += queue + character; index++; title = queue; queue = EMPTY; } while (index < length) { character = value.charAt(index); if (character !== C_TAB && character !== C_SPACE) { break; } subvalue += character; index++; } character = value.charAt(index); if (!character || character === C_NEWLINE) { if (silent) { return true; } beforeURL = eat(beforeURL).test().end; url = self.decode.raw(self.descape(url), beforeURL); if (title) { beforeTitle = eat(beforeTitle).test().end; title = self.decode.raw(self.descape(title), beforeTitle); } return eat(subvalue)({ 'type': T_DEFINITION, 'identifier': normalize(identifier), 'title': title || null, 'link': url }); } } tokenizeDefinition.onlyAtTop = true; tokenizeDefinition.notInBlockquote = true; /** * Tokenise YAML front matter. * * @example * tokenizeYAMLFrontMatter(eat, '---\nfoo: bar\n---'); * * @property {boolean} onlyAtStart * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `yaml` node. */ function tokenizeYAMLFrontMatter(eat, value, silent) { var self = this; var subvalue; var content; var index; var length; var character; var queue; if ( !self.options.yaml || value.charAt(0) !== C_DASH || value.charAt(1) !== C_DASH || value.charAt(2) !== C_DASH || value.charAt(3) !== C_NEWLINE ) { return; } subvalue = YAML_FENCE + C_NEWLINE; content = queue = EMPTY; index = 3; length = value.length; while (++index < length) { character = value.charAt(index); if ( character === C_DASH && (queue || !content) && value.charAt(index + 1) === C_DASH && value.charAt(index + 2) === C_DASH ) { /* istanbul ignore if - never used (yet) */ if (silent) { return true; } subvalue += queue + YAML_FENCE; return eat(subvalue)(self.renderRaw(T_YAML, content)); } if (character === C_NEWLINE) { queue += character; } else { subvalue += queue + character; content += queue + character; queue = EMPTY; } } } tokenizeYAMLFrontMatter.onlyAtStart = true; /** * Tokenise a footnote definition. * * @example * tokenizeFootnoteDefinition(eat, '[^foo]: Bar.'); * * @property {boolean} onlyAtTop * @property {boolean} notInBlockquote * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `footnoteDefinition` node. */ function tokenizeFootnoteDefinition(eat, value, silent) { var self = this; var index; var length; var subvalue; var now; var indent; var content; var queue; var subqueue; var character; var identifier; if (!self.options.footnotes) { return; } index = 0; length = value.length; subvalue = EMPTY; now = eat.now(); indent = self.indent(now.line); while (index < length) { character = value.charAt(index); if (!isWhiteSpace(character)) { break; } subvalue += character; index++; } if ( value.charAt(index) !== C_BRACKET_OPEN || value.charAt(index + 1) !== C_CARET ) { return; } subvalue += C_BRACKET_OPEN + C_CARET; index = subvalue.length; queue = EMPTY; while (index < length) { character = value.charAt(index); if (character === C_BRACKET_CLOSE) { break; } else if (character === C_BACKSLASH) { queue += character; index++; character = value.charAt(index); } queue += character; index++; } if ( !queue || value.charAt(index) !== C_BRACKET_CLOSE || value.charAt(index + 1) !== C_COLON ) { return; } if (silent) { return true; } identifier = normalize(queue); subvalue += queue + C_BRACKET_CLOSE + C_COLON; index = subvalue.length; while (index < length) { character = value.charAt(index); if ( character !== C_TAB && character !== C_SPACE ) { break; } subvalue += character; index++; } now.column += subvalue.length; queue = content = subqueue = EMPTY; while (index < length) { character = value.charAt(index); if (character === C_NEWLINE) { subqueue = character; index++; while (index < length) { character = value.charAt(index); if (character !== C_NEWLINE) { break; } subqueue += character; index++; } queue += subqueue; subqueue = EMPTY; while (index < length) { character = value.charAt(index); if (character !== C_SPACE) { break; } subqueue += character; index++; } if (!subqueue.length) { break; } queue += subqueue; } if (queue) { content += queue; queue = EMPTY; } content += character; index++; } subvalue += content; content = content.replace(EXPRESSION_INITIAL_TAB, function (line) { indent(line.length); return EMPTY; }); return eat(subvalue)( self.renderFootnoteDefinition(identifier, content, now) ); } tokenizeFootnoteDefinition.onlyAtTop = true; tokenizeFootnoteDefinition.notInBlockquote = true; /** * Tokenise a table. * * @example * tokenizeTable(eat, ' | foo |\n | --- |\n | bar |'); * * @property {boolean} onlyAtTop * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `table` node. */ function tokenizeTable(eat, value, silent) { var self = this; var index; var alignments; var alignment; var subvalue; var row; var length; var lines; var queue; var character; var hasDash; var align; var cell; var preamble; var count; var opening; var now; var position; var lineCount; var line; var rows; var table; var lineIndex; var pipeIndex; var first; /* * Exit when not in gfm-mode. */ if (!self.options.gfm) { return; } /* * Get the rows. * Detecting tables soon is hard, so there are some * checks for performance here, such as the minimum * number of rows, and allowed characters in the * alignment row. */ index = lineCount = 0; length = value.length + 1; lines = []; while (index < length) { lineIndex = value.indexOf(C_NEWLINE, index); pipeIndex = value.indexOf(C_PIPE, index + 1); if (lineIndex === -1) { lineIndex = value.length; } if ( pipeIndex === -1 || pipeIndex > lineIndex ) { if (lineCount < MIN_TABLE_ROWS) { return; } break; } lines.push(value.slice(index, lineIndex)); lineCount++; index = lineIndex + 1; } /* * Parse the alignment row. */ subvalue = lines.join(C_NEWLINE); alignments = lines.splice(1, 1)[0]; index = 0; length = alignments.length; lineCount--; alignment = false; align = []; while (index < length) { character = alignments.charAt(index); if (character === C_PIPE) { hasDash = null; if (alignment === false) { if (first === false) { return; } } else { align.push(alignment); alignment = false; } first = false; } else if (character === C_DASH) { hasDash = true; alignment = alignment || TABLE_ALIGN_NONE; } else if (character === C_COLON) { if (alignment === TABLE_ALIGN_LEFT) { alignment = TABLE_ALIGN_CENTER; } else if (hasDash && alignment === TABLE_ALIGN_NONE) { alignment = TABLE_ALIGN_RIGHT; } else { alignment = TABLE_ALIGN_LEFT; } } else if (!isWhiteSpace(character)) { return; } index++; } if (alignment !== false) { align.push(alignment); } /* * Exit when without enough columns. */ if (align.length < MIN_TABLE_COLUMNS) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } /* * Parse the rows. */ position = -1; rows = []; table = eat(subvalue).reset({ 'type': T_TABLE, 'align': align, 'children': rows }); while (++position < lineCount) { line = lines[position]; row = self.renderParent(position ? T_TABLE_ROW : T_TABLE_HEADER, []); /* * Eat a newline character when this is not the * first row. */ if (position) { eat(C_NEWLINE); } /* * Eat the row. */ eat(line).reset(row, table); length = line.length + 1; index = 0; queue = EMPTY; cell = EMPTY; preamble = true; count = opening = null; while (index < length) { character = line.charAt(index); if (character === C_TAB || character === C_SPACE) { if (cell) { queue += character; } else { eat(character); } index++; continue; } if (character === EMPTY || character === C_PIPE) { if (preamble) { eat(character); } else { if (character && opening) { queue += character; index++; continue; } if ((cell || character) && !preamble) { subvalue = cell; if (queue.length > 1) { if (character) { subvalue += queue.slice(0, queue.length - 1); queue = queue.charAt(queue.length - 1); } else { subvalue += queue; queue = EMPTY; } } now = eat.now(); eat(subvalue)( self.renderInline(T_TABLE_CELL, cell, now), row ); } eat(queue + character); queue = EMPTY; cell = EMPTY; } } else { if (queue) { cell += queue; queue = EMPTY; } cell += character; if (character === C_BACKSLASH && index !== length - 2) { cell += line.charAt(index + 1); index++; } if (character === C_TICK) { count = 1; while (line.charAt(index + 1) === character) { cell += character; index++; count++; } if (!opening) { opening = count; } else if (count >= opening) { opening = 0; } } } preamble = false; index++; } /* * Eat the alignment row. */ if (!position) { eat(C_NEWLINE + alignments); } } return table; } tokenizeTable.onlyAtTop = true; /** * Tokenise a paragraph node. * * @example * tokenizeParagraph(eat, 'Foo.'); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `paragraph` node. */ function tokenizeParagraph(eat, value, silent) { var self = this; var settings = self.options; var commonmark = settings.commonmark; var gfm = settings.gfm; var tokenizers = self.blockTokenizers; var index = value.indexOf(C_NEWLINE); var length = value.length; var position; var subvalue; var character; var size; var now; while (index < length) { /* * Eat everything if there’s no following newline. */ if (index === -1) { index = length; break; } /* * Stop if the next character is NEWLINE. */ if (value.charAt(index + 1) === C_NEWLINE) { break; } /* * In commonmark-mode, following indented lines * are part of the paragraph. */ if (commonmark) { size = 0; position = index + 1; while (position < length) { character = value.charAt(position); if (character === C_TAB) { size = TAB_SIZE; break; } else if (character === C_SPACE) { size++; } else { break; } position++; } if (size >= TAB_SIZE) { index = value.indexOf(C_NEWLINE, index + 1); continue; } } /* * Check if the following code contains a possible * block. */ subvalue = value.slice(index + 1); if ( tokenizers.horizontalRule.call(self, eat, subvalue, true) || tokenizers.heading.call(self, eat, subvalue, true) || tokenizers.fences.call(self, eat, subvalue, true) || tokenizers.blockquote.call(self, eat, subvalue, true) || tokenizers.html.call(self, eat, subvalue, true) ) { break; } if (gfm && tokenizers.list.call(self, eat, subvalue, true)) { break; } if ( !commonmark && ( tokenizers.lineHeading.call(self, eat, subvalue, true) || tokenizers.definition.call(self, eat, subvalue, true) || tokenizers.footnoteDefinition.call(self, eat, subvalue, true) ) ) { break; } index = value.indexOf(C_NEWLINE, index + 1); } subvalue = value.slice(0, index); if (trim(subvalue) === EMPTY) { eat(subvalue); return null; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } now = eat.now(); subvalue = trimTrailingLines(subvalue); return eat(subvalue)(self.renderInline(T_PARAGRAPH, subvalue, now)); } /** * Tokenise a text node. * * @example * tokenizeText(eat, 'foo'); * * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `text` node. */ function tokenizeText(eat, value, silent) { var self = this; var methods; var tokenizers; var index; var length; var subvalue; var position; var tokenizer; var name; var min; var now; /* istanbul ignore if - never used (yet) */ if (silent) { return true; } methods = self.inlineMethods; length = methods.length; tokenizers = self.inlineTokenizers; index = -1; min = value.length; while (++index < length) { name = methods[index]; if (name === 'inlineText' || !tokenizers[name]) { continue; } tokenizer = tokenizers[name].locator; if (!tokenizer) { eat.file.fail(ERR_MISSING_LOCATOR + C_TICK + name + C_TICK); continue; } position = tokenizer.call(self, value, 1); if (position !== -1 && position < min) { min = position; } } subvalue = value.slice(0, min); now = eat.now(); self.decode(subvalue, now, function (content, position, source) { eat(source || content)(self.renderRaw(T_TEXT, content)); }); } /** * Create a code-block node. * * @example * renderCodeBlock('foo()', 'js', now()); * * @param {string?} [value] - Code. * @param {string?} [language] - Optional language flag. * @param {Function} eat - Eater. * @return {Object} - `code` node. */ function renderCodeBlock(value, language) { return { 'type': T_CODE, 'lang': language || null, 'value': trimTrailingLines(value || EMPTY) }; } /** * Create a list-item using overly simple mechanics. * * @example * renderPedanticListItem('- _foo_', now()); * * @param {string} value - List-item. * @param {Object} position - List-item location. * @return {string} - Cleaned `value`. */ function renderPedanticListItem(value, position) { var self = this; var indent = self.indent(position.line); /** * A simple replacer which removed all matches, * and adds their length to `offset`. * * @param {string} $0 - Indentation to subtract. * @return {string} - An empty string. */ function replacer($0) { indent($0.length); return EMPTY; } /* * Remove the list-item’s bullet. */ value = value.replace(EXPRESSION_PEDANTIC_BULLET, replacer); /* * The initial line was also matched by the below, so * we reset the `line`. */ indent = self.indent(position.line); return value.replace(EXPRESSION_INITIAL_INDENT, replacer); } /** * Create a list-item using sane mechanics. * * @example * renderNormalListItem('- _foo_', now()); * * @param {string} value - List-item. * @param {Object} position - List-item location. * @return {string} - Cleaned `value`. */ function renderNormalListItem(value, position) { var self = this; var indent = self.indent(position.line); var max; var bullet; var rest; var lines; var trimmedLines; var index; var length; /* * Remove the list-item’s bullet. */ value = value.replace(EXPRESSION_BULLET, function ($0, $1, $2, $3, $4) { bullet = $1 + $2 + $3; rest = $4; /* * Make sure that the first nine numbered list items * can indent with an extra space. That is, when * the bullet did not receive an extra final space. */ if (Number($2) < 10 && bullet.length % 2 === 1) { $2 = C_SPACE + $2; } max = $1 + repeat(C_SPACE, $2.length) + $3; return max + rest; }); lines = value.split(C_NEWLINE); trimmedLines = removeIndentation( value, getIndent(max).indent ).split(C_NEWLINE); /* * We replaced the initial bullet with something * else above, which was used to trick * `removeIndentation` into removing some more * characters when possible. However, that could * result in the initial line to be stripped more * than it should be. */ trimmedLines[0] = rest; indent(bullet.length); index = 0; length = lines.length; while (++index < length) { indent(lines[index].length - trimmedLines[index].length); } return trimmedLines.join(C_NEWLINE); } /** * Create a list-item node. * * @example * renderListItem('- _foo_', now()); * * @param {Object} value - List-item. * @param {Object} position - List-item location. * @return {Object} - `listItem` node. */ function renderListItem(value, position) { var self = this; var checked = null; var node; var task; var indent; value = LIST_ITEM_MAP[self.options.pedantic].apply(self, arguments); if (self.options.gfm) { task = value.match(EXPRESSION_TASK_ITEM); if (task) { indent = task[0].length; checked = task[1].toLowerCase() === C_X_LOWER; self.indent(position.line)(indent); value = value.slice(indent); } } node = { 'type': T_LIST_ITEM, 'loose': EXPRESSION_LOOSE_LIST_ITEM.test(value) || value.charAt(value.length - 1) === C_NEWLINE }; if (self.options.gfm) { node.checked = checked; } node.children = self.tokenizeBlock(value, position); return node; } /** * Create a footnote-definition node. * * @example * renderFootnoteDefinition('1', '_foo_', now()); * * @param {string} identifier - Unique reference. * @param {string} value - Contents * @param {Object} position - Definition location. * @return {Object} - `footnoteDefinition` node. */ function renderFootnoteDefinition(identifier, value, position) { var self = this; var exitBlockquote = self.enterBlockquote(); var node; node = { 'type': T_FOOTNOTE_DEFINITION, 'identifier': identifier, 'children': self.tokenizeBlock(value, position) }; exitBlockquote(); return node; } /** * Create a heading node. * * @example * renderHeading('_foo_', 1, now()); * * @param {string} value - Content. * @param {number} depth - Heading depth. * @param {Object} position - Heading content location. * @return {Object} - `heading` node */ function renderHeading(value, depth, position) { return { 'type': T_HEADING, 'depth': depth, 'children': this.tokenizeInline(value, position) }; } /** * Create a blockquote node. * * @example * renderBlockquote('_foo_', eat); * * @param {string} value - Content. * @param {Object} now - Position. * @return {Object} - `blockquote` node. */ function renderBlockquote(value, now) { var self = this; var exitBlockquote = self.enterBlockquote(); var node = { 'type': T_BLOCKQUOTE, 'children': self.tokenizeBlock(value, now) }; exitBlockquote(); return node; } /** * Create a void node. * * @example * renderVoid('horizontalRule'); * * @param {string} type - Node type. * @return {Object} - Node of type `type`. */ function renderVoid(type) { return { 'type': type }; } /** * Create a parent. * * @example * renderParent('paragraph', '_foo_'); * * @param {string} type - Node type. * @param {Array.} children - Child nodes. * @return {Object} - Node of type `type`. */ function renderParent(type, children) { return { 'type': type, 'children': children }; } /** * Create a raw node. * * @example * renderRaw('inlineCode', 'foo()'); * * @param {string} type - Node type. * @param {string} value - Contents. * @return {Object} - Node of type `type`. */ function renderRaw(type, value) { return { 'type': type, 'value': value }; } /** * Create a link node. * * @example * renderLink(true, 'example.com', 'example', 'Example Domain', now(), eat); * renderLink(false, 'fav.ico', 'example', 'Example Domain', now(), eat); * * @param {boolean} isLink - Whether linking to a document * or an image. * @param {string} href - URI reference. * @param {string} text - Content. * @param {string?} title - Title. * @param {Object} position - Location of link. * @return {Object} - `link` or `image` node. */ function renderLink(isLink, href, text, title, position) { var self = this; var exitLink = self.enterLink(); var node; node = { 'type': isLink ? T_LINK : T_IMAGE, 'title': title || null }; if (isLink) { node.href = href; node.children = self.tokenizeInline(text, position); } else { node.src = href; node.alt = text ? self.decode.raw(self.descape(text), position) : null; } exitLink(); return node; } /** * Create a footnote node. * * @example * renderFootnote('_foo_', now()); * * @param {string} value - Contents. * @param {Object} position - Location of footnote. * @return {Object} - `footnote` node. */ function renderFootnote(value, position) { return this.renderInline(T_FOOTNOTE, value, position); } /** * Add a node with inline content. * * @example * renderInline('strong', '_foo_', now()); * * @param {string} type - Node type. * @param {string} value - Contents. * @param {Object} position - Location of node. * @return {Object} - Node of type `type`. */ function renderInline(type, value, position) { return this.renderParent(type, this.tokenizeInline(value, position)); } /** * Add a node with block content. * * @example * renderBlock('blockquote', 'Foo.', now()); * * @param {string} type - Node type. * @param {string} value - Contents. * @param {Object} position - Location of node. * @return {Object} - Node of type `type`. */ function renderBlock(type, value, position) { return this.renderParent(type, this.tokenizeBlock(value, position)); } /** * Find a possible escape sequence. * * @example * locateEscape('foo \- bar'); // 4 * * @param {string} value - Value to search. * @param {number} fromIndex - Index to start searching at. * @return {number} - Location of possible escape sequence. */ function locateEscape(value, fromIndex) { return value.indexOf(C_BACKSLASH, fromIndex); } /** * Tokenise an escape sequence. * * @example * tokenizeEscape(eat, '\\a'); * * @property {Function} locator - Escape locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `text` or `break` node. */ function tokenizeEscape(eat, value, silent) { var self = this; var character; if (value.charAt(0) === C_BACKSLASH) { character = value.charAt(1); if (self.escape.indexOf(character) !== -1) { /* istanbul ignore if - never used (yet) */ if (silent) { return true; } return eat(C_BACKSLASH + character)( character === C_NEWLINE ? self.renderVoid(T_BREAK) : self.renderRaw(T_TEXT, character) ); } } } tokenizeEscape.locator = locateEscape; /** * Find a possible auto-link. * * @example * locateAutoLink('foo '); * * @property {boolean} notInLink * @property {Function} locator - Auto-link locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `link` node. */ function tokenizeAutoLink(eat, value, silent) { var self; var subvalue; var length; var index; var queue; var character; var hasAtCharacter; var link; var now; var content; var tokenize; var node; if (value.charAt(0) !== C_LT) { return; } self = this; subvalue = EMPTY; length = value.length; index = 0; queue = EMPTY; hasAtCharacter = false; link = EMPTY; index++; subvalue = C_LT; while (index < length) { character = value.charAt(index); if ( character === C_SPACE || character === C_GT || character === C_AT_SIGN || (character === C_COLON && value.charAt(index + 1) === C_SLASH) ) { break; } queue += character; index++; } if (!queue) { return; } link += queue; queue = EMPTY; character = value.charAt(index); link += character; index++; if (character === C_AT_SIGN) { hasAtCharacter = true; } else { if ( character !== C_COLON || value.charAt(index + 1) !== C_SLASH ) { return; } link += C_SLASH; index++; } while (index < length) { character = value.charAt(index); if (character === C_SPACE || character === C_GT) { break; } queue += character; index++; } character = value.charAt(index); if (!queue || character !== C_GT) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } link += queue; content = link; subvalue += link + character; now = eat.now(); now.column++; if (hasAtCharacter) { if ( link.substr(0, MAILTO_PROTOCOL.length).toLowerCase() !== MAILTO_PROTOCOL ) { link = MAILTO_PROTOCOL + link; } else { content = content.substr(MAILTO_PROTOCOL.length); now.column += MAILTO_PROTOCOL.length; } } /* * Temporarily remove support for escapes in autolinks. */ tokenize = self.inlineTokenizers.escape; self.inlineTokenizers.escape = null; node = eat(subvalue)( self.renderLink(true, decode(link), content, null, now, eat) ); self.inlineTokenizers.escape = tokenize; return node; } tokenizeAutoLink.notInLink = true; tokenizeAutoLink.locator = locateAutoLink; /** * Find a possible URL. * * @example * locateURL('foo http://bar'); // 4 * * @param {string} value - Value to search. * @param {number} fromIndex - Index to start searching at. * @return {number} - Location of possible URL. */ function locateURL(value, fromIndex) { var index = -1; var min = -1; var position; if (!this.options.gfm) { return -1; } while (++index < PROTOCOLS_LENGTH) { position = value.indexOf(PROTOCOLS[index], fromIndex); if (position !== -1 && (position < min || min === -1)) { min = position; } } return min; } /** * Tokenise a URL in text. * * @example * tokenizeURL(eat, 'http://foo.bar'); * * @property {boolean} notInLink * @property {Function} locator - URL locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `link` node. */ function tokenizeURL(eat, value, silent) { var self = this; var subvalue; var content; var character; var index; var position; var protocol; var match; var length; var queue; var parenCount; var nextCharacter; var now; if (!self.options.gfm) { return; } subvalue = EMPTY; index = -1; length = PROTOCOLS_LENGTH; while (++index < length) { protocol = PROTOCOLS[index]; match = value.slice(0, protocol.length); if (match.toLowerCase() === protocol) { subvalue = match; break; } } if (!subvalue) { return; } index = subvalue.length; length = value.length; queue = EMPTY; parenCount = 0; while (index < length) { character = value.charAt(index); if (isWhiteSpace(character) || character === C_LT) { break; } if ( character === C_DOT || character === C_COMMA || character === C_COLON || character === C_SEMI_COLON || character === C_DOUBLE_QUOTE || character === C_SINGLE_QUOTE || character === C_PAREN_CLOSE || character === C_BRACKET_CLOSE ) { nextCharacter = value.charAt(index + 1); if ( !nextCharacter || isWhiteSpace(nextCharacter) ) { break; } } if ( character === C_PAREN_OPEN || character === C_BRACKET_OPEN ) { parenCount++; } if ( character === C_PAREN_CLOSE || character === C_BRACKET_CLOSE ) { parenCount--; if (parenCount < 0) { break; } } queue += character; index++; } if (!queue) { return; } subvalue += queue; content = subvalue; if (protocol === MAILTO_PROTOCOL) { position = queue.indexOf(C_AT_SIGN); if (position === -1 || position === length - 1) { return; } content = content.substr(MAILTO_PROTOCOL.length); } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } now = eat.now(); return eat(subvalue)( self.renderLink(true, decode(subvalue), content, null, now, eat) ); } tokenizeURL.notInLink = true; tokenizeURL.locator = locateURL; /** * Find a possible tag. * * @example * locateTag('foo '); * * @property {Function} locator - Tag locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `html` node. */ function tokenizeTag(eat, value, silent) { var self = this; var subvalue = eatHTMLComment(value, self.options) || eatHTMLCDATA(value) || eatHTMLProcessingInstruction(value) || eatHTMLDeclaration(value) || eatHTMLClosingTag(value) || eatHTMLOpeningTag(value); if (!subvalue) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } if (!self.inLink && EXPRESSION_HTML_LINK_OPEN.test(subvalue)) { self.inLink = true; } else if (self.inLink && EXPRESSION_HTML_LINK_CLOSE.test(subvalue)) { self.inLink = false; } return eat(subvalue)(self.renderRaw(T_HTML, subvalue)); } tokenizeTag.locator = locateTag; /** * Find a possible link. * * @example * locateLink('foo ![bar'); // 4 * * @param {string} value - Value to search. * @param {number} fromIndex - Index to start searching at. * @return {number} - Location of possible link. */ function locateLink(value, fromIndex) { var link = value.indexOf(C_BRACKET_OPEN, fromIndex); var image = value.indexOf(C_EXCLAMATION_MARK + C_BRACKET_OPEN, fromIndex); if (image === -1) { return link; } /* * Link can never be `-1` if an image is found, so we don’t need to * check for that :) */ return link < image ? link : image; } /** * Tokenise a link. * * @example * tokenizeLink(eat, '![foo](fav.ico "Favicon")); * * @property {Function} locator - Link locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `link` or `image` node. */ function tokenizeLink(eat, value, silent) { var self = this; var subvalue = EMPTY; var index = 0; var character = value.charAt(0); var beforeURL; var beforeTitle; var whiteSpaceQueue; var commonmark; var openCount; var hasMarker; var markers; var isImage; var content; var marker; var length; var title; var depth; var queue; var url; var now; /* * Detect whether this is an image. */ if (character === C_EXCLAMATION_MARK) { isImage = true; subvalue = character; character = value.charAt(++index); } /* * Eat the opening. */ if (character !== C_BRACKET_OPEN) { return; } /* * Exit when this is a link and we’re already inside * a link. */ if (!isImage && self.inLink) { return; } subvalue += character; queue = EMPTY; index++; /* * Eat the content. */ commonmark = self.options.commonmark; length = value.length; now = eat.now(); depth = 0; now.column += index; while (index < length) { character = value.charAt(index); if (character === C_BRACKET_OPEN) { depth++; } else if (character === C_BRACKET_CLOSE) { /* * Allow a single closing bracket when not in * commonmark-mode. */ if (!commonmark && !depth) { if (value.charAt(index + 1) === C_PAREN_OPEN) { break; } depth++; } if (depth === 0) { break; } depth--; } queue += character; index++; } /* * Eat the content closing. */ if ( value.charAt(index) !== C_BRACKET_CLOSE || value.charAt(++index) !== C_PAREN_OPEN ) { return; } subvalue += queue + C_BRACKET_CLOSE + C_PAREN_OPEN; index++; content = queue; /* * Eat white-space. */ while (index < length) { character = value.charAt(index); if (!isWhiteSpace(character)) { break; } subvalue += character; index++; } /* * Eat the URL. */ character = value.charAt(index); markers = commonmark ? COMMONMARK_LINK_TITLE_MARKERS : LINK_TITLE_MARKERS; openCount = 0; queue = EMPTY; beforeURL = subvalue; if (character === C_LT) { index++; beforeURL += C_LT; while (index < length) { character = value.charAt(index); if (character === C_GT) { break; } if (commonmark && character === C_NEWLINE) { return; } queue += character; index++; } if (value.charAt(index) !== C_GT) { return; } subvalue += C_LT + queue + C_GT; url = queue; index++; } else { character = null; whiteSpaceQueue = EMPTY; while (index < length) { character = value.charAt(index); if (whiteSpaceQueue && has.call(markers, character)) { break; } if (isWhiteSpace(character)) { if (commonmark) { break; } whiteSpaceQueue += character; } else { if (character === C_PAREN_OPEN) { depth++; openCount++; } else if (character === C_PAREN_CLOSE) { if (depth === 0) { break; } depth--; } queue += whiteSpaceQueue; whiteSpaceQueue = EMPTY; if (character === C_BACKSLASH) { queue += C_BACKSLASH; character = value.charAt(++index); } queue += character; } index++; } queue = queue; subvalue += queue; url = queue; index = subvalue.length; } /* * Eat white-space. */ queue = EMPTY; while (index < length) { character = value.charAt(index); if (!isWhiteSpace(character)) { break; } queue += character; index++; } character = value.charAt(index); subvalue += queue; /* * Eat the title. */ if (queue && has.call(markers, character)) { index++; subvalue += character; queue = EMPTY; marker = markers[character]; beforeTitle = subvalue; /* * In commonmark-mode, things are pretty easy: the * marker cannot occur inside the title. * * Non-commonmark does, however, support nested * delimiters. */ if (commonmark) { while (index < length) { character = value.charAt(index); if (character === marker) { break; } if (character === C_BACKSLASH) { queue += C_BACKSLASH; character = value.charAt(++index); } index++; queue += character; } character = value.charAt(index); if (character !== marker) { return; } title = queue; subvalue += queue + character; index++; while (index < length) { character = value.charAt(index); if (!isWhiteSpace(character)) { break; } subvalue += character; index++; } } else { whiteSpaceQueue = EMPTY; while (index < length) { character = value.charAt(index); if (character === marker) { if (hasMarker) { queue += marker + whiteSpaceQueue; whiteSpaceQueue = EMPTY; } hasMarker = true; } else if (!hasMarker) { queue += character; } else if (character === C_PAREN_CLOSE) { subvalue += queue + marker + whiteSpaceQueue; title = queue; break; } else if (isWhiteSpace(character)) { whiteSpaceQueue += character; } else { queue += marker + whiteSpaceQueue + character; whiteSpaceQueue = EMPTY; hasMarker = false; } index++; } } } if (value.charAt(index) !== C_PAREN_CLOSE) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } subvalue += C_PAREN_CLOSE; url = self.decode.raw(self.descape(url), eat(beforeURL).test().end); if (title) { beforeTitle = eat(beforeTitle).test().end; title = self.decode.raw(self.descape(title), beforeTitle); } return eat(subvalue)( self.renderLink(!isImage, url, content, title, now, eat) ); } tokenizeLink.locator = locateLink; /** * Tokenise a reference link, image, or footnote; * shortcut reference link, or footnote. * * @example * tokenizeReference(eat, '[foo]'); * tokenizeReference(eat, '[foo][]'); * tokenizeReference(eat, '[foo][bar]'); * * @property {Function} locator - Reference locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - Reference node. */ function tokenizeReference(eat, value, silent) { var self = this; var character = value.charAt(0); var index = 0; var length = value.length; var subvalue = EMPTY; var intro = EMPTY; var type = T_LINK; var referenceType = REFERENCE_TYPE_SHORTCUT; var text; var identifier; var now; var node; var exitLink; var queue; var bracketed; var depth; /* * Check whether we’re eating an image. */ if (character === C_EXCLAMATION_MARK) { type = T_IMAGE; intro = character; character = value.charAt(++index); } if (character !== C_BRACKET_OPEN) { return; } index++; intro += character; queue = EMPTY; /* * Check whether we’re eating a footnote. */ if ( self.options.footnotes && type === T_LINK && value.charAt(index) === C_CARET ) { intro += C_CARET; index++; type = T_FOOTNOTE; } /* * Eat the text. */ depth = 0; while (index < length) { character = value.charAt(index); if (character === C_BRACKET_OPEN) { bracketed = true; depth++; } else if (character === C_BRACKET_CLOSE) { if (!depth) { break; } depth--; } if (character === C_BACKSLASH) { queue += C_BACKSLASH; character = value.charAt(++index); } queue += character; index++; } subvalue = text = queue; character = value.charAt(index); if (character !== C_BRACKET_CLOSE) { return; } index++; subvalue += character; queue = EMPTY; while (index < length) { character = value.charAt(index); if (!isWhiteSpace(character)) { break; } queue += character; index++; } character = value.charAt(index); if (character !== C_BRACKET_OPEN) { if (!text) { return; } identifier = text; } else { identifier = EMPTY; queue += character; index++; while (index < length) { character = value.charAt(index); if ( character === C_BRACKET_OPEN || character === C_BRACKET_CLOSE ) { break; } if (character === C_BACKSLASH) { identifier += C_BACKSLASH; character = value.charAt(++index); } identifier += character; index++; } character = value.charAt(index); if (character === C_BRACKET_CLOSE) { queue += identifier + character; index++; referenceType = identifier ? REFERENCE_TYPE_FULL : REFERENCE_TYPE_COLLAPSED; } else { identifier = EMPTY; } subvalue += queue; queue = EMPTY; } /* * Brackets cannot be inside the identifier. */ if (referenceType !== REFERENCE_TYPE_FULL && bracketed) { return; } /* * Inline footnotes cannot have an identifier. */ if (type === T_FOOTNOTE && referenceType !== REFERENCE_TYPE_SHORTCUT) { type = T_LINK; intro = C_BRACKET_OPEN + C_CARET; text = C_CARET + text; } subvalue = intro + subvalue; if (type === T_LINK && self.inLink) { return null; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } if (type === T_FOOTNOTE && text.indexOf(C_SPACE) !== -1) { return eat(subvalue)(self.renderFootnote(text, eat.now())); } now = eat.now(); now.column += intro.length; identifier = referenceType === REFERENCE_TYPE_FULL ? identifier : text; node = { 'type': type + 'Reference', 'identifier': normalize(identifier) }; if (type === T_LINK || type === T_IMAGE) { node.referenceType = referenceType; } if (type === T_LINK) { exitLink = self.enterLink(); node.children = self.tokenizeInline(text, now); exitLink(); } else if (type === T_IMAGE) { node.alt = self.decode.raw(self.descape(text), now) || null; } return eat(subvalue)(node); } tokenizeReference.locator = locateLink; /** * Find a possible strong emphasis. * * @example * locateStrong('foo **bar'); // 4 * * @param {string} value - Value to search. * @param {number} fromIndex - Index to start searching at. * @return {number} - Location of possible strong emphasis. */ function locateStrong(value, fromIndex) { var asterisk = value.indexOf(C_ASTERISK + C_ASTERISK, fromIndex); var underscore = value.indexOf(C_UNDERSCORE + C_UNDERSCORE, fromIndex); if (underscore === -1) { return asterisk; } if (asterisk === -1) { return underscore; } return underscore < asterisk ? underscore : asterisk; } /** * Tokenise strong emphasis. * * @example * tokenizeStrong(eat, '**foo**'); * tokenizeStrong(eat, '__foo__'); * * @property {Function} locator - Strong emphasis locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `strong` node. */ function tokenizeStrong(eat, value, silent) { var self = this; var index = 0; var character = value.charAt(index); var now; var pedantic; var marker; var queue; var subvalue; var length; var prev; if ( EMPHASIS_MARKERS[character] !== true || value.charAt(++index) !== character ) { return; } pedantic = self.options.pedantic; marker = character; subvalue = marker + marker; length = value.length; index++; queue = character = EMPTY; if (pedantic && isWhiteSpace(value.charAt(index))) { return; } while (index < length) { prev = character; character = value.charAt(index); if ( character === marker && value.charAt(index + 1) === marker && (!pedantic || !isWhiteSpace(prev)) ) { character = value.charAt(index + 2); if (character !== marker) { if (!trim(queue)) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } now = eat.now(); now.column += 2; return eat(subvalue + queue + subvalue)( self.renderInline(T_STRONG, queue, now) ); } } if (!pedantic && character === C_BACKSLASH) { queue += character; character = value.charAt(++index); } queue += character; index++; } } tokenizeStrong.locator = locateStrong; /** * Find possible slight emphasis. * * @example * locateEmphasis('foo *bar'); // 4 * * @param {string} value - Value to search. * @param {number} fromIndex - Index to start searching at. * @return {number} - Location of possible slight emphasis. */ function locateEmphasis(value, fromIndex) { var asterisk = value.indexOf(C_ASTERISK, fromIndex); var underscore = value.indexOf(C_UNDERSCORE, fromIndex); if (underscore === -1) { return asterisk; } if (asterisk === -1) { return underscore; } return underscore < asterisk ? underscore : asterisk; } /** * Tokenise slight emphasis. * * @example * tokenizeEmphasis(eat, '*foo*'); * tokenizeEmphasis(eat, '_foo_'); * * @property {Function} locator - Slight emphasis locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `emphasis` node. */ function tokenizeEmphasis(eat, value, silent) { var self = this; var index = 0; var character = value.charAt(index); var now; var pedantic; var marker; var queue; var subvalue; var length; var prev; if (EMPHASIS_MARKERS[character] !== true) { return; } pedantic = self.options.pedantic; subvalue = marker = character; length = value.length; index++; queue = character = EMPTY; if (pedantic && isWhiteSpace(value.charAt(index))) { return; } while (index < length) { prev = character; character = value.charAt(index); if ( character === marker && (!pedantic || !isWhiteSpace(prev)) ) { character = value.charAt(++index); if (character !== marker) { if (!trim(queue) || prev === marker) { return; } if ( pedantic || marker !== C_UNDERSCORE || !isWordCharacter(character) ) { /* istanbul ignore if - never used (yet) */ if (silent) { return true; } now = eat.now(); now.column++; return eat(subvalue + queue + marker)( self.renderInline(T_EMPHASIS, queue, now) ); } } queue += marker; } if (!pedantic && character === C_BACKSLASH) { queue += character; character = value.charAt(++index); } queue += character; index++; } } tokenizeEmphasis.locator = locateEmphasis; /** * Find a possible deletion. * * @example * locateDeletion('foo ~~bar'); // 4 * * @param {string} value - Value to search. * @param {number} fromIndex - Index to start searching at. * @return {number} - Location of possible deletion. */ function locateDeletion(value, fromIndex) { return value.indexOf(C_TILDE + C_TILDE, fromIndex); } /** * Tokenise a deletion. * * @example * tokenizeDeletion(eat, '~~foo~~'); * * @property {Function} locator - Deletion locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `delete` node. */ function tokenizeDeletion(eat, value, silent) { var self = this; var character = EMPTY; var previous = EMPTY; var preceding = EMPTY; var subvalue = EMPTY; var index; var length; var now; if ( !self.options.gfm || value.charAt(0) !== C_TILDE || value.charAt(1) !== C_TILDE || isWhiteSpace(value.charAt(2)) ) { return; } index = 1; length = value.length; now = eat.now(); now.column += 2; while (++index < length) { character = value.charAt(index); if ( character === C_TILDE && previous === C_TILDE && (!preceding || !isWhiteSpace(preceding)) ) { /* istanbul ignore if - never used (yet) */ if (silent) { return true; } return eat(C_TILDE + C_TILDE + subvalue + C_TILDE + C_TILDE)( self.renderInline(T_DELETE, subvalue, now) ); } subvalue += previous; preceding = previous; previous = character; } } tokenizeDeletion.locator = locateDeletion; /** * Find possible inline code. * * @example * locateInlineCode('foo `bar'); // 4 * * @param {string} value - Value to search. * @param {number} fromIndex - Index to start searching at. * @return {number} - Location of possible inline code. */ function locateInlineCode(value, fromIndex) { return value.indexOf(C_TICK, fromIndex); } /** * Tokenise inline code. * * @example * tokenizeInlineCode(eat, '`foo()`'); * * @property {Function} locator - Inline code locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `inlineCode` node. */ function tokenizeInlineCode(eat, value, silent) { var self = this; var length = value.length; var index = 0; var queue = EMPTY; var tickQueue = EMPTY; var contentQueue; var whiteSpaceQueue; var count; var openingCount; var subvalue; var character; var found; var next; while (index < length) { if (value.charAt(index) !== C_TICK) { break; } queue += C_TICK; index++; } if (!queue) { return; } subvalue = queue; openingCount = index; queue = EMPTY; next = value.charAt(index); count = 0; while (index < length) { character = next; next = value.charAt(index + 1); if (character === C_TICK) { count++; tickQueue += character; } else { count = 0; queue += character; } if (count && next !== C_TICK) { if (count === openingCount) { subvalue += queue + tickQueue; found = true; break; } queue += tickQueue; tickQueue = EMPTY; } index++; } if (!found) { if (openingCount % 2 !== 0) { return; } queue = EMPTY; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } contentQueue = whiteSpaceQueue = EMPTY; length = queue.length; index = -1; while (++index < length) { character = queue.charAt(index); if (isWhiteSpace(character)) { whiteSpaceQueue += character; continue; } if (whiteSpaceQueue) { if (contentQueue) { contentQueue += whiteSpaceQueue; } whiteSpaceQueue = EMPTY; } contentQueue += character; } return eat(subvalue)(self.renderRaw(T_INLINE_CODE, contentQueue)); } tokenizeInlineCode.locator = locateInlineCode; /** * Find a possible break. * * @example * locateBreak('foo \nbar'); // 3 * * @param {string} value - Value to search. * @param {number} fromIndex - Index to start searching at. * @return {number} - Location of possible break. */ function locateBreak(value, fromIndex) { var index = value.indexOf(C_NEWLINE, fromIndex); while (index > fromIndex) { if (value.charAt(index - 1) !== C_SPACE) { break; } index--; } return index; } /** * Tokenise a break. * * @example * tokenizeBreak(eat, ' \n'); * * @property {Function} locator - Break locator. * @param {function(string)} eat - Eater. * @param {string} value - Rest of content. * @param {boolean?} [silent] - Whether this is a dry run. * @return {Node?|boolean} - `break` node. */ function tokenizeBreak(eat, value, silent) { var self = this; var breaks = self.options.breaks; var length = value.length; var index = -1; var queue = EMPTY; var character; while (++index < length) { character = value.charAt(index); if (character === C_NEWLINE) { if (!breaks && index < MIN_BREAK_LENGTH) { return; } /* istanbul ignore if - never used (yet) */ if (silent) { return true; } queue += character; return eat(queue)(self.renderVoid(T_BREAK)); } if (character !== C_SPACE) { return; } queue += character; } } tokenizeBreak.locator = locateBreak; /** * Construct a new parser. * * @example * var parser = new Parser(new VFile('Foo')); * * @constructor * @class {Parser} * @param {VFile} file - File to parse. * @param {Object?} [options] - Passed to * `Parser#setOptions()`. */ function Parser(file, options, processor) { var self = this; self.file = file; self.inLink = false; self.atTop = true; self.atStart = true; self.inBlockquote = false; self.data = processor.data; self.descape = descapeFactory(self, 'escape'); self.decode = decodeFactory(self); self.options = extend({}, self.options); self.setOptions(options); } /** * Set options. Does not overwrite previously set * options. * * @example * var parser = new Parser(); * parser.setOptions({gfm: true}); * * @this {Parser} * @throws {Error} - When an option is invalid. * @param {Object?} [options] - Parse settings. * @return {Parser} - `self`. */ Parser.prototype.setOptions = function (options) { var self = this; var escape = self.data.escape; var current = self.options; var key; if (options === null || options === undefined) { options = {}; } else if (typeof options === 'object') { options = extend({}, options); } else { raise(options, 'options'); } for (key in defaultOptions) { validate.boolean(options, key, current[key]); } self.options = options; if (options.commonmark) { self.escape = escape.commonmark; } else if (options.gfm) { self.escape = escape.gfm; } else { self.escape = escape.default; } return self; }; /* * Expose `defaults`. */ Parser.prototype.options = defaultOptions; /** * Factory to track indentation for each line corresponding * to the given `start` and the number of invocations. * * @param {number} start - Starting line. * @return {function(offset)} - Indenter. */ Parser.prototype.indent = function (start) { var self = this; var line = start; /** * Intender which increments the global offset, * starting at the bound line, and further incrementing * each line for each invocation. * * @example * indenter(2); * * @param {number} offset - Number to increment the * offset. */ function indenter(offset) { self.offset[line] = (self.offset[line] || 0) + offset; line++; } return indenter; }; /** * Get found offsets starting at `start`. * * @param {number} start - Starting line. * @return {Array.} - Offsets starting at `start`. */ Parser.prototype.getIndent = function (start) { var offset = this.offset; var result = []; while (++start) { if (!(start in offset)) { break; } result.push((offset[start] || 0) + 1); } return result; }; /** * Parse the bound file. * * @example * new Parser(new File('_Foo_.')).parse(); * * @this {Parser} * @return {Object} - `root` node. */ Parser.prototype.parse = function () { var self = this; var value = clean(String(self.file)); var node; /* * Add an `offset` matrix, used to keep track of * syntax and white space indentation per line. */ self.offset = {}; node = self.renderBlock(T_ROOT, value); if (self.options.position) { node.position = { 'start': { 'line': 1, 'column': 1 } }; node.position.end = self.eof || node.position.start; } return node; }; /* * Enter and exit helpers. */ Parser.prototype.enterLink = stateToggler('inLink', false); Parser.prototype.exitTop = stateToggler('atTop', true); Parser.prototype.exitStart = stateToggler('atStart', true); Parser.prototype.enterBlockquote = stateToggler('inBlockquote', false); /* * Expose helpers */ Parser.prototype.renderRaw = renderRaw; Parser.prototype.renderVoid = renderVoid; Parser.prototype.renderParent = renderParent; Parser.prototype.renderInline = renderInline; Parser.prototype.renderBlock = renderBlock; Parser.prototype.renderLink = renderLink; Parser.prototype.renderCodeBlock = renderCodeBlock; Parser.prototype.renderBlockquote = renderBlockquote; Parser.prototype.renderListItem = renderListItem; Parser.prototype.renderFootnoteDefinition = renderFootnoteDefinition; Parser.prototype.renderHeading = renderHeading; Parser.prototype.renderFootnote = renderFootnote; /** * Construct a tokenizer. This creates both * `tokenizeInline` and `tokenizeBlock`. * * @example * Parser.prototype.tokenizeInline = tokenizeFactory('inline'); * * @param {string} type - Name of parser, used to find * its expressions (`%sMethods`) and tokenizers * (`%Tokenizers`). * @return {Function} - Tokenizer. */ function tokenizeFactory(type) { /** * Tokenizer for a bound `type` * * @example * parser = new Parser(); * parser.tokenizeInline('_foo_'); * * @param {string} value - Content. * @param {Object?} [location] - Offset at which `value` * starts. * @return {Array.} - Nodes. */ function tokenize(value, location) { var self = this; var offset = self.offset; var tokens = []; var methods = self[type + 'Methods']; var tokenizers = self[type + 'Tokenizers']; var line = location ? location.line : 1; var column = location ? location.column : 1; var patchPosition = self.options.position; var add; var index; var length; var method; var name; var matched; var valueLength; var eater; /* * Trim white space only lines. */ if (!value) { return tokens; } /** * Update line and column based on `value`. * * @example * updatePosition('foo'); * * @param {string} subvalue - Subvalue to eat. */ function updatePosition(subvalue) { var lastIndex = -1; var index = subvalue.indexOf(C_NEWLINE); while (index !== -1) { line++; lastIndex = index; index = subvalue.indexOf(C_NEWLINE, index + 1); } if (lastIndex === -1) { column = column + subvalue.length; } else { column = subvalue.length - lastIndex; } if (line in offset) { if (lastIndex !== -1) { column += offset[line]; } else if (column <= offset[line]) { column = offset[line] + 1; } } } /** * Get offset. Called before the first character is * eaten to retrieve the range's offsets. * * @return {Function} - `done`, to be called when * the last character is eaten. */ function getOffset() { var indentation = []; var pos = line + 1; /** * Done. Called when the last character is * eaten to retrieve the range’s offsets. * * @return {Array.} - Offset. */ function done() { var last = line + 1; while (pos < last) { indentation.push((offset[pos] || 0) + 1); pos++; } return indentation; } return done; } /** * Get the current position. * * @example * position = now(); // {line: 1, column: 1} * * @return {Object} - Current Position. */ function now() { return { 'line': line, 'column': column }; } /** * Store position information for a node. * * @example * start = now(); * updatePosition('foo'); * location = new Position(start); * // {start: {line: 1, column: 1}, end: {line: 1, column: 3}} * * @param {Object} start - Starting position. */ function Position(start) { this.start = start; this.end = now(); } /** * Throw when a value is incorrectly eaten. * This shouldn’t happen but will throw on new, * incorrect rules. * * @example * // When the current value is set to `foo bar`. * validateEat('foo'); * eat('foo'); * * validateEat('bar'); * // throws, because the space is not eaten. * * @param {string} subvalue - Value to be eaten. * @throws {Error} - When `subvalue` cannot be eaten. */ function validateEat(subvalue) { /* istanbul ignore if */ if (value.substring(0, subvalue.length) !== subvalue) { self.file.fail(ERR_INCORRECTLY_EATEN, now()); } } /** * Mark position and patch `node.position`. * * @example * var update = position(); * updatePosition('foo'); * update({}); * // { * // position: { * // start: {line: 1, column: 1} * // end: {line: 1, column: 3} * // } * // } * * @returns {Function} - Updater. */ function position() { var before = now(); /** * Add the position to a node. * * @example * update({type: 'text', value: 'foo'}); * * @param {Node} node - Node to attach position * on. * @param {Array} [indent] - Indentation for * `node`. * @return {Node} - `node`. */ function update(node, indent) { var prev = node.position; var start = prev ? prev.start : before; var combined = []; var n = prev && prev.end.line; var l = before.line; node.position = new Position(start); /* * If there was already a `position`, this * node was merged. Fixing `start` wasn’t * hard, but the indent is different. * Especially because some information, the * indent between `n` and `l` wasn’t * tracked. Luckily, that space is * (should be?) empty, so we can safely * check for it now. */ if (prev && indent && prev.indent) { combined = prev.indent; if (n < l) { while (++n < l) { combined.push((offset[n] || 0) + 1); } combined.push(before.column); } indent = combined.concat(indent); } node.position.indent = indent || []; return node; } return update; } /** * Add `node` to `parent`s children or to `tokens`. * Performs merges where possible. * * @example * add({}); * * add({}, {children: []}); * * @param {Object} node - Node to add. * @param {Object} [parent] - Parent to insert into. * @return {Object} - Added or merged into node. */ add = function (node, parent) { var prev; var children; if (!parent) { children = tokens; } else { children = parent.children; } prev = children[children.length - 1]; if ( prev && node.type === prev.type && node.type in MERGEABLE_NODES && mergeable(prev) && mergeable(node) ) { node = MERGEABLE_NODES[node.type].call( self, prev, node ); } if (node !== prev) { children.push(node); } if (self.atStart && tokens.length) { self.exitStart(); } return node; }; /** * Remove `subvalue` from `value`. * Expects `subvalue` to be at the start from * `value`, and applies no validation. * * @example * eat('foo')({type: 'text', value: 'foo'}); * * @param {string} subvalue - Removed from `value`, * and passed to `updatePosition`. * @return {Function} - Wrapper around `add`, which * also adds `position` to node. */ function eat(subvalue) { var indent = getOffset(); var pos = position(); var current = now(); validateEat(subvalue); /** * Add the given arguments, add `position` to * the returned node, and return the node. * * @param {Object} node - Node to add. * @param {Object} [parent] - Node to insert into. * @return {Node} - Added node. */ function apply(node, parent) { return pos(add(pos(node), parent), indent); } /** * Functions just like apply, but resets the * content: the line and column are reversed, * and the eaten value is re-added. * * This is useful for nodes with a single * type of content, such as lists and tables. * * See `apply` above for what parameters are * expected. * * @return {Node} - Added node. */ function reset() { var node = apply.apply(null, arguments); line = current.line; column = current.column; value = subvalue + value; return node; } /** * Test the position, after eating, and reverse * to a not-eaten state. * * @return {Position} - Position after eating `subvalue`. */ function test() { var result = pos({}); line = current.line; column = current.column; value = subvalue + value; return result.position; } apply.reset = reset; apply.test = reset.test = test; value = value.substring(subvalue.length); updatePosition(subvalue); indent = indent(); return apply; } /** * Same as `eat` above, but will not add positional * information to nodes. * * @example * noEat('foo')({type: 'text', value: 'foo'}); * * @param {string} subvalue - Removed from `value`. * @return {Function} - Wrapper around `add`. */ function noEat(subvalue) { validateEat(subvalue); /** * Add the given arguments, and return the * node. * * @return {Node} - Added node. */ function apply() { return add.apply(null, arguments); } /** * Functions just like apply, but resets the * content: the eaten value is re-added. * * @return {Node} - Added node. */ function reset() { var node = apply.apply(null, arguments); value = subvalue + value; return node; } /** * Test the position, which in this mode is an * empty object. * * @return {Object} - Empty position object. */ function test() { value = subvalue + value; return {}; } apply.reset = reset; apply.test = reset.test = test; value = value.substring(subvalue.length); return apply; } /* * Expose the eater, depending on if `position`s * should be patched on nodes. */ eater = patchPosition ? eat : noEat; /* * Expose `now` on `eater`. */ eater.now = now; /* * Expose `file` on `eater`. */ eater.file = self.file; /* * Sync initial offset. */ updatePosition(EMPTY); /* * Iterate over `value`, and iterate over all * tokenizers. When one eats something, re-iterate * with the remaining value. If no tokenizer eats, * something failed (should not happen) and an * exception is thrown. */ while (value) { index = -1; length = methods.length; matched = false; while (++index < length) { name = methods[index]; method = tokenizers[name]; if ( method && (!method.onlyAtStart || self.atStart) && (!method.onlyAtTop || self.atTop) && (!method.notInBlockquote || !self.inBlockquote) && (!method.notInLink || !self.inLink) ) { valueLength = value.length; method.apply(self, [eater, value]); matched = valueLength !== value.length; if (matched) { break; } } } /* istanbul ignore if */ if (!matched) { self.file.fail(ERR_INFINITE_LOOP, eater.now()); /* * Errors are not thrown on `File#fail` * when `quiet: true`. */ break; } } self.eof = now(); return tokens; } return tokenize; } /* * Expose tokenizers for block-level nodes. */ Parser.prototype.blockTokenizers = { 'yamlFrontMatter': tokenizeYAMLFrontMatter, 'newline': tokenizeNewline, 'code': tokenizeCode, 'fences': tokenizeFences, 'heading': tokenizeHeading, 'lineHeading': tokenizeLineHeading, 'horizontalRule': tokenizeHorizontalRule, 'blockquote': tokenizeBlockquote, 'list': tokenizeList, 'html': tokenizeHTML, 'definition': tokenizeDefinition, 'footnoteDefinition': tokenizeFootnoteDefinition, 'table': tokenizeTable, 'paragraph': tokenizeParagraph }; /* * Expose order in which to parse block-level nodes. */ Parser.prototype.blockMethods = [ 'yamlFrontMatter', 'newline', 'code', 'fences', 'blockquote', 'heading', 'horizontalRule', 'list', 'lineHeading', 'html', 'footnoteDefinition', 'definition', 'looseTable', 'table', 'paragraph' ]; /** * Block tokenizer. * * @example * var parser = new Parser(); * parser.tokenizeBlock('> foo.'); * * @param {string} value - Content. * @return {Array.} - Nodes. */ Parser.prototype.tokenizeBlock = tokenizeFactory(BLOCK); /* * Expose tokenizers for inline-level nodes. */ Parser.prototype.inlineTokenizers = { 'escape': tokenizeEscape, 'autoLink': tokenizeAutoLink, 'url': tokenizeURL, 'tag': tokenizeTag, 'link': tokenizeLink, 'reference': tokenizeReference, 'strong': tokenizeStrong, 'emphasis': tokenizeEmphasis, 'deletion': tokenizeDeletion, 'inlineCode': tokenizeInlineCode, 'break': tokenizeBreak, 'inlineText': tokenizeText }; /* * Expose order in which to parse inline-level nodes. */ Parser.prototype.inlineMethods = [ 'escape', 'autoLink', 'url', 'tag', 'link', 'reference', 'shortcutReference', 'strong', 'emphasis', 'deletion', 'inlineCode', 'break', 'inlineText' ]; /** * Inline tokenizer. * * @example * var parser = new Parser(); * parser.tokenizeInline('_foo_'); * * @param {string} value - Content. * @return {Array.} - Nodes. */ Parser.prototype.tokenizeInline = tokenizeFactory(INLINE); /* * Expose `tokenizeFactory` so dependencies could create * their own tokenizers. */ Parser.prototype.tokenizeFactory = tokenizeFactory; /* * Expose `parse` on `module.exports`. */ module.exports = Parser; },{"./block-elements.json":416,"./defaults.js":417,"./utilities.js":421,"extend.js":147,"parse-entities":289,"repeat-string":422,"trim":622,"trim-trailing-lines":621}],420:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015-2016 Titus Wormer * @license MIT * @module remark:stringify * @version 3.2.2 * @fileoverview Compile an abstract syntax tree into * a markdown document. */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var decode = require('parse-entities'); var encode = require('stringify-entities'); var table = require('markdown-table'); var repeat = require('repeat-string'); var extend = require('extend.js'); var ccount = require('ccount'); var longestStreak = require('longest-streak'); var utilities = require('./utilities.js'); var defaultOptions = require('./defaults.js').stringify; /* * Methods. */ var raise = utilities.raise; var validate = utilities.validate; var stateToggler = utilities.stateToggler; var mergeable = utilities.mergeable; var MERGEABLE_NODES = utilities.MERGEABLE_NODES; /* * Constants. */ var INDENT = 4; var MINIMUM_CODE_FENCE_LENGTH = 3; var YAML_FENCE_LENGTH = 3; var MINIMUM_RULE_LENGTH = 3; var MAILTO = 'mailto:'; var ERROR_LIST_ITEM_INDENT = 'Cannot indent code properly. See ' + 'http://git.io/mdast-lii'; /* * Expressions. */ var EXPRESSIONS_WHITE_SPACE = /\s/; /* * Naive fence expression. */ var FENCE = /([`~])\1{2}/; /* * Expression for a protocol. * * @see http://en.wikipedia.org/wiki/URI_scheme#Generic_syntax */ var PROTOCOL = /^[a-z][a-z+.-]+:\/?/i; /* * Punctuation characters. */ var PUNCTUATION = /[-!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~_]/; /* * Characters. */ var ANGLE_BRACKET_CLOSE = '>'; var ANGLE_BRACKET_OPEN = '<'; var ASTERISK = '*'; var BACKSLASH = '\\'; var CARET = '^'; var COLON = ':'; var SEMICOLON = ';'; var DASH = '-'; var DOT = '.'; var EMPTY = ''; var EQUALS = '='; var EXCLAMATION_MARK = '!'; var HASH = '#'; var AMPERSAND = '&'; var LINE = '\n'; var CARRIAGE = '\r'; var FORM_FEED = '\f'; var PARENTHESIS_OPEN = '('; var PARENTHESIS_CLOSE = ')'; var PIPE = '|'; var PLUS = '+'; var QUOTE_DOUBLE = '"'; var QUOTE_SINGLE = '\''; var SPACE = ' '; var TAB = '\t'; var VERTICAL_TAB = '\u000B'; var SQUARE_BRACKET_OPEN = '['; var SQUARE_BRACKET_CLOSE = ']'; var TICK = '`'; var TILDE = '~'; var UNDERSCORE = '_'; /* * Entities. */ var ENTITY_AMPERSAND = AMPERSAND + 'amp' + SEMICOLON; var ENTITY_ANGLE_BRACKET_OPEN = AMPERSAND + 'lt' + SEMICOLON; var ENTITY_COLON = AMPERSAND + '#x3A' + SEMICOLON; /* * Character combinations. */ var BREAK = LINE + LINE; var GAP = BREAK + LINE; var DOUBLE_TILDE = TILDE + TILDE; /* * Allowed entity options. */ var ENTITY_OPTIONS = {}; ENTITY_OPTIONS.true = true; ENTITY_OPTIONS.false = true; ENTITY_OPTIONS.numbers = true; ENTITY_OPTIONS.escape = true; /* * Allowed list-bullet characters. */ var LIST_BULLETS = {}; LIST_BULLETS[ASTERISK] = true; LIST_BULLETS[DASH] = true; LIST_BULLETS[PLUS] = true; /* * Allowed horizontal-rule bullet characters. */ var HORIZONTAL_RULE_BULLETS = {}; HORIZONTAL_RULE_BULLETS[ASTERISK] = true; HORIZONTAL_RULE_BULLETS[DASH] = true; HORIZONTAL_RULE_BULLETS[UNDERSCORE] = true; /* * Allowed emphasis characters. */ var EMPHASIS_MARKERS = {}; EMPHASIS_MARKERS[UNDERSCORE] = true; EMPHASIS_MARKERS[ASTERISK] = true; /* * Allowed fence markers. */ var FENCE_MARKERS = {}; FENCE_MARKERS[TICK] = true; FENCE_MARKERS[TILDE] = true; /* * Which method to use based on `list.ordered`. */ var ORDERED_MAP = {}; ORDERED_MAP.true = 'visitOrderedItems'; ORDERED_MAP.false = 'visitUnorderedItems'; /* * Allowed list-item-indent's. */ var LIST_ITEM_INDENTS = {}; var LIST_ITEM_TAB = 'tab'; var LIST_ITEM_ONE = '1'; var LIST_ITEM_MIXED = 'mixed'; LIST_ITEM_INDENTS[LIST_ITEM_ONE] = true; LIST_ITEM_INDENTS[LIST_ITEM_TAB] = true; LIST_ITEM_INDENTS[LIST_ITEM_MIXED] = true; /* * Which checkbox to use. */ var CHECKBOX_MAP = {}; CHECKBOX_MAP.null = EMPTY; CHECKBOX_MAP.undefined = EMPTY; CHECKBOX_MAP.true = SQUARE_BRACKET_OPEN + 'x' + SQUARE_BRACKET_CLOSE + SPACE; CHECKBOX_MAP.false = SQUARE_BRACKET_OPEN + SPACE + SQUARE_BRACKET_CLOSE + SPACE; /** * Encode noop. * Simply returns the given value. * * @example * var encode = encodeNoop(); * encode('AT&T') // 'AT&T' * * @param {string} value - Content. * @return {string} - Content, without any modifications. */ function encodeNoop(value) { return value; } /** * Factory to encode HTML entities. * Creates a no-operation function when `type` is * `'false'`, a function which encodes using named * references when `type` is `'true'`, and a function * which encodes using numbered references when `type` is * `'numbers'`. * * @example * encodeFactory('false')('AT&T') // 'AT&T' * encodeFactory('true')('AT&T') // 'AT&T' * encodeFactory('numbers')('AT&T') // 'ATT&T' * * @param {string} type - Either `'true'`, `'false'`, or * `'numbers'`. * @return {function(string): string} - Function which * takes a value and returns its encoded version. */ function encodeFactory(type) { var options = {}; if (type === 'false') { return encodeNoop; } if (type === 'true') { options.useNamedReferences = true; } if (type === 'escape') { options.escapeOnly = options.useNamedReferences = true; } /** * Encode HTML entities using `he` using bound options. * * @see https://github.com/mathiasbynens/he#strict * * @example * // When `type` is `'true'`. * encode('AT&T'); // 'AT&T' * * // When `type` is `'numbers'`. * encode('AT&T'); // 'ATT&T' * * @param {string} value - Content. * @param {Object} [node] - Node which is compiled. * @return {string} - Encoded content. * @throws {Error} - When `file.quiet` is not `true`. * However, by default `he` does not throw on * parse errors, but when * `he.encode.options.strict: true`, they occur on * invalid HTML. */ function encoder(value) { return encode(value, options); } return encoder; } /** * Returns the length of HTML entity that is a prefix of * the given string (excluding the ampersand), 0 if it * does not start with an entity. * * @example * entityPrefixLength('©cat') // 4 * entityPrefixLength('&foo & &bar') // 0 * * @param {string} value - Input string. * @return {number} - Length of an entity. */ function entityPrefixLength(value) { var prefix; /* istanbul ignore if - Currently also tested for at * implemention, but we keep it here because that’s * proper. */ if (value.charAt(0) !== AMPERSAND) { return 0; } prefix = value.split(AMPERSAND, 2).join(AMPERSAND); return prefix.length - decode(prefix).length; } /** * Checks if a string starts with HTML entity. * * @example * startsWithEntity('©cat') // true * startsWithEntity('&foo & &bar') // false * * @param {string} value - Value to check. * @return {number} - Whether `value` starts an entity. */ function startsWithEntity(value) { return entityPrefixLength(value) > 0; } /** * Check if `character` is a valid alignment row character. * * @example * isAlignmentRowCharacter(':') // true * isAlignmentRowCharacter('=') // false * * @param {string} character - Character to check. * @return {boolean} - Whether `character` is a valid * alignment row character. */ function isAlignmentRowCharacter(character) { return character === COLON || character === DASH || character === SPACE || character === PIPE; } /** * Check if `index` in `value` is inside an alignment row. * * @example * isInAlignmentRow(':--:', 2) // true * isInAlignmentRow(':--:\n:-*-:', 9) // false * * @param {string} value - Value to check. * @param {number} index - Position in `value` to check. * @return {boolean} - Whether `index` in `value` is in * an alignment row. */ function isInAlignmentRow(value, index) { var length = value.length; var start = index; var character; while (++index < length) { character = value.charAt(index); if (character === LINE) { break; } if (!isAlignmentRowCharacter(character)) { return false; } } index = start; while (--index > -1) { character = value.charAt(index); if (character === LINE) { break; } if (!isAlignmentRowCharacter(character)) { return false; } } return true; } /** * Factory to escape characters. * * @example * var escape = escapeFactory({ commonmark: true }); * escape('x*x', { type: 'text', value: 'x*x' }) // 'x\\*x' * * @param {Object} options - Compiler options. * @return {function(value, node, parent): string} - Function which * takes a value and a node and (optionally) its parent and returns * its escaped value. */ function escapeFactory(options) { /** * Escape punctuation characters in a node's value. * * @param {string} value - Value to escape. * @param {Object} node - Node in which `value` exists. * @param {Object} [parent] - Parent of `node`. * @return {string} - Escaped `value`. */ return function escape(value, node, parent) { var self = this; var gfm = options.gfm; var commonmark = options.commonmark; var siblings = parent && parent.children; var index = siblings && siblings.indexOf(node); var prev = siblings && siblings[index - 1]; var next = siblings && siblings[index + 1]; var length = value.length; var position = -1; var queue = []; var escaped = queue; var afterNewLine; var character; if (prev) { afterNewLine = prev.type === 'text' && /\n\s*$/.test(prev.value); } else if (parent) { afterNewLine = parent.type === 'paragraph'; } while (++position < length) { character = value.charAt(position); if ( character === BACKSLASH || character === TICK || character === ASTERISK || character === SQUARE_BRACKET_OPEN || character === UNDERSCORE || (self.inLink && character === SQUARE_BRACKET_CLOSE) || ( gfm && character === PIPE && ( self.inTable || isInAlignmentRow(value, position) ) ) ) { afterNewLine = false; queue.push(BACKSLASH); } else if (character === ANGLE_BRACKET_OPEN) { afterNewLine = false; if (commonmark) { queue.push(BACKSLASH); } else { queue.push(ENTITY_ANGLE_BRACKET_OPEN); continue; } } else if ( gfm && !self.inLink && character === COLON && ( queue.slice(-6).join(EMPTY) === 'mailto' || queue.slice(-5).join(EMPTY) === 'https' || queue.slice(-4).join(EMPTY) === 'http' ) ) { afterNewLine = false; if (commonmark) { queue.push(BACKSLASH); } else { queue.push(ENTITY_COLON); continue; } /* istanbul ignore if - Impossible to test with * the current set-up. We need tests which try * to force markdown content into the tree. */ } else if ( character === AMPERSAND && startsWithEntity(value.slice(position)) ) { afterNewLine = false; if (commonmark) { queue.push(BACKSLASH); } else { queue.push(ENTITY_AMPERSAND); continue; } } else if ( gfm && character === TILDE && value.charAt(position + 1) === TILDE ) { queue.push(BACKSLASH, TILDE); afterNewLine = false; position += 1; } else if (character === LINE) { afterNewLine = true; } else if (afterNewLine) { if ( character === ANGLE_BRACKET_CLOSE || character === HASH || LIST_BULLETS[character] ) { queue.push(BACKSLASH); afterNewLine = false; } else if ( character !== SPACE && character !== TAB && character !== CARRIAGE && character !== VERTICAL_TAB && character !== FORM_FEED ) { afterNewLine = false; } } queue.push(character); } /* * Multi-node versions. */ if (siblings && node.type === 'text') { /* * Check for an opening parentheses after a * link-reference (which can be joined by * white-space). */ if ( prev && prev.referenceType === 'shortcut' ) { position = -1; length = escaped.length; while (++position < length) { character = escaped[position]; if (character === SPACE || character === TAB) { continue; } if (character === PARENTHESIS_OPEN) { escaped[position] = BACKSLASH + character; } if (character === COLON) { if (commonmark) { escaped[position] = BACKSLASH + character; } else { escaped[position] = ENTITY_COLON; } } break; } } /* * Ensure non-auto-links are not seen as links. * This pattern needs to check the preceding * nodes too. */ if ( gfm && !self.inLink && prev && prev.type === 'text' && value.charAt(0) === COLON ) { queue = prev.value.slice(-6); if ( queue === 'mailto' || queue.slice(-5) === 'https' || queue.slice(-4) === 'http' ) { if (commonmark) { escaped.unshift(BACKSLASH); } else { escaped.splice(0, 1, ENTITY_COLON); } } } /* * Escape ampersand if it would otherwise * start an entity. */ if ( next && next.type === 'text' && value.slice(-1) === AMPERSAND && startsWithEntity(AMPERSAND + next.value) ) { if (commonmark) { escaped.splice(escaped.length - 1, 0, BACKSLASH); } else { escaped.push('amp', SEMICOLON); } } /* * Escape double tildes in GFM. */ if ( gfm && next && next.type === 'text' && value.slice(-1) === TILDE && next.value.charAt(0) === TILDE ) { escaped.splice(escaped.length - 1, 0, BACKSLASH); } } return escaped.join(EMPTY); }; } /** * Wrap `url` in angle brackets when needed, or when * forced. * * In links, images, and definitions, the URL part needs * to be enclosed when it: * * - has a length of `0`; * - contains white-space; * - has more or less opening than closing parentheses. * * @example * encloseURI('foo bar') // '' * encloseURI('foo(bar(baz)') // '' * encloseURI('') // '<>' * encloseURI('example.com') // 'example.com' * encloseURI('example.com', true) // '' * * @param {string} uri - URI to enclose. * @param {boolean?} [always] - Force enclosing. * @return {boolean} - Properly enclosed `uri`. */ function encloseURI(uri, always) { if ( always || !uri.length || EXPRESSIONS_WHITE_SPACE.test(uri) || ccount(uri, PARENTHESIS_OPEN) !== ccount(uri, PARENTHESIS_CLOSE) ) { return ANGLE_BRACKET_OPEN + uri + ANGLE_BRACKET_CLOSE; } return uri; } /** * There is currently no way to support nested delimiters * across Markdown.pl, CommonMark, and GitHub (RedCarpet). * The following code supports Markdown.pl and GitHub. * CommonMark is not supported when mixing double- and * single quotes inside a title. * * @see https://github.com/vmg/redcarpet/issues/473 * @see https://github.com/jgm/CommonMark/issues/308 * * @example * encloseTitle('foo') // '"foo"' * encloseTitle('foo \'bar\' baz') // '"foo \'bar\' baz"' * encloseTitle('foo "bar" baz') // '\'foo "bar" baz\'' * encloseTitle('foo "bar" \'baz\'') // '"foo "bar" \'baz\'"' * * @param {string} title - Content. * @return {string} - Properly enclosed title. */ function encloseTitle(title) { var delimiter = QUOTE_DOUBLE; if (title.indexOf(delimiter) !== -1) { delimiter = QUOTE_SINGLE; } return delimiter + title + delimiter; } /** * Pad `value` with `level * INDENT` spaces. Respects * lines. Ignores empty lines. * * @example * pad('foo', 1) // ' foo' * * @param {string} value - Content. * @param {number} level - Indentation level. * @return {string} - Padded `value`. */ function pad(value, level) { var index; var padding; value = value.split(LINE); index = value.length; padding = repeat(SPACE, level * INDENT); while (index--) { if (value[index].length !== 0) { value[index] = padding + value[index]; } } return value.join(LINE); } /** * Construct a new compiler. * * @example * var compiler = new Compiler(new File('> foo.')); * * @constructor * @class {Compiler} * @param {File} file - Virtual file. * @param {Object?} [options] - Passed to * `Compiler#setOptions()`. */ function Compiler(file, options) { var self = this; self.file = file; self.options = extend({}, self.options); self.setOptions(options); } /* * Cache prototype. */ var compilerPrototype = Compiler.prototype; /* * Expose defaults. */ compilerPrototype.options = defaultOptions; /* * Map of applicable enum's. */ var maps = { 'entities': ENTITY_OPTIONS, 'bullet': LIST_BULLETS, 'rule': HORIZONTAL_RULE_BULLETS, 'listItemIndent': LIST_ITEM_INDENTS, 'emphasis': EMPHASIS_MARKERS, 'strong': EMPHASIS_MARKERS, 'fence': FENCE_MARKERS }; /** * Set options. Does not overwrite previously set * options. * * @example * var compiler = new Compiler(); * compiler.setOptions({bullet: '*'}); * * @this {Compiler} * @throws {Error} - When an option is invalid. * @param {Object?} [options] - Stringify settings. * @return {Compiler} - `self`. */ compilerPrototype.setOptions = function (options) { var self = this; var current = self.options; var ruleRepetition; var key; if (options === null || options === undefined) { options = {}; } else if (typeof options === 'object') { options = extend({}, options); } else { raise(options, 'options'); } for (key in defaultOptions) { validate[typeof current[key]]( options, key, current[key], maps[key] ); } ruleRepetition = options.ruleRepetition; if (ruleRepetition && ruleRepetition < MINIMUM_RULE_LENGTH) { raise(ruleRepetition, 'options.ruleRepetition'); } self.encode = encodeFactory(String(options.entities)); self.escape = escapeFactory(options); self.options = options; return self; }; /* * Enter and exit helpers. */ compilerPrototype.enterLink = stateToggler('inLink', false); compilerPrototype.enterTable = stateToggler('inTable', false); /** * Shortcut and collapsed link references need no escaping * and encoding during the processing of child nodes (it * must be implied from identifier). * * This toggler turns encoding and escaping off for shortcut * and collapsed references. * * Implies `enterLink`. * * @param {Compiler} compiler - Compiler instance. * @param {LinkReference} node - LinkReference node. * @return {Function} - Exit state. */ compilerPrototype.enterLinkReference = function (compiler, node) { var encode = compiler.encode; var escape = compiler.escape; var exitLink = compiler.enterLink(); if ( node.referenceType === 'shortcut' || node.referenceType === 'collapsed' ) { compiler.encode = compiler.escape = encodeNoop; return function () { compiler.encode = encode; compiler.escape = escape; exitLink(); }; } else { return exitLink; } }; /** * Visit a node. * * @example * var compiler = new Compiler(); * * compiler.visit({ * type: 'strong', * children: [{ * type: 'text', * value: 'Foo' * }] * }); * // '**Foo**' * * @param {Object} node - Node. * @param {Object?} [parent] - `node`s parent. * @return {string} - Compiled `node`. */ compilerPrototype.visit = function (node, parent) { var self = this; /* * Fail on unknown nodes. */ if (typeof self[node.type] !== 'function') { self.file.fail( 'Missing compiler for node of type `' + node.type + '`: `' + node + '`', node ); } return self[node.type](node, parent); }; /** * Visit all children of `parent`. * * @example * var compiler = new Compiler(); * * compiler.all({ * type: 'strong', * children: [{ * type: 'text', * value: 'Foo' * }, * { * type: 'text', * value: 'Bar' * }] * }); * // ['Foo', 'Bar'] * * @param {Object} parent - Parent node of children. * @return {Array.} - List of compiled children. */ compilerPrototype.all = function (parent) { var self = this; var children = parent.children; var values = []; var index = 0; var length = children.length; var node = children[0]; var next; if (length === 0) { return values; } while (++index < length) { next = children[index]; if ( node.type === next.type && node.type in MERGEABLE_NODES && mergeable(node) && mergeable(next) ) { node = MERGEABLE_NODES[node.type].call(self, node, next); } else { values.push(self.visit(node, parent)); node = next; } } values.push(self.visit(node, parent)); return values; }; /** * Visit ordered list items. * * Starts the list with * `node.start` and increments each following list item * bullet by one: * * 2. foo * 3. bar * * In `incrementListMarker: false` mode, does not increment * each marker and stays on `node.start`: * * 1. foo * 1. bar * * Adds an extra line after an item if it has * `loose: true`. * * @example * var compiler = new Compiler(); * * compiler.visitOrderedItems({ * type: 'list', * ordered: true, * children: [{ * type: 'listItem', * children: [{ * type: 'text', * value: 'bar' * }] * }] * }); * // '1. bar' * * @param {Object} node - `list` node with * `ordered: true`. * @return {string} - Markdown list. */ compilerPrototype.visitOrderedItems = function (node) { var self = this; var increment = self.options.incrementListMarker; var values = []; var start = node.start; var children = node.children; var length = children.length; var index = -1; var bullet; while (++index < length) { bullet = (increment ? start + index : start) + DOT; values[index] = self.listItem(children[index], node, index, bullet); } return values.join(LINE); }; /** * Visit unordered list items. * * Uses `options.bullet` as each item's bullet. * * Adds an extra line after an item if it has * `loose: true`. * * @example * var compiler = new Compiler(); * * compiler.visitUnorderedItems({ * type: 'list', * ordered: false, * children: [{ * type: 'listItem', * children: [{ * type: 'text', * value: 'bar' * }] * }] * }); * // '- bar' * * @param {Object} node - `list` node with * `ordered: false`. * @return {string} - Markdown list. */ compilerPrototype.visitUnorderedItems = function (node) { var self = this; var values = []; var children = node.children; var length = children.length; var index = -1; var bullet = self.options.bullet; while (++index < length) { values[index] = self.listItem(children[index], node, index, bullet); } return values.join(LINE); }; /** * Stringify a block node with block children (e.g., `root` * or `blockquote`). * * Knows about code following a list, or adjacent lists * with similar bullets, and places an extra newline * between them. * * @example * var compiler = new Compiler(); * * compiler.block({ * type: 'root', * children: [{ * type: 'paragraph', * children: [{ * type: 'text', * value: 'bar' * }] * }] * }); * // 'bar' * * @param {Object} node - `root` node. * @return {string} - Markdown block content. */ compilerPrototype.block = function (node) { var self = this; var values = []; var children = node.children; var length = children.length; var index = -1; var child; var prev; while (++index < length) { child = children[index]; if (prev) { /* * Duplicate nodes, such as a list * directly following another list, * often need multiple new lines. * * Additionally, code blocks following a list * might easily be mistaken for a paragraph * in the list itself. */ if (child.type === prev.type && prev.type === 'list') { values.push(prev.ordered === child.ordered ? GAP : BREAK); } else if ( prev.type === 'list' && child.type === 'code' && !child.lang ) { values.push(GAP); } else { values.push(BREAK); } } values.push(self.visit(child, node)); prev = child; } return values.join(EMPTY); }; /** * Stringify a root. * * Adds a final newline to ensure valid POSIX files. * * @example * var compiler = new Compiler(); * * compiler.root({ * type: 'root', * children: [{ * type: 'paragraph', * children: [{ * type: 'text', * value: 'bar' * }] * }] * }); * // 'bar' * * @param {Object} node - `root` node. * @return {string} - Markdown document. */ compilerPrototype.root = function (node) { return this.block(node) + LINE; }; /** * Stringify a heading. * * In `setext: true` mode and when `depth` is smaller than * three, creates a setext header: * * Foo * === * * Otherwise, an ATX header is generated: * * ### Foo * * In `closeAtx: true` mode, the header is closed with * hashes: * * ### Foo ### * * @example * var compiler = new Compiler(); * * compiler.heading({ * type: 'heading', * depth: 2, * children: [{ * type: 'strong', * children: [{ * type: 'text', * value: 'bar' * }] * }] * }); * // '## **bar**' * * @param {Object} node - `heading` node. * @return {string} - Markdown heading. */ compilerPrototype.heading = function (node) { var self = this; var setext = self.options.setext; var closeAtx = self.options.closeAtx; var depth = node.depth; var content = self.all(node).join(EMPTY); var prefix; if (setext && depth < 3) { return content + LINE + repeat(depth === 1 ? EQUALS : DASH, content.length); } prefix = repeat(HASH, node.depth); content = prefix + SPACE + content; if (closeAtx) { content += SPACE + prefix; } return content; }; /** * Stringify text. * * Supports named entities in `settings.encode: true` mode: * * AT&T * * Supports numbered entities in `settings.encode: numbers` * mode: * * AT&T * * @example * var compiler = new Compiler(); * * compiler.text({ * type: 'text', * value: 'foo' * }); * // 'foo' * * @param {Object} node - `text` node. * @param {Object} parent - Parent of `node`. * @return {string} - Raw markdown text. */ compilerPrototype.text = function (node, parent) { return this.encode(this.escape(node.value, node, parent), node); }; /** * Stringify a paragraph. * * @example * var compiler = new Compiler(); * * compiler.paragraph({ * type: 'paragraph', * children: [{ * type: 'strong', * children: [{ * type: 'text', * value: 'bar' * }] * }] * }); * // '**bar**' * * @param {Object} node - `paragraph` node. * @return {string} - Markdown paragraph. */ compilerPrototype.paragraph = function (node) { return this.all(node).join(EMPTY); }; /** * Stringify a block quote. * * @example * var compiler = new Compiler(); * * compiler.paragraph({ * type: 'blockquote', * children: [{ * type: 'paragraph', * children: [{ * type: 'strong', * children: [{ * type: 'text', * value: 'bar' * }] * }] * }] * }); * // '> **bar**' * * @param {Object} node - `blockquote` node. * @return {string} - Markdown block quote. */ compilerPrototype.blockquote = function (node) { var values = this.block(node).split(LINE); var result = []; var length = values.length; var index = -1; var value; while (++index < length) { value = values[index]; result[index] = (value ? SPACE : EMPTY) + value; } return ANGLE_BRACKET_CLOSE + result.join(LINE + ANGLE_BRACKET_CLOSE); }; /** * Stringify a list. See `Compiler#visitOrderedList()` and * `Compiler#visitUnorderedList()` for internal working. * * @example * var compiler = new Compiler(); * * compiler.visitUnorderedItems({ * type: 'list', * ordered: false, * children: [{ * type: 'listItem', * children: [{ * type: 'text', * value: 'bar' * }] * }] * }); * // '- bar' * * @param {Object} node - `list` node. * @return {string} - Markdown list. */ compilerPrototype.list = function (node) { return this[ORDERED_MAP[node.ordered]](node); }; /** * Stringify a list item. * * Prefixes the content with a checked checkbox when * `checked: true`: * * [x] foo * * Prefixes the content with an unchecked checkbox when * `checked: false`: * * [ ] foo * * @example * var compiler = new Compiler(); * * compiler.listItem({ * type: 'listItem', * checked: true, * children: [{ * type: 'text', * value: 'bar' * }] * }, { * type: 'list', * ordered: false, * children: [{ * type: 'listItem', * checked: true, * children: [{ * type: 'text', * value: 'bar' * }] * }] * }, 0, '*'); * '- [x] bar' * * @param {Object} node - `listItem` node. * @param {Object} parent - `list` node. * @param {number} position - Index of `node` in `parent`. * @param {string} bullet - Bullet to use. This, and the * `listItemIndent` setting define the used indent. * @return {string} - Markdown list item. */ compilerPrototype.listItem = function (node, parent, position, bullet) { var self = this; var style = self.options.listItemIndent; var children = node.children; var values = []; var index = -1; var length = children.length; var loose = node.loose; var value; var indent; var spacing; while (++index < length) { values[index] = self.visit(children[index], node); } value = CHECKBOX_MAP[node.checked] + values.join(loose ? BREAK : LINE); if ( style === LIST_ITEM_ONE || (style === LIST_ITEM_MIXED && value.indexOf(LINE) === -1) ) { indent = bullet.length + 1; spacing = SPACE; } else { indent = Math.ceil((bullet.length + 1) / INDENT) * INDENT; spacing = repeat(SPACE, indent - bullet.length); } value = bullet + spacing + pad(value, indent / INDENT).slice(indent); if (loose && parent.children.length - 1 !== position) { value += LINE; } return value; }; /** * Stringify inline code. * * Knows about internal ticks (`\``), and ensures one more * tick is used to enclose the inline code: * * ```foo ``bar`` baz``` * * Even knows about inital and final ticks: * * `` `foo `` * `` foo` `` * * @example * var compiler = new Compiler(); * * compiler.inlineCode({ * type: 'inlineCode', * value: 'foo(); `bar`; baz()' * }); * // '``foo(); `bar`; baz()``' * * @param {Object} node - `inlineCode` node. * @return {string} - Markdown inline code. */ compilerPrototype.inlineCode = function (node) { var value = node.value; var ticks = repeat(TICK, longestStreak(value, TICK) + 1); var start = ticks; var end = ticks; if (value.charAt(0) === TICK) { start += SPACE; } if (value.charAt(value.length - 1) === TICK) { end = SPACE + end; } return start + node.value + end; }; /** * Stringify YAML front matter. * * @example * var compiler = new Compiler(); * * compiler.yaml({ * type: 'yaml', * value: 'foo: bar' * }); * // '---\nfoo: bar\n---' * * @param {Object} node - `yaml` node. * @return {string} - Markdown YAML document. */ compilerPrototype.yaml = function (node) { var delimiter = repeat(DASH, YAML_FENCE_LENGTH); var value = node.value ? LINE + node.value : EMPTY; return delimiter + value + LINE + delimiter; }; /** * Stringify a code block. * * Creates indented code when: * * - No language tag exists; * - Not in `fences: true` mode; * - A non-empty value exists. * * Otherwise, GFM fenced code is created: * * ```js * foo(); * ``` * * When in ``fence: `~` `` mode, uses tildes as fences: * * ~~~js * foo(); * ~~~ * * Knows about internal fences (Note: GitHub/Kramdown does * not support this): * * ````javascript * ```markdown * foo * ``` * ```` * * Supports named entities in the language flag with * `settings.encode` mode. * * @example * var compiler = new Compiler(); * * compiler.code({ * type: 'code', * lang: 'js', * value: 'fooo();' * }); * // '```js\nfooo();\n```' * * @param {Object} node - `code` node. * @param {Object} parent - Parent of `node`. * @return {string} - Markdown code block. */ compilerPrototype.code = function (node, parent) { var self = this; var value = node.value; var options = self.options; var marker = options.fence; var language = self.encode(node.lang || EMPTY, node); var fence; /* * Without (needed) fences. */ if (!language && !options.fences && value) { /* * Throw when pedantic, in a list item which * isn’t compiled using a tab. */ if ( parent && parent.type === 'listItem' && options.listItemIndent !== LIST_ITEM_TAB && options.pedantic ) { self.file.fail(ERROR_LIST_ITEM_INDENT, node.position); } return pad(value, 1); } fence = longestStreak(value, marker) + 1; /* * Fix GFM / RedCarpet bug, where fence-like characters * inside fenced code can exit a code-block. * Yes, even when the outer fence uses different * characters, or is longer. * Thus, we can only pad the code to make it work. */ if (FENCE.test(value)) { value = pad(value, 1); } fence = repeat(marker, Math.max(fence, MINIMUM_CODE_FENCE_LENGTH)); return fence + language + LINE + value + LINE + fence; }; /** * Stringify HTML. * * @example * var compiler = new Compiler(); * * compiler.html({ * type: 'html', * value: '
    bar
    ' * }); * // '
    bar
    ' * * @param {Object} node - `html` node. * @return {string} - Markdown HTML. */ compilerPrototype.html = function (node) { return node.value; }; /** * Stringify a horizontal rule. * * The character used is configurable by `rule`: (`'_'`) * * ___ * * The number of repititions is defined through * `ruleRepetition`: (`6`) * * ****** * * Whether spaces delimit each character, is configured * through `ruleSpaces`: (`true`) * * * * * * * @example * var compiler = new Compiler(); * * compiler.horizontalRule({ * type: 'horizontalRule' * }); * // '***' * * @return {string} - Markdown rule. */ compilerPrototype.horizontalRule = function () { var options = this.options; var rule = repeat(options.rule, options.ruleRepetition); if (options.ruleSpaces) { rule = rule.split(EMPTY).join(SPACE); } return rule; }; /** * Stringify a strong. * * The marker used is configurable by `strong`, which * defaults to an asterisk (`'*'`) but also accepts an * underscore (`'_'`): * * _foo_ * * @example * var compiler = new Compiler(); * * compiler.strong({ * type: 'strong', * children: [{ * type: 'text', * value: 'Foo' * }] * }); * // '**Foo**' * * @param {Object} node - `strong` node. * @return {string} - Markdown strong-emphasised text. */ compilerPrototype.strong = function (node) { var marker = this.options.strong; marker = marker + marker; return marker + this.all(node).join(EMPTY) + marker; }; /** * Stringify an emphasis. * * The marker used is configurable by `emphasis`, which * defaults to an underscore (`'_'`) but also accepts an * asterisk (`'*'`): * * *foo* * * @example * var compiler = new Compiler(); * * compiler.emphasis({ * type: 'emphasis', * children: [{ * type: 'text', * value: 'Foo' * }] * }); * // '_Foo_' * * @param {Object} node - `emphasis` node. * @return {string} - Markdown emphasised text. */ compilerPrototype.emphasis = function (node) { var marker = this.options.emphasis; return marker + this.all(node).join(EMPTY) + marker; }; /** * Stringify a hard break. * * In Commonmark mode, trailing backslash form is used in order * to preserve trailing whitespace that the line may end with, * and also for better visibility. * * @example * var compiler = new Compiler(); * * compiler.break({ * type: 'break' * }); * // ' \n' * * @return {string} - Hard markdown break. */ compilerPrototype.break = function () { return this.options.commonmark ? BACKSLASH + LINE : SPACE + SPACE + LINE; }; /** * Stringify a delete. * * @example * var compiler = new Compiler(); * * compiler.delete({ * type: 'delete', * children: [{ * type: 'text', * value: 'Foo' * }] * }); * // '~~Foo~~' * * @param {Object} node - `delete` node. * @return {string} - Markdown strike-through. */ compilerPrototype.delete = function (node) { return DOUBLE_TILDE + this.all(node).join(EMPTY) + DOUBLE_TILDE; }; /** * Stringify a link. * * When no title exists, the compiled `children` equal * `href`, and `href` starts with a protocol, an auto * link is created: * * * * Otherwise, is smart about enclosing `href` (see * `encloseURI()`) and `title` (see `encloseTitle()`). * * [foo]( 'An "example" e-mail') * * Supports named entities in the `href` and `title` when * in `settings.encode` mode. * * @example * var compiler = new Compiler(); * * compiler.link({ * type: 'link', * href: 'http://example.com', * title: 'Example Domain', * children: [{ * type: 'text', * value: 'Foo' * }] * }); * // '[Foo](http://example.com "Example Domain")' * * @param {Object} node - `link` node. * @return {string} - Markdown link. */ compilerPrototype.link = function (node) { var self = this; var url = self.encode(node.href, node); var exit = self.enterLink(); var escapedURL = self.encode(self.escape(node.href, node)); var value = self.all(node).join(EMPTY); exit(); if ( node.title === null && PROTOCOL.test(url) && (escapedURL === value || escapedURL === MAILTO + value) ) { /* * Backslash escapes do not work in autolinks, * so we do not escape. */ return encloseURI(self.encode(node.href), true); } url = encloseURI(url); if (node.title) { url += SPACE + encloseTitle(self.encode(self.escape( node.title, node ), node)); } value = SQUARE_BRACKET_OPEN + value + SQUARE_BRACKET_CLOSE; value += PARENTHESIS_OPEN + url + PARENTHESIS_CLOSE; return value; }; /** * Stringify a link label. * * Because link references are easily, mistakingly, * created (for example, `[foo]`), reference nodes have * an extra property depicting how it looked in the * original document, so stringification can cause minimal * changes. * * @example * label({ * type: 'referenceImage', * referenceType: 'full', * identifier: 'foo' * }); * // '[foo]' * * label({ * type: 'referenceImage', * referenceType: 'collapsed', * identifier: 'foo' * }); * // '[]' * * label({ * type: 'referenceImage', * referenceType: 'shortcut', * identifier: 'foo' * }); * // '' * * @param {Object} node - `linkReference` or * `imageReference` node. * @return {string} - Markdown label reference. */ function label(node) { var value = EMPTY; var type = node.referenceType; if (type === 'full') { value = node.identifier; } if (type !== 'shortcut') { value = SQUARE_BRACKET_OPEN + value + SQUARE_BRACKET_CLOSE; } return value; } /** * For shortcut and collapsed reference links, the contents * is also an identifier, so we need to restore the original * encoding and escaping that were present in the source * string. * * This function takes the unescaped & unencoded value from * shortcut's child nodes and the identifier and encodes * the former according to the latter. * * @example * copyIdentifierEncoding('a*b', 'a\\*b*c') * // 'a\\*b*c' * * @param {string} value - Unescaped and unencoded stringified * link value. * @param {string} identifier - Link identifier. * @return {string} - Encoded link value. */ function copyIdentifierEncoding(value, identifier) { var index = 0; var position = 0; var length = value.length; var count = identifier.length; var result = []; var start; while (index < length) { /* * Take next non-punctuation characters from `value`. */ start = index; while ( index < length && !PUNCTUATION.test(value.charAt(index)) ) { index += 1; } result.push(value.slice(start, index)); /* * Advance `position` to the next punctuation character. */ while ( position < count && !PUNCTUATION.test(identifier.charAt(position)) ) { position += 1; } /* * Take next punctuation characters from `identifier`. */ start = position; while ( position < count && PUNCTUATION.test(identifier.charAt(position)) ) { if (identifier.charAt(position) === AMPERSAND) { position += entityPrefixLength(identifier.slice(position)); } position += 1; } result.push(identifier.slice(start, position)); /* * Advance `index` to the next non-punctuation character. */ while (index < length && PUNCTUATION.test(value.charAt(index))) { index += 1; } } return result.join(EMPTY); } /** * Stringify a link reference. * * See `label()` on how reference labels are created. * * @example * var compiler = new Compiler(); * * compiler.linkReference({ * type: 'linkReference', * referenceType: 'collapsed', * identifier: 'foo', * children: [{ * type: 'text', * value: 'Foo' * }] * }); * // '[Foo][]' * * @param {Object} node - `linkReference` node. * @return {string} - Markdown link reference. */ compilerPrototype.linkReference = function (node) { var self = this; var exitLinkReference = self.enterLinkReference(self, node); var value = self.all(node).join(EMPTY); exitLinkReference(); if ( node.referenceType === 'shortcut' || node.referenceType === 'collapsed' ) { value = copyIdentifierEncoding(value, node.identifier); } return SQUARE_BRACKET_OPEN + value + SQUARE_BRACKET_CLOSE + label(node); }; /** * Stringify an image reference. * * See `label()` on how reference labels are created. * * Supports named entities in the `alt` when * in `settings.encode` mode. * * @example * var compiler = new Compiler(); * * compiler.imageReference({ * type: 'imageReference', * referenceType: 'full', * identifier: 'foo', * alt: 'Foo' * }); * // '![Foo][foo]' * * @param {Object} node - `imageReference` node. * @return {string} - Markdown image reference. */ compilerPrototype.imageReference = function (node) { var alt = this.encode(node.alt, node) || EMPTY; return EXCLAMATION_MARK + SQUARE_BRACKET_OPEN + alt + SQUARE_BRACKET_CLOSE + label(node); }; /** * Stringify a footnote reference. * * @example * var compiler = new Compiler(); * * compiler.footnoteReference({ * type: 'footnoteReference', * identifier: 'foo' * }); * // '[^foo]' * * @param {Object} node - `footnoteReference` node. * @return {string} - Markdown footnote reference. */ compilerPrototype.footnoteReference = function (node) { return SQUARE_BRACKET_OPEN + CARET + node.identifier + SQUARE_BRACKET_CLOSE; }; /** * Stringify an link- or image definition. * * Is smart about enclosing `href` (see `encloseURI()`) and * `title` (see `encloseTitle()`). * * [foo]: 'An "example" e-mail' * * @example * var compiler = new Compiler(); * * compiler.definition({ * type: 'definition', * link: 'http://example.com', * title: 'Example Domain', * identifier: 'foo' * }); * // '[foo]: http://example.com "Example Domain"' * * @param {Object} node - `definition` node. * @return {string} - Markdown link- or image definition. */ compilerPrototype.definition = function (node) { var value = SQUARE_BRACKET_OPEN + node.identifier + SQUARE_BRACKET_CLOSE; var url = encloseURI(node.link); if (node.title) { url += SPACE + encloseTitle(node.title); } return value + COLON + SPACE + url; }; /** * Stringify an image. * * Is smart about enclosing `href` (see `encloseURI()`) and * `title` (see `encloseTitle()`). * * ![foo]( 'My "favourite" icon') * * Supports named entities in `src`, `alt`, and `title` * when in `settings.encode` mode. * * @example * var compiler = new Compiler(); * * compiler.image({ * type: 'image', * href: 'http://example.png/favicon.png', * title: 'Example Icon', * alt: 'Foo' * }); * // '![Foo](http://example.png/favicon.png "Example Icon")' * * @param {Object} node - `image` node. * @return {string} - Markdown image. */ compilerPrototype.image = function (node) { var url = encloseURI(this.encode(node.src, node)); var value; if (node.title) { url += SPACE + encloseTitle(this.encode(node.title, node)); } value = EXCLAMATION_MARK + SQUARE_BRACKET_OPEN + this.encode(node.alt || EMPTY, node) + SQUARE_BRACKET_CLOSE; value += PARENTHESIS_OPEN + url + PARENTHESIS_CLOSE; return value; }; /** * Stringify a footnote. * * @example * var compiler = new Compiler(); * * compiler.footnote({ * type: 'footnote', * children: [{ * type: 'text', * value: 'Foo' * }] * }); * // '[^Foo]' * * @param {Object} node - `footnote` node. * @return {string} - Markdown footnote. */ compilerPrototype.footnote = function (node) { return SQUARE_BRACKET_OPEN + CARET + this.all(node).join(EMPTY) + SQUARE_BRACKET_CLOSE; }; /** * Stringify a footnote definition. * * @example * var compiler = new Compiler(); * * compiler.footnoteDefinition({ * type: 'footnoteDefinition', * identifier: 'foo', * children: [{ * type: 'paragraph', * children: [{ * type: 'text', * value: 'bar' * }] * }] * }); * // '[^foo]: bar' * * @param {Object} node - `footnoteDefinition` node. * @return {string} - Markdown footnote definition. */ compilerPrototype.footnoteDefinition = function (node) { var id = node.identifier.toLowerCase(); return SQUARE_BRACKET_OPEN + CARET + id + SQUARE_BRACKET_CLOSE + COLON + SPACE + this.all(node).join(BREAK + repeat(SPACE, INDENT)); }; /** * Stringify table. * * Creates a fenced table by default, but not in * `looseTable: true` mode: * * Foo | Bar * :-: | --- * Baz | Qux * * NOTE: Be careful with `looseTable: true` mode, as a * loose table inside an indented code block on GitHub * renders as an actual table! * * Creates a spaces table by default, but not in * `spacedTable: false`: * * |Foo|Bar| * |:-:|---| * |Baz|Qux| * * @example * var compiler = new Compiler(); * * compiler.table({ * type: 'table', * align: ['center', null], * children: [ * { * type: 'tableHeader', * children: [ * { * type: 'tableCell' * children: [{ * type: 'text' * value: 'Foo' * }] * }, * { * type: 'tableCell' * children: [{ * type: 'text' * value: 'Bar' * }] * } * ] * }, * { * type: 'tableRow', * children: [ * { * type: 'tableCell' * children: [{ * type: 'text' * value: 'Baz' * }] * }, * { * type: 'tableCell' * children: [{ * type: 'text' * value: 'Qux' * }] * } * ] * } * ] * }); * // '| Foo | Bar |\n| :-: | --- |\n| Baz | Qux |' * * @param {Object} node - `table` node. * @return {string} - Markdown table. */ compilerPrototype.table = function (node) { var self = this; var loose = self.options.looseTable; var spaced = self.options.spacedTable; var rows = node.children; var index = rows.length; var exit = self.enterTable(); var result = []; var start; while (index--) { result[index] = self.all(rows[index]); } exit(); start = loose ? EMPTY : spaced ? PIPE + SPACE : PIPE; return table(result, { 'align': node.align, 'start': start, 'end': start.split(EMPTY).reverse().join(EMPTY), 'delimiter': spaced ? SPACE + PIPE + SPACE : PIPE }); }; /** * Stringify a table cell. * * @example * var compiler = new Compiler(); * * compiler.tableCell({ * type: 'tableCell', * children: [{ * type: 'text' * value: 'Qux' * }] * }); * // 'Qux' * * @param {Object} node - `tableCell` node. * @return {string} - Markdown table cell. */ compilerPrototype.tableCell = function (node) { return this.all(node).join(EMPTY); }; /** * Stringify the bound file. * * @example * var file = new VFile('__Foo__'); * * file.namespace('mdast').tree = { * type: 'strong', * children: [{ * type: 'text', * value: 'Foo' * }] * }); * * new Compiler(file).compile(); * // '**Foo**' * * @this {Compiler} * @return {string} - Markdown document. */ compilerPrototype.compile = function () { return this.visit(this.file.namespace('mdast').tree); }; /* * Expose `stringify` on `module.exports`. */ module.exports = Compiler; },{"./defaults.js":417,"./utilities.js":421,"ccount":69,"extend.js":147,"longest-streak":224,"markdown-table":240,"parse-entities":289,"repeat-string":422,"stringify-entities":617}],421:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015-2016 Titus Wormer * @license MIT * @module remark:utilities * @version 3.2.2 * @fileoverview Collection of tiny helpers useful for * both parsing and compiling markdown. */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var collapseWhiteSpace = require('collapse-white-space'); /* * Expressions. */ var EXPRESSION_LINE_BREAKS = /\r\n|\r/g; var EXPRESSION_SYMBOL_FOR_NEW_LINE = /\u2424/g; var EXPRESSION_BOM = /^\ufeff/; /** * Throw an exception with in its `message` `value` * and `name`. * * @param {*} value - Invalid value. * @param {string} name - Setting name. */ function raise(value, name) { throw new Error( 'Invalid value `' + value + '` ' + 'for setting `' + name + '`' ); } /** * Validate a value to be boolean. Defaults to `def`. * Raises an exception with `context[name]` when not * a boolean. * * @example * validateBoolean({foo: null}, 'foo', true) // true * validateBoolean({foo: false}, 'foo', true) // false * validateBoolean({foo: 'bar'}, 'foo', true) // Throws * * @throws {Error} - When a setting is neither omitted nor * a boolean. * @param {Object} context - Settings. * @param {string} name - Setting name. * @param {boolean} def - Default value. */ function validateBoolean(context, name, def) { var value = context[name]; if (value === null || value === undefined) { value = def; } if (typeof value !== 'boolean') { raise(value, 'options.' + name); } context[name] = value; } /** * Validate a value to be boolean. Defaults to `def`. * Raises an exception with `context[name]` when not * a boolean. * * @example * validateNumber({foo: null}, 'foo', 1) // 1 * validateNumber({foo: 2}, 'foo', 1) // 2 * validateNumber({foo: 'bar'}, 'foo', 1) // Throws * * @throws {Error} - When a setting is neither omitted nor * a number. * @param {Object} context - Settings. * @param {string} name - Setting name. * @param {number} def - Default value. */ function validateNumber(context, name, def) { var value = context[name]; if (value === null || value === undefined) { value = def; } if (typeof value !== 'number' || value !== value) { raise(value, 'options.' + name); } context[name] = value; } /** * Validate a value to be in `map`. Defaults to `def`. * Raises an exception with `context[name]` when not * not in `map`. * * @example * var map = {bar: true, baz: true}; * validateString({foo: null}, 'foo', 'bar', map) // 'bar' * validateString({foo: 'baz'}, 'foo', 'bar', map) // 'baz' * validateString({foo: true}, 'foo', 'bar', map) // Throws * * @throws {Error} - When a setting is neither omitted nor * in `map`. * @param {Object} context - Settings. * @param {string} name - Setting name. * @param {string} def - Default value. * @param {Object} map - Enum. */ function validateString(context, name, def, map) { var value = context[name]; if (value === null || value === undefined) { value = def; } if (!(value in map)) { raise(value, 'options.' + name); } context[name] = value; } /** * Clean a string in preperation of parsing. * * @example * clean('\ufefffoo'); // 'foo' * clean('foo\r\nbar'); // 'foo\nbar' * clean('foo\u2424bar'); // 'foo\nbar' * * @param {string} value - Content to clean. * @return {string} - Cleaned content. */ function clean(value) { return String(value) .replace(EXPRESSION_BOM, '') .replace(EXPRESSION_LINE_BREAKS, '\n') .replace(EXPRESSION_SYMBOL_FOR_NEW_LINE, '\n'); } /** * Normalize an identifier. Collapses multiple white space * characters into a single space, and removes casing. * * @example * normalizeIdentifier('FOO\t bar'); // 'foo bar' * * @param {string} value - Content to normalize. * @return {string} - Normalized content. */ function normalizeIdentifier(value) { return collapseWhiteSpace(value).toLowerCase(); } /** * Construct a state `toggler`: a function which inverses * `property` in context based on its current value. * The by `toggler` returned function restores that value. * * @example * var context = {}; * var key = 'foo'; * var val = true; * context[key] = val; * context.enter = stateToggler(key, val); * context[key]; // true * var exit = context.enter(); * context[key]; // false * var nested = context.enter(); * context[key]; // false * nested(); * context[key]; // false * exit(); * context[key]; // true * * @param {string} key - Property to toggle. * @param {boolean} state - It's default state. * @return {function(): function()} - Enter. */ function stateToggler(key, state) { /** * Construct a toggler for the bound `key`. * * @return {Function} - Exit state. */ function enter() { var self = this; var current = self[key]; self[key] = !state; /** * State canceler, cancels the state, if allowed. */ function exit() { self[key] = current; } return exit; } return enter; } /* * Define nodes of a type which can be merged. */ var MERGEABLE_NODES = {}; /** * Check whether a node is mergeable with adjacent nodes. * * @param {Object} node - Node to check. * @return {boolean} - Whether `node` is mergable. */ function mergeable(node) { var start; var end; if (node.type !== 'text' || !node.position) { return true; } start = node.position.start; end = node.position.end; /* * Only merge nodes which occupy the same size as their * `value`. */ return start.line !== end.line || end.column - start.column === node.value.length; } /** * Merge two text nodes: `node` into `prev`. * * @param {Object} prev - Preceding sibling. * @param {Object} node - Following sibling. * @return {Object} - `prev`. */ MERGEABLE_NODES.text = function (prev, node) { prev.value += node.value; return prev; }; /** * Merge two blockquotes: `node` into `prev`, unless in * CommonMark mode. * * @param {Object} prev - Preceding sibling. * @param {Object} node - Following sibling. * @return {Object} - `prev`, or `node` in CommonMark mode. */ MERGEABLE_NODES.blockquote = function (prev, node) { if (this.options.commonmark) { return node; } prev.children = prev.children.concat(node.children); return prev; }; /* * Expose `validate`. */ exports.validate = { 'boolean': validateBoolean, 'string': validateString, 'number': validateNumber }; /* * Expose. */ exports.normalizeIdentifier = normalizeIdentifier; exports.clean = clean; exports.raise = raise; exports.stateToggler = stateToggler; exports.mergeable = mergeable; exports.MERGEABLE_NODES = MERGEABLE_NODES; },{"collapse-white-space":84}],422:[function(require,module,exports){ /*! * repeat-string * * Copyright (c) 2014-2015, Jon Schlinkert. * Licensed under the MIT License. */ 'use strict'; /** * Results cache */ var res = ''; var cache; /** * Expose `repeat` */ module.exports = repeat; /** * Repeat the given `string` the specified `number` * of times. * * **Example:** * * ```js * var repeat = require('repeat-string'); * repeat('A', 5); * //=> AAAAA * ``` * * @param {String} `string` The string to repeat * @param {Number} `number` The number of times to repeat the string * @return {String} Repeated string * @api public */ function repeat(str, num) { if (typeof str !== 'string') { throw new TypeError('repeat-string expects a string.'); } // cover common, quick use cases if (num === 1) return str; if (num === 2) return str + str; var max = str.length * num; if (cache !== str || typeof cache === 'undefined') { cache = str; res = ''; } while (max > res.length && num > 0) { if (num & 1) { res += str; } num >>= 1; if (!num) break; str += str; } return res.substr(0, max); } },{}],423:[function(require,module,exports){ (function (process){ module.exports = rimraf rimraf.sync = rimrafSync var assert = require("assert") var path = require("path") var fs = require("fs") var glob = require("glob") var globOpts = { nosort: true, nocomment: true, nonegate: true, silent: true } // for EMFILE handling var timeout = 0 var isWindows = (process.platform === "win32") function defaults (options) { var methods = [ 'unlink', 'chmod', 'stat', 'lstat', 'rmdir', 'readdir' ] methods.forEach(function(m) { options[m] = options[m] || fs[m] m = m + 'Sync' options[m] = options[m] || fs[m] }) options.maxBusyTries = options.maxBusyTries || 3 options.emfileWait = options.emfileWait || 1000 options.disableGlob = options.disableGlob || false } function rimraf (p, options, cb) { if (typeof options === 'function') { cb = options options = {} } assert(p, 'rimraf: missing path') assert.equal(typeof p, 'string', 'rimraf: path should be a string') assert(options, 'rimraf: missing options') assert.equal(typeof options, 'object', 'rimraf: options should be object') assert.equal(typeof cb, 'function', 'rimraf: callback function required') defaults(options) var busyTries = 0 var errState = null var n = 0 if (options.disableGlob || !glob.hasMagic(p)) return afterGlob(null, [p]) fs.lstat(p, function (er, stat) { if (!er) return afterGlob(null, [p]) glob(p, globOpts, afterGlob) }) function next (er) { errState = errState || er if (--n === 0) cb(errState) } function afterGlob (er, results) { if (er) return cb(er) n = results.length if (n === 0) return cb() results.forEach(function (p) { rimraf_(p, options, function CB (er) { if (er) { if (isWindows && (er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && busyTries < options.maxBusyTries) { busyTries ++ var time = busyTries * 100 // try again, with the same exact callback as this one. return setTimeout(function () { rimraf_(p, options, CB) }, time) } // this one won't happen if graceful-fs is used. if (er.code === "EMFILE" && timeout < options.emfileWait) { return setTimeout(function () { rimraf_(p, options, CB) }, timeout ++) } // already gone if (er.code === "ENOENT") er = null } timeout = 0 next(er) }) }) } } // Two possible strategies. // 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR // 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR // // Both result in an extra syscall when you guess wrong. However, there // are likely far more normal files in the world than directories. This // is based on the assumption that a the average number of files per // directory is >= 1. // // If anyone ever complains about this, then I guess the strategy could // be made configurable somehow. But until then, YAGNI. function rimraf_ (p, options, cb) { assert(p) assert(options) assert(typeof cb === 'function') // sunos lets the root user unlink directories, which is... weird. // so we have to lstat here and make sure it's not a dir. options.lstat(p, function (er, st) { if (er && er.code === "ENOENT") return cb(null) if (st && st.isDirectory()) return rmdir(p, options, er, cb) options.unlink(p, function (er) { if (er) { if (er.code === "ENOENT") return cb(null) if (er.code === "EPERM") return (isWindows) ? fixWinEPERM(p, options, er, cb) : rmdir(p, options, er, cb) if (er.code === "EISDIR") return rmdir(p, options, er, cb) } return cb(er) }) }) } function fixWinEPERM (p, options, er, cb) { assert(p) assert(options) assert(typeof cb === 'function') if (er) assert(er instanceof Error) options.chmod(p, 666, function (er2) { if (er2) cb(er2.code === "ENOENT" ? null : er) else options.stat(p, function(er3, stats) { if (er3) cb(er3.code === "ENOENT" ? null : er) else if (stats.isDirectory()) rmdir(p, options, er, cb) else options.unlink(p, cb) }) }) } function fixWinEPERMSync (p, options, er) { assert(p) assert(options) if (er) assert(er instanceof Error) try { options.chmodSync(p, 666) } catch (er2) { if (er2.code === "ENOENT") return else throw er } try { var stats = options.statSync(p) } catch (er3) { if (er3.code === "ENOENT") return else throw er } if (stats.isDirectory()) rmdirSync(p, options, er) else options.unlinkSync(p) } function rmdir (p, options, originalEr, cb) { assert(p) assert(options) if (originalEr) assert(originalEr instanceof Error) assert(typeof cb === 'function') // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) // if we guessed wrong, and it's not a directory, then // raise the original error. options.rmdir(p, function (er) { if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) rmkids(p, options, cb) else if (er && er.code === "ENOTDIR") cb(originalEr) else cb(er) }) } function rmkids(p, options, cb) { assert(p) assert(options) assert(typeof cb === 'function') options.readdir(p, function (er, files) { if (er) return cb(er) var n = files.length if (n === 0) return options.rmdir(p, cb) var errState files.forEach(function (f) { rimraf(path.join(p, f), options, function (er) { if (errState) return if (er) return cb(errState = er) if (--n === 0) options.rmdir(p, cb) }) }) }) } // this looks simpler, and is strictly *faster*, but will // tie up the JavaScript thread and fail on excessively // deep directory trees. function rimrafSync (p, options) { options = options || {} defaults(options) assert(p, 'rimraf: missing path') assert.equal(typeof p, 'string', 'rimraf: path should be a string') assert(options, 'rimraf: missing options') assert.equal(typeof options, 'object', 'rimraf: options should be object') var results if (options.disableGlob || !glob.hasMagic(p)) { results = [p] } else { try { fs.lstatSync(p) results = [p] } catch (er) { results = glob.sync(p, globOpts) } } if (!results.length) return for (var i = 0; i < results.length; i++) { var p = results[i] try { var st = options.lstatSync(p) } catch (er) { if (er.code === "ENOENT") return } try { // sunos lets the root user unlink directories, which is... weird. if (st && st.isDirectory()) rmdirSync(p, options, null) else options.unlinkSync(p) } catch (er) { if (er.code === "ENOENT") return if (er.code === "EPERM") return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) if (er.code !== "EISDIR") throw er rmdirSync(p, options, er) } } } function rmdirSync (p, options, originalEr) { assert(p) assert(options) if (originalEr) assert(originalEr instanceof Error) try { options.rmdirSync(p) } catch (er) { if (er.code === "ENOENT") return if (er.code === "ENOTDIR") throw originalEr if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") rmkidsSync(p, options) } } function rmkidsSync (p, options) { assert(p) assert(options) options.readdirSync(p).forEach(function (f) { rimrafSync(path.join(p, f), options) }) options.rmdirSync(p, options) } }).call(this,require('_process')) },{"_process":295,"assert":15,"fs":58,"glob":151,"path":290}],424:[function(require,module,exports){ (function (Buffer){ /* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ /** @preserve (c) 2012 by Cédric Mesnil. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // constants table var zl = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 ] var zr = [ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 ] var sl = [ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ] var sr = [ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ] var hl = [0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E] var hr = [0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000] function bytesToWords (bytes) { var words = [] for (var i = 0, b = 0; i < bytes.length; i++, b += 8) { words[b >>> 5] |= bytes[i] << (24 - b % 32) } return words } function wordsToBytes (words) { var bytes = [] for (var b = 0; b < words.length * 32; b += 8) { bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF) } return bytes } function processBlock (H, M, offset) { // swap endian for (var i = 0; i < 16; i++) { var offset_i = offset + i var M_offset_i = M[offset_i] // Swap M[offset_i] = ( (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) ) } // Working variables var al, bl, cl, dl, el var ar, br, cr, dr, er ar = al = H[0] br = bl = H[1] cr = cl = H[2] dr = dl = H[3] er = el = H[4] // computation var t for (i = 0; i < 80; i += 1) { t = (al + M[offset + zl[i]]) | 0 if (i < 16) { t += f1(bl, cl, dl) + hl[0] } else if (i < 32) { t += f2(bl, cl, dl) + hl[1] } else if (i < 48) { t += f3(bl, cl, dl) + hl[2] } else if (i < 64) { t += f4(bl, cl, dl) + hl[3] } else {// if (i<80) { t += f5(bl, cl, dl) + hl[4] } t = t | 0 t = rotl(t, sl[i]) t = (t + el) | 0 al = el el = dl dl = rotl(cl, 10) cl = bl bl = t t = (ar + M[offset + zr[i]]) | 0 if (i < 16) { t += f5(br, cr, dr) + hr[0] } else if (i < 32) { t += f4(br, cr, dr) + hr[1] } else if (i < 48) { t += f3(br, cr, dr) + hr[2] } else if (i < 64) { t += f2(br, cr, dr) + hr[3] } else {// if (i<80) { t += f1(br, cr, dr) + hr[4] } t = t | 0 t = rotl(t, sr[i]) t = (t + er) | 0 ar = er er = dr dr = rotl(cr, 10) cr = br br = t } // intermediate hash value t = (H[1] + cl + dr) | 0 H[1] = (H[2] + dl + er) | 0 H[2] = (H[3] + el + ar) | 0 H[3] = (H[4] + al + br) | 0 H[4] = (H[0] + bl + cr) | 0 H[0] = t } function f1 (x, y, z) { return ((x) ^ (y) ^ (z)) } function f2 (x, y, z) { return (((x) & (y)) | ((~x) & (z))) } function f3 (x, y, z) { return (((x) | (~(y))) ^ (z)) } function f4 (x, y, z) { return (((x) & (z)) | ((y) & (~(z)))) } function f5 (x, y, z) { return ((x) ^ ((y) | (~(z)))) } function rotl (x, n) { return (x << n) | (x >>> (32 - n)) } function ripemd160 (message) { var H = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0] if (typeof message === 'string') { message = new Buffer(message, 'utf8') } var m = bytesToWords(message) var nBitsLeft = message.length * 8 var nBitsTotal = message.length * 8 // Add padding m[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32) m[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) ) for (var i = 0; i < m.length; i += 16) { processBlock(H, m, i) } // swap endian for (i = 0; i < 5; i++) { // shortcut var H_i = H[i] // Swap H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00) } var digestbytes = wordsToBytes(H) return new Buffer(digestbytes) } module.exports = ripemd160 }).call(this,require("buffer").Buffer) },{"buffer":61}],425:[function(require,module,exports){ (function (Buffer){ var SecretStack = require('secret-stack') var create = require('secure-scuttlebutt/create') var ssbKeys = require('ssb-keys') var path = require('path') var osenv = require('osenv') var mkdirp = require('mkdirp') var rimraf = require('rimraf') var mdm = require('mdmanifest') var cmdAliases = require('./lib/cli-cmd-aliases') var valid = require('./lib/validators') var apidocs = require('./lib/apidocs.js') function isString(s) { return 'string' === typeof s } // create SecretStack definition var manifest = mdm.manifest(apidocs._) manifest.usage = 'sync' var SSB = { manifest: manifest, permissions: { master: {allow: null, deny: null}, anonymous: {allow: ['createHistoryStream'], deny: null} }, init: function (api, opts) { // .temp: use a /tmp data directory // (useful for testing) if(opts.temp) { var name = isString(opts.temp) ? opts.temp : ''+Date.now() opts.path = path.join(osenv.tmpdir(), name) rimraf.sync(opts.path) } // load/create secure scuttlebutt data directory var dbPath = path.join(opts.path, 'db') mkdirp.sync(dbPath) if(!opts.keys) opts.keys = ssbKeys.generate('ed25519', opts.seed && new Buffer(opts.seed, 'base64')) if(!opts.path) throw new Error('opts.path *must* be provided, or use opts.temp=name to create a test instance') // main interface var ssb = create(path.join(opts.path, 'db'), null, opts.keys) var feed = ssb.createFeed(opts.keys) var _close = api.close var close = function (cb) { // override to close the SSB database ssb.close(function (err) { if (err) throw err _close(cb) }) } return { id : feed.id, keys : opts.keys, usage : valid.sync(usage, 'string?|boolean?'), close : valid.async(close), publish : valid.async(feed.add, 'string|msgContent'), add : valid.async(ssb.add, 'msg'), get : valid.async(ssb.get, 'msgId'), pre : ssb.pre, post : ssb.post, getPublicKey : ssb.getPublicKey, latest : ssb.latest, getLatest : valid.async(ssb.getLatest, 'feedId'), latestSequence : valid.async(ssb.latestSequence, 'feedId'), createFeed : ssb.createFeed, whoami : function () { return { id: feed.id } }, relatedMessages : valid.async(ssb.relatedMessages, 'relatedMessagesOpts'), query : ssb.query, createFeedStream : valid.source(ssb.createFeedStream, 'readStreamOpts?'), createHistoryStream : valid.source(ssb.createHistoryStream, ['createHistoryStreamOpts'], ['feedId', 'number?', 'boolean?']), createLogStream : valid.source(ssb.createLogStream, 'readStreamOpts?'), createUserStream : valid.source(ssb.createUserStream, 'createUserStreamOpts'), links : valid.source(ssb.links, 'linksOpts'), sublevel : ssb.sublevel, messagesByType : valid.source(ssb.messagesByType, 'string|messagesByTypeOpts'), createWriteStream : ssb.createWriteStream, // createLatestLookupStream : ssb.createLatestLookupStream, } } } // live help RPC method function usage (cmd) { var path = (cmd||'').split('.') if ((path[0] && apidocs[path[0]]) || (cmd && apidocs[cmd])) { // return usage for the plugin cmd = path.slice(1).join('.') return mdm.usage(apidocs[path[0]], cmd, { prefix: path[0] }) } if (!cmd) { // return usage for all docs return Object.keys(apidocs).map(function (name) { if (name == '_') return mdm.usage(apidocs[name], null, { nameWidth: 20 }) var text = mdm.usage(apidocs[name], null, { prefix: name, nameWidth: 20 }) return text.slice(text.indexOf('Commands:') + 10) // skip past the toplevel summary, straight to the cmd list }).join('\n\n') } // toplevel cmd usage cmd = cmdAliases[cmd] || cmd return mdm.usage(apidocs._, cmd) } module.exports = SecretStack({ appKey: require('./lib/ssb-cap') }) .use(SSB) }).call(this,require("buffer").Buffer) },{"./lib/apidocs.js":426,"./lib/cli-cmd-aliases":427,"./lib/ssb-cap":428,"./lib/validators":430,"buffer":61,"mdmanifest":241,"mkdirp":248,"osenv":282,"path":290,"rimraf":423,"secret-stack":463,"secure-scuttlebutt/create":472,"ssb-keys":530}],426:[function(require,module,exports){ (function (__dirname){ var fs = require('fs') var path = require('path') module.exports = { _: fs.readFileSync(path.join(__dirname, '../api.md'), 'utf-8'), blobs: fs.readFileSync(path.join(__dirname, '../plugins/blobs.md'), 'utf-8'), block: fs.readFileSync(path.join(__dirname, '../plugins/block.md'), 'utf-8'), friends: fs.readFileSync(path.join(__dirname, '../plugins/friends.md'), 'utf-8'), gossip: fs.readFileSync(path.join(__dirname, '../plugins/gossip.md'), 'utf-8'), invite: fs.readFileSync(path.join(__dirname, '../plugins/invite.md'), 'utf-8'), plugins: fs.readFileSync(path.join(__dirname, '../plugins/plugins.md'), 'utf-8'), 'private': fs.readFileSync(path.join(__dirname, '../plugins/private.md'), 'utf-8'), replicate: fs.readFileSync(path.join(__dirname, '../plugins/replicate.md'), 'utf-8') } }).call(this,"/node_modules/scuttlebot/lib") },{"fs":58,"path":290}],427:[function(require,module,exports){ module.exports = { feed: 'createFeedStream', history: 'createHistoryStream', hist: 'createHistoryStream', public: 'getPublicKey', pub: 'getPublicKey', log: 'createLogStream', logt: 'messagesByType', conf: 'config' } },{}],428:[function(require,module,exports){ (function (Buffer){ //this is the key for accessing the ssb protocol. //this will be updated whenever breaking changes are made. //(see secret-handshake paper for a full explaination) module.exports = new Buffer('1KHLiKZvAvjbY1ziZEHMXawbCEIM6qwjCDm3VYRan/s=', 'base64') //there is nothing special about this value. //I generated it in the node repl with: // // > crypto.randomBytes(32).toString('base64') // //and copied it here. }).call(this,require("buffer").Buffer) },{"buffer":61}],429:[function(require,module,exports){ var ref = require('ssb-ref') function isObject(o) { return o && 'object' === typeof o } var DEFAULT_PORT = 8008 var isArray = Array.isArray var isInteger = Number.isInteger function isString (s) { return 'string' === typeof s } var find = exports.find = function find(ary, test) { for(var i in ary) if(test(ary[i], i, ary)) return ary[i] } var clone = exports.clone = function clone (obj, mapper) { function map(v, k) { return isObject(v) ? clone(v, mapper) : mapper(v, k) } if(isArray(obj)) return obj.map(map) else if(isObject(obj)) { var o = {} for(var k in obj) o[k] = map(obj[k], k) return o } else return map(obj) } var mergeKeys = exports.mergeKeys = function (a, b, iter) { var o = {} for(var k in a) { if(!isUndefined(a[k])) o[k] = iter(v[k], b[k], k) } for(var k in b) { if(isUndefined(a[a])) o[k] = iter(undefined, b[k], k) } return o } exports.merge = function (a, b) { //merge a and b objects if(isArray(a) != isArray(b)) throw new Error('cannot merge array with non-array') if(isObject(a) != isObject(b)) throw new Error('cannot merge object with non-object') a = clone(a) var keys if(isObject(b)) { for(var k in b) a[k] = b } } exports.stringifyAddress = function (e) { if(isString(e)) return e return [e.host, e.port || DEFAULT_PORT, e.key].join(':') } exports.parseAddress = function (e) { if(isString(e)) { var parts = e.split(':') var id = parts.pop(), port = parts.pop(), host = parts.join(':') var e = { host: host, port: +(port || DEFAULT_PORT), key: id } return e } return e } exports.isAddress = function (addr) { return ( ref.isFeedId(addr.key || addr.link) && isInteger(addr.port) && typeof addr.host === 'string' && !!addr.host ) } exports.toAddress = function (e) { e = exports.parseAddress(e) e.port = e.port || DEFAULT_PORT e.host = e.host || 'localhost' return e } },{"ssb-ref":573}],430:[function(require,module,exports){ var valid = require('muxrpc-validation') var zerr = require('zerr') var ref = require('ssb-ref') // errors var MissingAttr = zerr('Usage', 'Param % must have a .% of type "%"') var AttrType = zerr('Usage', '.% of param % must be of type "%"') function isFilter (v) { return (v == '@' || v == '%' || v == '&') } module.exports = valid({ msgId: function (v) { if (!ref.isMsg(v)) return 'type' }, feedId: function (v) { if (!ref.isFeed(v)) return 'type' }, blobId: function (v) { if (!ref.isBlob(v)) return 'type' }, msgContent: function (v, n) { var err = this.get('object')(v, n) if (err) return err if (!v.type || typeof v.type != 'string') return MissingAttr(n, 'type', 'string') }, msg: function (v, n) { var err = this.get('object')(v, n) if (err) return err // .content var err = this.get('object')(v.content, n) if (err) return MissingAttr(n, 'content', 'object') // .content.type if (!v.content.type || typeof v.content.type != 'string') return MissingAttr(n, 'content.type', 'string') // .author if (!ref.isFeed(v.author)) return MissingAttr(n, 'author', 'feedId') // .sequence if (typeof v.sequence != 'number') return MissingAttr(n, 'sequence', 'number') // .previous if (v.sequence > 1 && !ref.isMsg(v.previous)) return MissingAttr(n, 'previous', 'msgId') else if(v.sequence == 1 && v.previous != null) return MissingAttr(n, 'previous', 'null') // .timestamp if (typeof v.timestamp != 'number') return MissingAttr(n, 'timestamp', 'number') // .hash if (v.hash != 'sha256') return zerr('Usage', 'Param % must have .hash set to "sha256"')(n) // .signature if (typeof v.signature != 'string') return MissingAttr(n, 'signature', 'string') }, readStreamOpts: function (v, n) { var err = this.get('object')(v, n) if (err) return err // .live if (v.live && typeof v.live != 'boolean' && typeof v.live != 'number') return AttrType(n, 'live', 'boolean') // .reverse if (v.reverse && typeof v.reverse != 'boolean' && typeof v.reverse != 'number') return AttrType(n, 'reverse', 'boolean') // .keys if (v.keys && typeof v.keys != 'boolean' && typeof v.keys != 'number') return AttrType(n, 'keys', 'boolean') // .values if (v.values && typeof v.values != 'boolean' && typeof v.values != 'number') return AttrType(n, 'values', 'boolean') // .limit if (v.limit && typeof v.limit != 'number') return AttrType(n, 'limit', 'number') // .fillCache if (v.fillCache && typeof v.fillCache != 'boolean' && typeof v.fillCache != 'number') return AttrType(n, 'fillCache', 'boolean') }, createHistoryStreamOpts: function (v, n) { // .id if (!ref.isFeed(v.id)) return MissingAttr(n, 'id', 'feedId') // .seq if (v.seq && typeof v.seq != 'number') return AttrType(n, 'seq', 'number') // .live if (v.live && typeof v.live != 'boolean' && typeof v.live != 'number') return AttrType(n, 'live', 'boolean') }, createUserStreamOpts: function (v, n) { var err = this.get('readStreamOpts')(v, n) if (err) return err // .id if (!ref.isFeed(v.id)) return MissingAttr(n, 'id', 'feedId') }, messagesByTypeOpts: function (v, n) { var err = this.get('readStreamOpts')(v, n) if (err) return err // .type if (typeof v.type != 'string') return MissingAttr(n, 'type', 'string') }, linksOpts: function (v, n) { var err = this.get('object')(v, n) if (err) return err // .source if (v.source && !ref.isLink(v.source) && !isFilter(v.source)) return AttrType(n, 'source', 'id|filter') // .dest if (v.dest && !ref.isLink(v.dest) && !isFilter(v.dest)) return AttrType(n, 'dest', 'id|filter') // .rel if (v.rel && typeof v.rel != 'string') return AttrType(n, 'rel', 'string') // .live if (v.live && typeof v.live != 'boolean' && typeof v.live != 'number') return AttrType(n, 'live', 'boolean') // .reverse if (v.reverse && typeof v.reverse != 'boolean' && typeof v.reverse != 'number') return AttrType(n, 'reverse', 'boolean') // .keys if (v.keys && typeof v.keys != 'boolean' && typeof v.keys != 'number') return AttrType(n, 'keys', 'boolean') // .values if (v.values && typeof v.values != 'boolean' && typeof v.values != 'number') return AttrType(n, 'values', 'boolean') }, relatedMessagesOpts: function (v, n) { var err = this.get('object')(v, n) if (err) return err // .id if (!ref.isMsg(v.id)) return MissingAttr(n, 'id', 'msgId') // .rel if (v.rel && typeof v.rel != 'string') return AttrType(n, 'rel', 'string') // .count if (v.count && typeof v.count != 'boolean' && typeof v.count != 'number') return AttrType(n, 'count', 'boolean') // .parent if (v.parent && typeof v.parent != 'boolean' && typeof v.parent != 'number') return AttrType(n, 'parent', 'boolean') }, isBlockedOpts: function (v, n) { var err = this.get('object')(v, n) if (err) return err // .source if (v.source && !ref.isFeed(v.source)) return AttrType(n, 'source', 'feedId') // .dest if (v.dest && !ref.isFeed(v.dest)) return AttrType(n, 'dest', 'feedId') }, createFriendStreamOpts: function (v, n) { var err = this.get('object')(v, n) if (err) return err // .start if (v.start && !ref.isFeed(v.start)) return AttrType(n, 'start', 'feedId') // .graph if (v.graph && typeof v.graph != 'string') return AttrType(n, 'graph', 'string') // .dunbar if (v.dunbar && typeof v.dunbar != 'number') return AttrType(n, 'dunbar', 'number') // .hops if (v.hops && typeof v.hops != 'number') return AttrType(n, 'hops', 'number') } }) },{"muxrpc-validation":259,"ssb-ref":573,"zerr":643}],431:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":432,"./sinks":433,"./sources":434,"./throughs":435,"dup":232}],432:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],433:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],434:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],435:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":433,"./sources":434,"dup":236}],436:[function(require,module,exports){ var ref = require('ssb-ref') function isObject (o) { return o && 'object' === typeof o } function isBool (o) { return 'boolean' === typeof o } function isString (s) { return 'string' === typeof s } function traverse (obj, each) { for (var k in obj) { if (!obj[k]) continue if (Array.isArray(obj[k])) { obj[k].forEach(function (v) { each(v, k) }) } else each(obj[k], k) } } exports.indexLinks = function (message, opts, each) { if (typeof opts == 'function') { each = opts opts = null } if (typeof opts == 'string') opts = { rel: opts } if (!opts) opts = {} var msg = opts.msg var feed = opts.feed var blob = opts.blob var any = !(msg || feed || blob) traverse(message, function (obj, rel) { if (opts.rel && rel !== opts.rel) return var r = (typeof obj == 'string') ? obj : obj.link if (any) { if (!ref.isLink(r)) return } else { if (msg) { if (isBool(msg) && ref.type(r) != 'msg') return if (!isBool(msg) && r != msg) return } if (feed) { if (isBool(feed) && ref.type(r) != 'feed') return if (!isBool(feed) && r != feed) return } if (blob) { if (isBool(blob) && ref.type(r) != 'blob') return if (!isBool(blob) && r != blob) return } } each((typeof obj == 'string') ? { link: obj } : obj, rel) }) } exports.link = exports.asLink = function (obj, type) { if (!obj) return null if (isString(obj)) obj = { link: obj } return isLink(obj, type) ? obj : null } exports.links = exports.asLinks = function (obj, type) { if (!obj) return [] var arr = Array.isArray(obj) ? obj : [obj] return arr .filter(function (l) { return isLink(l, type) }) .map(function (o) { return (typeof o == 'string') ? { link: o } : o }) } var isLink = exports.isLink = function (obj, type) { if (!obj) return false var r = (isString(obj)) ? obj : obj.link return (type) ? (ref.type(r) == type) : ref.isLink(r) } },{"ssb-ref":573}],437:[function(require,module,exports){ 'use strict' var Blobs = require('multiblob') var path = require('path') var pull = require('pull-stream') var isBlob = require('ssb-ref').isBlobId var Quota = require('./quota') var Notify = require('pull-notify') var mdm = require('mdmanifest') var valid = require('../../lib/validators') var apidoc = require('../../lib/apidocs').blobs var Replicate = require('./replication') // blobs plugin // methods to read/write the blobstore // and automated blob-fetching from the network function isFunction (f) { return 'function' === typeof f } function desigil (hash) { return isBlob(hash) ? hash.substring(1) : hash } function resigil (hash) { return isBlob(hash) ? hash : '&'+hash } function isString (s) { return 'string' === typeof s } module.exports = { name: 'blobs', version: '0.0.0', manifest: mdm.manifest(apidoc), permissions: { anonymous: {allow: ['has', 'get', 'changes']}, }, init: function (sbot, opts) { var notify = Notify() var config = opts var blobs = sbot._blobs = Blobs({ dir: path.join(config.path, 'blobs'), hash: 'sha256' }) var userQuotas = {} // map of { feedId => quotaUsage }, for rate-limiting var drain = Quota(sbot, blobs, userQuotas) var wantList = Replicate(sbot, config, notify, userQuotas) return { get: valid.source(function (hash) { return blobs.get(desigil(hash)) }, 'blobId'), has: valid.async(function (hash, cb) { //emit blobs:has event when this api is called remotely. //needed to make tests pass. should probably remove this. if(this.id) sbot.emit('blobs:has', hash) blobs.has(desigil(hash), cb) }, 'blobId|array'), size: valid.async(function (hash, cb) { //sbot.emit('blobs:size', hash) blobs.size(desigil(hash), cb) }, 'blobId|array'), add: valid.sink(function (hash, cb) { // cb once blob is successfully added. // sink cbs are not exposed over rpc // so this is only available when using this api if(isFunction(hash)) cb = hash, hash = null return blobs.add(desigil(hash), function (err, hash) { if(!err) { hash = resigil(hash) sbot.emit('blobs:got', hash) notify(hash) //wait until quotas have been calculated //befor returning (tests will fail without this) if(cb) drain(function () { cb(null, hash) }) } else { if(cb) cb(err, hash) else console.error(err.stack) } }) }, 'string?'), rm: valid.async(function (hash, cb) { return blobs.rm(desigil(hash), cb) }, 'string'), ls: function (opts) { return pull(blobs.ls(opts), pull.map(function (e) { if(e.sync) return e if(isString(e)) return resigil(e) e.id = resigil(e.id) return e })) }, // request to retrieve a blob, // calls back when that file is available. // - `opts.nowait`: call cb immediately if not found (dont register for callback) want: valid.async(function (hash, opts, cb) { if (isFunction(opts)) { cb = opts opts = null } var id = this.id if(!isBlob(hash)) return cb(new Error('not a hash:' + hash)) sbot.emit('blobs:wants', hash) blobs.has(desigil(hash), function (_, has) { if (has) return cb(null, true) // update queue wantList.want(hash, id, cb) }) }, 'blobId', 'object?'), changes: function () { return notify.listen() }, quota: valid.sync(function (id) { return wantList.quota(id) }, 'feedId'), // get current want list wants: function () { return wantList.jobs } } } } },{"../../lib/apidocs":426,"../../lib/validators":430,"./quota":439,"./replication":440,"mdmanifest":241,"multiblob":250,"path":290,"pull-notify":354,"pull-stream":431,"ssb-ref":573}],438:[function(require,module,exports){ // Queue // returns a function which... // - only acts if not already acting // - automatically requeues if the task is not yet done // - `delay`: ms, amount of time to wait before calling again // - `n`: number, amount of simultaneous calls allowed // - `label`: string, name of the task (for logging) // - `fun`: function(cb(done?)), calls cb(true) when done, cb(false) when needs to requeue function isFunction (f) { return 'function' === typeof f } function Work(avgWait, n, label, fun) { n = 1 var doing = 0, timeout var timers = [] function clear (timer) { var i = timers.indexOf(timer) clearTimeout(timer[i]) times.splice(i, 1) } function delay (job, d) { var i var timer = setTimeout(function () { timers.splice(timers.indexOf(timer), 1); job() }, d) timer.unref() timers.push(timer) return timer } function job () { // abort if already doing too many if(doing >= n) return doing++ // run the behavior fun(function (done) { doing-- if(done) { // we're done, dont requeue return } // requeue after a delay var wait = ~~(avgWait/2 + avgWait*Math.random()) delay(job, wait) }) } job.abort = function () { timers.forEach(clear) } return job } function find (jobs, test) { for(var k in jobs) if(test(jobs[k])) return k return -1 } function max (jobs, test) { var M = -Infinity, i = -1 for(var k in jobs) { var m = test(jobs[k], k, jobs) if(m > M) { M = m i = k } } return k } module.exports = function (work) { var jobs = [] var queue = { push: function (job) { jobs.push(job) }, pull: function (id) { var test = isFunction(id) ? id : function (e) { return e.id === id } if(!this.length()) return if(!id) return jobs.shift() else { var index = find(jobs, test) if(~index) return jobs.splice(index, 1)[0] } }, each: function (iter) { jobs.forEach(iter) }, length: function () { return jobs.length }, toJSON: function () { return jobs.slice() } } Work(100, 2, null, function (done) { if(!queue.length()) return done() work(queue, done) }) () return queue } },{}],439:[function(require,module,exports){ var pull = require('pull-stream') var paramap = require('pull-paramap') module.exports = function (sbot, blobs, userQuotas, cb) { var listeners = [] //recalculate the quota, with live updates. // share a file size between the feeds that link to it. // At the time we download it. // More feeds might link to it later, and these // won't be included in the calculation. // but it's simplest to do it this way. // this is only in memory, so it will be recalculated // when sbot is restarted. var total = 0 var start = Date.now() var inflight = 0 pull( blobs.ls({long: true, live: true}), paramap(function (data, cb) { if(data.sync) return cb(null, data) var acc = {}, count = 0 total += data.size inflight ++ pull( sbot.links({dest: '&'+data.id}), pull.drain(function (link) { if(!acc[link.source]) { acc[link.source] = true count ++ } return acc }, function (err) { inflight -- if(err) return cb(err) var size = data.size for(var k in acc) userQuotas[k] = (userQuotas[k] || 0) + size/count if(inflight === 0) while (listeners.length) listeners.shift()() cb(null, data) }) ) }), pull.drain() ) return function (listener) { if(!inflight) listener() else listeners.push(listener) } } },{"pull-paramap":363,"pull-stream":431}],440:[function(require,module,exports){ var pull = require('pull-stream') var Queue = require('./queue') function each (obj, iter) { for(var k in obj) iter(obj[k], k, obj) } function first (obj, test) { var v for (var k in obj) if(v = test(obj[k], k, obj)) return v } function union (a, b) { b = toArray(b) a = toArray(a) if(!a.length) return b if(a.length < b.length) { var t = b; b = a; a = t } b.forEach(function (e) { if(!~a.indexOf(e)) a.push(e) }) return a } function toArray (s) { return s != null ? (Array.isArray(s) ? s : [s]) : [] } function isFunction (f) { return 'function' === typeof f } var MB = 1024*1024 //default replication limits. var defaults = {limit: [-1, 100*MB, 20*MB], minLimit: 5*MB} module.exports = function (sbot, opts, notify, userQuotas) { var jobs = {}, hasQueue, getQueue var conf = opts.blobs || defaults, wl //keep track of who is over quota so that it doesn't get logged again and again. var over = {} // calculate quotas for each feed. // start with size of each blob // divided between the feeds that mention it. // getting a use for each feed. function createJob(id, owner, cb) { toArray(owner).forEach(function (e) { if(e[0] !== '@') throw new Error('not a owner:'+e) }) if(jobs[id]) { jobs[id].owner = union(jobs[id].owner, owner || []) jobs[id].cbs.push(cb) return } hasQueue.push(jobs[id] = { id: id, has: {}, owner: toArray(owner), cbs: cb ? [cb] : [], done: false }) } function finishJob(job) { if(!job) return delete jobs[job.id] while(job.cbs && job.cbs.length) { var cb = job.cbs.shift() if(isFunction(cb)) cb(null, true) } } //if want is called and then it's locally added, //handle that by calling back want. pull(notify.listen(), pull.drain(function (hash) { finishJob(hasQueue.pull(hash) || getQueue.pull(hash)) })) function hasPeers () { return Object.keys(sbot.peers).length !== 0 } function hops (id) { var p = sbot.friends.path({ source: sbot.id, dest: id, hops: conf.limit.length }) return p ? p.length - 1 : -1 } function limitFor(id) { if(opts.party) return -1 var h = hops(id) if(hops === -1) return conf.minLimit return conf.limit[h] || conf.minLimit } function filter (job) { //set config.blobs.party = true //to disable all quotas. if(conf.party) return true return job.owner.every(function (id) { var l = limitFor(id) if(l < 0) return true else if ((userQuotas[id] || 0) < l) return true else if(!over[id]) { over[id] = userQuotas[id] console.log('Over Quota:', id, wl.quota(id)) } }) } hasQueue = Queue(function (_, done) { //check if there is a something in the has queue. //filter out cases where work is impossible... //(empty queue, or no peers) if(!hasPeers()) return done() var job = hasQueue.pull(filter) if(!job || job.done) return done() var n = 0, found = false each(sbot.peers, function (peers, id) { if(('undefined' !== typeof job.has[id]) || !peers[0]) return n++ peers[0].blobs.has(job.id, function (err, has) { found = found || (job.has[id] = has) if(--n) return next() }) }) if(!n) return hasQueue.push(job), done() function next () { (found ? getQueue : hasQueue).push(job) done() } }) getQueue = Queue(function (_, done) { if(!hasPeers()) return done() //check if this file is over quota. var job = getQueue.pull(filter) if(!job) return done() //this covers weird edgecase where a blob is added //while something is looking for it. covered in //test/blobs2.js if(job.done) { delete jobs[job.id] return done() } var remote = first(job.has, function (has, id) { if (has) return getPeer(id) }) if(!remote) { hasQueue.push(job); return done() } pull( remote.blobs.get(job.id), //only accept blobs that have the correct size. sbot.blobs.add(job.id, function (err) { if(!err) { finishJob(job) return done() //success } // remove the remote, it may be misbehaving delete job.has[remote.id] // put it back on the get or has queue if(Object.keys(job.has).length) getQueue.push(job) else hasQueue.push(job) done() }) ) }) function getPeer(id) { return sbot.peers[id] && sbot.peers[id][0] } // monitor the feed for new links to blobs pull( sbot.links({dest: '&', live: true}), pull.drain(function (data) { // do we have the referenced blob yet? sbot.blobs.has(data.dest, function (_, has) { if(!has) createJob(data.dest, data.source) }) }) ) //handle weird edge case where something is added locally //but we are already looking for it because we saw a link. sbot.on('blobs:got', function (hash) { if(jobs[hash]) jobs[hash].done = true }) sbot.on('rpc:connect', function (rpc) { for(id in jobs) if(false === jobs[id].has[rpc.id]) delete jobs[id].has[rpc.id] }) return wl = { has: hasQueue, get: getQueue, want: function (id, owner, cb) { createJob(id, owner || sbot.id, cb) }, quota: function (id) { var l = limitFor(id), q = userQuotas[id] || 0 return { limit: l, usage: q, hops: hops(id), percent: ((q/l)*100).toPrecision(4)+'%' } } } } },{"./queue":438,"pull-stream":431}],441:[function(require,module,exports){ var pull = require('pull-stream') var valid = require('../lib/validators') exports.name = 'block' exports.version = '1.0.0' exports.manifest = { isBlocked : 'sync', } exports.init = function (sbot) { //TODO: move other blocking code in here, // i think we'll need a hook system for this. //if a currently connected peer is blocked, disconnect them immediately. pull( sbot.friends.createFriendStream({graph: 'flag', live: true}), pull.drain(function (blocked) { if(sbot.peers[blocked]) { sbot.peers[blocked].forEach(function (b) { b.close(true, function () {}) }) } }) ) function isBlocked (_opts) { var opts if('string' === typeof _opts) opts = { source: sbot.id, dest: _opts, graph:'flag' } else opts = { source: _opts.source, dest: _opts.dest, graph: 'flag' } return sbot.friends.get(opts) } sbot.createHistoryStream.hook(function (fn, args) { var opts = args[0], id = this.id if(opts.id !== this.id && isBlocked({source: opts.id, dest: this.id})) return fn({id: null, sequence: 0}) else return pull( fn.apply(this, args), //break off this feed if they suddenly block //the recipient. pull.take(function (msg) { //handle when createHistoryStream is called with keys: true if(!msg.content && msg.value.content) msg = msg.value if(msg.content.type !== 'contact') return true return !( msg.content.flagged && msg.content.contact === id ) }) ) }) sbot.auth.hook(function (fn, args) { if(isBlocked(args[0])) args[1](new Error('client is blocked')) else return fn.apply(this, args) }) return {isBlocked: valid.sync(isBlocked, 'feedId|isBlockedOpts') } } },{"../lib/validators":430,"pull-stream":431}],442:[function(require,module,exports){ var Graphmitter = require('graphmitter') var pull = require('pull-stream') var mlib = require('ssb-msgs') var memview = require('level-memview') var pushable = require('pull-pushable') var mdm = require('mdmanifest') var valid = require('../lib/validators') var apidoc = require('../lib/apidocs').friends // friends plugin // methods to analyze the social graph // maintains a 'follow' and 'flag' graph function isFunction (f) { return 'function' === typeof f } function isString (s) { return 'string' === typeof s } exports.name = 'friends' exports.version = '1.0.0' exports.manifest = mdm.manifest(apidoc) exports.init = function (sbot, config) { var graphs = { follow: new Graphmitter(), flag: new Graphmitter() } // view processor var syncCbs = [] function awaitSync (cb) { if (syncCbs) syncCbs.push(cb) else cb() } // read/watch the log for changes to the social graph pull(sbot.createLogStream({ live: true }), pull.drain(function (msg) { if (msg.sync) { syncCbs.forEach(function (cb) { cb() }) syncCbs = null return } var c = msg.value.content if (c.type == 'contact') { mlib.asLinks(c.contact).forEach(function (link) { if ('following' in c) { if (c.following) graphs.follow.edge(msg.value.author, link.link, true) else graphs.follow.del(msg.value.author, link.link) } if ('flagged' in c) { if (c.flagged) graphs.flag.edge(msg.value.author, link.link, c.flagged) else graphs.flag.del(msg.value.author, link.link) } }) } })) return { get: valid.sync(function (opts) { var g = graphs[opts.graph || 'follow'] if(!g) throw new Error('opts.graph must be provided') return g.get(opts.source, opts.dest) }, 'object?'), all: valid.async(function (graph, cb) { if (typeof graph == 'function') { cb = graph graph = null } if (!graph) graph = 'follow' awaitSync(function () { cb(null, graphs[graph] ? graphs[graph].toJSON() : null) }) }, 'string?'), path: valid.sync(function (opts) { if(isString(opts)) opts = {source: sbot.id, dest: opts} return graphs.follow.path(opts) }, 'string|object'), createFriendStream: valid.source(function (opts) { opts = opts || {} var live = opts.live === true var meta = opts.meta === true var start = opts.start || sbot.id var graph = graphs[opts.graph || 'follow'] if(!graph) return pull.error(new Error('unknown graph:' + opts.graph)) var cancel, ps = pushable(function () { cancel && cancel() }) function push (to, hops) { return ps.push(meta ? {id: to, hops: hops} : to) } //by default, also emit your own key. if(opts.self !== false) push(start, 0) var conf = config.friends || {} cancel = graph.traverse({ start: start, hops: opts.hops || conf.hops || 3, max: opts.dunbar || conf.dunbar || 150, each: function (_, to, hops) { if(to !== start) push(to, hops) } }) if(!live) { cancel(); ps.end() } return ps }, 'createFriendStreamOpts?'), hops: valid.async(function (start, graph, opts, cb) { if (typeof opts == 'function') { // (start|opts, graph, cb) cb = opts opts = null } else if (typeof graph == 'function') { // (start|opts, cb) cb = graph opts = graph = null } opts = opts || {} if(isString(start)) { // (start, ...) // first arg is id string opts.start = start } else if (start && typeof start == 'object') { // (opts, ...) // first arg is opts for (var k in start) opts[k] = start[k] } var conf = config.friends || {} opts.start = opts.start || sbot.id opts.dunbar = opts.dunbar || conf.dunbar || 150 opts.hops = opts.hops || conf.hops || 3 var g = graphs[graph || 'follow'] if (!g) return cb(new Error('Invalid graph type: '+graph)) awaitSync(function () { cb(null, g.traverse(opts)) }) }, ['feedId', 'string?', 'object?'], ['createFriendStreamOpts']) } } },{"../lib/apidocs":426,"../lib/validators":430,"graphmitter":154,"level-memview":178,"mdmanifest":241,"pull-pushable":370,"pull-stream":431,"ssb-msgs":436}],443:[function(require,module,exports){ 'use strict' var pull = require('pull-stream') var Notify = require('pull-notify') var toAddress = require('../../lib/util').toAddress var mdm = require('mdmanifest') var valid = require('../../lib/validators') var apidoc = require('../../lib/apidocs').gossip var u = require('../../lib/util') var ping = require('pull-ping') var Stats = require('statistics') var isArray = Array.isArray var Schedule = require('./schedule') var Init = require('./init') function isFunction (f) { return 'function' === typeof f } /* Peers : [{ key: id, host: ip, port: int, //to be backwards compatible with patchwork... announcers: {length: int} source: 'pub'|'manual'|'local' }] */ module.exports = { name: 'gossip', version: '1.0.0', manifest: mdm.manifest(apidoc), permissions: { anonymous: {allow: ['ping']} }, init: function (server, config) { var notify = Notify() var conf = config.gossip || {} var home = u.toAddress(server.getAddress()) //Known Peers var peers = [] function getPeer(id) { return u.find(peers, function (e) { return e && e.key === id }) } var timer_ping = 5*6e4 var gossip = { peers: function () { return peers }, get: function (addr) { addr = u.toAddress(addr) return u.find(peers, function (a) { return ( addr.port === a.port && addr.host === a.host && addr.key === a.key ) }) }, connect: valid.async(function (addr, cb) { addr = u.toAddress(addr) if (!addr || typeof addr != 'object') return cb(new Error('first param must be an address')) if(!addr.key) return cb(new Error('address must have ed25519 key')) // add peer to the table, incase it isn't already. gossip.add(addr, 'manual') var p = gossip.get(addr) if(!p) return cb() p.stateChange = Date.now() p.state = 'connecting' server.connect(p, function (err, rpc) { if (err) { p.state = undefined p.failure = (p.failure || 0) + 1 p.stateChange = Date.now() notify({ type: 'connect-failure', peer: p }) server.emit('log:info', ['SBOT', p.host+':'+p.port+p.key, 'connection failed', err.message || err]) p.duration.value(0) return (cb && cb(err)) } else { p.state = 'connected' p.failure = 0 } cb && cb(null, rpc) }) }, 'string|object'), disconnect: valid.async(function (addr, cb) { var peer = this.get(addr) peer.state = 'disconnecting' peer.stateChange = Date.now() if(!peer || !peer.disconnect) cb && cb() else peer.disconnect(true, function (err) { peer.stateChange = Date.now() }) }, 'string|object'), changes: function () { return notify.listen() }, //add an address to the peer table. add: valid.sync(function (addr, source) { addr = u.toAddress(addr) if(!u.isAddress(addr)) throw new Error('not a valid address:' + JSON.stringify(addr)) // check that this is a valid address, and not pointing at self. if(addr.key === home.key) return if(addr.host === home.host && addr.port === home.port) return var f = gossip.get(addr) if(!f) { // new peer addr.source = source addr.announcers = 1 addr.duration = Stats() peers.push(addr) notify({ type: 'discover', peer: addr, source: source || 'manual' }) return addr } //don't count local over and over else if(f.source != 'local') f.announcers ++ return f }, 'string|object', 'string?'), ping: function (opts) { var timeout = config.timers && config.timers.ping || 5*60e3 //between 10 seconds and 30 minutes, default 5 min timeout = Math.max(10e3, Math.min(timeout, 30*60e3)) return ping({timeout: timeout}) } } Schedule (gossip, config, server) Init (gossip, config, server) //get current state server.on('rpc:connect', function (rpc, isClient) { var peer = getPeer(rpc.id) //don't track clients that connect, but arn't considered peers. //maybe we should though? if(!peer) return console.log('+connected', u.stringifyAddress(peer)) //means that we have created this connection, not received it. peer.client = !!isClient peer.state = 'connected' peer.stateChange = Date.now() peer.disconnect = function (err, cb) { if(isFunction(err)) cb = err, err = null rpc.close(err, cb) } if(isClient) { //default ping is 5 minutes... var pp = ping({serve: true, timeout: timer_ping}, function (_) {}) peer.ping = {rtt: pp.rtt, skew: pp.skew} pull( pp, rpc.gossip.ping({timeout: timer_ping}, function (err) { if(err.name === 'TypeError') peer.ping.fail = true }), pp ) } rpc.on('closed', function () { console.log('-disconnected', u.stringifyAddress(peer)) //track whether we have successfully connected. //or how many failures there have been. var since = peer.stateChange peer.stateChange = Date.now() if(peer.state === 'connected') //may be "disconnecting" peer.duration.value(peer.stateChange - since) peer.state = undefined notify({ type: 'disconnect', peer: peer }) server.emit('log:info', ['SBOT', rpc.id, 'disconnect']) }) notify({ type: 'connect', peer: peer }) }) return gossip } } },{"../../lib/apidocs":426,"../../lib/util":429,"../../lib/validators":430,"./init":444,"./schedule":445,"mdmanifest":241,"pull-notify":354,"pull-ping":364,"pull-stream":431,"statistics":575}],444:[function(require,module,exports){ var isArray = Array.isArray var pull = require('pull-stream') module.exports = function (gossip, config, server) { // populate peertable with configured seeds (mainly used in testing) var seeds = config.seeds ;(isArray(seeds) ? seeds : [seeds]).filter(Boolean) .forEach(function (addr) { gossip.add(addr, 'seed') }) // populate peertable with pub announcements on the feed pull( server.messagesByType({ type: 'pub', live: true, keys: false }), pull.drain(function (msg) { if(!msg.content.address) return gossip.add(msg.content.address, 'pub') }) ) // populate peertable with announcements on the LAN multicast server.on('local', function (_peer) { gossip.add(_peer, 'local') }) } },{"pull-stream":431}],445:[function(require,module,exports){ var nonPrivate = require('non-private-ip') var ip = require('ip') var onWakeup = require('on-wakeup') var Stats = require('statistics') var os = require('os') var pull = require('pull-stream') var u = require('../../lib/util') function rand(array) { return array[~~(Math.random()*array.length)] } function not (fn) { return function (e) { return !fn(e) } } function and () { var args = [].slice.call(arguments) return function (value) { return args.every(function (fn) { return fn.call(null, value) }) } } //min delay (delay since last disconnect of most recent peer in unconnected set) //unconnected filter delay peer < min delay function delay (failures, factor, max) { return Math.min(Math.pow(2, failures)*factor, max || Infinity) } function maxStateChange (M, e) { return Math.max(M, e.stateChange || 0) } function peerNext(peer, opts) { return (peer.stateChange|0) + delay(peer.failure|0, opts.factor, opts.max) } //detect if not connected to wifi or other network //(i.e. if there is only localhost) function isOffline () { var lo = Object.keys(os.networkInterfaces()) return lo.length === 1 && lo[0] === 'lo' } var isOnline = not(isOffline) function isLocal (e) { return ip.isPrivate(e.host) } function isUnattempted (e) { return !e.stateChange } //select peers which have never been successfully connected to yet, //but have been tried. function isInactive (e) { return e.stateChange && e.duration.mean == 0 } function isLongterm (e) { return e.ping && e.ping.rtt.mean > 0 } //peers which we can connect to, but are not upgraded. //select peers which we can connect to, but are not upgraded to LT. //assume any peer is legacy, until we know otherwise... function isLegacy (peer) { return peer.duration.mean > 0 && !exports.isLongterm(peer) } function isConnect (e) { return 'connected' === e.state || 'connecting' === e.state } //sort oldest to newest then take first n function earliest(peers, n) { return peers.sort(function (a, b) { return a.stateChange - b.stateChange }).slice(0, Math.max(n, 0)) } function select(peers, ts, filter, opts) { if(opts.disable) return [] //opts: { quota, groupMin, min, factor, max } var type = peers.filter(filter) var unconnect = type.filter(not(isConnect)) var count = Math.max(opts.quota - type.filter(isConnect).length, 0) var min = unconnect.reduce(maxStateChange, 0) + opts.groupMin if(ts < min) return [] return earliest(unconnect.filter(function (peer) { return peerNext(peer, opts) < ts }), count) } var schedule = exports = module.exports = function (gossip, config, server) { var min = 60e3, hour = 60*60e3 function conf(name, def) { if(!config.gossip) return def var value = config.gossip[name] return (value === undefined || value === '') ? def : value } function connect (peers, ts, name, filter, opts) { var connected = peers.filter(isConnect).filter(filter) .filter(function (peer) { return peer.stateChange + 10e3 < ts }) if(connected.length > opts.quota) { return earliest(connected, connected.length - opts.quota) .forEach(function (peer) { console.log('Disconnect', name, u.stringifyAddress(peer)) gossip.disconnect(peer) }) } select(peers, ts, and(filter, isOnline), opts) .forEach(function (peer) { console.log('Connect', name, u.stringifyAddress(peer)) gossip.connect(peer) }) } function connections () { var ts = Date.now() var peers = gossip.peers() connect(peers, ts, 'attempt', exports.isUnattempted, { min: 0, quota: 10, factor: 0, max: 0, groupMin: 0, disable: !conf('global', true) }) //quota, groupMin, min, factor, max connect(peers, ts, 'retry', exports.isInactive, { min: 0, quota: 3, factor: 5*60e3, max: 3*60*60e3, groupMin: 5*50e3 }) connect(peers, ts, 'legacy', exports.isLegacy, { quota: 3, factor: 5*min, max: 3*hour, groupMin: 5*min, disable: !conf('global', true) }) connect(peers, ts, 'longterm', exports.isLongterm, { quota: 3, factor: 10e3, max: 10*min, groupMin: 5e3, disable: !conf('global', true) }) connect(peers, ts, 'local', exports.isLocal, { quota: 3, factor: 2e3, max: 10*min, groupMin: 1e3, disable: !conf('local', true) }) } pull( gossip.changes(), pull.drain(function (ev) { if(ev.type == 'disconnect') connections() }) ) setInterval(function () { connections() }, 2e3).unref() connections() } exports.isUnattempted = isUnattempted exports.isInactive = isInactive exports.isLongterm = isLongterm exports.isLegacy = isLegacy exports.isLocal = isLocal exports.isConnectedOrConnecting = isConnect exports.select = select },{"../../lib/util":429,"ip":169,"non-private-ip":272,"on-wakeup":277,"os":279,"pull-stream":431,"statistics":575}],446:[function(require,module,exports){ var crypto = require('crypto') var ssbKeys = require('ssb-keys') var toAddress = require('../lib/util').toAddress var cont = require('cont') var explain = require('explain-error') var ip = require('ip') var mdm = require('mdmanifest') var valid = require('../lib/validators') var apidoc = require('../lib/apidocs').invite // invite plugin // adds methods for producing invite-codes, // which peers can use to command your server to follow them. function isFunction (f) { return 'function' === typeof f } function isString (s) { return 'string' === typeof s } module.exports = { name: 'invite', version: '1.0.0', manifest: mdm.manifest(apidoc), permissions: { master: {allow: ['create']}, //temp: {allow: ['use']} }, init: function (server, config) { var codes = {} var codesDB = server.sublevel('codes') var createClient = this.createClient //add an auth hook. server.auth.hook(function (fn, args) { var pubkey = args[0], cb = args[1] // run normal authentication fn(pubkey, function (err, auth) { if(err || auth) return cb(err, auth) // if no rights were already defined for this pubkey // check if the pubkey is one of our invite codes codesDB.get(pubkey, function (_, code) { return cb(null, code && code.permissions) }) }) }) return { create: valid.async(function (n, cb) { var addr = server.getAddress() var host = toAddress(addr).host if(!config.allowPrivate && (ip.isPrivate(host) || 'localhost' === host)) return cb(new Error('Server has no public ip address, ' + 'cannot create useable invitation')) //this stuff is SECURITY CRITICAL //so it should be moved into the main app. //there should be something that restricts what //permissions the plugin can create also: //it should be able to diminish it's own permissions. // generate a key-seed and its key var seed = crypto.randomBytes(32) var keyCap = ssbKeys.generate('ed25519', seed) // store metadata under the generated pubkey var owner = server.id codesDB.put(keyCap.id, { id: keyCap.id, total: +n, used: 0, permissions: {allow: ['invite.use'], deny: null} }, function (err) { // emit the invite code: our server address, plus the key-seed if(err) cb(err) else cb(null, addr + '~' + seed.toString('base64')) }) }, 'number'), use: valid.async(function (req, cb) { var rpc = this // fetch the code codesDB.get(rpc.id, function(err, invite) { if(err) return cb(err) // check if we're already following them server.friends.all('follow', function(err, follows) { if (follows && follows[server.id] && follows[server.id][req.feed]) return cb(new Error('already following')) // although we already know the current feed // it's included so that request cannot be replayed. if(!req.feed) return cb(new Error('feed to follow is missing')) if(invite.used >= invite.total) return cb(new Error('invite has expired')) invite.used ++ //never allow this to be used again if(invite.used >= invite.total) invite.permissions = {allow: [], deny: null} //TODO //okay so there is a small race condition here //if people use a code massively in parallel //then it may not be counted correctly... //this is not a big enough deal to fix though. //-dominic // update code metadata codesDB.put(rpc.id, invite, function (err) { server.emit('log:info', ['invite', rpc.id, 'use', req]) // follow the user server.publish({ type: 'contact', contact: req.feed, following: true, autofollow: true }, cb) }) }) }) }, 'object'), accept: valid.async(function (invite, cb) { // remove surrounding quotes, if found if (invite.charAt(0) === '"' && invite.charAt(invite.length - 1) === '"') invite = invite.slice(1, -1) // connect to the address in the invite code // using a keypair generated from the key-seed in the invite code var parts = invite.split('~') var addr = toAddress(parts[0]) createClient({ seed: parts[1] }) (addr, function (err, rpc) { if(err) return cb(explain(err, 'could not connect to server')) // command the peer to follow me rpc.invite.use({ feed: server.id }, function (err, msg) { if(err) return cb(explain(err, 'invite not accepted')) // follow and announce the pub cont.para([ server.publish({ type: 'contact', following: true, autofollow: true, contact: addr.link || addr.key }), server.publish({ type: 'pub', address: addr, }) ])(function (err, results) { rpc.close() cb(err, results) }) }) }) }, 'string') } } } },{"../lib/apidocs":426,"../lib/util":429,"../lib/validators":430,"cont":86,"crypto":110,"explain-error":146,"ip":169,"mdmanifest":241,"ssb-keys":530}],447:[function(require,module,exports){ var broadcast = require('broadcast-stream') // local plugin // broadcasts the address:port:pubkey triple of the sbot server // on the LAN, using multicast UDP function isFunction (f) { return 'function' === typeof f } module.exports = { name: 'local', version: '2.0.0', init: function (sbot, config) { var local = broadcast(config.port) local.on('data', function (buf) { if(buf.loopback) return var data = buf.toString() sbot.gossip.add(data, 'local') }) setInterval(function () { // broadcast self // TODO: sign beacons, so that receipient can be confidant // that is really your id. // (which means they can update their peer table) // Oh if this includes your local address, // then it becomes unforgeable. local.write(sbot.getAddress()) }, 1000) } } },{"broadcast-stream":31}],448:[function(require,module,exports){ (function (process){ var color = require('bash-color') // logging plugin // subscribes to 'log:*' events // and emits using lovely colors var LOG_LEVELS = [ 'error', 'warning', 'notice', 'info' ] var DEFAULT_LEVEL = LOG_LEVELS.indexOf('notice') function indent (o) { return o.split('\n').map(function (e) { return ' ' + e }).join('\n') } function isString(s) { return 'string' === s } function formatter(id, level) { var b = id.substring(0, 4) return function (ary) { var plug = ary[0].substring(0, 4).toUpperCase() var id = ary[1] var verb = ary[2] var data = ary.length > 4 ? ary.slice(3) : ary[3] var _data = (isString(data) ? data : JSON.stringify(data)) || '' var pre = [plug, id, color.cyan(verb)].join(' ') var length = (5 + pre.length + 1 + _data.length) var lines = isString(data) && data.split('\n').length > 1 var c = process.stdout.columns if((process.stdout.columns > length) && !lines) console.log([level, b, pre, _data].join(' ')) else { console.log([level, b, pre].join(' ')) if(lines) console.log(indent(data)) else if(data && data.stack) console.log(indent(data.stack)) else if(data) { console.log(indent(JSON.stringify(data, null, 2))) } } } } module.exports = function logging (server, conf) { var level = conf.logging && conf.logging.level && LOG_LEVELS.indexOf(conf.logging.level) || DEFAULT_LEVEL if (level === -1) { console.log('Warning, logging.level configured to an invalid value:', conf.logging.level) console.log('Should be one of:', LOG_LEVELS.join(', ')) level = DEFAULT_LEVEL } console.log('Log level:', LOG_LEVELS[level]) var id = server.id if (level >= LOG_LEVELS.indexOf('info')) server.on('log:info', formatter(id, color.green('info'))) if (level >= LOG_LEVELS.indexOf('notice')) server.on('log:notice', formatter(id, color.blue('note'))) if (level >= LOG_LEVELS.indexOf('warning')) server.on('log:warning', formatter(id, color.yellow('warn'))) if (level >= LOG_LEVELS.indexOf('error')) server.on('log:error', formatter(id, color.red('err!'))) } module.exports.init = module.exports }).call(this,require('_process')) },{"_process":295,"bash-color":19}],449:[function(require,module,exports){ // master plugin // allows you to define "master" IDs in the config // which are given the full rights of the local main ID module.exports = function (api, opts) { var masters = [api.id].concat(opts.master).filter(Boolean) api.auth.hook(function (fn, args) { var id = args[0] var cb = args[1] cb(null, ~masters.indexOf(id) ? {allow: null, deny: null} : null) }) } },{}],450:[function(require,module,exports){ var ssbKeys = require('ssb-keys') var explain = require('explain-error') var mdm = require('mdmanifest') var valid = require('../lib/validators') var apidoc = require('../lib/apidocs').private module.exports = { name: 'private', version: '0.0.0', manifest: mdm.manifest(apidoc), permissions: { anonymous: {}, }, init: function (sbot, opts) { return { publish: valid.async(function (data, recps, cb) { var ciphertext try { ciphertext = ssbKeys.box(data, recps) } catch (e) { return cb(explain(e, 'failed to encrypt')) } sbot.publish(ciphertext, cb) }, 'string|object', 'array'), unbox: valid.sync(function (ciphertext) { var data try { data = ssbKeys.unbox(ciphertext, sbot.keys.private) } catch (e) { throw explain(e, 'failed to decrypt') } return data }, 'string') } } } },{"../lib/apidocs":426,"../lib/validators":430,"explain-error":146,"mdmanifest":241,"ssb-keys":530}],451:[function(require,module,exports){ var pull = require('pull-stream') var para = require('pull-paramap') var Notify = require('pull-notify') var many = require('pull-many') var cat = require('pull-cat') var Abort = require('pull-abortable') var Debounce = require('observ-debounce') var Observ = require('observ') var mdm = require('mdmanifest') var apidoc = require('../lib/apidocs').replicate var DAY = 1000*60*60*24 var LIMIT = [-1, -1, 100] // default rate-limits, by hops out var notify = Notify() function last (a) { return a[a.length - 1] } // main log-replication behavior function replicate(sbot, config, rpc, cb) { // rate limiter: // calculate how many messages we're willing to receive for a user // - works by number of "hops" away from the local user, in the follow graph function calcLimit (upto) { var limit = config.replication && config.replication.limit if(!Array.isArray(limit)) limit = LIMIT var hopLimit = (upto.hops < limit.length) ? limit[upto.hops] : last(limit) if(hopLimit <=0) return hopLimit return ( !upto.ts ? hopLimit : Math.ceil((Date.now() - upto.ts)/DAY * hopLimit) ) } // TODO // is `initial` and `to_recv` the same thing? do we need both? // -prf var aborter = Abort() var sources = many() var to_send = {} // { feedId => their latest seq } map for feeds requested by the peer var to_recv = {} // { feedId => our latest seq } map for feeds we request var initial = {} // { feedId => initial seq } map for feeds request, remembers what seq each feed was initially at var replicated = {} // { feedId => final seq } map for feeds request, tracks the final seq for each received feed var debounce = Debounce(100) // track progress, and emit update events periodically debounce(function () { // HACK // This uses the information produced by normal replication // to get a rough approximation for a progress-bar. // When the peer requests feeds, they'll tell us what sequence they have for each feed. // We track that in `to_send`. // We also track the sequence we have, for the feeds we're requesting, in `to_recv`. // If it so happens they have a higher sequence for a feed than we do, then // `to_send` will be higher than `to_recv`. // This means they have to request a feed for us to track that feed's progress, which is // often the case, but not always. // Works for now. // -prf (but code by dominic, blame him) var total = 0, progress = 0, feeds = 0 for(var id in to_recv) { var feed_to_send = to_send[id] || 0 var feed_to_recv = to_recv[id] || 0 var feed_replicated = replicated[id] || 0 if(to_send[id] != null && to_recv[id] != null) { feeds++ if(feed_to_send > feed_to_recv) { total += (feed_to_send - feed_to_recv) progress += (feed_replicated - feed_to_recv) } } } // emit progress event notify({ type: 'progress', peerid: rpc.id, total: total, progress: progress, feeds: feeds, sync: !!(feeds && (progress >= total)) }) }) rpc.on('call:createHistoryStream', function (opts) { // track what sequence the peer has for each feed to_send[opts.id] = (opts.sequence || opts.seq) - 1 debounce.set() }) // compatibility function for old implementations of `latestSequence` function toSeq (s) { return 'number' === typeof s ? s : s.sequence } // collect the IDs of feeds we want to request var opts = config.replication || {} opts.hops = opts.hops || 3 opts.dunbar = opts.dunbar || 150 opts.live = true opts.meta = true var userSources = [sbot.friends.createFriendStream(opts)] if (sbot.gossip) { // if we have the gossip plugin active, then include new local peers // so that you can put a name to someone on your local network. userSources.unshift(pull.values( sbot.gossip.peers() .filter(function (e) { return e.source === 'local' }) .map(function (e) { return {id: e.key, hops: 6} }) )) } // create read-streams for the desired feeds pull( cat(userSources), aborter, // filter out duplicates, and also keep track of what we expect to receive pull.filter(function (s) { var id = 'string' === typeof s ? s : s.id if(to_recv[id] == null) { to_recv[id] = 0; return true } }), // lookup the latest sequence from each user para(function (data, cb) { if(data.sync) return cb(null, data) var id = data.id || data sbot.latestSequence(id, function (err, seq) { cb(null, { id: id, sequence: err ? 0 : toSeq(seq), ts: err ? null : seq.ts, hops: data.hops }) }) }, 32), pull.drain(function (upto) { to_recv[upto.id] = upto.sequence initial[upto.id] = replicated[upto.id] = upto.sequence var limit = config.party ? null : calcLimit(upto) sources.add( pull( // TODO // how do `limit` and `live` interact, here? // what if only the first 100 messages, of 200, were requested? // would you start getting live updates, starting at sequence 201? // -prf rpc.createHistoryStream({ id: upto.id, seq: upto.sequence + 1, limit: limit, live: true, keys: false }), pull.through(function () { if(limit === null || limit--) return //REPLICATIOAN BACK PRESSURE rpc.close(true) // TODO // do we want to close the entire RPC connection when the limit is hit? // the limit is per feed ... it should just close the feed's history stream // -prf }) ) ) debounce.set() }, function (err) { if(err) sbot.emit('log:error', ['replication', rep.id, 'error', err]) sources.cap() }) ) // create the read -> write stream pull( sources, pull.through(function (msg) { // track progress replicated[msg.author] = Math.max( replicated[msg.author]||0, msg.sequence ) debounce.set() }), sbot.createWriteStream(function (err) { aborter.abort() debounce.immediate() // done! cb(err, replicated, initial) }) ) } module.exports = { name: 'replicate', version: '1.0.0', manifest: mdm.manifest(apidoc), replicate: replicate, init: function (sbot, config) { sbot.createHistoryStream.hook(function (fn, args) { if(this._emit) this._emit('call:createHistoryStream', args[0]) return fn.apply(this, args) }) // watch for new connections and replicate on creation sbot.on('rpc:connect', function(rpc) { // this is the cli client, just ignore. if(rpc.id === sbot.id) return sbot.emit('log:info', ['replicate', rpc.id, 'start']) sbot.emit('replicate:start', rpc) replicate(sbot, config, rpc, function (err, final, initial) { if(err) { sbot.emit('replicate:fail', err) sbot.emit('log:warning', ['replicate', rpc.id, 'error', err]) } else { var progress = {} // subtract `initial` from `final` so `progress` represents a delta for (var author in final) progress[author] = final[author] - (initial[author] || 0) var progressSummary = summarizeProgress(progress) if (progressSummary) sbot.emit('log:notice', ['replicate', rpc.id, 'success', progressSummary]) sbot.emit('replicate:finish', final) } }) }) return { changes: function () { return notify.listen() } } } } function summarizeProgress (progress) { // count the number of feeds updated, and the number of new messages var updatedFeeds = 0, newMessages = 0 for (var author in progress) { if (progress[author] > 0) { updatedFeeds++ newMessages += progress[author] } } // no message if no updates if (updatedFeeds === 0) return false return 'Feeds updated: '+updatedFeeds+', New messages: '+newMessages } },{"../lib/apidocs":426,"mdmanifest":241,"observ":276,"observ-debounce":275,"pull-abortable":303,"pull-cat":305,"pull-many":353,"pull-notify":354,"pull-paramap":363,"pull-stream":431}],452:[function(require,module,exports){ var pull = require('pull-stream') var Handshake = require('pull-handshake') var State = require('./state') var challenge_length = 64 var client_auth_length = 16+32+64 var server_auth_length = 16+64 var mac_length = 16 //client is Alice //create the client stream with the public key you expect to connect to. exports.client = exports.createClientStream = function (alice, app_key, timeout) { return function (bob_pub, cb) { var state = new State(app_key, alice, bob_pub) var stream = Handshake({timeout: timeout}, cb) var shake = stream.handshake delete stream.handshake function abort(err, reason) { if(err && err !== true) shake.abort(err, cb) else shake.abort(new Error(reason), cb) } shake.write(state.createChallenge()) shake.read(challenge_length, function (err, msg) { if(err) return abort(err, 'challenge not accepted') //create the challenge first, because we need to generate a local key if(!state.verifyChallenge(msg)) return abort(null, 'wrong protocol (version?)') shake.write(state.createClientAuth()) shake.read(server_auth_length, function (err, boxed_sig) { if(err) return abort(err, 'hello not accepted') if(!state.verifyServerAccept(boxed_sig)) return abort(null, 'server not authenticated') cb(null, shake.rest(), state.cleanSecrets()) }) }) return stream } } //server is Bob. exports.server = exports.createServerStream = function (bob, authorize, app_key, timeout) { return function (cb) { var state = new State(app_key, bob) var stream = Handshake({timeout: timeout}, cb) var shake = stream.handshake delete stream.handshake function abort (err, reason) { if(err && err !== true) shake.abort(err, cb) else shake.abort(new Error(reason), cb) } shake.read(challenge_length, function (err, challenge) { if(err) return abort(err, 'expected challenge') if(!state.verifyChallenge(challenge)) return shake.abort(new Error('wrong protocol/version')) shake.write(state.createChallenge()) shake.read(client_auth_length, function (err, hello) { if(err) return abort(err, 'expected hello') if(!state.verifyClientAuth(hello)) { //we know who the client was, but chose not to answer: if(state.remote.public) return abort(null, 'unauthenticated client:' + state.remote.public.toString('hex'), cb) //client dialed wrong number... (we don't know who they where) else return abort(null, 'wrong number') } //check if the user wants to speak to alice. authorize(state.remote.public, function (err, auth) { if(auth == null && !err) err = new Error('client unauthorized') if(!auth) return abort(err, 'client authentication rejected') state.auth = auth shake.write(state.createServerAccept()) cb(null, shake.rest(), state.cleanSecrets()) }) }) }) return stream } } },{"./state":461,"pull-handshake":329,"pull-stream":455}],453:[function(require,module,exports){ (function (Buffer){ var handshake = require('./handshake') var secure = require('./secure') exports.client = exports.createClient = function (alice, app_key, timeout) { var create = handshake.client(alice, app_key, timeout) return function (bob, cb) { if(!Buffer.isBuffer(bob) || bob.length != 32) throw new Error('createClient *must* be passed a public key') return create(bob, secure(cb)) } } exports.server = exports.createServer = function (bob, authorize, app_key, timeout) { var create = handshake.server(bob, authorize, app_key, timeout) return function (cb) { return create(secure(cb)) } } }).call(this,{"isBuffer":require("../is-buffer/index.js")}) },{"../is-buffer/index.js":170,"./handshake":452,"./secure":460}],454:[function(require,module,exports){ (function (Buffer){ var sodium = require('chloride') var net = require('net') var toPull = require('stream-to-pull-stream') var shs = require('./') var isBuffer = Buffer.isBuffer var pull = require('pull-stream') var Defer = require('pull-defer/duplex') function assertOpts (opts) { if(!(opts && 'object' === typeof opts)) throw new Error('opts *must* be provided') } function assertKeys (opts) { if(!( opts.keys && isBuffer(opts.keys.publicKey) && isBuffer(opts.keys.secretKey) )) throw new Error('opts.keys = ed25519 key pair *must* be provided.') } function assertAppKey (opts) { if(!isBuffer(opts.appKey)) throw new Error('appKey must be provided') } function assertAddr (addr) { if(!isBuffer(addr.key)) throw new Error('opts.key *must* be an ed25519 public key') if(!Number.isInteger(+addr.port)) throw new Error('opts.port *must* be provided') if(!('string' === typeof addr.host || null == addr.host)) throw new Error('opts.host must be string or null') } module.exports = function createNode (opts) { var keys = isBuffer(opts.seed) ? sodium.crypto_sign_seed_keypair(opts.seed) : opts.keys assertOpts(opts); assertKeys({keys: keys}); assertAppKey(opts) var create = shs.createClient(keys, opts.appKey, opts.timeout) return { publicKey: keys.publicKey, createServer: function (onConnect) { if('function' !== typeof opts.authenticate) throw new Error('function opts.authenticate(pub, cb)' + '*must* be provided in order to receive connections') var createServerStream = shs.createServer(keys, opts.authenticate, opts.appKey, opts.timeout) var server return server = net.createServer(function (stream) { stream = toPull.duplex(stream) pull( stream, createServerStream(function (err, stream) { if(err) return server.emit('unauthenticated', err) onConnect(stream) }), stream ) }) }, connect: function (addr, cb) { assertAddr(addr) var stream = toPull.duplex(net.connect(addr.port, addr.host)) if(cb) { pull( stream, create(addr.key, cb), stream ) } else { var defer = Defer() pull( stream, create(addr.key, function (err, stream) { if(err) defer.resolve({ source: function (abort, cb) { cb(err) }, sink: function (read) { read(err, function (){}) } }) else defer.resolve(stream) }), stream ) return defer } } } } }).call(this,{"isBuffer":require("../is-buffer/index.js")}) },{"../is-buffer/index.js":170,"./":453,"chloride":80,"net":58,"pull-defer/duplex":307,"pull-stream":455,"stream-to-pull-stream":593}],455:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":456,"./sinks":457,"./sources":458,"./throughs":459,"dup":232}],456:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],457:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],458:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],459:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":457,"./sources":458,"dup":236}],460:[function(require,module,exports){ (function (Buffer){ var sodium = require('chloride') var hash = sodium.crypto_hash_sha256 var pull = require('pull-stream') var boxes = require('pull-box-stream') var concat = Buffer.concat module.exports = function (cb) { return function (err, stream, state) { if(err) return cb(err) var en_key = hash(concat([state.secret, state.remote.public])) var de_key = hash(concat([state.secret, state.local.public])) var en_nonce = state.remote.app_mac.slice(0, 24) var de_nonce = state.local.app_mac.slice(0, 24) cb(null, { remote: state.remote.public, //on the server, attach any metadata gathered //during `authorize` call auth: state.auth, source: pull( stream.source, boxes.createUnboxStream(de_key, de_nonce) ), sink: pull( boxes.createBoxStream(en_key, en_nonce), stream.sink ) }) } } }).call(this,require("buffer").Buffer) },{"buffer":61,"chloride":80,"pull-box-stream":304,"pull-stream":455}],461:[function(require,module,exports){ (function (Buffer){ var sodium = require('chloride') var keypair = sodium.crypto_box_keypair var shared = sodium.crypto_scalarmult var hash = sodium.crypto_hash_sha256 var sign = sodium.crypto_sign_detached var verify = sodium.crypto_sign_verify_detached var auth = sodium.crypto_auth var verify_auth = sodium.crypto_auth_verify var curvify_pk = sodium.crypto_sign_ed25519_pk_to_curve25519 var curvify_sk = sodium.crypto_sign_ed25519_sk_to_curve25519 var box = sodium.crypto_secretbox_easy var unbox = sodium.crypto_secretbox_open_easy var concat = Buffer.concat var nonce = new Buffer(24); nonce.fill(0) var challenge_length = 64 var client_auth_length = 16+32+64 var server_auth_length = 16+64 var mac_length = 16 //this is a simple secure handshake, //the client public key is passed in plain text, module.exports = State function State (app_key, local, remote) { if(!(this instanceof State)) return new State(app_key, local, remote) this.app_key = app_key var kx = keypair() this.local = { kx_pk: kx.publicKey, kx_sk: kx.secretKey, public: local.publicKey, secret: local.secretKey } this.remote = { public: remote || null } } var proto = State.prototype proto.createChallenge = function createChallenge () { var state = this state.local.app_mac = auth(state.local.kx_pk, state.app_key) return concat([state.local.app_mac, state.local.kx_pk]) } proto.verifyChallenge = function verifyChallenge (challenge) { var state = this var mac = challenge.slice(0, 32) var remote_pk = challenge.slice(32, challenge.length) if(0 !== verify_auth(mac, remote_pk, state.app_key)) return null state.remote.kx_pk = remote_pk state.remote.app_mac = mac state.secret = shared(state.local.kx_sk, state.remote.kx_pk) state.shash = hash(state.secret) return true } proto.createClientAuth = function createClientAuth () { var state = this //now we have agreed on the secret. //this can be an encryption secret, //or a hmac secret. // shared(local.kx, remote.public) var a_bob = shared(state.local.kx_sk, curvify_pk(state.remote.public)) state.a_bob = a_bob state.secret2 = hash(concat([state.app_key, state.secret, a_bob])) var signed = concat([state.app_key, state.remote.public, state.shash]) var sig = sign(signed, state.local.secret) state.local.hello = Buffer.concat([sig, state.local.public]) return box(state.local.hello, nonce, state.secret2) } proto.verifyClientAuth = function verifyClientAuth (data) { var state = this var a_bob = shared(curvify_sk(state.local.secret), state.remote.kx_pk) state.a_bob = a_bob state.secret2 = hash(concat([state.app_key, state.secret, a_bob])) state.remote.hello = unbox(data, nonce, state.secret2) if(!state.remote.hello) return null var sig = state.remote.hello.slice(0, 64) var public = state.remote.hello.slice(64, client_auth_length) var signed = concat([state.app_key, state.local.public, state.shash]) if(!verify(sig, signed, public)) return null state.remote.public = public return true } proto.createServerAccept = function createServerAccept () { var state = this //shared key between my local ephemeral key + remote public var b_alice = shared(state.local.kx_sk, curvify_pk(state.remote.public)) state.b_alice = b_alice state.secret3 = hash(concat([state.app_key, state.secret, state.a_bob, state.b_alice])) var signed = concat([state.app_key, state.remote.hello, state.shash]) var okay = sign(signed, state.local.secret) return box(okay, nonce, state.secret3) } proto.verifyServerAccept = function verifyServerAccept (boxed_okay) { var state = this var b_alice = shared(curvify_sk(state.local.secret), state.remote.kx_pk) state.b_alice = b_alice // state.secret3 = hash(concat([state.secret2, b_alice])) state.secret3 = hash(concat([state.app_key, state.secret, state.a_bob, state.b_alice])) var sig = unbox(boxed_okay, nonce, state.secret3) if(!sig) return null var signed = concat([state.app_key, state.local.hello, state.shash]) if(!verify(sig, signed, state.remote.public)) return null return true } proto.cleanSecrets = function cleanSecrets () { var state = this // clean away all the secrets for forward security. // use a different secret hash(secret3) in the rest of the session, // and so that a sloppy application cannot compromise the handshake. delete state.local.secret state.shash.fill(0) state.secret.fill(0) state.a_bob.fill(0) state.b_alice.fill(0) state.secret = hash(state.secret3) state.secret2.fill(0) state.secret3.fill(0) state.local.kx_sk.fill(0) delete state.shash delete state.secret2 delete state.secret3 delete state.a_bob delete state.b_alice delete state.local.kx_sk return state } }).call(this,require("buffer").Buffer) },{"buffer":61,"chloride":80}],462:[function(require,module,exports){ (function (Buffer){ var EventEmitter = require('events') var u = require('./util') var Hookable = require('hoox') function isFunction (f) { return 'function' === typeof f } function merge (a, b, mapper) { for(var k in b) { if(b[k] && 'object' === typeof b[k] && !Buffer.isBuffer(b[k])) merge(a[k] = {}, b[k], mapper) else a[k] = mapper(b[k], k) } return a } module.exports = function (plugins) { function create (opts) { //change event emitter to something with more rigorous security? var api = new EventEmitter() create.plugins.forEach(function (plug) { var _api = plug.init.call({createClient: create.createClient}, api, opts) if(plug.name) { var o = {}; o[plug.name] = _api; _api = o } api = merge(api, _api, function (v, k) { if ('function' === typeof v) { v = Hookable(v) if (plug.manifest && plug.manifest[k] === 'sync') { u.hookOptionalCB(v) } } return v }) }) return api } create.plugins = [] create.manifest = {} create.permissions = {} create.use = function (plug) { if(isFunction(plug)) return create.plugins.push({init: plug}), create if(!plug.init) throw new Error('plugins *must* have "init" method') var name = plug.name if(plug.manifest) create.manifest = u.merge.manifest(create.manifest, plug.manifest, name) if(plug.permissions) create.permissions = u.merge.permissions(create.permissions, plug.permissions, name) create.plugins.push(plug) return create } ;[].concat(plugins).filter(Boolean).forEach(create.use) return create } }).call(this,{"isBuffer":require("../is-buffer/index.js")}) },{"../is-buffer/index.js":170,"./util":470,"events":144,"hoox":162}],463:[function(require,module,exports){ (function (Buffer){ var u = require('./util') var Api = require('./api') var Muxrpc = require('muxrpc') var pull = require('pull-stream') var createNode = require('secret-handshake/net') var nonPrivate = require('non-private-ip') var Inactive = require('pull-inactivity') function isFunction (f) { return 'function' === typeof f } function isString (s) { return 'string' === typeof s } function each(obj, iter) { if(Array.isArray(obj)) return obj.forEach(iter) for(var k in obj) iter(obj[k], k, obj) } function toBuffer(base64) { if(Buffer.isBuffer(base64)) return base64 var i = base64.indexOf('.') return new Buffer(~i ? base64.substring(0, i) : base64, 'base64') } function toSodiumKeys (keys) { if(!(isString(keys.public) && isString(keys.private))) return keys return { publicKey: toBuffer(keys.public), secretKey: toBuffer(keys.private) } } function coearseAddress (address) { if(isString(address)) address = u.parseAddress(address) if(isString(address.key)) return { host: address.host, port: address.port, key: new Buffer( address.key .substring(1, address.key.indexOf('.')), 'base64' ) } return address } //opts must have appKey module.exports = function (opts) { var appKey = opts.appKey var defaultTimeout = ( opts.defaultTimeout || 5e3 // 5 seconds. ) var timeout_handshake if(opts.timers && !isNaN(opts.timers.inactivity)) defaultTimeout = opts.timers.inactivity if(opts.timers && !isNaN(opts.timers.handshake)) timeout_handshake = opts.timers.handshake timeout_handshake = timeout_handshake || 5e3 opts.permissions = opts.permissions || {} var create = Api(opts.permissions ? [{ permissions: opts.permissions, init: function () {} }]: null) create.createClient = function (opts) { if(opts.keys) opts.keys = toSodiumKeys(opts.keys) if(opts.seed) opts.seed = toBuffer(opts.seed) // opts.appKey = toBuffer(opts.appKey || appKey) var snet = createNode({ keys: opts.keys && toSodiumKeys(opts.keys), seed: opts.seed && toBuffer(opts.seed), appKey: toBuffer(opts.appKey || appKey), timeout: opts.timeout || (opts.timers && opts.timers.handshake) || 5e3 }) return function (address, cb) { address = coearseAddress(address) snet.connect(address, function (err, stream) { if(err) return cb(err) var rpc = Muxrpc(opts.manifest || create.manifest, {})({}) pull(stream, rpc.createStream(), stream) cb(null, rpc) }) } } return create.use({ manifest: { auth: 'async', address: 'sync', manifest: 'sync', }, init: function (api, opts, permissions, manifest) { var snet = createNode({ keys: opts.keys && toSodiumKeys(opts.keys), seed: opts.seed, appKey: toBuffer(opts.appKey || appKey), //**************************************** timeout: timeout_handshake, authenticate: function (pub, cb) { var id = '@'+u.toId(pub) api.auth(id, function (err, auth) { if(err) cb(err) else cb(null, auth || create.permissions.anonymous) }) } }) //use configured port, or a random user port. var port = opts.port || 1024+(~~(Math.random()*(65536-1024))) var host = opts.host || nonPrivate.v4 || nonPrivate.private.v4 || '127.0.0.1' var peers = api.peers = {} var server = snet.createServer(setupRPC) server.listen(port) function setupRPC (stream, manf, isClient) { var rpc = Muxrpc(create.manifest, manf || create.manifest)(api, stream.auth) var timeout = opts.timeout == null ? defaultTimeout : opts.timeout var rpcStream = rpc.createStream() if(timeout > 0) rpcStream = Inactive(rpcStream, opts.timeout) pull(stream, rpcStream, stream) var id = rpc.id = '@'+u.toId(stream.remote) //keep track of current connections. if(!peers[id]) peers[id] = [] peers[id].push(rpc) rpc.once('closed', function () { peers[id].splice(peers[id].indexOf(rpc), 1) }) api.emit('rpc:connect', rpc, !!isClient) return rpc } return { //can be called remotely. publicKey: snet.publicKey, auth: function (pub, cb) { cb() }, address: function () { return this.getAddress() }, getAddress: function () { return [host, port, '@'+u.toId(snet.publicKey)].join(':') }, manifest: function () { return create.manifest }, getManifest: function () { return this.manifest() }, //cannot be called remote. connect: function (address, cb) { address = coearseAddress(address) address.appKey = opts.appKey || appKey snet.connect(address, function (err, stream) { return err ? cb(err) : cb(null, setupRPC(stream, null, true)) }) }, close: function (err, cb) { if(isFunction(err)) cb = err, err = null api.closed = true server.close(function (err) { api.emit('close', err) cb && cb(err) }) if(err) { each(peers, function (connections, id) { each(connections, function (rpc) { rpc.close(err) }) }) } } } } }) } }).call(this,require("buffer").Buffer) },{"./api":462,"./util":470,"buffer":61,"muxrpc":261,"non-private-ip":464,"pull-inactivity":337,"pull-stream":465,"secret-handshake/net":454}],464:[function(require,module,exports){ var os = require('os') var ip = require('ip') //pick the first reasonable looking host. //this should *just work* when running on a vps. var isPrivate = ip.isPrivate function isNonPrivate (e) { return !isPrivate(e) } var address = module.exports = function (inter, filter) { inter = inter || os.networkInterfaces() filter = filter || isNonPrivate for(var k in inter) { for(var i in inter[k]) { var e = inter[k][i] // find a reasonable looking address if(!e.internal && filter(e.address, e)) return e.address } } } function isV4 (e) { return e.family === 'IPv4' } function isV6 (e) { return e.family === 'IPv6' } var private = module.exports.private = function (inter) { return address(inter, isPrivate) } module.exports.v4 = address(null, function (addr, e) { return isV4(e) && isNonPrivate(addr) }) module.exports.v6 = address(null, function (addr, e) { return isV6(e) && isNonPrivate(addr) }) private.v4 = address(null, function (addr, e) { return isV4(e) && isPrivate(addr) }) private.v6 = address(null, function (addr, e) { return isV6(e) && isPrivate(addr) }) module.exports.all = { public: { v4: module.exports.v4, v6: module.exports.v6 }, private: { v4: private.v4, v6: private.v6 } } if(!module.parent) { console.log(module.exports.all) } },{"ip":169,"os":279}],465:[function(require,module,exports){ arguments[4][179][0].apply(exports,arguments) },{"./maybe":466,"./sinks":467,"./sources":468,"./throughs":469,"dup":179,"pull-core":306}],466:[function(require,module,exports){ arguments[4][180][0].apply(exports,arguments) },{"dup":180,"pull-core":306}],467:[function(require,module,exports){ arguments[4][181][0].apply(exports,arguments) },{"dup":181}],468:[function(require,module,exports){ arguments[4][384][0].apply(exports,arguments) },{"dup":384}],469:[function(require,module,exports){ (function (process){ var u = require('pull-core') var sources = require('./sources') var sinks = require('./sinks') var prop = u.prop var id = u.id var tester = u.tester var map = exports.map = function (read, map) { map = prop(map) || id return function (abort, cb) { read(abort, function (end, data) { try { data = !end ? map(data) : null } catch (err) { return read(err, function () { return cb(err) }) } cb(end, data) }) } } var asyncMap = exports.asyncMap = function (read, map) { if(!map) return read return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } var paraMap = exports.paraMap = function (read, map, width) { if(!map) return read var ended = false, queue = [], _cb function drain () { if(!_cb) return var cb = _cb _cb = null if(queue.length) return cb(null, queue.shift()) else if(ended && !n) return cb(ended) _cb = cb } function pull () { read(null, function (end, data) { if(end) { ended = end return drain() } n++ map(data, function (err, data) { n-- queue.push(data) drain() }) if(n < width && !ended) pull() }) } var n = 0 return function (end, cb) { if(end) return read(end, cb) //abort //continue to read while there are less than 3 maps in flight _cb = cb if(queue.length || ended) pull(), drain() else pull() } return highWaterMark(asyncMap(read, map), width) } var filter = exports.filter = function (read, test) { //regexp test = tester(test) return function next (end, cb) { var sync, loop = true while(loop) { loop = false sync = true read(end, function (end, data) { if(!end && !test(data)) return sync ? loop = true : next(end, cb) cb(end, data) }) sync = false } } } var filterNot = exports.filterNot = function (read, test) { test = tester(test) return filter(read, function (e) { return !test(e) }) } var through = exports.through = function (read, op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } var take = exports.take = function (read, test) { var ended = false if('number' === typeof test) { var n = test; test = function () { return n -- } } return function (end, cb) { if(ended) return cb(ended) if(ended = end) return read(ended, cb) read(null, function (end, data) { if(ended = ended || end) return cb(ended) if(!test(data)) { ended = true read(true, function (end, data) { cb(ended, data) }) } else cb(null, data) }) } } var unique = exports.unique = function (read, field, invert) { field = prop(field) || id var seen = {} return filter(read, function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } var nonUnique = exports.nonUnique = function (read, field) { return unique(read, field, true) } var group = exports.group = function (read, size) { var ended; size = size || 5 var queue = [] return function (end, cb) { //this means that the upstream is sending an error. if(end) return read(ended = end, cb) //this means that we read an end before. if(ended) return cb(ended) read(null, function next(end, data) { if(ended = ended || end) { if(!queue.length) return cb(ended) var _queue = queue; queue = [] return cb(null, _queue) } queue.push(data) if(queue.length < size) return read(null, next) var _queue = queue; queue = [] cb(null, _queue) }) } } var flatten = exports.flatten = function (read) { var _read return function (abort, cb) { if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (end, data) { if(end) nextStream() else cb(null, data) }) } function nextStream () { read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream) || stream && 'object' === typeof stream) stream = sources.values(stream) else if('function' != typeof stream) throw new Error('expected stream of streams') _read = stream nextChunk() }) } } } var prepend = exports.prepend = function (read, head) { return function (abort, cb) { if(head !== null) { if(abort) return read(abort, cb) var _head = head head = null cb(null, _head) } else { read(abort, cb) } } } //var drainIf = exports.drainIf = function (op, done) { // sinks.drain( //} var _reduce = exports._reduce = function (read, reduce, initial) { return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) sinks.drain(function (item) { initial = reduce(initial, item) }, function (err, data) { ended = err || true if(!err) cb(null, initial) else cb(ended) }) (read) } } var nextTick = process.nextTick var highWaterMark = exports.highWaterMark = function (read, highWaterMark) { var buffer = [], waiting = [], ended, ending, reading = false highWaterMark = highWaterMark || 10 function readAhead () { while(waiting.length && (buffer.length || ended)) waiting.shift()(ended, ended ? null : buffer.shift()) if (!buffer.length && ending) ended = ending; } function next () { if(ended || ending || reading || buffer.length >= highWaterMark) return reading = true return read(ended || ending, function (end, data) { reading = false ending = ending || end if(data != null) buffer.push(data) next(); readAhead() }) } process.nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } var flatMap = exports.flatMap = function (read, mapper) { mapper = mapper || id var queue = [], ended return function (abort, cb) { if(queue.length) return cb(null, queue.shift()) else if(ended) return cb(ended) read(abort, function next (end, data) { if(end) ended = end else { var add = mapper(data) while(add && add.length) queue.push(add.shift()) } if(queue.length) cb(null, queue.shift()) else if(ended) cb(ended) else read(null, next) }) } } }).call(this,require('_process')) },{"./sinks":467,"./sources":468,"_process":295,"pull-core":306}],470:[function(require,module,exports){ (function (Buffer){ var isArray = Array.isArray var merge = require('map-merge') function isObject (o) { return o && 'object' === typeof o } function isString (s) { return 'string' === typeof s } var clone = exports.clone = function clone (obj, mapper) { function map(v, k) { return isObject(v) ? clone(v, mapper) : mapper(v, k) } if(isArray(obj)) return obj.map(map) else if(isObject(obj)) { var o = {} for(var k in obj) o[k] = map(obj[k], k) return o } else return map(obj) } exports.parseAddress = function (e) { if(isString(e)) { var parts = e.split(':') var e = { host: parts[0], port: +parts[1], key: fromId(parts[2]) } return e } return e } var fromId = exports.fromId = function (id) { return new Buffer(id.substring(0, id.indexOf('.')), 'base64') } exports.toId = function (pub) { return Buffer.isBuffer(pub) ? pub.toString('base64')+'.ed25519' : pub } exports.merge = { permissions: function (perms, _perms, name) { return merge(perms, clone(_perms, function (v) { return name ? name + '.' + v : v }) ) }, manifest: function (manf, _manf, name) { if(name) { var o = {}; o[name] = _manf; _manf = o } return merge(manf, _manf) } } exports.hookOptionalCB = function (syncFn) { // syncFn is a function that's expected to return its result or throw an error // we're going to hook it so you can optionally pass a callback syncFn.hook(function(fn, args) { // if a function is given as the last argument, treat it as a callback var cb = args[args.length - 1] if (typeof cb == 'function') { var res args.pop() // remove cb from the arguments try { res = fn.apply(this, args) } catch (e) { return cb(e) } cb(null, res) } else { // no cb provided, regular usage return fn.apply(this, args) } }) } }).call(this,require("buffer").Buffer) },{"buffer":61,"map-merge":239}],471:[function(require,module,exports){ module.exports = { decode: function (string) { return JSON.parse(string) }, encode: function (obj) { return JSON.stringify(obj, null, 2) }, buffer: false } },{}],472:[function(require,module,exports){ var level = require('level') var sublevel = require('level-sublevel/bytewise') var opts = require('./defaults') var SSB = require('./') module.exports = function (path, opts, keys) { opts = opts || require('./defaults') return SSB( sublevel(level(path, { valueEncoding: opts.codec })), opts, keys) } },{"./":474,"./defaults":473,"level":199,"level-sublevel/bytewise":478}],473:[function(require,module,exports){ module.exports = require('ssb-keys') module.exports.codec = require('./codec') module.exports.keys = module.exports },{"./codec":471,"ssb-keys":530}],474:[function(require,module,exports){ 'use strict'; var contpara = require('cont').para var pull = require('pull-stream') var pl = require('pull-level') var paramap = require('pull-paramap') var timestamp = require('monotonic-timestamp') var assert = require('assert') var ltgt = require('ltgt') var mlib = require('ssb-msgs') var explain = require('explain-error') var pdotjson = require('./package.json') var createFeed = require('ssb-feed') var cat = require('pull-cat') var ssbref = require('ssb-ref') var ssbKeys = require('ssb-keys') var Validator = require('ssb-feed/validator') var isFeedId = ssbref.isFeedId var isMsgId = ssbref.isMsgId var isBlobId = ssbref.isBlobId //var u = require('./util') //53 bit integer var MAX_INT = 0x1fffffffffffff function isNumber (n) { return typeof n === 'number' } function isString (s) { return 'string' === typeof s } function isObject (o) { return o && 'object' === typeof o && !Array.isArray(o) } function all (stream) { return function (cb) { pull(stream, pull.collect(cb)) } } function compare(a, b) { return a < b ? -1 : a > b ? 1 : 0 } function getVMajor () { var version = require('./package.json').version return (version.split('.')[0])|0 } module.exports = function (db, opts, keys) { var sysDB = db.sublevel('sys') var logDB = db.sublevel('log') var feedDB = db.sublevel('fd') var clockDB = db.sublevel('clk') var lastDB = db.sublevel('lst') var indexDB = db.sublevel('idx') var appsDB = db.sublevel('app') function get (db, key) { return function (cb) { db.get(key, cb) } } db.opts = opts db.add = Validator(db) db.pre(function (op, add, _batch) { var msg = op.value var id = op.key // index by sequence number add({ key: [msg.author, msg.sequence], value: id, type: 'put', prefix: clockDB }) // index my timestamp, used to generate feed. add({ key: [msg.timestamp, msg.author], value: id, type: 'put', prefix: feedDB }) var localtime = op.timestamp = timestamp() // index the latest message from each author add({ key: msg.author, value: {sequence: msg.sequence, ts: localtime }, type: 'put', prefix: lastDB }) // index messages in the order _received_ // this will be used to pass to plugins which // must create their indexes asyncly. add({ key: localtime, value: id, type: 'put', prefix: logDB }) indexMsg(add, localtime, id, msg) }) function indexMsg (add, localtime, id, msg) { //DECRYPT the message, if possible //to enable indexing. If external apis //are not provided that may access indexes //then this will not leak information. //otherwise, we may need to figure something out. var content = (keys && isString(msg.content)) ? ssbKeys.unbox(msg.content, keys) : msg.content if(!content) return if(isString(content.type)) add({ key: ['type', content.type.toString().substring(0, 32), localtime], value: id, type: 'put', prefix: indexDB }) mlib.indexLinks(content, function (obj, rel) { add({ key: ['link', msg.author, rel, obj.link, msg.sequence, id], value: obj, type: 'put', prefix: indexDB }) add({ key: ['_link', obj.link, rel, msg.author, msg.sequence, id], value: obj, type: 'put', prefix: indexDB }) }) } db.createFeed = function (keys) { return createFeed(db, keys, opts) } db.needsRebuild = function (cb) { sysDB.get('vmajor', function (err, dbvmajor) { dbvmajor = (dbvmajor|0) || 0 cb(null, dbvmajor < getVMajor()) }) } db.rebuildIndex = function (cb) { // remove all entries from the index pull( pl.read(indexDB, { keys: true, values: false }), paramap(function (key, cb) { indexDB.del(key, cb) }), pull.drain(null, next) ) function next (err) { if (err) return cb(err) // replay the log pull( db.createLogStream({ keys: true, values: true }), pull.map(function (msg) { var ops = [] function add (item) { ops.push(item) } indexMsg(add, msg.timestamp, msg.key, msg.value) return ops }), pull.flatten(), pl.write(indexDB, next2) ) function next2 (err) { if (err) return cb(err) sysDB.put('vmajor', getVMajor(), cb) } } } // opts standardized to work like levelup api function stdopts (opts) { opts = opts || {} if (opts.keys !== false) opts.keys = true if (opts.values !== false) opts.values = true return opts } function msgFmt (keys, values, obj) { if (keys && values) return obj if (keys) return obj.key if (values) return obj.value return null // i guess? } //TODO: eventually, this should filter out authors you do not follow. db.createFeedStream = function (opts) { opts = stdopts(opts) ltgt.toLtgt(opts, opts, function (value) { return [value, LO] }, LO, HI) var _keys = opts.keys var _values = opts.values opts.keys = false opts.values = true return pull( pl.read(feedDB, opts), lookup(_keys, _values) ) } //latest was stored as author: seq //but for the purposes of replication back pressure //we need to know when we last replicated with someone. //instead store as: {sequence: seq, ts: localtime} //then, peers can request a max number of posts per feed. function toSeq (latest) { return isNumber(latest) ? latest : latest.sequence } db.latest = function (opts) { return pull( pl.read(lastDB, opts), pull.map(function (data) { var d = {id: data.key, sequence: toSeq(data.value), ts: data.value.ts } return d }) ) } function lookup(keys, values) { return paramap(function (key, cb) { if(key.sync) return cb(null, key) if(!values) return cb(null, key) db.get(key, function (err, msg) { if (err) cb(err) else cb(null, msgFmt(keys, values, { key: key, value: msg })) }) }) } db.createHistoryStream = function (id, seq, live) { var _keys = true, _values = true, limit if(!isFeedId(id)) { var opts = stdopts(id) id = opts.id seq = opts.sequence || opts.seq || 0 live = !!opts.live limit = opts.limit _keys = opts.keys !== false _values = opts.values !== false } return pull( pl.read(clockDB, { gte: [id, seq], lte: [id, MAX_INT], live: live, keys: false, sync: opts && opts.sync, limit: limit, onAbort: opts && opts.onAbort }), lookup(_keys, _values) ) } db.createUserStream = function (opts) { opts = stdopts(opts) ltgt.toLtgt(opts, opts, function (value) { return [opts.id, value] }, LO, HI) var _keys = opts.keys var _values = opts.values opts.keys = false opts.values = true return pull( pl.read(clockDB, opts), lookup(_keys, _values) ) } //writeStream - used in replication. db.createWriteStream = function (cb) { return pull( paramap(function (data, cb) { db.add(data, function (err, msg) { db.emit('invalid', err, msg) cb() }) }), pull.drain(null, cb) ) } db.createFeed = function (keys) { if(!keys) keys = opts.keys.generate() return createFeed(db, keys, opts) } db.latestSequence = function (id, cb) { lastDB.get(id, cb) } db.getLatest = function (id, cb) { lastDB.get(id, function (err, v) { if(err) return cb(err) clockDB.get([id, toSeq(v)], function (err, hash) { if(err) return cb(err) db.get(hash, function (err, msg) { cb(err, {key: hash, value: msg}) }) }) }) } db.createLogStream = function (opts) { opts = stdopts(opts) var live = opts.live || opts.tail; delete opts.live var keys = opts.keys; delete opts.keys var values = opts.values; delete opts.values var old = pull( pl.read(logDB, opts), paramap(function (data, cb) { if(data.sync) return cb(null, data) var key = data.value var seq = data.key db.get(key, function (err, value) { if (err) cb(err) else cb(null, msgFmt(keys, values, {key: key, value: value, timestamp: seq})) }) }) ) if(!live) return old return cat([old, pull.values([{sync: true}]), pl.live(db)]) } var HI = undefined, LO = null db.messagesByType = function (opts) { if(!opts) throw new Error('must provide {type: string} to messagesByType') if(isString(opts)) opts = {type: opts} opts = stdopts(opts) var _keys = opts.keys var _values = opts.values opts.values = true ltgt.toLtgt(opts, opts, function (value) { return ['type', opts.type, value] }, LO, HI) return pull( pl.read(indexDB, opts), paramap(function (data, cb) { var id = _keys ? data.value : data db.get(id, function (err, msg) { var ts = opts.keys ? data.key[2] : undefined cb(null, msgFmt(_keys, _values, {key: id, ts: ts, value: msg})) }) }), pull.filter() ) } function format(opts, op, key, value) { var meta = opts.meta !== false //default: true var keys = opts.keys !== false //default: true var vals = opts.values === true //default: false if(!meta&&!keys&&!vals) throw new Error('a stream without any values does not make sense') if(!meta) return ( keys && vals ? {key: op.key, value: value} : keys ? op.key : value ) else { if(vals) op.value = value if(!keys) delete op.key return op } } function type(t) { return {feed: '@', msg: '%', blob: '&'}[t] || t } db.links = function (opts) { if(!opts) throw new Error('opts *must* be provided') opts.meta = opts.meta !== false //default: true opts.keys = opts.keys !== false //default: true if(!opts.values&&!opts.meta&&!opts.keys) throw new Error('makes no sense to return stream without results' + 'set at least one of {keys, values, meta} to true') function tolink (v) { return (ssbref.isLink(v)) ? v : null } var src = type(opts.source), dst = type(opts.dest), rel = opts.rel var back = dst && !src var from = back ? dst : src, to = back ? src : dst function range(value, end, def) { return !value ? def : /^[@%&]$/.test(value) ? value + end : value } function lo(value) { return range(value, "!", LO) } function hi(value) { return range(value, "~", HI) } var index = back ? '_link' : 'link' var gte = [index, lo(from), rel || LO, lo(to), LO, LO] var lte = [index, hi(from), rel || HI, hi(to), HI, HI] function testLink (a, e) { //actual, expected return e ? e.length === 1 ? a[0]==e[0] : a===e : true } return pull( pl.read(indexDB, { gte: gte, lte: lte, live: opts.live, reverse: opts.reverse }), pull.map(function (op) { return { source: op.key[back?3:1], rel: op.key[2], dest: op.key[back?1:3], key: op.key[5] } }), // in case source and dest are known but not rel, // this will scan all links from the source // and filter out those to the dest. not efficient // but probably a rare query. pull.filter(function (data) { if(rel && rel !== data.rel) return false if(!testLink(data.dest, dst)) return false if(!testLink(data.source, src)) return false return true }), ! opts.values ? pull.map(function (op) { return format(opts, op, op.key, null) }) : paramap(function (op, cb) { db.get(op.key, function (err, msg) { if(err) return cb(err) cb(null, format(opts, op, op.key, msg)) }) }) ) } //get all messages that link to a given message. db.relatedMessages = function (opts, cb) { if(isString(opts)) opts = {key: opts} if(!opts) throw new Error('opts *must* be object') var key = opts.id || opts.key var n = 1 var msgs = {key: key, value: null} db.get(key, function (err, msg) { msgs.value = msg if (err && err.notFound) err = null // ignore not found done(err) }) related(msgs) function related (msg) { if (n<0) return n++ all(db.links({dest: msg.key, rel: opts.rel, keys: true, values:true, meta: false, type:'msg'})) (function (err, ary) { if(ary && ary.length) { ary.sort(function (a, b) { return compare(a.value.timestamp, b.value.timestamp) || compare(a.key, b.key) }) msg.related = ary ary.forEach(related) } done(err) }) } function count (msg) { if(!msg.related) return msg var c = 0 msg.related.forEach(function (_msg) { if(opts.parent) _msg.parent = msg.key c += 1 + (count(_msg).count || 0) }) if(opts.count) msg.count = c return msg } function done (err) { if(err && n > 0) { n = -1 return cb(err) } if(--n) return cb(null, count(msgs)) } } return db } },{"./package.json":505,"assert":15,"cont":86,"explain-error":146,"ltgt":226,"monotonic-timestamp":249,"pull-cat":305,"pull-level":487,"pull-paramap":363,"pull-stream":499,"ssb-feed":519,"ssb-feed/validator":521,"ssb-keys":530,"ssb-msgs":543,"ssb-ref":573}],475:[function(require,module,exports){ // require typewise first to extend with core typewise functionality require('typewise') // TODO: bytewise-binary encoding -- no hex parsing or toString hackery module.exports = require('bytewise-core') },{"bytewise-core":67,"typewise":627}],476:[function(require,module,exports){ // TODO: standard bytewise encoding constructor // TODO: enhance binary encoding with optional hex helpers module.exports = require('./binary') },{"./binary":475}],477:[function(require,module,exports){ // TODO: initialize and export a standard bytewise encoding, add hex and binary module.exports = require('./encoding/') },{"./encoding/":476}],478:[function(require,module,exports){ var nut = require('./nut') var shell = require('./shell') //the shell surrounds the nut var codec = require('levelup/lib/codec') var merge = require('xtend') var compare = require('typewiselite') var ReadStream = require('levelup/lib/read-stream') var precodec = require('./codec/bytewise') function id (e) { return e } module.exports = function (db, opts) { opts = merge(db.options, { keyEncoding: { encode: id, decode: id, buffer: true } }, opts) return shell ( nut ( db, precodec, codec, compare ), [], ReadStream, opts ) } },{"./codec/bytewise":479,"./nut":482,"./shell":485,"levelup/lib/codec":209,"levelup/lib/read-stream":212,"typewiselite":628,"xtend":504}],479:[function(require,module,exports){ var bytewise = require('bytewise') module.exports = { encode: bytewise.encode, decode: bytewise.decode, lowerBound: null, upperBound: undefined, buffer: true } },{"bytewise":477}],480:[function(require,module,exports){ var inRange = require('./range') module.exports = function (compare) { var hooks = [] return { add: function (range, hook) { var m = {range: range, hook: hook} hooks.push(m) //call this to remove return function () { var i = hooks.indexOf(m) if(~i) return hooks.splice(i, 1) } }, //remove all listeners within a range. //this will be used to close a sublevel. removeAll: function (range) { throw new Error('not implemented') }, trigger: function (key, args) { for(var i = 0; i < hooks.length; i++) { var test = hooks[i] if(inRange(test.range, key, compare)) test.hook.apply(this, args) } } } } },{"./range":484}],481:[function(require,module,exports){ (function (Buffer){ exports.compare = function (a, b) { if(Buffer.isBuffer(a)) { var l = Math.min(a.length, b.length) for(var i = 0; i < l; i++) { var cmp = a[i] - b[i] if(cmp) return cmp } return a.length - b.length } return a < b ? -1 : a > b ? 1 : 0 } function has(obj, key) { return Object.hasOwnProperty.call(obj, key) } // to be compatible with the current abstract-leveldown tests // nullish or empty strings. // I could use !!val but I want to permit numbers and booleans, // if possible. function isDef (val) { return val !== undefined && val !== '' } function has (range, name) { return Object.hasOwnProperty.call(range, name) } function hasKey(range, name) { return Object.hasOwnProperty.call(range, name) && name } var lowerBoundKey = exports.lowerBoundKey = function (range) { return ( hasKey(range, 'gt') || hasKey(range, 'gte') || hasKey(range, 'min') || (range.reverse ? hasKey(range, 'end') : hasKey(range, 'start')) || undefined ) } var lowerBound = exports.lowerBound = function (range) { var k = lowerBoundKey(range) return k && range[k] } exports.lowerBoundInclusive = function (range) { return has(range, 'gt') ? false : true } exports.upperBoundInclusive = function (range) { return has(range, 'lt') || !range.minEx ? false : true } var lowerBoundExclusive = exports.lowerBoundExclusive = function (range) { return has(range, 'gt') || range.minEx ? true : false } var upperBoundExclusive = exports.upperBoundExclusive = function (range) { return has(range, 'lt') ? true : false } var upperBoundKey = exports.upperBoundKey = function (range) { return ( hasKey(range, 'lt') || hasKey(range, 'lte') || hasKey(range, 'max') || (range.reverse ? hasKey(range, 'start') : hasKey(range, 'end')) || undefined ) } var upperBound = exports.upperBound = function (range) { var k = upperBoundKey(range) return k && range[k] } function id (e) { return e } exports.toLtgt = function (range, _range, map, lower, upper) { _range = _range || {} map = map || id var defaults = arguments.length > 3 var lb = exports.lowerBoundKey(range) var ub = exports.upperBoundKey(range) if(lb) { if(lb === 'gt') _range.gt = map(range.gt, false) else _range.gte = map(range[lb], false) } else if(defaults) _range.gte = map(lower, false) if(ub) { if(ub === 'lt') _range.lt = map(range.lt, true) else _range.lte = map(range[ub], true) } else if(defaults) _range.lte = map(upper, true) if(range.reverse != null) _range.reverse = !!range.reverse //if range was used mutably //(in level-sublevel it's part of an options object //that has more properties on it.) if(has(_range, 'max')) delete _range.max if(has(_range, 'min')) delete _range.min if(has(_range, 'start')) delete _range.start if(has(_range, 'end')) delete _range.end return _range } exports.contains = function (range, key, compare) { compare = compare || exports.compare var lb = lowerBound(range) if(isDef(lb)) { var cmp = compare(key, lb) if(cmp < 0 || (cmp === 0 && lowerBoundExclusive(range))) return false } var ub = upperBound(range) if(isDef(ub)) { var cmp = compare(key, ub) if(cmp > 0 || (cmp === 0) && upperBoundExclusive(range)) return false } return true } exports.filter = function (range, compare) { return function (key) { return exports.contains(range, key, compare) } } }).call(this,{"isBuffer":require("../../../../../is-buffer/index.js")}) },{"../../../../../is-buffer/index.js":170}],482:[function(require,module,exports){ var hooks = require('./hooks') var ltgt = require('ltgt') function isFunction (f) { return 'function' === typeof f } function getPrefix (db) { if(db == null) return db if(isFunction(db.prefix)) return db.prefix() return db } function has(obj, name) { return Object.hasOwnProperty.call(obj, name) } function clone (_obj) { var obj = {} for(var k in _obj) obj[k] = _obj[k] return obj } module.exports = function (db, precodec, codec, compare) { var prehooks = hooks(compare) var posthooks = hooks(compare) var waiting = [], ready = false function encodePrefix(prefix, key, opts1, opts2) { return precodec.encode([ prefix, codec.encodeKey(key, opts1, opts2 ) ]) } function decodePrefix(data) { return precodec.decode(data) } function addEncodings(op, prefix) { if(prefix && prefix.options) { op.keyEncoding = op.keyEncoding || prefix.options.keyEncoding op.valueEncoding = op.valueEncoding || prefix.options.valueEncoding } return op } function start () { ready = true while(waiting.length) waiting.shift()() } if(isFunction(db.isOpen)) { if(db.isOpen()) ready = true else db.open(start) } else { db.open(start) } return { apply: function (ops, opts, cb) { //apply prehooks here. for(var i = 0; i < ops.length; i++) { var op = ops[i] function add(op) { if(op === false) return delete ops[i] ops.push(op) } addEncodings(op, op.prefix) op.prefix = getPrefix(op.prefix) prehooks.trigger([op.prefix, op.key], [op, add, ops]) } opts = opts || {} if('object' !== typeof opts) throw new Error('opts must be object, was:'+ opts) if('function' === typeof opts) cb = opts, opts = {} if(ops.length) (db.db || db).batch( ops.map(function (op) { return { key: encodePrefix(op.prefix, op.key, opts, op), value: op.type !== 'del' ? codec.encodeValue( op.value, opts, op ) : undefined, type: op.type || (op.value === undefined ? 'del' : 'put') } }), opts, function (err) { if(err) return cb(err) ops.forEach(function (op) { posthooks.trigger([op.prefix, op.key], [op]) }) cb() } ) else cb() }, get: function (key, prefix, opts, cb) { opts.asBuffer = codec.isValueAsBuffer(opts) return (db.db || db).get( encodePrefix(prefix, key, opts), opts, function (err, value) { if(err) cb(err) else cb(null, codec.decodeValue(value, opts)) } ) }, pre: prehooks.add, post: posthooks.add, createDecoder: function (opts) { if(opts.keys !== false && opts.values !== false) return function (key, value) { return { key: codec.decodeKey(precodec.decode(key)[1], opts), value: codec.decodeValue(value, opts) } } if(opts.values !== false) return function (_, value) { return codec.decodeValue(value, opts) } if(opts.keys !== false) return function (key) { return codec.decodeKey(precodec.decode(key)[1], opts) } return function () {} }, isOpen: function isOpen() { if (db.db && isFunction(db.db.isOpen)) return db.db.isOpen() return db.isOpen() }, isClosed: function isClosed() { if (db.db && isFunction(db.db.isClosed)) return db.db.isClosed() return db.isClosed() }, close: function close (cb) { return db.close(cb) }, iterator: function (_opts, cb) { var opts = clone(_opts || {}) var prefix = _opts.prefix || [] function encodeKey(key) { return encodePrefix(prefix, key, opts, {}) } ltgt.toLtgt(_opts, opts, encodeKey, precodec.lowerBound, precodec.upperBound) // if these legacy values are in the options, remove them opts.prefix = null //************************************************ //hard coded defaults, for now... //TODO: pull defaults and encoding out of levelup. opts.keyAsBuffer = opts.valueAsBuffer = false //************************************************ //this is vital, otherwise limit: undefined will //create an empty stream. if ('number' !== typeof opts.limit) opts.limit = -1 opts.keyAsBuffer = precodec.buffer opts.valueAsBuffer = codec.isValueAsBuffer(opts) function wrapIterator (iterator) { return { next: function (cb) { return iterator.next(cb) }, end: function (cb) { iterator.end(cb) } } } if(ready) return wrapIterator((db.db || db).iterator(opts)) else waiting.push(function () { cb(null, wrapIterator((db.db || db).iterator(opts))) }) } } } },{"./hooks":480,"ltgt":481}],483:[function(require,module,exports){ module.exports={ "_args": [ [ "level-sublevel@^6.5.2", "/Users/joran/Documents/development/patchdeck/node_modules/secure-scuttlebutt" ] ], "_from": "level-sublevel@>=6.5.2 <7.0.0", "_id": "level-sublevel@6.5.4", "_inCache": true, "_installable": true, "_location": "/secure-scuttlebutt/level-sublevel", "_nodeVersion": "5.3.0", "_npmUser": { "email": "dominic.tarr@gmail.com", "name": "dominictarr" }, "_npmVersion": "3.3.12", "_phantomChildren": { "pull-core": "1.0.0" }, "_requested": { "name": "level-sublevel", "raw": "level-sublevel@^6.5.2", "rawSpec": "^6.5.2", "scope": null, "spec": ">=6.5.2 <7.0.0", "type": "range" }, "_requiredBy": [ "/secure-scuttlebutt" ], "_resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-6.5.4.tgz", "_shasum": "92e6534e7ac3fa35c8bdb121b8a8094a8d1c0826", "_shrinkwrap": null, "_spec": "level-sublevel@^6.5.2", "_where": "/Users/joran/Documents/development/patchdeck/node_modules/secure-scuttlebutt", "author": { "email": "dominic.tarr@gmail.com", "name": "Dominic Tarr", "url": "http://dominictarr.com" }, "bugs": { "url": "https://github.com/dominictarr/level-sublevel/issues" }, "dependencies": { "bytewise": "~1.1.0", "levelup": "~0.19.0", "ltgt": "~2.1.1", "pull-stream": "~2.21.0", "typewiselite": "~1.0.0", "xtend": "~4.0.0" }, "description": "partition levelup databases", "devDependencies": { "level": "^1.4.0", "level-test": "^2.0.1", "monotonic-timestamp": "0.0.8", "pull-level": "~1.1.1", "rimraf": "~2.1.4", "shasum": "0.0.2", "stream-to-pull-stream": "~1.2.0", "tape": "~2.14.0", "through": "~2.3.4" }, "directories": {}, "dist": { "shasum": "92e6534e7ac3fa35c8bdb121b8a8094a8d1c0826", "tarball": "http://registry.npmjs.org/level-sublevel/-/level-sublevel-6.5.4.tgz" }, "gitHead": "fa1b7121f9632b637e650cc1ec9b1723b60df864", "homepage": "https://github.com/dominictarr/level-sublevel", "license": "MIT", "maintainers": [ { "name": "dominictarr", "email": "dominic.tarr@gmail.com" } ], "name": "level-sublevel", "optionalDependencies": {}, "readme": "ERROR: No README data found!", "repository": { "type": "git", "url": "git://github.com/dominictarr/level-sublevel.git" }, "scripts": { "test": "set -e; for t in test/*.js; do node $t; done" }, "stability": "unstable", "testling": { "browsers": [ "android-browser/4.2..latest", "chrome/22..latest", "chrome/canary", "firefox/17..latest", "firefox/nightly", "ie/8..latest", "ipad/6.0..latest", "iphone/6.0..latest", "opera/12..latest", "opera/next", "safari/5.1..latest" ], "files": "test/*.js" }, "version": "6.5.4" } },{}],484:[function(require,module,exports){ (function (Buffer){ var ltgt = require('ltgt') //compare two array items function isArrayLike (a) { return Array.isArray(a) || Buffer.isBuffer(a) } function isPrimitive (a) { return 'string' === typeof a || 'number' === typeof a } function has(o, k) { return Object.hasOwnProperty.call(o, k) } function compare (a, b) { if(isArrayLike(a) && isArrayLike(b)) { var l = Math.min(a.length, b.length) for(var i = 0; i < l; i++) { var c = compare(a[i], b[i]) if(c) return c } return a.length - b.length } if(isPrimitive(a) && isPrimitive(b)) return a < b ? -1 : a > b ? 1 : 0 throw new Error('items not comparable:' + JSON.stringify(a) + ' ' + JSON.stringify(b)) } //this assumes that the prefix is of the form: // [Array, string] function prefix (a, b) { if(a.length > b.length) return false var l = a.length - 1 var lastA = a[l] var lastB = b[l] if(typeof lastA !== typeof lastB) return false if('string' == typeof lastA && 0 != lastB.indexOf(lastA)) return false //handle cas where there is no key prefix //(a hook on an entire sublevel) if(a.length == 1 && isArrayLike(lastA)) l ++ while(l--) { if(compare(a[l], b[l])) return false } return true } exports = module.exports = function (range, key, _compare) { _compare = _compare || compare //handle prefix specially, //check that everything up to the last item is equal //then check the last item starts with if(isArrayLike(range)) return prefix(range, key) return ltgt.contains(range, key, _compare) } function addPrefix(prefix, range) { var o = ltgt.toLtgt(range, null, function (key) { return [prefix, key] }) //if there where no ranges, then then just use a prefix. if(!has(o, 'gte') && !has(o, 'lte')) return [prefix] return o } exports.compare = compare exports.prefix = prefix exports.addPrefix = addPrefix }).call(this,{"isBuffer":require("../../../is-buffer/index.js")}) },{"../../../is-buffer/index.js":170,"ltgt":481}],485:[function(require,module,exports){ (function (process){ var EventEmitter = require('events').EventEmitter var addpre = require('./range').addPrefix var errors = require('levelup/lib/errors') function isFunction (f) { return 'function' === typeof f } function isString (s) { return 'string' === typeof s } function isObject (o) { return o && 'object' === typeof o } var version = require('./package.json').version var sublevel = module.exports = function (nut, prefix, createStream, options) { var emitter = new EventEmitter() emitter.sublevels = {} emitter.options = options emitter.version = version emitter.methods = {} prefix = prefix || [] function errback (err) { if (err) emitter.emit('error', err) } createStream = createStream || function (e) { return e } function mergeOpts(opts) { var o = {} if(options) for(var k in options) if(options[k] != undefined)o[k] = options[k] if(opts) for(var k in opts) if(opts[k] != undefined) o[k] = opts[k] return o } emitter.put = function (key, value, opts, cb) { if('function' === typeof opts) cb = opts, opts = {} if(!cb) cb = errback nut.apply([{ key: key, value: value, prefix: prefix.slice(), type: 'put' }], mergeOpts(opts), function (err) { if(!err) { emitter.emit('put', key, value); cb(null) } if(err) return cb(err) }) } emitter.prefix = function () { return prefix.slice() } emitter.del = function (key, opts, cb) { if('function' === typeof opts) cb = opts, opts = {} if(!cb) cb = errback nut.apply([{ key: key, prefix: prefix.slice(), type: 'del' }], mergeOpts(opts), function (err) { if(!err) { emitter.emit('del', key); cb(null) } if(err) return cb(err) }) } emitter.batch = function (ops, opts, cb) { if('function' === typeof opts) cb = opts, opts = {} if(!cb) cb = errback ops = ops.map(function (op) { return { key: op.key, value: op.value, prefix: op.prefix || prefix, keyEncoding: op.keyEncoding, // * valueEncoding: op.valueEncoding, // * (TODO: encodings on sublevel) type: op.type } }) nut.apply(ops, mergeOpts(opts), function (err) { if(!err) { emitter.emit('batch', ops); cb(null) } if(err) return cb(err) }) } emitter.get = function (key, opts, cb) { if('function' === typeof opts) cb = opts, opts = {} nut.get(key, prefix, mergeOpts(opts), function (err, value) { if(err) cb(new errors.NotFoundError('Key not found in database', err)) else cb(null, value) }) } emitter.clone = function(opts) { return sublevel(nut, prefix, createStream, mergeOpts(opts)) } emitter.sublevel = function (name, opts) { return emitter.sublevels[name] = emitter.sublevels[name] || sublevel(nut, prefix.concat(name), createStream, mergeOpts(opts)) } emitter.pre = function (key, hook) { if(isFunction(key)) return nut.pre([prefix], key) if(isString(key)) return nut.pre([prefix, key], hook) if(isObject(key)) return nut.pre(addpre(prefix, key), hook) throw new Error('not implemented yet') } emitter.post = function (key, hook) { if(isFunction(key)) return nut.post([prefix], key) if(isString(key)) return nut.post([prefix, key], hook) if(isObject(key)) return nut.post(addpre(prefix, key), hook) //TODO: handle ranges, needed for level-live-stream, etc. throw new Error('not implemented yet') } emitter.readStream = emitter.createReadStream = function (opts) { opts = mergeOpts(opts) opts.prefix = prefix var stream var it = nut.iterator(opts, function (err, it) { stream.setIterator(it) }) stream = createStream(opts, nut.createDecoder(opts)) if(it) stream.setIterator(it) return stream } emitter.valueStream = emitter.createValueStream = function (opts) { opts = opts || {} opts.values = true opts.keys = false return emitter.createReadStream(opts) } emitter.keyStream = emitter.createKeyStream = function (opts) { opts = opts || {} opts.values = false opts.keys = true return emitter.createReadStream(opts) } emitter.close = function (cb) { //TODO: deregister all hooks cb = cb || function () {} if (!prefix.length) nut.close(cb) else process.nextTick(cb) } emitter.isOpen = nut.isOpen emitter.isClosed = nut.isClosed return emitter } }).call(this,require('_process')) },{"./package.json":483,"./range":484,"_process":295,"events":144,"levelup/lib/errors":211}],486:[function(require,module,exports){ arguments[4][345][0].apply(exports,arguments) },{"dup":345}],487:[function(require,module,exports){ var pull = require('pull-stream') var toPull = require('stream-to-pull-stream') var pushable = require('pull-pushable') var cat = require('pull-cat') var pw = require('pull-window') var post = require('level-post') function read(db, opts) { return toPull.read1(db.createReadStream(opts)) } var live = exports.live = function (db, opts) { opts = opts || {} var l = pushable(function (err) { if(opts.onAbort) opts.onAbort(err) cleanup() }) var cleanup = post(db, opts, function (ch) { if(opts.keys === false) l.push(ch.value) else if(opts.values === false) l.push(ch.key) else l.push(ch) }) return l } exports.read = exports.readStream = exports.createReadStream = function (db, opts) { opts = opts || {} if(!(opts.tail || opts.live)) return read(db, opts) //optionally notify when we switch from reading history to realtime var sync = opts.onSync && function (abort, cb) { opts.onSync(abort); cb(abort || true) } if(opts.onSync === true || opts.sync === true) sync = pull.values([{sync: true}]) return cat([read(db, opts), sync, live(db, opts)]) } exports.write = exports.writeStream = exports.createWriteStream = function (db, opts, done) { if('function' === typeof opts) done = opts, opts = null opts = opts || {} return pull( pull.map(function (e) { if(e.type) return e return { key : e.key, value : e.value, type : e.value == null ? 'del' : 'put' } }), pw.recent(opts.windowSize, opts.windowTime), pull.asyncMap(function (batch, cb) { db.batch(batch, cb) }), pull.drain(null, done) ) } },{"level-post":198,"pull-cat":305,"pull-pushable":493,"pull-stream":488,"pull-window":390,"stream-to-pull-stream":593}],488:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":489,"./sinks":490,"./sources":491,"./throughs":492,"dup":232}],489:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],490:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],491:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],492:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":490,"./sources":491,"dup":236}],493:[function(require,module,exports){ arguments[4][346][0].apply(exports,arguments) },{"dup":346,"pull-stream":494}],494:[function(require,module,exports){ arguments[4][347][0].apply(exports,arguments) },{"./maybe":495,"./sinks":496,"./sources":497,"./throughs":498,"dup":347,"pull-core":486}],495:[function(require,module,exports){ arguments[4][348][0].apply(exports,arguments) },{"dup":348,"pull-core":486}],496:[function(require,module,exports){ arguments[4][349][0].apply(exports,arguments) },{"dup":349}],497:[function(require,module,exports){ arguments[4][350][0].apply(exports,arguments) },{"dup":350}],498:[function(require,module,exports){ (function (process){ var u = require('pull-core') var sources = require('./sources') var sinks = require('./sinks') var prop = u.prop var id = u.id var tester = u.tester var map = exports.map = function (read, map) { map = prop(map) || id return function (end, cb) { read(end, function (end, data) { var data = !end ? map(data) : null cb(end, data) }) } } var asyncMap = exports.asyncMap = function (read, map) { if(!map) return read return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } var paraMap = exports.paraMap = function (read, map, width) { if(!map) return read var ended = false, queue = [], _cb function drain () { if(!_cb) return var cb = _cb _cb = null if(queue.length) return cb(null, queue.shift()) else if(ended && !n) return cb(ended) _cb = cb } function pull () { read(null, function (end, data) { if(end) { ended = end return drain() } n++ map(data, function (err, data) { n-- queue.push(data) drain() }) if(n < width && !ended) pull() }) } var n = 0 return function (end, cb) { if(end) return read(end, cb) //abort //continue to read while there are less than 3 maps in flight _cb = cb if(queue.length || ended) pull(), drain() else pull() } return highWaterMark(asyncMap(read, map), width) } var filter = exports.filter = function (read, test) { //regexp test = tester(test) return function next (end, cb) { read(end, function (end, data) { if(!end && !test(data)) return next(end, cb) cb(end, data) }) } } var filterNot = exports.filterNot = function (read, test) { test = tester(test) return filter(read, function (e) { return !test(e) }) } var through = exports.through = function (read, op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } var take = exports.take = function (read, test) { var ended = false if('number' === typeof test) { var n = test; test = function () { return n -- } } return function (end, cb) { if(ended) return cb(ended) if(ended = end) return read(ended, cb) read(null, function (end, data) { if(ended = ended || end) return cb(ended) if(!test(data)) { ended = true read(true, function (end, data) { cb(ended, data) }) } else cb(null, data) }) } } var unique = exports.unique = function (read, field, invert) { field = prop(field) || id var seen = {} return filter(read, function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } var nonUnique = exports.nonUnique = function (read, field) { return unique(read, field, true) } var group = exports.group = function (read, size) { var ended; size = size || 5 var queue = [] return function (end, cb) { //this means that the upstream is sending an error. if(end) return read(ended = end, cb) //this means that we read an end before. if(ended) return cb(ended) read(null, function next(end, data) { if(ended = ended || end) { if(!queue.length) return cb(ended) var _queue = queue; queue = [] return cb(null, _queue) } queue.push(data) if(queue.length < size) return read(null, next) var _queue = queue; queue = [] cb(null, _queue) }) } } var flatten = exports.flatten = function (read) { var _read return function (abort, cb) { if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (end, data) { if(end) nextStream() else cb(null, data) }) } function nextStream () { read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream)) stream = sources.values(stream) else if('function' != typeof stream) throw new Error('expected stream of streams') _read = stream nextChunk() }) } } } var prepend = exports.prepend = function (read, head) { return function (abort, cb) { if(head !== null) { if(abort) return read(abort, cb) var _head = head head = null cb(null, _head) } else { read(abort, cb) } } } //var drainIf = exports.drainIf = function (op, done) { // sinks.drain( //} var _reduce = exports._reduce = function (read, reduce, initial) { return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) sinks.drain(function (item) { initial = reduce(initial, item) }, function (err, data) { ended = err || true if(!err) cb(null, initial) else cb(ended) }) (read) } } var nextTick = process.nextTick var highWaterMark = exports.highWaterMark = function (read, highWaterMark) { var buffer = [], waiting = [], ended, reading = false highWaterMark = highWaterMark || 10 function readAhead () { while(waiting.length && (buffer.length || ended)) waiting.shift()(ended, ended ? null : buffer.shift()) } function next () { if(ended || reading || buffer.length >= highWaterMark) return reading = true return read(ended, function (end, data) { reading = false ended = ended || end if(data != null) buffer.push(data) next(); readAhead() }) } nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } }).call(this,require('_process')) },{"./sinks":496,"./sources":497,"_process":295,"pull-core":486}],499:[function(require,module,exports){ arguments[4][179][0].apply(exports,arguments) },{"./maybe":500,"./sinks":501,"./sources":502,"./throughs":503,"dup":179,"pull-core":486}],500:[function(require,module,exports){ arguments[4][180][0].apply(exports,arguments) },{"dup":180,"pull-core":486}],501:[function(require,module,exports){ arguments[4][181][0].apply(exports,arguments) },{"dup":181}],502:[function(require,module,exports){ var keys = exports.keys = function (object) { return values(Object.keys(object)) } var once = exports.once = function (value) { return function (abort, cb) { if(abort) return cb(abort) if(value != null) { var _value = value; value = null cb(null, _value) } else cb(true) } } var values = exports.values = exports.readArray = function (array) { if(!Array.isArray(array)) array = Object.keys(array).map(function (k) { return array[k] }) var i = 0 return function (end, cb) { if(end) return cb && cb(end) cb(i >= array.length || null, array[i++]) } } var count = exports.count = function (max) { var i = 0; max = max || Infinity return function (end, cb) { if(end) return cb && cb(end) if(i > max) return cb(true) cb(null, i++) } } var infinite = exports.infinite = function (generate) { generate = generate || Math.random return function (end, cb) { if(end) return cb && cb(end) return cb(null, generate()) } } var defer = exports.defer = function () { var _read, cbs = [], _end var read = function (end, cb) { if(!_read) { _end = end cbs.push(cb) } else _read(end, cb) } read.resolve = function (read) { if(_read) throw new Error('already resolved') _read = read if(!_read) throw new Error('no read cannot resolve!' + _read) while(cbs.length) _read(_end, cbs.shift()) } read.abort = function(err) { read.resolve(function (_, cb) { cb(err || true) }) } return read } var empty = exports.empty = function () { return function (abort, cb) { cb(true) } } var depthFirst = exports.depthFirst = function (start, createStream) { var reads = [] reads.unshift(once(start)) return function next (end, cb) { if(!reads.length) return cb(true) reads[0](end, function (end, data) { if(end) { //if this stream has ended, go to the next queue reads.shift() return next(null, cb) } reads.unshift(createStream(data)) cb(end, data) }) } } //width first is just like depth first, //but push each new stream onto the end of the queue var widthFirst = exports.widthFirst = function (start, createStream) { var reads = [] reads.push(once(start)) return function next (end, cb) { if(!reads.length) return cb(true) reads[0](end, function (end, data) { if(end) { reads.shift() return next(null, cb) } reads.push(createStream(data)) cb(end, data) }) } } //this came out different to the first (strm) //attempt at leafFirst, but it's still a valid //topological sort. var leafFirst = exports.leafFirst = function (start, createStream) { var reads = [] var output = [] reads.push(once(start)) return function next (end, cb) { reads[0](end, function (end, data) { if(end) { reads.shift() if(!output.length) return cb(true) return cb(null, output.shift()) } reads.unshift(createStream(data)) output.unshift(data) next(null, cb) }) } } },{}],503:[function(require,module,exports){ (function (process){ var u = require('pull-core') var sources = require('./sources') var sinks = require('./sinks') var prop = u.prop var id = u.id var tester = u.tester var map = exports.map = function (read, map) { map = prop(map) || id return function (abort, cb) { read(abort, function (end, data) { try { data = !end ? map(data) : null } catch (err) { return read(err, function () { return cb(err) }) } cb(end, data) }) } } var asyncMap = exports.asyncMap = function (read, map) { if(!map) return read return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } var paraMap = exports.paraMap = function (read, map, width) { if(!map) return read var ended = false, queue = [], _cb function drain () { if(!_cb) return var cb = _cb _cb = null if(queue.length) return cb(null, queue.shift()) else if(ended && !n) return cb(ended) _cb = cb } function pull () { read(null, function (end, data) { if(end) { ended = end return drain() } n++ map(data, function (err, data) { n-- queue.push(data) drain() }) if(n < width && !ended) pull() }) } var n = 0 return function (end, cb) { if(end) return read(end, cb) //abort //continue to read while there are less than 3 maps in flight _cb = cb if(queue.length || ended) pull(), drain() else pull() } return highWaterMark(asyncMap(read, map), width) } var filter = exports.filter = function (read, test) { //regexp test = tester(test) return function next (end, cb) { var sync, loop = true while(loop) { loop = false sync = true read(end, function (end, data) { if(!end && !test(data)) return sync ? loop = true : next(end, cb) cb(end, data) }) sync = false } } } var filterNot = exports.filterNot = function (read, test) { test = tester(test) return filter(read, function (e) { return !test(e) }) } var through = exports.through = function (read, op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } var take = exports.take = function (read, test) { var ended = false if('number' === typeof test) { var n = test; test = function () { return n -- } } return function (end, cb) { if(ended) return cb(ended) if(ended = end) return read(ended, cb) read(null, function (end, data) { if(ended = ended || end) return cb(ended) if(!test(data)) { ended = true read(true, function (end, data) { cb(ended, data) }) } else cb(null, data) }) } } var unique = exports.unique = function (read, field, invert) { field = prop(field) || id var seen = {} return filter(read, function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } var nonUnique = exports.nonUnique = function (read, field) { return unique(read, field, true) } var group = exports.group = function (read, size) { var ended; size = size || 5 var queue = [] return function (end, cb) { //this means that the upstream is sending an error. if(end) return read(ended = end, cb) //this means that we read an end before. if(ended) return cb(ended) read(null, function next(end, data) { if(ended = ended || end) { if(!queue.length) return cb(ended) var _queue = queue; queue = [] return cb(null, _queue) } queue.push(data) if(queue.length < size) return read(null, next) var _queue = queue; queue = [] cb(null, _queue) }) } } var flatten = exports.flatten = function (read) { var _read return function (abort, cb) { if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (end, data) { if(end) nextStream() else cb(null, data) }) } function nextStream () { read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream)) stream = sources.values(stream) else if('function' != typeof stream) throw new Error('expected stream of streams') _read = stream nextChunk() }) } } } var prepend = exports.prepend = function (read, head) { return function (abort, cb) { if(head !== null) { if(abort) return read(abort, cb) var _head = head head = null cb(null, _head) } else { read(abort, cb) } } } //var drainIf = exports.drainIf = function (op, done) { // sinks.drain( //} var _reduce = exports._reduce = function (read, reduce, initial) { return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) sinks.drain(function (item) { initial = reduce(initial, item) }, function (err, data) { ended = err || true if(!err) cb(null, initial) else cb(ended) }) (read) } } var nextTick = process.nextTick var highWaterMark = exports.highWaterMark = function (read, highWaterMark) { var buffer = [], waiting = [], ended, ending, reading = false highWaterMark = highWaterMark || 10 function readAhead () { while(waiting.length && (buffer.length || ended)) waiting.shift()(ended, ended ? null : buffer.shift()) if (!buffer.length && ending) ended = ending; } function next () { if(ended || ending || reading || buffer.length >= highWaterMark) return reading = true return read(ended || ending, function (end, data) { reading = false ending = ending || end if(data != null) buffer.push(data) next(); readAhead() }) } process.nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } var flatMap = exports.flatMap = function (read, mapper) { mapper = mapper || id var queue = [], ended return function (abort, cb) { if(queue.length) return cb(null, queue.shift()) else if(ended) return cb(ended) read(abort, function next (end, data) { if(end) ended = end else { var add = mapper(data) while(add && add.length) queue.push(add.shift()) } if(queue.length) cb(null, queue.shift()) else if(ended) cb(ended) else read(null, next) }) } } }).call(this,require('_process')) },{"./sinks":501,"./sources":502,"_process":295,"pull-core":486}],504:[function(require,module,exports){ arguments[4][177][0].apply(exports,arguments) },{"dup":177}],505:[function(require,module,exports){ module.exports={ "_args": [ [ "secure-scuttlebutt@git+https://github.com/ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "/Users/joran/Documents/development/patchdeck/node_modules/scuttlebot" ] ], "_from": "git+https://github.com/ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "_id": "secure-scuttlebutt@15.0.5", "_inCache": true, "_installable": true, "_location": "/secure-scuttlebutt", "_phantomChildren": { "bytewise-core": "1.2.3", "level-post": "1.0.4", "levelup": "0.19.1", "pull-cat": "1.1.9", "pull-window": "2.1.3", "stream-to-pull-stream": "1.6.8", "typewise": "1.0.3", "typewiselite": "1.0.0" }, "_requested": { "hosted": { "directUrl": "https://raw.githubusercontent.com/ssbc/secure-scuttlebutt/b8de480bd262a69c357e80681dd60cf60c17681d/package.json", "gitUrl": "git://github.com/ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "httpsUrl": "git+https://github.com/ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "shortcut": "github:ssbc/secure-scuttlebutt#b8de480bd262a69c357e80681dd60cf60c17681d", "ssh": "git@github.com:ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "sshUrl": "git+ssh://git@github.com/ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "type": "github" }, "name": "secure-scuttlebutt", "raw": "secure-scuttlebutt@git+https://github.com/ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "rawSpec": "git+https://github.com/ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "scope": null, "spec": "git+https://github.com/ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "type": "hosted" }, "_requiredBy": [ "/scuttlebot" ], "_resolved": "git+https://github.com/ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "_shasum": "4c2fa68fd5ebd8d9ee0d4b27279cb9c156ed7868", "_shrinkwrap": null, "_spec": "secure-scuttlebutt@git+https://github.com/ssbc/secure-scuttlebutt.git#b8de480bd262a69c357e80681dd60cf60c17681d", "_where": "/Users/joran/Documents/development/patchdeck/node_modules/scuttlebot", "author": { "email": "dominic.tarr@gmail.com", "name": "Dominic Tarr", "url": "http://dominictarr.com" }, "bugs": { "url": "https://github.com/ssbc/secure-scuttlebutt/issues" }, "dependencies": { "cont": "~1.0.0", "deep-equal": "~0.2.1", "explain-error": "~1.0.1", "level": "^1.3.0", "level-sublevel": "^6.5.2", "ltgt": "~2.0.0", "monotonic-timestamp": "~0.0.8", "pull-cat": "~1.1.5", "pull-level": "~1.4.0", "pull-paramap": "~1.1.3", "pull-stream": "~2.24.1", "ssb-feed": "^2.0.0", "ssb-keys": "^5.0.0", "ssb-msgs": "^5.0.0", "ssb-ref": "^2.0.0" }, "description": "a secure, replicatable database", "devDependencies": { "deep-equal": "^0.2.1", "hexpp": "~1.1.3", "level-test": "^2.0.1", "multicb": "~0.0.2", "pull-abortable": "~4.1.0", "pull-randomly-split": "~1.0.4", "rimraf": "~2.2.8", "tape": "^4.2.2", "typewiselite": "~1.0.0" }, "gitHead": "b8de480bd262a69c357e80681dd60cf60c17681d", "homepage": "https://github.com/ssbc/secure-scuttlebutt", "license": "MIT", "name": "secure-scuttlebutt", "optionalDependencies": {}, "readme": "# secure-scuttlebutt\n\nA database of unforgable append-only feeds, optimized for efficient replication for peer to peer protocols.\n\n## What does it do?\n\nSecure-scuttlebutt provides tools for dealing with unforgeable append-only message \nfeeds. You can create a feed, post messages to that feed, verify a feed created by\nsomeone else, stream messages to and from feeds, and more (see [API](#API)).\n\n\"Unforgeable\" means that only the owner of a feed can modify that feed, as\nenforced by digital signing (see [Security properties](#security-properties)).\nThis property makes secure-scuttlebutt useful for peer-to-peer applications.\nSecure-scuttlebutt also makes it easy to encrypt messages.\n\n## Example\n\nIn this example, we create a feed, post a signed message to it, then create a stream \nthat reads from the feed.\n\n``` js\n/**\n * create a secure scuttlebutt instance and add a message to it.\n */\n\nvar pull = require('pull-stream')\n\n// paths:\nvar pathToDB = '/tmp/ssb1/'\nvar pathToSecret = '/tmp/ssb1-secret'\n\n// ways to create keys:\nvar keys = require('ssb-keys').generate()\nvar keys = require('ssb-keys').loadSync(pathToSecret)\nvar keys = require('ssb-keys').createSync(pathToSecret)\nvar keys = require('ssb-keys').loadOrCreateSync(pathToSecret)\n\n// create the db instance.\n// - uses leveldb.\n// - can only open one instance at a time.\n\nvar ssb = require('secure-scuttlebutt/create')(pathToDB)\n\n// create a feed.\n// - this represents a write access / user.\n// - you must pass in keys.\n// (see options section)\n\nvar feed = ssb.createFeed(keys)\n\n// publish a message.\n// - feed.add appends a message to your key's chain.\n// - the `type` attribute is required.\n\nfeed.add({ type: 'post', text: 'My First Post!' }, function (err, msg, hash) {\n // the message as it appears in the database:\n console.log(msg)\n\n // and its hash:\n console.log(hash)\n})\n\n// stream all messages for all keypairs.\npull(\n ssb.createFeedStream(),\n pull.collect(function (err, ary) {\n console.log(ary)\n })\n)\n\n// stream all messages for a particular keypair.\npull(\n ssb.createHistoryStream(feed.id),\n pull.collect(function (err, ary) {\n console.log(ary)\n })\n)\n```\n\n## Concepts\n\nBuilding upon secure-scuttlebutt requires understanding a few concepts\nthat it uses to ensure the unforgeability of message feeds.\n\n### Identities\n\nAn identity is simply a public/private key pair.\n\nEven though there is no worldwide store of identities, it's infeasible\nfor anyone to forge your identity. Identities are binary strings, so not\nparticularly human-readable.\n\n### Feeds\n\nA feed is an append-only sequence of messages. Each feed is associated\n1:1 with an identity. The feed is identified by its public key. This\nworks because public keys are unique.\n\nSince feeds are append-only, replication is simple: request all messages\nin the feed that are newer than the latest message you know about.\n\nNote that append-only really means append-only: you cannot delete an\nexisting message. If you want to enable entities to be deleted or \nmodified in your data model, that can be implemented in a layer on top \nof secure-scuttlebutt using \n[delta encoding](https://en.wikipedia.org/wiki/Delta_encoding). \n\n### Messages\n\nEach message contains:\n\n- A message object. This is the thing that the end user cares about. If\n there is no encryption, this is a `{}` object. If there is encryption,\n this is an encrypted string.\n- A content-hash of the previous message. This prevents somebody with\n the private key from changing the feed history after publishing, as a\n newly-created message wouldn't match the \"prev-hash\" of later messages\n which were already replicated.\n- The signing public key.\n- A signature. This prevents malicious parties from writing fake \n messages to a stream.\n- A sequence number. This prevents a malicious party from making a copy\n of the feed that omits or reorders messages.\n \nSince each message contains a reference to the previous message, a feed \nmust be replicated in order, starting with the first message. This is\nthe only way that the feed can be verified. A feed can be *viewed* in\nany order after it's been replicated.\n\n### Object ids\n\nThe text inside a message can refer to three types of secure-scuttlebutt\nentities: messages, feeds, and blobs (i.e. attachments). Messages and \nblobs are referred to by their hashes, but a feed is referred to by its\nsigning public key. Thus, a message within a feed can refer to another\nfeed, or to a particular point _within_ a feed.\n\nObject ids begin with a sigil `@` `%` and `&` for a `feedId`, `msgId`\nand `blobId` respectively.\n\nNote that secure-scuttlebutt does not include facilities for retrieving\na blob given the hash.\n\n### Replication\n\nIt is possible to easily replicate data between two SecureScuttlebutts.\nFirst, they exchange maps of their newest data. Then, each one downloads\nall data newer than its newest data.\n\n[Scuttlebot](https://github.com/ssbc/scuttlebot) is a tool that\nmakes it easy to replicate multiple SecureScuttlebutts using a\ndecentralized network.\n\n### Security properties\nSecure-scuttlebutt maintains useful security properties even when it is\nconnected to a malicious secure-scuttlebutt database. This makes it ideal\nas a store for peer-to-peer applications.\n\nImagine that we want to read from a feed for which we know the identity,\nbut we're connected to a malicious secure-scuttlebutt instance. As\nlong as the malicious database does not have the private key:\n\n- The malicious database cannot create a new feed with the same identifier\n- The malicious database cannot write new fake messages to the feed\n- The malicious database cannot reorder the messages in the feed\n- The malicious database cannot send us a new copy of the feed that omits\n messages from the middle\n- The malicious database *can* refuse to send us the feed, or only send\n us the first *N* messages in the feed\n- Messages may optionally be encrypted. See `test/end-to-end.js`.\n\n\n## API\n\n### ssb = require('secure-scuttlebutt/create')(path)\n\nCreate a secure-scuttlebutt database at the given path,\nreturns an instance.\n\n### require('secure-scuttlebutt')(db, opts)\n\nPass in a [levelup](https://github.com/rvagg/node-levelup) instance\n(it must have [sublevel](https://github.com/dominictarr/level-sublevel) installed),\nand an options object. The options object provides the crypto\nand encoding functions, that are not directly tied into how\nsecure-scuttlebutt works.\n\nThe following methods all apply to a `SecureScuttlebutt` instance\n\n### SecureScuttlebutt#createFeed (keys?)\n\nCreate a Feed object. A feed is a chain of messages signed\nby a single key (the identity of the feed).\nThis handles the state needed to append valid messages to a feed.\nIf keys are not provided, then a new key pair will be generated.\n\nThe following methods apply to the Feed type.\n\n#### Feed#add (message, cb)\n\nAdds a message of a given type to a feed.\nThis is the recommended way to append messages.\nmessage is a javascript object. It must be a `{}` object with a `type`\nproperty that is a string between 3 and 32 chars long.\n\n#### Feed#id\n\nthe id of the feed (which is the feed's public key)\n\n#### Feed#keys\n\nthe key pair for this feed.\n\n### SecureScuttlebutt#needsRebuild(cb)\n\nChecks the version stored in the database against the code version and\ncalls back true/false accordingly. This keeps the database in sync with\nmajor breaking changes to secure-scuttlebutt when they occur.\n\nShould be run at startup. If true, you should call `rebuildIndex` before\nusing the database.\n\n```js\nssb.needsRebuild(function (err, b) {\n if (b)\n ssb.rebuildIndex(next)\n})\n```\n\n### SecureScuttlebutt#rebuildIndex(cb)\n\nRebuilds the indexes by replaying history. See `needsRebuild`.\n\n### SecureScuttlebutt#createFeedStream (opts) -> PullSource\n\nCreate a [pull-stream](https://github.com/dominictarr/pull-stream)\nof all the feeds in the database, ordered by timestamps.\nAll [pull-level](https://github.com/dominictarr/pull-level) options\nare allowed (start, end, reverse, tail)\n\n### SecureScuttlebutt#createLogStream({gt: ts, tail: boolean}) -> PullSource\n\ncreate a stream of the messages that have been written to this instance\nin the order they arrived. This is mainly intended for building views.\nThe objects in this stream will be of the form:\n\n``` js\n{\n key: Hash, value: Message, timestamp: timestamp\n}\n```\n`timestamp` is generated by\n[monotonic-timestamp](https://github.com/dominictarr/monotonic-timestamp)\n\n### SecureScuttlebutt#createHistoryStream ({id: feedId, seq: int?, live: bool?}) -> PullSource\n\nCreate a stream of the history of `id`. If `seq > 0`, then\nonly stream messages with sequence numbers greater than `seq`.\nif `live` is true, the stream will be a\n[live mode](https://github.com/dominictarr/pull-level#example---reading)\n\n### SecureScuttlebutt#messagesByType ({type: string, live: bool?}) -> PullSource\n\nretrive messages with a given type. All messages must have a type,\nso this is a good way to select messages that an application might use.\nReturns a source pull-stream. This function takes all the options from [pull-level#read](https://github.com/dominictarr/pull-level#example---reading)\n(gt, lt, gte, lte, limit, reverse, live)\n\n\n### SecureScuttlebutt#links ({source: feedId?, dest: feedId|msgId|blobId?, rel: string?, meta: true?, keys: true?, values: false?, live:false?, reverse: false?}) -> PullSource\n\nGet a stream of links from a feed to a blob/msg/feed id.\n\nThe objects in this stream will be of the form:\n\n```\n{ source: feedId, rel: String, dest: Id, key: MsgId, value: Object? }\n```\n\n - `source` (string, optional): feed id..\n - `dest` (string, optional): An id or filter, specifying where the link should point to.\n To filter, just use the sigil of the type you want: `@` for feeds, `%` for messages, and `&` for blobs.\n - `rel` (string, optional): Filters the links by the relation string.\n\nIf `opts.values` is set (default: false) `value` will be the message the link occurs in.\nIf `opts.keys` is set (default: true) `key` will be the message id.\nIf `opts.meta` is unset (default: true) `source, hash, rel` will be left off.\n\n> Note: if `source`, and `dest` is provided, but not `rel`, ssb will\n> have to scan all the links from source, and then filter by dest.\n> your query will be more efficient if you also provide `rel`.\n\n\n### SecureScuttlebutt#relatedMessages ({id: msgId, rel: string?, count: false?, parent: false?}, cb)\n\nRetrieve the tree of messages related to `id`.\nThis is ideal for collecting things like threaded replies.\nIf `rel` is provided, only messages that link to the message with the given type are included.\nThe output is a recursive structure like this:\n\n``` js\n{\n key: ,\n value: ,\n related: [\n ,...\n ],\n //number of messages below this point. (when opts.count = true)\n count: ,\n //the message this message links to. this will not appear on the bottom level.\n //(when opts.parent = true)\n parent: \n}\n```\n\nIf `count` option is true, then each message will contain a `count`\nit's descendant messages. If `parent` is true then each level will have \n`parent`, the `id/key` of it's parent message.\n\n## Stability\n\nStable: Expect patches, possible features additions.\n\n## License\n\nMIT\n\n", "readmeFilename": "README.md", "repository": { "type": "git", "url": "git://github.com/ssbc/secure-scuttlebutt.git" }, "scripts": { "prepublish": "npm ls && npm test", "test": "set -e; for t in test/*.js; do node $t; done" }, "testling": { "browsers": [ "chrome/22..latest", "chrome/canary", "firefox/17..latest", "firefox/nightly", "ie/8..latest", "ipad/6.0..latest", "iphone/6.0..latest", "opera/12..latest", "opera/next", "safari/5.1..latest" ], "files": "test/defaults.js" }, "version": "15.0.5" } },{}],506:[function(require,module,exports){ (function (Buffer){ // prototype class for hash functions function Hash (blockSize, finalSize) { this._block = new Buffer(blockSize) this._finalSize = finalSize this._blockSize = blockSize this._len = 0 this._s = 0 } Hash.prototype.update = function (data, enc) { if (typeof data === 'string') { enc = enc || 'utf8' data = new Buffer(data, enc) } var l = this._len += data.length var s = this._s || 0 var f = 0 var buffer = this._block while (s < l) { var t = Math.min(data.length, f + this._blockSize - (s % this._blockSize)) var ch = (t - f) for (var i = 0; i < ch; i++) { buffer[(s % this._blockSize) + i] = data[i + f] } s += ch f += ch if ((s % this._blockSize) === 0) { this._update(buffer) } } this._s = s return this } Hash.prototype.digest = function (enc) { // Suppose the length of the message M, in bits, is l var l = this._len * 8 // Append the bit 1 to the end of the message this._block[this._len % this._blockSize] = 0x80 // and then k zero bits, where k is the smallest non-negative solution to the equation (l + 1 + k) === finalSize mod blockSize this._block.fill(0, this._len % this._blockSize + 1) if (l % (this._blockSize * 8) >= this._finalSize * 8) { this._update(this._block) this._block.fill(0) } // to this append the block which is equal to the number l written in binary // TODO: handle case where l is > Math.pow(2, 29) this._block.writeInt32BE(l, this._blockSize - 4) var hash = this._update(this._block) || this._hash() return enc ? hash.toString(enc) : hash } Hash.prototype._update = function () { throw new Error('_update must be implemented by subclass') } module.exports = Hash }).call(this,require("buffer").Buffer) },{"buffer":61}],507:[function(require,module,exports){ var exports = module.exports = function SHA (algorithm) { algorithm = algorithm.toLowerCase() var Algorithm = exports[algorithm] if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)') return new Algorithm() } exports.sha = require('./sha') exports.sha1 = require('./sha1') exports.sha224 = require('./sha224') exports.sha256 = require('./sha256') exports.sha384 = require('./sha384') exports.sha512 = require('./sha512') },{"./sha":508,"./sha1":509,"./sha224":510,"./sha256":511,"./sha384":512,"./sha512":513}],508:[function(require,module,exports){ (function (Buffer){ /* * A JavaScript implementation of the Secure Hash Algorithm, SHA-0, as defined * in FIPS PUB 180-1 * This source code is derived from sha1.js of the same repository. * The difference between SHA-0 and SHA-1 is just a bitwise rotate left * operation was added. */ var inherits = require('inherits') var Hash = require('./hash') var K = [ 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0 ] var W = new Array(80) function Sha () { this.init() this._w = W Hash.call(this, 64, 56) } inherits(Sha, Hash) Sha.prototype.init = function () { this._a = 0x67452301 this._b = 0xefcdab89 this._c = 0x98badcfe this._d = 0x10325476 this._e = 0xc3d2e1f0 return this } function rotl5 (num) { return (num << 5) | (num >>> 27) } function rotl30 (num) { return (num << 30) | (num >>> 2) } function ft (s, b, c, d) { if (s === 0) return (b & c) | ((~b) & d) if (s === 2) return (b & c) | (b & d) | (c & d) return b ^ c ^ d } Sha.prototype._update = function (M) { var W = this._w var a = this._a | 0 var b = this._b | 0 var c = this._c | 0 var d = this._d | 0 var e = this._e | 0 for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) for (; i < 80; ++i) W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16] for (var j = 0; j < 80; ++j) { var s = ~~(j / 20) var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0 e = d d = c c = rotl30(b) b = a a = t } this._a = (a + this._a) | 0 this._b = (b + this._b) | 0 this._c = (c + this._c) | 0 this._d = (d + this._d) | 0 this._e = (e + this._e) | 0 } Sha.prototype._hash = function () { var H = new Buffer(20) H.writeInt32BE(this._a | 0, 0) H.writeInt32BE(this._b | 0, 4) H.writeInt32BE(this._c | 0, 8) H.writeInt32BE(this._d | 0, 12) H.writeInt32BE(this._e | 0, 16) return H } module.exports = Sha }).call(this,require("buffer").Buffer) },{"./hash":506,"buffer":61,"inherits":167}],509:[function(require,module,exports){ (function (Buffer){ /* * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined * in FIPS PUB 180-1 * Version 2.1a Copyright Paul Johnston 2000 - 2002. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for details. */ var inherits = require('inherits') var Hash = require('./hash') var K = [ 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0 ] var W = new Array(80) function Sha1 () { this.init() this._w = W Hash.call(this, 64, 56) } inherits(Sha1, Hash) Sha1.prototype.init = function () { this._a = 0x67452301 this._b = 0xefcdab89 this._c = 0x98badcfe this._d = 0x10325476 this._e = 0xc3d2e1f0 return this } function rotl1 (num) { return (num << 1) | (num >>> 31) } function rotl5 (num) { return (num << 5) | (num >>> 27) } function rotl30 (num) { return (num << 30) | (num >>> 2) } function ft (s, b, c, d) { if (s === 0) return (b & c) | ((~b) & d) if (s === 2) return (b & c) | (b & d) | (c & d) return b ^ c ^ d } Sha1.prototype._update = function (M) { var W = this._w var a = this._a | 0 var b = this._b | 0 var c = this._c | 0 var d = this._d | 0 var e = this._e | 0 for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) for (; i < 80; ++i) W[i] = rotl1(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]) for (var j = 0; j < 80; ++j) { var s = ~~(j / 20) var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0 e = d d = c c = rotl30(b) b = a a = t } this._a = (a + this._a) | 0 this._b = (b + this._b) | 0 this._c = (c + this._c) | 0 this._d = (d + this._d) | 0 this._e = (e + this._e) | 0 } Sha1.prototype._hash = function () { var H = new Buffer(20) H.writeInt32BE(this._a | 0, 0) H.writeInt32BE(this._b | 0, 4) H.writeInt32BE(this._c | 0, 8) H.writeInt32BE(this._d | 0, 12) H.writeInt32BE(this._e | 0, 16) return H } module.exports = Sha1 }).call(this,require("buffer").Buffer) },{"./hash":506,"buffer":61,"inherits":167}],510:[function(require,module,exports){ (function (Buffer){ /** * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined * in FIPS 180-2 * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * */ var inherits = require('inherits') var Sha256 = require('./sha256') var Hash = require('./hash') var W = new Array(64) function Sha224 () { this.init() this._w = W // new Array(64) Hash.call(this, 64, 56) } inherits(Sha224, Sha256) Sha224.prototype.init = function () { this._a = 0xc1059ed8 this._b = 0x367cd507 this._c = 0x3070dd17 this._d = 0xf70e5939 this._e = 0xffc00b31 this._f = 0x68581511 this._g = 0x64f98fa7 this._h = 0xbefa4fa4 return this } Sha224.prototype._hash = function () { var H = new Buffer(28) H.writeInt32BE(this._a, 0) H.writeInt32BE(this._b, 4) H.writeInt32BE(this._c, 8) H.writeInt32BE(this._d, 12) H.writeInt32BE(this._e, 16) H.writeInt32BE(this._f, 20) H.writeInt32BE(this._g, 24) return H } module.exports = Sha224 }).call(this,require("buffer").Buffer) },{"./hash":506,"./sha256":511,"buffer":61,"inherits":167}],511:[function(require,module,exports){ (function (Buffer){ /** * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined * in FIPS 180-2 * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * */ var inherits = require('inherits') var Hash = require('./hash') var K = [ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 ] var W = new Array(64) function Sha256 () { this.init() this._w = W // new Array(64) Hash.call(this, 64, 56) } inherits(Sha256, Hash) Sha256.prototype.init = function () { this._a = 0x6a09e667 this._b = 0xbb67ae85 this._c = 0x3c6ef372 this._d = 0xa54ff53a this._e = 0x510e527f this._f = 0x9b05688c this._g = 0x1f83d9ab this._h = 0x5be0cd19 return this } function ch (x, y, z) { return z ^ (x & (y ^ z)) } function maj (x, y, z) { return (x & y) | (z & (x | y)) } function sigma0 (x) { return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10) } function sigma1 (x) { return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7) } function gamma0 (x) { return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ (x >>> 3) } function gamma1 (x) { return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ (x >>> 10) } Sha256.prototype._update = function (M) { var W = this._w var a = this._a | 0 var b = this._b | 0 var c = this._c | 0 var d = this._d | 0 var e = this._e | 0 var f = this._f | 0 var g = this._g | 0 var h = this._h | 0 for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) for (; i < 64; ++i) W[i] = (gamma1(W[i - 2]) + W[i - 7] + gamma0(W[i - 15]) + W[i - 16]) | 0 for (var j = 0; j < 64; ++j) { var T1 = (h + sigma1(e) + ch(e, f, g) + K[j] + W[j]) | 0 var T2 = (sigma0(a) + maj(a, b, c)) | 0 h = g g = f f = e e = (d + T1) | 0 d = c c = b b = a a = (T1 + T2) | 0 } this._a = (a + this._a) | 0 this._b = (b + this._b) | 0 this._c = (c + this._c) | 0 this._d = (d + this._d) | 0 this._e = (e + this._e) | 0 this._f = (f + this._f) | 0 this._g = (g + this._g) | 0 this._h = (h + this._h) | 0 } Sha256.prototype._hash = function () { var H = new Buffer(32) H.writeInt32BE(this._a, 0) H.writeInt32BE(this._b, 4) H.writeInt32BE(this._c, 8) H.writeInt32BE(this._d, 12) H.writeInt32BE(this._e, 16) H.writeInt32BE(this._f, 20) H.writeInt32BE(this._g, 24) H.writeInt32BE(this._h, 28) return H } module.exports = Sha256 }).call(this,require("buffer").Buffer) },{"./hash":506,"buffer":61,"inherits":167}],512:[function(require,module,exports){ (function (Buffer){ var inherits = require('inherits') var SHA512 = require('./sha512') var Hash = require('./hash') var W = new Array(160) function Sha384 () { this.init() this._w = W Hash.call(this, 128, 112) } inherits(Sha384, SHA512) Sha384.prototype.init = function () { this._ah = 0xcbbb9d5d this._bh = 0x629a292a this._ch = 0x9159015a this._dh = 0x152fecd8 this._eh = 0x67332667 this._fh = 0x8eb44a87 this._gh = 0xdb0c2e0d this._hh = 0x47b5481d this._al = 0xc1059ed8 this._bl = 0x367cd507 this._cl = 0x3070dd17 this._dl = 0xf70e5939 this._el = 0xffc00b31 this._fl = 0x68581511 this._gl = 0x64f98fa7 this._hl = 0xbefa4fa4 return this } Sha384.prototype._hash = function () { var H = new Buffer(48) function writeInt64BE (h, l, offset) { H.writeInt32BE(h, offset) H.writeInt32BE(l, offset + 4) } writeInt64BE(this._ah, this._al, 0) writeInt64BE(this._bh, this._bl, 8) writeInt64BE(this._ch, this._cl, 16) writeInt64BE(this._dh, this._dl, 24) writeInt64BE(this._eh, this._el, 32) writeInt64BE(this._fh, this._fl, 40) return H } module.exports = Sha384 }).call(this,require("buffer").Buffer) },{"./hash":506,"./sha512":513,"buffer":61,"inherits":167}],513:[function(require,module,exports){ (function (Buffer){ var inherits = require('inherits') var Hash = require('./hash') var K = [ 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 ] var W = new Array(160) function Sha512 () { this.init() this._w = W Hash.call(this, 128, 112) } inherits(Sha512, Hash) Sha512.prototype.init = function () { this._ah = 0x6a09e667 this._bh = 0xbb67ae85 this._ch = 0x3c6ef372 this._dh = 0xa54ff53a this._eh = 0x510e527f this._fh = 0x9b05688c this._gh = 0x1f83d9ab this._hh = 0x5be0cd19 this._al = 0xf3bcc908 this._bl = 0x84caa73b this._cl = 0xfe94f82b this._dl = 0x5f1d36f1 this._el = 0xade682d1 this._fl = 0x2b3e6c1f this._gl = 0xfb41bd6b this._hl = 0x137e2179 return this } function Ch (x, y, z) { return z ^ (x & (y ^ z)) } function maj (x, y, z) { return (x & y) | (z & (x | y)) } function sigma0 (x, xl) { return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25) } function sigma1 (x, xl) { return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23) } function Gamma0 (x, xl) { return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7) } function Gamma0l (x, xl) { return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25) } function Gamma1 (x, xl) { return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6) } function Gamma1l (x, xl) { return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26) } function getCarry (a, b) { return (a >>> 0) < (b >>> 0) ? 1 : 0 } Sha512.prototype._update = function (M) { var W = this._w var ah = this._ah | 0 var bh = this._bh | 0 var ch = this._ch | 0 var dh = this._dh | 0 var eh = this._eh | 0 var fh = this._fh | 0 var gh = this._gh | 0 var hh = this._hh | 0 var al = this._al | 0 var bl = this._bl | 0 var cl = this._cl | 0 var dl = this._dl | 0 var el = this._el | 0 var fl = this._fl | 0 var gl = this._gl | 0 var hl = this._hl | 0 for (var i = 0; i < 32; i += 2) { W[i] = M.readInt32BE(i * 4) W[i + 1] = M.readInt32BE(i * 4 + 4) } for (; i < 160; i += 2) { var xh = W[i - 15 * 2] var xl = W[i - 15 * 2 + 1] var gamma0 = Gamma0(xh, xl) var gamma0l = Gamma0l(xl, xh) xh = W[i - 2 * 2] xl = W[i - 2 * 2 + 1] var gamma1 = Gamma1(xh, xl) var gamma1l = Gamma1l(xl, xh) // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] var Wi7h = W[i - 7 * 2] var Wi7l = W[i - 7 * 2 + 1] var Wi16h = W[i - 16 * 2] var Wi16l = W[i - 16 * 2 + 1] var Wil = (gamma0l + Wi7l) | 0 var Wih = (gamma0 + Wi7h + getCarry(Wil, gamma0l)) | 0 Wil = (Wil + gamma1l) | 0 Wih = (Wih + gamma1 + getCarry(Wil, gamma1l)) | 0 Wil = (Wil + Wi16l) | 0 Wih = (Wih + Wi16h + getCarry(Wil, Wi16l)) | 0 W[i] = Wih W[i + 1] = Wil } for (var j = 0; j < 160; j += 2) { Wih = W[j] Wil = W[j + 1] var majh = maj(ah, bh, ch) var majl = maj(al, bl, cl) var sigma0h = sigma0(ah, al) var sigma0l = sigma0(al, ah) var sigma1h = sigma1(eh, el) var sigma1l = sigma1(el, eh) // t1 = h + sigma1 + ch + K[j] + W[j] var Kih = K[j] var Kil = K[j + 1] var chh = Ch(eh, fh, gh) var chl = Ch(el, fl, gl) var t1l = (hl + sigma1l) | 0 var t1h = (hh + sigma1h + getCarry(t1l, hl)) | 0 t1l = (t1l + chl) | 0 t1h = (t1h + chh + getCarry(t1l, chl)) | 0 t1l = (t1l + Kil) | 0 t1h = (t1h + Kih + getCarry(t1l, Kil)) | 0 t1l = (t1l + Wil) | 0 t1h = (t1h + Wih + getCarry(t1l, Wil)) | 0 // t2 = sigma0 + maj var t2l = (sigma0l + majl) | 0 var t2h = (sigma0h + majh + getCarry(t2l, sigma0l)) | 0 hh = gh hl = gl gh = fh gl = fl fh = eh fl = el el = (dl + t1l) | 0 eh = (dh + t1h + getCarry(el, dl)) | 0 dh = ch dl = cl ch = bh cl = bl bh = ah bl = al al = (t1l + t2l) | 0 ah = (t1h + t2h + getCarry(al, t1l)) | 0 } this._al = (this._al + al) | 0 this._bl = (this._bl + bl) | 0 this._cl = (this._cl + cl) | 0 this._dl = (this._dl + dl) | 0 this._el = (this._el + el) | 0 this._fl = (this._fl + fl) | 0 this._gl = (this._gl + gl) | 0 this._hl = (this._hl + hl) | 0 this._ah = (this._ah + ah + getCarry(this._al, al)) | 0 this._bh = (this._bh + bh + getCarry(this._bl, bl)) | 0 this._ch = (this._ch + ch + getCarry(this._cl, cl)) | 0 this._dh = (this._dh + dh + getCarry(this._dl, dl)) | 0 this._eh = (this._eh + eh + getCarry(this._el, el)) | 0 this._fh = (this._fh + fh + getCarry(this._fl, fl)) | 0 this._gh = (this._gh + gh + getCarry(this._gl, gl)) | 0 this._hh = (this._hh + hh + getCarry(this._hl, hl)) | 0 } Sha512.prototype._hash = function () { var H = new Buffer(64) function writeInt64BE (h, l, offset) { H.writeInt32BE(h, offset) H.writeInt32BE(l, offset + 4) } writeInt64BE(this._ah, this._al, 0) writeInt64BE(this._bh, this._bl, 8) writeInt64BE(this._ch, this._cl, 16) writeInt64BE(this._dh, this._dl, 24) writeInt64BE(this._eh, this._el, 32) writeInt64BE(this._fh, this._fl, 40) writeInt64BE(this._gh, this._gl, 48) writeInt64BE(this._hh, this._hl, 56) return H } module.exports = Sha512 }).call(this,require("buffer").Buffer) },{"./hash":506,"buffer":61,"inherits":167}],514:[function(require,module,exports){ (function (Buffer){ var sodium = require('libsodium-wrappers') function I(b) { return Buffer.isBuffer(b) ? new Uint8Array(b) : b } function B(b) { return (b instanceof Uint8Array) ? new Buffer(b) : b } function bufferize(fn) { if('function' !== typeof fn) throw new Error('not a function') return function () { var args = [].map.call(arguments, I) var r = B(fn.apply(this, args)) return r } } function keys (k) { return { publicKey: B(k.publicKey), secretKey: B(k.secretKey || k.privateKey) } } exports.crypto_sign_seed_keypair = function (seed) { return keys(sodium.crypto_sign_seed_keypair(I(seed))) } exports.crypto_sign_keypair = function () { return keys(sodium.crypto_sign_keypair()) } exports.crypto_box_keypair = function () { return keys(sodium.crypto_box_keypair()) } ;[ 'sign_verify_detached', 'sign_detached', 'sign', 'sign_open', 'sign_ed25519_pk_to_curve25519', 'sign_ed25519_sk_to_curve25519', 'scalarmult', 'secretbox_easy', 'secretbox_open_easy', 'box_easy', 'box_open_easy', 'auth', 'auth_verify', 'hash' ].forEach(function (name) { if(name === 'auth_verify') { //this is inconsistent with sign_verify!! var fn = bufferize(sodium.crypto_auth_verify) exports['crypto_'+name] = function (msg, tok, key) { return fn(msg, tok, key) ? 0 : 1 } } else exports['crypto_'+name] = bufferize(sodium['crypto_'+name]) }) var Sha256 = require('sha.js/sha256') exports.crypto_hash_sha256 = function (msg) { return new Sha256().update(msg).digest() } function nullIfThrew (fn) { return function () { try { return fn.apply(this, [].slice.call(arguments)) } catch (err) { return null } } } exports.crypto_secretbox_open_easy = nullIfThrew(exports.crypto_secretbox_open_easy) exports.crypto_box_open_easy = nullIfThrew(exports.crypto_box_open_easy) }).call(this,require("buffer").Buffer) },{"buffer":61,"libsodium-wrappers":222,"sha.js/sha256":511}],515:[function(require,module,exports){ //only exports browser api. use chloride module //to get automatic fallbacks! module.exports = require('./browser') },{"./browser":514}],516:[function(require,module,exports){ module.exports = function split (data, max) { if(max <= 0) throw new Error('cannot split into zero (or smaller) length buffers') if(data.length <= max) return [data] var out = [], len = 0 while(len < data.length) { out.push(data.slice(len, Math.min(len + max, data.length))) len += max } return out } },{}],517:[function(require,module,exports){ var path = require('path') var home = require('osenv').home var nonPrivate = require('non-private-ip') var merge = require('deep-extend') var RC = require('rc') var SEC = 1e3 var MIN = 60*SEC module.exports = function (name, override) { name = name || 'ssb' return RC(name || 'ssb', merge({ //just use an ipv4 address by default. //there have been some reports of seemingly non-private //ipv6 addresses being returned and not working. //https://github.com/ssbc/scuttlebot/pull/102 party: true, host: nonPrivate.v4 || '', port: 8008, timeout: 0, pub: true, local: true, friends: { dunbar: 150, hops: 3 }, gossip: { connections: 3 }, path: path.join(home(), '.' + name), timers: { connection: 0, reconnect: 5*SEC, ping: 5*MIN, handshake: 5*SEC }, path: path.join(home(), '.' + name), master: [], logging: { level: 'notice' }, party: true //disable quotas }, override || {})) } },{"deep-extend":111,"non-private-ip":518,"osenv":282,"path":290,"rc":404}],518:[function(require,module,exports){ arguments[4][464][0].apply(exports,arguments) },{"dup":464,"ip":169,"os":279}],519:[function(require,module,exports){ (function (Buffer){ var cont = require('cont') var util = require('./util') var ssbKeys = require('ssb-keys') function isFunction (f) { return 'function' === typeof f } function isObject (o) { return ( o && 'object' === typeof o && !Buffer.isBuffer(o) && !Array.isArray(o) ) } module.exports = function (ssb, keys) { if(!ssb.add) throw new Error('*must* install feeds on this ssb instance') function getPrev(next) { ssb.getLatest(keys.id, next) } function noop (err) { if (err) throw err } var queue = null var prev = null var writing = false var publish = cont(function (type, message, cb) { // argument variations if (isFunction(message)) { cb = message; message = type } // add(msgObj, cbFn) else if (isObject(message)) { message.type = type } // add(typeStr, mgObj, cbFn) else { message = { type: type, value: message } } // add(typeStr, msgStr, cbFn) var err = util.isInvalidContent(message) if(err) return cb(err) return ssb.add.queue(keys.id, function (key, value) { return util.create(keys, null, message, value, key) }, cb) return this }) return { id: keys.id, keys: keys, add: publish, publish: publish } } }).call(this,{"isBuffer":require("../is-buffer/index.js")}) },{"../is-buffer/index.js":170,"./util":520,"cont":86,"ssb-keys":530}],520:[function(require,module,exports){ (function (Buffer){ var ssbKeys = require('ssb-keys') var timestamp = require('monotonic-timestamp') var isRef = require('ssb-ref') var isHash = isRef.isHash var isFeedId = isRef.isFeedId var encode = exports.encode = function (obj) { return JSON.stringify(obj, null, 2) } function isString (s) { return 'string' === typeof s } function isInteger (n) { return ~~n === n } function isObject (o) { return o && 'object' === typeof o } function clone (obj) { var o = {} for(var k in obj) o[k] = obj[k]; return o } function isEncrypted (str) { return isString(str) && /^[0-9A-Za-z\/+]+={0,2}\.box/.test(str) } exports.BatchQueue = function BatchQueue (db) { var batch = [], writing = false function drain () { writing = true var _batch = batch batch = [] db.batch(_batch, function () { writing = false write.size = batch.length if(batch.length) drain() _batch.forEach(function (op) { op.cb(null, {key:op.key, value: op.value}) }) }) } function write (op) { batch.push(op) write.size = batch.length if(!writing) drain() } write.size = 0 return write } exports.create = function (keys, type, content, prev, prev_key) { //this noise is to handle things calling this with legacy api. if(isString(type) && (Buffer.isBuffer(content) || isString(content))) content = {type: type, value: content} if(isObject(content)) content.type = content.type || type //noise end prev_key = !prev_key && prev ? ('%'+ssbKeys.hash(encode(prev))) : prev_key || null return ssbKeys.signObj(keys, { previous: prev_key, author: keys.id, sequence: prev ? prev.sequence + 1 : 1, timestamp: timestamp(), hash: 'sha256', content: content, }) } var isInvalidContent = exports.isInvalidContent = function (content) { if(!isEncrypted(content)) { type = content.type if (!(isString(type) && type.length <= 52 && type.length >= 3)) { return new Error('type must be a string' + '3 <= type.length < 52, was:' + type ) } } return false } exports.isInvalidShape = function (msg) { if( !isObject(msg) || !isInteger(msg.sequence) || !isFeedId(msg.author) || !(isObject(msg.content) || isEncrypted(msg.content)) ) return new Error('message has invalid properties') //allow encrypted messages, where content is a base64 string. var asJson = encode(msg) if (asJson.length > 8192) // 8kb return new Error( 'encoded message must not be larger than 8192 bytes') return isInvalidContent(msg.content) } exports.isInvalid = function validateSync (pub, msg, previous) { // :TODO: is there a faster way to measure the size of this message? var key = previous.key var prev = previous.value if(prev) { if(msg.previous !== key) return new Error( 'expected previous: ' + key + 'but found:' + msg.previous ) if(msg.sequence !== prev.sequence + 1 || msg.timestamp <= prev.timestamp) return new Error('out of order') } else { if(!(msg.previous == null && msg.sequence === 1 && msg.timestamp > 0)) return new Error('expected initial message') } if(msg.author !== pub) { return new Error( 'expected different author:' + hash(pub.public || pub).toString('base64') + 'but found:' + msg.author.toString('base64') ) } if(!ssbKeys.verifyObj(pub, msg)) return new Error('signature was invalid') return false } }).call(this,{"isBuffer":require("../is-buffer/index.js")}) },{"../is-buffer/index.js":170,"monotonic-timestamp":249,"ssb-keys":530,"ssb-ref":573}],521:[function(require,module,exports){ 'use strict'; var hash = require('ssb-keys').hash // make a validation stream? // read the latest record in the database // check it against the incoming data, // and then read through function isString (s) { return 'string' === typeof s } function isInteger (n) { return ~~n === n } function isObject (o) { return o && 'object' === typeof o } var util = require('./util') var encode = util.encode module.exports = function (ssb) { var write = util.BatchQueue(ssb) function getLatest (id, cb) { ssb.getLatest(id, function (err, data) { if(err) return cb(null, {key: null, value: null, type: 'put', public: null, ready: true}) cb(null, { key: data.key, value: data.value, type: 'put', public: data.value && data.value.author, ready: true }) }) } var latest = {} function setLatest(id) { if(latest[id].ready) throw new Error('setLatest should only be called once') ssb.getLatest(id, function (err, data) { latest[id].ready = true if(data) { latest[id].key = data.key latest[id].value = data.value } validate(id) }) } function validate(id) { var feed = latest[id] if(!feed.queue.length) return if(!feed.ready) return while(feed.queue.length) { var op = feed.queue.shift() if('function' == typeof op.create) { op.value = op.create(feed.key, feed.value) op.key = '%'+hash(encode(op.value)) } var err = util.isInvalidShape(op.value) || util.isInvalid(id, op.value, feed) if(err) op.cb(err) else { feed.key = op.key feed.value = op.value feed.ts = Date.now() write(op) } } } function queue (id, job) { if(!latest[id]) { latest[id] = { key:null, value: null, ready: false, queue: [], ts: Date.now() } latest[id].queue.push(job) setLatest(id) } else latest[id].queue.push(job) validate(id) } function add (msg, cb) { var err = util.isInvalidShape(msg) if(err) return cb(err) queue(msg.author, { key: '%'+hash(encode(msg)), value: msg, cb: cb, create: null }) } add.queue = function (id, create, cb) { queue(id, { key: null, value: null, create: create, cb: cb }) } return add } },{"./util":520,"ssb-keys":530}],522:[function(require,module,exports){ var pull = require('pull-stream') var toPull = require('stream-to-pull-stream') var cat = require('pull-cat') var ident = require('pull-identify-filetype') var mime = require('mime-types') var URL = require('url') var fs = require('fs') var refs = require('ssb-ref') var Stack = require('stack') var ip = require('ip') exports = module.exports = function (sbot, config) { require('http').createServer(exports.BlobStack(sbot)).listen(7777) } function respond (res, status, message) { res.writeHead(status) res.end(message) } function respondSource (res, source, wrap) { if(wrap) { res.writeHead(200, {'Content-Type': 'text/html'}) pull( cat([ pull.once('') ]), toPull.sink(res) ) } else { pull( source, ident(function (type) { if (type) res.writeHead(200, {'Content-Type': mime.lookup(type)}) }), toPull.sink(res) ) } } var Localhost = exports.Localhost = function () { return function (req, res, next) { if (!ip.isLoopback(req.socket.remoteAddress)) return respond(res, 403, 'Remote access forbidden') next() } } var CSP = exports.CSP = function (origin) { return function (req, res, next) { res.setHeader('Content-Security-Policy', "default-src "+origin+" 'unsafe-inline' 'unsafe-eval' data:; "+ "object-src 'none'; "+ "frame-src 'none'; "+ "sandbox" ) next() } } var ServeBlobs = exports.ServeBlobs = function (sbot) { return function (req, res, next) { var parsed = URL.parse(req.url, true) var hash = parsed.pathname.slice(1) sbot.blobs.want(hash, function(err, has) { if (!has) return respond(res, 404, 'File not found') // optional name override if (parsed.query.name) res.setHeader('Content-Disposition', 'inline; filename='+encodeURIComponent(parsed.query.name)) // serve respondSource(res, sbot.blobs.get(hash), false) }) } } var ServeFiles = exports.ServeFiles = function () { return function (req, res, next) { var parsed = URL.parse(req.url, true) fs.stat(parsed.pathname, function (err, stat) { if(err) return respond(res, 404, 'File not found') if(!stat.isFile()) return respond(res, 403, 'May only load filess') respondSource( res, toPull.source(fs.createReadStream(parsed.pathname)), false ) }) } } exports.BlobStack = function (sbot, opts) { return Stack( Localhost(), CSP('http://localhost:7777'), ServeBlobs(sbot) ) } exports.FileStack = function (opts) { return Stack( Localhost(), CSP('http://localhost:7777'), ServeFiles() ) } },{"fs":58,"http":588,"ip":523,"mime-types":245,"pull-cat":305,"pull-identify-filetype":335,"pull-stream":524,"ssb-ref":573,"stack":574,"stream-to-pull-stream":593,"url":632}],523:[function(require,module,exports){ 'use strict'; var ip = exports; var Buffer = require('buffer').Buffer; var os = require('os'); ip.toBuffer = function(ip, buff, offset) { offset = ~~offset; var result; if (this.isV4Format(ip)) { result = buff || new Buffer(offset + 4); ip.split(/\./g).map(function(byte) { result[offset++] = parseInt(byte, 10) & 0xff; }); } else if (this.isV6Format(ip)) { var sections = ip.split(':', 8); var i; for (i = 0; i < sections.length; i++) { var isv4 = this.isV4Format(sections[i]); var v4Buffer; if (isv4) { v4Buffer = this.toBuffer(sections[i]); sections[i] = v4Buffer.slice(0, 2).toString('hex'); } if (v4Buffer && ++i < 8) { sections.splice(i, 0, v4Buffer.slice(2, 4).toString('hex')); } } if (sections[0] === '') { while (sections.length < 8) sections.unshift('0'); } else if (sections[sections.length - 1] === '') { while (sections.length < 8) sections.push('0'); } else if (sections.length < 8) { for (i = 0; i < sections.length && sections[i] !== ''; i++); var argv = [ i, 1 ]; for (i = 9 - sections.length; i > 0; i--) { argv.push('0'); } sections.splice.apply(sections, argv); } result = buff || new Buffer(offset + 16); for (i = 0; i < sections.length; i++) { var word = parseInt(sections[i], 16); result[offset++] = (word >> 8) & 0xff; result[offset++] = word & 0xff; } } if (!result) { throw Error('Invalid ip address: ' + ip); } return result; }; ip.toString = function(buff, offset, length) { offset = ~~offset; length = length || (buff.length - offset); var result = []; if (length === 4) { // IPv4 for (var i = 0; i < length; i++) { result.push(buff[offset + i]); } result = result.join('.'); } else if (length === 16) { // IPv6 for (var i = 0; i < length; i += 2) { result.push(buff.readUInt16BE(offset + i).toString(16)); } result = result.join(':'); result = result.replace(/(^|:)0(:0)*:0(:|$)/, '$1::$3'); result = result.replace(/:{3,4}/, '::'); } return result; }; var ipv4Regex = /^(\d{1,3}\.){3,3}\d{1,3}$/; var ipv6Regex = /^(::)?(((\d{1,3}\.){3}(\d{1,3}){1})?([0-9a-f]){0,4}:{0,2}){1,8}(::)?$/i; ip.isV4Format = function(ip) { return ipv4Regex.test(ip); }; ip.isV6Format = function(ip) { return ipv6Regex.test(ip); }; function _normalizeFamily(family) { return family ? family.toLowerCase() : 'ipv4'; } ip.fromPrefixLen = function(prefixlen, family) { if (prefixlen > 32) { family = 'ipv6'; } else { family = _normalizeFamily(family); } var len = 4; if (family === 'ipv6') { len = 16; } var buff = new Buffer(len); for (var i = 0, n = buff.length; i < n; ++i) { var bits = 8; if (prefixlen < 8) { bits = prefixlen; } prefixlen -= bits; buff[i] = ~(0xff >> bits); } return ip.toString(buff); }; ip.mask = function(addr, mask) { addr = ip.toBuffer(addr); mask = ip.toBuffer(mask); var result = new Buffer(Math.max(addr.length, mask.length)); // Same protocol - do bitwise and if (addr.length === mask.length) { for (var i = 0; i < addr.length; i++) { result[i] = addr[i] & mask[i]; } } else if (mask.length === 4) { // IPv6 address and IPv4 mask // (Mask low bits) for (var i = 0; i < mask.length; i++) { result[i] = addr[addr.length - 4 + i] & mask[i]; } } else { // IPv6 mask and IPv4 addr for (var i = 0; i < result.length - 6; i++) { result[i] = 0; } // ::ffff:ipv4 result[10] = 0xff; result[11] = 0xff; for (var i = 0; i < addr.length; i++) { result[i + 12] = addr[i] & mask[i + 12]; } } return ip.toString(result); }; ip.cidr = function(cidrString) { var cidrParts = cidrString.split('/'); var addr = cidrParts[0]; if (cidrParts.length !== 2) throw new Error('invalid CIDR subnet: ' + addr); var mask = ip.fromPrefixLen(parseInt(cidrParts[1], 10)); return ip.mask(addr, mask); }; ip.subnet = function(addr, mask) { var networkAddress = ip.toLong(ip.mask(addr, mask)); // Calculate the mask's length. var maskBuffer = ip.toBuffer(mask); var maskLength = 0; for (var i = 0; i < maskBuffer.length; i++) { if (maskBuffer[i] === 0xff) { maskLength += 8; } else { var octet = maskBuffer[i] & 0xff; while (octet) { octet = (octet << 1) & 0xff; maskLength++; } } } var numberOfAddresses = Math.pow(2, 32 - maskLength); return { networkAddress: ip.fromLong(networkAddress), firstAddress: numberOfAddresses <= 2 ? ip.fromLong(networkAddress) : ip.fromLong(networkAddress + 1), lastAddress: numberOfAddresses <= 2 ? ip.fromLong(networkAddress + numberOfAddresses - 1) : ip.fromLong(networkAddress + numberOfAddresses - 2), broadcastAddress: ip.fromLong(networkAddress + numberOfAddresses - 1), subnetMask: mask, subnetMaskLength: maskLength, numHosts: numberOfAddresses <= 2 ? numberOfAddresses : numberOfAddresses - 2, length: numberOfAddresses, contains: function(other) { return networkAddress === ip.toLong(ip.mask(other, mask)); } }; }; ip.cidrSubnet = function(cidrString) { var cidrParts = cidrString.split('/'); var addr = cidrParts[0]; if (cidrParts.length !== 2) throw new Error('invalid CIDR subnet: ' + addr); var mask = ip.fromPrefixLen(parseInt(cidrParts[1], 10)); return ip.subnet(addr, mask); }; ip.not = function(addr) { var buff = ip.toBuffer(addr); for (var i = 0; i < buff.length; i++) { buff[i] = 0xff ^ buff[i]; } return ip.toString(buff); }; ip.or = function(a, b) { a = ip.toBuffer(a); b = ip.toBuffer(b); // same protocol if (a.length === b.length) { for (var i = 0; i < a.length; ++i) { a[i] |= b[i]; } return ip.toString(a); // mixed protocols } else { var buff = a; var other = b; if (b.length > a.length) { buff = b; other = a; } var offset = buff.length - other.length; for (var i = offset; i < buff.length; ++i) { buff[i] |= other[i - offset]; } return ip.toString(buff); } }; ip.isEqual = function(a, b) { a = ip.toBuffer(a); b = ip.toBuffer(b); // Same protocol if (a.length === b.length) { for (var i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true; } // Swap if (b.length === 4) { var t = b; b = a; a = t; } // a - IPv4, b - IPv6 for (var i = 0; i < 10; i++) { if (b[i] !== 0) return false; } var word = b.readUInt16BE(10); if (word !== 0 && word !== 0xffff) return false; for (var i = 0; i < 4; i++) { if (a[i] !== b[i + 12]) return false; } return true; }; ip.isPrivate = function(addr) { return /^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i .test(addr) || /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i .test(addr) || /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || /^f[cd][0-9a-f]{2}:/i.test(addr) || /^fe80:/i.test(addr) || /^::1$/.test(addr) || /^::$/.test(addr); }; ip.isPublic = function(addr) { return !ip.isPrivate(addr); }; ip.isLoopback = function(addr) { return /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/ .test(addr) || /^fe80::1$/.test(addr) || /^::1$/.test(addr) || /^::$/.test(addr); }; ip.loopback = function(family) { // // Default to `ipv4` // family = _normalizeFamily(family); if (family !== 'ipv4' && family !== 'ipv6') { throw new Error('family must be ipv4 or ipv6'); } return family === 'ipv4' ? '127.0.0.1' : 'fe80::1'; }; // // ### function address (name, family) // #### @name {string|'public'|'private'} **Optional** Name or security // of the network interface. // #### @family {ipv4|ipv6} **Optional** IP family of the address (defaults // to ipv4). // // Returns the address for the network interface on the current system with // the specified `name`: // * String: First `family` address of the interface. // If not found see `undefined`. // * 'public': the first public ip address of family. // * 'private': the first private ip address of family. // * undefined: First address with `ipv4` or loopback address `127.0.0.1`. // ip.address = function(name, family) { var interfaces = os.networkInterfaces(); var all; // // Default to `ipv4` // family = _normalizeFamily(family); // // If a specific network interface has been named, // return the address. // if (name && name !== 'private' && name !== 'public') { var res = interfaces[name].filter(function(details) { var itemFamily = details.family.toLowerCase(); return itemFamily === family; }); if (res.length === 0) return undefined; return res[0].address; } var all = Object.keys(interfaces).map(function (nic) { // // Note: name will only be `public` or `private` // when this is called. // var addresses = interfaces[nic].filter(function (details) { details.family = details.family.toLowerCase(); if (details.family !== family || ip.isLoopback(details.address)) { return false; } else if (!name) { return true; } return name === 'public' ? !ip.isPrivate(details.address) : ip.isPrivate(details.address); }); return addresses.length ? addresses[0].address : undefined; }).filter(Boolean); return !all.length ? ip.loopback(family) : all[0]; }; ip.toLong = function(ip) { var ipl = 0; ip.split('.').forEach(function(octet) { ipl <<= 8; ipl += parseInt(octet); }); return(ipl >>> 0); }; ip.fromLong = function(ipl) { return ((ipl >>> 24) + '.' + (ipl >> 16 & 255) + '.' + (ipl >> 8 & 255) + '.' + (ipl & 255) ); }; },{"buffer":61,"os":279}],524:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":525,"./sinks":526,"./sources":527,"./throughs":528,"dup":232}],525:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],526:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],527:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],528:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":526,"./sources":527,"dup":236}],529:[function(require,module,exports){ var ecc = require('eccjs') var crypto = require('crypto') var Blake2s = require('blake2s') var curve = ecc.curves.k256 function hash (message) { return new Blake2s().update(message).digest() } module.exports = { curves: ['k256'], generate: function (seed) { //we use eccjs.restore here, instead of eccjs.generate //because we trust node's random generator much more than //sjcl's (via crypto-browserify's polyfil this uses //webcrypto's random generator in the browser) var keys = ecc.restore(curve, seed || crypto.randomBytes(32)) return { curve: 'k256', public: keys.public, private: keys.private } }, sign: function (private, message) { return ecc.sign(curve, private, hash(message)) }, verify: function (public, sig, message) { return ecc.verify(curve, public, sig, hash(message)) }, restore: function (seed) { return ecc.restore(curve, seed) } } },{"blake2s":28,"crypto":110,"eccjs":124}],530:[function(require,module,exports){ (function (Buffer){ var fs = require('fs') var mkdirp = require('mkdirp') var path = require('path') var deepEqual = require('deep-equal') var crypto = require('crypto') var createHmac = require('hmac') var sodium = require('chloride') var ssbref = require('ssb-ref') var pb = require('private-box') var isBuffer = Buffer.isBuffer function isString (s) { return 'string' === typeof s } //UTILS function clone (obj) { var _obj = {} for(var k in obj) { if(Object.hasOwnProperty.call(obj, k)) _obj[k] = obj[k] } return _obj } function hash (data, enc) { data = ( 'string' === typeof data && enc == null ? new Buffer(data, 'binary') : new Buffer(data, enc) ) return crypto.createHash('sha256').update(data).digest('base64')+'.sha256' } var isLink = ssbref.isLink var isFeedId = ssbref.isFeedId exports.hash = hash function isObject (o) { return 'object' === typeof o } function isFunction (f) { return 'function' === typeof f } function isString(s) { return 'string' === typeof s } function hasSigil (s) { return /^(@|%|&)/.test(s) } function empty(v) { return !!v } function toBuffer(buf) { if(buf == null) return buf if(Buffer.isBuffer(buf)) throw new Error('already a buffer') var i = buf.indexOf('.') var start = (hasSigil(buf)) ? 1 : 0 return new Buffer(buf.substring(start, ~i ? i : buf.length), 'base64') } function toUint8(buf) { return new Uint8Array(toBuffer(buf)) } function getTag (string) { var i = string.indexOf('.') return string.substring(i+1) } exports.getTag = getTag function tag (key, tag) { if(!tag) throw new Error('no tag for:' + key.toString('base64')) return key.toString('base64')+'.' + tag.replace(/^\./, '') } function keysToJSON(keys, curve) { curve = (keys.curve || curve) var pub = tag(keys.public.toString('base64'), curve) return { curve: curve, public: pub, private: keys.private ? tag(keys.private.toString('base64'), curve) : undefined, id: '@'+(curve === 'ed25519' ? pub : hash(pub)) } } //(DE)SERIALIZE KEYS function constructKeys(keys, legacy) { if(!keys) throw new Error('*must* pass in keys') return [ '# this is your SECRET name.', '# this name gives you magical powers.', '# with it you can mark your messages so that your friends can verify', '# that they really did come from you.', '#', '# if any one learns this name, they can use it to destroy your identity', '# NEVER show this to anyone!!!', '', legacy ? keys.private : JSON.stringify(keys, null, 2), '', '# WARNING! It\'s vital that you DO NOT edit OR share your secret name', '# instead, share your public name', '# your public name: ' + keys.id ].join('\n') } function reconstructKeys(keyfile) { var private = keyfile .replace(/\s*\#[^\n]*/g, '') .split('\n').filter(empty).join('') //if the key is in JSON format, we are good. try { var keys = JSON.parse(private) if(!hasSigil(keys.id)) keys.id = '@' + keys.public return keys } catch (_) {} //else, reconstruct legacy curve... var curve = getTag(private) if(curve !== 'k256') throw new Error('expected legacy curve (k256) but found:' + curve) var ecc = require('./eccjs') return keysToJSON(ecc.restore(toBuffer(private)), 'k256') } var toNameFile = exports.toNameFile = function (namefile) { if(isObject(namefile)) return path.join(namefile.path, 'secret') return namefile } exports.load = function(namefile, cb) { namefile = toNameFile(namefile) fs.readFile(namefile, 'ascii', function(err, privateKeyStr) { if (err) return cb(err) try { cb(null, reconstructKeys(privateKeyStr)) } catch (e) { cb(err) } }) } exports.loadSync = function(namefile) { namefile = toNameFile(namefile) return reconstructKeys(fs.readFileSync(namefile, 'ascii')) } exports.create = function(namefile, curve, legacy, cb) { if(isFunction(legacy)) cb = legacy, legacy = null if(isFunction(curve)) cb = curve, curve = null namefile = toNameFile(namefile) var keys = exports.generate(curve) var keyfile = constructKeys(keys, legacy) mkdirp(path.dirname(namefile), function (err) { if(err) return cb(err) fs.writeFile(namefile, keyfile, function(err) { if (err) return cb(err) cb(null, keys) }) }) } exports.createSync = function(namefile, curve, legacy) { namefile = toNameFile(namefile) var keys = exports.generate(curve) var keyfile = constructKeys(keys, legacy) mkdirp.sync(path.dirname(namefile)) fs.writeFileSync(namefile, keyfile) return keys } exports.loadOrCreate = function (namefile, cb) { namefile = toNameFile(namefile) exports.load(namefile, function (err, keys) { if(!err) return cb(null, keys) exports.create(namefile, cb) }) } exports.loadOrCreateSync = function (namefile) { namefile = toNameFile(namefile) try { return exports.loadSync(namefile) } catch (err) { return exports.createSync(namefile) } } // DIGITAL SIGNATURES var curves = {} curves.ed25519 = require('./sodium') try { curves.k256 = require('./eccjs') } catch (_) {} function getCurve(keys) { var curve = keys.curve if(!keys.curve && isString(keys.public)) keys = keys.public if(!curve && isString(keys)) curve = getTag(keys) if(!curves[curve]) { throw new Error( 'unkown curve:' + curve + ' expected: '+Object.keys(curves) ) } return curve } //this should return a key pair: // {curve: curve, public: Buffer, private: Buffer} exports.generate = function (curve, seed) { curve = curve || 'ed25519' if(!curves[curve]) throw new Error('unknown curve:'+curve) return keysToJSON(curves[curve].generate(seed), curve) } //takes a public key and a hash and returns a signature. //(a signature must be a node buffer) exports.sign = function (keys, msg) { if(isString(msg)) msg = new Buffer(msg) if(!isBuffer(msg)) throw new Error('msg should be buffer') var curve = getCurve(keys) return curves[curve] .sign(toBuffer(keys.private || keys), msg) .toString('base64')+'.sig.'+curve } //takes a public key, signature, and a hash //and returns true if the signature was valid. exports.verify = function (keys, sig, msg) { if(isObject(sig)) throw new Error('signature should be base64 string, did you mean verifyObj(public, signed_obj)') return curves[getCurve(keys)].verify( toBuffer(keys.public || keys), toBuffer(sig), isBuffer(msg) ? msg : new Buffer(msg) ) } // OTHER CRYTPO FUNCTIONS exports.hmac = function (data, key) { return createHmac(createHash, 64, key) .update(data).digest('base64')+'.sha256.hmac' } exports.signObj = function (keys, obj) { var _obj = clone(obj) var b = new Buffer(JSON.stringify(_obj, null, 2)) _obj.signature = exports.sign(keys, b) return _obj } exports.verifyObj = function (keys, obj) { obj = clone(obj) var sig = obj.signature delete obj.signature var b = new Buffer(JSON.stringify(obj, null, 2)) return exports.verify(keys, sig, b) } exports.box = function (msg, recipients) { msg = new Buffer(JSON.stringify(msg)) recipients = recipients.map(function (keys) { var public = keys.public || keys return sodium.crypto_sign_ed25519_pk_to_curve25519(toBuffer(public)) }) //it's since the nonce is 24 bytes (a multiple of 3) //it's possible to concatenate the base64 strings //and still have a valid base64 string. return pb.multibox(msg, recipients).toString('base64')+'.box' } exports.unbox = function (boxed, keys) { boxed = toBuffer(boxed) var sk = sodium.crypto_sign_ed25519_sk_to_curve25519(toBuffer(keys.private || keys)) var msg = pb.multibox_open(boxed, sk) if(msg) return JSON.parse(''+msg) } }).call(this,require("buffer").Buffer) },{"./eccjs":529,"./sodium":534,"buffer":61,"chloride":80,"crypto":110,"deep-equal":531,"fs":58,"hmac":161,"mkdirp":248,"path":290,"private-box":293,"ssb-ref":573}],531:[function(require,module,exports){ var pSlice = Array.prototype.slice; var objectKeys = require('./lib/keys.js'); var isArguments = require('./lib/is_arguments.js'); var deepEqual = module.exports = function (actual, expected, opts) { if (!opts) opts = {}; // 7.1. All identical values are equivalent, as determined by ===. if (actual === expected) { return true; } else if (actual instanceof Date && expected instanceof Date) { return actual.getTime() === expected.getTime(); // 7.3. Other pairs that do not both pass typeof value == 'object', // equivalence is determined by ==. } else if (typeof actual != 'object' && typeof expected != 'object') { return opts.strict ? actual === expected : actual == expected; // 7.4. For all other Object pairs, including Array objects, equivalence is // determined by having the same number of owned properties (as verified // with Object.prototype.hasOwnProperty.call), the same set of keys // (although not necessarily the same order), equivalent values for every // corresponding key, and an identical 'prototype' property. Note: this // accounts for both named and indexed properties on Arrays. } else { return objEquiv(actual, expected, opts); } } function isUndefinedOrNull(value) { return value === null || value === undefined; } function isBuffer (x) { if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false; if (typeof x.copy !== 'function' || typeof x.slice !== 'function') { return false; } if (x.length > 0 && typeof x[0] !== 'number') return false; return true; } function objEquiv(a, b, opts) { var i, key; if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) return false; // an identical 'prototype' property. if (a.prototype !== b.prototype) return false; //~~~I've managed to break Object.keys through screwy arguments passing. // Converting to array solves the problem. if (isArguments(a)) { if (!isArguments(b)) { return false; } a = pSlice.call(a); b = pSlice.call(b); return deepEqual(a, b, opts); } if (isBuffer(a)) { if (!isBuffer(b)) { return false; } if (a.length !== b.length) return false; for (i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true; } try { var ka = objectKeys(a), kb = objectKeys(b); } catch (e) {//happens when one is a string literal and the other isn't return false; } // having the same number of owned properties (keys incorporates // hasOwnProperty) if (ka.length != kb.length) return false; //the same set of keys (although not necessarily the same order), ka.sort(); kb.sort(); //~~~cheap key test for (i = ka.length - 1; i >= 0; i--) { if (ka[i] != kb[i]) return false; } //equivalent values for every corresponding key, and //~~~possibly expensive deep test for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!deepEqual(a[key], b[key], opts)) return false; } return typeof a === typeof b; } },{"./lib/is_arguments.js":532,"./lib/keys.js":533}],532:[function(require,module,exports){ var supportsArgumentsClass = (function(){ return Object.prototype.toString.call(arguments) })() == '[object Arguments]'; exports = module.exports = supportsArgumentsClass ? supported : unsupported; exports.supported = supported; function supported(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; }; exports.unsupported = unsupported; function unsupported(object){ return object && typeof object == 'object' && typeof object.length == 'number' && Object.prototype.hasOwnProperty.call(object, 'callee') && !Object.prototype.propertyIsEnumerable.call(object, 'callee') || false; }; },{}],533:[function(require,module,exports){ exports = module.exports = typeof Object.keys === 'function' ? Object.keys : shim; exports.shim = shim; function shim (obj) { var keys = []; for (var key in obj) keys.push(key); return keys; } },{}],534:[function(require,module,exports){ var sodium = require('chloride') var crypto = require('crypto') module.exports = { curves: ['ed25519'], generate: function (seed) { var keys = sodium.crypto_sign_seed_keypair(seed || crypto.randomBytes(32)) return { curve: 'ed25519', public: keys.publicKey, //so that this works with either sodium //or libsodium-wrappers (in browser) private: keys.privateKey || keys.secretKey } }, sign: function (private, message) { return sodium.crypto_sign_detached(message, private) }, verify: function (public, sig, message) { return sodium.crypto_sign_verify_detached(sig, message, public) } } },{"chloride":80,"crypto":110}],535:[function(require,module,exports){ (function (process){ var pull = require('pull-stream') var Links = require('streamview-links') var path = require('path') var extractLinks = require('./links') //we could have up to six indexes for links, //but these are the three that we really need. //(queries are fast if the fields you already know //are left most, and the ranges are to the right of that. var indexes = [ { key: 'SRD', value: ['source', 'rel', 'dest', 'ts'] }, { key: 'DRS', value: ['dest', 'rel', 'source', 'ts'] }, { key: 'RDS', value: ['rel', 'dest', 'source', 'ts'] } ] exports.name = 'links2' exports.manifest = { read: 'source', dump: 'source' } exports.init = function (ssb, config) { var dir = path.join(config.path, 'links') var version = 5 //it's really nice to tweak a few things //and then change the version number, //restart the server and have it regenerate the indexes, //all consistent again. var links = Links(dir, indexes, extractLinks, version) links.init(function (err, since) { console.error('LOAD LINKS SINCE', err, since) pull( ssb.createLogStream({gt: since || 0, live: true, limit: -1}), pull.through(function (e) { process.stderr.write('.') }), links.write(function (err) { if(err) throw err }) ) }) return { dump: function () { return links.dump() }, read: function (opts) { if(opts && 'string' == typeof opts) try { opts = {query: JSON.parse(opts) } } catch (err) { return pull.error(err) } return links.read(opts) } } } }).call(this,require('_process')) },{"./links":536,"_process":295,"path":290,"pull-stream":537,"streamview-links":595}],536:[function(require,module,exports){ var msgs = require('ssb-msgs') module.exports = function (data, iter) { if(data.sync) return var content = data.value.content var source = data.value.author //TODO parse the links from markdown //and index those also. most of these are http links, //some ipfs. //it would be easy to tag another message, //and query that, once markdown links are ready //[#hashtag](msgId) would tag msg with #hashtag //TODO: what about a syntax for self-links? //interpret a lone hashtag in a message as a selflink, //and then that will work. msgs.indexLinks(data.value, function (ln, rel) { var dest = ln.link //take all the already existing links and put //the relavant aspects into the index, //as part of the rel, so that we don't need to lookup //the message to get them, and even better, //we can query by these attributes! enabling search. if(rel == 'vote') rel = ['vote', ln.value] else if(rel == 'flag') rel = ['flag', ln.reason] else if(rel == 'mentions') { if(ln.link[0] === '@') rel = ['mentions', '@'+(ln.name||'').toLowerCase()] else if(ln.link[0] == '&') { rel = ['mentions', ln.filename || ln.name, ln.size] } else { //TODO: check whether they included some text in the markdown link. rel = ['mentions'] } } else if(rel == 'about') { rel = ['about', content.name] } else if(rel == 'image') rel = ['image', ln.type, ln.size] else if(rel == 'contact') rel = ['contact', content.following, content.blocking] else rel = [rel] iter({ source: source, dest: dest, rel: rel, ts: data.timestamp }) }) } },{"ssb-msgs":542}],537:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":538,"./sinks":539,"./sources":540,"./throughs":541,"dup":232}],538:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],539:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],540:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],541:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":539,"./sources":540,"dup":236}],542:[function(require,module,exports){ var ref = require('ssb-ref') function isObject (o) { return o && 'object' === typeof o } function isBool (o) { return 'boolean' === typeof o } function isString (s) { return 'string' === typeof s } function toArray (v, force) { if (Array.isArray(v)) return v // maybe it's an array-like object? (object with ordered numeric keys) var i=0, arr=[] if (isObject(v)) { while (v[i]) { arr[i] = v[i] i++ } if (Object.keys(arr).length > 0) return arr // it was! } // it wasnt... if (force) { // ...just put v in the arr arr.push(v) return arr } return v } // given any part of the message-obj hierarchy, pull out the content-object // - uses ducktyping to find the content function toMsgContent (obj) { if (!obj) return null if (obj.value && obj.value.content && obj.value.content.type) return obj.value.content if (obj.content && obj.content.type) return obj.content return obj } function traverse (obj, each) { for (var k in obj) { if (!obj[k]) continue var arr = toArray(obj[k], false) if (Array.isArray(arr)) { arr.forEach(function (v) { each(v, k) }) } else each(obj[k], k) } } // iterate links in the message exports.indexLinks = function (message, opts, each) { if (typeof opts == 'function') { each = opts opts = null } if (typeof opts == 'string') opts = { rel: opts } if (!opts) opts = {} var msg = opts.msg var feed = opts.feed var blob = opts.blob var any = !(msg || feed || blob) traverse(toMsgContent(message), function (obj, rel) { if (opts.rel && rel !== opts.rel) return var r = (typeof obj == 'string') ? obj : obj.link if (any) { if (!ref.isLink(r)) return } else { if (msg) { if (isBool(msg) && ref.type(r) != 'msg') return if (!isBool(msg) && r != msg) return } if (feed) { if (isBool(feed) && ref.type(r) != 'feed') return if (!isBool(feed) && r != feed) return } if (blob) { if (isBool(blob) && ref.type(r) != 'blob') return if (!isBool(blob) && r != blob) return } } each((typeof obj == 'string') ? { link: obj } : obj, rel) }) } // coerce to link object, optionally of a given type // null if coersion fails exports.link = exports.asLink = function (obj, type) { if (!obj) return null if (isString(obj)) obj = { link: obj } return isLink(obj, type) ? obj : null } // coerce to links array, optionally of a given type // filters out failed coersions exports.links = exports.asLinks = function (obj, type) { if (!obj) return [] var arr = toArray(obj, true) return arr .filter(function (l) { return isLink(l, type) }) .map(function (o) { return (typeof o == 'string') ? { link: o } : o }) } // detects whether the given string/object is a link // - `type` optional var isLink = exports.isLink = function (obj, type) { if (!obj) return false var r = (isString(obj)) ? obj : obj.link return (type) ? (ref.type(r) == type) : ref.isLink(r) } function indexLinksTo (msgA, msgB, each) { if (!msgA || !msgB || !msgB.key) return exports.indexLinks(msgA, function (l, rel) { if (l.link === msgB.key) each(l, rel) }) } // iterate `msgA` and find all links to `msgB`, returning an array of the link objects exports.linksTo = function (msgA, msgB) { var links = [] indexLinksTo(msgA, msgB, function (link, rel) { links.push(link) }) return links } // iterate `msgA` and find all links to `msgB`, returning an array of the link rels exports.relationsTo = function (msgA, msgB) { var rels = [] indexLinksTo(msgA, msgB, function (link, rel) { rels.push(rel) }) return rels } },{"ssb-ref":573}],543:[function(require,module,exports){ arguments[4][542][0].apply(exports,arguments) },{"dup":542,"ssb-ref":573}],544:[function(require,module,exports){ (function (process){ var pull = require('pull-stream') var path = require('path') var Links = require('streamview-links') var explain = require('explain-error') exports.name = 'query' exports.version = require('./package.json').version exports.manifest = { read: 'source', dump: 'source' } var indexes = [ {key: 'clk', value: [['value', 'author'], ['value', 'sequence'], 'timestamp'] }, {key: 'typ', value: [['value', 'content', 'type'], 'timestamp'] }, {key: 'hsh', value: ['key', 'timestamp']}, // {key: 'aty', value: [['value', 'author'], ['value', 'content', 'type'], 'ts']} ] //createHistoryStream( id, seq ) //[{$filter: {author: , sequence: {$gt: }}}, {$map: true}] //messagesByType (type) //[{$filter: {content: {type: }}}, {$map: true}] exports.init = function (ssb, config) { var dir = path.join(config.path, 'query') var version = 12 //it's really nice to tweak a few things //and then change the version number, //restart the server and have it regenerate the indexes, //all consistent again. function id (e, emit) { return emit(e) } var links = Links(dir, indexes, id, version) links.init(function (err, since) { pull( ssb.createLogStream({gt: since || 0, live: true, limit: -1}), pull.through(function () { process.stdout.write('x') }), links.write(function (err) { if(err) throw err }) ) }) return { dump: function () { return links.dump() }, read: function (opts) { if(opts && 'string' == typeof opts) try { opts = {query: JSON.parse(opts) } } catch (err) { return pull.error(err) } console.log('query', JSON.stringify(opts.query, null, 2)) return links.read(opts, function (ts, cb) { ssb.sublevel('log').get(ts, function (err, key) { if(err) return cb(explain(err, 'missing timestamp:'+ts)) ssb.get(key, function (err, value) { if(err) return cb(explain(err, 'missing key:'+key)) cb(null, {key: key, value: value, timestamp: ts}) }) }) }) } } } }).call(this,require('_process')) },{"./package.json":572,"_process":295,"explain-error":146,"path":290,"pull-stream":563,"streamview-links":568}],545:[function(require,module,exports){ arguments[4][475][0].apply(exports,arguments) },{"bytewise-core":67,"dup":475,"typewise":627}],546:[function(require,module,exports){ arguments[4][476][0].apply(exports,arguments) },{"./binary":545,"dup":476}],547:[function(require,module,exports){ arguments[4][477][0].apply(exports,arguments) },{"./encoding/":546,"dup":477}],548:[function(require,module,exports){ module.exports = { $count: function (a, b) { if(b === undefined) return (a||0) return (a||0)+1 }, $sum: function (a, b) { if(b === undefined) return (a||0) return (a||0)+(b||0) }, $max: function (a, b) { if(b === undefined) a if(a === undefined) return b return Math.max(a, b) }, $min: function (a, b) { if(b === undefined) a if(a === undefined) return b return Math.min(a, b) }, $collect: function (a, b) { if(!a) a = a || [] if(!Array.isArray(a)) a = [a] a.push(b) return a } } },{}],549:[function(require,module,exports){ arguments[4][228][0].apply(exports,arguments) },{"./util":554,"dup":228}],550:[function(require,module,exports){ var pull = require('pull-stream') var filter = require('./filter') var map = require('./map') var reduce = require('./reduce') var SinkThrough = require('pull-sink-through') function first (q) { for(var k in q) return k } function get (q) { var k = first(q) var s = k.substring(1) if(k[0] == '$' && exports[s]) return exports[s](q[k]) throw new Error('unknown function:'+ k) } function last (l) { return l[l.length - 1] } exports = module.exports = function (q, cb) { q = q.filter(Boolean) if(last(q).$reduce && cb) { return pull.apply(null, q.slice(0, q.length - 1).map(get) .concat(exports.reduce(last(q).$reduce, cb)) ) } else if(Array.isArray(q)) return pull.apply(null, q.map(get)) else return get(q) } exports.filter = function (q) { return pull.filter(filter(q)) } exports.map = function (q) { return pull(pull.map(map(q)),pull.filter()) } exports.reduce = function (q, cb) { if(cb) return pull.reduce(reduce(q), null, cb) return pull(SinkThrough(function (cb) { return pull.reduce(reduce(q), null, cb) }), pull.flatten()) } },{"./filter":549,"./map":552,"./reduce":553,"pull-sink-through":379,"pull-stream":563}],551:[function(require,module,exports){ arguments[4][230][0].apply(exports,arguments) },{"./util":554,"dup":230}],552:[function(require,module,exports){ var u = require('./util') var map = u.map function id (v, k) { return k ? v[k] : v } function isNull (n) { return n == null } function key(q) { return function (v) { if(isNull(v)) return undefined return v[q] } } function path (q) { return q.reduce(function (map1, map2) { return function (v) { return map2(map1(v)) } }) } function notEmpty (o) { for(var k in o) return o return undefined } function obj (q) { return function (v) { if(isNull(v)) return undefined return notEmpty(map(q, function (fn, k, o) { return fn(v, k) })) } } function make(q) { if(true === q) return id if(isNull(q)) return isNull if(u.isString(q) || u.isNumber(q)) return key(q) if(u.isArray(q)) return path(q.map(make)) if(u.isObject(q)) return obj(map(q, make)) throw new Error('no match - should never happen') } module.exports = make },{"./util":554}],553:[function(require,module,exports){ var u = require('./util') var Map = require('./map') var simple = require('./basic') var search = require('binary-search') var compare = require('typewiselite') function isFunction (f) { return 'function' === typeof f } function isSimple(query) { if(query.$reduce) return amake(query.$reduce) for(var k in simple) if(u.has(query, k)) return lookup(simple[k], query[k]) } //this should be a reduce and a map function lookup(reduce, path) { if(path === true) return reduce return function (a, b) { return reduce(a, u.get(b, path)) } } function multi(query) { if(u.isFunction(query)) return query return function (a, b) { return u.map(query, function traverse (reduce, k) { //some reduce functions may be maps (which take one arg) return reduce.length == 1 ? reduce(b) : reduce(a[k], b) }, a = a || {}) } } //rawpaths, reducedpaths, reduce function arrayGroup (_g, g, reduce) { //we can use a different lookup path on the right hand object //is always the "needle" //compare(haystay[j], needle) function _compare (hay, needle) { for(var i in _g) { var x = u.get(hay, _g[i]), y = needle[i] if(x !== y) return compare(x, y) // < y ? -1 : 1 } return 0 } return function (a, b) { if(a && !Array.isArray(a)) a = reduce([], a) var A = a = a || [] var i = search(A, g.map(function (fn) { return fn(b) }), _compare) if(i >= 0) A[i] = reduce(A[i], b) else A.splice(~i, 0, reduce(undefined, b)) return a } } function objectGroup (g, reduce) { if('string' === typeof g) g = [g] return function (a, b) { var A = a = a || {} u.each(g, function (k, i) { var last = (i == (g.length - 1)) var v = u.get(b, k) A[v] = last ? reduce(A[v], b) : A[v] || {} A = A[v] }) return a } } function make2 (query) { var r = isSimple(query) if(r) return r if(query.$group) return objectGroup(query.$group, multi(make2(query.$reduce))) if(query.$reduce) return make2(query.$reduce) if(u.isObject(query)) return u.map(query, make2) return Map(query) } function make (query) { var r = isSimple(query) if(r) return r else if(query.$group) return objectGroup(query.$group, gmake(query.$reduce)) else if(u.isObject(query) && !u.isArray(query)) { return multi(u.map(query, gmake)) } else return function (a, b) { return u.get(b, query) } } function amake (query) { var _query = make2(query) if(query.$group) return objectGroup(query.$group, make(query.$reduce)) var r = isSimple(query) if(r) return r //get the lookup paths, and the paths they will be saved to. //these will both be passed to arrayGroup. var paths = [] var _paths = u.paths(_query, function (value) { if(u.isFunction(value) && value.length === 1) { return paths.push(value), true } }) return paths.length ? arrayGroup(_paths, paths, make(query)) : make(query) } function gmake (query) { if(query.$group && !query.$reduce) throw new Error('expected $reduce') return query.$group ? objectGroup(query.$group, gmake(query.$reduce)) : make(query) } module.exports = amake },{"./basic":548,"./map":552,"./util":554,"binary-search":20,"typewiselite":628}],554:[function(require,module,exports){ 'use strict' function isString(s) { return 'string' === typeof s } function isNumber(n) { return !isNaN(+n) } function isBoolean (b) { return 'boolean' === typeof b } function isBasic (p) { return isString(p) || isNumber(p) || isBoolean(p) } function isFunction (f) { return 'function' === typeof f } var isArray = Array.isArray function isObject (o) { return o && 'object' === typeof o && !isArray(o) } function has(o, k) { return Object.hasOwnProperty.call(o, k) } function isExact (v) { if(isBasic(v)) return true if(isArray(v)) return v.every(isExact) return isObject(v) && has(v, '$eq') } function isLtgt (v) { return has(v, '$lt') || has(v, '$gt') || has(v, '$lte') || has(v, '$gte') } function isRange (v) { if(!isObject(v)) return false if(isString(v.$prefix)) return true if(isArray(v)) return find(v, isRange) return isLtgt(v) } function find (ary, test) { for(var i = 0; i < ary.length; i++) if(test(ary[i], i, ary)) return true return false } function lower (v) { if(isBasic(v)) return v if(isObject(v)) { if(isArray(v.$prefix)) return v.$prefix.concat(exports.HI) if(isString(v.$prefix)) return v.$prefix if(has(v, '$gt')) return v.$gt if(has(v, '$gte')) return v.$gte } if(isArray(v)) return v.map(lower) } function upper (v) { if(isBasic(v)) return v if(isObject(v)) { if(isArray(v.$prefix)) return v.$prefix.concat(exports.LO) if(isString(v.$prefix)) return v.$prefix+'\uffff' if(has(v, '$le')) return v.$lt if(has(v, '$lte')) return v.$lte } if(isArray(v)) return v.map(upper) } function get(obj, path) { if(isString(path)) return obj[path] if(isArray(path)) { for(var i = 0; i < path.length; i++) { if(obj == null) return undefined obj = obj[path[i]] } return obj } if(path === true) return obj return undefined } function map(obj, iter, o) { if(Array.isArray(obj)) return obj.map(iter) o = o || {} for(var k in obj) o[k] = iter(obj[k], k, obj) return o } function mapa(obj, iter) { if(Array.isArray(obj)) return obj.map(iter) var a = [] for(var k in obj) { var v = iter(obj[k], k, obj) if(v !== undefined) a.push(v) } return a } function each(obj, iter) { if(Array.isArray(obj)) return obj.forEach(iter) else if(isObject(obj)) for(var k in obj) iter(obj[k], k, obj) else iter(obj) } function project (value, map, isObj) { isObj = isObj || isObject if(!isObj(value)) return map(value) else { var o for(var k in value) { var v = project(value[k], map, isObj) if(v !== undefined) (o = o || {})[k] = v } return o } } //get all paths within an object //this can probably be optimized to create less arrays! function paths (object, test) { var p = [] if(test(object)) return [] for(var key in object) { var value = object[key] if(test(value)) p.push(key) else if(isObject(value)) p = p.concat(paths(value, test).map(function (path) { return [key].concat(path) })) } return p } exports.isString = isString exports.isNumber = isNumber exports.isBasic = isBasic exports.isArray = isArray exports.isObject = isObject exports.isRange = isRange exports.isExact = isExact exports.isLtgt = isLtgt exports.isFunction = isFunction exports.has = has exports.get = get exports.map = map exports.mapa = mapa exports.project = project exports.paths = paths exports.each = each exports.upper = upper exports.lower = lower exports.HI = undefined exports.LO = null },{}],555:[function(require,module,exports){ arguments[4][345][0].apply(exports,arguments) },{"dup":345}],556:[function(require,module,exports){ arguments[4][487][0].apply(exports,arguments) },{"dup":487,"level-post":198,"pull-cat":305,"pull-pushable":557,"pull-stream":563,"pull-window":390,"stream-to-pull-stream":593}],557:[function(require,module,exports){ arguments[4][346][0].apply(exports,arguments) },{"dup":346,"pull-stream":558}],558:[function(require,module,exports){ arguments[4][347][0].apply(exports,arguments) },{"./maybe":559,"./sinks":560,"./sources":561,"./throughs":562,"dup":347,"pull-core":555}],559:[function(require,module,exports){ arguments[4][348][0].apply(exports,arguments) },{"dup":348,"pull-core":555}],560:[function(require,module,exports){ arguments[4][349][0].apply(exports,arguments) },{"dup":349}],561:[function(require,module,exports){ arguments[4][350][0].apply(exports,arguments) },{"dup":350}],562:[function(require,module,exports){ (function (process){ var u = require('pull-core') var sources = require('./sources') var sinks = require('./sinks') var prop = u.prop var id = u.id var tester = u.tester var map = exports.map = function (read, map) { map = prop(map) || id return function (end, cb) { read(end, function (end, data) { var data = !end ? map(data) : null cb(end, data) }) } } var asyncMap = exports.asyncMap = function (read, map) { if(!map) return read return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } var paraMap = exports.paraMap = function (read, map, width) { if(!map) return read var ended = false, queue = [], _cb function drain () { if(!_cb) return var cb = _cb _cb = null if(queue.length) return cb(null, queue.shift()) else if(ended && !n) return cb(ended) _cb = cb } function pull () { read(null, function (end, data) { if(end) { ended = end return drain() } n++ map(data, function (err, data) { n-- queue.push(data) drain() }) if(n < width && !ended) pull() }) } var n = 0 return function (end, cb) { if(end) return read(end, cb) //abort //continue to read while there are less than 3 maps in flight _cb = cb if(queue.length || ended) pull(), drain() else pull() } return highWaterMark(asyncMap(read, map), width) } var filter = exports.filter = function (read, test) { //regexp test = tester(test) return function next (end, cb) { read(end, function (end, data) { if(!end && !test(data)) return next(end, cb) cb(end, data) }) } } var filterNot = exports.filterNot = function (read, test) { test = tester(test) return filter(read, function (e) { return !test(e) }) } var through = exports.through = function (read, op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } var take = exports.take = function (read, test) { var ended = false if('number' === typeof test) { var n = test; test = function () { return n -- } } return function (end, cb) { if(ended) return cb(ended) if(ended = end) return read(ended, cb) read(null, function (end, data) { if(ended = ended || end) return cb(ended) if(!test(data)) { ended = true read(true, function (end, data) { cb(ended, data) }) } else cb(null, data) }) } } var unique = exports.unique = function (read, field, invert) { field = prop(field) || id var seen = {} return filter(read, function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } var nonUnique = exports.nonUnique = function (read, field) { return unique(read, field, true) } var group = exports.group = function (read, size) { var ended; size = size || 5 var queue = [] return function (end, cb) { //this means that the upstream is sending an error. if(end) return read(ended = end, cb) //this means that we read an end before. if(ended) return cb(ended) read(null, function next(end, data) { if(ended = ended || end) { if(!queue.length) return cb(ended) var _queue = queue; queue = [] return cb(null, _queue) } queue.push(data) if(queue.length < size) return read(null, next) var _queue = queue; queue = [] cb(null, _queue) }) } } var flatten = exports.flatten = function (read) { var _read return function (abort, cb) { if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (end, data) { if(end) nextStream() else cb(null, data) }) } function nextStream () { read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream)) stream = sources.values(stream) else if('function' != typeof stream) throw new Error('expected stream of streams') _read = stream nextChunk() }) } } } var prepend = exports.prepend = function (read, head) { return function (abort, cb) { if(head !== null) { if(abort) return read(abort, cb) var _head = head head = null cb(null, _head) } else { read(abort, cb) } } } //var drainIf = exports.drainIf = function (op, done) { // sinks.drain( //} var _reduce = exports._reduce = function (read, reduce, initial) { return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) sinks.drain(function (item) { initial = reduce(initial, item) }, function (err, data) { ended = err || true if(!err) cb(null, initial) else cb(ended) }) (read) } } var nextTick = process.nextTick var highWaterMark = exports.highWaterMark = function (read, highWaterMark) { var buffer = [], waiting = [], ended, reading = false highWaterMark = highWaterMark || 10 function readAhead () { while(waiting.length && (buffer.length || ended)) waiting.shift()(ended, ended ? null : buffer.shift()) } function next () { if(ended || reading || buffer.length >= highWaterMark) return reading = true return read(ended, function (end, data) { reading = false ended = ended || end if(data != null) buffer.push(data) next(); readAhead() }) } nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } }).call(this,require('_process')) },{"./sinks":560,"./sources":561,"_process":295,"pull-core":555}],563:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":564,"./sinks":565,"./sources":566,"./throughs":567,"dup":232}],564:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],565:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],566:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],567:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":565,"./sources":566,"dup":236}],568:[function(require,module,exports){ 'use strict' var level = require('level') var pull = require('pull-stream') var Write = require('pull-write') var pl = require('pull-level') var query = require('./query') var select = require('./select') var mfr = require('map-filter-reduce') var keys = require('map-filter-reduce/keys') var bytewise = require('bytewise') var paramap = require('pull-paramap') var explain = require('explain-error') var u = require('./util') var isArray = Array.isArray //sorted index. module.exports = function (path, indexes, links, version, codec) { codec = codec || require('bytewise') var db = level(path) if('string' !== typeof path) throw new Error('must provide path for leveldb instance') if(!Array.isArray(indexes)) throw new Error('must provide an array of indexes') if('number' !== typeof version) throw new Error('must provide version number') if(!links) links = function (data, emit) { emit(data) } //always write metada to the lowest key, //so the indexes do not interfeer //we don't want to encode this with the codec, //because then we can't change the codec safely //(prehaps the encoding of META is also some indexed value in another codec?) var META = '\x00' return { init: function (cb) { db.get(META, function (err, value) { console.log('RELOAD INDEX:', value) if(value) try { value = JSON.parse(value) } catch (err) { return cb(null, 0) } if(err) //first time this was run cb(null, 0) //if the view has changed, rebuild entire index. //else, read current version. else if(version && value.version !== version) { db.close(function () { level.destroy(path, function (err) { if(err) return cb(err) db = level(path) cb(null, 0) }) }) } else cb(null, value.since || 0) }) }, write: function (cb) { return pull( Write(function (batch, cb) { db.batch(batch, cb) }, function (batch, data) { if(data.sync) return batch if(!batch) batch = [{ key: META, value: {version: version, since: data.ts}, valueEncoding: 'json', type: 'put' }] function push(ary) { batch.push({key: codec.encode(ary), value: ' ', type: 'put'}) } links(data, function (link) { indexes.forEach(function (index) { var a = [index.key] for(var i = 0; i < index.value.length; i++) { var key = index.value[i] if(!u.has(key, link)) return a.push(u.get(key, link)) } push(a) }) }) var ts = data.ts || data.timestamp if(ts) batch[0].value.since = ts return batch }, 100, cb) ) }, close: function (cb) { db.close(cb) }, //get the raw indexes, for debugging. dump: function () { return pl.read(db, {keyEncoding: codec, gt: '\x00'}) }, //read all the messages out, via matching ranges. read: function (opts, get) { var lookup opts = opts || {} var _opts = {} var q, k if(isArray(opts.query)) { q = opts.query[0].$filter || {} k = keys(opts.query) } else if(opts.query) { q = opts.query } else q = {} var index = select(indexes, q) var _opts = query(index, q) console.log(_opts) _opts.values = false _opts.keys = true _opts.keyEncoding = codec _opts.reverse = !!opts.reverse _opts.live = !!opts.live _opts.limit = opts.limit || -1 // If a query uses a key not in the index // then we need to get that somehow. // if this is a key from the thing indexed, // it makes sense to look up that record. // how to do that might be different in a view. // just disable this for now. if(get) lookup = paramap(function (link, cb) { get(link.ts || link.timestamp, function (err, data) { if(err) return cb(explain(err, 'could not find matching timestamp for index:'+JSON.stringify(link))) link.key = data.key link.value = data.value cb(null, link) }) }) return pull( pl.read(db, _opts), //rehydrate the index to resemble the original object. pull.map(function (e) { var o = {} for(var i = 0; i < index.value.length; i++) u.set(index.value[i], e[i+1], o) return o }), lookup, isArray(opts.query) ? mfr(opts.query) : pull.through() ) } } } },{"./query":569,"./select":570,"./util":571,"bytewise":547,"explain-error":146,"level":199,"map-filter-reduce":550,"map-filter-reduce/keys":551,"pull-level":556,"pull-paramap":363,"pull-stream":563,"pull-write":393}],569:[function(require,module,exports){ var Q = require('map-filter-reduce/util') var select = require('./select') var get = require('./util').get function id (e) { return e } module.exports = function (index, query) { function bound (value, range, sentinel) { return ( value == null ? sentinel : Q.isRange(value) ? range(value) : value ) } function build (index, map) { var a = [index.key] for(var i = 0; i < index.value.length; i++) a.push(map(get(index.value[i], query))) return a } return { gte: build(index, function (value) { return bound(value, Q.lower, Q.LO) }), lte: build(index, function (value) { return bound(value, Q.upper, Q.HI) }) //reverse, limit, live? } } },{"./select":570,"./util":571,"map-filter-reduce/util":554}],570:[function(require,module,exports){ //of several indexes available, //select the one most suitable for a given query. // select the index that matches the most exact fields in the query // starting from the left, then moving on to range fields. var Q = require('map-filter-reduce/util') var u = require('./util') function max(array, compare) { return array.reduce(function (max, e) { return compare(e.value, max.value) > 0 ? e : max }, array[0]) } module.exports = function select (indexes, query) { function score (k) { var v = u.get(k, query) return u.has(k, query) ? ( Q.isExact(v) ? 3 : Q.isRange(v) ? 2 : 1 ) : 0 } function exact (k) { return u.has(k, query) && Q.isExact(u.get(k, query)) } function range (k) { return u.has(k, query) && Q.isRange(u.get(k, query)) } function compare(a, b) { var l = Math.min(a.length, b.length) for(var i = 0; i < l; i++) { var k = a[i], j = b[i] var v = score(k), x = score(j) if(v != x) return v - x // else, loop to next item. } return 0 } return max(indexes, compare) } },{"./util":571,"map-filter-reduce/util":554}],571:[function(require,module,exports){ exports.has = function has (key, obj) { if('string' === typeof key) return Object.hasOwnProperty.call(obj, key) for(var i in key) { if(Object.hasOwnProperty.call(obj, key[i])) obj = obj[key[i]] else return false } return true } exports.get = function get (key, obj) { if('string' === typeof key) return obj[key] for(var i in key) { obj = obj[key[i]] if(!obj) return obj } return obj } exports.set = function set(key, value, obj) { if('string' === typeof key) obj[key] = value else { for(var i = 0 ; i < key.length - 1; i++) { obj = (obj[key[i]] = obj[key[i]] || {}) } obj[key[key.length -1]] = value } } },{}],572:[function(require,module,exports){ module.exports={ "_args": [ [ "ssb-query@0.0.2", "/Users/joran/Documents/development/patchdeck" ] ], "_from": "ssb-query@0.0.2", "_id": "ssb-query@0.0.2", "_inCache": true, "_installable": true, "_location": "/ssb-query", "_nodeVersion": "5.6.0", "_npmOperationalInternal": { "host": "packages-16-east.internal.npmjs.com", "tmp": "tmp/ssb-query-0.0.2.tgz_1460607908133_0.18419223045930266" }, "_npmUser": { "email": "dominic.tarr@gmail.com", "name": "dominictarr" }, "_npmVersion": "3.6.0", "_phantomChildren": { "binary-search": "1.2.0", "bytewise-core": "1.2.3", "explain-error": "1.0.1", "level": "1.4.0", "level-post": "1.0.4", "pull-cat": "1.1.9", "pull-paramap": "1.1.4", "pull-sink-through": "0.0.0", "pull-window": "2.1.3", "pull-write": "1.0.2", "stream-to-pull-stream": "1.6.8", "typewise": "1.0.3", "typewiselite": "1.0.0" }, "_requested": { "name": "ssb-query", "raw": "ssb-query@0.0.2", "rawSpec": "0.0.2", "scope": null, "spec": "0.0.2", "type": "version" }, "_requiredBy": [ "/" ], "_resolved": "https://registry.npmjs.org/ssb-query/-/ssb-query-0.0.2.tgz", "_shasum": "9af20e734ffda21724873fad375d7d160e831eb3", "_shrinkwrap": null, "_spec": "ssb-query@0.0.2", "_where": "/Users/joran/Documents/development/patchdeck", "author": { "email": "dominic.tarr@gmail.com", "name": "Dominic Tarr", "url": "http://dominictarr.com" }, "bugs": { "url": "https://github.com/dominictarr/ssb-query/issues" }, "dependencies": { "explain-error": "^1.0.1", "streamview-links": "^2.0.0" }, "description": "", "devDependencies": {}, "directories": {}, "dist": { "shasum": "9af20e734ffda21724873fad375d7d160e831eb3", "tarball": "https://registry.npmjs.org/ssb-query/-/ssb-query-0.0.2.tgz" }, "gitHead": "901b36afd5fb25815ecf077e71a0a8825e847907", "homepage": "https://github.com/dominictarr/ssb-query", "license": "MIT", "maintainers": [ { "name": "dominictarr", "email": "dominic.tarr@gmail.com" } ], "name": "ssb-query", "optionalDependencies": {}, "readme": "ERROR: No README data found!", "repository": { "type": "git", "url": "git://github.com/dominictarr/ssb-query.git" }, "scripts": { "test": "set -e; for t in test/*.js; do node $t; done" }, "version": "0.0.2" } },{}],573:[function(require,module,exports){ var isDomain = require('is-valid-domain') var rx = require('ip-regex')({exact: true}) var isIP = rx.test.bind(rx) var isInteger = Number.isInteger function isString(s) { return 'string' === typeof s } var isLink = exports.isLink = function (data) { return isString(data) && /^(@|%|&)[A-Za-z0-9\/+]{43}=\.[\w\d]+$/.test(data) } var isFeedId = exports.isFeed = exports.isFeedId = function (data) { return isString(data) && /^@[A-Za-z0-9\/+]{43}=\.(?:sha256|ed25519)$/.test(data) } var isMsgId = exports.isMsg = exports.isMsgId = function (data) { return isString(data) && /^%[A-Za-z0-9\/+]{43}=\.sha256$/.test(data) } var isBlobId = exports.isBlob = exports.isBlobId = function (data) { return isString(data) && /^&[A-Za-z0-9\/+]{43}=\.sha256$/.test(data) } var isAddress = exports.isAddress = function (data) { if(!isString(data)) return false var parts = data.split(':') var id = parts.pop(), port = parts.pop(), addr = parts.join(':') return ( isFeedId(id) && isInteger(+port) && (isIP(addr) || isDomain(addr) || addr === 'localhost') ) } var isInvite = exports.isInvite = function (data) { if(!isString(data)) return false var parts = data.split('~') //console.log(parts, isAddress(parts[0]), /^[A-Za-z0-9\/+]{43}=$/.test(parts[1])) return parts.length == 2 && isAddress(parts[0]) && /^[A-Za-z0-9\/+]{43}=$/.test(parts[1]) } exports.type = function (id) { if(!isString(id)) return false var c = id.charAt(0) if (c == '@' && isFeedId(id)) return 'feed' else if (c == '%' && isMsgId(id)) return 'msg' else if (c == '&' && isBlobId(id)) return 'blob' else if(isAddress(id)) return 'address' else if(isInvite(id)) return 'invite' else return false } exports.extract = function (data) { if (!isString(data)) return false var _data = data try { _data = decodeURIComponent(data) } catch (e) {} // this may fail if it's not encoded, so don't worry if it does _data = _data.replace(/&/g, '&') var res = /([@%&][A-Za-z0-9\/+]{43}=\.[\w\d]+)/.exec(_data) return res && res[0] } },{"ip-regex":168,"is-valid-domain":171}],574:[function(require,module,exports){ module.exports = Stack; var Url = require('url'); function Stack(/*layers*/) { var error = Stack.errorHandler, handle = error; Array.prototype.slice.call(arguments).reverse().forEach(function (layer) { var child = handle; handle = function (req, res) { try { layer(req, res, function (err) { if (err) { return error(req, res, err); } child(req, res); }); } catch (err) { error(req, res, err); } }; }); return handle; } Stack.errorHandler = function error(req, res, err) { if (err) { console.error(err.stack); res.writeHead(500, {"Content-Type": "text/plain"}); res.end(err.stack + "\n"); return; } res.writeHead(404, {"Content-Type": "text/plain"}); res.end("Not Found\n"); }; function core(req, res, next) { next(); } // Build a composite stack made of several layers Stack.compose = function compose(/*layers*/) { // Don't bother composing singletons if (arguments.length == 1) { return arguments[0]; } var stack = core; Array.prototype.slice.call(arguments).reverse().forEach(function (layer) { var child = stack; stack = function (req, res, next) { try { layer(req, res, function (err) { if (err) { return next(err); } child(req, res, next); }); } catch (err) { next(err); } }; }); return stack; } // Mounts a substack app at a url subtree Stack.mount = function mount(mountpoint/*, stack*/) { var stack = Stack.compose.apply(null, Array.prototype.slice.call(arguments, 1)); if (mountpoint.substr(mountpoint.length - 1) == "/") { mountpoint = mountpoint.substr(0, mountpoint.length - 1); } var matchpoint = mountpoint + "/"; return function (req, res, next) { var url = req.url; var uri = req.uri; if (url.substr(0, matchpoint.length) !== matchpoint) { return next(); } // Modify the url if (!req.realUrl) { req.realUrl = url; } req.url = url.substr(mountpoint.length); if (req.uri) { req.uri = Url.parse(req.url); } stack(req, res, function (err) { req.url = url; req.uri = uri; next(err) }); }; }; },{"url":632}],575:[function(require,module,exports){ // // caluclate simple statistics // module.exports = Stats function Stats () { if (!(this instanceof Stats)) return new Stats() this.sum = 0 this.sqsum = 0 this.mean = 0 this.count = 0 this.max = null this.min = null } Stats.prototype = { value: function (val) { this.sum += val this.sqsum += val*val this.count ++ this.mean = this.sum / this.count this.max = this.max === null ? val : val > this.max ? val : this.max this.min = this.min === null ? val : val < this.min ? val : this.min return this }, get variance () { return this.sqsum / this.count - (this.mean * this.mean) }, get stdev() { return Math.sqrt(this.variance) }, toJSON: function () { return {mean: this.mean, count: this.count, stdev: this.stdev} } } },{}],576:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. module.exports = Stream; var EE = require('events').EventEmitter; var inherits = require('inherits'); inherits(Stream, EE); Stream.Readable = require('readable-stream/readable.js'); Stream.Writable = require('readable-stream/writable.js'); Stream.Duplex = require('readable-stream/duplex.js'); Stream.Transform = require('readable-stream/transform.js'); Stream.PassThrough = require('readable-stream/passthrough.js'); // Backwards-compat with node 0.4.x Stream.Stream = Stream; // old-style streams. Note that the pipe method (the only relevant // part of this class) is overridden in the Readable class. function Stream() { EE.call(this); } Stream.prototype.pipe = function(dest, options) { var source = this; function ondata(chunk) { if (dest.writable) { if (false === dest.write(chunk) && source.pause) { source.pause(); } } } source.on('data', ondata); function ondrain() { if (source.readable && source.resume) { source.resume(); } } dest.on('drain', ondrain); // If the 'end' option is not supplied, dest.end() will be called when // source gets the 'end' or 'close' events. Only dest.end() once. if (!dest._isStdio && (!options || options.end !== false)) { source.on('end', onend); source.on('close', onclose); } var didOnEnd = false; function onend() { if (didOnEnd) return; didOnEnd = true; dest.end(); } function onclose() { if (didOnEnd) return; didOnEnd = true; if (typeof dest.destroy === 'function') dest.destroy(); } // don't leave dangling pipes when there are errors. function onerror(er) { cleanup(); if (EE.listenerCount(this, 'error') === 0) { throw er; // Unhandled stream error in pipe. } } source.on('error', onerror); dest.on('error', onerror); // remove all the event listeners that were added. function cleanup() { source.removeListener('data', ondata); dest.removeListener('drain', ondrain); source.removeListener('end', onend); source.removeListener('close', onclose); source.removeListener('error', onerror); dest.removeListener('error', onerror); source.removeListener('end', cleanup); source.removeListener('close', cleanup); dest.removeListener('close', cleanup); } source.on('end', cleanup); source.on('close', cleanup); dest.on('close', cleanup); dest.emit('pipe', source); // Allow for unix-like usage: A.pipe(B).pipe(C) return dest; }; },{"events":144,"inherits":167,"readable-stream/duplex.js":578,"readable-stream/passthrough.js":584,"readable-stream/readable.js":585,"readable-stream/transform.js":586,"readable-stream/writable.js":587}],577:[function(require,module,exports){ arguments[4][23][0].apply(exports,arguments) },{"dup":23}],578:[function(require,module,exports){ arguments[4][24][0].apply(exports,arguments) },{"./lib/_stream_duplex.js":579,"dup":24}],579:[function(require,module,exports){ arguments[4][25][0].apply(exports,arguments) },{"./_stream_readable":581,"./_stream_writable":583,"core-util-is":104,"dup":25,"inherits":167,"process-nextick-args":294}],580:[function(require,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. 'use strict'; module.exports = PassThrough; var Transform = require('./_stream_transform'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); Transform.call(this, options); } PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; },{"./_stream_transform":582,"core-util-is":104,"inherits":167}],581:[function(require,module,exports){ (function (process){ 'use strict'; module.exports = Readable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var isArray = require('isarray'); /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Readable.ReadableState = ReadableState; var EE = require('events'); /**/ var EElistenerCount = function (emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream; (function () { try { Stream = require('st' + 'ream'); } catch (_) {} finally { if (!Stream) Stream = require('events').EventEmitter; } })(); /**/ var Buffer = require('buffer').Buffer; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var debugUtil = require('util'); var debug = undefined; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function () {}; } /**/ var StringDecoder; util.inherits(Readable, Stream); var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~ ~this.highWaterMark; this.buffer = []; this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; this.resumeScheduled = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } var Duplex; function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; if (options && typeof options.read === 'function') this._read = options.read; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function (chunk, encoding) { var state = this._readableState; if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = new Buffer(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function (chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; Readable.prototype.isPaused = function () { return this._readableState.flowing === false; }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var e = new Error('stream.unshift() after end event'); stream.emit('error', e); } else { var skipAdd; if (state.decoder && !addToFront && !encoding) { chunk = state.decoder.write(chunk); skipAdd = !state.objectMode && chunk.length === 0; } if (!addToFront) state.reading = false; // Don't add to the buffer if we've decoded to an empty string chunk and // we're not in object mode if (!skipAdd) { // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function (enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 8MB var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } function howMuchToRead(n, state) { if (state.length === 0 && state.ended) return 0; if (state.objectMode) return n === 0 ? 0 : 1; if (n === null || isNaN(n)) { // only flow one buffer at a time if (state.flowing && state.buffer.length) return state.buffer[0].length;else return state.length; } if (n <= 0) return 0; // If we're asking for more than the target buffer level, // then raise the water mark. Bump up to the next highest // power of 2, to prevent increasing it excessively in tiny // amounts. if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); // don't have that much. return null, unless we've ended. if (n > state.length) { if (!state.ended) { state.needReadable = true; return 0; } else { return state.length; } } return n; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function (n) { debug('read', n); var state = this._readableState; var nOrig = n; if (typeof n !== 'number' || n > 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; } // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (doRead && !state.reading) n = howMuchToRead(nOrig, state); var ret; if (n > 0) ret = fromList(n, state);else ret = null; if (ret === null) { state.needReadable = true; n = 0; } state.length -= n; // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (state.length === 0 && !state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended && state.length === 0) endReadable(this); if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break;else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= n in length. // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. Readable.prototype._read = function (n) { this.emit('error', new Error('not implemented')); }; Readable.prototype.pipe = function (dest, pipeOpts) { var src = this; var state = this._readableState; switch (state.pipesCount) { case 0: state.pipes = dest; break; case 1: state.pipes = [state.pipes, dest]; break; default: state.pipes.push(dest); break; } state.pipesCount += 1; debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var endFn = doEnd ? onend : cleanup; if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); dest.on('unpipe', onunpipe); function onunpipe(readable) { debug('onunpipe'); if (readable === src) { cleanup(); } } function onend() { debug('onend'); dest.end(); } // when the dest drains, it reduces the awaitDrain counter // on the source. This would be more elegant with a .once() // handler in flow(), but adding and removing repeatedly is // too slow. var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); var cleanedUp = false; function cleanup() { debug('cleanup'); // cleanup event handlers once the pipe is broken dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); dest.removeListener('error', onerror); dest.removeListener('unpipe', onunpipe); src.removeListener('end', onend); src.removeListener('end', cleanup); src.removeListener('data', ondata); cleanedUp = true; // if the reader is waiting for a drain event from this // specific writer, then it would cause it to never start // flowing again. // So, if this is awaiting a drain, then we just call it now. // If we don't know, then assume that we are waiting for one. if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } src.on('data', ondata); function ondata(chunk) { debug('ondata'); var ret = dest.write(chunk); if (false === ret) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write // also returned false. if (state.pipesCount === 1 && state.pipes[0] === dest && src.listenerCount('data') === 1 && !cleanedUp) { debug('false write response, pause', src._readableState.awaitDrain); src._readableState.awaitDrain++; } src.pause(); } } // if the dest has an error, then stop piping into it. // however, don't suppress the throwing behavior for this. function onerror(er) { debug('onerror', er); unpipe(); dest.removeListener('error', onerror); if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); } // This is a brutally ugly hack to make sure that our error handler // is attached before any userland ones. NEVER DO THIS. if (!dest._events || !dest._events.error) dest.on('error', onerror);else if (isArray(dest._events.error)) dest._events.error.unshift(onerror);else dest._events.error = [onerror, dest._events.error]; // Both close and finish should trigger unpipe, but only once. function onclose() { dest.removeListener('finish', onfinish); unpipe(); } dest.once('close', onclose); function onfinish() { debug('onfinish'); dest.removeListener('close', onclose); unpipe(); } dest.once('finish', onfinish); function unpipe() { debug('unpipe'); src.unpipe(dest); } // tell the dest that it's being piped to dest.emit('pipe', src); // start the flow if it hasn't been started already. if (!state.flowing) { debug('pipe resume'); src.resume(); } return dest; }; function pipeOnDrain(src) { return function () { var state = src._readableState; debug('pipeOnDrain', state.awaitDrain); if (state.awaitDrain) state.awaitDrain--; if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { state.flowing = true; flow(src); } }; } Readable.prototype.unpipe = function (dest) { var state = this._readableState; // if we're not piping anywhere, then do nothing. if (state.pipesCount === 0) return this; // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; if (!dest) dest = state.pipes; // got a match. state.pipes = null; state.pipesCount = 0; state.flowing = false; if (dest) dest.emit('unpipe', this); return this; } // slow case. multiple pipe destinations. if (!dest) { // remove all. var dests = state.pipes; var len = state.pipesCount; state.pipes = null; state.pipesCount = 0; state.flowing = false; for (var _i = 0; _i < len; _i++) { dests[_i].emit('unpipe', this); }return this; } // try to find the right one. var i = indexOf(state.pipes, dest); if (i === -1) return this; state.pipes.splice(i, 1); state.pipesCount -= 1; if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this); return this; }; // set up data events if they are asked for // Ensure readable listeners eventually get something Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); // If listening to data, and it has not explicitly been paused, // then call resume to start the flow of data on the next tick. if (ev === 'data' && false !== this._readableState.flowing) { this.resume(); } if (ev === 'readable' && !this._readableState.endEmitted) { var state = this._readableState; if (!state.readableListening) { state.readableListening = true; state.emittedReadable = false; state.needReadable = true; if (!state.reading) { processNextTick(nReadingNextTick, this); } else if (state.length) { emitReadable(this, state); } } } return res; }; Readable.prototype.addListener = Readable.prototype.on; function nReadingNextTick(self) { debug('readable nexttick read 0'); self.read(0); } // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. Readable.prototype.resume = function () { var state = this._readableState; if (!state.flowing) { debug('resume'); state.flowing = true; resume(this, state); } return this; }; function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; processNextTick(resume_, stream, state); } } function resume_(stream, state) { if (!state.reading) { debug('resume read 0'); stream.read(0); } state.resumeScheduled = false; stream.emit('resume'); flow(stream); if (state.flowing && !state.reading) stream.read(0); } Readable.prototype.pause = function () { debug('call pause flowing=%j', this._readableState.flowing); if (false !== this._readableState.flowing) { debug('pause'); this._readableState.flowing = false; this.emit('pause'); } return this; }; function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); if (state.flowing) { do { var chunk = stream.read(); } while (null !== chunk && state.flowing); } } // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. Readable.prototype.wrap = function (stream) { var state = this._readableState; var paused = false; var self = this; stream.on('end', function () { debug('wrapped end'); if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) self.push(chunk); } self.push(null); }); stream.on('data', function (chunk) { debug('wrapped data'); if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = self.push(chunk); if (!ret) { paused = true; stream.pause(); } }); // proxy all the other methods. // important when wrapping filters and duplexes. for (var i in stream) { if (this[i] === undefined && typeof stream[i] === 'function') { this[i] = function (method) { return function () { return stream[method].apply(stream, arguments); }; }(i); } } // proxy certain important events. var events = ['error', 'close', 'destroy', 'pause', 'resume']; forEach(events, function (ev) { stream.on(ev, self.emit.bind(self, ev)); }); // when we try to consume some more bytes, simply unpause the // underlying stream. self._read = function (n) { debug('wrapped _read', n); if (paused) { paused = false; stream.resume(); } }; return self; }; // exposed for testing purposes only. Readable._fromList = fromList; // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. function fromList(n, state) { var list = state.buffer; var length = state.length; var stringMode = !!state.decoder; var objectMode = !!state.objectMode; var ret; // nothing in the list, definitely empty. if (list.length === 0) return null; if (length === 0) ret = null;else if (objectMode) ret = list.shift();else if (!n || n >= length) { // read it all, truncate the array. if (stringMode) ret = list.join('');else if (list.length === 1) ret = list[0];else ret = Buffer.concat(list, length); list.length = 0; } else { // read just some of it. if (n < list[0].length) { // just take a part of the first list item. // slice is the same for buffers and strings. var buf = list[0]; ret = buf.slice(0, n); list[0] = buf.slice(n); } else if (n === list[0].length) { // first list is a perfect match ret = list.shift(); } else { // complex case. // we have enough to cover it, but it spans past the first buffer. if (stringMode) ret = '';else ret = new Buffer(n); var c = 0; for (var i = 0, l = list.length; i < l && c < n; i++) { var buf = list[0]; var cpy = Math.min(n - c, buf.length); if (stringMode) ret += buf.slice(0, cpy);else buf.copy(ret, c, 0, cpy); if (cpy < buf.length) list[0] = buf.slice(cpy);else list.shift(); c += cpy; } } } return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('endReadable called on non-empty stream'); if (!state.endEmitted) { state.ended = true; processNextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } } function forEach(xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":579,"_process":295,"buffer":61,"core-util-is":104,"events":144,"inherits":167,"isarray":577,"process-nextick-args":294,"string_decoder/":616,"util":33}],582:[function(require,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where // some bits pass through, and others are simply ignored. (That would // be a valid example of a transform, of course.) // // While the output is causally related to the input, it's not a // necessarily symmetric or synchronous transformation. For example, // a zlib stream might take multiple plain-text writes(), and then // emit a single compressed chunk some time in the future. // // Here's how this works: // // The Transform stream has all the aspects of the readable and writable // stream classes. When you write(chunk), that calls _write(chunk,cb) // internally, and returns false if there's a lot of pending writes // buffered up. When you call read(), that calls _read(n) until // there's enough pending readable data buffered up. // // In a transform stream, the written data is placed in a buffer. When // _read(n) is called, it transforms the queued up data, calling the // buffered _write cb's as it consumes chunks. If consuming a single // written chunk would result in multiple output chunks, then the first // outputted bit calls the readcb, and subsequent chunks just go into // the read buffer, and will cause it to emit 'readable' if necessary. // // This way, back-pressure is actually determined by the reading side, // since _read has to be called to start processing a new chunk. However, // a pathological inflate type of transform can cause excessive buffering // here. For example, imagine a stream where every byte of input is // interpreted as an integer from 0-255, and then results in that many // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in // 1kb of data being output. In this case, you could write a very small // amount of input, and end up with a very large amount of output. In // such a pathological inflating mechanism, there'd be no way to tell // the system to stop doing the transform. A single 4MB write could // cause the system to run out of memory. // // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. 'use strict'; module.exports = Transform; var Duplex = require('./_stream_duplex'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(Transform, Duplex); function TransformState(stream) { this.afterTransform = function (er, data) { return afterTransform(stream, er, data); }; this.needTransform = false; this.transforming = false; this.writecb = null; this.writechunk = null; this.writeencoding = null; } function afterTransform(stream, er, data) { var ts = stream._transformState; ts.transforming = false; var cb = ts.writecb; if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); ts.writechunk = null; ts.writecb = null; if (data !== null && data !== undefined) stream.push(data); cb(er); var rs = stream._readableState; rs.reading = false; if (rs.needReadable || rs.length < rs.highWaterMark) { stream._read(rs.highWaterMark); } } function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); this._transformState = new TransformState(this); // when the writable side finishes, then flush out anything remaining. var stream = this; // start out asking for a readable event once data is transformed. this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. this._readableState.sync = false; if (options) { if (typeof options.transform === 'function') this._transform = options.transform; if (typeof options.flush === 'function') this._flush = options.flush; } this.once('prefinish', function () { if (typeof this._flush === 'function') this._flush(function (er) { done(stream, er); });else done(stream); }); } Transform.prototype.push = function (chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); }; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // // Call `push(newChunk)` to pass along transformed output // to the readable side. You may call 'push' zero or more times. // // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. Transform.prototype._transform = function (chunk, encoding, cb) { throw new Error('not implemented'); }; Transform.prototype._write = function (chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } }; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. Transform.prototype._read = function (n) { var ts = this._transformState; if (ts.writechunk !== null && ts.writecb && !ts.transforming) { ts.transforming = true; this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in // will get processed, now that we've asked for it. ts.needTransform = true; } }; function done(stream, er) { if (er) return stream.emit('error', er); // if there's nothing in the write buffer, then that means // that nothing more will ever be provided var ws = stream._writableState; var ts = stream._transformState; if (ws.length) throw new Error('calling transform done when ws.length != 0'); if (ts.transforming) throw new Error('calling transform done when still transforming'); return stream.push(null); } },{"./_stream_duplex":579,"core-util-is":104,"inherits":167}],583:[function(require,module,exports){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all // the drain event emission and buffering. 'use strict'; module.exports = Writable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var asyncWrite = !true ? setImmediate : processNextTick; /**/ /**/ var Buffer = require('buffer').Buffer; /**/ Writable.WritableState = WritableState; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var internalUtil = { deprecate: require('util-deprecate') }; /**/ /**/ var Stream; (function () { try { Stream = require('st' + 'ream'); } catch (_) {} finally { if (!Stream) Stream = require('events').EventEmitter; } })(); /**/ var Buffer = require('buffer').Buffer; util.inherits(Writable, Stream); function nop() {} function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; this.next = null; } var Duplex; function WritableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~ ~this.highWaterMark; this.needDrain = false; // at the start of calling end() this.ending = false; // when end() has been called, and returned this.ended = false; // when 'finish' is emitted this.finished = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. var noDecode = options.decodeStrings === false; this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. this.length = 0; // a flag to see when we're in the middle of a write. this.writing = false; // when true all writes will be buffered until .uncork() call this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) this.onwrite = function (er) { onwrite(stream, er); }; // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; // the amount that is being written when _write is called. this.writelen = 0; this.bufferedRequest = null; this.lastBufferedRequest = null; // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams this.prefinished = false; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; // count buffered requests this.bufferedRequestCount = 0; // create the two objects needed to store the corked requests // they are not a linked list, as no new elements are inserted in there this.corkedRequestsFree = new CorkedRequest(this); this.corkedRequestsFree.next = new CorkedRequest(this); } WritableState.prototype.getBuffer = function writableStateGetBuffer() { var current = this.bufferedRequest; var out = []; while (current) { out.push(current); current = current.next; } return out; }; (function () { try { Object.defineProperty(WritableState.prototype, 'buffer', { get: internalUtil.deprecate(function () { return this.getBuffer(); }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') }); } catch (_) {} })(); var Duplex; function Writable(options) { Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, though they're not // instanceof Writable, they're instanceof Readable. if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); this._writableState = new WritableState(options, this); // legacy. this.writable = true; if (options) { if (typeof options.write === 'function') this._write = options.write; if (typeof options.writev === 'function') this._writev = options.writev; } Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function () { this.emit('error', new Error('Cannot pipe. Not readable.')); }; function writeAfterEnd(stream, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); processNextTick(cb, er); } // If we get something that is not a buffer, string, null, or undefined, // and we're not in objectMode, then that's an error. // Otherwise stream chunks are all considered to be of length=1, and the // watermarks determine how many objects to keep in the buffer, rather than // how many bytes or characters. function validChunk(stream, state, chunk, cb) { var valid = true; if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { var er = new TypeError('Invalid non-string/buffer chunk'); stream.emit('error', er); processNextTick(cb, er); valid = false; } return valid; } Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; if (typeof cb !== 'function') cb = nop; if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { state.pendingcb++; ret = writeOrBuffer(this, state, chunk, encoding, cb); } return ret; }; Writable.prototype.cork = function () { var state = this._writableState; state.corked++; }; Writable.prototype.uncork = function () { var state = this._writableState; if (state.corked) { state.corked--; if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } }; Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { // node::ParseEncoding() requires lower case. if (typeof encoding === 'string') encoding = encoding.toLowerCase(); if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); this._writableState.defaultEncoding = encoding; }; function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = new Buffer(chunk, encoding); } return chunk; } // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, chunk, encoding, cb) { chunk = decodeChunk(state, chunk, encoding); if (Buffer.isBuffer(chunk)) encoding = 'buffer'; var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing || state.corked) { var last = state.lastBufferedRequest; state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); if (last) { last.next = state.lastBufferedRequest; } else { state.bufferedRequest = state.lastBufferedRequest; } state.bufferedRequestCount += 1; } else { doWrite(stream, state, false, len, chunk, encoding, cb); } return ret; } function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { --state.pendingcb; if (sync) processNextTick(cb, er);else cb(er); stream._writableState.errorEmitted = true; stream.emit('error', er); } function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; onwriteStateUpdate(state); if (er) onwriteError(stream, state, sync, er, cb);else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(state); if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { clearBuffer(stream, state); } if (sync) { /**/ asyncWrite(afterWrite, stream, state, finished, cb); /**/ } else { afterWrite(stream, state, finished, cb); } } } function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); state.pendingcb--; cb(); finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } } // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; var entry = state.bufferedRequest; if (stream._writev && entry && entry.next) { // Fast case, write everything using _writev() var l = state.bufferedRequestCount; var buffer = new Array(l); var holder = state.corkedRequestsFree; holder.entry = entry; var count = 0; while (entry) { buffer[count] = entry; entry = entry.next; count += 1; } doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is always async, defer these to save a bit of time // as the hot path ends with doWrite state.pendingcb++; state.lastBufferedRequest = null; state.corkedRequestsFree = holder.next; holder.next = null; } else { // Slow case, write chunks one-by-one while (entry) { var chunk = entry.chunk; var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. if (state.writing) { break; } } if (entry === null) state.lastBufferedRequest = null; } state.bufferedRequestCount = 0; state.bufferedRequest = entry; state.bufferProcessing = false; } Writable.prototype._write = function (chunk, encoding, cb) { cb(new Error('not implemented')); }; Writable.prototype._writev = null; Writable.prototype.end = function (chunk, encoding, cb) { var state = this._writableState; if (typeof chunk === 'function') { cb = chunk; chunk = null; encoding = null; } else if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); } // ignore unnecessary end() calls. if (!state.ending && !state.finished) endWritable(this, state, cb); }; function needFinish(state) { return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } function prefinish(stream, state) { if (!state.prefinished) { state.prefinished = true; stream.emit('prefinish'); } } function finishMaybe(stream, state) { var need = needFinish(state); if (need) { if (state.pendingcb === 0) { prefinish(stream, state); state.finished = true; stream.emit('finish'); } else { prefinish(stream, state); } } return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { if (state.finished) processNextTick(cb);else stream.once('finish', cb); } state.ended = true; stream.writable = false; } // It seems a linked list but it is not // there will be only 2 of these for each stream function CorkedRequest(state) { var _this = this; this.next = null; this.entry = null; this.finish = function (err) { var entry = _this.entry; _this.entry = null; while (entry) { var cb = entry.callback; state.pendingcb--; cb(err); entry = entry.next; } if (state.corkedRequestsFree) { state.corkedRequestsFree.next = _this; } else { state.corkedRequestsFree = _this; } }; } },{"./_stream_duplex":579,"buffer":61,"core-util-is":104,"events":144,"inherits":167,"process-nextick-args":294,"util-deprecate":634}],584:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") },{"./lib/_stream_passthrough.js":580}],585:[function(require,module,exports){ var Stream = (function (){ try { return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify } catch(_){} }()); exports = module.exports = require('./lib/_stream_readable.js'); exports.Stream = Stream || exports; exports.Readable = exports; exports.Writable = require('./lib/_stream_writable.js'); exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); // inline-process-browser and unreachable-branch-transform make sure this is // removed in browserify builds if (!true) { module.exports = require('stream'); } },{"./lib/_stream_duplex.js":579,"./lib/_stream_passthrough.js":580,"./lib/_stream_readable.js":581,"./lib/_stream_transform.js":582,"./lib/_stream_writable.js":583,"stream":576}],586:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") },{"./lib/_stream_transform.js":582}],587:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") },{"./lib/_stream_writable.js":583}],588:[function(require,module,exports){ (function (global){ var ClientRequest = require('./lib/request') var extend = require('xtend') var statusCodes = require('builtin-status-codes') var url = require('url') var http = exports http.request = function (opts, cb) { if (typeof opts === 'string') opts = url.parse(opts) else opts = extend(opts) // Normally, the page is loaded from http or https, so not specifying a protocol // will result in a (valid) protocol-relative url. However, this won't work if // the protocol is something else, like 'file:' var defaultProtocol = global.location.protocol.search(/^https?:$/) === -1 ? 'http:' : '' var protocol = opts.protocol || defaultProtocol var host = opts.hostname || opts.host var port = opts.port var path = opts.path || '/' // Necessary for IPv6 addresses if (host && host.indexOf(':') !== -1) host = '[' + host + ']' // This may be a relative url. The browser should always be able to interpret it correctly. opts.url = (host ? (protocol + '//' + host) : '') + (port ? ':' + port : '') + path opts.method = (opts.method || 'GET').toUpperCase() opts.headers = opts.headers || {} // Also valid opts.auth, opts.mode var req = new ClientRequest(opts) if (cb) req.on('response', cb) return req } http.get = function get (opts, cb) { var req = http.request(opts, cb) req.end() return req } http.Agent = function () {} http.Agent.defaultMaxSockets = 4 http.STATUS_CODES = statusCodes http.METHODS = [ 'CHECKOUT', 'CONNECT', 'COPY', 'DELETE', 'GET', 'HEAD', 'LOCK', 'M-SEARCH', 'MERGE', 'MKACTIVITY', 'MKCOL', 'MOVE', 'NOTIFY', 'OPTIONS', 'PATCH', 'POST', 'PROPFIND', 'PROPPATCH', 'PURGE', 'PUT', 'REPORT', 'SEARCH', 'SUBSCRIBE', 'TRACE', 'UNLOCK', 'UNSUBSCRIBE' ] }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./lib/request":590,"builtin-status-codes":64,"url":632,"xtend":592}],589:[function(require,module,exports){ (function (global){ exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableByteStream) exports.blobConstructor = false try { new Blob([new ArrayBuffer(1)]) exports.blobConstructor = true } catch (e) {} var xhr = new global.XMLHttpRequest() // If location.host is empty, e.g. if this page/worker was loaded // from a Blob, then use example.com to avoid an error xhr.open('GET', global.location.host ? '/' : 'https://example.com') function checkTypeSupport (type) { try { xhr.responseType = type return xhr.responseType === type } catch (e) {} return false } // For some strange reason, Safari 7.0 reports typeof global.ArrayBuffer === 'object'. // Safari 7.1 appears to have fixed this bug. var haveArrayBuffer = typeof global.ArrayBuffer !== 'undefined' var haveSlice = haveArrayBuffer && isFunction(global.ArrayBuffer.prototype.slice) exports.arraybuffer = haveArrayBuffer && checkTypeSupport('arraybuffer') // These next two tests unavoidably show warnings in Chrome. Since fetch will always // be used if it's available, just return false for these to avoid the warnings. exports.msstream = !exports.fetch && haveSlice && checkTypeSupport('ms-stream') exports.mozchunkedarraybuffer = !exports.fetch && haveArrayBuffer && checkTypeSupport('moz-chunked-arraybuffer') exports.overrideMimeType = isFunction(xhr.overrideMimeType) exports.vbArray = isFunction(global.VBArray) function isFunction (value) { return typeof value === 'function' } xhr = null // Help gc }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],590:[function(require,module,exports){ (function (process,global,Buffer){ // var Base64 = require('Base64') var capability = require('./capability') var inherits = require('inherits') var response = require('./response') var stream = require('stream') var toArrayBuffer = require('to-arraybuffer') var IncomingMessage = response.IncomingMessage var rStates = response.readyStates function decideMode (preferBinary) { if (capability.fetch) { return 'fetch' } else if (capability.mozchunkedarraybuffer) { return 'moz-chunked-arraybuffer' } else if (capability.msstream) { return 'ms-stream' } else if (capability.arraybuffer && preferBinary) { return 'arraybuffer' } else if (capability.vbArray && preferBinary) { return 'text:vbarray' } else { return 'text' } } var ClientRequest = module.exports = function (opts) { var self = this stream.Writable.call(self) self._opts = opts self._body = [] self._headers = {} if (opts.auth) self.setHeader('Authorization', 'Basic ' + new Buffer(opts.auth).toString('base64')) Object.keys(opts.headers).forEach(function (name) { self.setHeader(name, opts.headers[name]) }) var preferBinary if (opts.mode === 'prefer-streaming') { // If streaming is a high priority but binary compatibility and // the accuracy of the 'content-type' header aren't preferBinary = false } else if (opts.mode === 'allow-wrong-content-type') { // If streaming is more important than preserving the 'content-type' header preferBinary = !capability.overrideMimeType } else if (!opts.mode || opts.mode === 'default' || opts.mode === 'prefer-fast') { // Use binary if text streaming may corrupt data or the content-type header, or for speed preferBinary = true } else { throw new Error('Invalid value for opts.mode') } self._mode = decideMode(preferBinary) self.on('finish', function () { self._onFinish() }) } inherits(ClientRequest, stream.Writable) ClientRequest.prototype.setHeader = function (name, value) { var self = this var lowerName = name.toLowerCase() // This check is not necessary, but it prevents warnings from browsers about setting unsafe // headers. To be honest I'm not entirely sure hiding these warnings is a good thing, but // http-browserify did it, so I will too. if (unsafeHeaders.indexOf(lowerName) !== -1) return self._headers[lowerName] = { name: name, value: value } } ClientRequest.prototype.getHeader = function (name) { var self = this return self._headers[name.toLowerCase()].value } ClientRequest.prototype.removeHeader = function (name) { var self = this delete self._headers[name.toLowerCase()] } ClientRequest.prototype._onFinish = function () { var self = this if (self._destroyed) return var opts = self._opts var headersObj = self._headers var body if (opts.method === 'POST' || opts.method === 'PUT' || opts.method === 'PATCH') { if (capability.blobConstructor) { body = new global.Blob(self._body.map(function (buffer) { return toArrayBuffer(buffer) }), { type: (headersObj['content-type'] || {}).value || '' }) } else { // get utf8 string body = Buffer.concat(self._body).toString() } } if (self._mode === 'fetch') { var headers = Object.keys(headersObj).map(function (name) { return [headersObj[name].name, headersObj[name].value] }) global.fetch(self._opts.url, { method: self._opts.method, headers: headers, body: body, mode: 'cors', credentials: opts.withCredentials ? 'include' : 'same-origin' }).then(function (response) { self._fetchResponse = response self._connect() }, function (reason) { self.emit('error', reason) }) } else { var xhr = self._xhr = new global.XMLHttpRequest() try { xhr.open(self._opts.method, self._opts.url, true) } catch (err) { process.nextTick(function () { self.emit('error', err) }) return } // Can't set responseType on really old browsers if ('responseType' in xhr) xhr.responseType = self._mode.split(':')[0] if ('withCredentials' in xhr) xhr.withCredentials = !!opts.withCredentials if (self._mode === 'text' && 'overrideMimeType' in xhr) xhr.overrideMimeType('text/plain; charset=x-user-defined') Object.keys(headersObj).forEach(function (name) { xhr.setRequestHeader(headersObj[name].name, headersObj[name].value) }) self._response = null xhr.onreadystatechange = function () { switch (xhr.readyState) { case rStates.LOADING: case rStates.DONE: self._onXHRProgress() break } } // Necessary for streaming in Firefox, since xhr.response is ONLY defined // in onprogress, not in onreadystatechange with xhr.readyState = 3 if (self._mode === 'moz-chunked-arraybuffer') { xhr.onprogress = function () { self._onXHRProgress() } } xhr.onerror = function () { if (self._destroyed) return self.emit('error', new Error('XHR error')) } try { xhr.send(body) } catch (err) { process.nextTick(function () { self.emit('error', err) }) return } } } /** * Checks if xhr.status is readable and non-zero, indicating no error. * Even though the spec says it should be available in readyState 3, * accessing it throws an exception in IE8 */ function statusValid (xhr) { try { var status = xhr.status return (status !== null && status !== 0) } catch (e) { return false } } ClientRequest.prototype._onXHRProgress = function () { var self = this if (!statusValid(self._xhr) || self._destroyed) return if (!self._response) self._connect() self._response._onXHRProgress() } ClientRequest.prototype._connect = function () { var self = this if (self._destroyed) return self._response = new IncomingMessage(self._xhr, self._fetchResponse, self._mode) self.emit('response', self._response) } ClientRequest.prototype._write = function (chunk, encoding, cb) { var self = this self._body.push(chunk) cb() } ClientRequest.prototype.abort = ClientRequest.prototype.destroy = function () { var self = this self._destroyed = true if (self._response) self._response._destroyed = true if (self._xhr) self._xhr.abort() // Currently, there isn't a way to truly abort a fetch. // If you like bikeshedding, see https://github.com/whatwg/fetch/issues/27 } ClientRequest.prototype.end = function (data, encoding, cb) { var self = this if (typeof data === 'function') { cb = data data = undefined } stream.Writable.prototype.end.call(self, data, encoding, cb) } ClientRequest.prototype.flushHeaders = function () {} ClientRequest.prototype.setTimeout = function () {} ClientRequest.prototype.setNoDelay = function () {} ClientRequest.prototype.setSocketKeepAlive = function () {} // Taken from http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method var unsafeHeaders = [ 'accept-charset', 'accept-encoding', 'access-control-request-headers', 'access-control-request-method', 'connection', 'content-length', 'cookie', 'cookie2', 'date', 'dnt', 'expect', 'host', 'keep-alive', 'origin', 'referer', 'te', 'trailer', 'transfer-encoding', 'upgrade', 'user-agent', 'via' ] }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) },{"./capability":589,"./response":591,"_process":295,"buffer":61,"inherits":167,"stream":576,"to-arraybuffer":619}],591:[function(require,module,exports){ (function (process,global,Buffer){ var capability = require('./capability') var inherits = require('inherits') var stream = require('stream') var rStates = exports.readyStates = { UNSENT: 0, OPENED: 1, HEADERS_RECEIVED: 2, LOADING: 3, DONE: 4 } var IncomingMessage = exports.IncomingMessage = function (xhr, response, mode) { var self = this stream.Readable.call(self) self._mode = mode self.headers = {} self.rawHeaders = [] self.trailers = {} self.rawTrailers = [] // Fake the 'close' event, but only once 'end' fires self.on('end', function () { // The nextTick is necessary to prevent the 'request' module from causing an infinite loop process.nextTick(function () { self.emit('close') }) }) if (mode === 'fetch') { self._fetchResponse = response self.statusCode = response.status self.statusMessage = response.statusText // backwards compatible version of for ( of ): // for (var ,_i,_it = [Symbol.iterator](); = (_i = _it.next()).value,!_i.done;) for (var header, _i, _it = response.headers[Symbol.iterator](); header = (_i = _it.next()).value, !_i.done;) { self.headers[header[0].toLowerCase()] = header[1] self.rawHeaders.push(header[0], header[1]) } // TODO: this doesn't respect backpressure. Once WritableStream is available, this can be fixed var reader = response.body.getReader() function read () { reader.read().then(function (result) { if (self._destroyed) return if (result.done) { self.push(null) return } self.push(new Buffer(result.value)) read() }) } read() } else { self._xhr = xhr self._pos = 0 self.statusCode = xhr.status self.statusMessage = xhr.statusText var headers = xhr.getAllResponseHeaders().split(/\r?\n/) headers.forEach(function (header) { var matches = header.match(/^([^:]+):\s*(.*)/) if (matches) { var key = matches[1].toLowerCase() if (key === 'set-cookie') { if (self.headers[key] === undefined) { self.headers[key] = [] } self.headers[key].push(matches[2]) } else if (self.headers[key] !== undefined) { self.headers[key] += ', ' + matches[2] } else { self.headers[key] = matches[2] } self.rawHeaders.push(matches[1], matches[2]) } }) self._charset = 'x-user-defined' if (!capability.overrideMimeType) { var mimeType = self.rawHeaders['mime-type'] if (mimeType) { var charsetMatch = mimeType.match(/;\s*charset=([^;])(;|$)/) if (charsetMatch) { self._charset = charsetMatch[1].toLowerCase() } } if (!self._charset) self._charset = 'utf-8' // best guess } } } inherits(IncomingMessage, stream.Readable) IncomingMessage.prototype._read = function () {} IncomingMessage.prototype._onXHRProgress = function () { var self = this var xhr = self._xhr var response = null switch (self._mode) { case 'text:vbarray': // For IE9 if (xhr.readyState !== rStates.DONE) break try { // This fails in IE8 response = new global.VBArray(xhr.responseBody).toArray() } catch (e) {} if (response !== null) { self.push(new Buffer(response)) break } // Falls through in IE8 case 'text': try { // This will fail when readyState = 3 in IE9. Switch mode and wait for readyState = 4 response = xhr.responseText } catch (e) { self._mode = 'text:vbarray' break } if (response.length > self._pos) { var newData = response.substr(self._pos) if (self._charset === 'x-user-defined') { var buffer = new Buffer(newData.length) for (var i = 0; i < newData.length; i++) buffer[i] = newData.charCodeAt(i) & 0xff self.push(buffer) } else { self.push(newData, self._charset) } self._pos = response.length } break case 'arraybuffer': if (xhr.readyState !== rStates.DONE) break response = xhr.response self.push(new Buffer(new Uint8Array(response))) break case 'moz-chunked-arraybuffer': // take whole response = xhr.response if (xhr.readyState !== rStates.LOADING || !response) break self.push(new Buffer(new Uint8Array(response))) break case 'ms-stream': response = xhr.response if (xhr.readyState !== rStates.LOADING) break var reader = new global.MSStreamReader() reader.onprogress = function () { if (reader.result.byteLength > self._pos) { self.push(new Buffer(new Uint8Array(reader.result.slice(self._pos)))) self._pos = reader.result.byteLength } } reader.onload = function () { self.push(null) } // reader.onerror = ??? // TODO: this reader.readAsArrayBuffer(response) break } // The ms-stream case handles end separately in reader.onload() if (self._xhr.readyState === rStates.DONE && self._mode !== 'ms-stream') { self.push(null) } } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) },{"./capability":589,"_process":295,"buffer":61,"inherits":167,"stream":576}],592:[function(require,module,exports){ arguments[4][177][0].apply(exports,arguments) },{"dup":177}],593:[function(require,module,exports){ (function (process){ var pull = require('pull-stream/pull') function destroy(stream, cb) { function onClose () { cleanup(); cb() } function onError (err) { cleanup(); cb(err) } function cleanup() { stream.removeListener('close', onClose) stream.removeListener('error', onError) } stream.on('close', onClose) stream.on('error', onError) } function write(read, stream, cb) { var ended, closed = false, did function done () { if(did) return did = true cb && cb(ended === true ? null : ended) } function onClose () { if(closed) return closed = true cleanup() if(!ended) read(ended = true, done) else done() } function onError (err) { cleanup() if(!ended) read(ended = err, done) } function cleanup() { stream.on('finish', onClose) stream.removeListener('close', onClose) stream.removeListener('error', onError) } stream.on('close', onClose) stream.on('finish', onClose) stream.on('error', onError) process.nextTick(function next() { read(null, function (end, data) { ended = ended || end //you can't "end" a stdout stream, so this needs to be handled specially. if(end === true) return stream._isStdio ? done() : stream.end() if(ended = ended || end) { stream.destroy && stream.destroy() return done(ended) } //I noticed a problem streaming to the terminal: //sometimes the end got cut off, creating invalid output. //it seems that stdout always emits "drain" when it ends. //so this seems to work, but i have been unable to reproduce this test //automatically, so you need to run ./test/stdout.js a few times and the end is valid json. if(stream._isStdio) stream.write(data, function () { next() }) else { var pause = stream.write(data) if(pause === false) stream.once('drain', next) else next() } }) }) } function first (emitter, events, handler) { function listener (val) { events.forEach(function (e) { emitter.removeListener(e, listener) }) handler(val) } events.forEach(function (e) { emitter.on(e, listener) }) return emitter } function read2(stream) { var ended = false, waiting = false var _cb function read () { var data = stream.read() if(data !== null && _cb) { var cb = _cb; _cb = null cb(null, data) } } stream.on('readable', function () { waiting = true _cb && read() }) .on('end', function () { ended = true _cb && _cb(ended) }) .on('error', function (err) { ended = err _cb && _cb(ended) }) return function (end, cb) { _cb = cb if(ended) cb(ended) else if(waiting) read() } } function read1(stream) { var buffer = [], cbs = [], ended, paused = false var draining function drain() { while((buffer.length || ended) && cbs.length) cbs.shift()(buffer.length ? null : ended, buffer.shift()) if(!buffer.length && (paused)) { paused = false stream.resume() } } stream.on('data', function (data) { buffer.push(data) drain() if(buffer.length && stream.pause) { paused = true stream.pause() } }) stream.on('end', function () { ended = true drain() }) stream.on('error', function (err) { ended = err drain() }) return function (abort, cb) { if(!cb) throw new Error('*must* provide cb') if(abort) { stream.once('close', function () { cb(abort) }) stream.destroy() } cbs.push(cb) drain() } } var read = read1 var sink = function (stream, cb) { return function (read) { return write(read, stream, cb) } } var source = function (stream) { return read1(stream) } exports = module.exports = function (stream, cb) { return ( (stream.writable && stream.write) ? stream.readable ? function(_read) { write(_read, stream, cb); return read1(stream) } : sink(stream, cb) : source(stream) ) } exports.sink = sink exports.source = source exports.read = read exports.read1 = read1 exports.read2 = read2 exports.duplex = function (stream, cb) { return { source: source(stream), sink: sink(stream, cb) } } }).call(this,require('_process')) },{"_process":295,"pull-stream/pull":594}],594:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],595:[function(require,module,exports){ 'use strict' var level = require('level') var pull = require('pull-stream') var Write = require('pull-write') var pl = require('pull-level') var query = require('./query') var select = require('./select') var mfr = require('map-filter-reduce') var keys = require('map-filter-reduce/keys') var bytewise = require('bytewise') var paramap = require('pull-paramap') var u = require('./util') var isArray = Array.isArray //sorted index. module.exports = function (path, indexes, links, version, codec) { codec = codec || require('bytewise') var db = level(path) if('string' !== typeof path) throw new Error('must provide path for leveldb instance') if(!Array.isArray(indexes)) throw new Error('must provide an array of indexes') if('number' !== typeof version) throw new Error('must provide version number') if(!links) links = function (data, emit) { emit(data) } //always write metada to the lowest key, //so the indexes do not interfeer //we don't want to encode this with the codec, //because then we can't change the codec safely //(prehaps the encoding of META is also some indexed value in another codec?) var META = '\x00' return { init: function (cb) { db.get(META, function (err, value) { console.log('RELOAD INDEX:', value) if(value) try { value = JSON.parse(value) } catch (err) { return cb(null, 0) } if(err) //first time this was run cb(null, 0) //if the view has changed, rebuild entire index. //else, read current version. else if(version && value.version !== version) { db.close(function () { level.destroy(path, function (err) { if(err) return cb(err) db = level(path) cb(null, 0) }) }) } else cb(null, value.since || 0) }) }, write: function (cb) { return pull( Write(function (batch, cb) { db.batch(batch, cb) }, function (batch, data) { if(data.sync) return batch if(!batch) batch = [{ key: META, value: {version: version, since: data.ts}, valueEncoding: 'json', type: 'put' }] function push(ary) { batch.push({key: codec.encode(ary), value: ' ', type: 'put'}) } links(data, function (link) { indexes.forEach(function (index) { var a = [index.key] for(var i = 0; i < index.value.length; i++) { var key = index.value[i] if(!u.has(key, link)) return a.push(u.get(key, link)) } push(a) }) }) var ts = data.ts || data.timestamp if(ts) batch[0].value.since = ts return batch }, 100, cb) ) }, close: function (cb) { db.close(cb) }, //get the raw indexes, for debugging. dump: function () { return pl.read(db, {keyEncoding: codec, gt: '\x00'}) }, //read all the messages out, via matching ranges. read: function (opts, get) { var lookup opts = opts || {} var _opts = {} var q, k if(isArray(opts.query)) { q = opts.query[0].$filter || {} k = keys(opts.query) } else if(opts.query) { q = opts.query } else q = {} var index = select(indexes, q) var _opts = query(index, q) _opts.values = false _opts.keys = true _opts.keyEncoding = codec _opts.reverse = opts.reverse _opts.live = opts.live _opts.limit = opts.limit // If a query uses a key not in the index // then we need to get that somehow. // if this is a key from the thing indexed, // it makes sense to look up that record. // how to do that might be different in a view. // just disable this for now. if(get) lookup = paramap(function (link, cb) { get(link.ts || link.timestamp, function (err, data) { if(err) return cb(err) link.key = data.key link.value = data.value cb(null, link) }) }) // else // lookup = pull.through() return pull( pl.read(db, _opts), //rehydrate the index to resemble the original object. pull.map(function (e) { var o = {} for(var i = 0; i < index.value.length; i++) u.set(index.value[i], e[i+1], o) return o }), lookup, isArray(opts.query) ? mfr(opts.query) : pull.through() ) } } } },{"./query":612,"./select":613,"./util":614,"bytewise":598,"level":199,"map-filter-reduce":229,"map-filter-reduce/keys":230,"pull-level":600,"pull-paramap":363,"pull-stream":607,"pull-write":393}],596:[function(require,module,exports){ arguments[4][475][0].apply(exports,arguments) },{"bytewise-core":67,"dup":475,"typewise":627}],597:[function(require,module,exports){ arguments[4][476][0].apply(exports,arguments) },{"./binary":596,"dup":476}],598:[function(require,module,exports){ arguments[4][477][0].apply(exports,arguments) },{"./encoding/":597,"dup":477}],599:[function(require,module,exports){ arguments[4][345][0].apply(exports,arguments) },{"dup":345}],600:[function(require,module,exports){ arguments[4][487][0].apply(exports,arguments) },{"dup":487,"level-post":198,"pull-cat":305,"pull-pushable":601,"pull-stream":607,"pull-window":390,"stream-to-pull-stream":593}],601:[function(require,module,exports){ arguments[4][346][0].apply(exports,arguments) },{"dup":346,"pull-stream":602}],602:[function(require,module,exports){ arguments[4][347][0].apply(exports,arguments) },{"./maybe":603,"./sinks":604,"./sources":605,"./throughs":606,"dup":347,"pull-core":599}],603:[function(require,module,exports){ arguments[4][348][0].apply(exports,arguments) },{"dup":348,"pull-core":599}],604:[function(require,module,exports){ arguments[4][349][0].apply(exports,arguments) },{"dup":349}],605:[function(require,module,exports){ arguments[4][350][0].apply(exports,arguments) },{"dup":350}],606:[function(require,module,exports){ (function (process){ var u = require('pull-core') var sources = require('./sources') var sinks = require('./sinks') var prop = u.prop var id = u.id var tester = u.tester var map = exports.map = function (read, map) { map = prop(map) || id return function (end, cb) { read(end, function (end, data) { var data = !end ? map(data) : null cb(end, data) }) } } var asyncMap = exports.asyncMap = function (read, map) { if(!map) return read return function (end, cb) { if(end) return read(end, cb) //abort read(null, function (end, data) { if(end) return cb(end, data) map(data, cb) }) } } var paraMap = exports.paraMap = function (read, map, width) { if(!map) return read var ended = false, queue = [], _cb function drain () { if(!_cb) return var cb = _cb _cb = null if(queue.length) return cb(null, queue.shift()) else if(ended && !n) return cb(ended) _cb = cb } function pull () { read(null, function (end, data) { if(end) { ended = end return drain() } n++ map(data, function (err, data) { n-- queue.push(data) drain() }) if(n < width && !ended) pull() }) } var n = 0 return function (end, cb) { if(end) return read(end, cb) //abort //continue to read while there are less than 3 maps in flight _cb = cb if(queue.length || ended) pull(), drain() else pull() } return highWaterMark(asyncMap(read, map), width) } var filter = exports.filter = function (read, test) { //regexp test = tester(test) return function next (end, cb) { read(end, function (end, data) { if(!end && !test(data)) return next(end, cb) cb(end, data) }) } } var filterNot = exports.filterNot = function (read, test) { test = tester(test) return filter(read, function (e) { return !test(e) }) } var through = exports.through = function (read, op, onEnd) { var a = false function once (abort) { if(a || !onEnd) return a = true onEnd(abort === true ? null : abort) } return function (end, cb) { if(end) once(end) return read(end, function (end, data) { if(!end) op && op(data) else once(end) cb(end, data) }) } } var take = exports.take = function (read, test) { var ended = false if('number' === typeof test) { var n = test; test = function () { return n -- } } return function (end, cb) { if(ended) return cb(ended) if(ended = end) return read(ended, cb) read(null, function (end, data) { if(ended = ended || end) return cb(ended) if(!test(data)) { ended = true read(true, function (end, data) { cb(ended, data) }) } else cb(null, data) }) } } var unique = exports.unique = function (read, field, invert) { field = prop(field) || id var seen = {} return filter(read, function (data) { var key = field(data) if(seen[key]) return !!invert //false, by default else seen[key] = true return !invert //true by default }) } var nonUnique = exports.nonUnique = function (read, field) { return unique(read, field, true) } var group = exports.group = function (read, size) { var ended; size = size || 5 var queue = [] return function (end, cb) { //this means that the upstream is sending an error. if(end) return read(ended = end, cb) //this means that we read an end before. if(ended) return cb(ended) read(null, function next(end, data) { if(ended = ended || end) { if(!queue.length) return cb(ended) var _queue = queue; queue = [] return cb(null, _queue) } queue.push(data) if(queue.length < size) return read(null, next) var _queue = queue; queue = [] cb(null, _queue) }) } } var flatten = exports.flatten = function (read) { var _read return function (abort, cb) { if(_read) nextChunk() else nextStream() function nextChunk () { _read(null, function (end, data) { if(end) nextStream() else cb(null, data) }) } function nextStream () { read(null, function (end, stream) { if(end) return cb(end) if(Array.isArray(stream)) stream = sources.values(stream) else if('function' != typeof stream) throw new Error('expected stream of streams') _read = stream nextChunk() }) } } } var prepend = exports.prepend = function (read, head) { return function (abort, cb) { if(head !== null) { if(abort) return read(abort, cb) var _head = head head = null cb(null, _head) } else { read(abort, cb) } } } //var drainIf = exports.drainIf = function (op, done) { // sinks.drain( //} var _reduce = exports._reduce = function (read, reduce, initial) { return function (close, cb) { if(close) return read(close, cb) if(ended) return cb(ended) sinks.drain(function (item) { initial = reduce(initial, item) }, function (err, data) { ended = err || true if(!err) cb(null, initial) else cb(ended) }) (read) } } var nextTick = process.nextTick var highWaterMark = exports.highWaterMark = function (read, highWaterMark) { var buffer = [], waiting = [], ended, reading = false highWaterMark = highWaterMark || 10 function readAhead () { while(waiting.length && (buffer.length || ended)) waiting.shift()(ended, ended ? null : buffer.shift()) } function next () { if(ended || reading || buffer.length >= highWaterMark) return reading = true return read(ended, function (end, data) { reading = false ended = ended || end if(data != null) buffer.push(data) next(); readAhead() }) } nextTick(next) return function (end, cb) { ended = ended || end waiting.push(cb) next(); readAhead() } } }).call(this,require('_process')) },{"./sinks":604,"./sources":605,"_process":295,"pull-core":599}],607:[function(require,module,exports){ arguments[4][232][0].apply(exports,arguments) },{"./pull":608,"./sinks":609,"./sources":610,"./throughs":611,"dup":232}],608:[function(require,module,exports){ arguments[4][233][0].apply(exports,arguments) },{"dup":233}],609:[function(require,module,exports){ arguments[4][234][0].apply(exports,arguments) },{"dup":234}],610:[function(require,module,exports){ arguments[4][235][0].apply(exports,arguments) },{"dup":235}],611:[function(require,module,exports){ arguments[4][236][0].apply(exports,arguments) },{"./sinks":609,"./sources":610,"dup":236}],612:[function(require,module,exports){ arguments[4][569][0].apply(exports,arguments) },{"./select":613,"./util":614,"dup":569,"map-filter-reduce/util":238}],613:[function(require,module,exports){ arguments[4][570][0].apply(exports,arguments) },{"./util":614,"dup":570,"map-filter-reduce/util":238}],614:[function(require,module,exports){ arguments[4][571][0].apply(exports,arguments) },{"dup":571}],615:[function(require,module,exports){ //force to a valid range var range = exports.range = function (obj) { return null == obj ? {} : 'string' === typeof range ? { min: range, max: range + '\xff' } : obj } //turn into a sub range. var prefix = exports.prefix = function (range, within, term) { range = exports.range(range) var _range = {} term = term || '\xff' if(range instanceof RegExp || 'function' == typeof range) { _range.min = within _range.max = within + term, _range.inner = function (k) { var j = k.substring(within.length) if(range.test) return range.test(j) return range(j) } } else if('object' === typeof range) { _range.min = within + (range.min || range.start || '') _range.max = within + (range.max || range.end || (term || '~')) _range.reverse = !!range.reverse } return _range } //return a function that checks a range var checker = exports.checker = function (range) { if(!range) range = {} if ('string' === typeof range) return function (key) { return key.indexOf(range) == 0 } else if(range instanceof RegExp) return function (key) { return range.test(key) } else if('object' === typeof range) return function (key) { var min = range.min || range.start var max = range.max || range.end // fixes keys passed as ints from sublevels key = String(key) return ( !min || key >= min ) && ( !max || key <= max ) && ( !range.inner || ( range.inner.test ? range.inner.test(key) : range.inner(key) ) ) } else if('function' === typeof range) return range } //check if a key is within a range. var satifies = exports.satisfies = function (key, range) { return checker(range)(key) } },{}],616:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var Buffer = require('buffer').Buffer; var isBufferEncoding = Buffer.isEncoding || function(encoding) { switch (encoding && encoding.toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; default: return false; } } function assertEncoding(encoding) { if (encoding && !isBufferEncoding(encoding)) { throw new Error('Unknown encoding: ' + encoding); } } // StringDecoder provides an interface for efficiently splitting a series of // buffers into a series of JS strings without breaking apart multi-byte // characters. CESU-8 is handled as part of the UTF-8 encoding. // // @TODO Handling all encodings inside a single object makes it very difficult // to reason about this code, so it should be split up in the future. // @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code // points as used by CESU-8. var StringDecoder = exports.StringDecoder = function(encoding) { this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); assertEncoding(encoding); switch (this.encoding) { case 'utf8': // CESU-8 represents each of Surrogate Pair by 3-bytes this.surrogateSize = 3; break; case 'ucs2': case 'utf16le': // UTF-16 represents each of Surrogate Pair by 2-bytes this.surrogateSize = 2; this.detectIncompleteChar = utf16DetectIncompleteChar; break; case 'base64': // Base-64 stores 3 bytes in 4 chars, and pads the remainder. this.surrogateSize = 3; this.detectIncompleteChar = base64DetectIncompleteChar; break; default: this.write = passThroughWrite; return; } // Enough space to store all bytes of a single character. UTF-8 needs 4 // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). this.charBuffer = new Buffer(6); // Number of bytes received for the current incomplete multi-byte character. this.charReceived = 0; // Number of bytes expected for the current incomplete multi-byte character. this.charLength = 0; }; // write decodes the given buffer and returns it as JS string that is // guaranteed to not contain any partial multi-byte characters. Any partial // character found at the end of the buffer is buffered up, and will be // returned when calling write again with the remaining bytes. // // Note: Converting a Buffer containing an orphan surrogate to a String // currently works, but converting a String to a Buffer (via `new Buffer`, or // Buffer#write) will replace incomplete surrogates with the unicode // replacement character. See https://codereview.chromium.org/121173009/ . StringDecoder.prototype.write = function(buffer) { var charStr = ''; // if our last write ended with an incomplete multibyte character while (this.charLength) { // determine how many remaining bytes this buffer has to offer for this char var available = (buffer.length >= this.charLength - this.charReceived) ? this.charLength - this.charReceived : buffer.length; // add the new bytes to the char buffer buffer.copy(this.charBuffer, this.charReceived, 0, available); this.charReceived += available; if (this.charReceived < this.charLength) { // still not enough chars in this buffer? wait for more ... return ''; } // remove bytes belonging to the current character from the buffer buffer = buffer.slice(available, buffer.length); // get the character that was split charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character var charCode = charStr.charCodeAt(charStr.length - 1); if (charCode >= 0xD800 && charCode <= 0xDBFF) { this.charLength += this.surrogateSize; charStr = ''; continue; } this.charReceived = this.charLength = 0; // if there are no more bytes in this buffer, just emit our char if (buffer.length === 0) { return charStr; } break; } // determine and set charLength / charReceived this.detectIncompleteChar(buffer); var end = buffer.length; if (this.charLength) { // buffer the incomplete character bytes we got buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); end -= this.charReceived; } charStr += buffer.toString(this.encoding, 0, end); var end = charStr.length - 1; var charCode = charStr.charCodeAt(end); // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character if (charCode >= 0xD800 && charCode <= 0xDBFF) { var size = this.surrogateSize; this.charLength += size; this.charReceived += size; this.charBuffer.copy(this.charBuffer, size, 0, size); buffer.copy(this.charBuffer, 0, 0, size); return charStr.substring(0, end); } // or just emit the charStr return charStr; }; // detectIncompleteChar determines if there is an incomplete UTF-8 character at // the end of the given buffer. If so, it sets this.charLength to the byte // length that character, and sets this.charReceived to the number of bytes // that are available for this character. StringDecoder.prototype.detectIncompleteChar = function(buffer) { // determine how many bytes we have to check at the end of this buffer var i = (buffer.length >= 3) ? 3 : buffer.length; // Figure out if one of the last i bytes of our buffer announces an // incomplete char. for (; i > 0; i--) { var c = buffer[buffer.length - i]; // See http://en.wikipedia.org/wiki/UTF-8#Description // 110XXXXX if (i == 1 && c >> 5 == 0x06) { this.charLength = 2; break; } // 1110XXXX if (i <= 2 && c >> 4 == 0x0E) { this.charLength = 3; break; } // 11110XXX if (i <= 3 && c >> 3 == 0x1E) { this.charLength = 4; break; } } this.charReceived = i; }; StringDecoder.prototype.end = function(buffer) { var res = ''; if (buffer && buffer.length) res = this.write(buffer); if (this.charReceived) { var cr = this.charReceived; var buf = this.charBuffer; var enc = this.encoding; res += buf.slice(0, cr).toString(enc); } return res; }; function passThroughWrite(buffer) { return buffer.toString(this.encoding); } function utf16DetectIncompleteChar(buffer) { this.charReceived = buffer.length % 2; this.charLength = this.charReceived ? 2 : 0; } function base64DetectIncompleteChar(buffer) { this.charReceived = buffer.length % 3; this.charLength = this.charReceived ? 3 : 0; } },{"buffer":61}],617:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module stringify-entities * @fileoverview Encode HTML character references and character entities. */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var entities = require('character-entities-html4'); var EXPRESSION_NAMED = require('./lib/expression.js'); /* * Methods. */ var has = {}.hasOwnProperty; /* * List of enforced escapes. */ var escapes = ['"', '\'', '<', '>', '&', '`']; /* * Map of characters to names. */ var characters = {}; (function () { var name; for (name in entities) { characters[entities[name]] = name; } })(); /* * Regular expressions. */ var EXPRESSION_ESCAPE = new RegExp('[' + escapes.join('') + ']', 'g'); var EXPRESSION_SURROGATE_PAIR = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; var EXPRESSION_BMP = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g; /** * Transform `code` into a hexadecimal character reference. * * @param {number} code - Number to encode. * @return {string} - `code` encoded as hexadecimal. */ function characterCodeToHexadecimalReference(code) { return '&#x' + code.toString(16).toUpperCase() + ';'; } /** * Transform `character` into a hexadecimal character * reference. * * @param {string} character - Character to encode. * @return {string} - `character` encoded as hexadecimal. */ function characterToHexadecimalReference(character) { return characterCodeToHexadecimalReference(character.charCodeAt(0)); } /** * Transform `code` into an entity. * * @param {string} name - Name to wrap. * @return {string} - `name` encoded as hexadecimal. */ function toNamedEntity(name) { return '&' + name + ';'; } /** * Transform `code` into an entity. * * @param {string} character - Character to encode. * @return {string} - `name` encoded as hexadecimal. */ function characterToNamedEntity(character) { return toNamedEntity(characters[character]); } /** * Encode special characters in `value`. * * @param {string} value - Value to encode. * @param {Object?} [options] - Configuration. * @param {boolean?} [options.escapeOnly=false] * - Whether to only escape required characters. * @param {boolean?} [options.useNamedReferences=false] * - Whether to use entities where possible. * @return {string} - Encoded `value`. */ function encode(value, options) { var settings = options || {}; var escapeOnly = settings.escapeOnly; var named = settings.useNamedReferences; var map = named ? characters : null; value = value.replace(EXPRESSION_ESCAPE, function (character) { return map && has.call(map, character) ? toNamedEntity(map[character]) : characterToHexadecimalReference(character); }); if (escapeOnly) { return value; } if (named) { value = value.replace(EXPRESSION_NAMED, characterToNamedEntity); } return value .replace(EXPRESSION_SURROGATE_PAIR, function (pair) { return characterCodeToHexadecimalReference( (pair.charCodeAt(0) - 0xD800) * 0x400 + pair.charCodeAt(1) - 0xDC00 + 0x10000 ); }) .replace(EXPRESSION_BMP, characterToHexadecimalReference); } /** * Shortcut to escape special characters in HTML. * * @param {string} value - Value to encode. * @return {string} - Encoded `value`. */ function escape(value) { return encode(value, { 'escapeOnly': true, 'useNamedReferences': true }); } encode.escape = escape; /* * Expose. */ module.exports = encode; },{"./lib/expression.js":618,"character-entities-html4":71}],618:[function(require,module,exports){ /* This script was generated by `script/generate-expression.js` */ 'use strict'; /* eslint-env commonjs */ /* eslint-disable no-irregular-whitespace */ module.exports = /[ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿƒΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρςστυφχψωϑϒϖ•…′″‾⁄℘ℑℜ™ℵ←↑→↓↔↵⇐⇑⇒⇓⇔∀∂∃∅∇∈∉∋∏∑−∗√∝∞∠∧∨∩∪∫∴∼≅≈≠≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈⌉⌊⌋〈〉◊♠♣♥♦ŒœŠšŸˆ˜   ‌‍‎‏–—‘’‚“”„†‡‰‹›€]/g; },{}],619:[function(require,module,exports){ var Buffer = require('buffer').Buffer module.exports = function (buf) { // If the buffer is backed by a Uint8Array, a faster version will work if (buf instanceof Uint8Array) { // If the buffer isn't a subarray, return the underlying ArrayBuffer if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) { return buf.buffer } else if (typeof buf.buffer.slice === 'function') { // Otherwise we need to get a proper copy return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) } } if (Buffer.isBuffer(buf)) { // This is the slow version that will work with any Buffer // implementation (even in old browsers) var arrayCopy = new Uint8Array(buf.length) var len = buf.length for (var i = 0; i < len; i++) { arrayCopy[i] = buf[i] } return arrayCopy.buffer } else { throw new Error('Argument must be a Buffer') } } },{"buffer":61}],620:[function(require,module,exports){ 'use strict'; /* * Constants. */ var WHITE_SPACE_COLLAPSABLE_LINE = /[ \t]*\n+[ \t]*/g; var LINE = '\n'; /** * Remove initial and final spaces and tabs at the * line breaks in `value`. Does not trim initial and * final spaces and tabs of the value itself. * * @example * trimLines(' foo\t\n\n bar \n\tbaz '); // ' foo\nbar\nbaz ' * * @param {string} value - Value with untrimmed line breaks, * coerced to string. * @return {string} - Value with trimmed line breaks. */ function trimLines(value) { return String(value).replace(WHITE_SPACE_COLLAPSABLE_LINE, LINE); } /* * Expose. */ module.exports = trimLines; },{}],621:[function(require,module,exports){ 'use strict'; /* * Constants. */ var LINE = '\n'; /** * Remove final newline characters from `value`. * * @example * trimTrailingLines('foo\nbar'); // 'foo\nbar' * trimTrailingLines('foo\nbar\n'); // 'foo\nbar' * trimTrailingLines('foo\nbar\n\n'); // 'foo\nbar' * * @param {string} value - Value with trailing newlines, * coerced to string. * @return {string} - Value without trailing newlines. */ function trimTrailingLines(value) { var index; value = String(value); index = value.length; while (value.charAt(--index) === LINE) { /* empty */ } return value.slice(0, index + 1); } /* * Expose. */ module.exports = trimTrailingLines; },{}],622:[function(require,module,exports){ exports = module.exports = trim; function trim(str){ return str.replace(/^\s*|\s*$/g, ''); } exports.left = function(str){ return str.replace(/^\s*/, ''); }; exports.right = function(str){ return str.replace(/\s*$/, ''); }; },{}],623:[function(require,module,exports){ (function (Buffer){ var collation = require('./collation') // // base type system // var base = {} // // helper utilities // function _valueOf(instance) { return instance == null ? instance : instance.valueOf() } var _toString = Object.prototype.toString function _isObject(instance) { return instance && _toString.call(instance) === '[object Object]' } // // base typewise compare implementation // base.compare = function (a, b) { // // test for invalid values // if (base.invalid(a, b)) return NaN // // short circuit for identical objects // if (a === b) return 0 // // short circuit for base bound types // var result = base.bound.compare(a, b) if (result !== undefined) return result // // cache typeof and valueOf for both values // var aTypeOf = typeof a var bTypeOf = typeof b var aValueOf = _valueOf(a) var bValueOf = _valueOf(b) // // loop over type tags and attempt compare // var order = base.order var sorts = base.sorts var sort for (var i = 0, length = order.length; i < length; ++i) { sort = sorts[order[i]] // // if first arg is a member of this sort we have an answer // if (sort.is(a, aTypeOf)) // // if b is the same as a then defer to sort's comparator, else a comes first // return sort.is(b, bTypeOf) ? sort.compare(aValueOf, bValueOf) : -1 // // if b is this type but not a then b comes first // if (sort.is(b, bTypeOf)) return 1 } // // values are incomparable as they didn't match against any registered types // return NaN } // // sort equality test // base.equal = function(a, b) { return base.compare(a, b) === 0 } // // test for top-level incomparability using invalid sort definitions // base.invalid = function (a, b) { var types = base.invalid for (var key in types) { var type = types[key] if (type && type.is && (type.is(a) || type.is(b))) return true } return false } // // definitions for explicitly invalid/incomparable types // base.invalid.NAN = { is: function (instance) { var valueOf = _valueOf(instance) return valueOf !== valueOf } } base.invalid.ERROR = { is: function (instance) { return instance && instance instanceof Error } } // // definitions for boundary types, unserializable as values // function BoundedKey(bound, upper, prefix) { this.bound = bound this.upper = !!upper this.prefix = prefix } function Boundary(sort) { this.sort = sort } Boundary.prototype.lower = function (prefix) { return new BoundedKey(this, false, prefix) } Boundary.prototype.upper = function (prefix) { return new BoundedKey(this, true, prefix) } Boundary.prototype.is = function (source) { return source instanceof BoundedKey && source.sort === this.sort } Boundary.add = function (sort) { sort.bound = new Boundary(sort) } Boundary.add(base) base.bound.getBoundary = function (source) { return source instanceof BoundedKey && source.bound } // // compare a values against top level bounds (assumes first arg is an instance) // base.bound.compare = function (a, b) { var aBound = base.bound.is(a) var bBound = base.bound.is(b) if (aBound) { if (bBound && !a.upper === !b.upper) return 0 return a.upper ? 1 : -1 } if (bBound) return -base.bound.compare(b, a) } // // helper to register fixed (nullary) types // function fixed(value) { return { is: function (instance) { return instance === value }, value: value } } // // value types defined as ordered map of "sorts" // var sorts = base.sorts = {} sorts.void = fixed(void 0) sorts.void.compare = collation.inequality sorts.null = fixed(null) sorts.null.compare = collation.inequality var BOOLEAN = sorts.boolean = {} BOOLEAN.compare = collation.inequality BOOLEAN.is = function (instance, typeOf) { return (typeOf || typeof instance) === 'boolean' } BOOLEAN.sorts = {} BOOLEAN.sorts.true = fixed(true) BOOLEAN.sorts.false = fixed(false) Boundary.add(BOOLEAN) var NUMBER = sorts.number = {} NUMBER.compare = collation.difference NUMBER.is = function (instance, typeOf) { return (typeOf || typeof instance) === 'number' } NUMBER.sorts = {} NUMBER.sorts.max = fixed(Number.POSITIVE_INFINITY) NUMBER.sorts.min = fixed(Number.NEGATIVE_INFINITY) NUMBER.sorts.positive = {} NUMBER.sorts.positive.is = function (instance) { return instance >= 0 } NUMBER.sorts.negative = {} NUMBER.sorts.negative.is = function (instance) { return instance < 0 } Boundary.add(NUMBER) var DATE = sorts.date = {} DATE.compare = collation.difference DATE.is = function (instance) { return instance instanceof Date && instance.valueOf() === instance.valueOf() } DATE.sorts = {} DATE.sorts.positive = {} DATE.sorts.positive.is = function (instance) { return instance.valueOf() >= 0 } DATE.sorts.negative = {} DATE.sorts.negative.is = function (instance) { return instance.valueOf() < 0 } Boundary.add(DATE) var BINARY = sorts.binary = {} BINARY.empty = new Buffer([]) BINARY.compare = collation.bitwise BINARY.is = Buffer.isBuffer Boundary.add(BINARY) var STRING = sorts.string = {} STRING.empty = '' STRING.compare = collation.inequality STRING.is = function (instance, typeOf) { return (typeOf || typeof instance) === 'string' } Boundary.add(STRING) var ARRAY = sorts.array = {} ARRAY.empty = [] ARRAY.compare = collation.recursive.elementwise(base.compare) ARRAY.is = Array.isArray Boundary.add(ARRAY) // var OBJECT = sorts.object = {} // OBJECT.empty = {} // OBJECT.compare = collation.recursive.fieldwise(base.compare) // OBJECT.is = _isObject // Boundary.add(OBJECT) // // default order for instance checking in compare operations // base.order = [] for (var key in sorts) { base.order.push(key) } module.exports = base }).call(this,require("buffer").Buffer) },{"./collation":624,"buffer":61}],624:[function(require,module,exports){ // // generic comparator implementations our types can use // var collation = exports // // scalar comparisons // collation.inequality = function (a, b) { return a < b ? -1 : ( a > b ? 1 : 0 ) } collation.difference = function (a, b) { return a - b } // // recursive collations have to be provided a collation function to delegate to // collation.recursive = {} // // element by element (comparison for list-like structures // collation.recursive.elementwise = function (compare, shortlex) { return function (a, b) { var aLength = a.length var bLength = b.length var difference // // short-circuit on length difference for shortlex semantics // if (shortlex && aLength !== bLength) return aLength - bLength for (var i = 0, length = Math.min(aLength, bLength); i < length; ++i) { if (difference = compare(a[i], b[i])) return difference } return aLength - bLength } } // // field by field comparison of record-like structures // collation.recursive.fieldwise = function (compare, shortlex) { return function (a, b) { var aKeys = Object.keys(a) var bKeys = Object.keys(b) var aLength = aKeys.length var bLength = bKeys.length var difference // // short-circuit on length difference for shortlex semantics // if (shortlex && aLength !== bLength) return aLength - bLength for (var i = 0, length = Math.min(aLength, bLength); i < length; ++i) { // // first compare keys // if (difference = compare(aKeys[i], bKeys[i])) return difference // // then compare values // if (difference = compare(a[aKeys[i]], b[bKeys[i]])) return difference } return aLength - bLength } } // // elementwise compare with inequality can be used for binary equality // collation.bitwise = collation.recursive.elementwise(exports.inequality) },{}],625:[function(require,module,exports){ // // extend core typewise // require('./collation') module.exports = require('typewise-core/base') },{"./collation":626,"typewise-core/base":623}],626:[function(require,module,exports){ // // extend core typewise collations // var collation = require('typewise-core/collation') // TODO: set, map module.exports = collation },{"typewise-core/collation":624}],627:[function(require,module,exports){ module.exports = require('./base') },{"./base":625}],628:[function(require,module,exports){ (function (Buffer){ function inequality (a, b) { return a === b ? 0 : a < b ? -1 : 1 } function buffercmp (a, b) { var l = Math.min(a.length, b.length) for(var i = 0; i < l; i++) if(a[i] !== b[i]) return inequality(a[i], b[i]) return a.length - b.length } function arraycmp (a, b) { var l = Math.min(a.length, b.length) for(var i = 0; i < l; i++) { var c = compare(a[i], b[i]) if(c) return c } return inequality(a.length, b.length) } var comparators = [ inequality, // null inequality, // boolean inequality, // number buffercmp, // buffer inequality, // string , // object arraycmp, // array inequality // undefined ] function getType (v) { if(v === null) return 0 var t = typeof v if(t === 'boolean') return 1 if(t === 'number') return 2 if(Buffer.isBuffer(v)) return 3 if(Array.isArray(v)) return 6 if(t === 'string') return 4 if(t === 'undefined') return 7 throw new Error('comparing objects or functions is not supported') // return 5 } function compare (a, b) { var t = getType(a) return inequality(t, getType(b)) || comparators[t](a, b) } module.exports = compare module.exports.equal = function (a, b) { return compare(a, b) === 0 } }).call(this,{"isBuffer":require("../is-buffer/index.js")}) },{"../is-buffer/index.js":170}],629:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module unherit * @fileoverview Create a custom constructor which can be modified * without affecting the original class. * @example * var EventEmitter = require('events').EventEmitter; * var Emitter = unherit(EventEmitter); * // Create a private class which acts just like * // `EventEmitter`. * * Emitter.prototype.defaultMaxListeners = 0; * // Now, all instances of `Emitter` have no maximum * // listeners, without affecting other `EventEmitter`s. */ 'use strict'; /* * Dependencies. */ var clone = require('clone'); var inherits = require('inherits'); /** * Create a custom constructor which can be modified * without affecting the original class. * * @param {Function} Super - Super-class. * @return {Function} - Constructor acting like `Super`, * which can be modified without affecting the original * class. */ function unherit(Super) { var base = clone(Super.prototype); var result; var key; /** * Constructor accepting a single argument, * which itself is an `arguments` object. */ function From(parameters) { return Super.apply(this, parameters); } /** * Constructor accepting variadic arguments. */ function Of() { if (!(this instanceof Of)) { return new From(arguments); } return Super.apply(this, arguments); } inherits(Of, Super); inherits(From, Of); /* * Both do duplicate work. However, cloning the * prototype ensures clonable things are cloned * and thus used. The `inherits` call ensures * `instanceof` still thinks an instance subclasses * `Super`. */ result = Of.prototype; for (key in base) { result[key] = base[key]; } return Of; } /* * Expose. */ module.exports = unherit; },{"clone":82,"inherits":167}],630:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module unified * @fileoverview Parse / Transform / Compile / Repeat. */ 'use strict'; /* eslint-env commonjs */ /* * Dependencies. */ var bail = require('bail'); var ware = require('ware'); var AttachWare = require('attach-ware')(ware); var VFile = require('vfile'); var unherit = require('unherit'); var extend; try { extend = require('node-extend'); } catch (e) { extend = require('extend'); } /* * Processing pipeline. */ var pipeline = ware() .use(function (ctx) { ctx.tree = ctx.context.parse(ctx.file, ctx.settings); }) .use(function (ctx, next) { ctx.context.run(ctx.tree, ctx.file, next); }) .use(function (ctx) { ctx.result = ctx.context.stringify(ctx.tree, ctx.file, ctx.settings); }); /** * Construct a new Processor class based on the * given options. * * @param {Object} options - Configuration. * @param {string} options.name - Private storage. * @param {Function} options.Parser - Class to turn a * virtual file into a syntax tree. * @param {Function} options.Compiler - Class to turn a * syntax tree into a string. * @return {Processor} - A new constructor. */ function unified(options) { var name = options.name; var Parser = options.Parser; var Compiler = options.Compiler; var data = options.data; /** * Construct a Processor instance. * * @constructor * @class {Processor} */ function Processor(processor) { var self = this; if (!(self instanceof Processor)) { return new Processor(processor); } self.ware = new AttachWare(processor && processor.ware); self.ware.context = self; self.Parser = unherit(Parser); self.Compiler = unherit(Compiler); if (self.data) { self.data = extend(true, {}, self.data); } } /** * Either return `context` if its an instance * of `Processor` or construct a new `Processor` * instance. * * @private * @param {Processor?} [context] - Context object. * @return {Processor} - Either `context` or a new * Processor instance. */ function instance(context) { return context instanceof Processor ? context : new Processor(); } /** * Attach a plugin. * * @this {Processor?} - Either a Processor instance or * the Processor constructor. * @return {Processor} - Either `context` or a new * Processor instance. */ function use() { var self = instance(this); self.ware.use.apply(self.ware, arguments); return self; } /** * Transform. * * @this {Processor?} - Either a Processor instance or * the Processor constructor. * @param {Node} [node] - Syntax tree. * @param {VFile?} [file] - Virtual file. * @param {Function?} [done] - Callback. * @return {Node} - `node`. */ function run(node, file, done) { var self = this; var space; if (typeof file === 'function') { done = file; file = null; } if (!file && node && !node.type) { file = node; node = null; } file = new VFile(file); space = file.namespace(name); if (!node) { node = space.tree || node; } else if (!space.tree) { space.tree = node; } if (!node) { throw new Error('Expected node, got ' + node); } done = typeof done === 'function' ? done : bail; /* * Only run when this is an instance of Processor, * and when there are transformers. */ if (self.ware && self.ware.fns) { self.ware.run(node, file, done); } else { done(null, node, file); } return node; } /** * Parse a file. * * Patches the parsed node onto the `name` * namespace on the `type` property. * * @this {Processor?} - Either a Processor instance or * the Processor constructor. * @param {string|VFile} value - Input to parse. * @param {Object?} [settings] - Configuration. * @return {Node} - `node`. */ function parse(value, settings) { var file = new VFile(value); var CustomParser = (this && this.Parser) || Parser; var node = new CustomParser(file, settings, instance(this)).parse(); file.namespace(name).tree = node; return node; } /** * Compile a file. * * Used the parsed node at the `name` * namespace at `'tree'` when no node was given. * * @this {Processor?} - Either a Processor instance or * the Processor constructor. * @param {Object} [node] - Syntax tree. * @param {VFile} [file] - File with syntax tree. * @param {Object?} [settings] - Configuration. * @return {string} - Compiled `file`. */ function stringify(node, file, settings) { var CustomCompiler = (this && this.Compiler) || Compiler; var space; if (settings === null || settings === undefined) { settings = file; file = null; } if (!file && node && !node.type) { file = node; node = null; } file = new VFile(file); space = file.namespace(name); if (!node) { node = space.tree || node; } else if (!space.tree) { space.tree = node; } if (!node) { throw new Error('Expected node, got ' + node); } return new CustomCompiler(file, settings, instance(this)).compile(); } /** * Parse / Transform / Compile. * * @this {Processor?} - Either a Processor instance or * the Processor constructor. * @param {string|VFile} value - Input to process. * @param {Object?} [settings] - Configuration. * @param {Function?} [done] - Callback. * @return {string?} - Parsed document, when * transformation was async. */ function process(value, settings, done) { var self = instance(this); var file = new VFile(value); var result = null; if (typeof settings === 'function') { done = settings; settings = null; } pipeline.run({ 'context': self, 'file': file, 'settings': settings || {} }, function (err, res) { result = res && res.result; if (done) { done(err, file, result); } else if (err) { bail(err); } }); return result; } /* * Methods / functions. */ var proto = Processor.prototype; Processor.use = proto.use = use; Processor.parse = proto.parse = parse; Processor.run = proto.run = run; Processor.stringify = proto.stringify = stringify; Processor.process = proto.process = process; Processor.data = proto.data = data || null; return Processor; } /* * Expose. */ module.exports = unified; },{"attach-ware":16,"bail":17,"extend":148,"node-extend":148,"unherit":629,"vfile":637,"ware":639}],631:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module unist:util:visit * @fileoverview Recursively walk over unist nodes. */ 'use strict'; /* eslint-env commonjs */ /** * Visit. * * @param {Node} tree - Root node * @param {string} [type] - Node type. * @param {function(node): boolean?} visitor - Invoked * with each found node. Can return `false` to stop. * @param {boolean} [reverse] - By default, `visit` will * walk forwards, when `reverse` is `true`, `visit` * walks backwards. */ function visit(tree, type, visitor, reverse) { if (typeof type === 'function') { reverse = visitor; visitor = type; type = null; } /** * Visit children in `parent`. * * @param {Array.} children - Children of `node`. * @param {Node?} parent - Parent of `node`. * @return {boolean?} - `false` if the visiting stopped. */ function all(children, parent) { var step = reverse ? -1 : 1; var max = children.length; var min = -1; var index = (reverse ? max : min) + step; var child; while (index > min && index < max) { child = children[index]; if (child && one(child, index, parent) === false) { return false; } index += step; } return true; } /** * Visit a single node. * * @param {Node} node - Node to visit. * @param {number?} [index] - Position of `node` in `parent`. * @param {Node?} [parent] - Parent of `node`. * @return {boolean?} - A result of invoking `visitor`. */ function one(node, index, parent) { var result; index = index || (parent ? 0 : null); if (!type || node.type === type) { result = visitor(node, index, parent || null); } if (node.children && result !== false) { return all(node.children, node); } return result; } one(tree); } /* * Expose. */ module.exports = visit; },{}],632:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; var punycode = require('punycode'); var util = require('./util'); exports.parse = urlParse; exports.resolve = urlResolve; exports.resolveObject = urlResolveObject; exports.format = urlFormat; exports.Url = Url; function Url() { this.protocol = null; this.slashes = null; this.auth = null; this.host = null; this.port = null; this.hostname = null; this.hash = null; this.search = null; this.query = null; this.pathname = null; this.path = null; this.href = null; } // Reference: RFC 3986, RFC 1808, RFC 2396 // define these here so at least they only have to be // compiled once on the first module load. var protocolPattern = /^([a-z0-9.+-]+:)/i, portPattern = /:[0-9]*$/, // Special case for a simple path URL simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/, // RFC 2396: characters reserved for delimiting URLs. // We actually just auto-escape these. delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], // RFC 2396: characters not allowed for various reasons. unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims), // Allowed by RFCs, but cause of XSS attacks. Always escape these. autoEscape = ['\''].concat(unwise), // Characters that are never ever allowed in a hostname. // Note that any invalid chars are also handled, but these // are the ones that are *expected* to be seen, so we fast-path // them. nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape), hostEndingChars = ['/', '?', '#'], hostnameMaxLen = 255, hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, // protocols that can allow "unsafe" and "unwise" chars. unsafeProtocol = { 'javascript': true, 'javascript:': true }, // protocols that never have a hostname. hostlessProtocol = { 'javascript': true, 'javascript:': true }, // protocols that always contain a // bit. slashedProtocol = { 'http': true, 'https': true, 'ftp': true, 'gopher': true, 'file': true, 'http:': true, 'https:': true, 'ftp:': true, 'gopher:': true, 'file:': true }, querystring = require('querystring'); function urlParse(url, parseQueryString, slashesDenoteHost) { if (url && util.isObject(url) && url instanceof Url) return url; var u = new Url; u.parse(url, parseQueryString, slashesDenoteHost); return u; } Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { if (!util.isString(url)) { throw new TypeError("Parameter 'url' must be a string, not " + typeof url); } // Copy chrome, IE, opera backslash-handling behavior. // Back slashes before the query string get converted to forward slashes // See: https://code.google.com/p/chromium/issues/detail?id=25916 var queryIndex = url.indexOf('?'), splitter = (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#', uSplit = url.split(splitter), slashRegex = /\\/g; uSplit[0] = uSplit[0].replace(slashRegex, '/'); url = uSplit.join(splitter); var rest = url; // trim before proceeding. // This is to support parse stuff like " http://foo.com \n" rest = rest.trim(); if (!slashesDenoteHost && url.split('#').length === 1) { // Try fast path regexp var simplePath = simplePathPattern.exec(rest); if (simplePath) { this.path = rest; this.href = rest; this.pathname = simplePath[1]; if (simplePath[2]) { this.search = simplePath[2]; if (parseQueryString) { this.query = querystring.parse(this.search.substr(1)); } else { this.query = this.search.substr(1); } } else if (parseQueryString) { this.search = ''; this.query = {}; } return this; } } var proto = protocolPattern.exec(rest); if (proto) { proto = proto[0]; var lowerProto = proto.toLowerCase(); this.protocol = lowerProto; rest = rest.substr(proto.length); } // figure out if it's got a host // user@server is *always* interpreted as a hostname, and url // resolution will treat //foo/bar as host=foo,path=bar because that's // how the browser resolves relative URLs. if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { var slashes = rest.substr(0, 2) === '//'; if (slashes && !(proto && hostlessProtocol[proto])) { rest = rest.substr(2); this.slashes = true; } } if (!hostlessProtocol[proto] && (slashes || (proto && !slashedProtocol[proto]))) { // there's a hostname. // the first instance of /, ?, ;, or # ends the host. // // If there is an @ in the hostname, then non-host chars *are* allowed // to the left of the last @ sign, unless some host-ending character // comes *before* the @-sign. // URLs are obnoxious. // // ex: // http://a@b@c/ => user:a@b host:c // http://a@b?@c => user:a host:c path:/?@c // v0.12 TODO(isaacs): This is not quite how Chrome does things. // Review our test case against browsers more comprehensively. // find the first instance of any hostEndingChars var hostEnd = -1; for (var i = 0; i < hostEndingChars.length; i++) { var hec = rest.indexOf(hostEndingChars[i]); if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec; } // at this point, either we have an explicit point where the // auth portion cannot go past, or the last @ char is the decider. var auth, atSign; if (hostEnd === -1) { // atSign can be anywhere. atSign = rest.lastIndexOf('@'); } else { // atSign must be in auth portion. // http://a@b/c@d => host:b auth:a path:/c@d atSign = rest.lastIndexOf('@', hostEnd); } // Now we have a portion which is definitely the auth. // Pull that off. if (atSign !== -1) { auth = rest.slice(0, atSign); rest = rest.slice(atSign + 1); this.auth = decodeURIComponent(auth); } // the host is the remaining to the left of the first non-host char hostEnd = -1; for (var i = 0; i < nonHostChars.length; i++) { var hec = rest.indexOf(nonHostChars[i]); if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec; } // if we still have not hit it, then the entire thing is a host. if (hostEnd === -1) hostEnd = rest.length; this.host = rest.slice(0, hostEnd); rest = rest.slice(hostEnd); // pull out port. this.parseHost(); // we've indicated that there is a hostname, // so even if it's empty, it has to be present. this.hostname = this.hostname || ''; // if hostname begins with [ and ends with ] // assume that it's an IPv6 address. var ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']'; // validate a little. if (!ipv6Hostname) { var hostparts = this.hostname.split(/\./); for (var i = 0, l = hostparts.length; i < l; i++) { var part = hostparts[i]; if (!part) continue; if (!part.match(hostnamePartPattern)) { var newpart = ''; for (var j = 0, k = part.length; j < k; j++) { if (part.charCodeAt(j) > 127) { // we replace non-ASCII char with a temporary placeholder // we need this to make sure size of hostname is not // broken by replacing non-ASCII by nothing newpart += 'x'; } else { newpart += part[j]; } } // we test again with ASCII char only if (!newpart.match(hostnamePartPattern)) { var validParts = hostparts.slice(0, i); var notHost = hostparts.slice(i + 1); var bit = part.match(hostnamePartStart); if (bit) { validParts.push(bit[1]); notHost.unshift(bit[2]); } if (notHost.length) { rest = '/' + notHost.join('.') + rest; } this.hostname = validParts.join('.'); break; } } } } if (this.hostname.length > hostnameMaxLen) { this.hostname = ''; } else { // hostnames are always lower case. this.hostname = this.hostname.toLowerCase(); } if (!ipv6Hostname) { // IDNA Support: Returns a punycoded representation of "domain". // It only converts parts of the domain name that // have non-ASCII characters, i.e. it doesn't matter if // you call it with a domain that already is ASCII-only. this.hostname = punycode.toASCII(this.hostname); } var p = this.port ? ':' + this.port : ''; var h = this.hostname || ''; this.host = h + p; this.href += this.host; // strip [ and ] from the hostname // the host field still retains them, though if (ipv6Hostname) { this.hostname = this.hostname.substr(1, this.hostname.length - 2); if (rest[0] !== '/') { rest = '/' + rest; } } } // now rest is set to the post-host stuff. // chop off any delim chars. if (!unsafeProtocol[lowerProto]) { // First, make 100% sure that any "autoEscape" chars get // escaped, even if encodeURIComponent doesn't think they // need to be. for (var i = 0, l = autoEscape.length; i < l; i++) { var ae = autoEscape[i]; if (rest.indexOf(ae) === -1) continue; var esc = encodeURIComponent(ae); if (esc === ae) { esc = escape(ae); } rest = rest.split(ae).join(esc); } } // chop off from the tail first. var hash = rest.indexOf('#'); if (hash !== -1) { // got a fragment string. this.hash = rest.substr(hash); rest = rest.slice(0, hash); } var qm = rest.indexOf('?'); if (qm !== -1) { this.search = rest.substr(qm); this.query = rest.substr(qm + 1); if (parseQueryString) { this.query = querystring.parse(this.query); } rest = rest.slice(0, qm); } else if (parseQueryString) { // no query string, but parseQueryString still requested this.search = ''; this.query = {}; } if (rest) this.pathname = rest; if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) { this.pathname = '/'; } //to support http.request if (this.pathname || this.search) { var p = this.pathname || ''; var s = this.search || ''; this.path = p + s; } // finally, reconstruct the href based on what has been validated. this.href = this.format(); return this; }; // format a parsed object into a url string function urlFormat(obj) { // ensure it's an object, and not a string url. // If it's an obj, this is a no-op. // this way, you can call url_format() on strings // to clean up potentially wonky urls. if (util.isString(obj)) obj = urlParse(obj); if (!(obj instanceof Url)) return Url.prototype.format.call(obj); return obj.format(); } Url.prototype.format = function() { var auth = this.auth || ''; if (auth) { auth = encodeURIComponent(auth); auth = auth.replace(/%3A/i, ':'); auth += '@'; } var protocol = this.protocol || '', pathname = this.pathname || '', hash = this.hash || '', host = false, query = ''; if (this.host) { host = auth + this.host; } else if (this.hostname) { host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']'); if (this.port) { host += ':' + this.port; } } if (this.query && util.isObject(this.query) && Object.keys(this.query).length) { query = querystring.stringify(this.query); } var search = this.search || (query && ('?' + query)) || ''; if (protocol && protocol.substr(-1) !== ':') protocol += ':'; // only the slashedProtocols get the //. Not mailto:, xmpp:, etc. // unless they had them to begin with. if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) { host = '//' + (host || ''); if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname; } else if (!host) { host = ''; } if (hash && hash.charAt(0) !== '#') hash = '#' + hash; if (search && search.charAt(0) !== '?') search = '?' + search; pathname = pathname.replace(/[?#]/g, function(match) { return encodeURIComponent(match); }); search = search.replace('#', '%23'); return protocol + host + pathname + search + hash; }; function urlResolve(source, relative) { return urlParse(source, false, true).resolve(relative); } Url.prototype.resolve = function(relative) { return this.resolveObject(urlParse(relative, false, true)).format(); }; function urlResolveObject(source, relative) { if (!source) return relative; return urlParse(source, false, true).resolveObject(relative); } Url.prototype.resolveObject = function(relative) { if (util.isString(relative)) { var rel = new Url(); rel.parse(relative, false, true); relative = rel; } var result = new Url(); var tkeys = Object.keys(this); for (var tk = 0; tk < tkeys.length; tk++) { var tkey = tkeys[tk]; result[tkey] = this[tkey]; } // hash is always overridden, no matter what. // even href="" will remove it. result.hash = relative.hash; // if the relative url is empty, then there's nothing left to do here. if (relative.href === '') { result.href = result.format(); return result; } // hrefs like //foo/bar always cut to the protocol. if (relative.slashes && !relative.protocol) { // take everything except the protocol from relative var rkeys = Object.keys(relative); for (var rk = 0; rk < rkeys.length; rk++) { var rkey = rkeys[rk]; if (rkey !== 'protocol') result[rkey] = relative[rkey]; } //urlParse appends trailing / to urls like http://www.example.com if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) { result.path = result.pathname = '/'; } result.href = result.format(); return result; } if (relative.protocol && relative.protocol !== result.protocol) { // if it's a known url protocol, then changing // the protocol does weird things // first, if it's not file:, then we MUST have a host, // and if there was a path // to begin with, then we MUST have a path. // if it is file:, then the host is dropped, // because that's known to be hostless. // anything else is assumed to be absolute. if (!slashedProtocol[relative.protocol]) { var keys = Object.keys(relative); for (var v = 0; v < keys.length; v++) { var k = keys[v]; result[k] = relative[k]; } result.href = result.format(); return result; } result.protocol = relative.protocol; if (!relative.host && !hostlessProtocol[relative.protocol]) { var relPath = (relative.pathname || '').split('/'); while (relPath.length && !(relative.host = relPath.shift())); if (!relative.host) relative.host = ''; if (!relative.hostname) relative.hostname = ''; if (relPath[0] !== '') relPath.unshift(''); if (relPath.length < 2) relPath.unshift(''); result.pathname = relPath.join('/'); } else { result.pathname = relative.pathname; } result.search = relative.search; result.query = relative.query; result.host = relative.host || ''; result.auth = relative.auth; result.hostname = relative.hostname || relative.host; result.port = relative.port; // to support http.request if (result.pathname || result.search) { var p = result.pathname || ''; var s = result.search || ''; result.path = p + s; } result.slashes = result.slashes || relative.slashes; result.href = result.format(); return result; } var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'), isRelAbs = ( relative.host || relative.pathname && relative.pathname.charAt(0) === '/' ), mustEndAbs = (isRelAbs || isSourceAbs || (result.host && relative.pathname)), removeAllDots = mustEndAbs, srcPath = result.pathname && result.pathname.split('/') || [], relPath = relative.pathname && relative.pathname.split('/') || [], psychotic = result.protocol && !slashedProtocol[result.protocol]; // if the url is a non-slashed url, then relative // links like ../.. should be able // to crawl up to the hostname, as well. This is strange. // result.protocol has already been set by now. // Later on, put the first path part into the host field. if (psychotic) { result.hostname = ''; result.port = null; if (result.host) { if (srcPath[0] === '') srcPath[0] = result.host; else srcPath.unshift(result.host); } result.host = ''; if (relative.protocol) { relative.hostname = null; relative.port = null; if (relative.host) { if (relPath[0] === '') relPath[0] = relative.host; else relPath.unshift(relative.host); } relative.host = null; } mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === ''); } if (isRelAbs) { // it's absolute. result.host = (relative.host || relative.host === '') ? relative.host : result.host; result.hostname = (relative.hostname || relative.hostname === '') ? relative.hostname : result.hostname; result.search = relative.search; result.query = relative.query; srcPath = relPath; // fall through to the dot-handling below. } else if (relPath.length) { // it's relative // throw away the existing file, and take the new path instead. if (!srcPath) srcPath = []; srcPath.pop(); srcPath = srcPath.concat(relPath); result.search = relative.search; result.query = relative.query; } else if (!util.isNullOrUndefined(relative.search)) { // just pull out the search. // like href='?foo'. // Put this after the other two cases because it simplifies the booleans if (psychotic) { result.hostname = result.host = srcPath.shift(); //occationaly the auth can get stuck only in host //this especially happens in cases like //url.resolveObject('mailto:local1@domain1', 'local2@domain2') var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false; if (authInHost) { result.auth = authInHost.shift(); result.host = result.hostname = authInHost.shift(); } } result.search = relative.search; result.query = relative.query; //to support http.request if (!util.isNull(result.pathname) || !util.isNull(result.search)) { result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : ''); } result.href = result.format(); return result; } if (!srcPath.length) { // no path at all. easy. // we've already handled the other stuff above. result.pathname = null; //to support http.request if (result.search) { result.path = '/' + result.search; } else { result.path = null; } result.href = result.format(); return result; } // if a url ENDs in . or .., then it must get a trailing slash. // however, if it ends in anything else non-slashy, // then it must NOT get a trailing slash. var last = srcPath.slice(-1)[0]; var hasTrailingSlash = ( (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === ''); // strip single dots, resolve double dots to parent dir // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = srcPath.length; i >= 0; i--) { last = srcPath[i]; if (last === '.') { srcPath.splice(i, 1); } else if (last === '..') { srcPath.splice(i, 1); up++; } else if (up) { srcPath.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (!mustEndAbs && !removeAllDots) { for (; up--; up) { srcPath.unshift('..'); } } if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) { srcPath.unshift(''); } if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) { srcPath.push(''); } var isAbsolute = srcPath[0] === '' || (srcPath[0] && srcPath[0].charAt(0) === '/'); // put the host back if (psychotic) { result.hostname = result.host = isAbsolute ? '' : srcPath.length ? srcPath.shift() : ''; //occationaly the auth can get stuck only in host //this especially happens in cases like //url.resolveObject('mailto:local1@domain1', 'local2@domain2') var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false; if (authInHost) { result.auth = authInHost.shift(); result.host = result.hostname = authInHost.shift(); } } mustEndAbs = mustEndAbs || (result.host && srcPath.length); if (mustEndAbs && !isAbsolute) { srcPath.unshift(''); } if (!srcPath.length) { result.pathname = null; result.path = null; } else { result.pathname = srcPath.join('/'); } //to support request.http if (!util.isNull(result.pathname) || !util.isNull(result.search)) { result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : ''); } result.auth = relative.auth || result.auth; result.slashes = result.slashes || relative.slashes; result.href = result.format(); return result; }; Url.prototype.parseHost = function() { var host = this.host; var port = portPattern.exec(host); if (port) { port = port[0]; if (port !== ':') { this.port = port.substr(1); } host = host.substr(0, host.length - port.length); } if (host) this.hostname = host; }; },{"./util":633,"punycode":399,"querystring":402}],633:[function(require,module,exports){ 'use strict'; module.exports = { isString: function(arg) { return typeof(arg) === 'string'; }, isObject: function(arg) { return typeof(arg) === 'object' && arg !== null; }, isNull: function(arg) { return arg === null; }, isNullOrUndefined: function(arg) { return arg == null; } }; },{}],634:[function(require,module,exports){ (function (global){ /** * Module exports. */ module.exports = deprecate; /** * Mark that a method should not be used. * Returns a modified function which warns once by default. * * If `localStorage.noDeprecation = true` is set, then it is a no-op. * * If `localStorage.throwDeprecation = true` is set, then deprecated functions * will throw an Error when invoked. * * If `localStorage.traceDeprecation = true` is set, then deprecated functions * will invoke `console.trace()` instead of `console.error()`. * * @param {Function} fn - the function to deprecate * @param {String} msg - the string to print to the console when `fn` is invoked * @returns {Function} a new "deprecated" version of `fn` * @api public */ function deprecate (fn, msg) { if (config('noDeprecation')) { return fn; } var warned = false; function deprecated() { if (!warned) { if (config('throwDeprecation')) { throw new Error(msg); } else if (config('traceDeprecation')) { console.trace(msg); } else { console.warn(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; } /** * Checks `localStorage` for boolean values for the given `name`. * * @param {String} name * @returns {Boolean} * @api private */ function config (name) { // accessing global.localStorage can trigger a DOMException in sandboxed iframes try { if (!global.localStorage) return false; } catch (_) { return false; } var val = global.localStorage[name]; if (null == val) return false; return String(val).toLowerCase() === 'true'; } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],635:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } },{}],636:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var formatRegExp = /%[sdj%]/g; exports.format = function(f) { if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function(x) { if (x === '%%') return '%'; if (i >= len) return x; switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function() { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function(set) { if (isUndefined(debugEnviron)) debugEnviron = process.env.NODE_DEBUG || ''; set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function() {}; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) ctx.depth = arguments[2]; if (arguments.length >= 4) ctx.colors = arguments[3]; if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } // set default options if (isUndefined(ctx.showHidden)) ctx.showHidden = false; if (isUndefined(ctx.depth)) ctx.depth = 2; if (isUndefined(ctx.colors)) ctx.colors = false; if (isUndefined(ctx.customInspect)) ctx.customInspect = true; if (ctx.colors) ctx.stylize = stylizeWithColor; return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics inspect.colors = { 'bold' : [1, 22], 'italic' : [3, 23], 'underline' : [4, 24], 'inverse' : [7, 27], 'white' : [37, 39], 'grey' : [90, 39], 'black' : [30, 39], 'blue' : [34, 39], 'cyan' : [36, 39], 'green' : [32, 39], 'magenta' : [35, 39], 'red' : [31, 39], 'yellow' : [33, 39] }; // Don't use 'blue' not visible on cmd.exe inspect.styles = { 'special': 'cyan', 'number': 'yellow', 'boolean': 'yellow', 'undefined': 'grey', 'null': 'bold', 'string': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function(val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // IE doesn't make error fields non-enumerable // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { return formatError(value); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) return ctx.stylize('undefined', 'undefined'); if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) return ctx.stylize('' + value, 'number'); if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here. if (isNull(value)) return ctx.stylize('null', 'null'); } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function(line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function(line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function(prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) numLinesEst++; return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = require('./support/isBuffer'); function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function() { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = require('inherits'); exports._extend = function(origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) return origin; var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./support/isBuffer":635,"_process":295,"inherits":167}],637:[function(require,module,exports){ /** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module vfile * @fileoverview Virtual file format to attach additional * information related to processed input. Similar to * `wearefractal/vinyl`. Additionally, `VFile` can be * passed directly to ESLint formatters to visualise * warnings and errors relating to a file. * @example * var VFile = require('vfile'); * * var file = new VFile({ * 'directory': '~', * 'filename': 'example', * 'extension': 'txt', * 'contents': 'Foo *bar* baz' * }); * * file.toString(); // 'Foo *bar* baz' * file.filePath(); // '~/example.txt' * * file.move({'extension': 'md'}); * file.filePath(); // '~/example.md' * * file.warn('Something went wrong', {'line': 2, 'column': 3}); * // { [~/example.md:2:3: Something went wrong] * // name: '~/example.md:2:3', * // file: '~/example.md', * // reason: 'Something went wrong', * // line: 2, * // column: 3, * // fatal: false } */ 'use strict'; /* eslint-env commonjs */ var SEPARATOR = '/'; try { SEPARATOR = require('pa' + 'th').sep; } catch (e) { /* empty */ } /** * Construct a new file message. * * Note: We cannot invoke `Error` on the created context, * as that adds readonly `line` and `column` attributes on * Safari 9, thus throwing and failing the data. * * @example * var message = new VFileMessage('Whoops!'); * * message instanceof Error // true * * @constructor * @class {VFileMessage} * @param {string} reason - Reason for messaging. * @property {boolean} [fatal=null] - Whether the message * is fatal. * @property {string} [name=''] - File-name and positional * information. * @property {string} [file=''] - File-path. * @property {string} [reason=''] - Reason for messaging. * @property {number} [line=null] - Start of message. * @property {number} [column=null] - Start of message. * @property {Position|Location} [location=null] - Place of * message. * @property {string} [stack] - Stack-trace of warning. */ function VFileMessage(reason) { this.message = reason; } /** * Inherit from `Error#`. */ function VFileMessagePrototype() {} VFileMessagePrototype.prototype = Error.prototype; var proto = new VFileMessagePrototype(); VFileMessage.prototype = proto; /* * Expose defaults. */ proto.file = proto.name = proto.reason = proto.message = proto.stack = ''; proto.fatal = proto.column = proto.line = null; /** * File-related message with location information. * * @typedef {Error} VFileMessage * @property {string} name - (Starting) location of the * message, preceded by its file-path when available, * and joined by `:`. Used internally by the native * `Error#toString()`. * @property {string} file - File-path. * @property {string} reason - Reason for message. * @property {number?} line - Line of message, when * available. * @property {number?} column - Column of message, when * available. * @property {string?} stack - Stack of message, when * available. * @property {boolean?} fatal - Whether the associated file * is still processable. */ /** * Stringify a position. * * @example * stringify({'line': 1, 'column': 3}) // '1:3' * stringify({'line': 1}) // '1:1' * stringify({'column': 3}) // '1:3' * stringify() // '1:1' * * @private * @param {Object?} [position] - Single position, like * those available at `node.position.start`. * @return {string} - Compiled location. */ function stringify(position) { if (!position) { position = {}; } return (position.line || 1) + ':' + (position.column || 1); } /** * ESLint's formatter API expects `filePath` to be a * string. This hack supports invocation as well as * implicit coercion. * * @example * var file = new VFile({ * 'filename': 'example', * 'extension': 'txt' * }); * * filePath = filePathFactory(file); * * String(filePath); // 'example.txt' * filePath(); // 'example.txt' * * @private * @param {VFile} file - Virtual file. * @return {Function} - `filePath` getter. */ function filePathFactory(file) { /** * Get the filename, with extension and directory, if applicable. * * @example * var file = new VFile({ * 'directory': '~', * 'filename': 'example', * 'extension': 'txt' * }); * * String(file.filePath); // ~/example.txt * file.filePath() // ~/example.txt * * @memberof {VFile} * @property {Function} toString - Itself. ESLint's * formatter API expects `filePath` to be `string`. * This hack supports invocation as well as implicit * coercion. * @return {string} - If the `vFile` has a `filename`, * it will be prefixed with the directory (slashed), * if applicable, and suffixed with the (dotted) * extension (if applicable). Otherwise, an empty * string is returned. */ function filePath() { var directory = file.directory; var separator; if (file.filename || file.extension) { separator = directory.charAt(directory.length - 1); if (separator === '/' || separator === '\\') { directory = directory.slice(0, -1); } if (directory === '.') { directory = ''; } return (directory ? directory + SEPARATOR : '') + file.filename + (file.extension ? '.' + file.extension : ''); } return ''; } filePath.toString = filePath; return filePath; } /** * Get the filename with extantion. * * @example * var file = new VFile({ * 'directory': '~/foo/bar' * 'filename': 'example', * 'extension': 'txt' * }); * * file.basename() // example.txt * * @memberof {VFile} * @return {string} - name of file with extantion. */ function basename() { var self = this; var extension = self.extension; if (self.filename || extension) { return self.filename + (extension ? '.' + extension : ''); } return ''; } /** * Construct a new file. * * @example * var file = new VFile({ * 'directory': '~', * 'filename': 'example', * 'extension': 'txt', * 'contents': 'Foo *bar* baz' * }); * * file === VFile(file) // true * file === new VFile(file) // true * VFile('foo') instanceof VFile // true * * @constructor * @class {VFile} * @param {Object|VFile|string} [options] - either an * options object, or the value of `contents` (both * optional). When a `file` is passed in, it's * immediately returned. * @property {string} [contents=''] - Content of file. * @property {string} [directory=''] - Path to parent * directory. * @property {string} [filename=''] - Filename. * A file-path can still be generated when no filename * exists. * @property {string} [extension=''] - Extension. * A file-path can still be generated when no extension * exists. * @property {boolean?} quiet - Whether an error created by * `VFile#fail()` is returned (when truthy) or thrown * (when falsey). Ensure all `messages` associated with * a file are handled properly when setting this to * `true`. * @property {Array.} messages - List of associated * messages. */ function VFile(options) { var self = this; /* * No `new` operator. */ if (!(self instanceof VFile)) { return new VFile(options); } /* * Given file. */ if ( options && typeof options.message === 'function' && typeof options.hasFailed === 'function' ) { return options; } if (!options) { options = {}; } else if (typeof options === 'string') { options = { 'contents': options }; } self.contents = options.contents || ''; self.messages = []; /* * Make sure eslint’s formatters stringify `filePath` * properly. */ self.filePath = filePathFactory(self); self.history = []; self.move({ 'filename': options.filename, 'directory': options.directory, 'extension': options.extension }); } /** * Get the value of the file. * * @example * var vFile = new VFile('Foo'); * String(vFile); // 'Foo' * * @this {VFile} * @memberof {VFile} * @return {string} - value at the `contents` property * in context. */ function toString() { return this.contents; } /** * Move a file by passing a new directory, filename, * and extension. When these are not given, the default * values are kept. * * @example * var file = new VFile({ * 'directory': '~', * 'filename': 'example', * 'extension': 'txt', * 'contents': 'Foo *bar* baz' * }); * * file.move({'directory': '/var/www'}); * file.filePath(); // '/var/www/example.txt' * * file.move({'extension': 'md'}); * file.filePath(); // '/var/www/example.md' * * @this {VFile} * @memberof {VFile} * @param {Object?} [options] - Configuration. * @return {VFile} - Context object. */ function move(options) { var self = this; var before = self.filePath(); var after; if (!options) { options = {}; } self.directory = options.directory || self.directory || ''; self.filename = options.filename || self.filename || ''; self.extension = options.extension || self.extension || ''; after = self.filePath(); if (after && before !== after) { self.history.push(after); } return self; } /** * Create a message with `reason` at `position`. * When an error is passed in as `reason`, copies the * stack. This does not add a message to `messages`. * * @example * var file = new VFile(); * * file.message('Something went wrong'); * // { [1:1: Something went wrong] * // name: '1:1', * // file: '', * // reason: 'Something went wrong', * // line: null, * // column: null } * * @this {VFile} * @memberof {VFile} * @param {string|Error} reason - Reason for message. * @param {Node|Location|Position} [position] - Location * of message in file. * @return {VFileMessage} - File-related message with * location information. */ function message(reason, position) { var filePath = this.filePath(); var range; var err; var location = { 'start': { 'line': null, 'column': null }, 'end': { 'line': null, 'column': null } }; /* * Node / location / position. */ if (position && position.position) { position = position.position; } if (position && position.start) { range = stringify(position.start) + '-' + stringify(position.end); location = position; position = position.start; } else { range = stringify(position); if (position) { location.start = position; location.end.line = null; location.end.column = null; } } err = new VFileMessage(reason.message || reason); err.name = (filePath ? filePath + ':' : '') + range; err.file = filePath; err.reason = reason.message || reason; err.line = position ? position.line : null; err.column = position ? position.column : null; err.location = location; if (reason.stack) { err.stack = reason.stack; } return err; } /** * Warn. Creates a non-fatal message (see `VFile#message()`), * and adds it to the file's `messages` list. * * @example * var file = new VFile(); * * file.warn('Something went wrong'); * // { [1:1: Something went wrong] * // name: '1:1', * // file: '', * // reason: 'Something went wrong', * // line: null, * // column: null, * // fatal: false } * * @see VFile#message * @this {VFile} * @memberof {VFile} */ function warn() { var err = this.message.apply(this, arguments); err.fatal = false; this.messages.push(err); return err; } /** * Fail. Creates a fatal message (see `VFile#message()`), * sets `fatal: true`, adds it to the file's * `messages` list. * * If `quiet` is not `true`, throws the error. * * @example * var file = new VFile(); * * file.fail('Something went wrong'); * // 1:1: Something went wrong * // at VFile.exception (vfile/index.js:296:11) * // at VFile.fail (vfile/index.js:360:20) * // at repl:1:6 * * file.quiet = true; * file.fail('Something went wrong'); * // { [1:1: Something went wrong] * // name: '1:1', * // file: '', * // reason: 'Something went wrong', * // line: null, * // column: null, * // fatal: true } * * @this {VFile} * @memberof {VFile} * @throws {VFileMessage} - When not `quiet: true`. * @param {string|Error} reason - Reason for failure. * @param {Node|Location|Position} [position] - Place * of failure in file. * @return {VFileMessage} - Unless thrown, of course. */ function fail(reason, position) { var err = this.message(reason, position); err.fatal = true; this.messages.push(err); if (!this.quiet) { throw err; } return err; } /** * Check if a fatal message occurred making the file no * longer processable. * * @example * var file = new VFile(); * file.quiet = true; * * file.hasFailed(); // false * * file.fail('Something went wrong'); * file.hasFailed(); // true * * @this {VFile} * @memberof {VFile} * @return {boolean} - `true` if at least one of file's * `messages` has a `fatal` property set to `true` */ function hasFailed() { var messages = this.messages; var index = -1; var length = messages.length; while (++index < length) { if (messages[index].fatal) { return true; } } return false; } /** * Access metadata. * * @example * var file = new VFile('Foo'); * * file.namespace('foo').bar = 'baz'; * * console.log(file.namespace('foo').bar) // 'baz'; * * @this {VFile} * @memberof {VFile} * @param {string} key - Namespace key. * @return {Object} - Private space. */ function namespace(key) { var self = this; var space = self.data; if (!space) { space = self.data = {}; } if (!space[key]) { space[key] = {}; } return space[key]; } /* * Methods. */ var vFilePrototype = VFile.prototype; vFilePrototype.basename = basename; vFilePrototype.move = move; vFilePrototype.toString = toString; vFilePrototype.message = message; vFilePrototype.warn = warn; vFilePrototype.fail = fail; vFilePrototype.hasFailed = hasFailed; vFilePrototype.namespace = namespace; /* * Expose. */ module.exports = VFile; },{}],638:[function(require,module,exports){ var indexOf = require('indexof'); var Object_keys = function (obj) { if (Object.keys) return Object.keys(obj) else { var res = []; for (var key in obj) res.push(key) return res; } }; var forEach = function (xs, fn) { if (xs.forEach) return xs.forEach(fn) else for (var i = 0; i < xs.length; i++) { fn(xs[i], i, xs); } }; var defineProp = (function() { try { Object.defineProperty({}, '_', {}); return function(obj, name, value) { Object.defineProperty(obj, name, { writable: true, enumerable: false, configurable: true, value: value }) }; } catch(e) { return function(obj, name, value) { obj[name] = value; }; } }()); var globals = ['Array', 'Boolean', 'Date', 'Error', 'EvalError', 'Function', 'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError', 'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError', 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'undefined', 'unescape']; function Context() {} Context.prototype = {}; var Script = exports.Script = function NodeScript (code) { if (!(this instanceof Script)) return new Script(code); this.code = code; }; Script.prototype.runInContext = function (context) { if (!(context instanceof Context)) { throw new TypeError("needs a 'context' argument."); } var iframe = document.createElement('iframe'); if (!iframe.style) iframe.style = {}; iframe.style.display = 'none'; document.body.appendChild(iframe); var win = iframe.contentWindow; var wEval = win.eval, wExecScript = win.execScript; if (!wEval && wExecScript) { // win.eval() magically appears when this is called in IE: wExecScript.call(win, 'null'); wEval = win.eval; } forEach(Object_keys(context), function (key) { win[key] = context[key]; }); forEach(globals, function (key) { if (context[key]) { win[key] = context[key]; } }); var winKeys = Object_keys(win); var res = wEval.call(win, this.code); forEach(Object_keys(win), function (key) { // Avoid copying circular objects like `top` and `window` by only // updating existing context properties or new properties in the `win` // that was only introduced after the eval. if (key in context || indexOf(winKeys, key) === -1) { context[key] = win[key]; } }); forEach(globals, function (key) { if (!(key in context)) { defineProp(context, key, win[key]); } }); document.body.removeChild(iframe); return res; }; Script.prototype.runInThisContext = function () { return eval(this.code); // maybe... }; Script.prototype.runInNewContext = function (context) { var ctx = Script.createContext(context); var res = this.runInContext(ctx); forEach(Object_keys(ctx), function (key) { context[key] = ctx[key]; }); return res; }; forEach(Object_keys(Script.prototype), function (name) { exports[name] = Script[name] = function (code) { var s = Script(code); return s[name].apply(s, [].slice.call(arguments, 1)); }; }); exports.createScript = function (code) { return exports.Script(code); }; exports.createContext = Script.createContext = function (context) { var copy = new Context(); if(typeof context === 'object') { forEach(Object_keys(context), function (key) { copy[key] = context[key]; }); } return copy; }; },{"indexof":165}],639:[function(require,module,exports){ /** * Module Dependencies */ var slice = [].slice; var wrap = require('wrap-fn'); /** * Expose `Ware`. */ module.exports = Ware; /** * Throw an error. * * @param {Error} error */ function fail (err) { throw err; } /** * Initialize a new `Ware` manager, with optional `fns`. * * @param {Function or Array or Ware} fn (optional) */ function Ware (fn) { if (!(this instanceof Ware)) return new Ware(fn); this.fns = []; if (fn) this.use(fn); } /** * Use a middleware `fn`. * * @param {Function or Array or Ware} fn * @return {Ware} */ Ware.prototype.use = function (fn) { if (fn instanceof Ware) { return this.use(fn.fns); } if (fn instanceof Array) { for (var i = 0, f; f = fn[i++];) this.use(f); return this; } this.fns.push(fn); return this; }; /** * Run through the middleware with the given `args` and optional `callback`. * * @param {Mixed} args... * @param {Function} callback (optional) * @return {Ware} */ Ware.prototype.run = function () { var fns = this.fns; var ctx = this; var i = 0; var last = arguments[arguments.length - 1]; var done = 'function' == typeof last && last; var args = done ? slice.call(arguments, 0, arguments.length - 1) : slice.call(arguments); // next step function next (err) { if (err) return (done || fail)(err); var fn = fns[i++]; var arr = slice.call(args); if (!fn) { return done && done.apply(null, [null].concat(args)); } wrap(fn, next).apply(ctx, arr); } next(); return this; }; },{"wrap-fn":640}],640:[function(require,module,exports){ /** * Module Dependencies */ var noop = function(){}; var co = require('co'); /** * Export `wrap-fn` */ module.exports = wrap; /** * Wrap a function to support * sync, async, and gen functions. * * @param {Function} fn * @param {Function} done * @return {Function} * @api public */ function wrap(fn, done) { done = once(done || noop); return function() { // prevents arguments leakage // see https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments var i = arguments.length; var args = new Array(i); while (i--) args[i] = arguments[i]; var ctx = this; // done if (!fn) { return done.apply(ctx, [null].concat(args)); } // async if (fn.length > args.length) { // NOTE: this only handles uncaught synchronous errors try { return fn.apply(ctx, args.concat(done)); } catch (e) { return done(e); } } // generator if (generator(fn)) { return co(fn).apply(ctx, args.concat(done)); } // sync return sync(fn, done).apply(ctx, args); } } /** * Wrap a synchronous function execution. * * @param {Function} fn * @param {Function} done * @return {Function} * @api private */ function sync(fn, done) { return function () { var ret; try { ret = fn.apply(this, arguments); } catch (err) { return done(err); } if (promise(ret)) { ret.then(function (value) { done(null, value); }, done); } else { ret instanceof Error ? done(ret) : done(null, ret); } } } /** * Is `value` a generator? * * @param {Mixed} value * @return {Boolean} * @api private */ function generator(value) { return value && value.constructor && 'GeneratorFunction' == value.constructor.name; } /** * Is `value` a promise? * * @param {Mixed} value * @return {Boolean} * @api private */ function promise(value) { return value && 'function' == typeof value.then; } /** * Once */ function once(fn) { return function() { var ret = fn.apply(this, arguments); fn = noop; return ret; }; } },{"co":83}],641:[function(require,module,exports){ // Returns a wrapper function that returns a wrapped callback // The wrapper function should do some stuff, and return a // presumably different callback function. // This makes sure that own properties are retained, so that // decorations and such are not lost along the way. module.exports = wrappy function wrappy (fn, cb) { if (fn && cb) return wrappy(fn)(cb) if (typeof fn !== 'function') throw new TypeError('need wrapper function') Object.keys(fn).forEach(function (k) { wrapper[k] = fn[k] }) return wrapper function wrapper() { var args = new Array(arguments.length) for (var i = 0; i < args.length; i++) { args[i] = arguments[i] } var ret = fn.apply(this, args) var cb = args[args.length-1] if (typeof ret === 'function' && ret !== cb) { Object.keys(cb).forEach(function (k) { ret[k] = cb[k] }) } return ret } } },{}],642:[function(require,module,exports){ /** * Module dependencies. */ var global = (function() { return this; })(); /** * WebSocket constructor. */ var WebSocket = global.WebSocket || global.MozWebSocket; /** * Module exports. */ module.exports = WebSocket ? ws : null; /** * WebSocket constructor. * * The third `opts` options object gets ignored in web browsers, since it's * non-standard, and throws a TypeError if passed to the constructor. * See: https://github.com/einaros/ws/issues/227 * * @param {String} uri * @param {Array} protocols (optional) * @param {Object) opts (optional) * @api public */ function ws(uri, protocols, opts) { var instance; if (protocols) { instance = new WebSocket(uri, protocols); } else { instance = new WebSocket(uri); } return instance; } if (WebSocket) ws.prototype = WebSocket.prototype; },{}],643:[function(require,module,exports){ module.exports = function zerr (name, msgTemplate) { // make sure the name ends with the word Error if (name.slice(-5) != 'Error') name += 'Error' function ZError () { // call as a class constructor if called as a function if (!(this instanceof ZError)) { // a bit tricker than usual, because we have to combine `apply()` with the `new` form... function ZE (args) { return ZError.apply(this, args) } ZE.prototype = ZError.prototype; return new ZE(arguments) } Error.call(this) Error.captureStackTrace(this, arguments.callee) this.name = name // if an error was passed, shift it out of the args var parentErr var args = Array.prototype.slice.call(arguments) if (args[0] instanceof Error) parentErr = args.shift() // create message if (msgTemplate) this.message = interp(msgTemplate, args) else if (typeof args[0] == 'string') this.message = args[0] // modify stack to show parent error if (parentErr) { var stack = removePrefix(getStack(this), getStack(parentErr)).join('\n') this.stack = this.name + ': ' + this.message + '\n' + stack + '\n ' + parentErr.stack } } ZError.prototype = Object.create(Error.prototype) return ZError } // interpolate function // - takes a template string and a list of strings to insert // - replaces '%' token in tmpl using values in `args` // eg interp('hello %, how are you % today?', ['bob', 'doing']) => 'hello bob, how are you doing today?' // eg interp('hello %, how are you % today?', ['bob']) => 'hello bob, how are you today?' var re = /%/g function interp (tmpl, args) { var n = 0 return tmpl.replace(re, function () { return args[n++] || '' }) } function getStack(err) { return err.stack.substring(err.name.length + 3 + err.message.length) .split('\n') } function removePrefix (a, b) { return a.filter(function (e) { return !~b.indexOf(e) }) } },{}],644:[function(require,module,exports){ (function (process,__dirname){ var ssbKeys = require('ssb-keys') var config = require('ssb-config/inject')(process.env.ssb_appname) var fs = require('fs') var path = require('path') var manifestFile = path.join(__dirname, 'manifest.json') var pull = require('pull-stream') var Serializer = require('pull-serializer') var keys = ssbKeys.loadOrCreateSync(path.join(config.path, 'secret')) var createSbot = require('scuttlebot') .use(require('scuttlebot/plugins/master')) .use(require('scuttlebot/plugins/gossip')) .use(require('scuttlebot/plugins/friends')) .use(require('scuttlebot/plugins/replicate')) .use(require('scuttlebot/plugins/blobs')) .use(require('scuttlebot/plugins/invite')) .use(require('scuttlebot/plugins/block')) .use(require('scuttlebot/plugins/local')) .use(require('scuttlebot/plugins/logging')) .use(require('scuttlebot/plugins/private')) .use(require('ssb-links')) .use(require('ssb-query')) .use(require('ssb-http')) config.keys = keys var sbot = createSbot(config) fs.writeFileSync(manifestFile, JSON.stringify(sbot.getManifest(), null, 2)) var http = require('http') var WS = require('pull-ws-server') var MuxRpc = require('muxrpc') var server = http.createServer(function (req, res) { fs.createReadStream(path.join(__dirname, 'static', 'index.html')).pipe(res) }).listen(8000) WS.createServer({server: server}, function (ws) { console.log('RPC connection') var rpc = MuxRpc(sbot.getManifest(), sbot.getManifest(), Serializer) (sbot) pull(ws, pull.through(console.log), rpc.createStream(), pull.through(console.log), ws) }) }).call(this,require('_process'),"/") },{"_process":295,"fs":58,"http":588,"muxrpc":261,"path":290,"pull-serializer":373,"pull-stream":381,"pull-ws-server":394,"scuttlebot":425,"scuttlebot/plugins/blobs":437,"scuttlebot/plugins/block":441,"scuttlebot/plugins/friends":442,"scuttlebot/plugins/gossip":443,"scuttlebot/plugins/invite":446,"scuttlebot/plugins/local":447,"scuttlebot/plugins/logging":448,"scuttlebot/plugins/master":449,"scuttlebot/plugins/private":450,"scuttlebot/plugins/replicate":451,"ssb-config/inject":517,"ssb-http":522,"ssb-keys":530,"ssb-links":535,"ssb-query":544}]},{},[644]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS5qcyIsIm5vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2FwaS5qcyIsIm5vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2Jhc2UvYnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvYmFzZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2Jhc2Uvbm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2Jhc2UvcmVwb3J0ZXIuanMiLCJub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9jb25zdGFudHMvZGVyLmpzIiwibm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvY29uc3RhbnRzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZGVjb2RlcnMvZGVyLmpzIiwibm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZGVjb2RlcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9kZWNvZGVycy9wZW0uanMiLCJub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9lbmNvZGVycy9kZXIuanMiLCJub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9lbmNvZGVycy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2VuY29kZXJzL3BlbS5qcyIsIm5vZGVfbW9kdWxlcy9hc3NlcnQvYXNzZXJ0LmpzIiwibm9kZV9tb2R1bGVzL2F0dGFjaC13YXJlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JhaWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYmFsYW5jZWQtbWF0Y2gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYmFzaC1jb2xvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9iaW5hcnktc2VhcmNoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JpbmRpbmdzL2JpbmRpbmdzLmpzIiwibm9kZV9tb2R1bGVzL2JsL2JsLmpzIiwibm9kZV9tb2R1bGVzL2JsL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JsL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzIiwibm9kZV9tb2R1bGVzL2JsL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwibm9kZV9tb2R1bGVzL2JsL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvYmwvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9ibGFrZTJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIsIm5vZGVfbW9kdWxlcy9icmFjZS1leHBhbnNpb24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvYWRjYXN0LXN0cmVhbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9icm9yYW5kL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXItcmVzb2x2ZS9lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9hZXMuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvYXV0aENpcGhlci5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2RlY3J5cHRlci5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9lbmNyeXB0ZXIuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvZ2hhc2guanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvY2JjLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2NmYi5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9jZmIxLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2NmYjguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvY3RyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2VjYi5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9vZmIuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvc3RyZWFtQ2lwaGVyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktY2lwaGVyL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1kZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1kZXMvbW9kZXMuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1yc2EvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1zaWduL2FsZ29zLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnbi9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnbi9jdXJ2ZXMuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1zaWduL3NpZ24uanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1zaWduL3ZlcmlmeS5qcyIsIm5vZGVfbW9kdWxlcy9idWZmZXItZXF1YWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnVmZmVyLXhvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnVmZmVyL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvbGliL2I2NC5qcyIsIm5vZGVfbW9kdWxlcy9idWlsdGluLXN0YXR1cy1jb2Rlcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2J5dGV3aXNlLWNvcmUvYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9ieXRld2lzZS1jb3JlL2NvZGVjcy5qcyIsIm5vZGVfbW9kdWxlcy9ieXRld2lzZS1jb3JlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2J5dGV3aXNlLWNvcmUvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9jY291bnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hhcmFjdGVyLWVudGl0aWVzLWh0bWw0L2luZGV4Lmpzb24iLCJub2RlX21vZHVsZXMvY2hhcmFjdGVyLWVudGl0aWVzLWh0bWw0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1lbnRpdGllcy1sZWdhY3kvaW5kZXguanNvbiIsIm5vZGVfbW9kdWxlcy9jaGFyYWN0ZXItZW50aXRpZXMtbGVnYWN5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1lbnRpdGllcy9pbmRleC5qc29uIiwibm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1lbnRpdGllcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFyYWN0ZXItcmVmZXJlbmNlLWludmFsaWQvaW5kZXguanNvbiIsIm5vZGVfbW9kdWxlcy9jaGFyYWN0ZXItcmVmZXJlbmNlLWludmFsaWQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hsb3JpZGUvYmluZGluZ3MuanMiLCJub2RlX21vZHVsZXMvY2hsb3JpZGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9jaGxvcmlkZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaXBoZXItYmFzZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jbG9uZS9jbG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9jby9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb2xsYXBzZS13aGl0ZS1zcGFjZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb25jYXQtbWFwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29udGludWFibGUtaGFzaC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb250aW51YWJsZS1oYXNoL25vZGVfbW9kdWxlcy9jb250aW51YWJsZS9tYXliZS1jYWxsYmFjay5qcyIsIm5vZGVfbW9kdWxlcy9jb250aW51YWJsZS1saXN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbnRpbnVhYmxlLXBhcmEvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29udGludWFibGUtc2VyaWVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbnRpbnVhYmxlL2JvdGguanMiLCJub2RlX21vZHVsZXMvY29udGludWFibGUvY2hhaW4uanMiLCJub2RlX21vZHVsZXMvY29udGludWFibGUvZWl0aGVyLmpzIiwibm9kZV9tb2R1bGVzL2NvbnRpbnVhYmxlL2Vycm9yLmpzIiwibm9kZV9tb2R1bGVzL2NvbnRpbnVhYmxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbnRpbnVhYmxlL2pvaW4uanMiLCJub2RlX21vZHVsZXMvY29udGludWFibGUvbWFwLWFzeW5jLmpzIiwibm9kZV9tb2R1bGVzL2NvbnRpbnVhYmxlL21hcC5qcyIsIm5vZGVfbW9kdWxlcy9jb250aW51YWJsZS9vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb250aW51YWJsZS90by5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLXV0aWwtaXMvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvY3JlYXRlLWVjZGgvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9jcmVhdGUtaGFzaC9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2NyZWF0ZS1oYXNoL2hlbHBlcnMuanMiLCJub2RlX21vZHVsZXMvY3JlYXRlLWhhc2gvbWQ1LmpzIiwibm9kZV9tb2R1bGVzL2NyZWF0ZS1obWFjL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvY3J5cHRvLWJyb3dzZXJpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGVlcC1leHRlbmQvbGliL2RlZXAtZXh0ZW5kLmpzIiwibm9kZV9tb2R1bGVzL2RlZmluZWQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMuanMiLCJub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMvY2JjLmpzIiwibm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL2NpcGhlci5qcyIsIm5vZGVfbW9kdWxlcy9kZXMuanMvbGliL2Rlcy9kZXMuanMiLCJub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMvZWRlLmpzIiwibm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2RldGFiL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RpZmZpZS1oZWxsbWFuL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvZGlmZmllLWhlbGxtYW4vbGliL2RoLmpzIiwibm9kZV9tb2R1bGVzL2RpZmZpZS1oZWxsbWFuL2xpYi9nZW5lcmF0ZVByaW1lLmpzIiwibm9kZV9tb2R1bGVzL2RpZmZpZS1oZWxsbWFuL2xpYi9wcmltZXMuanNvbiIsIm5vZGVfbW9kdWxlcy9lY2Nqcy9kaXN0LzAuMy9lY2MuanMiLCJub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljLmpzIiwibm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9jdXJ2ZS9iYXNlLmpzIiwibm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9jdXJ2ZS9lZHdhcmRzLmpzIiwibm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9jdXJ2ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvbW9udC5qcyIsIm5vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvc2hvcnQuanMiLCJub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlcy5qcyIsIm5vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvZWMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2VjL2tleS5qcyIsIm5vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvZWMvc2lnbmF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lZGRzYS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvZWRkc2Eva2V5LmpzIiwibm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lZGRzYS9zaWduYXR1cmUuanMiLCJub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2htYWMtZHJiZy5qcyIsIm5vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvcHJlY29tcHV0ZWQvc2VjcDI1NmsxLmpzIiwibm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9lbGxpcHRpYy9wYWNrYWdlLmpzb24iLCJub2RlX21vZHVsZXMvZXJybm8vY3VzdG9tLmpzIiwibm9kZV9tb2R1bGVzL2Vycm5vL2Vycm5vLmpzIiwibm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJub2RlX21vZHVsZXMvZXZwX2J5dGVzdG9rZXkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZXhwbGFpbi1lcnJvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9leHRlbmQuanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZXh0ZW5kL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zhc3QtZnV0dXJlL2Zhc3QtZnV0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2dsb2IvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL2dsb2IvZ2xvYi5qcyIsIm5vZGVfbW9kdWxlcy9nbG9iL3N5bmMuanMiLCJub2RlX21vZHVsZXMvZ3JhcGhtaXR0ZXIvYWxnb3JpdGhtcy5qcyIsIm5vZGVfbW9kdWxlcy9ncmFwaG1pdHRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoLmpzIiwibm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvaG1hYy5qcyIsIm5vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3JpcGVtZC5qcyIsIm5vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS5qcyIsIm5vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2htYWMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaG9veC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2luY3JlbWVudC1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaW5kZXhvZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmZsaWdodC9pbmZsaWdodC5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2lwLXJlZ2V4L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lwL2xpYi9pcC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtdmFsaWQtZG9tYWluL2lzLXZhbGlkLWRvbWFpbi5qcyIsIm5vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLWNvZGVjL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLWNvZGVjL2xpYi9lbmNvZGluZ3MuanMiLCJub2RlX21vZHVsZXMvbGV2ZWwtZXJyb3JzL2Vycm9ycy5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1pdGVyYXRvci1zdHJlYW0vaW5kZXguanMiLCJub2RlX21vZHVsZXMvbGV2ZWwtaXRlcmF0b3Itc3RyZWFtL25vZGVfbW9kdWxlcy94dGVuZC9pbW11dGFibGUuanMiLCJub2RlX21vZHVsZXMvbGV2ZWwtbWVtdmlldy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1tZW12aWV3L25vZGVfbW9kdWxlcy9wdWxsLXN0cmVhbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1tZW12aWV3L25vZGVfbW9kdWxlcy9wdWxsLXN0cmVhbS9tYXliZS5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1tZW12aWV3L25vZGVfbW9kdWxlcy9wdWxsLXN0cmVhbS9zaW5rcy5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1tZW12aWV3L25vZGVfbW9kdWxlcy9wdWxsLXN0cmVhbS9zb3VyY2VzLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLW1lbXZpZXcvbm9kZV9tb2R1bGVzL3B1bGwtc3RyZWFtL3Rocm91Z2hzLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLXBhY2thZ2VyL2xldmVsLXBhY2thZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLXBhY2thZ2VyL25vZGVfbW9kdWxlcy9hYnN0cmFjdC1sZXZlbGRvd24vYWJzdHJhY3QtY2hhaW5lZC1iYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1wYWNrYWdlci9ub2RlX21vZHVsZXMvYWJzdHJhY3QtbGV2ZWxkb3duL2Fic3RyYWN0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLXBhY2thZ2VyL25vZGVfbW9kdWxlcy9hYnN0cmFjdC1sZXZlbGRvd24vYWJzdHJhY3QtbGV2ZWxkb3duLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLXBhY2thZ2VyL25vZGVfbW9kdWxlcy9hYnN0cmFjdC1sZXZlbGRvd24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvbGV2ZWwtcGFja2FnZXIvbm9kZV9tb2R1bGVzL2Fic3RyYWN0LWxldmVsZG93bi9pcy1sZXZlbGRvd24uanMiLCJub2RlX21vZHVsZXMvbGV2ZWwtcGFja2FnZXIvbm9kZV9tb2R1bGVzL2RlZmVycmVkLWxldmVsZG93bi9kZWZlcnJlZC1pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1wYWNrYWdlci9ub2RlX21vZHVsZXMvZGVmZXJyZWQtbGV2ZWxkb3duL2RlZmVycmVkLWxldmVsZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbC1wYWNrYWdlci9ub2RlX21vZHVsZXMvbGV2ZWx1cC9saWIvYmF0Y2guanMiLCJub2RlX21vZHVsZXMvbGV2ZWwtcGFja2FnZXIvbm9kZV9tb2R1bGVzL2xldmVsdXAvbGliL2xldmVsdXAuanMiLCJub2RlX21vZHVsZXMvbGV2ZWwtcGFja2FnZXIvbm9kZV9tb2R1bGVzL2xldmVsdXAvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvbGV2ZWwtcGFja2FnZXIvbm9kZV9tb2R1bGVzL2xldmVsdXAvcGFja2FnZS5qc29uIiwibm9kZV9tb2R1bGVzL2xldmVsLXBhY2thZ2VyL25vZGVfbW9kdWxlcy9wcnIvcHJyLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsLXBvc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbGV2ZWwvbGV2ZWwuanMiLCJub2RlX21vZHVsZXMvbGV2ZWxkb3duL2NoYWluZWQtYmF0Y2guanMiLCJub2RlX21vZHVsZXMvbGV2ZWxkb3duL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsZG93bi9sZXZlbGRvd24uanMiLCJub2RlX21vZHVsZXMvbGV2ZWxkb3duL25vZGVfbW9kdWxlcy9hYnN0cmFjdC1sZXZlbGRvd24vYWJzdHJhY3QtY2hhaW5lZC1iYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbGRvd24vbm9kZV9tb2R1bGVzL2Fic3RyYWN0LWxldmVsZG93bi9hYnN0cmFjdC1pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbGRvd24vbm9kZV9tb2R1bGVzL2Fic3RyYWN0LWxldmVsZG93bi9hYnN0cmFjdC1sZXZlbGRvd24uanMiLCJub2RlX21vZHVsZXMvbGV2ZWx1cC9saWIvY29kZWMuanMiLCJub2RlX21vZHVsZXMvbGV2ZWx1cC9saWIvZW5jb2RpbmdzLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsdXAvbGliL2Vycm9ycy5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbHVwL2xpYi9yZWFkLXN0cmVhbS5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbHVwL2xpYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsdXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCJub2RlX21vZHVsZXMvbGV2ZWx1cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsdXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbHVwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL2xldmVsdXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9sZXZlbHVwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvbGV2ZWx1cC9ub2RlX21vZHVsZXMveHRlbmQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbGV2ZWx1cC9wYWNrYWdlLmpzb24iLCJub2RlX21vZHVsZXMvbGlic29kaXVtLXdyYXBwZXJzL2Rpc3QvbW9kdWxlcy9saWJzb2RpdW0td3JhcHBlcnMuanMiLCJub2RlX21vZHVsZXMvbGlic29kaXVtL2Rpc3QvbW9kdWxlcy9saWJzb2RpdW0uanMiLCJub2RlX21vZHVsZXMvbG9uZ2VzdC1zdHJlYWsvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbG9vcGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2x0Z3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWFwLWZpbHRlci1yZWR1Y2UvYmFzaWMuanMiLCJub2RlX21vZHVsZXMvbWFwLWZpbHRlci1yZWR1Y2UvZmlsdGVyLmpzIiwibm9kZV9tb2R1bGVzL21hcC1maWx0ZXItcmVkdWNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21hcC1maWx0ZXItcmVkdWNlL2tleXMuanMiLCJub2RlX21vZHVsZXMvbWFwLWZpbHRlci1yZWR1Y2UvbWFwLmpzIiwibm9kZV9tb2R1bGVzL21hcC1maWx0ZXItcmVkdWNlL25vZGVfbW9kdWxlcy9wdWxsLXN0cmVhbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tYXAtZmlsdGVyLXJlZHVjZS9ub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vcHVsbC5qcyIsIm5vZGVfbW9kdWxlcy9tYXAtZmlsdGVyLXJlZHVjZS9ub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vc2lua3MuanMiLCJub2RlX21vZHVsZXMvbWFwLWZpbHRlci1yZWR1Y2Uvbm9kZV9tb2R1bGVzL3B1bGwtc3RyZWFtL3NvdXJjZXMuanMiLCJub2RlX21vZHVsZXMvbWFwLWZpbHRlci1yZWR1Y2Uvbm9kZV9tb2R1bGVzL3B1bGwtc3RyZWFtL3Rocm91Z2hzLmpzIiwibm9kZV9tb2R1bGVzL21hcC1maWx0ZXItcmVkdWNlL3JlZHVjZS5qcyIsIm5vZGVfbW9kdWxlcy9tYXAtZmlsdGVyLXJlZHVjZS91dGlsLmpzIiwibm9kZV9tb2R1bGVzL21hcC1tZXJnZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tYXJrZG93bi10YWJsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tZG1hbmlmZXN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21pbGxlci1yYWJpbi9saWIvbXIuanMiLCJub2RlX21vZHVsZXMvbWltZS1kYi9kYi5qc29uIiwibm9kZV9tb2R1bGVzL21pbWUtZGIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWltZS10eXBlcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9taW5pbWFsaXN0aWMtYXNzZXJ0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21pbmltYXRjaC9taW5pbWF0Y2guanMiLCJub2RlX21vZHVsZXMvbWtkaXJwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21vbm90b25pYy10aW1lc3RhbXAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbXVsdGlibG9iL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL211bHRpYmxvYi9ub2RlX21vZHVsZXMvcHVsbC1ub3RpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbXVsdGlibG9iL25vZGVfbW9kdWxlcy9yaW1yYWYvcmltcmFmLmpzIiwibm9kZV9tb2R1bGVzL211bHRpYmxvYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL211eHJwYy12YWxpZGF0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL211eHJwYy9hcGkuanMiLCJub2RlX21vZHVsZXMvbXV4cnBjL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL211eHJwYy9sb2NhbC1hcGkuanMiLCJub2RlX21vZHVsZXMvbXV4cnBjL3Blcm1pc3Npb25zLmpzIiwibm9kZV9tb2R1bGVzL211eHJwYy9wdWxsLXdlaXJkLmpzIiwibm9kZV9tb2R1bGVzL211eHJwYy9zdHJlYW0uanMiLCJub2RlX21vZHVsZXMvbXV4cnBjL3V0aWwuanMiLCJub2RlX21vZHVsZXMvbm9uLXByaXZhdGUtaXAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbm9ybWFsaXplLXVyaS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL29ic2Vydi1kZWJvdW5jZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9vYnNlcnYvaW5kZXguanMiLCJub2RlX21vZHVsZXMvb24td2FrZXVwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL29uY2Uvb25jZS5qcyIsIm5vZGVfbW9kdWxlcy9vcy1icm93c2VyaWZ5L2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvb3MtaG9tZWRpci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9vcy10bXBkaXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvb3NlbnYvb3NlbnYuanMiLCJub2RlX21vZHVsZXMvcGFja2V0LXN0cmVhbS1jb2RlYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYWNrZXQtc3RyZWFtL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlLWFzbjEvYWVzaWQuanNvbiIsIm5vZGVfbW9kdWxlcy9wYXJzZS1hc24xL2FzbjEuanMiLCJub2RlX21vZHVsZXMvcGFyc2UtYXNuMS9maXhQcm9jLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlLWFzbjEvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2UtZW50aXRpZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGF0aC1icm93c2VyaWZ5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BhdGgtaXMtYWJzb2x1dGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGJrZGYyL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcHJpdmF0ZS1ib3gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3B1YmxpYy1lbmNyeXB0L2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvbWdmLmpzIiwibm9kZV9tb2R1bGVzL3B1YmxpYy1lbmNyeXB0L3ByaXZhdGVEZWNyeXB0LmpzIiwibm9kZV9tb2R1bGVzL3B1YmxpYy1lbmNyeXB0L3B1YmxpY0VuY3J5cHQuanMiLCJub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvd2l0aFB1YmxpYy5qcyIsIm5vZGVfbW9kdWxlcy9wdWJsaWMtZW5jcnlwdC94b3IuanMiLCJub2RlX21vZHVsZXMvcHVsbC1hYm9ydGFibGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC1ib3gtc3RyZWFtL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtY2F0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtY29yZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLWRlZmVyL2R1cGxleC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLWRlZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtZGVmZXIvc2luay5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLWRlZmVyL3NvdXJjZS5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLWRlZmVyL3Rocm91Z2guanMiLCJub2RlX21vZHVsZXMvcHVsbC1maWxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtZnMvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLWZzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtZnMvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLWdsb2IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC1nb29kYnllL2VuZGFibGUuanMiLCJub2RlX21vZHVsZXMvcHVsbC1nb29kYnllL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtaGFuZHNoYWtlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtaWRlbnRpZnktZmlsZXR5cGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC1pZGVudGlmeS1maWxldHlwZS9tYWdpYy1udW1iZXJzLmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtaW5hY3Rpdml0eS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLWluYWN0aXZpdHkvbm9kZV9tb2R1bGVzL3B1bGwtc3RyZWFtL3Rocm91Z2hzLmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtaW5hY3Rpdml0eS9yYXRlLmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtbGV2ZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC1sZXZlbC9ub2RlX21vZHVsZXMvcHVsbC1jb3JlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtbGV2ZWwvbm9kZV9tb2R1bGVzL3B1bGwtcHVzaGFibGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC1sZXZlbC9ub2RlX21vZHVsZXMvcHVsbC1wdXNoYWJsZS9ub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC1sZXZlbC9ub2RlX21vZHVsZXMvcHVsbC1wdXNoYWJsZS9ub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vbWF5YmUuanMiLCJub2RlX21vZHVsZXMvcHVsbC1sZXZlbC9ub2RlX21vZHVsZXMvcHVsbC1wdXNoYWJsZS9ub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vc2lua3MuanMiLCJub2RlX21vZHVsZXMvcHVsbC1sZXZlbC9ub2RlX21vZHVsZXMvcHVsbC1wdXNoYWJsZS9ub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vc291cmNlcy5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLWxldmVsL25vZGVfbW9kdWxlcy9wdWxsLXB1c2hhYmxlL25vZGVfbW9kdWxlcy9wdWxsLXN0cmVhbS90aHJvdWdocy5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLWxldmVsL25vZGVfbW9kdWxlcy9zdHJlYW0tdG8tcHVsbC1zdHJlYW0vaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC1tYW55L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtbm90aWZ5L25vZGVfbW9kdWxlcy9wdWxsLXN0cmVhbS90aHJvdWdocy5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXBhaXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC1wYXJhbWFwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtcGluZy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXB1c2hhYmxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtcmVhZGVyL2JsLXN0YXRlLmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtcmVhZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtc2VyaWFsaXplci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXNlcmlhbGl6ZXIvbm9kZV9tb2R1bGVzL3B1bGwtc3RyZWFtL3Rocm91Z2hzLmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtc2luay10aHJvdWdoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtc3BsaXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vc291cmNlcy5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXN0cmVhbS90aHJvdWdocy5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXRocm91Z2gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC10aHJvdWdoL25vZGVfbW9kdWxlcy9sb29wZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC10cmF2ZXJzZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXV0ZjgtZGVjb2Rlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXdpbmRvdy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXdyaXRlLWZpbGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHVsbC13cml0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXdzLXNlcnZlci9jbGllbnQuanMiLCJub2RlX21vZHVsZXMvcHVsbC13cy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXdzL3JlYWR5LmpzIiwibm9kZV9tb2R1bGVzL3B1bGwtd3Mvc2luay5qcyIsIm5vZGVfbW9kdWxlcy9wdWxsLXdzL3NvdXJjZS5qcyIsIm5vZGVfbW9kdWxlcy9wdW55Y29kZS9wdW55Y29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZGVjb2RlLmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanMiLCJub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JhbmRvbWJ5dGVzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmMvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrLWh0bWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVtYXJrLWh0bWwvbGliL2NvbXBpbGVycy5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmstaHRtbC9saWIvaC5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmstaHRtbC9saWIvdHJhbnNmb3JtZXIuanMiLCJub2RlX21vZHVsZXMvcmVtYXJrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlbWFyay9saWIvYmxvY2stZWxlbWVudHMuanNvbiIsIm5vZGVfbW9kdWxlcy9yZW1hcmsvbGliL2RlZmF1bHRzLmpzIiwibm9kZV9tb2R1bGVzL3JlbWFyay9saWIvZXNjYXBlLmpzb24iLCJub2RlX21vZHVsZXMvcmVtYXJrL2xpYi9wYXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmsvbGliL3N0cmluZ2lmeS5qcyIsIm5vZGVfbW9kdWxlcy9yZW1hcmsvbGliL3V0aWxpdGllcy5qcyIsIm5vZGVfbW9kdWxlcy9yZXBlYXQtc3RyaW5nL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JpbXJhZi9yaW1yYWYuanMiLCJub2RlX21vZHVsZXMvcmlwZW1kMTYwL2xpYi9yaXBlbWQxNjAuanMiLCJub2RlX21vZHVsZXMvc2N1dHRsZWJvdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zY3V0dGxlYm90L2xpYi9hcGlkb2NzLmpzIiwibm9kZV9tb2R1bGVzL3NjdXR0bGVib3QvbGliL2NsaS1jbWQtYWxpYXNlcy5qcyIsIm5vZGVfbW9kdWxlcy9zY3V0dGxlYm90L2xpYi9zc2ItY2FwLmpzIiwibm9kZV9tb2R1bGVzL3NjdXR0bGVib3QvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvc2N1dHRsZWJvdC9saWIvdmFsaWRhdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9zY3V0dGxlYm90L25vZGVfbW9kdWxlcy9zc2ItbXNncy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zY3V0dGxlYm90L3BsdWdpbnMvYmxvYnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2N1dHRsZWJvdC9wbHVnaW5zL2Jsb2JzL3F1ZXVlLmpzIiwibm9kZV9tb2R1bGVzL3NjdXR0bGVib3QvcGx1Z2lucy9ibG9icy9xdW90YS5qcyIsIm5vZGVfbW9kdWxlcy9zY3V0dGxlYm90L3BsdWdpbnMvYmxvYnMvcmVwbGljYXRpb24uanMiLCJub2RlX21vZHVsZXMvc2N1dHRsZWJvdC9wbHVnaW5zL2Jsb2NrLmpzIiwibm9kZV9tb2R1bGVzL3NjdXR0bGVib3QvcGx1Z2lucy9mcmllbmRzLmpzIiwibm9kZV9tb2R1bGVzL3NjdXR0bGVib3QvcGx1Z2lucy9nb3NzaXAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2N1dHRsZWJvdC9wbHVnaW5zL2dvc3NpcC9pbml0LmpzIiwibm9kZV9tb2R1bGVzL3NjdXR0bGVib3QvcGx1Z2lucy9nb3NzaXAvc2NoZWR1bGUuanMiLCJub2RlX21vZHVsZXMvc2N1dHRsZWJvdC9wbHVnaW5zL2ludml0ZS5qcyIsIm5vZGVfbW9kdWxlcy9zY3V0dGxlYm90L3BsdWdpbnMvbG9jYWwuanMiLCJub2RlX21vZHVsZXMvc2N1dHRsZWJvdC9wbHVnaW5zL2xvZ2dpbmcuanMiLCJub2RlX21vZHVsZXMvc2N1dHRsZWJvdC9wbHVnaW5zL21hc3Rlci5qcyIsIm5vZGVfbW9kdWxlcy9zY3V0dGxlYm90L3BsdWdpbnMvcHJpdmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9zY3V0dGxlYm90L3BsdWdpbnMvcmVwbGljYXRlLmpzIiwibm9kZV9tb2R1bGVzL3NlY3JldC1oYW5kc2hha2UvaGFuZHNoYWtlLmpzIiwibm9kZV9tb2R1bGVzL3NlY3JldC1oYW5kc2hha2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2VjcmV0LWhhbmRzaGFrZS9uZXQuanMiLCJub2RlX21vZHVsZXMvc2VjcmV0LWhhbmRzaGFrZS9zZWN1cmUuanMiLCJub2RlX21vZHVsZXMvc2VjcmV0LWhhbmRzaGFrZS9zdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9zZWNyZXQtc3RhY2svYXBpLmpzIiwibm9kZV9tb2R1bGVzL3NlY3JldC1zdGFjay9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zZWNyZXQtc3RhY2svbm9kZV9tb2R1bGVzL25vbi1wcml2YXRlLWlwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NlY3JldC1zdGFjay9ub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vdGhyb3VnaHMuanMiLCJub2RlX21vZHVsZXMvc2VjcmV0LXN0YWNrL3V0aWwuanMiLCJub2RlX21vZHVsZXMvc2VjdXJlLXNjdXR0bGVidXR0L2NvZGVjLmpzIiwibm9kZV9tb2R1bGVzL3NlY3VyZS1zY3V0dGxlYnV0dC9jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvc2VjdXJlLXNjdXR0bGVidXR0L2RlZmF1bHRzLmpzIiwibm9kZV9tb2R1bGVzL3NlY3VyZS1zY3V0dGxlYnV0dC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zZWN1cmUtc2N1dHRsZWJ1dHQvbm9kZV9tb2R1bGVzL2J5dGV3aXNlL2VuY29kaW5nL2JpbmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zZWN1cmUtc2N1dHRsZWJ1dHQvbm9kZV9tb2R1bGVzL2J5dGV3aXNlL2VuY29kaW5nL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NlY3VyZS1zY3V0dGxlYnV0dC9ub2RlX21vZHVsZXMvYnl0ZXdpc2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2VjdXJlLXNjdXR0bGVidXR0L25vZGVfbW9kdWxlcy9sZXZlbC1zdWJsZXZlbC9ieXRld2lzZS5qcyIsIm5vZGVfbW9kdWxlcy9zZWN1cmUtc2N1dHRsZWJ1dHQvbm9kZV9tb2R1bGVzL2xldmVsLXN1YmxldmVsL2NvZGVjL2J5dGV3aXNlLmpzIiwibm9kZV9tb2R1bGVzL3NlY3VyZS1zY3V0dGxlYnV0dC9ub2RlX21vZHVsZXMvbGV2ZWwtc3VibGV2ZWwvaG9va3MuanMiLCJub2RlX21vZHVsZXMvc2VjdXJlLXNjdXR0bGVidXR0L25vZGVfbW9kdWxlcy9sZXZlbC1zdWJsZXZlbC9ub2RlX21vZHVsZXMvbHRndC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zZWN1cmUtc2N1dHRsZWJ1dHQvbm9kZV9tb2R1bGVzL2xldmVsLXN1YmxldmVsL251dC5qcyIsIm5vZGVfbW9kdWxlcy9zZWN1cmUtc2N1dHRsZWJ1dHQvbm9kZV9tb2R1bGVzL2xldmVsLXN1YmxldmVsL3BhY2thZ2UuanNvbiIsIm5vZGVfbW9kdWxlcy9zZWN1cmUtc2N1dHRsZWJ1dHQvbm9kZV9tb2R1bGVzL2xldmVsLXN1YmxldmVsL3JhbmdlLmpzIiwibm9kZV9tb2R1bGVzL3NlY3VyZS1zY3V0dGxlYnV0dC9ub2RlX21vZHVsZXMvbGV2ZWwtc3VibGV2ZWwvc2hlbGwuanMiLCJub2RlX21vZHVsZXMvc2VjdXJlLXNjdXR0bGVidXR0L25vZGVfbW9kdWxlcy9wdWxsLWxldmVsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NlY3VyZS1zY3V0dGxlYnV0dC9ub2RlX21vZHVsZXMvcHVsbC1wdXNoYWJsZS9ub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vdGhyb3VnaHMuanMiLCJub2RlX21vZHVsZXMvc2VjdXJlLXNjdXR0bGVidXR0L25vZGVfbW9kdWxlcy9wdWxsLXN0cmVhbS9zb3VyY2VzLmpzIiwibm9kZV9tb2R1bGVzL3NlY3VyZS1zY3V0dGxlYnV0dC9ub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vdGhyb3VnaHMuanMiLCJub2RlX21vZHVsZXMvc2VjdXJlLXNjdXR0bGVidXR0L3BhY2thZ2UuanNvbiIsIm5vZGVfbW9kdWxlcy9zaGEuanMvaGFzaC5qcyIsIm5vZGVfbW9kdWxlcy9zaGEuanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2hhLmpzL3NoYS5qcyIsIm5vZGVfbW9kdWxlcy9zaGEuanMvc2hhMS5qcyIsIm5vZGVfbW9kdWxlcy9zaGEuanMvc2hhMjI0LmpzIiwibm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEyNTYuanMiLCJub2RlX21vZHVsZXMvc2hhLmpzL3NoYTM4NC5qcyIsIm5vZGVfbW9kdWxlcy9zaGEuanMvc2hhNTEyLmpzIiwibm9kZV9tb2R1bGVzL3NvZGl1bS1icm93c2VyaWZ5L2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvc29kaXVtLWJyb3dzZXJpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3BsaXQtYnVmZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NzYi1jb25maWcvaW5qZWN0LmpzIiwibm9kZV9tb2R1bGVzL3NzYi1mZWVkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NzYi1mZWVkL3V0aWwuanMiLCJub2RlX21vZHVsZXMvc3NiLWZlZWQvdmFsaWRhdG9yLmpzIiwibm9kZV9tb2R1bGVzL3NzYi1odHRwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NzYi1odHRwL25vZGVfbW9kdWxlcy9pcC9saWIvaXAuanMiLCJub2RlX21vZHVsZXMvc3NiLWtleXMvZWNjanMuanMiLCJub2RlX21vZHVsZXMvc3NiLWtleXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3NiLWtleXMvbm9kZV9tb2R1bGVzL2RlZXAtZXF1YWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3NiLWtleXMvbm9kZV9tb2R1bGVzL2RlZXAtZXF1YWwvbGliL2lzX2FyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9zc2Ita2V5cy9ub2RlX21vZHVsZXMvZGVlcC1lcXVhbC9saWIva2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9zc2Ita2V5cy9zb2RpdW0uanMiLCJub2RlX21vZHVsZXMvc3NiLWxpbmtzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NzYi1saW5rcy9saW5rcy5qcyIsIm5vZGVfbW9kdWxlcy9zc2ItbGlua3Mvbm9kZV9tb2R1bGVzL3NzYi1tc2dzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NzYi1xdWVyeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zc2ItcXVlcnkvbm9kZV9tb2R1bGVzL21hcC1maWx0ZXItcmVkdWNlL2Jhc2ljLmpzIiwibm9kZV9tb2R1bGVzL3NzYi1xdWVyeS9ub2RlX21vZHVsZXMvbWFwLWZpbHRlci1yZWR1Y2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3NiLXF1ZXJ5L25vZGVfbW9kdWxlcy9tYXAtZmlsdGVyLXJlZHVjZS9tYXAuanMiLCJub2RlX21vZHVsZXMvc3NiLXF1ZXJ5L25vZGVfbW9kdWxlcy9tYXAtZmlsdGVyLXJlZHVjZS9yZWR1Y2UuanMiLCJub2RlX21vZHVsZXMvc3NiLXF1ZXJ5L25vZGVfbW9kdWxlcy9tYXAtZmlsdGVyLXJlZHVjZS91dGlsLmpzIiwibm9kZV9tb2R1bGVzL3NzYi1xdWVyeS9ub2RlX21vZHVsZXMvcHVsbC1wdXNoYWJsZS9ub2RlX21vZHVsZXMvcHVsbC1zdHJlYW0vdGhyb3VnaHMuanMiLCJub2RlX21vZHVsZXMvc3NiLXF1ZXJ5L25vZGVfbW9kdWxlcy9zdHJlYW12aWV3LWxpbmtzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NzYi1xdWVyeS9ub2RlX21vZHVsZXMvc3RyZWFtdmlldy1saW5rcy9xdWVyeS5qcyIsIm5vZGVfbW9kdWxlcy9zc2ItcXVlcnkvbm9kZV9tb2R1bGVzL3N0cmVhbXZpZXctbGlua3Mvc2VsZWN0LmpzIiwibm9kZV9tb2R1bGVzL3NzYi1xdWVyeS9ub2RlX21vZHVsZXMvc3RyZWFtdmlldy1saW5rcy91dGlsLmpzIiwibm9kZV9tb2R1bGVzL3NzYi1xdWVyeS9wYWNrYWdlLmpzb24iLCJub2RlX21vZHVsZXMvc3NiLXJlZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdGFjay9zdGFjay5qcyIsIm5vZGVfbW9kdWxlcy9zdGF0aXN0aWNzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanMiLCJub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9jYXBhYmlsaXR5LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXF1ZXN0LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXNwb25zZS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0tdG8tcHVsbC1zdHJlYW0vaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyZWFtdmlldy1saW5rcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW12aWV3LWxpbmtzL25vZGVfbW9kdWxlcy9wdWxsLXB1c2hhYmxlL25vZGVfbW9kdWxlcy9wdWxsLXN0cmVhbS90aHJvdWdocy5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpbmctcmFuZ2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvZXhwcmVzc2lvbi5qcyIsIm5vZGVfbW9kdWxlcy90by1hcnJheWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy90cmltLWxpbmVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3RyaW0tdHJhaWxpbmctbGluZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdHJpbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy90eXBld2lzZS1jb3JlL2Jhc2UuanMiLCJub2RlX21vZHVsZXMvdHlwZXdpc2UtY29yZS9jb2xsYXRpb24uanMiLCJub2RlX21vZHVsZXMvdHlwZXdpc2UvYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy90eXBld2lzZS9jb2xsYXRpb24uanMiLCJub2RlX21vZHVsZXMvdHlwZXdpc2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdHlwZXdpc2VsaXRlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3VuaGVyaXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdW5pZmllZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3VybC91cmwuanMiLCJub2RlX21vZHVsZXMvdXJsL3V0aWwuanMiLCJub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy92ZmlsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92bS1icm93c2VyaWZ5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3dhcmUvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3dyYXAtZm4vaW5kZXguanMiLCJub2RlX21vZHVsZXMvd3JhcHB5L3dyYXBweS5qcyIsIm5vZGVfbW9kdWxlcy93cy9saWIvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy96ZXJyL2luZGV4LmpzIiwic2VydmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDdEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDblBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQy8yQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbmdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBOzs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNqTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN6SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzlIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNoTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMva0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTs7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaDhHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNzRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzd2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzVjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDalFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9ZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pFQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDaFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3Q5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbFlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN6cEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy82TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMvTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNySEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2hPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDM0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNqSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3BTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDNUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdlVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2N0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDak5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzdkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvNkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3poTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwd0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDN1VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2xOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNySEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDcEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDL0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3ZVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDNUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDOUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDcFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDeFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUM3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDdElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNuUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDL1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzVKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDcFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDLzJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuZ0JBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7O0FDREE7QUFDQTs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDOUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN0UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ2xMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMxTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3JTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzV0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNobkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwidmFyIGFzbjEgPSBleHBvcnRzO1xuXG5hc24xLmJpZ251bSA9IHJlcXVpcmUoJ2JuLmpzJyk7XG5cbmFzbjEuZGVmaW5lID0gcmVxdWlyZSgnLi9hc24xL2FwaScpLmRlZmluZTtcbmFzbjEuYmFzZSA9IHJlcXVpcmUoJy4vYXNuMS9iYXNlJyk7XG5hc24xLmNvbnN0YW50cyA9IHJlcXVpcmUoJy4vYXNuMS9jb25zdGFudHMnKTtcbmFzbjEuZGVjb2RlcnMgPSByZXF1aXJlKCcuL2FzbjEvZGVjb2RlcnMnKTtcbmFzbjEuZW5jb2RlcnMgPSByZXF1aXJlKCcuL2FzbjEvZW5jb2RlcnMnKTtcbiIsInZhciBhc24xID0gcmVxdWlyZSgnLi4vYXNuMScpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxudmFyIGFwaSA9IGV4cG9ydHM7XG5cbmFwaS5kZWZpbmUgPSBmdW5jdGlvbiBkZWZpbmUobmFtZSwgYm9keSkge1xuICByZXR1cm4gbmV3IEVudGl0eShuYW1lLCBib2R5KTtcbn07XG5cbmZ1bmN0aW9uIEVudGl0eShuYW1lLCBib2R5KSB7XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHRoaXMuYm9keSA9IGJvZHk7XG5cbiAgdGhpcy5kZWNvZGVycyA9IHt9O1xuICB0aGlzLmVuY29kZXJzID0ge307XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLl9jcmVhdGVOYW1lZCA9IGZ1bmN0aW9uIGNyZWF0ZU5hbWVkKGJhc2UpIHtcbiAgdmFyIG5hbWVkO1xuICB0cnkge1xuICAgIG5hbWVkID0gcmVxdWlyZSgndm0nKS5ydW5JblRoaXNDb250ZXh0KFxuICAgICAgJyhmdW5jdGlvbiAnICsgdGhpcy5uYW1lICsgJyhlbnRpdHkpIHtcXG4nICtcbiAgICAgICcgIHRoaXMuX2luaXROYW1lZChlbnRpdHkpO1xcbicgK1xuICAgICAgJ30pJ1xuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBuYW1lZCA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgIHRoaXMuX2luaXROYW1lZChlbnRpdHkpO1xuICAgIH07XG4gIH1cbiAgaW5oZXJpdHMobmFtZWQsIGJhc2UpO1xuICBuYW1lZC5wcm90b3R5cGUuX2luaXROYW1lZCA9IGZ1bmN0aW9uIGluaXRuYW1lZChlbnRpdHkpIHtcbiAgICBiYXNlLmNhbGwodGhpcywgZW50aXR5KTtcbiAgfTtcblxuICByZXR1cm4gbmV3IG5hbWVkKHRoaXMpO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5fZ2V0RGVjb2RlciA9IGZ1bmN0aW9uIF9nZXREZWNvZGVyKGVuYykge1xuICAvLyBMYXppbHkgY3JlYXRlIGRlY29kZXJcbiAgaWYgKCF0aGlzLmRlY29kZXJzLmhhc093blByb3BlcnR5KGVuYykpXG4gICAgdGhpcy5kZWNvZGVyc1tlbmNdID0gdGhpcy5fY3JlYXRlTmFtZWQoYXNuMS5kZWNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZGVjb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIGVuYywgb3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5fZ2V0RGVjb2RlcihlbmMpLmRlY29kZShkYXRhLCBvcHRpb25zKTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuX2dldEVuY29kZXIgPSBmdW5jdGlvbiBfZ2V0RW5jb2RlcihlbmMpIHtcbiAgLy8gTGF6aWx5IGNyZWF0ZSBlbmNvZGVyXG4gIGlmICghdGhpcy5lbmNvZGVycy5oYXNPd25Qcm9wZXJ0eShlbmMpKVxuICAgIHRoaXMuZW5jb2RlcnNbZW5jXSA9IHRoaXMuX2NyZWF0ZU5hbWVkKGFzbjEuZW5jb2RlcnNbZW5jXSk7XG4gIHJldHVybiB0aGlzLmVuY29kZXJzW2VuY107XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCBlbmMsIC8qIGludGVybmFsICovIHJlcG9ydGVyKSB7XG4gIHJldHVybiB0aGlzLl9nZXRFbmNvZGVyKGVuYykuZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbn07XG4iLCJ2YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIFJlcG9ydGVyID0gcmVxdWlyZSgnLi4vYmFzZScpLlJlcG9ydGVyO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxuZnVuY3Rpb24gRGVjb2RlckJ1ZmZlcihiYXNlLCBvcHRpb25zKSB7XG4gIFJlcG9ydGVyLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJhc2UpKSB7XG4gICAgdGhpcy5lcnJvcignSW5wdXQgbm90IEJ1ZmZlcicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuYmFzZSA9IGJhc2U7XG4gIHRoaXMub2Zmc2V0ID0gMDtcbiAgdGhpcy5sZW5ndGggPSBiYXNlLmxlbmd0aDtcbn1cbmluaGVyaXRzKERlY29kZXJCdWZmZXIsIFJlcG9ydGVyKTtcbmV4cG9ydHMuRGVjb2RlckJ1ZmZlciA9IERlY29kZXJCdWZmZXI7XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiBzYXZlKCkge1xuICByZXR1cm4geyBvZmZzZXQ6IHRoaXMub2Zmc2V0LCByZXBvcnRlcjogUmVwb3J0ZXIucHJvdG90eXBlLnNhdmUuY2FsbCh0aGlzKSB9O1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uIHJlc3RvcmUoc2F2ZSkge1xuICAvLyBSZXR1cm4gc2tpcHBlZCBkYXRhXG4gIHZhciByZXMgPSBuZXcgRGVjb2RlckJ1ZmZlcih0aGlzLmJhc2UpO1xuICByZXMub2Zmc2V0ID0gc2F2ZS5vZmZzZXQ7XG4gIHJlcy5sZW5ndGggPSB0aGlzLm9mZnNldDtcblxuICB0aGlzLm9mZnNldCA9IHNhdmUub2Zmc2V0O1xuICBSZXBvcnRlci5wcm90b3R5cGUucmVzdG9yZS5jYWxsKHRoaXMsIHNhdmUucmVwb3J0ZXIpO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgcmV0dXJuIHRoaXMub2Zmc2V0ID09PSB0aGlzLmxlbmd0aDtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OChmYWlsKSB7XG4gIGlmICh0aGlzLm9mZnNldCArIDEgPD0gdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRoaXMuYmFzZS5yZWFkVUludDgodGhpcy5vZmZzZXQrKywgdHJ1ZSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5lcnJvcihmYWlsIHx8ICdEZWNvZGVyQnVmZmVyIG92ZXJydW4nKTtcbn1cblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uIHNraXAoYnl0ZXMsIGZhaWwpIHtcbiAgaWYgKCEodGhpcy5vZmZzZXQgKyBieXRlcyA8PSB0aGlzLmxlbmd0aCkpXG4gICAgcmV0dXJuIHRoaXMuZXJyb3IoZmFpbCB8fCAnRGVjb2RlckJ1ZmZlciBvdmVycnVuJyk7XG5cbiAgdmFyIHJlcyA9IG5ldyBEZWNvZGVyQnVmZmVyKHRoaXMuYmFzZSk7XG5cbiAgLy8gU2hhcmUgcmVwb3J0ZXIgc3RhdGVcbiAgcmVzLl9yZXBvcnRlclN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXMub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gIHJlcy5sZW5ndGggPSB0aGlzLm9mZnNldCArIGJ5dGVzO1xuICB0aGlzLm9mZnNldCArPSBieXRlcztcbiAgcmV0dXJuIHJlcztcbn1cblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUucmF3ID0gZnVuY3Rpb24gcmF3KHNhdmUpIHtcbiAgcmV0dXJuIHRoaXMuYmFzZS5zbGljZShzYXZlID8gc2F2ZS5vZmZzZXQgOiB0aGlzLm9mZnNldCwgdGhpcy5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBFbmNvZGVyQnVmZmVyKHZhbHVlLCByZXBvcnRlcikge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICBpZiAoIShpdGVtIGluc3RhbmNlb2YgRW5jb2RlckJ1ZmZlcikpXG4gICAgICAgIGl0ZW0gPSBuZXcgRW5jb2RlckJ1ZmZlcihpdGVtLCByZXBvcnRlcik7XG4gICAgICB0aGlzLmxlbmd0aCArPSBpdGVtLmxlbmd0aDtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0sIHRoaXMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoISgwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDB4ZmYpKVxuICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdub24tYnl0ZSBFbmNvZGVyQnVmZmVyIHZhbHVlJyk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUpO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdVbnN1cHBvcnRlZCB0eXBlOiAnICsgdHlwZW9mIHZhbHVlKTtcbiAgfVxufVxuZXhwb3J0cy5FbmNvZGVyQnVmZmVyID0gRW5jb2RlckJ1ZmZlcjtcblxuRW5jb2RlckJ1ZmZlci5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIGpvaW4ob3V0LCBvZmZzZXQpIHtcbiAgaWYgKCFvdXQpXG4gICAgb3V0ID0gbmV3IEJ1ZmZlcih0aGlzLmxlbmd0aCk7XG4gIGlmICghb2Zmc2V0KVxuICAgIG9mZnNldCA9IDA7XG5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBvdXQ7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICB0aGlzLnZhbHVlLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgaXRlbS5qb2luKG91dCwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSBpdGVtLmxlbmd0aDtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInKVxuICAgICAgb3V0W29mZnNldF0gPSB0aGlzLnZhbHVlO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgIG91dC53cml0ZSh0aGlzLnZhbHVlLCBvZmZzZXQpO1xuICAgIGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcih0aGlzLnZhbHVlKSlcbiAgICAgIHRoaXMudmFsdWUuY29weShvdXQsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHRoaXMubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn07XG4iLCJ2YXIgYmFzZSA9IGV4cG9ydHM7XG5cbmJhc2UuUmVwb3J0ZXIgPSByZXF1aXJlKCcuL3JlcG9ydGVyJykuUmVwb3J0ZXI7XG5iYXNlLkRlY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpLkRlY29kZXJCdWZmZXI7XG5iYXNlLkVuY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpLkVuY29kZXJCdWZmZXI7XG5iYXNlLk5vZGUgPSByZXF1aXJlKCcuL25vZGUnKTtcbiIsInZhciBSZXBvcnRlciA9IHJlcXVpcmUoJy4uL2Jhc2UnKS5SZXBvcnRlcjtcbnZhciBFbmNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZScpLkVuY29kZXJCdWZmZXI7XG52YXIgRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4uL2Jhc2UnKS5EZWNvZGVyQnVmZmVyO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuLy8gU3VwcG9ydGVkIHRhZ3NcbnZhciB0YWdzID0gW1xuICAnc2VxJywgJ3NlcW9mJywgJ3NldCcsICdzZXRvZicsICdvYmppZCcsICdib29sJyxcbiAgJ2dlbnRpbWUnLCAndXRjdGltZScsICdudWxsXycsICdlbnVtJywgJ2ludCcsXG4gICdiaXRzdHInLCAnYm1wc3RyJywgJ2NoYXJzdHInLCAnZ2Vuc3RyJywgJ2dyYXBoc3RyJywgJ2lhNXN0cicsICdpc282NDZzdHInLFxuICAnbnVtc3RyJywgJ29jdHN0cicsICdwcmludHN0cicsICd0NjFzdHInLCAndW5pc3RyJywgJ3V0ZjhzdHInLCAndmlkZW9zdHInXG5dO1xuXG4vLyBQdWJsaWMgbWV0aG9kcyBsaXN0XG52YXIgbWV0aG9kcyA9IFtcbiAgJ2tleScsICdvYmonLCAndXNlJywgJ29wdGlvbmFsJywgJ2V4cGxpY2l0JywgJ2ltcGxpY2l0JywgJ2RlZicsICdjaG9pY2UnLFxuICAnYW55JywgJ2NvbnRhaW5zJ1xuXS5jb25jYXQodGFncyk7XG5cbi8vIE92ZXJyaWRlZCBtZXRob2RzIGxpc3RcbnZhciBvdmVycmlkZWQgPSBbXG4gICdfcGVla1RhZycsICdfZGVjb2RlVGFnJywgJ191c2UnLFxuICAnX2RlY29kZVN0cicsICdfZGVjb2RlT2JqaWQnLCAnX2RlY29kZVRpbWUnLFxuICAnX2RlY29kZU51bGwnLCAnX2RlY29kZUludCcsICdfZGVjb2RlQm9vbCcsICdfZGVjb2RlTGlzdCcsXG5cbiAgJ19lbmNvZGVDb21wb3NpdGUnLCAnX2VuY29kZVN0cicsICdfZW5jb2RlT2JqaWQnLCAnX2VuY29kZVRpbWUnLFxuICAnX2VuY29kZU51bGwnLCAnX2VuY29kZUludCcsICdfZW5jb2RlQm9vbCdcbl07XG5cbmZ1bmN0aW9uIE5vZGUoZW5jLCBwYXJlbnQpIHtcbiAgdmFyIHN0YXRlID0ge307XG4gIHRoaXMuX2Jhc2VTdGF0ZSA9IHN0YXRlO1xuXG4gIHN0YXRlLmVuYyA9IGVuYztcblxuICBzdGF0ZS5wYXJlbnQgPSBwYXJlbnQgfHwgbnVsbDtcbiAgc3RhdGUuY2hpbGRyZW4gPSBudWxsO1xuXG4gIC8vIFN0YXRlXG4gIHN0YXRlLnRhZyA9IG51bGw7XG4gIHN0YXRlLmFyZ3MgPSBudWxsO1xuICBzdGF0ZS5yZXZlcnNlQXJncyA9IG51bGw7XG4gIHN0YXRlLmNob2ljZSA9IG51bGw7XG4gIHN0YXRlLm9wdGlvbmFsID0gZmFsc2U7XG4gIHN0YXRlLmFueSA9IGZhbHNlO1xuICBzdGF0ZS5vYmogPSBmYWxzZTtcbiAgc3RhdGUudXNlID0gbnVsbDtcbiAgc3RhdGUudXNlRGVjb2RlciA9IG51bGw7XG4gIHN0YXRlLmtleSA9IG51bGw7XG4gIHN0YXRlWydkZWZhdWx0J10gPSBudWxsO1xuICBzdGF0ZS5leHBsaWNpdCA9IG51bGw7XG4gIHN0YXRlLmltcGxpY2l0ID0gbnVsbDtcbiAgc3RhdGUuY29udGFpbnMgPSBudWxsO1xuXG4gIC8vIFNob3VsZCBjcmVhdGUgbmV3IGluc3RhbmNlIG9uIGVhY2ggbWV0aG9kXG4gIGlmICghc3RhdGUucGFyZW50KSB7XG4gICAgc3RhdGUuY2hpbGRyZW4gPSBbXTtcbiAgICB0aGlzLl93cmFwKCk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gTm9kZTtcblxudmFyIHN0YXRlUHJvcHMgPSBbXG4gICdlbmMnLCAncGFyZW50JywgJ2NoaWxkcmVuJywgJ3RhZycsICdhcmdzJywgJ3JldmVyc2VBcmdzJywgJ2Nob2ljZScsXG4gICdvcHRpb25hbCcsICdhbnknLCAnb2JqJywgJ3VzZScsICdhbHRlcmVkVXNlJywgJ2tleScsICdkZWZhdWx0JywgJ2V4cGxpY2l0JyxcbiAgJ2ltcGxpY2l0J1xuXTtcblxuTm9kZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICB2YXIgY3N0YXRlID0ge307XG4gIHN0YXRlUHJvcHMuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgY3N0YXRlW3Byb3BdID0gc3RhdGVbcHJvcF07XG4gIH0pO1xuICB2YXIgcmVzID0gbmV3IHRoaXMuY29uc3RydWN0b3IoY3N0YXRlLnBhcmVudCk7XG4gIHJlcy5fYmFzZVN0YXRlID0gY3N0YXRlO1xuICByZXR1cm4gcmVzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX3dyYXAgPSBmdW5jdGlvbiB3cmFwKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIG1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICB0aGlzW21ldGhvZF0gPSBmdW5jdGlvbiBfd3JhcHBlZE1ldGhvZCgpIHtcbiAgICAgIHZhciBjbG9uZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpO1xuICAgICAgc3RhdGUuY2hpbGRyZW4ucHVzaChjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmVbbWV0aG9kXS5hcHBseShjbG9uZSwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9LCB0aGlzKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdChib2R5KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUucGFyZW50ID09PSBudWxsKTtcbiAgYm9keS5jYWxsKHRoaXMpO1xuXG4gIC8vIEZpbHRlciBjaGlsZHJlblxuICBzdGF0ZS5jaGlsZHJlbiA9IHN0YXRlLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbihjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC5fYmFzZVN0YXRlLnBhcmVudCA9PT0gdGhpcztcbiAgfSwgdGhpcyk7XG4gIGFzc2VydC5lcXVhbChzdGF0ZS5jaGlsZHJlbi5sZW5ndGgsIDEsICdSb290IG5vZGUgY2FuIGhhdmUgb25seSBvbmUgY2hpbGQnKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl91c2VBcmdzID0gZnVuY3Rpb24gdXNlQXJncyhhcmdzKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBGaWx0ZXIgY2hpbGRyZW4gYW5kIGFyZ3NcbiAgdmFyIGNoaWxkcmVuID0gYXJncy5maWx0ZXIoZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I7XG4gIH0sIHRoaXMpO1xuICBhcmdzID0gYXJncy5maWx0ZXIoZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuICEoYXJnIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0sIHRoaXMpO1xuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGggIT09IDApIHtcbiAgICBhc3NlcnQoc3RhdGUuY2hpbGRyZW4gPT09IG51bGwpO1xuICAgIHN0YXRlLmNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAvLyBSZXBsYWNlIHBhcmVudCB0byBtYWludGFpbiBiYWNrd2FyZCBsaW5rXG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQuX2Jhc2VTdGF0ZS5wYXJlbnQgPSB0aGlzO1xuICAgIH0sIHRoaXMpO1xuICB9XG4gIGlmIChhcmdzLmxlbmd0aCAhPT0gMCkge1xuICAgIGFzc2VydChzdGF0ZS5hcmdzID09PSBudWxsKTtcbiAgICBzdGF0ZS5hcmdzID0gYXJncztcbiAgICBzdGF0ZS5yZXZlcnNlQXJncyA9IGFyZ3MubWFwKGZ1bmN0aW9uKGFyZykge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdvYmplY3QnIHx8IGFyZy5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KVxuICAgICAgICByZXR1cm4gYXJnO1xuXG4gICAgICB2YXIgcmVzID0ge307XG4gICAgICBPYmplY3Qua2V5cyhhcmcpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT0gKGtleSB8IDApKVxuICAgICAgICAgIGtleSB8PSAwO1xuICAgICAgICB2YXIgdmFsdWUgPSBhcmdba2V5XTtcbiAgICAgICAgcmVzW3ZhbHVlXSA9IGtleTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfVxufTtcblxuLy9cbi8vIE92ZXJyaWRlZCBtZXRob2RzXG4vL1xuXG5vdmVycmlkZWQuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgTm9kZS5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIF9vdmVycmlkZWQoKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAgIHRocm93IG5ldyBFcnJvcihtZXRob2QgKyAnIG5vdCBpbXBsZW1lbnRlZCBmb3IgZW5jb2Rpbmc6ICcgKyBzdGF0ZS5lbmMpO1xuICB9O1xufSk7XG5cbi8vXG4vLyBQdWJsaWMgbWV0aG9kc1xuLy9cblxudGFncy5mb3JFYWNoKGZ1bmN0aW9uKHRhZykge1xuICBOb2RlLnByb3RvdHlwZVt0YWddID0gZnVuY3Rpb24gX3RhZ01ldGhvZCgpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgYXNzZXJ0KHN0YXRlLnRhZyA9PT0gbnVsbCk7XG4gICAgc3RhdGUudGFnID0gdGFnO1xuXG4gICAgdGhpcy5fdXNlQXJncyhhcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufSk7XG5cbk5vZGUucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShpdGVtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUudXNlID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9wdGlvbmFsID0gZnVuY3Rpb24gb3B0aW9uYWwoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBzdGF0ZS5vcHRpb25hbCA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5kZWYgPSBmdW5jdGlvbiBkZWYodmFsKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGVbJ2RlZmF1bHQnXSA9PT0gbnVsbCk7XG4gIHN0YXRlWydkZWZhdWx0J10gPSB2YWw7XG4gIHN0YXRlLm9wdGlvbmFsID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmV4cGxpY2l0ID0gZnVuY3Rpb24gZXhwbGljaXQobnVtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5leHBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmltcGxpY2l0ID0gZnVuY3Rpb24gaW1wbGljaXQobnVtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5pbXBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9iaiA9IGZ1bmN0aW9uIG9iaigpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgc3RhdGUub2JqID0gdHJ1ZTtcblxuICBpZiAoYXJncy5sZW5ndGggIT09IDApXG4gICAgdGhpcy5fdXNlQXJncyhhcmdzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIGtleShuZXdLZXkpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5rZXkgPT09IG51bGwpO1xuICBzdGF0ZS5rZXkgPSBuZXdLZXk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5hbnkgPSBmdW5jdGlvbiBhbnkoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBzdGF0ZS5hbnkgPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuY2hvaWNlID0gZnVuY3Rpb24gY2hvaWNlKG9iaikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmNob2ljZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNob2ljZSA9IG9iajtcbiAgdGhpcy5fdXNlQXJncyhPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH0pKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMoaXRlbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnVzZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNvbnRhaW5zID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBEZWNvZGluZ1xuLy9cblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgLy8gRGVjb2RlIHJvb3Qgbm9kZVxuICBpZiAoc3RhdGUucGFyZW50ID09PSBudWxsKVxuICAgIHJldHVybiBpbnB1dC53cmFwUmVzdWx0KHN0YXRlLmNoaWxkcmVuWzBdLl9kZWNvZGUoaW5wdXQpKTtcblxuICB2YXIgcmVzdWx0ID0gc3RhdGVbJ2RlZmF1bHQnXTtcbiAgdmFyIHByZXNlbnQgPSB0cnVlO1xuXG4gIHZhciBwcmV2S2V5O1xuICBpZiAoc3RhdGUua2V5ICE9PSBudWxsKVxuICAgIHByZXZLZXkgPSBpbnB1dC5lbnRlcktleShzdGF0ZS5rZXkpO1xuXG4gIC8vIENoZWNrIGlmIHRhZyBpcyB0aGVyZVxuICBpZiAoc3RhdGUub3B0aW9uYWwpIHtcbiAgICB2YXIgdGFnID0gbnVsbDtcbiAgICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpXG4gICAgICB0YWcgPSBzdGF0ZS5leHBsaWNpdDtcbiAgICBlbHNlIGlmIChzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLmltcGxpY2l0O1xuICAgIGVsc2UgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLnRhZztcblxuICAgIGlmICh0YWcgPT09IG51bGwgJiYgIXN0YXRlLmFueSkge1xuICAgICAgLy8gVHJpYWwgYW5kIEVycm9yXG4gICAgICB2YXIgc2F2ZSA9IGlucHV0LnNhdmUoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChzdGF0ZS5jaG9pY2UgPT09IG51bGwpXG4gICAgICAgICAgdGhpcy5fZGVjb2RlR2VuZXJpYyhzdGF0ZS50YWcsIGlucHV0KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRoaXMuX2RlY29kZUNob2ljZShpbnB1dCk7XG4gICAgICAgIHByZXNlbnQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwcmVzZW50ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpbnB1dC5yZXN0b3JlKHNhdmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVzZW50ID0gdGhpcy5fcGVla1RhZyhpbnB1dCwgdGFnLCBzdGF0ZS5hbnkpO1xuXG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcihwcmVzZW50KSlcbiAgICAgICAgcmV0dXJuIHByZXNlbnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gUHVzaCBvYmplY3Qgb24gc3RhY2tcbiAgdmFyIHByZXZPYmo7XG4gIGlmIChzdGF0ZS5vYmogJiYgcHJlc2VudClcbiAgICBwcmV2T2JqID0gaW5wdXQuZW50ZXJPYmplY3QoKTtcblxuICBpZiAocHJlc2VudCkge1xuICAgIC8vIFVud3JhcCBleHBsaWNpdCB2YWx1ZXNcbiAgICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpIHtcbiAgICAgIHZhciBleHBsaWNpdCA9IHRoaXMuX2RlY29kZVRhZyhpbnB1dCwgc3RhdGUuZXhwbGljaXQpO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IoZXhwbGljaXQpKVxuICAgICAgICByZXR1cm4gZXhwbGljaXQ7XG4gICAgICBpbnB1dCA9IGV4cGxpY2l0O1xuICAgIH1cblxuICAgIC8vIFVud3JhcCBpbXBsaWNpdCBhbmQgbm9ybWFsIHZhbHVlc1xuICAgIGlmIChzdGF0ZS51c2UgPT09IG51bGwgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgICBpZiAoc3RhdGUuYW55KVxuICAgICAgICB2YXIgc2F2ZSA9IGlucHV0LnNhdmUoKTtcbiAgICAgIHZhciBib2R5ID0gdGhpcy5fZGVjb2RlVGFnKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgc3RhdGUuaW1wbGljaXQgIT09IG51bGwgPyBzdGF0ZS5pbXBsaWNpdCA6IHN0YXRlLnRhZyxcbiAgICAgICAgc3RhdGUuYW55XG4gICAgICApO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IoYm9keSkpXG4gICAgICAgIHJldHVybiBib2R5O1xuXG4gICAgICBpZiAoc3RhdGUuYW55KVxuICAgICAgICByZXN1bHQgPSBpbnB1dC5yYXcoc2F2ZSk7XG4gICAgICBlbHNlXG4gICAgICAgIGlucHV0ID0gYm9keTtcbiAgICB9XG5cbiAgICAvLyBTZWxlY3QgcHJvcGVyIG1ldGhvZCBmb3IgdGFnXG4gICAgaWYgKHN0YXRlLmFueSlcbiAgICAgIHJlc3VsdCA9IHJlc3VsdDtcbiAgICBlbHNlIGlmIChzdGF0ZS5jaG9pY2UgPT09IG51bGwpXG4gICAgICByZXN1bHQgPSB0aGlzLl9kZWNvZGVHZW5lcmljKHN0YXRlLnRhZywgaW5wdXQpO1xuICAgIGVsc2VcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUNob2ljZShpbnB1dCk7XG5cbiAgICBpZiAoaW5wdXQuaXNFcnJvcihyZXN1bHQpKVxuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIC8vIERlY29kZSBjaGlsZHJlblxuICAgIGlmICghc3RhdGUuYW55ICYmIHN0YXRlLmNob2ljZSA9PT0gbnVsbCAmJiBzdGF0ZS5jaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgc3RhdGUuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiBkZWNvZGVDaGlsZHJlbihjaGlsZCkge1xuICAgICAgICAvLyBOT1RFOiBXZSBhcmUgaWdub3JpbmcgZXJyb3JzIGhlcmUsIHRvIGxldCBwYXJzZXIgY29udGludWUgd2l0aCBvdGhlclxuICAgICAgICAvLyBwYXJ0cyBvZiBlbmNvZGVkIGRhdGFcbiAgICAgICAgY2hpbGQuX2RlY29kZShpbnB1dCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZWNvZGUgY29udGFpbmVkL2VuY29kZWQgYnkgc2NoZW1hLCBvbmx5IGluIGJpdCBvciBvY3RldCBzdHJpbmdzXG4gICAgaWYgKHN0YXRlLmNvbnRhaW5zICYmIChzdGF0ZS50YWcgPT09ICdvY3RzdHInIHx8IHN0YXRlLnRhZyA9PT0gJ2JpdHN0cicpKSB7XG4gICAgICB2YXIgZGF0YSA9IG5ldyBEZWNvZGVyQnVmZmVyKHJlc3VsdCk7XG4gICAgICByZXN1bHQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIGlucHV0Ll9yZXBvcnRlclN0YXRlLm9iaikuX2RlY29kZShkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvLyBQb3Agb2JqZWN0XG4gIGlmIChzdGF0ZS5vYmogJiYgcHJlc2VudClcbiAgICByZXN1bHQgPSBpbnB1dC5sZWF2ZU9iamVjdChwcmV2T2JqKTtcblxuICAvLyBTZXQga2V5XG4gIGlmIChzdGF0ZS5rZXkgIT09IG51bGwgJiYgKHJlc3VsdCAhPT0gbnVsbCB8fCBwcmVzZW50ID09PSB0cnVlKSlcbiAgICBpbnB1dC5sZWF2ZUtleShwcmV2S2V5LCBzdGF0ZS5rZXksIHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9kZWNvZGVHZW5lcmljID0gZnVuY3Rpb24gZGVjb2RlR2VuZXJpYyh0YWcsIGlucHV0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBpZiAodGFnID09PSAnc2VxJyB8fCB0YWcgPT09ICdzZXQnKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodGFnID09PSAnc2Vxb2YnIHx8IHRhZyA9PT0gJ3NldG9mJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlTGlzdChpbnB1dCwgdGFnLCBzdGF0ZS5hcmdzWzBdKTtcbiAgZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSlcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcgJiYgc3RhdGUuYXJncylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsIHN0YXRlLmFyZ3NbMF0sIHN0YXRlLmFyZ3NbMV0pO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZU9iamlkKGlucHV0LCBudWxsLCBudWxsKTtcbiAgZWxzZSBpZiAodGFnID09PSAnZ2VudGltZScgfHwgdGFnID09PSAndXRjdGltZScpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZVRpbWUoaW5wdXQsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ251bGxfJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlTnVsbChpbnB1dCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2Jvb2wnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVCb29sKGlucHV0KTtcbiAgZWxzZSBpZiAodGFnID09PSAnaW50JyB8fCB0YWcgPT09ICdlbnVtJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlSW50KGlucHV0LCBzdGF0ZS5hcmdzICYmIHN0YXRlLmFyZ3NbMF0pO1xuICBlbHNlIGlmIChzdGF0ZS51c2UgIT09IG51bGwpXG4gICAgcmV0dXJuIHRoaXMuX2dldFVzZShzdGF0ZS51c2UsIGlucHV0Ll9yZXBvcnRlclN0YXRlLm9iaikuX2RlY29kZShpbnB1dCk7XG4gIGVsc2VcbiAgICByZXR1cm4gaW5wdXQuZXJyb3IoJ3Vua25vd24gdGFnOiAnICsgdGFnKTtcblxuICByZXR1cm4gbnVsbDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9nZXRVc2UgPSBmdW5jdGlvbiBfZ2V0VXNlKGVudGl0eSwgb2JqKSB7XG5cbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAvLyBDcmVhdGUgYWx0ZXJlZCB1c2UgZGVjb2RlciBpZiBpbXBsaWNpdCBpcyBzZXRcbiAgc3RhdGUudXNlRGVjb2RlciA9IHRoaXMuX3VzZShlbnRpdHksIG9iaik7XG4gIGFzc2VydChzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUucGFyZW50ID09PSBudWxsKTtcbiAgc3RhdGUudXNlRGVjb2RlciA9IHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5jaGlsZHJlblswXTtcbiAgaWYgKHN0YXRlLmltcGxpY2l0ICE9PSBzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQpIHtcbiAgICBzdGF0ZS51c2VEZWNvZGVyID0gc3RhdGUudXNlRGVjb2Rlci5jbG9uZSgpO1xuICAgIHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5pbXBsaWNpdCA9IHN0YXRlLmltcGxpY2l0O1xuICB9XG4gIHJldHVybiBzdGF0ZS51c2VEZWNvZGVyO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZUNob2ljZSA9IGZ1bmN0aW9uIGRlY29kZUNob2ljZShpbnB1dCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIHZhciByZXN1bHQgPSBudWxsO1xuICB2YXIgbWF0Y2ggPSBmYWxzZTtcblxuICBPYmplY3Qua2V5cyhzdGF0ZS5jaG9pY2UpLnNvbWUoZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgdmFyIG5vZGUgPSBzdGF0ZS5jaG9pY2Vba2V5XTtcbiAgICB0cnkge1xuICAgICAgdmFyIHZhbHVlID0gbm9kZS5fZGVjb2RlKGlucHV0KTtcbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXN1bHQgPSB7IHR5cGU6IGtleSwgdmFsdWU6IHZhbHVlIH07XG4gICAgICBtYXRjaCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaW5wdXQucmVzdG9yZShzYXZlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sIHRoaXMpO1xuXG4gIGlmICghbWF0Y2gpXG4gICAgcmV0dXJuIGlucHV0LmVycm9yKCdDaG9pY2Ugbm90IG1hdGNoZWQnKTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy9cbi8vIEVuY29kaW5nXG4vL1xuXG5Ob2RlLnByb3RvdHlwZS5fY3JlYXRlRW5jb2RlckJ1ZmZlciA9IGZ1bmN0aW9uIGNyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YSkge1xuICByZXR1cm4gbmV3IEVuY29kZXJCdWZmZXIoZGF0YSwgdGhpcy5yZXBvcnRlcik7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIHJlcG9ydGVyLCBwYXJlbnQpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSAhPT0gbnVsbCAmJiBzdGF0ZVsnZGVmYXVsdCddID09PSBkYXRhKVxuICAgIHJldHVybjtcblxuICB2YXIgcmVzdWx0ID0gdGhpcy5fZW5jb2RlVmFsdWUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCk7XG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm47XG5cbiAgaWYgKHRoaXMuX3NraXBEZWZhdWx0KHJlc3VsdCwgcmVwb3J0ZXIsIHBhcmVudCkpXG4gICAgcmV0dXJuO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlVmFsdWUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgLy8gRGVjb2RlIHJvb3Qgbm9kZVxuICBpZiAoc3RhdGUucGFyZW50ID09PSBudWxsKVxuICAgIHJldHVybiBzdGF0ZS5jaGlsZHJlblswXS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyIHx8IG5ldyBSZXBvcnRlcigpKTtcblxuICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgdmFyIHByZXNlbnQgPSB0cnVlO1xuXG4gIC8vIFNldCByZXBvcnRlciB0byBzaGFyZSBpdCB3aXRoIGEgY2hpbGQgY2xhc3NcbiAgdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyO1xuXG4gIC8vIENoZWNrIGlmIGRhdGEgaXMgdGhlcmVcbiAgaWYgKHN0YXRlLm9wdGlvbmFsICYmIGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0ZVsnZGVmYXVsdCddICE9PSBudWxsKVxuICAgICAgZGF0YSA9IHN0YXRlWydkZWZhdWx0J11cbiAgICBlbHNlXG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3IgZXJyb3IgcmVwb3J0aW5nXG4gIHZhciBwcmV2S2V5O1xuXG4gIC8vIEVuY29kZSBjaGlsZHJlbiBmaXJzdFxuICB2YXIgY29udGVudCA9IG51bGw7XG4gIHZhciBwcmltaXRpdmUgPSBmYWxzZTtcbiAgaWYgKHN0YXRlLmFueSkge1xuICAgIC8vIEFueXRoaW5nIHRoYXQgd2FzIGdpdmVuIGlzIHRyYW5zbGF0ZWQgdG8gYnVmZmVyXG4gICAgcmVzdWx0ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jaG9pY2UpIHtcbiAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDaG9pY2UoZGF0YSwgcmVwb3J0ZXIpO1xuICB9IGVsc2UgaWYgKHN0YXRlLmNvbnRhaW5zKSB7XG4gICAgY29udGVudCA9IHRoaXMuX2dldFVzZShzdGF0ZS5jb250YWlucywgcGFyZW50KS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbiAgICBwcmltaXRpdmUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHN0YXRlLmNoaWxkcmVuKSB7XG4gICAgY29udGVudCA9IHN0YXRlLmNoaWxkcmVuLm1hcChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgaWYgKGNoaWxkLl9iYXNlU3RhdGUudGFnID09PSAnbnVsbF8nKVxuICAgICAgICByZXR1cm4gY2hpbGQuX2VuY29kZShudWxsLCByZXBvcnRlciwgZGF0YSk7XG5cbiAgICAgIGlmIChjaGlsZC5fYmFzZVN0YXRlLmtleSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdDaGlsZCBzaG91bGQgaGF2ZSBhIGtleScpO1xuICAgICAgdmFyIHByZXZLZXkgPSByZXBvcnRlci5lbnRlcktleShjaGlsZC5fYmFzZVN0YXRlLmtleSk7XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgZXhwZWN0ZWQsIGJ1dCBpbnB1dCBpcyBub3Qgb2JqZWN0Jyk7XG5cbiAgICAgIHZhciByZXMgPSBjaGlsZC5fZW5jb2RlKGRhdGFbY2hpbGQuX2Jhc2VTdGF0ZS5rZXldLCByZXBvcnRlciwgZGF0YSk7XG4gICAgICByZXBvcnRlci5sZWF2ZUtleShwcmV2S2V5KTtcblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCB0aGlzKS5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9KTtcbiAgICBjb250ZW50ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihjb250ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoc3RhdGUudGFnID09PSAnc2Vxb2YnIHx8IHN0YXRlLnRhZyA9PT0gJ3NldG9mJykge1xuICAgICAgLy8gVE9ETyhpbmR1dG55KTogdGhpcyBzaG91bGQgYmUgdGhyb3duIG9uIERTTCBsZXZlbFxuICAgICAgaWYgKCEoc3RhdGUuYXJncyAmJiBzdGF0ZS5hcmdzLmxlbmd0aCA9PT0gMSkpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVG9vIG1hbnkgYXJncyBmb3IgOiAnICsgc3RhdGUudGFnKTtcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ3NlcW9mL3NldG9mLCBidXQgZGF0YSBpcyBub3QgQXJyYXknKTtcblxuICAgICAgdmFyIGNoaWxkID0gdGhpcy5jbG9uZSgpO1xuICAgICAgY2hpbGQuX2Jhc2VTdGF0ZS5pbXBsaWNpdCA9IG51bGw7XG4gICAgICBjb250ZW50ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0VXNlKHN0YXRlLmFyZ3NbMF0sIGRhdGEpLl9lbmNvZGUoaXRlbSwgcmVwb3J0ZXIpO1xuICAgICAgfSwgY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLnVzZSwgcGFyZW50KS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCA9IHRoaXMuX2VuY29kZVByaW1pdGl2ZShzdGF0ZS50YWcsIGRhdGEpO1xuICAgICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBFbmNvZGUgZGF0YSBpdHNlbGZcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKCFzdGF0ZS5hbnkgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgdmFyIHRhZyA9IHN0YXRlLmltcGxpY2l0ICE9PSBudWxsID8gc3RhdGUuaW1wbGljaXQgOiBzdGF0ZS50YWc7XG4gICAgdmFyIGNscyA9IHN0YXRlLmltcGxpY2l0ID09PSBudWxsID8gJ3VuaXZlcnNhbCcgOiAnY29udGV4dCc7XG5cbiAgICBpZiAodGFnID09PSBudWxsKSB7XG4gICAgICBpZiAoc3RhdGUudXNlID09PSBudWxsKVxuICAgICAgICByZXBvcnRlci5lcnJvcignVGFnIGNvdWxkIGJlIG9tbWl0ZWQgb25seSBmb3IgLnVzZSgpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0ZS51c2UgPT09IG51bGwpXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2VuY29kZUNvbXBvc2l0ZSh0YWcsIHByaW1pdGl2ZSwgY2xzLCBjb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBXcmFwIGluIGV4cGxpY2l0XG4gIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbClcbiAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDb21wb3NpdGUoc3RhdGUuZXhwbGljaXQsIGZhbHNlLCAnY29udGV4dCcsIHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVDaG9pY2UgPSBmdW5jdGlvbiBlbmNvZGVDaG9pY2UoZGF0YSwgcmVwb3J0ZXIpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHZhciBub2RlID0gc3RhdGUuY2hvaWNlW2RhdGEudHlwZV07XG4gIGlmICghbm9kZSkge1xuICAgIGFzc2VydChcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGRhdGEudHlwZSArICcgbm90IGZvdW5kIGluICcgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoc3RhdGUuY2hvaWNlKSkpO1xuICB9XG4gIHJldHVybiBub2RlLl9lbmNvZGUoZGF0YS52YWx1ZSwgcmVwb3J0ZXIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZVByaW1pdGl2ZSA9IGZ1bmN0aW9uIGVuY29kZVByaW1pdGl2ZSh0YWcsIGRhdGEpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICgvc3RyJC8udGVzdCh0YWcpKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoZGF0YSwgdGFnKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnICYmIHN0YXRlLmFyZ3MpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKGRhdGEsIHN0YXRlLnJldmVyc2VBcmdzWzBdLCBzdGF0ZS5hcmdzWzFdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLCBudWxsLCBudWxsKTtcbiAgZWxzZSBpZiAodGFnID09PSAnZ2VudGltZScgfHwgdGFnID09PSAndXRjdGltZScpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZVRpbWUoZGF0YSwgdGFnKTtcbiAgZWxzZSBpZiAodGFnID09PSAnbnVsbF8nKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVOdWxsKCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2ludCcgfHwgdGFnID09PSAnZW51bScpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUludChkYXRhLCBzdGF0ZS5hcmdzICYmIHN0YXRlLnJldmVyc2VBcmdzWzBdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnYm9vbCcpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUJvb2woZGF0YSk7XG4gIGVsc2VcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHRhZzogJyArIHRhZyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faXNOdW1zdHIgPSBmdW5jdGlvbiBpc051bXN0cihzdHIpIHtcbiAgcmV0dXJuIC9eWzAtOSBdKiQvLnRlc3Qoc3RyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pc1ByaW50c3RyID0gZnVuY3Rpb24gaXNQcmludHN0cihzdHIpIHtcbiAgcmV0dXJuIC9eW0EtWmEtejAtOSAnXFwoXFwpXFwrLFxcLVxcLlxcLzo9XFw/XSokLy50ZXN0KHN0cik7XG59O1xuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZnVuY3Rpb24gUmVwb3J0ZXIob3B0aW9ucykge1xuICB0aGlzLl9yZXBvcnRlclN0YXRlID0ge1xuICAgIG9iajogbnVsbCxcbiAgICBwYXRoOiBbXSxcbiAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9LFxuICAgIGVycm9yczogW11cbiAgfTtcbn1cbmV4cG9ydHMuUmVwb3J0ZXIgPSBSZXBvcnRlcjtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmlzRXJyb3IgPSBmdW5jdGlvbiBpc0Vycm9yKG9iaikge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgUmVwb3J0ZXJFcnJvcjtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gc2F2ZSgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXR1cm4geyBvYmo6IHN0YXRlLm9iaiwgcGF0aExlbjogc3RhdGUucGF0aC5sZW5ndGggfTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShkYXRhKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgc3RhdGUub2JqID0gZGF0YS5vYmo7XG4gIHN0YXRlLnBhdGggPSBzdGF0ZS5wYXRoLnNsaWNlKDAsIGRhdGEucGF0aExlbik7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZW50ZXJLZXkgPSBmdW5jdGlvbiBlbnRlcktleShrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5wdXNoKGtleSk7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUubGVhdmVLZXkgPSBmdW5jdGlvbiBsZWF2ZUtleShpbmRleCwga2V5LCB2YWx1ZSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHN0YXRlLnBhdGggPSBzdGF0ZS5wYXRoLnNsaWNlKDAsIGluZGV4IC0gMSk7XG4gIGlmIChzdGF0ZS5vYmogIT09IG51bGwpXG4gICAgc3RhdGUub2JqW2tleV0gPSB2YWx1ZTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5lbnRlck9iamVjdCA9IGZ1bmN0aW9uIGVudGVyT2JqZWN0KCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHZhciBwcmV2ID0gc3RhdGUub2JqO1xuICBzdGF0ZS5vYmogPSB7fTtcbiAgcmV0dXJuIHByZXY7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUubGVhdmVPYmplY3QgPSBmdW5jdGlvbiBsZWF2ZU9iamVjdChwcmV2KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgdmFyIG5vdyA9IHN0YXRlLm9iajtcbiAgc3RhdGUub2JqID0gcHJldjtcbiAgcmV0dXJuIG5vdztcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIGVycm9yKG1zZykge1xuICB2YXIgZXJyO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHZhciBpbmhlcml0ZWQgPSBtc2cgaW5zdGFuY2VvZiBSZXBvcnRlckVycm9yO1xuICBpZiAoaW5oZXJpdGVkKSB7XG4gICAgZXJyID0gbXNnO1xuICB9IGVsc2Uge1xuICAgIGVyciA9IG5ldyBSZXBvcnRlckVycm9yKHN0YXRlLnBhdGgubWFwKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgIHJldHVybiAnWycgKyBKU09OLnN0cmluZ2lmeShlbGVtKSArICddJztcbiAgICB9KS5qb2luKCcnKSwgbXNnLm1lc3NhZ2UgfHwgbXNnLCBtc2cuc3RhY2spO1xuICB9XG5cbiAgaWYgKCFzdGF0ZS5vcHRpb25zLnBhcnRpYWwpXG4gICAgdGhyb3cgZXJyO1xuXG4gIGlmICghaW5oZXJpdGVkKVxuICAgIHN0YXRlLmVycm9ycy5wdXNoKGVycik7XG5cbiAgcmV0dXJuIGVycjtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS53cmFwUmVzdWx0ID0gZnVuY3Rpb24gd3JhcFJlc3VsdChyZXN1bHQpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5vcHRpb25zLnBhcnRpYWwpXG4gICAgcmV0dXJuIHJlc3VsdDtcblxuICByZXR1cm4ge1xuICAgIHJlc3VsdDogdGhpcy5pc0Vycm9yKHJlc3VsdCkgPyBudWxsIDogcmVzdWx0LFxuICAgIGVycm9yczogc3RhdGUuZXJyb3JzXG4gIH07XG59O1xuXG5mdW5jdGlvbiBSZXBvcnRlckVycm9yKHBhdGgsIG1zZykge1xuICB0aGlzLnBhdGggPSBwYXRoO1xuICB0aGlzLnJldGhyb3cobXNnKTtcbn07XG5pbmhlcml0cyhSZXBvcnRlckVycm9yLCBFcnJvcik7XG5cblJlcG9ydGVyRXJyb3IucHJvdG90eXBlLnJldGhyb3cgPSBmdW5jdGlvbiByZXRocm93KG1zZykge1xuICB0aGlzLm1lc3NhZ2UgPSBtc2cgKyAnIGF0OiAnICsgKHRoaXMucGF0aCB8fCAnKHNoYWxsb3cpJyk7XG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlcG9ydGVyRXJyb3IpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcbiIsInZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuLi9jb25zdGFudHMnKTtcblxuZXhwb3J0cy50YWdDbGFzcyA9IHtcbiAgMDogJ3VuaXZlcnNhbCcsXG4gIDE6ICdhcHBsaWNhdGlvbicsXG4gIDI6ICdjb250ZXh0JyxcbiAgMzogJ3ByaXZhdGUnXG59O1xuZXhwb3J0cy50YWdDbGFzc0J5TmFtZSA9IGNvbnN0YW50cy5fcmV2ZXJzZShleHBvcnRzLnRhZ0NsYXNzKTtcblxuZXhwb3J0cy50YWcgPSB7XG4gIDB4MDA6ICdlbmQnLFxuICAweDAxOiAnYm9vbCcsXG4gIDB4MDI6ICdpbnQnLFxuICAweDAzOiAnYml0c3RyJyxcbiAgMHgwNDogJ29jdHN0cicsXG4gIDB4MDU6ICdudWxsXycsXG4gIDB4MDY6ICdvYmppZCcsXG4gIDB4MDc6ICdvYmpEZXNjJyxcbiAgMHgwODogJ2V4dGVybmFsJyxcbiAgMHgwOTogJ3JlYWwnLFxuICAweDBhOiAnZW51bScsXG4gIDB4MGI6ICdlbWJlZCcsXG4gIDB4MGM6ICd1dGY4c3RyJyxcbiAgMHgwZDogJ3JlbGF0aXZlT2lkJyxcbiAgMHgxMDogJ3NlcScsXG4gIDB4MTE6ICdzZXQnLFxuICAweDEyOiAnbnVtc3RyJyxcbiAgMHgxMzogJ3ByaW50c3RyJyxcbiAgMHgxNDogJ3Q2MXN0cicsXG4gIDB4MTU6ICd2aWRlb3N0cicsXG4gIDB4MTY6ICdpYTVzdHInLFxuICAweDE3OiAndXRjdGltZScsXG4gIDB4MTg6ICdnZW50aW1lJyxcbiAgMHgxOTogJ2dyYXBoc3RyJyxcbiAgMHgxYTogJ2lzbzY0NnN0cicsXG4gIDB4MWI6ICdnZW5zdHInLFxuICAweDFjOiAndW5pc3RyJyxcbiAgMHgxZDogJ2NoYXJzdHInLFxuICAweDFlOiAnYm1wc3RyJ1xufTtcbmV4cG9ydHMudGFnQnlOYW1lID0gY29uc3RhbnRzLl9yZXZlcnNlKGV4cG9ydHMudGFnKTtcbiIsInZhciBjb25zdGFudHMgPSBleHBvcnRzO1xuXG4vLyBIZWxwZXJcbmNvbnN0YW50cy5fcmV2ZXJzZSA9IGZ1bmN0aW9uIHJldmVyc2UobWFwKSB7XG4gIHZhciByZXMgPSB7fTtcblxuICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgLy8gQ29udmVydCBrZXkgdG8gaW50ZWdlciBpZiBpdCBpcyBzdHJpbmdpZmllZFxuICAgIGlmICgoa2V5IHwgMCkgPT0ga2V5KVxuICAgICAga2V5ID0ga2V5IHwgMDtcblxuICAgIHZhciB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5jb25zdGFudHMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbiIsInZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbnZhciBhc24xID0gcmVxdWlyZSgnLi4vLi4vYXNuMScpO1xudmFyIGJhc2UgPSBhc24xLmJhc2U7XG52YXIgYmlnbnVtID0gYXNuMS5iaWdudW07XG5cbi8vIEltcG9ydCBERVIgY29uc3RhbnRzXG52YXIgZGVyID0gYXNuMS5jb25zdGFudHMuZGVyO1xuXG5mdW5jdGlvbiBERVJEZWNvZGVyKGVudGl0eSkge1xuICB0aGlzLmVuYyA9ICdkZXInO1xuICB0aGlzLm5hbWUgPSBlbnRpdHkubmFtZTtcbiAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG5cbiAgLy8gQ29uc3RydWN0IGJhc2UgdHJlZVxuICB0aGlzLnRyZWUgPSBuZXcgREVSTm9kZSgpO1xuICB0aGlzLnRyZWUuX2luaXQoZW50aXR5LmJvZHkpO1xufTtcbm1vZHVsZS5leHBvcnRzID0gREVSRGVjb2RlcjtcblxuREVSRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIGJhc2UuRGVjb2RlckJ1ZmZlcikpXG4gICAgZGF0YSA9IG5ldyBiYXNlLkRlY29kZXJCdWZmZXIoZGF0YSwgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHRoaXMudHJlZS5fZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xufTtcblxuLy8gVHJlZSBtZXRob2RzXG5cbmZ1bmN0aW9uIERFUk5vZGUocGFyZW50KSB7XG4gIGJhc2UuTm9kZS5jYWxsKHRoaXMsICdkZXInLCBwYXJlbnQpO1xufVxuaW5oZXJpdHMoREVSTm9kZSwgYmFzZS5Ob2RlKTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3BlZWtUYWcgPSBmdW5jdGlvbiBwZWVrVGFnKGJ1ZmZlciwgdGFnLCBhbnkpIHtcbiAgaWYgKGJ1ZmZlci5pc0VtcHR5KCkpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBzdGF0ZSA9IGJ1ZmZlci5zYXZlKCk7XG4gIHZhciBkZWNvZGVkVGFnID0gZGVyRGVjb2RlVGFnKGJ1ZmZlciwgJ0ZhaWxlZCB0byBwZWVrIHRhZzogXCInICsgdGFnICsgJ1wiJyk7XG4gIGlmIChidWZmZXIuaXNFcnJvcihkZWNvZGVkVGFnKSlcbiAgICByZXR1cm4gZGVjb2RlZFRhZztcblxuICBidWZmZXIucmVzdG9yZShzdGF0ZSk7XG5cbiAgcmV0dXJuIGRlY29kZWRUYWcudGFnID09PSB0YWcgfHwgZGVjb2RlZFRhZy50YWdTdHIgPT09IHRhZyB8fFxuICAgIChkZWNvZGVkVGFnLnRhZ1N0ciArICdvZicpID09PSB0YWcgfHwgYW55O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRhZyA9IGZ1bmN0aW9uIGRlY29kZVRhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIHZhciBkZWNvZGVkVGFnID0gZGVyRGVjb2RlVGFnKGJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBkZWNvZGUgdGFnIG9mIFwiJyArIHRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IoZGVjb2RlZFRhZykpXG4gICAgcmV0dXJuIGRlY29kZWRUYWc7XG5cbiAgdmFyIGxlbiA9IGRlckRlY29kZUxlbihidWZmZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFRhZy5wcmltaXRpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBnZXQgbGVuZ3RoIG9mIFwiJyArIHRhZyArICdcIicpO1xuXG4gIC8vIEZhaWx1cmVcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICBpZiAoIWFueSAmJlxuICAgICAgZGVjb2RlZFRhZy50YWcgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgKyAnb2YnICE9PSB0YWcpIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdGYWlsZWQgdG8gbWF0Y2ggdGFnOiBcIicgKyB0YWcgKyAnXCInKTtcbiAgfVxuXG4gIGlmIChkZWNvZGVkVGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcblxuICAvLyBJbmRlZmluaXRlIGxlbmd0aC4uLiBmaW5kIEVORCB0YWdcbiAgdmFyIHN0YXRlID0gYnVmZmVyLnNhdmUoKTtcbiAgdmFyIHJlcyA9IHRoaXMuX3NraXBVbnRpbEVuZChcbiAgICAgIGJ1ZmZlcixcbiAgICAgICdGYWlsZWQgdG8gc2tpcCBpbmRlZmluaXRlIGxlbmd0aCBib2R5OiBcIicgKyB0aGlzLnRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICByZXR1cm4gcmVzO1xuXG4gIGxlbiA9IGJ1ZmZlci5vZmZzZXQgLSBzdGF0ZS5vZmZzZXQ7XG4gIGJ1ZmZlci5yZXN0b3JlKHN0YXRlKTtcbiAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwVW50aWxFbmQgPSBmdW5jdGlvbiBza2lwVW50aWxFbmQoYnVmZmVyLCBmYWlsKSB7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsIGZhaWwpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcih0YWcpKVxuICAgICAgcmV0dXJuIHRhZztcbiAgICB2YXIgbGVuID0gZGVyRGVjb2RlTGVuKGJ1ZmZlciwgdGFnLnByaW1pdGl2ZSwgZmFpbCk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgICByZXR1cm4gbGVuO1xuXG4gICAgdmFyIHJlcztcbiAgICBpZiAodGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgICByZXMgPSBidWZmZXIuc2tpcChsZW4pXG4gICAgZWxzZVxuICAgICAgcmVzID0gdGhpcy5fc2tpcFVudGlsRW5kKGJ1ZmZlciwgZmFpbCk7XG5cbiAgICAvLyBGYWlsdXJlXG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykpXG4gICAgICByZXR1cm4gcmVzO1xuXG4gICAgaWYgKHRhZy50YWdTdHIgPT09ICdlbmQnKVxuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVMaXN0ID0gZnVuY3Rpb24gZGVjb2RlTGlzdChidWZmZXIsIHRhZywgZGVjb2Rlcikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIHZhciBwb3NzaWJsZUVuZCA9IHRoaXMuX3BlZWtUYWcoYnVmZmVyLCAnZW5kJyk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHBvc3NpYmxlRW5kKSlcbiAgICAgIHJldHVybiBwb3NzaWJsZUVuZDtcblxuICAgIHZhciByZXMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIsICdkZXInKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSAmJiBwb3NzaWJsZUVuZClcbiAgICAgIGJyZWFrO1xuICAgIHJlc3VsdC5wdXNoKHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVTdHIgPSBmdW5jdGlvbiBkZWNvZGVTdHIoYnVmZmVyLCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gJ2JpdHN0cicpIHtcbiAgICB2YXIgdW51c2VkID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcih1bnVzZWQpKVxuICAgICAgcmV0dXJuIHVudXNlZDtcbiAgICByZXR1cm4geyB1bnVzZWQ6IHVudXNlZCwgZGF0YTogYnVmZmVyLnJhdygpIH07XG4gIH0gZWxzZSBpZiAodGFnID09PSAnYm1wc3RyJykge1xuICAgIHZhciByYXcgPSBidWZmZXIucmF3KCk7XG4gICAgaWYgKHJhdy5sZW5ndGggJSAyID09PSAxKVxuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IGJtcHN0ciBsZW5ndGggbWlzbWF0Y2gnKTtcblxuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhdy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHJhdy5yZWFkVUludDE2QkUoaSAqIDIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInKSB7XG4gICAgdmFyIG51bXN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygnYXNjaWknKTtcbiAgICBpZiAoIXRoaXMuX2lzTnVtc3RyKG51bXN0cikpIHtcbiAgICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ251bXN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICAgIHJldHVybiBudW1zdHI7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnb2N0c3RyJykge1xuICAgIHJldHVybiBidWZmZXIucmF3KCk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAncHJpbnRzdHInKSB7XG4gICAgdmFyIHByaW50c3RyID0gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCdhc2NpaScpO1xuICAgIGlmICghdGhpcy5faXNQcmludHN0cihwcmludHN0cikpIHtcbiAgICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByaW50c3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHByaW50c3RyO1xuICB9IGVsc2UgaWYgKC9zdHIkLy50ZXN0KHRhZykpIHtcbiAgICByZXR1cm4gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgKyB0YWcgKyAnIHVuc3VwcG9ydGVkJyk7XG4gIH1cbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVPYmppZCA9IGZ1bmN0aW9uIGRlY29kZU9iamlkKGJ1ZmZlciwgdmFsdWVzLCByZWxhdGl2ZSkge1xuICB2YXIgcmVzdWx0O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgdmFyIGlkZW50ID0gMDtcbiAgd2hpbGUgKCFidWZmZXIuaXNFbXB0eSgpKSB7XG4gICAgdmFyIHN1YmlkZW50ID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlkZW50IDw8PSA3O1xuICAgIGlkZW50IHw9IHN1YmlkZW50ICYgMHg3ZjtcbiAgICBpZiAoKHN1YmlkZW50ICYgMHg4MCkgPT09IDApIHtcbiAgICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnQpO1xuICAgICAgaWRlbnQgPSAwO1xuICAgIH1cbiAgfVxuICBpZiAoc3ViaWRlbnQgJiAweDgwKVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnQpO1xuXG4gIHZhciBmaXJzdCA9IChpZGVudGlmaWVyc1swXSAvIDQwKSB8IDA7XG4gIHZhciBzZWNvbmQgPSBpZGVudGlmaWVyc1swXSAlIDQwO1xuXG4gIGlmIChyZWxhdGl2ZSlcbiAgICByZXN1bHQgPSBpZGVudGlmaWVycztcbiAgZWxzZVxuICAgIHJlc3VsdCA9IFtmaXJzdCwgc2Vjb25kXS5jb25jYXQoaWRlbnRpZmllcnMuc2xpY2UoMSkpO1xuXG4gIGlmICh2YWx1ZXMpIHtcbiAgICB2YXIgdG1wID0gdmFsdWVzW3Jlc3VsdC5qb2luKCcgJyldO1xuICAgIGlmICh0bXAgPT09IHVuZGVmaW5lZClcbiAgICAgIHRtcCA9IHZhbHVlc1tyZXN1bHQuam9pbignLicpXTtcbiAgICBpZiAodG1wICE9PSB1bmRlZmluZWQpXG4gICAgICByZXN1bHQgPSB0bXA7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRpbWUgPSBmdW5jdGlvbiBkZWNvZGVUaW1lKGJ1ZmZlciwgdGFnKSB7XG4gIHZhciBzdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoKTtcbiAgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnKSB7XG4gICAgdmFyIHllYXIgPSBzdHIuc2xpY2UoMCwgNCkgfCAwO1xuICAgIHZhciBtb24gPSBzdHIuc2xpY2UoNCwgNikgfCAwO1xuICAgIHZhciBkYXkgPSBzdHIuc2xpY2UoNiwgOCkgfCAwO1xuICAgIHZhciBob3VyID0gc3RyLnNsaWNlKDgsIDEwKSB8IDA7XG4gICAgdmFyIG1pbiA9IHN0ci5zbGljZSgxMCwgMTIpIHwgMDtcbiAgICB2YXIgc2VjID0gc3RyLnNsaWNlKDEyLCAxNCkgfCAwO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3V0Y3RpbWUnKSB7XG4gICAgdmFyIHllYXIgPSBzdHIuc2xpY2UoMCwgMikgfCAwO1xuICAgIHZhciBtb24gPSBzdHIuc2xpY2UoMiwgNCkgfCAwO1xuICAgIHZhciBkYXkgPSBzdHIuc2xpY2UoNCwgNikgfCAwO1xuICAgIHZhciBob3VyID0gc3RyLnNsaWNlKDYsIDgpIHwgMDtcbiAgICB2YXIgbWluID0gc3RyLnNsaWNlKDgsIDEwKSB8IDA7XG4gICAgdmFyIHNlYyA9IHN0ci5zbGljZSgxMCwgMTIpIHwgMDtcbiAgICBpZiAoeWVhciA8IDcwKVxuICAgICAgeWVhciA9IDIwMDAgKyB5ZWFyO1xuICAgIGVsc2VcbiAgICAgIHllYXIgPSAxOTAwICsgeWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyAnICsgdGFnICsgJyB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gIH1cblxuICByZXR1cm4gRGF0ZS5VVEMoeWVhciwgbW9uIC0gMSwgZGF5LCBob3VyLCBtaW4sIHNlYywgMCk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTnVsbCA9IGZ1bmN0aW9uIGRlY29kZU51bGwoYnVmZmVyKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUJvb2wgPSBmdW5jdGlvbiBkZWNvZGVCb29sKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICByZXR1cm4gcmVzO1xuICBlbHNlXG4gICAgcmV0dXJuIHJlcyAhPT0gMDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVJbnQgPSBmdW5jdGlvbiBkZWNvZGVJbnQoYnVmZmVyLCB2YWx1ZXMpIHtcbiAgLy8gQmlnaW50LCByZXR1cm4gYXMgaXQgaXMgKGFzc3VtZSBiaWcgZW5kaWFuKVxuICB2YXIgcmF3ID0gYnVmZmVyLnJhdygpO1xuICB2YXIgcmVzID0gbmV3IGJpZ251bShyYXcpO1xuXG4gIGlmICh2YWx1ZXMpXG4gICAgcmVzID0gdmFsdWVzW3Jlcy50b1N0cmluZygxMCldIHx8IHJlcztcblxuICByZXR1cm4gcmVzO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3VzZSA9IGZ1bmN0aW9uIHVzZShlbnRpdHksIG9iaikge1xuICBpZiAodHlwZW9mIGVudGl0eSA9PT0gJ2Z1bmN0aW9uJylcbiAgICBlbnRpdHkgPSBlbnRpdHkob2JqKTtcbiAgcmV0dXJuIGVudGl0eS5fZ2V0RGVjb2RlcignZGVyJykudHJlZTtcbn07XG5cbi8vIFV0aWxpdHkgbWV0aG9kc1xuXG5mdW5jdGlvbiBkZXJEZWNvZGVUYWcoYnVmLCBmYWlsKSB7XG4gIHZhciB0YWcgPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICBpZiAoYnVmLmlzRXJyb3IodGFnKSlcbiAgICByZXR1cm4gdGFnO1xuXG4gIHZhciBjbHMgPSBkZXIudGFnQ2xhc3NbdGFnID4+IDZdO1xuICB2YXIgcHJpbWl0aXZlID0gKHRhZyAmIDB4MjApID09PSAwO1xuXG4gIC8vIE11bHRpLW9jdGV0IHRhZyAtIGxvYWRcbiAgaWYgKCh0YWcgJiAweDFmKSA9PT0gMHgxZikge1xuICAgIHZhciBvY3QgPSB0YWc7XG4gICAgdGFnID0gMDtcbiAgICB3aGlsZSAoKG9jdCAmIDB4ODApID09PSAweDgwKSB7XG4gICAgICBvY3QgPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICAgICAgaWYgKGJ1Zi5pc0Vycm9yKG9jdCkpXG4gICAgICAgIHJldHVybiBvY3Q7XG5cbiAgICAgIHRhZyA8PD0gNztcbiAgICAgIHRhZyB8PSBvY3QgJiAweDdmO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0YWcgJj0gMHgxZjtcbiAgfVxuICB2YXIgdGFnU3RyID0gZGVyLnRhZ1t0YWddO1xuXG4gIHJldHVybiB7XG4gICAgY2xzOiBjbHMsXG4gICAgcHJpbWl0aXZlOiBwcmltaXRpdmUsXG4gICAgdGFnOiB0YWcsXG4gICAgdGFnU3RyOiB0YWdTdHJcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVyRGVjb2RlTGVuKGJ1ZiwgcHJpbWl0aXZlLCBmYWlsKSB7XG4gIHZhciBsZW4gPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICBpZiAoYnVmLmlzRXJyb3IobGVuKSlcbiAgICByZXR1cm4gbGVuO1xuXG4gIC8vIEluZGVmaW5pdGUgZm9ybVxuICBpZiAoIXByaW1pdGl2ZSAmJiBsZW4gPT09IDB4ODApXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgLy8gRGVmaW5pdGUgZm9ybVxuICBpZiAoKGxlbiAmIDB4ODApID09PSAwKSB7XG4gICAgLy8gU2hvcnQgZm9ybVxuICAgIHJldHVybiBsZW47XG4gIH1cblxuICAvLyBMb25nIGZvcm1cbiAgdmFyIG51bSA9IGxlbiAmIDB4N2Y7XG4gIGlmIChudW0gPj0gNClcbiAgICByZXR1cm4gYnVmLmVycm9yKCdsZW5ndGggb2N0ZWN0IGlzIHRvbyBsb25nJyk7XG5cbiAgbGVuID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW07IGkrKykge1xuICAgIGxlbiA8PD0gODtcbiAgICB2YXIgaiA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gICAgaWYgKGJ1Zi5pc0Vycm9yKGopKVxuICAgICAgcmV0dXJuIGo7XG4gICAgbGVuIHw9IGo7XG4gIH1cblxuICByZXR1cm4gbGVuO1xufVxuIiwidmFyIGRlY29kZXJzID0gZXhwb3J0cztcblxuZGVjb2RlcnMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbmRlY29kZXJzLnBlbSA9IHJlcXVpcmUoJy4vcGVtJyk7XG4iLCJ2YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIGFzbjEgPSByZXF1aXJlKCcuLi8uLi9hc24xJyk7XG52YXIgREVSRGVjb2RlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5cbmZ1bmN0aW9uIFBFTURlY29kZXIoZW50aXR5KSB7XG4gIERFUkRlY29kZXIuY2FsbCh0aGlzLCBlbnRpdHkpO1xuICB0aGlzLmVuYyA9ICdwZW0nO1xufTtcbmluaGVyaXRzKFBFTURlY29kZXIsIERFUkRlY29kZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBQRU1EZWNvZGVyO1xuXG5QRU1EZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgb3B0aW9ucykge1xuICB2YXIgbGluZXMgPSBkYXRhLnRvU3RyaW5nKCkuc3BsaXQoL1tcXHJcXG5dKy9nKTtcblxuICB2YXIgbGFiZWwgPSBvcHRpb25zLmxhYmVsLnRvVXBwZXJDYXNlKCk7XG5cbiAgdmFyIHJlID0gL14tLS0tLShCRUdJTnxFTkQpIChbXi1dKyktLS0tLSQvO1xuICB2YXIgc3RhcnQgPSAtMTtcbiAgdmFyIGVuZCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG1hdGNoID0gbGluZXNbaV0ubWF0Y2gocmUpO1xuICAgIGlmIChtYXRjaCA9PT0gbnVsbClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgaWYgKG1hdGNoWzJdICE9PSBsYWJlbClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgaWYgKG1hdGNoWzFdICE9PSAnQkVHSU4nKVxuICAgICAgICBicmVhaztcbiAgICAgIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1hdGNoWzFdICE9PSAnRU5EJylcbiAgICAgICAgYnJlYWs7XG4gICAgICBlbmQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BFTSBzZWN0aW9uIG5vdCBmb3VuZCBmb3I6ICcgKyBsYWJlbCk7XG5cbiAgdmFyIGJhc2U2NCA9IGxpbmVzLnNsaWNlKHN0YXJ0ICsgMSwgZW5kKS5qb2luKCcnKTtcbiAgLy8gUmVtb3ZlIGV4Y2Vzc2l2ZSBzeW1ib2xzXG4gIGJhc2U2NC5yZXBsYWNlKC9bXmEtejAtOVxcK1xcLz1dKy9naSwgJycpO1xuXG4gIHZhciBpbnB1dCA9IG5ldyBCdWZmZXIoYmFzZTY0LCAnYmFzZTY0Jyk7XG4gIHJldHVybiBERVJEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzLCBpbnB1dCwgb3B0aW9ucyk7XG59O1xuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnZhciBhc24xID0gcmVxdWlyZSgnLi4vLi4vYXNuMScpO1xudmFyIGJhc2UgPSBhc24xLmJhc2U7XG52YXIgYmlnbnVtID0gYXNuMS5iaWdudW07XG5cbi8vIEltcG9ydCBERVIgY29uc3RhbnRzXG52YXIgZGVyID0gYXNuMS5jb25zdGFudHMuZGVyO1xuXG5mdW5jdGlvbiBERVJFbmNvZGVyKGVudGl0eSkge1xuICB0aGlzLmVuYyA9ICdkZXInO1xuICB0aGlzLm5hbWUgPSBlbnRpdHkubmFtZTtcbiAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG5cbiAgLy8gQ29uc3RydWN0IGJhc2UgdHJlZVxuICB0aGlzLnRyZWUgPSBuZXcgREVSTm9kZSgpO1xuICB0aGlzLnRyZWUuX2luaXQoZW50aXR5LmJvZHkpO1xufTtcbm1vZHVsZS5leHBvcnRzID0gREVSRW5jb2RlcjtcblxuREVSRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIHJlcG9ydGVyKSB7XG4gIHJldHVybiB0aGlzLnRyZWUuX2VuY29kZShkYXRhLCByZXBvcnRlcikuam9pbigpO1xufTtcblxuLy8gVHJlZSBtZXRob2RzXG5cbmZ1bmN0aW9uIERFUk5vZGUocGFyZW50KSB7XG4gIGJhc2UuTm9kZS5jYWxsKHRoaXMsICdkZXInLCBwYXJlbnQpO1xufVxuaW5oZXJpdHMoREVSTm9kZSwgYmFzZS5Ob2RlKTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUNvbXBvc2l0ZSA9IGZ1bmN0aW9uIGVuY29kZUNvbXBvc2l0ZSh0YWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50KSB7XG4gIHZhciBlbmNvZGVkVGFnID0gZW5jb2RlVGFnKHRhZywgcHJpbWl0aXZlLCBjbHMsIHRoaXMucmVwb3J0ZXIpO1xuXG4gIC8vIFNob3J0IGZvcm1cbiAgaWYgKGNvbnRlbnQubGVuZ3RoIDwgMHg4MCkge1xuICAgIHZhciBoZWFkZXIgPSBuZXcgQnVmZmVyKDIpO1xuICAgIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gICAgaGVhZGVyWzFdID0gY29udGVudC5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBoZWFkZXIsIGNvbnRlbnQgXSk7XG4gIH1cblxuICAvLyBMb25nIGZvcm1cbiAgLy8gQ291bnQgb2N0ZXRzIHJlcXVpcmVkIHRvIHN0b3JlIGxlbmd0aFxuICB2YXIgbGVuT2N0ZXRzID0gMTtcbiAgZm9yICh2YXIgaSA9IGNvbnRlbnQubGVuZ3RoOyBpID49IDB4MTAwOyBpID4+PSA4KVxuICAgIGxlbk9jdGV0cysrO1xuXG4gIHZhciBoZWFkZXIgPSBuZXcgQnVmZmVyKDEgKyAxICsgbGVuT2N0ZXRzKTtcbiAgaGVhZGVyWzBdID0gZW5jb2RlZFRhZztcbiAgaGVhZGVyWzFdID0gMHg4MCB8IGxlbk9jdGV0cztcblxuICBmb3IgKHZhciBpID0gMSArIGxlbk9jdGV0cywgaiA9IGNvbnRlbnQubGVuZ3RoOyBqID4gMDsgaS0tLCBqID4+PSA4KVxuICAgIGhlYWRlcltpXSA9IGogJiAweGZmO1xuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFsgaGVhZGVyLCBjb250ZW50IF0pO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZVN0ciA9IGZ1bmN0aW9uIGVuY29kZVN0cihzdHIsIHRhZykge1xuICBpZiAodGFnID09PSAnYml0c3RyJykge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFsgc3RyLnVudXNlZCB8IDAsIHN0ci5kYXRhIF0pO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ2JtcHN0cicpIHtcbiAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzdHIubGVuZ3RoICogMik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGJ1Zi53cml0ZVVJbnQxNkJFKHN0ci5jaGFyQ29kZUF0KGkpLCBpICogMik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGJ1Zik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnbnVtc3RyJykge1xuICAgIGlmICghdGhpcy5faXNOdW1zdHIoc3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBudW1zdHIgc3VwcG9ydHMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBkaWdpdHMgYW5kIHNwYWNlJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAncHJpbnRzdHInKSB7XG4gICAgaWYgKCF0aGlzLl9pc1ByaW50c3RyKHN0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogcHJpbnRzdHIgc3VwcG9ydHMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBsYXRpbiB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXJzLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaWdpdHMsIHNwYWNlLCBhcG9zdHJvcGhlLCBsZWZ0IGFuZCByaWd0aCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJlbnRoZXNpcywgcGx1cyBzaWduLCBjb21tYSwgaHlwaGVuLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb3QsIHNsYXNoLCBjb2xvbiwgZXF1YWwgc2lnbiwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVlc3Rpb24gbWFyaycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2UgaWYgKC9zdHIkLy50ZXN0KHRhZykpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArIHRhZyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlT2JqaWQgPSBmdW5jdGlvbiBlbmNvZGVPYmppZChpZCwgdmFsdWVzLCByZWxhdGl2ZSkge1xuICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgIGlmICghdmFsdWVzKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ3N0cmluZyBvYmppZCBnaXZlbiwgYnV0IG5vIHZhbHVlcyBtYXAgZm91bmQnKTtcbiAgICBpZiAoIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShpZCkpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignb2JqaWQgbm90IGZvdW5kIGluIHZhbHVlcyBtYXAnKTtcbiAgICBpZCA9IHZhbHVlc1tpZF0uc3BsaXQoL1tcXHNcXC5dKy9nKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKVxuICAgICAgaWRbaV0gfD0gMDtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgIGlkID0gaWQuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKVxuICAgICAgaWRbaV0gfD0gMDtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignb2JqaWQoKSBzaG91bGQgYmUgZWl0aGVyIGFycmF5IG9yIHN0cmluZywgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvdDogJyArIEpTT04uc3RyaW5naWZ5KGlkKSk7XG4gIH1cblxuICBpZiAoIXJlbGF0aXZlKSB7XG4gICAgaWYgKGlkWzFdID49IDQwKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ1NlY29uZCBvYmppZCBpZGVudGlmaWVyIE9PQicpO1xuICAgIGlkLnNwbGljZSgwLCAyLCBpZFswXSAqIDQwICsgaWRbMV0pO1xuICB9XG5cbiAgLy8gQ291bnQgbnVtYmVyIG9mIG9jdGV0c1xuICB2YXIgc2l6ZSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaWRlbnQgPSBpZFtpXTtcbiAgICBmb3IgKHNpemUrKzsgaWRlbnQgPj0gMHg4MDsgaWRlbnQgPj49IDcpXG4gICAgICBzaXplKys7XG4gIH1cblxuICB2YXIgb2JqaWQgPSBuZXcgQnVmZmVyKHNpemUpO1xuICB2YXIgb2Zmc2V0ID0gb2JqaWQubGVuZ3RoIC0gMTtcbiAgZm9yICh2YXIgaSA9IGlkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGlkZW50ID0gaWRbaV07XG4gICAgb2JqaWRbb2Zmc2V0LS1dID0gaWRlbnQgJiAweDdmO1xuICAgIHdoaWxlICgoaWRlbnQgPj49IDcpID4gMClcbiAgICAgIG9iamlkW29mZnNldC0tXSA9IDB4ODAgfCAoaWRlbnQgJiAweDdmKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG9iamlkKTtcbn07XG5cbmZ1bmN0aW9uIHR3byhudW0pIHtcbiAgaWYgKG51bSA8IDEwKVxuICAgIHJldHVybiAnMCcgKyBudW07XG4gIGVsc2VcbiAgICByZXR1cm4gbnVtO1xufVxuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlVGltZSA9IGZ1bmN0aW9uIGVuY29kZVRpbWUodGltZSwgdGFnKSB7XG4gIHZhciBzdHI7XG4gIHZhciBkYXRlID0gbmV3IERhdGUodGltZSk7XG5cbiAgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnKSB7XG4gICAgc3RyID0gW1xuICAgICAgdHdvKGRhdGUuZ2V0RnVsbFllYXIoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNb250aCgpICsgMSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENEYXRlKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDSG91cnMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNaW51dGVzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDU2Vjb25kcygpKSxcbiAgICAgICdaJ1xuICAgIF0uam9pbignJyk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAndXRjdGltZScpIHtcbiAgICBzdHIgPSBbXG4gICAgICB0d28oZGF0ZS5nZXRGdWxsWWVhcigpICUgMTAwKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0RhdGUoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENIb3VycygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01pbnV0ZXMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENTZWNvbmRzKCkpLFxuICAgICAgJ1onXG4gICAgXS5qb2luKCcnKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyAnICsgdGFnICsgJyB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKHN0ciwgJ29jdHN0cicpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZU51bGwgPSBmdW5jdGlvbiBlbmNvZGVOdWxsKCkge1xuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcignJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlSW50ID0gZnVuY3Rpb24gZW5jb2RlSW50KG51bSwgdmFsdWVzKSB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnc3RyaW5nJykge1xuICAgIGlmICghdmFsdWVzKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ1N0cmluZyBpbnQgb3IgZW51bSBnaXZlbiwgYnV0IG5vIHZhbHVlcyBtYXAnKTtcbiAgICBpZiAoIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShudW0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignVmFsdWVzIG1hcCBkb2VzblxcJ3QgY29udGFpbjogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShudW0pKTtcbiAgICB9XG4gICAgbnVtID0gdmFsdWVzW251bV07XG4gIH1cblxuICAvLyBCaWdudW0sIGFzc3VtZSBiaWcgZW5kaWFuXG4gIGlmICh0eXBlb2YgbnVtICE9PSAnbnVtYmVyJyAmJiAhQnVmZmVyLmlzQnVmZmVyKG51bSkpIHtcbiAgICB2YXIgbnVtQXJyYXkgPSBudW0udG9BcnJheSgpO1xuICAgIGlmICghbnVtLnNpZ24gJiYgbnVtQXJyYXlbMF0gJiAweDgwKSB7XG4gICAgICBudW1BcnJheS51bnNoaWZ0KDApO1xuICAgIH1cbiAgICBudW0gPSBuZXcgQnVmZmVyKG51bUFycmF5KTtcbiAgfVxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIobnVtKSkge1xuICAgIHZhciBzaXplID0gbnVtLmxlbmd0aDtcbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMClcbiAgICAgIHNpemUrKztcblxuICAgIHZhciBvdXQgPSBuZXcgQnVmZmVyKHNpemUpO1xuICAgIG51bS5jb3B5KG91dCk7XG4gICAgaWYgKG51bS5sZW5ndGggPT09IDApXG4gICAgICBvdXRbMF0gPSAwXG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob3V0KTtcbiAgfVxuXG4gIGlmIChudW0gPCAweDgwKVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG51bSk7XG5cbiAgaWYgKG51bSA8IDB4MTAwKVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswLCBudW1dKTtcblxuICB2YXIgc2l6ZSA9IDE7XG4gIGZvciAodmFyIGkgPSBudW07IGkgPj0gMHgxMDA7IGkgPj49IDgpXG4gICAgc2l6ZSsrO1xuXG4gIHZhciBvdXQgPSBuZXcgQXJyYXkoc2l6ZSk7XG4gIGZvciAodmFyIGkgPSBvdXQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBvdXRbaV0gPSBudW0gJiAweGZmO1xuICAgIG51bSA+Pj0gODtcbiAgfVxuICBpZihvdXRbMF0gJiAweDgwKSB7XG4gICAgb3V0LnVuc2hpZnQoMCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihuZXcgQnVmZmVyKG91dCkpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUJvb2wgPSBmdW5jdGlvbiBlbmNvZGVCb29sKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHZhbHVlID8gMHhmZiA6IDApO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3VzZSA9IGZ1bmN0aW9uIHVzZShlbnRpdHksIG9iaikge1xuICBpZiAodHlwZW9mIGVudGl0eSA9PT0gJ2Z1bmN0aW9uJylcbiAgICBlbnRpdHkgPSBlbnRpdHkob2JqKTtcbiAgcmV0dXJuIGVudGl0eS5fZ2V0RW5jb2RlcignZGVyJykudHJlZTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwRGVmYXVsdCA9IGZ1bmN0aW9uIHNraXBEZWZhdWx0KGRhdGFCdWZmZXIsIHJlcG9ydGVyLCBwYXJlbnQpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICB2YXIgaTtcbiAgaWYgKHN0YXRlWydkZWZhdWx0J10gPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBkYXRhID0gZGF0YUJ1ZmZlci5qb2luKCk7XG4gIGlmIChzdGF0ZS5kZWZhdWx0QnVmZmVyID09PSB1bmRlZmluZWQpXG4gICAgc3RhdGUuZGVmYXVsdEJ1ZmZlciA9IHRoaXMuX2VuY29kZVZhbHVlKHN0YXRlWydkZWZhdWx0J10sIHJlcG9ydGVyLCBwYXJlbnQpLmpvaW4oKTtcblxuICBpZiAoZGF0YS5sZW5ndGggIT09IHN0YXRlLmRlZmF1bHRCdWZmZXIubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGk9MDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspXG4gICAgaWYgKGRhdGFbaV0gIT09IHN0YXRlLmRlZmF1bHRCdWZmZXJbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBVdGlsaXR5IG1ldGhvZHNcblxuZnVuY3Rpb24gZW5jb2RlVGFnKHRhZywgcHJpbWl0aXZlLCBjbHMsIHJlcG9ydGVyKSB7XG4gIHZhciByZXM7XG5cbiAgaWYgKHRhZyA9PT0gJ3NlcW9mJylcbiAgICB0YWcgPSAnc2VxJztcbiAgZWxzZSBpZiAodGFnID09PSAnc2V0b2YnKVxuICAgIHRhZyA9ICdzZXQnO1xuXG4gIGlmIChkZXIudGFnQnlOYW1lLmhhc093blByb3BlcnR5KHRhZykpXG4gICAgcmVzID0gZGVyLnRhZ0J5TmFtZVt0YWddO1xuICBlbHNlIGlmICh0eXBlb2YgdGFnID09PSAnbnVtYmVyJyAmJiAodGFnIHwgMCkgPT09IHRhZylcbiAgICByZXMgPSB0YWc7XG4gIGVsc2VcbiAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ1Vua25vd24gdGFnOiAnICsgdGFnKTtcblxuICBpZiAocmVzID49IDB4MWYpXG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdNdWx0aS1vY3RldCB0YWcgZW5jb2RpbmcgdW5zdXBwb3J0ZWQnKTtcblxuICBpZiAoIXByaW1pdGl2ZSlcbiAgICByZXMgfD0gMHgyMDtcblxuICByZXMgfD0gKGRlci50YWdDbGFzc0J5TmFtZVtjbHMgfHwgJ3VuaXZlcnNhbCddIDw8IDYpO1xuXG4gIHJldHVybiByZXM7XG59XG4iLCJ2YXIgZW5jb2RlcnMgPSBleHBvcnRzO1xuXG5lbmNvZGVycy5kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuZW5jb2RlcnMucGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcbiIsInZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJy4uLy4uL2FzbjEnKTtcbnZhciBERVJFbmNvZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcblxuZnVuY3Rpb24gUEVNRW5jb2RlcihlbnRpdHkpIHtcbiAgREVSRW5jb2Rlci5jYWxsKHRoaXMsIGVudGl0eSk7XG4gIHRoaXMuZW5jID0gJ3BlbSc7XG59O1xuaW5oZXJpdHMoUEVNRW5jb2RlciwgREVSRW5jb2Rlcik7XG5tb2R1bGUuZXhwb3J0cyA9IFBFTUVuY29kZXI7XG5cblBFTUVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIHZhciBidWYgPSBERVJFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUuY2FsbCh0aGlzLCBkYXRhKTtcblxuICB2YXIgcCA9IGJ1Zi50b1N0cmluZygnYmFzZTY0Jyk7XG4gIHZhciBvdXQgPSBbICctLS0tLUJFR0lOICcgKyBvcHRpb25zLmxhYmVsICsgJy0tLS0tJyBdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHAubGVuZ3RoOyBpICs9IDY0KVxuICAgIG91dC5wdXNoKHAuc2xpY2UoaSwgaSArIDY0KSk7XG4gIG91dC5wdXNoKCctLS0tLUVORCAnICsgb3B0aW9ucy5sYWJlbCArICctLS0tLScpO1xuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpO1xufTtcbiIsIi8vIGh0dHA6Ly93aWtpLmNvbW1vbmpzLm9yZy93aWtpL1VuaXRfVGVzdGluZy8xLjBcbi8vXG4vLyBUSElTIElTIE5PVCBURVNURUQgTk9SIExJS0VMWSBUTyBXT1JLIE9VVFNJREUgVjghXG4vL1xuLy8gT3JpZ2luYWxseSBmcm9tIG5hcndoYWwuanMgKGh0dHA6Ly9uYXJ3aGFsanMub3JnKVxuLy8gQ29weXJpZ2h0IChjKSAyMDA5IFRob21hcyBSb2JpbnNvbiA8Mjgwbm9ydGguY29tPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU5cbi8vIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbi8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyB3aGVuIHVzZWQgaW4gbm9kZSwgdGhpcyB3aWxsIGFjdHVhbGx5IGxvYWQgdGhlIHV0aWwgbW9kdWxlIHdlIGRlcGVuZCBvblxuLy8gdmVyc3VzIGxvYWRpbmcgdGhlIGJ1aWx0aW4gdXRpbCBtb2R1bGUgYXMgaGFwcGVucyBvdGhlcndpc2Vcbi8vIHRoaXMgaXMgYSBidWcgaW4gbm9kZSBtb2R1bGUgbG9hZGluZyBhcyBmYXIgYXMgSSBhbSBjb25jZXJuZWRcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbC8nKTtcblxudmFyIHBTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vLyAxLiBUaGUgYXNzZXJ0IG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgdGhhdCB0aHJvd1xuLy8gQXNzZXJ0aW9uRXJyb3IncyB3aGVuIHBhcnRpY3VsYXIgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4gVGhlXG4vLyBhc3NlcnQgbW9kdWxlIG11c3QgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIGludGVyZmFjZS5cblxudmFyIGFzc2VydCA9IG1vZHVsZS5leHBvcnRzID0gb2s7XG5cbi8vIDIuIFRoZSBBc3NlcnRpb25FcnJvciBpcyBkZWZpbmVkIGluIGFzc2VydC5cbi8vIG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IoeyBtZXNzYWdlOiBtZXNzYWdlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogYWN0dWFsLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZCB9KVxuXG5hc3NlcnQuQXNzZXJ0aW9uRXJyb3IgPSBmdW5jdGlvbiBBc3NlcnRpb25FcnJvcihvcHRpb25zKSB7XG4gIHRoaXMubmFtZSA9ICdBc3NlcnRpb25FcnJvcic7XG4gIHRoaXMuYWN0dWFsID0gb3B0aW9ucy5hY3R1YWw7XG4gIHRoaXMuZXhwZWN0ZWQgPSBvcHRpb25zLmV4cGVjdGVkO1xuICB0aGlzLm9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvcjtcbiAgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBnZXRNZXNzYWdlKHRoaXMpO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0YWNrU3RhcnRGdW5jdGlvbiA9IG9wdGlvbnMuc3RhY2tTdGFydEZ1bmN0aW9uIHx8IGZhaWw7XG5cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBub24gdjggYnJvd3NlcnMgc28gd2UgY2FuIGhhdmUgYSBzdGFja3RyYWNlXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xuICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgIHZhciBvdXQgPSBlcnIuc3RhY2s7XG5cbiAgICAgIC8vIHRyeSB0byBzdHJpcCB1c2VsZXNzIGZyYW1lc1xuICAgICAgdmFyIGZuX25hbWUgPSBzdGFja1N0YXJ0RnVuY3Rpb24ubmFtZTtcbiAgICAgIHZhciBpZHggPSBvdXQuaW5kZXhPZignXFxuJyArIGZuX25hbWUpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIC8vIG9uY2Ugd2UgaGF2ZSBsb2NhdGVkIHRoZSBmdW5jdGlvbiBmcmFtZVxuICAgICAgICAvLyB3ZSBuZWVkIHRvIHN0cmlwIG91dCBldmVyeXRoaW5nIGJlZm9yZSBpdCAoYW5kIGl0cyBsaW5lKVxuICAgICAgICB2YXIgbmV4dF9saW5lID0gb3V0LmluZGV4T2YoJ1xcbicsIGlkeCArIDEpO1xuICAgICAgICBvdXQgPSBvdXQuc3Vic3RyaW5nKG5leHRfbGluZSArIDEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YWNrID0gb3V0O1xuICAgIH1cbiAgfVxufTtcblxuLy8gYXNzZXJ0LkFzc2VydGlvbkVycm9yIGluc3RhbmNlb2YgRXJyb3JcbnV0aWwuaW5oZXJpdHMoYXNzZXJ0LkFzc2VydGlvbkVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcbiAgaWYgKHV0aWwuaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuICcnICsgdmFsdWU7XG4gIH1cbiAgaWYgKHV0aWwuaXNOdW1iZXIodmFsdWUpICYmICFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuICBpZiAodXRpbC5pc0Z1bmN0aW9uKHZhbHVlKSB8fCB1dGlsLmlzUmVnRXhwKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGUocywgbikge1xuICBpZiAodXRpbC5pc1N0cmluZyhzKSkge1xuICAgIHJldHVybiBzLmxlbmd0aCA8IG4gPyBzIDogcy5zbGljZSgwLCBuKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNZXNzYWdlKHNlbGYpIHtcbiAgcmV0dXJuIHRydW5jYXRlKEpTT04uc3RyaW5naWZ5KHNlbGYuYWN0dWFsLCByZXBsYWNlciksIDEyOCkgKyAnICcgK1xuICAgICAgICAgc2VsZi5vcGVyYXRvciArICcgJyArXG4gICAgICAgICB0cnVuY2F0ZShKU09OLnN0cmluZ2lmeShzZWxmLmV4cGVjdGVkLCByZXBsYWNlciksIDEyOCk7XG59XG5cbi8vIEF0IHByZXNlbnQgb25seSB0aGUgdGhyZWUga2V5cyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgYW5kXG4vLyB1bmRlcnN0b29kIGJ5IHRoZSBzcGVjLiBJbXBsZW1lbnRhdGlvbnMgb3Igc3ViIG1vZHVsZXMgY2FuIHBhc3Ncbi8vIG90aGVyIGtleXMgdG8gdGhlIEFzc2VydGlvbkVycm9yJ3MgY29uc3RydWN0b3IgLSB0aGV5IHdpbGwgYmVcbi8vIGlnbm9yZWQuXG5cbi8vIDMuIEFsbCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtdXN0IHRocm93IGFuIEFzc2VydGlvbkVycm9yXG4vLyB3aGVuIGEgY29ycmVzcG9uZGluZyBjb25kaXRpb24gaXMgbm90IG1ldCwgd2l0aCBhIG1lc3NhZ2UgdGhhdFxuLy8gbWF5IGJlIHVuZGVmaW5lZCBpZiBub3QgcHJvdmlkZWQuICBBbGwgYXNzZXJ0aW9uIG1ldGhvZHMgcHJvdmlkZVxuLy8gYm90aCB0aGUgYWN0dWFsIGFuZCBleHBlY3RlZCB2YWx1ZXMgdG8gdGhlIGFzc2VydGlvbiBlcnJvciBmb3Jcbi8vIGRpc3BsYXkgcHVycG9zZXMuXG5cbmZ1bmN0aW9uIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IsIHN0YWNrU3RhcnRGdW5jdGlvbikge1xuICB0aHJvdyBuZXcgYXNzZXJ0LkFzc2VydGlvbkVycm9yKHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGFjdHVhbDogYWN0dWFsLFxuICAgIGV4cGVjdGVkOiBleHBlY3RlZCxcbiAgICBvcGVyYXRvcjogb3BlcmF0b3IsXG4gICAgc3RhY2tTdGFydEZ1bmN0aW9uOiBzdGFja1N0YXJ0RnVuY3Rpb25cbiAgfSk7XG59XG5cbi8vIEVYVEVOU0lPTiEgYWxsb3dzIGZvciB3ZWxsIGJlaGF2ZWQgZXJyb3JzIGRlZmluZWQgZWxzZXdoZXJlLlxuYXNzZXJ0LmZhaWwgPSBmYWlsO1xuXG4vLyA0LiBQdXJlIGFzc2VydGlvbiB0ZXN0cyB3aGV0aGVyIGEgdmFsdWUgaXMgdHJ1dGh5LCBhcyBkZXRlcm1pbmVkXG4vLyBieSAhIWd1YXJkLlxuLy8gYXNzZXJ0Lm9rKGd1YXJkLCBtZXNzYWdlX29wdCk7XG4vLyBUaGlzIHN0YXRlbWVudCBpcyBlcXVpdmFsZW50IHRvIGFzc2VydC5lcXVhbCh0cnVlLCAhIWd1YXJkLFxuLy8gbWVzc2FnZV9vcHQpOy4gVG8gdGVzdCBzdHJpY3RseSBmb3IgdGhlIHZhbHVlIHRydWUsIHVzZVxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKHRydWUsIGd1YXJkLCBtZXNzYWdlX29wdCk7LlxuXG5mdW5jdGlvbiBvayh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBhc3NlcnQub2spO1xufVxuYXNzZXJ0Lm9rID0gb2s7XG5cbi8vIDUuIFRoZSBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc2hhbGxvdywgY29lcmNpdmUgZXF1YWxpdHkgd2l0aFxuLy8gPT0uXG4vLyBhc3NlcnQuZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuZXF1YWwgPSBmdW5jdGlvbiBlcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT0gZXhwZWN0ZWQpIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09JywgYXNzZXJ0LmVxdWFsKTtcbn07XG5cbi8vIDYuIFRoZSBub24tZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIGZvciB3aGV0aGVyIHR3byBvYmplY3RzIGFyZSBub3QgZXF1YWxcbi8vIHdpdGggIT0gYXNzZXJ0Lm5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdEVxdWFsID0gZnVuY3Rpb24gbm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT0nLCBhc3NlcnQubm90RXF1YWwpO1xuICB9XG59O1xuXG4vLyA3LiBUaGUgZXF1aXZhbGVuY2UgYXNzZXJ0aW9uIHRlc3RzIGEgZGVlcCBlcXVhbGl0eSByZWxhdGlvbi5cbi8vIGFzc2VydC5kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQuZGVlcEVxdWFsID0gZnVuY3Rpb24gZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcEVxdWFsJywgYXNzZXJ0LmRlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCkge1xuICAvLyA3LjEuIEFsbCBpZGVudGljYWwgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbiAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB9IGVsc2UgaWYgKHV0aWwuaXNCdWZmZXIoYWN0dWFsKSAmJiB1dGlsLmlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIGlmIChhY3R1YWwubGVuZ3RoICE9IGV4cGVjdGVkLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhY3R1YWxbaV0gIT09IGV4cGVjdGVkW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgLy8gNy4yLiBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBEYXRlIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBEYXRlIG9iamVjdCB0aGF0IHJlZmVycyB0byB0aGUgc2FtZSB0aW1lLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNEYXRlKGFjdHVhbCkgJiYgdXRpbC5pc0RhdGUoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5nZXRUaW1lKCkgPT09IGV4cGVjdGVkLmdldFRpbWUoKTtcblxuICAvLyA3LjMgSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBSZWdFeHAgb2JqZWN0IHdpdGggdGhlIHNhbWUgc291cmNlIGFuZFxuICAvLyBwcm9wZXJ0aWVzIChgZ2xvYmFsYCwgYG11bHRpbGluZWAsIGBsYXN0SW5kZXhgLCBgaWdub3JlQ2FzZWApLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNSZWdFeHAoYWN0dWFsKSAmJiB1dGlsLmlzUmVnRXhwKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuc291cmNlID09PSBleHBlY3RlZC5zb3VyY2UgJiZcbiAgICAgICAgICAgYWN0dWFsLmdsb2JhbCA9PT0gZXhwZWN0ZWQuZ2xvYmFsICYmXG4gICAgICAgICAgIGFjdHVhbC5tdWx0aWxpbmUgPT09IGV4cGVjdGVkLm11bHRpbGluZSAmJlxuICAgICAgICAgICBhY3R1YWwubGFzdEluZGV4ID09PSBleHBlY3RlZC5sYXN0SW5kZXggJiZcbiAgICAgICAgICAgYWN0dWFsLmlnbm9yZUNhc2UgPT09IGV4cGVjdGVkLmlnbm9yZUNhc2U7XG5cbiAgLy8gNy40LiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKCF1dGlsLmlzT2JqZWN0KGFjdHVhbCkgJiYgIXV0aWwuaXNPYmplY3QoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyA3LjUgRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAvLyBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgLy8gd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAvLyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gIC8vIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gIC8vIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICB9IGVsc2Uge1xuICAgIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiKSB7XG4gIGlmICh1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKGEpIHx8IHV0aWwuaXNOdWxsT3JVbmRlZmluZWQoYikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuXG4gIGlmIChhLnByb3RvdHlwZSAhPT0gYi5wcm90b3R5cGUpIHJldHVybiBmYWxzZTtcbiAgLy8gaWYgb25lIGlzIGEgcHJpbWl0aXZlLCB0aGUgb3RoZXIgbXVzdCBiZSBzYW1lXG4gIGlmICh1dGlsLmlzUHJpbWl0aXZlKGEpIHx8IHV0aWwuaXNQcmltaXRpdmUoYikpIHtcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgfVxuICB2YXIgYUlzQXJncyA9IGlzQXJndW1lbnRzKGEpLFxuICAgICAgYklzQXJncyA9IGlzQXJndW1lbnRzKGIpO1xuICBpZiAoKGFJc0FyZ3MgJiYgIWJJc0FyZ3MpIHx8ICghYUlzQXJncyAmJiBiSXNBcmdzKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChhSXNBcmdzKSB7XG4gICAgYSA9IHBTbGljZS5jYWxsKGEpO1xuICAgIGIgPSBwU2xpY2UuY2FsbChiKTtcbiAgICByZXR1cm4gX2RlZXBFcXVhbChhLCBiKTtcbiAgfVxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpLFxuICAgICAga2IgPSBvYmplY3RLZXlzKGIpLFxuICAgICAga2V5LCBpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzXG4gIC8vIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9IGtiLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vdGhlIHNhbWUgc2V0IG9mIGtleXMgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksXG4gIGthLnNvcnQoKTtcbiAga2Iuc29ydCgpO1xuICAvL35+fmNoZWFwIGtleSB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGthW2ldICE9IGtiW2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcga2V5LCBhbmRcbiAgLy9+fn5wb3NzaWJseSBleHBlbnNpdmUgZGVlcCB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAga2V5ID0ga2FbaV07XG4gICAgaWYgKCFfZGVlcEVxdWFsKGFba2V5XSwgYltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyA4LiBUaGUgbm9uLWVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBmb3IgYW55IGRlZXAgaW5lcXVhbGl0eS5cbi8vIGFzc2VydC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RGVlcEVxdWFsID0gZnVuY3Rpb24gbm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwRXF1YWwnLCBhc3NlcnQubm90RGVlcEVxdWFsKTtcbiAgfVxufTtcblxuLy8gOS4gVGhlIHN0cmljdCBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc3RyaWN0IGVxdWFsaXR5LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbi8vIGFzc2VydC5zdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5zdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIHN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PT0nLCBhc3NlcnQuc3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG4vLyAxMC4gVGhlIHN0cmljdCBub24tZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIGZvciBzdHJpY3QgaW5lcXVhbGl0eSwgYXNcbi8vIGRldGVybWluZWQgYnkgIT09LiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdFN0cmljdEVxdWFsID0gZnVuY3Rpb24gbm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9PScsIGFzc2VydC5ub3RTdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgaWYgKCFhY3R1YWwgfHwgIWV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChleHBlY3RlZCkgPT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQudGVzdChhY3R1YWwpO1xuICB9IGVsc2UgaWYgKGFjdHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWQuY2FsbCh7fSwgYWN0dWFsKSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBfdGhyb3dzKHNob3VsZFRocm93LCBibG9jaywgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGFjdHVhbDtcblxuICBpZiAodXRpbC5pc1N0cmluZyhleHBlY3RlZCkpIHtcbiAgICBtZXNzYWdlID0gZXhwZWN0ZWQ7XG4gICAgZXhwZWN0ZWQgPSBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBibG9jaygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgYWN0dWFsID0gZTtcbiAgfVxuXG4gIG1lc3NhZ2UgPSAoZXhwZWN0ZWQgJiYgZXhwZWN0ZWQubmFtZSA/ICcgKCcgKyBleHBlY3RlZC5uYW1lICsgJykuJyA6ICcuJykgK1xuICAgICAgICAgICAgKG1lc3NhZ2UgPyAnICcgKyBtZXNzYWdlIDogJy4nKTtcblxuICBpZiAoc2hvdWxkVGhyb3cgJiYgIWFjdHVhbCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ01pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgaWYgKCFzaG91bGRUaHJvdyAmJiBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ0dvdCB1bndhbnRlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICBpZiAoKHNob3VsZFRocm93ICYmIGFjdHVhbCAmJiBleHBlY3RlZCAmJlxuICAgICAgIWV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fCAoIXNob3VsZFRocm93ICYmIGFjdHVhbCkpIHtcbiAgICB0aHJvdyBhY3R1YWw7XG4gIH1cbn1cblxuLy8gMTEuIEV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yOlxuLy8gYXNzZXJ0LnRocm93cyhibG9jaywgRXJyb3Jfb3B0LCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC50aHJvd3MgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cy5hcHBseSh0aGlzLCBbdHJ1ZV0uY29uY2F0KHBTbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbn07XG5cbi8vIEVYVEVOU0lPTiEgVGhpcyBpcyBhbm5veWluZyB0byB3cml0ZSBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3MuYXBwbHkodGhpcywgW2ZhbHNlXS5jb25jYXQocFNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xufTtcblxuYXNzZXJ0LmlmRXJyb3IgPSBmdW5jdGlvbihlcnIpIHsgaWYgKGVycikge3Rocm93IGVycjt9fTtcblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn07XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgYXR0YWNoLXdhcmVcbiAqIEBmaWxlb3ZlcnZpZXcgTWlkZGxld2FyZSB3aXRoIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhhbXBsZVxuICogICB2YXIgd2FyZSA9IHJlcXVpcmUoJ2F0dGFjaC13YXJlJykocmVxdWlyZSgnd2FyZScpKTtcbiAqXG4gKiAgIHZhciBtaWRkbGV3YXJlID0gd2FyZSgpXG4gKiAgICAgLnVzZShmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykge1xuICogICAgICAgICBpZiAoIW9wdGlvbnMuY29uZGl0aW9uKSByZXR1cm47XG4gKlxuICogICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7XG4gKiAgICAgICAgICAgcmVzLnggPSAnaGVsbG8nO1xuICogICAgICAgICAgIG5leHQoKTtcbiAqICAgICAgICAgfTtcbiAqICAgICB9LCB7XG4gKiAgICAgICAgICdjb25kaXRpb24nOiB0cnVlXG4gKiAgICAgfSlcbiAqICAgICAudXNlKGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7XG4gKiAgICAgICAgIGlmICghb3B0aW9ucy5jb25kaXRpb24pIHJldHVybjtcbiAqXG4gKiAgICAgICAgIHJldHVybiBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbiAqICAgICAgICAgICByZXMueSA9ICd3b3JsZCc7XG4gKiAgICAgICAgICAgbmV4dCgpO1xuICogICAgICAgICB9O1xuICogICAgIH0sIHtcbiAqICAgICAgICAgJ2NvbmRpdGlvbic6IGZhbHNlXG4gKiAgICAgfSk7XG4gKlxuICogICBtaWRkbGV3YXJlLnJ1bih7fSwge30sIGZ1bmN0aW9uIChlcnIsIHJlcSwgcmVzKSB7XG4gKiAgICAgcmVzLng7IC8vIFwiaGVsbG9cIlxuICogICAgIHJlcy55OyAvLyB1bmRlZmluZWRcbiAqICAgfSk7XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzICovXG5cbnZhciBzbGljZSA9IFtdLnNsaWNlO1xudmFyIHVuaGVyaXQgPSByZXF1aXJlKCd1bmhlcml0Jyk7XG5cbi8qKlxuICogQ2xvbmUgYFdhcmVgIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBzdXBlci1jbGFzcyBhbmRcbiAqIHR1cm4gaXQgaW50byBjb25maWd1cmFibGUgbWlkZGxld2FyZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBXYXJlIC0gV2FyZS1saWtlIGNvbnN0cnVjdG9yLlxuICogQHJldHVybiB7RnVuY3Rpb259IEF0dGFjaFdhcmUgLSBDb25maWd1cmFibGUgbWlkZGxld2FyZS5cbiAqL1xuZnVuY3Rpb24gcGF0Y2goV2FyZSkge1xuICAgIC8qXG4gICAgICogTWV0aG9kcy5cbiAgICAgKi9cblxuICAgIHZhciB1c2VGbiA9IFdhcmUucHJvdG90eXBlLnVzZTtcblxuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBjbGFzcyB7QXR0YWNoV2FyZX1cbiAgICAgKi9cbiAgICB2YXIgQXR0YWNoV2FyZSA9IHVuaGVyaXQoV2FyZSk7XG5cbiAgICBBdHRhY2hXYXJlLnByb3RvdHlwZS5mb28gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQXR0YWNoIGNvbmZpZ3VyYWJsZSBtaWRkbGV3YXJlLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIHtBdHRhY2hXYXJlfVxuICAgICAqIEB0aGlzIHtBdHRhY2hXYXJlfVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGF0dGFjaCAtIEF0dGFjaGVyLlxuICAgICAqIEByZXR1cm4ge0F0dGFjaFdhcmV9IC0gYHRoaXNgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVzZShhdHRhY2gpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgcGFyYW1zID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICB2YXIgaW5kZXg7XG4gICAgICAgIHZhciBsZW5ndGg7XG4gICAgICAgIHZhciBmbjtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBBY2NlcHQgb3RoZXIgYEF0dGFjaFdhcmVgLlxuICAgICAgICAgKi9cblxuICAgICAgICBpZiAoYXR0YWNoIGluc3RhbmNlb2YgQXR0YWNoV2FyZSkge1xuICAgICAgICAgICAgaWYgKGF0dGFjaC5hdHRhY2hlcnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi51c2UoYXR0YWNoLmF0dGFjaGVycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogQWNjZXB0IG5vcm1hbCB3YXJlLlxuICAgICAgICAgKi9cblxuICAgICAgICBpZiAoYXR0YWNoIGluc3RhbmNlb2YgV2FyZSkge1xuICAgICAgICAgICAgc2VsZi5mbnMgPSBzZWxmLmZucy5jb25jYXQoYXR0YWNoLmZucyk7XG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIE11bHRpcGxlIGF0dGFjaGVycy5cbiAgICAgICAgICovXG5cbiAgICAgICAgaWYgKCdsZW5ndGgnIGluIGF0dGFjaCAmJiB0eXBlb2YgYXR0YWNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgbGVuZ3RoID0gYXR0YWNoLmxlbmd0aDtcblxuICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnVzZS5hcHBseShzZWxmLCBbYXR0YWNoW2luZGV4XV0uY29uY2F0KHBhcmFtcykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFNpbmdsZSBhdHRhY2hlci5cbiAgICAgICAgICovXG5cbiAgICAgICAgZm4gPSBhdHRhY2guYXBwbHkobnVsbCwgW3NlbGYuY29udGV4dCB8fCBzZWxmXS5jb25jYXQocGFyYW1zKSk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogU3RvcmUgdGhlIGF0dGFjaGVyIHRvIG5vdCBicmVhayBgbmV3IFdhcmUob3RoZXJXYXJlKWBcbiAgICAgICAgICogZnVuY3Rpb25hbGl0eS5cbiAgICAgICAgICovXG5cbiAgICAgICAgaWYgKCFzZWxmLmF0dGFjaGVycykge1xuICAgICAgICAgICAgc2VsZi5hdHRhY2hlcnMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuYXR0YWNoZXJzLnB1c2goYXR0YWNoKTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBQYXNzIGBmbmAgdG8gdGhlIG9yaWdpbmFsIGBXYXJlI3VzZSgpYC5cbiAgICAgICAgICovXG5cbiAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgICB1c2VGbi5jYWxsKHNlbGYsIGZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIEF0dGFjaFdhcmUucHJvdG90eXBlLnVzZSA9IHVzZTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBdHRhY2hXYXJlKGZuKTtcbiAgICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoO1xuIiwiLyoqXG4gKiBAYXV0aG9yIFRpdHVzIFdvcm1lclxuICogQGNvcHlyaWdodCAyMDE1IFRpdHVzIFdvcm1lci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBtb2R1bGUgYmFpbFxuICogQGZpbGVvdmVydmlldyBUaHJvdyBhIGdpdmVuIGVycm9yLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBUaHJvdyBhIGdpdmVuIGVycm9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGJhaWwoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogICBiYWlsKG5ldyBFcnJvcignZmFpbHVyZScpKTtcbiAqICAgLy8gRXJyb3I6IGZhaWx1cmVcbiAqICAgLy8gICAgIGF0IHJlcGw6MTo2XG4gKiAgIC8vICAgICBhdCBSRVBMU2VydmVyLmRlZmF1bHRFdmFsIChyZXBsLmpzOjE1NDoyNylcbiAqICAgLy8gICAgIC4uLlxuICpcbiAqIEBwYXJhbSB7RXJyb3I/fSBbZXJyXSAtIE9wdGlvbmFsIGVycm9yLlxuICogQHRocm93cyB7RXJyb3J9IC0gYGVycmAsIHdoZW4gZ2l2ZW4uXG4gKi9cbmZ1bmN0aW9uIGJhaWwoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufVxuXG4vKlxuICogRXhwb3NlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gYmFpbDtcbiIsIm1vZHVsZS5leHBvcnRzID0gYmFsYW5jZWQ7XG5mdW5jdGlvbiBiYWxhbmNlZChhLCBiLCBzdHIpIHtcbiAgdmFyIHIgPSByYW5nZShhLCBiLCBzdHIpO1xuXG4gIHJldHVybiByICYmIHtcbiAgICBzdGFydDogclswXSxcbiAgICBlbmQ6IHJbMV0sXG4gICAgcHJlOiBzdHIuc2xpY2UoMCwgclswXSksXG4gICAgYm9keTogc3RyLnNsaWNlKHJbMF0gKyBhLmxlbmd0aCwgclsxXSksXG4gICAgcG9zdDogc3RyLnNsaWNlKHJbMV0gKyBiLmxlbmd0aClcbiAgfTtcbn1cblxuYmFsYW5jZWQucmFuZ2UgPSByYW5nZTtcbmZ1bmN0aW9uIHJhbmdlKGEsIGIsIHN0cikge1xuICB2YXIgYmVncywgYmVnLCBsZWZ0LCByaWdodCwgcmVzdWx0O1xuICB2YXIgYWkgPSBzdHIuaW5kZXhPZihhKTtcbiAgdmFyIGJpID0gc3RyLmluZGV4T2YoYiwgYWkgKyAxKTtcbiAgdmFyIGkgPSBhaTtcblxuICBpZiAoYWkgPj0gMCAmJiBiaSA+IDApIHtcbiAgICBiZWdzID0gW107XG4gICAgbGVmdCA9IHN0ci5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaSA8IHN0ci5sZW5ndGggJiYgaSA+PSAwICYmICEgcmVzdWx0KSB7XG4gICAgICBpZiAoaSA9PSBhaSkge1xuICAgICAgICBiZWdzLnB1c2goaSk7XG4gICAgICAgIGFpID0gc3RyLmluZGV4T2YoYSwgaSArIDEpO1xuICAgICAgfSBlbHNlIGlmIChiZWdzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIHJlc3VsdCA9IFsgYmVncy5wb3AoKSwgYmkgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJlZyA9IGJlZ3MucG9wKCk7XG4gICAgICAgIGlmIChiZWcgPCBsZWZ0KSB7XG4gICAgICAgICAgbGVmdCA9IGJlZztcbiAgICAgICAgICByaWdodCA9IGJpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmkgPSBzdHIuaW5kZXhPZihiLCBpICsgMSk7XG4gICAgICB9XG5cbiAgICAgIGkgPSBhaSA8IGJpICYmIGFpID49IDAgPyBhaSA6IGJpO1xuICAgIH1cblxuICAgIGlmIChiZWdzLmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gWyBsZWZ0LCByaWdodCBdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJ2YXIgYmFzaF9jb2RlcyA9IGV4cG9ydHMuYmFzaF9jb2RlcyA9IHtcblx0XCJCTEFDS1wiIDoge1xuXHRcdFwidGV4dFwiIDogXCJcXDAzM1swOzMwbVwiLFxuXHRcdFwidW5kZXJsaW5lXCI6IFwiXFwwMzNbNDszMG1cIixcblx0XHRcImJhY2tncm91bmRcIjogXCJcXDAzM1s0MG1cIixcblx0XHRcImJvbGRcIjpcIlxcMDMzWzE7MzBtXCIsXG5cdFx0XCJoaV90ZXh0XCI6XCJcXDAzM1swOzkwbVwiLFxuXHRcdFwiaGlfYm9sZFwiIDogXCJcXDAzM1sxOzkwbVwiLFxuXHRcdFwiaGlfYmFja2dyb3VuZFwiIDogXCJcXDAzM1swOzEwMG1cIlxuXHR9LFxuXHRcIlJFRFwiIDoge1xuXHRcdFwidGV4dFwiIDogXCJcXDAzM1swOzMxbVwiLFxuXHRcdFwiYm9sZFwiOlwiXFwwMzNbMTszMW1cIixcblx0XHRcInVuZGVybGluZVwiOiBcIlxcMDMzWzQ7MzFtXCIsXG5cdFx0XCJiYWNrZ3JvdW5kXCI6IFwiXFwwMzNbNDFtXCIsXG5cdFx0XCJoaV90ZXh0XCI6XCJcXDAzM1swOzkxbVwiLFxuXHRcdFwiaGlfYm9sZFwiIDogXCJcXDAzM1sxOzkxbVwiLFxuXHRcdFwiaGlfYmFja2dyb3VuZFwiIDogXCJcXDAzM1swOzEwMW1cIlxuXHR9LFxuXHRcIkdSRUVOXCIgOiB7XG5cdFx0XCJ0ZXh0XCIgOiBcIlxcMDMzWzA7MzJtXCIsXG5cdFx0XCJib2xkXCI6XCJcXDAzM1sxOzMybVwiLFxuXHRcdFwidW5kZXJsaW5lXCI6IFwiXFwwMzNbNDszMm1cIixcblx0XHRcImJhY2tncm91bmRcIjogXCJcXDAzM1s0Mm1cIixcblx0XHRcImhpX3RleHRcIjpcIlxcMDMzWzA7OTJtXCIsXG5cdFx0XCJoaV9ib2xkXCIgOiBcIlxcMDMzWzE7OTJtXCIsXG5cdFx0XCJoaV9iYWNrZ3JvdW5kXCIgOiBcIlxcMDMzWzA7MTAybVwiXG5cdH0sXG5cdFwiWUVMTE9XXCIgOiB7XG5cdFx0XCJ0ZXh0XCIgOiBcIlxcMDMzWzA7MzNtXCIsXG5cdFx0XCJib2xkXCI6XCJcXDAzM1sxOzMzbVwiLFxuXHRcdFwidW5kZXJsaW5lXCI6IFwiXFwwMzNbNDszM21cIixcblx0XHRcImJhY2tncm91bmRcIjogXCJcXDAzM1s0M21cIixcblx0XHRcImhpX3RleHRcIjpcIlxcMDMzWzA7OTNtXCIsXG5cdFx0XCJoaV9ib2xkXCIgOiBcIlxcMDMzWzE7OTNtXCIsXG5cdFx0XCJoaV9iYWNrZ3JvdW5kXCIgOiBcIlxcMDMzWzA7MTAzbVwiXG5cdH0sXG5cdFwiQkxVRVwiIDoge1xuXHRcdFwidGV4dFwiIDogXCJcXDAzM1swOzM0bVwiLFxuXHRcdFwiYm9sZFwiOlwiXFwwMzNbMTszNG1cIixcblx0XHRcInVuZGVybGluZVwiOiBcIlxcMDMzWzQ7MzRtXCIsXG5cdFx0XCJiYWNrZ3JvdW5kXCI6IFwiXFwwMzNbNDRtXCIsXG5cdFx0XCJoaV90ZXh0XCI6XCJcXDAzM1swOzk0bVwiLFxuXHRcdFwiaGlfYm9sZFwiIDogXCJcXDAzM1sxOzk0bVwiLFxuXHRcdFwiaGlfYmFja2dyb3VuZFwiIDogXCJcXDAzM1swOzEwNG1cIlxuXHR9LFxuXHRcIlBVUlBMRVwiIDoge1xuXHRcdFwidGV4dFwiIDogXCJcXDAzM1swOzM1bVwiLFxuXHRcdFwiYm9sZFwiOlwiXFwwMzNbMTszNW1cIixcblx0XHRcInVuZGVybGluZVwiOiBcIlxcMDMzWzQ7MzVtXCIsXG5cdFx0XCJiYWNrZ3JvdW5kXCI6IFwiXFwwMzNbNDVtXCIsXG5cdFx0XCJoaV90ZXh0XCI6XCJcXDAzM1swOzk1bVwiLFxuXHRcdFwiaGlfYm9sZFwiIDogXCJcXDAzM1sxOzk1bVwiLFxuXHRcdFwiaGlfYmFja2dyb3VuZFwiIDogXCJcXDAzM1swOzEwNW1cIlxuXHR9LFxuXHRcIkNZQU5cIiA6IHtcblx0XHRcInRleHRcIiA6IFwiXFwwMzNbMDszNm1cIixcblx0XHRcImJvbGRcIjpcIlxcMDMzWzE7MzZtXCIsXG5cdFx0XCJ1bmRlcmxpbmVcIjogXCJcXDAzM1s0OzM2bVwiLFxuXHRcdFwiYmFja2dyb3VuZFwiOiBcIlxcMDMzWzQ2bVwiLFxuXHRcdFwiaGlfdGV4dFwiOlwiXFwwMzNbMDs5Nm1cIixcblx0XHRcImhpX2JvbGRcIiA6IFwiXFwwMzNbMTs5Nm1cIixcblx0XHRcImhpX2JhY2tncm91bmRcIiA6IFwiXFwwMzNbMDsxMDZtXCJcblx0fSxcblx0XCJXSElURVwiIDoge1xuXHRcdFwidGV4dFwiIDogXCJcXDAzM1swOzM3bVwiLFxuXHRcdFwiYm9sZFwiOlwiXFwwMzNbMTszN21cIixcblx0XHRcInVuZGVybGluZVwiOiBcIlxcMDMzWzQ7MzdtXCIsXG5cdFx0XCJiYWNrZ3JvdW5kXCI6IFwiXFwwMzNbNDdtXCIsXG5cdFx0XCJoaV90ZXh0XCI6XCJcXDAzM1swOzk3bVwiLFxuXHRcdFwiaGlfYm9sZFwiIDogXCJcXDAzM1sxOzk3bVwiLFxuXHRcdFwiaGlfYmFja2dyb3VuZFwiIDogXCJcXDAzM1swOzEwN21cIlxuXHR9XG59O1xuXG5leHBvcnRzLmNvbG9ycyA9IHtcblx0QkxBQ0s6IFwiQkxBQ0tcIixcblx0UkVEOiBcIlJFRFwiLFxuXHRHUkVFTjogXCJHUkVFTlwiLFxuXHRZRUxMT1c6IFwiWUVMTE9XXCIsXG5cdEJMVUU6IFwiQkxVRVwiLFxuXHRQVVJQTEU6IFwiUFVSUExFXCIsXG5cdENZQU46IFwiQ1lBTlwiLFxuXHRXSElURTogXCJXSElURVwiXG59O1xuXG52YXIgc3R5bGVzID0gZXhwb3J0cy5zdHlsZXMgPSB7XG5cdGJvbGQ6IFwiYm9sZFwiLFxuXHR1bmRlcmxpbmU6IFwidW5kZXJsaW5lXCIsXG5cdGJhY2tncm91bmQ6IFwiYmFja2dyb3VuZFwiLFxuXHRoaV90ZXh0OiBcImhpX3RleHRcIixcblx0aGlfYm9sZDogXCJoaV9ib2xkXCIsXG5cdGhpX2JhY2tncm91bmQ6IFwiaGlfYmFja2dyb3VuZFwiXG59O1xuXG52YXIgUkVNT1ZFX0NPTE9SID0gZXhwb3J0cy5SRU1PVkVfQ09MT1IgPSBcIlxcMDMzWzBtXCI7XG5cblxuLy8gdmFyaW91cyBsb2dpY2FsIGluY29uc2lzdGVuY2llcyBpbiB0aGUgY29kZSBiZWxvdyAtIHJlbmRlckNvbG9yIGFuZCB3cmFwIHNlZW0gbGlrZSB0aGV5IHNob3VsZCBiZSBjb21iaW5lZCwgYnV0IEknbSBsZXR0aW5nIHdyYXAgYmFzaWNhbGx5IHN0YW5kIG9uIGl0cyBvd25cbi8vIGluIGNhc2UgYW55b25lIHdhbnRzIGFjY2VzcyB0byBleHBsaWNpdGx5IGhhbmRsZSBiYWNrZ3JvdW5kIG9yIHVuZGVybGluZSBzdHVmZi4gSSBmZWVsIGxpa2UgdGhvc2UgYXJlIGEgYml0IG1vcmUgc3BlY2lhbC1jYXNleSwgYW5kIGdlbmVyYWxseSBzcGVha2lnblxuLy8gdXNlcnMgYXJlIGdvaW5nIHRvIHdhbnQgdG8gcXVpY2tseSB0dXJuIGEgd29yZCBvciBwaHJhc2UgaW50byBhIHNpbmdsZSBjb2xvciB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGJhY2tncm91bmQgb3IgdW5kZXJsaW5lLiBTbyB0aGUgLmNvbG9yTmFtZSBtZXRob2RzXG4vLyBhcmUganVzdCBzeW50YWN0aWMgc3VnYXIuXG5leHBvcnRzLndyYXAgPSBmdW5jdGlvbihzdHIsIGNvbG9yLCBzdHlsZSkge1xuXHR2YXIgYyA9IGJhc2hfY29kZXNbY29sb3IudG9VcHBlckNhc2UoKV07XG5cdHZhciBzID0gc3R5bGVzW3N0eWxlXSB8fCBcInRleHRcIjtcblx0XG5cdHJldHVybiByZW5kZXIoY1tzXSwgc3RyKTtcbn07XG5cbmV4cG9ydHMuYmxhY2sgPSBmdW5jdGlvbihzdHIsIGhpKSB7XG5cdHJldHVybiByZW5kZXJDb2xvcihzdHIsIGJhc2hfY29kZXMuQkxBQ0ssIGhpKTtcbn07XG5cbmV4cG9ydHMucmVkID0gZnVuY3Rpb24oc3RyLCBoaSkge1xuXHRyZXR1cm4gcmVuZGVyQ29sb3Ioc3RyLCBiYXNoX2NvZGVzLlJFRCwgaGkpO1xufTtcblxuZXhwb3J0cy5ncmVlbiA9IGZ1bmN0aW9uKHN0ciwgaGkpIHtcblx0cmV0dXJuIHJlbmRlckNvbG9yKHN0ciwgYmFzaF9jb2Rlcy5HUkVFTiwgaGkpO1xufTtcblxuZXhwb3J0cy55ZWxsb3cgPSBmdW5jdGlvbihzdHIsIGhpKSB7XG5cdHJldHVybiByZW5kZXJDb2xvcihzdHIsIGJhc2hfY29kZXMuWUVMTE9XLCBoaSk7XG59O1xuXG5leHBvcnRzLmJsdWUgPSBmdW5jdGlvbihzdHIsIGhpKSB7XG5cdHJldHVybiByZW5kZXJDb2xvcihzdHIsIGJhc2hfY29kZXMuQkxVRSwgaGkpO1xufTtcblxuZXhwb3J0cy5wdXJwbGUgPSBmdW5jdGlvbihzdHIsIGhpKSB7XG5cdHJldHVybiByZW5kZXJDb2xvcihzdHIsIGJhc2hfY29kZXMuUFVSUExFLCBoaSk7XG59O1xuXG5leHBvcnRzLmN5YW4gPSBmdW5jdGlvbihzdHIsIGhpKSB7XG5cdHJldHVybiByZW5kZXJDb2xvcihzdHIsIGJhc2hfY29kZXMuQ1lBTiwgaGkpO1xufTtcblxuZXhwb3J0cy53aGl0ZSA9IGZ1bmN0aW9uKHN0ciwgaGkpIHtcblx0cmV0dXJuIHJlbmRlckNvbG9yKHN0ciwgYmFzaF9jb2Rlcy5XSElURSwgaGkpO1xufTtcblxuXG5mdW5jdGlvbiByZW5kZXJDb2xvcihzdHIsIGNvbG9yLCBoaSkge1xuXHRyZXR1cm4gcmVuZGVyKGhpID8gY29sb3IuaGlfdGV4dCA6IGNvbG9yLnRleHQsIHN0cik7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcihjb2RlLCBzdHIpIHtcblx0cmV0dXJuIGNvZGUgKyBzdHIgKyBSRU1PVkVfQ09MT1I7XG59IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihoYXlzdGFjaywgbmVlZGxlLCBjb21wYXJhdG9yLCBsb3csIGhpZ2gpIHtcbiAgdmFyIG1pZCwgY21wO1xuXG4gIGlmKGxvdyA9PT0gdW5kZWZpbmVkKVxuICAgIGxvdyA9IDA7XG5cbiAgZWxzZSB7XG4gICAgbG93ID0gbG93fDA7XG4gICAgaWYobG93IDwgMCB8fCBsb3cgPj0gaGF5c3RhY2subGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJpbnZhbGlkIGxvd2VyIGJvdW5kXCIpO1xuICB9XG5cbiAgaWYoaGlnaCA9PT0gdW5kZWZpbmVkKVxuICAgIGhpZ2ggPSBoYXlzdGFjay5sZW5ndGggLSAxO1xuXG4gIGVsc2Uge1xuICAgIGhpZ2ggPSBoaWdofDA7XG4gICAgaWYoaGlnaCA8IGxvdyB8fCBoaWdoID49IGhheXN0YWNrLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiaW52YWxpZCB1cHBlciBib3VuZFwiKTtcbiAgfVxuXG4gIHdoaWxlKGxvdyA8PSBoaWdoKSB7XG4gICAgLyogTm90ZSB0aGF0IFwiKGxvdyArIGhpZ2gpID4+PiAxXCIgbWF5IG92ZXJmbG93LCBhbmQgcmVzdWx0cyBpbiBhIHR5cGVjYXN0XG4gICAgICogdG8gZG91YmxlICh3aGljaCBnaXZlcyB0aGUgd3JvbmcgcmVzdWx0cykuICovXG4gICAgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cgPj4gMSk7XG4gICAgY21wID0gK2NvbXBhcmF0b3IoaGF5c3RhY2tbbWlkXSwgbmVlZGxlKTtcblxuICAgIC8qIFRvbyBsb3cuICovXG4gICAgaWYoY21wIDwgMC4wKSBcbiAgICAgIGxvdyAgPSBtaWQgKyAxO1xuXG4gICAgLyogVG9vIGhpZ2guICovXG4gICAgZWxzZSBpZihjbXAgPiAwLjApXG4gICAgICBoaWdoID0gbWlkIC0gMTtcbiAgICBcbiAgICAvKiBLZXkgZm91bmQuICovXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIG1pZDtcbiAgfVxuXG4gIC8qIEtleSBub3QgZm91bmQuICovXG4gIHJldHVybiB+bG93O1xufVxuIiwiXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKVxuICAsIHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAgLCBqb2luID0gcGF0aC5qb2luXG4gICwgZGlybmFtZSA9IHBhdGguZGlybmFtZVxuICAsIGV4aXN0cyA9IGZzLmV4aXN0c1N5bmMgfHwgcGF0aC5leGlzdHNTeW5jXG4gICwgZGVmYXVsdHMgPSB7XG4gICAgICAgIGFycm93OiBwcm9jZXNzLmVudi5OT0RFX0JJTkRJTkdTX0FSUk9XIHx8ICcg4oaSICdcbiAgICAgICwgY29tcGlsZWQ6IHByb2Nlc3MuZW52Lk5PREVfQklORElOR1NfQ09NUElMRURfRElSIHx8ICdjb21waWxlZCdcbiAgICAgICwgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm1cbiAgICAgICwgYXJjaDogcHJvY2Vzcy5hcmNoXG4gICAgICAsIHZlcnNpb246IHByb2Nlc3MudmVyc2lvbnMubm9kZVxuICAgICAgLCBiaW5kaW5nczogJ2JpbmRpbmdzLm5vZGUnXG4gICAgICAsIHRyeTogW1xuICAgICAgICAgIC8vIG5vZGUtZ3lwJ3MgbGlua2VkIHZlcnNpb24gaW4gdGhlIFwiYnVpbGRcIiBkaXJcbiAgICAgICAgICBbICdtb2R1bGVfcm9vdCcsICdidWlsZCcsICdiaW5kaW5ncycgXVxuICAgICAgICAgIC8vIG5vZGUtd2FmIGFuZCBneXBfYWRkb24gKGEuay5hIG5vZGUtZ3lwKVxuICAgICAgICAsIFsgJ21vZHVsZV9yb290JywgJ2J1aWxkJywgJ0RlYnVnJywgJ2JpbmRpbmdzJyBdXG4gICAgICAgICwgWyAnbW9kdWxlX3Jvb3QnLCAnYnVpbGQnLCAnUmVsZWFzZScsICdiaW5kaW5ncycgXVxuICAgICAgICAgIC8vIERlYnVnIGZpbGVzLCBmb3IgZGV2ZWxvcG1lbnQgKGxlZ2FjeSBiZWhhdmlvciwgcmVtb3ZlIGZvciBub2RlIHYwLjkpXG4gICAgICAgICwgWyAnbW9kdWxlX3Jvb3QnLCAnb3V0JywgJ0RlYnVnJywgJ2JpbmRpbmdzJyBdXG4gICAgICAgICwgWyAnbW9kdWxlX3Jvb3QnLCAnRGVidWcnLCAnYmluZGluZ3MnIF1cbiAgICAgICAgICAvLyBSZWxlYXNlIGZpbGVzLCBidXQgbWFudWFsbHkgY29tcGlsZWQgKGxlZ2FjeSBiZWhhdmlvciwgcmVtb3ZlIGZvciBub2RlIHYwLjkpXG4gICAgICAgICwgWyAnbW9kdWxlX3Jvb3QnLCAnb3V0JywgJ1JlbGVhc2UnLCAnYmluZGluZ3MnIF1cbiAgICAgICAgLCBbICdtb2R1bGVfcm9vdCcsICdSZWxlYXNlJywgJ2JpbmRpbmdzJyBdXG4gICAgICAgICAgLy8gTGVnYWN5IGZyb20gbm9kZS13YWYsIG5vZGUgPD0gMC40LnhcbiAgICAgICAgLCBbICdtb2R1bGVfcm9vdCcsICdidWlsZCcsICdkZWZhdWx0JywgJ2JpbmRpbmdzJyBdXG4gICAgICAgICAgLy8gUHJvZHVjdGlvbiBcIlJlbGVhc2VcIiBidWlsZHR5cGUgYmluYXJ5IChtZWguLi4pXG4gICAgICAgICwgWyAnbW9kdWxlX3Jvb3QnLCAnY29tcGlsZWQnLCAndmVyc2lvbicsICdwbGF0Zm9ybScsICdhcmNoJywgJ2JpbmRpbmdzJyBdXG4gICAgICAgIF1cbiAgICB9XG5cbi8qKlxuICogVGhlIG1haW4gYGJpbmRpbmdzKClgIGZ1bmN0aW9uIGxvYWRzIHRoZSBjb21waWxlZCBiaW5kaW5ncyBmb3IgYSBnaXZlbiBtb2R1bGUuXG4gKiBJdCB1c2VzIFY4J3MgRXJyb3IgQVBJIHRvIGRldGVybWluZSB0aGUgcGFyZW50IGZpbGVuYW1lIHRoYXQgdGhpcyBmdW5jdGlvbiBpc1xuICogYmVpbmcgaW52b2tlZCBmcm9tLCB3aGljaCBpcyB0aGVuIHVzZWQgdG8gZmluZCB0aGUgcm9vdCBkaXJlY3RvcnkuXG4gKi9cblxuZnVuY3Rpb24gYmluZGluZ3MgKG9wdHMpIHtcblxuICAvLyBBcmd1bWVudCBzdXJnZXJ5XG4gIGlmICh0eXBlb2Ygb3B0cyA9PSAnc3RyaW5nJykge1xuICAgIG9wdHMgPSB7IGJpbmRpbmdzOiBvcHRzIH1cbiAgfSBlbHNlIGlmICghb3B0cykge1xuICAgIG9wdHMgPSB7fVxuICB9XG4gIG9wdHMuX19wcm90b19fID0gZGVmYXVsdHNcblxuICAvLyBHZXQgdGhlIG1vZHVsZSByb290XG4gIGlmICghb3B0cy5tb2R1bGVfcm9vdCkge1xuICAgIG9wdHMubW9kdWxlX3Jvb3QgPSBleHBvcnRzLmdldFJvb3QoZXhwb3J0cy5nZXRGaWxlTmFtZSgpKVxuICB9XG5cbiAgLy8gRW5zdXJlIHRoZSBnaXZlbiBiaW5kaW5ncyBuYW1lIGVuZHMgd2l0aCAubm9kZVxuICBpZiAocGF0aC5leHRuYW1lKG9wdHMuYmluZGluZ3MpICE9ICcubm9kZScpIHtcbiAgICBvcHRzLmJpbmRpbmdzICs9ICcubm9kZSdcbiAgfVxuXG4gIHZhciB0cmllcyA9IFtdXG4gICAgLCBpID0gMFxuICAgICwgbCA9IG9wdHMudHJ5Lmxlbmd0aFxuICAgICwgblxuICAgICwgYlxuICAgICwgZXJyXG5cbiAgZm9yICg7IGk8bDsgaSsrKSB7XG4gICAgbiA9IGpvaW4uYXBwbHkobnVsbCwgb3B0cy50cnlbaV0ubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICByZXR1cm4gb3B0c1twXSB8fCBwXG4gICAgfSkpXG4gICAgdHJpZXMucHVzaChuKVxuICAgIHRyeSB7XG4gICAgICBiID0gb3B0cy5wYXRoID8gcmVxdWlyZS5yZXNvbHZlKG4pIDogcmVxdWlyZShuKVxuICAgICAgaWYgKCFvcHRzLnBhdGgpIHtcbiAgICAgICAgYi5wYXRoID0gblxuICAgICAgfVxuICAgICAgcmV0dXJuIGJcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIS9ub3QgZmluZC9pLnRlc3QoZS5tZXNzYWdlKSkge1xuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXJyID0gbmV3IEVycm9yKCdDb3VsZCBub3QgbG9jYXRlIHRoZSBiaW5kaW5ncyBmaWxlLiBUcmllZDpcXG4nXG4gICAgKyB0cmllcy5tYXAoZnVuY3Rpb24gKGEpIHsgcmV0dXJuIG9wdHMuYXJyb3cgKyBhIH0pLmpvaW4oJ1xcbicpKVxuICBlcnIudHJpZXMgPSB0cmllc1xuICB0aHJvdyBlcnJcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGJpbmRpbmdzXG5cblxuLyoqXG4gKiBHZXRzIHRoZSBmaWxlbmFtZSBvZiB0aGUgSmF2YVNjcmlwdCBmaWxlIHRoYXQgaW52b2tlcyB0aGlzIGZ1bmN0aW9uLlxuICogVXNlZCB0byBoZWxwIGZpbmQgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIGEgbW9kdWxlLlxuICogT3B0aW9uYWxseSBhY2NlcHRzIGFuIGZpbGVuYW1lIGFyZ3VtZW50IHRvIHNraXAgd2hlbiBzZWFyY2hpbmcgZm9yIHRoZSBpbnZva2luZyBmaWxlbmFtZVxuICovXG5cbmV4cG9ydHMuZ2V0RmlsZU5hbWUgPSBmdW5jdGlvbiBnZXRGaWxlTmFtZSAoY2FsbGluZ19maWxlKSB7XG4gIHZhciBvcmlnUFNUID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2VcbiAgICAsIG9yaWdTVEwgPSBFcnJvci5zdGFja1RyYWNlTGltaXRcbiAgICAsIGR1bW15ID0ge31cbiAgICAsIGZpbGVOYW1lXG5cbiAgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ID0gMTBcblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IGZ1bmN0aW9uIChlLCBzdCkge1xuICAgIGZvciAodmFyIGk9MCwgbD1zdC5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgICBmaWxlTmFtZSA9IHN0W2ldLmdldEZpbGVOYW1lKClcbiAgICAgIGlmIChmaWxlTmFtZSAhPT0gX19maWxlbmFtZSkge1xuICAgICAgICBpZiAoY2FsbGluZ19maWxlKSB7XG4gICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT09IGNhbGxpbmdfZmlsZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHJ1biB0aGUgJ3ByZXBhcmVTdGFja1RyYWNlJyBmdW5jdGlvbiBhYm92ZVxuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShkdW1teSlcbiAgZHVtbXkuc3RhY2tcblxuICAvLyBjbGVhbnVwXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gb3JpZ1BTVFxuICBFcnJvci5zdGFja1RyYWNlTGltaXQgPSBvcmlnU1RMXG5cbiAgcmV0dXJuIGZpbGVOYW1lXG59XG5cbi8qKlxuICogR2V0cyB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgYSBtb2R1bGUsIGdpdmVuIGFuIGFyYml0cmFyeSBmaWxlbmFtZVxuICogc29tZXdoZXJlIGluIHRoZSBtb2R1bGUgdHJlZS4gVGhlIFwicm9vdCBkaXJlY3RvcnlcIiBpcyB0aGUgZGlyZWN0b3J5XG4gKiBjb250YWluaW5nIHRoZSBgcGFja2FnZS5qc29uYCBmaWxlLlxuICpcbiAqICAgSW46ICAvaG9tZS9uYXRlL25vZGUtbmF0aXZlLW1vZHVsZS9saWIvaW5kZXguanNcbiAqICAgT3V0OiAvaG9tZS9uYXRlL25vZGUtbmF0aXZlLW1vZHVsZVxuICovXG5cbmV4cG9ydHMuZ2V0Um9vdCA9IGZ1bmN0aW9uIGdldFJvb3QgKGZpbGUpIHtcbiAgdmFyIGRpciA9IGRpcm5hbWUoZmlsZSlcbiAgICAsIHByZXZcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZGlyID09PSAnLicpIHtcbiAgICAgIC8vIEF2b2lkcyBhbiBpbmZpbml0ZSBsb29wIGluIHJhcmUgY2FzZXMsIGxpa2UgdGhlIFJFUExcbiAgICAgIGRpciA9IHByb2Nlc3MuY3dkKClcbiAgICB9XG4gICAgaWYgKGV4aXN0cyhqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpKSB8fCBleGlzdHMoam9pbihkaXIsICdub2RlX21vZHVsZXMnKSkpIHtcbiAgICAgIC8vIEZvdW5kIHRoZSAncGFja2FnZS5qc29uJyBmaWxlIG9yICdub2RlX21vZHVsZXMnIGRpcjsgd2UncmUgZG9uZVxuICAgICAgcmV0dXJuIGRpclxuICAgIH1cbiAgICBpZiAocHJldiA9PT0gZGlyKSB7XG4gICAgICAvLyBHb3QgdG8gdGhlIHRvcFxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBtb2R1bGUgcm9vdCBnaXZlbiBmaWxlOiBcIicgKyBmaWxlXG4gICAgICAgICAgICAgICAgICAgICsgJ1wiLiBEbyB5b3UgaGF2ZSBhIGBwYWNrYWdlLmpzb25gIGZpbGU/ICcpXG4gICAgfVxuICAgIC8vIFRyeSB0aGUgcGFyZW50IGRpciBuZXh0XG4gICAgcHJldiA9IGRpclxuICAgIGRpciA9IGpvaW4oZGlyLCAnLi4nKVxuICB9XG59XG4iLCJ2YXIgRHVwbGV4U3RyZWFtID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2R1cGxleCcpXG4gICwgdXRpbCAgICAgICAgID0gcmVxdWlyZSgndXRpbCcpXG5cblxuZnVuY3Rpb24gQnVmZmVyTGlzdCAoY2FsbGJhY2spIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlckxpc3QpKVxuICAgIHJldHVybiBuZXcgQnVmZmVyTGlzdChjYWxsYmFjaylcblxuICB0aGlzLl9idWZzICA9IFtdXG4gIHRoaXMubGVuZ3RoID0gMFxuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2tcblxuICAgIHZhciBwaXBlciA9IGZ1bmN0aW9uIHBpcGVyIChlcnIpIHtcbiAgICAgIGlmICh0aGlzLl9jYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayhlcnIpXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbFxuICAgICAgfVxuICAgIH0uYmluZCh0aGlzKVxuXG4gICAgdGhpcy5vbigncGlwZScsIGZ1bmN0aW9uIG9uUGlwZSAoc3JjKSB7XG4gICAgICBzcmMub24oJ2Vycm9yJywgcGlwZXIpXG4gICAgfSlcbiAgICB0aGlzLm9uKCd1bnBpcGUnLCBmdW5jdGlvbiBvblVucGlwZSAoc3JjKSB7XG4gICAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgcGlwZXIpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFwcGVuZChjYWxsYmFjaylcbiAgfVxuXG4gIER1cGxleFN0cmVhbS5jYWxsKHRoaXMpXG59XG5cblxudXRpbC5pbmhlcml0cyhCdWZmZXJMaXN0LCBEdXBsZXhTdHJlYW0pXG5cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuX29mZnNldCA9IGZ1bmN0aW9uIF9vZmZzZXQgKG9mZnNldCkge1xuICB2YXIgdG90ID0gMCwgaSA9IDAsIF90XG4gIGZvciAoOyBpIDwgdGhpcy5fYnVmcy5sZW5ndGg7IGkrKykge1xuICAgIF90ID0gdG90ICsgdGhpcy5fYnVmc1tpXS5sZW5ndGhcbiAgICBpZiAob2Zmc2V0IDwgX3QpXG4gICAgICByZXR1cm4gWyBpLCBvZmZzZXQgLSB0b3QgXVxuICAgIHRvdCA9IF90XG4gIH1cbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQgKGJ1Zikge1xuICB2YXIgaSA9IDBcbiAgICAsIG5ld0J1ZlxuXG4gIGlmIChBcnJheS5pc0FycmF5KGJ1ZikpIHtcbiAgICBmb3IgKDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKylcbiAgICAgIHRoaXMuYXBwZW5kKGJ1ZltpXSlcbiAgfSBlbHNlIGlmIChidWYgaW5zdGFuY2VvZiBCdWZmZXJMaXN0KSB7XG4gICAgLy8gdW53cmFwIGFyZ3VtZW50IGludG8gaW5kaXZpZHVhbCBCdWZmZXJMaXN0c1xuICAgIGZvciAoOyBpIDwgYnVmLl9idWZzLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5hcHBlbmQoYnVmLl9idWZzW2ldKVxuICB9IGVsc2UgaWYgKGJ1ZiAhPSBudWxsKSB7XG4gICAgLy8gY29lcmNlIG51bWJlciBhcmd1bWVudHMgdG8gc3RyaW5ncywgc2luY2UgQnVmZmVyKG51bWJlcikgZG9lc1xuICAgIC8vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25cbiAgICBpZiAodHlwZW9mIGJ1ZiA9PSAnbnVtYmVyJylcbiAgICAgIGJ1ZiA9IGJ1Zi50b1N0cmluZygpXG5cbiAgICBuZXdCdWYgPSBCdWZmZXIuaXNCdWZmZXIoYnVmKSA/IGJ1ZiA6IG5ldyBCdWZmZXIoYnVmKVxuICAgIHRoaXMuX2J1ZnMucHVzaChuZXdCdWYpXG4gICAgdGhpcy5sZW5ndGggKz0gbmV3QnVmLmxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiBfd3JpdGUgKGJ1ZiwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIHRoaXMuYXBwZW5kKGJ1ZilcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2soKVxufVxuXG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gX3JlYWQgKHNpemUpIHtcbiAgaWYgKCF0aGlzLmxlbmd0aClcbiAgICByZXR1cm4gdGhpcy5wdXNoKG51bGwpXG5cbiAgc2l6ZSA9IE1hdGgubWluKHNpemUsIHRoaXMubGVuZ3RoKVxuICB0aGlzLnB1c2godGhpcy5zbGljZSgwLCBzaXplKSlcbiAgdGhpcy5jb25zdW1lKHNpemUpXG59XG5cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gZW5kIChjaHVuaykge1xuICBEdXBsZXhTdHJlYW0ucHJvdG90eXBlLmVuZC5jYWxsKHRoaXMsIGNodW5rKVxuXG4gIGlmICh0aGlzLl9jYWxsYmFjaykge1xuICAgIHRoaXMuX2NhbGxiYWNrKG51bGwsIHRoaXMuc2xpY2UoKSlcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGxcbiAgfVxufVxuXG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoaW5kZXgpIHtcbiAgcmV0dXJuIHRoaXMuc2xpY2UoaW5kZXgsIGluZGV4ICsgMSlbMF1cbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHJldHVybiB0aGlzLmNvcHkobnVsbCwgMCwgc3RhcnQsIGVuZClcbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAoZHN0LCBkc3RTdGFydCwgc3JjU3RhcnQsIHNyY0VuZCkge1xuICBpZiAodHlwZW9mIHNyY1N0YXJ0ICE9ICdudW1iZXInIHx8IHNyY1N0YXJ0IDwgMClcbiAgICBzcmNTdGFydCA9IDBcbiAgaWYgKHR5cGVvZiBzcmNFbmQgIT0gJ251bWJlcicgfHwgc3JjRW5kID4gdGhpcy5sZW5ndGgpXG4gICAgc3JjRW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHNyY1N0YXJ0ID49IHRoaXMubGVuZ3RoKVxuICAgIHJldHVybiBkc3QgfHwgbmV3IEJ1ZmZlcigwKVxuICBpZiAoc3JjRW5kIDw9IDApXG4gICAgcmV0dXJuIGRzdCB8fCBuZXcgQnVmZmVyKDApXG5cbiAgdmFyIGNvcHkgICA9ICEhZHN0XG4gICAgLCBvZmYgICAgPSB0aGlzLl9vZmZzZXQoc3JjU3RhcnQpXG4gICAgLCBsZW4gICAgPSBzcmNFbmQgLSBzcmNTdGFydFxuICAgICwgYnl0ZXMgID0gbGVuXG4gICAgLCBidWZvZmYgPSAoY29weSAmJiBkc3RTdGFydCkgfHwgMFxuICAgICwgc3RhcnQgID0gb2ZmWzFdXG4gICAgLCBsXG4gICAgLCBpXG5cbiAgLy8gY29weS9zbGljZSBldmVyeXRoaW5nXG4gIGlmIChzcmNTdGFydCA9PT0gMCAmJiBzcmNFbmQgPT0gdGhpcy5sZW5ndGgpIHtcbiAgICBpZiAoIWNvcHkpIC8vIHNsaWNlLCBqdXN0IHJldHVybiBhIGZ1bGwgY29uY2F0XG4gICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdCh0aGlzLl9idWZzKVxuXG4gICAgLy8gY29weSwgbmVlZCB0byBjb3B5IGluZGl2aWR1YWwgYnVmZmVyc1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9idWZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9idWZzW2ldLmNvcHkoZHN0LCBidWZvZmYpXG4gICAgICBidWZvZmYgKz0gdGhpcy5fYnVmc1tpXS5sZW5ndGhcbiAgICB9XG5cbiAgICByZXR1cm4gZHN0XG4gIH1cblxuICAvLyBlYXN5LCBjaGVhcCBjYXNlIHdoZXJlIGl0J3MgYSBzdWJzZXQgb2Ygb25lIG9mIHRoZSBidWZmZXJzXG4gIGlmIChieXRlcyA8PSB0aGlzLl9idWZzW29mZlswXV0ubGVuZ3RoIC0gc3RhcnQpIHtcbiAgICByZXR1cm4gY29weVxuICAgICAgPyB0aGlzLl9idWZzW29mZlswXV0uY29weShkc3QsIGRzdFN0YXJ0LCBzdGFydCwgc3RhcnQgKyBieXRlcylcbiAgICAgIDogdGhpcy5fYnVmc1tvZmZbMF1dLnNsaWNlKHN0YXJ0LCBzdGFydCArIGJ5dGVzKVxuICB9XG5cbiAgaWYgKCFjb3B5KSAvLyBhIHNsaWNlLCB3ZSBuZWVkIHNvbWV0aGluZyB0byBjb3B5IGluIHRvXG4gICAgZHN0ID0gbmV3IEJ1ZmZlcihsZW4pXG5cbiAgZm9yIChpID0gb2ZmWzBdOyBpIDwgdGhpcy5fYnVmcy5sZW5ndGg7IGkrKykge1xuICAgIGwgPSB0aGlzLl9idWZzW2ldLmxlbmd0aCAtIHN0YXJ0XG5cbiAgICBpZiAoYnl0ZXMgPiBsKSB7XG4gICAgICB0aGlzLl9idWZzW2ldLmNvcHkoZHN0LCBidWZvZmYsIHN0YXJ0KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9idWZzW2ldLmNvcHkoZHN0LCBidWZvZmYsIHN0YXJ0LCBzdGFydCArIGJ5dGVzKVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBidWZvZmYgKz0gbFxuICAgIGJ5dGVzIC09IGxcblxuICAgIGlmIChzdGFydClcbiAgICAgIHN0YXJ0ID0gMFxuICB9XG5cbiAgcmV0dXJuIGRzdFxufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdGhpcy5zbGljZShzdGFydCwgZW5kKS50b1N0cmluZyhlbmNvZGluZylcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uIGNvbnN1bWUgKGJ5dGVzKSB7XG4gIHdoaWxlICh0aGlzLl9idWZzLmxlbmd0aCkge1xuICAgIGlmIChieXRlcyA+PSB0aGlzLl9idWZzWzBdLmxlbmd0aCkge1xuICAgICAgYnl0ZXMgLT0gdGhpcy5fYnVmc1swXS5sZW5ndGhcbiAgICAgIHRoaXMubGVuZ3RoIC09IHRoaXMuX2J1ZnNbMF0ubGVuZ3RoXG4gICAgICB0aGlzLl9idWZzLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYnVmc1swXSA9IHRoaXMuX2J1ZnNbMF0uc2xpY2UoYnl0ZXMpXG4gICAgICB0aGlzLmxlbmd0aCAtPSBieXRlc1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5kdXBsaWNhdGUgPSBmdW5jdGlvbiBkdXBsaWNhdGUgKCkge1xuICB2YXIgaSA9IDBcbiAgICAsIGNvcHkgPSBuZXcgQnVmZmVyTGlzdCgpXG5cbiAgZm9yICg7IGkgPCB0aGlzLl9idWZzLmxlbmd0aDsgaSsrKVxuICAgIGNvcHkuYXBwZW5kKHRoaXMuX2J1ZnNbaV0pXG5cbiAgcmV0dXJuIGNvcHlcbn1cblxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKSB7XG4gIHRoaXMuX2J1ZnMubGVuZ3RoID0gMFxuICB0aGlzLmxlbmd0aCA9IDBcbiAgdGhpcy5wdXNoKG51bGwpXG59XG5cblxuOyhmdW5jdGlvbiAoKSB7XG4gIHZhciBtZXRob2RzID0ge1xuICAgICAgJ3JlYWREb3VibGVCRScgOiA4XG4gICAgLCAncmVhZERvdWJsZUxFJyA6IDhcbiAgICAsICdyZWFkRmxvYXRCRScgIDogNFxuICAgICwgJ3JlYWRGbG9hdExFJyAgOiA0XG4gICAgLCAncmVhZEludDMyQkUnICA6IDRcbiAgICAsICdyZWFkSW50MzJMRScgIDogNFxuICAgICwgJ3JlYWRVSW50MzJCRScgOiA0XG4gICAgLCAncmVhZFVJbnQzMkxFJyA6IDRcbiAgICAsICdyZWFkSW50MTZCRScgIDogMlxuICAgICwgJ3JlYWRJbnQxNkxFJyAgOiAyXG4gICAgLCAncmVhZFVJbnQxNkJFJyA6IDJcbiAgICAsICdyZWFkVUludDE2TEUnIDogMlxuICAgICwgJ3JlYWRJbnQ4JyAgICAgOiAxXG4gICAgLCAncmVhZFVJbnQ4JyAgICA6IDFcbiAgfVxuXG4gIGZvciAodmFyIG0gaW4gbWV0aG9kcykge1xuICAgIChmdW5jdGlvbiAobSkge1xuICAgICAgQnVmZmVyTGlzdC5wcm90b3R5cGVbbV0gPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbWV0aG9kc1ttXSlbbV0oMClcbiAgICAgIH1cbiAgICB9KG0pKVxuICB9XG59KCkpXG5cblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXJMaXN0XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vbGliL19zdHJlYW1fZHVwbGV4LmpzXCIpXG4iLCIvLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1yZXR1cm4ga2V5cztcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXg7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbnZhciBrZXlzID0gb2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG59XG5cbmZ1bmN0aW9uIER1cGxleChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcblxuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIGlmIHdlIGFsbG93IGhhbGYtb3BlbiBzdGF0ZSwgb3IgaWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsXG4gIC8vIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLmFsbG93SGFsZk9wZW4gfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHByb2Nlc3NOZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gb25FbmROVChzZWxmKSB7XG4gIHNlbGYuZW5kKCk7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2goeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufSIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG4gIH0gY2F0Y2ggKF8pIHt9IGZpbmFsbHkge1xuICAgIGlmICghU3RyZWFtKSBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4gIH1cbn0pKCk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZyA9IHVuZGVmaW5lZDtcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFN0cmluZ0RlY29kZXI7XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFN0cmVhbSk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+IH50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB3aGVuIHBpcGluZywgd2Ugb25seSBjYXJlIGFib3V0ICdyZWFkYWJsZScgZXZlbnRzIHRoYXQgaGFwcGVuXG4gIC8vIGFmdGVyIHJlYWQoKWluZyBhbGwgdGhlIGJ5dGVzIGFuZCBub3QgZ2V0dGluZyBhbnkgcHVzaGJhY2suXG4gIHRoaXMucmFuT3V0ID0gZmFsc2U7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICdmdW5jdGlvbicpIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssICcnLCB0cnVlKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHN0YXRlLmVuZGVkICYmICFhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kRW1pdHRlZCAmJiBhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2tpcEFkZDtcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICBza2lwQWRkID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgY2h1bmsubGVuZ3RoID09PSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gRG9uJ3QgYWRkIHRvIHRoZSBidWZmZXIgaWYgd2UndmUgZGVjb2RlZCB0byBhbiBlbXB0eSBzdHJpbmcgY2h1bmsgYW5kXG4gICAgICAvLyB3ZSdyZSBub3QgaW4gb2JqZWN0IG1vZGVcbiAgICAgIGlmICghc2tpcEFkZCkge1xuICAgICAgICAvLyBpZiB3ZSB3YW50IHRoZSBkYXRhIG5vdywganVzdCBlbWl0IGl0LlxuICAgICAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcblxuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIG4gPT09IDAgPyAwIDogMTtcblxuICBpZiAobiA9PT0gbnVsbCB8fCBpc05hTihuKSkge1xuICAgIC8vIG9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmJ1ZmZlci5sZW5ndGgpIHJldHVybiBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChuIDw9IDApIHJldHVybiAwO1xuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSB0YXJnZXQgYnVmZmVyIGxldmVsLFxuICAvLyB0aGVuIHJhaXNlIHRoZSB3YXRlciBtYXJrLiAgQnVtcCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0XG4gIC8vIHBvd2VyIG9mIDIsIHRvIHByZXZlbnQgaW5jcmVhc2luZyBpdCBleGNlc3NpdmVseSBpbiB0aW55XG4gIC8vIGFtb3VudHMuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO1xuXG4gIC8vIGRvbid0IGhhdmUgdGhhdCBtdWNoLiAgcmV0dXJuIG51bGwsIHVubGVzcyB3ZSd2ZSBlbmRlZC5cbiAgaWYgKG4gPiBzdGF0ZS5sZW5ndGgpIHtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG47XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuID4gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfVxuXG4gIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gIGlmIChkb1JlYWQgJiYgIXN0YXRlLnJlYWRpbmcpIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSBlbmRSZWFkYWJsZSh0aGlzKTtcblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlciA9IG51bGw7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYykgcHJvY2Vzc05leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7ZWxzZSBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pIHtcbiAgZGVidWcoJ2VtaXQgcmVhZGFibGUnKTtcbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO2Vsc2UgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3NOZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQpIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlc1swXSA9PT0gZGVzdCAmJiBzcmMubGlzdGVuZXJDb3VudCgnZGF0YScpID09PSAxICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cbiAgLy8gVGhpcyBpcyBhIGJydXRhbGx5IHVnbHkgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlclxuICAvLyBpcyBhdHRhY2hlZCBiZWZvcmUgYW55IHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLlxuICBpZiAoIWRlc3QuX2V2ZW50cyB8fCAhZGVzdC5fZXZlbnRzLmVycm9yKSBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO2Vsc2UgaWYgKGlzQXJyYXkoZGVzdC5fZXZlbnRzLmVycm9yKSkgZGVzdC5fZXZlbnRzLmVycm9yLnVuc2hpZnQob25lcnJvcik7ZWxzZSBkZXN0Ll9ldmVudHMuZXJyb3IgPSBbb25lcnJvciwgZGVzdC5fZXZlbnRzLmVycm9yXTtcblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuOyBfaSsrKSB7XG4gICAgICBkZXN0c1tfaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgfXJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGkgPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGkgPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcblxuICAvLyBJZiBsaXN0ZW5pbmcgdG8gZGF0YSwgYW5kIGl0IGhhcyBub3QgZXhwbGljaXRseSBiZWVuIHBhdXNlZCxcbiAgLy8gdGhlbiBjYWxsIHJlc3VtZSB0byBzdGFydCB0aGUgZmxvdyBvZiBkYXRhIG9uIHRoZSBuZXh0IHRpY2suXG4gIGlmIChldiA9PT0gJ2RhdGEnICYmIGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgaWYgKGV2ID09PSAncmVhZGFibGUnICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICBwcm9jZXNzTmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcywgc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO1xuICBpZiAoZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwYXVzZScpO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncGF1c2UnKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2Zsb3cnLCBzdGF0ZS5mbG93aW5nKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgY2h1bmsgPSBzdHJlYW0ucmVhZCgpO1xuICAgIH0gd2hpbGUgKG51bGwgIT09IGNodW5rICYmIHN0YXRlLmZsb3dpbmcpO1xuICB9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBzZWxmLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IHNlbGYucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgdmFyIGV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcbiAgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uIChldikge1xuICAgIHN0cmVhbS5vbihldiwgc2VsZi5lbWl0LmJpbmQoc2VsZiwgZXYpKTtcbiAgfSk7XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgc2VsZi5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIHZhciBsaXN0ID0gc3RhdGUuYnVmZmVyO1xuICB2YXIgbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICB2YXIgc3RyaW5nTW9kZSA9ICEhc3RhdGUuZGVjb2RlcjtcbiAgdmFyIG9iamVjdE1vZGUgPSAhIXN0YXRlLm9iamVjdE1vZGU7XG4gIHZhciByZXQ7XG5cbiAgLy8gbm90aGluZyBpbiB0aGUgbGlzdCwgZGVmaW5pdGVseSBlbXB0eS5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICBpZiAobGVuZ3RoID09PSAwKSByZXQgPSBudWxsO2Vsc2UgaWYgKG9iamVjdE1vZGUpIHJldCA9IGxpc3Quc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IGxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgYXJyYXkuXG4gICAgaWYgKHN0cmluZ01vZGUpIHJldCA9IGxpc3Quam9pbignJyk7ZWxzZSBpZiAobGlzdC5sZW5ndGggPT09IDEpIHJldCA9IGxpc3RbMF07ZWxzZSByZXQgPSBCdWZmZXIuY29uY2F0KGxpc3QsIGxlbmd0aCk7XG4gICAgbGlzdC5sZW5ndGggPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQganVzdCBzb21lIG9mIGl0LlxuICAgIGlmIChuIDwgbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGp1c3QgdGFrZSBhIHBhcnQgb2YgdGhlIGZpcnN0IGxpc3QgaXRlbS5cbiAgICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICByZXQgPSBidWYuc2xpY2UoMCwgbik7XG4gICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKG4pO1xuICAgIH0gZWxzZSBpZiAobiA9PT0gbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGZpcnN0IGxpc3QgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBsZXggY2FzZS5cbiAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIGNvdmVyIGl0LCBidXQgaXQgc3BhbnMgcGFzdCB0aGUgZmlyc3QgYnVmZmVyLlxuICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCA9ICcnO2Vsc2UgcmV0ID0gbmV3IEJ1ZmZlcihuKTtcblxuICAgICAgdmFyIGMgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGwgJiYgYyA8IG47IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgICAgdmFyIGNweSA9IE1hdGgubWluKG4gLSBjLCBidWYubGVuZ3RoKTtcblxuICAgICAgICBpZiAoc3RyaW5nTW9kZSkgcmV0ICs9IGJ1Zi5zbGljZSgwLCBjcHkpO2Vsc2UgYnVmLmNvcHkocmV0LCBjLCAwLCBjcHkpO1xuXG4gICAgICAgIGlmIChjcHkgPCBidWYubGVuZ3RoKSBsaXN0WzBdID0gYnVmLnNsaWNlKGNweSk7ZWxzZSBsaXN0LnNoaWZ0KCk7XG5cbiAgICAgICAgYyArPSBjcHk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignZW5kUmVhZGFibGUgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufSIsIi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBhc3luY1dyaXRlID0gIXByb2Nlc3MuYnJvd3NlciAmJiBbJ3YwLjEwJywgJ3YwLjkuJ10uaW5kZXhPZihwcm9jZXNzLnZlcnNpb24uc2xpY2UoMCwgNSkpID4gLTEgPyBzZXRJbW1lZGlhdGUgOiBwcm9jZXNzTmV4dFRpY2s7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpbnRlcm5hbFV0aWwgPSB7XG4gIGRlcHJlY2F0ZTogcmVxdWlyZSgndXRpbC1kZXByZWNhdGUnKVxufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbTtcbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgU3RyZWFtID0gcmVxdWlyZSgnc3QnICsgJ3JlYW0nKTtcbiAgfSBjYXRjaCAoXykge30gZmluYWxseSB7XG4gICAgaWYgKCFTdHJlYW0pIFN0cmVhbSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbiAgfVxufSkoKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG51dGlsLmluaGVyaXRzKFdyaXRhYmxlLCBTdHJlYW0pO1xuXG5mdW5jdGlvbiBub3AoKSB7fVxuXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbVxuICAvLyBjb250YWlucyBidWZmZXJzIG9yIG9iamVjdHMuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCB3cml0ZSgpIHN0YXJ0cyByZXR1cm5pbmcgZmFsc2VcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyB0aGF0IHdlIGFsd2F5cyByZXR1cm4gZmFsc2UgaWZcbiAgLy8gdGhlIGVudGlyZSBidWZmZXIgaXMgbm90IGZsdXNoZWQgaW1tZWRpYXRlbHkgb24gd3JpdGUoKVxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod20gfHwgaHdtID09PSAwID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH4gfnRoaXMuaGlnaFdhdGVyTWFyaztcblxuICB0aGlzLm5lZWREcmFpbiA9IGZhbHNlO1xuICAvLyBhdCB0aGUgc3RhcnQgb2YgY2FsbGluZyBlbmQoKVxuICB0aGlzLmVuZGluZyA9IGZhbHNlO1xuICAvLyB3aGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkXG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgLy8gd2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkXG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBzaG91bGQgd2UgZGVjb2RlIHN0cmluZ3MgaW50byBidWZmZXJzIGJlZm9yZSBwYXNzaW5nIHRvIF93cml0ZT9cbiAgLy8gdGhpcyBpcyBoZXJlIHNvIHRoYXQgc29tZSBub2RlLWNvcmUgc3RyZWFtcyBjYW4gb3B0aW1pemUgc3RyaW5nXG4gIC8vIGhhbmRsaW5nIGF0IGEgbG93ZXIgbGV2ZWwuXG4gIHZhciBub0RlY29kZSA9IG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyBub3QgYW4gYWN0dWFsIGJ1ZmZlciB3ZSBrZWVwIHRyYWNrIG9mLCBidXQgYSBtZWFzdXJlbWVudFxuICAvLyBvZiBob3cgbXVjaCB3ZSdyZSB3YWl0aW5nIHRvIGdldCBwdXNoZWQgdG8gc29tZSB1bmRlcmx5aW5nXG4gIC8vIHNvY2tldCBvciBmaWxlLlxuICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cbiAgdGhpcy53cml0aW5nID0gZmFsc2U7XG5cbiAgLy8gd2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbFxuICB0aGlzLmNvcmtlZCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gYSBmbGFnIHRvIGtub3cgaWYgd2UncmUgcHJvY2Vzc2luZyBwcmV2aW91c2x5IGJ1ZmZlcmVkIGl0ZW1zLCB3aGljaFxuICAvLyBtYXkgY2FsbCB0aGUgX3dyaXRlKCkgY2FsbGJhY2sgaW4gdGhlIHNhbWUgdGljaywgc28gdGhhdCB3ZSBkb24ndFxuICAvLyBlbmQgdXAgaW4gYW4gb3ZlcmxhcHBlZCBvbndyaXRlIHNpdHVhdGlvbi5cbiAgdGhpcy5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLGNiKVxuICB0aGlzLm9ud3JpdGUgPSBmdW5jdGlvbiAoZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9O1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuXG4gIC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG5cbiAgdGhpcy5idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuXG4gIC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuICB0aGlzLnBlbmRpbmdjYiA9IDA7XG5cbiAgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAvLyBjcmVhdGUgdGhlIHR3byBvYmplY3RzIG5lZWRlZCB0byBzdG9yZSB0aGUgY29ya2VkIHJlcXVlc3RzXG4gIC8vIHRoZXkgYXJlIG5vdCBhIGxpbmtlZCBsaXN0LCBhcyBubyBuZXcgZWxlbWVudHMgYXJlIGluc2VydGVkIGluIHRoZXJlXG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbn1cblxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gd3JpdGFibGVTdGF0ZUdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyJywge1xuICAgICAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicpXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHt9XG59KSgpO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdGhvdWdoIHRoZXkncmUgbm90XG4gIC8vIGluc3RhbmNlb2YgV3JpdGFibGUsIHRoZXkncmUgaW5zdGFuY2VvZiBSZWFkYWJsZS5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdyaXRhYmxlKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUuIE5vdCByZWFkYWJsZS4nKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBwcm9jZXNzTmV4dFRpY2soY2IsIGVyKTtcbn1cblxuLy8gSWYgd2UgZ2V0IHNvbWV0aGluZyB0aGF0IGlzIG5vdCBhIGJ1ZmZlciwgc3RyaW5nLCBudWxsLCBvciB1bmRlZmluZWQsXG4vLyBhbmQgd2UncmUgbm90IGluIG9iamVjdE1vZGUsIHRoZW4gdGhhdCdzIGFuIGVycm9yLlxuLy8gT3RoZXJ3aXNlIHN0cmVhbSBjaHVua3MgYXJlIGFsbCBjb25zaWRlcmVkIHRvIGJlIG9mIGxlbmd0aD0xLCBhbmQgdGhlXG4vLyB3YXRlcm1hcmtzIGRldGVybWluZSBob3cgbWFueSBvYmplY3RzIHRvIGtlZXAgaW4gdGhlIGJ1ZmZlciwgcmF0aGVyIHRoYW5cbi8vIGhvdyBtYW55IGJ5dGVzIG9yIGNoYXJhY3RlcnMuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICB2YXIgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcblxuICBpZiAoc3RhdGUuZW5kZWQpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBzdGF0ZS5jb3JrZWQrKztcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tO1xuXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLCAndWNzMicsICd1Y3MtMicsICd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSBlbmNvZGluZyA9ICdidWZmZXInO1xuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbmV3IFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBsYXN0Lm5leHQgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCArPSAxO1xuICB9IGVsc2Uge1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHdyaXRldiwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpO2Vsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgLS1zdGF0ZS5wZW5kaW5nY2I7XG4gIGlmIChzeW5jKSBwcm9jZXNzTmV4dFRpY2soY2IsIGVyKTtlbHNlIGNiKGVyKTtcblxuICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvKjxyZXBsYWNlbWVudD4qL1xuICAgICAgYXN5bmNXcml0ZShhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgLyo8L3JlcGxhY2VtZW50PiovXG4gICAgfSBlbHNlIHtcbiAgICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKSB7XG4gIGlmICghZmluaXNoZWQpIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG4vLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn1cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG4gIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtcblxuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkge1xuICAgIC8vIEZhc3QgY2FzZSwgd3JpdGUgZXZlcnl0aGluZyB1c2luZyBfd3JpdGV2KClcbiAgICB2YXIgbCA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50O1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGhvbGRlciA9IHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtcbiAgICBob2xkZXIuZW50cnkgPSBlbnRyeTtcblxuICAgIHZhciBjb3VudCA9IDA7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cblxuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgdHJ1ZSwgc3RhdGUubGVuZ3RoLCBidWZmZXIsICcnLCBob2xkZXIuZmluaXNoKTtcblxuICAgIC8vIGRvV3JpdGUgaXMgYWx3YXlzIGFzeW5jLCBkZWZlciB0aGVzZSB0byBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAvLyBhcyB0aGUgaG90IHBhdGggZW5kcyB3aXRoIGRvV3JpdGVcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBob2xkZXIubmV4dDtcbiAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIH1cblxuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuXG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkKSB7XG4gICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZWVkO1xufVxuXG5mdW5jdGlvbiBlbmRXcml0YWJsZShzdHJlYW0sIHN0YXRlLCBjYikge1xuICBzdGF0ZS5lbmRpbmcgPSB0cnVlO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgaWYgKGNiKSB7XG4gICAgaWYgKHN0YXRlLmZpbmlzaGVkKSBwcm9jZXNzTmV4dFRpY2soY2IpO2Vsc2Ugc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlO1xufVxuXG4vLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMubmV4dCA9IG51bGw7XG4gIHRoaXMuZW50cnkgPSBudWxsO1xuXG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBlbnRyeSA9IF90aGlzLmVudHJ5O1xuICAgIF90aGlzLmVudHJ5ID0gbnVsbDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgICBjYihlcnIpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlKSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IF90aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBfdGhpcztcbiAgICB9XG4gIH07XG59IiwidmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlclxuXG52YXIgQkxBS0UycyA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQkxBS0UycyhkaWdlc3RMZW5ndGgsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGRpZ2VzdExlbmd0aCA9PT0gXCJ1bmRlZmluZWRcIikgeyBkaWdlc3RMZW5ndGggPSAzMjsgfVxuICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaWdlc3RMZW5ndGggPSAzMjtcbiAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IDY0O1xuICAgICAgICB0aGlzLml2ID0gW1xuICAgICAgICAgICAgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSxcbiAgICAgICAgICAgIDB4NTEwZTUyN2YsIDB4OWIwNTY4OGMsIDB4MWY4M2Q5YWIsIDB4NWJlMGNkMTlcbiAgICAgICAgXTtcbiAgICAgICAgLy9UT0RPIHRyZWUgbW9kZS5cbiAgICAgICAgaWYgKGRpZ2VzdExlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICBkaWdlc3RMZW5ndGggPSB0aGlzLmRpZ2VzdExlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChkaWdlc3RMZW5ndGggPiAzMikge1xuICAgICAgICAgICAgdGhyb3cgJ2RpZ2VzdExlbmd0aCBpcyB0b28gbGFyZ2UnO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrZXlMZW5ndGggPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAga2V5ID0gdGhpcy5zdHJpbmdUb1V0ZjhBcnJheShrZXkpO1xuICAgICAgICAgICAga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5ID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBrZXlMZW5ndGggPSBrZXkubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXlMZW5ndGggPiAzMikge1xuICAgICAgICAgICAgdGhyb3cgJ2tleSB0b28gbG9uZyc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGFyYW0gPSBbZGlnZXN0TGVuZ3RoICYgMHhmZiwga2V5TGVuZ3RoLCAxLCAxXTtcbiAgICAgICAgdGhpcy5oID0gdGhpcy5pdi5zbGljZSgwKTtcblxuICAgICAgICAvLyBYT1IgcGFydCBvZiBwYXJhbWV0ZXIgYmxvY2suXG4gICAgICAgIHRoaXMuaFswXSBePSB0aGlzLmxvYWQzMihwYXJhbSwgMCk7XG5cbiAgICAgICAgdGhpcy54ID0gbmV3IEFycmF5KDY0KTtcbiAgICAgICAgdGhpcy50MCA9IDA7XG4gICAgICAgIHRoaXMudDEgPSAwO1xuICAgICAgICB0aGlzLmYwID0gMDtcbiAgICAgICAgdGhpcy5mMSA9IDA7XG4gICAgICAgIHRoaXMubnggPSAwO1xuICAgICAgICB0aGlzLmRpZ2VzdExlbmd0aCA9IGRpZ2VzdExlbmd0aDtcblxuICAgICAgICBpZiAoa2V5TGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMueFtpXSA9IGtleVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBrZXlMZW5ndGg7IGkgPCA2NDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy54W2ldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubnggPSA2NDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBCTEFLRTJzLnByb3RvdHlwZS5sb2FkMzIgPSBmdW5jdGlvbiAocCwgcG9zKSB7XG4gICAgICAgIHJldHVybiAoKHBbcG9zXSAmIDB4ZmYpIHwgKChwW3BvcyArIDFdICYgMHhmZikgPDwgOCkgfCAoKHBbcG9zICsgMl0gJiAweGZmKSA8PCAxNikgfCAoKHBbcG9zICsgM10gJiAweGZmKSA8PCAyNCkpID4+PiAwO1xuICAgIH07XG5cbiAgICBCTEFLRTJzLnByb3RvdHlwZS5zdG9yZTMyID0gZnVuY3Rpb24gKHAsIHBvcywgdikge1xuICAgICAgICBwW3Bvc10gPSAodiA+Pj4gMCkgJiAweGZmO1xuICAgICAgICBwW3BvcyArIDFdID0gKHYgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgcFtwb3MgKyAyXSA9ICh2ID4+PiAxNikgJiAweGZmO1xuICAgICAgICBwW3BvcyArIDNdID0gKHYgPj4+IDI0KSAmIDB4ZmY7XG4gICAgfTtcblxuICAgIEJMQUtFMnMucHJvdG90eXBlLnByb2Nlc3NCbG9jayA9IGZ1bmN0aW9uIChsZW5ndGgpIHtcbiAgICAgICAgdGhpcy50MCArPSBsZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLnQwICE9IHRoaXMudDAgPj4+IDApIHtcbiAgICAgICAgICAgIHRoaXMudDAgPSAwO1xuICAgICAgICAgICAgdGhpcy50MSsrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHYwID0gdGhpcy5oWzBdLCB2MSA9IHRoaXMuaFsxXSwgdjIgPSB0aGlzLmhbMl0sIHYzID0gdGhpcy5oWzNdLCB2NCA9IHRoaXMuaFs0XSwgdjUgPSB0aGlzLmhbNV0sIHY2ID0gdGhpcy5oWzZdLCB2NyA9IHRoaXMuaFs3XSwgdjggPSB0aGlzLml2WzBdLCB2OSA9IHRoaXMuaXZbMV0sIHYxMCA9IHRoaXMuaXZbMl0sIHYxMSA9IHRoaXMuaXZbM10sIHYxMiA9IHRoaXMuaXZbNF0gXiB0aGlzLnQwLCB2MTMgPSB0aGlzLml2WzVdIF4gdGhpcy50MSwgdjE0ID0gdGhpcy5pdls2XSBeIHRoaXMuZjAsIHYxNSA9IHRoaXMuaXZbN10gXiB0aGlzLmYxO1xuXG4gICAgICAgIHZhciBtMCA9IHRoaXMubG9hZDMyKHRoaXMueCwgMCksIG0xID0gdGhpcy5sb2FkMzIodGhpcy54LCA0KSwgbTIgPSB0aGlzLmxvYWQzMih0aGlzLngsIDgpLCBtMyA9IHRoaXMubG9hZDMyKHRoaXMueCwgMTIpLCBtNCA9IHRoaXMubG9hZDMyKHRoaXMueCwgMTYpLCBtNSA9IHRoaXMubG9hZDMyKHRoaXMueCwgMjApLCBtNiA9IHRoaXMubG9hZDMyKHRoaXMueCwgMjQpLCBtNyA9IHRoaXMubG9hZDMyKHRoaXMueCwgMjgpLCBtOCA9IHRoaXMubG9hZDMyKHRoaXMueCwgMzIpLCBtOSA9IHRoaXMubG9hZDMyKHRoaXMueCwgMzYpLCBtMTAgPSB0aGlzLmxvYWQzMih0aGlzLngsIDQwKSwgbTExID0gdGhpcy5sb2FkMzIodGhpcy54LCA0NCksIG0xMiA9IHRoaXMubG9hZDMyKHRoaXMueCwgNDgpLCBtMTMgPSB0aGlzLmxvYWQzMih0aGlzLngsIDUyKSwgbTE0ID0gdGhpcy5sb2FkMzIodGhpcy54LCA1NiksIG0xNSA9IHRoaXMubG9hZDMyKHRoaXMueCwgNjApO1xuXG4gICAgICAgIC8vIFJvdW5kIDEuXG4gICAgICAgIHYwICs9IG0wO1xuICAgICAgICB2MCArPSB2NDtcbiAgICAgICAgdjEyIF49IHYwO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gMTYpIHwgdjEyID4+PiAxNjtcbiAgICAgICAgdjggKz0gdjEyO1xuICAgICAgICB2NCBePSB2ODtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSAxMikgfCB2NCA+Pj4gMTI7XG4gICAgICAgIHYxICs9IG0yO1xuICAgICAgICB2MSArPSB2NTtcbiAgICAgICAgdjEzIF49IHYxO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gMTYpIHwgdjEzID4+PiAxNjtcbiAgICAgICAgdjkgKz0gdjEzO1xuICAgICAgICB2NSBePSB2OTtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSAxMikgfCB2NSA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG00O1xuICAgICAgICB2MiArPSB2NjtcbiAgICAgICAgdjE0IF49IHYyO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gMTYpIHwgdjE0ID4+PiAxNjtcbiAgICAgICAgdjEwICs9IHYxNDtcbiAgICAgICAgdjYgXj0gdjEwO1xuICAgICAgICB2NiA9IHY2IDw8ICgzMiAtIDEyKSB8IHY2ID4+PiAxMjtcbiAgICAgICAgdjMgKz0gbTY7XG4gICAgICAgIHYzICs9IHY3O1xuICAgICAgICB2MTUgXj0gdjM7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSAxNikgfCB2MTUgPj4+IDE2O1xuICAgICAgICB2MTEgKz0gdjE1O1xuICAgICAgICB2NyBePSB2MTE7XG4gICAgICAgIHY3ID0gdjcgPDwgKDMyIC0gMTIpIHwgdjcgPj4+IDEyO1xuICAgICAgICB2MiArPSBtNTtcbiAgICAgICAgdjIgKz0gdjY7XG4gICAgICAgIHYxNCBePSB2MjtcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDgpIHwgdjE0ID4+PiA4O1xuICAgICAgICB2MTAgKz0gdjE0O1xuICAgICAgICB2NiBePSB2MTA7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gNykgfCB2NiA+Pj4gNztcbiAgICAgICAgdjMgKz0gbTc7XG4gICAgICAgIHYzICs9IHY3O1xuICAgICAgICB2MTUgXj0gdjM7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSA4KSB8IHYxNSA+Pj4gODtcbiAgICAgICAgdjExICs9IHYxNTtcbiAgICAgICAgdjcgXj0gdjExO1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDcpIHwgdjcgPj4+IDc7XG4gICAgICAgIHYxICs9IG0zO1xuICAgICAgICB2MSArPSB2NTtcbiAgICAgICAgdjEzIF49IHYxO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gOCkgfCB2MTMgPj4+IDg7XG4gICAgICAgIHY5ICs9IHYxMztcbiAgICAgICAgdjUgXj0gdjk7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gNykgfCB2NSA+Pj4gNztcbiAgICAgICAgdjAgKz0gbTE7XG4gICAgICAgIHYwICs9IHY0O1xuICAgICAgICB2MTIgXj0gdjA7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSA4KSB8IHYxMiA+Pj4gODtcbiAgICAgICAgdjggKz0gdjEyO1xuICAgICAgICB2NCBePSB2ODtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSA3KSB8IHY0ID4+PiA3O1xuICAgICAgICB2MCArPSBtODtcbiAgICAgICAgdjAgKz0gdjU7XG4gICAgICAgIHYxNSBePSB2MDtcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDE2KSB8IHYxNSA+Pj4gMTY7XG4gICAgICAgIHYxMCArPSB2MTU7XG4gICAgICAgIHY1IF49IHYxMDtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSAxMikgfCB2NSA+Pj4gMTI7XG4gICAgICAgIHYxICs9IG0xMDtcbiAgICAgICAgdjEgKz0gdjY7XG4gICAgICAgIHYxMiBePSB2MTtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDE2KSB8IHYxMiA+Pj4gMTY7XG4gICAgICAgIHYxMSArPSB2MTI7XG4gICAgICAgIHY2IF49IHYxMTtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSAxMikgfCB2NiA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG0xMjtcbiAgICAgICAgdjIgKz0gdjc7XG4gICAgICAgIHYxMyBePSB2MjtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDE2KSB8IHYxMyA+Pj4gMTY7XG4gICAgICAgIHY4ICs9IHYxMztcbiAgICAgICAgdjcgXj0gdjg7XG4gICAgICAgIHY3ID0gdjcgPDwgKDMyIC0gMTIpIHwgdjcgPj4+IDEyO1xuICAgICAgICB2MyArPSBtMTQ7XG4gICAgICAgIHYzICs9IHY0O1xuICAgICAgICB2MTQgXj0gdjM7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSAxNikgfCB2MTQgPj4+IDE2O1xuICAgICAgICB2OSArPSB2MTQ7XG4gICAgICAgIHY0IF49IHY5O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDEyKSB8IHY0ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTEzO1xuICAgICAgICB2MiArPSB2NztcbiAgICAgICAgdjEzIF49IHYyO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gOCkgfCB2MTMgPj4+IDg7XG4gICAgICAgIHY4ICs9IHYxMztcbiAgICAgICAgdjcgXj0gdjg7XG4gICAgICAgIHY3ID0gdjcgPDwgKDMyIC0gNykgfCB2NyA+Pj4gNztcbiAgICAgICAgdjMgKz0gbTE1O1xuICAgICAgICB2MyArPSB2NDtcbiAgICAgICAgdjE0IF49IHYzO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gOCkgfCB2MTQgPj4+IDg7XG4gICAgICAgIHY5ICs9IHYxNDtcbiAgICAgICAgdjQgXj0gdjk7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gNykgfCB2NCA+Pj4gNztcbiAgICAgICAgdjEgKz0gbTExO1xuICAgICAgICB2MSArPSB2NjtcbiAgICAgICAgdjEyIF49IHYxO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gOCkgfCB2MTIgPj4+IDg7XG4gICAgICAgIHYxMSArPSB2MTI7XG4gICAgICAgIHY2IF49IHYxMTtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSA3KSB8IHY2ID4+PiA3O1xuICAgICAgICB2MCArPSBtOTtcbiAgICAgICAgdjAgKz0gdjU7XG4gICAgICAgIHYxNSBePSB2MDtcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDgpIHwgdjE1ID4+PiA4O1xuICAgICAgICB2MTAgKz0gdjE1O1xuICAgICAgICB2NSBePSB2MTA7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gNykgfCB2NSA+Pj4gNztcblxuICAgICAgICAvLyBSb3VuZCAyLlxuICAgICAgICB2MCArPSBtMTQ7XG4gICAgICAgIHYwICs9IHY0O1xuICAgICAgICB2MTIgXj0gdjA7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSAxNikgfCB2MTIgPj4+IDE2O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDEyKSB8IHY0ID4+PiAxMjtcbiAgICAgICAgdjEgKz0gbTQ7XG4gICAgICAgIHYxICs9IHY1O1xuICAgICAgICB2MTMgXj0gdjE7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSAxNikgfCB2MTMgPj4+IDE2O1xuICAgICAgICB2OSArPSB2MTM7XG4gICAgICAgIHY1IF49IHY5O1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDEyKSB8IHY1ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTk7XG4gICAgICAgIHYyICs9IHY2O1xuICAgICAgICB2MTQgXj0gdjI7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSAxNikgfCB2MTQgPj4+IDE2O1xuICAgICAgICB2MTAgKz0gdjE0O1xuICAgICAgICB2NiBePSB2MTA7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gMTIpIHwgdjYgPj4+IDEyO1xuICAgICAgICB2MyArPSBtMTM7XG4gICAgICAgIHYzICs9IHY3O1xuICAgICAgICB2MTUgXj0gdjM7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSAxNikgfCB2MTUgPj4+IDE2O1xuICAgICAgICB2MTEgKz0gdjE1O1xuICAgICAgICB2NyBePSB2MTE7XG4gICAgICAgIHY3ID0gdjcgPDwgKDMyIC0gMTIpIHwgdjcgPj4+IDEyO1xuICAgICAgICB2MiArPSBtMTU7XG4gICAgICAgIHYyICs9IHY2O1xuICAgICAgICB2MTQgXj0gdjI7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSA4KSB8IHYxNCA+Pj4gODtcbiAgICAgICAgdjEwICs9IHYxNDtcbiAgICAgICAgdjYgXj0gdjEwO1xuICAgICAgICB2NiA9IHY2IDw8ICgzMiAtIDcpIHwgdjYgPj4+IDc7XG4gICAgICAgIHYzICs9IG02O1xuICAgICAgICB2MyArPSB2NztcbiAgICAgICAgdjE1IF49IHYzO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gOCkgfCB2MTUgPj4+IDg7XG4gICAgICAgIHYxMSArPSB2MTU7XG4gICAgICAgIHY3IF49IHYxMTtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSA3KSB8IHY3ID4+PiA3O1xuICAgICAgICB2MSArPSBtODtcbiAgICAgICAgdjEgKz0gdjU7XG4gICAgICAgIHYxMyBePSB2MTtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDgpIHwgdjEzID4+PiA4O1xuICAgICAgICB2OSArPSB2MTM7XG4gICAgICAgIHY1IF49IHY5O1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDcpIHwgdjUgPj4+IDc7XG4gICAgICAgIHYwICs9IG0xMDtcbiAgICAgICAgdjAgKz0gdjQ7XG4gICAgICAgIHYxMiBePSB2MDtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDgpIHwgdjEyID4+PiA4O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDcpIHwgdjQgPj4+IDc7XG4gICAgICAgIHYwICs9IG0xO1xuICAgICAgICB2MCArPSB2NTtcbiAgICAgICAgdjE1IF49IHYwO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gMTYpIHwgdjE1ID4+PiAxNjtcbiAgICAgICAgdjEwICs9IHYxNTtcbiAgICAgICAgdjUgXj0gdjEwO1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDEyKSB8IHY1ID4+PiAxMjtcbiAgICAgICAgdjEgKz0gbTA7XG4gICAgICAgIHYxICs9IHY2O1xuICAgICAgICB2MTIgXj0gdjE7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSAxNikgfCB2MTIgPj4+IDE2O1xuICAgICAgICB2MTEgKz0gdjEyO1xuICAgICAgICB2NiBePSB2MTE7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gMTIpIHwgdjYgPj4+IDEyO1xuICAgICAgICB2MiArPSBtMTE7XG4gICAgICAgIHYyICs9IHY3O1xuICAgICAgICB2MTMgXj0gdjI7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSAxNikgfCB2MTMgPj4+IDE2O1xuICAgICAgICB2OCArPSB2MTM7XG4gICAgICAgIHY3IF49IHY4O1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDEyKSB8IHY3ID4+PiAxMjtcbiAgICAgICAgdjMgKz0gbTU7XG4gICAgICAgIHYzICs9IHY0O1xuICAgICAgICB2MTQgXj0gdjM7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSAxNikgfCB2MTQgPj4+IDE2O1xuICAgICAgICB2OSArPSB2MTQ7XG4gICAgICAgIHY0IF49IHY5O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDEyKSB8IHY0ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTc7XG4gICAgICAgIHYyICs9IHY3O1xuICAgICAgICB2MTMgXj0gdjI7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSA4KSB8IHYxMyA+Pj4gODtcbiAgICAgICAgdjggKz0gdjEzO1xuICAgICAgICB2NyBePSB2ODtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSA3KSB8IHY3ID4+PiA3O1xuICAgICAgICB2MyArPSBtMztcbiAgICAgICAgdjMgKz0gdjQ7XG4gICAgICAgIHYxNCBePSB2MztcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDgpIHwgdjE0ID4+PiA4O1xuICAgICAgICB2OSArPSB2MTQ7XG4gICAgICAgIHY0IF49IHY5O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDcpIHwgdjQgPj4+IDc7XG4gICAgICAgIHYxICs9IG0yO1xuICAgICAgICB2MSArPSB2NjtcbiAgICAgICAgdjEyIF49IHYxO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gOCkgfCB2MTIgPj4+IDg7XG4gICAgICAgIHYxMSArPSB2MTI7XG4gICAgICAgIHY2IF49IHYxMTtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSA3KSB8IHY2ID4+PiA3O1xuICAgICAgICB2MCArPSBtMTI7XG4gICAgICAgIHYwICs9IHY1O1xuICAgICAgICB2MTUgXj0gdjA7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSA4KSB8IHYxNSA+Pj4gODtcbiAgICAgICAgdjEwICs9IHYxNTtcbiAgICAgICAgdjUgXj0gdjEwO1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDcpIHwgdjUgPj4+IDc7XG5cbiAgICAgICAgLy8gUm91bmQgMy5cbiAgICAgICAgdjAgKz0gbTExO1xuICAgICAgICB2MCArPSB2NDtcbiAgICAgICAgdjEyIF49IHYwO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gMTYpIHwgdjEyID4+PiAxNjtcbiAgICAgICAgdjggKz0gdjEyO1xuICAgICAgICB2NCBePSB2ODtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSAxMikgfCB2NCA+Pj4gMTI7XG4gICAgICAgIHYxICs9IG0xMjtcbiAgICAgICAgdjEgKz0gdjU7XG4gICAgICAgIHYxMyBePSB2MTtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDE2KSB8IHYxMyA+Pj4gMTY7XG4gICAgICAgIHY5ICs9IHYxMztcbiAgICAgICAgdjUgXj0gdjk7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gMTIpIHwgdjUgPj4+IDEyO1xuICAgICAgICB2MiArPSBtNTtcbiAgICAgICAgdjIgKz0gdjY7XG4gICAgICAgIHYxNCBePSB2MjtcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDE2KSB8IHYxNCA+Pj4gMTY7XG4gICAgICAgIHYxMCArPSB2MTQ7XG4gICAgICAgIHY2IF49IHYxMDtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSAxMikgfCB2NiA+Pj4gMTI7XG4gICAgICAgIHYzICs9IG0xNTtcbiAgICAgICAgdjMgKz0gdjc7XG4gICAgICAgIHYxNSBePSB2MztcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDE2KSB8IHYxNSA+Pj4gMTY7XG4gICAgICAgIHYxMSArPSB2MTU7XG4gICAgICAgIHY3IF49IHYxMTtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSAxMikgfCB2NyA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG0yO1xuICAgICAgICB2MiArPSB2NjtcbiAgICAgICAgdjE0IF49IHYyO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gOCkgfCB2MTQgPj4+IDg7XG4gICAgICAgIHYxMCArPSB2MTQ7XG4gICAgICAgIHY2IF49IHYxMDtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSA3KSB8IHY2ID4+PiA3O1xuICAgICAgICB2MyArPSBtMTM7XG4gICAgICAgIHYzICs9IHY3O1xuICAgICAgICB2MTUgXj0gdjM7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSA4KSB8IHYxNSA+Pj4gODtcbiAgICAgICAgdjExICs9IHYxNTtcbiAgICAgICAgdjcgXj0gdjExO1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDcpIHwgdjcgPj4+IDc7XG4gICAgICAgIHYxICs9IG0wO1xuICAgICAgICB2MSArPSB2NTtcbiAgICAgICAgdjEzIF49IHYxO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gOCkgfCB2MTMgPj4+IDg7XG4gICAgICAgIHY5ICs9IHYxMztcbiAgICAgICAgdjUgXj0gdjk7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gNykgfCB2NSA+Pj4gNztcbiAgICAgICAgdjAgKz0gbTg7XG4gICAgICAgIHYwICs9IHY0O1xuICAgICAgICB2MTIgXj0gdjA7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSA4KSB8IHYxMiA+Pj4gODtcbiAgICAgICAgdjggKz0gdjEyO1xuICAgICAgICB2NCBePSB2ODtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSA3KSB8IHY0ID4+PiA3O1xuICAgICAgICB2MCArPSBtMTA7XG4gICAgICAgIHYwICs9IHY1O1xuICAgICAgICB2MTUgXj0gdjA7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSAxNikgfCB2MTUgPj4+IDE2O1xuICAgICAgICB2MTAgKz0gdjE1O1xuICAgICAgICB2NSBePSB2MTA7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gMTIpIHwgdjUgPj4+IDEyO1xuICAgICAgICB2MSArPSBtMztcbiAgICAgICAgdjEgKz0gdjY7XG4gICAgICAgIHYxMiBePSB2MTtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDE2KSB8IHYxMiA+Pj4gMTY7XG4gICAgICAgIHYxMSArPSB2MTI7XG4gICAgICAgIHY2IF49IHYxMTtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSAxMikgfCB2NiA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG03O1xuICAgICAgICB2MiArPSB2NztcbiAgICAgICAgdjEzIF49IHYyO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gMTYpIHwgdjEzID4+PiAxNjtcbiAgICAgICAgdjggKz0gdjEzO1xuICAgICAgICB2NyBePSB2ODtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSAxMikgfCB2NyA+Pj4gMTI7XG4gICAgICAgIHYzICs9IG05O1xuICAgICAgICB2MyArPSB2NDtcbiAgICAgICAgdjE0IF49IHYzO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gMTYpIHwgdjE0ID4+PiAxNjtcbiAgICAgICAgdjkgKz0gdjE0O1xuICAgICAgICB2NCBePSB2OTtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSAxMikgfCB2NCA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG0xO1xuICAgICAgICB2MiArPSB2NztcbiAgICAgICAgdjEzIF49IHYyO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gOCkgfCB2MTMgPj4+IDg7XG4gICAgICAgIHY4ICs9IHYxMztcbiAgICAgICAgdjcgXj0gdjg7XG4gICAgICAgIHY3ID0gdjcgPDwgKDMyIC0gNykgfCB2NyA+Pj4gNztcbiAgICAgICAgdjMgKz0gbTQ7XG4gICAgICAgIHYzICs9IHY0O1xuICAgICAgICB2MTQgXj0gdjM7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSA4KSB8IHYxNCA+Pj4gODtcbiAgICAgICAgdjkgKz0gdjE0O1xuICAgICAgICB2NCBePSB2OTtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSA3KSB8IHY0ID4+PiA3O1xuICAgICAgICB2MSArPSBtNjtcbiAgICAgICAgdjEgKz0gdjY7XG4gICAgICAgIHYxMiBePSB2MTtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDgpIHwgdjEyID4+PiA4O1xuICAgICAgICB2MTEgKz0gdjEyO1xuICAgICAgICB2NiBePSB2MTE7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gNykgfCB2NiA+Pj4gNztcbiAgICAgICAgdjAgKz0gbTE0O1xuICAgICAgICB2MCArPSB2NTtcbiAgICAgICAgdjE1IF49IHYwO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gOCkgfCB2MTUgPj4+IDg7XG4gICAgICAgIHYxMCArPSB2MTU7XG4gICAgICAgIHY1IF49IHYxMDtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSA3KSB8IHY1ID4+PiA3O1xuXG4gICAgICAgIC8vIFJvdW5kIDQuXG4gICAgICAgIHYwICs9IG03O1xuICAgICAgICB2MCArPSB2NDtcbiAgICAgICAgdjEyIF49IHYwO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gMTYpIHwgdjEyID4+PiAxNjtcbiAgICAgICAgdjggKz0gdjEyO1xuICAgICAgICB2NCBePSB2ODtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSAxMikgfCB2NCA+Pj4gMTI7XG4gICAgICAgIHYxICs9IG0zO1xuICAgICAgICB2MSArPSB2NTtcbiAgICAgICAgdjEzIF49IHYxO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gMTYpIHwgdjEzID4+PiAxNjtcbiAgICAgICAgdjkgKz0gdjEzO1xuICAgICAgICB2NSBePSB2OTtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSAxMikgfCB2NSA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG0xMztcbiAgICAgICAgdjIgKz0gdjY7XG4gICAgICAgIHYxNCBePSB2MjtcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDE2KSB8IHYxNCA+Pj4gMTY7XG4gICAgICAgIHYxMCArPSB2MTQ7XG4gICAgICAgIHY2IF49IHYxMDtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSAxMikgfCB2NiA+Pj4gMTI7XG4gICAgICAgIHYzICs9IG0xMTtcbiAgICAgICAgdjMgKz0gdjc7XG4gICAgICAgIHYxNSBePSB2MztcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDE2KSB8IHYxNSA+Pj4gMTY7XG4gICAgICAgIHYxMSArPSB2MTU7XG4gICAgICAgIHY3IF49IHYxMTtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSAxMikgfCB2NyA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG0xMjtcbiAgICAgICAgdjIgKz0gdjY7XG4gICAgICAgIHYxNCBePSB2MjtcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDgpIHwgdjE0ID4+PiA4O1xuICAgICAgICB2MTAgKz0gdjE0O1xuICAgICAgICB2NiBePSB2MTA7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gNykgfCB2NiA+Pj4gNztcbiAgICAgICAgdjMgKz0gbTE0O1xuICAgICAgICB2MyArPSB2NztcbiAgICAgICAgdjE1IF49IHYzO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gOCkgfCB2MTUgPj4+IDg7XG4gICAgICAgIHYxMSArPSB2MTU7XG4gICAgICAgIHY3IF49IHYxMTtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSA3KSB8IHY3ID4+PiA3O1xuICAgICAgICB2MSArPSBtMTtcbiAgICAgICAgdjEgKz0gdjU7XG4gICAgICAgIHYxMyBePSB2MTtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDgpIHwgdjEzID4+PiA4O1xuICAgICAgICB2OSArPSB2MTM7XG4gICAgICAgIHY1IF49IHY5O1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDcpIHwgdjUgPj4+IDc7XG4gICAgICAgIHYwICs9IG05O1xuICAgICAgICB2MCArPSB2NDtcbiAgICAgICAgdjEyIF49IHYwO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gOCkgfCB2MTIgPj4+IDg7XG4gICAgICAgIHY4ICs9IHYxMjtcbiAgICAgICAgdjQgXj0gdjg7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gNykgfCB2NCA+Pj4gNztcbiAgICAgICAgdjAgKz0gbTI7XG4gICAgICAgIHYwICs9IHY1O1xuICAgICAgICB2MTUgXj0gdjA7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSAxNikgfCB2MTUgPj4+IDE2O1xuICAgICAgICB2MTAgKz0gdjE1O1xuICAgICAgICB2NSBePSB2MTA7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gMTIpIHwgdjUgPj4+IDEyO1xuICAgICAgICB2MSArPSBtNTtcbiAgICAgICAgdjEgKz0gdjY7XG4gICAgICAgIHYxMiBePSB2MTtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDE2KSB8IHYxMiA+Pj4gMTY7XG4gICAgICAgIHYxMSArPSB2MTI7XG4gICAgICAgIHY2IF49IHYxMTtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSAxMikgfCB2NiA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG00O1xuICAgICAgICB2MiArPSB2NztcbiAgICAgICAgdjEzIF49IHYyO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gMTYpIHwgdjEzID4+PiAxNjtcbiAgICAgICAgdjggKz0gdjEzO1xuICAgICAgICB2NyBePSB2ODtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSAxMikgfCB2NyA+Pj4gMTI7XG4gICAgICAgIHYzICs9IG0xNTtcbiAgICAgICAgdjMgKz0gdjQ7XG4gICAgICAgIHYxNCBePSB2MztcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDE2KSB8IHYxNCA+Pj4gMTY7XG4gICAgICAgIHY5ICs9IHYxNDtcbiAgICAgICAgdjQgXj0gdjk7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gMTIpIHwgdjQgPj4+IDEyO1xuICAgICAgICB2MiArPSBtMDtcbiAgICAgICAgdjIgKz0gdjc7XG4gICAgICAgIHYxMyBePSB2MjtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDgpIHwgdjEzID4+PiA4O1xuICAgICAgICB2OCArPSB2MTM7XG4gICAgICAgIHY3IF49IHY4O1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDcpIHwgdjcgPj4+IDc7XG4gICAgICAgIHYzICs9IG04O1xuICAgICAgICB2MyArPSB2NDtcbiAgICAgICAgdjE0IF49IHYzO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gOCkgfCB2MTQgPj4+IDg7XG4gICAgICAgIHY5ICs9IHYxNDtcbiAgICAgICAgdjQgXj0gdjk7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gNykgfCB2NCA+Pj4gNztcbiAgICAgICAgdjEgKz0gbTEwO1xuICAgICAgICB2MSArPSB2NjtcbiAgICAgICAgdjEyIF49IHYxO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gOCkgfCB2MTIgPj4+IDg7XG4gICAgICAgIHYxMSArPSB2MTI7XG4gICAgICAgIHY2IF49IHYxMTtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSA3KSB8IHY2ID4+PiA3O1xuICAgICAgICB2MCArPSBtNjtcbiAgICAgICAgdjAgKz0gdjU7XG4gICAgICAgIHYxNSBePSB2MDtcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDgpIHwgdjE1ID4+PiA4O1xuICAgICAgICB2MTAgKz0gdjE1O1xuICAgICAgICB2NSBePSB2MTA7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gNykgfCB2NSA+Pj4gNztcblxuICAgICAgICAvLyBSb3VuZCA1LlxuICAgICAgICB2MCArPSBtOTtcbiAgICAgICAgdjAgKz0gdjQ7XG4gICAgICAgIHYxMiBePSB2MDtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDE2KSB8IHYxMiA+Pj4gMTY7XG4gICAgICAgIHY4ICs9IHYxMjtcbiAgICAgICAgdjQgXj0gdjg7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gMTIpIHwgdjQgPj4+IDEyO1xuICAgICAgICB2MSArPSBtNTtcbiAgICAgICAgdjEgKz0gdjU7XG4gICAgICAgIHYxMyBePSB2MTtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDE2KSB8IHYxMyA+Pj4gMTY7XG4gICAgICAgIHY5ICs9IHYxMztcbiAgICAgICAgdjUgXj0gdjk7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gMTIpIHwgdjUgPj4+IDEyO1xuICAgICAgICB2MiArPSBtMjtcbiAgICAgICAgdjIgKz0gdjY7XG4gICAgICAgIHYxNCBePSB2MjtcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDE2KSB8IHYxNCA+Pj4gMTY7XG4gICAgICAgIHYxMCArPSB2MTQ7XG4gICAgICAgIHY2IF49IHYxMDtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSAxMikgfCB2NiA+Pj4gMTI7XG4gICAgICAgIHYzICs9IG0xMDtcbiAgICAgICAgdjMgKz0gdjc7XG4gICAgICAgIHYxNSBePSB2MztcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDE2KSB8IHYxNSA+Pj4gMTY7XG4gICAgICAgIHYxMSArPSB2MTU7XG4gICAgICAgIHY3IF49IHYxMTtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSAxMikgfCB2NyA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG00O1xuICAgICAgICB2MiArPSB2NjtcbiAgICAgICAgdjE0IF49IHYyO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gOCkgfCB2MTQgPj4+IDg7XG4gICAgICAgIHYxMCArPSB2MTQ7XG4gICAgICAgIHY2IF49IHYxMDtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSA3KSB8IHY2ID4+PiA3O1xuICAgICAgICB2MyArPSBtMTU7XG4gICAgICAgIHYzICs9IHY3O1xuICAgICAgICB2MTUgXj0gdjM7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSA4KSB8IHYxNSA+Pj4gODtcbiAgICAgICAgdjExICs9IHYxNTtcbiAgICAgICAgdjcgXj0gdjExO1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDcpIHwgdjcgPj4+IDc7XG4gICAgICAgIHYxICs9IG03O1xuICAgICAgICB2MSArPSB2NTtcbiAgICAgICAgdjEzIF49IHYxO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gOCkgfCB2MTMgPj4+IDg7XG4gICAgICAgIHY5ICs9IHYxMztcbiAgICAgICAgdjUgXj0gdjk7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gNykgfCB2NSA+Pj4gNztcbiAgICAgICAgdjAgKz0gbTA7XG4gICAgICAgIHYwICs9IHY0O1xuICAgICAgICB2MTIgXj0gdjA7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSA4KSB8IHYxMiA+Pj4gODtcbiAgICAgICAgdjggKz0gdjEyO1xuICAgICAgICB2NCBePSB2ODtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSA3KSB8IHY0ID4+PiA3O1xuICAgICAgICB2MCArPSBtMTQ7XG4gICAgICAgIHYwICs9IHY1O1xuICAgICAgICB2MTUgXj0gdjA7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSAxNikgfCB2MTUgPj4+IDE2O1xuICAgICAgICB2MTAgKz0gdjE1O1xuICAgICAgICB2NSBePSB2MTA7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gMTIpIHwgdjUgPj4+IDEyO1xuICAgICAgICB2MSArPSBtMTE7XG4gICAgICAgIHYxICs9IHY2O1xuICAgICAgICB2MTIgXj0gdjE7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSAxNikgfCB2MTIgPj4+IDE2O1xuICAgICAgICB2MTEgKz0gdjEyO1xuICAgICAgICB2NiBePSB2MTE7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gMTIpIHwgdjYgPj4+IDEyO1xuICAgICAgICB2MiArPSBtNjtcbiAgICAgICAgdjIgKz0gdjc7XG4gICAgICAgIHYxMyBePSB2MjtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDE2KSB8IHYxMyA+Pj4gMTY7XG4gICAgICAgIHY4ICs9IHYxMztcbiAgICAgICAgdjcgXj0gdjg7XG4gICAgICAgIHY3ID0gdjcgPDwgKDMyIC0gMTIpIHwgdjcgPj4+IDEyO1xuICAgICAgICB2MyArPSBtMztcbiAgICAgICAgdjMgKz0gdjQ7XG4gICAgICAgIHYxNCBePSB2MztcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDE2KSB8IHYxNCA+Pj4gMTY7XG4gICAgICAgIHY5ICs9IHYxNDtcbiAgICAgICAgdjQgXj0gdjk7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gMTIpIHwgdjQgPj4+IDEyO1xuICAgICAgICB2MiArPSBtODtcbiAgICAgICAgdjIgKz0gdjc7XG4gICAgICAgIHYxMyBePSB2MjtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDgpIHwgdjEzID4+PiA4O1xuICAgICAgICB2OCArPSB2MTM7XG4gICAgICAgIHY3IF49IHY4O1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDcpIHwgdjcgPj4+IDc7XG4gICAgICAgIHYzICs9IG0xMztcbiAgICAgICAgdjMgKz0gdjQ7XG4gICAgICAgIHYxNCBePSB2MztcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDgpIHwgdjE0ID4+PiA4O1xuICAgICAgICB2OSArPSB2MTQ7XG4gICAgICAgIHY0IF49IHY5O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDcpIHwgdjQgPj4+IDc7XG4gICAgICAgIHYxICs9IG0xMjtcbiAgICAgICAgdjEgKz0gdjY7XG4gICAgICAgIHYxMiBePSB2MTtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDgpIHwgdjEyID4+PiA4O1xuICAgICAgICB2MTEgKz0gdjEyO1xuICAgICAgICB2NiBePSB2MTE7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gNykgfCB2NiA+Pj4gNztcbiAgICAgICAgdjAgKz0gbTE7XG4gICAgICAgIHYwICs9IHY1O1xuICAgICAgICB2MTUgXj0gdjA7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSA4KSB8IHYxNSA+Pj4gODtcbiAgICAgICAgdjEwICs9IHYxNTtcbiAgICAgICAgdjUgXj0gdjEwO1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDcpIHwgdjUgPj4+IDc7XG5cbiAgICAgICAgLy8gUm91bmQgNi5cbiAgICAgICAgdjAgKz0gbTI7XG4gICAgICAgIHYwICs9IHY0O1xuICAgICAgICB2MTIgXj0gdjA7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSAxNikgfCB2MTIgPj4+IDE2O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDEyKSB8IHY0ID4+PiAxMjtcbiAgICAgICAgdjEgKz0gbTY7XG4gICAgICAgIHYxICs9IHY1O1xuICAgICAgICB2MTMgXj0gdjE7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSAxNikgfCB2MTMgPj4+IDE2O1xuICAgICAgICB2OSArPSB2MTM7XG4gICAgICAgIHY1IF49IHY5O1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDEyKSB8IHY1ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTA7XG4gICAgICAgIHYyICs9IHY2O1xuICAgICAgICB2MTQgXj0gdjI7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSAxNikgfCB2MTQgPj4+IDE2O1xuICAgICAgICB2MTAgKz0gdjE0O1xuICAgICAgICB2NiBePSB2MTA7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gMTIpIHwgdjYgPj4+IDEyO1xuICAgICAgICB2MyArPSBtODtcbiAgICAgICAgdjMgKz0gdjc7XG4gICAgICAgIHYxNSBePSB2MztcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDE2KSB8IHYxNSA+Pj4gMTY7XG4gICAgICAgIHYxMSArPSB2MTU7XG4gICAgICAgIHY3IF49IHYxMTtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSAxMikgfCB2NyA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG0xMTtcbiAgICAgICAgdjIgKz0gdjY7XG4gICAgICAgIHYxNCBePSB2MjtcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDgpIHwgdjE0ID4+PiA4O1xuICAgICAgICB2MTAgKz0gdjE0O1xuICAgICAgICB2NiBePSB2MTA7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gNykgfCB2NiA+Pj4gNztcbiAgICAgICAgdjMgKz0gbTM7XG4gICAgICAgIHYzICs9IHY3O1xuICAgICAgICB2MTUgXj0gdjM7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSA4KSB8IHYxNSA+Pj4gODtcbiAgICAgICAgdjExICs9IHYxNTtcbiAgICAgICAgdjcgXj0gdjExO1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDcpIHwgdjcgPj4+IDc7XG4gICAgICAgIHYxICs9IG0xMDtcbiAgICAgICAgdjEgKz0gdjU7XG4gICAgICAgIHYxMyBePSB2MTtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDgpIHwgdjEzID4+PiA4O1xuICAgICAgICB2OSArPSB2MTM7XG4gICAgICAgIHY1IF49IHY5O1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDcpIHwgdjUgPj4+IDc7XG4gICAgICAgIHYwICs9IG0xMjtcbiAgICAgICAgdjAgKz0gdjQ7XG4gICAgICAgIHYxMiBePSB2MDtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDgpIHwgdjEyID4+PiA4O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDcpIHwgdjQgPj4+IDc7XG4gICAgICAgIHYwICs9IG00O1xuICAgICAgICB2MCArPSB2NTtcbiAgICAgICAgdjE1IF49IHYwO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gMTYpIHwgdjE1ID4+PiAxNjtcbiAgICAgICAgdjEwICs9IHYxNTtcbiAgICAgICAgdjUgXj0gdjEwO1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDEyKSB8IHY1ID4+PiAxMjtcbiAgICAgICAgdjEgKz0gbTc7XG4gICAgICAgIHYxICs9IHY2O1xuICAgICAgICB2MTIgXj0gdjE7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSAxNikgfCB2MTIgPj4+IDE2O1xuICAgICAgICB2MTEgKz0gdjEyO1xuICAgICAgICB2NiBePSB2MTE7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gMTIpIHwgdjYgPj4+IDEyO1xuICAgICAgICB2MiArPSBtMTU7XG4gICAgICAgIHYyICs9IHY3O1xuICAgICAgICB2MTMgXj0gdjI7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSAxNikgfCB2MTMgPj4+IDE2O1xuICAgICAgICB2OCArPSB2MTM7XG4gICAgICAgIHY3IF49IHY4O1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDEyKSB8IHY3ID4+PiAxMjtcbiAgICAgICAgdjMgKz0gbTE7XG4gICAgICAgIHYzICs9IHY0O1xuICAgICAgICB2MTQgXj0gdjM7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSAxNikgfCB2MTQgPj4+IDE2O1xuICAgICAgICB2OSArPSB2MTQ7XG4gICAgICAgIHY0IF49IHY5O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDEyKSB8IHY0ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTE0O1xuICAgICAgICB2MiArPSB2NztcbiAgICAgICAgdjEzIF49IHYyO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gOCkgfCB2MTMgPj4+IDg7XG4gICAgICAgIHY4ICs9IHYxMztcbiAgICAgICAgdjcgXj0gdjg7XG4gICAgICAgIHY3ID0gdjcgPDwgKDMyIC0gNykgfCB2NyA+Pj4gNztcbiAgICAgICAgdjMgKz0gbTk7XG4gICAgICAgIHYzICs9IHY0O1xuICAgICAgICB2MTQgXj0gdjM7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSA4KSB8IHYxNCA+Pj4gODtcbiAgICAgICAgdjkgKz0gdjE0O1xuICAgICAgICB2NCBePSB2OTtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSA3KSB8IHY0ID4+PiA3O1xuICAgICAgICB2MSArPSBtNTtcbiAgICAgICAgdjEgKz0gdjY7XG4gICAgICAgIHYxMiBePSB2MTtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDgpIHwgdjEyID4+PiA4O1xuICAgICAgICB2MTEgKz0gdjEyO1xuICAgICAgICB2NiBePSB2MTE7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gNykgfCB2NiA+Pj4gNztcbiAgICAgICAgdjAgKz0gbTEzO1xuICAgICAgICB2MCArPSB2NTtcbiAgICAgICAgdjE1IF49IHYwO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gOCkgfCB2MTUgPj4+IDg7XG4gICAgICAgIHYxMCArPSB2MTU7XG4gICAgICAgIHY1IF49IHYxMDtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSA3KSB8IHY1ID4+PiA3O1xuXG4gICAgICAgIC8vIFJvdW5kIDcuXG4gICAgICAgIHYwICs9IG0xMjtcbiAgICAgICAgdjAgKz0gdjQ7XG4gICAgICAgIHYxMiBePSB2MDtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDE2KSB8IHYxMiA+Pj4gMTY7XG4gICAgICAgIHY4ICs9IHYxMjtcbiAgICAgICAgdjQgXj0gdjg7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gMTIpIHwgdjQgPj4+IDEyO1xuICAgICAgICB2MSArPSBtMTtcbiAgICAgICAgdjEgKz0gdjU7XG4gICAgICAgIHYxMyBePSB2MTtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDE2KSB8IHYxMyA+Pj4gMTY7XG4gICAgICAgIHY5ICs9IHYxMztcbiAgICAgICAgdjUgXj0gdjk7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gMTIpIHwgdjUgPj4+IDEyO1xuICAgICAgICB2MiArPSBtMTQ7XG4gICAgICAgIHYyICs9IHY2O1xuICAgICAgICB2MTQgXj0gdjI7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSAxNikgfCB2MTQgPj4+IDE2O1xuICAgICAgICB2MTAgKz0gdjE0O1xuICAgICAgICB2NiBePSB2MTA7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gMTIpIHwgdjYgPj4+IDEyO1xuICAgICAgICB2MyArPSBtNDtcbiAgICAgICAgdjMgKz0gdjc7XG4gICAgICAgIHYxNSBePSB2MztcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDE2KSB8IHYxNSA+Pj4gMTY7XG4gICAgICAgIHYxMSArPSB2MTU7XG4gICAgICAgIHY3IF49IHYxMTtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSAxMikgfCB2NyA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG0xMztcbiAgICAgICAgdjIgKz0gdjY7XG4gICAgICAgIHYxNCBePSB2MjtcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDgpIHwgdjE0ID4+PiA4O1xuICAgICAgICB2MTAgKz0gdjE0O1xuICAgICAgICB2NiBePSB2MTA7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gNykgfCB2NiA+Pj4gNztcbiAgICAgICAgdjMgKz0gbTEwO1xuICAgICAgICB2MyArPSB2NztcbiAgICAgICAgdjE1IF49IHYzO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gOCkgfCB2MTUgPj4+IDg7XG4gICAgICAgIHYxMSArPSB2MTU7XG4gICAgICAgIHY3IF49IHYxMTtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSA3KSB8IHY3ID4+PiA3O1xuICAgICAgICB2MSArPSBtMTU7XG4gICAgICAgIHYxICs9IHY1O1xuICAgICAgICB2MTMgXj0gdjE7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSA4KSB8IHYxMyA+Pj4gODtcbiAgICAgICAgdjkgKz0gdjEzO1xuICAgICAgICB2NSBePSB2OTtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSA3KSB8IHY1ID4+PiA3O1xuICAgICAgICB2MCArPSBtNTtcbiAgICAgICAgdjAgKz0gdjQ7XG4gICAgICAgIHYxMiBePSB2MDtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDgpIHwgdjEyID4+PiA4O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDcpIHwgdjQgPj4+IDc7XG4gICAgICAgIHYwICs9IG0wO1xuICAgICAgICB2MCArPSB2NTtcbiAgICAgICAgdjE1IF49IHYwO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gMTYpIHwgdjE1ID4+PiAxNjtcbiAgICAgICAgdjEwICs9IHYxNTtcbiAgICAgICAgdjUgXj0gdjEwO1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDEyKSB8IHY1ID4+PiAxMjtcbiAgICAgICAgdjEgKz0gbTY7XG4gICAgICAgIHYxICs9IHY2O1xuICAgICAgICB2MTIgXj0gdjE7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSAxNikgfCB2MTIgPj4+IDE2O1xuICAgICAgICB2MTEgKz0gdjEyO1xuICAgICAgICB2NiBePSB2MTE7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gMTIpIHwgdjYgPj4+IDEyO1xuICAgICAgICB2MiArPSBtOTtcbiAgICAgICAgdjIgKz0gdjc7XG4gICAgICAgIHYxMyBePSB2MjtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDE2KSB8IHYxMyA+Pj4gMTY7XG4gICAgICAgIHY4ICs9IHYxMztcbiAgICAgICAgdjcgXj0gdjg7XG4gICAgICAgIHY3ID0gdjcgPDwgKDMyIC0gMTIpIHwgdjcgPj4+IDEyO1xuICAgICAgICB2MyArPSBtODtcbiAgICAgICAgdjMgKz0gdjQ7XG4gICAgICAgIHYxNCBePSB2MztcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDE2KSB8IHYxNCA+Pj4gMTY7XG4gICAgICAgIHY5ICs9IHYxNDtcbiAgICAgICAgdjQgXj0gdjk7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gMTIpIHwgdjQgPj4+IDEyO1xuICAgICAgICB2MiArPSBtMjtcbiAgICAgICAgdjIgKz0gdjc7XG4gICAgICAgIHYxMyBePSB2MjtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDgpIHwgdjEzID4+PiA4O1xuICAgICAgICB2OCArPSB2MTM7XG4gICAgICAgIHY3IF49IHY4O1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDcpIHwgdjcgPj4+IDc7XG4gICAgICAgIHYzICs9IG0xMTtcbiAgICAgICAgdjMgKz0gdjQ7XG4gICAgICAgIHYxNCBePSB2MztcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDgpIHwgdjE0ID4+PiA4O1xuICAgICAgICB2OSArPSB2MTQ7XG4gICAgICAgIHY0IF49IHY5O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDcpIHwgdjQgPj4+IDc7XG4gICAgICAgIHYxICs9IG0zO1xuICAgICAgICB2MSArPSB2NjtcbiAgICAgICAgdjEyIF49IHYxO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gOCkgfCB2MTIgPj4+IDg7XG4gICAgICAgIHYxMSArPSB2MTI7XG4gICAgICAgIHY2IF49IHYxMTtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSA3KSB8IHY2ID4+PiA3O1xuICAgICAgICB2MCArPSBtNztcbiAgICAgICAgdjAgKz0gdjU7XG4gICAgICAgIHYxNSBePSB2MDtcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDgpIHwgdjE1ID4+PiA4O1xuICAgICAgICB2MTAgKz0gdjE1O1xuICAgICAgICB2NSBePSB2MTA7XG4gICAgICAgIHY1ID0gdjUgPDwgKDMyIC0gNykgfCB2NSA+Pj4gNztcblxuICAgICAgICAvLyBSb3VuZCA4LlxuICAgICAgICB2MCArPSBtMTM7XG4gICAgICAgIHYwICs9IHY0O1xuICAgICAgICB2MTIgXj0gdjA7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSAxNikgfCB2MTIgPj4+IDE2O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDEyKSB8IHY0ID4+PiAxMjtcbiAgICAgICAgdjEgKz0gbTc7XG4gICAgICAgIHYxICs9IHY1O1xuICAgICAgICB2MTMgXj0gdjE7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSAxNikgfCB2MTMgPj4+IDE2O1xuICAgICAgICB2OSArPSB2MTM7XG4gICAgICAgIHY1IF49IHY5O1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDEyKSB8IHY1ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTEyO1xuICAgICAgICB2MiArPSB2NjtcbiAgICAgICAgdjE0IF49IHYyO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gMTYpIHwgdjE0ID4+PiAxNjtcbiAgICAgICAgdjEwICs9IHYxNDtcbiAgICAgICAgdjYgXj0gdjEwO1xuICAgICAgICB2NiA9IHY2IDw8ICgzMiAtIDEyKSB8IHY2ID4+PiAxMjtcbiAgICAgICAgdjMgKz0gbTM7XG4gICAgICAgIHYzICs9IHY3O1xuICAgICAgICB2MTUgXj0gdjM7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSAxNikgfCB2MTUgPj4+IDE2O1xuICAgICAgICB2MTEgKz0gdjE1O1xuICAgICAgICB2NyBePSB2MTE7XG4gICAgICAgIHY3ID0gdjcgPDwgKDMyIC0gMTIpIHwgdjcgPj4+IDEyO1xuICAgICAgICB2MiArPSBtMTtcbiAgICAgICAgdjIgKz0gdjY7XG4gICAgICAgIHYxNCBePSB2MjtcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDgpIHwgdjE0ID4+PiA4O1xuICAgICAgICB2MTAgKz0gdjE0O1xuICAgICAgICB2NiBePSB2MTA7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gNykgfCB2NiA+Pj4gNztcbiAgICAgICAgdjMgKz0gbTk7XG4gICAgICAgIHYzICs9IHY3O1xuICAgICAgICB2MTUgXj0gdjM7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSA4KSB8IHYxNSA+Pj4gODtcbiAgICAgICAgdjExICs9IHYxNTtcbiAgICAgICAgdjcgXj0gdjExO1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDcpIHwgdjcgPj4+IDc7XG4gICAgICAgIHYxICs9IG0xNDtcbiAgICAgICAgdjEgKz0gdjU7XG4gICAgICAgIHYxMyBePSB2MTtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDgpIHwgdjEzID4+PiA4O1xuICAgICAgICB2OSArPSB2MTM7XG4gICAgICAgIHY1IF49IHY5O1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDcpIHwgdjUgPj4+IDc7XG4gICAgICAgIHYwICs9IG0xMTtcbiAgICAgICAgdjAgKz0gdjQ7XG4gICAgICAgIHYxMiBePSB2MDtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDgpIHwgdjEyID4+PiA4O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDcpIHwgdjQgPj4+IDc7XG4gICAgICAgIHYwICs9IG01O1xuICAgICAgICB2MCArPSB2NTtcbiAgICAgICAgdjE1IF49IHYwO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gMTYpIHwgdjE1ID4+PiAxNjtcbiAgICAgICAgdjEwICs9IHYxNTtcbiAgICAgICAgdjUgXj0gdjEwO1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDEyKSB8IHY1ID4+PiAxMjtcbiAgICAgICAgdjEgKz0gbTE1O1xuICAgICAgICB2MSArPSB2NjtcbiAgICAgICAgdjEyIF49IHYxO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gMTYpIHwgdjEyID4+PiAxNjtcbiAgICAgICAgdjExICs9IHYxMjtcbiAgICAgICAgdjYgXj0gdjExO1xuICAgICAgICB2NiA9IHY2IDw8ICgzMiAtIDEyKSB8IHY2ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTg7XG4gICAgICAgIHYyICs9IHY3O1xuICAgICAgICB2MTMgXj0gdjI7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSAxNikgfCB2MTMgPj4+IDE2O1xuICAgICAgICB2OCArPSB2MTM7XG4gICAgICAgIHY3IF49IHY4O1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDEyKSB8IHY3ID4+PiAxMjtcbiAgICAgICAgdjMgKz0gbTI7XG4gICAgICAgIHYzICs9IHY0O1xuICAgICAgICB2MTQgXj0gdjM7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSAxNikgfCB2MTQgPj4+IDE2O1xuICAgICAgICB2OSArPSB2MTQ7XG4gICAgICAgIHY0IF49IHY5O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDEyKSB8IHY0ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTY7XG4gICAgICAgIHYyICs9IHY3O1xuICAgICAgICB2MTMgXj0gdjI7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSA4KSB8IHYxMyA+Pj4gODtcbiAgICAgICAgdjggKz0gdjEzO1xuICAgICAgICB2NyBePSB2ODtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSA3KSB8IHY3ID4+PiA3O1xuICAgICAgICB2MyArPSBtMTA7XG4gICAgICAgIHYzICs9IHY0O1xuICAgICAgICB2MTQgXj0gdjM7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSA4KSB8IHYxNCA+Pj4gODtcbiAgICAgICAgdjkgKz0gdjE0O1xuICAgICAgICB2NCBePSB2OTtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSA3KSB8IHY0ID4+PiA3O1xuICAgICAgICB2MSArPSBtNDtcbiAgICAgICAgdjEgKz0gdjY7XG4gICAgICAgIHYxMiBePSB2MTtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDgpIHwgdjEyID4+PiA4O1xuICAgICAgICB2MTEgKz0gdjEyO1xuICAgICAgICB2NiBePSB2MTE7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gNykgfCB2NiA+Pj4gNztcbiAgICAgICAgdjAgKz0gbTA7XG4gICAgICAgIHYwICs9IHY1O1xuICAgICAgICB2MTUgXj0gdjA7XG4gICAgICAgIHYxNSA9IHYxNSA8PCAoMzIgLSA4KSB8IHYxNSA+Pj4gODtcbiAgICAgICAgdjEwICs9IHYxNTtcbiAgICAgICAgdjUgXj0gdjEwO1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDcpIHwgdjUgPj4+IDc7XG5cbiAgICAgICAgLy8gUm91bmQgOS5cbiAgICAgICAgdjAgKz0gbTY7XG4gICAgICAgIHYwICs9IHY0O1xuICAgICAgICB2MTIgXj0gdjA7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSAxNikgfCB2MTIgPj4+IDE2O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDEyKSB8IHY0ID4+PiAxMjtcbiAgICAgICAgdjEgKz0gbTE0O1xuICAgICAgICB2MSArPSB2NTtcbiAgICAgICAgdjEzIF49IHYxO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gMTYpIHwgdjEzID4+PiAxNjtcbiAgICAgICAgdjkgKz0gdjEzO1xuICAgICAgICB2NSBePSB2OTtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSAxMikgfCB2NSA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG0xMTtcbiAgICAgICAgdjIgKz0gdjY7XG4gICAgICAgIHYxNCBePSB2MjtcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDE2KSB8IHYxNCA+Pj4gMTY7XG4gICAgICAgIHYxMCArPSB2MTQ7XG4gICAgICAgIHY2IF49IHYxMDtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSAxMikgfCB2NiA+Pj4gMTI7XG4gICAgICAgIHYzICs9IG0wO1xuICAgICAgICB2MyArPSB2NztcbiAgICAgICAgdjE1IF49IHYzO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gMTYpIHwgdjE1ID4+PiAxNjtcbiAgICAgICAgdjExICs9IHYxNTtcbiAgICAgICAgdjcgXj0gdjExO1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDEyKSB8IHY3ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTM7XG4gICAgICAgIHYyICs9IHY2O1xuICAgICAgICB2MTQgXj0gdjI7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSA4KSB8IHYxNCA+Pj4gODtcbiAgICAgICAgdjEwICs9IHYxNDtcbiAgICAgICAgdjYgXj0gdjEwO1xuICAgICAgICB2NiA9IHY2IDw8ICgzMiAtIDcpIHwgdjYgPj4+IDc7XG4gICAgICAgIHYzICs9IG04O1xuICAgICAgICB2MyArPSB2NztcbiAgICAgICAgdjE1IF49IHYzO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gOCkgfCB2MTUgPj4+IDg7XG4gICAgICAgIHYxMSArPSB2MTU7XG4gICAgICAgIHY3IF49IHYxMTtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSA3KSB8IHY3ID4+PiA3O1xuICAgICAgICB2MSArPSBtOTtcbiAgICAgICAgdjEgKz0gdjU7XG4gICAgICAgIHYxMyBePSB2MTtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDgpIHwgdjEzID4+PiA4O1xuICAgICAgICB2OSArPSB2MTM7XG4gICAgICAgIHY1IF49IHY5O1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDcpIHwgdjUgPj4+IDc7XG4gICAgICAgIHYwICs9IG0xNTtcbiAgICAgICAgdjAgKz0gdjQ7XG4gICAgICAgIHYxMiBePSB2MDtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDgpIHwgdjEyID4+PiA4O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDcpIHwgdjQgPj4+IDc7XG4gICAgICAgIHYwICs9IG0xMjtcbiAgICAgICAgdjAgKz0gdjU7XG4gICAgICAgIHYxNSBePSB2MDtcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDE2KSB8IHYxNSA+Pj4gMTY7XG4gICAgICAgIHYxMCArPSB2MTU7XG4gICAgICAgIHY1IF49IHYxMDtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSAxMikgfCB2NSA+Pj4gMTI7XG4gICAgICAgIHYxICs9IG0xMztcbiAgICAgICAgdjEgKz0gdjY7XG4gICAgICAgIHYxMiBePSB2MTtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDE2KSB8IHYxMiA+Pj4gMTY7XG4gICAgICAgIHYxMSArPSB2MTI7XG4gICAgICAgIHY2IF49IHYxMTtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSAxMikgfCB2NiA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG0xO1xuICAgICAgICB2MiArPSB2NztcbiAgICAgICAgdjEzIF49IHYyO1xuICAgICAgICB2MTMgPSB2MTMgPDwgKDMyIC0gMTYpIHwgdjEzID4+PiAxNjtcbiAgICAgICAgdjggKz0gdjEzO1xuICAgICAgICB2NyBePSB2ODtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSAxMikgfCB2NyA+Pj4gMTI7XG4gICAgICAgIHYzICs9IG0xMDtcbiAgICAgICAgdjMgKz0gdjQ7XG4gICAgICAgIHYxNCBePSB2MztcbiAgICAgICAgdjE0ID0gdjE0IDw8ICgzMiAtIDE2KSB8IHYxNCA+Pj4gMTY7XG4gICAgICAgIHY5ICs9IHYxNDtcbiAgICAgICAgdjQgXj0gdjk7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gMTIpIHwgdjQgPj4+IDEyO1xuICAgICAgICB2MiArPSBtNDtcbiAgICAgICAgdjIgKz0gdjc7XG4gICAgICAgIHYxMyBePSB2MjtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDgpIHwgdjEzID4+PiA4O1xuICAgICAgICB2OCArPSB2MTM7XG4gICAgICAgIHY3IF49IHY4O1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDcpIHwgdjcgPj4+IDc7XG4gICAgICAgIHYzICs9IG01O1xuICAgICAgICB2MyArPSB2NDtcbiAgICAgICAgdjE0IF49IHYzO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gOCkgfCB2MTQgPj4+IDg7XG4gICAgICAgIHY5ICs9IHYxNDtcbiAgICAgICAgdjQgXj0gdjk7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gNykgfCB2NCA+Pj4gNztcbiAgICAgICAgdjEgKz0gbTc7XG4gICAgICAgIHYxICs9IHY2O1xuICAgICAgICB2MTIgXj0gdjE7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSA4KSB8IHYxMiA+Pj4gODtcbiAgICAgICAgdjExICs9IHYxMjtcbiAgICAgICAgdjYgXj0gdjExO1xuICAgICAgICB2NiA9IHY2IDw8ICgzMiAtIDcpIHwgdjYgPj4+IDc7XG4gICAgICAgIHYwICs9IG0yO1xuICAgICAgICB2MCArPSB2NTtcbiAgICAgICAgdjE1IF49IHYwO1xuICAgICAgICB2MTUgPSB2MTUgPDwgKDMyIC0gOCkgfCB2MTUgPj4+IDg7XG4gICAgICAgIHYxMCArPSB2MTU7XG4gICAgICAgIHY1IF49IHYxMDtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSA3KSB8IHY1ID4+PiA3O1xuXG4gICAgICAgIC8vIFJvdW5kIDEwLlxuICAgICAgICB2MCArPSBtMTA7XG4gICAgICAgIHYwICs9IHY0O1xuICAgICAgICB2MTIgXj0gdjA7XG4gICAgICAgIHYxMiA9IHYxMiA8PCAoMzIgLSAxNikgfCB2MTIgPj4+IDE2O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDEyKSB8IHY0ID4+PiAxMjtcbiAgICAgICAgdjEgKz0gbTg7XG4gICAgICAgIHYxICs9IHY1O1xuICAgICAgICB2MTMgXj0gdjE7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSAxNikgfCB2MTMgPj4+IDE2O1xuICAgICAgICB2OSArPSB2MTM7XG4gICAgICAgIHY1IF49IHY5O1xuICAgICAgICB2NSA9IHY1IDw8ICgzMiAtIDEyKSB8IHY1ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTc7XG4gICAgICAgIHYyICs9IHY2O1xuICAgICAgICB2MTQgXj0gdjI7XG4gICAgICAgIHYxNCA9IHYxNCA8PCAoMzIgLSAxNikgfCB2MTQgPj4+IDE2O1xuICAgICAgICB2MTAgKz0gdjE0O1xuICAgICAgICB2NiBePSB2MTA7XG4gICAgICAgIHY2ID0gdjYgPDwgKDMyIC0gMTIpIHwgdjYgPj4+IDEyO1xuICAgICAgICB2MyArPSBtMTtcbiAgICAgICAgdjMgKz0gdjc7XG4gICAgICAgIHYxNSBePSB2MztcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDE2KSB8IHYxNSA+Pj4gMTY7XG4gICAgICAgIHYxMSArPSB2MTU7XG4gICAgICAgIHY3IF49IHYxMTtcbiAgICAgICAgdjcgPSB2NyA8PCAoMzIgLSAxMikgfCB2NyA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG02O1xuICAgICAgICB2MiArPSB2NjtcbiAgICAgICAgdjE0IF49IHYyO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gOCkgfCB2MTQgPj4+IDg7XG4gICAgICAgIHYxMCArPSB2MTQ7XG4gICAgICAgIHY2IF49IHYxMDtcbiAgICAgICAgdjYgPSB2NiA8PCAoMzIgLSA3KSB8IHY2ID4+PiA3O1xuICAgICAgICB2MyArPSBtNTtcbiAgICAgICAgdjMgKz0gdjc7XG4gICAgICAgIHYxNSBePSB2MztcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDgpIHwgdjE1ID4+PiA4O1xuICAgICAgICB2MTEgKz0gdjE1O1xuICAgICAgICB2NyBePSB2MTE7XG4gICAgICAgIHY3ID0gdjcgPDwgKDMyIC0gNykgfCB2NyA+Pj4gNztcbiAgICAgICAgdjEgKz0gbTQ7XG4gICAgICAgIHYxICs9IHY1O1xuICAgICAgICB2MTMgXj0gdjE7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSA4KSB8IHYxMyA+Pj4gODtcbiAgICAgICAgdjkgKz0gdjEzO1xuICAgICAgICB2NSBePSB2OTtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSA3KSB8IHY1ID4+PiA3O1xuICAgICAgICB2MCArPSBtMjtcbiAgICAgICAgdjAgKz0gdjQ7XG4gICAgICAgIHYxMiBePSB2MDtcbiAgICAgICAgdjEyID0gdjEyIDw8ICgzMiAtIDgpIHwgdjEyID4+PiA4O1xuICAgICAgICB2OCArPSB2MTI7XG4gICAgICAgIHY0IF49IHY4O1xuICAgICAgICB2NCA9IHY0IDw8ICgzMiAtIDcpIHwgdjQgPj4+IDc7XG4gICAgICAgIHYwICs9IG0xNTtcbiAgICAgICAgdjAgKz0gdjU7XG4gICAgICAgIHYxNSBePSB2MDtcbiAgICAgICAgdjE1ID0gdjE1IDw8ICgzMiAtIDE2KSB8IHYxNSA+Pj4gMTY7XG4gICAgICAgIHYxMCArPSB2MTU7XG4gICAgICAgIHY1IF49IHYxMDtcbiAgICAgICAgdjUgPSB2NSA8PCAoMzIgLSAxMikgfCB2NSA+Pj4gMTI7XG4gICAgICAgIHYxICs9IG05O1xuICAgICAgICB2MSArPSB2NjtcbiAgICAgICAgdjEyIF49IHYxO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gMTYpIHwgdjEyID4+PiAxNjtcbiAgICAgICAgdjExICs9IHYxMjtcbiAgICAgICAgdjYgXj0gdjExO1xuICAgICAgICB2NiA9IHY2IDw8ICgzMiAtIDEyKSB8IHY2ID4+PiAxMjtcbiAgICAgICAgdjIgKz0gbTM7XG4gICAgICAgIHYyICs9IHY3O1xuICAgICAgICB2MTMgXj0gdjI7XG4gICAgICAgIHYxMyA9IHYxMyA8PCAoMzIgLSAxNikgfCB2MTMgPj4+IDE2O1xuICAgICAgICB2OCArPSB2MTM7XG4gICAgICAgIHY3IF49IHY4O1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDEyKSB8IHY3ID4+PiAxMjtcbiAgICAgICAgdjMgKz0gbTEzO1xuICAgICAgICB2MyArPSB2NDtcbiAgICAgICAgdjE0IF49IHYzO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gMTYpIHwgdjE0ID4+PiAxNjtcbiAgICAgICAgdjkgKz0gdjE0O1xuICAgICAgICB2NCBePSB2OTtcbiAgICAgICAgdjQgPSB2NCA8PCAoMzIgLSAxMikgfCB2NCA+Pj4gMTI7XG4gICAgICAgIHYyICs9IG0xMjtcbiAgICAgICAgdjIgKz0gdjc7XG4gICAgICAgIHYxMyBePSB2MjtcbiAgICAgICAgdjEzID0gdjEzIDw8ICgzMiAtIDgpIHwgdjEzID4+PiA4O1xuICAgICAgICB2OCArPSB2MTM7XG4gICAgICAgIHY3IF49IHY4O1xuICAgICAgICB2NyA9IHY3IDw8ICgzMiAtIDcpIHwgdjcgPj4+IDc7XG4gICAgICAgIHYzICs9IG0wO1xuICAgICAgICB2MyArPSB2NDtcbiAgICAgICAgdjE0IF49IHYzO1xuICAgICAgICB2MTQgPSB2MTQgPDwgKDMyIC0gOCkgfCB2MTQgPj4+IDg7XG4gICAgICAgIHY5ICs9IHYxNDtcbiAgICAgICAgdjQgXj0gdjk7XG4gICAgICAgIHY0ID0gdjQgPDwgKDMyIC0gNykgfCB2NCA+Pj4gNztcbiAgICAgICAgdjEgKz0gbTE0O1xuICAgICAgICB2MSArPSB2NjtcbiAgICAgICAgdjEyIF49IHYxO1xuICAgICAgICB2MTIgPSB2MTIgPDwgKDMyIC0gOCkgfCB2MTIgPj4+IDg7XG4gICAgICAgIHYxMSArPSB2MTI7XG4gICAgICAgIHY2IF49IHYxMTtcbiAgICAgICAgdjYgPSAodjYgPDwgKDMyIC0gNykpIHwgKHY2ID4+PiA3KTtcbiAgICAgICAgdjAgKz0gbTExO1xuICAgICAgICB2MCArPSB2NTtcbiAgICAgICAgdjE1IF49IHYwO1xuICAgICAgICB2MTUgPSAodjE1IDw8ICgzMiAtIDgpKSB8ICh2MTUgPj4+IDgpO1xuICAgICAgICB2MTAgKz0gdjE1O1xuICAgICAgICB2NSBePSB2MTA7XG4gICAgICAgIHY1ID0gKHY1IDw8ICgzMiAtIDcpKSB8ICh2NSA+Pj4gNyk7XG5cbiAgICAgICAgdGhpcy5oWzBdIF49IHYwIF4gdjg7XG4gICAgICAgIHRoaXMuaFsxXSBePSB2MSBeIHY5O1xuICAgICAgICB0aGlzLmhbMl0gXj0gdjIgXiB2MTA7XG4gICAgICAgIHRoaXMuaFszXSBePSB2MyBeIHYxMTtcbiAgICAgICAgdGhpcy5oWzRdIF49IHY0IF4gdjEyO1xuICAgICAgICB0aGlzLmhbNV0gXj0gdjUgXiB2MTM7XG4gICAgICAgIHRoaXMuaFs2XSBePSB2NiBeIHYxNDtcbiAgICAgICAgdGhpcy5oWzddIF49IHY3IF4gdjE1O1xuICAgIH07XG5cbiAgICBCTEFLRTJzLnByb3RvdHlwZS5zdHJpbmdUb1V0ZjhBcnJheSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgIHZhciBhcnIgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHMuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgICAgICAgICAgYXJyLnB1c2goYyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPiAxMjcgJiYgYyA8IDIwNDgpIHtcbiAgICAgICAgICAgICAgICBhcnIucHVzaCgoYyA+PiA2KSB8IDE5Mik7XG4gICAgICAgICAgICAgICAgYXJyLnB1c2goKGMgJiA2MykgfCAxMjgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnIucHVzaCgoYyA+PiAxMikgfCAyMjQpO1xuICAgICAgICAgICAgICAgIGFyci5wdXNoKCgoYyA+PiA2KSAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICAgICAgYXJyLnB1c2goKGMgJiA2NCkgfCAxMjgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfTtcblxuICAgIEJMQUtFMnMucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAocCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09IFwidW5kZWZpbmVkXCIpIHsgb2Zmc2V0ID0gMDsgfVxuICAgICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PT0gXCJ1bmRlZmluZWRcIikgeyBsZW5ndGggPSBwLmxlbmd0aDsgfVxuICAgICAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyAndXBkYXRlKCkgYWZ0ZXIgY2FsbGluZyBkaWdlc3QoKSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAnb2Zmc2V0IG5vdCBzdXBwb3J0ZWQgZm9yIHN0cmluZ3MnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcCA9IHRoaXMuc3RyaW5nVG9VdGY4QXJyYXkocCk7XG4gICAgICAgICAgICBsZW5ndGggPSBwLmxlbmd0aDtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHAgIT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRocm93ICd1bnN1cHBvcnRlZCBvYmplY3Q6IHN0cmluZyBvciBhcnJheSByZXF1aXJlZCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlZnQgPSA2NCAtIHRoaXMubng7XG4gICAgICAgIGlmIChsZW5ndGggPiBsZWZ0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlZnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMueFt0aGlzLm54ICsgaV0gPSBwW29mZnNldCArIGldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQmxvY2soNjQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGxlZnQ7XG4gICAgICAgICAgICBsZW5ndGggLT0gbGVmdDtcbiAgICAgICAgICAgIHRoaXMubnggPSAwO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsZW5ndGggPiA2NCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy54W2ldID0gcFtvZmZzZXQgKyBpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Jsb2NrKDY0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSA2NDtcbiAgICAgICAgICAgIGxlbmd0aCAtPSA2NDtcbiAgICAgICAgICAgIHRoaXMubnggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMueFt0aGlzLm54ICsgaV0gPSBwW29mZnNldCArIGldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubnggKz0gbGVuZ3RoO1xuICAgIH07XG5cbiAgICBCTEFLRTJzLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCBlbmMpIHtcbiAgICAgIGlmKGVuYylcbiAgICAgICAgYnVmZmVyID0gbmV3IEJ1ZmZlcihidWZmZXIsIGVuYylcbiAgICAgIHRoaXMuX3VwZGF0ZShidWZmZXIpXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIEJMQUtFMnMucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMubng7IGkgPCA2NDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnhbaV0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGxhc3QgYmxvY2sgZmxhZy5cbiAgICAgICAgdGhpcy5mMCA9IDB4ZmZmZmZmZmY7XG5cbiAgICAgICAgLy9UT0RPIGluIHRyZWUgbW9kZSwgc2V0IGYxIHRvIDB4ZmZmZmZmZmYuXG4gICAgICAgIHRoaXMucHJvY2Vzc0Jsb2NrKHRoaXMubngpO1xuXG4gICAgICAgIHZhciBvdXQgPSBuZXcgQnVmZmVyKDMyKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgICAgIHZhciBoID0gdGhpcy5oW2ldO1xuICAgICAgICAgICAgb3V0W2kgKiA0ICsgMF0gPSAoaCA+Pj4gMCkgJiAweGZmO1xuICAgICAgICAgICAgb3V0W2kgKiA0ICsgMV0gPSAoaCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgICAgb3V0W2kgKiA0ICsgMl0gPSAoaCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIG91dFtpICogNCArIDNdID0gKGggPj4+IDI0KSAmIDB4ZmY7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXN1bHQgPSBvdXQuc2xpY2UoMCwgdGhpcy5kaWdlc3RMZW5ndGgpO1xuICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZW5jID8gdGhpcy5yZXN1bHQudG9TdHJpbmcoZW5jKSA6IHRoaXMucmVzdWx0O1xuICAgIH07XG5cbiAgICByZXR1cm4gQkxBS0Uycztcbn0pKCk7XG5cbmlmKCd1bmRlZmluZWQnID09PSB0eXBlb2YgbW9kdWxlKVxuICB3aW5kb3cuQmxha2UycyA9IEJMQUtFMnNcbmVsc2VcbiAgbW9kdWxlLmV4cG9ydHMgPSBCTEFLRTJzXG4iLCIoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gVXRpbHNcbiAgZnVuY3Rpb24gYXNzZXJ0ICh2YWwsIG1zZykge1xuICAgIGlmICghdmFsKSB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICdBc3NlcnRpb24gZmFpbGVkJyk7XG4gIH1cblxuICAvLyBDb3VsZCB1c2UgYGluaGVyaXRzYCBtb2R1bGUsIGJ1dCBkb24ndCB3YW50IHRvIG1vdmUgZnJvbSBzaW5nbGUgZmlsZVxuICAvLyBhcmNoaXRlY3R1cmUgeWV0LlxuICBmdW5jdGlvbiBpbmhlcml0cyAoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7XG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge307XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpO1xuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjtcbiAgfVxuXG4gIC8vIEJOXG5cbiAgZnVuY3Rpb24gQk4gKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKEJOLmlzQk4obnVtYmVyKSkge1xuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICB0aGlzLndvcmRzID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBSZWR1Y3Rpb24gY29udGV4dFxuICAgIHRoaXMucmVkID0gbnVsbDtcblxuICAgIGlmIChudW1iZXIgIT09IG51bGwpIHtcbiAgICAgIGlmIChiYXNlID09PSAnbGUnIHx8IGJhc2UgPT09ICdiZScpIHtcbiAgICAgICAgZW5kaWFuID0gYmFzZTtcbiAgICAgICAgYmFzZSA9IDEwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbml0KG51bWJlciB8fCAwLCBiYXNlIHx8IDEwLCBlbmRpYW4gfHwgJ2JlJyk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gQk47XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CTiA9IEJOO1xuICB9XG5cbiAgQk4uQk4gPSBCTjtcbiAgQk4ud29yZFNpemUgPSAyNjtcblxuICB2YXIgQnVmZmVyO1xuICB0cnkge1xuICAgIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZicgKyAnZmVyJykuQnVmZmVyO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cblxuICBCTi5pc0JOID0gZnVuY3Rpb24gaXNCTiAobnVtKSB7XG4gICAgcmV0dXJuIG51bSAhPT0gbnVsbCAmJiB0eXBlb2YgbnVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgbnVtLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdCTicgJiYgQXJyYXkuaXNBcnJheShudW0ud29yZHMpO1xuICB9O1xuXG4gIEJOLm1heCA9IGZ1bmN0aW9uIG1heCAobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAobGVmdC5jbXAocmlnaHQpID4gMCkgcmV0dXJuIGxlZnQ7XG4gICAgcmV0dXJuIHJpZ2h0O1xuICB9O1xuXG4gIEJOLm1pbiA9IGZ1bmN0aW9uIG1pbiAobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAobGVmdC5jbXAocmlnaHQpIDwgMCkgcmV0dXJuIGxlZnQ7XG4gICAgcmV0dXJuIHJpZ2h0O1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKHR5cGVvZiBudW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW5pdE51bWJlcihudW1iZXIsIGJhc2UsIGVuZGlhbik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBudW1iZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW5pdEFycmF5KG51bWJlciwgYmFzZSwgZW5kaWFuKTtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gJ2hleCcpIHtcbiAgICAgIGJhc2UgPSAxNjtcbiAgICB9XG4gICAgYXNzZXJ0KGJhc2UgPT09IChiYXNlIHwgMCkgJiYgYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpO1xuXG4gICAgbnVtYmVyID0gbnVtYmVyLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKy9nLCAnJyk7XG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICBpZiAobnVtYmVyWzBdID09PSAnLScpIHtcbiAgICAgIHN0YXJ0Kys7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09IDE2KSB7XG4gICAgICB0aGlzLl9wYXJzZUhleChudW1iZXIsIHN0YXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGFyc2VCYXNlKG51bWJlciwgYmFzZSwgc3RhcnQpO1xuICAgIH1cblxuICAgIGlmIChudW1iZXJbMF0gPT09ICctJykge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfVxuXG4gICAgdGhpcy5zdHJpcCgpO1xuXG4gICAgaWYgKGVuZGlhbiAhPT0gJ2xlJykgcmV0dXJuO1xuXG4gICAgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBiYXNlLCBlbmRpYW4pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faW5pdE51bWJlciA9IGZ1bmN0aW9uIF9pbml0TnVtYmVyIChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIG51bWJlciA9IC1udW1iZXI7XG4gICAgfVxuICAgIGlmIChudW1iZXIgPCAweDQwMDAwMDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbIG51bWJlciAmIDB4M2ZmZmZmZiBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMHgxMDAwMDAwMDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZlxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KG51bWJlciA8IDB4MjAwMDAwMDAwMDAwMDApOyAvLyAyIF4gNTMgKHVuc2FmZSlcbiAgICAgIHRoaXMud29yZHMgPSBbXG4gICAgICAgIG51bWJlciAmIDB4M2ZmZmZmZixcbiAgICAgICAgKG51bWJlciAvIDB4NDAwMDAwMCkgJiAweDNmZmZmZmYsXG4gICAgICAgIDFcbiAgICAgIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDM7XG4gICAgfVxuXG4gICAgaWYgKGVuZGlhbiAhPT0gJ2xlJykgcmV0dXJuO1xuXG4gICAgLy8gUmV2ZXJzZSB0aGUgYnl0ZXNcbiAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0QXJyYXkgPSBmdW5jdGlvbiBfaW5pdEFycmF5IChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIC8vIFBlcmhhcHMgYSBVaW50OEFycmF5XG4gICAgYXNzZXJ0KHR5cGVvZiBudW1iZXIubGVuZ3RoID09PSAnbnVtYmVyJyk7XG4gICAgaWYgKG51bWJlci5sZW5ndGggPD0gMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgMCBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwobnVtYmVyLmxlbmd0aCAvIDMpO1xuICAgIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGosIHc7XG4gICAgdmFyIG9mZiA9IDA7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JlJykge1xuICAgICAgZm9yIChpID0gbnVtYmVyLmxlbmd0aCAtIDEsIGogPSAwOyBpID49IDA7IGkgLT0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpIC0gMV0gPDwgOCkgfCAobnVtYmVyW2kgLSAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuZGlhbiA9PT0gJ2xlJykge1xuICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBudW1iZXIubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdyA9IG51bWJlcltpXSB8IChudW1iZXJbaSArIDFdIDw8IDgpIHwgKG51bWJlcltpICsgMl0gPDwgMTYpO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9ICh3IDw8IG9mZikgJiAweDNmZmZmZmY7XG4gICAgICAgIHRoaXMud29yZHNbaiArIDFdID0gKHcgPj4+ICgyNiAtIG9mZikpICYgMHgzZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjQ7XG4gICAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VIZXggKHN0ciwgc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gMDtcbiAgICB2YXIgbGVuID0gTWF0aC5taW4oc3RyLmxlbmd0aCwgZW5kKTtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKSAtIDQ4O1xuXG4gICAgICByIDw8PSA0O1xuXG4gICAgICAvLyAnYScgLSAnZidcbiAgICAgIGlmIChjID49IDQ5ICYmIGMgPD0gNTQpIHtcbiAgICAgICAgciB8PSBjIC0gNDkgKyAweGE7XG5cbiAgICAgIC8vICdBJyAtICdGJ1xuICAgICAgfSBlbHNlIGlmIChjID49IDE3ICYmIGMgPD0gMjIpIHtcbiAgICAgICAgciB8PSBjIC0gMTcgKyAweGE7XG5cbiAgICAgIC8vICcwJyAtICc5J1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgciB8PSBjICYgMHhmO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5fcGFyc2VIZXggPSBmdW5jdGlvbiBfcGFyc2VIZXggKG51bWJlciwgc3RhcnQpIHtcbiAgICAvLyBDcmVhdGUgcG9zc2libHkgYmlnZ2VyIGFycmF5IHRvIGVuc3VyZSB0aGF0IGl0IGZpdHMgdGhlIG51bWJlclxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5jZWlsKChudW1iZXIubGVuZ3RoIC0gc3RhcnQpIC8gNik7XG4gICAgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICB9XG5cbiAgICB2YXIgaiwgdztcbiAgICAvLyBTY2FuIDI0LWJpdCBjaHVua3MgYW5kIGFkZCB0aGVtIHRvIHRoZSBudW1iZXJcbiAgICB2YXIgb2ZmID0gMDtcbiAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gNiwgaiA9IDA7IGkgPj0gc3RhcnQ7IGkgLT0gNikge1xuICAgICAgdyA9IHBhcnNlSGV4KG51bWJlciwgaSwgaSArIDYpO1xuICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgLy8gTk9URTogYDB4M2ZmZmZmYCBpcyBpbnRlbnRpb25hbCBoZXJlLCAyNmJpdHMgbWF4IHNoaWZ0ICsgMjRiaXQgaGV4IGxpbWJcbiAgICAgIHRoaXMud29yZHNbaiArIDFdIHw9IHcgPj4+ICgyNiAtIG9mZikgJiAweDNmZmZmZjtcbiAgICAgIG9mZiArPSAyNDtcbiAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICBqKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpICsgNiAhPT0gc3RhcnQpIHtcbiAgICAgIHcgPSBwYXJzZUhleChudW1iZXIsIHN0YXJ0LCBpICsgNik7XG4gICAgICB0aGlzLndvcmRzW2pdIHw9ICh3IDw8IG9mZikgJiAweDNmZmZmZmY7XG4gICAgICB0aGlzLndvcmRzW2ogKyAxXSB8PSB3ID4+PiAoMjYgLSBvZmYpICYgMHgzZmZmZmY7XG4gICAgfVxuICAgIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUJhc2UgKHN0ciwgc3RhcnQsIGVuZCwgbXVsKSB7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihzdHIubGVuZ3RoLCBlbmQpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpIC0gNDg7XG5cbiAgICAgIHIgKj0gbXVsO1xuXG4gICAgICAvLyAnYSdcbiAgICAgIGlmIChjID49IDQ5KSB7XG4gICAgICAgIHIgKz0gYyAtIDQ5ICsgMHhhO1xuXG4gICAgICAvLyAnQSdcbiAgICAgIH0gZWxzZSBpZiAoYyA+PSAxNykge1xuICAgICAgICByICs9IGMgLSAxNyArIDB4YTtcblxuICAgICAgLy8gJzAnIC0gJzknXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByICs9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUJhc2UgPSBmdW5jdGlvbiBfcGFyc2VCYXNlIChudW1iZXIsIGJhc2UsIHN0YXJ0KSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBhcyB6ZXJvXG4gICAgdGhpcy53b3JkcyA9IFsgMCBdO1xuICAgIHRoaXMubGVuZ3RoID0gMTtcblxuICAgIC8vIEZpbmQgbGVuZ3RoIG9mIGxpbWIgaW4gYmFzZVxuICAgIGZvciAodmFyIGxpbWJMZW4gPSAwLCBsaW1iUG93ID0gMTsgbGltYlBvdyA8PSAweDNmZmZmZmY7IGxpbWJQb3cgKj0gYmFzZSkge1xuICAgICAgbGltYkxlbisrO1xuICAgIH1cbiAgICBsaW1iTGVuLS07XG4gICAgbGltYlBvdyA9IChsaW1iUG93IC8gYmFzZSkgfCAwO1xuXG4gICAgdmFyIHRvdGFsID0gbnVtYmVyLmxlbmd0aCAtIHN0YXJ0O1xuICAgIHZhciBtb2QgPSB0b3RhbCAlIGxpbWJMZW47XG4gICAgdmFyIGVuZCA9IE1hdGgubWluKHRvdGFsLCB0b3RhbCAtIG1vZCkgKyBzdGFydDtcblxuICAgIHZhciB3b3JkID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gbGltYkxlbikge1xuICAgICAgd29yZCA9IHBhcnNlQmFzZShudW1iZXIsIGksIGkgKyBsaW1iTGVuLCBiYXNlKTtcblxuICAgICAgdGhpcy5pbXVsbihsaW1iUG93KTtcbiAgICAgIGlmICh0aGlzLndvcmRzWzBdICsgd29yZCA8IDB4NDAwMDAwMCkge1xuICAgICAgICB0aGlzLndvcmRzWzBdICs9IHdvcmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pYWRkbih3b3JkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kICE9PSAwKSB7XG4gICAgICB2YXIgcG93ID0gMTtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBudW1iZXIubGVuZ3RoLCBiYXNlKTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG1vZDsgaSsrKSB7XG4gICAgICAgIHBvdyAqPSBiYXNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmltdWxuKHBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAoZGVzdCkge1xuICAgIGRlc3Qud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgZGVzdC53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV07XG4gICAgfVxuICAgIGRlc3QubGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgZGVzdC5uZWdhdGl2ZSA9IHRoaXMubmVnYXRpdmU7XG4gICAgZGVzdC5yZWQgPSB0aGlzLnJlZDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSAoKSB7XG4gICAgdmFyIHIgPSBuZXcgQk4obnVsbCk7XG4gICAgdGhpcy5jb3B5KHIpO1xuICAgIHJldHVybiByO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fZXhwYW5kID0gZnVuY3Rpb24gX2V4cGFuZCAoc2l6ZSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IHNpemUpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBSZW1vdmUgbGVhZGluZyBgMGAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN0cmlwID0gZnVuY3Rpb24gc3RyaXAgKCkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA+IDEgJiYgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICB0aGlzLmxlbmd0aC0tO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX25vcm1TaWduID0gZnVuY3Rpb24gX25vcm1TaWduICgpIHtcbiAgICAvLyAtMCA9IDBcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnJlZCA/ICc8Qk4tUjogJyA6ICc8Qk46ICcpICsgdGhpcy50b1N0cmluZygxNikgKyAnPic7XG4gIH07XG5cbiAgLypcblxuICB2YXIgemVyb3MgPSBbXTtcbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXTtcbiAgdmFyIGdyb3VwQmFzZXMgPSBbXTtcblxuICB2YXIgcyA9ICcnO1xuICB2YXIgaSA9IC0xO1xuICB3aGlsZSAoKytpIDwgQk4ud29yZFNpemUpIHtcbiAgICB6ZXJvc1tpXSA9IHM7XG4gICAgcyArPSAnMCc7XG4gIH1cbiAgZ3JvdXBTaXplc1swXSA9IDA7XG4gIGdyb3VwU2l6ZXNbMV0gPSAwO1xuICBncm91cEJhc2VzWzBdID0gMDtcbiAgZ3JvdXBCYXNlc1sxXSA9IDA7XG4gIHZhciBiYXNlID0gMiAtIDE7XG4gIHdoaWxlICgrK2Jhc2UgPCAzNiArIDEpIHtcbiAgICB2YXIgZ3JvdXBTaXplID0gMDtcbiAgICB2YXIgZ3JvdXBCYXNlID0gMTtcbiAgICB3aGlsZSAoZ3JvdXBCYXNlIDwgKDEgPDwgQk4ud29yZFNpemUpIC8gYmFzZSkge1xuICAgICAgZ3JvdXBCYXNlICo9IGJhc2U7XG4gICAgICBncm91cFNpemUgKz0gMTtcbiAgICB9XG4gICAgZ3JvdXBTaXplc1tiYXNlXSA9IGdyb3VwU2l6ZTtcbiAgICBncm91cEJhc2VzW2Jhc2VdID0gZ3JvdXBCYXNlO1xuICB9XG5cbiAgKi9cblxuICB2YXIgemVyb3MgPSBbXG4gICAgJycsXG4gICAgJzAnLFxuICAgICcwMCcsXG4gICAgJzAwMCcsXG4gICAgJzAwMDAnLFxuICAgICcwMDAwMCcsXG4gICAgJzAwMDAwMCcsXG4gICAgJzAwMDAwMDAnLFxuICAgICcwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gIF07XG5cbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXG4gICAgMCwgMCxcbiAgICAyNSwgMTYsIDEyLCAxMSwgMTAsIDksIDgsXG4gICAgOCwgNywgNywgNywgNywgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNVxuICBdO1xuXG4gIHZhciBncm91cEJhc2VzID0gW1xuICAgIDAsIDAsXG4gICAgMzM1NTQ0MzIsIDQzMDQ2NzIxLCAxNjc3NzIxNiwgNDg4MjgxMjUsIDYwNDY2MTc2LCA0MDM1MzYwNywgMTY3NzcyMTYsXG4gICAgNDMwNDY3MjEsIDEwMDAwMDAwLCAxOTQ4NzE3MSwgMzU4MzE4MDgsIDYyNzQ4NTE3LCA3NTI5NTM2LCAxMTM5MDYyNSxcbiAgICAxNjc3NzIxNiwgMjQxMzc1NjksIDM0MDEyMjI0LCA0NzA0NTg4MSwgNjQwMDAwMDAsIDQwODQxMDEsIDUxNTM2MzIsXG4gICAgNjQzNjM0MywgNzk2MjYyNCwgOTc2NTYyNSwgMTE4ODEzNzYsIDE0MzQ4OTA3LCAxNzIxMDM2OCwgMjA1MTExNDksXG4gICAgMjQzMDAwMDAsIDI4NjI5MTUxLCAzMzU1NDQzMiwgMzkxMzUzOTMsIDQ1NDM1NDI0LCA1MjUyMTg3NSwgNjA0NjYxNzZcbiAgXTtcblxuICBCTi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoYmFzZSwgcGFkZGluZykge1xuICAgIGJhc2UgPSBiYXNlIHx8IDEwO1xuICAgIHBhZGRpbmcgPSBwYWRkaW5nIHwgMCB8fCAxO1xuXG4gICAgdmFyIG91dDtcbiAgICBpZiAoYmFzZSA9PT0gMTYgfHwgYmFzZSA9PT0gJ2hleCcpIHtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIG9mZiA9IDA7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgICAgdmFyIHdvcmQgPSAoKCh3IDw8IG9mZikgfCBjYXJyeSkgJiAweGZmZmZmZikudG9TdHJpbmcoMTYpO1xuICAgICAgICBjYXJyeSA9ICh3ID4+PiAoMjQgLSBvZmYpKSAmIDB4ZmZmZmZmO1xuICAgICAgICBpZiAoY2FycnkgIT09IDAgfHwgaSAhPT0gdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgb3V0ID0gemVyb3NbNiAtIHdvcmQubGVuZ3RoXSArIHdvcmQgKyBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ID0gd29yZCArIG91dDtcbiAgICAgICAgfVxuICAgICAgICBvZmYgKz0gMjtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgICBvdXQgPSBjYXJyeS50b1N0cmluZygxNikgKyBvdXQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAob3V0Lmxlbmd0aCAlIHBhZGRpbmcgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJy0nICsgb3V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNikge1xuICAgICAgLy8gdmFyIGdyb3VwU2l6ZSA9IE1hdGguZmxvb3IoQk4ud29yZFNpemUgKiBNYXRoLkxOMiAvIE1hdGgubG9nKGJhc2UpKTtcbiAgICAgIHZhciBncm91cFNpemUgPSBncm91cFNpemVzW2Jhc2VdO1xuICAgICAgLy8gdmFyIGdyb3VwQmFzZSA9IE1hdGgucG93KGJhc2UsIGdyb3VwU2l6ZSk7XG4gICAgICB2YXIgZ3JvdXBCYXNlID0gZ3JvdXBCYXNlc1tiYXNlXTtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIGMgPSB0aGlzLmNsb25lKCk7XG4gICAgICBjLm5lZ2F0aXZlID0gMDtcbiAgICAgIHdoaWxlICghYy5pc1plcm8oKSkge1xuICAgICAgICB2YXIgciA9IGMubW9kbihncm91cEJhc2UpLnRvU3RyaW5nKGJhc2UpO1xuICAgICAgICBjID0gYy5pZGl2bihncm91cEJhc2UpO1xuXG4gICAgICAgIGlmICghYy5pc1plcm8oKSkge1xuICAgICAgICAgIG91dCA9IHplcm9zW2dyb3VwU2l6ZSAtIHIubGVuZ3RoXSArIHIgKyBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ID0gciArIG91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgd2hpbGUgKG91dC5sZW5ndGggJSBwYWRkaW5nICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICctJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGZhbHNlLCAnQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNicpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyICgpIHtcbiAgICB2YXIgcmV0ID0gdGhpcy53b3Jkc1swXTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHJldCArPSB0aGlzLndvcmRzWzFdICogMHg0MDAwMDAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPT09IDMgJiYgdGhpcy53b3Jkc1syXSA9PT0gMHgwMSkge1xuICAgICAgLy8gTk9URTogYXQgdGhpcyBzdGFnZSBpdCBpcyBrbm93biB0aGF0IHRoZSB0b3AgYml0IGlzIHNldFxuICAgICAgcmV0ICs9IDB4MTAwMDAwMDAwMDAwMDAgKyAodGhpcy53b3Jkc1sxXSAqIDB4NDAwMDAwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGFzc2VydChmYWxzZSwgJ051bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cycpO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMubmVnYXRpdmUgIT09IDApID8gLXJldCA6IHJldDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgICByZXR1cm4gdGhpcy50b1N0cmluZygxNik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24gdG9CdWZmZXIgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKTtcbiAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShCdWZmZXIsIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIHRvQXJyYXkgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQXJyYXksIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9BcnJheUxpa2UgPSBmdW5jdGlvbiB0b0FycmF5TGlrZSAoQXJyYXlUeXBlLCBlbmRpYW4sIGxlbmd0aCkge1xuICAgIHZhciBieXRlTGVuZ3RoID0gdGhpcy5ieXRlTGVuZ3RoKCk7XG4gICAgdmFyIHJlcUxlbmd0aCA9IGxlbmd0aCB8fCBNYXRoLm1heCgxLCBieXRlTGVuZ3RoKTtcbiAgICBhc3NlcnQoYnl0ZUxlbmd0aCA8PSByZXFMZW5ndGgsICdieXRlIGFycmF5IGxvbmdlciB0aGFuIGRlc2lyZWQgbGVuZ3RoJyk7XG4gICAgYXNzZXJ0KHJlcUxlbmd0aCA+IDAsICdSZXF1ZXN0ZWQgYXJyYXkgbGVuZ3RoIDw9IDAnKTtcblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgICB2YXIgbGl0dGxlRW5kaWFuID0gZW5kaWFuID09PSAnbGUnO1xuICAgIHZhciByZXMgPSBuZXcgQXJyYXlUeXBlKHJlcUxlbmd0aCk7XG5cbiAgICB2YXIgYiwgaTtcbiAgICB2YXIgcSA9IHRoaXMuY2xvbmUoKTtcbiAgICBpZiAoIWxpdHRsZUVuZGlhbikge1xuICAgICAgLy8gQXNzdW1lIGJpZy1lbmRpYW5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCByZXFMZW5ndGggLSBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gMDtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgIXEuaXNaZXJvKCk7IGkrKykge1xuICAgICAgICBiID0gcS5hbmRsbigweGZmKTtcbiAgICAgICAgcS5pdXNocm4oOCk7XG5cbiAgICAgICAgcmVzW3JlcUxlbmd0aCAtIGkgLSAxXSA9IGI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IDA7ICFxLmlzWmVybygpOyBpKyspIHtcbiAgICAgICAgYiA9IHEuYW5kbG4oMHhmZik7XG4gICAgICAgIHEuaXVzaHJuKDgpO1xuXG4gICAgICAgIHJlc1tpXSA9IGI7XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBpIDwgcmVxTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIGlmIChNYXRoLmNsejMyKSB7XG4gICAgQk4ucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbiBfY291bnRCaXRzICh3KSB7XG4gICAgICByZXR1cm4gMzIgLSBNYXRoLmNsejMyKHcpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgQk4ucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbiBfY291bnRCaXRzICh3KSB7XG4gICAgICB2YXIgdCA9IHc7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICBpZiAodCA+PSAweDEwMDApIHtcbiAgICAgICAgciArPSAxMztcbiAgICAgICAgdCA+Pj49IDEzO1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHg0MCkge1xuICAgICAgICByICs9IDc7XG4gICAgICAgIHQgPj4+PSA3O1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHg4KSB7XG4gICAgICAgIHIgKz0gNDtcbiAgICAgICAgdCA+Pj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDAyKSB7XG4gICAgICAgIHIgKz0gMjtcbiAgICAgICAgdCA+Pj49IDI7XG4gICAgICB9XG4gICAgICByZXR1cm4gciArIHQ7XG4gICAgfTtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5femVyb0JpdHMgPSBmdW5jdGlvbiBfemVyb0JpdHMgKHcpIHtcbiAgICAvLyBTaG9ydC1jdXRcbiAgICBpZiAodyA9PT0gMCkgcmV0dXJuIDI2O1xuXG4gICAgdmFyIHQgPSB3O1xuICAgIHZhciByID0gMDtcbiAgICBpZiAoKHQgJiAweDFmZmYpID09PSAwKSB7XG4gICAgICByICs9IDEzO1xuICAgICAgdCA+Pj49IDEzO1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDdmKSA9PT0gMCkge1xuICAgICAgciArPSA3O1xuICAgICAgdCA+Pj49IDc7XG4gICAgfVxuICAgIGlmICgodCAmIDB4ZikgPT09IDApIHtcbiAgICAgIHIgKz0gNDtcbiAgICAgIHQgPj4+PSA0O1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDMpID09PSAwKSB7XG4gICAgICByICs9IDI7XG4gICAgICB0ID4+Pj0gMjtcbiAgICB9XG4gICAgaWYgKCh0ICYgMHgxKSA9PT0gMCkge1xuICAgICAgcisrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICAvLyBSZXR1cm4gbnVtYmVyIG9mIHVzZWQgYml0cyBpbiBhIEJOXG4gIEJOLnByb3RvdHlwZS5iaXRMZW5ndGggPSBmdW5jdGlvbiBiaXRMZW5ndGggKCkge1xuICAgIHZhciB3ID0gdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdO1xuICAgIHZhciBoaSA9IHRoaXMuX2NvdW50Qml0cyh3KTtcbiAgICByZXR1cm4gKHRoaXMubGVuZ3RoIC0gMSkgKiAyNiArIGhpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHRvQml0QXJyYXkgKG51bSkge1xuICAgIHZhciB3ID0gbmV3IEFycmF5KG51bS5iaXRMZW5ndGgoKSk7XG5cbiAgICBmb3IgKHZhciBiaXQgPSAwOyBiaXQgPCB3Lmxlbmd0aDsgYml0KyspIHtcbiAgICAgIHZhciBvZmYgPSAoYml0IC8gMjYpIHwgMDtcbiAgICAgIHZhciB3Yml0ID0gYml0ICUgMjY7XG5cbiAgICAgIHdbYml0XSA9IChudW0ud29yZHNbb2ZmXSAmICgxIDw8IHdiaXQpKSA+Pj4gd2JpdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdztcbiAgfVxuXG4gIC8vIE51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHNcbiAgQk4ucHJvdG90eXBlLnplcm9CaXRzID0gZnVuY3Rpb24gemVyb0JpdHMgKCkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gMDtcblxuICAgIHZhciByID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBiID0gdGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tpXSk7XG4gICAgICByICs9IGI7XG4gICAgICBpZiAoYiAhPT0gMjYpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uIGJ5dGVMZW5ndGggKCkge1xuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKSAvIDgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b1R3b3MgPSBmdW5jdGlvbiB0b1R3b3MgKHdpZHRoKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmFicygpLmlub3RuKHdpZHRoKS5pYWRkbigxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZnJvbVR3b3MgPSBmdW5jdGlvbiBmcm9tVHdvcyAod2lkdGgpIHtcbiAgICBpZiAodGhpcy50ZXN0bih3aWR0aCAtIDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RuKHdpZHRoKS5pYWRkbigxKS5pbmVnKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzTmVnID0gZnVuY3Rpb24gaXNOZWcgKCkge1xuICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwO1xuICB9O1xuXG4gIC8vIFJldHVybiBuZWdhdGl2ZSBjbG9uZSBvZiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmluZWcgPSBmdW5jdGlvbiBpbmVnICgpIHtcbiAgICBpZiAoIXRoaXMuaXNaZXJvKCkpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uIGl1b3IgKG51bSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IG51bS5sZW5ndGgpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXSB8IG51bS53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pb3IgPSBmdW5jdGlvbiBpb3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1b3IobnVtKTtcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUub3IgPSBmdW5jdGlvbiBvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pb3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaW9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51b3IgPSBmdW5jdGlvbiB1b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXVvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdW9yKHRoaXMpO1xuICB9O1xuXG4gIC8vIEFuZCBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVhbmQgPSBmdW5jdGlvbiBpdWFuZCAobnVtKSB7XG4gICAgLy8gYiA9IG1pbi1sZW5ndGgobnVtLCB0aGlzKVxuICAgIHZhciBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV0gJiBudW0ud29yZHNbaV07XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBiLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlhbmQgPSBmdW5jdGlvbiBpYW5kIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdWFuZChudW0pO1xuICB9O1xuXG4gIC8vIEFuZCBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuYW5kID0gZnVuY3Rpb24gYW5kIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlhbmQobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaWFuZCh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudWFuZCA9IGZ1bmN0aW9uIHVhbmQgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXVhbmQobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXVhbmQodGhpcyk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdXhvciA9IGZ1bmN0aW9uIGl1eG9yIChudW0pIHtcbiAgICAvLyBhLmxlbmd0aCA+IGIubGVuZ3RoXG4gICAgdmFyIGE7XG4gICAgdmFyIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXSBeIGIud29yZHNbaV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMgIT09IGEpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXhvciA9IGZ1bmN0aW9uIGl4b3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1eG9yKG51bSk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5peG9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51eG9yID0gZnVuY3Rpb24gdXhvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdXhvcih0aGlzKTtcbiAgfTtcblxuICAvLyBOb3QgYGB0aGlzYGAgd2l0aCBgYHdpZHRoYGAgYml0d2lkdGhcbiAgQk4ucHJvdG90eXBlLmlub3RuID0gZnVuY3Rpb24gaW5vdG4gKHdpZHRoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgJiYgd2lkdGggPj0gMCk7XG5cbiAgICB2YXIgYnl0ZXNOZWVkZWQgPSBNYXRoLmNlaWwod2lkdGggLyAyNikgfCAwO1xuICAgIHZhciBiaXRzTGVmdCA9IHdpZHRoICUgMjY7XG5cbiAgICAvLyBFeHRlbmQgdGhlIGJ1ZmZlciB3aXRoIGxlYWRpbmcgemVyb2VzXG4gICAgdGhpcy5fZXhwYW5kKGJ5dGVzTmVlZGVkKTtcblxuICAgIGlmIChiaXRzTGVmdCA+IDApIHtcbiAgICAgIGJ5dGVzTmVlZGVkLS07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNvbXBsZXRlIHdvcmRzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlc05lZWRlZDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gfnRoaXMud29yZHNbaV0gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRoZSByZXNpZHVlXG4gICAgaWYgKGJpdHNMZWZ0ID4gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IH50aGlzLndvcmRzW2ldICYgKDB4M2ZmZmZmZiA+PiAoMjYgLSBiaXRzTGVmdCkpO1xuICAgIH1cblxuICAgIC8vIEFuZCByZW1vdmUgbGVhZGluZyB6ZXJvZXNcbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ub3RuID0gZnVuY3Rpb24gbm90biAod2lkdGgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlub3RuKHdpZHRoKTtcbiAgfTtcblxuICAvLyBTZXQgYGJpdGAgb2YgYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zZXRuID0gZnVuY3Rpb24gc2V0biAoYml0LCB2YWwpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicgJiYgYml0ID49IDApO1xuXG4gICAgdmFyIG9mZiA9IChiaXQgLyAyNikgfCAwO1xuICAgIHZhciB3Yml0ID0gYml0ICUgMjY7XG5cbiAgICB0aGlzLl9leHBhbmQob2ZmICsgMSk7XG5cbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLndvcmRzW29mZl0gPSB0aGlzLndvcmRzW29mZl0gfCAoMSA8PCB3Yml0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3Jkc1tvZmZdID0gdGhpcy53b3Jkc1tvZmZdICYgfigxIDw8IHdiaXQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gQWRkIGBudW1gIHRvIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uIGlhZGQgKG51bSkge1xuICAgIHZhciByO1xuXG4gICAgLy8gbmVnYXRpdmUgKyBwb3NpdGl2ZVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICByID0gdGhpcy5pc3ViKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlIF49IDE7XG4gICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcblxuICAgIC8vIHBvc2l0aXZlICsgbmVnYXRpdmVcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgciA9IHRoaXMuaXN1YihudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByLl9ub3JtU2lnbigpO1xuICAgIH1cblxuICAgIC8vIGEubGVuZ3RoID4gYi5sZW5ndGhcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyAoYi53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gciA+Pj4gMjY7XG4gICAgfVxuICAgIGZvciAoOyBjYXJyeSAhPT0gMCAmJiBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSByID4+PiAyNjtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoO1xuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgLy8gQ29weSB0aGUgcmVzdCBvZiB0aGUgd29yZHNcbiAgICB9IGVsc2UgaWYgKGEgIT09IHRoaXMpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBBZGQgYG51bWAgdG8gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKG51bSkge1xuICAgIHZhciByZXM7XG4gICAgaWYgKG51bS5uZWdhdGl2ZSAhPT0gMCAmJiB0aGlzLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgcmVzID0gdGhpcy5zdWIobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSBePSAxO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGVsc2UgaWYgKG51bS5uZWdhdGl2ZSA9PT0gMCAmJiB0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHJlcyA9IG51bS5zdWIodGhpcyk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkKG51bSk7XG5cbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaWFkZCh0aGlzKTtcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBgbnVtYCBmcm9tIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uIGlzdWIgKG51bSkge1xuICAgIC8vIHRoaXMgLSAoLW51bSkgPSB0aGlzICsgbnVtXG4gICAgaWYgKG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHZhciByID0gdGhpcy5pYWRkKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHIuX25vcm1TaWduKCk7XG5cbiAgICAvLyAtdGhpcyAtIG51bSA9IC0odGhpcyArIG51bSlcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pYWRkKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuICAgIH1cblxuICAgIC8vIEF0IHRoaXMgcG9pbnQgYm90aCBudW1iZXJzIGFyZSBwb3NpdGl2ZVxuICAgIHZhciBjbXAgPSB0aGlzLmNtcChudW0pO1xuXG4gICAgLy8gT3B0aW1pemF0aW9uIC0gemVyb2lmeVxuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBhID4gYlxuICAgIHZhciBhLCBiO1xuICAgIGlmIChjbXAgPiAwKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgLSAoYi53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHIgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgZm9yICg7IGNhcnJ5ICE9PSAwICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSByID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gQ29weSByZXN0IG9mIHRoZSB3b3Jkc1xuICAgIGlmIChjYXJyeSA9PT0gMCAmJiBpIDwgYS5sZW5ndGggJiYgYSAhPT0gdGhpcykge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGkpO1xuXG4gICAgaWYgKGEgIT09IHRoaXMpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc21hbGxNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIHZhciBsZW4gPSAoc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoKSB8IDA7XG4gICAgb3V0Lmxlbmd0aCA9IGxlbjtcbiAgICBsZW4gPSAobGVuIC0gMSkgfCAwO1xuXG4gICAgLy8gUGVlbCBvbmUgaXRlcmF0aW9uIChjb21waWxlciBjYW4ndCBkbyBpdCwgYmVjYXVzZSBvZiBjb2RlIGNvbXBsZXhpdHkpXG4gICAgdmFyIGEgPSBzZWxmLndvcmRzWzBdIHwgMDtcbiAgICB2YXIgYiA9IG51bS53b3Jkc1swXSB8IDA7XG4gICAgdmFyIHIgPSBhICogYjtcblxuICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgdmFyIGNhcnJ5ID0gKHIgLyAweDQwMDAwMDApIHwgMDtcbiAgICBvdXQud29yZHNbMF0gPSBsbztcblxuICAgIGZvciAodmFyIGsgPSAxOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gY2FycnkgPj4+IDI2O1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSAoayAtIGopIHwgMDtcbiAgICAgICAgYSA9IHNlbGYud29yZHNbaV0gfCAwO1xuICAgICAgICBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgciA9IGEgKiBiICsgcndvcmQ7XG4gICAgICAgIG5jYXJyeSArPSAociAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgICByd29yZCA9IHIgJiAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZCB8IDA7XG4gICAgICBjYXJyeSA9IG5jYXJyeSB8IDA7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2FycnkgfCAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubGVuZ3RoLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9XG5cbiAgLy8gVE9ETyhpbmR1dG55KTogaXQgbWF5IGJlIHJlYXNvbmFibGUgdG8gb21pdCBpdCBmb3IgdXNlcnMgd2hvIGRvbid0IG5lZWRcbiAgLy8gdG8gd29yayB3aXRoIDI1Ni1iaXQgbnVtYmVycywgb3RoZXJ3aXNlIGl0IGdpdmVzIDIwJSBpbXByb3ZlbWVudCBmb3IgMjU2LWJpdFxuICAvLyBtdWx0aXBsaWNhdGlvbiAobGlrZSBlbGxpcHRpYyBzZWNwMjU2azEpLlxuICB2YXIgY29tYjEwTXVsVG8gPSBmdW5jdGlvbiBjb21iMTBNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICB2YXIgYSA9IHNlbGYud29yZHM7XG4gICAgdmFyIGIgPSBudW0ud29yZHM7XG4gICAgdmFyIG8gPSBvdXQud29yZHM7XG4gICAgdmFyIGMgPSAwO1xuICAgIHZhciBsbztcbiAgICB2YXIgbWlkO1xuICAgIHZhciBoaTtcbiAgICB2YXIgYTAgPSBhWzBdIHwgMDtcbiAgICB2YXIgYWwwID0gYTAgJiAweDFmZmY7XG4gICAgdmFyIGFoMCA9IGEwID4+PiAxMztcbiAgICB2YXIgYTEgPSBhWzFdIHwgMDtcbiAgICB2YXIgYWwxID0gYTEgJiAweDFmZmY7XG4gICAgdmFyIGFoMSA9IGExID4+PiAxMztcbiAgICB2YXIgYTIgPSBhWzJdIHwgMDtcbiAgICB2YXIgYWwyID0gYTIgJiAweDFmZmY7XG4gICAgdmFyIGFoMiA9IGEyID4+PiAxMztcbiAgICB2YXIgYTMgPSBhWzNdIHwgMDtcbiAgICB2YXIgYWwzID0gYTMgJiAweDFmZmY7XG4gICAgdmFyIGFoMyA9IGEzID4+PiAxMztcbiAgICB2YXIgYTQgPSBhWzRdIHwgMDtcbiAgICB2YXIgYWw0ID0gYTQgJiAweDFmZmY7XG4gICAgdmFyIGFoNCA9IGE0ID4+PiAxMztcbiAgICB2YXIgYTUgPSBhWzVdIHwgMDtcbiAgICB2YXIgYWw1ID0gYTUgJiAweDFmZmY7XG4gICAgdmFyIGFoNSA9IGE1ID4+PiAxMztcbiAgICB2YXIgYTYgPSBhWzZdIHwgMDtcbiAgICB2YXIgYWw2ID0gYTYgJiAweDFmZmY7XG4gICAgdmFyIGFoNiA9IGE2ID4+PiAxMztcbiAgICB2YXIgYTcgPSBhWzddIHwgMDtcbiAgICB2YXIgYWw3ID0gYTcgJiAweDFmZmY7XG4gICAgdmFyIGFoNyA9IGE3ID4+PiAxMztcbiAgICB2YXIgYTggPSBhWzhdIHwgMDtcbiAgICB2YXIgYWw4ID0gYTggJiAweDFmZmY7XG4gICAgdmFyIGFoOCA9IGE4ID4+PiAxMztcbiAgICB2YXIgYTkgPSBhWzldIHwgMDtcbiAgICB2YXIgYWw5ID0gYTkgJiAweDFmZmY7XG4gICAgdmFyIGFoOSA9IGE5ID4+PiAxMztcbiAgICB2YXIgYjAgPSBiWzBdIHwgMDtcbiAgICB2YXIgYmwwID0gYjAgJiAweDFmZmY7XG4gICAgdmFyIGJoMCA9IGIwID4+PiAxMztcbiAgICB2YXIgYjEgPSBiWzFdIHwgMDtcbiAgICB2YXIgYmwxID0gYjEgJiAweDFmZmY7XG4gICAgdmFyIGJoMSA9IGIxID4+PiAxMztcbiAgICB2YXIgYjIgPSBiWzJdIHwgMDtcbiAgICB2YXIgYmwyID0gYjIgJiAweDFmZmY7XG4gICAgdmFyIGJoMiA9IGIyID4+PiAxMztcbiAgICB2YXIgYjMgPSBiWzNdIHwgMDtcbiAgICB2YXIgYmwzID0gYjMgJiAweDFmZmY7XG4gICAgdmFyIGJoMyA9IGIzID4+PiAxMztcbiAgICB2YXIgYjQgPSBiWzRdIHwgMDtcbiAgICB2YXIgYmw0ID0gYjQgJiAweDFmZmY7XG4gICAgdmFyIGJoNCA9IGI0ID4+PiAxMztcbiAgICB2YXIgYjUgPSBiWzVdIHwgMDtcbiAgICB2YXIgYmw1ID0gYjUgJiAweDFmZmY7XG4gICAgdmFyIGJoNSA9IGI1ID4+PiAxMztcbiAgICB2YXIgYjYgPSBiWzZdIHwgMDtcbiAgICB2YXIgYmw2ID0gYjYgJiAweDFmZmY7XG4gICAgdmFyIGJoNiA9IGI2ID4+PiAxMztcbiAgICB2YXIgYjcgPSBiWzddIHwgMDtcbiAgICB2YXIgYmw3ID0gYjcgJiAweDFmZmY7XG4gICAgdmFyIGJoNyA9IGI3ID4+PiAxMztcbiAgICB2YXIgYjggPSBiWzhdIHwgMDtcbiAgICB2YXIgYmw4ID0gYjggJiAweDFmZmY7XG4gICAgdmFyIGJoOCA9IGI4ID4+PiAxMztcbiAgICB2YXIgYjkgPSBiWzldIHwgMDtcbiAgICB2YXIgYmw5ID0gYjkgJiAweDFmZmY7XG4gICAgdmFyIGJoOSA9IGI5ID4+PiAxMztcblxuICAgIG91dC5uZWdhdGl2ZSA9IHNlbGYubmVnYXRpdmUgXiBudW0ubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IDE5O1xuICAgIC8qIGsgPSAwICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwwLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDAsIGJoMCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDAsIGJsMCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgwLCBiaDApO1xuICAgIHZhciB3MCA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcwID4+PiAyNik7XG4gICAgdzAgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwxLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDEsIGJoMCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDEsIGJsMCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgxLCBiaDApO1xuICAgIGxvICs9IE1hdGguaW11bChhbDAsIGJsMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDAsIGJoMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDAsIGJsMSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMCwgYmgxKTtcbiAgICB2YXIgdzEgPSBjICsgbG8gKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpO1xuICAgIGMgPSBoaSArIChtaWQgPj4+IDEzKSArICh3MSA+Pj4gMjYpO1xuICAgIHcxICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMiwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwyLCBiaDApO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgyLCBibDApO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMiwgYmgwKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwxLCBibDEpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwxLCBiaDEpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgxLCBibDEpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDEsIGJoMSk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMCwgYmwyKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMCwgYmgyKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMCwgYmwyKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgwLCBiaDIpO1xuICAgIHZhciB3MiA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcyID4+PiAyNik7XG4gICAgdzIgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAzICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwzLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDMsIGJoMCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDMsIGJsMCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgzLCBiaDApO1xuICAgIGxvICs9IE1hdGguaW11bChhbDIsIGJsMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDIsIGJoMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDIsIGJsMSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMiwgYmgxKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwxLCBibDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwxLCBiaDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgxLCBibDIpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDEsIGJoMik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMCwgYmwzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMCwgYmgzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMCwgYmwzKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgwLCBiaDMpO1xuICAgIHZhciB3MyA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHczID4+PiAyNik7XG4gICAgdzMgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA0ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw0LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDQsIGJoMCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDQsIGJsMCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg0LCBiaDApO1xuICAgIGxvICs9IE1hdGguaW11bChhbDMsIGJsMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDMsIGJoMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDMsIGJsMSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMywgYmgxKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwyLCBibDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwyLCBiaDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgyLCBibDIpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDIsIGJoMik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMSwgYmwzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMSwgYmgzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMSwgYmwzKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgxLCBiaDMpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDAsIGJsNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDAsIGJoNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDAsIGJsNCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMCwgYmg0KTtcbiAgICB2YXIgdzQgPSBjICsgbG8gKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpO1xuICAgIGMgPSBoaSArIChtaWQgPj4+IDEzKSArICh3NCA+Pj4gMjYpO1xuICAgIHc0ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw1LCBiaDApO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg1LCBibDApO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNSwgYmgwKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw0LCBibDEpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw0LCBiaDEpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg0LCBibDEpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDQsIGJoMSk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMywgYmwyKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMywgYmgyKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMywgYmwyKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgzLCBiaDIpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDIsIGJsMyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDIsIGJoMyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDIsIGJsMyk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMiwgYmgzKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwxLCBibDQpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwxLCBiaDQpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgxLCBibDQpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDEsIGJoNCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMCwgYmw1KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMCwgYmg1KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMCwgYmw1KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgwLCBiaDUpO1xuICAgIHZhciB3NSA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHc1ID4+PiAyNik7XG4gICAgdzUgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA2ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw2LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDYsIGJoMCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDYsIGJsMCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg2LCBiaDApO1xuICAgIGxvICs9IE1hdGguaW11bChhbDUsIGJsMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDUsIGJoMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDUsIGJsMSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNSwgYmgxKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw0LCBibDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw0LCBiaDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg0LCBibDIpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDQsIGJoMik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMywgYmwzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMywgYmgzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMywgYmwzKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgzLCBiaDMpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDIsIGJsNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDIsIGJoNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDIsIGJsNCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMiwgYmg0KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwxLCBibDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwxLCBiaDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgxLCBibDUpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDEsIGJoNSk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMCwgYmw2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMCwgYmg2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMCwgYmw2KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgwLCBiaDYpO1xuICAgIHZhciB3NiA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHc2ID4+PiAyNik7XG4gICAgdzYgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA3ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw3LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDcsIGJoMCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDcsIGJsMCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg3LCBiaDApO1xuICAgIGxvICs9IE1hdGguaW11bChhbDYsIGJsMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDYsIGJoMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDYsIGJsMSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNiwgYmgxKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw1LCBibDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw1LCBiaDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg1LCBibDIpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDUsIGJoMik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNCwgYmwzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNCwgYmgzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNCwgYmwzKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg0LCBiaDMpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDMsIGJsNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDMsIGJoNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDMsIGJsNCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMywgYmg0KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwyLCBibDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwyLCBiaDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgyLCBibDUpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDIsIGJoNSk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMSwgYmw2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMSwgYmg2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMSwgYmw2KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgxLCBiaDYpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDAsIGJsNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDAsIGJoNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDAsIGJsNyk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMCwgYmg3KTtcbiAgICB2YXIgdzcgPSBjICsgbG8gKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpO1xuICAgIGMgPSBoaSArIChtaWQgPj4+IDEzKSArICh3NyA+Pj4gMjYpO1xuICAgIHc3ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gOCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw4LCBiaDApO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg4LCBibDApO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOCwgYmgwKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw3LCBibDEpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw3LCBiaDEpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg3LCBibDEpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDcsIGJoMSk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNiwgYmwyKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNiwgYmgyKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNiwgYmwyKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg2LCBiaDIpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDUsIGJsMyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDUsIGJoMyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDUsIGJsMyk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNSwgYmgzKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw0LCBibDQpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw0LCBiaDQpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg0LCBibDQpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDQsIGJoNCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMywgYmw1KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMywgYmg1KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMywgYmw1KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgzLCBiaDUpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDIsIGJsNik7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDIsIGJoNik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDIsIGJsNik7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMiwgYmg2KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwxLCBibDcpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwxLCBiaDcpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgxLCBibDcpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDEsIGJoNyk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMCwgYmw4KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMCwgYmg4KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMCwgYmw4KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgwLCBiaDgpO1xuICAgIHZhciB3OCA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHc4ID4+PiAyNik7XG4gICAgdzggJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA5ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDksIGJsMCk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDApO1xuICAgIGxvICs9IE1hdGguaW11bChhbDgsIGJsMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDgsIGJoMSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDgsIGJsMSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoOCwgYmgxKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw3LCBibDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw3LCBiaDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg3LCBibDIpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDcsIGJoMik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNiwgYmwzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNiwgYmgzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNiwgYmwzKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg2LCBiaDMpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDUsIGJsNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDUsIGJoNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDUsIGJsNCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNSwgYmg0KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw0LCBibDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw0LCBiaDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg0LCBibDUpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDQsIGJoNSk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMywgYmw2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMywgYmg2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMywgYmw2KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgzLCBiaDYpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDIsIGJsNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDIsIGJoNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDIsIGJsNyk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMiwgYmg3KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwxLCBibDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwxLCBiaDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgxLCBibDgpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDEsIGJoOCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMCwgYmw5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMCwgYmg5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMCwgYmw5KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgwLCBiaDkpO1xuICAgIHZhciB3OSA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHc5ID4+PiAyNik7XG4gICAgdzkgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwxKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDEpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg5LCBibDEpO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgxKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw4LCBibDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw4LCBiaDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg4LCBibDIpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDgsIGJoMik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNywgYmwzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNywgYmgzKTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNywgYmwzKTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg3LCBiaDMpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDYsIGJsNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDYsIGJoNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDYsIGJsNCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNiwgYmg0KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw1LCBibDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw1LCBiaDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg1LCBibDUpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDUsIGJoNSk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNCwgYmw2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNCwgYmg2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNCwgYmw2KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg0LCBiaDYpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDMsIGJsNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDMsIGJoNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDMsIGJsNyk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMywgYmg3KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwyLCBibDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwyLCBiaDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgyLCBibDgpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDIsIGJoOCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMSwgYmw5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMSwgYmg5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMSwgYmw5KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgxLCBiaDkpO1xuICAgIHZhciB3MTAgPSBjICsgbG8gKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpO1xuICAgIGMgPSBoaSArIChtaWQgPj4+IDEzKSArICh3MTAgPj4+IDI2KTtcbiAgICB3MTAgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwyKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDIpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg5LCBibDIpO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgyKTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw4LCBibDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw4LCBiaDMpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg4LCBibDMpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDgsIGJoMyk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNywgYmw0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNywgYmg0KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNywgYmw0KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg3LCBiaDQpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDYsIGJsNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDYsIGJoNSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDYsIGJsNSk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNiwgYmg1KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw1LCBibDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw1LCBiaDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg1LCBibDYpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDUsIGJoNik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNCwgYmw3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNCwgYmg3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNCwgYmw3KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg0LCBiaDcpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDMsIGJsOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDMsIGJoOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDMsIGJsOCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoMywgYmg4KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWwyLCBibDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWwyLCBiaDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWgyLCBibDkpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDIsIGJoOSk7XG4gICAgdmFyIHcxMSA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcxMSA+Pj4gMjYpO1xuICAgIHcxMSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEyICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDMpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDksIGJsMyk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDMpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDgsIGJsNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDgsIGJoNCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDgsIGJsNCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoOCwgYmg0KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw3LCBibDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw3LCBiaDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg3LCBibDUpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDcsIGJoNSk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNiwgYmw2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNiwgYmg2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNiwgYmw2KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg2LCBiaDYpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDUsIGJsNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDUsIGJoNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDUsIGJsNyk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNSwgYmg3KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw0LCBibDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw0LCBiaDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg0LCBibDgpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDQsIGJoOCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsMywgYmw5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsMywgYmg5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoMywgYmw5KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWgzLCBiaDkpO1xuICAgIHZhciB3MTIgPSBjICsgbG8gKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpO1xuICAgIGMgPSBoaSArIChtaWQgPj4+IDEzKSArICh3MTIgPj4+IDI2KTtcbiAgICB3MTIgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw0KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDQpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg5LCBibDQpO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg0KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw4LCBibDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw4LCBiaDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg4LCBibDUpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDgsIGJoNSk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNywgYmw2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNywgYmg2KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNywgYmw2KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg3LCBiaDYpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDYsIGJsNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDYsIGJoNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDYsIGJsNyk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNiwgYmg3KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw1LCBibDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw1LCBiaDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg1LCBibDgpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDUsIGJoOCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNCwgYmw5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNCwgYmg5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNCwgYmw5KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg0LCBiaDkpO1xuICAgIHZhciB3MTMgPSBjICsgbG8gKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpO1xuICAgIGMgPSBoaSArIChtaWQgPj4+IDEzKSArICh3MTMgPj4+IDI2KTtcbiAgICB3MTMgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw1KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDUpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg5LCBibDUpO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg1KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw4LCBibDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw4LCBiaDYpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg4LCBibDYpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDgsIGJoNik7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNywgYmw3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNywgYmg3KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNywgYmw3KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg3LCBiaDcpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDYsIGJsOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDYsIGJoOCk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDYsIGJsOCk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoNiwgYmg4KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw1LCBibDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw1LCBiaDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg1LCBibDkpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDUsIGJoOSk7XG4gICAgdmFyIHcxNCA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcxNCA+Pj4gMjYpO1xuICAgIHcxNCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE1ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDYpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNik7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDksIGJsNik7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDYpO1xuICAgIGxvICs9IE1hdGguaW11bChhbDgsIGJsNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhbDgsIGJoNyk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDgsIGJsNyk7XG4gICAgaGkgKz0gTWF0aC5pbXVsKGFoOCwgYmg3KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw3LCBibDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw3LCBiaDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg3LCBibDgpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDcsIGJoOCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNiwgYmw5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNiwgYmg5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNiwgYmw5KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg2LCBiaDkpO1xuICAgIHZhciB3MTUgPSBjICsgbG8gKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpO1xuICAgIGMgPSBoaSArIChtaWQgPj4+IDEzKSArICh3MTUgPj4+IDI2KTtcbiAgICB3MTUgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw3KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDcpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg5LCBibDcpO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg3KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw4LCBibDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw4LCBiaDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg4LCBibDgpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDgsIGJoOCk7XG4gICAgbG8gKz0gTWF0aC5pbXVsKGFsNywgYmw5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFsNywgYmg5KTtcbiAgICBtaWQgKz0gTWF0aC5pbXVsKGFoNywgYmw5KTtcbiAgICBoaSArPSBNYXRoLmltdWwoYWg3LCBiaDkpO1xuICAgIHZhciB3MTYgPSBjICsgbG8gKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpO1xuICAgIGMgPSBoaSArIChtaWQgPj4+IDEzKSArICh3MTYgPj4+IDI2KTtcbiAgICB3MTYgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw4KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDgpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg5LCBibDgpO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg4KTtcbiAgICBsbyArPSBNYXRoLmltdWwoYWw4LCBibDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWw4LCBiaDkpO1xuICAgIG1pZCArPSBNYXRoLmltdWwoYWg4LCBibDkpO1xuICAgIGhpICs9IE1hdGguaW11bChhaDgsIGJoOSk7XG4gICAgdmFyIHcxNyA9IGMgKyBsbyArICgobWlkICYgMHgxZmZmKSA8PCAxMyk7XG4gICAgYyA9IGhpICsgKG1pZCA+Pj4gMTMpICsgKHcxNyA+Pj4gMjYpO1xuICAgIHcxNyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE4ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDkpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoOSk7XG4gICAgbWlkICs9IE1hdGguaW11bChhaDksIGJsOSk7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDkpO1xuICAgIHZhciB3MTggPSBjICsgbG8gKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpO1xuICAgIGMgPSBoaSArIChtaWQgPj4+IDEzKSArICh3MTggPj4+IDI2KTtcbiAgICB3MTggJj0gMHgzZmZmZmZmO1xuICAgIG9bMF0gPSB3MDtcbiAgICBvWzFdID0gdzE7XG4gICAgb1syXSA9IHcyO1xuICAgIG9bM10gPSB3MztcbiAgICBvWzRdID0gdzQ7XG4gICAgb1s1XSA9IHc1O1xuICAgIG9bNl0gPSB3NjtcbiAgICBvWzddID0gdzc7XG4gICAgb1s4XSA9IHc4O1xuICAgIG9bOV0gPSB3OTtcbiAgICBvWzEwXSA9IHcxMDtcbiAgICBvWzExXSA9IHcxMTtcbiAgICBvWzEyXSA9IHcxMjtcbiAgICBvWzEzXSA9IHcxMztcbiAgICBvWzE0XSA9IHcxNDtcbiAgICBvWzE1XSA9IHcxNTtcbiAgICBvWzE2XSA9IHcxNjtcbiAgICBvWzE3XSA9IHcxNztcbiAgICBvWzE4XSA9IHcxODtcbiAgICBpZiAoYyAhPT0gMCkge1xuICAgICAgb1sxOV0gPSBjO1xuICAgICAgb3V0Lmxlbmd0aCsrO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuXG4gIC8vIFBvbHlmaWxsIGNvbWJcbiAgaWYgKCFNYXRoLmltdWwpIHtcbiAgICBjb21iMTBNdWxUbyA9IHNtYWxsTXVsVG87XG4gIH1cblxuICBmdW5jdGlvbiBiaWdNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSBzZWxmLmxlbmd0aCArIG51bS5sZW5ndGg7XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIHZhciBobmNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IG91dC5sZW5ndGggLSAxOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gaG5jYXJyeTtcbiAgICAgIGhuY2FycnkgPSAwO1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSBrIC0gajtcbiAgICAgICAgdmFyIGEgPSBzZWxmLndvcmRzW2ldIHwgMDtcbiAgICAgICAgdmFyIGIgPSBudW0ud29yZHNbal0gfCAwO1xuICAgICAgICB2YXIgciA9IGEgKiBiO1xuXG4gICAgICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgICAgIG5jYXJyeSA9IChuY2FycnkgKyAoKHIgLyAweDQwMDAwMDApIHwgMCkpIHwgMDtcbiAgICAgICAgbG8gPSAobG8gKyByd29yZCkgfCAwO1xuICAgICAgICByd29yZCA9IGxvICYgMHgzZmZmZmZmO1xuICAgICAgICBuY2FycnkgPSAobmNhcnJ5ICsgKGxvID4+PiAyNikpIHwgMDtcblxuICAgICAgICBobmNhcnJ5ICs9IG5jYXJyeSA+Pj4gMjY7XG4gICAgICAgIG5jYXJyeSAmPSAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZDtcbiAgICAgIGNhcnJ5ID0gbmNhcnJ5O1xuICAgICAgbmNhcnJ5ID0gaG5jYXJyeTtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBvdXQud29yZHNba10gPSBjYXJyeTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lmxlbmd0aC0tO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGp1bWJvTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgdmFyIGZmdG0gPSBuZXcgRkZUTSgpO1xuICAgIHJldHVybiBmZnRtLm11bHAoc2VsZiwgbnVtLCBvdXQpO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLm11bFRvID0gZnVuY3Rpb24gbXVsVG8gKG51bSwgb3V0KSB7XG4gICAgdmFyIHJlcztcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMTAgJiYgbnVtLmxlbmd0aCA9PT0gMTApIHtcbiAgICAgIHJlcyA9IGNvbWIxME11bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDYzKSB7XG4gICAgICByZXMgPSBzbWFsbE11bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDEwMjQpIHtcbiAgICAgIHJlcyA9IGJpZ011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0ganVtYm9NdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBDb29sZXktVHVrZXkgYWxnb3JpdGhtIGZvciBGRlRcbiAgLy8gc2xpZ2h0bHkgcmV2aXNpdGVkIHRvIHJlbHkgb24gbG9vcGluZyBpbnN0ZWFkIG9mIHJlY3Vyc2lvblxuXG4gIGZ1bmN0aW9uIEZGVE0gKHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICBGRlRNLnByb3RvdHlwZS5tYWtlUkJUID0gZnVuY3Rpb24gbWFrZVJCVCAoTikge1xuICAgIHZhciB0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBsID0gQk4ucHJvdG90eXBlLl9jb3VudEJpdHMoTikgLSAxO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICB0W2ldID0gdGhpcy5yZXZCaW4oaSwgbCwgTik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBiaW5hcnktcmV2ZXJzZWQgcmVwcmVzZW50YXRpb24gb2YgYHhgXG4gIEZGVE0ucHJvdG90eXBlLnJldkJpbiA9IGZ1bmN0aW9uIHJldkJpbiAoeCwgbCwgTikge1xuICAgIGlmICh4ID09PSAwIHx8IHggPT09IE4gLSAxKSByZXR1cm4geDtcblxuICAgIHZhciByYiA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIHJiIHw9ICh4ICYgMSkgPDwgKGwgLSBpIC0gMSk7XG4gICAgICB4ID4+PSAxO1xuICAgIH1cblxuICAgIHJldHVybiByYjtcbiAgfTtcblxuICAvLyBQZXJmb3JtcyBcInR3ZWVkbGluZ1wiIHBoYXNlLCB0aGVyZWZvcmUgJ2VtdWxhdGluZydcbiAgLy8gYmVoYXZpb3VyIG9mIHRoZSByZWN1cnNpdmUgYWxnb3JpdGhtXG4gIEZGVE0ucHJvdG90eXBlLnBlcm11dGUgPSBmdW5jdGlvbiBwZXJtdXRlIChyYnQsIHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHJ0d3NbaV0gPSByd3NbcmJ0W2ldXTtcbiAgICAgIGl0d3NbaV0gPSBpd3NbcmJ0W2ldXTtcbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gdHJhbnNmb3JtIChyd3MsIGl3cywgcnR3cywgaXR3cywgTiwgcmJ0KSB7XG4gICAgdGhpcy5wZXJtdXRlKHJidCwgcndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4pO1xuXG4gICAgZm9yICh2YXIgcyA9IDE7IHMgPCBOOyBzIDw8PSAxKSB7XG4gICAgICB2YXIgbCA9IHMgPDwgMTtcblxuICAgICAgdmFyIHJ0d2RmID0gTWF0aC5jb3MoMiAqIE1hdGguUEkgLyBsKTtcbiAgICAgIHZhciBpdHdkZiA9IE1hdGguc2luKDIgKiBNYXRoLlBJIC8gbCk7XG5cbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgTjsgcCArPSBsKSB7XG4gICAgICAgIHZhciBydHdkZl8gPSBydHdkZjtcbiAgICAgICAgdmFyIGl0d2RmXyA9IGl0d2RmO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgczsgaisrKSB7XG4gICAgICAgICAgdmFyIHJlID0gcnR3c1twICsgal07XG4gICAgICAgICAgdmFyIGllID0gaXR3c1twICsgal07XG5cbiAgICAgICAgICB2YXIgcm8gPSBydHdzW3AgKyBqICsgc107XG4gICAgICAgICAgdmFyIGlvID0gaXR3c1twICsgaiArIHNdO1xuXG4gICAgICAgICAgdmFyIHJ4ID0gcnR3ZGZfICogcm8gLSBpdHdkZl8gKiBpbztcblxuICAgICAgICAgIGlvID0gcnR3ZGZfICogaW8gKyBpdHdkZl8gKiBybztcbiAgICAgICAgICBybyA9IHJ4O1xuXG4gICAgICAgICAgcnR3c1twICsgal0gPSByZSArIHJvO1xuICAgICAgICAgIGl0d3NbcCArIGpdID0gaWUgKyBpbztcblxuICAgICAgICAgIHJ0d3NbcCArIGogKyBzXSA9IHJlIC0gcm87XG4gICAgICAgICAgaXR3c1twICsgaiArIHNdID0gaWUgLSBpbztcblxuICAgICAgICAgIC8qIGpzaGludCBtYXhkZXB0aCA6IGZhbHNlICovXG4gICAgICAgICAgaWYgKGogIT09IGwpIHtcbiAgICAgICAgICAgIHJ4ID0gcnR3ZGYgKiBydHdkZl8gLSBpdHdkZiAqIGl0d2RmXztcblxuICAgICAgICAgICAgaXR3ZGZfID0gcnR3ZGYgKiBpdHdkZl8gKyBpdHdkZiAqIHJ0d2RmXztcbiAgICAgICAgICAgIHJ0d2RmXyA9IHJ4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5ndWVzc0xlbjEzYiA9IGZ1bmN0aW9uIGd1ZXNzTGVuMTNiIChuLCBtKSB7XG4gICAgdmFyIE4gPSBNYXRoLm1heChtLCBuKSB8IDE7XG4gICAgdmFyIG9kZCA9IE4gJiAxO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKE4gPSBOIC8gMiB8IDA7IE47IE4gPSBOID4+PiAxKSB7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIDEgPDwgaSArIDEgKyBvZGQ7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuY29uanVnYXRlID0gZnVuY3Rpb24gY29uanVnYXRlIChyd3MsIGl3cywgTikge1xuICAgIGlmIChOIDw9IDEpIHJldHVybjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTiAvIDI7IGkrKykge1xuICAgICAgdmFyIHQgPSByd3NbaV07XG5cbiAgICAgIHJ3c1tpXSA9IHJ3c1tOIC0gaSAtIDFdO1xuICAgICAgcndzW04gLSBpIC0gMV0gPSB0O1xuXG4gICAgICB0ID0gaXdzW2ldO1xuXG4gICAgICBpd3NbaV0gPSAtaXdzW04gLSBpIC0gMV07XG4gICAgICBpd3NbTiAtIGkgLSAxXSA9IC10O1xuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5ub3JtYWxpemUxM2IgPSBmdW5jdGlvbiBub3JtYWxpemUxM2IgKHdzLCBOKSB7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE4gLyAyOyBpKyspIHtcbiAgICAgIHZhciB3ID0gTWF0aC5yb3VuZCh3c1syICogaSArIDFdIC8gTikgKiAweDIwMDAgK1xuICAgICAgICBNYXRoLnJvdW5kKHdzWzIgKiBpXSAvIE4pICtcbiAgICAgICAgY2Fycnk7XG5cbiAgICAgIHdzW2ldID0gdyAmIDB4M2ZmZmZmZjtcblxuICAgICAgaWYgKHcgPCAweDQwMDAwMDApIHtcbiAgICAgICAgY2FycnkgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FycnkgPSB3IC8gMHg0MDAwMDAwIHwgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gd3M7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuY29udmVydDEzYiA9IGZ1bmN0aW9uIGNvbnZlcnQxM2IgKHdzLCBsZW4sIHJ3cywgTikge1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY2FycnkgPSBjYXJyeSArICh3c1tpXSB8IDApO1xuXG4gICAgICByd3NbMiAqIGldID0gY2FycnkgJiAweDFmZmY7IGNhcnJ5ID0gY2FycnkgPj4+IDEzO1xuICAgICAgcndzWzIgKiBpICsgMV0gPSBjYXJyeSAmIDB4MWZmZjsgY2FycnkgPSBjYXJyeSA+Pj4gMTM7XG4gICAgfVxuXG4gICAgLy8gUGFkIHdpdGggemVyb2VzXG4gICAgZm9yIChpID0gMiAqIGxlbjsgaSA8IE47ICsraSkge1xuICAgICAgcndzW2ldID0gMDtcbiAgICB9XG5cbiAgICBhc3NlcnQoY2FycnkgPT09IDApO1xuICAgIGFzc2VydCgoY2FycnkgJiB+MHgxZmZmKSA9PT0gMCk7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuc3R1YiA9IGZ1bmN0aW9uIHN0dWIgKE4pIHtcbiAgICB2YXIgcGggPSBuZXcgQXJyYXkoTik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHBoW2ldID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGg7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUubXVscCA9IGZ1bmN0aW9uIG11bHAgKHgsIHksIG91dCkge1xuICAgIHZhciBOID0gMiAqIHRoaXMuZ3Vlc3NMZW4xM2IoeC5sZW5ndGgsIHkubGVuZ3RoKTtcblxuICAgIHZhciByYnQgPSB0aGlzLm1ha2VSQlQoTik7XG5cbiAgICB2YXIgXyA9IHRoaXMuc3R1YihOKTtcblxuICAgIHZhciByd3MgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIHJ3c3QgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIGl3c3QgPSBuZXcgQXJyYXkoTik7XG5cbiAgICB2YXIgbnJ3cyA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbnJ3c3QgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIG5pd3N0ID0gbmV3IEFycmF5KE4pO1xuXG4gICAgdmFyIHJtd3MgPSBvdXQud29yZHM7XG4gICAgcm13cy5sZW5ndGggPSBOO1xuXG4gICAgdGhpcy5jb252ZXJ0MTNiKHgud29yZHMsIHgubGVuZ3RoLCByd3MsIE4pO1xuICAgIHRoaXMuY29udmVydDEzYih5LndvcmRzLCB5Lmxlbmd0aCwgbnJ3cywgTik7XG5cbiAgICB0aGlzLnRyYW5zZm9ybShyd3MsIF8sIHJ3c3QsIGl3c3QsIE4sIHJidCk7XG4gICAgdGhpcy50cmFuc2Zvcm0obnJ3cywgXywgbnJ3c3QsIG5pd3N0LCBOLCByYnQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHZhciByeCA9IHJ3c3RbaV0gKiBucndzdFtpXSAtIGl3c3RbaV0gKiBuaXdzdFtpXTtcbiAgICAgIGl3c3RbaV0gPSByd3N0W2ldICogbml3c3RbaV0gKyBpd3N0W2ldICogbnJ3c3RbaV07XG4gICAgICByd3N0W2ldID0gcng7XG4gICAgfVxuXG4gICAgdGhpcy5jb25qdWdhdGUocndzdCwgaXdzdCwgTik7XG4gICAgdGhpcy50cmFuc2Zvcm0ocndzdCwgaXdzdCwgcm13cywgXywgTiwgcmJ0KTtcbiAgICB0aGlzLmNvbmp1Z2F0ZShybXdzLCBfLCBOKTtcbiAgICB0aGlzLm5vcm1hbGl6ZTEzYihybXdzLCBOKTtcblxuICAgIG91dC5uZWdhdGl2ZSA9IHgubmVnYXRpdmUgXiB5Lm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSB4Lmxlbmd0aCArIHkubGVuZ3RoO1xuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBNdWx0aXBseSBgdGhpc2AgYnkgYG51bWBcbiAgQk4ucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAobnVtKSB7XG4gICAgdmFyIG91dCA9IG5ldyBCTihudWxsKTtcbiAgICBvdXQud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcy5tdWxUbyhudW0sIG91dCk7XG4gIH07XG5cbiAgLy8gTXVsdGlwbHkgZW1wbG95aW5nIEZGVFxuICBCTi5wcm90b3R5cGUubXVsZiA9IGZ1bmN0aW9uIG11bGYgKG51bSkge1xuICAgIHZhciBvdXQgPSBuZXcgQk4obnVsbCk7XG4gICAgb3V0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aCk7XG4gICAgcmV0dXJuIGp1bWJvTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICB9O1xuXG4gIC8vIEluLXBsYWNlIE11bHRpcGxpY2F0aW9uXG4gIEJOLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5tdWxUbyhudW0sIHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbXVsbiA9IGZ1bmN0aW9uIGltdWxuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuXG4gICAgLy8gQ2FycnlcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSAodGhpcy53b3Jkc1tpXSB8IDApICogbnVtO1xuICAgICAgdmFyIGxvID0gKHcgJiAweDNmZmZmZmYpICsgKGNhcnJ5ICYgMHgzZmZmZmZmKTtcbiAgICAgIGNhcnJ5ID4+PSAyNjtcbiAgICAgIGNhcnJ5ICs9ICh3IC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgICAvLyBOT1RFOiBsbyBpcyAyN2JpdCBtYXhpbXVtXG4gICAgICBjYXJyeSArPSBsbyA+Pj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5tdWxuID0gZnVuY3Rpb24gbXVsbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihudW0pO1xuICB9O1xuXG4gIC8vIGB0aGlzYCAqIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyICgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWwodGhpcyk7XG4gIH07XG5cbiAgLy8gYHRoaXNgICogYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpO1xuICB9O1xuXG4gIC8vIE1hdGgucG93KGB0aGlzYCwgYG51bWApXG4gIEJOLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKG51bSkge1xuICAgIHZhciB3ID0gdG9CaXRBcnJheShudW0pO1xuICAgIGlmICh3Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBCTigxKTtcblxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXNcbiAgICB2YXIgcmVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHcubGVuZ3RoOyBpKyssIHJlcyA9IHJlcy5zcXIoKSkge1xuICAgICAgaWYgKHdbaV0gIT09IDApIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICgrK2kgPCB3Lmxlbmd0aCkge1xuICAgICAgZm9yICh2YXIgcSA9IHJlcy5zcXIoKTsgaSA8IHcubGVuZ3RoOyBpKyssIHEgPSBxLnNxcigpKSB7XG4gICAgICAgIGlmICh3W2ldID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSByZXMubXVsKHEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gU2hpZnQtbGVmdCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVzaGxuID0gZnVuY3Rpb24gaXVzaGxuIChiaXRzKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gKGJpdHMgLSByKSAvIDI2O1xuICAgIHZhciBjYXJyeU1hc2sgPSAoMHgzZmZmZmZmID4+PiAoMjYgLSByKSkgPDwgKDI2IC0gcik7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgdmFyIGNhcnJ5ID0gMDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5ld0NhcnJ5ID0gdGhpcy53b3Jkc1tpXSAmIGNhcnJ5TWFzaztcbiAgICAgICAgdmFyIGMgPSAoKHRoaXMud29yZHNbaV0gfCAwKSAtIG5ld0NhcnJ5KSA8PCByO1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYyB8IGNhcnJ5O1xuICAgICAgICBjYXJyeSA9IG5ld0NhcnJ5ID4+PiAoMjYgLSByKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhcnJ5KSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocyAhPT0gMCkge1xuICAgICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyBzXSA9IHRoaXMud29yZHNbaV07XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGVuZ3RoICs9IHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNobG4gPSBmdW5jdGlvbiBpc2hsbiAoYml0cykge1xuICAgIC8vIFRPRE8oaW5kdXRueSk6IGltcGxlbWVudCBtZVxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHQgaW4tcGxhY2VcbiAgLy8gTk9URTogYGhpbnRgIGlzIGEgbG93ZXN0IGJpdCBiZWZvcmUgdHJhaWxpbmcgemVyb2VzXG4gIC8vIE5PVEU6IGlmIGBleHRlbmRlZGAgaXMgcHJlc2VudCAtIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggZGVzdHJveWVkIGJpdHNcbiAgQk4ucHJvdG90eXBlLml1c2hybiA9IGZ1bmN0aW9uIGl1c2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIGg7XG4gICAgaWYgKGhpbnQpIHtcbiAgICAgIGggPSAoaGludCAtIChoaW50ICUgMjYpKSAvIDI2O1xuICAgIH0gZWxzZSB7XG4gICAgICBoID0gMDtcbiAgICB9XG5cbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IE1hdGgubWluKChiaXRzIC0gcikgLyAyNiwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciBtYXNrID0gMHgzZmZmZmZmIF4gKCgweDNmZmZmZmYgPj4+IHIpIDw8IHIpO1xuICAgIHZhciBtYXNrZWRXb3JkcyA9IGV4dGVuZGVkO1xuXG4gICAgaCAtPSBzO1xuICAgIGggPSBNYXRoLm1heCgwLCBoKTtcblxuICAgIC8vIEV4dGVuZGVkIG1vZGUsIGNvcHkgbWFza2VkIHBhcnRcbiAgICBpZiAobWFza2VkV29yZHMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICAgIG1hc2tlZFdvcmRzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICAgIG1hc2tlZFdvcmRzLmxlbmd0aCA9IHM7XG4gICAgfVxuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIC8vIE5vLW9wLCB3ZSBzaG91bGQgbm90IG1vdmUgYW55dGhpbmcgYXQgYWxsXG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IHMpIHtcbiAgICAgIHRoaXMubGVuZ3RoIC09IHM7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpICsgc107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDAgJiYgKGNhcnJ5ICE9PSAwIHx8IGkgPj0gaCk7IGktLSkge1xuICAgICAgdmFyIHdvcmQgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAoY2FycnkgPDwgKDI2IC0gcikpIHwgKHdvcmQgPj4+IHIpO1xuICAgICAgY2FycnkgPSB3b3JkICYgbWFzaztcbiAgICB9XG5cbiAgICAvLyBQdXNoIGNhcnJpZWQgYml0cyBhcyBhIG1hc2tcbiAgICBpZiAobWFza2VkV29yZHMgJiYgY2FycnkgIT09IDApIHtcbiAgICAgIG1hc2tlZFdvcmRzLndvcmRzW21hc2tlZFdvcmRzLmxlbmd0aCsrXSA9IGNhcnJ5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNocm4gPSBmdW5jdGlvbiBpc2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBpbXBsZW1lbnQgbWVcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVzaHJuKGJpdHMsIGhpbnQsIGV4dGVuZGVkKTtcbiAgfTtcblxuICAvLyBTaGlmdC1sZWZ0XG4gIEJOLnByb3RvdHlwZS5zaGxuID0gZnVuY3Rpb24gc2hsbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNobG4oYml0cyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVzaGxuID0gZnVuY3Rpb24gdXNobG4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihiaXRzKTtcbiAgfTtcblxuICAvLyBTaGlmdC1yaWdodFxuICBCTi5wcm90b3R5cGUuc2hybiA9IGZ1bmN0aW9uIHNocm4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKGJpdHMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51c2hybiA9IGZ1bmN0aW9uIHVzaHJuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4oYml0cyk7XG4gIH07XG5cbiAgLy8gVGVzdCBpZiBuIGJpdCBpcyBzZXRcbiAgQk4ucHJvdG90eXBlLnRlc3RuID0gZnVuY3Rpb24gdGVzdG4gKGJpdCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyAmJiBiaXQgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXQgJSAyNjtcbiAgICB2YXIgcyA9IChiaXQgLSByKSAvIDI2O1xuICAgIHZhciBxID0gMSA8PCByO1xuXG4gICAgLy8gRmFzdCBjYXNlOiBiaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiBhbGwgZXhpc3Rpbmcgd29yZHNcbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgYml0IGFuZCByZXR1cm5cbiAgICB2YXIgdyA9IHRoaXMud29yZHNbc107XG5cbiAgICByZXR1cm4gISEodyAmIHEpO1xuICB9O1xuXG4gIC8vIFJldHVybiBvbmx5IGxvd2VycyBiaXRzIG9mIG51bWJlciAoaW4tcGxhY2UpXG4gIEJOLnByb3RvdHlwZS5pbWFza24gPSBmdW5jdGlvbiBpbWFza24gKGJpdHMpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSAoYml0cyAtIHIpIC8gMjY7XG5cbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCwgJ2ltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVycycpO1xuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHMrKztcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1pbihzLCB0aGlzLmxlbmd0aCk7XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgdmFyIG1hc2sgPSAweDNmZmZmZmYgXiAoKDB4M2ZmZmZmZiA+Pj4gcikgPDwgcik7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gJj0gbWFzaztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIFJldHVybiBvbmx5IGxvd2VycyBiaXRzIG9mIG51bWJlclxuICBCTi5wcm90b3R5cGUubWFza24gPSBmdW5jdGlvbiBtYXNrbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKGJpdHMpO1xuICB9O1xuXG4gIC8vIEFkZCBwbGFpbiBudW1iZXIgYG51bWAgdG8gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5pYWRkbiA9IGZ1bmN0aW9uIGlhZGRuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuICAgIGlmIChudW0gPCAwKSByZXR1cm4gdGhpcy5pc3VibigtbnVtKTtcblxuICAgIC8vIFBvc3NpYmxlIHNpZ24gY2hhbmdlXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiAodGhpcy53b3Jkc1swXSB8IDApIDwgbnVtKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gPSBudW0gLSAodGhpcy53b3Jkc1swXSB8IDApO1xuICAgICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pc3VibihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aG91dCBjaGVja3NcbiAgICByZXR1cm4gdGhpcy5faWFkZG4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2lhZGRuID0gZnVuY3Rpb24gX2lhZGRuIChudW0pIHtcbiAgICB0aGlzLndvcmRzWzBdICs9IG51bTtcblxuICAgIC8vIENhcnJ5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2ldID49IDB4NDAwMDAwMDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldIC09IDB4NDAwMDAwMDtcbiAgICAgIGlmIChpID09PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0rKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgaSArIDEpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgcGxhaW4gbnVtYmVyIGBudW1gIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5pc3VibiA9IGZ1bmN0aW9uIGlzdWJuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuICAgIGlmIChudW0gPCAwKSByZXR1cm4gdGhpcy5pYWRkbigtbnVtKTtcblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaWFkZG4obnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy53b3Jkc1swXSAtPSBudW07XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA8IDApIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAtdGhpcy53b3Jkc1swXTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYXJyeVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2ldIDwgMDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gKz0gMHg0MDAwMDAwO1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSAtPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmFkZG4gPSBmdW5jdGlvbiBhZGRuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGRuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnN1Ym4gPSBmdW5jdGlvbiBzdWJuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlhYnMgPSBmdW5jdGlvbiBpYWJzICgpIHtcbiAgICB0aGlzLm5lZ2F0aXZlID0gMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbiBhYnMgKCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFicygpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faXNobG5zdWJtdWwgPSBmdW5jdGlvbiBfaXNobG5zdWJtdWwgKG51bSwgbXVsLCBzaGlmdCkge1xuICAgIHZhciBsZW4gPSBudW0ubGVuZ3RoICsgc2hpZnQ7XG4gICAgdmFyIGk7XG5cbiAgICB0aGlzLl9leHBhbmQobGVuKTtcblxuICAgIHZhciB3O1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdyA9ICh0aGlzLndvcmRzW2kgKyBzaGlmdF0gfCAwKSArIGNhcnJ5O1xuICAgICAgdmFyIHJpZ2h0ID0gKG51bS53b3Jkc1tpXSB8IDApICogbXVsO1xuICAgICAgdyAtPSByaWdodCAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gKHcgPj4gMjYpIC0gKChyaWdodCAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICAgIHRoaXMud29yZHNbaSArIHNoaWZ0XSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIGZvciAoOyBpIDwgdGhpcy5sZW5ndGggLSBzaGlmdDsgaSsrKSB7XG4gICAgICB3ID0gKHRoaXMud29yZHNbaSArIHNoaWZ0XSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2kgKyBzaGlmdF0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIGlmIChjYXJyeSA9PT0gMCkgcmV0dXJuIHRoaXMuc3RyaXAoKTtcblxuICAgIC8vIFN1YnRyYWN0aW9uIG92ZXJmbG93XG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAtMSk7XG4gICAgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gLSh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICB0aGlzLm5lZ2F0aXZlID0gMTtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl93b3JkRGl2ID0gZnVuY3Rpb24gX3dvcmREaXYgKG51bSwgbW9kZSkge1xuICAgIHZhciBzaGlmdCA9IHRoaXMubGVuZ3RoIC0gbnVtLmxlbmd0aDtcblxuICAgIHZhciBhID0gdGhpcy5jbG9uZSgpO1xuICAgIHZhciBiID0gbnVtO1xuXG4gICAgLy8gTm9ybWFsaXplXG4gICAgdmFyIGJoaSA9IGIud29yZHNbYi5sZW5ndGggLSAxXSB8IDA7XG4gICAgdmFyIGJoaUJpdHMgPSB0aGlzLl9jb3VudEJpdHMoYmhpKTtcbiAgICBzaGlmdCA9IDI2IC0gYmhpQml0cztcbiAgICBpZiAoc2hpZnQgIT09IDApIHtcbiAgICAgIGIgPSBiLnVzaGxuKHNoaWZ0KTtcbiAgICAgIGEuaXVzaGxuKHNoaWZ0KTtcbiAgICAgIGJoaSA9IGIud29yZHNbYi5sZW5ndGggLSAxXSB8IDA7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBxdW90aWVudFxuICAgIHZhciBtID0gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgICB2YXIgcTtcblxuICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgcSA9IG5ldyBCTihudWxsKTtcbiAgICAgIHEubGVuZ3RoID0gbSArIDE7XG4gICAgICBxLndvcmRzID0gbmV3IEFycmF5KHEubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcS5sZW5ndGg7IGkrKykge1xuICAgICAgICBxLndvcmRzW2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGlmZiA9IGEuY2xvbmUoKS5faXNobG5zdWJtdWwoYiwgMSwgbSk7XG4gICAgaWYgKGRpZmYubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIGEgPSBkaWZmO1xuICAgICAgaWYgKHEpIHtcbiAgICAgICAgcS53b3Jkc1ttXSA9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IG0gLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgdmFyIHFqID0gKGEud29yZHNbYi5sZW5ndGggKyBqXSB8IDApICogMHg0MDAwMDAwICtcbiAgICAgICAgKGEud29yZHNbYi5sZW5ndGggKyBqIC0gMV0gfCAwKTtcblxuICAgICAgLy8gTk9URTogKHFqIC8gYmhpKSBpcyAoMHgzZmZmZmZmICogMHg0MDAwMDAwICsgMHgzZmZmZmZmKSAvIDB4MjAwMDAwMCBtYXhcbiAgICAgIC8vICgweDdmZmZmZmYpXG4gICAgICBxaiA9IE1hdGgubWluKChxaiAvIGJoaSkgfCAwLCAweDNmZmZmZmYpO1xuXG4gICAgICBhLl9pc2hsbnN1Ym11bChiLCBxaiwgaik7XG4gICAgICB3aGlsZSAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBxai0tO1xuICAgICAgICBhLm5lZ2F0aXZlID0gMDtcbiAgICAgICAgYS5faXNobG5zdWJtdWwoYiwgMSwgaik7XG4gICAgICAgIGlmICghYS5pc1plcm8oKSkge1xuICAgICAgICAgIGEubmVnYXRpdmUgXj0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHEpIHtcbiAgICAgICAgcS53b3Jkc1tqXSA9IHFqO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocSkge1xuICAgICAgcS5zdHJpcCgpO1xuICAgIH1cbiAgICBhLnN0cmlwKCk7XG5cbiAgICAvLyBEZW5vcm1hbGl6ZVxuICAgIGlmIChtb2RlICE9PSAnZGl2JyAmJiBzaGlmdCAhPT0gMCkge1xuICAgICAgYS5pdXNocm4oc2hpZnQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaXY6IHEgfHwgbnVsbCxcbiAgICAgIG1vZDogYVxuICAgIH07XG4gIH07XG5cbiAgLy8gTk9URTogMSkgYG1vZGVgIGNhbiBiZSBzZXQgdG8gYG1vZGAgdG8gcmVxdWVzdCBtb2Qgb25seSxcbiAgLy8gICAgICAgdG8gYGRpdmAgdG8gcmVxdWVzdCBkaXYgb25seSwgb3IgYmUgYWJzZW50IHRvXG4gIC8vICAgICAgIHJlcXVlc3QgYm90aCBkaXYgJiBtb2RcbiAgLy8gICAgICAgMikgYHBvc2l0aXZlYCBpcyB0cnVlIGlmIHVuc2lnbmVkIG1vZCBpcyByZXF1ZXN0ZWRcbiAgQk4ucHJvdG90eXBlLmRpdm1vZCA9IGZ1bmN0aW9uIGRpdm1vZCAobnVtLCBtb2RlLCBwb3NpdGl2ZSkge1xuICAgIGFzc2VydCghbnVtLmlzWmVybygpKTtcblxuICAgIGlmICh0aGlzLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IG5ldyBCTigwKSxcbiAgICAgICAgbW9kOiBuZXcgQk4oMClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRpdiwgbW9kLCByZXM7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLm5lZygpLmRpdm1vZChudW0sIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgICAgZGl2ID0gcmVzLmRpdi5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaWFkZChudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogZGl2LFxuICAgICAgICBtb2Q6IG1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgICBkaXYgPSByZXMuZGl2Lm5lZygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IGRpdixcbiAgICAgICAgbW9kOiByZXMubW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICgodGhpcy5uZWdhdGl2ZSAmIG51bS5uZWdhdGl2ZSkgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMubmVnKCkuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnZGl2Jykge1xuICAgICAgICBtb2QgPSByZXMubW9kLm5lZygpO1xuICAgICAgICBpZiAocG9zaXRpdmUgJiYgbW9kLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgbW9kLmlzdWIobnVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IHJlcy5kaXYsXG4gICAgICAgIG1vZDogbW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJvdGggbnVtYmVycyBhcmUgcG9zaXRpdmUgYXQgdGhpcyBwb2ludFxuXG4gICAgLy8gU3RyaXAgYm90aCBudW1iZXJzIHRvIGFwcHJveGltYXRlIHNoaWZ0IHZhbHVlXG4gICAgaWYgKG51bS5sZW5ndGggPiB0aGlzLmxlbmd0aCB8fCB0aGlzLmNtcChudW0pIDwgMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBuZXcgQk4oMCksXG4gICAgICAgIG1vZDogdGhpc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWZXJ5IHNob3J0IHJlZHVjdGlvblxuICAgIGlmIChudW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAobW9kZSA9PT0gJ2RpdicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXY6IHRoaXMuZGl2bihudW0ud29yZHNbMF0pLFxuICAgICAgICAgIG1vZDogbnVsbFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSA9PT0gJ21vZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgbW9kOiBuZXcgQk4odGhpcy5tb2RuKG51bS53b3Jkc1swXSkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogdGhpcy5kaXZuKG51bS53b3Jkc1swXSksXG4gICAgICAgIG1vZDogbmV3IEJOKHRoaXMubW9kbihudW0ud29yZHNbMF0pKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29yZERpdihudW0sIG1vZGUpO1xuICB9O1xuXG4gIC8vIEZpbmQgYHRoaXNgIC8gYG51bWBcbiAgQk4ucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uIGRpdiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ2RpdicsIGZhbHNlKS5kaXY7XG4gIH07XG5cbiAgLy8gRmluZCBgdGhpc2AgJSBgbnVtYFxuICBCTi5wcm90b3R5cGUubW9kID0gZnVuY3Rpb24gbW9kIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnbW9kJywgZmFsc2UpLm1vZDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudW1vZCA9IGZ1bmN0aW9uIHVtb2QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdtb2QnLCB0cnVlKS5tb2Q7XG4gIH07XG5cbiAgLy8gRmluZCBSb3VuZChgdGhpc2AgLyBgbnVtYClcbiAgQk4ucHJvdG90eXBlLmRpdlJvdW5kID0gZnVuY3Rpb24gZGl2Um91bmQgKG51bSkge1xuICAgIHZhciBkbSA9IHRoaXMuZGl2bW9kKG51bSk7XG5cbiAgICAvLyBGYXN0IGNhc2UgLSBleGFjdCBkaXZpc2lvblxuICAgIGlmIChkbS5tb2QuaXNaZXJvKCkpIHJldHVybiBkbS5kaXY7XG5cbiAgICB2YXIgbW9kID0gZG0uZGl2Lm5lZ2F0aXZlICE9PSAwID8gZG0ubW9kLmlzdWIobnVtKSA6IGRtLm1vZDtcblxuICAgIHZhciBoYWxmID0gbnVtLnVzaHJuKDEpO1xuICAgIHZhciByMiA9IG51bS5hbmRsbigxKTtcbiAgICB2YXIgY21wID0gbW9kLmNtcChoYWxmKTtcblxuICAgIC8vIFJvdW5kIGRvd25cbiAgICBpZiAoY21wIDwgMCB8fCByMiA9PT0gMSAmJiBjbXAgPT09IDApIHJldHVybiBkbS5kaXY7XG5cbiAgICAvLyBSb3VuZCB1cFxuICAgIHJldHVybiBkbS5kaXYubmVnYXRpdmUgIT09IDAgPyBkbS5kaXYuaXN1Ym4oMSkgOiBkbS5kaXYuaWFkZG4oMSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm1vZG4gPSBmdW5jdGlvbiBtb2RuIChudW0pIHtcbiAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZik7XG4gICAgdmFyIHAgPSAoMSA8PCAyNikgJSBudW07XG5cbiAgICB2YXIgYWNjID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgYWNjID0gKHAgKiBhY2MgKyAodGhpcy53b3Jkc1tpXSB8IDApKSAlIG51bTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9O1xuXG4gIC8vIEluLXBsYWNlIGRpdmlzaW9uIGJ5IG51bWJlclxuICBCTi5wcm90b3R5cGUuaWRpdm4gPSBmdW5jdGlvbiBpZGl2biAobnVtKSB7XG4gICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYpO1xuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHcgPSAodGhpcy53b3Jkc1tpXSB8IDApICsgY2FycnkgKiAweDQwMDAwMDA7XG4gICAgICB0aGlzLndvcmRzW2ldID0gKHcgLyBudW0pIHwgMDtcbiAgICAgIGNhcnJ5ID0gdyAlIG51bTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5kaXZuID0gZnVuY3Rpb24gZGl2biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lZ2NkID0gZnVuY3Rpb24gZWdjZCAocCkge1xuICAgIGFzc2VydChwLm5lZ2F0aXZlID09PSAwKTtcbiAgICBhc3NlcnQoIXAuaXNaZXJvKCkpO1xuXG4gICAgdmFyIHggPSB0aGlzO1xuICAgIHZhciB5ID0gcC5jbG9uZSgpO1xuXG4gICAgaWYgKHgubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHggPSB4LnVtb2QocCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSB4LmNsb25lKCk7XG4gICAgfVxuXG4gICAgLy8gQSAqIHggKyBCICogeSA9IHhcbiAgICB2YXIgQSA9IG5ldyBCTigxKTtcbiAgICB2YXIgQiA9IG5ldyBCTigwKTtcblxuICAgIC8vIEMgKiB4ICsgRCAqIHkgPSB5XG4gICAgdmFyIEMgPSBuZXcgQk4oMCk7XG4gICAgdmFyIEQgPSBuZXcgQk4oMSk7XG5cbiAgICB2YXIgZyA9IDA7XG5cbiAgICB3aGlsZSAoeC5pc0V2ZW4oKSAmJiB5LmlzRXZlbigpKSB7XG4gICAgICB4Lml1c2hybigxKTtcbiAgICAgIHkuaXVzaHJuKDEpO1xuICAgICAgKytnO1xuICAgIH1cblxuICAgIHZhciB5cCA9IHkuY2xvbmUoKTtcbiAgICB2YXIgeHAgPSB4LmNsb25lKCk7XG5cbiAgICB3aGlsZSAoIXguaXNaZXJvKCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpbSA9IDE7ICh4LndvcmRzWzBdICYgaW0pID09PSAwICYmIGkgPCAyNjsgKytpLCBpbSA8PD0gMSk7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgeC5pdXNocm4oaSk7XG4gICAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKEEuaXNPZGQoKSB8fCBCLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIEEuaWFkZCh5cCk7XG4gICAgICAgICAgICBCLmlzdWIoeHApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIEEuaXVzaHJuKDEpO1xuICAgICAgICAgIEIuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqbSA9IDE7ICh5LndvcmRzWzBdICYgam0pID09PSAwICYmIGogPCAyNjsgKytqLCBqbSA8PD0gMSk7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgeS5pdXNocm4oaik7XG4gICAgICAgIHdoaWxlIChqLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKEMuaXNPZGQoKSB8fCBELmlzT2RkKCkpIHtcbiAgICAgICAgICAgIEMuaWFkZCh5cCk7XG4gICAgICAgICAgICBELmlzdWIoeHApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIEMuaXVzaHJuKDEpO1xuICAgICAgICAgIEQuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh4LmNtcCh5KSA+PSAwKSB7XG4gICAgICAgIHguaXN1Yih5KTtcbiAgICAgICAgQS5pc3ViKEMpO1xuICAgICAgICBCLmlzdWIoRCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5LmlzdWIoeCk7XG4gICAgICAgIEMuaXN1YihBKTtcbiAgICAgICAgRC5pc3ViKEIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhOiBDLFxuICAgICAgYjogRCxcbiAgICAgIGdjZDogeS5pdXNobG4oZylcbiAgICB9O1xuICB9O1xuXG4gIC8vIFRoaXMgaXMgcmVkdWNlZCBpbmNhcm5hdGlvbiBvZiB0aGUgYmluYXJ5IEVFQVxuICAvLyBhYm92ZSwgZGVzaWduYXRlZCB0byBpbnZlcnQgbWVtYmVycyBvZiB0aGVcbiAgLy8gX3ByaW1lXyBmaWVsZHMgRihwKSBhdCBhIG1heGltYWwgc3BlZWRcbiAgQk4ucHJvdG90eXBlLl9pbnZtcCA9IGZ1bmN0aW9uIF9pbnZtcCAocCkge1xuICAgIGFzc2VydChwLm5lZ2F0aXZlID09PSAwKTtcbiAgICBhc3NlcnQoIXAuaXNaZXJvKCkpO1xuXG4gICAgdmFyIGEgPSB0aGlzO1xuICAgIHZhciBiID0gcC5jbG9uZSgpO1xuXG4gICAgaWYgKGEubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGEgPSBhLnVtb2QocCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBhLmNsb25lKCk7XG4gICAgfVxuXG4gICAgdmFyIHgxID0gbmV3IEJOKDEpO1xuICAgIHZhciB4MiA9IG5ldyBCTigwKTtcblxuICAgIHZhciBkZWx0YSA9IGIuY2xvbmUoKTtcblxuICAgIHdoaWxlIChhLmNtcG4oMSkgPiAwICYmIGIuY21wbigxKSA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpbSA9IDE7IChhLndvcmRzWzBdICYgaW0pID09PSAwICYmIGkgPCAyNjsgKytpLCBpbSA8PD0gMSk7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgYS5pdXNocm4oaSk7XG4gICAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKHgxLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIHgxLmlhZGQoZGVsdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHgxLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBqID0gMCwgam0gPSAxOyAoYi53b3Jkc1swXSAmIGptKSA9PT0gMCAmJiBqIDwgMjY7ICsraiwgam0gPDw9IDEpO1xuICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgIGIuaXVzaHJuKGopO1xuICAgICAgICB3aGlsZSAoai0tID4gMCkge1xuICAgICAgICAgIGlmICh4Mi5pc09kZCgpKSB7XG4gICAgICAgICAgICB4Mi5pYWRkKGRlbHRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB4Mi5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGEuY21wKGIpID49IDApIHtcbiAgICAgICAgYS5pc3ViKGIpO1xuICAgICAgICB4MS5pc3ViKHgyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGIuaXN1YihhKTtcbiAgICAgICAgeDIuaXN1Yih4MSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlcztcbiAgICBpZiAoYS5jbXBuKDEpID09PSAwKSB7XG4gICAgICByZXMgPSB4MTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0geDI7XG4gICAgfVxuXG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQocCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ2NkID0gZnVuY3Rpb24gZ2NkIChudW0pIHtcbiAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIG51bS5hYnMoKTtcbiAgICBpZiAobnVtLmlzWmVybygpKSByZXR1cm4gdGhpcy5hYnMoKTtcblxuICAgIHZhciBhID0gdGhpcy5jbG9uZSgpO1xuICAgIHZhciBiID0gbnVtLmNsb25lKCk7XG4gICAgYS5uZWdhdGl2ZSA9IDA7XG4gICAgYi5uZWdhdGl2ZSA9IDA7XG5cbiAgICAvLyBSZW1vdmUgY29tbW9uIGZhY3RvciBvZiB0d29cbiAgICBmb3IgKHZhciBzaGlmdCA9IDA7IGEuaXNFdmVuKCkgJiYgYi5pc0V2ZW4oKTsgc2hpZnQrKykge1xuICAgICAgYS5pdXNocm4oMSk7XG4gICAgICBiLml1c2hybigxKTtcbiAgICB9XG5cbiAgICBkbyB7XG4gICAgICB3aGlsZSAoYS5pc0V2ZW4oKSkge1xuICAgICAgICBhLml1c2hybigxKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChiLmlzRXZlbigpKSB7XG4gICAgICAgIGIuaXVzaHJuKDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgciA9IGEuY21wKGIpO1xuICAgICAgaWYgKHIgPCAwKSB7XG4gICAgICAgIC8vIFN3YXAgYGFgIGFuZCBgYmAgdG8gbWFrZSBgYWAgYWx3YXlzIGJpZ2dlciB0aGFuIGBiYFxuICAgICAgICB2YXIgdCA9IGE7XG4gICAgICAgIGEgPSBiO1xuICAgICAgICBiID0gdDtcbiAgICAgIH0gZWxzZSBpZiAociA9PT0gMCB8fCBiLmNtcG4oMSkgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGEuaXN1YihiKTtcbiAgICB9IHdoaWxlICh0cnVlKTtcblxuICAgIHJldHVybiBiLml1c2hsbihzaGlmdCk7XG4gIH07XG5cbiAgLy8gSW52ZXJ0IG51bWJlciBpbiB0aGUgZmllbGQgRihudW0pXG4gIEJOLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZWdjZChudW0pLmEudW1vZChudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4gKCkge1xuICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkICgpIHtcbiAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMTtcbiAgfTtcblxuICAvLyBBbmQgZmlyc3Qgd29yZCBhbmQgbnVtXG4gIEJOLnByb3RvdHlwZS5hbmRsbiA9IGZ1bmN0aW9uIGFuZGxuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy53b3Jkc1swXSAmIG51bTtcbiAgfTtcblxuICAvLyBJbmNyZW1lbnQgYXQgdGhlIGJpdCBwb3NpdGlvbiBpbi1saW5lXG4gIEJOLnByb3RvdHlwZS5iaW5jbiA9IGZ1bmN0aW9uIGJpbmNuIChiaXQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicpO1xuICAgIHZhciByID0gYml0ICUgMjY7XG4gICAgdmFyIHMgPSAoYml0IC0gcikgLyAyNjtcbiAgICB2YXIgcSA9IDEgPDwgcjtcblxuICAgIC8vIEZhc3QgY2FzZTogYml0IGlzIG11Y2ggaGlnaGVyIHRoYW4gYWxsIGV4aXN0aW5nIHdvcmRzXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHtcbiAgICAgIHRoaXMuX2V4cGFuZChzICsgMSk7XG4gICAgICB0aGlzLndvcmRzW3NdIHw9IHE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgYml0IGFuZCBwcm9wYWdhdGUsIGlmIG5lZWRlZFxuICAgIHZhciBjYXJyeSA9IHE7XG4gICAgZm9yICh2YXIgaSA9IHM7IGNhcnJ5ICE9PSAwICYmIGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdyArPSBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+Pj4gMjY7XG4gICAgICB3ICY9IDB4M2ZmZmZmZjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3O1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiBpc1plcm8gKCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jbXBuID0gZnVuY3Rpb24gY21wbiAobnVtKSB7XG4gICAgdmFyIG5lZ2F0aXZlID0gbnVtIDwgMDtcblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmICFuZWdhdGl2ZSkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG5lZ2F0aXZlKSByZXR1cm4gMTtcblxuICAgIHRoaXMuc3RyaXAoKTtcblxuICAgIHZhciByZXM7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSkge1xuICAgICAgcmVzID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgICAgIG51bSA9IC1udW07XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmLCAnTnVtYmVyIGlzIHRvbyBiaWcnKTtcblxuICAgICAgdmFyIHcgPSB0aGlzLndvcmRzWzBdIHwgMDtcbiAgICAgIHJlcyA9IHcgPT09IG51bSA/IDAgOiB3IDwgbnVtID8gLTEgOiAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIC1yZXMgfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gQ29tcGFyZSB0d28gbnVtYmVycyBhbmQgcmV0dXJuOlxuICAvLyAxIC0gaWYgYHRoaXNgID4gYG51bWBcbiAgLy8gMCAtIGlmIGB0aGlzYCA9PSBgbnVtYFxuICAvLyAtMSAtIGlmIGB0aGlzYCA8IGBudW1gXG4gIEJOLnByb3RvdHlwZS5jbXAgPSBmdW5jdGlvbiBjbXAgKG51bSkge1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIDE7XG5cbiAgICB2YXIgcmVzID0gdGhpcy51Y21wKG51bSk7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHJldHVybiAtcmVzIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIFVuc2lnbmVkIGNvbXBhcmlzb25cbiAgQk4ucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbiB1Y21wIChudW0pIHtcbiAgICAvLyBBdCB0aGlzIHBvaW50IGJvdGggbnVtYmVycyBoYXZlIHRoZSBzYW1lIHNpZ25cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5sZW5ndGggPCBudW0ubGVuZ3RoKSByZXR1cm4gLTE7XG5cbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGEgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHZhciBiID0gbnVtLndvcmRzW2ldIHwgMDtcblxuICAgICAgaWYgKGEgPT09IGIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgIHJlcyA9IC0xO1xuICAgICAgfSBlbHNlIGlmIChhID4gYikge1xuICAgICAgICByZXMgPSAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0biA9IGZ1bmN0aW9uIGd0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAxO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uIGd0IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RlbiA9IGZ1bmN0aW9uIGd0ZW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA+PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndGUgPSBmdW5jdGlvbiBndGUgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID49IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0biA9IGZ1bmN0aW9uIGx0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAtMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHQgPSBmdW5jdGlvbiBsdCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IC0xO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdGVuID0gZnVuY3Rpb24gbHRlbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pIDw9IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ZSA9IGZ1bmN0aW9uIGx0ZSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPD0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZXFuID0gZnVuY3Rpb24gZXFuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAwO1xuICB9O1xuXG4gIC8vXG4gIC8vIEEgcmVkdWNlIGNvbnRleHQsIGNvdWxkIGJlIHVzaW5nIG1vbnRnb21lcnkgb3Igc29tZXRoaW5nIGJldHRlciwgZGVwZW5kaW5nXG4gIC8vIG9uIHRoZSBgbWAgaXRzZWxmLlxuICAvL1xuICBCTi5yZWQgPSBmdW5jdGlvbiByZWQgKG51bSkge1xuICAgIHJldHVybiBuZXcgUmVkKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvUmVkID0gZnVuY3Rpb24gdG9SZWQgKGN0eCkge1xuICAgIGFzc2VydCghdGhpcy5yZWQsICdBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIHJldHVybiBjdHguY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZChjdHgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mcm9tUmVkID0gZnVuY3Rpb24gZnJvbVJlZCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAnZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIHJldHVybiB0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2ZvcmNlUmVkID0gZnVuY3Rpb24gX2ZvcmNlUmVkIChjdHgpIHtcbiAgICB0aGlzLnJlZCA9IGN0eDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZm9yY2VSZWQgPSBmdW5jdGlvbiBmb3JjZVJlZCAoY3R4KSB7XG4gICAgYXNzZXJ0KCF0aGlzLnJlZCwgJ0FscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VSZWQoY3R4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkQWRkID0gZnVuY3Rpb24gcmVkQWRkIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJQWRkID0gZnVuY3Rpb24gcmVkSUFkZCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaWFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTdWIgPSBmdW5jdGlvbiByZWRTdWIgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElTdWIgPSBmdW5jdGlvbiByZWRJU3ViIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFNobCA9IGZ1bmN0aW9uIHJlZFNobCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zaGwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkTXVsID0gZnVuY3Rpb24gcmVkTXVsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgbnVtKTtcbiAgICByZXR1cm4gdGhpcy5yZWQubXVsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElNdWwgPSBmdW5jdGlvbiByZWRJTXVsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgbnVtKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaW11bCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTcXIgPSBmdW5jdGlvbiByZWRTcXIgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3FyKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJU3FyID0gZnVuY3Rpb24gcmVkSVNxciAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaXNxcih0aGlzKTtcbiAgfTtcblxuICAvLyBTcXVhcmUgcm9vdCBvdmVyIHBcbiAgQk4ucHJvdG90eXBlLnJlZFNxcnQgPSBmdW5jdGlvbiByZWRTcXJ0ICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTcXJ0IHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zcXJ0KHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJbnZtID0gZnVuY3Rpb24gcmVkSW52bSAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaW52bSh0aGlzKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gbmVnYXRpdmUgY2xvbmUgb2YgYHRoaXNgICUgYHJlZCBtb2R1bG9gXG4gIEJOLnByb3RvdHlwZS5yZWROZWcgPSBmdW5jdGlvbiByZWROZWcgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQubmVnKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRQb3cgPSBmdW5jdGlvbiByZWRQb3cgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCAmJiAhbnVtLnJlZCwgJ3JlZFBvdyhub3JtYWxOdW0pJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnBvdyh0aGlzLCBudW0pO1xuICB9O1xuXG4gIC8vIFByaW1lIG51bWJlcnMgd2l0aCBlZmZpY2llbnQgcmVkdWN0aW9uXG4gIHZhciBwcmltZXMgPSB7XG4gICAgazI1NjogbnVsbCxcbiAgICBwMjI0OiBudWxsLFxuICAgIHAxOTI6IG51bGwsXG4gICAgcDI1NTE5OiBudWxsXG4gIH07XG5cbiAgLy8gUHNldWRvLU1lcnNlbm5lIHByaW1lXG4gIGZ1bmN0aW9uIE1QcmltZSAobmFtZSwgcCkge1xuICAgIC8vIFAgPSAyIF4gTiAtIEtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMucCA9IG5ldyBCTihwLCAxNik7XG4gICAgdGhpcy5uID0gdGhpcy5wLmJpdExlbmd0aCgpO1xuICAgIHRoaXMuayA9IG5ldyBCTigxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCk7XG5cbiAgICB0aGlzLnRtcCA9IHRoaXMuX3RtcCgpO1xuICB9XG5cbiAgTVByaW1lLnByb3RvdHlwZS5fdG1wID0gZnVuY3Rpb24gX3RtcCAoKSB7XG4gICAgdmFyIHRtcCA9IG5ldyBCTihudWxsKTtcbiAgICB0bXAud29yZHMgPSBuZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubiAvIDEzKSk7XG4gICAgcmV0dXJuIHRtcDtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmlyZWR1Y2UgPSBmdW5jdGlvbiBpcmVkdWNlIChudW0pIHtcbiAgICAvLyBBc3N1bWVzIHRoYXQgYG51bWAgaXMgbGVzcyB0aGFuIGBQXjJgXG4gICAgLy8gbnVtID0gSEkgKiAoMiBeIE4gLSBLKSArIEhJICogSyArIExPID0gSEkgKiBLICsgTE8gKG1vZCBQKVxuICAgIHZhciByID0gbnVtO1xuICAgIHZhciBybGVuO1xuXG4gICAgZG8ge1xuICAgICAgdGhpcy5zcGxpdChyLCB0aGlzLnRtcCk7XG4gICAgICByID0gdGhpcy5pbXVsSyhyKTtcbiAgICAgIHIgPSByLmlhZGQodGhpcy50bXApO1xuICAgICAgcmxlbiA9IHIuYml0TGVuZ3RoKCk7XG4gICAgfSB3aGlsZSAocmxlbiA+IHRoaXMubik7XG5cbiAgICB2YXIgY21wID0gcmxlbiA8IHRoaXMubiA/IC0xIDogci51Y21wKHRoaXMucCk7XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgci53b3Jkc1swXSA9IDA7XG4gICAgICByLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgICByLmlzdWIodGhpcy5wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgci5zdHJpcCgpO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dCkge1xuICAgIGlucHV0Lml1c2hybih0aGlzLm4sIDAsIG91dCk7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICByZXR1cm4gbnVtLmltdWwodGhpcy5rKTtcbiAgfTtcblxuICBmdW5jdGlvbiBLMjU2ICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAnazI1NicsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnKTtcbiAgfVxuICBpbmhlcml0cyhLMjU2LCBNUHJpbWUpO1xuXG4gIEsyNTYucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24gc3BsaXQgKGlucHV0LCBvdXRwdXQpIHtcbiAgICAvLyAyNTYgPSA5ICogMjYgKyAyMlxuICAgIHZhciBtYXNrID0gMHgzZmZmZmY7XG5cbiAgICB2YXIgb3V0TGVuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCA5KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG91dExlbjsgaSsrKSB7XG4gICAgICBvdXRwdXQud29yZHNbaV0gPSBpbnB1dC53b3Jkc1tpXTtcbiAgICB9XG4gICAgb3V0cHV0Lmxlbmd0aCA9IG91dExlbjtcblxuICAgIGlmIChpbnB1dC5sZW5ndGggPD0gOSkge1xuICAgICAgaW5wdXQud29yZHNbMF0gPSAwO1xuICAgICAgaW5wdXQubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaGlmdCBieSA5IGxpbWJzXG4gICAgdmFyIHByZXYgPSBpbnB1dC53b3Jkc1s5XTtcbiAgICBvdXRwdXQud29yZHNbb3V0cHV0Lmxlbmd0aCsrXSA9IHByZXYgJiBtYXNrO1xuXG4gICAgZm9yIChpID0gMTA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5leHQgPSBpbnB1dC53b3Jkc1tpXSB8IDA7XG4gICAgICBpbnB1dC53b3Jkc1tpIC0gMTBdID0gKChuZXh0ICYgbWFzaykgPDwgNCkgfCAocHJldiA+Pj4gMjIpO1xuICAgICAgcHJldiA9IG5leHQ7XG4gICAgfVxuICAgIHByZXYgPj4+PSAyMjtcbiAgICBpbnB1dC53b3Jkc1tpIC0gMTBdID0gcHJldjtcbiAgICBpZiAocHJldiA9PT0gMCAmJiBpbnB1dC5sZW5ndGggPiAxMCkge1xuICAgICAgaW5wdXQubGVuZ3RoIC09IDEwO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gOTtcbiAgICB9XG4gIH07XG5cbiAgSzI1Ni5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgLy8gSyA9IDB4MTAwMDAwM2QxID0gWyAweDQwLCAweDNkMSBdXG4gICAgbnVtLndvcmRzW251bS5sZW5ndGhdID0gMDtcbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aCArIDFdID0gMDtcbiAgICBudW0ubGVuZ3RoICs9IDI7XG5cbiAgICAvLyBib3VuZGVkIGF0OiAweDQwICogMHgzZmZmZmZmICsgMHgzZDAgPSAweDEwMDAwMDM5MFxuICAgIHZhciBsbyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gbnVtLndvcmRzW2ldIHwgMDtcbiAgICAgIGxvICs9IHcgKiAweDNkMTtcbiAgICAgIG51bS53b3Jkc1tpXSA9IGxvICYgMHgzZmZmZmZmO1xuICAgICAgbG8gPSB3ICogMHg0MCArICgobG8gLyAweDQwMDAwMDApIHwgMCk7XG4gICAgfVxuXG4gICAgLy8gRmFzdCBsZW5ndGggcmVkdWN0aW9uXG4gICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgIG51bS5sZW5ndGgtLTtcbiAgICAgIGlmIChudW0ud29yZHNbbnVtLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICAgIG51bS5sZW5ndGgtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICBmdW5jdGlvbiBQMjI0ICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAncDIyNCcsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEnKTtcbiAgfVxuICBpbmhlcml0cyhQMjI0LCBNUHJpbWUpO1xuXG4gIGZ1bmN0aW9uIFAxOTIgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMTkyJyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZicpO1xuICB9XG4gIGluaGVyaXRzKFAxOTIsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDI1NTE5ICgpIHtcbiAgICAvLyAyIF4gMjU1IC0gMTlcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAnMjU1MTknLFxuICAgICAgJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnKTtcbiAgfVxuICBpbmhlcml0cyhQMjU1MTksIE1QcmltZSk7XG5cbiAgUDI1NTE5LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxM1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoaSA9IChudW0ud29yZHNbaV0gfCAwKSAqIDB4MTMgKyBjYXJyeTtcbiAgICAgIHZhciBsbyA9IGhpICYgMHgzZmZmZmZmO1xuICAgICAgaGkgPj4+PSAyNjtcblxuICAgICAgbnVtLndvcmRzW2ldID0gbG87XG4gICAgICBjYXJyeSA9IGhpO1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoKytdID0gY2Fycnk7XG4gICAgfVxuICAgIHJldHVybiBudW07XG4gIH07XG5cbiAgLy8gRXhwb3J0ZWQgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB1c2UgcGxhaW4gbmFtZSBpbnN0ZWFkXG4gIEJOLl9wcmltZSA9IGZ1bmN0aW9uIHByaW1lIChuYW1lKSB7XG4gICAgLy8gQ2FjaGVkIHZlcnNpb24gb2YgcHJpbWVcbiAgICBpZiAocHJpbWVzW25hbWVdKSByZXR1cm4gcHJpbWVzW25hbWVdO1xuXG4gICAgdmFyIHByaW1lO1xuICAgIGlmIChuYW1lID09PSAnazI1NicpIHtcbiAgICAgIHByaW1lID0gbmV3IEsyNTYoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjI0Jykge1xuICAgICAgcHJpbWUgPSBuZXcgUDIyNCgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AxOTInKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMTkyKCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDI1NTE5Jykge1xuICAgICAgcHJpbWUgPSBuZXcgUDI1NTE5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcmltZSAnICsgbmFtZSk7XG4gICAgfVxuICAgIHByaW1lc1tuYW1lXSA9IHByaW1lO1xuXG4gICAgcmV0dXJuIHByaW1lO1xuICB9O1xuXG4gIC8vXG4gIC8vIEJhc2UgcmVkdWN0aW9uIGVuZ2luZVxuICAvL1xuICBmdW5jdGlvbiBSZWQgKG0pIHtcbiAgICBpZiAodHlwZW9mIG0gPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgcHJpbWUgPSBCTi5fcHJpbWUobSk7XG4gICAgICB0aGlzLm0gPSBwcmltZS5wO1xuICAgICAgdGhpcy5wcmltZSA9IHByaW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobS5ndG4oMSksICdtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEnKTtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgICB0aGlzLnByaW1lID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBSZWQucHJvdG90eXBlLl92ZXJpZnkxID0gZnVuY3Rpb24gX3ZlcmlmeTEgKGEpIHtcbiAgICBhc3NlcnQoYS5uZWdhdGl2ZSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgYXNzZXJ0KGEucmVkLCAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTIgPSBmdW5jdGlvbiBfdmVyaWZ5MiAoYSwgYikge1xuICAgIGFzc2VydCgoYS5uZWdhdGl2ZSB8IGIubmVnYXRpdmUpID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQgJiYgYS5yZWQgPT09IGIucmVkLFxuICAgICAgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmltb2QgPSBmdW5jdGlvbiBpbW9kIChhKSB7XG4gICAgaWYgKHRoaXMucHJpbWUpIHJldHVybiB0aGlzLnByaW1lLmlyZWR1Y2UoYSkuX2ZvcmNlUmVkKHRoaXMpO1xuICAgIHJldHVybiBhLnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkge1xuICAgICAgcmV0dXJuIGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tLnN1YihhKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5zdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pc3ViKGIpO1xuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zaGwgPSBmdW5jdGlvbiBzaGwgKGEsIG51bSkge1xuICAgIHRoaXMuX3ZlcmlmeTEoYSk7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLnVzaGxuKG51bSkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuICAgIHJldHVybiB0aGlzLmltb2QoYS5pbXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLm11bChiKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLmltdWwoYSwgYS5jbG9uZSgpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uIHNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLm11bChhLCBhKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxcnQgPSBmdW5jdGlvbiBzcXJ0IChhKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkpIHJldHVybiBhLmNsb25lKCk7XG5cbiAgICB2YXIgbW9kMyA9IHRoaXMubS5hbmRsbigzKTtcbiAgICBhc3NlcnQobW9kMyAlIDIgPT09IDEpO1xuXG4gICAgLy8gRmFzdCBjYXNlXG4gICAgaWYgKG1vZDMgPT09IDMpIHtcbiAgICAgIHZhciBwb3cgPSB0aGlzLm0uYWRkKG5ldyBCTigxKSkuaXVzaHJuKDIpO1xuICAgICAgcmV0dXJuIHRoaXMucG93KGEsIHBvdyk7XG4gICAgfVxuXG4gICAgLy8gVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtIChUb3RhbGx5IHVub3B0aW1pemVkIGFuZCBzbG93KVxuICAgIC8vXG4gICAgLy8gRmluZCBRIGFuZCBTLCB0aGF0IFEgKiAyIF4gUyA9IChQIC0gMSlcbiAgICB2YXIgcSA9IHRoaXMubS5zdWJuKDEpO1xuICAgIHZhciBzID0gMDtcbiAgICB3aGlsZSAoIXEuaXNaZXJvKCkgJiYgcS5hbmRsbigxKSA9PT0gMCkge1xuICAgICAgcysrO1xuICAgICAgcS5pdXNocm4oMSk7XG4gICAgfVxuICAgIGFzc2VydCghcS5pc1plcm8oKSk7XG5cbiAgICB2YXIgb25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHZhciBuT25lID0gb25lLnJlZE5lZygpO1xuXG4gICAgLy8gRmluZCBxdWFkcmF0aWMgbm9uLXJlc2lkdWVcbiAgICAvLyBOT1RFOiBNYXggaXMgc3VjaCBiZWNhdXNlIG9mIGdlbmVyYWxpemVkIFJpZW1hbm4gaHlwb3RoZXNpcy5cbiAgICB2YXIgbHBvdyA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKTtcbiAgICB2YXIgeiA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICB6ID0gbmV3IEJOKDIgKiB6ICogeikudG9SZWQodGhpcyk7XG5cbiAgICB3aGlsZSAodGhpcy5wb3coeiwgbHBvdykuY21wKG5PbmUpICE9PSAwKSB7XG4gICAgICB6LnJlZElBZGQobk9uZSk7XG4gICAgfVxuXG4gICAgdmFyIGMgPSB0aGlzLnBvdyh6LCBxKTtcbiAgICB2YXIgciA9IHRoaXMucG93KGEsIHEuYWRkbigxKS5pdXNocm4oMSkpO1xuICAgIHZhciB0ID0gdGhpcy5wb3coYSwgcSk7XG4gICAgdmFyIG0gPSBzO1xuICAgIHdoaWxlICh0LmNtcChvbmUpICE9PSAwKSB7XG4gICAgICB2YXIgdG1wID0gdDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyB0bXAuY21wKG9uZSkgIT09IDA7IGkrKykge1xuICAgICAgICB0bXAgPSB0bXAucmVkU3FyKCk7XG4gICAgICB9XG4gICAgICBhc3NlcnQoaSA8IG0pO1xuICAgICAgdmFyIGIgPSB0aGlzLnBvdyhjLCBuZXcgQk4oMSkuaXVzaGxuKG0gLSBpIC0gMSkpO1xuXG4gICAgICByID0gci5yZWRNdWwoYik7XG4gICAgICBjID0gYi5yZWRTcXIoKTtcbiAgICAgIHQgPSB0LnJlZE11bChjKTtcbiAgICAgIG0gPSBpO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKGEpIHtcbiAgICB2YXIgaW52ID0gYS5faW52bXAodGhpcy5tKTtcbiAgICBpZiAoaW52Lm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBpbnYubmVnYXRpdmUgPSAwO1xuICAgICAgcmV0dXJuIHRoaXMuaW1vZChpbnYpLnJlZE5lZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludik7XG4gICAgfVxuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93IChhLCBudW0pIHtcbiAgICBpZiAobnVtLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDEpO1xuICAgIGlmIChudW0uY21wbigxKSA9PT0gMCkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciB3aW5kb3dTaXplID0gNDtcbiAgICB2YXIgd25kID0gbmV3IEFycmF5KDEgPDwgd2luZG93U2l6ZSk7XG4gICAgd25kWzBdID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHduZFsxXSA9IGE7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCB3bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHduZFtpXSA9IHRoaXMubXVsKHduZFtpIC0gMV0sIGEpO1xuICAgIH1cblxuICAgIHZhciByZXMgPSB3bmRbMF07XG4gICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgIHZhciBjdXJyZW50TGVuID0gMDtcbiAgICB2YXIgc3RhcnQgPSBudW0uYml0TGVuZ3RoKCkgJSAyNjtcbiAgICBpZiAoc3RhcnQgPT09IDApIHtcbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgZm9yIChpID0gbnVtLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgd29yZCA9IG51bS53b3Jkc1tpXTtcbiAgICAgIGZvciAodmFyIGogPSBzdGFydCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHZhciBiaXQgPSAod29yZCA+PiBqKSAmIDE7XG4gICAgICAgIGlmIChyZXMgIT09IHduZFswXSkge1xuICAgICAgICAgIHJlcyA9IHRoaXMuc3FyKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYml0ID09PSAwICYmIGN1cnJlbnQgPT09IDApIHtcbiAgICAgICAgICBjdXJyZW50TGVuID0gMDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQgPDw9IDE7XG4gICAgICAgIGN1cnJlbnQgfD0gYml0O1xuICAgICAgICBjdXJyZW50TGVuKys7XG4gICAgICAgIGlmIChjdXJyZW50TGVuICE9PSB3aW5kb3dTaXplICYmIChpICE9PSAwIHx8IGogIT09IDApKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSB0aGlzLm11bChyZXMsIHduZFtjdXJyZW50XSk7XG4gICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICBjdXJyZW50ID0gMDtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uIGNvbnZlcnRUbyAobnVtKSB7XG4gICAgdmFyIHIgPSBudW0udW1vZCh0aGlzLm0pO1xuXG4gICAgcmV0dXJuIHIgPT09IG51bSA/IHIuY2xvbmUoKSA6IHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgcmVzID0gbnVtLmNsb25lKCk7XG4gICAgcmVzLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvL1xuICAvLyBNb250Z29tZXJ5IG1ldGhvZCBlbmdpbmVcbiAgLy9cblxuICBCTi5tb250ID0gZnVuY3Rpb24gbW9udCAobnVtKSB7XG4gICAgcmV0dXJuIG5ldyBNb250KG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gTW9udCAobSkge1xuICAgIFJlZC5jYWxsKHRoaXMsIG0pO1xuXG4gICAgdGhpcy5zaGlmdCA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICBpZiAodGhpcy5zaGlmdCAlIDI2ICE9PSAwKSB7XG4gICAgICB0aGlzLnNoaWZ0ICs9IDI2IC0gKHRoaXMuc2hpZnQgJSAyNik7XG4gICAgfVxuXG4gICAgdGhpcy5yID0gbmV3IEJOKDEpLml1c2hsbih0aGlzLnNoaWZ0KTtcbiAgICB0aGlzLnIyID0gdGhpcy5pbW9kKHRoaXMuci5zcXIoKSk7XG4gICAgdGhpcy5yaW52ID0gdGhpcy5yLl9pbnZtcCh0aGlzLm0pO1xuXG4gICAgdGhpcy5taW52ID0gdGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pO1xuICAgIHRoaXMubWludiA9IHRoaXMubWludi51bW9kKHRoaXMucik7XG4gICAgdGhpcy5taW52ID0gdGhpcy5yLnN1Yih0aGlzLm1pbnYpO1xuICB9XG4gIGluaGVyaXRzKE1vbnQsIFJlZCk7XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5pbW9kKG51bS51c2hsbih0aGlzLnNoaWZ0KSk7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbiBjb252ZXJ0RnJvbSAobnVtKSB7XG4gICAgdmFyIHIgPSB0aGlzLmltb2QobnVtLm11bCh0aGlzLnJpbnYpKTtcbiAgICByLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSB7XG4gICAgICBhLndvcmRzWzBdID0gMDtcbiAgICAgIGEubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIHZhciB0ID0gYS5pbXVsKGIpO1xuICAgIHZhciBjID0gdC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSk7XG4gICAgdmFyIHUgPSB0LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpO1xuICAgIHZhciByZXMgPSB1O1xuXG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDApLl9mb3JjZVJlZCh0aGlzKTtcblxuICAgIHZhciB0ID0gYS5tdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIC8vIChBUileLTEgKiBSXjIgPSAoQV4tMSAqIFJeLTEpICogUl4yID0gQV4tMSAqIFJcbiAgICB2YXIgcmVzID0gdGhpcy5pbW9kKGEuX2ludm1wKHRoaXMubSkubXVsKHRoaXMucjIpKTtcbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcbn0pKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnIHx8IG1vZHVsZSwgdGhpcyk7XG4iLCJ2YXIgY29uY2F0TWFwID0gcmVxdWlyZSgnY29uY2F0LW1hcCcpO1xudmFyIGJhbGFuY2VkID0gcmVxdWlyZSgnYmFsYW5jZWQtbWF0Y2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBhbmRUb3A7XG5cbnZhciBlc2NTbGFzaCA9ICdcXDBTTEFTSCcrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NPcGVuID0gJ1xcME9QRU4nK01hdGgucmFuZG9tKCkrJ1xcMCc7XG52YXIgZXNjQ2xvc2UgPSAnXFwwQ0xPU0UnK01hdGgucmFuZG9tKCkrJ1xcMCc7XG52YXIgZXNjQ29tbWEgPSAnXFwwQ09NTUEnK01hdGgucmFuZG9tKCkrJ1xcMCc7XG52YXIgZXNjUGVyaW9kID0gJ1xcMFBFUklPRCcrTWF0aC5yYW5kb20oKSsnXFwwJztcblxuZnVuY3Rpb24gbnVtZXJpYyhzdHIpIHtcbiAgcmV0dXJuIHBhcnNlSW50KHN0ciwgMTApID09IHN0clxuICAgID8gcGFyc2VJbnQoc3RyLCAxMClcbiAgICA6IHN0ci5jaGFyQ29kZUF0KDApO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVCcmFjZXMoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoJ1xcXFxcXFxcJykuam9pbihlc2NTbGFzaClcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXHsnKS5qb2luKGVzY09wZW4pXG4gICAgICAgICAgICAuc3BsaXQoJ1xcXFx9Jykuam9pbihlc2NDbG9zZSlcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXCwnKS5qb2luKGVzY0NvbW1hKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxcLicpLmpvaW4oZXNjUGVyaW9kKTtcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGVCcmFjZXMoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoZXNjU2xhc2gpLmpvaW4oJ1xcXFwnKVxuICAgICAgICAgICAgLnNwbGl0KGVzY09wZW4pLmpvaW4oJ3snKVxuICAgICAgICAgICAgLnNwbGl0KGVzY0Nsb3NlKS5qb2luKCd9JylcbiAgICAgICAgICAgIC5zcGxpdChlc2NDb21tYSkuam9pbignLCcpXG4gICAgICAgICAgICAuc3BsaXQoZXNjUGVyaW9kKS5qb2luKCcuJyk7XG59XG5cblxuLy8gQmFzaWNhbGx5IGp1c3Qgc3RyLnNwbGl0KFwiLFwiKSwgYnV0IGhhbmRsaW5nIGNhc2VzXG4vLyB3aGVyZSB3ZSBoYXZlIG5lc3RlZCBicmFjZWQgc2VjdGlvbnMsIHdoaWNoIHNob3VsZCBiZVxuLy8gdHJlYXRlZCBhcyBpbmRpdmlkdWFsIG1lbWJlcnMsIGxpa2Uge2Ese2IsY30sZH1cbmZ1bmN0aW9uIHBhcnNlQ29tbWFQYXJ0cyhzdHIpIHtcbiAgaWYgKCFzdHIpXG4gICAgcmV0dXJuIFsnJ107XG5cbiAgdmFyIHBhcnRzID0gW107XG4gIHZhciBtID0gYmFsYW5jZWQoJ3snLCAnfScsIHN0cik7XG5cbiAgaWYgKCFtKVxuICAgIHJldHVybiBzdHIuc3BsaXQoJywnKTtcblxuICB2YXIgcHJlID0gbS5wcmU7XG4gIHZhciBib2R5ID0gbS5ib2R5O1xuICB2YXIgcG9zdCA9IG0ucG9zdDtcbiAgdmFyIHAgPSBwcmUuc3BsaXQoJywnKTtcblxuICBwW3AubGVuZ3RoLTFdICs9ICd7JyArIGJvZHkgKyAnfSc7XG4gIHZhciBwb3N0UGFydHMgPSBwYXJzZUNvbW1hUGFydHMocG9zdCk7XG4gIGlmIChwb3N0Lmxlbmd0aCkge1xuICAgIHBbcC5sZW5ndGgtMV0gKz0gcG9zdFBhcnRzLnNoaWZ0KCk7XG4gICAgcC5wdXNoLmFwcGx5KHAsIHBvc3RQYXJ0cyk7XG4gIH1cblxuICBwYXJ0cy5wdXNoLmFwcGx5KHBhcnRzLCBwKTtcblxuICByZXR1cm4gcGFydHM7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFRvcChzdHIpIHtcbiAgaWYgKCFzdHIpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHJldHVybiBleHBhbmQoZXNjYXBlQnJhY2VzKHN0ciksIHRydWUpLm1hcCh1bmVzY2FwZUJyYWNlcyk7XG59XG5cbmZ1bmN0aW9uIGlkZW50aXR5KGUpIHtcbiAgcmV0dXJuIGU7XG59XG5cbmZ1bmN0aW9uIGVtYnJhY2Uoc3RyKSB7XG4gIHJldHVybiAneycgKyBzdHIgKyAnfSc7XG59XG5mdW5jdGlvbiBpc1BhZGRlZChlbCkge1xuICByZXR1cm4gL14tPzBcXGQvLnRlc3QoZWwpO1xufVxuXG5mdW5jdGlvbiBsdGUoaSwgeSkge1xuICByZXR1cm4gaSA8PSB5O1xufVxuZnVuY3Rpb24gZ3RlKGksIHkpIHtcbiAgcmV0dXJuIGkgPj0geTtcbn1cblxuZnVuY3Rpb24gZXhwYW5kKHN0ciwgaXNUb3ApIHtcbiAgdmFyIGV4cGFuc2lvbnMgPSBbXTtcblxuICB2YXIgbSA9IGJhbGFuY2VkKCd7JywgJ30nLCBzdHIpO1xuICBpZiAoIW0gfHwgL1xcJCQvLnRlc3QobS5wcmUpKSByZXR1cm4gW3N0cl07XG5cbiAgdmFyIGlzTnVtZXJpY1NlcXVlbmNlID0gL14tP1xcZCtcXC5cXC4tP1xcZCsoPzpcXC5cXC4tP1xcZCspPyQvLnRlc3QobS5ib2R5KTtcbiAgdmFyIGlzQWxwaGFTZXF1ZW5jZSA9IC9eW2EtekEtWl1cXC5cXC5bYS16QS1aXSg/OlxcLlxcLi0/XFxkKyk/JC8udGVzdChtLmJvZHkpO1xuICB2YXIgaXNTZXF1ZW5jZSA9IGlzTnVtZXJpY1NlcXVlbmNlIHx8IGlzQWxwaGFTZXF1ZW5jZTtcbiAgdmFyIGlzT3B0aW9ucyA9IC9eKC4qLCkrKC4rKT8kLy50ZXN0KG0uYm9keSk7XG4gIGlmICghaXNTZXF1ZW5jZSAmJiAhaXNPcHRpb25zKSB7XG4gICAgLy8ge2F9LGJ9XG4gICAgaWYgKG0ucG9zdC5tYXRjaCgvLC4qXFx9LykpIHtcbiAgICAgIHN0ciA9IG0ucHJlICsgJ3snICsgbS5ib2R5ICsgZXNjQ2xvc2UgKyBtLnBvc3Q7XG4gICAgICByZXR1cm4gZXhwYW5kKHN0cik7XG4gICAgfVxuICAgIHJldHVybiBbc3RyXTtcbiAgfVxuXG4gIHZhciBuO1xuICBpZiAoaXNTZXF1ZW5jZSkge1xuICAgIG4gPSBtLmJvZHkuc3BsaXQoL1xcLlxcLi8pO1xuICB9IGVsc2Uge1xuICAgIG4gPSBwYXJzZUNvbW1hUGFydHMobS5ib2R5KTtcbiAgICBpZiAobi5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIHh7e2EsYn19eSA9PT4geHthfXkgeHtifXlcbiAgICAgIG4gPSBleHBhbmQoblswXSwgZmFsc2UpLm1hcChlbWJyYWNlKTtcbiAgICAgIGlmIChuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB2YXIgcG9zdCA9IG0ucG9zdC5sZW5ndGhcbiAgICAgICAgICA/IGV4cGFuZChtLnBvc3QsIGZhbHNlKVxuICAgICAgICAgIDogWycnXTtcbiAgICAgICAgcmV0dXJuIHBvc3QubWFwKGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICByZXR1cm4gbS5wcmUgKyBuWzBdICsgcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYXQgdGhpcyBwb2ludCwgbiBpcyB0aGUgcGFydHMsIGFuZCB3ZSBrbm93IGl0J3Mgbm90IGEgY29tbWEgc2V0XG4gIC8vIHdpdGggYSBzaW5nbGUgZW50cnkuXG5cbiAgLy8gbm8gbmVlZCB0byBleHBhbmQgcHJlLCBzaW5jZSBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIGZyZWUgb2YgYnJhY2Utc2V0c1xuICB2YXIgcHJlID0gbS5wcmU7XG4gIHZhciBwb3N0ID0gbS5wb3N0Lmxlbmd0aFxuICAgID8gZXhwYW5kKG0ucG9zdCwgZmFsc2UpXG4gICAgOiBbJyddO1xuXG4gIHZhciBOO1xuXG4gIGlmIChpc1NlcXVlbmNlKSB7XG4gICAgdmFyIHggPSBudW1lcmljKG5bMF0pO1xuICAgIHZhciB5ID0gbnVtZXJpYyhuWzFdKTtcbiAgICB2YXIgd2lkdGggPSBNYXRoLm1heChuWzBdLmxlbmd0aCwgblsxXS5sZW5ndGgpXG4gICAgdmFyIGluY3IgPSBuLmxlbmd0aCA9PSAzXG4gICAgICA/IE1hdGguYWJzKG51bWVyaWMoblsyXSkpXG4gICAgICA6IDE7XG4gICAgdmFyIHRlc3QgPSBsdGU7XG4gICAgdmFyIHJldmVyc2UgPSB5IDwgeDtcbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgaW5jciAqPSAtMTtcbiAgICAgIHRlc3QgPSBndGU7XG4gICAgfVxuICAgIHZhciBwYWQgPSBuLnNvbWUoaXNQYWRkZWQpO1xuXG4gICAgTiA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IHg7IHRlc3QoaSwgeSk7IGkgKz0gaW5jcikge1xuICAgICAgdmFyIGM7XG4gICAgICBpZiAoaXNBbHBoYVNlcXVlbmNlKSB7XG4gICAgICAgIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xuICAgICAgICBpZiAoYyA9PT0gJ1xcXFwnKVxuICAgICAgICAgIGMgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGMgPSBTdHJpbmcoaSk7XG4gICAgICAgIGlmIChwYWQpIHtcbiAgICAgICAgICB2YXIgbmVlZCA9IHdpZHRoIC0gYy5sZW5ndGg7XG4gICAgICAgICAgaWYgKG5lZWQgPiAwKSB7XG4gICAgICAgICAgICB2YXIgeiA9IG5ldyBBcnJheShuZWVkICsgMSkuam9pbignMCcpO1xuICAgICAgICAgICAgaWYgKGkgPCAwKVxuICAgICAgICAgICAgICBjID0gJy0nICsgeiArIGMuc2xpY2UoMSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGMgPSB6ICsgYztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIE4ucHVzaChjKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgTiA9IGNvbmNhdE1hcChuLCBmdW5jdGlvbihlbCkgeyByZXR1cm4gZXhwYW5kKGVsLCBmYWxzZSkgfSk7XG4gIH1cblxuICBmb3IgKHZhciBqID0gMDsgaiA8IE4ubGVuZ3RoOyBqKyspIHtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IHBvc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgIHZhciBleHBhbnNpb24gPSBwcmUgKyBOW2pdICsgcG9zdFtrXTtcbiAgICAgIGlmICghaXNUb3AgfHwgaXNTZXF1ZW5jZSB8fCBleHBhbnNpb24pXG4gICAgICAgIGV4cGFuc2lvbnMucHVzaChleHBhbnNpb24pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbnNpb25zO1xufVxuXG4iLCJcbnZhciB1ZHAgPSByZXF1aXJlKCdkZ3JhbScpXG52YXIgcGlwZSA9IHJlcXVpcmUoJ3N0cmVhbScpLnByb3RvdHlwZS5waXBlXG52YXIgb3MgPSByZXF1aXJlKCdvcycpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHBvcnQsIGxvb3BiYWNrKSB7XG5cbiAgdmFyIGFkZHJlc3NlcyA9IHt9XG4gIHZhciBzb2NrZXQgPSB1ZHAuY3JlYXRlU29ja2V0KCd1ZHA0JylcblxuICBzb2NrZXQucmVhZGFibGUgPSBzb2NrZXQud3JpdGFibGUgPSB0cnVlXG5cbiAgc29ja2V0LndyaXRlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICBpZignc3RyaW5nJyA9PT0gdHlwZW9mIG1lc3NhZ2UpXG4gICAgICBtZXNzYWdlID0gbmV3IEJ1ZmZlcihtZXNzYWdlLCAndXRmOCcpXG4gICAgc29ja2V0LnNlbmQobWVzc2FnZSwgMCwgbWVzc2FnZS5sZW5ndGgsIHBvcnQsICcyNTUuMjU1LjI1NS4yNTUnKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBzb2NrZXQuZW5kID0gZnVuY3Rpb24gKCkge1xuICAgIHNvY2tldC5jbG9zZSgpXG4gIH1cblxuICBzb2NrZXQub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIHNvY2tldC5lbWl0KCdlbmQnKVxuICB9KVxuXG4gIHZhciBsYXRlc3QgPSBudWxsXG5cbiAgc29ja2V0Lm9uKCdtZXNzYWdlJywgZnVuY3Rpb24gKG1zZywgb3RoZXIpIHtcbiAgICBpZihhZGRyZXNzZXNbb3RoZXIuYWRkcmVzc10gJiYgb3RoZXIucG9ydCA9PT0gcG9ydCkge1xuICAgICAgaWYobG9vcGJhY2sgPT09IGZhbHNlKSByZXR1cm5cbiAgICAgIG1zZy5sb29wYmFjayA9IHRydWVcbiAgICB9XG5cbiAgICBtc2cucG9ydCA9IG90aGVyLnBvcnRcbiAgICBtc2cuYWRkcmVzcyA9IG90aGVyLmFkZHJlc3NcblxuICAgIC8vaWYgcGF1c2VkLCByZW1lbWJlciB0aGUgbGF0ZXN0IGl0ZW0uXG4gICAgLy9vdGhlcndpc2UganVzdCBkcm9wIHRob3NlIG1lc3NhZ2VzLlxuICAgIGlmKHNvY2tldC5wYXVzZWQpXG4gICAgICByZXR1cm4gbGF0ZXN0ID0gbXNnXG5cbiAgICBsYXRlc3QgPSBudWxsXG4gICAgc29ja2V0LmVtaXQoJ2RhdGEnLCBtc2cpXG4gIH0pXG5cbiAgc29ja2V0LnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgIHNvY2tldC5wYXVzZWQgPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHNvY2tldC5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgc29ja2V0LnBhdXNlZCA9IGZhbHNlXG4gICAgaWYobGF0ZXN0KSB7XG4gICAgICB2YXIgbXNnID0gbGF0ZXN0XG4gICAgICBsYXRlc3QgPSBudWxsXG4gICAgICBzb2NrZXQuZW1pdCgnZGF0YScsIG1zZylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHNvY2tldC5iaW5kKHBvcnQpXG4gIHNvY2tldC5vbignbGlzdGVuaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBpZmFjZXMgPSBvcy5uZXR3b3JrSW50ZXJmYWNlcygpXG4gICAgZm9yKHZhciBrIGluIGlmYWNlcylcbiAgICAgIGlmYWNlc1trXS5mb3JFYWNoKGZ1bmN0aW9uIChhZGRyZXNzKSB7XG4gICAgICAgIGFkZHJlc3Nlc1thZGRyZXNzLmFkZHJlc3NdID0gdHJ1ZVxuICAgICAgfSlcbiAgICBzb2NrZXQuc2V0QnJvYWRjYXN0KHRydWUpXG4gIH0pXG5cbiAgc29ja2V0LnBpcGUgPSBwaXBlXG5cbiAgcmV0dXJuIHNvY2tldFxufVxuIiwidmFyIHI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmFuZChsZW4pIHtcbiAgaWYgKCFyKVxuICAgIHIgPSBuZXcgUmFuZChudWxsKTtcblxuICByZXR1cm4gci5nZW5lcmF0ZShsZW4pO1xufTtcblxuZnVuY3Rpb24gUmFuZChyYW5kKSB7XG4gIHRoaXMucmFuZCA9IHJhbmQ7XG59XG5tb2R1bGUuZXhwb3J0cy5SYW5kID0gUmFuZDtcblxuUmFuZC5wcm90b3R5cGUuZ2VuZXJhdGUgPSBmdW5jdGlvbiBnZW5lcmF0ZShsZW4pIHtcbiAgcmV0dXJuIHRoaXMuX3JhbmQobGVuKTtcbn07XG5cbmlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0Jykge1xuICBpZiAod2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIE1vZGVybiBicm93c2Vyc1xuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xuICAgICAgd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfTtcbiAgfSBlbHNlIGlmICh3aW5kb3cubXNDcnlwdG8gJiYgd2luZG93Lm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIElFXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICB3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gT2xkIGp1bmtcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgfTtcbiAgfVxufSBlbHNlIHtcbiAgLy8gTm9kZS5qcyBvciBXZWIgd29ya2VyXG4gIHRyeSB7XG4gICAgdmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeScgKyAncHRvJyk7XG5cbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMobik7XG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIEVtdWxhdGUgY3J5cHRvIEFQSSB1c2luZyByYW5keVxuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgdmFyIHJlcyA9IG5ldyBVaW50OEFycmF5KG4pO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc1tpXSA9IHRoaXMucmFuZC5nZXRCeXRlKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gIH1cbn1cbiIsIiIsIi8vIGJhc2VkIG9uIHRoZSBhZXMgaW1wbGltZW50YXRpb24gaW4gdHJpcGxlIHNlY1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2tleWJhc2UvdHJpcGxlc2VjXG5cbi8vIHdoaWNoIGlzIGluIHR1cm4gYmFzZWQgb24gdGhlIG9uZSBmcm9tIGNyeXB0by1qc1xuLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvXG5cbnZhciB1aW50X21heCA9IE1hdGgucG93KDIsIDMyKVxuZnVuY3Rpb24gZml4dXBfdWludDMyICh4KSB7XG4gIHZhciByZXQsIHhfcG9zXG4gIHJldCA9IHggPiB1aW50X21heCB8fCB4IDwgMCA/ICh4X3BvcyA9IE1hdGguYWJzKHgpICUgdWludF9tYXgsIHggPCAwID8gdWludF9tYXggLSB4X3BvcyA6IHhfcG9zKSA6IHhcbiAgcmV0dXJuIHJldFxufVxuZnVuY3Rpb24gc2NydWJfdmVjICh2KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdi5sZW5ndGg7IHYrKykge1xuICAgIHZbaV0gPSAwXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIEdsb2JhbCAoKSB7XG4gIHRoaXMuU0JPWCA9IFtdXG4gIHRoaXMuSU5WX1NCT1ggPSBbXVxuICB0aGlzLlNVQl9NSVggPSBbW10sIFtdLCBbXSwgW11dXG4gIHRoaXMuSU5WX1NVQl9NSVggPSBbW10sIFtdLCBbXSwgW11dXG4gIHRoaXMuaW5pdCgpXG4gIHRoaXMuUkNPTiA9IFsweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDFiLCAweDM2XVxufVxuXG5HbG9iYWwucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBkLCBpLCBzeCwgdCwgeCwgeDIsIHg0LCB4OCwgeGksIF9pXG4gIGQgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfaSwgX3Jlc3VsdHNcbiAgICBfcmVzdWx0cyA9IFtdXG4gICAgZm9yIChpID0gX2kgPSAwOyBfaSA8IDI1NjsgaSA9ICsrX2kpIHtcbiAgICAgIGlmIChpIDwgMTI4KSB7XG4gICAgICAgIF9yZXN1bHRzLnB1c2goaSA8PCAxKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3Jlc3VsdHMucHVzaCgoaSA8PCAxKSBeIDB4MTFiKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX3Jlc3VsdHNcbiAgfSkoKVxuICB4ID0gMFxuICB4aSA9IDBcbiAgZm9yIChpID0gX2kgPSAwOyBfaSA8IDI1NjsgaSA9ICsrX2kpIHtcbiAgICBzeCA9IHhpIF4gKHhpIDw8IDEpIF4gKHhpIDw8IDIpIF4gKHhpIDw8IDMpIF4gKHhpIDw8IDQpXG4gICAgc3ggPSAoc3ggPj4+IDgpIF4gKHN4ICYgMHhmZikgXiAweDYzXG4gICAgdGhpcy5TQk9YW3hdID0gc3hcbiAgICB0aGlzLklOVl9TQk9YW3N4XSA9IHhcbiAgICB4MiA9IGRbeF1cbiAgICB4NCA9IGRbeDJdXG4gICAgeDggPSBkW3g0XVxuICAgIHQgPSAoZFtzeF0gKiAweDEwMSkgXiAoc3ggKiAweDEwMTAxMDApXG4gICAgdGhpcy5TVUJfTUlYWzBdW3hdID0gKHQgPDwgMjQpIHwgKHQgPj4+IDgpXG4gICAgdGhpcy5TVUJfTUlYWzFdW3hdID0gKHQgPDwgMTYpIHwgKHQgPj4+IDE2KVxuICAgIHRoaXMuU1VCX01JWFsyXVt4XSA9ICh0IDw8IDgpIHwgKHQgPj4+IDI0KVxuICAgIHRoaXMuU1VCX01JWFszXVt4XSA9IHRcbiAgICB0ID0gKHg4ICogMHgxMDEwMTAxKSBeICh4NCAqIDB4MTAwMDEpIF4gKHgyICogMHgxMDEpIF4gKHggKiAweDEwMTAxMDApXG4gICAgdGhpcy5JTlZfU1VCX01JWFswXVtzeF0gPSAodCA8PCAyNCkgfCAodCA+Pj4gOClcbiAgICB0aGlzLklOVl9TVUJfTUlYWzFdW3N4XSA9ICh0IDw8IDE2KSB8ICh0ID4+PiAxNilcbiAgICB0aGlzLklOVl9TVUJfTUlYWzJdW3N4XSA9ICh0IDw8IDgpIHwgKHQgPj4+IDI0KVxuICAgIHRoaXMuSU5WX1NVQl9NSVhbM11bc3hdID0gdFxuICAgIGlmICh4ID09PSAwKSB7XG4gICAgICB4ID0geGkgPSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSB4MiBeIGRbZFtkW3g4IF4geDJdXV1cbiAgICAgIHhpIF49IGRbZFt4aV1dXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbnZhciBHID0gbmV3IEdsb2JhbCgpXG5cbkFFUy5ibG9ja1NpemUgPSA0ICogNFxuXG5BRVMucHJvdG90eXBlLmJsb2NrU2l6ZSA9IEFFUy5ibG9ja1NpemVcblxuQUVTLmtleVNpemUgPSAyNTYgLyA4XG5cbkFFUy5wcm90b3R5cGUua2V5U2l6ZSA9IEFFUy5rZXlTaXplXG5cbmZ1bmN0aW9uIGJ1ZmZlclRvQXJyYXkgKGJ1Zikge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aCAvIDRcbiAgdmFyIG91dCA9IG5ldyBBcnJheShsZW4pXG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIG91dFtpXSA9IGJ1Zi5yZWFkVUludDMyQkUoaSAqIDQpXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuZnVuY3Rpb24gQUVTIChrZXkpIHtcbiAgdGhpcy5fa2V5ID0gYnVmZmVyVG9BcnJheShrZXkpXG4gIHRoaXMuX2RvUmVzZXQoKVxufVxuXG5BRVMucHJvdG90eXBlLl9kb1Jlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaW52S3NSb3csIGtleVNpemUsIGtleVdvcmRzLCBrc1Jvdywga3NSb3dzLCB0XG4gIGtleVdvcmRzID0gdGhpcy5fa2V5XG4gIGtleVNpemUgPSBrZXlXb3Jkcy5sZW5ndGhcbiAgdGhpcy5fblJvdW5kcyA9IGtleVNpemUgKyA2XG4gIGtzUm93cyA9ICh0aGlzLl9uUm91bmRzICsgMSkgKiA0XG4gIHRoaXMuX2tleVNjaGVkdWxlID0gW11cbiAgZm9yIChrc1JvdyA9IDA7IGtzUm93IDwga3NSb3dzOyBrc1JvdysrKSB7XG4gICAgdGhpcy5fa2V5U2NoZWR1bGVba3NSb3ddID0ga3NSb3cgPCBrZXlTaXplID8ga2V5V29yZHNba3NSb3ddIDogKHQgPSB0aGlzLl9rZXlTY2hlZHVsZVtrc1JvdyAtIDFdLCAoa3NSb3cgJSBrZXlTaXplKSA9PT0gMCA/ICh0ID0gKHQgPDwgOCkgfCAodCA+Pj4gMjQpLCB0ID0gKEcuU0JPWFt0ID4+PiAyNF0gPDwgMjQpIHwgKEcuU0JPWFsodCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKEcuU0JPWFsodCA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IEcuU0JPWFt0ICYgMHhmZl0sIHQgXj0gRy5SQ09OWyhrc1JvdyAvIGtleVNpemUpIHwgMF0gPDwgMjQpIDoga2V5U2l6ZSA+IDYgJiYga3NSb3cgJSBrZXlTaXplID09PSA0ID8gdCA9IChHLlNCT1hbdCA+Pj4gMjRdIDw8IDI0KSB8IChHLlNCT1hbKHQgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChHLlNCT1hbKHQgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBHLlNCT1hbdCAmIDB4ZmZdIDogdm9pZCAwLCB0aGlzLl9rZXlTY2hlZHVsZVtrc1JvdyAtIGtleVNpemVdIF4gdClcbiAgfVxuICB0aGlzLl9pbnZLZXlTY2hlZHVsZSA9IFtdXG4gIGZvciAoaW52S3NSb3cgPSAwOyBpbnZLc1JvdyA8IGtzUm93czsgaW52S3NSb3crKykge1xuICAgIGtzUm93ID0ga3NSb3dzIC0gaW52S3NSb3dcbiAgICB0ID0gdGhpcy5fa2V5U2NoZWR1bGVba3NSb3cgLSAoaW52S3NSb3cgJSA0ID8gMCA6IDQpXVxuICAgIHRoaXMuX2ludktleVNjaGVkdWxlW2ludktzUm93XSA9IGludktzUm93IDwgNCB8fCBrc1JvdyA8PSA0ID8gdCA6IEcuSU5WX1NVQl9NSVhbMF1bRy5TQk9YW3QgPj4+IDI0XV0gXiBHLklOVl9TVUJfTUlYWzFdW0cuU0JPWFsodCA+Pj4gMTYpICYgMHhmZl1dIF4gRy5JTlZfU1VCX01JWFsyXVtHLlNCT1hbKHQgPj4+IDgpICYgMHhmZl1dIF4gRy5JTlZfU1VCX01JWFszXVtHLlNCT1hbdCAmIDB4ZmZdXVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbkFFUy5wcm90b3R5cGUuZW5jcnlwdEJsb2NrID0gZnVuY3Rpb24gKE0pIHtcbiAgTSA9IGJ1ZmZlclRvQXJyYXkobmV3IEJ1ZmZlcihNKSlcbiAgdmFyIG91dCA9IHRoaXMuX2RvQ3J5cHRCbG9jayhNLCB0aGlzLl9rZXlTY2hlZHVsZSwgRy5TVUJfTUlYLCBHLlNCT1gpXG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKDE2KVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbMF0sIDApXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFsxXSwgNClcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzJdLCA4KVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbM10sIDEyKVxuICByZXR1cm4gYnVmXG59XG5cbkFFUy5wcm90b3R5cGUuZGVjcnlwdEJsb2NrID0gZnVuY3Rpb24gKE0pIHtcbiAgTSA9IGJ1ZmZlclRvQXJyYXkobmV3IEJ1ZmZlcihNKSlcbiAgdmFyIHRlbXAgPSBbTVszXSwgTVsxXV1cbiAgTVsxXSA9IHRlbXBbMF1cbiAgTVszXSA9IHRlbXBbMV1cbiAgdmFyIG91dCA9IHRoaXMuX2RvQ3J5cHRCbG9jayhNLCB0aGlzLl9pbnZLZXlTY2hlZHVsZSwgRy5JTlZfU1VCX01JWCwgRy5JTlZfU0JPWClcbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoMTYpXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFswXSwgMClcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzNdLCA0KVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbMl0sIDgpXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFsxXSwgMTIpXG4gIHJldHVybiBidWZcbn1cblxuQUVTLnByb3RvdHlwZS5zY3J1YiA9IGZ1bmN0aW9uICgpIHtcbiAgc2NydWJfdmVjKHRoaXMuX2tleVNjaGVkdWxlKVxuICBzY3J1Yl92ZWModGhpcy5faW52S2V5U2NoZWR1bGUpXG4gIHNjcnViX3ZlYyh0aGlzLl9rZXkpXG59XG5cbkFFUy5wcm90b3R5cGUuX2RvQ3J5cHRCbG9jayA9IGZ1bmN0aW9uIChNLCBrZXlTY2hlZHVsZSwgU1VCX01JWCwgU0JPWCkge1xuICB2YXIga3NSb3csIHMwLCBzMSwgczIsIHMzLCB0MCwgdDEsIHQyLCB0M1xuXG4gIHMwID0gTVswXSBeIGtleVNjaGVkdWxlWzBdXG4gIHMxID0gTVsxXSBeIGtleVNjaGVkdWxlWzFdXG4gIHMyID0gTVsyXSBeIGtleVNjaGVkdWxlWzJdXG4gIHMzID0gTVszXSBeIGtleVNjaGVkdWxlWzNdXG4gIGtzUm93ID0gNFxuICBmb3IgKHZhciByb3VuZCA9IDE7IHJvdW5kIDwgdGhpcy5fblJvdW5kczsgcm91bmQrKykge1xuICAgIHQwID0gU1VCX01JWFswXVtzMCA+Pj4gMjRdIF4gU1VCX01JWFsxXVsoczEgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWFsyXVsoczIgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYWzNdW3MzICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXVxuICAgIHQxID0gU1VCX01JWFswXVtzMSA+Pj4gMjRdIF4gU1VCX01JWFsxXVsoczIgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWFsyXVsoczMgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYWzNdW3MwICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXVxuICAgIHQyID0gU1VCX01JWFswXVtzMiA+Pj4gMjRdIF4gU1VCX01JWFsxXVsoczMgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWFsyXVsoczAgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYWzNdW3MxICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXVxuICAgIHQzID0gU1VCX01JWFswXVtzMyA+Pj4gMjRdIF4gU1VCX01JWFsxXVsoczAgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWFsyXVsoczEgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYWzNdW3MyICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXVxuICAgIHMwID0gdDBcbiAgICBzMSA9IHQxXG4gICAgczIgPSB0MlxuICAgIHMzID0gdDNcbiAgfVxuICB0MCA9ICgoU0JPWFtzMCA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMSA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMyID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMyAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdXG4gIHQxID0gKChTQk9YW3MxID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMyID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczMgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MwICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK11cbiAgdDIgPSAoKFNCT1hbczIgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczMgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMCA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczEgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXVxuICB0MyA9ICgoU0JPWFtzMyA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMxID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMiAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdXG4gIHJldHVybiBbXG4gICAgZml4dXBfdWludDMyKHQwKSxcbiAgICBmaXh1cF91aW50MzIodDEpLFxuICAgIGZpeHVwX3VpbnQzMih0MiksXG4gICAgZml4dXBfdWludDMyKHQzKVxuICBdXG59XG5cbmV4cG9ydHMuQUVTID0gQUVTXG4iLCJ2YXIgYWVzID0gcmVxdWlyZSgnLi9hZXMnKVxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ2NpcGhlci1iYXNlJylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBHSEFTSCA9IHJlcXVpcmUoJy4vZ2hhc2gnKVxudmFyIHhvciA9IHJlcXVpcmUoJ2J1ZmZlci14b3InKVxuaW5oZXJpdHMoU3RyZWFtQ2lwaGVyLCBUcmFuc2Zvcm0pXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbUNpcGhlclxuXG5mdW5jdGlvbiBTdHJlYW1DaXBoZXIgKG1vZGUsIGtleSwgaXYsIGRlY3J5cHQpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFN0cmVhbUNpcGhlcikpIHtcbiAgICByZXR1cm4gbmV3IFN0cmVhbUNpcGhlcihtb2RlLCBrZXksIGl2KVxuICB9XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMpXG4gIHRoaXMuX2ZpbklEID0gQnVmZmVyLmNvbmNhdChbaXYsIG5ldyBCdWZmZXIoWzAsIDAsIDAsIDFdKV0pXG4gIGl2ID0gQnVmZmVyLmNvbmNhdChbaXYsIG5ldyBCdWZmZXIoWzAsIDAsIDAsIDJdKV0pXG4gIHRoaXMuX2NpcGhlciA9IG5ldyBhZXMuQUVTKGtleSlcbiAgdGhpcy5fcHJldiA9IG5ldyBCdWZmZXIoaXYubGVuZ3RoKVxuICB0aGlzLl9jYWNoZSA9IG5ldyBCdWZmZXIoJycpXG4gIHRoaXMuX3NlY0NhY2hlID0gbmV3IEJ1ZmZlcignJylcbiAgdGhpcy5fZGVjcnlwdCA9IGRlY3J5cHRcbiAgdGhpcy5fYWxlbiA9IDBcbiAgdGhpcy5fbGVuID0gMFxuICBpdi5jb3B5KHRoaXMuX3ByZXYpXG4gIHRoaXMuX21vZGUgPSBtb2RlXG4gIHZhciBoID0gbmV3IEJ1ZmZlcig0KVxuICBoLmZpbGwoMClcbiAgdGhpcy5fZ2hhc2ggPSBuZXcgR0hBU0godGhpcy5fY2lwaGVyLmVuY3J5cHRCbG9jayhoKSlcbiAgdGhpcy5fYXV0aFRhZyA9IG51bGxcbiAgdGhpcy5fY2FsbGVkID0gZmFsc2Vcbn1cblN0cmVhbUNpcGhlci5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICBpZiAoIXRoaXMuX2NhbGxlZCAmJiB0aGlzLl9hbGVuKSB7XG4gICAgdmFyIHJ1bXAgPSAxNiAtICh0aGlzLl9hbGVuICUgMTYpXG4gICAgaWYgKHJ1bXAgPCAxNikge1xuICAgICAgcnVtcCA9IG5ldyBCdWZmZXIocnVtcClcbiAgICAgIHJ1bXAuZmlsbCgwKVxuICAgICAgdGhpcy5fZ2hhc2gudXBkYXRlKHJ1bXApXG4gICAgfVxuICB9XG4gIHRoaXMuX2NhbGxlZCA9IHRydWVcbiAgdmFyIG91dCA9IHRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLCBjaHVuaylcbiAgaWYgKHRoaXMuX2RlY3J5cHQpIHtcbiAgICB0aGlzLl9naGFzaC51cGRhdGUoY2h1bmspXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZ2hhc2gudXBkYXRlKG91dClcbiAgfVxuICB0aGlzLl9sZW4gKz0gY2h1bmsubGVuZ3RoXG4gIHJldHVybiBvdXRcbn1cblN0cmVhbUNpcGhlci5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fZGVjcnlwdCAmJiAhdGhpcy5fYXV0aFRhZykge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgc3RhdGUgb3IgdW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBkYXRhJylcbiAgfVxuICB2YXIgdGFnID0geG9yKHRoaXMuX2doYXNoLmZpbmFsKHRoaXMuX2FsZW4gKiA4LCB0aGlzLl9sZW4gKiA4KSwgdGhpcy5fY2lwaGVyLmVuY3J5cHRCbG9jayh0aGlzLl9maW5JRCkpXG4gIGlmICh0aGlzLl9kZWNyeXB0KSB7XG4gICAgaWYgKHhvclRlc3QodGFnLCB0aGlzLl9hdXRoVGFnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBzdGF0ZSBvciB1bmFibGUgdG8gYXV0aGVudGljYXRlIGRhdGEnKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9hdXRoVGFnID0gdGFnXG4gIH1cbiAgdGhpcy5fY2lwaGVyLnNjcnViKClcbn1cblN0cmVhbUNpcGhlci5wcm90b3R5cGUuZ2V0QXV0aFRhZyA9IGZ1bmN0aW9uIGdldEF1dGhUYWcgKCkge1xuICBpZiAoIXRoaXMuX2RlY3J5cHQgJiYgQnVmZmVyLmlzQnVmZmVyKHRoaXMuX2F1dGhUYWcpKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dGhUYWdcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRpbmcgdG8gZ2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlJylcbiAgfVxufVxuU3RyZWFtQ2lwaGVyLnByb3RvdHlwZS5zZXRBdXRoVGFnID0gZnVuY3Rpb24gc2V0QXV0aFRhZyAodGFnKSB7XG4gIGlmICh0aGlzLl9kZWNyeXB0KSB7XG4gICAgdGhpcy5fYXV0aFRhZyA9IHRhZ1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGluZyB0byBzZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUnKVxuICB9XG59XG5TdHJlYW1DaXBoZXIucHJvdG90eXBlLnNldEFBRCA9IGZ1bmN0aW9uIHNldEFBRCAoYnVmKSB7XG4gIGlmICghdGhpcy5fY2FsbGVkKSB7XG4gICAgdGhpcy5fZ2hhc2gudXBkYXRlKGJ1ZilcbiAgICB0aGlzLl9hbGVuICs9IGJ1Zi5sZW5ndGhcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRpbmcgdG8gc2V0IEFBRCBpbiB1bnN1cHBvcnRlZCBzdGF0ZScpXG4gIH1cbn1cbmZ1bmN0aW9uIHhvclRlc3QgKGEsIGIpIHtcbiAgdmFyIG91dCA9IDBcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIG91dCsrXG4gIH1cbiAgdmFyIGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aClcbiAgdmFyIGkgPSAtMVxuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgb3V0ICs9IChhW2ldIF4gYltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG4iLCJ2YXIgY2lwaGVycyA9IHJlcXVpcmUoJy4vZW5jcnlwdGVyJylcbmV4cG9ydHMuY3JlYXRlQ2lwaGVyID0gZXhwb3J0cy5DaXBoZXIgPSBjaXBoZXJzLmNyZWF0ZUNpcGhlclxuZXhwb3J0cy5jcmVhdGVDaXBoZXJpdiA9IGV4cG9ydHMuQ2lwaGVyaXYgPSBjaXBoZXJzLmNyZWF0ZUNpcGhlcml2XG52YXIgZGVjaXBoZXJzID0gcmVxdWlyZSgnLi9kZWNyeXB0ZXInKVxuZXhwb3J0cy5jcmVhdGVEZWNpcGhlciA9IGV4cG9ydHMuRGVjaXBoZXIgPSBkZWNpcGhlcnMuY3JlYXRlRGVjaXBoZXJcbmV4cG9ydHMuY3JlYXRlRGVjaXBoZXJpdiA9IGV4cG9ydHMuRGVjaXBoZXJpdiA9IGRlY2lwaGVycy5jcmVhdGVEZWNpcGhlcml2XG52YXIgbW9kZXMgPSByZXF1aXJlKCcuL21vZGVzJylcbmZ1bmN0aW9uIGdldENpcGhlcnMgKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMobW9kZXMpXG59XG5leHBvcnRzLmxpc3RDaXBoZXJzID0gZXhwb3J0cy5nZXRDaXBoZXJzID0gZ2V0Q2lwaGVyc1xuIiwidmFyIGFlcyA9IHJlcXVpcmUoJy4vYWVzJylcbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdjaXBoZXItYmFzZScpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgbW9kZXMgPSByZXF1aXJlKCcuL21vZGVzJylcbnZhciBTdHJlYW1DaXBoZXIgPSByZXF1aXJlKCcuL3N0cmVhbUNpcGhlcicpXG52YXIgQXV0aENpcGhlciA9IHJlcXVpcmUoJy4vYXV0aENpcGhlcicpXG52YXIgZWJ0ayA9IHJlcXVpcmUoJ2V2cF9ieXRlc3Rva2V5JylcblxuaW5oZXJpdHMoRGVjaXBoZXIsIFRyYW5zZm9ybSlcbmZ1bmN0aW9uIERlY2lwaGVyIChtb2RlLCBrZXksIGl2KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWNpcGhlcikpIHtcbiAgICByZXR1cm4gbmV3IERlY2lwaGVyKG1vZGUsIGtleSwgaXYpXG4gIH1cbiAgVHJhbnNmb3JtLmNhbGwodGhpcylcbiAgdGhpcy5fY2FjaGUgPSBuZXcgU3BsaXR0ZXIoKVxuICB0aGlzLl9sYXN0ID0gdm9pZCAwXG4gIHRoaXMuX2NpcGhlciA9IG5ldyBhZXMuQUVTKGtleSlcbiAgdGhpcy5fcHJldiA9IG5ldyBCdWZmZXIoaXYubGVuZ3RoKVxuICBpdi5jb3B5KHRoaXMuX3ByZXYpXG4gIHRoaXMuX21vZGUgPSBtb2RlXG4gIHRoaXMuX2F1dG9wYWRkaW5nID0gdHJ1ZVxufVxuRGVjaXBoZXIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICB0aGlzLl9jYWNoZS5hZGQoZGF0YSlcbiAgdmFyIGNodW5rXG4gIHZhciB0aGluZ1xuICB2YXIgb3V0ID0gW11cbiAgd2hpbGUgKChjaHVuayA9IHRoaXMuX2NhY2hlLmdldCh0aGlzLl9hdXRvcGFkZGluZykpKSB7XG4gICAgdGhpbmcgPSB0aGlzLl9tb2RlLmRlY3J5cHQodGhpcywgY2h1bmspXG4gICAgb3V0LnB1c2godGhpbmcpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQob3V0KVxufVxuRGVjaXBoZXIucHJvdG90eXBlLl9maW5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNodW5rID0gdGhpcy5fY2FjaGUuZmx1c2goKVxuICBpZiAodGhpcy5fYXV0b3BhZGRpbmcpIHtcbiAgICByZXR1cm4gdW5wYWQodGhpcy5fbW9kZS5kZWNyeXB0KHRoaXMsIGNodW5rKSlcbiAgfSBlbHNlIGlmIChjaHVuaykge1xuICAgIHRocm93IG5ldyBFcnJvcignZGF0YSBub3QgbXVsdGlwbGUgb2YgYmxvY2sgbGVuZ3RoJylcbiAgfVxufVxuRGVjaXBoZXIucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nID0gZnVuY3Rpb24gKHNldFRvKSB7XG4gIHRoaXMuX2F1dG9wYWRkaW5nID0gISFzZXRUb1xuICByZXR1cm4gdGhpc1xufVxuZnVuY3Rpb24gU3BsaXR0ZXIgKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU3BsaXR0ZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBTcGxpdHRlcigpXG4gIH1cbiAgdGhpcy5jYWNoZSA9IG5ldyBCdWZmZXIoJycpXG59XG5TcGxpdHRlci5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5jYWNoZSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuY2FjaGUsIGRhdGFdKVxufVxuXG5TcGxpdHRlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGF1dG9QYWRkaW5nKSB7XG4gIHZhciBvdXRcbiAgaWYgKGF1dG9QYWRkaW5nKSB7XG4gICAgaWYgKHRoaXMuY2FjaGUubGVuZ3RoID4gMTYpIHtcbiAgICAgIG91dCA9IHRoaXMuY2FjaGUuc2xpY2UoMCwgMTYpXG4gICAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZS5zbGljZSgxNilcbiAgICAgIHJldHVybiBvdXRcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoaXMuY2FjaGUubGVuZ3RoID49IDE2KSB7XG4gICAgICBvdXQgPSB0aGlzLmNhY2hlLnNsaWNlKDAsIDE2KVxuICAgICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUuc2xpY2UoMTYpXG4gICAgICByZXR1cm4gb3V0XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5TcGxpdHRlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNhY2hlLmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLmNhY2hlXG4gIH1cbn1cbmZ1bmN0aW9uIHVucGFkIChsYXN0KSB7XG4gIHZhciBwYWRkZWQgPSBsYXN0WzE1XVxuICB2YXIgaSA9IC0xXG4gIHdoaWxlICgrK2kgPCBwYWRkZWQpIHtcbiAgICBpZiAobGFzdFsoaSArICgxNiAtIHBhZGRlZCkpXSAhPT0gcGFkZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBkZWNyeXB0IGRhdGEnKVxuICAgIH1cbiAgfVxuICBpZiAocGFkZGVkID09PSAxNikge1xuICAgIHJldHVyblxuICB9XG4gIHJldHVybiBsYXN0LnNsaWNlKDAsIDE2IC0gcGFkZGVkKVxufVxuXG52YXIgbW9kZWxpc3QgPSB7XG4gIEVDQjogcmVxdWlyZSgnLi9tb2Rlcy9lY2InKSxcbiAgQ0JDOiByZXF1aXJlKCcuL21vZGVzL2NiYycpLFxuICBDRkI6IHJlcXVpcmUoJy4vbW9kZXMvY2ZiJyksXG4gIENGQjg6IHJlcXVpcmUoJy4vbW9kZXMvY2ZiOCcpLFxuICBDRkIxOiByZXF1aXJlKCcuL21vZGVzL2NmYjEnKSxcbiAgT0ZCOiByZXF1aXJlKCcuL21vZGVzL29mYicpLFxuICBDVFI6IHJlcXVpcmUoJy4vbW9kZXMvY3RyJyksXG4gIEdDTTogcmVxdWlyZSgnLi9tb2Rlcy9jdHInKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWNpcGhlcml2IChzdWl0ZSwgcGFzc3dvcmQsIGl2KSB7XG4gIHZhciBjb25maWcgPSBtb2Rlc1tzdWl0ZS50b0xvd2VyQ2FzZSgpXVxuICBpZiAoIWNvbmZpZykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VpdGUgdHlwZScpXG4gIH1cbiAgaWYgKHR5cGVvZiBpdiA9PT0gJ3N0cmluZycpIHtcbiAgICBpdiA9IG5ldyBCdWZmZXIoaXYpXG4gIH1cbiAgaWYgKHR5cGVvZiBwYXNzd29yZCA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXNzd29yZCA9IG5ldyBCdWZmZXIocGFzc3dvcmQpXG4gIH1cbiAgaWYgKHBhc3N3b3JkLmxlbmd0aCAhPT0gY29uZmlnLmtleSAvIDgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGtleSBsZW5ndGggJyArIHBhc3N3b3JkLmxlbmd0aClcbiAgfVxuICBpZiAoaXYubGVuZ3RoICE9PSBjb25maWcuaXYpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGl2IGxlbmd0aCAnICsgaXYubGVuZ3RoKVxuICB9XG4gIGlmIChjb25maWcudHlwZSA9PT0gJ3N0cmVhbScpIHtcbiAgICByZXR1cm4gbmV3IFN0cmVhbUNpcGhlcihtb2RlbGlzdFtjb25maWcubW9kZV0sIHBhc3N3b3JkLCBpdiwgdHJ1ZSlcbiAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gJ2F1dGgnKSB7XG4gICAgcmV0dXJuIG5ldyBBdXRoQ2lwaGVyKG1vZGVsaXN0W2NvbmZpZy5tb2RlXSwgcGFzc3dvcmQsIGl2LCB0cnVlKVxuICB9XG4gIHJldHVybiBuZXcgRGVjaXBoZXIobW9kZWxpc3RbY29uZmlnLm1vZGVdLCBwYXNzd29yZCwgaXYpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURlY2lwaGVyIChzdWl0ZSwgcGFzc3dvcmQpIHtcbiAgdmFyIGNvbmZpZyA9IG1vZGVzW3N1aXRlLnRvTG93ZXJDYXNlKCldXG4gIGlmICghY29uZmlnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzdWl0ZSB0eXBlJylcbiAgfVxuICB2YXIga2V5cyA9IGVidGsocGFzc3dvcmQsIGZhbHNlLCBjb25maWcua2V5LCBjb25maWcuaXYpXG4gIHJldHVybiBjcmVhdGVEZWNpcGhlcml2KHN1aXRlLCBrZXlzLmtleSwga2V5cy5pdilcbn1cbmV4cG9ydHMuY3JlYXRlRGVjaXBoZXIgPSBjcmVhdGVEZWNpcGhlclxuZXhwb3J0cy5jcmVhdGVEZWNpcGhlcml2ID0gY3JlYXRlRGVjaXBoZXJpdlxuIiwidmFyIGFlcyA9IHJlcXVpcmUoJy4vYWVzJylcbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdjaXBoZXItYmFzZScpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgbW9kZXMgPSByZXF1aXJlKCcuL21vZGVzJylcbnZhciBlYnRrID0gcmVxdWlyZSgnZXZwX2J5dGVzdG9rZXknKVxudmFyIFN0cmVhbUNpcGhlciA9IHJlcXVpcmUoJy4vc3RyZWFtQ2lwaGVyJylcbnZhciBBdXRoQ2lwaGVyID0gcmVxdWlyZSgnLi9hdXRoQ2lwaGVyJylcbmluaGVyaXRzKENpcGhlciwgVHJhbnNmb3JtKVxuZnVuY3Rpb24gQ2lwaGVyIChtb2RlLCBrZXksIGl2KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDaXBoZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBDaXBoZXIobW9kZSwga2V5LCBpdilcbiAgfVxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzKVxuICB0aGlzLl9jYWNoZSA9IG5ldyBTcGxpdHRlcigpXG4gIHRoaXMuX2NpcGhlciA9IG5ldyBhZXMuQUVTKGtleSlcbiAgdGhpcy5fcHJldiA9IG5ldyBCdWZmZXIoaXYubGVuZ3RoKVxuICBpdi5jb3B5KHRoaXMuX3ByZXYpXG4gIHRoaXMuX21vZGUgPSBtb2RlXG4gIHRoaXMuX2F1dG9wYWRkaW5nID0gdHJ1ZVxufVxuQ2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5fY2FjaGUuYWRkKGRhdGEpXG4gIHZhciBjaHVua1xuICB2YXIgdGhpbmdcbiAgdmFyIG91dCA9IFtdXG4gIHdoaWxlICgoY2h1bmsgPSB0aGlzLl9jYWNoZS5nZXQoKSkpIHtcbiAgICB0aGluZyA9IHRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLCBjaHVuaylcbiAgICBvdXQucHVzaCh0aGluZylcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChvdXQpXG59XG5DaXBoZXIucHJvdG90eXBlLl9maW5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNodW5rID0gdGhpcy5fY2FjaGUuZmx1c2goKVxuICBpZiAodGhpcy5fYXV0b3BhZGRpbmcpIHtcbiAgICBjaHVuayA9IHRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLCBjaHVuaylcbiAgICB0aGlzLl9jaXBoZXIuc2NydWIoKVxuICAgIHJldHVybiBjaHVua1xuICB9IGVsc2UgaWYgKGNodW5rLnRvU3RyaW5nKCdoZXgnKSAhPT0gJzEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwJykge1xuICAgIHRoaXMuX2NpcGhlci5zY3J1YigpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdkYXRhIG5vdCBtdWx0aXBsZSBvZiBibG9jayBsZW5ndGgnKVxuICB9XG59XG5DaXBoZXIucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nID0gZnVuY3Rpb24gKHNldFRvKSB7XG4gIHRoaXMuX2F1dG9wYWRkaW5nID0gISFzZXRUb1xuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiBTcGxpdHRlciAoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTcGxpdHRlcikpIHtcbiAgICByZXR1cm4gbmV3IFNwbGl0dGVyKClcbiAgfVxuICB0aGlzLmNhY2hlID0gbmV3IEJ1ZmZlcignJylcbn1cblNwbGl0dGVyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICB0aGlzLmNhY2hlID0gQnVmZmVyLmNvbmNhdChbdGhpcy5jYWNoZSwgZGF0YV0pXG59XG5cblNwbGl0dGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNhY2hlLmxlbmd0aCA+IDE1KSB7XG4gICAgdmFyIG91dCA9IHRoaXMuY2FjaGUuc2xpY2UoMCwgMTYpXG4gICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUuc2xpY2UoMTYpXG4gICAgcmV0dXJuIG91dFxuICB9XG4gIHJldHVybiBudWxsXG59XG5TcGxpdHRlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsZW4gPSAxNiAtIHRoaXMuY2FjaGUubGVuZ3RoXG4gIHZhciBwYWRCdWZmID0gbmV3IEJ1ZmZlcihsZW4pXG5cbiAgdmFyIGkgPSAtMVxuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgcGFkQnVmZi53cml0ZVVJbnQ4KGxlbiwgaSlcbiAgfVxuICB2YXIgb3V0ID0gQnVmZmVyLmNvbmNhdChbdGhpcy5jYWNoZSwgcGFkQnVmZl0pXG4gIHJldHVybiBvdXRcbn1cbnZhciBtb2RlbGlzdCA9IHtcbiAgRUNCOiByZXF1aXJlKCcuL21vZGVzL2VjYicpLFxuICBDQkM6IHJlcXVpcmUoJy4vbW9kZXMvY2JjJyksXG4gIENGQjogcmVxdWlyZSgnLi9tb2Rlcy9jZmInKSxcbiAgQ0ZCODogcmVxdWlyZSgnLi9tb2Rlcy9jZmI4JyksXG4gIENGQjE6IHJlcXVpcmUoJy4vbW9kZXMvY2ZiMScpLFxuICBPRkI6IHJlcXVpcmUoJy4vbW9kZXMvb2ZiJyksXG4gIENUUjogcmVxdWlyZSgnLi9tb2Rlcy9jdHInKSxcbiAgR0NNOiByZXF1aXJlKCcuL21vZGVzL2N0cicpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNpcGhlcml2IChzdWl0ZSwgcGFzc3dvcmQsIGl2KSB7XG4gIHZhciBjb25maWcgPSBtb2Rlc1tzdWl0ZS50b0xvd2VyQ2FzZSgpXVxuICBpZiAoIWNvbmZpZykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VpdGUgdHlwZScpXG4gIH1cbiAgaWYgKHR5cGVvZiBpdiA9PT0gJ3N0cmluZycpIHtcbiAgICBpdiA9IG5ldyBCdWZmZXIoaXYpXG4gIH1cbiAgaWYgKHR5cGVvZiBwYXNzd29yZCA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXNzd29yZCA9IG5ldyBCdWZmZXIocGFzc3dvcmQpXG4gIH1cbiAgaWYgKHBhc3N3b3JkLmxlbmd0aCAhPT0gY29uZmlnLmtleSAvIDgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGtleSBsZW5ndGggJyArIHBhc3N3b3JkLmxlbmd0aClcbiAgfVxuICBpZiAoaXYubGVuZ3RoICE9PSBjb25maWcuaXYpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGl2IGxlbmd0aCAnICsgaXYubGVuZ3RoKVxuICB9XG4gIGlmIChjb25maWcudHlwZSA9PT0gJ3N0cmVhbScpIHtcbiAgICByZXR1cm4gbmV3IFN0cmVhbUNpcGhlcihtb2RlbGlzdFtjb25maWcubW9kZV0sIHBhc3N3b3JkLCBpdilcbiAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gJ2F1dGgnKSB7XG4gICAgcmV0dXJuIG5ldyBBdXRoQ2lwaGVyKG1vZGVsaXN0W2NvbmZpZy5tb2RlXSwgcGFzc3dvcmQsIGl2KVxuICB9XG4gIHJldHVybiBuZXcgQ2lwaGVyKG1vZGVsaXN0W2NvbmZpZy5tb2RlXSwgcGFzc3dvcmQsIGl2KVxufVxuZnVuY3Rpb24gY3JlYXRlQ2lwaGVyIChzdWl0ZSwgcGFzc3dvcmQpIHtcbiAgdmFyIGNvbmZpZyA9IG1vZGVzW3N1aXRlLnRvTG93ZXJDYXNlKCldXG4gIGlmICghY29uZmlnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzdWl0ZSB0eXBlJylcbiAgfVxuICB2YXIga2V5cyA9IGVidGsocGFzc3dvcmQsIGZhbHNlLCBjb25maWcua2V5LCBjb25maWcuaXYpXG4gIHJldHVybiBjcmVhdGVDaXBoZXJpdihzdWl0ZSwga2V5cy5rZXksIGtleXMuaXYpXG59XG5cbmV4cG9ydHMuY3JlYXRlQ2lwaGVyaXYgPSBjcmVhdGVDaXBoZXJpdlxuZXhwb3J0cy5jcmVhdGVDaXBoZXIgPSBjcmVhdGVDaXBoZXJcbiIsInZhciB6ZXJvcyA9IG5ldyBCdWZmZXIoMTYpXG56ZXJvcy5maWxsKDApXG5tb2R1bGUuZXhwb3J0cyA9IEdIQVNIXG5mdW5jdGlvbiBHSEFTSCAoa2V5KSB7XG4gIHRoaXMuaCA9IGtleVxuICB0aGlzLnN0YXRlID0gbmV3IEJ1ZmZlcigxNilcbiAgdGhpcy5zdGF0ZS5maWxsKDApXG4gIHRoaXMuY2FjaGUgPSBuZXcgQnVmZmVyKCcnKVxufVxuLy8gZnJvbSBodHRwOi8vYml0d2lzZXNoaWZ0bGVmdC5naXRodWIuaW8vc2pjbC9kb2Mvc3ltYm9scy9zcmMvY29yZV9nY20uanMuaHRtbFxuLy8gYnkgSnVobyBWw6Row6QtSGVydHR1YVxuR0hBU0gucHJvdG90eXBlLmdoYXNoID0gZnVuY3Rpb24gKGJsb2NrKSB7XG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGJsb2NrLmxlbmd0aCkge1xuICAgIHRoaXMuc3RhdGVbaV0gXj0gYmxvY2tbaV1cbiAgfVxuICB0aGlzLl9tdWx0aXBseSgpXG59XG5cbkdIQVNILnByb3RvdHlwZS5fbXVsdGlwbHkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBWaSA9IHRvQXJyYXkodGhpcy5oKVxuICB2YXIgWmkgPSBbMCwgMCwgMCwgMF1cbiAgdmFyIGosIHhpLCBsc2JfVmlcbiAgdmFyIGkgPSAtMVxuICB3aGlsZSAoKytpIDwgMTI4KSB7XG4gICAgeGkgPSAodGhpcy5zdGF0ZVt+fihpIC8gOCldICYgKDEgPDwgKDcgLSBpICUgOCkpKSAhPT0gMFxuICAgIGlmICh4aSkge1xuICAgICAgLy8gWl9pKzEgPSBaX2kgXiBWX2lcbiAgICAgIFppID0geG9yKFppLCBWaSlcbiAgICB9XG5cbiAgICAvLyBTdG9yZSB0aGUgdmFsdWUgb2YgTFNCKFZfaSlcbiAgICBsc2JfVmkgPSAoVmlbM10gJiAxKSAhPT0gMFxuXG4gICAgLy8gVl9pKzEgPSBWX2kgPj4gMVxuICAgIGZvciAoaiA9IDM7IGogPiAwOyBqLS0pIHtcbiAgICAgIFZpW2pdID0gKFZpW2pdID4+PiAxKSB8ICgoVmlbaiAtIDFdICYgMSkgPDwgMzEpXG4gICAgfVxuICAgIFZpWzBdID0gVmlbMF0gPj4+IDFcblxuICAgIC8vIElmIExTQihWX2kpIGlzIDEsIFZfaSsxID0gKFZfaSA+PiAxKSBeIFJcbiAgICBpZiAobHNiX1ZpKSB7XG4gICAgICBWaVswXSA9IFZpWzBdIF4gKDB4ZTEgPDwgMjQpXG4gICAgfVxuICB9XG4gIHRoaXMuc3RhdGUgPSBmcm9tQXJyYXkoWmkpXG59XG5HSEFTSC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICB0aGlzLmNhY2hlID0gQnVmZmVyLmNvbmNhdChbdGhpcy5jYWNoZSwgYnVmXSlcbiAgdmFyIGNodW5rXG4gIHdoaWxlICh0aGlzLmNhY2hlLmxlbmd0aCA+PSAxNikge1xuICAgIGNodW5rID0gdGhpcy5jYWNoZS5zbGljZSgwLCAxNilcbiAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZS5zbGljZSgxNilcbiAgICB0aGlzLmdoYXNoKGNodW5rKVxuICB9XG59XG5HSEFTSC5wcm90b3R5cGUuZmluYWwgPSBmdW5jdGlvbiAoYWJsLCBibCkge1xuICBpZiAodGhpcy5jYWNoZS5sZW5ndGgpIHtcbiAgICB0aGlzLmdoYXNoKEJ1ZmZlci5jb25jYXQoW3RoaXMuY2FjaGUsIHplcm9zXSwgMTYpKVxuICB9XG4gIHRoaXMuZ2hhc2goZnJvbUFycmF5KFtcbiAgICAwLCBhYmwsXG4gICAgMCwgYmxcbiAgXSkpXG4gIHJldHVybiB0aGlzLnN0YXRlXG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkgKGJ1Zikge1xuICByZXR1cm4gW1xuICAgIGJ1Zi5yZWFkVUludDMyQkUoMCksXG4gICAgYnVmLnJlYWRVSW50MzJCRSg0KSxcbiAgICBidWYucmVhZFVJbnQzMkJFKDgpLFxuICAgIGJ1Zi5yZWFkVUludDMyQkUoMTIpXG4gIF1cbn1cbmZ1bmN0aW9uIGZyb21BcnJheSAob3V0KSB7XG4gIG91dCA9IG91dC5tYXAoZml4dXBfdWludDMyKVxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcigxNilcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzBdLCAwKVxuICBidWYud3JpdGVVSW50MzJCRShvdXRbMV0sIDQpXG4gIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFsyXSwgOClcbiAgYnVmLndyaXRlVUludDMyQkUob3V0WzNdLCAxMilcbiAgcmV0dXJuIGJ1ZlxufVxudmFyIHVpbnRfbWF4ID0gTWF0aC5wb3coMiwgMzIpXG5mdW5jdGlvbiBmaXh1cF91aW50MzIgKHgpIHtcbiAgdmFyIHJldCwgeF9wb3NcbiAgcmV0ID0geCA+IHVpbnRfbWF4IHx8IHggPCAwID8gKHhfcG9zID0gTWF0aC5hYnMoeCkgJSB1aW50X21heCwgeCA8IDAgPyB1aW50X21heCAtIHhfcG9zIDogeF9wb3MpIDogeFxuICByZXR1cm4gcmV0XG59XG5mdW5jdGlvbiB4b3IgKGEsIGIpIHtcbiAgcmV0dXJuIFtcbiAgICBhWzBdIF4gYlswXSxcbiAgICBhWzFdIF4gYlsxXSxcbiAgICBhWzJdIF4gYlsyXSxcbiAgICBhWzNdIF4gYlszXVxuICBdXG59XG4iLCJleHBvcnRzWydhZXMtMTI4LWVjYiddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDEyOCxcbiAgaXY6IDAsXG4gIG1vZGU6ICdFQ0InLFxuICB0eXBlOiAnYmxvY2snXG59XG5leHBvcnRzWydhZXMtMTkyLWVjYiddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDE5MixcbiAgaXY6IDAsXG4gIG1vZGU6ICdFQ0InLFxuICB0eXBlOiAnYmxvY2snXG59XG5leHBvcnRzWydhZXMtMjU2LWVjYiddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDI1NixcbiAgaXY6IDAsXG4gIG1vZGU6ICdFQ0InLFxuICB0eXBlOiAnYmxvY2snXG59XG5leHBvcnRzWydhZXMtMTI4LWNiYyddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDEyOCxcbiAgaXY6IDE2LFxuICBtb2RlOiAnQ0JDJyxcbiAgdHlwZTogJ2Jsb2NrJ1xufVxuZXhwb3J0c1snYWVzLTE5Mi1jYmMnXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxOTIsXG4gIGl2OiAxNixcbiAgbW9kZTogJ0NCQycsXG4gIHR5cGU6ICdibG9jaydcbn1cbmV4cG9ydHNbJ2Flcy0yNTYtY2JjJ10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMjU2LFxuICBpdjogMTYsXG4gIG1vZGU6ICdDQkMnLFxuICB0eXBlOiAnYmxvY2snXG59XG5leHBvcnRzWydhZXMxMjgnXSA9IGV4cG9ydHNbJ2Flcy0xMjgtY2JjJ11cbmV4cG9ydHNbJ2FlczE5MiddID0gZXhwb3J0c1snYWVzLTE5Mi1jYmMnXVxuZXhwb3J0c1snYWVzMjU2J10gPSBleHBvcnRzWydhZXMtMjU2LWNiYyddXG5leHBvcnRzWydhZXMtMTI4LWNmYiddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDEyOCxcbiAgaXY6IDE2LFxuICBtb2RlOiAnQ0ZCJyxcbiAgdHlwZTogJ3N0cmVhbSdcbn1cbmV4cG9ydHNbJ2Flcy0xOTItY2ZiJ10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMTkyLFxuICBpdjogMTYsXG4gIG1vZGU6ICdDRkInLFxuICB0eXBlOiAnc3RyZWFtJ1xufVxuZXhwb3J0c1snYWVzLTI1Ni1jZmInXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAyNTYsXG4gIGl2OiAxNixcbiAgbW9kZTogJ0NGQicsXG4gIHR5cGU6ICdzdHJlYW0nXG59XG5leHBvcnRzWydhZXMtMTI4LWNmYjgnXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxMjgsXG4gIGl2OiAxNixcbiAgbW9kZTogJ0NGQjgnLFxuICB0eXBlOiAnc3RyZWFtJ1xufVxuZXhwb3J0c1snYWVzLTE5Mi1jZmI4J10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMTkyLFxuICBpdjogMTYsXG4gIG1vZGU6ICdDRkI4JyxcbiAgdHlwZTogJ3N0cmVhbSdcbn1cbmV4cG9ydHNbJ2Flcy0yNTYtY2ZiOCddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDI1NixcbiAgaXY6IDE2LFxuICBtb2RlOiAnQ0ZCOCcsXG4gIHR5cGU6ICdzdHJlYW0nXG59XG5leHBvcnRzWydhZXMtMTI4LWNmYjEnXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAxMjgsXG4gIGl2OiAxNixcbiAgbW9kZTogJ0NGQjEnLFxuICB0eXBlOiAnc3RyZWFtJ1xufVxuZXhwb3J0c1snYWVzLTE5Mi1jZmIxJ10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMTkyLFxuICBpdjogMTYsXG4gIG1vZGU6ICdDRkIxJyxcbiAgdHlwZTogJ3N0cmVhbSdcbn1cbmV4cG9ydHNbJ2Flcy0yNTYtY2ZiMSddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDI1NixcbiAgaXY6IDE2LFxuICBtb2RlOiAnQ0ZCMScsXG4gIHR5cGU6ICdzdHJlYW0nXG59XG5leHBvcnRzWydhZXMtMTI4LW9mYiddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDEyOCxcbiAgaXY6IDE2LFxuICBtb2RlOiAnT0ZCJyxcbiAgdHlwZTogJ3N0cmVhbSdcbn1cbmV4cG9ydHNbJ2Flcy0xOTItb2ZiJ10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMTkyLFxuICBpdjogMTYsXG4gIG1vZGU6ICdPRkInLFxuICB0eXBlOiAnc3RyZWFtJ1xufVxuZXhwb3J0c1snYWVzLTI1Ni1vZmInXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAyNTYsXG4gIGl2OiAxNixcbiAgbW9kZTogJ09GQicsXG4gIHR5cGU6ICdzdHJlYW0nXG59XG5leHBvcnRzWydhZXMtMTI4LWN0ciddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDEyOCxcbiAgaXY6IDE2LFxuICBtb2RlOiAnQ1RSJyxcbiAgdHlwZTogJ3N0cmVhbSdcbn1cbmV4cG9ydHNbJ2Flcy0xOTItY3RyJ10gPSB7XG4gIGNpcGhlcjogJ0FFUycsXG4gIGtleTogMTkyLFxuICBpdjogMTYsXG4gIG1vZGU6ICdDVFInLFxuICB0eXBlOiAnc3RyZWFtJ1xufVxuZXhwb3J0c1snYWVzLTI1Ni1jdHInXSA9IHtcbiAgY2lwaGVyOiAnQUVTJyxcbiAga2V5OiAyNTYsXG4gIGl2OiAxNixcbiAgbW9kZTogJ0NUUicsXG4gIHR5cGU6ICdzdHJlYW0nXG59XG5leHBvcnRzWydhZXMtMTI4LWdjbSddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDEyOCxcbiAgaXY6IDEyLFxuICBtb2RlOiAnR0NNJyxcbiAgdHlwZTogJ2F1dGgnXG59XG5leHBvcnRzWydhZXMtMTkyLWdjbSddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDE5MixcbiAgaXY6IDEyLFxuICBtb2RlOiAnR0NNJyxcbiAgdHlwZTogJ2F1dGgnXG59XG5leHBvcnRzWydhZXMtMjU2LWdjbSddID0ge1xuICBjaXBoZXI6ICdBRVMnLFxuICBrZXk6IDI1NixcbiAgaXY6IDEyLFxuICBtb2RlOiAnR0NNJyxcbiAgdHlwZTogJ2F1dGgnXG59XG4iLCJ2YXIgeG9yID0gcmVxdWlyZSgnYnVmZmVyLXhvcicpXG5cbmV4cG9ydHMuZW5jcnlwdCA9IGZ1bmN0aW9uIChzZWxmLCBibG9jaykge1xuICB2YXIgZGF0YSA9IHhvcihibG9jaywgc2VsZi5fcHJldilcblxuICBzZWxmLl9wcmV2ID0gc2VsZi5fY2lwaGVyLmVuY3J5cHRCbG9jayhkYXRhKVxuICByZXR1cm4gc2VsZi5fcHJldlxufVxuXG5leHBvcnRzLmRlY3J5cHQgPSBmdW5jdGlvbiAoc2VsZiwgYmxvY2spIHtcbiAgdmFyIHBhZCA9IHNlbGYuX3ByZXZcblxuICBzZWxmLl9wcmV2ID0gYmxvY2tcbiAgdmFyIG91dCA9IHNlbGYuX2NpcGhlci5kZWNyeXB0QmxvY2soYmxvY2spXG5cbiAgcmV0dXJuIHhvcihvdXQsIHBhZClcbn1cbiIsInZhciB4b3IgPSByZXF1aXJlKCdidWZmZXIteG9yJylcblxuZXhwb3J0cy5lbmNyeXB0ID0gZnVuY3Rpb24gKHNlbGYsIGRhdGEsIGRlY3J5cHQpIHtcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIoJycpXG4gIHZhciBsZW5cblxuICB3aGlsZSAoZGF0YS5sZW5ndGgpIHtcbiAgICBpZiAoc2VsZi5fY2FjaGUubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWxmLl9jYWNoZSA9IHNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soc2VsZi5fcHJldilcbiAgICAgIHNlbGYuX3ByZXYgPSBuZXcgQnVmZmVyKCcnKVxuICAgIH1cblxuICAgIGlmIChzZWxmLl9jYWNoZS5sZW5ndGggPD0gZGF0YS5sZW5ndGgpIHtcbiAgICAgIGxlbiA9IHNlbGYuX2NhY2hlLmxlbmd0aFxuICAgICAgb3V0ID0gQnVmZmVyLmNvbmNhdChbb3V0LCBlbmNyeXB0U3RhcnQoc2VsZiwgZGF0YS5zbGljZSgwLCBsZW4pLCBkZWNyeXB0KV0pXG4gICAgICBkYXRhID0gZGF0YS5zbGljZShsZW4pXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCA9IEJ1ZmZlci5jb25jYXQoW291dCwgZW5jcnlwdFN0YXJ0KHNlbGYsIGRhdGEsIGRlY3J5cHQpXSlcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuZnVuY3Rpb24gZW5jcnlwdFN0YXJ0IChzZWxmLCBkYXRhLCBkZWNyeXB0KSB7XG4gIHZhciBsZW4gPSBkYXRhLmxlbmd0aFxuICB2YXIgb3V0ID0geG9yKGRhdGEsIHNlbGYuX2NhY2hlKVxuICBzZWxmLl9jYWNoZSA9IHNlbGYuX2NhY2hlLnNsaWNlKGxlbilcbiAgc2VsZi5fcHJldiA9IEJ1ZmZlci5jb25jYXQoW3NlbGYuX3ByZXYsIGRlY3J5cHQgPyBkYXRhIDogb3V0XSlcbiAgcmV0dXJuIG91dFxufVxuIiwiZnVuY3Rpb24gZW5jcnlwdEJ5dGUgKHNlbGYsIGJ5dGVQYXJhbSwgZGVjcnlwdCkge1xuICB2YXIgcGFkXG4gIHZhciBpID0gLTFcbiAgdmFyIGxlbiA9IDhcbiAgdmFyIG91dCA9IDBcbiAgdmFyIGJpdCwgdmFsdWVcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIHBhZCA9IHNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soc2VsZi5fcHJldilcbiAgICBiaXQgPSAoYnl0ZVBhcmFtICYgKDEgPDwgKDcgLSBpKSkpID8gMHg4MCA6IDBcbiAgICB2YWx1ZSA9IHBhZFswXSBeIGJpdFxuICAgIG91dCArPSAoKHZhbHVlICYgMHg4MCkgPj4gKGkgJSA4KSlcbiAgICBzZWxmLl9wcmV2ID0gc2hpZnRJbihzZWxmLl9wcmV2LCBkZWNyeXB0ID8gYml0IDogdmFsdWUpXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuZXhwb3J0cy5lbmNyeXB0ID0gZnVuY3Rpb24gKHNlbGYsIGNodW5rLCBkZWNyeXB0KSB7XG4gIHZhciBsZW4gPSBjaHVuay5sZW5ndGhcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIobGVuKVxuICB2YXIgaSA9IC0xXG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBvdXRbaV0gPSBlbmNyeXB0Qnl0ZShzZWxmLCBjaHVua1tpXSwgZGVjcnlwdClcbiAgfVxuICByZXR1cm4gb3V0XG59XG5mdW5jdGlvbiBzaGlmdEluIChidWZmZXIsIHZhbHVlKSB7XG4gIHZhciBsZW4gPSBidWZmZXIubGVuZ3RoXG4gIHZhciBpID0gLTFcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIoYnVmZmVyLmxlbmd0aClcbiAgYnVmZmVyID0gQnVmZmVyLmNvbmNhdChbYnVmZmVyLCBuZXcgQnVmZmVyKFt2YWx1ZV0pXSlcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIG91dFtpXSA9IGJ1ZmZlcltpXSA8PCAxIHwgYnVmZmVyW2kgKyAxXSA+PiAoNylcbiAgfVxuICByZXR1cm4gb3V0XG59XG4iLCJmdW5jdGlvbiBlbmNyeXB0Qnl0ZSAoc2VsZiwgYnl0ZVBhcmFtLCBkZWNyeXB0KSB7XG4gIHZhciBwYWQgPSBzZWxmLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHNlbGYuX3ByZXYpXG4gIHZhciBvdXQgPSBwYWRbMF0gXiBieXRlUGFyYW1cbiAgc2VsZi5fcHJldiA9IEJ1ZmZlci5jb25jYXQoW3NlbGYuX3ByZXYuc2xpY2UoMSksIG5ldyBCdWZmZXIoW2RlY3J5cHQgPyBieXRlUGFyYW0gOiBvdXRdKV0pXG4gIHJldHVybiBvdXRcbn1cbmV4cG9ydHMuZW5jcnlwdCA9IGZ1bmN0aW9uIChzZWxmLCBjaHVuaywgZGVjcnlwdCkge1xuICB2YXIgbGVuID0gY2h1bmsubGVuZ3RoXG4gIHZhciBvdXQgPSBuZXcgQnVmZmVyKGxlbilcbiAgdmFyIGkgPSAtMVxuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgb3V0W2ldID0gZW5jcnlwdEJ5dGUoc2VsZiwgY2h1bmtbaV0sIGRlY3J5cHQpXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuIiwidmFyIHhvciA9IHJlcXVpcmUoJ2J1ZmZlci14b3InKVxuXG5mdW5jdGlvbiBpbmNyMzIgKGl2KSB7XG4gIHZhciBsZW4gPSBpdi5sZW5ndGhcbiAgdmFyIGl0ZW1cbiAgd2hpbGUgKGxlbi0tKSB7XG4gICAgaXRlbSA9IGl2LnJlYWRVSW50OChsZW4pXG4gICAgaWYgKGl0ZW0gPT09IDI1NSkge1xuICAgICAgaXYud3JpdGVVSW50OCgwLCBsZW4pXG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW0rK1xuICAgICAgaXYud3JpdGVVSW50OChpdGVtLCBsZW4pXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCbG9jayAoc2VsZikge1xuICB2YXIgb3V0ID0gc2VsZi5fY2lwaGVyLmVuY3J5cHRCbG9jayhzZWxmLl9wcmV2KVxuICBpbmNyMzIoc2VsZi5fcHJldilcbiAgcmV0dXJuIG91dFxufVxuXG5leHBvcnRzLmVuY3J5cHQgPSBmdW5jdGlvbiAoc2VsZiwgY2h1bmspIHtcbiAgd2hpbGUgKHNlbGYuX2NhY2hlLmxlbmd0aCA8IGNodW5rLmxlbmd0aCkge1xuICAgIHNlbGYuX2NhY2hlID0gQnVmZmVyLmNvbmNhdChbc2VsZi5fY2FjaGUsIGdldEJsb2NrKHNlbGYpXSlcbiAgfVxuICB2YXIgcGFkID0gc2VsZi5fY2FjaGUuc2xpY2UoMCwgY2h1bmsubGVuZ3RoKVxuICBzZWxmLl9jYWNoZSA9IHNlbGYuX2NhY2hlLnNsaWNlKGNodW5rLmxlbmd0aClcbiAgcmV0dXJuIHhvcihjaHVuaywgcGFkKVxufVxuIiwiZXhwb3J0cy5lbmNyeXB0ID0gZnVuY3Rpb24gKHNlbGYsIGJsb2NrKSB7XG4gIHJldHVybiBzZWxmLl9jaXBoZXIuZW5jcnlwdEJsb2NrKGJsb2NrKVxufVxuZXhwb3J0cy5kZWNyeXB0ID0gZnVuY3Rpb24gKHNlbGYsIGJsb2NrKSB7XG4gIHJldHVybiBzZWxmLl9jaXBoZXIuZGVjcnlwdEJsb2NrKGJsb2NrKVxufVxuIiwidmFyIHhvciA9IHJlcXVpcmUoJ2J1ZmZlci14b3InKVxuXG5mdW5jdGlvbiBnZXRCbG9jayAoc2VsZikge1xuICBzZWxmLl9wcmV2ID0gc2VsZi5fY2lwaGVyLmVuY3J5cHRCbG9jayhzZWxmLl9wcmV2KVxuICByZXR1cm4gc2VsZi5fcHJldlxufVxuXG5leHBvcnRzLmVuY3J5cHQgPSBmdW5jdGlvbiAoc2VsZiwgY2h1bmspIHtcbiAgd2hpbGUgKHNlbGYuX2NhY2hlLmxlbmd0aCA8IGNodW5rLmxlbmd0aCkge1xuICAgIHNlbGYuX2NhY2hlID0gQnVmZmVyLmNvbmNhdChbc2VsZi5fY2FjaGUsIGdldEJsb2NrKHNlbGYpXSlcbiAgfVxuXG4gIHZhciBwYWQgPSBzZWxmLl9jYWNoZS5zbGljZSgwLCBjaHVuay5sZW5ndGgpXG4gIHNlbGYuX2NhY2hlID0gc2VsZi5fY2FjaGUuc2xpY2UoY2h1bmsubGVuZ3RoKVxuICByZXR1cm4geG9yKGNodW5rLCBwYWQpXG59XG4iLCJ2YXIgYWVzID0gcmVxdWlyZSgnLi9hZXMnKVxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ2NpcGhlci1iYXNlJylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcblxuaW5oZXJpdHMoU3RyZWFtQ2lwaGVyLCBUcmFuc2Zvcm0pXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbUNpcGhlclxuZnVuY3Rpb24gU3RyZWFtQ2lwaGVyIChtb2RlLCBrZXksIGl2LCBkZWNyeXB0KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHJlYW1DaXBoZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJlYW1DaXBoZXIobW9kZSwga2V5LCBpdilcbiAgfVxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzKVxuICB0aGlzLl9jaXBoZXIgPSBuZXcgYWVzLkFFUyhrZXkpXG4gIHRoaXMuX3ByZXYgPSBuZXcgQnVmZmVyKGl2Lmxlbmd0aClcbiAgdGhpcy5fY2FjaGUgPSBuZXcgQnVmZmVyKCcnKVxuICB0aGlzLl9zZWNDYWNoZSA9IG5ldyBCdWZmZXIoJycpXG4gIHRoaXMuX2RlY3J5cHQgPSBkZWNyeXB0XG4gIGl2LmNvcHkodGhpcy5fcHJldilcbiAgdGhpcy5fbW9kZSA9IG1vZGVcbn1cblN0cmVhbUNpcGhlci5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICByZXR1cm4gdGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsIGNodW5rLCB0aGlzLl9kZWNyeXB0KVxufVxuU3RyZWFtQ2lwaGVyLnByb3RvdHlwZS5fZmluYWwgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2NpcGhlci5zY3J1YigpXG59XG4iLCJ2YXIgZWJ0ayA9IHJlcXVpcmUoJ2V2cF9ieXRlc3Rva2V5JylcbnZhciBhZXMgPSByZXF1aXJlKCdicm93c2VyaWZ5LWFlcy9icm93c2VyJylcbnZhciBERVMgPSByZXF1aXJlKCdicm93c2VyaWZ5LWRlcycpXG52YXIgZGVzTW9kZXMgPSByZXF1aXJlKCdicm93c2VyaWZ5LWRlcy9tb2RlcycpXG52YXIgYWVzTW9kZXMgPSByZXF1aXJlKCdicm93c2VyaWZ5LWFlcy9tb2RlcycpXG5mdW5jdGlvbiBjcmVhdGVDaXBoZXIgKHN1aXRlLCBwYXNzd29yZCkge1xuICB2YXIga2V5TGVuLCBpdkxlblxuICBzdWl0ZSA9IHN1aXRlLnRvTG93ZXJDYXNlKClcbiAgaWYgKGFlc01vZGVzW3N1aXRlXSkge1xuICAgIGtleUxlbiA9IGFlc01vZGVzW3N1aXRlXS5rZXlcbiAgICBpdkxlbiA9IGFlc01vZGVzW3N1aXRlXS5pdlxuICB9IGVsc2UgaWYgKGRlc01vZGVzW3N1aXRlXSkge1xuICAgIGtleUxlbiA9IGRlc01vZGVzW3N1aXRlXS5rZXkgKiA4XG4gICAgaXZMZW4gPSBkZXNNb2Rlc1tzdWl0ZV0uaXZcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHN1aXRlIHR5cGUnKVxuICB9XG4gIHZhciBrZXlzID0gZWJ0ayhwYXNzd29yZCwgZmFsc2UsIGtleUxlbiwgaXZMZW4pXG4gIHJldHVybiBjcmVhdGVDaXBoZXJpdihzdWl0ZSwga2V5cy5rZXksIGtleXMuaXYpXG59XG5mdW5jdGlvbiBjcmVhdGVEZWNpcGhlciAoc3VpdGUsIHBhc3N3b3JkKSB7XG4gIHZhciBrZXlMZW4sIGl2TGVuXG4gIHN1aXRlID0gc3VpdGUudG9Mb3dlckNhc2UoKVxuICBpZiAoYWVzTW9kZXNbc3VpdGVdKSB7XG4gICAga2V5TGVuID0gYWVzTW9kZXNbc3VpdGVdLmtleVxuICAgIGl2TGVuID0gYWVzTW9kZXNbc3VpdGVdLml2XG4gIH0gZWxzZSBpZiAoZGVzTW9kZXNbc3VpdGVdKSB7XG4gICAga2V5TGVuID0gZGVzTW9kZXNbc3VpdGVdLmtleSAqIDhcbiAgICBpdkxlbiA9IGRlc01vZGVzW3N1aXRlXS5pdlxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VpdGUgdHlwZScpXG4gIH1cbiAgdmFyIGtleXMgPSBlYnRrKHBhc3N3b3JkLCBmYWxzZSwga2V5TGVuLCBpdkxlbilcbiAgcmV0dXJuIGNyZWF0ZURlY2lwaGVyaXYoc3VpdGUsIGtleXMua2V5LCBrZXlzLml2KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDaXBoZXJpdiAoc3VpdGUsIGtleSwgaXYpIHtcbiAgc3VpdGUgPSBzdWl0ZS50b0xvd2VyQ2FzZSgpXG4gIGlmIChhZXNNb2Rlc1tzdWl0ZV0pIHtcbiAgICByZXR1cm4gYWVzLmNyZWF0ZUNpcGhlcml2KHN1aXRlLCBrZXksIGl2KVxuICB9IGVsc2UgaWYgKGRlc01vZGVzW3N1aXRlXSkge1xuICAgIHJldHVybiBuZXcgREVTKHtcbiAgICAgIGtleToga2V5LFxuICAgICAgaXY6IGl2LFxuICAgICAgbW9kZTogc3VpdGVcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VpdGUgdHlwZScpXG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZURlY2lwaGVyaXYgKHN1aXRlLCBrZXksIGl2KSB7XG4gIHN1aXRlID0gc3VpdGUudG9Mb3dlckNhc2UoKVxuICBpZiAoYWVzTW9kZXNbc3VpdGVdKSB7XG4gICAgcmV0dXJuIGFlcy5jcmVhdGVEZWNpcGhlcml2KHN1aXRlLCBrZXksIGl2KVxuICB9IGVsc2UgaWYgKGRlc01vZGVzW3N1aXRlXSkge1xuICAgIHJldHVybiBuZXcgREVTKHtcbiAgICAgIGtleToga2V5LFxuICAgICAgaXY6IGl2LFxuICAgICAgbW9kZTogc3VpdGUsXG4gICAgICBkZWNyeXB0OiB0cnVlXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHN1aXRlIHR5cGUnKVxuICB9XG59XG5leHBvcnRzLmNyZWF0ZUNpcGhlciA9IGV4cG9ydHMuQ2lwaGVyID0gY3JlYXRlQ2lwaGVyXG5leHBvcnRzLmNyZWF0ZUNpcGhlcml2ID0gZXhwb3J0cy5DaXBoZXJpdiA9IGNyZWF0ZUNpcGhlcml2XG5leHBvcnRzLmNyZWF0ZURlY2lwaGVyID0gZXhwb3J0cy5EZWNpcGhlciA9IGNyZWF0ZURlY2lwaGVyXG5leHBvcnRzLmNyZWF0ZURlY2lwaGVyaXYgPSBleHBvcnRzLkRlY2lwaGVyaXYgPSBjcmVhdGVEZWNpcGhlcml2XG5mdW5jdGlvbiBnZXRDaXBoZXJzICgpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGRlc01vZGVzKS5jb25jYXQoYWVzLmdldENpcGhlcnMoKSlcbn1cbmV4cG9ydHMubGlzdENpcGhlcnMgPSBleHBvcnRzLmdldENpcGhlcnMgPSBnZXRDaXBoZXJzXG4iLCJ2YXIgQ2lwaGVyQmFzZSA9IHJlcXVpcmUoJ2NpcGhlci1iYXNlJylcbnZhciBkZXMgPSByZXF1aXJlKCdkZXMuanMnKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxuXG52YXIgbW9kZXMgPSB7XG4gICdkZXMtZWRlMy1jYmMnOiBkZXMuQ0JDLmluc3RhbnRpYXRlKGRlcy5FREUpLFxuICAnZGVzLWVkZTMnOiBkZXMuRURFLFxuICAnZGVzLWVkZS1jYmMnOiBkZXMuQ0JDLmluc3RhbnRpYXRlKGRlcy5FREUpLFxuICAnZGVzLWVkZSc6IGRlcy5FREUsXG4gICdkZXMtY2JjJzogZGVzLkNCQy5pbnN0YW50aWF0ZShkZXMuREVTKSxcbiAgJ2Rlcy1lY2InOiBkZXMuREVTXG59XG5tb2Rlcy5kZXMgPSBtb2Rlc1snZGVzLWNiYyddXG5tb2Rlcy5kZXMzID0gbW9kZXNbJ2Rlcy1lZGUzLWNiYyddXG5tb2R1bGUuZXhwb3J0cyA9IERFU1xuaW5oZXJpdHMoREVTLCBDaXBoZXJCYXNlKVxuZnVuY3Rpb24gREVTIChvcHRzKSB7XG4gIENpcGhlckJhc2UuY2FsbCh0aGlzKVxuICB2YXIgbW9kZU5hbWUgPSBvcHRzLm1vZGUudG9Mb3dlckNhc2UoKVxuICB2YXIgbW9kZSA9IG1vZGVzW21vZGVOYW1lXVxuICB2YXIgdHlwZVxuICBpZiAob3B0cy5kZWNyeXB0KSB7XG4gICAgdHlwZSA9ICdkZWNyeXB0J1xuICB9IGVsc2Uge1xuICAgIHR5cGUgPSAnZW5jcnlwdCdcbiAgfVxuICB2YXIga2V5ID0gb3B0cy5rZXlcbiAgaWYgKG1vZGVOYW1lID09PSAnZGVzLWVkZScgfHwgbW9kZU5hbWUgPT09ICdkZXMtZWRlLWNiYycpIHtcbiAgICBrZXkgPSBCdWZmZXIuY29uY2F0KFtrZXksIGtleS5zbGljZSgwLCA4KV0pXG4gIH1cbiAgdmFyIGl2ID0gb3B0cy5pdlxuICB0aGlzLl9kZXMgPSBtb2RlLmNyZWF0ZSh7XG4gICAga2V5OiBrZXksXG4gICAgaXY6IGl2LFxuICAgIHR5cGU6IHR5cGVcbiAgfSlcbn1cbkRFUy5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiBuZXcgQnVmZmVyKHRoaXMuX2Rlcy51cGRhdGUoZGF0YSkpXG59XG5ERVMucHJvdG90eXBlLl9maW5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXIodGhpcy5fZGVzLmZpbmFsKCkpXG59XG4iLCJleHBvcnRzWydkZXMtZWNiJ10gPSB7XG4gIGtleTogOCxcbiAgaXY6IDBcbn1cbmV4cG9ydHNbJ2Rlcy1jYmMnXSA9IGV4cG9ydHMuZGVzID0ge1xuICBrZXk6IDgsXG4gIGl2OiA4XG59XG5leHBvcnRzWydkZXMtZWRlMy1jYmMnXSA9IGV4cG9ydHMuZGVzMyA9IHtcbiAga2V5OiAyNCxcbiAgaXY6IDhcbn1cbmV4cG9ydHNbJ2Rlcy1lZGUzJ10gPSB7XG4gIGtleTogMjQsXG4gIGl2OiAwXG59XG5leHBvcnRzWydkZXMtZWRlLWNiYyddID0ge1xuICBrZXk6IDE2LFxuICBpdjogOFxufVxuZXhwb3J0c1snZGVzLWVkZSddID0ge1xuICBrZXk6IDE2LFxuICBpdjogMFxufVxuIiwidmFyIGJuID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciByYW5kb21CeXRlcyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGNydDtcbmZ1bmN0aW9uIGJsaW5kKHByaXYpIHtcbiAgdmFyIHIgPSBnZXRyKHByaXYpO1xuICB2YXIgYmxpbmRlciA9IHIudG9SZWQoYm4ubW9udChwcml2Lm1vZHVsdXMpKVxuICAucmVkUG93KG5ldyBibihwcml2LnB1YmxpY0V4cG9uZW50KSkuZnJvbVJlZCgpO1xuICByZXR1cm4ge1xuICAgIGJsaW5kZXI6IGJsaW5kZXIsXG4gICAgdW5ibGluZGVyOnIuaW52bShwcml2Lm1vZHVsdXMpXG4gIH07XG59XG5mdW5jdGlvbiBjcnQobXNnLCBwcml2KSB7XG4gIHZhciBibGluZHMgPSBibGluZChwcml2KTtcbiAgdmFyIGxlbiA9IHByaXYubW9kdWx1cy5ieXRlTGVuZ3RoKCk7XG4gIHZhciBtb2QgPSBibi5tb250KHByaXYubW9kdWx1cyk7XG4gIHZhciBibGluZGVkID0gbmV3IGJuKG1zZykubXVsKGJsaW5kcy5ibGluZGVyKS51bW9kKHByaXYubW9kdWx1cyk7XG4gIHZhciBjMSA9IGJsaW5kZWQudG9SZWQoYm4ubW9udChwcml2LnByaW1lMSkpO1xuICB2YXIgYzIgPSBibGluZGVkLnRvUmVkKGJuLm1vbnQocHJpdi5wcmltZTIpKTtcbiAgdmFyIHFpbnYgPSBwcml2LmNvZWZmaWNpZW50O1xuICB2YXIgcCA9IHByaXYucHJpbWUxO1xuICB2YXIgcSA9IHByaXYucHJpbWUyO1xuICB2YXIgbTEgPSBjMS5yZWRQb3cocHJpdi5leHBvbmVudDEpO1xuICB2YXIgbTIgPSBjMi5yZWRQb3cocHJpdi5leHBvbmVudDIpO1xuICBtMSA9IG0xLmZyb21SZWQoKTtcbiAgbTIgPSBtMi5mcm9tUmVkKCk7XG4gIHZhciBoID0gbTEuaXN1YihtMikuaW11bChxaW52KS51bW9kKHApO1xuICBoLmltdWwocSk7XG4gIG0yLmlhZGQoaCk7XG4gIHJldHVybiBuZXcgQnVmZmVyKG0yLmltdWwoYmxpbmRzLnVuYmxpbmRlcikudW1vZChwcml2Lm1vZHVsdXMpLnRvQXJyYXkoZmFsc2UsIGxlbikpO1xufVxuY3J0LmdldHIgPSBnZXRyO1xuZnVuY3Rpb24gZ2V0cihwcml2KSB7XG4gIHZhciBsZW4gPSBwcml2Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO1xuICB2YXIgciA9IG5ldyBibihyYW5kb21CeXRlcyhsZW4pKTtcbiAgd2hpbGUgKHIuY21wKHByaXYubW9kdWx1cykgPj0gIDAgfHwgIXIudW1vZChwcml2LnByaW1lMSkgfHwgIXIudW1vZChwcml2LnByaW1lMikpIHtcbiAgICByID0gbmV3IGJuKHJhbmRvbUJ5dGVzKGxlbikpO1xuICB9XG4gIHJldHVybiByO1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5leHBvcnRzWydSU0EtU0hBMjI0J10gPSBleHBvcnRzLnNoYTIyNFdpdGhSU0FFbmNyeXB0aW9uID0ge1xuICBzaWduOiAncnNhJyxcbiAgaGFzaDogJ3NoYTIyNCcsXG4gIGlkOiBuZXcgQnVmZmVyKCczMDJkMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDQwNTAwMDQxYycsICdoZXgnKVxufVxuZXhwb3J0c1snUlNBLVNIQTI1NiddID0gZXhwb3J0cy5zaGEyNTZXaXRoUlNBRW5jcnlwdGlvbiA9IHtcbiAgc2lnbjogJ3JzYScsXG4gIGhhc2g6ICdzaGEyNTYnLFxuICBpZDogbmV3IEJ1ZmZlcignMzAzMTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAxMDUwMDA0MjAnLCAnaGV4Jylcbn1cbmV4cG9ydHNbJ1JTQS1TSEEzODQnXSA9IGV4cG9ydHMuc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24gPSB7XG4gIHNpZ246ICdyc2EnLFxuICBoYXNoOiAnc2hhMzg0JyxcbiAgaWQ6IG5ldyBCdWZmZXIoJzMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwJywgJ2hleCcpXG59XG5leHBvcnRzWydSU0EtU0hBNTEyJ10gPSBleHBvcnRzLnNoYTUxMldpdGhSU0FFbmNyeXB0aW9uID0ge1xuICBzaWduOiAncnNhJyxcbiAgaGFzaDogJ3NoYTUxMicsXG4gIGlkOiBuZXcgQnVmZmVyKCczMDUxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDMwNTAwMDQ0MCcsICdoZXgnKVxufVxuZXhwb3J0c1snUlNBLVNIQTEnXSA9IHtcbiAgc2lnbjogJ3JzYScsXG4gIGhhc2g6ICdzaGExJyxcbiAgaWQ6IG5ldyBCdWZmZXIoJzMwMjEzMDA5MDYwNTJiMGUwMzAyMWEwNTAwMDQxNCcsICdoZXgnKVxufVxuZXhwb3J0c1snZWNkc2Etd2l0aC1TSEExJ10gPSB7XG4gIHNpZ246ICdlY2RzYScsXG4gIGhhc2g6ICdzaGExJyxcbiAgaWQ6IG5ldyBCdWZmZXIoJycsICdoZXgnKVxufVxuXG5leHBvcnRzLkRTQSA9IGV4cG9ydHNbJ0RTQS1TSEExJ10gPSBleHBvcnRzWydEU0EtU0hBJ10gPSB7XG4gIHNpZ246ICdkc2EnLFxuICBoYXNoOiAnc2hhMScsXG4gIGlkOiBuZXcgQnVmZmVyKCcnLCAnaGV4Jylcbn1cbmV4cG9ydHNbJ0RTQS1TSEEyMjQnXSA9IGV4cG9ydHNbJ0RTQS1XSVRILVNIQTIyNCddID0ge1xuICBzaWduOiAnZHNhJyxcbiAgaGFzaDogJ3NoYTIyNCcsXG4gIGlkOiBuZXcgQnVmZmVyKCcnLCAnaGV4Jylcbn1cbmV4cG9ydHNbJ0RTQS1TSEEyNTYnXSA9IGV4cG9ydHNbJ0RTQS1XSVRILVNIQTI1NiddID0ge1xuICBzaWduOiAnZHNhJyxcbiAgaGFzaDogJ3NoYTI1NicsXG4gIGlkOiBuZXcgQnVmZmVyKCcnLCAnaGV4Jylcbn1cbmV4cG9ydHNbJ0RTQS1TSEEzODQnXSA9IGV4cG9ydHNbJ0RTQS1XSVRILVNIQTM4NCddID0ge1xuICBzaWduOiAnZHNhJyxcbiAgaGFzaDogJ3NoYTM4NCcsXG4gIGlkOiBuZXcgQnVmZmVyKCcnLCAnaGV4Jylcbn1cbmV4cG9ydHNbJ0RTQS1TSEE1MTInXSA9IGV4cG9ydHNbJ0RTQS1XSVRILVNIQTUxMiddID0ge1xuICBzaWduOiAnZHNhJyxcbiAgaGFzaDogJ3NoYTUxMicsXG4gIGlkOiBuZXcgQnVmZmVyKCcnLCAnaGV4Jylcbn1cbmV4cG9ydHNbJ0RTQS1SSVBFTUQxNjAnXSA9IHtcbiAgc2lnbjogJ2RzYScsXG4gIGhhc2g6ICdybWQxNjAnLFxuICBpZDogbmV3IEJ1ZmZlcignJywgJ2hleCcpXG59XG5leHBvcnRzWydSU0EtUklQRU1EMTYwJ10gPSBleHBvcnRzLnJpcGVtZDE2MFdpdGhSU0EgPSB7XG4gIHNpZ246ICdyc2EnLFxuICBoYXNoOiAncm1kMTYwJyxcbiAgaWQ6IG5ldyBCdWZmZXIoJzMwMjEzMDA5MDYwNTJiMjQwMzAyMDEwNTAwMDQxNCcsICdoZXgnKVxufVxuZXhwb3J0c1snUlNBLU1ENSddID0gZXhwb3J0cy5tZDVXaXRoUlNBRW5jcnlwdGlvbiA9IHtcbiAgc2lnbjogJ3JzYScsXG4gIGhhc2g6ICdtZDUnLFxuICBpZDogbmV3IEJ1ZmZlcignMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwNTA1MDAwNDEwJywgJ2hleCcpXG59XG4iLCJ2YXIgX2FsZ29zID0gcmVxdWlyZSgnLi9hbGdvcycpXG52YXIgY3JlYXRlSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBzaWduID0gcmVxdWlyZSgnLi9zaWduJylcbnZhciBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxudmFyIHZlcmlmeSA9IHJlcXVpcmUoJy4vdmVyaWZ5JylcblxudmFyIGFsZ29zID0ge31cbk9iamVjdC5rZXlzKF9hbGdvcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIGFsZ29zW2tleV0gPSBhbGdvc1trZXkudG9Mb3dlckNhc2UoKV0gPSBfYWxnb3Nba2V5XVxufSlcblxuZnVuY3Rpb24gU2lnbiAoYWxnb3JpdGhtKSB7XG4gIHN0cmVhbS5Xcml0YWJsZS5jYWxsKHRoaXMpXG5cbiAgdmFyIGRhdGEgPSBhbGdvc1thbGdvcml0aG1dXG4gIGlmICghZGF0YSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBtZXNzYWdlIGRpZ2VzdCcpXG4gIH1cblxuICB0aGlzLl9oYXNoVHlwZSA9IGRhdGEuaGFzaFxuICB0aGlzLl9oYXNoID0gY3JlYXRlSGFzaChkYXRhLmhhc2gpXG4gIHRoaXMuX3RhZyA9IGRhdGEuaWRcbiAgdGhpcy5fc2lnblR5cGUgPSBkYXRhLnNpZ25cbn1cbmluaGVyaXRzKFNpZ24sIHN0cmVhbS5Xcml0YWJsZSlcblxuU2lnbi5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gX3dyaXRlIChkYXRhLCBfLCBkb25lKSB7XG4gIHRoaXMuX2hhc2gudXBkYXRlKGRhdGEpXG4gIGRvbmUoKVxufVxuXG5TaWduLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKGRhdGEsIGVuYykge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgZGF0YSA9IG5ldyBCdWZmZXIoZGF0YSwgZW5jKVxuICB9XG5cbiAgdGhpcy5faGFzaC51cGRhdGUoZGF0YSlcbiAgcmV0dXJuIHRoaXNcbn1cblxuU2lnbi5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ25NZXRob2QgKGtleSwgZW5jKSB7XG4gIHRoaXMuZW5kKClcbiAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoLmRpZ2VzdCgpXG4gIHZhciBzaWcgPSBzaWduKEJ1ZmZlci5jb25jYXQoW3RoaXMuX3RhZywgaGFzaF0pLCBrZXksIHRoaXMuX2hhc2hUeXBlLCB0aGlzLl9zaWduVHlwZSlcblxuICByZXR1cm4gZW5jID8gc2lnLnRvU3RyaW5nKGVuYykgOiBzaWdcbn1cblxuZnVuY3Rpb24gVmVyaWZ5IChhbGdvcml0aG0pIHtcbiAgc3RyZWFtLldyaXRhYmxlLmNhbGwodGhpcylcblxuICB2YXIgZGF0YSA9IGFsZ29zW2FsZ29yaXRobV1cbiAgaWYgKCFkYXRhKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1lc3NhZ2UgZGlnZXN0JylcbiAgfVxuXG4gIHRoaXMuX2hhc2ggPSBjcmVhdGVIYXNoKGRhdGEuaGFzaClcbiAgdGhpcy5fdGFnID0gZGF0YS5pZFxuICB0aGlzLl9zaWduVHlwZSA9IGRhdGEuc2lnblxufVxuaW5oZXJpdHMoVmVyaWZ5LCBzdHJlYW0uV3JpdGFibGUpXG5cblZlcmlmeS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gX3dyaXRlIChkYXRhLCBfLCBkb25lKSB7XG4gIHRoaXMuX2hhc2gudXBkYXRlKGRhdGEpXG5cbiAgZG9uZSgpXG59XG5cblZlcmlmeS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlIChkYXRhLCBlbmMpIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGRhdGEgPSBuZXcgQnVmZmVyKGRhdGEsIGVuYylcbiAgfVxuXG4gIHRoaXMuX2hhc2gudXBkYXRlKGRhdGEpXG4gIHJldHVybiB0aGlzXG59XG5cblZlcmlmeS5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5TWV0aG9kIChrZXksIHNpZywgZW5jKSB7XG4gIGlmICh0eXBlb2Ygc2lnID09PSAnc3RyaW5nJykge1xuICAgIHNpZyA9IG5ldyBCdWZmZXIoc2lnLCBlbmMpXG4gIH1cblxuICB0aGlzLmVuZCgpXG4gIHZhciBoYXNoID0gdGhpcy5faGFzaC5kaWdlc3QoKVxuXG4gIHJldHVybiB2ZXJpZnkoc2lnLCBCdWZmZXIuY29uY2F0KFt0aGlzLl90YWcsIGhhc2hdKSwga2V5LCB0aGlzLl9zaWduVHlwZSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2lnbiAoYWxnb3JpdGhtKSB7XG4gIHJldHVybiBuZXcgU2lnbihhbGdvcml0aG0pXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZlcmlmeSAoYWxnb3JpdGhtKSB7XG4gIHJldHVybiBuZXcgVmVyaWZ5KGFsZ29yaXRobSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFNpZ246IGNyZWF0ZVNpZ24sXG4gIFZlcmlmeTogY3JlYXRlVmVyaWZ5LFxuICBjcmVhdGVTaWduOiBjcmVhdGVTaWduLFxuICBjcmVhdGVWZXJpZnk6IGNyZWF0ZVZlcmlmeVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5leHBvcnRzWycxLjMuMTMyLjAuMTAnXSA9ICdzZWNwMjU2azEnXG5cbmV4cG9ydHNbJzEuMy4xMzIuMC4zMyddID0gJ3AyMjQnXG5cbmV4cG9ydHNbJzEuMi44NDAuMTAwNDUuMy4xLjEnXSA9ICdwMTkyJ1xuXG5leHBvcnRzWycxLjIuODQwLjEwMDQ1LjMuMS43J10gPSAncDI1NidcblxuZXhwb3J0c1snMS4zLjEzMi4wLjM0J10gPSAncDM4NCdcblxuZXhwb3J0c1snMS4zLjEzMi4wLjM1J10gPSAncDUyMSdcbiIsIi8vIG11Y2ggb2YgdGhpcyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9zZWxmLXNpZ25lZC9ibG9iL2doLXBhZ2VzL2xpYi9yc2EuanNcbnZhciBjcmVhdGVIbWFjID0gcmVxdWlyZSgnY3JlYXRlLWhtYWMnKVxudmFyIGNydCA9IHJlcXVpcmUoJ2Jyb3dzZXJpZnktcnNhJylcbnZhciBjdXJ2ZXMgPSByZXF1aXJlKCcuL2N1cnZlcycpXG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCdlbGxpcHRpYycpXG52YXIgcGFyc2VLZXlzID0gcmVxdWlyZSgncGFyc2UtYXNuMScpXG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJylcbnZhciBFQyA9IGVsbGlwdGljLmVjXG5cbmZ1bmN0aW9uIHNpZ24gKGhhc2gsIGtleSwgaGFzaFR5cGUsIHNpZ25UeXBlKSB7XG4gIHZhciBwcml2ID0gcGFyc2VLZXlzKGtleSlcbiAgaWYgKHByaXYuY3VydmUpIHtcbiAgICBpZiAoc2lnblR5cGUgIT09ICdlY2RzYScpIHRocm93IG5ldyBFcnJvcignd3JvbmcgcHJpdmF0ZSBrZXkgdHlwZScpXG5cbiAgICByZXR1cm4gZWNTaWduKGhhc2gsIHByaXYpXG4gIH0gZWxzZSBpZiAocHJpdi50eXBlID09PSAnZHNhJykge1xuICAgIGlmIChzaWduVHlwZSAhPT0gJ2RzYScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd3JvbmcgcHJpdmF0ZSBrZXkgdHlwZScpXG4gICAgfVxuICAgIHJldHVybiBkc2FTaWduKGhhc2gsIHByaXYsIGhhc2hUeXBlKVxuICB9IGVsc2Uge1xuICAgIGlmIChzaWduVHlwZSAhPT0gJ3JzYScpIHRocm93IG5ldyBFcnJvcignd3JvbmcgcHJpdmF0ZSBrZXkgdHlwZScpXG4gIH1cblxuICB2YXIgbGVuID0gcHJpdi5tb2R1bHVzLmJ5dGVMZW5ndGgoKVxuICB2YXIgcGFkID0gWyAwLCAxIF1cbiAgd2hpbGUgKGhhc2gubGVuZ3RoICsgcGFkLmxlbmd0aCArIDEgPCBsZW4pIHtcbiAgICBwYWQucHVzaCgweGZmKVxuICB9XG4gIHBhZC5wdXNoKDB4MDApXG4gIHZhciBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGhhc2gubGVuZ3RoKSB7XG4gICAgcGFkLnB1c2goaGFzaFtpXSlcbiAgfVxuXG4gIHZhciBvdXQgPSBjcnQocGFkLCBwcml2KVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIGVjU2lnbiAoaGFzaCwgcHJpdikge1xuICB2YXIgY3VydmVJZCA9IGN1cnZlc1twcml2LmN1cnZlLmpvaW4oJy4nKV1cbiAgaWYgKCFjdXJ2ZUlkKSB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY3VydmUgJyArIHByaXYuY3VydmUuam9pbignLicpKVxuXG4gIHZhciBjdXJ2ZSA9IG5ldyBFQyhjdXJ2ZUlkKVxuICB2YXIga2V5ID0gY3VydmUuZ2VuS2V5UGFpcigpXG5cbiAga2V5Ll9pbXBvcnRQcml2YXRlKHByaXYucHJpdmF0ZUtleSlcbiAgdmFyIG91dCA9IGtleS5zaWduKGhhc2gpXG5cbiAgcmV0dXJuIG5ldyBCdWZmZXIob3V0LnRvREVSKCkpXG59XG5cbmZ1bmN0aW9uIGRzYVNpZ24gKGhhc2gsIHByaXYsIGFsZ28pIHtcbiAgdmFyIHggPSBwcml2LnBhcmFtcy5wcml2X2tleVxuICB2YXIgcCA9IHByaXYucGFyYW1zLnBcbiAgdmFyIHEgPSBwcml2LnBhcmFtcy5xXG4gIHZhciBnID0gcHJpdi5wYXJhbXMuZ1xuICB2YXIgciA9IG5ldyBCTigwKVxuICB2YXIga1xuICB2YXIgSCA9IGJpdHMyaW50KGhhc2gsIHEpLm1vZChxKVxuICB2YXIgcyA9IGZhbHNlXG4gIHZhciBrdiA9IGdldEtleSh4LCBxLCBoYXNoLCBhbGdvKVxuICB3aGlsZSAocyA9PT0gZmFsc2UpIHtcbiAgICBrID0gbWFrZUtleShxLCBrdiwgYWxnbylcbiAgICByID0gbWFrZVIoZywgaywgcCwgcSlcbiAgICBzID0gay5pbnZtKHEpLmltdWwoSC5hZGQoeC5tdWwocikpKS5tb2QocSlcbiAgICBpZiAoIXMuY21wbigwKSkge1xuICAgICAgcyA9IGZhbHNlXG4gICAgICByID0gbmV3IEJOKDApXG4gICAgfVxuICB9XG4gIHJldHVybiB0b0RFUihyLCBzKVxufVxuXG5mdW5jdGlvbiB0b0RFUiAociwgcykge1xuICByID0gci50b0FycmF5KClcbiAgcyA9IHMudG9BcnJheSgpXG5cbiAgLy8gUGFkIHZhbHVlc1xuICBpZiAoclswXSAmIDB4ODApIHtcbiAgICByID0gWyAwIF0uY29uY2F0KHIpXG4gIH1cbiAgLy8gUGFkIHZhbHVlc1xuICBpZiAoc1swXSAmIDB4ODApIHtcbiAgICBzID0gWzBdLmNvbmNhdChzKVxuICB9XG5cbiAgdmFyIHRvdGFsID0gci5sZW5ndGggKyBzLmxlbmd0aCArIDRcbiAgdmFyIHJlcyA9IFsgMHgzMCwgdG90YWwsIDB4MDIsIHIubGVuZ3RoIF1cbiAgcmVzID0gcmVzLmNvbmNhdChyLCBbIDB4MDIsIHMubGVuZ3RoIF0sIHMpXG4gIHJldHVybiBuZXcgQnVmZmVyKHJlcylcbn1cblxuZnVuY3Rpb24gZ2V0S2V5ICh4LCBxLCBoYXNoLCBhbGdvKSB7XG4gIHggPSBuZXcgQnVmZmVyKHgudG9BcnJheSgpKVxuICBpZiAoeC5sZW5ndGggPCBxLmJ5dGVMZW5ndGgoKSkge1xuICAgIHZhciB6ZXJvcyA9IG5ldyBCdWZmZXIocS5ieXRlTGVuZ3RoKCkgLSB4Lmxlbmd0aClcbiAgICB6ZXJvcy5maWxsKDApXG4gICAgeCA9IEJ1ZmZlci5jb25jYXQoW3plcm9zLCB4XSlcbiAgfVxuICB2YXIgaGxlbiA9IGhhc2gubGVuZ3RoXG4gIHZhciBoYml0cyA9IGJpdHMyb2N0ZXRzKGhhc2gsIHEpXG4gIHZhciB2ID0gbmV3IEJ1ZmZlcihobGVuKVxuICB2LmZpbGwoMSlcbiAgdmFyIGsgPSBuZXcgQnVmZmVyKGhsZW4pXG4gIGsuZmlsbCgwKVxuICBrID0gY3JlYXRlSG1hYyhhbGdvLCBrKVxuICAgIC51cGRhdGUodilcbiAgICAudXBkYXRlKG5ldyBCdWZmZXIoWzBdKSlcbiAgICAudXBkYXRlKHgpXG4gICAgLnVwZGF0ZShoYml0cylcbiAgICAuZGlnZXN0KClcbiAgdiA9IGNyZWF0ZUhtYWMoYWxnbywgaylcbiAgICAudXBkYXRlKHYpXG4gICAgLmRpZ2VzdCgpXG4gIGsgPSBjcmVhdGVIbWFjKGFsZ28sIGspXG4gICAgLnVwZGF0ZSh2KVxuICAgIC51cGRhdGUobmV3IEJ1ZmZlcihbMV0pKVxuICAgIC51cGRhdGUoeClcbiAgICAudXBkYXRlKGhiaXRzKVxuICAgIC5kaWdlc3QoKVxuICB2ID0gY3JlYXRlSG1hYyhhbGdvLCBrKVxuICAgIC51cGRhdGUodilcbiAgICAuZGlnZXN0KClcbiAgcmV0dXJuIHtcbiAgICBrOiBrLFxuICAgIHY6IHZcbiAgfVxufVxuXG5mdW5jdGlvbiBiaXRzMmludCAob2JpdHMsIHEpIHtcbiAgdmFyIGJpdHMgPSBuZXcgQk4ob2JpdHMpXG4gIHZhciBzaGlmdCA9IChvYml0cy5sZW5ndGggPDwgMykgLSBxLmJpdExlbmd0aCgpXG4gIGlmIChzaGlmdCA+IDApIHtcbiAgICBiaXRzLmlzaHJuKHNoaWZ0KVxuICB9XG4gIHJldHVybiBiaXRzXG59XG5cbmZ1bmN0aW9uIGJpdHMyb2N0ZXRzIChiaXRzLCBxKSB7XG4gIGJpdHMgPSBiaXRzMmludChiaXRzLCBxKVxuICBiaXRzID0gYml0cy5tb2QocSlcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIoYml0cy50b0FycmF5KCkpXG4gIGlmIChvdXQubGVuZ3RoIDwgcS5ieXRlTGVuZ3RoKCkpIHtcbiAgICB2YXIgemVyb3MgPSBuZXcgQnVmZmVyKHEuYnl0ZUxlbmd0aCgpIC0gb3V0Lmxlbmd0aClcbiAgICB6ZXJvcy5maWxsKDApXG4gICAgb3V0ID0gQnVmZmVyLmNvbmNhdChbemVyb3MsIG91dF0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiBtYWtlS2V5IChxLCBrdiwgYWxnbykge1xuICB2YXIgdCwga1xuXG4gIGRvIHtcbiAgICB0ID0gbmV3IEJ1ZmZlcignJylcblxuICAgIHdoaWxlICh0Lmxlbmd0aCAqIDggPCBxLmJpdExlbmd0aCgpKSB7XG4gICAgICBrdi52ID0gY3JlYXRlSG1hYyhhbGdvLCBrdi5rKVxuICAgICAgICAudXBkYXRlKGt2LnYpXG4gICAgICAgIC5kaWdlc3QoKVxuICAgICAgdCA9IEJ1ZmZlci5jb25jYXQoW3QsIGt2LnZdKVxuICAgIH1cblxuICAgIGsgPSBiaXRzMmludCh0LCBxKVxuICAgIGt2LmsgPSBjcmVhdGVIbWFjKGFsZ28sIGt2LmspXG4gICAgICAudXBkYXRlKGt2LnYpXG4gICAgICAudXBkYXRlKG5ldyBCdWZmZXIoWzBdKSlcbiAgICAgIC5kaWdlc3QoKVxuICAgIGt2LnYgPSBjcmVhdGVIbWFjKGFsZ28sIGt2LmspXG4gICAgICAudXBkYXRlKGt2LnYpXG4gICAgICAuZGlnZXN0KClcbiAgfSB3aGlsZSAoay5jbXAocSkgIT09IC0xKVxuXG4gIHJldHVybiBrXG59XG5cbmZ1bmN0aW9uIG1ha2VSIChnLCBrLCBwLCBxKSB7XG4gIHJldHVybiBnLnRvUmVkKEJOLm1vbnQocCkpLnJlZFBvdyhrKS5mcm9tUmVkKCkubW9kKHEpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2lnblxubW9kdWxlLmV4cG9ydHMuZ2V0S2V5ID0gZ2V0S2V5XG5tb2R1bGUuZXhwb3J0cy5tYWtlS2V5ID0gbWFrZUtleVxuIiwiLy8gbXVjaCBvZiB0aGlzIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9pbmR1dG55L3NlbGYtc2lnbmVkL2Jsb2IvZ2gtcGFnZXMvbGliL3JzYS5qc1xudmFyIGN1cnZlcyA9IHJlcXVpcmUoJy4vY3VydmVzJylcbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJ2VsbGlwdGljJylcbnZhciBwYXJzZUtleXMgPSByZXF1aXJlKCdwYXJzZS1hc24xJylcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKVxudmFyIEVDID0gZWxsaXB0aWMuZWNcblxuZnVuY3Rpb24gdmVyaWZ5IChzaWcsIGhhc2gsIGtleSwgc2lnblR5cGUpIHtcbiAgdmFyIHB1YiA9IHBhcnNlS2V5cyhrZXkpXG4gIGlmIChwdWIudHlwZSA9PT0gJ2VjJykge1xuICAgIGlmIChzaWduVHlwZSAhPT0gJ2VjZHNhJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cm9uZyBwdWJsaWMga2V5IHR5cGUnKVxuICAgIH1cbiAgICByZXR1cm4gZWNWZXJpZnkoc2lnLCBoYXNoLCBwdWIpXG4gIH0gZWxzZSBpZiAocHViLnR5cGUgPT09ICdkc2EnKSB7XG4gICAgaWYgKHNpZ25UeXBlICE9PSAnZHNhJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cm9uZyBwdWJsaWMga2V5IHR5cGUnKVxuICAgIH1cbiAgICByZXR1cm4gZHNhVmVyaWZ5KHNpZywgaGFzaCwgcHViKVxuICB9IGVsc2Uge1xuICAgIGlmIChzaWduVHlwZSAhPT0gJ3JzYScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd3JvbmcgcHVibGljIGtleSB0eXBlJylcbiAgICB9XG4gIH1cbiAgdmFyIGxlbiA9IHB1Yi5tb2R1bHVzLmJ5dGVMZW5ndGgoKVxuICB2YXIgcGFkID0gWyAxIF1cbiAgdmFyIHBhZE51bSA9IDBcbiAgd2hpbGUgKGhhc2gubGVuZ3RoICsgcGFkLmxlbmd0aCArIDIgPCBsZW4pIHtcbiAgICBwYWQucHVzaCgweGZmKVxuICAgIHBhZE51bSsrXG4gIH1cbiAgcGFkLnB1c2goMHgwMClcbiAgdmFyIGkgPSAtMVxuICB3aGlsZSAoKytpIDwgaGFzaC5sZW5ndGgpIHtcbiAgICBwYWQucHVzaChoYXNoW2ldKVxuICB9XG4gIHBhZCA9IG5ldyBCdWZmZXIocGFkKVxuICB2YXIgcmVkID0gQk4ubW9udChwdWIubW9kdWx1cylcbiAgc2lnID0gbmV3IEJOKHNpZykudG9SZWQocmVkKVxuXG4gIHNpZyA9IHNpZy5yZWRQb3cobmV3IEJOKHB1Yi5wdWJsaWNFeHBvbmVudCkpXG5cbiAgc2lnID0gbmV3IEJ1ZmZlcihzaWcuZnJvbVJlZCgpLnRvQXJyYXkoKSlcbiAgdmFyIG91dCA9IDBcbiAgaWYgKHBhZE51bSA8IDgpIHtcbiAgICBvdXQgPSAxXG4gIH1cbiAgbGVuID0gTWF0aC5taW4oc2lnLmxlbmd0aCwgcGFkLmxlbmd0aClcbiAgaWYgKHNpZy5sZW5ndGggIT09IHBhZC5sZW5ndGgpIHtcbiAgICBvdXQgPSAxXG4gIH1cblxuICBpID0gLTFcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIG91dCB8PSAoc2lnW2ldIF4gcGFkW2ldKVxuICB9XG4gIHJldHVybiBvdXQgPT09IDBcbn1cblxuZnVuY3Rpb24gZWNWZXJpZnkgKHNpZywgaGFzaCwgcHViKSB7XG4gIHZhciBjdXJ2ZUlkID0gY3VydmVzW3B1Yi5kYXRhLmFsZ29yaXRobS5jdXJ2ZS5qb2luKCcuJyldXG4gIGlmICghY3VydmVJZCkgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGN1cnZlICcgKyBwdWIuZGF0YS5hbGdvcml0aG0uY3VydmUuam9pbignLicpKVxuXG4gIHZhciBjdXJ2ZSA9IG5ldyBFQyhjdXJ2ZUlkKVxuICB2YXIgcHVia2V5ID0gcHViLmRhdGEuc3ViamVjdFByaXZhdGVLZXkuZGF0YVxuXG4gIHJldHVybiBjdXJ2ZS52ZXJpZnkoaGFzaCwgc2lnLCBwdWJrZXkpXG59XG5cbmZ1bmN0aW9uIGRzYVZlcmlmeSAoc2lnLCBoYXNoLCBwdWIpIHtcbiAgdmFyIHAgPSBwdWIuZGF0YS5wXG4gIHZhciBxID0gcHViLmRhdGEucVxuICB2YXIgZyA9IHB1Yi5kYXRhLmdcbiAgdmFyIHkgPSBwdWIuZGF0YS5wdWJfa2V5XG4gIHZhciB1bnBhY2tlZCA9IHBhcnNlS2V5cy5zaWduYXR1cmUuZGVjb2RlKHNpZywgJ2RlcicpXG4gIHZhciBzID0gdW5wYWNrZWQuc1xuICB2YXIgciA9IHVucGFja2VkLnJcbiAgY2hlY2tWYWx1ZShzLCBxKVxuICBjaGVja1ZhbHVlKHIsIHEpXG4gIHZhciBtb250cCA9IEJOLm1vbnQocClcbiAgdmFyIHcgPSBzLmludm0ocSlcbiAgdmFyIHYgPSBnLnRvUmVkKG1vbnRwKVxuICAgIC5yZWRQb3cobmV3IEJOKGhhc2gpLm11bCh3KS5tb2QocSkpXG4gICAgLmZyb21SZWQoKVxuICAgIC5tdWwoXG4gICAgICB5LnRvUmVkKG1vbnRwKVxuICAgICAgICAucmVkUG93KHIubXVsKHcpLm1vZChxKSlcbiAgICAgICAgLmZyb21SZWQoKVxuICApLm1vZChwKS5tb2QocSlcbiAgcmV0dXJuICF2LmNtcChyKVxufVxuXG5mdW5jdGlvbiBjaGVja1ZhbHVlIChiLCBxKSB7XG4gIGlmIChiLmNtcG4oMCkgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWcnKVxuICB9XG4gIGlmIChiLmNtcChxKSA+PSBxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZycpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2ZXJpZnlcbiIsInZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7IC8vIGZvciB1c2Ugd2l0aCBicm93c2VyaWZ5XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nKSByZXR1cm4gYS5lcXVhbHMoYik7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHhvciAoYSwgYikge1xuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICB2YXIgYnVmZmVyID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGJ1ZmZlcltpXSA9IGFbaV0gXiBiW2ldXG4gIH1cblxuICByZXR1cm4gYnVmZmVyXG59XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbnZhciByb290UGFyZW50ID0ge31cblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuZm9vID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgLy8gQXZvaWQgZ29pbmcgdGhyb3VnaCBhbiBBcmd1bWVudHNBZGFwdG9yVHJhbXBvbGluZSBpbiB0aGUgY29tbW9uIGNhc2UuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGFyZ3VtZW50c1sxXSlcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcpXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpcy5sZW5ndGggPSAwXG4gICAgdGhpcy5wYXJlbnQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZnJvbU51bWJlcih0aGlzLCBhcmcpXG4gIH1cblxuICAvLyBTbGlnaHRseSBsZXNzIGNvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGlzLCBhcmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogJ3V0ZjgnKVxuICB9XG5cbiAgLy8gVW51c3VhbC5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhpcywgYXJnKVxufVxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tTnVtYmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChsZW5ndGgpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIC8vIEFzc3VtcHRpb246IGJ5dGVMZW5ndGgoKSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIDwga01heExlbmd0aC5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG5cbiAgdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmplY3QpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpKSByZXR1cm4gZnJvbUJ1ZmZlcih0aGF0LCBvYmplY3QpXG5cbiAgaWYgKGlzQXJyYXkob2JqZWN0KSkgcmV0dXJuIGZyb21BcnJheSh0aGF0LCBvYmplY3QpXG5cbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBzdGFydCB3aXRoIG51bWJlciwgYnVmZmVyLCBhcnJheSBvciBzdHJpbmcnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAob2JqZWN0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gZnJvbVR5cGVkQXJyYXkodGhhdCwgb2JqZWN0KVxuICAgIH1cbiAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgb2JqZWN0KVxuICAgIH1cbiAgfVxuXG4gIGlmIChvYmplY3QubGVuZ3RoKSByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmplY3QpXG5cbiAgcmV0dXJuIGZyb21Kc29uT2JqZWN0KHRoYXQsIG9iamVjdClcbn1cblxuZnVuY3Rpb24gZnJvbUJ1ZmZlciAodGhhdCwgYnVmZmVyKSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGJ1ZmZlci5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBidWZmZXIuY29weSh0aGF0LCAwLCAwLCBsZW5ndGgpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8vIER1cGxpY2F0ZSBvZiBmcm9tQXJyYXkoKSB0byBrZWVwIGZyb21BcnJheSgpIG1vbm9tb3JwaGljLlxuZnVuY3Rpb24gZnJvbVR5cGVkQXJyYXkgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIC8vIFRydW5jYXRpbmcgdGhlIGVsZW1lbnRzIGlzIHByb2JhYmx5IG5vdCB3aGF0IHBlb3BsZSBleHBlY3QgZnJvbSB0eXBlZFxuICAvLyBhcnJheXMgd2l0aCBCWVRFU19QRVJfRUxFTUVOVCA+IDEgYnV0IGl0J3MgY29tcGF0aWJsZSB3aXRoIHRoZSBiZWhhdmlvclxuICAvLyBvZiB0aGUgb2xkIEJ1ZmZlciBjb25zdHJ1Y3Rvci5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXkpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbVR5cGVkQXJyYXkodGhhdCwgbmV3IFVpbnQ4QXJyYXkoYXJyYXkpKVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vLyBEZXNlcmlhbGl6ZSB7IHR5cGU6ICdCdWZmZXInLCBkYXRhOiBbMSwyLDMsLi4uXSB9IGludG8gYSBCdWZmZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHplcm8tbGVuZ3RoIGJ1ZmZlciBmb3IgaW5wdXRzIHRoYXQgZG9uJ3QgY29uZm9ybSB0byB0aGUgc3BlYy5cbmZ1bmN0aW9uIGZyb21Kc29uT2JqZWN0ICh0aGF0LCBvYmplY3QpIHtcbiAgdmFyIGFycmF5XG4gIHZhciBsZW5ndGggPSAwXG5cbiAgaWYgKG9iamVjdC50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iamVjdC5kYXRhKSkge1xuICAgIGFycmF5ID0gb2JqZWN0LmRhdGFcbiAgICBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIH1cbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn0gZWxzZSB7XG4gIC8vIHByZS1zZXQgZm9yIHZhbHVlcyB0aGF0IG1heSBleGlzdCBpbiB0aGUgZnV0dXJlXG4gIEJ1ZmZlci5wcm90b3R5cGUubGVuZ3RoID0gdW5kZWZpbmVkXG4gIEJ1ZmZlci5wcm90b3R5cGUucGFyZW50ID0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGFsbG9jYXRlICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHZhciBmcm9tUG9vbCA9IGxlbmd0aCAhPT0gMCAmJiBsZW5ndGggPD0gQnVmZmVyLnBvb2xTaXplID4+PiAxXG4gIGlmIChmcm9tUG9vbCkgdGhhdC5wYXJlbnQgPSByb290UGFyZW50XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChzdWJqZWN0LCBlbmNvZGluZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2xvd0J1ZmZlcikpIHJldHVybiBuZXcgU2xvd0J1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcbiAgZGVsZXRlIGJ1Zi5wYXJlbnRcbiAgcmV0dXJuIGJ1ZlxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAncmF3JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignbGlzdCBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMuJylcblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldXG4gICAgaXRlbS5jb3B5KGJ1ZiwgcG9zKVxuICAgIHBvcyArPSBpdGVtLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHN0cmluZyA9ICcnICsgc3RyaW5nXG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAvLyBEZXByZWNhdGVkXG4gICAgICBjYXNlICdyYXcnOlxuICAgICAgY2FzZSAncmF3cyc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgc3RhcnQgPSBzdGFydCB8IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID09PSBJbmZpbml0eSA/IHRoaXMubGVuZ3RoIDogZW5kIHwgMFxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG4gIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiAnJ1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGJpbmFyeVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICBieXRlT2Zmc2V0ID4+PSAwXG5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gdGhpcy5sZW5ndGgpIHJldHVybiAtMVxuXG4gIC8vIE5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gTWF0aC5tYXgodGhpcy5sZW5ndGggKyBieXRlT2Zmc2V0LCAwKVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSByZXR1cm4gLTEgLy8gc3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcgYWx3YXlzIGZhaWxzXG4gICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgWyB2YWwgXSwgYnl0ZU9mZnNldClcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yICh2YXIgaSA9IDA7IGJ5dGVPZmZzZXQgKyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyW2J5dGVPZmZzZXQgKyBpXSA9PT0gdmFsW2ZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4XSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbC5sZW5ndGgpIHJldHVybiBieXRlT2Zmc2V0ICsgZm91bmRJbmRleFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiaW5hcnlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdmFyIHN3YXAgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgb2Zmc2V0ID0gbGVuZ3RoIHwgMFxuICAgIGxlbmd0aCA9IHN3YXBcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdhdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBiaW5hcnlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgaSsrKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICBpZiAobmV3QnVmLmxlbmd0aCkgbmV3QnVmLnBhcmVudCA9IHRoaXMucGFyZW50IHx8IHRoaXNcblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J1ZmZlciBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSB2YWx1ZSA8IDAgPyAxIDogMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IHZhbHVlIDwgMCA/IDEgOiAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIGZpbGwodmFsdWUsIHN0YXJ0PTAsIGVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCF2YWx1ZSkgdmFsdWUgPSAwXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCkgZW5kID0gdGhpcy5sZW5ndGhcblxuICBpZiAoZW5kIDwgc3RhcnQpIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmQgPCBzdGFydCcpXG5cbiAgLy8gRmlsbCAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IHZhbHVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IHV0ZjhUb0J5dGVzKHZhbHVlLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbmZ1bmN0aW9uIGluaXQgKCkge1xuICB2YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbiAgfVxuXG4gIHJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxuICByZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcbn1cblxuaW5pdCgpXG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgLy8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gIC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2VcbiAgcGxhY2VIb2xkZXJzID0gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxuXG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIFwiMTAwXCI6IFwiQ29udGludWVcIixcbiAgXCIxMDFcIjogXCJTd2l0Y2hpbmcgUHJvdG9jb2xzXCIsXG4gIFwiMTAyXCI6IFwiUHJvY2Vzc2luZ1wiLFxuICBcIjIwMFwiOiBcIk9LXCIsXG4gIFwiMjAxXCI6IFwiQ3JlYXRlZFwiLFxuICBcIjIwMlwiOiBcIkFjY2VwdGVkXCIsXG4gIFwiMjAzXCI6IFwiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb25cIixcbiAgXCIyMDRcIjogXCJObyBDb250ZW50XCIsXG4gIFwiMjA1XCI6IFwiUmVzZXQgQ29udGVudFwiLFxuICBcIjIwNlwiOiBcIlBhcnRpYWwgQ29udGVudFwiLFxuICBcIjIwN1wiOiBcIk11bHRpLVN0YXR1c1wiLFxuICBcIjIwOFwiOiBcIkFscmVhZHkgUmVwb3J0ZWRcIixcbiAgXCIyMjZcIjogXCJJTSBVc2VkXCIsXG4gIFwiMzAwXCI6IFwiTXVsdGlwbGUgQ2hvaWNlc1wiLFxuICBcIjMwMVwiOiBcIk1vdmVkIFBlcm1hbmVudGx5XCIsXG4gIFwiMzAyXCI6IFwiRm91bmRcIixcbiAgXCIzMDNcIjogXCJTZWUgT3RoZXJcIixcbiAgXCIzMDRcIjogXCJOb3QgTW9kaWZpZWRcIixcbiAgXCIzMDVcIjogXCJVc2UgUHJveHlcIixcbiAgXCIzMDdcIjogXCJUZW1wb3JhcnkgUmVkaXJlY3RcIixcbiAgXCIzMDhcIjogXCJQZXJtYW5lbnQgUmVkaXJlY3RcIixcbiAgXCI0MDBcIjogXCJCYWQgUmVxdWVzdFwiLFxuICBcIjQwMVwiOiBcIlVuYXV0aG9yaXplZFwiLFxuICBcIjQwMlwiOiBcIlBheW1lbnQgUmVxdWlyZWRcIixcbiAgXCI0MDNcIjogXCJGb3JiaWRkZW5cIixcbiAgXCI0MDRcIjogXCJOb3QgRm91bmRcIixcbiAgXCI0MDVcIjogXCJNZXRob2QgTm90IEFsbG93ZWRcIixcbiAgXCI0MDZcIjogXCJOb3QgQWNjZXB0YWJsZVwiLFxuICBcIjQwN1wiOiBcIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCIsXG4gIFwiNDA4XCI6IFwiUmVxdWVzdCBUaW1lb3V0XCIsXG4gIFwiNDA5XCI6IFwiQ29uZmxpY3RcIixcbiAgXCI0MTBcIjogXCJHb25lXCIsXG4gIFwiNDExXCI6IFwiTGVuZ3RoIFJlcXVpcmVkXCIsXG4gIFwiNDEyXCI6IFwiUHJlY29uZGl0aW9uIEZhaWxlZFwiLFxuICBcIjQxM1wiOiBcIlBheWxvYWQgVG9vIExhcmdlXCIsXG4gIFwiNDE0XCI6IFwiVVJJIFRvbyBMb25nXCIsXG4gIFwiNDE1XCI6IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiLFxuICBcIjQxNlwiOiBcIlJhbmdlIE5vdCBTYXRpc2ZpYWJsZVwiLFxuICBcIjQxN1wiOiBcIkV4cGVjdGF0aW9uIEZhaWxlZFwiLFxuICBcIjQxOFwiOiBcIkknbSBhIHRlYXBvdFwiLFxuICBcIjQyMVwiOiBcIk1pc2RpcmVjdGVkIFJlcXVlc3RcIixcbiAgXCI0MjJcIjogXCJVbnByb2Nlc3NhYmxlIEVudGl0eVwiLFxuICBcIjQyM1wiOiBcIkxvY2tlZFwiLFxuICBcIjQyNFwiOiBcIkZhaWxlZCBEZXBlbmRlbmN5XCIsXG4gIFwiNDI1XCI6IFwiVW5vcmRlcmVkIENvbGxlY3Rpb25cIixcbiAgXCI0MjZcIjogXCJVcGdyYWRlIFJlcXVpcmVkXCIsXG4gIFwiNDI4XCI6IFwiUHJlY29uZGl0aW9uIFJlcXVpcmVkXCIsXG4gIFwiNDI5XCI6IFwiVG9vIE1hbnkgUmVxdWVzdHNcIixcbiAgXCI0MzFcIjogXCJSZXF1ZXN0IEhlYWRlciBGaWVsZHMgVG9vIExhcmdlXCIsXG4gIFwiNTAwXCI6IFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCIsXG4gIFwiNTAxXCI6IFwiTm90IEltcGxlbWVudGVkXCIsXG4gIFwiNTAyXCI6IFwiQmFkIEdhdGV3YXlcIixcbiAgXCI1MDNcIjogXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCIsXG4gIFwiNTA0XCI6IFwiR2F0ZXdheSBUaW1lb3V0XCIsXG4gIFwiNTA1XCI6IFwiSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWRcIixcbiAgXCI1MDZcIjogXCJWYXJpYW50IEFsc28gTmVnb3RpYXRlc1wiLFxuICBcIjUwN1wiOiBcIkluc3VmZmljaWVudCBTdG9yYWdlXCIsXG4gIFwiNTA4XCI6IFwiTG9vcCBEZXRlY3RlZFwiLFxuICBcIjUwOVwiOiBcIkJhbmR3aWR0aCBMaW1pdCBFeGNlZWRlZFwiLFxuICBcIjUxMFwiOiBcIk5vdCBFeHRlbmRlZFwiLFxuICBcIjUxMVwiOiBcIk5ldHdvcmsgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIlxufVxuIiwidmFyIGJhc2UgPSByZXF1aXJlKCd0eXBld2lzZS1jb3JlL2Jhc2UnKVxudmFyIGNvZGVjcyA9IHJlcXVpcmUoJy4vY29kZWNzJylcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJylcblxuLy9cbi8vIGV4dGVuZCBjb3JlIHNvcnRzIGRlZmluZWQgYnkgdHlwZXdpc2Ugd2l0aCBieXRld2lzZS1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5XG4vL1xuXG4vLyBieXRlIHJlcHJlc2VudHMgYnl0ZSB0YWcgcHJlZml4IGluIGVuY29kZWQgZm9ybSwgZW5mb3JjaW5nIGJpbmFyeSB0b3RhbCBvcmRlclxuLy8gdHlwZSB0YWcgaXMgMSBieXRlLCB3aGljaCBnaXZlcyB1cyBwbGVudHkgb2Ygcm9vbSB0byBncm93XG5cbi8vXG4vLyBib3VuZGFyeSB0eXBlc1xuLy9cbmJhc2UuYm91bmQuZW5jb2RlID0gdXRpbC5lbmNvZGVCYXNlQm91bmRcblxuLy9cbi8vIHZhbHVlIHR5cGVzXG4vL1xudmFyIHNvcnRzID0gYmFzZS5zb3J0c1xuXG5zb3J0cy52b2lkLmJ5dGUgPSAweGYwXG5cbnNvcnRzLm51bGwuYnl0ZSA9IDB4MTBcblxuXG52YXIgQk9PTEVBTiA9IHNvcnRzLmJvb2xlYW5cbkJPT0xFQU4uc29ydHMuZmFsc2UuYnl0ZSA9IDB4MjBcbkJPT0xFQU4uc29ydHMudHJ1ZS5ieXRlID0gMHgyMVxuQk9PTEVBTi5ib3VuZC5lbmNvZGUgPSB1dGlsLmVuY29kZUJvdW5kXG5cblxudmFyIE5VTUJFUiA9IHNvcnRzLm51bWJlclxuTlVNQkVSLnNvcnRzLm1pbi5ieXRlID0gMHg0MFxuTlVNQkVSLnNvcnRzLm5lZ2F0aXZlLmJ5dGUgPSAweDQxXG5OVU1CRVIuc29ydHMucG9zaXRpdmUuYnl0ZSA9IDB4NDJcbk5VTUJFUi5zb3J0cy5tYXguYnl0ZSA9IDB4NDNcbk5VTUJFUi5zb3J0cy5uZWdhdGl2ZS5jb2RlYyA9IGNvZGVjcy5ORUdBVElWRV9GTE9BVFxuTlVNQkVSLnNvcnRzLnBvc2l0aXZlLmNvZGVjID0gY29kZWNzLlBPU0lUSVZFX0ZMT0FUXG5OVU1CRVIuYm91bmQuZW5jb2RlID0gdXRpbC5lbmNvZGVCb3VuZFxuXG5cbnZhciBEQVRFID0gc29ydHMuZGF0ZVxuREFURS5zb3J0cy5uZWdhdGl2ZS5ieXRlID0gMHg1MVxuREFURS5zb3J0cy5wb3NpdGl2ZS5ieXRlID0gMHg1MlxuREFURS5zb3J0cy5uZWdhdGl2ZS5jb2RlYyA9IGNvZGVjcy5QUkVfRVBPQ0hfREFURVxuREFURS5zb3J0cy5wb3NpdGl2ZS5jb2RlYyA9IGNvZGVjcy5QT1NUX0VQT0NIX0RBVEVcbkRBVEUuYm91bmQuZW5jb2RlID0gdXRpbC5lbmNvZGVCb3VuZFxuXG5cbnZhciBCSU5BUlkgPSBzb3J0cy5iaW5hcnlcbkJJTkFSWS5ieXRlID0gMHg2MFxuQklOQVJZLmNvZGVjID0gY29kZWNzLlVJTlQ4XG5CSU5BUlkuYm91bmQuZW5jb2RlID0gdXRpbC5lbmNvZGVCb3VuZFxuXG5cbnZhciBTVFJJTkcgPSBzb3J0cy5zdHJpbmdcblNUUklORy5ieXRlID0gMHg3MFxuU1RSSU5HLmNvZGVjID0gY29kZWNzLlVURjhcblNUUklORy5ib3VuZC5lbmNvZGUgPSB1dGlsLmVuY29kZUJvdW5kXG5cblxudmFyIEFSUkFZID0gc29ydHMuYXJyYXlcbkFSUkFZLmJ5dGUgPSAweGEwXG5BUlJBWS5jb2RlYyA9IGNvZGVjcy5MSVNUXG5BUlJBWS5ib3VuZC5lbmNvZGUgPSB1dGlsLmVuY29kZUxpc3RCb3VuZFxuXG5cbi8vIHZhciBPQkpFQ1QgPSBzb3J0cy5vYmplY3Rcbi8vIE9CSkVDVC5ieXRlID0gMHhiMFxuLy8gT0JKRUNULmNvZGVjID0gY29kZWNzLkhBU0hcbi8vIE9CSkVDVC5ib3VuZC5lbmNvZGUgPSB1dGlsLmVuY29kZUxpc3RCb3VuZFxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VcbiIsInZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJylcblxudmFyIEZMT0FUX0xFTkdUSCA9IDhcblxuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlXG59XG5cbmZ1bmN0aW9uIHNob3J0bGV4RW5jb2RlKGNvZGVjKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc291cmNlLCBiYXNlKSB7XG4gICAgLy8gc3R1cGlkIGxhenkgaW1wbGVtZW50YXRpb25cbiAgICAvLyBUT0RPOiBhbGxvdyBsZW5ndGggZ2V0dGVyIHRvIGJlIHByb3ZpZGVkXG4gICAgdmFyIGxlbmd0aCA9IHV0aWwuZW5jb2RlRmxvYXQoc291cmNlLmxlbmd0aClcbiAgICB2YXIgYm9keSA9IGNvZGVjLmVuY29kZShzb3VyY2UsIGJhc2UpXG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoWyBsZW5ndGgsIGJvZHkgXSlcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG9ydGxleERlY29kZShjb2RlYykge1xuICByZXR1cm4gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgIC8vIHN0dXBpZCBsYXp5IGltcGxlbWVudGF0aW9uXG4gICAgcmV0dXJuIGNvZGVjLmRlY29kZSh0aGlzLCBidWZmZXIuc2xpY2UoRkxPQVRfTEVOR1RIKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG9ydGxleFBhcnNlKGNvZGVjKSB7XG4gIC8vIFRPRE9cbiAgcmV0dXJuIGZ1bmN0aW9uIChidWZmZXIsIGJhc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05ZSScpXG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvcnRsZXgoY29kZWMpIHtcbiAgcmV0dXJuIHtcbiAgICBlbmNvZGU6IHNob3J0bGV4RW5jb2RlKGNvZGVjKSxcbiAgICBkZWNvZGU6IHNob3J0bGV4RGVjb2RlKGNvZGVjKSxcbiAgICBwYXJzZTogc2hvcnRsZXhQYXJzZShjb2RlYylcbiAgfVxufVxuXG4vL1xuLy8gcGFpcnMgb2YgZW5jb2RlL2RlY29kZSBmdW5jdGlvbnNcbi8vXG52YXIgY29kZWNzID0gZXhwb3J0c1xuXG5jb2RlY3MuSEVYID0ge1xuICBlbmNvZGU6IGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihzb3VyY2UsICdoZXgnKVxuICB9LFxuICBkZWNvZGU6IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCdoZXgnKVxuICB9XG59XG5cbmNvZGVjcy5VSU5UOCA9IHtcbiAgZW5jb2RlOiBpZGVudGl0eSxcbiAgZGVjb2RlOiBpZGVudGl0eSxcbiAgZXNjYXBlOiB1dGlsLmVzY2FwZUZsYXQsXG4gIHVuZXNjYXBlOiB1dGlsLnVuZXNjYXBlRmxhdFxufVxuXG5jb2RlY3MuVUlOVDhfU0hPUlRMRVggPSBzaG9ydGxleChjb2RlY3MuVUlOVDgpXG5cbmNvZGVjcy5VVEY4ID0ge1xuICBlbmNvZGU6IGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihzb3VyY2UsICd1dGY4JylcbiAgfSxcbiAgZGVjb2RlOiBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygndXRmOCcpXG4gIH0sXG4gIGVzY2FwZTogdXRpbC5lc2NhcGVGbGF0TG93LFxuICB1bmVzY2FwZTogdXRpbC51bmVzY2FwZUZsYXRMb3dcbn1cblxuY29kZWNzLlVURjhfU0hPUlRMRVggPSBzaG9ydGxleChjb2RlY3MuVVRGOClcblxuY29kZWNzLlBPU0lUSVZFX0ZMT0FUID0ge1xuICBsZW5ndGg6IEZMT0FUX0xFTkdUSCxcbiAgZW5jb2RlOiB1dGlsLmVuY29kZUZsb2F0LFxuICBkZWNvZGU6IHV0aWwuZGVjb2RlRmxvYXRcbn1cblxuY29kZWNzLk5FR0FUSVZFX0ZMT0FUID0ge1xuICBsZW5ndGg6IEZMT0FUX0xFTkdUSCxcbiAgZW5jb2RlOiB1dGlsLmVuY29kZUZsb2F0LFxuICBkZWNvZGU6IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICByZXR1cm4gdXRpbC5kZWNvZGVGbG9hdChidWZmZXIsIG51bGwsIHRydWUpXG4gIH1cbn1cblxuY29kZWNzLlBPU1RfRVBPQ0hfREFURSA9IHtcbiAgbGVuZ3RoOiBGTE9BVF9MRU5HVEgsXG4gIGVuY29kZTogdXRpbC5lbmNvZGVGbG9hdCxcbiAgZGVjb2RlOiBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHV0aWwuZGVjb2RlRmxvYXQoYnVmZmVyKSlcbiAgfVxufVxuXG5jb2RlY3MuUFJFX0VQT0NIX0RBVEUgPSB7XG4gIGxlbmd0aDogRkxPQVRfTEVOR1RILFxuICBlbmNvZGU6IHV0aWwuZW5jb2RlRmxvYXQsXG4gIGRlY29kZTogZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgIHJldHVybiBuZXcgRGF0ZSh1dGlsLmRlY29kZUZsb2F0KGJ1ZmZlciwgbnVsbCwgdHJ1ZSkpXG4gIH1cbn1cblxuLy9cbi8vIGJhc2UgZW5jb2RpbmcgZm9yIGNvbXBsZXggc3RydWN0dXJlc1xuLy9cbmNvZGVjcy5MSVNUID0ge1xuICBlbmNvZGU6IHV0aWwuZW5jb2RlTGlzdCxcbiAgZGVjb2RlOiB1dGlsLmRlY29kZUxpc3Rcbn1cblxuY29kZWNzLlRVUExFID0gc2hvcnRsZXgoY29kZWNzLkxJU1QpXG5cbi8vXG4vLyBtZW1iZXIgb3JkZXIgaXMgcHJlc2VydmVkIGFuZCBhY2NvdW50ZWQgZm9yIGluIHNvcnQgKGV4Y2VwdCBmb3IgbnVtYmVyIGtleXMpXG4vL1xuY29kZWNzLkhBU0ggPSB7XG4gIC8vIFRPRE9cbiAgLy8gZW5jb2RlOiB1dGlsLmVuY29kZUhhc2gsXG4gIC8vIGRlY29kZTogdXRpbC5kZWNvZGVIYXNoXG59XG5cbmNvZGVjcy5SRUNPUkQgPSBzaG9ydGxleChjb2RlY3MuSEFTSClcbiIsInZhciBhc3NlcnQgPSByZXF1aXJlKCcuL3V0aWwnKS5hc3NlcnRcbnZhciBiYXNlID0gcmVxdWlyZSgnLi9iYXNlJylcbnZhciBjb2RlY3MgPSByZXF1aXJlKCcuL2NvZGVjcycpXG5cbnZhciBieXRld2lzZSA9IGV4cG9ydHNcblxuLy9cbi8vIGV4cG9zZSB0eXBlIGluZm9ybWF0aW9uXG4vL1xudmFyIHNvcnRzID0gYnl0ZXdpc2Uuc29ydHMgPSBiYXNlLnNvcnRzXG5ieXRld2lzZS5ib3VuZCA9IGJhc2UuYm91bmRcbmJ5dGV3aXNlLmNvbXBhcmUgPSBiYXNlLmNvbXBhcmVcbmJ5dGV3aXNlLmVxdWFsID0gYmFzZS5lcXVhbFxuXG4vL1xuLy8gZ2VuZXJhdGUgYSBidWZmZXIgd2l0aCB0eXBlJ3MgYnl0ZSBwcmVmaXggZnJvbSBzb3VyY2UgdmFsdWVcbi8vXG5mdW5jdGlvbiBzZXJpYWxpemUodHlwZSwgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBjb2RlYyA9IHR5cGUuY29kZWNcbiAgaWYgKCFjb2RlYylcbiAgICByZXR1cm4gcG9zdEVuY29kZShuZXcgQnVmZmVyKFsgdHlwZS5ieXRlIF0pLCBvcHRpb25zKVxuXG4gIHZhciBidWZmZXIgPSBjb2RlYy5lbmNvZGUoc291cmNlLCBieXRld2lzZSlcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLm5lc3RlZCAmJiBjb2RlYy5lc2NhcGUpXG4gICAgYnVmZmVyID0gY29kZWMuZXNjYXBlKGJ1ZmZlcilcblxuICB2YXIgaGludCA9IHR5cGVvZiBjb2RlYy5sZW5ndGggPT09ICdudW1iZXInID8gKGNvZGVjLmxlbmd0aCArIDEpIDogdm9pZCAwIFxuICB2YXIgYnVmZmVycyA9IFsgbmV3IEJ1ZmZlcihbIHR5cGUuYnl0ZSBdKSwgYnVmZmVyIF1cbiAgcmV0dXJuIHBvc3RFbmNvZGUoQnVmZmVyLmNvbmNhdChidWZmZXJzLCBoaW50KSwgb3B0aW9ucylcbn1cblxuLy9cbi8vIGNvcmUgZW5jb2RlIGxvZ2ljXG4vL1xuYnl0ZXdpc2UuZW5jb2RlID0gZnVuY3Rpb24oc291cmNlLCBvcHRpb25zKSB7XG5cbiAgLy8gY2hlY2sgZm9yIGludmFsaWQvaW5jb21wYXJhYmxlIHZhbHVlc1xuICBhc3NlcnQoIWJhc2UuaW52YWxpZChzb3VyY2UpLCAnSW52YWxpZCB2YWx1ZScpXG5cbiAgLy8gZW5jb2RlIGJvdW5kIHR5cGVzIChyYW5nZXMpXG4gIHZhciBib3VuZGFyeSA9IGJhc2UuYm91bmQuZ2V0Qm91bmRhcnkoc291cmNlKVxuICBpZiAoYm91bmRhcnkpXG4gICAgcmV0dXJuIGJvdW5kYXJ5LmVuY29kZShzb3VyY2UsIGJ5dGV3aXNlKVxuXG4gIC8vIGVuY29kZSBzdGFuZGFyZCB2YWx1ZS10eXBlZCBzb3J0c1xuICB2YXIgb3JkZXIgPSBiYXNlLm9yZGVyXG4gIHZhciBzb3J0XG4gIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBvcmRlci5sZW5ndGg7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHNvcnQgPSBzb3J0c1tvcmRlcltpXV1cblxuICAgIGlmIChzb3J0LmlzKHNvdXJjZSkpIHtcblxuICAgICAgLy8gbG9vcCBvdmVyIGFueSBzdWJzb3J0cyBkZWZpbmVkIG9uIHNvcnRcbiAgICAgIC8vIFRPRE86IGNsZWFuIHVwXG4gICAgICB2YXIgc3Vic29ydHMgPSBzb3J0LnNvcnRzIHx8ICB7ICcnOiBzb3J0IH1cbiAgICAgIGZvciAoa2V5IGluIHN1YnNvcnRzKSB7XG4gICAgICAgIHZhciBzdWJzb3J0ID0gc3Vic29ydHNba2V5XVxuICAgICAgICBpZiAoc3Vic29ydC5pcyhzb3VyY2UpKSBcbiAgICAgICAgICByZXR1cm4gc2VyaWFsaXplKHN1YnNvcnQsIHNvdXJjZSwgb3B0aW9ucylcbiAgICAgIH1cblxuICAgICAgLy8gc291cmNlIGlzIGFuIHVuc3VwcG9ydGVkIHN1YnNvcnRcbiAgICAgIGFzc2VydChmYWxzZSwgJ1Vuc3VwcG9ydGVkIHNvcnQgdmFsdWUnKVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vIHR5cGUgZGVzY3JpcHRvciBmb3VuZFxuICBhc3NlcnQoZmFsc2UsICdVbmtub3duIHZhbHVlJylcbn1cblxuLy9cbi8vIGNvcmUgZGVjb2RlIGxvZ2ljXG4vL1xuYnl0ZXdpc2UuZGVjb2RlID0gZnVuY3Rpb24gKGJ1ZmZlciwgb3B0aW9ucykge1xuICAvLyBhdHRlbXB0IHRvIGRlY29kZSBzdHJpbmcgaW5wdXQgdXNpbmcgY29uZmlndXJhYmxlIGNvZGVjXG4gIGlmICh0eXBlb2YgYnVmZmVyID09PSAnc3RyaW5nJykge1xuICAgIGJ1ZmZlciA9IGJ5dGV3aXNlLnN0cmluZ0NvZGVjLmVuY29kZShidWZmZXIpXG4gIH1cblxuICBhc3NlcnQoIWJ1ZmZlciB8fCAhYnVmZmVyLnVuZGVjb2RhYmxlLCAnRW5jb2RlZCB2YWx1ZSBub3QgZGVjb2RhYmxlJylcblxuICB2YXIgYnl0ZSA9IGJ1ZmZlclswXVxuICB2YXIgdHlwZSA9IGJ5dGV3aXNlLmdldFR5cGUoYnl0ZSlcbiAgYXNzZXJ0KHR5cGUsICdJbnZhbGlkIGVuY29kaW5nOiAnICsgYnVmZmVyKVxuXG4gIC8vIGlmIHR5cGUgcHJvdmlkZXMgYSBkZWNvZGVyIGl0IGlzIHBhc3NlZCB0aGUgYmFzZSB0eXBlIHN5c3RlbSBhcyBzZWNvbmQgYXJnXG4gIHZhciBjb2RlYyA9IHR5cGUuY29kZWNcbiAgaWYgKGNvZGVjKSB7XG4gICAgdmFyIGRlY29kZWQgPSBjb2RlYy5kZWNvZGUoYnVmZmVyLnNsaWNlKDEpLCBieXRld2lzZSlcblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubmVzdGVkICYmIGNvZGVjLnVuZXNjYXBlKVxuICAgICAgZGVjb2RlZCA9IGNvZGVjLnVuZXNjYXBlKGRlY29kZWQpXG5cbiAgICByZXR1cm4gcG9zdERlY29kZShkZWNvZGVkLCBvcHRpb25zKVxuICB9XG5cbiAgLy8gbnVsbGFyeSB0eXBlcyB3aXRob3V0IGEgY29kZWMgbXVzdCBwcm92aWRlIGEgdmFsdWUgZm9yIHRoZWlyIGRlY29kZWQgZm9ybVxuICBhc3NlcnQoJ3ZhbHVlJyBpbiB0eXBlLCAnVW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICcgKyBidWZmZXIpXG4gIHJldHVybiBwb3N0RGVjb2RlKHR5cGUudmFsdWUsIG9wdGlvbnMpXG59XG5cbi8vXG4vLyBwcm9jZXNzIHRvcCBsZXZlbFxuLy9cbmZ1bmN0aW9uIHBvc3RFbmNvZGUoZW5jb2RlZCwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gbnVsbClcbiAgICByZXR1cm4gZW5jb2RlZFxuXG4gIHJldHVybiBieXRld2lzZS5wb3N0RW5jb2RlKGVuY29kZWQsIG9wdGlvbnMpXG59XG5cbi8vXG4vLyBpbnZva2VkIGFmdGVyIGVuY29kaW5nIHdpdGggZW5jb2RlZCBidWZmZXIgaW5zdGFuY2Vcbi8vXG5ieXRld2lzZS5wb3N0RW5jb2RlID0gZnVuY3Rpb24gKGVuY29kZWQsIG9wdGlvbnMpIHtcblxuICAvLyBvdmVycmlkZSBidWZmZXIgdG9TdHJpbmcgbWV0aG9kIHRvIGRlZmF1bHQgdG8gaGV4IHRvIGhlbHAgY29lcmNpb24gaXNzdWVzXG4gIC8vIFRPRE86IGp1c3QgcmV0dXJuIHB1cmUgYnVmZmVyLCBkbyB0aGlzIHRvU3RyaW5nIGhhY2tlcnkgaW4gYnl0ZXdpc2VcbiAgZW5jb2RlZC50b1N0cmluZyA9IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICAgIGlmICghZW5jb2RpbmcpXG4gICAgICByZXR1cm4gYnl0ZXdpc2Uuc3RyaW5nQ29kZWMuZGVjb2RlKGVuY29kZWQpXG5cbiAgICByZXR1cm4gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZy5hcHBseShlbmNvZGVkLCBhcmd1bWVudHMpXG4gIH1cblxuICByZXR1cm4gZW5jb2RlZFxufVxuXG5mdW5jdGlvbiBwb3N0RGVjb2RlKGRlY29kZWQsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IG51bGwpXG4gICAgcmV0dXJuIGRlY29kZWRcblxuICByZXR1cm4gYnl0ZXdpc2UucG9zdERlY29kZShkZWNvZGVkLCBvcHRpb25zKVxufVxuXG4vL1xuLy8gaW52b2tlZCBhZnRlciBkZWNvZGluZyB3aXRoIGRlY29kZWQgdmFsdWVcbi8vXG5ieXRld2lzZS5wb3N0RGVjb2RlID0gZnVuY3Rpb24gKGRlY29kZWQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRlY29kZWRcbn1cblxuXG4vL1xuLy8gcmVnaXN0cnkgbWFwcGluZyBieXRlIHByZWZpeGVzIHRvIHR5cGUgZGVzY3JpcHRvcnNcbi8vXG52YXIgUFJFRklYX1JFR0lTVFJZXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyVHlwZSh0eXBlKSB7XG4gIHZhciBieXRlID0gdHlwZSAmJiB0eXBlLmJ5dGVcbiAgaWYgKGJ5dGUgPT0gbnVsbClcbiAgICByZXR1cm5cblxuICBpZiAoYnl0ZSBpbiBQUkVGSVhfUkVHSVNUUlkpXG4gICAgYXNzZXJ0LmRlZXBFcXVhbCh0eXBlLCBQUkVGSVhfUkVHSVNUUllbYnl0ZV0sICdEdXBsaWNhdGUgcHJlZml4OiAnICsgYnl0ZSlcblxuICBQUkVGSVhfUkVHSVNUUllbdHlwZS5ieXRlXSA9IHR5cGVcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJUeXBlcyh0eXBlcykge1xuICBmb3IgKHZhciBrZXkgaW4gdHlwZXMpIHtcbiAgICByZWdpc3RlclR5cGUodHlwZXNba2V5XSlcbiAgfVxufVxuXG4vL1xuLy8gbG9vayB1cCB0eXBlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYnl0ZSBwcmVmaXhcbi8vXG5ieXRld2lzZS5nZXRUeXBlID0gZnVuY3Rpb24gKGJ5dGUpIHtcblxuICAvLyBjb25zdHJ1Y3QgYW5kIG1lbW9pemUgYnl0ZSBwcmVmaXggcmVnaXN0cnkgb24gZmlyc3QgcnVuXG4gIGlmICghUFJFRklYX1JFR0lTVFJZKSB7XG4gICAgUFJFRklYX1JFR0lTVFJZID0ge31cblxuICAgIC8vIHJlZ2lzdGVyIHNvcnRzXG4gICAgdmFyIHNvcnRcbiAgICBmb3IgKHZhciBrZXkgaW4gc29ydHMpIHtcbiAgICAgIHNvcnQgPSBzb3J0c1trZXldXG5cbiAgICAgIC8vIGlmIHNvcnQgaGFzIHN1YnNvcnRzIHJlZ2lzdGVyIHRoZXNlIGluc3RlYWRcbiAgICAgIHNvcnQuc29ydHMgPyByZWdpc3RlclR5cGVzKHNvcnQuc29ydHMpIDogcmVnaXN0ZXJUeXBlKHNvcnQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFBSRUZJWF9SRUdJU1RSWVtieXRlXVxufVxuXG5ieXRld2lzZS5idWZmZXIgPSB0cnVlXG5ieXRld2lzZS5zdHJpbmdDb2RlYyA9IGNvZGVjcy5IRVhcbmJ5dGV3aXNlLnR5cGUgPSAnYnl0ZXdpc2UtY29yZSdcblxuIiwidmFyIHV0aWwgPSBleHBvcnRzXG5cbi8vXG4vLyBidWZmZXIgY29tcGFyZVxuLy9cbnV0aWwuY29tcGFyZSA9IHJlcXVpcmUoJ3R5cGV3aXNlLWNvcmUvY29sbGF0aW9uJykuYml0d2lzZVxuXG4vL1xuLy8gYnVmZmVyIGVxdWFsaXR5XG4vL1xudXRpbC5lcXVhbCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpXG4gICAgcmV0dXJuXG5cbiAgaWYgKGEgPT09IGIpXG4gICAgcmV0dXJuIHRydWVcblxuICBpZiAodHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiBhLmVxdWFscyhiKVxuXG4gIHJldHVybiB1dGlsLmNvbXBhcmUoYSwgYikgPT09IDBcbn1cblxudmFyIGFzc2VydCA9IHV0aWwuYXNzZXJ0ID0gZnVuY3Rpb24gKHRlc3QsIG1lc3NhZ2UpIHtcbiAgaWYgKCF0ZXN0KVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IobWVzc2FnZSlcbn1cblxudmFyIEZMT0FUX0xFTkdUSCA9IDhcblxudXRpbC5pbnZlcnRCeXRlcyA9IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgdmFyIGJ5dGVzID0gW11cbiAgZm9yICh2YXIgaSA9IDAsIGVuZCA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBlbmQ7ICsraSkge1xuICAgIGJ5dGVzLnB1c2gofmJ1ZmZlcltpXSlcbiAgfVxuXG4gIHJldHVybiBuZXcgQnVmZmVyKGJ5dGVzKVxufVxuXG51dGlsLmVuY29kZUZsb2F0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBidWZmZXIgPSBuZXcgQnVmZmVyKEZMT0FUX0xFTkdUSClcbiAgaWYgKHZhbHVlIDwgMCkge1xuICAgIC8vXG4gICAgLy8gd3JpdGUgbmVnYXRpdmUgbnVtYmVycyBhcyBuZWdhdGVkIHBvc2l0aXZlIHZhbHVlcyB0byBpbnZlcnQgYnl0ZXNcbiAgICAvL1xuICAgIGJ1ZmZlci53cml0ZURvdWJsZUJFKC12YWx1ZS52YWx1ZU9mKCksIDApXG4gICAgcmV0dXJuIHV0aWwuaW52ZXJ0Qnl0ZXMoYnVmZmVyKVxuICB9XG5cbiAgLy9cbiAgLy8gbm9ybWFsaXplIC0wIHZhbHVlcyB0byAwXG4gIC8vXG4gIGJ1ZmZlci53cml0ZURvdWJsZUJFKHZhbHVlLnZhbHVlT2YoKSB8fCAwLCAwKVxuICByZXR1cm4gYnVmZmVyXG59XG5cbnV0aWwuZGVjb2RlRmxvYXQgPSBmdW5jdGlvbiAoYnVmZmVyLCBiYXNlLCBuZWdhdGl2ZSkge1xuICBhc3NlcnQoYnVmZmVyLmxlbmd0aCA9PT0gRkxPQVRfTEVOR1RILCAnSW52YWxpZCBmbG9hdCBlbmNvZGluZyBsZW5ndGgnKVxuXG4gIGlmIChuZWdhdGl2ZSlcbiAgICBidWZmZXIgPSB1dGlsLmludmVydEJ5dGVzKGJ1ZmZlcilcblxuICB2YXIgdmFsdWUgPSBidWZmZXIucmVhZERvdWJsZUJFKDApXG4gIHJldHVybiBuZWdhdGl2ZSA/IC12YWx1ZSA6IHZhbHVlXG59XG5cbi8vXG4vLyBzaWdpbCBmb3IgY29udHJvbGxpbmcgdGhlIGVzY2FwZW1lbnQgZnVuY3Rpb25zIChUT0RPOiBjbGVhbiB0aGlzIHVwKVxuLy9cbnZhciBTS0lQX0hJR0hfQllURVMgPSB7fVxuXG51dGlsLmVzY2FwZUZsYXQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvcHRpb25zKSB7XG4gIC8vXG4gIC8vIGVzY2FwZSBoaWdoIGFuZCBsb3cgYnl0ZXMgMHgwMCBhbmQgMHhmZiAoYW5kIGJ5IG5lY2Vzc2l0eSwgMHgwMSBhbmQgMHhmZSlcbiAgLy9cbiAgdmFyIGIsIGJ5dGVzID0gW11cbiAgZm9yICh2YXIgaSA9IDAsIGVuZCA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBlbmQ7ICsraSkge1xuICAgIGIgPSBidWZmZXJbaV1cblxuICAgIC8vXG4gICAgLy8gZXNjYXBlIGxvdyBieXRlcyB3aXRoIDB4MDEgYW5kIGJ5IGFkZGluZyAxXG4gICAgLy9cbiAgICBpZiAoYiA9PT0gMHgwMSB8fCBiID09PSAweDAwKVxuICAgICAgYnl0ZXMucHVzaCgweDAxLCBiICsgMSlcblxuICAgIC8vXG4gICAgLy8gZXNjYXBlIGhpZ2ggYnl0ZXMgd2l0aCAweGZlIGFuZCBieSBzdWJ0cmFjdGluZyAxXG4gICAgLy9cbiAgICBlbHNlIGlmIChvcHRpb25zICE9PSBTS0lQX0hJR0hfQllURVMgJiYgKGIgPT09IDB4ZmUgfHwgYiA9PT0gMHhmZikpXG4gICAgICBieXRlcy5wdXNoKDB4ZmUsIGIgLSAxKVxuXG4gICAgLy9cbiAgICAvLyBubyBlc2NhcGVtZW50IG5lZWRlZFxuICAgIC8vXG4gICAgZWxzZVxuICAgICAgYnl0ZXMucHVzaChiKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBCdWZmZXIoYnl0ZXMpXG59XG5cbnV0aWwudW5lc2NhcGVGbGF0ID0gZnVuY3Rpb24gKGJ1ZmZlciwgb3B0aW9ucykge1xuICB2YXIgYiwgYnl0ZXMgPSBbXVxuICAvL1xuICAvLyBkb24ndCBlc2NhcGUgbGFzdCBieXRlXG4gIC8vXG4gIGZvciAodmFyIGkgPSAwLCBlbmQgPSBidWZmZXIubGVuZ3RoOyBpIDwgZW5kOyArK2kpIHtcbiAgICBiID0gYnVmZmVyW2ldXG5cbiAgICAvL1xuICAgIC8vIGlmIGxvdy1ieXRlIGVzY2FwZSB0YWcgdXNlIHRoZSBmb2xsb3dpbmcgYnl0ZSBtaW51cyAxXG4gICAgLy9cbiAgICBpZiAoYiA9PT0gMHgwMSlcbiAgICAgIGJ5dGVzLnB1c2goYnVmZmVyWysraV0gLSAxKVxuXG4gICAgLy9cbiAgICAvLyBpZiBoaWdoLWJ5dGUgZXNjYXBlIHRhZyB1c2UgdGhlIGZvbGxvd2luZyBieXRlIHBsdXMgMVxuICAgIC8vXG4gICAgZWxzZSBpZiAob3B0aW9ucyAhPT0gU0tJUF9ISUdIX0JZVEVTICYmIGIgPT09IDB4ZmUpXG4gICAgICBieXRlcy5wdXNoKGJ1ZmZlclsrK2ldICsgMSlcblxuICAgIC8vXG4gICAgLy8gbm8gdW5lc2NhcGVtZW50IG5lZWRlZFxuICAgIC8vXG4gICAgZWxzZVxuICAgICAgYnl0ZXMucHVzaChiKVxuICB9XG4gIHJldHVybiBuZXcgQnVmZmVyKGJ5dGVzKVxufVxuXG51dGlsLmVzY2FwZUZsYXRMb3cgPSBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gIHJldHVybiB1dGlsLmVzY2FwZUZsYXQoYnVmZmVyLCBTS0lQX0hJR0hfQllURVMpXG59XG5cbnV0aWwudW5lc2NhcGVGbGF0TG93ID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICByZXR1cm4gdXRpbC51bmVzY2FwZUZsYXQoYnVmZmVyLCBTS0lQX0hJR0hfQllURVMpXG59XG5cbnV0aWwuZW5jb2RlTGlzdCA9IGZ1bmN0aW9uIChzb3VyY2UsIGJhc2UpIHtcbiAgLy8gVE9ETzogY3ljbGUgZGV0ZWN0aW9uXG4gIHZhciBidWZmZXJzID0gW11cbiAgdmFyIHVuZGVjb2RhYmxlXG5cbiAgZm9yICh2YXIgaSA9IDAsIGVuZCA9IHNvdXJjZS5sZW5ndGg7IGkgPCBlbmQ7ICsraSkge1xuICAgIHZhciBidWZmZXIgPSBiYXNlLmVuY29kZShzb3VyY2VbaV0sIG51bGwpXG5cbiAgICAvL1xuICAgIC8vIGJ5cGFzcyBhc3NlcnRpb25zIGZvciB1bmRlY29kYWJsZSB0eXBlcyAoaS5lLiByYW5nZSBib3VuZHMpXG4gICAgLy9cbiAgICB1bmRlY29kYWJsZSB8fCAodW5kZWNvZGFibGUgPSBidWZmZXIudW5kZWNvZGFibGUpXG4gICAgaWYgKHVuZGVjb2RhYmxlKSB7XG4gICAgICBidWZmZXJzLnB1c2goYnVmZmVyKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB2YXIgc29ydCA9IGJhc2UuZ2V0VHlwZShidWZmZXJbMF0pXG4gICAgYXNzZXJ0KHNvcnQsICdMaXN0IGVuY29kaW5nIGZhaWx1cmU6ICcgKyBidWZmZXIpXG5cbiAgICAvL1xuICAgIC8vIGVzY2FwZSBzb3J0cyBpZiBpdCByZXF1aXJlcyBpdCBhbmQgYWRkIGNsb3NpbmcgYnl0ZSBmb3IgZWxlbWVudFxuICAgIC8vXG4gICAgaWYgKHNvcnQuY29kZWMgJiYgc29ydC5jb2RlYy5lc2NhcGUpXG4gICAgICBidWZmZXJzLnB1c2goc29ydC5jb2RlYy5lc2NhcGUoYnVmZmVyKSwgbmV3IEJ1ZmZlcihbIDB4MDAgXSkpXG5cbiAgICBlbHNlXG4gICAgICBidWZmZXJzLnB1c2goYnVmZmVyKVxuICB9XG5cbiAgLy9cbiAgLy8gY2xvc2UgdGhlIGxpc3Qgd2l0aCBhbiBlbmQgYnl0ZVxuICAvL1xuICBidWZmZXJzLnB1c2gobmV3IEJ1ZmZlcihbIDB4MDAgXSkpXG4gIGJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoYnVmZmVycylcblxuICAvL1xuICAvLyBwcm9wYWdhdGUgdW5kZWNvYWJsZSBiaXQgaWYgc2V0XG4gIC8vXG4gIHVuZGVjb2RhYmxlICYmIChidWZmZXIudW5kZWNvZGFibGUgPSB1bmRlY29kYWJsZSlcbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG51dGlsLmRlY29kZUxpc3QgPSBmdW5jdGlvbiAoYnVmZmVyLCBiYXNlKSB7XG4gIHZhciByZXN1bHQgPSB1dGlsLnBhcnNlKGJ1ZmZlciwgYmFzZSlcblxuICBhc3NlcnQocmVzdWx0WzFdID09PSBidWZmZXIubGVuZ3RoLCAnSW52YWxpZCBlbmNvZGluZycpXG4gIHJldHVybiByZXN1bHRbMF1cbn1cblxudXRpbC5lbmNvZGVIYXNoID0gZnVuY3Rpb24gKHNvdXJjZSwgYmFzZSkge1xuICAvL1xuICAvLyBwYWNrcyBoYXNoIGludG8gYW4gYXJyYXksIGUuZy4gYFsgazEsIHYxLCBrMiwgdjIsIC4uLiBdYFxuICAvL1xuICB2YXIgbGlzdCA9IFtdXG4gIE9iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBsaXN0LnB1c2goa2V5KVxuICAgIGxpc3QucHVzaChzb3VyY2Vba2V5XSlcbiAgfSlcbiAgcmV0dXJuIHV0aWwuZW5jb2RlTGlzdChsaXN0LCBiYXNlKVxufVxuXG51dGlsLmRlY29kZUhhc2ggPSBmdW5jdGlvbiAoYnVmZmVyLCBiYXNlKSB7XG4gIHZhciBsaXN0ID0gdXRpbC5kZWNvZGVMaXN0KGJ1ZmZlciwgYmFzZSlcbiAgdmFyIGhhc2ggPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yICh2YXIgaSA9IDAsIGVuZCA9IGxpc3QubGVuZ3RoOyBpIDwgZW5kOyArK2kpIHtcbiAgICBoYXNoW2xpc3RbaV1dID0gbGlzdFsrK2ldXG4gIH1cblxuICByZXR1cm4gaGFzaFxufVxuXG4vL1xuLy8gYmFzZSBwYXJzZXIgZm9yIG5lc3RlZC9yZWN1cnNpdmUgc29ydHNcbi8vXG51dGlsLnBhcnNlID0gZnVuY3Rpb24gKGJ1ZmZlciwgYmFzZSwgc29ydCkge1xuICAvL1xuICAvLyBwYXJzZXMgYW5kIHJldHVybnMgdGhlIGZpcnN0IHNvcnQgb24gdGhlIGJ1ZmZlciBhbmQgdG90YWwgYnl0ZXMgY29uc3VtZWRcbiAgLy9cbiAgdmFyIGNvZGVjID0gc29ydCAmJiBzb3J0LmNvZGVjXG4gIHZhciBpbmRleCwgZW5kXG5cbiAgLy9cbiAgLy8gbnVsbGFyeVxuICAvL1xuICBpZiAoc29ydCAmJiAhY29kZWMpXG4gICAgcmV0dXJuIFsgYmFzZS5kZWNvZGUobmV3IEJ1ZmZlcihbIHNvcnQuYnl0ZSBdKSwgbnVsbCksIDAgXVxuXG4gIC8vXG4gIC8vIGN1c3RvbSBwYXJzZSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBzb3J0XG4gIC8vXG4gIGlmIChjb2RlYyAmJiBjb2RlYy5wYXJzZSlcbiAgICByZXR1cm4gY29kZWMucGFyc2UoYnVmZmVyLCBiYXNlLCBzb3J0KVxuXG4gIC8vXG4gIC8vIGZpeGVkIGxlbmd0aCBzb3J0LCBkZWNvZGUgZml4ZWQgYnl0ZXNcbiAgLy9cbiAgdmFyIGxlbmd0aCA9IGNvZGVjICYmIGNvZGVjLmxlbmd0aFxuICBpZiAodHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicpXG4gICAgcmV0dXJuIFsgY29kZWMuZGVjb2RlKGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpKSwgbGVuZ3RoIF1cblxuICAvL1xuICAvLyBlc2NhcGVkIHNvcnQsIHNlZWsgdG8gZW5kIGJ5dGUgYW5kIHVuZXNjYXBlXG4gIC8vXG4gIGlmIChjb2RlYyAmJiBjb2RlYy51bmVzY2FwZSkge1xuICAgIGZvciAoaW5kZXggPSAwLCBlbmQgPSBidWZmZXIubGVuZ3RoOyBpbmRleCA8IGVuZDsgKytpbmRleCkge1xuICAgICAgaWYgKGJ1ZmZlcltpbmRleF0gPT09IDB4MDApXG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgYXNzZXJ0KGluZGV4IDwgYnVmZmVyLmxlbmd0aCwgJ05vIGNsb3NpbmcgYnl0ZSBmb3VuZCBmb3Igc2VxdWVuY2UnKVxuICAgIHZhciB1bmVzY2FwZWQgPSBjb2RlYy51bmVzY2FwZShidWZmZXIuc2xpY2UoMCwgaW5kZXgpKVxuXG4gICAgLy9cbiAgICAvLyBhZGQgMSB0byBpbmRleCB0byBhY2NvdW50IGZvciBjbG9zaW5nIHRhZyBieXRlXG4gICAgLy9cbiAgICByZXR1cm4gWyBjb2RlYy5kZWNvZGUodW5lc2NhcGVkKSwgaW5kZXggKyAxIF1cbiAgfVxuXG4gIC8vXG4gIC8vIHJlY3Vyc2l2ZSBzb3J0LCByZXNvbHZlIGVhY2ggaXRlbSBpdGVyYXRpdmVseVxuICAvL1xuICBpbmRleCA9IDBcbiAgdmFyIGxpc3QgPSBbXVxuICB2YXIgbmV4dFxuICB3aGlsZSAoKG5leHQgPSBidWZmZXJbaW5kZXhdKSAhPT0gMHgwMCkge1xuICAgIHNvcnQgPSBiYXNlLmdldFR5cGUobmV4dClcbiAgICB2YXIgcmVzdWx0ID0gdXRpbC5wYXJzZShidWZmZXIuc2xpY2UoaW5kZXggKyAxKSwgYmFzZSwgc29ydClcbiAgICBsaXN0LnB1c2gocmVzdWx0WzBdKVxuXG4gICAgLy9cbiAgICAvLyBvZmZzZXQgY3VycmVudCBpbmRleCBieSBieXRlcyBjb25zdW1lZCAocGx1cyBhIGJ5dGUgZm9yIHRoZSBzb3J0IHRhZylcbiAgICAvL1xuICAgIGluZGV4ICs9IHJlc3VsdFsxXSArIDFcbiAgICBhc3NlcnQoaW5kZXggPCBidWZmZXIubGVuZ3RoLCAnTm8gY2xvc2luZyBieXRlIGZvdW5kIGZvciBuZXN0ZWQgc2VxdWVuY2UnKVxuICB9XG5cbiAgLy9cbiAgLy8gcmV0dXJuIHBhcnNlZCBsaXN0IGFuZCBieXRlcyBjb25zdW1lZCAocGx1cyBhIGJ5dGUgZm9yIHRoZSBjbG9zaW5nIHRhZylcbiAgLy9cbiAgcmV0dXJuIFsgbGlzdCwgaW5kZXggKyAxIF1cbn1cblxuLy9cbi8vIGhlbHBlcnMgZm9yIGVuY29kaW5nIGJvdW5kYXJ5IHR5cGVzXG4vL1xuZnVuY3Rpb24gZW5jb2RlQm91bmQoZGF0YSwgYmFzZSkge1xuICB2YXIgcHJlZml4ID0gZGF0YS5wcmVmaXhcbiAgdmFyIGJ1ZmZlciA9IHByZWZpeCA/IGJhc2UuZW5jb2RlKHByZWZpeCwgbnVsbCkgOiBuZXcgQnVmZmVyKFsgZGF0YS5ieXRlIF0pXG5cbiAgaWYgKGRhdGEudXBwZXIpXG4gICAgYnVmZmVyID0gQnVmZmVyLmNvbmNhdChbIGJ1ZmZlciwgbmV3IEJ1ZmZlcihbIDB4ZmYgXSkgXSlcblxuICByZXR1cm4gdXRpbC5lbmNvZGVkQm91bmQoZGF0YSwgYnVmZmVyKVxufVxuXG51dGlsLmVuY29kZUJvdW5kID0gZnVuY3Rpb24gKGRhdGEsIGJhc2UpIHtcbiAgcmV0dXJuIHV0aWwuZW5jb2RlZEJvdW5kKGRhdGEsIGVuY29kZUJvdW5kKGRhdGEsIGJhc2UpKVxufVxuXG51dGlsLmVuY29kZUJhc2VCb3VuZCA9IGZ1bmN0aW9uIChkYXRhLCBiYXNlKSB7XG4gIHJldHVybiB1dGlsLmVuY29kZWRCb3VuZChkYXRhLCBuZXcgQnVmZmVyKFsgZGF0YS51cHBlciA/IDB4ZmYgOiAweDAwIF0pKVxufVxuXG51dGlsLmVuY29kZUxpc3RCb3VuZCA9IGZ1bmN0aW9uIChkYXRhLCBiYXNlKSB7XG4gIHZhciBidWZmZXIgPSBlbmNvZGVCb3VuZChkYXRhLCBiYXNlKVxuXG4gIGlmIChkYXRhLnByZWZpeCkge1xuICAgIC8vXG4gICAgLy8gdHJpbSBvZmYgZW5kIGJ5dGUgaWYgYSBwcmVmaXgsIGFuZCBkbyBzb21lIGhhY2tlcnkgaWYgYW4gdXBwZXIgYm91bmRcbiAgICAvL1xuICAgIHZhciBlbmRCeXRlID0gYnVmZmVyW2J1ZmZlci5sZW5ndGggLSAxXVxuICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgwLCAtMSlcbiAgICBpZiAoZGF0YS51cHBlcilcbiAgICAgIGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gMV0gPSBlbmRCeXRlXG4gIH1cblxuICByZXR1cm4gdXRpbC5lbmNvZGVkQm91bmQoZGF0YSwgYnVmZmVyKVxufVxuXG4vL1xuLy8gYWRkIHNvbWUgbWV0YWRhdGEgdG8gZ2VuZXJhdGVkIGJ1ZmZlciBpbnN0YW5jZVxuLy9cbnV0aWwuZW5jb2RlZEJvdW5kID0gZnVuY3Rpb24gKGRhdGEsIGJ1ZmZlcikge1xuICBidWZmZXIudW5kZWNvZGFibGUgPSB0cnVlXG4gIHJldHVybiBidWZmZXJcbn1cbiIsIi8qKlxuICogQGF1dGhvciBUaXR1cyBXb3JtZXJcbiAqIEBjb3B5cmlnaHQgMjAxNSBUaXR1cyBXb3JtZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbW9kdWxlIGNjb3VudFxuICogQGZpbGVvdmVydmlldyBDb3VudCBjaGFyYWN0ZXJzLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3VudCBob3cgbWFueSBjaGFyYWN0ZXJzIGBjaGFyYWN0ZXJgIG9jY3VyIGluIGB2YWx1ZWAuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgY2NvdW50KCdmb28oYmFyKGJheiknLCAnKCcpIC8vIDJcbiAqICAgY2NvdW50KCdmb28oYmFyKGJheiknLCAnKScpIC8vIDFcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBDb250ZW50LCBjb2VyY2VkIHRvIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXIgLSBTaW5nbGUgY2hhcmFjdGVyIHRvIGxvb2tcbiAqICAgZm9yLlxuICogQHJldHVybiB7bnVtYmVyfSAtIENvdW50LlxuICogQHRocm93cyB7RXJyb3J9IC0gd2hlbiBgY2hhcmFjdGVyYCBpcyBub3QgYSBzaW5nbGVcbiAqICAgY2hhcmFjdGVyLlxuICovXG5mdW5jdGlvbiBjY291bnQodmFsdWUsIGNoYXJhY3Rlcikge1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIGxlbmd0aDtcblxuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG5cbiAgICBpZiAodHlwZW9mIGNoYXJhY3RlciAhPT0gJ3N0cmluZycgfHwgY2hhcmFjdGVyLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGNoYXJhY3RlcicpO1xuICAgIH1cblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBjaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY291bnQ7XG59XG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBjY291bnQ7XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwibmJzcFwiOiBcIsKgXCIsXG4gIFwiaWV4Y2xcIjogXCLCoVwiLFxuICBcImNlbnRcIjogXCLColwiLFxuICBcInBvdW5kXCI6IFwiwqNcIixcbiAgXCJjdXJyZW5cIjogXCLCpFwiLFxuICBcInllblwiOiBcIsKlXCIsXG4gIFwiYnJ2YmFyXCI6IFwiwqZcIixcbiAgXCJzZWN0XCI6IFwiwqdcIixcbiAgXCJ1bWxcIjogXCLCqFwiLFxuICBcImNvcHlcIjogXCLCqVwiLFxuICBcIm9yZGZcIjogXCLCqlwiLFxuICBcImxhcXVvXCI6IFwiwqtcIixcbiAgXCJub3RcIjogXCLCrFwiLFxuICBcInNoeVwiOiBcIsKtXCIsXG4gIFwicmVnXCI6IFwiwq5cIixcbiAgXCJtYWNyXCI6IFwiwq9cIixcbiAgXCJkZWdcIjogXCLCsFwiLFxuICBcInBsdXNtblwiOiBcIsKxXCIsXG4gIFwic3VwMlwiOiBcIsKyXCIsXG4gIFwic3VwM1wiOiBcIsKzXCIsXG4gIFwiYWN1dGVcIjogXCLCtFwiLFxuICBcIm1pY3JvXCI6IFwiwrVcIixcbiAgXCJwYXJhXCI6IFwiwrZcIixcbiAgXCJtaWRkb3RcIjogXCLCt1wiLFxuICBcImNlZGlsXCI6IFwiwrhcIixcbiAgXCJzdXAxXCI6IFwiwrlcIixcbiAgXCJvcmRtXCI6IFwiwrpcIixcbiAgXCJyYXF1b1wiOiBcIsK7XCIsXG4gIFwiZnJhYzE0XCI6IFwiwrxcIixcbiAgXCJmcmFjMTJcIjogXCLCvVwiLFxuICBcImZyYWMzNFwiOiBcIsK+XCIsXG4gIFwiaXF1ZXN0XCI6IFwiwr9cIixcbiAgXCJBZ3JhdmVcIjogXCLDgFwiLFxuICBcIkFhY3V0ZVwiOiBcIsOBXCIsXG4gIFwiQWNpcmNcIjogXCLDglwiLFxuICBcIkF0aWxkZVwiOiBcIsODXCIsXG4gIFwiQXVtbFwiOiBcIsOEXCIsXG4gIFwiQXJpbmdcIjogXCLDhVwiLFxuICBcIkFFbGlnXCI6IFwiw4ZcIixcbiAgXCJDY2VkaWxcIjogXCLDh1wiLFxuICBcIkVncmF2ZVwiOiBcIsOIXCIsXG4gIFwiRWFjdXRlXCI6IFwiw4lcIixcbiAgXCJFY2lyY1wiOiBcIsOKXCIsXG4gIFwiRXVtbFwiOiBcIsOLXCIsXG4gIFwiSWdyYXZlXCI6IFwiw4xcIixcbiAgXCJJYWN1dGVcIjogXCLDjVwiLFxuICBcIkljaXJjXCI6IFwiw45cIixcbiAgXCJJdW1sXCI6IFwiw49cIixcbiAgXCJFVEhcIjogXCLDkFwiLFxuICBcIk50aWxkZVwiOiBcIsORXCIsXG4gIFwiT2dyYXZlXCI6IFwiw5JcIixcbiAgXCJPYWN1dGVcIjogXCLDk1wiLFxuICBcIk9jaXJjXCI6IFwiw5RcIixcbiAgXCJPdGlsZGVcIjogXCLDlVwiLFxuICBcIk91bWxcIjogXCLDllwiLFxuICBcInRpbWVzXCI6IFwiw5dcIixcbiAgXCJPc2xhc2hcIjogXCLDmFwiLFxuICBcIlVncmF2ZVwiOiBcIsOZXCIsXG4gIFwiVWFjdXRlXCI6IFwiw5pcIixcbiAgXCJVY2lyY1wiOiBcIsObXCIsXG4gIFwiVXVtbFwiOiBcIsOcXCIsXG4gIFwiWWFjdXRlXCI6IFwiw51cIixcbiAgXCJUSE9STlwiOiBcIsOeXCIsXG4gIFwic3psaWdcIjogXCLDn1wiLFxuICBcImFncmF2ZVwiOiBcIsOgXCIsXG4gIFwiYWFjdXRlXCI6IFwiw6FcIixcbiAgXCJhY2lyY1wiOiBcIsOiXCIsXG4gIFwiYXRpbGRlXCI6IFwiw6NcIixcbiAgXCJhdW1sXCI6IFwiw6RcIixcbiAgXCJhcmluZ1wiOiBcIsOlXCIsXG4gIFwiYWVsaWdcIjogXCLDplwiLFxuICBcImNjZWRpbFwiOiBcIsOnXCIsXG4gIFwiZWdyYXZlXCI6IFwiw6hcIixcbiAgXCJlYWN1dGVcIjogXCLDqVwiLFxuICBcImVjaXJjXCI6IFwiw6pcIixcbiAgXCJldW1sXCI6IFwiw6tcIixcbiAgXCJpZ3JhdmVcIjogXCLDrFwiLFxuICBcImlhY3V0ZVwiOiBcIsOtXCIsXG4gIFwiaWNpcmNcIjogXCLDrlwiLFxuICBcIml1bWxcIjogXCLDr1wiLFxuICBcImV0aFwiOiBcIsOwXCIsXG4gIFwibnRpbGRlXCI6IFwiw7FcIixcbiAgXCJvZ3JhdmVcIjogXCLDslwiLFxuICBcIm9hY3V0ZVwiOiBcIsOzXCIsXG4gIFwib2NpcmNcIjogXCLDtFwiLFxuICBcIm90aWxkZVwiOiBcIsO1XCIsXG4gIFwib3VtbFwiOiBcIsO2XCIsXG4gIFwiZGl2aWRlXCI6IFwiw7dcIixcbiAgXCJvc2xhc2hcIjogXCLDuFwiLFxuICBcInVncmF2ZVwiOiBcIsO5XCIsXG4gIFwidWFjdXRlXCI6IFwiw7pcIixcbiAgXCJ1Y2lyY1wiOiBcIsO7XCIsXG4gIFwidXVtbFwiOiBcIsO8XCIsXG4gIFwieWFjdXRlXCI6IFwiw71cIixcbiAgXCJ0aG9yblwiOiBcIsO+XCIsXG4gIFwieXVtbFwiOiBcIsO/XCIsXG4gIFwiZm5vZlwiOiBcIsaSXCIsXG4gIFwiQWxwaGFcIjogXCLOkVwiLFxuICBcIkJldGFcIjogXCLOklwiLFxuICBcIkdhbW1hXCI6IFwizpNcIixcbiAgXCJEZWx0YVwiOiBcIs6UXCIsXG4gIFwiRXBzaWxvblwiOiBcIs6VXCIsXG4gIFwiWmV0YVwiOiBcIs6WXCIsXG4gIFwiRXRhXCI6IFwizpdcIixcbiAgXCJUaGV0YVwiOiBcIs6YXCIsXG4gIFwiSW90YVwiOiBcIs6ZXCIsXG4gIFwiS2FwcGFcIjogXCLOmlwiLFxuICBcIkxhbWJkYVwiOiBcIs6bXCIsXG4gIFwiTXVcIjogXCLOnFwiLFxuICBcIk51XCI6IFwizp1cIixcbiAgXCJYaVwiOiBcIs6eXCIsXG4gIFwiT21pY3JvblwiOiBcIs6fXCIsXG4gIFwiUGlcIjogXCLOoFwiLFxuICBcIlJob1wiOiBcIs6hXCIsXG4gIFwiU2lnbWFcIjogXCLOo1wiLFxuICBcIlRhdVwiOiBcIs6kXCIsXG4gIFwiVXBzaWxvblwiOiBcIs6lXCIsXG4gIFwiUGhpXCI6IFwizqZcIixcbiAgXCJDaGlcIjogXCLOp1wiLFxuICBcIlBzaVwiOiBcIs6oXCIsXG4gIFwiT21lZ2FcIjogXCLOqVwiLFxuICBcImFscGhhXCI6IFwizrFcIixcbiAgXCJiZXRhXCI6IFwizrJcIixcbiAgXCJnYW1tYVwiOiBcIs6zXCIsXG4gIFwiZGVsdGFcIjogXCLOtFwiLFxuICBcImVwc2lsb25cIjogXCLOtVwiLFxuICBcInpldGFcIjogXCLOtlwiLFxuICBcImV0YVwiOiBcIs63XCIsXG4gIFwidGhldGFcIjogXCLOuFwiLFxuICBcImlvdGFcIjogXCLOuVwiLFxuICBcImthcHBhXCI6IFwizrpcIixcbiAgXCJsYW1iZGFcIjogXCLOu1wiLFxuICBcIm11XCI6IFwizrxcIixcbiAgXCJudVwiOiBcIs69XCIsXG4gIFwieGlcIjogXCLOvlwiLFxuICBcIm9taWNyb25cIjogXCLOv1wiLFxuICBcInBpXCI6IFwiz4BcIixcbiAgXCJyaG9cIjogXCLPgVwiLFxuICBcInNpZ21hZlwiOiBcIs+CXCIsXG4gIFwic2lnbWFcIjogXCLPg1wiLFxuICBcInRhdVwiOiBcIs+EXCIsXG4gIFwidXBzaWxvblwiOiBcIs+FXCIsXG4gIFwicGhpXCI6IFwiz4ZcIixcbiAgXCJjaGlcIjogXCLPh1wiLFxuICBcInBzaVwiOiBcIs+IXCIsXG4gIFwib21lZ2FcIjogXCLPiVwiLFxuICBcInRoZXRhc3ltXCI6IFwiz5FcIixcbiAgXCJ1cHNpaFwiOiBcIs+SXCIsXG4gIFwicGl2XCI6IFwiz5ZcIixcbiAgXCJidWxsXCI6IFwi4oCiXCIsXG4gIFwiaGVsbGlwXCI6IFwi4oCmXCIsXG4gIFwicHJpbWVcIjogXCLigLJcIixcbiAgXCJQcmltZVwiOiBcIuKAs1wiLFxuICBcIm9saW5lXCI6IFwi4oC+XCIsXG4gIFwiZnJhc2xcIjogXCLigYRcIixcbiAgXCJ3ZWllcnBcIjogXCLihJhcIixcbiAgXCJpbWFnZVwiOiBcIuKEkVwiLFxuICBcInJlYWxcIjogXCLihJxcIixcbiAgXCJ0cmFkZVwiOiBcIuKEolwiLFxuICBcImFsZWZzeW1cIjogXCLihLVcIixcbiAgXCJsYXJyXCI6IFwi4oaQXCIsXG4gIFwidWFyclwiOiBcIuKGkVwiLFxuICBcInJhcnJcIjogXCLihpJcIixcbiAgXCJkYXJyXCI6IFwi4oaTXCIsXG4gIFwiaGFyclwiOiBcIuKGlFwiLFxuICBcImNyYXJyXCI6IFwi4oa1XCIsXG4gIFwibEFyclwiOiBcIuKHkFwiLFxuICBcInVBcnJcIjogXCLih5FcIixcbiAgXCJyQXJyXCI6IFwi4oeSXCIsXG4gIFwiZEFyclwiOiBcIuKHk1wiLFxuICBcImhBcnJcIjogXCLih5RcIixcbiAgXCJmb3JhbGxcIjogXCLiiIBcIixcbiAgXCJwYXJ0XCI6IFwi4oiCXCIsXG4gIFwiZXhpc3RcIjogXCLiiINcIixcbiAgXCJlbXB0eVwiOiBcIuKIhVwiLFxuICBcIm5hYmxhXCI6IFwi4oiHXCIsXG4gIFwiaXNpblwiOiBcIuKIiFwiLFxuICBcIm5vdGluXCI6IFwi4oiJXCIsXG4gIFwibmlcIjogXCLiiItcIixcbiAgXCJwcm9kXCI6IFwi4oiPXCIsXG4gIFwic3VtXCI6IFwi4oiRXCIsXG4gIFwibWludXNcIjogXCLiiJJcIixcbiAgXCJsb3dhc3RcIjogXCLiiJdcIixcbiAgXCJyYWRpY1wiOiBcIuKImlwiLFxuICBcInByb3BcIjogXCLiiJ1cIixcbiAgXCJpbmZpblwiOiBcIuKInlwiLFxuICBcImFuZ1wiOiBcIuKIoFwiLFxuICBcImFuZFwiOiBcIuKIp1wiLFxuICBcIm9yXCI6IFwi4oioXCIsXG4gIFwiY2FwXCI6IFwi4oipXCIsXG4gIFwiY3VwXCI6IFwi4oiqXCIsXG4gIFwiaW50XCI6IFwi4oirXCIsXG4gIFwidGhlcmU0XCI6IFwi4oi0XCIsXG4gIFwic2ltXCI6IFwi4oi8XCIsXG4gIFwiY29uZ1wiOiBcIuKJhVwiLFxuICBcImFzeW1wXCI6IFwi4omIXCIsXG4gIFwibmVcIjogXCLiiaBcIixcbiAgXCJlcXVpdlwiOiBcIuKJoVwiLFxuICBcImxlXCI6IFwi4omkXCIsXG4gIFwiZ2VcIjogXCLiiaVcIixcbiAgXCJzdWJcIjogXCLiioJcIixcbiAgXCJzdXBcIjogXCLiioNcIixcbiAgXCJuc3ViXCI6IFwi4oqEXCIsXG4gIFwic3ViZVwiOiBcIuKKhlwiLFxuICBcInN1cGVcIjogXCLiiodcIixcbiAgXCJvcGx1c1wiOiBcIuKKlVwiLFxuICBcIm90aW1lc1wiOiBcIuKKl1wiLFxuICBcInBlcnBcIjogXCLiiqVcIixcbiAgXCJzZG90XCI6IFwi4ouFXCIsXG4gIFwibGNlaWxcIjogXCLijIhcIixcbiAgXCJyY2VpbFwiOiBcIuKMiVwiLFxuICBcImxmbG9vclwiOiBcIuKMilwiLFxuICBcInJmbG9vclwiOiBcIuKMi1wiLFxuICBcImxhbmdcIjogXCLijKlcIixcbiAgXCJyYW5nXCI6IFwi4oyqXCIsXG4gIFwibG96XCI6IFwi4peKXCIsXG4gIFwic3BhZGVzXCI6IFwi4pmgXCIsXG4gIFwiY2x1YnNcIjogXCLimaNcIixcbiAgXCJoZWFydHNcIjogXCLimaVcIixcbiAgXCJkaWFtc1wiOiBcIuKZplwiLFxuICBcInF1b3RcIjogXCJcXFwiXCIsXG4gIFwiYW1wXCI6IFwiJlwiLFxuICBcImx0XCI6IFwiPFwiLFxuICBcImd0XCI6IFwiPlwiLFxuICBcIk9FbGlnXCI6IFwixZJcIixcbiAgXCJvZWxpZ1wiOiBcIsWTXCIsXG4gIFwiU2Nhcm9uXCI6IFwixaBcIixcbiAgXCJzY2Fyb25cIjogXCLFoVwiLFxuICBcIll1bWxcIjogXCLFuFwiLFxuICBcImNpcmNcIjogXCLLhlwiLFxuICBcInRpbGRlXCI6IFwiy5xcIixcbiAgXCJlbnNwXCI6IFwi4oCCXCIsXG4gIFwiZW1zcFwiOiBcIuKAg1wiLFxuICBcInRoaW5zcFwiOiBcIuKAiVwiLFxuICBcInp3bmpcIjogXCLigIxcIixcbiAgXCJ6d2pcIjogXCLigI1cIixcbiAgXCJscm1cIjogXCLigI5cIixcbiAgXCJybG1cIjogXCLigI9cIixcbiAgXCJuZGFzaFwiOiBcIuKAk1wiLFxuICBcIm1kYXNoXCI6IFwi4oCUXCIsXG4gIFwibHNxdW9cIjogXCLigJhcIixcbiAgXCJyc3F1b1wiOiBcIuKAmVwiLFxuICBcInNicXVvXCI6IFwi4oCaXCIsXG4gIFwibGRxdW9cIjogXCLigJxcIixcbiAgXCJyZHF1b1wiOiBcIuKAnVwiLFxuICBcImJkcXVvXCI6IFwi4oCeXCIsXG4gIFwiZGFnZ2VyXCI6IFwi4oCgXCIsXG4gIFwiRGFnZ2VyXCI6IFwi4oChXCIsXG4gIFwicGVybWlsXCI6IFwi4oCwXCIsXG4gIFwibHNhcXVvXCI6IFwi4oC5XCIsXG4gIFwicnNhcXVvXCI6IFwi4oC6XCIsXG4gIFwiZXVyb1wiOiBcIuKCrFwiXG59XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgY2hhcmFjdGVyLWVudGl0aWVzLWh0bWw0XG4gKiBAZmlsZW92ZXJ2aWV3IEhUTUw0IGNoYXJhY3RlciBlbnRpdHkgaW5mb3JtYXRpb24uXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzICovXG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2luZGV4Lmpzb24nKTtcbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJBRWxpZ1wiOiBcIsOGXCIsXG4gIFwiQU1QXCI6IFwiJlwiLFxuICBcIkFhY3V0ZVwiOiBcIsOBXCIsXG4gIFwiQWNpcmNcIjogXCLDglwiLFxuICBcIkFncmF2ZVwiOiBcIsOAXCIsXG4gIFwiQXJpbmdcIjogXCLDhVwiLFxuICBcIkF0aWxkZVwiOiBcIsODXCIsXG4gIFwiQXVtbFwiOiBcIsOEXCIsXG4gIFwiQ09QWVwiOiBcIsKpXCIsXG4gIFwiQ2NlZGlsXCI6IFwiw4dcIixcbiAgXCJFVEhcIjogXCLDkFwiLFxuICBcIkVhY3V0ZVwiOiBcIsOJXCIsXG4gIFwiRWNpcmNcIjogXCLDilwiLFxuICBcIkVncmF2ZVwiOiBcIsOIXCIsXG4gIFwiRXVtbFwiOiBcIsOLXCIsXG4gIFwiR1RcIjogXCI+XCIsXG4gIFwiSWFjdXRlXCI6IFwiw41cIixcbiAgXCJJY2lyY1wiOiBcIsOOXCIsXG4gIFwiSWdyYXZlXCI6IFwiw4xcIixcbiAgXCJJdW1sXCI6IFwiw49cIixcbiAgXCJMVFwiOiBcIjxcIixcbiAgXCJOdGlsZGVcIjogXCLDkVwiLFxuICBcIk9hY3V0ZVwiOiBcIsOTXCIsXG4gIFwiT2NpcmNcIjogXCLDlFwiLFxuICBcIk9ncmF2ZVwiOiBcIsOSXCIsXG4gIFwiT3NsYXNoXCI6IFwiw5hcIixcbiAgXCJPdGlsZGVcIjogXCLDlVwiLFxuICBcIk91bWxcIjogXCLDllwiLFxuICBcIlFVT1RcIjogXCJcXFwiXCIsXG4gIFwiUkVHXCI6IFwiwq5cIixcbiAgXCJUSE9STlwiOiBcIsOeXCIsXG4gIFwiVWFjdXRlXCI6IFwiw5pcIixcbiAgXCJVY2lyY1wiOiBcIsObXCIsXG4gIFwiVWdyYXZlXCI6IFwiw5lcIixcbiAgXCJVdW1sXCI6IFwiw5xcIixcbiAgXCJZYWN1dGVcIjogXCLDnVwiLFxuICBcImFhY3V0ZVwiOiBcIsOhXCIsXG4gIFwiYWNpcmNcIjogXCLDolwiLFxuICBcImFjdXRlXCI6IFwiwrRcIixcbiAgXCJhZWxpZ1wiOiBcIsOmXCIsXG4gIFwiYWdyYXZlXCI6IFwiw6BcIixcbiAgXCJhbXBcIjogXCImXCIsXG4gIFwiYXJpbmdcIjogXCLDpVwiLFxuICBcImF0aWxkZVwiOiBcIsOjXCIsXG4gIFwiYXVtbFwiOiBcIsOkXCIsXG4gIFwiYnJ2YmFyXCI6IFwiwqZcIixcbiAgXCJjY2VkaWxcIjogXCLDp1wiLFxuICBcImNlZGlsXCI6IFwiwrhcIixcbiAgXCJjZW50XCI6IFwiwqJcIixcbiAgXCJjb3B5XCI6IFwiwqlcIixcbiAgXCJjdXJyZW5cIjogXCLCpFwiLFxuICBcImRlZ1wiOiBcIsKwXCIsXG4gIFwiZGl2aWRlXCI6IFwiw7dcIixcbiAgXCJlYWN1dGVcIjogXCLDqVwiLFxuICBcImVjaXJjXCI6IFwiw6pcIixcbiAgXCJlZ3JhdmVcIjogXCLDqFwiLFxuICBcImV0aFwiOiBcIsOwXCIsXG4gIFwiZXVtbFwiOiBcIsOrXCIsXG4gIFwiZnJhYzEyXCI6IFwiwr1cIixcbiAgXCJmcmFjMTRcIjogXCLCvFwiLFxuICBcImZyYWMzNFwiOiBcIsK+XCIsXG4gIFwiZ3RcIjogXCI+XCIsXG4gIFwiaWFjdXRlXCI6IFwiw61cIixcbiAgXCJpY2lyY1wiOiBcIsOuXCIsXG4gIFwiaWV4Y2xcIjogXCLCoVwiLFxuICBcImlncmF2ZVwiOiBcIsOsXCIsXG4gIFwiaXF1ZXN0XCI6IFwiwr9cIixcbiAgXCJpdW1sXCI6IFwiw69cIixcbiAgXCJsYXF1b1wiOiBcIsKrXCIsXG4gIFwibHRcIjogXCI8XCIsXG4gIFwibWFjclwiOiBcIsKvXCIsXG4gIFwibWljcm9cIjogXCLCtVwiLFxuICBcIm1pZGRvdFwiOiBcIsK3XCIsXG4gIFwibmJzcFwiOiBcIsKgXCIsXG4gIFwibm90XCI6IFwiwqxcIixcbiAgXCJudGlsZGVcIjogXCLDsVwiLFxuICBcIm9hY3V0ZVwiOiBcIsOzXCIsXG4gIFwib2NpcmNcIjogXCLDtFwiLFxuICBcIm9ncmF2ZVwiOiBcIsOyXCIsXG4gIFwib3JkZlwiOiBcIsKqXCIsXG4gIFwib3JkbVwiOiBcIsK6XCIsXG4gIFwib3NsYXNoXCI6IFwiw7hcIixcbiAgXCJvdGlsZGVcIjogXCLDtVwiLFxuICBcIm91bWxcIjogXCLDtlwiLFxuICBcInBhcmFcIjogXCLCtlwiLFxuICBcInBsdXNtblwiOiBcIsKxXCIsXG4gIFwicG91bmRcIjogXCLCo1wiLFxuICBcInF1b3RcIjogXCJcXFwiXCIsXG4gIFwicmFxdW9cIjogXCLCu1wiLFxuICBcInJlZ1wiOiBcIsKuXCIsXG4gIFwic2VjdFwiOiBcIsKnXCIsXG4gIFwic2h5XCI6IFwiwq1cIixcbiAgXCJzdXAxXCI6IFwiwrlcIixcbiAgXCJzdXAyXCI6IFwiwrJcIixcbiAgXCJzdXAzXCI6IFwiwrNcIixcbiAgXCJzemxpZ1wiOiBcIsOfXCIsXG4gIFwidGhvcm5cIjogXCLDvlwiLFxuICBcInRpbWVzXCI6IFwiw5dcIixcbiAgXCJ1YWN1dGVcIjogXCLDulwiLFxuICBcInVjaXJjXCI6IFwiw7tcIixcbiAgXCJ1Z3JhdmVcIjogXCLDuVwiLFxuICBcInVtbFwiOiBcIsKoXCIsXG4gIFwidXVtbFwiOiBcIsO8XCIsXG4gIFwieWFjdXRlXCI6IFwiw71cIixcbiAgXCJ5ZW5cIjogXCLCpVwiLFxuICBcInl1bWxcIjogXCLDv1wiXG59XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgY2hhcmFjdGVyLWVudGl0aWVzLWxlZ2FjeVxuICogQGZpbGVvdmVydmlldyBIVE1MIGxlZ2FjeSBjaGFyYWN0ZXIgZW50aXR5IGluZm9ybWF0aW9uLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWVudiBjb21tb25qcyAqL1xuXG4vKlxuICogRXhwb3NlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9pbmRleC5qc29uJyk7XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwiQUVsaWdcIjogXCLDhlwiLFxuICBcIkFNUFwiOiBcIiZcIixcbiAgXCJBYWN1dGVcIjogXCLDgVwiLFxuICBcIkFicmV2ZVwiOiBcIsSCXCIsXG4gIFwiQWNpcmNcIjogXCLDglwiLFxuICBcIkFjeVwiOiBcItCQXCIsXG4gIFwiQWZyXCI6IFwi8J2UhFwiLFxuICBcIkFncmF2ZVwiOiBcIsOAXCIsXG4gIFwiQWxwaGFcIjogXCLOkVwiLFxuICBcIkFtYWNyXCI6IFwixIBcIixcbiAgXCJBbmRcIjogXCLiqZNcIixcbiAgXCJBb2dvblwiOiBcIsSEXCIsXG4gIFwiQW9wZlwiOiBcIvCdlLhcIixcbiAgXCJBcHBseUZ1bmN0aW9uXCI6IFwi4oGhXCIsXG4gIFwiQXJpbmdcIjogXCLDhVwiLFxuICBcIkFzY3JcIjogXCLwnZKcXCIsXG4gIFwiQXNzaWduXCI6IFwi4omUXCIsXG4gIFwiQXRpbGRlXCI6IFwiw4NcIixcbiAgXCJBdW1sXCI6IFwiw4RcIixcbiAgXCJCYWNrc2xhc2hcIjogXCLiiJZcIixcbiAgXCJCYXJ2XCI6IFwi4qunXCIsXG4gIFwiQmFyd2VkXCI6IFwi4oyGXCIsXG4gIFwiQmN5XCI6IFwi0JFcIixcbiAgXCJCZWNhdXNlXCI6IFwi4oi1XCIsXG4gIFwiQmVybm91bGxpc1wiOiBcIuKErFwiLFxuICBcIkJldGFcIjogXCLOklwiLFxuICBcIkJmclwiOiBcIvCdlIVcIixcbiAgXCJCb3BmXCI6IFwi8J2UuVwiLFxuICBcIkJyZXZlXCI6IFwiy5hcIixcbiAgXCJCc2NyXCI6IFwi4oSsXCIsXG4gIFwiQnVtcGVxXCI6IFwi4omOXCIsXG4gIFwiQ0hjeVwiOiBcItCnXCIsXG4gIFwiQ09QWVwiOiBcIsKpXCIsXG4gIFwiQ2FjdXRlXCI6IFwixIZcIixcbiAgXCJDYXBcIjogXCLii5JcIixcbiAgXCJDYXBpdGFsRGlmZmVyZW50aWFsRFwiOiBcIuKFhVwiLFxuICBcIkNheWxleXNcIjogXCLihK1cIixcbiAgXCJDY2Fyb25cIjogXCLEjFwiLFxuICBcIkNjZWRpbFwiOiBcIsOHXCIsXG4gIFwiQ2NpcmNcIjogXCLEiFwiLFxuICBcIkNjb25pbnRcIjogXCLiiLBcIixcbiAgXCJDZG90XCI6IFwixIpcIixcbiAgXCJDZWRpbGxhXCI6IFwiwrhcIixcbiAgXCJDZW50ZXJEb3RcIjogXCLCt1wiLFxuICBcIkNmclwiOiBcIuKErVwiLFxuICBcIkNoaVwiOiBcIs6nXCIsXG4gIFwiQ2lyY2xlRG90XCI6IFwi4oqZXCIsXG4gIFwiQ2lyY2xlTWludXNcIjogXCLiipZcIixcbiAgXCJDaXJjbGVQbHVzXCI6IFwi4oqVXCIsXG4gIFwiQ2lyY2xlVGltZXNcIjogXCLiipdcIixcbiAgXCJDbG9ja3dpc2VDb250b3VySW50ZWdyYWxcIjogXCLiiLJcIixcbiAgXCJDbG9zZUN1cmx5RG91YmxlUXVvdGVcIjogXCLigJ1cIixcbiAgXCJDbG9zZUN1cmx5UXVvdGVcIjogXCLigJlcIixcbiAgXCJDb2xvblwiOiBcIuKIt1wiLFxuICBcIkNvbG9uZVwiOiBcIuKptFwiLFxuICBcIkNvbmdydWVudFwiOiBcIuKJoVwiLFxuICBcIkNvbmludFwiOiBcIuKIr1wiLFxuICBcIkNvbnRvdXJJbnRlZ3JhbFwiOiBcIuKIrlwiLFxuICBcIkNvcGZcIjogXCLihIJcIixcbiAgXCJDb3Byb2R1Y3RcIjogXCLiiJBcIixcbiAgXCJDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsXCI6IFwi4oizXCIsXG4gIFwiQ3Jvc3NcIjogXCLiqK9cIixcbiAgXCJDc2NyXCI6IFwi8J2SnlwiLFxuICBcIkN1cFwiOiBcIuKLk1wiLFxuICBcIkN1cENhcFwiOiBcIuKJjVwiLFxuICBcIkREXCI6IFwi4oWFXCIsXG4gIFwiRERvdHJhaGRcIjogXCLipJFcIixcbiAgXCJESmN5XCI6IFwi0IJcIixcbiAgXCJEU2N5XCI6IFwi0IVcIixcbiAgXCJEWmN5XCI6IFwi0I9cIixcbiAgXCJEYWdnZXJcIjogXCLigKFcIixcbiAgXCJEYXJyXCI6IFwi4oahXCIsXG4gIFwiRGFzaHZcIjogXCLiq6RcIixcbiAgXCJEY2Fyb25cIjogXCLEjlwiLFxuICBcIkRjeVwiOiBcItCUXCIsXG4gIFwiRGVsXCI6IFwi4oiHXCIsXG4gIFwiRGVsdGFcIjogXCLOlFwiLFxuICBcIkRmclwiOiBcIvCdlIdcIixcbiAgXCJEaWFjcml0aWNhbEFjdXRlXCI6IFwiwrRcIixcbiAgXCJEaWFjcml0aWNhbERvdFwiOiBcIsuZXCIsXG4gIFwiRGlhY3JpdGljYWxEb3VibGVBY3V0ZVwiOiBcIsudXCIsXG4gIFwiRGlhY3JpdGljYWxHcmF2ZVwiOiBcImBcIixcbiAgXCJEaWFjcml0aWNhbFRpbGRlXCI6IFwiy5xcIixcbiAgXCJEaWFtb25kXCI6IFwi4ouEXCIsXG4gIFwiRGlmZmVyZW50aWFsRFwiOiBcIuKFhlwiLFxuICBcIkRvcGZcIjogXCLwnZS7XCIsXG4gIFwiRG90XCI6IFwiwqhcIixcbiAgXCJEb3REb3RcIjogXCLig5xcIixcbiAgXCJEb3RFcXVhbFwiOiBcIuKJkFwiLFxuICBcIkRvdWJsZUNvbnRvdXJJbnRlZ3JhbFwiOiBcIuKIr1wiLFxuICBcIkRvdWJsZURvdFwiOiBcIsKoXCIsXG4gIFwiRG91YmxlRG93bkFycm93XCI6IFwi4oeTXCIsXG4gIFwiRG91YmxlTGVmdEFycm93XCI6IFwi4oeQXCIsXG4gIFwiRG91YmxlTGVmdFJpZ2h0QXJyb3dcIjogXCLih5RcIixcbiAgXCJEb3VibGVMZWZ0VGVlXCI6IFwi4qukXCIsXG4gIFwiRG91YmxlTG9uZ0xlZnRBcnJvd1wiOiBcIuKfuFwiLFxuICBcIkRvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvd1wiOiBcIuKfulwiLFxuICBcIkRvdWJsZUxvbmdSaWdodEFycm93XCI6IFwi4p+5XCIsXG4gIFwiRG91YmxlUmlnaHRBcnJvd1wiOiBcIuKHklwiLFxuICBcIkRvdWJsZVJpZ2h0VGVlXCI6IFwi4oqoXCIsXG4gIFwiRG91YmxlVXBBcnJvd1wiOiBcIuKHkVwiLFxuICBcIkRvdWJsZVVwRG93bkFycm93XCI6IFwi4oeVXCIsXG4gIFwiRG91YmxlVmVydGljYWxCYXJcIjogXCLiiKVcIixcbiAgXCJEb3duQXJyb3dcIjogXCLihpNcIixcbiAgXCJEb3duQXJyb3dCYXJcIjogXCLipJNcIixcbiAgXCJEb3duQXJyb3dVcEFycm93XCI6IFwi4oe1XCIsXG4gIFwiRG93bkJyZXZlXCI6IFwizJFcIixcbiAgXCJEb3duTGVmdFJpZ2h0VmVjdG9yXCI6IFwi4qWQXCIsXG4gIFwiRG93bkxlZnRUZWVWZWN0b3JcIjogXCLipZ5cIixcbiAgXCJEb3duTGVmdFZlY3RvclwiOiBcIuKGvVwiLFxuICBcIkRvd25MZWZ0VmVjdG9yQmFyXCI6IFwi4qWWXCIsXG4gIFwiRG93blJpZ2h0VGVlVmVjdG9yXCI6IFwi4qWfXCIsXG4gIFwiRG93blJpZ2h0VmVjdG9yXCI6IFwi4oeBXCIsXG4gIFwiRG93blJpZ2h0VmVjdG9yQmFyXCI6IFwi4qWXXCIsXG4gIFwiRG93blRlZVwiOiBcIuKKpFwiLFxuICBcIkRvd25UZWVBcnJvd1wiOiBcIuKGp1wiLFxuICBcIkRvd25hcnJvd1wiOiBcIuKHk1wiLFxuICBcIkRzY3JcIjogXCLwnZKfXCIsXG4gIFwiRHN0cm9rXCI6IFwixJBcIixcbiAgXCJFTkdcIjogXCLFilwiLFxuICBcIkVUSFwiOiBcIsOQXCIsXG4gIFwiRWFjdXRlXCI6IFwiw4lcIixcbiAgXCJFY2Fyb25cIjogXCLEmlwiLFxuICBcIkVjaXJjXCI6IFwiw4pcIixcbiAgXCJFY3lcIjogXCLQrVwiLFxuICBcIkVkb3RcIjogXCLEllwiLFxuICBcIkVmclwiOiBcIvCdlIhcIixcbiAgXCJFZ3JhdmVcIjogXCLDiFwiLFxuICBcIkVsZW1lbnRcIjogXCLiiIhcIixcbiAgXCJFbWFjclwiOiBcIsSSXCIsXG4gIFwiRW1wdHlTbWFsbFNxdWFyZVwiOiBcIuKXu1wiLFxuICBcIkVtcHR5VmVyeVNtYWxsU3F1YXJlXCI6IFwi4parXCIsXG4gIFwiRW9nb25cIjogXCLEmFwiLFxuICBcIkVvcGZcIjogXCLwnZS8XCIsXG4gIFwiRXBzaWxvblwiOiBcIs6VXCIsXG4gIFwiRXF1YWxcIjogXCLiqbVcIixcbiAgXCJFcXVhbFRpbGRlXCI6IFwi4omCXCIsXG4gIFwiRXF1aWxpYnJpdW1cIjogXCLih4xcIixcbiAgXCJFc2NyXCI6IFwi4oSwXCIsXG4gIFwiRXNpbVwiOiBcIuKps1wiLFxuICBcIkV0YVwiOiBcIs6XXCIsXG4gIFwiRXVtbFwiOiBcIsOLXCIsXG4gIFwiRXhpc3RzXCI6IFwi4oiDXCIsXG4gIFwiRXhwb25lbnRpYWxFXCI6IFwi4oWHXCIsXG4gIFwiRmN5XCI6IFwi0KRcIixcbiAgXCJGZnJcIjogXCLwnZSJXCIsXG4gIFwiRmlsbGVkU21hbGxTcXVhcmVcIjogXCLil7xcIixcbiAgXCJGaWxsZWRWZXJ5U21hbGxTcXVhcmVcIjogXCLilqpcIixcbiAgXCJGb3BmXCI6IFwi8J2UvVwiLFxuICBcIkZvckFsbFwiOiBcIuKIgFwiLFxuICBcIkZvdXJpZXJ0cmZcIjogXCLihLFcIixcbiAgXCJGc2NyXCI6IFwi4oSxXCIsXG4gIFwiR0pjeVwiOiBcItCDXCIsXG4gIFwiR1RcIjogXCI+XCIsXG4gIFwiR2FtbWFcIjogXCLOk1wiLFxuICBcIkdhbW1hZFwiOiBcIs+cXCIsXG4gIFwiR2JyZXZlXCI6IFwixJ5cIixcbiAgXCJHY2VkaWxcIjogXCLEolwiLFxuICBcIkdjaXJjXCI6IFwixJxcIixcbiAgXCJHY3lcIjogXCLQk1wiLFxuICBcIkdkb3RcIjogXCLEoFwiLFxuICBcIkdmclwiOiBcIvCdlIpcIixcbiAgXCJHZ1wiOiBcIuKLmVwiLFxuICBcIkdvcGZcIjogXCLwnZS+XCIsXG4gIFwiR3JlYXRlckVxdWFsXCI6IFwi4omlXCIsXG4gIFwiR3JlYXRlckVxdWFsTGVzc1wiOiBcIuKLm1wiLFxuICBcIkdyZWF0ZXJGdWxsRXF1YWxcIjogXCLiiadcIixcbiAgXCJHcmVhdGVyR3JlYXRlclwiOiBcIuKqolwiLFxuICBcIkdyZWF0ZXJMZXNzXCI6IFwi4om3XCIsXG4gIFwiR3JlYXRlclNsYW50RXF1YWxcIjogXCLiqb5cIixcbiAgXCJHcmVhdGVyVGlsZGVcIjogXCLiibNcIixcbiAgXCJHc2NyXCI6IFwi8J2SolwiLFxuICBcIkd0XCI6IFwi4omrXCIsXG4gIFwiSEFSRGN5XCI6IFwi0KpcIixcbiAgXCJIYWNla1wiOiBcIsuHXCIsXG4gIFwiSGF0XCI6IFwiXlwiLFxuICBcIkhjaXJjXCI6IFwixKRcIixcbiAgXCJIZnJcIjogXCLihIxcIixcbiAgXCJIaWxiZXJ0U3BhY2VcIjogXCLihItcIixcbiAgXCJIb3BmXCI6IFwi4oSNXCIsXG4gIFwiSG9yaXpvbnRhbExpbmVcIjogXCLilIBcIixcbiAgXCJIc2NyXCI6IFwi4oSLXCIsXG4gIFwiSHN0cm9rXCI6IFwixKZcIixcbiAgXCJIdW1wRG93bkh1bXBcIjogXCLiiY5cIixcbiAgXCJIdW1wRXF1YWxcIjogXCLiiY9cIixcbiAgXCJJRWN5XCI6IFwi0JVcIixcbiAgXCJJSmxpZ1wiOiBcIsSyXCIsXG4gIFwiSU9jeVwiOiBcItCBXCIsXG4gIFwiSWFjdXRlXCI6IFwiw41cIixcbiAgXCJJY2lyY1wiOiBcIsOOXCIsXG4gIFwiSWN5XCI6IFwi0JhcIixcbiAgXCJJZG90XCI6IFwixLBcIixcbiAgXCJJZnJcIjogXCLihJFcIixcbiAgXCJJZ3JhdmVcIjogXCLDjFwiLFxuICBcIkltXCI6IFwi4oSRXCIsXG4gIFwiSW1hY3JcIjogXCLEqlwiLFxuICBcIkltYWdpbmFyeUlcIjogXCLihYhcIixcbiAgXCJJbXBsaWVzXCI6IFwi4oeSXCIsXG4gIFwiSW50XCI6IFwi4oisXCIsXG4gIFwiSW50ZWdyYWxcIjogXCLiiKtcIixcbiAgXCJJbnRlcnNlY3Rpb25cIjogXCLii4JcIixcbiAgXCJJbnZpc2libGVDb21tYVwiOiBcIuKBo1wiLFxuICBcIkludmlzaWJsZVRpbWVzXCI6IFwi4oGiXCIsXG4gIFwiSW9nb25cIjogXCLErlwiLFxuICBcIklvcGZcIjogXCLwnZWAXCIsXG4gIFwiSW90YVwiOiBcIs6ZXCIsXG4gIFwiSXNjclwiOiBcIuKEkFwiLFxuICBcIkl0aWxkZVwiOiBcIsSoXCIsXG4gIFwiSXVrY3lcIjogXCLQhlwiLFxuICBcIkl1bWxcIjogXCLDj1wiLFxuICBcIkpjaXJjXCI6IFwixLRcIixcbiAgXCJKY3lcIjogXCLQmVwiLFxuICBcIkpmclwiOiBcIvCdlI1cIixcbiAgXCJKb3BmXCI6IFwi8J2VgVwiLFxuICBcIkpzY3JcIjogXCLwnZKlXCIsXG4gIFwiSnNlcmN5XCI6IFwi0IhcIixcbiAgXCJKdWtjeVwiOiBcItCEXCIsXG4gIFwiS0hjeVwiOiBcItClXCIsXG4gIFwiS0pjeVwiOiBcItCMXCIsXG4gIFwiS2FwcGFcIjogXCLOmlwiLFxuICBcIktjZWRpbFwiOiBcIsS2XCIsXG4gIFwiS2N5XCI6IFwi0JpcIixcbiAgXCJLZnJcIjogXCLwnZSOXCIsXG4gIFwiS29wZlwiOiBcIvCdlYJcIixcbiAgXCJLc2NyXCI6IFwi8J2SplwiLFxuICBcIkxKY3lcIjogXCLQiVwiLFxuICBcIkxUXCI6IFwiPFwiLFxuICBcIkxhY3V0ZVwiOiBcIsS5XCIsXG4gIFwiTGFtYmRhXCI6IFwizptcIixcbiAgXCJMYW5nXCI6IFwi4p+qXCIsXG4gIFwiTGFwbGFjZXRyZlwiOiBcIuKEklwiLFxuICBcIkxhcnJcIjogXCLihp5cIixcbiAgXCJMY2Fyb25cIjogXCLEvVwiLFxuICBcIkxjZWRpbFwiOiBcIsS7XCIsXG4gIFwiTGN5XCI6IFwi0JtcIixcbiAgXCJMZWZ0QW5nbGVCcmFja2V0XCI6IFwi4p+oXCIsXG4gIFwiTGVmdEFycm93XCI6IFwi4oaQXCIsXG4gIFwiTGVmdEFycm93QmFyXCI6IFwi4oekXCIsXG4gIFwiTGVmdEFycm93UmlnaHRBcnJvd1wiOiBcIuKHhlwiLFxuICBcIkxlZnRDZWlsaW5nXCI6IFwi4oyIXCIsXG4gIFwiTGVmdERvdWJsZUJyYWNrZXRcIjogXCLin6ZcIixcbiAgXCJMZWZ0RG93blRlZVZlY3RvclwiOiBcIuKloVwiLFxuICBcIkxlZnREb3duVmVjdG9yXCI6IFwi4oeDXCIsXG4gIFwiTGVmdERvd25WZWN0b3JCYXJcIjogXCLipZlcIixcbiAgXCJMZWZ0Rmxvb3JcIjogXCLijIpcIixcbiAgXCJMZWZ0UmlnaHRBcnJvd1wiOiBcIuKGlFwiLFxuICBcIkxlZnRSaWdodFZlY3RvclwiOiBcIuKljlwiLFxuICBcIkxlZnRUZWVcIjogXCLiiqNcIixcbiAgXCJMZWZ0VGVlQXJyb3dcIjogXCLihqRcIixcbiAgXCJMZWZ0VGVlVmVjdG9yXCI6IFwi4qWaXCIsXG4gIFwiTGVmdFRyaWFuZ2xlXCI6IFwi4oqyXCIsXG4gIFwiTGVmdFRyaWFuZ2xlQmFyXCI6IFwi4qePXCIsXG4gIFwiTGVmdFRyaWFuZ2xlRXF1YWxcIjogXCLiirRcIixcbiAgXCJMZWZ0VXBEb3duVmVjdG9yXCI6IFwi4qWRXCIsXG4gIFwiTGVmdFVwVGVlVmVjdG9yXCI6IFwi4qWgXCIsXG4gIFwiTGVmdFVwVmVjdG9yXCI6IFwi4oa/XCIsXG4gIFwiTGVmdFVwVmVjdG9yQmFyXCI6IFwi4qWYXCIsXG4gIFwiTGVmdFZlY3RvclwiOiBcIuKGvFwiLFxuICBcIkxlZnRWZWN0b3JCYXJcIjogXCLipZJcIixcbiAgXCJMZWZ0YXJyb3dcIjogXCLih5BcIixcbiAgXCJMZWZ0cmlnaHRhcnJvd1wiOiBcIuKHlFwiLFxuICBcIkxlc3NFcXVhbEdyZWF0ZXJcIjogXCLii5pcIixcbiAgXCJMZXNzRnVsbEVxdWFsXCI6IFwi4ommXCIsXG4gIFwiTGVzc0dyZWF0ZXJcIjogXCLiibZcIixcbiAgXCJMZXNzTGVzc1wiOiBcIuKqoVwiLFxuICBcIkxlc3NTbGFudEVxdWFsXCI6IFwi4qm9XCIsXG4gIFwiTGVzc1RpbGRlXCI6IFwi4omyXCIsXG4gIFwiTGZyXCI6IFwi8J2Uj1wiLFxuICBcIkxsXCI6IFwi4ouYXCIsXG4gIFwiTGxlZnRhcnJvd1wiOiBcIuKHmlwiLFxuICBcIkxtaWRvdFwiOiBcIsS/XCIsXG4gIFwiTG9uZ0xlZnRBcnJvd1wiOiBcIuKftVwiLFxuICBcIkxvbmdMZWZ0UmlnaHRBcnJvd1wiOiBcIuKft1wiLFxuICBcIkxvbmdSaWdodEFycm93XCI6IFwi4p+2XCIsXG4gIFwiTG9uZ2xlZnRhcnJvd1wiOiBcIuKfuFwiLFxuICBcIkxvbmdsZWZ0cmlnaHRhcnJvd1wiOiBcIuKfulwiLFxuICBcIkxvbmdyaWdodGFycm93XCI6IFwi4p+5XCIsXG4gIFwiTG9wZlwiOiBcIvCdlYNcIixcbiAgXCJMb3dlckxlZnRBcnJvd1wiOiBcIuKGmVwiLFxuICBcIkxvd2VyUmlnaHRBcnJvd1wiOiBcIuKGmFwiLFxuICBcIkxzY3JcIjogXCLihJJcIixcbiAgXCJMc2hcIjogXCLihrBcIixcbiAgXCJMc3Ryb2tcIjogXCLFgVwiLFxuICBcIkx0XCI6IFwi4omqXCIsXG4gIFwiTWFwXCI6IFwi4qSFXCIsXG4gIFwiTWN5XCI6IFwi0JxcIixcbiAgXCJNZWRpdW1TcGFjZVwiOiBcIuKBn1wiLFxuICBcIk1lbGxpbnRyZlwiOiBcIuKEs1wiLFxuICBcIk1mclwiOiBcIvCdlJBcIixcbiAgXCJNaW51c1BsdXNcIjogXCLiiJNcIixcbiAgXCJNb3BmXCI6IFwi8J2VhFwiLFxuICBcIk1zY3JcIjogXCLihLNcIixcbiAgXCJNdVwiOiBcIs6cXCIsXG4gIFwiTkpjeVwiOiBcItCKXCIsXG4gIFwiTmFjdXRlXCI6IFwixYNcIixcbiAgXCJOY2Fyb25cIjogXCLFh1wiLFxuICBcIk5jZWRpbFwiOiBcIsWFXCIsXG4gIFwiTmN5XCI6IFwi0J1cIixcbiAgXCJOZWdhdGl2ZU1lZGl1bVNwYWNlXCI6IFwi4oCLXCIsXG4gIFwiTmVnYXRpdmVUaGlja1NwYWNlXCI6IFwi4oCLXCIsXG4gIFwiTmVnYXRpdmVUaGluU3BhY2VcIjogXCLigItcIixcbiAgXCJOZWdhdGl2ZVZlcnlUaGluU3BhY2VcIjogXCLigItcIixcbiAgXCJOZXN0ZWRHcmVhdGVyR3JlYXRlclwiOiBcIuKJq1wiLFxuICBcIk5lc3RlZExlc3NMZXNzXCI6IFwi4omqXCIsXG4gIFwiTmV3TGluZVwiOiBcIlxcblwiLFxuICBcIk5mclwiOiBcIvCdlJFcIixcbiAgXCJOb0JyZWFrXCI6IFwi4oGgXCIsXG4gIFwiTm9uQnJlYWtpbmdTcGFjZVwiOiBcIsKgXCIsXG4gIFwiTm9wZlwiOiBcIuKElVwiLFxuICBcIk5vdFwiOiBcIuKrrFwiLFxuICBcIk5vdENvbmdydWVudFwiOiBcIuKJolwiLFxuICBcIk5vdEN1cENhcFwiOiBcIuKJrVwiLFxuICBcIk5vdERvdWJsZVZlcnRpY2FsQmFyXCI6IFwi4oimXCIsXG4gIFwiTm90RWxlbWVudFwiOiBcIuKIiVwiLFxuICBcIk5vdEVxdWFsXCI6IFwi4omgXCIsXG4gIFwiTm90RXF1YWxUaWxkZVwiOiBcIuKJgsy4XCIsXG4gIFwiTm90RXhpc3RzXCI6IFwi4oiEXCIsXG4gIFwiTm90R3JlYXRlclwiOiBcIuKJr1wiLFxuICBcIk5vdEdyZWF0ZXJFcXVhbFwiOiBcIuKJsVwiLFxuICBcIk5vdEdyZWF0ZXJGdWxsRXF1YWxcIjogXCLiiafMuFwiLFxuICBcIk5vdEdyZWF0ZXJHcmVhdGVyXCI6IFwi4omrzLhcIixcbiAgXCJOb3RHcmVhdGVyTGVzc1wiOiBcIuKJuVwiLFxuICBcIk5vdEdyZWF0ZXJTbGFudEVxdWFsXCI6IFwi4qm+zLhcIixcbiAgXCJOb3RHcmVhdGVyVGlsZGVcIjogXCLiibVcIixcbiAgXCJOb3RIdW1wRG93bkh1bXBcIjogXCLiiY7MuFwiLFxuICBcIk5vdEh1bXBFcXVhbFwiOiBcIuKJj8y4XCIsXG4gIFwiTm90TGVmdFRyaWFuZ2xlXCI6IFwi4ouqXCIsXG4gIFwiTm90TGVmdFRyaWFuZ2xlQmFyXCI6IFwi4qePzLhcIixcbiAgXCJOb3RMZWZ0VHJpYW5nbGVFcXVhbFwiOiBcIuKLrFwiLFxuICBcIk5vdExlc3NcIjogXCLiia5cIixcbiAgXCJOb3RMZXNzRXF1YWxcIjogXCLiibBcIixcbiAgXCJOb3RMZXNzR3JlYXRlclwiOiBcIuKJuFwiLFxuICBcIk5vdExlc3NMZXNzXCI6IFwi4omqzLhcIixcbiAgXCJOb3RMZXNzU2xhbnRFcXVhbFwiOiBcIuKpvcy4XCIsXG4gIFwiTm90TGVzc1RpbGRlXCI6IFwi4om0XCIsXG4gIFwiTm90TmVzdGVkR3JlYXRlckdyZWF0ZXJcIjogXCLiqqLMuFwiLFxuICBcIk5vdE5lc3RlZExlc3NMZXNzXCI6IFwi4qqhzLhcIixcbiAgXCJOb3RQcmVjZWRlc1wiOiBcIuKKgFwiLFxuICBcIk5vdFByZWNlZGVzRXF1YWxcIjogXCLiqq/MuFwiLFxuICBcIk5vdFByZWNlZGVzU2xhbnRFcXVhbFwiOiBcIuKLoFwiLFxuICBcIk5vdFJldmVyc2VFbGVtZW50XCI6IFwi4oiMXCIsXG4gIFwiTm90UmlnaHRUcmlhbmdsZVwiOiBcIuKLq1wiLFxuICBcIk5vdFJpZ2h0VHJpYW5nbGVCYXJcIjogXCLip5DMuFwiLFxuICBcIk5vdFJpZ2h0VHJpYW5nbGVFcXVhbFwiOiBcIuKLrVwiLFxuICBcIk5vdFNxdWFyZVN1YnNldFwiOiBcIuKKj8y4XCIsXG4gIFwiTm90U3F1YXJlU3Vic2V0RXF1YWxcIjogXCLii6JcIixcbiAgXCJOb3RTcXVhcmVTdXBlcnNldFwiOiBcIuKKkMy4XCIsXG4gIFwiTm90U3F1YXJlU3VwZXJzZXRFcXVhbFwiOiBcIuKLo1wiLFxuICBcIk5vdFN1YnNldFwiOiBcIuKKguKDklwiLFxuICBcIk5vdFN1YnNldEVxdWFsXCI6IFwi4oqIXCIsXG4gIFwiTm90U3VjY2VlZHNcIjogXCLiioFcIixcbiAgXCJOb3RTdWNjZWVkc0VxdWFsXCI6IFwi4qqwzLhcIixcbiAgXCJOb3RTdWNjZWVkc1NsYW50RXF1YWxcIjogXCLii6FcIixcbiAgXCJOb3RTdWNjZWVkc1RpbGRlXCI6IFwi4om/zLhcIixcbiAgXCJOb3RTdXBlcnNldFwiOiBcIuKKg+KDklwiLFxuICBcIk5vdFN1cGVyc2V0RXF1YWxcIjogXCLiiolcIixcbiAgXCJOb3RUaWxkZVwiOiBcIuKJgVwiLFxuICBcIk5vdFRpbGRlRXF1YWxcIjogXCLiiYRcIixcbiAgXCJOb3RUaWxkZUZ1bGxFcXVhbFwiOiBcIuKJh1wiLFxuICBcIk5vdFRpbGRlVGlsZGVcIjogXCLiiYlcIixcbiAgXCJOb3RWZXJ0aWNhbEJhclwiOiBcIuKIpFwiLFxuICBcIk5zY3JcIjogXCLwnZKpXCIsXG4gIFwiTnRpbGRlXCI6IFwiw5FcIixcbiAgXCJOdVwiOiBcIs6dXCIsXG4gIFwiT0VsaWdcIjogXCLFklwiLFxuICBcIk9hY3V0ZVwiOiBcIsOTXCIsXG4gIFwiT2NpcmNcIjogXCLDlFwiLFxuICBcIk9jeVwiOiBcItCeXCIsXG4gIFwiT2RibGFjXCI6IFwixZBcIixcbiAgXCJPZnJcIjogXCLwnZSSXCIsXG4gIFwiT2dyYXZlXCI6IFwiw5JcIixcbiAgXCJPbWFjclwiOiBcIsWMXCIsXG4gIFwiT21lZ2FcIjogXCLOqVwiLFxuICBcIk9taWNyb25cIjogXCLOn1wiLFxuICBcIk9vcGZcIjogXCLwnZWGXCIsXG4gIFwiT3BlbkN1cmx5RG91YmxlUXVvdGVcIjogXCLigJxcIixcbiAgXCJPcGVuQ3VybHlRdW90ZVwiOiBcIuKAmFwiLFxuICBcIk9yXCI6IFwi4qmUXCIsXG4gIFwiT3NjclwiOiBcIvCdkqpcIixcbiAgXCJPc2xhc2hcIjogXCLDmFwiLFxuICBcIk90aWxkZVwiOiBcIsOVXCIsXG4gIFwiT3RpbWVzXCI6IFwi4qi3XCIsXG4gIFwiT3VtbFwiOiBcIsOWXCIsXG4gIFwiT3ZlckJhclwiOiBcIuKAvlwiLFxuICBcIk92ZXJCcmFjZVwiOiBcIuKPnlwiLFxuICBcIk92ZXJCcmFja2V0XCI6IFwi4o60XCIsXG4gIFwiT3ZlclBhcmVudGhlc2lzXCI6IFwi4o+cXCIsXG4gIFwiUGFydGlhbERcIjogXCLiiIJcIixcbiAgXCJQY3lcIjogXCLQn1wiLFxuICBcIlBmclwiOiBcIvCdlJNcIixcbiAgXCJQaGlcIjogXCLOplwiLFxuICBcIlBpXCI6IFwizqBcIixcbiAgXCJQbHVzTWludXNcIjogXCLCsVwiLFxuICBcIlBvaW5jYXJlcGxhbmVcIjogXCLihIxcIixcbiAgXCJQb3BmXCI6IFwi4oSZXCIsXG4gIFwiUHJcIjogXCLiqrtcIixcbiAgXCJQcmVjZWRlc1wiOiBcIuKJulwiLFxuICBcIlByZWNlZGVzRXF1YWxcIjogXCLiqq9cIixcbiAgXCJQcmVjZWRlc1NsYW50RXF1YWxcIjogXCLiibxcIixcbiAgXCJQcmVjZWRlc1RpbGRlXCI6IFwi4om+XCIsXG4gIFwiUHJpbWVcIjogXCLigLNcIixcbiAgXCJQcm9kdWN0XCI6IFwi4oiPXCIsXG4gIFwiUHJvcG9ydGlvblwiOiBcIuKIt1wiLFxuICBcIlByb3BvcnRpb25hbFwiOiBcIuKInVwiLFxuICBcIlBzY3JcIjogXCLwnZKrXCIsXG4gIFwiUHNpXCI6IFwizqhcIixcbiAgXCJRVU9UXCI6IFwiXFxcIlwiLFxuICBcIlFmclwiOiBcIvCdlJRcIixcbiAgXCJRb3BmXCI6IFwi4oSaXCIsXG4gIFwiUXNjclwiOiBcIvCdkqxcIixcbiAgXCJSQmFyclwiOiBcIuKkkFwiLFxuICBcIlJFR1wiOiBcIsKuXCIsXG4gIFwiUmFjdXRlXCI6IFwixZRcIixcbiAgXCJSYW5nXCI6IFwi4p+rXCIsXG4gIFwiUmFyclwiOiBcIuKGoFwiLFxuICBcIlJhcnJ0bFwiOiBcIuKkllwiLFxuICBcIlJjYXJvblwiOiBcIsWYXCIsXG4gIFwiUmNlZGlsXCI6IFwixZZcIixcbiAgXCJSY3lcIjogXCLQoFwiLFxuICBcIlJlXCI6IFwi4oScXCIsXG4gIFwiUmV2ZXJzZUVsZW1lbnRcIjogXCLiiItcIixcbiAgXCJSZXZlcnNlRXF1aWxpYnJpdW1cIjogXCLih4tcIixcbiAgXCJSZXZlcnNlVXBFcXVpbGlicml1bVwiOiBcIuKlr1wiLFxuICBcIlJmclwiOiBcIuKEnFwiLFxuICBcIlJob1wiOiBcIs6hXCIsXG4gIFwiUmlnaHRBbmdsZUJyYWNrZXRcIjogXCLin6lcIixcbiAgXCJSaWdodEFycm93XCI6IFwi4oaSXCIsXG4gIFwiUmlnaHRBcnJvd0JhclwiOiBcIuKHpVwiLFxuICBcIlJpZ2h0QXJyb3dMZWZ0QXJyb3dcIjogXCLih4RcIixcbiAgXCJSaWdodENlaWxpbmdcIjogXCLijIlcIixcbiAgXCJSaWdodERvdWJsZUJyYWNrZXRcIjogXCLin6dcIixcbiAgXCJSaWdodERvd25UZWVWZWN0b3JcIjogXCLipZ1cIixcbiAgXCJSaWdodERvd25WZWN0b3JcIjogXCLih4JcIixcbiAgXCJSaWdodERvd25WZWN0b3JCYXJcIjogXCLipZVcIixcbiAgXCJSaWdodEZsb29yXCI6IFwi4oyLXCIsXG4gIFwiUmlnaHRUZWVcIjogXCLiiqJcIixcbiAgXCJSaWdodFRlZUFycm93XCI6IFwi4oamXCIsXG4gIFwiUmlnaHRUZWVWZWN0b3JcIjogXCLipZtcIixcbiAgXCJSaWdodFRyaWFuZ2xlXCI6IFwi4oqzXCIsXG4gIFwiUmlnaHRUcmlhbmdsZUJhclwiOiBcIuKnkFwiLFxuICBcIlJpZ2h0VHJpYW5nbGVFcXVhbFwiOiBcIuKKtVwiLFxuICBcIlJpZ2h0VXBEb3duVmVjdG9yXCI6IFwi4qWPXCIsXG4gIFwiUmlnaHRVcFRlZVZlY3RvclwiOiBcIuKlnFwiLFxuICBcIlJpZ2h0VXBWZWN0b3JcIjogXCLihr5cIixcbiAgXCJSaWdodFVwVmVjdG9yQmFyXCI6IFwi4qWUXCIsXG4gIFwiUmlnaHRWZWN0b3JcIjogXCLih4BcIixcbiAgXCJSaWdodFZlY3RvckJhclwiOiBcIuKlk1wiLFxuICBcIlJpZ2h0YXJyb3dcIjogXCLih5JcIixcbiAgXCJSb3BmXCI6IFwi4oSdXCIsXG4gIFwiUm91bmRJbXBsaWVzXCI6IFwi4qWwXCIsXG4gIFwiUnJpZ2h0YXJyb3dcIjogXCLih5tcIixcbiAgXCJSc2NyXCI6IFwi4oSbXCIsXG4gIFwiUnNoXCI6IFwi4oaxXCIsXG4gIFwiUnVsZURlbGF5ZWRcIjogXCLip7RcIixcbiAgXCJTSENIY3lcIjogXCLQqVwiLFxuICBcIlNIY3lcIjogXCLQqFwiLFxuICBcIlNPRlRjeVwiOiBcItCsXCIsXG4gIFwiU2FjdXRlXCI6IFwixZpcIixcbiAgXCJTY1wiOiBcIuKqvFwiLFxuICBcIlNjYXJvblwiOiBcIsWgXCIsXG4gIFwiU2NlZGlsXCI6IFwixZ5cIixcbiAgXCJTY2lyY1wiOiBcIsWcXCIsXG4gIFwiU2N5XCI6IFwi0KFcIixcbiAgXCJTZnJcIjogXCLwnZSWXCIsXG4gIFwiU2hvcnREb3duQXJyb3dcIjogXCLihpNcIixcbiAgXCJTaG9ydExlZnRBcnJvd1wiOiBcIuKGkFwiLFxuICBcIlNob3J0UmlnaHRBcnJvd1wiOiBcIuKGklwiLFxuICBcIlNob3J0VXBBcnJvd1wiOiBcIuKGkVwiLFxuICBcIlNpZ21hXCI6IFwizqNcIixcbiAgXCJTbWFsbENpcmNsZVwiOiBcIuKImFwiLFxuICBcIlNvcGZcIjogXCLwnZWKXCIsXG4gIFwiU3FydFwiOiBcIuKImlwiLFxuICBcIlNxdWFyZVwiOiBcIuKWoVwiLFxuICBcIlNxdWFyZUludGVyc2VjdGlvblwiOiBcIuKKk1wiLFxuICBcIlNxdWFyZVN1YnNldFwiOiBcIuKKj1wiLFxuICBcIlNxdWFyZVN1YnNldEVxdWFsXCI6IFwi4oqRXCIsXG4gIFwiU3F1YXJlU3VwZXJzZXRcIjogXCLiipBcIixcbiAgXCJTcXVhcmVTdXBlcnNldEVxdWFsXCI6IFwi4oqSXCIsXG4gIFwiU3F1YXJlVW5pb25cIjogXCLiipRcIixcbiAgXCJTc2NyXCI6IFwi8J2SrlwiLFxuICBcIlN0YXJcIjogXCLii4ZcIixcbiAgXCJTdWJcIjogXCLii5BcIixcbiAgXCJTdWJzZXRcIjogXCLii5BcIixcbiAgXCJTdWJzZXRFcXVhbFwiOiBcIuKKhlwiLFxuICBcIlN1Y2NlZWRzXCI6IFwi4om7XCIsXG4gIFwiU3VjY2VlZHNFcXVhbFwiOiBcIuKqsFwiLFxuICBcIlN1Y2NlZWRzU2xhbnRFcXVhbFwiOiBcIuKJvVwiLFxuICBcIlN1Y2NlZWRzVGlsZGVcIjogXCLiib9cIixcbiAgXCJTdWNoVGhhdFwiOiBcIuKIi1wiLFxuICBcIlN1bVwiOiBcIuKIkVwiLFxuICBcIlN1cFwiOiBcIuKLkVwiLFxuICBcIlN1cGVyc2V0XCI6IFwi4oqDXCIsXG4gIFwiU3VwZXJzZXRFcXVhbFwiOiBcIuKKh1wiLFxuICBcIlN1cHNldFwiOiBcIuKLkVwiLFxuICBcIlRIT1JOXCI6IFwiw55cIixcbiAgXCJUUkFERVwiOiBcIuKEolwiLFxuICBcIlRTSGN5XCI6IFwi0ItcIixcbiAgXCJUU2N5XCI6IFwi0KZcIixcbiAgXCJUYWJcIjogXCJcXHRcIixcbiAgXCJUYXVcIjogXCLOpFwiLFxuICBcIlRjYXJvblwiOiBcIsWkXCIsXG4gIFwiVGNlZGlsXCI6IFwixaJcIixcbiAgXCJUY3lcIjogXCLQolwiLFxuICBcIlRmclwiOiBcIvCdlJdcIixcbiAgXCJUaGVyZWZvcmVcIjogXCLiiLRcIixcbiAgXCJUaGV0YVwiOiBcIs6YXCIsXG4gIFwiVGhpY2tTcGFjZVwiOiBcIuKBn+KAilwiLFxuICBcIlRoaW5TcGFjZVwiOiBcIuKAiVwiLFxuICBcIlRpbGRlXCI6IFwi4oi8XCIsXG4gIFwiVGlsZGVFcXVhbFwiOiBcIuKJg1wiLFxuICBcIlRpbGRlRnVsbEVxdWFsXCI6IFwi4omFXCIsXG4gIFwiVGlsZGVUaWxkZVwiOiBcIuKJiFwiLFxuICBcIlRvcGZcIjogXCLwnZWLXCIsXG4gIFwiVHJpcGxlRG90XCI6IFwi4oObXCIsXG4gIFwiVHNjclwiOiBcIvCdkq9cIixcbiAgXCJUc3Ryb2tcIjogXCLFplwiLFxuICBcIlVhY3V0ZVwiOiBcIsOaXCIsXG4gIFwiVWFyclwiOiBcIuKGn1wiLFxuICBcIlVhcnJvY2lyXCI6IFwi4qWJXCIsXG4gIFwiVWJyY3lcIjogXCLQjlwiLFxuICBcIlVicmV2ZVwiOiBcIsWsXCIsXG4gIFwiVWNpcmNcIjogXCLDm1wiLFxuICBcIlVjeVwiOiBcItCjXCIsXG4gIFwiVWRibGFjXCI6IFwixbBcIixcbiAgXCJVZnJcIjogXCLwnZSYXCIsXG4gIFwiVWdyYXZlXCI6IFwiw5lcIixcbiAgXCJVbWFjclwiOiBcIsWqXCIsXG4gIFwiVW5kZXJCYXJcIjogXCJfXCIsXG4gIFwiVW5kZXJCcmFjZVwiOiBcIuKPn1wiLFxuICBcIlVuZGVyQnJhY2tldFwiOiBcIuKOtVwiLFxuICBcIlVuZGVyUGFyZW50aGVzaXNcIjogXCLij51cIixcbiAgXCJVbmlvblwiOiBcIuKLg1wiLFxuICBcIlVuaW9uUGx1c1wiOiBcIuKKjlwiLFxuICBcIlVvZ29uXCI6IFwixbJcIixcbiAgXCJVb3BmXCI6IFwi8J2VjFwiLFxuICBcIlVwQXJyb3dcIjogXCLihpFcIixcbiAgXCJVcEFycm93QmFyXCI6IFwi4qSSXCIsXG4gIFwiVXBBcnJvd0Rvd25BcnJvd1wiOiBcIuKHhVwiLFxuICBcIlVwRG93bkFycm93XCI6IFwi4oaVXCIsXG4gIFwiVXBFcXVpbGlicml1bVwiOiBcIuKlrlwiLFxuICBcIlVwVGVlXCI6IFwi4oqlXCIsXG4gIFwiVXBUZWVBcnJvd1wiOiBcIuKGpVwiLFxuICBcIlVwYXJyb3dcIjogXCLih5FcIixcbiAgXCJVcGRvd25hcnJvd1wiOiBcIuKHlVwiLFxuICBcIlVwcGVyTGVmdEFycm93XCI6IFwi4oaWXCIsXG4gIFwiVXBwZXJSaWdodEFycm93XCI6IFwi4oaXXCIsXG4gIFwiVXBzaVwiOiBcIs+SXCIsXG4gIFwiVXBzaWxvblwiOiBcIs6lXCIsXG4gIFwiVXJpbmdcIjogXCLFrlwiLFxuICBcIlVzY3JcIjogXCLwnZKwXCIsXG4gIFwiVXRpbGRlXCI6IFwixahcIixcbiAgXCJVdW1sXCI6IFwiw5xcIixcbiAgXCJWRGFzaFwiOiBcIuKKq1wiLFxuICBcIlZiYXJcIjogXCLiq6tcIixcbiAgXCJWY3lcIjogXCLQklwiLFxuICBcIlZkYXNoXCI6IFwi4oqpXCIsXG4gIFwiVmRhc2hsXCI6IFwi4qumXCIsXG4gIFwiVmVlXCI6IFwi4ouBXCIsXG4gIFwiVmVyYmFyXCI6IFwi4oCWXCIsXG4gIFwiVmVydFwiOiBcIuKAllwiLFxuICBcIlZlcnRpY2FsQmFyXCI6IFwi4oijXCIsXG4gIFwiVmVydGljYWxMaW5lXCI6IFwifFwiLFxuICBcIlZlcnRpY2FsU2VwYXJhdG9yXCI6IFwi4p2YXCIsXG4gIFwiVmVydGljYWxUaWxkZVwiOiBcIuKJgFwiLFxuICBcIlZlcnlUaGluU3BhY2VcIjogXCLigIpcIixcbiAgXCJWZnJcIjogXCLwnZSZXCIsXG4gIFwiVm9wZlwiOiBcIvCdlY1cIixcbiAgXCJWc2NyXCI6IFwi8J2SsVwiLFxuICBcIlZ2ZGFzaFwiOiBcIuKKqlwiLFxuICBcIldjaXJjXCI6IFwixbRcIixcbiAgXCJXZWRnZVwiOiBcIuKLgFwiLFxuICBcIldmclwiOiBcIvCdlJpcIixcbiAgXCJXb3BmXCI6IFwi8J2VjlwiLFxuICBcIldzY3JcIjogXCLwnZKyXCIsXG4gIFwiWGZyXCI6IFwi8J2Um1wiLFxuICBcIlhpXCI6IFwizp5cIixcbiAgXCJYb3BmXCI6IFwi8J2Vj1wiLFxuICBcIlhzY3JcIjogXCLwnZKzXCIsXG4gIFwiWUFjeVwiOiBcItCvXCIsXG4gIFwiWUljeVwiOiBcItCHXCIsXG4gIFwiWVVjeVwiOiBcItCuXCIsXG4gIFwiWWFjdXRlXCI6IFwiw51cIixcbiAgXCJZY2lyY1wiOiBcIsW2XCIsXG4gIFwiWWN5XCI6IFwi0KtcIixcbiAgXCJZZnJcIjogXCLwnZScXCIsXG4gIFwiWW9wZlwiOiBcIvCdlZBcIixcbiAgXCJZc2NyXCI6IFwi8J2StFwiLFxuICBcIll1bWxcIjogXCLFuFwiLFxuICBcIlpIY3lcIjogXCLQllwiLFxuICBcIlphY3V0ZVwiOiBcIsW5XCIsXG4gIFwiWmNhcm9uXCI6IFwixb1cIixcbiAgXCJaY3lcIjogXCLQl1wiLFxuICBcIlpkb3RcIjogXCLFu1wiLFxuICBcIlplcm9XaWR0aFNwYWNlXCI6IFwi4oCLXCIsXG4gIFwiWmV0YVwiOiBcIs6WXCIsXG4gIFwiWmZyXCI6IFwi4oSoXCIsXG4gIFwiWm9wZlwiOiBcIuKEpFwiLFxuICBcIlpzY3JcIjogXCLwnZK1XCIsXG4gIFwiYWFjdXRlXCI6IFwiw6FcIixcbiAgXCJhYnJldmVcIjogXCLEg1wiLFxuICBcImFjXCI6IFwi4oi+XCIsXG4gIFwiYWNFXCI6IFwi4oi+zLNcIixcbiAgXCJhY2RcIjogXCLiiL9cIixcbiAgXCJhY2lyY1wiOiBcIsOiXCIsXG4gIFwiYWN1dGVcIjogXCLCtFwiLFxuICBcImFjeVwiOiBcItCwXCIsXG4gIFwiYWVsaWdcIjogXCLDplwiLFxuICBcImFmXCI6IFwi4oGhXCIsXG4gIFwiYWZyXCI6IFwi8J2UnlwiLFxuICBcImFncmF2ZVwiOiBcIsOgXCIsXG4gIFwiYWxlZnN5bVwiOiBcIuKEtVwiLFxuICBcImFsZXBoXCI6IFwi4oS1XCIsXG4gIFwiYWxwaGFcIjogXCLOsVwiLFxuICBcImFtYWNyXCI6IFwixIFcIixcbiAgXCJhbWFsZ1wiOiBcIuKov1wiLFxuICBcImFtcFwiOiBcIiZcIixcbiAgXCJhbmRcIjogXCLiiKdcIixcbiAgXCJhbmRhbmRcIjogXCLiqZVcIixcbiAgXCJhbmRkXCI6IFwi4qmcXCIsXG4gIFwiYW5kc2xvcGVcIjogXCLiqZhcIixcbiAgXCJhbmR2XCI6IFwi4qmaXCIsXG4gIFwiYW5nXCI6IFwi4oigXCIsXG4gIFwiYW5nZVwiOiBcIuKmpFwiLFxuICBcImFuZ2xlXCI6IFwi4oigXCIsXG4gIFwiYW5nbXNkXCI6IFwi4oihXCIsXG4gIFwiYW5nbXNkYWFcIjogXCLipqhcIixcbiAgXCJhbmdtc2RhYlwiOiBcIuKmqVwiLFxuICBcImFuZ21zZGFjXCI6IFwi4qaqXCIsXG4gIFwiYW5nbXNkYWRcIjogXCLipqtcIixcbiAgXCJhbmdtc2RhZVwiOiBcIuKmrFwiLFxuICBcImFuZ21zZGFmXCI6IFwi4qatXCIsXG4gIFwiYW5nbXNkYWdcIjogXCLipq5cIixcbiAgXCJhbmdtc2RhaFwiOiBcIuKmr1wiLFxuICBcImFuZ3J0XCI6IFwi4oifXCIsXG4gIFwiYW5ncnR2YlwiOiBcIuKKvlwiLFxuICBcImFuZ3J0dmJkXCI6IFwi4qadXCIsXG4gIFwiYW5nc3BoXCI6IFwi4oiiXCIsXG4gIFwiYW5nc3RcIjogXCLDhVwiLFxuICBcImFuZ3phcnJcIjogXCLijbxcIixcbiAgXCJhb2dvblwiOiBcIsSFXCIsXG4gIFwiYW9wZlwiOiBcIvCdlZJcIixcbiAgXCJhcFwiOiBcIuKJiFwiLFxuICBcImFwRVwiOiBcIuKpsFwiLFxuICBcImFwYWNpclwiOiBcIuKpr1wiLFxuICBcImFwZVwiOiBcIuKJilwiLFxuICBcImFwaWRcIjogXCLiiYtcIixcbiAgXCJhcG9zXCI6IFwiJ1wiLFxuICBcImFwcHJveFwiOiBcIuKJiFwiLFxuICBcImFwcHJveGVxXCI6IFwi4omKXCIsXG4gIFwiYXJpbmdcIjogXCLDpVwiLFxuICBcImFzY3JcIjogXCLwnZK2XCIsXG4gIFwiYXN0XCI6IFwiKlwiLFxuICBcImFzeW1wXCI6IFwi4omIXCIsXG4gIFwiYXN5bXBlcVwiOiBcIuKJjVwiLFxuICBcImF0aWxkZVwiOiBcIsOjXCIsXG4gIFwiYXVtbFwiOiBcIsOkXCIsXG4gIFwiYXdjb25pbnRcIjogXCLiiLNcIixcbiAgXCJhd2ludFwiOiBcIuKokVwiLFxuICBcImJOb3RcIjogXCLiq61cIixcbiAgXCJiYWNrY29uZ1wiOiBcIuKJjFwiLFxuICBcImJhY2tlcHNpbG9uXCI6IFwiz7ZcIixcbiAgXCJiYWNrcHJpbWVcIjogXCLigLVcIixcbiAgXCJiYWNrc2ltXCI6IFwi4oi9XCIsXG4gIFwiYmFja3NpbWVxXCI6IFwi4ouNXCIsXG4gIFwiYmFydmVlXCI6IFwi4oq9XCIsXG4gIFwiYmFyd2VkXCI6IFwi4oyFXCIsXG4gIFwiYmFyd2VkZ2VcIjogXCLijIVcIixcbiAgXCJiYnJrXCI6IFwi4o61XCIsXG4gIFwiYmJya3RicmtcIjogXCLijrZcIixcbiAgXCJiY29uZ1wiOiBcIuKJjFwiLFxuICBcImJjeVwiOiBcItCxXCIsXG4gIFwiYmRxdW9cIjogXCLigJ5cIixcbiAgXCJiZWNhdXNcIjogXCLiiLVcIixcbiAgXCJiZWNhdXNlXCI6IFwi4oi1XCIsXG4gIFwiYmVtcHR5dlwiOiBcIuKmsFwiLFxuICBcImJlcHNpXCI6IFwiz7ZcIixcbiAgXCJiZXJub3VcIjogXCLihKxcIixcbiAgXCJiZXRhXCI6IFwizrJcIixcbiAgXCJiZXRoXCI6IFwi4oS2XCIsXG4gIFwiYmV0d2VlblwiOiBcIuKJrFwiLFxuICBcImJmclwiOiBcIvCdlJ9cIixcbiAgXCJiaWdjYXBcIjogXCLii4JcIixcbiAgXCJiaWdjaXJjXCI6IFwi4pevXCIsXG4gIFwiYmlnY3VwXCI6IFwi4ouDXCIsXG4gIFwiYmlnb2RvdFwiOiBcIuKogFwiLFxuICBcImJpZ29wbHVzXCI6IFwi4qiBXCIsXG4gIFwiYmlnb3RpbWVzXCI6IFwi4qiCXCIsXG4gIFwiYmlnc3FjdXBcIjogXCLiqIZcIixcbiAgXCJiaWdzdGFyXCI6IFwi4piFXCIsXG4gIFwiYmlndHJpYW5nbGVkb3duXCI6IFwi4pa9XCIsXG4gIFwiYmlndHJpYW5nbGV1cFwiOiBcIuKWs1wiLFxuICBcImJpZ3VwbHVzXCI6IFwi4qiEXCIsXG4gIFwiYmlndmVlXCI6IFwi4ouBXCIsXG4gIFwiYmlnd2VkZ2VcIjogXCLii4BcIixcbiAgXCJia2Fyb3dcIjogXCLipI1cIixcbiAgXCJibGFja2xvemVuZ2VcIjogXCLip6tcIixcbiAgXCJibGFja3NxdWFyZVwiOiBcIuKWqlwiLFxuICBcImJsYWNrdHJpYW5nbGVcIjogXCLilrRcIixcbiAgXCJibGFja3RyaWFuZ2xlZG93blwiOiBcIuKWvlwiLFxuICBcImJsYWNrdHJpYW5nbGVsZWZ0XCI6IFwi4peCXCIsXG4gIFwiYmxhY2t0cmlhbmdsZXJpZ2h0XCI6IFwi4pa4XCIsXG4gIFwiYmxhbmtcIjogXCLikKNcIixcbiAgXCJibGsxMlwiOiBcIuKWklwiLFxuICBcImJsazE0XCI6IFwi4paRXCIsXG4gIFwiYmxrMzRcIjogXCLilpNcIixcbiAgXCJibG9ja1wiOiBcIuKWiFwiLFxuICBcImJuZVwiOiBcIj3ig6VcIixcbiAgXCJibmVxdWl2XCI6IFwi4omh4oOlXCIsXG4gIFwiYm5vdFwiOiBcIuKMkFwiLFxuICBcImJvcGZcIjogXCLwnZWTXCIsXG4gIFwiYm90XCI6IFwi4oqlXCIsXG4gIFwiYm90dG9tXCI6IFwi4oqlXCIsXG4gIFwiYm93dGllXCI6IFwi4ouIXCIsXG4gIFwiYm94RExcIjogXCLilZdcIixcbiAgXCJib3hEUlwiOiBcIuKVlFwiLFxuICBcImJveERsXCI6IFwi4pWWXCIsXG4gIFwiYm94RHJcIjogXCLilZNcIixcbiAgXCJib3hIXCI6IFwi4pWQXCIsXG4gIFwiYm94SERcIjogXCLilaZcIixcbiAgXCJib3hIVVwiOiBcIuKVqVwiLFxuICBcImJveEhkXCI6IFwi4pWkXCIsXG4gIFwiYm94SHVcIjogXCLiladcIixcbiAgXCJib3hVTFwiOiBcIuKVnVwiLFxuICBcImJveFVSXCI6IFwi4pWaXCIsXG4gIFwiYm94VWxcIjogXCLilZxcIixcbiAgXCJib3hVclwiOiBcIuKVmVwiLFxuICBcImJveFZcIjogXCLilZFcIixcbiAgXCJib3hWSFwiOiBcIuKVrFwiLFxuICBcImJveFZMXCI6IFwi4pWjXCIsXG4gIFwiYm94VlJcIjogXCLilaBcIixcbiAgXCJib3hWaFwiOiBcIuKVq1wiLFxuICBcImJveFZsXCI6IFwi4pWiXCIsXG4gIFwiYm94VnJcIjogXCLilZ9cIixcbiAgXCJib3hib3hcIjogXCLip4lcIixcbiAgXCJib3hkTFwiOiBcIuKVlVwiLFxuICBcImJveGRSXCI6IFwi4pWSXCIsXG4gIFwiYm94ZGxcIjogXCLilJBcIixcbiAgXCJib3hkclwiOiBcIuKUjFwiLFxuICBcImJveGhcIjogXCLilIBcIixcbiAgXCJib3hoRFwiOiBcIuKVpVwiLFxuICBcImJveGhVXCI6IFwi4pWoXCIsXG4gIFwiYm94aGRcIjogXCLilKxcIixcbiAgXCJib3hodVwiOiBcIuKUtFwiLFxuICBcImJveG1pbnVzXCI6IFwi4oqfXCIsXG4gIFwiYm94cGx1c1wiOiBcIuKKnlwiLFxuICBcImJveHRpbWVzXCI6IFwi4oqgXCIsXG4gIFwiYm94dUxcIjogXCLilZtcIixcbiAgXCJib3h1UlwiOiBcIuKVmFwiLFxuICBcImJveHVsXCI6IFwi4pSYXCIsXG4gIFwiYm94dXJcIjogXCLilJRcIixcbiAgXCJib3h2XCI6IFwi4pSCXCIsXG4gIFwiYm94dkhcIjogXCLilapcIixcbiAgXCJib3h2TFwiOiBcIuKVoVwiLFxuICBcImJveHZSXCI6IFwi4pWeXCIsXG4gIFwiYm94dmhcIjogXCLilLxcIixcbiAgXCJib3h2bFwiOiBcIuKUpFwiLFxuICBcImJveHZyXCI6IFwi4pScXCIsXG4gIFwiYnByaW1lXCI6IFwi4oC1XCIsXG4gIFwiYnJldmVcIjogXCLLmFwiLFxuICBcImJydmJhclwiOiBcIsKmXCIsXG4gIFwiYnNjclwiOiBcIvCdkrdcIixcbiAgXCJic2VtaVwiOiBcIuKBj1wiLFxuICBcImJzaW1cIjogXCLiiL1cIixcbiAgXCJic2ltZVwiOiBcIuKLjVwiLFxuICBcImJzb2xcIjogXCJcXFxcXCIsXG4gIFwiYnNvbGJcIjogXCLip4VcIixcbiAgXCJic29saHN1YlwiOiBcIuKfiFwiLFxuICBcImJ1bGxcIjogXCLigKJcIixcbiAgXCJidWxsZXRcIjogXCLigKJcIixcbiAgXCJidW1wXCI6IFwi4omOXCIsXG4gIFwiYnVtcEVcIjogXCLiqq5cIixcbiAgXCJidW1wZVwiOiBcIuKJj1wiLFxuICBcImJ1bXBlcVwiOiBcIuKJj1wiLFxuICBcImNhY3V0ZVwiOiBcIsSHXCIsXG4gIFwiY2FwXCI6IFwi4oipXCIsXG4gIFwiY2FwYW5kXCI6IFwi4qmEXCIsXG4gIFwiY2FwYnJjdXBcIjogXCLiqYlcIixcbiAgXCJjYXBjYXBcIjogXCLiqYtcIixcbiAgXCJjYXBjdXBcIjogXCLiqYdcIixcbiAgXCJjYXBkb3RcIjogXCLiqYBcIixcbiAgXCJjYXBzXCI6IFwi4oip77iAXCIsXG4gIFwiY2FyZXRcIjogXCLigYFcIixcbiAgXCJjYXJvblwiOiBcIsuHXCIsXG4gIFwiY2NhcHNcIjogXCLiqY1cIixcbiAgXCJjY2Fyb25cIjogXCLEjVwiLFxuICBcImNjZWRpbFwiOiBcIsOnXCIsXG4gIFwiY2NpcmNcIjogXCLEiVwiLFxuICBcImNjdXBzXCI6IFwi4qmMXCIsXG4gIFwiY2N1cHNzbVwiOiBcIuKpkFwiLFxuICBcImNkb3RcIjogXCLEi1wiLFxuICBcImNlZGlsXCI6IFwiwrhcIixcbiAgXCJjZW1wdHl2XCI6IFwi4qayXCIsXG4gIFwiY2VudFwiOiBcIsKiXCIsXG4gIFwiY2VudGVyZG90XCI6IFwiwrdcIixcbiAgXCJjZnJcIjogXCLwnZSgXCIsXG4gIFwiY2hjeVwiOiBcItGHXCIsXG4gIFwiY2hlY2tcIjogXCLinJNcIixcbiAgXCJjaGVja21hcmtcIjogXCLinJNcIixcbiAgXCJjaGlcIjogXCLPh1wiLFxuICBcImNpclwiOiBcIuKXi1wiLFxuICBcImNpckVcIjogXCLip4NcIixcbiAgXCJjaXJjXCI6IFwiy4ZcIixcbiAgXCJjaXJjZXFcIjogXCLiiZdcIixcbiAgXCJjaXJjbGVhcnJvd2xlZnRcIjogXCLihrpcIixcbiAgXCJjaXJjbGVhcnJvd3JpZ2h0XCI6IFwi4oa7XCIsXG4gIFwiY2lyY2xlZFJcIjogXCLCrlwiLFxuICBcImNpcmNsZWRTXCI6IFwi4pOIXCIsXG4gIFwiY2lyY2xlZGFzdFwiOiBcIuKKm1wiLFxuICBcImNpcmNsZWRjaXJjXCI6IFwi4oqaXCIsXG4gIFwiY2lyY2xlZGRhc2hcIjogXCLiip1cIixcbiAgXCJjaXJlXCI6IFwi4omXXCIsXG4gIFwiY2lyZm5pbnRcIjogXCLiqJBcIixcbiAgXCJjaXJtaWRcIjogXCLiq69cIixcbiAgXCJjaXJzY2lyXCI6IFwi4qeCXCIsXG4gIFwiY2x1YnNcIjogXCLimaNcIixcbiAgXCJjbHVic3VpdFwiOiBcIuKZo1wiLFxuICBcImNvbG9uXCI6IFwiOlwiLFxuICBcImNvbG9uZVwiOiBcIuKJlFwiLFxuICBcImNvbG9uZXFcIjogXCLiiZRcIixcbiAgXCJjb21tYVwiOiBcIixcIixcbiAgXCJjb21tYXRcIjogXCJAXCIsXG4gIFwiY29tcFwiOiBcIuKIgVwiLFxuICBcImNvbXBmblwiOiBcIuKImFwiLFxuICBcImNvbXBsZW1lbnRcIjogXCLiiIFcIixcbiAgXCJjb21wbGV4ZXNcIjogXCLihIJcIixcbiAgXCJjb25nXCI6IFwi4omFXCIsXG4gIFwiY29uZ2RvdFwiOiBcIuKprVwiLFxuICBcImNvbmludFwiOiBcIuKIrlwiLFxuICBcImNvcGZcIjogXCLwnZWUXCIsXG4gIFwiY29wcm9kXCI6IFwi4oiQXCIsXG4gIFwiY29weVwiOiBcIsKpXCIsXG4gIFwiY29weXNyXCI6IFwi4oSXXCIsXG4gIFwiY3JhcnJcIjogXCLihrVcIixcbiAgXCJjcm9zc1wiOiBcIuKcl1wiLFxuICBcImNzY3JcIjogXCLwnZK4XCIsXG4gIFwiY3N1YlwiOiBcIuKrj1wiLFxuICBcImNzdWJlXCI6IFwi4quRXCIsXG4gIFwiY3N1cFwiOiBcIuKrkFwiLFxuICBcImNzdXBlXCI6IFwi4quSXCIsXG4gIFwiY3Rkb3RcIjogXCLii69cIixcbiAgXCJjdWRhcnJsXCI6IFwi4qS4XCIsXG4gIFwiY3VkYXJyclwiOiBcIuKktVwiLFxuICBcImN1ZXByXCI6IFwi4oueXCIsXG4gIFwiY3Vlc2NcIjogXCLii59cIixcbiAgXCJjdWxhcnJcIjogXCLihrZcIixcbiAgXCJjdWxhcnJwXCI6IFwi4qS9XCIsXG4gIFwiY3VwXCI6IFwi4oiqXCIsXG4gIFwiY3VwYnJjYXBcIjogXCLiqYhcIixcbiAgXCJjdXBjYXBcIjogXCLiqYZcIixcbiAgXCJjdXBjdXBcIjogXCLiqYpcIixcbiAgXCJjdXBkb3RcIjogXCLiio1cIixcbiAgXCJjdXBvclwiOiBcIuKphVwiLFxuICBcImN1cHNcIjogXCLiiKrvuIBcIixcbiAgXCJjdXJhcnJcIjogXCLihrdcIixcbiAgXCJjdXJhcnJtXCI6IFwi4qS8XCIsXG4gIFwiY3VybHllcXByZWNcIjogXCLii55cIixcbiAgXCJjdXJseWVxc3VjY1wiOiBcIuKLn1wiLFxuICBcImN1cmx5dmVlXCI6IFwi4ouOXCIsXG4gIFwiY3VybHl3ZWRnZVwiOiBcIuKLj1wiLFxuICBcImN1cnJlblwiOiBcIsKkXCIsXG4gIFwiY3VydmVhcnJvd2xlZnRcIjogXCLihrZcIixcbiAgXCJjdXJ2ZWFycm93cmlnaHRcIjogXCLihrdcIixcbiAgXCJjdXZlZVwiOiBcIuKLjlwiLFxuICBcImN1d2VkXCI6IFwi4ouPXCIsXG4gIFwiY3djb25pbnRcIjogXCLiiLJcIixcbiAgXCJjd2ludFwiOiBcIuKIsVwiLFxuICBcImN5bGN0eVwiOiBcIuKMrVwiLFxuICBcImRBcnJcIjogXCLih5NcIixcbiAgXCJkSGFyXCI6IFwi4qWlXCIsXG4gIFwiZGFnZ2VyXCI6IFwi4oCgXCIsXG4gIFwiZGFsZXRoXCI6IFwi4oS4XCIsXG4gIFwiZGFyclwiOiBcIuKGk1wiLFxuICBcImRhc2hcIjogXCLigJBcIixcbiAgXCJkYXNodlwiOiBcIuKKo1wiLFxuICBcImRia2Fyb3dcIjogXCLipI9cIixcbiAgXCJkYmxhY1wiOiBcIsudXCIsXG4gIFwiZGNhcm9uXCI6IFwixI9cIixcbiAgXCJkY3lcIjogXCLQtFwiLFxuICBcImRkXCI6IFwi4oWGXCIsXG4gIFwiZGRhZ2dlclwiOiBcIuKAoVwiLFxuICBcImRkYXJyXCI6IFwi4oeKXCIsXG4gIFwiZGRvdHNlcVwiOiBcIuKpt1wiLFxuICBcImRlZ1wiOiBcIsKwXCIsXG4gIFwiZGVsdGFcIjogXCLOtFwiLFxuICBcImRlbXB0eXZcIjogXCLiprFcIixcbiAgXCJkZmlzaHRcIjogXCLipb9cIixcbiAgXCJkZnJcIjogXCLwnZShXCIsXG4gIFwiZGhhcmxcIjogXCLih4NcIixcbiAgXCJkaGFyclwiOiBcIuKHglwiLFxuICBcImRpYW1cIjogXCLii4RcIixcbiAgXCJkaWFtb25kXCI6IFwi4ouEXCIsXG4gIFwiZGlhbW9uZHN1aXRcIjogXCLimaZcIixcbiAgXCJkaWFtc1wiOiBcIuKZplwiLFxuICBcImRpZVwiOiBcIsKoXCIsXG4gIFwiZGlnYW1tYVwiOiBcIs+dXCIsXG4gIFwiZGlzaW5cIjogXCLii7JcIixcbiAgXCJkaXZcIjogXCLDt1wiLFxuICBcImRpdmlkZVwiOiBcIsO3XCIsXG4gIFwiZGl2aWRlb250aW1lc1wiOiBcIuKLh1wiLFxuICBcImRpdm9ueFwiOiBcIuKLh1wiLFxuICBcImRqY3lcIjogXCLRklwiLFxuICBcImRsY29yblwiOiBcIuKMnlwiLFxuICBcImRsY3JvcFwiOiBcIuKMjVwiLFxuICBcImRvbGxhclwiOiBcIiRcIixcbiAgXCJkb3BmXCI6IFwi8J2VlVwiLFxuICBcImRvdFwiOiBcIsuZXCIsXG4gIFwiZG90ZXFcIjogXCLiiZBcIixcbiAgXCJkb3RlcWRvdFwiOiBcIuKJkVwiLFxuICBcImRvdG1pbnVzXCI6IFwi4oi4XCIsXG4gIFwiZG90cGx1c1wiOiBcIuKIlFwiLFxuICBcImRvdHNxdWFyZVwiOiBcIuKKoVwiLFxuICBcImRvdWJsZWJhcndlZGdlXCI6IFwi4oyGXCIsXG4gIFwiZG93bmFycm93XCI6IFwi4oaTXCIsXG4gIFwiZG93bmRvd25hcnJvd3NcIjogXCLih4pcIixcbiAgXCJkb3duaGFycG9vbmxlZnRcIjogXCLih4NcIixcbiAgXCJkb3duaGFycG9vbnJpZ2h0XCI6IFwi4oeCXCIsXG4gIFwiZHJia2Fyb3dcIjogXCLipJBcIixcbiAgXCJkcmNvcm5cIjogXCLijJ9cIixcbiAgXCJkcmNyb3BcIjogXCLijIxcIixcbiAgXCJkc2NyXCI6IFwi8J2SuVwiLFxuICBcImRzY3lcIjogXCLRlVwiLFxuICBcImRzb2xcIjogXCLip7ZcIixcbiAgXCJkc3Ryb2tcIjogXCLEkVwiLFxuICBcImR0ZG90XCI6IFwi4ouxXCIsXG4gIFwiZHRyaVwiOiBcIuKWv1wiLFxuICBcImR0cmlmXCI6IFwi4pa+XCIsXG4gIFwiZHVhcnJcIjogXCLih7VcIixcbiAgXCJkdWhhclwiOiBcIuKlr1wiLFxuICBcImR3YW5nbGVcIjogXCLipqZcIixcbiAgXCJkemN5XCI6IFwi0Z9cIixcbiAgXCJkemlncmFyclwiOiBcIuKfv1wiLFxuICBcImVERG90XCI6IFwi4qm3XCIsXG4gIFwiZURvdFwiOiBcIuKJkVwiLFxuICBcImVhY3V0ZVwiOiBcIsOpXCIsXG4gIFwiZWFzdGVyXCI6IFwi4qmuXCIsXG4gIFwiZWNhcm9uXCI6IFwixJtcIixcbiAgXCJlY2lyXCI6IFwi4omWXCIsXG4gIFwiZWNpcmNcIjogXCLDqlwiLFxuICBcImVjb2xvblwiOiBcIuKJlVwiLFxuICBcImVjeVwiOiBcItGNXCIsXG4gIFwiZWRvdFwiOiBcIsSXXCIsXG4gIFwiZWVcIjogXCLihYdcIixcbiAgXCJlZkRvdFwiOiBcIuKJklwiLFxuICBcImVmclwiOiBcIvCdlKJcIixcbiAgXCJlZ1wiOiBcIuKqmlwiLFxuICBcImVncmF2ZVwiOiBcIsOoXCIsXG4gIFwiZWdzXCI6IFwi4qqWXCIsXG4gIFwiZWdzZG90XCI6IFwi4qqYXCIsXG4gIFwiZWxcIjogXCLiqplcIixcbiAgXCJlbGludGVyc1wiOiBcIuKPp1wiLFxuICBcImVsbFwiOiBcIuKEk1wiLFxuICBcImVsc1wiOiBcIuKqlVwiLFxuICBcImVsc2RvdFwiOiBcIuKql1wiLFxuICBcImVtYWNyXCI6IFwixJNcIixcbiAgXCJlbXB0eVwiOiBcIuKIhVwiLFxuICBcImVtcHR5c2V0XCI6IFwi4oiFXCIsXG4gIFwiZW1wdHl2XCI6IFwi4oiFXCIsXG4gIFwiZW1zcDEzXCI6IFwi4oCEXCIsXG4gIFwiZW1zcDE0XCI6IFwi4oCFXCIsXG4gIFwiZW1zcFwiOiBcIuKAg1wiLFxuICBcImVuZ1wiOiBcIsWLXCIsXG4gIFwiZW5zcFwiOiBcIuKAglwiLFxuICBcImVvZ29uXCI6IFwixJlcIixcbiAgXCJlb3BmXCI6IFwi8J2VllwiLFxuICBcImVwYXJcIjogXCLii5VcIixcbiAgXCJlcGFyc2xcIjogXCLip6NcIixcbiAgXCJlcGx1c1wiOiBcIuKpsVwiLFxuICBcImVwc2lcIjogXCLOtVwiLFxuICBcImVwc2lsb25cIjogXCLOtVwiLFxuICBcImVwc2l2XCI6IFwiz7VcIixcbiAgXCJlcWNpcmNcIjogXCLiiZZcIixcbiAgXCJlcWNvbG9uXCI6IFwi4omVXCIsXG4gIFwiZXFzaW1cIjogXCLiiYJcIixcbiAgXCJlcXNsYW50Z3RyXCI6IFwi4qqWXCIsXG4gIFwiZXFzbGFudGxlc3NcIjogXCLiqpVcIixcbiAgXCJlcXVhbHNcIjogXCI9XCIsXG4gIFwiZXF1ZXN0XCI6IFwi4omfXCIsXG4gIFwiZXF1aXZcIjogXCLiiaFcIixcbiAgXCJlcXVpdkREXCI6IFwi4qm4XCIsXG4gIFwiZXF2cGFyc2xcIjogXCLip6VcIixcbiAgXCJlckRvdFwiOiBcIuKJk1wiLFxuICBcImVyYXJyXCI6IFwi4qWxXCIsXG4gIFwiZXNjclwiOiBcIuKEr1wiLFxuICBcImVzZG90XCI6IFwi4omQXCIsXG4gIFwiZXNpbVwiOiBcIuKJglwiLFxuICBcImV0YVwiOiBcIs63XCIsXG4gIFwiZXRoXCI6IFwiw7BcIixcbiAgXCJldW1sXCI6IFwiw6tcIixcbiAgXCJldXJvXCI6IFwi4oKsXCIsXG4gIFwiZXhjbFwiOiBcIiFcIixcbiAgXCJleGlzdFwiOiBcIuKIg1wiLFxuICBcImV4cGVjdGF0aW9uXCI6IFwi4oSwXCIsXG4gIFwiZXhwb25lbnRpYWxlXCI6IFwi4oWHXCIsXG4gIFwiZmFsbGluZ2RvdHNlcVwiOiBcIuKJklwiLFxuICBcImZjeVwiOiBcItGEXCIsXG4gIFwiZmVtYWxlXCI6IFwi4pmAXCIsXG4gIFwiZmZpbGlnXCI6IFwi76yDXCIsXG4gIFwiZmZsaWdcIjogXCLvrIBcIixcbiAgXCJmZmxsaWdcIjogXCLvrIRcIixcbiAgXCJmZnJcIjogXCLwnZSjXCIsXG4gIFwiZmlsaWdcIjogXCLvrIFcIixcbiAgXCJmamxpZ1wiOiBcImZqXCIsXG4gIFwiZmxhdFwiOiBcIuKZrVwiLFxuICBcImZsbGlnXCI6IFwi76yCXCIsXG4gIFwiZmx0bnNcIjogXCLilrFcIixcbiAgXCJmbm9mXCI6IFwixpJcIixcbiAgXCJmb3BmXCI6IFwi8J2Vl1wiLFxuICBcImZvcmFsbFwiOiBcIuKIgFwiLFxuICBcImZvcmtcIjogXCLii5RcIixcbiAgXCJmb3JrdlwiOiBcIuKrmVwiLFxuICBcImZwYXJ0aW50XCI6IFwi4qiNXCIsXG4gIFwiZnJhYzEyXCI6IFwiwr1cIixcbiAgXCJmcmFjMTNcIjogXCLihZNcIixcbiAgXCJmcmFjMTRcIjogXCLCvFwiLFxuICBcImZyYWMxNVwiOiBcIuKFlVwiLFxuICBcImZyYWMxNlwiOiBcIuKFmVwiLFxuICBcImZyYWMxOFwiOiBcIuKFm1wiLFxuICBcImZyYWMyM1wiOiBcIuKFlFwiLFxuICBcImZyYWMyNVwiOiBcIuKFllwiLFxuICBcImZyYWMzNFwiOiBcIsK+XCIsXG4gIFwiZnJhYzM1XCI6IFwi4oWXXCIsXG4gIFwiZnJhYzM4XCI6IFwi4oWcXCIsXG4gIFwiZnJhYzQ1XCI6IFwi4oWYXCIsXG4gIFwiZnJhYzU2XCI6IFwi4oWaXCIsXG4gIFwiZnJhYzU4XCI6IFwi4oWdXCIsXG4gIFwiZnJhYzc4XCI6IFwi4oWeXCIsXG4gIFwiZnJhc2xcIjogXCLigYRcIixcbiAgXCJmcm93blwiOiBcIuKMolwiLFxuICBcImZzY3JcIjogXCLwnZK7XCIsXG4gIFwiZ0VcIjogXCLiiadcIixcbiAgXCJnRWxcIjogXCLiqoxcIixcbiAgXCJnYWN1dGVcIjogXCLHtVwiLFxuICBcImdhbW1hXCI6IFwizrNcIixcbiAgXCJnYW1tYWRcIjogXCLPnVwiLFxuICBcImdhcFwiOiBcIuKqhlwiLFxuICBcImdicmV2ZVwiOiBcIsSfXCIsXG4gIFwiZ2NpcmNcIjogXCLEnVwiLFxuICBcImdjeVwiOiBcItCzXCIsXG4gIFwiZ2RvdFwiOiBcIsShXCIsXG4gIFwiZ2VcIjogXCLiiaVcIixcbiAgXCJnZWxcIjogXCLii5tcIixcbiAgXCJnZXFcIjogXCLiiaVcIixcbiAgXCJnZXFxXCI6IFwi4omnXCIsXG4gIFwiZ2Vxc2xhbnRcIjogXCLiqb5cIixcbiAgXCJnZXNcIjogXCLiqb5cIixcbiAgXCJnZXNjY1wiOiBcIuKqqVwiLFxuICBcImdlc2RvdFwiOiBcIuKqgFwiLFxuICBcImdlc2RvdG9cIjogXCLiqoJcIixcbiAgXCJnZXNkb3RvbFwiOiBcIuKqhFwiLFxuICBcImdlc2xcIjogXCLii5vvuIBcIixcbiAgXCJnZXNsZXNcIjogXCLiqpRcIixcbiAgXCJnZnJcIjogXCLwnZSkXCIsXG4gIFwiZ2dcIjogXCLiiatcIixcbiAgXCJnZ2dcIjogXCLii5lcIixcbiAgXCJnaW1lbFwiOiBcIuKEt1wiLFxuICBcImdqY3lcIjogXCLRk1wiLFxuICBcImdsXCI6IFwi4om3XCIsXG4gIFwiZ2xFXCI6IFwi4qqSXCIsXG4gIFwiZ2xhXCI6IFwi4qqlXCIsXG4gIFwiZ2xqXCI6IFwi4qqkXCIsXG4gIFwiZ25FXCI6IFwi4ompXCIsXG4gIFwiZ25hcFwiOiBcIuKqilwiLFxuICBcImduYXBwcm94XCI6IFwi4qqKXCIsXG4gIFwiZ25lXCI6IFwi4qqIXCIsXG4gIFwiZ25lcVwiOiBcIuKqiFwiLFxuICBcImduZXFxXCI6IFwi4ompXCIsXG4gIFwiZ25zaW1cIjogXCLii6dcIixcbiAgXCJnb3BmXCI6IFwi8J2VmFwiLFxuICBcImdyYXZlXCI6IFwiYFwiLFxuICBcImdzY3JcIjogXCLihIpcIixcbiAgXCJnc2ltXCI6IFwi4omzXCIsXG4gIFwiZ3NpbWVcIjogXCLiqo5cIixcbiAgXCJnc2ltbFwiOiBcIuKqkFwiLFxuICBcImd0XCI6IFwiPlwiLFxuICBcImd0Y2NcIjogXCLiqqdcIixcbiAgXCJndGNpclwiOiBcIuKpulwiLFxuICBcImd0ZG90XCI6IFwi4ouXXCIsXG4gIFwiZ3RsUGFyXCI6IFwi4qaVXCIsXG4gIFwiZ3RxdWVzdFwiOiBcIuKpvFwiLFxuICBcImd0cmFwcHJveFwiOiBcIuKqhlwiLFxuICBcImd0cmFyclwiOiBcIuKluFwiLFxuICBcImd0cmRvdFwiOiBcIuKLl1wiLFxuICBcImd0cmVxbGVzc1wiOiBcIuKLm1wiLFxuICBcImd0cmVxcWxlc3NcIjogXCLiqoxcIixcbiAgXCJndHJsZXNzXCI6IFwi4om3XCIsXG4gIFwiZ3Ryc2ltXCI6IFwi4omzXCIsXG4gIFwiZ3ZlcnRuZXFxXCI6IFwi4omp77iAXCIsXG4gIFwiZ3ZuRVwiOiBcIuKJqe+4gFwiLFxuICBcImhBcnJcIjogXCLih5RcIixcbiAgXCJoYWlyc3BcIjogXCLigIpcIixcbiAgXCJoYWxmXCI6IFwiwr1cIixcbiAgXCJoYW1pbHRcIjogXCLihItcIixcbiAgXCJoYXJkY3lcIjogXCLRilwiLFxuICBcImhhcnJcIjogXCLihpRcIixcbiAgXCJoYXJyY2lyXCI6IFwi4qWIXCIsXG4gIFwiaGFycndcIjogXCLihq1cIixcbiAgXCJoYmFyXCI6IFwi4oSPXCIsXG4gIFwiaGNpcmNcIjogXCLEpVwiLFxuICBcImhlYXJ0c1wiOiBcIuKZpVwiLFxuICBcImhlYXJ0c3VpdFwiOiBcIuKZpVwiLFxuICBcImhlbGxpcFwiOiBcIuKAplwiLFxuICBcImhlcmNvblwiOiBcIuKKuVwiLFxuICBcImhmclwiOiBcIvCdlKVcIixcbiAgXCJoa3NlYXJvd1wiOiBcIuKkpVwiLFxuICBcImhrc3dhcm93XCI6IFwi4qSmXCIsXG4gIFwiaG9hcnJcIjogXCLih79cIixcbiAgXCJob210aHRcIjogXCLiiLtcIixcbiAgXCJob29rbGVmdGFycm93XCI6IFwi4oapXCIsXG4gIFwiaG9va3JpZ2h0YXJyb3dcIjogXCLihqpcIixcbiAgXCJob3BmXCI6IFwi8J2VmVwiLFxuICBcImhvcmJhclwiOiBcIuKAlVwiLFxuICBcImhzY3JcIjogXCLwnZK9XCIsXG4gIFwiaHNsYXNoXCI6IFwi4oSPXCIsXG4gIFwiaHN0cm9rXCI6IFwixKdcIixcbiAgXCJoeWJ1bGxcIjogXCLigYNcIixcbiAgXCJoeXBoZW5cIjogXCLigJBcIixcbiAgXCJpYWN1dGVcIjogXCLDrVwiLFxuICBcImljXCI6IFwi4oGjXCIsXG4gIFwiaWNpcmNcIjogXCLDrlwiLFxuICBcImljeVwiOiBcItC4XCIsXG4gIFwiaWVjeVwiOiBcItC1XCIsXG4gIFwiaWV4Y2xcIjogXCLCoVwiLFxuICBcImlmZlwiOiBcIuKHlFwiLFxuICBcImlmclwiOiBcIvCdlKZcIixcbiAgXCJpZ3JhdmVcIjogXCLDrFwiLFxuICBcImlpXCI6IFwi4oWIXCIsXG4gIFwiaWlpaW50XCI6IFwi4qiMXCIsXG4gIFwiaWlpbnRcIjogXCLiiK1cIixcbiAgXCJpaW5maW5cIjogXCLip5xcIixcbiAgXCJpaW90YVwiOiBcIuKEqVwiLFxuICBcImlqbGlnXCI6IFwixLNcIixcbiAgXCJpbWFjclwiOiBcIsSrXCIsXG4gIFwiaW1hZ2VcIjogXCLihJFcIixcbiAgXCJpbWFnbGluZVwiOiBcIuKEkFwiLFxuICBcImltYWdwYXJ0XCI6IFwi4oSRXCIsXG4gIFwiaW1hdGhcIjogXCLEsVwiLFxuICBcImltb2ZcIjogXCLiirdcIixcbiAgXCJpbXBlZFwiOiBcIsa1XCIsXG4gIFwiaW5cIjogXCLiiIhcIixcbiAgXCJpbmNhcmVcIjogXCLihIVcIixcbiAgXCJpbmZpblwiOiBcIuKInlwiLFxuICBcImluZmludGllXCI6IFwi4qedXCIsXG4gIFwiaW5vZG90XCI6IFwixLFcIixcbiAgXCJpbnRcIjogXCLiiKtcIixcbiAgXCJpbnRjYWxcIjogXCLiirpcIixcbiAgXCJpbnRlZ2Vyc1wiOiBcIuKEpFwiLFxuICBcImludGVyY2FsXCI6IFwi4oq6XCIsXG4gIFwiaW50bGFyaGtcIjogXCLiqJdcIixcbiAgXCJpbnRwcm9kXCI6IFwi4qi8XCIsXG4gIFwiaW9jeVwiOiBcItGRXCIsXG4gIFwiaW9nb25cIjogXCLEr1wiLFxuICBcImlvcGZcIjogXCLwnZWaXCIsXG4gIFwiaW90YVwiOiBcIs65XCIsXG4gIFwiaXByb2RcIjogXCLiqLxcIixcbiAgXCJpcXVlc3RcIjogXCLCv1wiLFxuICBcImlzY3JcIjogXCLwnZK+XCIsXG4gIFwiaXNpblwiOiBcIuKIiFwiLFxuICBcImlzaW5FXCI6IFwi4ou5XCIsXG4gIFwiaXNpbmRvdFwiOiBcIuKLtVwiLFxuICBcImlzaW5zXCI6IFwi4ou0XCIsXG4gIFwiaXNpbnN2XCI6IFwi4ouzXCIsXG4gIFwiaXNpbnZcIjogXCLiiIhcIixcbiAgXCJpdFwiOiBcIuKBolwiLFxuICBcIml0aWxkZVwiOiBcIsSpXCIsXG4gIFwiaXVrY3lcIjogXCLRllwiLFxuICBcIml1bWxcIjogXCLDr1wiLFxuICBcImpjaXJjXCI6IFwixLVcIixcbiAgXCJqY3lcIjogXCLQuVwiLFxuICBcImpmclwiOiBcIvCdlKdcIixcbiAgXCJqbWF0aFwiOiBcIsi3XCIsXG4gIFwiam9wZlwiOiBcIvCdlZtcIixcbiAgXCJqc2NyXCI6IFwi8J2Sv1wiLFxuICBcImpzZXJjeVwiOiBcItGYXCIsXG4gIFwianVrY3lcIjogXCLRlFwiLFxuICBcImthcHBhXCI6IFwizrpcIixcbiAgXCJrYXBwYXZcIjogXCLPsFwiLFxuICBcImtjZWRpbFwiOiBcIsS3XCIsXG4gIFwia2N5XCI6IFwi0LpcIixcbiAgXCJrZnJcIjogXCLwnZSoXCIsXG4gIFwia2dyZWVuXCI6IFwixLhcIixcbiAgXCJraGN5XCI6IFwi0YVcIixcbiAgXCJramN5XCI6IFwi0ZxcIixcbiAgXCJrb3BmXCI6IFwi8J2VnFwiLFxuICBcImtzY3JcIjogXCLwnZOAXCIsXG4gIFwibEFhcnJcIjogXCLih5pcIixcbiAgXCJsQXJyXCI6IFwi4oeQXCIsXG4gIFwibEF0YWlsXCI6IFwi4qSbXCIsXG4gIFwibEJhcnJcIjogXCLipI5cIixcbiAgXCJsRVwiOiBcIuKJplwiLFxuICBcImxFZ1wiOiBcIuKqi1wiLFxuICBcImxIYXJcIjogXCLipaJcIixcbiAgXCJsYWN1dGVcIjogXCLEulwiLFxuICBcImxhZW1wdHl2XCI6IFwi4qa0XCIsXG4gIFwibGFncmFuXCI6IFwi4oSSXCIsXG4gIFwibGFtYmRhXCI6IFwizrtcIixcbiAgXCJsYW5nXCI6IFwi4p+oXCIsXG4gIFwibGFuZ2RcIjogXCLippFcIixcbiAgXCJsYW5nbGVcIjogXCLin6hcIixcbiAgXCJsYXBcIjogXCLiqoVcIixcbiAgXCJsYXF1b1wiOiBcIsKrXCIsXG4gIFwibGFyclwiOiBcIuKGkFwiLFxuICBcImxhcnJiXCI6IFwi4oekXCIsXG4gIFwibGFycmJmc1wiOiBcIuKkn1wiLFxuICBcImxhcnJmc1wiOiBcIuKknVwiLFxuICBcImxhcnJoa1wiOiBcIuKGqVwiLFxuICBcImxhcnJscFwiOiBcIuKGq1wiLFxuICBcImxhcnJwbFwiOiBcIuKkuVwiLFxuICBcImxhcnJzaW1cIjogXCLipbNcIixcbiAgXCJsYXJydGxcIjogXCLihqJcIixcbiAgXCJsYXRcIjogXCLiqqtcIixcbiAgXCJsYXRhaWxcIjogXCLipJlcIixcbiAgXCJsYXRlXCI6IFwi4qqtXCIsXG4gIFwibGF0ZXNcIjogXCLiqq3vuIBcIixcbiAgXCJsYmFyclwiOiBcIuKkjFwiLFxuICBcImxiYnJrXCI6IFwi4p2yXCIsXG4gIFwibGJyYWNlXCI6IFwie1wiLFxuICBcImxicmFja1wiOiBcIltcIixcbiAgXCJsYnJrZVwiOiBcIuKmi1wiLFxuICBcImxicmtzbGRcIjogXCLipo9cIixcbiAgXCJsYnJrc2x1XCI6IFwi4qaNXCIsXG4gIFwibGNhcm9uXCI6IFwixL5cIixcbiAgXCJsY2VkaWxcIjogXCLEvFwiLFxuICBcImxjZWlsXCI6IFwi4oyIXCIsXG4gIFwibGN1YlwiOiBcIntcIixcbiAgXCJsY3lcIjogXCLQu1wiLFxuICBcImxkY2FcIjogXCLipLZcIixcbiAgXCJsZHF1b1wiOiBcIuKAnFwiLFxuICBcImxkcXVvclwiOiBcIuKAnlwiLFxuICBcImxkcmRoYXJcIjogXCLipadcIixcbiAgXCJsZHJ1c2hhclwiOiBcIuKli1wiLFxuICBcImxkc2hcIjogXCLihrJcIixcbiAgXCJsZVwiOiBcIuKJpFwiLFxuICBcImxlZnRhcnJvd1wiOiBcIuKGkFwiLFxuICBcImxlZnRhcnJvd3RhaWxcIjogXCLihqJcIixcbiAgXCJsZWZ0aGFycG9vbmRvd25cIjogXCLihr1cIixcbiAgXCJsZWZ0aGFycG9vbnVwXCI6IFwi4oa8XCIsXG4gIFwibGVmdGxlZnRhcnJvd3NcIjogXCLih4dcIixcbiAgXCJsZWZ0cmlnaHRhcnJvd1wiOiBcIuKGlFwiLFxuICBcImxlZnRyaWdodGFycm93c1wiOiBcIuKHhlwiLFxuICBcImxlZnRyaWdodGhhcnBvb25zXCI6IFwi4oeLXCIsXG4gIFwibGVmdHJpZ2h0c3F1aWdhcnJvd1wiOiBcIuKGrVwiLFxuICBcImxlZnR0aHJlZXRpbWVzXCI6IFwi4ouLXCIsXG4gIFwibGVnXCI6IFwi4ouaXCIsXG4gIFwibGVxXCI6IFwi4omkXCIsXG4gIFwibGVxcVwiOiBcIuKJplwiLFxuICBcImxlcXNsYW50XCI6IFwi4qm9XCIsXG4gIFwibGVzXCI6IFwi4qm9XCIsXG4gIFwibGVzY2NcIjogXCLiqqhcIixcbiAgXCJsZXNkb3RcIjogXCLiqb9cIixcbiAgXCJsZXNkb3RvXCI6IFwi4qqBXCIsXG4gIFwibGVzZG90b3JcIjogXCLiqoNcIixcbiAgXCJsZXNnXCI6IFwi4oua77iAXCIsXG4gIFwibGVzZ2VzXCI6IFwi4qqTXCIsXG4gIFwibGVzc2FwcHJveFwiOiBcIuKqhVwiLFxuICBcImxlc3Nkb3RcIjogXCLii5ZcIixcbiAgXCJsZXNzZXFndHJcIjogXCLii5pcIixcbiAgXCJsZXNzZXFxZ3RyXCI6IFwi4qqLXCIsXG4gIFwibGVzc2d0clwiOiBcIuKJtlwiLFxuICBcImxlc3NzaW1cIjogXCLiibJcIixcbiAgXCJsZmlzaHRcIjogXCLipbxcIixcbiAgXCJsZmxvb3JcIjogXCLijIpcIixcbiAgXCJsZnJcIjogXCLwnZSpXCIsXG4gIFwibGdcIjogXCLiibZcIixcbiAgXCJsZ0VcIjogXCLiqpFcIixcbiAgXCJsaGFyZFwiOiBcIuKGvVwiLFxuICBcImxoYXJ1XCI6IFwi4oa8XCIsXG4gIFwibGhhcnVsXCI6IFwi4qWqXCIsXG4gIFwibGhibGtcIjogXCLiloRcIixcbiAgXCJsamN5XCI6IFwi0ZlcIixcbiAgXCJsbFwiOiBcIuKJqlwiLFxuICBcImxsYXJyXCI6IFwi4oeHXCIsXG4gIFwibGxjb3JuZXJcIjogXCLijJ5cIixcbiAgXCJsbGhhcmRcIjogXCLipatcIixcbiAgXCJsbHRyaVwiOiBcIuKXulwiLFxuICBcImxtaWRvdFwiOiBcIsWAXCIsXG4gIFwibG1vdXN0XCI6IFwi4o6wXCIsXG4gIFwibG1vdXN0YWNoZVwiOiBcIuKOsFwiLFxuICBcImxuRVwiOiBcIuKJqFwiLFxuICBcImxuYXBcIjogXCLiqolcIixcbiAgXCJsbmFwcHJveFwiOiBcIuKqiVwiLFxuICBcImxuZVwiOiBcIuKqh1wiLFxuICBcImxuZXFcIjogXCLiqodcIixcbiAgXCJsbmVxcVwiOiBcIuKJqFwiLFxuICBcImxuc2ltXCI6IFwi4oumXCIsXG4gIFwibG9hbmdcIjogXCLin6xcIixcbiAgXCJsb2FyclwiOiBcIuKHvVwiLFxuICBcImxvYnJrXCI6IFwi4p+mXCIsXG4gIFwibG9uZ2xlZnRhcnJvd1wiOiBcIuKftVwiLFxuICBcImxvbmdsZWZ0cmlnaHRhcnJvd1wiOiBcIuKft1wiLFxuICBcImxvbmdtYXBzdG9cIjogXCLin7xcIixcbiAgXCJsb25ncmlnaHRhcnJvd1wiOiBcIuKftlwiLFxuICBcImxvb3BhcnJvd2xlZnRcIjogXCLihqtcIixcbiAgXCJsb29wYXJyb3dyaWdodFwiOiBcIuKGrFwiLFxuICBcImxvcGFyXCI6IFwi4qaFXCIsXG4gIFwibG9wZlwiOiBcIvCdlZ1cIixcbiAgXCJsb3BsdXNcIjogXCLiqK1cIixcbiAgXCJsb3RpbWVzXCI6IFwi4qi0XCIsXG4gIFwibG93YXN0XCI6IFwi4oiXXCIsXG4gIFwibG93YmFyXCI6IFwiX1wiLFxuICBcImxvelwiOiBcIuKXilwiLFxuICBcImxvemVuZ2VcIjogXCLil4pcIixcbiAgXCJsb3pmXCI6IFwi4qerXCIsXG4gIFwibHBhclwiOiBcIihcIixcbiAgXCJscGFybHRcIjogXCLippNcIixcbiAgXCJscmFyclwiOiBcIuKHhlwiLFxuICBcImxyY29ybmVyXCI6IFwi4oyfXCIsXG4gIFwibHJoYXJcIjogXCLih4tcIixcbiAgXCJscmhhcmRcIjogXCLipa1cIixcbiAgXCJscm1cIjogXCLigI5cIixcbiAgXCJscnRyaVwiOiBcIuKKv1wiLFxuICBcImxzYXF1b1wiOiBcIuKAuVwiLFxuICBcImxzY3JcIjogXCLwnZOBXCIsXG4gIFwibHNoXCI6IFwi4oawXCIsXG4gIFwibHNpbVwiOiBcIuKJslwiLFxuICBcImxzaW1lXCI6IFwi4qqNXCIsXG4gIFwibHNpbWdcIjogXCLiqo9cIixcbiAgXCJsc3FiXCI6IFwiW1wiLFxuICBcImxzcXVvXCI6IFwi4oCYXCIsXG4gIFwibHNxdW9yXCI6IFwi4oCaXCIsXG4gIFwibHN0cm9rXCI6IFwixYJcIixcbiAgXCJsdFwiOiBcIjxcIixcbiAgXCJsdGNjXCI6IFwi4qqmXCIsXG4gIFwibHRjaXJcIjogXCLiqblcIixcbiAgXCJsdGRvdFwiOiBcIuKLllwiLFxuICBcImx0aHJlZVwiOiBcIuKLi1wiLFxuICBcImx0aW1lc1wiOiBcIuKLiVwiLFxuICBcImx0bGFyclwiOiBcIuKltlwiLFxuICBcImx0cXVlc3RcIjogXCLiqbtcIixcbiAgXCJsdHJQYXJcIjogXCLippZcIixcbiAgXCJsdHJpXCI6IFwi4peDXCIsXG4gIFwibHRyaWVcIjogXCLiirRcIixcbiAgXCJsdHJpZlwiOiBcIuKXglwiLFxuICBcImx1cmRzaGFyXCI6IFwi4qWKXCIsXG4gIFwibHVydWhhclwiOiBcIuKlplwiLFxuICBcImx2ZXJ0bmVxcVwiOiBcIuKJqO+4gFwiLFxuICBcImx2bkVcIjogXCLiiajvuIBcIixcbiAgXCJtRERvdFwiOiBcIuKIulwiLFxuICBcIm1hY3JcIjogXCLCr1wiLFxuICBcIm1hbGVcIjogXCLimYJcIixcbiAgXCJtYWx0XCI6IFwi4pygXCIsXG4gIFwibWFsdGVzZVwiOiBcIuKcoFwiLFxuICBcIm1hcFwiOiBcIuKGplwiLFxuICBcIm1hcHN0b1wiOiBcIuKGplwiLFxuICBcIm1hcHN0b2Rvd25cIjogXCLihqdcIixcbiAgXCJtYXBzdG9sZWZ0XCI6IFwi4oakXCIsXG4gIFwibWFwc3RvdXBcIjogXCLihqVcIixcbiAgXCJtYXJrZXJcIjogXCLilq5cIixcbiAgXCJtY29tbWFcIjogXCLiqKlcIixcbiAgXCJtY3lcIjogXCLQvFwiLFxuICBcIm1kYXNoXCI6IFwi4oCUXCIsXG4gIFwibWVhc3VyZWRhbmdsZVwiOiBcIuKIoVwiLFxuICBcIm1mclwiOiBcIvCdlKpcIixcbiAgXCJtaG9cIjogXCLihKdcIixcbiAgXCJtaWNyb1wiOiBcIsK1XCIsXG4gIFwibWlkXCI6IFwi4oijXCIsXG4gIFwibWlkYXN0XCI6IFwiKlwiLFxuICBcIm1pZGNpclwiOiBcIuKrsFwiLFxuICBcIm1pZGRvdFwiOiBcIsK3XCIsXG4gIFwibWludXNcIjogXCLiiJJcIixcbiAgXCJtaW51c2JcIjogXCLiip9cIixcbiAgXCJtaW51c2RcIjogXCLiiLhcIixcbiAgXCJtaW51c2R1XCI6IFwi4qiqXCIsXG4gIFwibWxjcFwiOiBcIuKrm1wiLFxuICBcIm1sZHJcIjogXCLigKZcIixcbiAgXCJtbnBsdXNcIjogXCLiiJNcIixcbiAgXCJtb2RlbHNcIjogXCLiiqdcIixcbiAgXCJtb3BmXCI6IFwi8J2VnlwiLFxuICBcIm1wXCI6IFwi4oiTXCIsXG4gIFwibXNjclwiOiBcIvCdk4JcIixcbiAgXCJtc3Rwb3NcIjogXCLiiL5cIixcbiAgXCJtdVwiOiBcIs68XCIsXG4gIFwibXVsdGltYXBcIjogXCLiirhcIixcbiAgXCJtdW1hcFwiOiBcIuKKuFwiLFxuICBcIm5HZ1wiOiBcIuKLmcy4XCIsXG4gIFwibkd0XCI6IFwi4omr4oOSXCIsXG4gIFwibkd0dlwiOiBcIuKJq8y4XCIsXG4gIFwibkxlZnRhcnJvd1wiOiBcIuKHjVwiLFxuICBcIm5MZWZ0cmlnaHRhcnJvd1wiOiBcIuKHjlwiLFxuICBcIm5MbFwiOiBcIuKLmMy4XCIsXG4gIFwibkx0XCI6IFwi4omq4oOSXCIsXG4gIFwibkx0dlwiOiBcIuKJqsy4XCIsXG4gIFwiblJpZ2h0YXJyb3dcIjogXCLih49cIixcbiAgXCJuVkRhc2hcIjogXCLiiq9cIixcbiAgXCJuVmRhc2hcIjogXCLiiq5cIixcbiAgXCJuYWJsYVwiOiBcIuKIh1wiLFxuICBcIm5hY3V0ZVwiOiBcIsWEXCIsXG4gIFwibmFuZ1wiOiBcIuKIoOKDklwiLFxuICBcIm5hcFwiOiBcIuKJiVwiLFxuICBcIm5hcEVcIjogXCLiqbDMuFwiLFxuICBcIm5hcGlkXCI6IFwi4omLzLhcIixcbiAgXCJuYXBvc1wiOiBcIsWJXCIsXG4gIFwibmFwcHJveFwiOiBcIuKJiVwiLFxuICBcIm5hdHVyXCI6IFwi4pmuXCIsXG4gIFwibmF0dXJhbFwiOiBcIuKZrlwiLFxuICBcIm5hdHVyYWxzXCI6IFwi4oSVXCIsXG4gIFwibmJzcFwiOiBcIsKgXCIsXG4gIFwibmJ1bXBcIjogXCLiiY7MuFwiLFxuICBcIm5idW1wZVwiOiBcIuKJj8y4XCIsXG4gIFwibmNhcFwiOiBcIuKpg1wiLFxuICBcIm5jYXJvblwiOiBcIsWIXCIsXG4gIFwibmNlZGlsXCI6IFwixYZcIixcbiAgXCJuY29uZ1wiOiBcIuKJh1wiLFxuICBcIm5jb25nZG90XCI6IFwi4qmtzLhcIixcbiAgXCJuY3VwXCI6IFwi4qmCXCIsXG4gIFwibmN5XCI6IFwi0L1cIixcbiAgXCJuZGFzaFwiOiBcIuKAk1wiLFxuICBcIm5lXCI6IFwi4omgXCIsXG4gIFwibmVBcnJcIjogXCLih5dcIixcbiAgXCJuZWFyaGtcIjogXCLipKRcIixcbiAgXCJuZWFyclwiOiBcIuKGl1wiLFxuICBcIm5lYXJyb3dcIjogXCLihpdcIixcbiAgXCJuZWRvdFwiOiBcIuKJkMy4XCIsXG4gIFwibmVxdWl2XCI6IFwi4omiXCIsXG4gIFwibmVzZWFyXCI6IFwi4qSoXCIsXG4gIFwibmVzaW1cIjogXCLiiYLMuFwiLFxuICBcIm5leGlzdFwiOiBcIuKIhFwiLFxuICBcIm5leGlzdHNcIjogXCLiiIRcIixcbiAgXCJuZnJcIjogXCLwnZSrXCIsXG4gIFwibmdFXCI6IFwi4omnzLhcIixcbiAgXCJuZ2VcIjogXCLiibFcIixcbiAgXCJuZ2VxXCI6IFwi4omxXCIsXG4gIFwibmdlcXFcIjogXCLiiafMuFwiLFxuICBcIm5nZXFzbGFudFwiOiBcIuKpvsy4XCIsXG4gIFwibmdlc1wiOiBcIuKpvsy4XCIsXG4gIFwibmdzaW1cIjogXCLiibVcIixcbiAgXCJuZ3RcIjogXCLiia9cIixcbiAgXCJuZ3RyXCI6IFwi4omvXCIsXG4gIFwibmhBcnJcIjogXCLih45cIixcbiAgXCJuaGFyclwiOiBcIuKGrlwiLFxuICBcIm5ocGFyXCI6IFwi4quyXCIsXG4gIFwibmlcIjogXCLiiItcIixcbiAgXCJuaXNcIjogXCLii7xcIixcbiAgXCJuaXNkXCI6IFwi4ou6XCIsXG4gIFwibml2XCI6IFwi4oiLXCIsXG4gIFwibmpjeVwiOiBcItGaXCIsXG4gIFwibmxBcnJcIjogXCLih41cIixcbiAgXCJubEVcIjogXCLiiabMuFwiLFxuICBcIm5sYXJyXCI6IFwi4oaaXCIsXG4gIFwibmxkclwiOiBcIuKApVwiLFxuICBcIm5sZVwiOiBcIuKJsFwiLFxuICBcIm5sZWZ0YXJyb3dcIjogXCLihppcIixcbiAgXCJubGVmdHJpZ2h0YXJyb3dcIjogXCLihq5cIixcbiAgXCJubGVxXCI6IFwi4omwXCIsXG4gIFwibmxlcXFcIjogXCLiiabMuFwiLFxuICBcIm5sZXFzbGFudFwiOiBcIuKpvcy4XCIsXG4gIFwibmxlc1wiOiBcIuKpvcy4XCIsXG4gIFwibmxlc3NcIjogXCLiia5cIixcbiAgXCJubHNpbVwiOiBcIuKJtFwiLFxuICBcIm5sdFwiOiBcIuKJrlwiLFxuICBcIm5sdHJpXCI6IFwi4ouqXCIsXG4gIFwibmx0cmllXCI6IFwi4ousXCIsXG4gIFwibm1pZFwiOiBcIuKIpFwiLFxuICBcIm5vcGZcIjogXCLwnZWfXCIsXG4gIFwibm90XCI6IFwiwqxcIixcbiAgXCJub3RpblwiOiBcIuKIiVwiLFxuICBcIm5vdGluRVwiOiBcIuKLucy4XCIsXG4gIFwibm90aW5kb3RcIjogXCLii7XMuFwiLFxuICBcIm5vdGludmFcIjogXCLiiIlcIixcbiAgXCJub3RpbnZiXCI6IFwi4ou3XCIsXG4gIFwibm90aW52Y1wiOiBcIuKLtlwiLFxuICBcIm5vdG5pXCI6IFwi4oiMXCIsXG4gIFwibm90bml2YVwiOiBcIuKIjFwiLFxuICBcIm5vdG5pdmJcIjogXCLii75cIixcbiAgXCJub3RuaXZjXCI6IFwi4ou9XCIsXG4gIFwibnBhclwiOiBcIuKIplwiLFxuICBcIm5wYXJhbGxlbFwiOiBcIuKIplwiLFxuICBcIm5wYXJzbFwiOiBcIuKrveKDpVwiLFxuICBcIm5wYXJ0XCI6IFwi4oiCzLhcIixcbiAgXCJucG9saW50XCI6IFwi4qiUXCIsXG4gIFwibnByXCI6IFwi4oqAXCIsXG4gIFwibnByY3VlXCI6IFwi4ougXCIsXG4gIFwibnByZVwiOiBcIuKqr8y4XCIsXG4gIFwibnByZWNcIjogXCLiioBcIixcbiAgXCJucHJlY2VxXCI6IFwi4qqvzLhcIixcbiAgXCJuckFyclwiOiBcIuKHj1wiLFxuICBcIm5yYXJyXCI6IFwi4oabXCIsXG4gIFwibnJhcnJjXCI6IFwi4qSzzLhcIixcbiAgXCJucmFycndcIjogXCLihp3MuFwiLFxuICBcIm5yaWdodGFycm93XCI6IFwi4oabXCIsXG4gIFwibnJ0cmlcIjogXCLii6tcIixcbiAgXCJucnRyaWVcIjogXCLii61cIixcbiAgXCJuc2NcIjogXCLiioFcIixcbiAgXCJuc2NjdWVcIjogXCLii6FcIixcbiAgXCJuc2NlXCI6IFwi4qqwzLhcIixcbiAgXCJuc2NyXCI6IFwi8J2Tg1wiLFxuICBcIm5zaG9ydG1pZFwiOiBcIuKIpFwiLFxuICBcIm5zaG9ydHBhcmFsbGVsXCI6IFwi4oimXCIsXG4gIFwibnNpbVwiOiBcIuKJgVwiLFxuICBcIm5zaW1lXCI6IFwi4omEXCIsXG4gIFwibnNpbWVxXCI6IFwi4omEXCIsXG4gIFwibnNtaWRcIjogXCLiiKRcIixcbiAgXCJuc3BhclwiOiBcIuKIplwiLFxuICBcIm5zcXN1YmVcIjogXCLii6JcIixcbiAgXCJuc3FzdXBlXCI6IFwi4oujXCIsXG4gIFwibnN1YlwiOiBcIuKKhFwiLFxuICBcIm5zdWJFXCI6IFwi4quFzLhcIixcbiAgXCJuc3ViZVwiOiBcIuKKiFwiLFxuICBcIm5zdWJzZXRcIjogXCLiioLig5JcIixcbiAgXCJuc3Vic2V0ZXFcIjogXCLiiohcIixcbiAgXCJuc3Vic2V0ZXFxXCI6IFwi4quFzLhcIixcbiAgXCJuc3VjY1wiOiBcIuKKgVwiLFxuICBcIm5zdWNjZXFcIjogXCLiqrDMuFwiLFxuICBcIm5zdXBcIjogXCLiioVcIixcbiAgXCJuc3VwRVwiOiBcIuKrhsy4XCIsXG4gIFwibnN1cGVcIjogXCLiiolcIixcbiAgXCJuc3Vwc2V0XCI6IFwi4oqD4oOSXCIsXG4gIFwibnN1cHNldGVxXCI6IFwi4oqJXCIsXG4gIFwibnN1cHNldGVxcVwiOiBcIuKrhsy4XCIsXG4gIFwibnRnbFwiOiBcIuKJuVwiLFxuICBcIm50aWxkZVwiOiBcIsOxXCIsXG4gIFwibnRsZ1wiOiBcIuKJuFwiLFxuICBcIm50cmlhbmdsZWxlZnRcIjogXCLii6pcIixcbiAgXCJudHJpYW5nbGVsZWZ0ZXFcIjogXCLii6xcIixcbiAgXCJudHJpYW5nbGVyaWdodFwiOiBcIuKLq1wiLFxuICBcIm50cmlhbmdsZXJpZ2h0ZXFcIjogXCLii61cIixcbiAgXCJudVwiOiBcIs69XCIsXG4gIFwibnVtXCI6IFwiI1wiLFxuICBcIm51bWVyb1wiOiBcIuKEllwiLFxuICBcIm51bXNwXCI6IFwi4oCHXCIsXG4gIFwibnZEYXNoXCI6IFwi4oqtXCIsXG4gIFwibnZIYXJyXCI6IFwi4qSEXCIsXG4gIFwibnZhcFwiOiBcIuKJjeKDklwiLFxuICBcIm52ZGFzaFwiOiBcIuKKrFwiLFxuICBcIm52Z2VcIjogXCLiiaXig5JcIixcbiAgXCJudmd0XCI6IFwiPuKDklwiLFxuICBcIm52aW5maW5cIjogXCLip55cIixcbiAgXCJudmxBcnJcIjogXCLipIJcIixcbiAgXCJudmxlXCI6IFwi4omk4oOSXCIsXG4gIFwibnZsdFwiOiBcIjzig5JcIixcbiAgXCJudmx0cmllXCI6IFwi4oq04oOSXCIsXG4gIFwibnZyQXJyXCI6IFwi4qSDXCIsXG4gIFwibnZydHJpZVwiOiBcIuKKteKDklwiLFxuICBcIm52c2ltXCI6IFwi4oi84oOSXCIsXG4gIFwibndBcnJcIjogXCLih5ZcIixcbiAgXCJud2FyaGtcIjogXCLipKNcIixcbiAgXCJud2FyclwiOiBcIuKGllwiLFxuICBcIm53YXJyb3dcIjogXCLihpZcIixcbiAgXCJud25lYXJcIjogXCLipKdcIixcbiAgXCJvU1wiOiBcIuKTiFwiLFxuICBcIm9hY3V0ZVwiOiBcIsOzXCIsXG4gIFwib2FzdFwiOiBcIuKKm1wiLFxuICBcIm9jaXJcIjogXCLiippcIixcbiAgXCJvY2lyY1wiOiBcIsO0XCIsXG4gIFwib2N5XCI6IFwi0L5cIixcbiAgXCJvZGFzaFwiOiBcIuKKnVwiLFxuICBcIm9kYmxhY1wiOiBcIsWRXCIsXG4gIFwib2RpdlwiOiBcIuKouFwiLFxuICBcIm9kb3RcIjogXCLiiplcIixcbiAgXCJvZHNvbGRcIjogXCLiprxcIixcbiAgXCJvZWxpZ1wiOiBcIsWTXCIsXG4gIFwib2ZjaXJcIjogXCLipr9cIixcbiAgXCJvZnJcIjogXCLwnZSsXCIsXG4gIFwib2dvblwiOiBcIsubXCIsXG4gIFwib2dyYXZlXCI6IFwiw7JcIixcbiAgXCJvZ3RcIjogXCLip4FcIixcbiAgXCJvaGJhclwiOiBcIuKmtVwiLFxuICBcIm9obVwiOiBcIs6pXCIsXG4gIFwib2ludFwiOiBcIuKIrlwiLFxuICBcIm9sYXJyXCI6IFwi4oa6XCIsXG4gIFwib2xjaXJcIjogXCLipr5cIixcbiAgXCJvbGNyb3NzXCI6IFwi4qa7XCIsXG4gIFwib2xpbmVcIjogXCLigL5cIixcbiAgXCJvbHRcIjogXCLip4BcIixcbiAgXCJvbWFjclwiOiBcIsWNXCIsXG4gIFwib21lZ2FcIjogXCLPiVwiLFxuICBcIm9taWNyb25cIjogXCLOv1wiLFxuICBcIm9taWRcIjogXCLiprZcIixcbiAgXCJvbWludXNcIjogXCLiipZcIixcbiAgXCJvb3BmXCI6IFwi8J2VoFwiLFxuICBcIm9wYXJcIjogXCLiprdcIixcbiAgXCJvcGVycFwiOiBcIuKmuVwiLFxuICBcIm9wbHVzXCI6IFwi4oqVXCIsXG4gIFwib3JcIjogXCLiiKhcIixcbiAgXCJvcmFyclwiOiBcIuKGu1wiLFxuICBcIm9yZFwiOiBcIuKpnVwiLFxuICBcIm9yZGVyXCI6IFwi4oS0XCIsXG4gIFwib3JkZXJvZlwiOiBcIuKEtFwiLFxuICBcIm9yZGZcIjogXCLCqlwiLFxuICBcIm9yZG1cIjogXCLCulwiLFxuICBcIm9yaWdvZlwiOiBcIuKKtlwiLFxuICBcIm9yb3JcIjogXCLiqZZcIixcbiAgXCJvcnNsb3BlXCI6IFwi4qmXXCIsXG4gIFwib3J2XCI6IFwi4qmbXCIsXG4gIFwib3NjclwiOiBcIuKEtFwiLFxuICBcIm9zbGFzaFwiOiBcIsO4XCIsXG4gIFwib3NvbFwiOiBcIuKKmFwiLFxuICBcIm90aWxkZVwiOiBcIsO1XCIsXG4gIFwib3RpbWVzXCI6IFwi4oqXXCIsXG4gIFwib3RpbWVzYXNcIjogXCLiqLZcIixcbiAgXCJvdW1sXCI6IFwiw7ZcIixcbiAgXCJvdmJhclwiOiBcIuKMvVwiLFxuICBcInBhclwiOiBcIuKIpVwiLFxuICBcInBhcmFcIjogXCLCtlwiLFxuICBcInBhcmFsbGVsXCI6IFwi4oilXCIsXG4gIFwicGFyc2ltXCI6IFwi4quzXCIsXG4gIFwicGFyc2xcIjogXCLiq71cIixcbiAgXCJwYXJ0XCI6IFwi4oiCXCIsXG4gIFwicGN5XCI6IFwi0L9cIixcbiAgXCJwZXJjbnRcIjogXCIlXCIsXG4gIFwicGVyaW9kXCI6IFwiLlwiLFxuICBcInBlcm1pbFwiOiBcIuKAsFwiLFxuICBcInBlcnBcIjogXCLiiqVcIixcbiAgXCJwZXJ0ZW5rXCI6IFwi4oCxXCIsXG4gIFwicGZyXCI6IFwi8J2UrVwiLFxuICBcInBoaVwiOiBcIs+GXCIsXG4gIFwicGhpdlwiOiBcIs+VXCIsXG4gIFwicGhtbWF0XCI6IFwi4oSzXCIsXG4gIFwicGhvbmVcIjogXCLimI5cIixcbiAgXCJwaVwiOiBcIs+AXCIsXG4gIFwicGl0Y2hmb3JrXCI6IFwi4ouUXCIsXG4gIFwicGl2XCI6IFwiz5ZcIixcbiAgXCJwbGFuY2tcIjogXCLihI9cIixcbiAgXCJwbGFuY2toXCI6IFwi4oSOXCIsXG4gIFwicGxhbmt2XCI6IFwi4oSPXCIsXG4gIFwicGx1c1wiOiBcIitcIixcbiAgXCJwbHVzYWNpclwiOiBcIuKoo1wiLFxuICBcInBsdXNiXCI6IFwi4oqeXCIsXG4gIFwicGx1c2NpclwiOiBcIuKoolwiLFxuICBcInBsdXNkb1wiOiBcIuKIlFwiLFxuICBcInBsdXNkdVwiOiBcIuKopVwiLFxuICBcInBsdXNlXCI6IFwi4qmyXCIsXG4gIFwicGx1c21uXCI6IFwiwrFcIixcbiAgXCJwbHVzc2ltXCI6IFwi4qimXCIsXG4gIFwicGx1c3R3b1wiOiBcIuKop1wiLFxuICBcInBtXCI6IFwiwrFcIixcbiAgXCJwb2ludGludFwiOiBcIuKolVwiLFxuICBcInBvcGZcIjogXCLwnZWhXCIsXG4gIFwicG91bmRcIjogXCLCo1wiLFxuICBcInByXCI6IFwi4om6XCIsXG4gIFwicHJFXCI6IFwi4qqzXCIsXG4gIFwicHJhcFwiOiBcIuKqt1wiLFxuICBcInByY3VlXCI6IFwi4om8XCIsXG4gIFwicHJlXCI6IFwi4qqvXCIsXG4gIFwicHJlY1wiOiBcIuKJulwiLFxuICBcInByZWNhcHByb3hcIjogXCLiqrdcIixcbiAgXCJwcmVjY3VybHllcVwiOiBcIuKJvFwiLFxuICBcInByZWNlcVwiOiBcIuKqr1wiLFxuICBcInByZWNuYXBwcm94XCI6IFwi4qq5XCIsXG4gIFwicHJlY25lcXFcIjogXCLiqrVcIixcbiAgXCJwcmVjbnNpbVwiOiBcIuKLqFwiLFxuICBcInByZWNzaW1cIjogXCLiib5cIixcbiAgXCJwcmltZVwiOiBcIuKAslwiLFxuICBcInByaW1lc1wiOiBcIuKEmVwiLFxuICBcInBybkVcIjogXCLiqrVcIixcbiAgXCJwcm5hcFwiOiBcIuKquVwiLFxuICBcInBybnNpbVwiOiBcIuKLqFwiLFxuICBcInByb2RcIjogXCLiiI9cIixcbiAgXCJwcm9mYWxhclwiOiBcIuKMrlwiLFxuICBcInByb2ZsaW5lXCI6IFwi4oySXCIsXG4gIFwicHJvZnN1cmZcIjogXCLijJNcIixcbiAgXCJwcm9wXCI6IFwi4oidXCIsXG4gIFwicHJvcHRvXCI6IFwi4oidXCIsXG4gIFwicHJzaW1cIjogXCLiib5cIixcbiAgXCJwcnVyZWxcIjogXCLiirBcIixcbiAgXCJwc2NyXCI6IFwi8J2ThVwiLFxuICBcInBzaVwiOiBcIs+IXCIsXG4gIFwicHVuY3NwXCI6IFwi4oCIXCIsXG4gIFwicWZyXCI6IFwi8J2UrlwiLFxuICBcInFpbnRcIjogXCLiqIxcIixcbiAgXCJxb3BmXCI6IFwi8J2VolwiLFxuICBcInFwcmltZVwiOiBcIuKBl1wiLFxuICBcInFzY3JcIjogXCLwnZOGXCIsXG4gIFwicXVhdGVybmlvbnNcIjogXCLihI1cIixcbiAgXCJxdWF0aW50XCI6IFwi4qiWXCIsXG4gIFwicXVlc3RcIjogXCI/XCIsXG4gIFwicXVlc3RlcVwiOiBcIuKJn1wiLFxuICBcInF1b3RcIjogXCJcXFwiXCIsXG4gIFwickFhcnJcIjogXCLih5tcIixcbiAgXCJyQXJyXCI6IFwi4oeSXCIsXG4gIFwickF0YWlsXCI6IFwi4qScXCIsXG4gIFwickJhcnJcIjogXCLipI9cIixcbiAgXCJySGFyXCI6IFwi4qWkXCIsXG4gIFwicmFjZVwiOiBcIuKIvcyxXCIsXG4gIFwicmFjdXRlXCI6IFwixZVcIixcbiAgXCJyYWRpY1wiOiBcIuKImlwiLFxuICBcInJhZW1wdHl2XCI6IFwi4qazXCIsXG4gIFwicmFuZ1wiOiBcIuKfqVwiLFxuICBcInJhbmdkXCI6IFwi4qaSXCIsXG4gIFwicmFuZ2VcIjogXCLipqVcIixcbiAgXCJyYW5nbGVcIjogXCLin6lcIixcbiAgXCJyYXF1b1wiOiBcIsK7XCIsXG4gIFwicmFyclwiOiBcIuKGklwiLFxuICBcInJhcnJhcFwiOiBcIuKltVwiLFxuICBcInJhcnJiXCI6IFwi4oelXCIsXG4gIFwicmFycmJmc1wiOiBcIuKkoFwiLFxuICBcInJhcnJjXCI6IFwi4qSzXCIsXG4gIFwicmFycmZzXCI6IFwi4qSeXCIsXG4gIFwicmFycmhrXCI6IFwi4oaqXCIsXG4gIFwicmFycmxwXCI6IFwi4oasXCIsXG4gIFwicmFycnBsXCI6IFwi4qWFXCIsXG4gIFwicmFycnNpbVwiOiBcIuKltFwiLFxuICBcInJhcnJ0bFwiOiBcIuKGo1wiLFxuICBcInJhcnJ3XCI6IFwi4oadXCIsXG4gIFwicmF0YWlsXCI6IFwi4qSaXCIsXG4gIFwicmF0aW9cIjogXCLiiLZcIixcbiAgXCJyYXRpb25hbHNcIjogXCLihJpcIixcbiAgXCJyYmFyclwiOiBcIuKkjVwiLFxuICBcInJiYnJrXCI6IFwi4p2zXCIsXG4gIFwicmJyYWNlXCI6IFwifVwiLFxuICBcInJicmFja1wiOiBcIl1cIixcbiAgXCJyYnJrZVwiOiBcIuKmjFwiLFxuICBcInJicmtzbGRcIjogXCLipo5cIixcbiAgXCJyYnJrc2x1XCI6IFwi4qaQXCIsXG4gIFwicmNhcm9uXCI6IFwixZlcIixcbiAgXCJyY2VkaWxcIjogXCLFl1wiLFxuICBcInJjZWlsXCI6IFwi4oyJXCIsXG4gIFwicmN1YlwiOiBcIn1cIixcbiAgXCJyY3lcIjogXCLRgFwiLFxuICBcInJkY2FcIjogXCLipLdcIixcbiAgXCJyZGxkaGFyXCI6IFwi4qWpXCIsXG4gIFwicmRxdW9cIjogXCLigJ1cIixcbiAgXCJyZHF1b3JcIjogXCLigJ1cIixcbiAgXCJyZHNoXCI6IFwi4oazXCIsXG4gIFwicmVhbFwiOiBcIuKEnFwiLFxuICBcInJlYWxpbmVcIjogXCLihJtcIixcbiAgXCJyZWFscGFydFwiOiBcIuKEnFwiLFxuICBcInJlYWxzXCI6IFwi4oSdXCIsXG4gIFwicmVjdFwiOiBcIuKWrVwiLFxuICBcInJlZ1wiOiBcIsKuXCIsXG4gIFwicmZpc2h0XCI6IFwi4qW9XCIsXG4gIFwicmZsb29yXCI6IFwi4oyLXCIsXG4gIFwicmZyXCI6IFwi8J2Ur1wiLFxuICBcInJoYXJkXCI6IFwi4oeBXCIsXG4gIFwicmhhcnVcIjogXCLih4BcIixcbiAgXCJyaGFydWxcIjogXCLipaxcIixcbiAgXCJyaG9cIjogXCLPgVwiLFxuICBcInJob3ZcIjogXCLPsVwiLFxuICBcInJpZ2h0YXJyb3dcIjogXCLihpJcIixcbiAgXCJyaWdodGFycm93dGFpbFwiOiBcIuKGo1wiLFxuICBcInJpZ2h0aGFycG9vbmRvd25cIjogXCLih4FcIixcbiAgXCJyaWdodGhhcnBvb251cFwiOiBcIuKHgFwiLFxuICBcInJpZ2h0bGVmdGFycm93c1wiOiBcIuKHhFwiLFxuICBcInJpZ2h0bGVmdGhhcnBvb25zXCI6IFwi4oeMXCIsXG4gIFwicmlnaHRyaWdodGFycm93c1wiOiBcIuKHiVwiLFxuICBcInJpZ2h0c3F1aWdhcnJvd1wiOiBcIuKGnVwiLFxuICBcInJpZ2h0dGhyZWV0aW1lc1wiOiBcIuKLjFwiLFxuICBcInJpbmdcIjogXCLLmlwiLFxuICBcInJpc2luZ2RvdHNlcVwiOiBcIuKJk1wiLFxuICBcInJsYXJyXCI6IFwi4oeEXCIsXG4gIFwicmxoYXJcIjogXCLih4xcIixcbiAgXCJybG1cIjogXCLigI9cIixcbiAgXCJybW91c3RcIjogXCLijrFcIixcbiAgXCJybW91c3RhY2hlXCI6IFwi4o6xXCIsXG4gIFwicm5taWRcIjogXCLiq65cIixcbiAgXCJyb2FuZ1wiOiBcIuKfrVwiLFxuICBcInJvYXJyXCI6IFwi4oe+XCIsXG4gIFwicm9icmtcIjogXCLin6dcIixcbiAgXCJyb3BhclwiOiBcIuKmhlwiLFxuICBcInJvcGZcIjogXCLwnZWjXCIsXG4gIFwicm9wbHVzXCI6IFwi4qiuXCIsXG4gIFwicm90aW1lc1wiOiBcIuKotVwiLFxuICBcInJwYXJcIjogXCIpXCIsXG4gIFwicnBhcmd0XCI6IFwi4qaUXCIsXG4gIFwicnBwb2xpbnRcIjogXCLiqJJcIixcbiAgXCJycmFyclwiOiBcIuKHiVwiLFxuICBcInJzYXF1b1wiOiBcIuKAulwiLFxuICBcInJzY3JcIjogXCLwnZOHXCIsXG4gIFwicnNoXCI6IFwi4oaxXCIsXG4gIFwicnNxYlwiOiBcIl1cIixcbiAgXCJyc3F1b1wiOiBcIuKAmVwiLFxuICBcInJzcXVvclwiOiBcIuKAmVwiLFxuICBcInJ0aHJlZVwiOiBcIuKLjFwiLFxuICBcInJ0aW1lc1wiOiBcIuKLilwiLFxuICBcInJ0cmlcIjogXCLilrlcIixcbiAgXCJydHJpZVwiOiBcIuKKtVwiLFxuICBcInJ0cmlmXCI6IFwi4pa4XCIsXG4gIFwicnRyaWx0cmlcIjogXCLip45cIixcbiAgXCJydWx1aGFyXCI6IFwi4qWoXCIsXG4gIFwicnhcIjogXCLihJ5cIixcbiAgXCJzYWN1dGVcIjogXCLFm1wiLFxuICBcInNicXVvXCI6IFwi4oCaXCIsXG4gIFwic2NcIjogXCLiibtcIixcbiAgXCJzY0VcIjogXCLiqrRcIixcbiAgXCJzY2FwXCI6IFwi4qq4XCIsXG4gIFwic2Nhcm9uXCI6IFwixaFcIixcbiAgXCJzY2N1ZVwiOiBcIuKJvVwiLFxuICBcInNjZVwiOiBcIuKqsFwiLFxuICBcInNjZWRpbFwiOiBcIsWfXCIsXG4gIFwic2NpcmNcIjogXCLFnVwiLFxuICBcInNjbkVcIjogXCLiqrZcIixcbiAgXCJzY25hcFwiOiBcIuKqulwiLFxuICBcInNjbnNpbVwiOiBcIuKLqVwiLFxuICBcInNjcG9saW50XCI6IFwi4qiTXCIsXG4gIFwic2NzaW1cIjogXCLiib9cIixcbiAgXCJzY3lcIjogXCLRgVwiLFxuICBcInNkb3RcIjogXCLii4VcIixcbiAgXCJzZG90YlwiOiBcIuKKoVwiLFxuICBcInNkb3RlXCI6IFwi4qmmXCIsXG4gIFwic2VBcnJcIjogXCLih5hcIixcbiAgXCJzZWFyaGtcIjogXCLipKVcIixcbiAgXCJzZWFyclwiOiBcIuKGmFwiLFxuICBcInNlYXJyb3dcIjogXCLihphcIixcbiAgXCJzZWN0XCI6IFwiwqdcIixcbiAgXCJzZW1pXCI6IFwiO1wiLFxuICBcInNlc3dhclwiOiBcIuKkqVwiLFxuICBcInNldG1pbnVzXCI6IFwi4oiWXCIsXG4gIFwic2V0bW5cIjogXCLiiJZcIixcbiAgXCJzZXh0XCI6IFwi4py2XCIsXG4gIFwic2ZyXCI6IFwi8J2UsFwiLFxuICBcInNmcm93blwiOiBcIuKMolwiLFxuICBcInNoYXJwXCI6IFwi4pmvXCIsXG4gIFwic2hjaGN5XCI6IFwi0YlcIixcbiAgXCJzaGN5XCI6IFwi0YhcIixcbiAgXCJzaG9ydG1pZFwiOiBcIuKIo1wiLFxuICBcInNob3J0cGFyYWxsZWxcIjogXCLiiKVcIixcbiAgXCJzaHlcIjogXCLCrVwiLFxuICBcInNpZ21hXCI6IFwiz4NcIixcbiAgXCJzaWdtYWZcIjogXCLPglwiLFxuICBcInNpZ21hdlwiOiBcIs+CXCIsXG4gIFwic2ltXCI6IFwi4oi8XCIsXG4gIFwic2ltZG90XCI6IFwi4qmqXCIsXG4gIFwic2ltZVwiOiBcIuKJg1wiLFxuICBcInNpbWVxXCI6IFwi4omDXCIsXG4gIFwic2ltZ1wiOiBcIuKqnlwiLFxuICBcInNpbWdFXCI6IFwi4qqgXCIsXG4gIFwic2ltbFwiOiBcIuKqnVwiLFxuICBcInNpbWxFXCI6IFwi4qqfXCIsXG4gIFwic2ltbmVcIjogXCLiiYZcIixcbiAgXCJzaW1wbHVzXCI6IFwi4qikXCIsXG4gIFwic2ltcmFyclwiOiBcIuKlslwiLFxuICBcInNsYXJyXCI6IFwi4oaQXCIsXG4gIFwic21hbGxzZXRtaW51c1wiOiBcIuKIllwiLFxuICBcInNtYXNocFwiOiBcIuKos1wiLFxuICBcInNtZXBhcnNsXCI6IFwi4qekXCIsXG4gIFwic21pZFwiOiBcIuKIo1wiLFxuICBcInNtaWxlXCI6IFwi4oyjXCIsXG4gIFwic210XCI6IFwi4qqqXCIsXG4gIFwic210ZVwiOiBcIuKqrFwiLFxuICBcInNtdGVzXCI6IFwi4qqs77iAXCIsXG4gIFwic29mdGN5XCI6IFwi0YxcIixcbiAgXCJzb2xcIjogXCIvXCIsXG4gIFwic29sYlwiOiBcIuKnhFwiLFxuICBcInNvbGJhclwiOiBcIuKMv1wiLFxuICBcInNvcGZcIjogXCLwnZWkXCIsXG4gIFwic3BhZGVzXCI6IFwi4pmgXCIsXG4gIFwic3BhZGVzdWl0XCI6IFwi4pmgXCIsXG4gIFwic3BhclwiOiBcIuKIpVwiLFxuICBcInNxY2FwXCI6IFwi4oqTXCIsXG4gIFwic3FjYXBzXCI6IFwi4oqT77iAXCIsXG4gIFwic3FjdXBcIjogXCLiipRcIixcbiAgXCJzcWN1cHNcIjogXCLiipTvuIBcIixcbiAgXCJzcXN1YlwiOiBcIuKKj1wiLFxuICBcInNxc3ViZVwiOiBcIuKKkVwiLFxuICBcInNxc3Vic2V0XCI6IFwi4oqPXCIsXG4gIFwic3FzdWJzZXRlcVwiOiBcIuKKkVwiLFxuICBcInNxc3VwXCI6IFwi4oqQXCIsXG4gIFwic3FzdXBlXCI6IFwi4oqSXCIsXG4gIFwic3FzdXBzZXRcIjogXCLiipBcIixcbiAgXCJzcXN1cHNldGVxXCI6IFwi4oqSXCIsXG4gIFwic3F1XCI6IFwi4pahXCIsXG4gIFwic3F1YXJlXCI6IFwi4pahXCIsXG4gIFwic3F1YXJmXCI6IFwi4paqXCIsXG4gIFwic3F1ZlwiOiBcIuKWqlwiLFxuICBcInNyYXJyXCI6IFwi4oaSXCIsXG4gIFwic3NjclwiOiBcIvCdk4hcIixcbiAgXCJzc2V0bW5cIjogXCLiiJZcIixcbiAgXCJzc21pbGVcIjogXCLijKNcIixcbiAgXCJzc3RhcmZcIjogXCLii4ZcIixcbiAgXCJzdGFyXCI6IFwi4piGXCIsXG4gIFwic3RhcmZcIjogXCLimIVcIixcbiAgXCJzdHJhaWdodGVwc2lsb25cIjogXCLPtVwiLFxuICBcInN0cmFpZ2h0cGhpXCI6IFwiz5VcIixcbiAgXCJzdHJuc1wiOiBcIsKvXCIsXG4gIFwic3ViXCI6IFwi4oqCXCIsXG4gIFwic3ViRVwiOiBcIuKrhVwiLFxuICBcInN1YmRvdFwiOiBcIuKqvVwiLFxuICBcInN1YmVcIjogXCLiioZcIixcbiAgXCJzdWJlZG90XCI6IFwi4quDXCIsXG4gIFwic3VibXVsdFwiOiBcIuKrgVwiLFxuICBcInN1Ym5FXCI6IFwi4quLXCIsXG4gIFwic3VibmVcIjogXCLiiopcIixcbiAgXCJzdWJwbHVzXCI6IFwi4qq/XCIsXG4gIFwic3VicmFyclwiOiBcIuKluVwiLFxuICBcInN1YnNldFwiOiBcIuKKglwiLFxuICBcInN1YnNldGVxXCI6IFwi4oqGXCIsXG4gIFwic3Vic2V0ZXFxXCI6IFwi4quFXCIsXG4gIFwic3Vic2V0bmVxXCI6IFwi4oqKXCIsXG4gIFwic3Vic2V0bmVxcVwiOiBcIuKri1wiLFxuICBcInN1YnNpbVwiOiBcIuKrh1wiLFxuICBcInN1YnN1YlwiOiBcIuKrlVwiLFxuICBcInN1YnN1cFwiOiBcIuKrk1wiLFxuICBcInN1Y2NcIjogXCLiibtcIixcbiAgXCJzdWNjYXBwcm94XCI6IFwi4qq4XCIsXG4gIFwic3VjY2N1cmx5ZXFcIjogXCLiib1cIixcbiAgXCJzdWNjZXFcIjogXCLiqrBcIixcbiAgXCJzdWNjbmFwcHJveFwiOiBcIuKqulwiLFxuICBcInN1Y2NuZXFxXCI6IFwi4qq2XCIsXG4gIFwic3VjY25zaW1cIjogXCLii6lcIixcbiAgXCJzdWNjc2ltXCI6IFwi4om/XCIsXG4gIFwic3VtXCI6IFwi4oiRXCIsXG4gIFwic3VuZ1wiOiBcIuKZqlwiLFxuICBcInN1cDFcIjogXCLCuVwiLFxuICBcInN1cDJcIjogXCLCslwiLFxuICBcInN1cDNcIjogXCLCs1wiLFxuICBcInN1cFwiOiBcIuKKg1wiLFxuICBcInN1cEVcIjogXCLiq4ZcIixcbiAgXCJzdXBkb3RcIjogXCLiqr5cIixcbiAgXCJzdXBkc3ViXCI6IFwi4quYXCIsXG4gIFwic3VwZVwiOiBcIuKKh1wiLFxuICBcInN1cGVkb3RcIjogXCLiq4RcIixcbiAgXCJzdXBoc29sXCI6IFwi4p+JXCIsXG4gIFwic3VwaHN1YlwiOiBcIuKrl1wiLFxuICBcInN1cGxhcnJcIjogXCLipbtcIixcbiAgXCJzdXBtdWx0XCI6IFwi4quCXCIsXG4gIFwic3VwbkVcIjogXCLiq4xcIixcbiAgXCJzdXBuZVwiOiBcIuKKi1wiLFxuICBcInN1cHBsdXNcIjogXCLiq4BcIixcbiAgXCJzdXBzZXRcIjogXCLiioNcIixcbiAgXCJzdXBzZXRlcVwiOiBcIuKKh1wiLFxuICBcInN1cHNldGVxcVwiOiBcIuKrhlwiLFxuICBcInN1cHNldG5lcVwiOiBcIuKKi1wiLFxuICBcInN1cHNldG5lcXFcIjogXCLiq4xcIixcbiAgXCJzdXBzaW1cIjogXCLiq4hcIixcbiAgXCJzdXBzdWJcIjogXCLiq5RcIixcbiAgXCJzdXBzdXBcIjogXCLiq5ZcIixcbiAgXCJzd0FyclwiOiBcIuKHmVwiLFxuICBcInN3YXJoa1wiOiBcIuKkplwiLFxuICBcInN3YXJyXCI6IFwi4oaZXCIsXG4gIFwic3dhcnJvd1wiOiBcIuKGmVwiLFxuICBcInN3bndhclwiOiBcIuKkqlwiLFxuICBcInN6bGlnXCI6IFwiw59cIixcbiAgXCJ0YXJnZXRcIjogXCLijJZcIixcbiAgXCJ0YXVcIjogXCLPhFwiLFxuICBcInRicmtcIjogXCLijrRcIixcbiAgXCJ0Y2Fyb25cIjogXCLFpVwiLFxuICBcInRjZWRpbFwiOiBcIsWjXCIsXG4gIFwidGN5XCI6IFwi0YJcIixcbiAgXCJ0ZG90XCI6IFwi4oObXCIsXG4gIFwidGVscmVjXCI6IFwi4oyVXCIsXG4gIFwidGZyXCI6IFwi8J2UsVwiLFxuICBcInRoZXJlNFwiOiBcIuKItFwiLFxuICBcInRoZXJlZm9yZVwiOiBcIuKItFwiLFxuICBcInRoZXRhXCI6IFwizrhcIixcbiAgXCJ0aGV0YXN5bVwiOiBcIs+RXCIsXG4gIFwidGhldGF2XCI6IFwiz5FcIixcbiAgXCJ0aGlja2FwcHJveFwiOiBcIuKJiFwiLFxuICBcInRoaWNrc2ltXCI6IFwi4oi8XCIsXG4gIFwidGhpbnNwXCI6IFwi4oCJXCIsXG4gIFwidGhrYXBcIjogXCLiiYhcIixcbiAgXCJ0aGtzaW1cIjogXCLiiLxcIixcbiAgXCJ0aG9yblwiOiBcIsO+XCIsXG4gIFwidGlsZGVcIjogXCLLnFwiLFxuICBcInRpbWVzXCI6IFwiw5dcIixcbiAgXCJ0aW1lc2JcIjogXCLiiqBcIixcbiAgXCJ0aW1lc2JhclwiOiBcIuKosVwiLFxuICBcInRpbWVzZFwiOiBcIuKosFwiLFxuICBcInRpbnRcIjogXCLiiK1cIixcbiAgXCJ0b2VhXCI6IFwi4qSoXCIsXG4gIFwidG9wXCI6IFwi4oqkXCIsXG4gIFwidG9wYm90XCI6IFwi4oy2XCIsXG4gIFwidG9wY2lyXCI6IFwi4quxXCIsXG4gIFwidG9wZlwiOiBcIvCdlaVcIixcbiAgXCJ0b3Bmb3JrXCI6IFwi4quaXCIsXG4gIFwidG9zYVwiOiBcIuKkqVwiLFxuICBcInRwcmltZVwiOiBcIuKAtFwiLFxuICBcInRyYWRlXCI6IFwi4oSiXCIsXG4gIFwidHJpYW5nbGVcIjogXCLilrVcIixcbiAgXCJ0cmlhbmdsZWRvd25cIjogXCLilr9cIixcbiAgXCJ0cmlhbmdsZWxlZnRcIjogXCLil4NcIixcbiAgXCJ0cmlhbmdsZWxlZnRlcVwiOiBcIuKKtFwiLFxuICBcInRyaWFuZ2xlcVwiOiBcIuKJnFwiLFxuICBcInRyaWFuZ2xlcmlnaHRcIjogXCLilrlcIixcbiAgXCJ0cmlhbmdsZXJpZ2h0ZXFcIjogXCLiirVcIixcbiAgXCJ0cmlkb3RcIjogXCLil6xcIixcbiAgXCJ0cmllXCI6IFwi4omcXCIsXG4gIFwidHJpbWludXNcIjogXCLiqLpcIixcbiAgXCJ0cmlwbHVzXCI6IFwi4qi5XCIsXG4gIFwidHJpc2JcIjogXCLip41cIixcbiAgXCJ0cml0aW1lXCI6IFwi4qi7XCIsXG4gIFwidHJwZXppdW1cIjogXCLij6JcIixcbiAgXCJ0c2NyXCI6IFwi8J2TiVwiLFxuICBcInRzY3lcIjogXCLRhlwiLFxuICBcInRzaGN5XCI6IFwi0ZtcIixcbiAgXCJ0c3Ryb2tcIjogXCLFp1wiLFxuICBcInR3aXh0XCI6IFwi4omsXCIsXG4gIFwidHdvaGVhZGxlZnRhcnJvd1wiOiBcIuKGnlwiLFxuICBcInR3b2hlYWRyaWdodGFycm93XCI6IFwi4oagXCIsXG4gIFwidUFyclwiOiBcIuKHkVwiLFxuICBcInVIYXJcIjogXCLipaNcIixcbiAgXCJ1YWN1dGVcIjogXCLDulwiLFxuICBcInVhcnJcIjogXCLihpFcIixcbiAgXCJ1YnJjeVwiOiBcItGeXCIsXG4gIFwidWJyZXZlXCI6IFwixa1cIixcbiAgXCJ1Y2lyY1wiOiBcIsO7XCIsXG4gIFwidWN5XCI6IFwi0YNcIixcbiAgXCJ1ZGFyclwiOiBcIuKHhVwiLFxuICBcInVkYmxhY1wiOiBcIsWxXCIsXG4gIFwidWRoYXJcIjogXCLipa5cIixcbiAgXCJ1ZmlzaHRcIjogXCLipb5cIixcbiAgXCJ1ZnJcIjogXCLwnZSyXCIsXG4gIFwidWdyYXZlXCI6IFwiw7lcIixcbiAgXCJ1aGFybFwiOiBcIuKGv1wiLFxuICBcInVoYXJyXCI6IFwi4oa+XCIsXG4gIFwidWhibGtcIjogXCLiloBcIixcbiAgXCJ1bGNvcm5cIjogXCLijJxcIixcbiAgXCJ1bGNvcm5lclwiOiBcIuKMnFwiLFxuICBcInVsY3JvcFwiOiBcIuKMj1wiLFxuICBcInVsdHJpXCI6IFwi4pe4XCIsXG4gIFwidW1hY3JcIjogXCLFq1wiLFxuICBcInVtbFwiOiBcIsKoXCIsXG4gIFwidW9nb25cIjogXCLFs1wiLFxuICBcInVvcGZcIjogXCLwnZWmXCIsXG4gIFwidXBhcnJvd1wiOiBcIuKGkVwiLFxuICBcInVwZG93bmFycm93XCI6IFwi4oaVXCIsXG4gIFwidXBoYXJwb29ubGVmdFwiOiBcIuKGv1wiLFxuICBcInVwaGFycG9vbnJpZ2h0XCI6IFwi4oa+XCIsXG4gIFwidXBsdXNcIjogXCLiio5cIixcbiAgXCJ1cHNpXCI6IFwiz4VcIixcbiAgXCJ1cHNpaFwiOiBcIs+SXCIsXG4gIFwidXBzaWxvblwiOiBcIs+FXCIsXG4gIFwidXB1cGFycm93c1wiOiBcIuKHiFwiLFxuICBcInVyY29yblwiOiBcIuKMnVwiLFxuICBcInVyY29ybmVyXCI6IFwi4oydXCIsXG4gIFwidXJjcm9wXCI6IFwi4oyOXCIsXG4gIFwidXJpbmdcIjogXCLFr1wiLFxuICBcInVydHJpXCI6IFwi4pe5XCIsXG4gIFwidXNjclwiOiBcIvCdk4pcIixcbiAgXCJ1dGRvdFwiOiBcIuKLsFwiLFxuICBcInV0aWxkZVwiOiBcIsWpXCIsXG4gIFwidXRyaVwiOiBcIuKWtVwiLFxuICBcInV0cmlmXCI6IFwi4pa0XCIsXG4gIFwidXVhcnJcIjogXCLih4hcIixcbiAgXCJ1dW1sXCI6IFwiw7xcIixcbiAgXCJ1d2FuZ2xlXCI6IFwi4qanXCIsXG4gIFwidkFyclwiOiBcIuKHlVwiLFxuICBcInZCYXJcIjogXCLiq6hcIixcbiAgXCJ2QmFydlwiOiBcIuKrqVwiLFxuICBcInZEYXNoXCI6IFwi4oqoXCIsXG4gIFwidmFuZ3J0XCI6IFwi4qacXCIsXG4gIFwidmFyZXBzaWxvblwiOiBcIs+1XCIsXG4gIFwidmFya2FwcGFcIjogXCLPsFwiLFxuICBcInZhcm5vdGhpbmdcIjogXCLiiIVcIixcbiAgXCJ2YXJwaGlcIjogXCLPlVwiLFxuICBcInZhcnBpXCI6IFwiz5ZcIixcbiAgXCJ2YXJwcm9wdG9cIjogXCLiiJ1cIixcbiAgXCJ2YXJyXCI6IFwi4oaVXCIsXG4gIFwidmFycmhvXCI6IFwiz7FcIixcbiAgXCJ2YXJzaWdtYVwiOiBcIs+CXCIsXG4gIFwidmFyc3Vic2V0bmVxXCI6IFwi4oqK77iAXCIsXG4gIFwidmFyc3Vic2V0bmVxcVwiOiBcIuKri++4gFwiLFxuICBcInZhcnN1cHNldG5lcVwiOiBcIuKKi++4gFwiLFxuICBcInZhcnN1cHNldG5lcXFcIjogXCLiq4zvuIBcIixcbiAgXCJ2YXJ0aGV0YVwiOiBcIs+RXCIsXG4gIFwidmFydHJpYW5nbGVsZWZ0XCI6IFwi4oqyXCIsXG4gIFwidmFydHJpYW5nbGVyaWdodFwiOiBcIuKKs1wiLFxuICBcInZjeVwiOiBcItCyXCIsXG4gIFwidmRhc2hcIjogXCLiiqJcIixcbiAgXCJ2ZWVcIjogXCLiiKhcIixcbiAgXCJ2ZWViYXJcIjogXCLiirtcIixcbiAgXCJ2ZWVlcVwiOiBcIuKJmlwiLFxuICBcInZlbGxpcFwiOiBcIuKLrlwiLFxuICBcInZlcmJhclwiOiBcInxcIixcbiAgXCJ2ZXJ0XCI6IFwifFwiLFxuICBcInZmclwiOiBcIvCdlLNcIixcbiAgXCJ2bHRyaVwiOiBcIuKKslwiLFxuICBcInZuc3ViXCI6IFwi4oqC4oOSXCIsXG4gIFwidm5zdXBcIjogXCLiioPig5JcIixcbiAgXCJ2b3BmXCI6IFwi8J2Vp1wiLFxuICBcInZwcm9wXCI6IFwi4oidXCIsXG4gIFwidnJ0cmlcIjogXCLiirNcIixcbiAgXCJ2c2NyXCI6IFwi8J2Ti1wiLFxuICBcInZzdWJuRVwiOiBcIuKri++4gFwiLFxuICBcInZzdWJuZVwiOiBcIuKKiu+4gFwiLFxuICBcInZzdXBuRVwiOiBcIuKrjO+4gFwiLFxuICBcInZzdXBuZVwiOiBcIuKKi++4gFwiLFxuICBcInZ6aWd6YWdcIjogXCLipppcIixcbiAgXCJ3Y2lyY1wiOiBcIsW1XCIsXG4gIFwid2VkYmFyXCI6IFwi4qmfXCIsXG4gIFwid2VkZ2VcIjogXCLiiKdcIixcbiAgXCJ3ZWRnZXFcIjogXCLiiZlcIixcbiAgXCJ3ZWllcnBcIjogXCLihJhcIixcbiAgXCJ3ZnJcIjogXCLwnZS0XCIsXG4gIFwid29wZlwiOiBcIvCdlahcIixcbiAgXCJ3cFwiOiBcIuKEmFwiLFxuICBcIndyXCI6IFwi4omAXCIsXG4gIFwid3JlYXRoXCI6IFwi4omAXCIsXG4gIFwid3NjclwiOiBcIvCdk4xcIixcbiAgXCJ4Y2FwXCI6IFwi4ouCXCIsXG4gIFwieGNpcmNcIjogXCLil69cIixcbiAgXCJ4Y3VwXCI6IFwi4ouDXCIsXG4gIFwieGR0cmlcIjogXCLilr1cIixcbiAgXCJ4ZnJcIjogXCLwnZS1XCIsXG4gIFwieGhBcnJcIjogXCLin7pcIixcbiAgXCJ4aGFyclwiOiBcIuKft1wiLFxuICBcInhpXCI6IFwizr5cIixcbiAgXCJ4bEFyclwiOiBcIuKfuFwiLFxuICBcInhsYXJyXCI6IFwi4p+1XCIsXG4gIFwieG1hcFwiOiBcIuKfvFwiLFxuICBcInhuaXNcIjogXCLii7tcIixcbiAgXCJ4b2RvdFwiOiBcIuKogFwiLFxuICBcInhvcGZcIjogXCLwnZWpXCIsXG4gIFwieG9wbHVzXCI6IFwi4qiBXCIsXG4gIFwieG90aW1lXCI6IFwi4qiCXCIsXG4gIFwieHJBcnJcIjogXCLin7lcIixcbiAgXCJ4cmFyclwiOiBcIuKftlwiLFxuICBcInhzY3JcIjogXCLwnZONXCIsXG4gIFwieHNxY3VwXCI6IFwi4qiGXCIsXG4gIFwieHVwbHVzXCI6IFwi4qiEXCIsXG4gIFwieHV0cmlcIjogXCLilrNcIixcbiAgXCJ4dmVlXCI6IFwi4ouBXCIsXG4gIFwieHdlZGdlXCI6IFwi4ouAXCIsXG4gIFwieWFjdXRlXCI6IFwiw71cIixcbiAgXCJ5YWN5XCI6IFwi0Y9cIixcbiAgXCJ5Y2lyY1wiOiBcIsW3XCIsXG4gIFwieWN5XCI6IFwi0YtcIixcbiAgXCJ5ZW5cIjogXCLCpVwiLFxuICBcInlmclwiOiBcIvCdlLZcIixcbiAgXCJ5aWN5XCI6IFwi0ZdcIixcbiAgXCJ5b3BmXCI6IFwi8J2VqlwiLFxuICBcInlzY3JcIjogXCLwnZOOXCIsXG4gIFwieXVjeVwiOiBcItGOXCIsXG4gIFwieXVtbFwiOiBcIsO/XCIsXG4gIFwiemFjdXRlXCI6IFwixbpcIixcbiAgXCJ6Y2Fyb25cIjogXCLFvlwiLFxuICBcInpjeVwiOiBcItC3XCIsXG4gIFwiemRvdFwiOiBcIsW8XCIsXG4gIFwiemVldHJmXCI6IFwi4oSoXCIsXG4gIFwiemV0YVwiOiBcIs62XCIsXG4gIFwiemZyXCI6IFwi8J2Ut1wiLFxuICBcInpoY3lcIjogXCLQtlwiLFxuICBcInppZ3JhcnJcIjogXCLih51cIixcbiAgXCJ6b3BmXCI6IFwi8J2Vq1wiLFxuICBcInpzY3JcIjogXCLwnZOPXCIsXG4gIFwiendqXCI6IFwi4oCNXCIsXG4gIFwiendualwiOiBcIuKAjFwiXG59XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgY2hhcmFjdGVyLWVudGl0aWVzXG4gKiBAZmlsZW92ZXJ2aWV3IEhUTUwgY2hhcmFjdGVyIGVudGl0eSBpbmZvcm1hdGlvbi5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLypcbiAqIEV4cG9zZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5kZXguanNvbicpO1xuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIjBcIjogXCLvv71cIixcbiAgXCIxMjhcIjogXCLigqxcIixcbiAgXCIxMzBcIjogXCLigJpcIixcbiAgXCIxMzFcIjogXCLGklwiLFxuICBcIjEzMlwiOiBcIuKAnlwiLFxuICBcIjEzM1wiOiBcIuKAplwiLFxuICBcIjEzNFwiOiBcIuKAoFwiLFxuICBcIjEzNVwiOiBcIuKAoVwiLFxuICBcIjEzNlwiOiBcIsuGXCIsXG4gIFwiMTM3XCI6IFwi4oCwXCIsXG4gIFwiMTM4XCI6IFwixaBcIixcbiAgXCIxMzlcIjogXCLigLlcIixcbiAgXCIxNDBcIjogXCLFklwiLFxuICBcIjE0MlwiOiBcIsW9XCIsXG4gIFwiMTQ1XCI6IFwi4oCYXCIsXG4gIFwiMTQ2XCI6IFwi4oCZXCIsXG4gIFwiMTQ3XCI6IFwi4oCcXCIsXG4gIFwiMTQ4XCI6IFwi4oCdXCIsXG4gIFwiMTQ5XCI6IFwi4oCiXCIsXG4gIFwiMTUwXCI6IFwi4oCTXCIsXG4gIFwiMTUxXCI6IFwi4oCUXCIsXG4gIFwiMTUyXCI6IFwiy5xcIixcbiAgXCIxNTNcIjogXCLihKJcIixcbiAgXCIxNTRcIjogXCLFoVwiLFxuICBcIjE1NVwiOiBcIuKAulwiLFxuICBcIjE1NlwiOiBcIsWTXCIsXG4gIFwiMTU4XCI6IFwixb5cIixcbiAgXCIxNTlcIjogXCLFuFwiXG59XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgY2hhcmFjdGVyLXJlZmVyZW5jZS1pbnZhbGlkXG4gKiBAZmlsZW92ZXJ2aWV3IEhUTUwgaW52YWxpZCBudW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2UgaW5mb3JtYXRpb24uXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzICovXG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2luZGV4Lmpzb24nKTtcbiIsInZhciBfcmVxdWlyZSA9IHJlcXVpcmUgLy9mb29sIGJyb3dzZXJpZnlcbm1vZHVsZS5leHBvcnRzID0gX3JlcXVpcmUoJ2NobG9yaWRlZG93bi9idWlsZC9SZWxlYXNlL3NvZGl1bScpXG4iLCJcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnc29kaXVtLWJyb3dzZXJpZnknKVxuIiwiXG5pZihwcm9jZXNzLmVudi5DSExPUklERV9KUylcbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9icm93c2VyJylcblxudHJ5IHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2JpbmRpbmdzJylcbn0gY2F0Y2ggKGVycikge1xuICBjb25zb2xlLmVycm9yKCdlcnJvciBsb2FkaW5nIHNvZGl1bSBiaW5kaW5nczonLCBlcnIubWVzc2FnZSlcbiAgY29uc29sZS5lcnJvcignZmFsbGluZyBiYWNrIHRvIGphdmFzY3JpcHQgdmVyc2lvbi4nKVxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYnJvd3NlcicpXG59XG5cbiIsInZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm1cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKS5TdHJpbmdEZWNvZGVyXG5tb2R1bGUuZXhwb3J0cyA9IENpcGhlckJhc2VcbmluaGVyaXRzKENpcGhlckJhc2UsIFRyYW5zZm9ybSlcbmZ1bmN0aW9uIENpcGhlckJhc2UgKGhhc2hNb2RlKSB7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMpXG4gIHRoaXMuaGFzaE1vZGUgPSB0eXBlb2YgaGFzaE1vZGUgPT09ICdzdHJpbmcnXG4gIGlmICh0aGlzLmhhc2hNb2RlKSB7XG4gICAgdGhpc1toYXNoTW9kZV0gPSB0aGlzLl9maW5hbE9yRGlnZXN0XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5maW5hbCA9IHRoaXMuX2ZpbmFsT3JEaWdlc3RcbiAgfVxuICB0aGlzLl9kZWNvZGVyID0gbnVsbFxuICB0aGlzLl9lbmNvZGluZyA9IG51bGxcbn1cbkNpcGhlckJhc2UucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkYXRhLCBpbnB1dEVuYywgb3V0cHV0RW5jKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICBkYXRhID0gbmV3IEJ1ZmZlcihkYXRhLCBpbnB1dEVuYylcbiAgfVxuICB2YXIgb3V0RGF0YSA9IHRoaXMuX3VwZGF0ZShkYXRhKVxuICBpZiAodGhpcy5oYXNoTW9kZSkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cbiAgaWYgKG91dHB1dEVuYykge1xuICAgIG91dERhdGEgPSB0aGlzLl90b1N0cmluZyhvdXREYXRhLCBvdXRwdXRFbmMpXG4gIH1cbiAgcmV0dXJuIG91dERhdGFcbn1cblxuQ2lwaGVyQmFzZS5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmcgPSBmdW5jdGlvbiAoKSB7fVxuXG5DaXBoZXJCYXNlLnByb3RvdHlwZS5nZXRBdXRoVGFnID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3RyeWluZyB0byBnZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUnKVxufVxuXG5DaXBoZXJCYXNlLnByb3RvdHlwZS5zZXRBdXRoVGFnID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3RyeWluZyB0byBzZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUnKVxufVxuXG5DaXBoZXJCYXNlLnByb3RvdHlwZS5zZXRBQUQgPSBmdW5jdGlvbiAoKSB7XG4gIHRocm93IG5ldyBFcnJvcigndHJ5aW5nIHRvIHNldCBhYWQgaW4gdW5zdXBwb3J0ZWQgc3RhdGUnKVxufVxuXG5DaXBoZXJCYXNlLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGRhdGEsIF8sIG5leHQpIHtcbiAgdmFyIGVyclxuICB0cnkge1xuICAgIGlmICh0aGlzLmhhc2hNb2RlKSB7XG4gICAgICB0aGlzLl91cGRhdGUoZGF0YSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoKHRoaXMuX3VwZGF0ZShkYXRhKSlcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnIgPSBlXG4gIH0gZmluYWxseSB7XG4gICAgbmV4dChlcnIpXG4gIH1cbn1cbkNpcGhlckJhc2UucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uIChkb25lKSB7XG4gIHZhciBlcnJcbiAgdHJ5IHtcbiAgICB0aGlzLnB1c2godGhpcy5fZmluYWwoKSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVyciA9IGVcbiAgfSBmaW5hbGx5IHtcbiAgICBkb25lKGVycilcbiAgfVxufVxuQ2lwaGVyQmFzZS5wcm90b3R5cGUuX2ZpbmFsT3JEaWdlc3QgPSBmdW5jdGlvbiAob3V0cHV0RW5jKSB7XG4gIHZhciBvdXREYXRhID0gdGhpcy5fZmluYWwoKSB8fCBuZXcgQnVmZmVyKCcnKVxuICBpZiAob3V0cHV0RW5jKSB7XG4gICAgb3V0RGF0YSA9IHRoaXMuX3RvU3RyaW5nKG91dERhdGEsIG91dHB1dEVuYywgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb3V0RGF0YVxufVxuXG5DaXBoZXJCYXNlLnByb3RvdHlwZS5fdG9TdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUsIGVuYywgZmluYWwpIHtcbiAgaWYgKCF0aGlzLl9kZWNvZGVyKSB7XG4gICAgdGhpcy5fZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYylcbiAgICB0aGlzLl9lbmNvZGluZyA9IGVuY1xuICB9XG4gIGlmICh0aGlzLl9lbmNvZGluZyAhPT0gZW5jKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHN3aXRjaCBlbmNvZGluZ3MnKVxuICB9XG4gIHZhciBvdXQgPSB0aGlzLl9kZWNvZGVyLndyaXRlKHZhbHVlKVxuICBpZiAoZmluYWwpIHtcbiAgICBvdXQgKz0gdGhpcy5fZGVjb2Rlci5lbmQoKVxuICB9XG4gIHJldHVybiBvdXRcbn1cbiIsInZhciBjbG9uZSA9IChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDbG9uZXMgKGNvcGllcykgYW4gT2JqZWN0IHVzaW5nIGRlZXAgY29weWluZy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGNpcmN1bGFyIHJlZmVyZW5jZXMgYnkgZGVmYXVsdCwgYnV0IGlmIHlvdSBhcmUgY2VydGFpblxuICogdGhlcmUgYXJlIG5vIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4geW91ciBvYmplY3QsIHlvdSBjYW4gc2F2ZSBzb21lIENQVSB0aW1lXG4gKiBieSBjYWxsaW5nIGNsb25lKG9iaiwgZmFsc2UpLlxuICpcbiAqIENhdXRpb246IGlmIGBjaXJjdWxhcmAgaXMgZmFsc2UgYW5kIGBwYXJlbnRgIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZXMsXG4gKiB5b3VyIHByb2dyYW0gbWF5IGVudGVyIGFuIGluZmluaXRlIGxvb3AgYW5kIGNyYXNoLlxuICpcbiAqIEBwYXJhbSBgcGFyZW50YCAtIHRoZSBvYmplY3QgdG8gYmUgY2xvbmVkXG4gKiBAcGFyYW0gYGNpcmN1bGFyYCAtIHNldCB0byB0cnVlIGlmIHRoZSBvYmplY3QgdG8gYmUgY2xvbmVkIG1heSBjb250YWluXG4gKiAgICBjaXJjdWxhciByZWZlcmVuY2VzLiAob3B0aW9uYWwgLSB0cnVlIGJ5IGRlZmF1bHQpXG4gKiBAcGFyYW0gYGRlcHRoYCAtIHNldCB0byBhIG51bWJlciBpZiB0aGUgb2JqZWN0IGlzIG9ubHkgdG8gYmUgY2xvbmVkIHRvXG4gKiAgICBhIHBhcnRpY3VsYXIgZGVwdGguIChvcHRpb25hbCAtIGRlZmF1bHRzIHRvIEluZmluaXR5KVxuICogQHBhcmFtIGBwcm90b3R5cGVgIC0gc2V0cyB0aGUgcHJvdG90eXBlIHRvIGJlIHVzZWQgd2hlbiBjbG9uaW5nIGFuIG9iamVjdC5cbiAqICAgIChvcHRpb25hbCAtIGRlZmF1bHRzIHRvIHBhcmVudCBwcm90b3R5cGUpLlxuKi9cbmZ1bmN0aW9uIGNsb25lKHBhcmVudCwgY2lyY3VsYXIsIGRlcHRoLCBwcm90b3R5cGUpIHtcbiAgdmFyIGZpbHRlcjtcbiAgaWYgKHR5cGVvZiBjaXJjdWxhciA9PT0gJ29iamVjdCcpIHtcbiAgICBkZXB0aCA9IGNpcmN1bGFyLmRlcHRoO1xuICAgIHByb3RvdHlwZSA9IGNpcmN1bGFyLnByb3RvdHlwZTtcbiAgICBmaWx0ZXIgPSBjaXJjdWxhci5maWx0ZXI7XG4gICAgY2lyY3VsYXIgPSBjaXJjdWxhci5jaXJjdWxhclxuICB9XG4gIC8vIG1haW50YWluIHR3byBhcnJheXMgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMsIHdoZXJlIGNvcnJlc3BvbmRpbmcgcGFyZW50c1xuICAvLyBhbmQgY2hpbGRyZW4gaGF2ZSB0aGUgc2FtZSBpbmRleFxuICB2YXIgYWxsUGFyZW50cyA9IFtdO1xuICB2YXIgYWxsQ2hpbGRyZW4gPSBbXTtcblxuICB2YXIgdXNlQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPSAndW5kZWZpbmVkJztcblxuICBpZiAodHlwZW9mIGNpcmN1bGFyID09ICd1bmRlZmluZWQnKVxuICAgIGNpcmN1bGFyID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGRlcHRoID09ICd1bmRlZmluZWQnKVxuICAgIGRlcHRoID0gSW5maW5pdHk7XG5cbiAgLy8gcmVjdXJzZSB0aGlzIGZ1bmN0aW9uIHNvIHdlIGRvbid0IHJlc2V0IGFsbFBhcmVudHMgYW5kIGFsbENoaWxkcmVuXG4gIGZ1bmN0aW9uIF9jbG9uZShwYXJlbnQsIGRlcHRoKSB7XG4gICAgLy8gY2xvbmluZyBudWxsIGFsd2F5cyByZXR1cm5zIG51bGxcbiAgICBpZiAocGFyZW50ID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoZGVwdGggPT0gMClcbiAgICAgIHJldHVybiBwYXJlbnQ7XG5cbiAgICB2YXIgY2hpbGQ7XG4gICAgdmFyIHByb3RvO1xuICAgIGlmICh0eXBlb2YgcGFyZW50ICE9ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIGlmIChjbG9uZS5fX2lzQXJyYXkocGFyZW50KSkge1xuICAgICAgY2hpbGQgPSBbXTtcbiAgICB9IGVsc2UgaWYgKGNsb25lLl9faXNSZWdFeHAocGFyZW50KSkge1xuICAgICAgY2hpbGQgPSBuZXcgUmVnRXhwKHBhcmVudC5zb3VyY2UsIF9fZ2V0UmVnRXhwRmxhZ3MocGFyZW50KSk7XG4gICAgICBpZiAocGFyZW50Lmxhc3RJbmRleCkgY2hpbGQubGFzdEluZGV4ID0gcGFyZW50Lmxhc3RJbmRleDtcbiAgICB9IGVsc2UgaWYgKGNsb25lLl9faXNEYXRlKHBhcmVudCkpIHtcbiAgICAgIGNoaWxkID0gbmV3IERhdGUocGFyZW50LmdldFRpbWUoKSk7XG4gICAgfSBlbHNlIGlmICh1c2VCdWZmZXIgJiYgQnVmZmVyLmlzQnVmZmVyKHBhcmVudCkpIHtcbiAgICAgIGNoaWxkID0gbmV3IEJ1ZmZlcihwYXJlbnQubGVuZ3RoKTtcbiAgICAgIHBhcmVudC5jb3B5KGNoaWxkKTtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBwcm90b3R5cGUgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGFyZW50KTtcbiAgICAgICAgY2hpbGQgPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjaGlsZCA9IE9iamVjdC5jcmVhdGUocHJvdG90eXBlKTtcbiAgICAgICAgcHJvdG8gPSBwcm90b3R5cGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICB2YXIgaW5kZXggPSBhbGxQYXJlbnRzLmluZGV4T2YocGFyZW50KTtcblxuICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICAgIHJldHVybiBhbGxDaGlsZHJlbltpbmRleF07XG4gICAgICB9XG4gICAgICBhbGxQYXJlbnRzLnB1c2gocGFyZW50KTtcbiAgICAgIGFsbENoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgaW4gcGFyZW50KSB7XG4gICAgICB2YXIgYXR0cnM7XG4gICAgICBpZiAocHJvdG8pIHtcbiAgICAgICAgYXR0cnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF0dHJzICYmIGF0dHJzLnNldCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2hpbGRbaV0gPSBfY2xvbmUocGFyZW50W2ldLCBkZXB0aCAtIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHJldHVybiBfY2xvbmUocGFyZW50LCBkZXB0aCk7XG59XG5cbi8qKlxuICogU2ltcGxlIGZsYXQgY2xvbmUgdXNpbmcgcHJvdG90eXBlLCBhY2NlcHRzIG9ubHkgb2JqZWN0cywgdXNlZnVsbCBmb3IgcHJvcGVydHlcbiAqIG92ZXJyaWRlIG9uIEZMQVQgY29uZmlndXJhdGlvbiBvYmplY3QgKG5vIG5lc3RlZCBwcm9wcykuXG4gKlxuICogVVNFIFdJVEggQ0FVVElPTiEgVGhpcyBtYXkgbm90IGJlaGF2ZSBhcyB5b3Ugd2lzaCBpZiB5b3UgZG8gbm90IGtub3cgaG93IHRoaXNcbiAqIHdvcmtzLlxuICovXG5jbG9uZS5jbG9uZVByb3RvdHlwZSA9IGZ1bmN0aW9uIGNsb25lUHJvdG90eXBlKHBhcmVudCkge1xuICBpZiAocGFyZW50ID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHZhciBjID0gZnVuY3Rpb24gKCkge307XG4gIGMucHJvdG90eXBlID0gcGFyZW50O1xuICByZXR1cm4gbmV3IGMoKTtcbn07XG5cbi8vIHByaXZhdGUgdXRpbGl0eSBmdW5jdGlvbnNcblxuZnVuY3Rpb24gX19vYmpUb1N0cihvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59O1xuY2xvbmUuX19vYmpUb1N0ciA9IF9fb2JqVG9TdHI7XG5cbmZ1bmN0aW9uIF9faXNEYXRlKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBfX29ialRvU3RyKG8pID09PSAnW29iamVjdCBEYXRlXSc7XG59O1xuY2xvbmUuX19pc0RhdGUgPSBfX2lzRGF0ZTtcblxuZnVuY3Rpb24gX19pc0FycmF5KG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBfX29ialRvU3RyKG8pID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcbmNsb25lLl9faXNBcnJheSA9IF9faXNBcnJheTtcblxuZnVuY3Rpb24gX19pc1JlZ0V4cChvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgX19vYmpUb1N0cihvKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuY2xvbmUuX19pc1JlZ0V4cCA9IF9faXNSZWdFeHA7XG5cbmZ1bmN0aW9uIF9fZ2V0UmVnRXhwRmxhZ3MocmUpIHtcbiAgdmFyIGZsYWdzID0gJyc7XG4gIGlmIChyZS5nbG9iYWwpIGZsYWdzICs9ICdnJztcbiAgaWYgKHJlLmlnbm9yZUNhc2UpIGZsYWdzICs9ICdpJztcbiAgaWYgKHJlLm11bHRpbGluZSkgZmxhZ3MgKz0gJ20nO1xuICByZXR1cm4gZmxhZ3M7XG59O1xuY2xvbmUuX19nZXRSZWdFeHBGbGFncyA9IF9fZ2V0UmVnRXhwRmxhZ3M7XG5cbnJldHVybiBjbG9uZTtcbn0pKCk7XG5cbmlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGNsb25lO1xufVxuIiwiXG4vKipcbiAqIHNsaWNlKCkgcmVmZXJlbmNlLlxuICovXG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuLyoqXG4gKiBFeHBvc2UgYGNvYC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvO1xuXG4vKipcbiAqIFdyYXAgdGhlIGdpdmVuIGdlbmVyYXRvciBgZm5gIGFuZFxuICogcmV0dXJuIGEgdGh1bmsuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjbyhmbikge1xuICB2YXIgaXNHZW5GdW4gPSBpc0dlbmVyYXRvckZ1bmN0aW9uKGZuKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgY3R4ID0gdGhpcztcblxuICAgIC8vIGluIHRvVGh1bmsoKSBiZWxvdyB3ZSBpbnZva2UgY28oKVxuICAgIC8vIHdpdGggYSBnZW5lcmF0b3IsIHNvIG9wdGltaXplIGZvclxuICAgIC8vIHRoaXMgY2FzZVxuICAgIHZhciBnZW4gPSBmbjtcblxuICAgIC8vIHdlIG9ubHkgbmVlZCB0byBwYXJzZSB0aGUgYXJndW1lbnRzXG4gICAgLy8gaWYgZ2VuIGlzIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICAgIGlmIChpc0dlbkZ1bikge1xuICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyksIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICAgICAgdmFyIGhhc0NhbGxiYWNrID0gbGVuICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGFyZ3NbbGVuIC0gMV07XG4gICAgICBkb25lID0gaGFzQ2FsbGJhY2sgPyBhcmdzLnBvcCgpIDogZXJyb3I7XG4gICAgICBnZW4gPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9uZSA9IGRvbmUgfHwgZXJyb3I7XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuXG4gICAgLy8gIzkyXG4gICAgLy8gd3JhcCB0aGUgY2FsbGJhY2sgaW4gYSBzZXRJbW1lZGlhdGVcbiAgICAvLyBzbyB0aGF0IGFueSBvZiBpdHMgZXJyb3JzIGFyZW4ndCBjYXVnaHQgYnkgYGNvYFxuICAgIGZ1bmN0aW9uIGV4aXQoZXJyLCByZXMpIHtcbiAgICAgIHNldEltbWVkaWF0ZShmdW5jdGlvbigpe1xuICAgICAgICBkb25lLmNhbGwoY3R4LCBlcnIsIHJlcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXh0KGVyciwgcmVzKSB7XG4gICAgICB2YXIgcmV0O1xuXG4gICAgICAvLyBtdWx0aXBsZSBhcmdzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHJlcyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICAgICAgLy8gZXJyb3JcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSBnZW4udGhyb3coZXJyKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBleGl0KGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG9rXG4gICAgICBpZiAoIWVycikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldCA9IGdlbi5uZXh0KHJlcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gZXhpdChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBkb25lXG4gICAgICBpZiAocmV0LmRvbmUpIHJldHVybiBleGl0KG51bGwsIHJldC52YWx1ZSk7XG5cbiAgICAgIC8vIG5vcm1hbGl6ZVxuICAgICAgcmV0LnZhbHVlID0gdG9UaHVuayhyZXQudmFsdWUsIGN0eCk7XG5cbiAgICAgIC8vIHJ1blxuICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHJldC52YWx1ZSkge1xuICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0LnZhbHVlLmNhbGwoY3R4LCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKGNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIG5leHQuYXBwbHkoY3R4LCBhcmd1bWVudHMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBpZiAoY2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgbmV4dChlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGludmFsaWRcbiAgICAgIG5leHQobmV3IFR5cGVFcnJvcignWW91IG1heSBvbmx5IHlpZWxkIGEgZnVuY3Rpb24sIHByb21pc2UsIGdlbmVyYXRvciwgYXJyYXksIG9yIG9iamVjdCwgJ1xuICAgICAgICArICdidXQgdGhlIGZvbGxvd2luZyB3YXMgcGFzc2VkOiBcIicgKyBTdHJpbmcocmV0LnZhbHVlKSArICdcIicpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGBvYmpgIGludG8gYSBub3JtYWxpemVkIHRodW5rLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IG9ialxuICogQHBhcmFtIHtNaXhlZH0gY3R4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRvVGh1bmsob2JqLCBjdHgpIHtcblxuICBpZiAoaXNHZW5lcmF0b3JGdW5jdGlvbihvYmopKSB7XG4gICAgcmV0dXJuIGNvKG9iai5jYWxsKGN0eCkpO1xuICB9XG5cbiAgaWYgKGlzR2VuZXJhdG9yKG9iaikpIHtcbiAgICByZXR1cm4gY28ob2JqKTtcbiAgfVxuXG4gIGlmIChpc1Byb21pc2Uob2JqKSkge1xuICAgIHJldHVybiBwcm9taXNlVG9UaHVuayhvYmopO1xuICB9XG5cbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIG9iaikge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoaXNPYmplY3Qob2JqKSB8fCBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqZWN0VG9UaHVuay5jYWxsKGN0eCwgb2JqKTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3Qgb2YgeWllbGRhYmxlcyB0byBhIHRodW5rLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gb2JqZWN0VG9UaHVuayhvYmope1xuICB2YXIgY3R4ID0gdGhpcztcbiAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KG9iaik7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGRvbmUpe1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB2YXIgcGVuZGluZyA9IGtleXMubGVuZ3RoO1xuICAgIHZhciByZXN1bHRzID0gaXNBcnJheVxuICAgICAgPyBuZXcgQXJyYXkocGVuZGluZykgLy8gcHJlZGVmaW5lIHRoZSBhcnJheSBsZW5ndGhcbiAgICAgIDogbmV3IG9iai5jb25zdHJ1Y3RvcigpO1xuICAgIHZhciBmaW5pc2hlZDtcblxuICAgIGlmICghcGVuZGluZykge1xuICAgICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCl7XG4gICAgICAgIGRvbmUobnVsbCwgcmVzdWx0cylcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHByZXBvcHVsYXRlIG9iamVjdCBrZXlzIHRvIHByZXNlcnZlIGtleSBvcmRlcmluZ1xuICAgIGlmICghaXNBcnJheSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwZW5kaW5nOyBpKyspIHtcbiAgICAgICAgcmVzdWx0c1trZXlzW2ldXSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJ1bihvYmpba2V5c1tpXV0sIGtleXNbaV0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bihmbiwga2V5KSB7XG4gICAgICBpZiAoZmluaXNoZWQpIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuID0gdG9UaHVuayhmbiwgY3R4KTtcblxuICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZm4pIHtcbiAgICAgICAgICByZXN1bHRzW2tleV0gPSBmbjtcbiAgICAgICAgICByZXR1cm4gLS1wZW5kaW5nIHx8IGRvbmUobnVsbCwgcmVzdWx0cyk7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKGN0eCwgZnVuY3Rpb24oZXJyLCByZXMpe1xuICAgICAgICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoZXJyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXN1bHRzW2tleV0gPSByZXM7XG4gICAgICAgICAgLS1wZW5kaW5nIHx8IGRvbmUobnVsbCwgcmVzdWx0cyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgZG9uZShlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgYHByb21pc2VgIHRvIGEgdGh1bmsuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb21pc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcHJvbWlzZVRvVGh1bmsocHJvbWlzZSkge1xuICByZXR1cm4gZnVuY3Rpb24oZm4pe1xuICAgIHByb21pc2UudGhlbihmdW5jdGlvbihyZXMpIHtcbiAgICAgIGZuKG51bGwsIHJlcyk7XG4gICAgfSwgZm4pO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBwcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc1Byb21pc2Uob2JqKSB7XG4gIHJldHVybiBvYmogJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygb2JqLnRoZW47XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBnZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNHZW5lcmF0b3Iob2JqKSB7XG4gIHJldHVybiBvYmogJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygb2JqLm5leHQgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygb2JqLnRocm93O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzR2VuZXJhdG9yRnVuY3Rpb24ob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLmNvbnN0cnVjdG9yICYmICdHZW5lcmF0b3JGdW5jdGlvbicgPT0gb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG59XG5cbi8qKlxuICogQ2hlY2sgZm9yIHBsYWluIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWxcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc09iamVjdCh2YWwpIHtcbiAgcmV0dXJuIHZhbCAmJiBPYmplY3QgPT0gdmFsLmNvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIFRocm93IGBlcnJgIGluIGEgbmV3IHN0YWNrLlxuICpcbiAqIFRoaXMgaXMgdXNlZCB3aGVuIGNvKCkgaXMgaW52b2tlZFxuICogd2l0aG91dCBzdXBwbHlpbmcgYSBjYWxsYmFjaywgd2hpY2hcbiAqIHNob3VsZCBvbmx5IGJlIGZvciBkZW1vbnN0cmF0aW9uYWxcbiAqIHB1cnBvc2VzLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZXJyb3IoZXJyKSB7XG4gIGlmICghZXJyKSByZXR1cm47XG4gIHNldEltbWVkaWF0ZShmdW5jdGlvbigpe1xuICAgIHRocm93IGVycjtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qXG4gKiBDb25zdGFudHMuXG4gKi9cblxudmFyIFdISVRFX1NQQUNFX0NPTExBUFNBQkxFID0gL1xccysvZztcbnZhciBTUEFDRSA9ICcgJztcblxuLyoqXG4gKiBSZXBsYWNlIG11bHRpcGxlIHdoaXRlLXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBjb2xsYXBzZSgnIFxcdFxcbmJhciBcXG5iYXpcXHQnKTsgLy8gJyBiYXIgYmF6ICdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB3aXRoIHVuY29sbGFwc2VkIHdoaXRlLXNwYWNlLFxuICogICBjb2VyY2VkIHRvIHN0cmluZy5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBWYWx1ZSB3aXRoIGNvbGxhcHNlZCB3aGl0ZS1zcGFjZS5cbiAqL1xuZnVuY3Rpb24gY29sbGFwc2UodmFsdWUpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5yZXBsYWNlKFdISVRFX1NQQUNFX0NPTExBUFNBQkxFLCBTUEFDRSk7XG59XG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBjb2xsYXBzZTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHhzLCBmbikge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB4ID0gZm4oeHNbaV0sIGkpO1xuICAgICAgICBpZiAoaXNBcnJheSh4KSkgcmVzLnB1c2guYXBwbHkocmVzLCB4KTtcbiAgICAgICAgZWxzZSByZXMucHVzaCh4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHhzKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCJ2YXIgY29udCA9IHJlcXVpcmUoJ2NvbnRpbnVhYmxlJylcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZ1bikge1xuICByZXR1cm4gY29udC50byhmdW4pXG59XG5cbmZvcih2YXIgayBpbiBjb250KVxuICBleHBvcnRzW2tdID0gY29udFtrXVxuXG5leHBvcnRzLnBhcmEgPSByZXF1aXJlKCdjb250aW51YWJsZS1wYXJhJylcbmV4cG9ydHMuc2VyaWVzID0gcmVxdWlyZSgnY29udGludWFibGUtc2VyaWVzJylcbiIsInZhciBtYXliZUNhbGxiYWNrID0gcmVxdWlyZShcImNvbnRpbnVhYmxlL21heWJlLWNhbGxiYWNrXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gbWF5YmVDYWxsYmFjayhoYXNoKVxuXG4vLyAgaGFzaCA6PSAodGFza3M6T2JqZWN0PFN0cmluZywgQ29udGludWFibGU8VD4+KVxuLy8gICAgICA9PiBDb250aW51YWJsZTxPYmplY3Q8U3RyaW5nLCBUPj5cbmZ1bmN0aW9uIGhhc2godGFza3MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY29udGludWFibGUoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0YXNrcylcbiAgICAgICAgdmFyIGNvdW50ID0gMFxuICAgICAgICB2YXIgcmVzdWx0ID0ge31cblxuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCByZXN1bHQpXG4gICAgICAgIH1cblxuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdGFza3Nba2V5XShmdW5jdGlvbiAoZXJyLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgJiYgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVyciAmJiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoKytjb3VudCA9PT0ga2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwidmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG5cbi8qIEdpdmVuIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBuIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIGNvbnRpbnVhYmxlXG4gICAgcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBuIGFyZ3VtZW50cyBhbmQgbWF5YmUgYSBuKzF0aCBhcmd1bWVudFxuICAgIHdoaWNoIGlzIGEgY2FsbGJhY2sgb3IgdGFrZXMgbiBhcmd1bWVudHMgYW5kIHJldHVybnMgYSBjb250aW51YWJsZVxuXG5UaGlzIGJhc2ljYWxseSBtZWFucyB0aGF0IHlvdSBjYW4gZG8gdGhpczpcblxuYGBganNcbnZhciByZWFkRmlsZSA9IG1heWJlQ2FsbGJhY2soZnVuY3Rpb24gKHVyaSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoY2IpIHsgZnMucmVhZEZpbGUodXJpLCBjYikgfVxufSlcblxucmVhZEZpbGUoXCIuL2Zvb1wiKShjYilcbnJlYWRGaWxlKFwiLi9mb29cIiwgY2IpXG5gYGBcblxuQmUgd2FybmVkIHRoaXMgYnJlYWtzIGlmIHRoZSBsYXN0IGFyZ3VtZW50IGlzIGEgZnVuY3Rpb25cblxuKi9cbm1vZHVsZS5leHBvcnRzID0gbWF5YmVDYWxsYmFja1xuXG4vLyAgbWF5YmVDYWxsYmFjayA6PSAoZm46IChBbnksIC4uLikgPT4gQ29udGludWFibGU8VD4pID0+XG4vLyAgICAgIChBbnksIC4uLiwgQ2FsbGJhY2s8VD4/KSA9PiBDb250aW51YWJsZTxUPlxuZnVuY3Rpb24gbWF5YmVDYWxsYmFjayhmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiBtYXliZUNvbnRpbnVhYmxlKCkge1xuICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cblxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGFyZ3MucG9wKClcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb250aW51YWJsZSA9IGZuLmFwcGx5KG51bGwsIGFyZ3MpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb250aW51YWJsZShjYWxsYmFjaylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250aW51YWJsZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIG1heWJlQ2FsbGJhY2sgPSByZXF1aXJlKFwiY29udGludWFibGUvbWF5YmUtY2FsbGJhY2tcIilcblxubW9kdWxlLmV4cG9ydHMgPSBtYXliZUNhbGxiYWNrKGxpc3QpXG5cbi8vICBsaXN0IDo9ICh0YXNrczpBcnJheTxDb250aW51YWJsZTxUPj4pXG4vLyAgICAgID0+IENvbnRpbnVhYmxlPEFycmF5PFQ+PlxuZnVuY3Rpb24gbGlzdCh0YXNrcykge1xuICAgIHJldHVybiBmdW5jdGlvbiBjb250aW51YWJsZShjYWxsYmFjaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW11cbiAgICAgICAgdmFyIGNvdW50ID0gMFxuXG4gICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCByZXN1bHQpXG4gICAgICAgIH1cblxuICAgICAgICB0YXNrcy5mb3JFYWNoKGZ1bmN0aW9uIGludm9rZVNvdXJjZShzb3VyY2UsIGluZGV4KSB7XG4gICAgICAgICAgICBzb3VyY2UoZnVuY3Rpb24gY29udGludWF0aW9uKGVyciwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyICYmIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFlcnIgJiYgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoKytjb3VudCA9PT0gdGFza3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsInZhciBsaXN0ID0gcmVxdWlyZSgnY29udGludWFibGUtbGlzdCcpXG52YXIgaGFzaCA9IHJlcXVpcmUoJ2NvbnRpbnVhYmxlLWhhc2gnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmosIGNiKSB7XG4gIGlmKEFycmF5LmlzQXJyYXkob2JqKSlcbiAgICByZXR1cm4gbGlzdChvYmosIGNiKVxuICBlbHNlIGlmKCdvYmplY3QnID09PSB0eXBlb2Ygb2JqKVxuICAgIHJldHVybiBoYXNoKG9iaiwgY2IpXG4gIGVsc2VcbiAgICByZXR1cm4gbGlzdChbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNlcmllcyAoY29udGludWFibGVzLCBjYWxsYmFjaykge1xuICBpZignZnVuY3Rpb24nID09PSB0eXBlb2YgY29udGludWFibGVzKVxuICAgIHJldHVybiBzZXJpZXMoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuXG4gIGlmIChjYWxsYmFjaykge1xuICAgIG5leHQoY2FsbGJhY2spXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5leHRcbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHQgKGNhbGxiYWNrKSB7XG4gICAgY29udGludWFibGVzLnNoaWZ0KCkgKGZ1bmN0aW9uIChlcnIsIHZhbHVlKSB7XG4gICAgICBpZiAoZXJyIHx8ICFjb250aW51YWJsZXMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCB2YWx1ZSlcbiAgICAgIG5leHQgKGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cbn1cbiIsIi8vIGJvdGggOj0gKENvbnRpbnVhYmxlKSA9PiBDb250aW51YWJsZTxbRXJyb3IsIEFueV0+XG5tb2R1bGUuZXhwb3J0cyA9IGJvdGhcblxuZnVuY3Rpb24gYm90aChzb3VyY2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY29udGludWFibGUoY2FsbGJhY2spIHtcbiAgICAgICAgc291cmNlKGZ1bmN0aW9uIChlcnIsIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBbZXJyIHx8IG51bGwsIHZhbHVlXSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNoYWluXG5cbi8vIGNoYWluIDo9IChDb250aW51YWJsZTxBPiwgbGFtYmRhOihBKSA9PiBDb250aW51YWJsZTxCPikgPT4gQ29udGludWFibGU8Qj5cbmZ1bmN0aW9uIGNoYWluKHNvdXJjZSwgbGFtYmRhKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRpbnVhYmxlKGNhbGxiYWNrKSB7XG4gICAgICAgIHNvdXJjZShmdW5jdGlvbiBjb250aW51YXRpb24oZXJyLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxhbWJkYSh2YWx1ZSkoY2FsbGJhY2spXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwidmFyIG9mID0gcmVxdWlyZShcIi4vb2ZcIilcblxubW9kdWxlLmV4cG9ydHMgPSBlaXRoZXJcblxuLy8gIGVpdGhlciA6PSAoc291cmNlOiBDb250aW51YWJsZTxBPixcbi8vICAgICAgICAgICAgIGxlZnQ6IChFcnJvciwgY2I/OiBDYWxsYmFjazxCPikgPT4gQ29udGludWFibGU8Qj4sXG4vLyAgICAgICAgICAgICByaWdodD86IChBKSA9PiBDb250aW51YWJsZTxCPilcbi8vICAgICAgPT4gQ29udGludWFibGU8Qj5cbmZ1bmN0aW9uIGVpdGhlcihjb250LCBsZWZ0LCByaWdodCkge1xuICAgIHJpZ2h0ID0gcmlnaHQgfHwgb2ZcblxuICAgIHJldHVybiBmdW5jdGlvbiBjb250aW51YWJsZShjYWxsYmFjaykge1xuICAgICAgICBjb250KGZ1bmN0aW9uIChlcnIsIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiByaWdodCh2YWx1ZSkoY2FsbGJhY2spXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRoZSBsZWZ0IGZ1bmN0aW9uIHRha2VzIGVpdGhlciBhIGNhbGxiYWNrIG9yXG4gICAgICAgICAgICAvLyBpdCByZXR1cm5zIGEgY29udGludWFibGUuIEJvdGggYXJlIHZhbGlkXG4gICAgICAgICAgICB2YXIgY29udCA9IGxlZnQoZXJyLCBjYWxsYmFjaylcblxuICAgICAgICAgICAgaWYgKGNvbnQpIHtcbiAgICAgICAgICAgICAgICBjb250KGNhbGxiYWNrKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZXJyb3JcblxuLy8gZXJyb3IgOj0gKEVycm9yKSA9PiBDb250aW51YWJsZTx2b2lkPlxuZnVuY3Rpb24gZXJyb3IoZXJyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRpbnVhYmxlKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKGVycilcbiAgICB9XG59XG4iLCJ2YXIgbWF5YmVDYWxsYmFjayA9IHJlcXVpcmUoXCIuL21heWJlLWNhbGxiYWNrLmpzXCIpXG5tYXliZUNhbGxiYWNrLmJvdGggPSByZXF1aXJlKFwiLi9ib3RoLmpzXCIpXG5tYXliZUNhbGxiYWNrLmNoYWluID0gcmVxdWlyZShcIi4vY2hhaW4uanNcIilcbm1heWJlQ2FsbGJhY2suZWl0aGVyID0gcmVxdWlyZShcIi4vZWl0aGVyLmpzXCIpXG5tYXliZUNhbGxiYWNrLmVycm9yID0gcmVxdWlyZShcIi4vZXJyb3IuanNcIilcbm1heWJlQ2FsbGJhY2suam9pbiA9IHJlcXVpcmUoXCIuL2pvaW4uanNcIilcbm1heWJlQ2FsbGJhY2subWFwQXN5bmMgPSByZXF1aXJlKFwiLi9tYXAtYXN5bmMuanNcIilcbm1heWJlQ2FsbGJhY2subWFwID0gcmVxdWlyZShcIi4vbWFwLmpzXCIpXG5tYXliZUNhbGxiYWNrLm9mID0gcmVxdWlyZShcIi4vb2YuanNcIilcbm1heWJlQ2FsbGJhY2sudG8gPSByZXF1aXJlKFwiLi90by5qc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1heWJlQ2FsbGJhY2tcblxuIiwibW9kdWxlLmV4cG9ydHMgPSBqb2luXG5cbi8vIGpvaW4gOj0gKENvbnRpbnVhYmxlPENvbnRpbnVhYmxlPFQ+PikgPT4gQ29udGludWFibGU8VD5cbmZ1bmN0aW9uIGpvaW4oc291cmNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRpbnVhYmxlKGNhbGxiYWNrKSB7XG4gICAgICAgIHNvdXJjZShmdW5jdGlvbiBjb250aW51YXRpb24oZXJyLCBuZXh0KSB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV4dChjYWxsYmFjaylcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IG1hcEFzeW5jXG5cbi8vIG1hcEFzeW5jIDo9IChDb250aW51YWJsZTxBPiwgbGFtYmRhOiAoQSwgQ2FsbGJhY2s8Qj4pKSA9PiBDb250aW51YWJsZTxCPlxuZnVuY3Rpb24gbWFwQXN5bmMoc291cmNlLCBsYW1iZGEpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY29udGludWFibGUoY2FsbGJhY2spIHtcbiAgICAgICAgc291cmNlKGZ1bmN0aW9uIGNvbnRpbnVhdGlvbihlcnIsIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGFtYmRhKHZhbHVlLCBjYWxsYmFjaylcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IG1hcFxuXG4vLyBtYXAgOj0gKENvbnRpbnVhYmxlPEE+LCAoQSkgPT4gQikgPT4gQ29udGludWFibGU8Qj5cbmZ1bmN0aW9uIG1hcChzb3VyY2UsIGxhbWJkYSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBjb250aW51YWJsZShjYWxsYmFjaykge1xuICAgICAgICBzb3VyY2UoZnVuY3Rpb24gY29udGludWF0aW9uKGVyciwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBsYW1iZGEodmFsdWUpKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gb2ZcblxuLy8gb2YgOj0gKFZhbHVlKSA9PiBDb250aW51YWJsZTxWYWx1ZT5cbmZ1bmN0aW9uIG9mKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRpbnVhYmxlKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHZhbHVlKVxuICAgIH1cbn1cbiIsInZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvXG5cbmZ1bmN0aW9uIHRvKGFzeW5jRm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmNGbi5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRpbnVhYmxlKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgX2FyZ3MgPSBhcmdzLnNsaWNlKClcbiAgICAgICAgICAgIF9hcmdzLnB1c2goY2FsbGJhY2spXG4gICAgICAgICAgICByZXR1cm4gYXN5bmNGbi5hcHBseShzZWxmLCBfYXJncylcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5mdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXI7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiIsInZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJ2VsbGlwdGljJyk7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUVDREgoY3VydmUpIHtcblx0cmV0dXJuIG5ldyBFQ0RIKGN1cnZlKTtcbn07XG5cbnZhciBhbGlhc2VzID0ge1xuXHRzZWNwMjU2azE6IHtcblx0XHRuYW1lOiAnc2VjcDI1NmsxJyxcblx0XHRieXRlTGVuZ3RoOiAzMlxuXHR9LFxuXHRzZWNwMjI0cjE6IHtcblx0XHRuYW1lOiAncDIyNCcsXG5cdFx0Ynl0ZUxlbmd0aDogMjhcblx0fSxcblx0cHJpbWUyNTZ2MToge1xuXHRcdG5hbWU6ICdwMjU2Jyxcblx0XHRieXRlTGVuZ3RoOiAzMlxuXHR9LFxuXHRwcmltZTE5MnYxOiB7XG5cdFx0bmFtZTogJ3AxOTInLFxuXHRcdGJ5dGVMZW5ndGg6IDI0XG5cdH0sXG5cdGVkMjU1MTk6IHtcblx0XHRuYW1lOiAnZWQyNTUxOScsXG5cdFx0Ynl0ZUxlbmd0aDogMzJcblx0fSxcblx0c2VjcDM4NHIxOiB7XG5cdFx0bmFtZTogJ3AzODQnLFxuXHRcdGJ5dGVMZW5ndGg6IDQ4XG5cdH0sXG5cdHNlY3A1MjFyMToge1xuXHRcdG5hbWU6ICdwNTIxJyxcblx0XHRieXRlTGVuZ3RoOiA2NlxuXHR9XG59O1xuXG5hbGlhc2VzLnAyMjQgPSBhbGlhc2VzLnNlY3AyMjRyMTtcbmFsaWFzZXMucDI1NiA9IGFsaWFzZXMuc2VjcDI1NnIxID0gYWxpYXNlcy5wcmltZTI1NnYxO1xuYWxpYXNlcy5wMTkyID0gYWxpYXNlcy5zZWNwMTkycjEgPSBhbGlhc2VzLnByaW1lMTkydjE7XG5hbGlhc2VzLnAzODQgPSBhbGlhc2VzLnNlY3AzODRyMTtcbmFsaWFzZXMucDUyMSA9IGFsaWFzZXMuc2VjcDUyMXIxO1xuXG5mdW5jdGlvbiBFQ0RIKGN1cnZlKSB7XG5cdHRoaXMuY3VydmVUeXBlID0gYWxpYXNlc1tjdXJ2ZV07XG5cdGlmICghdGhpcy5jdXJ2ZVR5cGUgKSB7XG5cdFx0dGhpcy5jdXJ2ZVR5cGUgPSB7XG5cdFx0XHRuYW1lOiBjdXJ2ZVxuXHRcdH07XG5cdH1cblx0dGhpcy5jdXJ2ZSA9IG5ldyBlbGxpcHRpYy5lYyh0aGlzLmN1cnZlVHlwZS5uYW1lKTtcblx0dGhpcy5rZXlzID0gdm9pZCAwO1xufVxuXG5FQ0RILnByb3RvdHlwZS5nZW5lcmF0ZUtleXMgPSBmdW5jdGlvbiAoZW5jLCBmb3JtYXQpIHtcblx0dGhpcy5rZXlzID0gdGhpcy5jdXJ2ZS5nZW5LZXlQYWlyKCk7XG5cdHJldHVybiB0aGlzLmdldFB1YmxpY0tleShlbmMsIGZvcm1hdCk7XG59O1xuXG5FQ0RILnByb3RvdHlwZS5jb21wdXRlU2VjcmV0ID0gZnVuY3Rpb24gKG90aGVyLCBpbmVuYywgZW5jKSB7XG5cdGluZW5jID0gaW5lbmMgfHwgJ3V0ZjgnO1xuXHRpZiAoIUJ1ZmZlci5pc0J1ZmZlcihvdGhlcikpIHtcblx0XHRvdGhlciA9IG5ldyBCdWZmZXIob3RoZXIsIGluZW5jKTtcblx0fVxuXHR2YXIgb3RoZXJQdWIgPSB0aGlzLmN1cnZlLmtleUZyb21QdWJsaWMob3RoZXIpLmdldFB1YmxpYygpO1xuXHR2YXIgb3V0ID0gb3RoZXJQdWIubXVsKHRoaXMua2V5cy5nZXRQcml2YXRlKCkpLmdldFgoKTtcblx0cmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKG91dCwgZW5jLCB0aGlzLmN1cnZlVHlwZS5ieXRlTGVuZ3RoKTtcbn07XG5cbkVDREgucHJvdG90eXBlLmdldFB1YmxpY0tleSA9IGZ1bmN0aW9uIChlbmMsIGZvcm1hdCkge1xuXHR2YXIga2V5ID0gdGhpcy5rZXlzLmdldFB1YmxpYyhmb3JtYXQgPT09ICdjb21wcmVzc2VkJywgdHJ1ZSk7XG5cdGlmIChmb3JtYXQgPT09ICdoeWJyaWQnKSB7XG5cdFx0aWYgKGtleVtrZXkubGVuZ3RoIC0gMV0gJSAyKSB7XG5cdFx0XHRrZXlbMF0gPSA3O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrZXkgWzBdID0gNjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKGtleSwgZW5jKTtcbn07XG5cbkVDREgucHJvdG90eXBlLmdldFByaXZhdGVLZXkgPSBmdW5jdGlvbiAoZW5jKSB7XG5cdHJldHVybiBmb3JtYXRSZXR1cm5WYWx1ZSh0aGlzLmtleXMuZ2V0UHJpdmF0ZSgpLCBlbmMpO1xufTtcblxuRUNESC5wcm90b3R5cGUuc2V0UHVibGljS2V5ID0gZnVuY3Rpb24gKHB1YiwgZW5jKSB7XG5cdGVuYyA9IGVuYyB8fCAndXRmOCc7XG5cdGlmICghQnVmZmVyLmlzQnVmZmVyKHB1YikpIHtcblx0XHRwdWIgPSBuZXcgQnVmZmVyKHB1YiwgZW5jKTtcblx0fVxuXHR0aGlzLmtleXMuX2ltcG9ydFB1YmxpYyhwdWIpO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbkVDREgucHJvdG90eXBlLnNldFByaXZhdGVLZXkgPSBmdW5jdGlvbiAocHJpdiwgZW5jKSB7XG5cdGVuYyA9IGVuYyB8fCAndXRmOCc7XG5cdGlmICghQnVmZmVyLmlzQnVmZmVyKHByaXYpKSB7XG5cdFx0cHJpdiA9IG5ldyBCdWZmZXIocHJpdiwgZW5jKTtcblx0fVxuXHR2YXIgX3ByaXYgPSBuZXcgQk4ocHJpdik7XG5cdF9wcml2ID0gX3ByaXYudG9TdHJpbmcoMTYpO1xuXHR0aGlzLmtleXMuX2ltcG9ydFByaXZhdGUoX3ByaXYpO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdFJldHVyblZhbHVlKGJuLCBlbmMsIGxlbikge1xuXHRpZiAoIUFycmF5LmlzQXJyYXkoYm4pKSB7XG5cdFx0Ym4gPSBibi50b0FycmF5KCk7XG5cdH1cblx0dmFyIGJ1ZiA9IG5ldyBCdWZmZXIoYm4pO1xuXHRpZiAobGVuICYmIGJ1Zi5sZW5ndGggPCBsZW4pIHtcblx0XHR2YXIgemVyb3MgPSBuZXcgQnVmZmVyKGxlbiAtIGJ1Zi5sZW5ndGgpO1xuXHRcdHplcm9zLmZpbGwoMCk7XG5cdFx0YnVmID0gQnVmZmVyLmNvbmNhdChbemVyb3MsIGJ1Zl0pO1xuXHR9XG5cdGlmICghZW5jKSB7XG5cdFx0cmV0dXJuIGJ1Zjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gYnVmLnRvU3RyaW5nKGVuYyk7XG5cdH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBtZDUgPSByZXF1aXJlKCcuL21kNScpXG52YXIgcm1kMTYwID0gcmVxdWlyZSgncmlwZW1kMTYwJylcbnZhciBzaGEgPSByZXF1aXJlKCdzaGEuanMnKVxuXG52YXIgQmFzZSA9IHJlcXVpcmUoJ2NpcGhlci1iYXNlJylcblxuZnVuY3Rpb24gSGFzaE5vQ29uc3RydWN0b3IoaGFzaCkge1xuICBCYXNlLmNhbGwodGhpcywgJ2RpZ2VzdCcpXG5cbiAgdGhpcy5faGFzaCA9IGhhc2hcbiAgdGhpcy5idWZmZXJzID0gW11cbn1cblxuaW5oZXJpdHMoSGFzaE5vQ29uc3RydWN0b3IsIEJhc2UpXG5cbkhhc2hOb0NvbnN0cnVjdG9yLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5idWZmZXJzLnB1c2goZGF0YSlcbn1cblxuSGFzaE5vQ29uc3RydWN0b3IucHJvdG90eXBlLl9maW5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQodGhpcy5idWZmZXJzKVxuICB2YXIgciA9IHRoaXMuX2hhc2goYnVmKVxuICB0aGlzLmJ1ZmZlcnMgPSBudWxsXG5cbiAgcmV0dXJuIHJcbn1cblxuZnVuY3Rpb24gSGFzaChoYXNoKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnZGlnZXN0JylcblxuICB0aGlzLl9oYXNoID0gaGFzaFxufVxuXG5pbmhlcml0cyhIYXNoLCBCYXNlKVxuXG5IYXNoLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgdGhpcy5faGFzaC51cGRhdGUoZGF0YSlcbn1cblxuSGFzaC5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5faGFzaC5kaWdlc3QoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUhhc2ggKGFsZykge1xuICBhbGcgPSBhbGcudG9Mb3dlckNhc2UoKVxuICBpZiAoJ21kNScgPT09IGFsZykgcmV0dXJuIG5ldyBIYXNoTm9Db25zdHJ1Y3RvcihtZDUpXG4gIGlmICgncm1kMTYwJyA9PT0gYWxnIHx8ICdyaXBlbWQxNjAnID09PSBhbGcpIHJldHVybiBuZXcgSGFzaE5vQ29uc3RydWN0b3Iocm1kMTYwKVxuXG4gIHJldHVybiBuZXcgSGFzaChzaGEoYWxnKSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpbnRTaXplID0gNDtcbnZhciB6ZXJvQnVmZmVyID0gbmV3IEJ1ZmZlcihpbnRTaXplKTsgemVyb0J1ZmZlci5maWxsKDApO1xudmFyIGNocnN6ID0gODtcblxuZnVuY3Rpb24gdG9BcnJheShidWYsIGJpZ0VuZGlhbikge1xuICBpZiAoKGJ1Zi5sZW5ndGggJSBpbnRTaXplKSAhPT0gMCkge1xuICAgIHZhciBsZW4gPSBidWYubGVuZ3RoICsgKGludFNpemUgLSAoYnVmLmxlbmd0aCAlIGludFNpemUpKTtcbiAgICBidWYgPSBCdWZmZXIuY29uY2F0KFtidWYsIHplcm9CdWZmZXJdLCBsZW4pO1xuICB9XG5cbiAgdmFyIGFyciA9IFtdO1xuICB2YXIgZm4gPSBiaWdFbmRpYW4gPyBidWYucmVhZEludDMyQkUgOiBidWYucmVhZEludDMyTEU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSArPSBpbnRTaXplKSB7XG4gICAgYXJyLnB1c2goZm4uY2FsbChidWYsIGkpKTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiB0b0J1ZmZlcihhcnIsIHNpemUsIGJpZ0VuZGlhbikge1xuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzaXplKTtcbiAgdmFyIGZuID0gYmlnRW5kaWFuID8gYnVmLndyaXRlSW50MzJCRSA6IGJ1Zi53cml0ZUludDMyTEU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgZm4uY2FsbChidWYsIGFycltpXSwgaSAqIDQsIHRydWUpO1xuICB9XG4gIHJldHVybiBidWY7XG59XG5cbmZ1bmN0aW9uIGhhc2goYnVmLCBmbiwgaGFzaFNpemUsIGJpZ0VuZGlhbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSBidWYgPSBuZXcgQnVmZmVyKGJ1Zik7XG4gIHZhciBhcnIgPSBmbih0b0FycmF5KGJ1ZiwgYmlnRW5kaWFuKSwgYnVmLmxlbmd0aCAqIGNocnN6KTtcbiAgcmV0dXJuIHRvQnVmZmVyKGFyciwgaGFzaFNpemUsIGJpZ0VuZGlhbik7XG59XG5leHBvcnRzLmhhc2ggPSBoYXNoOyIsIid1c2Ugc3RyaWN0Jztcbi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjEgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDAyLlxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgbW9yZSBpbmZvLlxuICovXG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7XG5cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIGNvcmVfbWQ1KHgsIGxlbilcbntcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCAoKGxlbikgJSAzMik7XG4gIHhbKCgobGVuICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IGxlbjtcblxuICB2YXIgYSA9ICAxNzMyNTg0MTkzO1xuICB2YXIgYiA9IC0yNzE3MzM4Nzk7XG4gIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gIHZhciBkID0gIDI3MTczMzg3ODtcblxuICBmb3IodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkgKz0gMTYpXG4gIHtcbiAgICB2YXIgb2xkYSA9IGE7XG4gICAgdmFyIG9sZGIgPSBiO1xuICAgIHZhciBvbGRjID0gYztcbiAgICB2YXIgb2xkZCA9IGQ7XG5cbiAgICBhID0gbWQ1X2ZmKGEsIGIsIGMsIGQsIHhbaSsgMF0sIDcgLCAtNjgwODc2OTM2KTtcbiAgICBkID0gbWQ1X2ZmKGQsIGEsIGIsIGMsIHhbaSsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICBjID0gbWQ1X2ZmKGMsIGQsIGEsIGIsIHhbaSsgMl0sIDE3LCAgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1X2ZmKGIsIGMsIGQsIGEsIHhbaSsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNV9mZihhLCBiLCBjLCBkLCB4W2krIDRdLCA3ICwgLTE3NjQxODg5Nyk7XG4gICAgZCA9IG1kNV9mZihkLCBhLCBiLCBjLCB4W2krIDVdLCAxMiwgIDEyMDAwODA0MjYpO1xuICAgIGMgPSBtZDVfZmYoYywgZCwgYSwgYiwgeFtpKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICBiID0gbWQ1X2ZmKGIsIGMsIGQsIGEsIHhbaSsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgIGEgPSBtZDVfZmYoYSwgYiwgYywgZCwgeFtpKyA4XSwgNyAsICAxNzcwMDM1NDE2KTtcbiAgICBkID0gbWQ1X2ZmKGQsIGEsIGIsIGMsIHhbaSsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG4gICAgYyA9IG1kNV9mZihjLCBkLCBhLCBiLCB4W2krMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1X2ZmKGIsIGMsIGQsIGEsIHhbaSsxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgYSA9IG1kNV9mZihhLCBiLCBjLCBkLCB4W2krMTJdLCA3ICwgIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVfZmYoZCwgYSwgYiwgYywgeFtpKzEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgYyA9IG1kNV9mZihjLCBkLCBhLCBiLCB4W2krMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuICAgIGIgPSBtZDVfZmYoYiwgYywgZCwgYSwgeFtpKzE1XSwgMjIsICAxMjM2NTM1MzI5KTtcblxuICAgIGEgPSBtZDVfZ2coYSwgYiwgYywgZCwgeFtpKyAxXSwgNSAsIC0xNjU3OTY1MTApO1xuICAgIGQgPSBtZDVfZ2coZCwgYSwgYiwgYywgeFtpKyA2XSwgOSAsIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1X2dnKGMsIGQsIGEsIGIsIHhbaSsxMV0sIDE0LCAgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1X2dnKGIsIGMsIGQsIGEsIHhbaSsgMF0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1X2dnKGEsIGIsIGMsIGQsIHhbaSsgNV0sIDUgLCAtNzAxNTU4NjkxKTtcbiAgICBkID0gbWQ1X2dnKGQsIGEsIGIsIGMsIHhbaSsxMF0sIDkgLCAgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVfZ2coYywgZCwgYSwgYiwgeFtpKzE1XSwgMTQsIC02NjA0NzgzMzUpO1xuICAgIGIgPSBtZDVfZ2coYiwgYywgZCwgYSwgeFtpKyA0XSwgMjAsIC00MDU1Mzc4NDgpO1xuICAgIGEgPSBtZDVfZ2coYSwgYiwgYywgZCwgeFtpKyA5XSwgNSAsICA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVfZ2coZCwgYSwgYiwgYywgeFtpKzE0XSwgOSAsIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1X2dnKGMsIGQsIGEsIGIsIHhbaSsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1X2dnKGIsIGMsIGQsIGEsIHhbaSsgOF0sIDIwLCAgMTE2MzUzMTUwMSk7XG4gICAgYSA9IG1kNV9nZyhhLCBiLCBjLCBkLCB4W2krMTNdLCA1ICwgLTE0NDQ2ODE0NjcpO1xuICAgIGQgPSBtZDVfZ2coZCwgYSwgYiwgYywgeFtpKyAyXSwgOSAsIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNV9nZyhjLCBkLCBhLCBiLCB4W2krIDddLCAxNCwgIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVfZ2coYiwgYywgZCwgYSwgeFtpKzEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcblxuICAgIGEgPSBtZDVfaGgoYSwgYiwgYywgZCwgeFtpKyA1XSwgNCAsIC0zNzg1NTgpO1xuICAgIGQgPSBtZDVfaGgoZCwgYSwgYiwgYywgeFtpKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICBjID0gbWQ1X2hoKGMsIGQsIGEsIGIsIHhbaSsxMV0sIDE2LCAgMTgzOTAzMDU2Mik7XG4gICAgYiA9IG1kNV9oaChiLCBjLCBkLCBhLCB4W2krMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1X2hoKGEsIGIsIGMsIGQsIHhbaSsgMV0sIDQgLCAtMTUzMDk5MjA2MCk7XG4gICAgZCA9IG1kNV9oaChkLCBhLCBiLCBjLCB4W2krIDRdLCAxMSwgIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVfaGgoYywgZCwgYSwgYiwgeFtpKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVfaGgoYiwgYywgZCwgYSwgeFtpKzEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICBhID0gbWQ1X2hoKGEsIGIsIGMsIGQsIHhbaSsxM10sIDQgLCAgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1X2hoKGQsIGEsIGIsIGMsIHhbaSsgMF0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1X2hoKGMsIGQsIGEsIGIsIHhbaSsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1X2hoKGIsIGMsIGQsIGEsIHhbaSsgNl0sIDIzLCAgNzYwMjkxODkpO1xuICAgIGEgPSBtZDVfaGgoYSwgYiwgYywgZCwgeFtpKyA5XSwgNCAsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVfaGgoZCwgYSwgYiwgYywgeFtpKzEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgIGMgPSBtZDVfaGgoYywgZCwgYSwgYiwgeFtpKzE1XSwgMTYsICA1MzA3NDI1MjApO1xuICAgIGIgPSBtZDVfaGgoYiwgYywgZCwgYSwgeFtpKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuXG4gICAgYSA9IG1kNV9paShhLCBiLCBjLCBkLCB4W2krIDBdLCA2ICwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNV9paShkLCBhLCBiLCBjLCB4W2krIDddLCAxMCwgIDExMjY4OTE0MTUpO1xuICAgIGMgPSBtZDVfaWkoYywgZCwgYSwgYiwgeFtpKzE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1X2lpKGIsIGMsIGQsIGEsIHhbaSsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVfaWkoYSwgYiwgYywgZCwgeFtpKzEyXSwgNiAsICAxNzAwNDg1NTcxKTtcbiAgICBkID0gbWQ1X2lpKGQsIGEsIGIsIGMsIHhbaSsgM10sIDEwLCAtMTg5NDk4NjYwNik7XG4gICAgYyA9IG1kNV9paShjLCBkLCBhLCBiLCB4W2krMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVfaWkoYiwgYywgZCwgYSwgeFtpKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1X2lpKGEsIGIsIGMsIGQsIHhbaSsgOF0sIDYgLCAgMTg3MzMxMzM1OSk7XG4gICAgZCA9IG1kNV9paShkLCBhLCBiLCBjLCB4W2krMTVdLCAxMCwgLTMwNjExNzQ0KTtcbiAgICBjID0gbWQ1X2lpKGMsIGQsIGEsIGIsIHhbaSsgNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG4gICAgYiA9IG1kNV9paShiLCBjLCBkLCBhLCB4W2krMTNdLCAyMSwgIDEzMDkxNTE2NDkpO1xuICAgIGEgPSBtZDVfaWkoYSwgYiwgYywgZCwgeFtpKyA0XSwgNiAsIC0xNDU1MjMwNzApO1xuICAgIGQgPSBtZDVfaWkoZCwgYSwgYiwgYywgeFtpKzExXSwgMTAsIC0xMTIwMjEwMzc5KTtcbiAgICBjID0gbWQ1X2lpKGMsIGQsIGEsIGIsIHhbaSsgMl0sIDE1LCAgNzE4Nzg3MjU5KTtcbiAgICBiID0gbWQ1X2lpKGIsIGMsIGQsIGEsIHhbaSsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcblxuICAgIGEgPSBzYWZlX2FkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZV9hZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVfYWRkKGMsIG9sZGMpO1xuICAgIGQgPSBzYWZlX2FkZChkLCBvbGRkKTtcbiAgfVxuICByZXR1cm4gQXJyYXkoYSwgYiwgYywgZCk7XG5cbn1cblxuLypcbiAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGZvdXIgYmFzaWMgb3BlcmF0aW9ucyB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIG1kNV9jbW4ocSwgYSwgYiwgeCwgcywgdClcbntcbiAgcmV0dXJuIHNhZmVfYWRkKGJpdF9yb2woc2FmZV9hZGQoc2FmZV9hZGQoYSwgcSksIHNhZmVfYWRkKHgsIHQpKSwgcyksYik7XG59XG5mdW5jdGlvbiBtZDVfZmYoYSwgYiwgYywgZCwgeCwgcywgdClcbntcbiAgcmV0dXJuIG1kNV9jbW4oKGIgJiBjKSB8ICgofmIpICYgZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1X2dnKGEsIGIsIGMsIGQsIHgsIHMsIHQpXG57XG4gIHJldHVybiBtZDVfY21uKChiICYgZCkgfCAoYyAmICh+ZCkpLCBhLCBiLCB4LCBzLCB0KTtcbn1cbmZ1bmN0aW9uIG1kNV9oaChhLCBiLCBjLCBkLCB4LCBzLCB0KVxue1xuICByZXR1cm4gbWQ1X2NtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1X2lpKGEsIGIsIGMsIGQsIHgsIHMsIHQpXG57XG4gIHJldHVybiBtZDVfY21uKGMgXiAoYiB8ICh+ZCkpLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuLypcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcbiAqIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG4gKi9cbmZ1bmN0aW9uIHNhZmVfYWRkKHgsIHkpXG57XG4gIHZhciBsc3cgPSAoeCAmIDB4RkZGRikgKyAoeSAmIDB4RkZGRik7XG4gIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgcmV0dXJuIChtc3cgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG59XG5cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cbmZ1bmN0aW9uIGJpdF9yb2wobnVtLCBjbnQpXG57XG4gIHJldHVybiAobnVtIDw8IGNudCkgfCAobnVtID4+PiAoMzIgLSBjbnQpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtZDUoYnVmKSB7XG4gIHJldHVybiBoZWxwZXJzLmhhc2goYnVmLCBjb3JlX21kNSwgMTYpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoL2Jyb3dzZXInKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybVxuXG52YXIgWkVST1MgPSBuZXcgQnVmZmVyKDEyOClcblpFUk9TLmZpbGwoMClcblxuZnVuY3Rpb24gSG1hYyhhbGcsIGtleSkge1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzKVxuICBhbGcgPSBhbGcudG9Mb3dlckNhc2UoKVxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICBrZXkgPSBuZXcgQnVmZmVyKGtleSlcbiAgfVxuXG4gIHZhciBibG9ja3NpemUgPSAoYWxnID09PSAnc2hhNTEyJyB8fCBhbGcgPT09ICdzaGEzODQnKSA/IDEyOCA6IDY0XG5cbiAgdGhpcy5fYWxnID0gYWxnXG4gIHRoaXMuX2tleSA9IGtleVxuXG4gIGlmIChrZXkubGVuZ3RoID4gYmxvY2tzaXplKSB7XG4gICAga2V5ID0gY3JlYXRlSGFzaChhbGcpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpXG5cbiAgfSBlbHNlIGlmIChrZXkubGVuZ3RoIDwgYmxvY2tzaXplKSB7XG4gICAga2V5ID0gQnVmZmVyLmNvbmNhdChba2V5LCBaRVJPU10sIGJsb2Nrc2l6ZSlcbiAgfVxuXG4gIHZhciBpcGFkID0gdGhpcy5faXBhZCA9IG5ldyBCdWZmZXIoYmxvY2tzaXplKVxuICB2YXIgb3BhZCA9IHRoaXMuX29wYWQgPSBuZXcgQnVmZmVyKGJsb2Nrc2l6ZSlcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2Nrc2l6ZTsgaSsrKSB7XG4gICAgaXBhZFtpXSA9IGtleVtpXSBeIDB4MzZcbiAgICBvcGFkW2ldID0ga2V5W2ldIF4gMHg1Q1xuICB9XG5cbiAgdGhpcy5faGFzaCA9IGNyZWF0ZUhhc2goYWxnKS51cGRhdGUoaXBhZClcbn1cblxuaW5oZXJpdHMoSG1hYywgVHJhbnNmb3JtKVxuXG5IbWFjLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSwgZW5jKSB7XG4gIHRoaXMuX2hhc2gudXBkYXRlKGRhdGEsIGVuYylcblxuICByZXR1cm4gdGhpc1xufVxuXG5IbWFjLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGRhdGEsIF8sIG5leHQpIHtcbiAgdGhpcy5faGFzaC51cGRhdGUoZGF0YSlcblxuICBuZXh0KClcbn1cblxuSG1hYy5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24gKG5leHQpIHtcbiAgdGhpcy5wdXNoKHRoaXMuZGlnZXN0KCkpXG5cbiAgbmV4dCgpXG59XG5cbkhtYWMucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgdmFyIGggPSB0aGlzLl9oYXNoLmRpZ2VzdCgpXG5cbiAgcmV0dXJuIGNyZWF0ZUhhc2godGhpcy5fYWxnKS51cGRhdGUodGhpcy5fb3BhZCkudXBkYXRlKGgpLmRpZ2VzdChlbmMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlSG1hYyhhbGcsIGtleSkge1xuICByZXR1cm4gbmV3IEhtYWMoYWxnLCBrZXkpXG59XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5yYW5kb21CeXRlcyA9IGV4cG9ydHMucm5nID0gZXhwb3J0cy5wc2V1ZG9SYW5kb21CeXRlcyA9IGV4cG9ydHMucHJuZyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJylcbmV4cG9ydHMuY3JlYXRlSGFzaCA9IGV4cG9ydHMuSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJylcbmV4cG9ydHMuY3JlYXRlSG1hYyA9IGV4cG9ydHMuSG1hYyA9IHJlcXVpcmUoJ2NyZWF0ZS1obWFjJylcblxudmFyIGhhc2hlcyA9IFsnc2hhMScsICdzaGEyMjQnLCAnc2hhMjU2JywgJ3NoYTM4NCcsICdzaGE1MTInLCAnbWQ1JywgJ3JtZDE2MCddLmNvbmNhdChPYmplY3Qua2V5cyhyZXF1aXJlKCdicm93c2VyaWZ5LXNpZ24vYWxnb3MnKSkpXG5leHBvcnRzLmdldEhhc2hlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGhhc2hlc1xufVxuXG52YXIgcCA9IHJlcXVpcmUoJ3Bia2RmMicpXG5leHBvcnRzLnBia2RmMiA9IHAucGJrZGYyXG5leHBvcnRzLnBia2RmMlN5bmMgPSBwLnBia2RmMlN5bmNcblxudmFyIGFlcyA9IHJlcXVpcmUoJ2Jyb3dzZXJpZnktY2lwaGVyJylcbjtbXG4gICdDaXBoZXInLFxuICAnY3JlYXRlQ2lwaGVyJyxcbiAgJ0NpcGhlcml2JyxcbiAgJ2NyZWF0ZUNpcGhlcml2JyxcbiAgJ0RlY2lwaGVyJyxcbiAgJ2NyZWF0ZURlY2lwaGVyJyxcbiAgJ0RlY2lwaGVyaXYnLFxuICAnY3JlYXRlRGVjaXBoZXJpdicsXG4gICdnZXRDaXBoZXJzJyxcbiAgJ2xpc3RDaXBoZXJzJ1xuXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgZXhwb3J0c1trZXldID0gYWVzW2tleV1cbn0pXG5cbnZhciBkaCA9IHJlcXVpcmUoJ2RpZmZpZS1oZWxsbWFuJylcbjtbXG4gICdEaWZmaWVIZWxsbWFuR3JvdXAnLFxuICAnY3JlYXRlRGlmZmllSGVsbG1hbkdyb3VwJyxcbiAgJ2dldERpZmZpZUhlbGxtYW4nLFxuICAnY3JlYXRlRGlmZmllSGVsbG1hbicsXG4gICdEaWZmaWVIZWxsbWFuJ1xuXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgZXhwb3J0c1trZXldID0gZGhba2V5XVxufSlcblxudmFyIHNpZ24gPSByZXF1aXJlKCdicm93c2VyaWZ5LXNpZ24nKVxuO1tcbiAgJ2NyZWF0ZVNpZ24nLFxuICAnU2lnbicsXG4gICdjcmVhdGVWZXJpZnknLFxuICAnVmVyaWZ5J1xuXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgZXhwb3J0c1trZXldID0gc2lnbltrZXldXG59KVxuXG5leHBvcnRzLmNyZWF0ZUVDREggPSByZXF1aXJlKCdjcmVhdGUtZWNkaCcpXG5cbnZhciBwdWJsaWNFbmNyeXB0ID0gcmVxdWlyZSgncHVibGljLWVuY3J5cHQnKVxuXG47W1xuICAncHVibGljRW5jcnlwdCcsXG4gICdwcml2YXRlRW5jcnlwdCcsXG4gICdwdWJsaWNEZWNyeXB0JyxcbiAgJ3ByaXZhdGVEZWNyeXB0J1xuXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgZXhwb3J0c1trZXldID0gcHVibGljRW5jcnlwdFtrZXldXG59KVxuXG4vLyB0aGUgbGVhc3QgSSBjYW4gZG8gaXMgbWFrZSBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIG5vZGUuanMvY3J5cHRvIGFwaS5cbjtbXG4gICdjcmVhdGVDcmVkZW50aWFscydcbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBleHBvcnRzW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAnc29ycnksICcgKyBuYW1lICsgJyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0JyxcbiAgICAgICd3ZSBhY2NlcHQgcHVsbCByZXF1ZXN0cycsXG4gICAgICAnaHR0cHM6Ly9naXRodWIuY29tL2NyeXB0by1icm93c2VyaWZ5L2NyeXB0by1icm93c2VyaWZ5J1xuICAgIF0uam9pbignXFxuJykpXG4gIH1cbn0pXG4iLCIvKiFcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmUgb2JqZWN0IGV4dGVuZGluZ1xuICogQGF1dGhvciBWaWFjaGVzbGF2IExvdHNtYW5vdiA8bG90c21hbm92ODlAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgVmlhY2hlc2xhdiBMb3RzbWFub3ZcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mXG4gKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluXG4gKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvXG4gKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZlxuICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTXG4gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1JcbiAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUlxuICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU5cbiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBpc1NwZWNpZmljVmFsdWUodmFsKSB7XG5cdHJldHVybiAoXG5cdFx0dmFsIGluc3RhbmNlb2YgQnVmZmVyXG5cdFx0fHwgdmFsIGluc3RhbmNlb2YgRGF0ZVxuXHRcdHx8IHZhbCBpbnN0YW5jZW9mIFJlZ0V4cFxuXHQpID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjbG9uZVNwZWNpZmljVmFsdWUodmFsKSB7XG5cdGlmICh2YWwgaW5zdGFuY2VvZiBCdWZmZXIpIHtcblx0XHR2YXIgeCA9IG5ldyBCdWZmZXIodmFsLmxlbmd0aCk7XG5cdFx0dmFsLmNvcHkoeCk7XG5cdFx0cmV0dXJuIHg7XG5cdH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdHJldHVybiBuZXcgRGF0ZSh2YWwuZ2V0VGltZSgpKTtcblx0fSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcblx0XHRyZXR1cm4gbmV3IFJlZ0V4cCh2YWwpO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaXR1YXRpb24nKTtcblx0fVxufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZSBjbG9uaW5nIGFycmF5LlxuICovXG5mdW5jdGlvbiBkZWVwQ2xvbmVBcnJheShhcnIpIHtcblx0dmFyIGNsb25lID0gW107XG5cdGFyci5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuXHRcdGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcblx0XHRcdFx0Y2xvbmVbaW5kZXhdID0gZGVlcENsb25lQXJyYXkoaXRlbSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlzU3BlY2lmaWNWYWx1ZShpdGVtKSkge1xuXHRcdFx0XHRjbG9uZVtpbmRleF0gPSBjbG9uZVNwZWNpZmljVmFsdWUoaXRlbSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZVtpbmRleF0gPSBkZWVwRXh0ZW5kKHt9LCBpdGVtKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2xvbmVbaW5kZXhdID0gaXRlbTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gY2xvbmU7XG59XG5cbi8qKlxuICogRXh0ZW5pbmcgb2JqZWN0IHRoYXQgZW50ZXJlZCBpbiBmaXJzdCBhcmd1bWVudC5cbiAqXG4gKiBSZXR1cm5zIGV4dGVuZGVkIG9iamVjdCBvciBmYWxzZSBpZiBoYXZlIG5vIHRhcmdldCBvYmplY3Qgb3IgaW5jb3JyZWN0IHR5cGUuXG4gKlxuICogSWYgeW91IHdpc2ggdG8gY2xvbmUgc291cmNlIG9iamVjdCAod2l0aG91dCBtb2RpZnkgaXQpLCBqdXN0IHVzZSBlbXB0eSBuZXdcbiAqIG9iamVjdCBhcyBmaXJzdCBhcmd1bWVudCwgbGlrZSB0aGlzOlxuICogICBkZWVwRXh0ZW5kKHt9LCB5b3VyT2JqXzEsIFt5b3VyT2JqX05dKTtcbiAqL1xudmFyIGRlZXBFeHRlbmQgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgvKm9ial8xLCBbb2JqXzJdLCBbb2JqX05dKi8pIHtcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxIHx8IHR5cGVvZiBhcmd1bWVudHNbMF0gIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG5cdFx0cmV0dXJuIGFyZ3VtZW50c1swXTtcblx0fVxuXG5cdHZhciB0YXJnZXQgPSBhcmd1bWVudHNbMF07XG5cblx0Ly8gY29udmVydCBhcmd1bWVudHMgdG8gYXJyYXkgYW5kIGN1dCBvZmYgdGFyZ2V0IG9iamVjdFxuXHR2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cblx0dmFyIHZhbCwgc3JjLCBjbG9uZTtcblxuXHRhcmdzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuXHRcdC8vIHNraXAgYXJndW1lbnQgaWYgaXQgaXMgYXJyYXkgb3IgaXNuJ3Qgb2JqZWN0XG5cdFx0aWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkob2JqKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRzcmMgPSB0YXJnZXRba2V5XTsgLy8gc291cmNlIHZhbHVlXG5cdFx0XHR2YWwgPSBvYmpba2V5XTsgLy8gbmV3IHZhbHVlXG5cblx0XHRcdC8vIHJlY3Vyc2lvbiBwcmV2ZW50aW9uXG5cdFx0XHRpZiAodmFsID09PSB0YXJnZXQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIGlmIG5ldyB2YWx1ZSBpc24ndCBvYmplY3QgdGhlbiBqdXN0IG92ZXJ3cml0ZSBieSBuZXcgdmFsdWVcblx0XHRcdCAqIGluc3RlYWQgb2YgZXh0ZW5kaW5nLlxuXHRcdFx0ICovXG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnIHx8IHZhbCA9PT0gbnVsbCkge1xuXHRcdFx0XHR0YXJnZXRba2V5XSA9IHZhbDtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHQvLyBqdXN0IGNsb25lIGFycmF5cyAoYW5kIHJlY3Vyc2l2ZSBjbG9uZSBvYmplY3RzIGluc2lkZSlcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0XHRcdHRhcmdldFtrZXldID0gZGVlcENsb25lQXJyYXkodmFsKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHQvLyBjdXN0b20gY2xvbmluZyBhbmQgb3ZlcndyaXRlIGZvciBzcGVjaWZpYyBvYmplY3RzXG5cdFx0XHR9IGVsc2UgaWYgKGlzU3BlY2lmaWNWYWx1ZSh2YWwpKSB7XG5cdFx0XHRcdHRhcmdldFtrZXldID0gY2xvbmVTcGVjaWZpY1ZhbHVlKHZhbCk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0Ly8gb3ZlcndyaXRlIGJ5IG5ldyB2YWx1ZSBpZiBzb3VyY2UgaXNuJ3Qgb2JqZWN0IG9yIGFycmF5XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzcmMgIT09ICdvYmplY3QnIHx8IHNyYyA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHNyYykpIHtcblx0XHRcdFx0dGFyZ2V0W2tleV0gPSBkZWVwRXh0ZW5kKHt9LCB2YWwpO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdC8vIHNvdXJjZSB2YWx1ZSBhbmQgbmV3IHZhbHVlIGlzIG9iamVjdHMgYm90aCwgZXh0ZW5kaW5nLi4uXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0YXJnZXRba2V5XSA9IGRlZXBFeHRlbmQoc3JjLCB2YWwpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xuXG5cdHJldHVybiB0YXJnZXQ7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYXJndW1lbnRzW2ldICE9PSB1bmRlZmluZWQpIHJldHVybiBhcmd1bWVudHNbaV07XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy51dGlscyA9IHJlcXVpcmUoJy4vZGVzL3V0aWxzJyk7XG5leHBvcnRzLkNpcGhlciA9IHJlcXVpcmUoJy4vZGVzL2NpcGhlcicpO1xuZXhwb3J0cy5ERVMgPSByZXF1aXJlKCcuL2Rlcy9kZXMnKTtcbmV4cG9ydHMuQ0JDID0gcmVxdWlyZSgnLi9kZXMvY2JjJyk7XG5leHBvcnRzLkVERSA9IHJlcXVpcmUoJy4vZGVzL2VkZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxudmFyIHByb3RvID0ge307XG5cbmZ1bmN0aW9uIENCQ1N0YXRlKGl2KSB7XG4gIGFzc2VydC5lcXVhbChpdi5sZW5ndGgsIDgsICdJbnZhbGlkIElWIGxlbmd0aCcpO1xuXG4gIHRoaXMuaXYgPSBuZXcgQXJyYXkoOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdi5sZW5ndGg7IGkrKylcbiAgICB0aGlzLml2W2ldID0gaXZbaV07XG59XG5cbmZ1bmN0aW9uIGluc3RhbnRpYXRlKEJhc2UpIHtcbiAgZnVuY3Rpb24gQ0JDKG9wdGlvbnMpIHtcbiAgICBCYXNlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5fY2JjSW5pdCgpO1xuICB9XG4gIGluaGVyaXRzKENCQywgQmFzZSk7XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhwcm90byk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIENCQy5wcm90b3R5cGVba2V5XSA9IHByb3RvW2tleV07XG4gIH1cblxuICBDQkMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IENCQyhvcHRpb25zKTtcbiAgfTtcblxuICByZXR1cm4gQ0JDO1xufVxuXG5leHBvcnRzLmluc3RhbnRpYXRlID0gaW5zdGFudGlhdGU7XG5cbnByb3RvLl9jYmNJbml0ID0gZnVuY3Rpb24gX2NiY0luaXQoKSB7XG4gIHZhciBzdGF0ZSA9IG5ldyBDQkNTdGF0ZSh0aGlzLm9wdGlvbnMuaXYpO1xuICB0aGlzLl9jYmNTdGF0ZSA9IHN0YXRlO1xufTtcblxucHJvdG8uX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUoaW5wLCBpbk9mZiwgb3V0LCBvdXRPZmYpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fY2JjU3RhdGU7XG4gIHZhciBzdXBlclByb3RvID0gdGhpcy5jb25zdHJ1Y3Rvci5zdXBlcl8ucHJvdG90eXBlO1xuXG4gIHZhciBpdiA9IHN0YXRlLml2O1xuICBpZiAodGhpcy50eXBlID09PSAnZW5jcnlwdCcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAgICBpdltpXSBePSBpbnBbaW5PZmYgKyBpXTtcblxuICAgIHN1cGVyUHJvdG8uX3VwZGF0ZS5jYWxsKHRoaXMsIGl2LCAwLCBvdXQsIG91dE9mZik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAgICBpdltpXSA9IG91dFtvdXRPZmYgKyBpXTtcbiAgfSBlbHNlIHtcbiAgICBzdXBlclByb3RvLl91cGRhdGUuY2FsbCh0aGlzLCBpbnAsIGluT2ZmLCBvdXQsIG91dE9mZik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAgICBvdXRbb3V0T2ZmICsgaV0gXj0gaXZbaV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAgICBpdltpXSA9IGlucFtpbk9mZiArIGldO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBDaXBoZXIob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlO1xuICB0aGlzLmJsb2NrU2l6ZSA9IDg7XG4gIHRoaXMuX2luaXQoKTtcblxuICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheSh0aGlzLmJsb2NrU2l6ZSk7XG4gIHRoaXMuYnVmZmVyT2ZmID0gMDtcbn1cbm1vZHVsZS5leHBvcnRzID0gQ2lwaGVyO1xuXG5DaXBoZXIucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gX2luaXQoKSB7XG4gIC8vIE1pZ2h0IGJlIG92ZXJyaWRlZFxufTtcblxuQ2lwaGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoZGF0YSkge1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0aGlzLnR5cGUgPT09ICdkZWNyeXB0JylcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlRGVjcnlwdChkYXRhKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl91cGRhdGVFbmNyeXB0KGRhdGEpO1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fYnVmZmVyID0gZnVuY3Rpb24gX2J1ZmZlcihkYXRhLCBvZmYpIHtcbiAgLy8gQXBwZW5kIGRhdGEgdG8gYnVmZmVyXG4gIHZhciBtaW4gPSBNYXRoLm1pbih0aGlzLmJ1ZmZlci5sZW5ndGggLSB0aGlzLmJ1ZmZlck9mZiwgZGF0YS5sZW5ndGggLSBvZmYpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1pbjsgaSsrKVxuICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyT2ZmICsgaV0gPSBkYXRhW29mZiArIGldO1xuICB0aGlzLmJ1ZmZlck9mZiArPSBtaW47XG5cbiAgLy8gU2hpZnQgbmV4dFxuICByZXR1cm4gbWluO1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fZmx1c2hCdWZmZXIgPSBmdW5jdGlvbiBfZmx1c2hCdWZmZXIob3V0LCBvZmYpIHtcbiAgdGhpcy5fdXBkYXRlKHRoaXMuYnVmZmVyLCAwLCBvdXQsIG9mZik7XG4gIHRoaXMuYnVmZmVyT2ZmID0gMDtcbiAgcmV0dXJuIHRoaXMuYmxvY2tTaXplO1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlRW5jcnlwdCA9IGZ1bmN0aW9uIF91cGRhdGVFbmNyeXB0KGRhdGEpIHtcbiAgdmFyIGlucHV0T2ZmID0gMDtcbiAgdmFyIG91dHB1dE9mZiA9IDA7XG5cbiAgdmFyIGNvdW50ID0gKCh0aGlzLmJ1ZmZlck9mZiArIGRhdGEubGVuZ3RoKSAvIHRoaXMuYmxvY2tTaXplKSB8IDA7XG4gIHZhciBvdXQgPSBuZXcgQXJyYXkoY291bnQgKiB0aGlzLmJsb2NrU2l6ZSk7XG5cbiAgaWYgKHRoaXMuYnVmZmVyT2ZmICE9PSAwKSB7XG4gICAgaW5wdXRPZmYgKz0gdGhpcy5fYnVmZmVyKGRhdGEsIGlucHV0T2ZmKTtcblxuICAgIGlmICh0aGlzLmJ1ZmZlck9mZiA9PT0gdGhpcy5idWZmZXIubGVuZ3RoKVxuICAgICAgb3V0cHV0T2ZmICs9IHRoaXMuX2ZsdXNoQnVmZmVyKG91dCwgb3V0cHV0T2ZmKTtcbiAgfVxuXG4gIC8vIFdyaXRlIGJsb2Nrc1xuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGggLSAoKGRhdGEubGVuZ3RoIC0gaW5wdXRPZmYpICUgdGhpcy5ibG9ja1NpemUpO1xuICBmb3IgKDsgaW5wdXRPZmYgPCBtYXg7IGlucHV0T2ZmICs9IHRoaXMuYmxvY2tTaXplKSB7XG4gICAgdGhpcy5fdXBkYXRlKGRhdGEsIGlucHV0T2ZmLCBvdXQsIG91dHB1dE9mZik7XG4gICAgb3V0cHV0T2ZmICs9IHRoaXMuYmxvY2tTaXplO1xuICB9XG5cbiAgLy8gUXVldWUgcmVzdFxuICBmb3IgKDsgaW5wdXRPZmYgPCBkYXRhLmxlbmd0aDsgaW5wdXRPZmYrKywgdGhpcy5idWZmZXJPZmYrKylcbiAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZl0gPSBkYXRhW2lucHV0T2ZmXTtcblxuICByZXR1cm4gb3V0O1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlRGVjcnlwdCA9IGZ1bmN0aW9uIF91cGRhdGVEZWNyeXB0KGRhdGEpIHtcbiAgdmFyIGlucHV0T2ZmID0gMDtcbiAgdmFyIG91dHB1dE9mZiA9IDA7XG5cbiAgdmFyIGNvdW50ID0gTWF0aC5jZWlsKCh0aGlzLmJ1ZmZlck9mZiArIGRhdGEubGVuZ3RoKSAvIHRoaXMuYmxvY2tTaXplKSAtIDE7XG4gIHZhciBvdXQgPSBuZXcgQXJyYXkoY291bnQgKiB0aGlzLmJsb2NrU2l6ZSk7XG5cbiAgLy8gVE9ETyhpbmR1dG55KTogb3B0aW1pemUgaXQsIHRoaXMgaXMgZmFyIGZyb20gb3B0aW1hbFxuICBmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tKSB7XG4gICAgaW5wdXRPZmYgKz0gdGhpcy5fYnVmZmVyKGRhdGEsIGlucHV0T2ZmKTtcbiAgICBvdXRwdXRPZmYgKz0gdGhpcy5fZmx1c2hCdWZmZXIob3V0LCBvdXRwdXRPZmYpO1xuICB9XG5cbiAgLy8gQnVmZmVyIHJlc3Qgb2YgdGhlIGlucHV0XG4gIGlucHV0T2ZmICs9IHRoaXMuX2J1ZmZlcihkYXRhLCBpbnB1dE9mZik7XG5cbiAgcmV0dXJuIG91dDtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuZmluYWwgPSBmdW5jdGlvbiBmaW5hbChidWZmZXIpIHtcbiAgdmFyIGZpcnN0O1xuICBpZiAoYnVmZmVyKVxuICAgIGZpcnN0ID0gdGhpcy51cGRhdGUoYnVmZmVyKTtcblxuICB2YXIgbGFzdDtcbiAgaWYgKHRoaXMudHlwZSA9PT0gJ2VuY3J5cHQnKVxuICAgIGxhc3QgPSB0aGlzLl9maW5hbEVuY3J5cHQoKTtcbiAgZWxzZVxuICAgIGxhc3QgPSB0aGlzLl9maW5hbERlY3J5cHQoKTtcblxuICBpZiAoZmlyc3QpXG4gICAgcmV0dXJuIGZpcnN0LmNvbmNhdChsYXN0KTtcbiAgZWxzZVxuICAgIHJldHVybiBsYXN0O1xufTtcblxuQ2lwaGVyLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24gX3BhZChidWZmZXIsIG9mZikge1xuICBpZiAob2ZmID09PSAwKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB3aGlsZSAob2ZmIDwgYnVmZmVyLmxlbmd0aClcbiAgICBidWZmZXJbb2ZmKytdID0gMDtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuX2ZpbmFsRW5jcnlwdCA9IGZ1bmN0aW9uIF9maW5hbEVuY3J5cHQoKSB7XG4gIGlmICghdGhpcy5fcGFkKHRoaXMuYnVmZmVyLCB0aGlzLmJ1ZmZlck9mZikpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBvdXQgPSBuZXcgQXJyYXkodGhpcy5ibG9ja1NpemUpO1xuICB0aGlzLl91cGRhdGUodGhpcy5idWZmZXIsIDAsIG91dCwgMCk7XG4gIHJldHVybiBvdXQ7XG59O1xuXG5DaXBoZXIucHJvdG90eXBlLl91bnBhZCA9IGZ1bmN0aW9uIF91bnBhZChidWZmZXIpIHtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn07XG5cbkNpcGhlci5wcm90b3R5cGUuX2ZpbmFsRGVjcnlwdCA9IGZ1bmN0aW9uIF9maW5hbERlY3J5cHQoKSB7XG4gIGFzc2VydC5lcXVhbCh0aGlzLmJ1ZmZlck9mZiwgdGhpcy5ibG9ja1NpemUsICdOb3QgZW5vdWdoIGRhdGEgdG8gZGVjcnlwdCcpO1xuICB2YXIgb3V0ID0gbmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKTtcbiAgdGhpcy5fZmx1c2hCdWZmZXIob3V0LCAwKTtcblxuICByZXR1cm4gdGhpcy5fdW5wYWQob3V0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG52YXIgZGVzID0gcmVxdWlyZSgnLi4vZGVzJyk7XG52YXIgdXRpbHMgPSBkZXMudXRpbHM7XG52YXIgQ2lwaGVyID0gZGVzLkNpcGhlcjtcblxuZnVuY3Rpb24gREVTU3RhdGUoKSB7XG4gIHRoaXMudG1wID0gbmV3IEFycmF5KDIpO1xuICB0aGlzLmtleXMgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBERVMob3B0aW9ucykge1xuICBDaXBoZXIuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB2YXIgc3RhdGUgPSBuZXcgREVTU3RhdGUoKTtcbiAgdGhpcy5fZGVzU3RhdGUgPSBzdGF0ZTtcblxuICB0aGlzLmRlcml2ZUtleXMoc3RhdGUsIG9wdGlvbnMua2V5KTtcbn1cbmluaGVyaXRzKERFUywgQ2lwaGVyKTtcbm1vZHVsZS5leHBvcnRzID0gREVTO1xuXG5ERVMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBERVMob3B0aW9ucyk7XG59O1xuXG52YXIgc2hpZnRUYWJsZSA9IFtcbiAgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMixcbiAgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMVxuXTtcblxuREVTLnByb3RvdHlwZS5kZXJpdmVLZXlzID0gZnVuY3Rpb24gZGVyaXZlS2V5cyhzdGF0ZSwga2V5KSB7XG4gIHN0YXRlLmtleXMgPSBuZXcgQXJyYXkoMTYgKiAyKTtcblxuICBhc3NlcnQuZXF1YWwoa2V5Lmxlbmd0aCwgdGhpcy5ibG9ja1NpemUsICdJbnZhbGlkIGtleSBsZW5ndGgnKTtcblxuICB2YXIga0wgPSB1dGlscy5yZWFkVUludDMyQkUoa2V5LCAwKTtcbiAgdmFyIGtSID0gdXRpbHMucmVhZFVJbnQzMkJFKGtleSwgNCk7XG5cbiAgdXRpbHMucGMxKGtMLCBrUiwgc3RhdGUudG1wLCAwKTtcbiAga0wgPSBzdGF0ZS50bXBbMF07XG4gIGtSID0gc3RhdGUudG1wWzFdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLmtleXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgc2hpZnQgPSBzaGlmdFRhYmxlW2kgPj4+IDFdO1xuICAgIGtMID0gdXRpbHMucjI4c2hsKGtMLCBzaGlmdCk7XG4gICAga1IgPSB1dGlscy5yMjhzaGwoa1IsIHNoaWZ0KTtcbiAgICB1dGlscy5wYzIoa0wsIGtSLCBzdGF0ZS5rZXlzLCBpKTtcbiAgfVxufTtcblxuREVTLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShpbnAsIGluT2ZmLCBvdXQsIG91dE9mZikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9kZXNTdGF0ZTtcblxuICB2YXIgbCA9IHV0aWxzLnJlYWRVSW50MzJCRShpbnAsIGluT2ZmKTtcbiAgdmFyIHIgPSB1dGlscy5yZWFkVUludDMyQkUoaW5wLCBpbk9mZiArIDQpO1xuXG4gIC8vIEluaXRpYWwgUGVybXV0YXRpb25cbiAgdXRpbHMuaXAobCwgciwgc3RhdGUudG1wLCAwKTtcbiAgbCA9IHN0YXRlLnRtcFswXTtcbiAgciA9IHN0YXRlLnRtcFsxXTtcblxuICBpZiAodGhpcy50eXBlID09PSAnZW5jcnlwdCcpXG4gICAgdGhpcy5fZW5jcnlwdChzdGF0ZSwgbCwgciwgc3RhdGUudG1wLCAwKTtcbiAgZWxzZVxuICAgIHRoaXMuX2RlY3J5cHQoc3RhdGUsIGwsIHIsIHN0YXRlLnRtcCwgMCk7XG5cbiAgbCA9IHN0YXRlLnRtcFswXTtcbiAgciA9IHN0YXRlLnRtcFsxXTtcblxuICB1dGlscy53cml0ZVVJbnQzMkJFKG91dCwgbCwgb3V0T2ZmKTtcbiAgdXRpbHMud3JpdGVVSW50MzJCRShvdXQsIHIsIG91dE9mZiArIDQpO1xufTtcblxuREVTLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24gX3BhZChidWZmZXIsIG9mZikge1xuICB2YXIgdmFsdWUgPSBidWZmZXIubGVuZ3RoIC0gb2ZmO1xuICBmb3IgKHZhciBpID0gb2ZmOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKVxuICAgIGJ1ZmZlcltpXSA9IHZhbHVlO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuREVTLnByb3RvdHlwZS5fdW5wYWQgPSBmdW5jdGlvbiBfdW5wYWQoYnVmZmVyKSB7XG4gIHZhciBwYWQgPSBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIDFdO1xuICBmb3IgKHZhciBpID0gYnVmZmVyLmxlbmd0aCAtIHBhZDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKylcbiAgICBhc3NlcnQuZXF1YWwoYnVmZmVyW2ldLCBwYWQpO1xuXG4gIHJldHVybiBidWZmZXIuc2xpY2UoMCwgYnVmZmVyLmxlbmd0aCAtIHBhZCk7XG59O1xuXG5ERVMucHJvdG90eXBlLl9lbmNyeXB0ID0gZnVuY3Rpb24gX2VuY3J5cHQoc3RhdGUsIGxTdGFydCwgclN0YXJ0LCBvdXQsIG9mZikge1xuICB2YXIgbCA9IGxTdGFydDtcbiAgdmFyIHIgPSByU3RhcnQ7XG5cbiAgLy8gQXBwbHkgZigpIHgxNiB0aW1lc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLmtleXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIga2V5TCA9IHN0YXRlLmtleXNbaV07XG4gICAgdmFyIGtleVIgPSBzdGF0ZS5rZXlzW2kgKyAxXTtcblxuICAgIC8vIGYociwgaylcbiAgICB1dGlscy5leHBhbmQociwgc3RhdGUudG1wLCAwKTtcblxuICAgIGtleUwgXj0gc3RhdGUudG1wWzBdO1xuICAgIGtleVIgXj0gc3RhdGUudG1wWzFdO1xuICAgIHZhciBzID0gdXRpbHMuc3Vic3RpdHV0ZShrZXlMLCBrZXlSKTtcbiAgICB2YXIgZiA9IHV0aWxzLnBlcm11dGUocyk7XG5cbiAgICB2YXIgdCA9IHI7XG4gICAgciA9IChsIF4gZikgPj4+IDA7XG4gICAgbCA9IHQ7XG4gIH1cblxuICAvLyBSZXZlcnNlIEluaXRpYWwgUGVybXV0YXRpb25cbiAgdXRpbHMucmlwKHIsIGwsIG91dCwgb2ZmKTtcbn07XG5cbkRFUy5wcm90b3R5cGUuX2RlY3J5cHQgPSBmdW5jdGlvbiBfZGVjcnlwdChzdGF0ZSwgbFN0YXJ0LCByU3RhcnQsIG91dCwgb2ZmKSB7XG4gIHZhciBsID0gclN0YXJ0O1xuICB2YXIgciA9IGxTdGFydDtcblxuICAvLyBBcHBseSBmKCkgeDE2IHRpbWVzXG4gIGZvciAodmFyIGkgPSBzdGF0ZS5rZXlzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgdmFyIGtleUwgPSBzdGF0ZS5rZXlzW2ldO1xuICAgIHZhciBrZXlSID0gc3RhdGUua2V5c1tpICsgMV07XG5cbiAgICAvLyBmKHIsIGspXG4gICAgdXRpbHMuZXhwYW5kKGwsIHN0YXRlLnRtcCwgMCk7XG5cbiAgICBrZXlMIF49IHN0YXRlLnRtcFswXTtcbiAgICBrZXlSIF49IHN0YXRlLnRtcFsxXTtcbiAgICB2YXIgcyA9IHV0aWxzLnN1YnN0aXR1dGUoa2V5TCwga2V5Uik7XG4gICAgdmFyIGYgPSB1dGlscy5wZXJtdXRlKHMpO1xuXG4gICAgdmFyIHQgPSBsO1xuICAgIGwgPSAociBeIGYpID4+PiAwO1xuICAgIHIgPSB0O1xuICB9XG5cbiAgLy8gUmV2ZXJzZSBJbml0aWFsIFBlcm11dGF0aW9uXG4gIHV0aWxzLnJpcChsLCByLCBvdXQsIG9mZik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxudmFyIGRlcyA9IHJlcXVpcmUoJy4uL2RlcycpO1xudmFyIENpcGhlciA9IGRlcy5DaXBoZXI7XG52YXIgREVTID0gZGVzLkRFUztcblxuZnVuY3Rpb24gRURFU3RhdGUodHlwZSwga2V5KSB7XG4gIGFzc2VydC5lcXVhbChrZXkubGVuZ3RoLCAyNCwgJ0ludmFsaWQga2V5IGxlbmd0aCcpO1xuXG4gIHZhciBrMSA9IGtleS5zbGljZSgwLCA4KTtcbiAgdmFyIGsyID0ga2V5LnNsaWNlKDgsIDE2KTtcbiAgdmFyIGszID0ga2V5LnNsaWNlKDE2LCAyNCk7XG5cbiAgaWYgKHR5cGUgPT09ICdlbmNyeXB0Jykge1xuICAgIHRoaXMuY2lwaGVycyA9IFtcbiAgICAgIERFUy5jcmVhdGUoeyB0eXBlOiAnZW5jcnlwdCcsIGtleTogazEgfSksXG4gICAgICBERVMuY3JlYXRlKHsgdHlwZTogJ2RlY3J5cHQnLCBrZXk6IGsyIH0pLFxuICAgICAgREVTLmNyZWF0ZSh7IHR5cGU6ICdlbmNyeXB0Jywga2V5OiBrMyB9KVxuICAgIF07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5jaXBoZXJzID0gW1xuICAgICAgREVTLmNyZWF0ZSh7IHR5cGU6ICdkZWNyeXB0Jywga2V5OiBrMyB9KSxcbiAgICAgIERFUy5jcmVhdGUoeyB0eXBlOiAnZW5jcnlwdCcsIGtleTogazIgfSksXG4gICAgICBERVMuY3JlYXRlKHsgdHlwZTogJ2RlY3J5cHQnLCBrZXk6IGsxIH0pXG4gICAgXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBFREUob3B0aW9ucykge1xuICBDaXBoZXIuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB2YXIgc3RhdGUgPSBuZXcgRURFU3RhdGUodGhpcy50eXBlLCB0aGlzLm9wdGlvbnMua2V5KTtcbiAgdGhpcy5fZWRlU3RhdGUgPSBzdGF0ZTtcbn1cbmluaGVyaXRzKEVERSwgQ2lwaGVyKTtcblxubW9kdWxlLmV4cG9ydHMgPSBFREU7XG5cbkVERS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEVERShvcHRpb25zKTtcbn07XG5cbkVERS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUoaW5wLCBpbk9mZiwgb3V0LCBvdXRPZmYpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fZWRlU3RhdGU7XG5cbiAgc3RhdGUuY2lwaGVyc1swXS5fdXBkYXRlKGlucCwgaW5PZmYsIG91dCwgb3V0T2ZmKTtcbiAgc3RhdGUuY2lwaGVyc1sxXS5fdXBkYXRlKG91dCwgb3V0T2ZmLCBvdXQsIG91dE9mZik7XG4gIHN0YXRlLmNpcGhlcnNbMl0uX3VwZGF0ZShvdXQsIG91dE9mZiwgb3V0LCBvdXRPZmYpO1xufTtcblxuRURFLnByb3RvdHlwZS5fcGFkID0gREVTLnByb3RvdHlwZS5fcGFkO1xuRURFLnByb3RvdHlwZS5fdW5wYWQgPSBERVMucHJvdG90eXBlLl91bnBhZDtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUoYnl0ZXMsIG9mZikge1xuICB2YXIgcmVzID0gIChieXRlc1swICsgb2ZmXSA8PCAyNCkgfFxuICAgICAgICAgICAgIChieXRlc1sxICsgb2ZmXSA8PCAxNikgfFxuICAgICAgICAgICAgIChieXRlc1syICsgb2ZmXSA8PCA4KSB8XG4gICAgICAgICAgICAgYnl0ZXNbMyArIG9mZl07XG4gIHJldHVybiByZXMgPj4+IDA7XG59O1xuXG5leHBvcnRzLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFKGJ5dGVzLCB2YWx1ZSwgb2ZmKSB7XG4gIGJ5dGVzWzAgKyBvZmZdID0gdmFsdWUgPj4+IDI0O1xuICBieXRlc1sxICsgb2ZmXSA9ICh2YWx1ZSA+Pj4gMTYpICYgMHhmZjtcbiAgYnl0ZXNbMiArIG9mZl0gPSAodmFsdWUgPj4+IDgpICYgMHhmZjtcbiAgYnl0ZXNbMyArIG9mZl0gPSB2YWx1ZSAmIDB4ZmY7XG59O1xuXG5leHBvcnRzLmlwID0gZnVuY3Rpb24gaXAoaW5MLCBpblIsIG91dCwgb2ZmKSB7XG4gIHZhciBvdXRMID0gMDtcbiAgdmFyIG91dFIgPSAwO1xuXG4gIGZvciAodmFyIGkgPSA2OyBpID49IDA7IGkgLT0gMikge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IDI0OyBqICs9IDgpIHtcbiAgICAgIG91dEwgPDw9IDE7XG4gICAgICBvdXRMIHw9IChpblIgPj4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPD0gMjQ7IGogKz0gOCkge1xuICAgICAgb3V0TCA8PD0gMTtcbiAgICAgIG91dEwgfD0gKGluTCA+Pj4gKGogKyBpKSkgJiAxO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSA2OyBpID49IDA7IGkgLT0gMikge1xuICAgIGZvciAodmFyIGogPSAxOyBqIDw9IDI1OyBqICs9IDgpIHtcbiAgICAgIG91dFIgPDw9IDE7XG4gICAgICBvdXRSIHw9IChpblIgPj4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDE7IGogPD0gMjU7IGogKz0gOCkge1xuICAgICAgb3V0UiA8PD0gMTtcbiAgICAgIG91dFIgfD0gKGluTCA+Pj4gKGogKyBpKSkgJiAxO1xuICAgIH1cbiAgfVxuXG4gIG91dFtvZmYgKyAwXSA9IG91dEwgPj4+IDA7XG4gIG91dFtvZmYgKyAxXSA9IG91dFIgPj4+IDA7XG59O1xuXG5leHBvcnRzLnJpcCA9IGZ1bmN0aW9uIHJpcChpbkwsIGluUiwgb3V0LCBvZmYpIHtcbiAgdmFyIG91dEwgPSAwO1xuICB2YXIgb3V0UiA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMjQ7IGogPj0gMDsgaiAtPSA4KSB7XG4gICAgICBvdXRMIDw8PSAxO1xuICAgICAgb3V0TCB8PSAoaW5SID4+PiAoaiArIGkpKSAmIDE7XG4gICAgICBvdXRMIDw8PSAxO1xuICAgICAgb3V0TCB8PSAoaW5MID4+PiAoaiArIGkpKSAmIDE7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGkgPSA0OyBpIDwgODsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDI0OyBqID49IDA7IGogLT0gOCkge1xuICAgICAgb3V0UiA8PD0gMTtcbiAgICAgIG91dFIgfD0gKGluUiA+Pj4gKGogKyBpKSkgJiAxO1xuICAgICAgb3V0UiA8PD0gMTtcbiAgICAgIG91dFIgfD0gKGluTCA+Pj4gKGogKyBpKSkgJiAxO1xuICAgIH1cbiAgfVxuXG4gIG91dFtvZmYgKyAwXSA9IG91dEwgPj4+IDA7XG4gIG91dFtvZmYgKyAxXSA9IG91dFIgPj4+IDA7XG59O1xuXG5leHBvcnRzLnBjMSA9IGZ1bmN0aW9uIHBjMShpbkwsIGluUiwgb3V0LCBvZmYpIHtcbiAgdmFyIG91dEwgPSAwO1xuICB2YXIgb3V0UiA9IDA7XG5cbiAgLy8gNywgMTUsIDIzLCAzMSwgMzksIDQ3LCA1NSwgNjNcbiAgLy8gNiwgMTQsIDIyLCAzMCwgMzksIDQ3LCA1NSwgNjNcbiAgLy8gNSwgMTMsIDIxLCAyOSwgMzksIDQ3LCA1NSwgNjNcbiAgLy8gNCwgMTIsIDIwLCAyOFxuICBmb3IgKHZhciBpID0gNzsgaSA+PSA1OyBpLS0pIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSAyNDsgaiArPSA4KSB7XG4gICAgICBvdXRMIDw8PSAxO1xuICAgICAgb3V0TCB8PSAoaW5SID4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPD0gMjQ7IGogKz0gOCkge1xuICAgICAgb3V0TCA8PD0gMTtcbiAgICAgIG91dEwgfD0gKGluTCA+PiAoaiArIGkpKSAmIDE7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGogPSAwOyBqIDw9IDI0OyBqICs9IDgpIHtcbiAgICBvdXRMIDw8PSAxO1xuICAgIG91dEwgfD0gKGluUiA+PiAoaiArIGkpKSAmIDE7XG4gIH1cblxuICAvLyAxLCA5LCAxNywgMjUsIDMzLCA0MSwgNDksIDU3XG4gIC8vIDIsIDEwLCAxOCwgMjYsIDM0LCA0MiwgNTAsIDU4XG4gIC8vIDMsIDExLCAxOSwgMjcsIDM1LCA0MywgNTEsIDU5XG4gIC8vIDM2LCA0NCwgNTIsIDYwXG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDM7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IDI0OyBqICs9IDgpIHtcbiAgICAgIG91dFIgPDw9IDE7XG4gICAgICBvdXRSIHw9IChpblIgPj4gKGogKyBpKSkgJiAxO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSAyNDsgaiArPSA4KSB7XG4gICAgICBvdXRSIDw8PSAxO1xuICAgICAgb3V0UiB8PSAoaW5MID4+IChqICsgaSkpICYgMTtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgaiA9IDA7IGogPD0gMjQ7IGogKz0gOCkge1xuICAgIG91dFIgPDw9IDE7XG4gICAgb3V0UiB8PSAoaW5MID4+IChqICsgaSkpICYgMTtcbiAgfVxuXG4gIG91dFtvZmYgKyAwXSA9IG91dEwgPj4+IDA7XG4gIG91dFtvZmYgKyAxXSA9IG91dFIgPj4+IDA7XG59O1xuXG5leHBvcnRzLnIyOHNobCA9IGZ1bmN0aW9uIHIyOHNobChudW0sIHNoaWZ0KSB7XG4gIHJldHVybiAoKG51bSA8PCBzaGlmdCkgJiAweGZmZmZmZmYpIHwgKG51bSA+Pj4gKDI4IC0gc2hpZnQpKTtcbn07XG5cbnZhciBwYzJ0YWJsZSA9IFtcbiAgLy8gaW5MID0+IG91dExcbiAgMTQsIDExLCAxNywgNCwgMjcsIDIzLCAyNSwgMCxcbiAgMTMsIDIyLCA3LCAxOCwgNSwgOSwgMTYsIDI0LFxuICAyLCAyMCwgMTIsIDIxLCAxLCA4LCAxNSwgMjYsXG5cbiAgLy8gaW5SID0+IG91dFJcbiAgMTUsIDQsIDI1LCAxOSwgOSwgMSwgMjYsIDE2LFxuICA1LCAxMSwgMjMsIDgsIDEyLCA3LCAxNywgMCxcbiAgMjIsIDMsIDEwLCAxNCwgNiwgMjAsIDI3LCAyNFxuXTtcblxuZXhwb3J0cy5wYzIgPSBmdW5jdGlvbiBwYzIoaW5MLCBpblIsIG91dCwgb2ZmKSB7XG4gIHZhciBvdXRMID0gMDtcbiAgdmFyIG91dFIgPSAwO1xuXG4gIHZhciBsZW4gPSBwYzJ0YWJsZS5sZW5ndGggPj4+IDE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBvdXRMIDw8PSAxO1xuICAgIG91dEwgfD0gKGluTCA+Pj4gcGMydGFibGVbaV0pICYgMHgxO1xuICB9XG4gIGZvciAodmFyIGkgPSBsZW47IGkgPCBwYzJ0YWJsZS5sZW5ndGg7IGkrKykge1xuICAgIG91dFIgPDw9IDE7XG4gICAgb3V0UiB8PSAoaW5SID4+PiBwYzJ0YWJsZVtpXSkgJiAweDE7XG4gIH1cblxuICBvdXRbb2ZmICsgMF0gPSBvdXRMID4+PiAwO1xuICBvdXRbb2ZmICsgMV0gPSBvdXRSID4+PiAwO1xufTtcblxuZXhwb3J0cy5leHBhbmQgPSBmdW5jdGlvbiBleHBhbmQociwgb3V0LCBvZmYpIHtcbiAgdmFyIG91dEwgPSAwO1xuICB2YXIgb3V0UiA9IDA7XG5cbiAgb3V0TCA9ICgociAmIDEpIDw8IDUpIHwgKHIgPj4+IDI3KTtcbiAgZm9yICh2YXIgaSA9IDIzOyBpID49IDE1OyBpIC09IDQpIHtcbiAgICBvdXRMIDw8PSA2O1xuICAgIG91dEwgfD0gKHIgPj4+IGkpICYgMHgzZjtcbiAgfVxuICBmb3IgKHZhciBpID0gMTE7IGkgPj0gMzsgaSAtPSA0KSB7XG4gICAgb3V0UiB8PSAociA+Pj4gaSkgJiAweDNmO1xuICAgIG91dFIgPDw9IDY7XG4gIH1cbiAgb3V0UiB8PSAoKHIgJiAweDFmKSA8PCAxKSB8IChyID4+PiAzMSk7XG5cbiAgb3V0W29mZiArIDBdID0gb3V0TCA+Pj4gMDtcbiAgb3V0W29mZiArIDFdID0gb3V0UiA+Pj4gMDtcbn07XG5cbnZhciBzVGFibGUgPSBbXG4gIDE0LCAwLCA0LCAxNSwgMTMsIDcsIDEsIDQsIDIsIDE0LCAxNSwgMiwgMTEsIDEzLCA4LCAxLFxuICAzLCAxMCwgMTAsIDYsIDYsIDEyLCAxMiwgMTEsIDUsIDksIDksIDUsIDAsIDMsIDcsIDgsXG4gIDQsIDE1LCAxLCAxMiwgMTQsIDgsIDgsIDIsIDEzLCA0LCA2LCA5LCAyLCAxLCAxMSwgNyxcbiAgMTUsIDUsIDEyLCAxMSwgOSwgMywgNywgMTQsIDMsIDEwLCAxMCwgMCwgNSwgNiwgMCwgMTMsXG5cbiAgMTUsIDMsIDEsIDEzLCA4LCA0LCAxNCwgNywgNiwgMTUsIDExLCAyLCAzLCA4LCA0LCAxNCxcbiAgOSwgMTIsIDcsIDAsIDIsIDEsIDEzLCAxMCwgMTIsIDYsIDAsIDksIDUsIDExLCAxMCwgNSxcbiAgMCwgMTMsIDE0LCA4LCA3LCAxMCwgMTEsIDEsIDEwLCAzLCA0LCAxNSwgMTMsIDQsIDEsIDIsXG4gIDUsIDExLCA4LCA2LCAxMiwgNywgNiwgMTIsIDksIDAsIDMsIDUsIDIsIDE0LCAxNSwgOSxcblxuICAxMCwgMTMsIDAsIDcsIDksIDAsIDE0LCA5LCA2LCAzLCAzLCA0LCAxNSwgNiwgNSwgMTAsXG4gIDEsIDIsIDEzLCA4LCAxMiwgNSwgNywgMTQsIDExLCAxMiwgNCwgMTEsIDIsIDE1LCA4LCAxLFxuICAxMywgMSwgNiwgMTAsIDQsIDEzLCA5LCAwLCA4LCA2LCAxNSwgOSwgMywgOCwgMCwgNyxcbiAgMTEsIDQsIDEsIDE1LCAyLCAxNCwgMTIsIDMsIDUsIDExLCAxMCwgNSwgMTQsIDIsIDcsIDEyLFxuXG4gIDcsIDEzLCAxMywgOCwgMTQsIDExLCAzLCA1LCAwLCA2LCA2LCAxNSwgOSwgMCwgMTAsIDMsXG4gIDEsIDQsIDIsIDcsIDgsIDIsIDUsIDEyLCAxMSwgMSwgMTIsIDEwLCA0LCAxNCwgMTUsIDksXG4gIDEwLCAzLCA2LCAxNSwgOSwgMCwgMCwgNiwgMTIsIDEwLCAxMSwgMSwgNywgMTMsIDEzLCA4LFxuICAxNSwgOSwgMSwgNCwgMywgNSwgMTQsIDExLCA1LCAxMiwgMiwgNywgOCwgMiwgNCwgMTQsXG5cbiAgMiwgMTQsIDEyLCAxMSwgNCwgMiwgMSwgMTIsIDcsIDQsIDEwLCA3LCAxMSwgMTMsIDYsIDEsXG4gIDgsIDUsIDUsIDAsIDMsIDE1LCAxNSwgMTAsIDEzLCAzLCAwLCA5LCAxNCwgOCwgOSwgNixcbiAgNCwgMTEsIDIsIDgsIDEsIDEyLCAxMSwgNywgMTAsIDEsIDEzLCAxNCwgNywgMiwgOCwgMTMsXG4gIDE1LCA2LCA5LCAxNSwgMTIsIDAsIDUsIDksIDYsIDEwLCAzLCA0LCAwLCA1LCAxNCwgMyxcblxuICAxMiwgMTAsIDEsIDE1LCAxMCwgNCwgMTUsIDIsIDksIDcsIDIsIDEyLCA2LCA5LCA4LCA1LFxuICAwLCA2LCAxMywgMSwgMywgMTMsIDQsIDE0LCAxNCwgMCwgNywgMTEsIDUsIDMsIDExLCA4LFxuICA5LCA0LCAxNCwgMywgMTUsIDIsIDUsIDEyLCAyLCA5LCA4LCA1LCAxMiwgMTUsIDMsIDEwLFxuICA3LCAxMSwgMCwgMTQsIDQsIDEsIDEwLCA3LCAxLCA2LCAxMywgMCwgMTEsIDgsIDYsIDEzLFxuXG4gIDQsIDEzLCAxMSwgMCwgMiwgMTEsIDE0LCA3LCAxNSwgNCwgMCwgOSwgOCwgMSwgMTMsIDEwLFxuICAzLCAxNCwgMTIsIDMsIDksIDUsIDcsIDEyLCA1LCAyLCAxMCwgMTUsIDYsIDgsIDEsIDYsXG4gIDEsIDYsIDQsIDExLCAxMSwgMTMsIDEzLCA4LCAxMiwgMSwgMywgNCwgNywgMTAsIDE0LCA3LFxuICAxMCwgOSwgMTUsIDUsIDYsIDAsIDgsIDE1LCAwLCAxNCwgNSwgMiwgOSwgMywgMiwgMTIsXG5cbiAgMTMsIDEsIDIsIDE1LCA4LCAxMywgNCwgOCwgNiwgMTAsIDE1LCAzLCAxMSwgNywgMSwgNCxcbiAgMTAsIDEyLCA5LCA1LCAzLCA2LCAxNCwgMTEsIDUsIDAsIDAsIDE0LCAxMiwgOSwgNywgMixcbiAgNywgMiwgMTEsIDEsIDQsIDE0LCAxLCA3LCA5LCA0LCAxMiwgMTAsIDE0LCA4LCAyLCAxMyxcbiAgMCwgMTUsIDYsIDEyLCAxMCwgOSwgMTMsIDAsIDE1LCAzLCAzLCA1LCA1LCA2LCA4LCAxMVxuXTtcblxuZXhwb3J0cy5zdWJzdGl0dXRlID0gZnVuY3Rpb24gc3Vic3RpdHV0ZShpbkwsIGluUikge1xuICB2YXIgb3V0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgYiA9IChpbkwgPj4+ICgxOCAtIGkgKiA2KSkgJiAweDNmO1xuICAgIHZhciBzYiA9IHNUYWJsZVtpICogMHg0MCArIGJdO1xuXG4gICAgb3V0IDw8PSA0O1xuICAgIG91dCB8PSBzYjtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIHZhciBiID0gKGluUiA+Pj4gKDE4IC0gaSAqIDYpKSAmIDB4M2Y7XG4gICAgdmFyIHNiID0gc1RhYmxlWzQgKiAweDQwICsgaSAqIDB4NDAgKyBiXTtcblxuICAgIG91dCA8PD0gNDtcbiAgICBvdXQgfD0gc2I7XG4gIH1cbiAgcmV0dXJuIG91dCA+Pj4gMDtcbn07XG5cbnZhciBwZXJtdXRlVGFibGUgPSBbXG4gIDE2LCAyNSwgMTIsIDExLCAzLCAyMCwgNCwgMTUsIDMxLCAxNywgOSwgNiwgMjcsIDE0LCAxLCAyMixcbiAgMzAsIDI0LCA4LCAxOCwgMCwgNSwgMjksIDIzLCAxMywgMTksIDIsIDI2LCAxMCwgMjEsIDI4LCA3XG5dO1xuXG5leHBvcnRzLnBlcm11dGUgPSBmdW5jdGlvbiBwZXJtdXRlKG51bSkge1xuICB2YXIgb3V0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwZXJtdXRlVGFibGUubGVuZ3RoOyBpKyspIHtcbiAgICBvdXQgPDw9IDE7XG4gICAgb3V0IHw9IChudW0gPj4+IHBlcm11dGVUYWJsZVtpXSkgJiAweDE7XG4gIH1cbiAgcmV0dXJuIG91dCA+Pj4gMDtcbn07XG5cbmV4cG9ydHMucGFkU3BsaXQgPSBmdW5jdGlvbiBwYWRTcGxpdChudW0sIHNpemUsIGdyb3VwKSB7XG4gIHZhciBzdHIgPSBudW0udG9TdHJpbmcoMik7XG4gIHdoaWxlIChzdHIubGVuZ3RoIDwgc2l6ZSlcbiAgICBzdHIgPSAnMCcgKyBzdHI7XG5cbiAgdmFyIG91dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkgKz0gZ3JvdXApXG4gICAgb3V0LnB1c2goc3RyLnNsaWNlKGksIGkgKyBncm91cCkpO1xuICByZXR1cm4gb3V0LmpvaW4oJyAnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qXG4gKiBEZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKTtcblxuLypcbiAqIENvbnN0YW50cy5cbiAqL1xuXG52YXIgVEFCID0gJ1xcdCc7XG52YXIgTkVXTElORSA9ICdcXG4nO1xudmFyIFNQQUNFID0gJyAnO1xuXG4vKipcbiAqIFJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcywgYmVpbmcgc21hcnQgYWJvdXQgd2hpY2hcbiAqIGNvbHVtbiB0aGUgdGFiIGlzIGF0IGFuZCB3aGljaCBzaXplIHNob3VsZCBiZSB1c2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGRldGFiKCdcXHRmb29cXG5iYXJcXHRiYXonKTsgLy8gJyAgICBmb29cXG5iYXIgYmF6J1xuICogICBkZXRhYignXFx0Zm9vXFxuYmFyXFx0YmF6JywgMik7IC8vICcgIGZvb1xcbmJhciBiYXonXG4gKiAgIGRldGFiKCdcXHRmb29cXG5iYXJcXHRiYXonLCA4KTsgLy8gJyAgICAgICAgZm9vXFxuYmFyICAgICBiYXonXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgd2l0aCB0YWJzLlxuICogQHBhcmFtIHtudW1iZXI/fSBbc2l6ZT00XSAtIFRhYi1zaXplLlxuICogQHJldHVybiB7c3RyaW5nfSAtIFZhbHVlIHdpdGhvdXQgdGFicy5cbiAqL1xuZnVuY3Rpb24gZGV0YWIodmFsdWUsIHNpemUpIHtcbiAgICB2YXIgc3RyaW5nID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB2YXIgbGVuZ3RoID0gc3RyaW5nICYmIHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICB2YXIgY29sdW1uID0gLTE7XG4gICAgdmFyIHRhYlNpemUgPSBzaXplIHx8IDQ7XG4gICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgIHZhciBjaGFyYWN0ZXI7XG4gICAgdmFyIGFkZDtcblxuICAgIGlmICghc3RyaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZGV0YWIgZXhwZWN0ZWQgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBUQUIpIHtcbiAgICAgICAgICAgIGFkZCA9IHRhYlNpemUgLSAoKGNvbHVtbiArIDEpICUgdGFiU2l6ZSk7XG4gICAgICAgICAgICByZXN1bHQgKz0gcmVwZWF0KFNQQUNFLCBhZGQpO1xuICAgICAgICAgICAgY29sdW1uICs9IGFkZDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gTkVXTElORSkge1xuICAgICAgICAgICAgY29sdW1uID0gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2x1bW4rKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCArPSBjaGFyYWN0ZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIEV4cG9zZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRldGFiO1xuIiwidmFyIGdlbmVyYXRlUHJpbWUgPSByZXF1aXJlKCcuL2xpYi9nZW5lcmF0ZVByaW1lJylcbnZhciBwcmltZXMgPSByZXF1aXJlKCcuL2xpYi9wcmltZXMuanNvbicpXG5cbnZhciBESCA9IHJlcXVpcmUoJy4vbGliL2RoJylcblxuZnVuY3Rpb24gZ2V0RGlmZmllSGVsbG1hbiAobW9kKSB7XG4gIHZhciBwcmltZSA9IG5ldyBCdWZmZXIocHJpbWVzW21vZF0ucHJpbWUsICdoZXgnKVxuICB2YXIgZ2VuID0gbmV3IEJ1ZmZlcihwcmltZXNbbW9kXS5nZW4sICdoZXgnKVxuXG4gIHJldHVybiBuZXcgREgocHJpbWUsIGdlbilcbn1cblxudmFyIEVOQ09ESU5HUyA9IHtcbiAgJ2JpbmFyeSc6IHRydWUsICdoZXgnOiB0cnVlLCAnYmFzZTY0JzogdHJ1ZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVEaWZmaWVIZWxsbWFuIChwcmltZSwgZW5jLCBnZW5lcmF0b3IsIGdlbmMpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihlbmMpIHx8IEVOQ09ESU5HU1tlbmNdID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY3JlYXRlRGlmZmllSGVsbG1hbihwcmltZSwgJ2JpbmFyeScsIGVuYywgZ2VuZXJhdG9yKVxuICB9XG5cbiAgZW5jID0gZW5jIHx8ICdiaW5hcnknXG4gIGdlbmMgPSBnZW5jIHx8ICdiaW5hcnknXG4gIGdlbmVyYXRvciA9IGdlbmVyYXRvciB8fCBuZXcgQnVmZmVyKFsyXSlcblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihnZW5lcmF0b3IpKSB7XG4gICAgZ2VuZXJhdG9yID0gbmV3IEJ1ZmZlcihnZW5lcmF0b3IsIGdlbmMpXG4gIH1cblxuICBpZiAodHlwZW9mIHByaW1lID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBuZXcgREgoZ2VuZXJhdGVQcmltZShwcmltZSwgZ2VuZXJhdG9yKSwgZ2VuZXJhdG9yLCB0cnVlKVxuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocHJpbWUpKSB7XG4gICAgcHJpbWUgPSBuZXcgQnVmZmVyKHByaW1lLCBlbmMpXG4gIH1cblxuICByZXR1cm4gbmV3IERIKHByaW1lLCBnZW5lcmF0b3IsIHRydWUpXG59XG5cbmV4cG9ydHMuRGlmZmllSGVsbG1hbkdyb3VwID0gZXhwb3J0cy5jcmVhdGVEaWZmaWVIZWxsbWFuR3JvdXAgPSBleHBvcnRzLmdldERpZmZpZUhlbGxtYW4gPSBnZXREaWZmaWVIZWxsbWFuXG5leHBvcnRzLmNyZWF0ZURpZmZpZUhlbGxtYW4gPSBleHBvcnRzLkRpZmZpZUhlbGxtYW4gPSBjcmVhdGVEaWZmaWVIZWxsbWFuXG4iLCJ2YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIE1pbGxlclJhYmluID0gcmVxdWlyZSgnbWlsbGVyLXJhYmluJyk7XG52YXIgbWlsbGVyUmFiaW4gPSBuZXcgTWlsbGVyUmFiaW4oKTtcbnZhciBUV0VOVFlGT1VSID0gbmV3IEJOKDI0KTtcbnZhciBFTEVWRU4gPSBuZXcgQk4oMTEpO1xudmFyIFRFTiA9IG5ldyBCTigxMCk7XG52YXIgVEhSRUUgPSBuZXcgQk4oMyk7XG52YXIgU0VWRU4gPSBuZXcgQk4oNyk7XG52YXIgcHJpbWVzID0gcmVxdWlyZSgnLi9nZW5lcmF0ZVByaW1lJyk7XG52YXIgcmFuZG9tQnl0ZXMgPSByZXF1aXJlKCdyYW5kb21ieXRlcycpO1xubW9kdWxlLmV4cG9ydHMgPSBESDtcblxuZnVuY3Rpb24gc2V0UHVibGljS2V5KHB1YiwgZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAndXRmOCc7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHB1YikpIHtcbiAgICBwdWIgPSBuZXcgQnVmZmVyKHB1YiwgZW5jKTtcbiAgfVxuICB0aGlzLl9wdWIgPSBuZXcgQk4ocHViKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmZ1bmN0aW9uIHNldFByaXZhdGVLZXkocHJpdiwgZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAndXRmOCc7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHByaXYpKSB7XG4gICAgcHJpdiA9IG5ldyBCdWZmZXIocHJpdiwgZW5jKTtcbiAgfVxuICB0aGlzLl9wcml2ID0gbmV3IEJOKHByaXYpO1xuICByZXR1cm4gdGhpcztcbn1cblxudmFyIHByaW1lQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGNoZWNrUHJpbWUocHJpbWUsIGdlbmVyYXRvcikge1xuICB2YXIgZ2VuID0gZ2VuZXJhdG9yLnRvU3RyaW5nKCdoZXgnKTtcbiAgdmFyIGhleCA9IFtnZW4sIHByaW1lLnRvU3RyaW5nKDE2KV0uam9pbignXycpO1xuICBpZiAoaGV4IGluIHByaW1lQ2FjaGUpIHtcbiAgICByZXR1cm4gcHJpbWVDYWNoZVtoZXhdO1xuICB9XG4gIHZhciBlcnJvciA9IDA7XG5cbiAgaWYgKHByaW1lLmlzRXZlbigpIHx8XG4gICAgIXByaW1lcy5zaW1wbGVTaWV2ZSB8fFxuICAgICFwcmltZXMuZmVybWF0VGVzdChwcmltZSkgfHxcbiAgICAhbWlsbGVyUmFiaW4udGVzdChwcmltZSkpIHtcbiAgICAvL25vdCBhIHByaW1lIHNvICsxXG4gICAgZXJyb3IgKz0gMTtcblxuICAgIGlmIChnZW4gPT09ICcwMicgfHwgZ2VuID09PSAnMDUnKSB7XG4gICAgICAvLyB3ZSdkIGJlIGFibGUgdG8gY2hlY2sgdGhlIGdlbmVyYXRvclxuICAgICAgLy8gaXQgd291bGQgZmFpbCBzbyArOFxuICAgICAgZXJyb3IgKz0gODtcbiAgICB9IGVsc2Uge1xuICAgICAgLy93ZSB3b3VsZG4ndCBiZSBhYmxlIHRvIHRlc3QgdGhlIGdlbmVyYXRvclxuICAgICAgLy8gc28gKzRcbiAgICAgIGVycm9yICs9IDQ7XG4gICAgfVxuICAgIHByaW1lQ2FjaGVbaGV4XSA9IGVycm9yO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuICBpZiAoIW1pbGxlclJhYmluLnRlc3QocHJpbWUuc2hybigxKSkpIHtcbiAgICAvL25vdCBhIHNhZmUgcHJpbWVcbiAgICBlcnJvciArPSAyO1xuICB9XG4gIHZhciByZW07XG4gIHN3aXRjaCAoZ2VuKSB7XG4gICAgY2FzZSAnMDInOlxuICAgICAgaWYgKHByaW1lLm1vZChUV0VOVFlGT1VSKS5jbXAoRUxFVkVOKSkge1xuICAgICAgICAvLyB1bnN1aWRhYmxlIGdlbmVyYXRvclxuICAgICAgICBlcnJvciArPSA4O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnMDUnOlxuICAgICAgcmVtID0gcHJpbWUubW9kKFRFTik7XG4gICAgICBpZiAocmVtLmNtcChUSFJFRSkgJiYgcmVtLmNtcChTRVZFTikpIHtcbiAgICAgICAgLy8gcHJpbWUgbW9kIDEwIG5lZWRzIHRvIGVxdWFsIDMgb3IgN1xuICAgICAgICBlcnJvciArPSA4O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGVycm9yICs9IDQ7XG4gIH1cbiAgcHJpbWVDYWNoZVtoZXhdID0gZXJyb3I7XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gREgocHJpbWUsIGdlbmVyYXRvciwgbWFsbGVhYmxlKSB7XG4gIHRoaXMuc2V0R2VuZXJhdG9yKGdlbmVyYXRvcik7XG4gIHRoaXMuX19wcmltZSA9IG5ldyBCTihwcmltZSk7XG4gIHRoaXMuX3ByaW1lID0gQk4ubW9udCh0aGlzLl9fcHJpbWUpO1xuICB0aGlzLl9wcmltZUxlbiA9IHByaW1lLmxlbmd0aDtcbiAgdGhpcy5fcHViID0gdW5kZWZpbmVkO1xuICB0aGlzLl9wcml2ID0gdW5kZWZpbmVkO1xuICB0aGlzLl9wcmltZUNvZGUgPSB1bmRlZmluZWQ7XG4gIGlmIChtYWxsZWFibGUpIHtcbiAgICB0aGlzLnNldFB1YmxpY0tleSA9IHNldFB1YmxpY0tleTtcbiAgICB0aGlzLnNldFByaXZhdGVLZXkgPSBzZXRQcml2YXRlS2V5O1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX3ByaW1lQ29kZSA9IDg7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShESC5wcm90b3R5cGUsICd2ZXJpZnlFcnJvcicsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9wcmltZUNvZGUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLl9wcmltZUNvZGUgPSBjaGVja1ByaW1lKHRoaXMuX19wcmltZSwgdGhpcy5fX2dlbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcmltZUNvZGU7XG4gIH1cbn0pO1xuREgucHJvdG90eXBlLmdlbmVyYXRlS2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLl9wcml2KSB7XG4gICAgdGhpcy5fcHJpdiA9IG5ldyBCTihyYW5kb21CeXRlcyh0aGlzLl9wcmltZUxlbikpO1xuICB9XG4gIHRoaXMuX3B1YiA9IHRoaXMuX2dlbi50b1JlZCh0aGlzLl9wcmltZSkucmVkUG93KHRoaXMuX3ByaXYpLmZyb21SZWQoKTtcbiAgcmV0dXJuIHRoaXMuZ2V0UHVibGljS2V5KCk7XG59O1xuXG5ESC5wcm90b3R5cGUuY29tcHV0ZVNlY3JldCA9IGZ1bmN0aW9uIChvdGhlcikge1xuICBvdGhlciA9IG5ldyBCTihvdGhlcik7XG4gIG90aGVyID0gb3RoZXIudG9SZWQodGhpcy5fcHJpbWUpO1xuICB2YXIgc2VjcmV0ID0gb3RoZXIucmVkUG93KHRoaXMuX3ByaXYpLmZyb21SZWQoKTtcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIoc2VjcmV0LnRvQXJyYXkoKSk7XG4gIHZhciBwcmltZSA9IHRoaXMuZ2V0UHJpbWUoKTtcbiAgaWYgKG91dC5sZW5ndGggPCBwcmltZS5sZW5ndGgpIHtcbiAgICB2YXIgZnJvbnQgPSBuZXcgQnVmZmVyKHByaW1lLmxlbmd0aCAtIG91dC5sZW5ndGgpO1xuICAgIGZyb250LmZpbGwoMCk7XG4gICAgb3V0ID0gQnVmZmVyLmNvbmNhdChbZnJvbnQsIG91dF0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG5ESC5wcm90b3R5cGUuZ2V0UHVibGljS2V5ID0gZnVuY3Rpb24gZ2V0UHVibGljS2V5KGVuYykge1xuICByZXR1cm4gZm9ybWF0UmV0dXJuVmFsdWUodGhpcy5fcHViLCBlbmMpO1xufTtcblxuREgucHJvdG90eXBlLmdldFByaXZhdGVLZXkgPSBmdW5jdGlvbiBnZXRQcml2YXRlS2V5KGVuYykge1xuICByZXR1cm4gZm9ybWF0UmV0dXJuVmFsdWUodGhpcy5fcHJpdiwgZW5jKTtcbn07XG5cbkRILnByb3RvdHlwZS5nZXRQcmltZSA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgcmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKHRoaXMuX19wcmltZSwgZW5jKTtcbn07XG5cbkRILnByb3RvdHlwZS5nZXRHZW5lcmF0b3IgPSBmdW5jdGlvbiAoZW5jKSB7XG4gIHJldHVybiBmb3JtYXRSZXR1cm5WYWx1ZSh0aGlzLl9nZW4sIGVuYyk7XG59O1xuXG5ESC5wcm90b3R5cGUuc2V0R2VuZXJhdG9yID0gZnVuY3Rpb24gKGdlbiwgZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAndXRmOCc7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGdlbikpIHtcbiAgICBnZW4gPSBuZXcgQnVmZmVyKGdlbiwgZW5jKTtcbiAgfVxuICB0aGlzLl9fZ2VuID0gZ2VuO1xuICB0aGlzLl9nZW4gPSBuZXcgQk4oZ2VuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmb3JtYXRSZXR1cm5WYWx1ZShibiwgZW5jKSB7XG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKGJuLnRvQXJyYXkoKSk7XG4gIGlmICghZW5jKSB7XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVmLnRvU3RyaW5nKGVuYyk7XG4gIH1cbn1cbiIsInZhciByYW5kb21CeXRlcyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRQcmltZTtcbmZpbmRQcmltZS5zaW1wbGVTaWV2ZSA9IHNpbXBsZVNpZXZlO1xuZmluZFByaW1lLmZlcm1hdFRlc3QgPSBmZXJtYXRUZXN0O1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBUV0VOVFlGT1VSID0gbmV3IEJOKDI0KTtcbnZhciBNaWxsZXJSYWJpbiA9IHJlcXVpcmUoJ21pbGxlci1yYWJpbicpO1xudmFyIG1pbGxlclJhYmluID0gbmV3IE1pbGxlclJhYmluKCk7XG52YXIgT05FID0gbmV3IEJOKDEpO1xudmFyIFRXTyA9IG5ldyBCTigyKTtcbnZhciBGSVZFID0gbmV3IEJOKDUpO1xudmFyIFNJWFRFRU4gPSBuZXcgQk4oMTYpO1xudmFyIEVJR0hUID0gbmV3IEJOKDgpO1xudmFyIFRFTiA9IG5ldyBCTigxMCk7XG52YXIgVEhSRUUgPSBuZXcgQk4oMyk7XG52YXIgU0VWRU4gPSBuZXcgQk4oNyk7XG52YXIgRUxFVkVOID0gbmV3IEJOKDExKTtcbnZhciBGT1VSID0gbmV3IEJOKDQpO1xudmFyIFRXRUxWRSA9IG5ldyBCTigxMik7XG52YXIgcHJpbWVzID0gbnVsbDtcblxuZnVuY3Rpb24gX2dldFByaW1lcygpIHtcbiAgaWYgKHByaW1lcyAhPT0gbnVsbClcbiAgICByZXR1cm4gcHJpbWVzO1xuXG4gIHZhciBsaW1pdCA9IDB4MTAwMDAwO1xuICB2YXIgcmVzID0gW107XG4gIHJlc1swXSA9IDI7XG4gIGZvciAodmFyIGkgPSAxLCBrID0gMzsgayA8IGxpbWl0OyBrICs9IDIpIHtcbiAgICB2YXIgc3FydCA9IE1hdGguY2VpbChNYXRoLnNxcnQoaykpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgaSAmJiByZXNbal0gPD0gc3FydDsgaisrKVxuICAgICAgaWYgKGsgJSByZXNbal0gPT09IDApXG4gICAgICAgIGJyZWFrO1xuXG4gICAgaWYgKGkgIT09IGogJiYgcmVzW2pdIDw9IHNxcnQpXG4gICAgICBjb250aW51ZTtcblxuICAgIHJlc1tpKytdID0gaztcbiAgfVxuICBwcmltZXMgPSByZXM7XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVNpZXZlKHApIHtcbiAgdmFyIHByaW1lcyA9IF9nZXRQcmltZXMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByaW1lcy5sZW5ndGg7IGkrKylcbiAgICBpZiAocC5tb2RuKHByaW1lc1tpXSkgPT09IDApIHtcbiAgICAgIGlmIChwLmNtcG4ocHJpbWVzW2ldKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZlcm1hdFRlc3QocCkge1xuICB2YXIgcmVkID0gQk4ubW9udChwKTtcbiAgcmV0dXJuIFRXTy50b1JlZChyZWQpLnJlZFBvdyhwLnN1Ym4oMSkpLmZyb21SZWQoKS5jbXBuKDEpID09PSAwO1xufVxuXG5mdW5jdGlvbiBmaW5kUHJpbWUoYml0cywgZ2VuKSB7XG4gIGlmIChiaXRzIDwgMTYpIHtcbiAgICAvLyB0aGlzIGlzIHdoYXQgb3BlbnNzbCBkb2VzXG4gICAgaWYgKGdlbiA9PT0gMiB8fCBnZW4gPT09IDUpIHtcbiAgICAgIHJldHVybiBuZXcgQk4oWzB4OGMsIDB4N2JdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBCTihbMHg4YywgMHgyN10pO1xuICAgIH1cbiAgfVxuICBnZW4gPSBuZXcgQk4oZ2VuKTtcblxuICB2YXIgbnVtLCBuMjtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIG51bSA9IG5ldyBCTihyYW5kb21CeXRlcyhNYXRoLmNlaWwoYml0cyAvIDgpKSk7XG4gICAgd2hpbGUgKG51bS5iaXRMZW5ndGgoKSA+IGJpdHMpIHtcbiAgICAgIG51bS5pc2hybigxKTtcbiAgICB9XG4gICAgaWYgKG51bS5pc0V2ZW4oKSkge1xuICAgICAgbnVtLmlhZGQoT05FKTtcbiAgICB9XG4gICAgaWYgKCFudW0udGVzdG4oMSkpIHtcbiAgICAgIG51bS5pYWRkKFRXTyk7XG4gICAgfVxuICAgIGlmICghZ2VuLmNtcChUV08pKSB7XG4gICAgICB3aGlsZSAobnVtLm1vZChUV0VOVFlGT1VSKS5jbXAoRUxFVkVOKSkge1xuICAgICAgICBudW0uaWFkZChGT1VSKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFnZW4uY21wKEZJVkUpKSB7XG4gICAgICB3aGlsZSAobnVtLm1vZChURU4pLmNtcChUSFJFRSkpIHtcbiAgICAgICAgbnVtLmlhZGQoRk9VUik7XG4gICAgICB9XG4gICAgfVxuICAgIG4yID0gbnVtLnNocm4oMSk7XG4gICAgaWYgKHNpbXBsZVNpZXZlKG4yKSAmJiBzaW1wbGVTaWV2ZShudW0pICYmXG4gICAgICBmZXJtYXRUZXN0KG4yKSAmJiBmZXJtYXRUZXN0KG51bSkgJiZcbiAgICAgIG1pbGxlclJhYmluLnRlc3QobjIpICYmIG1pbGxlclJhYmluLnRlc3QobnVtKSkge1xuICAgICAgcmV0dXJuIG51bTtcbiAgICB9XG4gIH1cblxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICAgIFwibW9kcDFcIjoge1xuICAgICAgICBcImdlblwiOiBcIjAyXCIsXG4gICAgICAgIFwicHJpbWVcIjogXCJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjNhMzYyMGZmZmZmZmZmZmZmZmZmZmZcIlxuICAgIH0sXG4gICAgXCJtb2RwMlwiOiB7XG4gICAgICAgIFwiZ2VuXCI6IFwiMDJcIixcbiAgICAgICAgXCJwcmltZVwiOiBcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U2NTM4MWZmZmZmZmZmZmZmZmZmZmZcIlxuICAgIH0sXG4gICAgXCJtb2RwNVwiOiB7XG4gICAgICAgIFwiZ2VuXCI6IFwiMDJcIixcbiAgICAgICAgXCJwcmltZVwiOiBcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMjM3MzI3ZmZmZmZmZmZmZmZmZmZmZlwiXG4gICAgfSxcbiAgICBcIm1vZHAxNFwiOiB7XG4gICAgICAgIFwiZ2VuXCI6IFwiMDJcIixcbiAgICAgICAgXCJwcmltZVwiOiBcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhY2FhNjhmZmZmZmZmZmZmZmZmZmZmXCJcbiAgICB9LFxuICAgIFwibW9kcDE1XCI6IHtcbiAgICAgICAgXCJnZW5cIjogXCIwMlwiLFxuICAgICAgICBcInByaW1lXCI6IFwiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkzYWQyY2FmZmZmZmZmZmZmZmZmZmZmXCJcbiAgICB9LFxuICAgIFwibW9kcDE2XCI6IHtcbiAgICAgICAgXCJnZW5cIjogXCIwMlwiLFxuICAgICAgICBcInByaW1lXCI6IFwiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkyMTA4MDExYTcyM2MxMmE3ODdlNmQ3ODg3MTlhMTBiZGJhNWIyNjk5YzMyNzE4NmFmNGUyM2MxYTk0NjgzNGI2MTUwYmRhMjU4M2U5Y2EyYWQ0NGNlOGRiYmJjMmRiMDRkZThlZjkyZThlZmMxNDFmYmVjYWE2Mjg3YzU5NDc0ZTZiYzA1ZDk5YjI5NjRmYTA5MGMzYTIyMzNiYTE4NjUxNWJlN2VkMWY2MTI5NzBjZWUyZDdhZmI4MWJkZDc2MjE3MDQ4MWNkMDA2OTEyN2Q1YjA1YWE5OTNiNGVhOTg4ZDhmZGRjMTg2ZmZiN2RjOTBhNmMwOGY0ZGY0MzVjOTM0MDYzMTk5ZmZmZmZmZmZmZmZmZmZmZlwiXG4gICAgfSxcbiAgICBcIm1vZHAxN1wiOiB7XG4gICAgICAgIFwiZ2VuXCI6IFwiMDJcIixcbiAgICAgICAgXCJwcmltZVwiOiBcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDAyODQ5MjM2YzNmYWI0ZDI3YzcwMjZjMWQ0ZGNiMjYwMjY0NmRlYzk3NTFlNzYzZGJhMzdiZGY4ZmY5NDA2YWQ5ZTUzMGVlNWRiMzgyZjQxMzAwMWFlYjA2YTUzZWQ5MDI3ZDgzMTE3OTcyN2IwODY1YTg5MThkYTNlZGJlYmNmOWIxNGVkNDRjZTZjYmFjZWQ0YmIxYmRiN2YxNDQ3ZTZjYzI1NGIzMzIwNTE1MTJiZDdhZjQyNmZiOGY0MDEzNzhjZDJiZjU5ODNjYTAxYzY0YjkyZWNmMDMyZWExNWQxNzIxZDAzZjQ4MmQ3Y2U2ZTc0ZmVmNmQ1NWU3MDJmNDY5ODBjODJiNWE4NDAzMTkwMGIxYzllNTllN2M5N2ZiZWM3ZThmMzIzYTk3YTdlMzZjYzg4YmUwZjFkNDViN2ZmNTg1YWM1NGJkNDA3YjIyYjQxNTRhYWNjOGY2ZDdlYmY0OGUxZDgxNGNjNWVkMjBmODAzN2UwYTc5NzE1ZWVmMjliZTMyODA2YTFkNThiYjdjNWRhNzZmNTUwYWEzZDhhMWZiZmYwZWIxOWNjYjFhMzEzZDU1Y2RhNTZjOWVjMmVmMjk2MzIzODdmZThkNzZlM2MwNDY4MDQzZThmNjYzZjQ4NjBlZTEyYmYyZDViMGI3NDc0ZDZlNjk0ZjkxZTZkY2M0MDI0ZmZmZmZmZmZmZmZmZmZmZlwiXG4gICAgfSxcbiAgICBcIm1vZHAxOFwiOiB7XG4gICAgICAgIFwiZ2VuXCI6IFwiMDJcIixcbiAgICAgICAgXCJwcmltZVwiOiBcImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDAyODQ5MjM2YzNmYWI0ZDI3YzcwMjZjMWQ0ZGNiMjYwMjY0NmRlYzk3NTFlNzYzZGJhMzdiZGY4ZmY5NDA2YWQ5ZTUzMGVlNWRiMzgyZjQxMzAwMWFlYjA2YTUzZWQ5MDI3ZDgzMTE3OTcyN2IwODY1YTg5MThkYTNlZGJlYmNmOWIxNGVkNDRjZTZjYmFjZWQ0YmIxYmRiN2YxNDQ3ZTZjYzI1NGIzMzIwNTE1MTJiZDdhZjQyNmZiOGY0MDEzNzhjZDJiZjU5ODNjYTAxYzY0YjkyZWNmMDMyZWExNWQxNzIxZDAzZjQ4MmQ3Y2U2ZTc0ZmVmNmQ1NWU3MDJmNDY5ODBjODJiNWE4NDAzMTkwMGIxYzllNTllN2M5N2ZiZWM3ZThmMzIzYTk3YTdlMzZjYzg4YmUwZjFkNDViN2ZmNTg1YWM1NGJkNDA3YjIyYjQxNTRhYWNjOGY2ZDdlYmY0OGUxZDgxNGNjNWVkMjBmODAzN2UwYTc5NzE1ZWVmMjliZTMyODA2YTFkNThiYjdjNWRhNzZmNTUwYWEzZDhhMWZiZmYwZWIxOWNjYjFhMzEzZDU1Y2RhNTZjOWVjMmVmMjk2MzIzODdmZThkNzZlM2MwNDY4MDQzZThmNjYzZjQ4NjBlZTEyYmYyZDViMGI3NDc0ZDZlNjk0ZjkxZTZkYmUxMTU5NzRhMzkyNmYxMmZlZTVlNDM4Nzc3Y2I2YTkzMmRmOGNkOGJlYzRkMDczYjkzMWJhM2JjODMyYjY4ZDlkZDMwMDc0MWZhN2JmOGFmYzQ3ZWQyNTc2ZjY5MzZiYTQyNDY2M2FhYjYzOWM1YWU0ZjU2ODM0MjNiNDc0MmJmMWM5NzgyMzhmMTZjYmUzOWQ2NTJkZTNmZGI4YmVmYzg0OGFkOTIyMjIyZTA0YTQwMzdjMDcxM2ViNTdhODFhMjNmMGM3MzQ3M2ZjNjQ2Y2VhMzA2YjRiY2JjODg2MmY4Mzg1ZGRmYTlkNGI3ZmEyYzA4N2U4Nzk2ODMzMDNlZDViZGQzYTA2MmIzY2Y1YjNhMjc4YTY2ZDJhMTNmODNmNDRmODJkZGYzMTBlZTA3NGFiNmEzNjQ1OTdlODk5YTAyNTVkYzE2NGYzMWNjNTA4NDY4NTFkZjlhYjQ4MTk1ZGVkN2VhMWIxZDUxMGJkN2VlNzRkNzNmYWYzNmJjMzFlY2ZhMjY4MzU5MDQ2ZjRlYjg3OWY5MjQwMDk0MzhiNDgxYzZjZDc4ODlhMDAyZWQ1ZWUzODJiYzkxOTBkYTZmYzAyNmU0Nzk1NThlNDQ3NTY3N2U5YWE5ZTMwNTBlMjc2NTY5NGRmYzgxZjU2ZTg4MGI5NmU3MTYwYzk4MGRkOThlZGQzZGZmZmZmZmZmZmZmZmZmZmZmXCJcbiAgICB9XG59IiwiLy8gU2ltcGxlIHdyYXBwZXIgYXJvdW5kIFNKQ0wncyBFQ0MgSW1wbGVtZW50YXRpb24gLSB2MC4zLjAgLSBodHRwczovL2dpdGh1Yi5jb20vanBpbGxvcmEvZWNjanNcbi8vIEphaW1lIFBpbGxvcmEgPGRldkBqcGlsbG9yYS5jb20+IC0gTUlUL0JTRChzbGpjKSBDb3B5cmlnaHQgMjAxNFxuKGZ1bmN0aW9uKHdpbmRvdyx1bmRlZmluZWQpIHsvKiogQGZpbGVPdmVydmlldyBKYXZhc2NyaXB0IGNyeXB0b2dyYXBoeSBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBDcnVzaCB0byByZW1vdmUgY29tbWVudHMsIHNob3J0ZW4gdmFyaWFibGUgbmFtZXMgYW5kXG4gKiBnZW5lcmFsbHkgcmVkdWNlIHRyYW5zbWlzc2lvbiBzaXplLlxuICpcbiAqIEBhdXRob3IgRW1pbHkgU3RhcmtcbiAqIEBhdXRob3IgTWlrZSBIYW1idXJnXG4gKiBAYXV0aG9yIERhbiBCb25laFxuICovXG5cblwidXNlIHN0cmljdFwiO1xuLypqc2xpbnQgaW5kZW50OiAyLCBiaXR3aXNlOiBmYWxzZSwgbm9tZW46IGZhbHNlLCBwbHVzcGx1czogZmFsc2UsIHdoaXRlOiBmYWxzZSwgcmVnZXhwOiBmYWxzZSAqL1xuLypnbG9iYWwgZG9jdW1lbnQsIHdpbmRvdywgZXNjYXBlLCB1bmVzY2FwZSwgbW9kdWxlLCByZXF1aXJlLCBVaW50MzJBcnJheSAqL1xuXG4vKiogQG5hbWVzcGFjZSBUaGUgU3RhbmZvcmQgSmF2YXNjcmlwdCBDcnlwdG8gTGlicmFyeSwgdG9wLWxldmVsIG5hbWVzcGFjZS4gKi9cbnZhciBzamNsID0ge1xuICAvKiogQG5hbWVzcGFjZSBTeW1tZXRyaWMgY2lwaGVycy4gKi9cbiAgY2lwaGVyOiB7fSxcblxuICAvKiogQG5hbWVzcGFjZSBIYXNoIGZ1bmN0aW9ucy4gIFJpZ2h0IG5vdyBvbmx5IFNIQTI1NiBpcyBpbXBsZW1lbnRlZC4gKi9cbiAgaGFzaDoge30sXG5cbiAgLyoqIEBuYW1lc3BhY2UgS2V5IGV4Y2hhbmdlIGZ1bmN0aW9ucy4gIFJpZ2h0IG5vdyBvbmx5IFNSUCBpcyBpbXBsZW1lbnRlZC4gKi9cbiAga2V5ZXhjaGFuZ2U6IHt9LFxuICBcbiAgLyoqIEBuYW1lc3BhY2UgQmxvY2sgY2lwaGVyIG1vZGVzIG9mIG9wZXJhdGlvbi4gKi9cbiAgbW9kZToge30sXG5cbiAgLyoqIEBuYW1lc3BhY2UgTWlzY2VsbGFuZW91cy4gIEhNQUMgYW5kIFBCS0RGMi4gKi9cbiAgbWlzYzoge30sXG4gIFxuICAvKipcbiAgICogQG5hbWVzcGFjZSBCaXQgYXJyYXkgZW5jb2RlcnMgYW5kIGRlY29kZXJzLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIG1lbWJlcnMgb2YgdGhpcyBuYW1lc3BhY2UgYXJlIGZ1bmN0aW9ucyB3aGljaCB0cmFuc2xhdGUgYmV0d2VlblxuICAgKiBTSkNMJ3MgYml0QXJyYXlzIGFuZCBvdGhlciBvYmplY3RzICh1c3VhbGx5IHN0cmluZ3MpLiAgQmVjYXVzZSBpdFxuICAgKiBpc24ndCBhbHdheXMgY2xlYXIgd2hpY2ggZGlyZWN0aW9uIGlzIGVuY29kaW5nIGFuZCB3aGljaCBpcyBkZWNvZGluZyxcbiAgICogdGhlIG1ldGhvZCBuYW1lcyBhcmUgXCJmcm9tQml0c1wiIGFuZCBcInRvQml0c1wiLlxuICAgKi9cbiAgY29kZWM6IHt9LFxuICBcbiAgLyoqIEBuYW1lc3BhY2UgRXhjZXB0aW9ucy4gKi9cbiAgZXhjZXB0aW9uOiB7XG4gICAgLyoqIEBjb25zdHJ1Y3RvciBDaXBoZXJ0ZXh0IGlzIGNvcnJ1cHQuICovXG4gICAgY29ycnVwdDogZnVuY3Rpb24obWVzc2FnZSkge1xuICAgICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gXCJDT1JSVVBUOiBcIit0aGlzLm1lc3NhZ2U7IH07XG4gICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH0sXG4gICAgXG4gICAgLyoqIEBjb25zdHJ1Y3RvciBJbnZhbGlkIHBhcmFtZXRlci4gKi9cbiAgICBpbnZhbGlkOiBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBcIklOVkFMSUQ6IFwiK3RoaXMubWVzc2FnZTsgfTtcbiAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfSxcbiAgICBcbiAgICAvKiogQGNvbnN0cnVjdG9yIEJ1ZyBvciBtaXNzaW5nIGZlYXR1cmUgaW4gU0pDTC4gQGNvbnN0cnVjdG9yICovXG4gICAgYnVnOiBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBcIkJVRzogXCIrdGhpcy5tZXNzYWdlOyB9O1xuICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9LFxuXG4gICAgLyoqIEBjb25zdHJ1Y3RvciBTb21ldGhpbmcgaXNuJ3QgcmVhZHkuICovXG4gICAgbm90UmVhZHk6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiTk9UIFJFQURZOiBcIit0aGlzLm1lc3NhZ2U7IH07XG4gICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqIEBmaWxlT3ZlcnZpZXcgTG93LWxldmVsIEFFUyBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgYSBsb3ctbGV2ZWwgaW1wbGVtZW50YXRpb24gb2YgQUVTLCBvcHRpbWl6ZWQgZm9yXG4gKiBzaXplIGFuZCBmb3IgZWZmaWNpZW5jeSBvbiBzZXZlcmFsIGJyb3dzZXJzLiAgSXQgaXMgYmFzZWQgb25cbiAqIE9wZW5TU0wncyBhZXNfY29yZS5jLCBhIHB1YmxpYy1kb21haW4gaW1wbGVtZW50YXRpb24gYnkgVmluY2VudFxuICogUmlqbWVuLCBBbnRvb24gQm9zc2VsYWVycyBhbmQgUGF1bG8gQmFycmV0by5cbiAqXG4gKiBBbiBvbGRlciB2ZXJzaW9uIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBwdWJsaWNcbiAqIGRvbWFpbiwgYnV0IHRoaXMgb25lIGlzIChjKSBFbWlseSBTdGFyaywgTWlrZSBIYW1idXJnLCBEYW4gQm9uZWgsXG4gKiBTdGFuZm9yZCBVbml2ZXJzaXR5IDIwMDgtMjAxMCBhbmQgQlNELWxpY2Vuc2VkIGZvciBsaWFiaWxpdHlcbiAqIHJlYXNvbnMuXG4gKlxuICogQGF1dGhvciBFbWlseSBTdGFya1xuICogQGF1dGhvciBNaWtlIEhhbWJ1cmdcbiAqIEBhdXRob3IgRGFuIEJvbmVoXG4gKi9cblxuLyoqXG4gKiBTY2hlZHVsZSBvdXQgYW4gQUVTIGtleSBmb3IgYm90aCBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uLiAgVGhpc1xuICogaXMgYSBsb3ctbGV2ZWwgY2xhc3MuICBVc2UgYSBjaXBoZXIgbW9kZSB0byBkbyBidWxrIGVuY3J5cHRpb24uXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBrZXkgVGhlIGtleSBhcyBhbiBhcnJheSBvZiA0LCA2IG9yIDggd29yZHMuXG4gKlxuICogQGNsYXNzIEFkdmFuY2VkIEVuY3J5cHRpb24gU3RhbmRhcmQgKGxvdy1sZXZlbCBpbnRlcmZhY2UpXG4gKi9cbnNqY2wuY2lwaGVyLmFlcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgaWYgKCF0aGlzLl90YWJsZXNbMF1bMF1bMF0pIHtcbiAgICB0aGlzLl9wcmVjb21wdXRlKCk7XG4gIH1cbiAgXG4gIHZhciBpLCBqLCB0bXAsXG4gICAgZW5jS2V5LCBkZWNLZXksXG4gICAgc2JveCA9IHRoaXMuX3RhYmxlc1swXVs0XSwgZGVjVGFibGUgPSB0aGlzLl90YWJsZXNbMV0sXG4gICAga2V5TGVuID0ga2V5Lmxlbmd0aCwgcmNvbiA9IDE7XG4gIFxuICBpZiAoa2V5TGVuICE9PSA0ICYmIGtleUxlbiAhPT0gNiAmJiBrZXlMZW4gIT09IDgpIHtcbiAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImludmFsaWQgYWVzIGtleSBzaXplXCIpO1xuICB9XG4gIFxuICB0aGlzLl9rZXkgPSBbZW5jS2V5ID0ga2V5LnNsaWNlKDApLCBkZWNLZXkgPSBbXV07XG4gIFxuICAvLyBzY2hlZHVsZSBlbmNyeXB0aW9uIGtleXNcbiAgZm9yIChpID0ga2V5TGVuOyBpIDwgNCAqIGtleUxlbiArIDI4OyBpKyspIHtcbiAgICB0bXAgPSBlbmNLZXlbaS0xXTtcbiAgICBcbiAgICAvLyBhcHBseSBzYm94XG4gICAgaWYgKGkla2V5TGVuID09PSAwIHx8IChrZXlMZW4gPT09IDggJiYgaSVrZXlMZW4gPT09IDQpKSB7XG4gICAgICB0bXAgPSBzYm94W3RtcD4+PjI0XTw8MjQgXiBzYm94W3RtcD4+MTYmMjU1XTw8MTYgXiBzYm94W3RtcD4+OCYyNTVdPDw4IF4gc2JveFt0bXAmMjU1XTtcbiAgICAgIFxuICAgICAgLy8gc2hpZnQgcm93cyBhbmQgYWRkIHJjb25cbiAgICAgIGlmIChpJWtleUxlbiA9PT0gMCkge1xuICAgICAgICB0bXAgPSB0bXA8PDggXiB0bXA+Pj4yNCBeIHJjb248PDI0O1xuICAgICAgICByY29uID0gcmNvbjw8MSBeIChyY29uPj43KSoyODM7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGVuY0tleVtpXSA9IGVuY0tleVtpLWtleUxlbl0gXiB0bXA7XG4gIH1cbiAgXG4gIC8vIHNjaGVkdWxlIGRlY3J5cHRpb24ga2V5c1xuICBmb3IgKGogPSAwOyBpOyBqKyssIGktLSkge1xuICAgIHRtcCA9IGVuY0tleVtqJjMgPyBpIDogaSAtIDRdO1xuICAgIGlmIChpPD00IHx8IGo8NCkge1xuICAgICAgZGVjS2V5W2pdID0gdG1wO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWNLZXlbal0gPSBkZWNUYWJsZVswXVtzYm94W3RtcD4+PjI0ICAgICAgXV0gXlxuICAgICAgICAgICAgICAgICAgZGVjVGFibGVbMV1bc2JveFt0bXA+PjE2ICAmIDI1NV1dIF5cbiAgICAgICAgICAgICAgICAgIGRlY1RhYmxlWzJdW3Nib3hbdG1wPj44ICAgJiAyNTVdXSBeXG4gICAgICAgICAgICAgICAgICBkZWNUYWJsZVszXVtzYm94W3RtcCAgICAgICYgMjU1XV07XG4gICAgfVxuICB9XG59O1xuXG5zamNsLmNpcGhlci5hZXMucHJvdG90eXBlID0ge1xuICAvLyBwdWJsaWNcbiAgLyogU29tZXRoaW5nIGxpa2UgdGhpcyBtaWdodCBhcHBlYXIgaGVyZSBldmVudHVhbGx5XG4gIG5hbWU6IFwiQUVTXCIsXG4gIGJsb2NrU2l6ZTogNCxcbiAga2V5U2l6ZXM6IFs0LDYsOF0sXG4gICovXG4gIFxuICAvKipcbiAgICogRW5jcnlwdCBhbiBhcnJheSBvZiA0IGJpZy1lbmRpYW4gd29yZHMuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgVGhlIHBsYWludGV4dC5cbiAgICogQHJldHVybiB7QXJyYXl9IFRoZSBjaXBoZXJ0ZXh0LlxuICAgKi9cbiAgZW5jcnlwdDpmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gdGhpcy5fY3J5cHQoZGF0YSwwKTsgfSxcbiAgXG4gIC8qKlxuICAgKiBEZWNyeXB0IGFuIGFycmF5IG9mIDQgYmlnLWVuZGlhbiB3b3Jkcy5cbiAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgY2lwaGVydGV4dC5cbiAgICogQHJldHVybiB7QXJyYXl9IFRoZSBwbGFpbnRleHQuXG4gICAqL1xuICBkZWNyeXB0OmZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiB0aGlzLl9jcnlwdChkYXRhLDEpOyB9LFxuICBcbiAgLyoqXG4gICAqIFRoZSBleHBhbmRlZCBTLWJveCBhbmQgaW52ZXJzZSBTLWJveCB0YWJsZXMuICBUaGVzZSB3aWxsIGJlIGNvbXB1dGVkXG4gICAqIG9uIHRoZSBjbGllbnQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHNlbmQgdGhlbSBkb3duIHRoZSB3aXJlLlxuICAgKlxuICAgKiBUaGVyZSBhcmUgdHdvIHRhYmxlcywgX3RhYmxlc1swXSBpcyBmb3IgZW5jcnlwdGlvbiBhbmRcbiAgICogX3RhYmxlc1sxXSBpcyBmb3IgZGVjcnlwdGlvbi5cbiAgICpcbiAgICogVGhlIGZpcnN0IDQgc3ViLXRhYmxlcyBhcmUgdGhlIGV4cGFuZGVkIFMtYm94IHdpdGggTWl4Q29sdW1ucy4gIFRoZVxuICAgKiBsYXN0IChfdGFibGVzWzAxXVs0XSkgaXMgdGhlIFMtYm94IGl0c2VsZi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF90YWJsZXM6IFtbW10sW10sW10sW10sW11dLFtbXSxbXSxbXSxbXSxbXV1dLFxuXG4gIC8qKlxuICAgKiBFeHBhbmQgdGhlIFMtYm94IHRhYmxlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wcmVjb21wdXRlOiBmdW5jdGlvbiAoKSB7XG4gICB2YXIgZW5jVGFibGUgPSB0aGlzLl90YWJsZXNbMF0sIGRlY1RhYmxlID0gdGhpcy5fdGFibGVzWzFdLFxuICAgICAgIHNib3ggPSBlbmNUYWJsZVs0XSwgc2JveEludiA9IGRlY1RhYmxlWzRdLFxuICAgICAgIGksIHgsIHhJbnYsIGQ9W10sIHRoPVtdLCB4MiwgeDQsIHg4LCBzLCB0RW5jLCB0RGVjO1xuXG4gICAgLy8gQ29tcHV0ZSBkb3VibGUgYW5kIHRoaXJkIHRhYmxlc1xuICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgIHRoWyggZFtpXSA9IGk8PDEgXiAoaT4+NykqMjgzICleaV09aTtcbiAgIH1cbiAgIFxuICAgZm9yICh4ID0geEludiA9IDA7ICFzYm94W3hdOyB4IF49IHgyIHx8IDEsIHhJbnYgPSB0aFt4SW52XSB8fCAxKSB7XG4gICAgIC8vIENvbXB1dGUgc2JveFxuICAgICBzID0geEludiBeIHhJbnY8PDEgXiB4SW52PDwyIF4geEludjw8MyBeIHhJbnY8PDQ7XG4gICAgIHMgPSBzPj44IF4gcyYyNTUgXiA5OTtcbiAgICAgc2JveFt4XSA9IHM7XG4gICAgIHNib3hJbnZbc10gPSB4O1xuICAgICBcbiAgICAgLy8gQ29tcHV0ZSBNaXhDb2x1bW5zXG4gICAgIHg4ID0gZFt4NCA9IGRbeDIgPSBkW3hdXV07XG4gICAgIHREZWMgPSB4OCoweDEwMTAxMDEgXiB4NCoweDEwMDAxIF4geDIqMHgxMDEgXiB4KjB4MTAxMDEwMDtcbiAgICAgdEVuYyA9IGRbc10qMHgxMDEgXiBzKjB4MTAxMDEwMDtcbiAgICAgXG4gICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICBlbmNUYWJsZVtpXVt4XSA9IHRFbmMgPSB0RW5jPDwyNCBeIHRFbmM+Pj44O1xuICAgICAgIGRlY1RhYmxlW2ldW3NdID0gdERlYyA9IHREZWM8PDI0IF4gdERlYz4+Pjg7XG4gICAgIH1cbiAgIH1cbiAgIFxuICAgLy8gQ29tcGFjdGlmeS4gIENvbnNpZGVyYWJsZSBzcGVlZHVwIG9uIEZpcmVmb3guXG4gICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgIGVuY1RhYmxlW2ldID0gZW5jVGFibGVbaV0uc2xpY2UoMCk7XG4gICAgIGRlY1RhYmxlW2ldID0gZGVjVGFibGVbaV0uc2xpY2UoMCk7XG4gICB9XG4gIH0sXG4gIFxuICAvKipcbiAgICogRW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBjb3JlLlxuICAgKiBAcGFyYW0ge0FycmF5fSBpbnB1dCBGb3VyIHdvcmRzIHRvIGJlIGVuY3J5cHRlZCBvciBkZWNyeXB0ZWQuXG4gICAqIEBwYXJhbSBkaXIgVGhlIGRpcmVjdGlvbiwgMCBmb3IgZW5jcnlwdCBhbmQgMSBmb3IgZGVjcnlwdC5cbiAgICogQHJldHVybiB7QXJyYXl9IFRoZSBmb3VyIGVuY3J5cHRlZCBvciBkZWNyeXB0ZWQgd29yZHMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3J5cHQ6ZnVuY3Rpb24gKGlucHV0LCBkaXIpIHtcbiAgICBpZiAoaW5wdXQubGVuZ3RoICE9PSA0KSB7XG4gICAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImludmFsaWQgYWVzIGJsb2NrIHNpemVcIik7XG4gICAgfVxuICAgIFxuICAgIHZhciBrZXkgPSB0aGlzLl9rZXlbZGlyXSxcbiAgICAgICAgLy8gc3RhdGUgdmFyaWFibGVzIGEsYixjLGQgYXJlIGxvYWRlZCB3aXRoIHByZS13aGl0ZW5lZCBkYXRhXG4gICAgICAgIGEgPSBpbnB1dFswXSAgICAgICAgICAgXiBrZXlbMF0sXG4gICAgICAgIGIgPSBpbnB1dFtkaXIgPyAzIDogMV0gXiBrZXlbMV0sXG4gICAgICAgIGMgPSBpbnB1dFsyXSAgICAgICAgICAgXiBrZXlbMl0sXG4gICAgICAgIGQgPSBpbnB1dFtkaXIgPyAxIDogM10gXiBrZXlbM10sXG4gICAgICAgIGEyLCBiMiwgYzIsXG4gICAgICAgIFxuICAgICAgICBuSW5uZXJSb3VuZHMgPSBrZXkubGVuZ3RoLzQgLSAyLFxuICAgICAgICBpLFxuICAgICAgICBrSW5kZXggPSA0LFxuICAgICAgICBvdXQgPSBbMCwwLDAsMF0sXG4gICAgICAgIHRhYmxlID0gdGhpcy5fdGFibGVzW2Rpcl0sXG4gICAgICAgIFxuICAgICAgICAvLyBsb2FkIHVwIHRoZSB0YWJsZXNcbiAgICAgICAgdDAgICAgPSB0YWJsZVswXSxcbiAgICAgICAgdDEgICAgPSB0YWJsZVsxXSxcbiAgICAgICAgdDIgICAgPSB0YWJsZVsyXSxcbiAgICAgICAgdDMgICAgPSB0YWJsZVszXSxcbiAgICAgICAgc2JveCAgPSB0YWJsZVs0XTtcbiBcbiAgICAvLyBJbm5lciByb3VuZHMuICBDcmliYmVkIGZyb20gT3BlblNTTC5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbklubmVyUm91bmRzOyBpKyspIHtcbiAgICAgIGEyID0gdDBbYT4+PjI0XSBeIHQxW2I+PjE2ICYgMjU1XSBeIHQyW2M+PjggJiAyNTVdIF4gdDNbZCAmIDI1NV0gXiBrZXlba0luZGV4XTtcbiAgICAgIGIyID0gdDBbYj4+PjI0XSBeIHQxW2M+PjE2ICYgMjU1XSBeIHQyW2Q+PjggJiAyNTVdIF4gdDNbYSAmIDI1NV0gXiBrZXlba0luZGV4ICsgMV07XG4gICAgICBjMiA9IHQwW2M+Pj4yNF0gXiB0MVtkPj4xNiAmIDI1NV0gXiB0MlthPj44ICYgMjU1XSBeIHQzW2IgJiAyNTVdIF4ga2V5W2tJbmRleCArIDJdO1xuICAgICAgZCAgPSB0MFtkPj4+MjRdIF4gdDFbYT4+MTYgJiAyNTVdIF4gdDJbYj4+OCAmIDI1NV0gXiB0M1tjICYgMjU1XSBeIGtleVtrSW5kZXggKyAzXTtcbiAgICAgIGtJbmRleCArPSA0O1xuICAgICAgYT1hMjsgYj1iMjsgYz1jMjtcbiAgICB9XG4gICAgICAgIFxuICAgIC8vIExhc3Qgcm91bmQuXG4gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgb3V0W2RpciA/IDMmLWkgOiBpXSA9XG4gICAgICAgIHNib3hbYT4+PjI0ICAgICAgXTw8MjQgXiBcbiAgICAgICAgc2JveFtiPj4xNiAgJiAyNTVdPDwxNiBeXG4gICAgICAgIHNib3hbYz4+OCAgICYgMjU1XTw8OCAgXlxuICAgICAgICBzYm94W2QgICAgICAmIDI1NV0gICAgIF5cbiAgICAgICAga2V5W2tJbmRleCsrXTtcbiAgICAgIGEyPWE7IGE9YjsgYj1jOyBjPWQ7IGQ9YTI7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBvdXQ7XG4gIH1cbn07XG5cbi8qKiBAZmlsZU92ZXJ2aWV3IEFycmF5cyBvZiBiaXRzLCBlbmNvZGVkIGFzIGFycmF5cyBvZiBOdW1iZXJzLlxuICpcbiAqIEBhdXRob3IgRW1pbHkgU3RhcmtcbiAqIEBhdXRob3IgTWlrZSBIYW1idXJnXG4gKiBAYXV0aG9yIERhbiBCb25laFxuICovXG5cbi8qKiBAbmFtZXNwYWNlIEFycmF5cyBvZiBiaXRzLCBlbmNvZGVkIGFzIGFycmF5cyBvZiBOdW1iZXJzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogPHA+XG4gKiBUaGVzZSBvYmplY3RzIGFyZSB0aGUgY3VycmVuY3kgYWNjZXB0ZWQgYnkgU0pDTCdzIGNyeXB0byBmdW5jdGlvbnMuXG4gKiA8L3A+XG4gKlxuICogPHA+XG4gKiBNb3N0IG9mIG91ciBjcnlwdG8gcHJpbWl0aXZlcyBvcGVyYXRlIG9uIGFycmF5cyBvZiA0LWJ5dGUgd29yZHMgaW50ZXJuYWxseSxcbiAqIGJ1dCBtYW55IG9mIHRoZW0gY2FuIHRha2UgYXJndW1lbnRzIHRoYXQgYXJlIG5vdCBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuXG4gKiBUaGlzIGxpYnJhcnkgZW5jb2RlcyBhcnJheXMgb2YgYml0cyAod2hvc2Ugc2l6ZSBuZWVkIG5vdCBiZSBhIG11bHRpcGxlIG9mIDhcbiAqIGJpdHMpIGFzIGFycmF5cyBvZiAzMi1iaXQgd29yZHMuICBUaGUgYml0cyBhcmUgcGFja2VkLCBiaWctZW5kaWFuLCBpbnRvIGFuXG4gKiBhcnJheSBvZiB3b3JkcywgMzIgYml0cyBhdCBhIHRpbWUuICBTaW5jZSB0aGUgd29yZHMgYXJlIGRvdWJsZS1wcmVjaXNpb25cbiAqIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIHRoZXkgZml0IHNvbWUgZXh0cmEgZGF0YS4gIFdlIHVzZSB0aGlzIChpbiBhIHByaXZhdGUsXG4gKiBwb3NzaWJseS1jaGFuZ2luZyBtYW5uZXIpIHRvIGVuY29kZSB0aGUgbnVtYmVyIG9mIGJpdHMgYWN0dWFsbHkgIHByZXNlbnRcbiAqIGluIHRoZSBsYXN0IHdvcmQgb2YgdGhlIGFycmF5LlxuICogPC9wPlxuICpcbiAqIDxwPlxuICogQmVjYXVzZSBiaXR3aXNlIG9wcyBjbGVhciB0aGlzIG91dC1vZi1iYW5kIGRhdGEsIHRoZXNlIGFycmF5cyBjYW4gYmUgcGFzc2VkXG4gKiB0byBjaXBoZXJzIGxpa2UgQUVTIHdoaWNoIHdhbnQgYXJyYXlzIG9mIHdvcmRzLlxuICogPC9wPlxuICovXG5zamNsLmJpdEFycmF5ID0ge1xuICAvKipcbiAgICogQXJyYXkgc2xpY2VzIGluIHVuaXRzIG9mIGJpdHMuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IGEgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgKiBAcGFyYW0ge051bWJlcn0gYnN0YXJ0IFRoZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzbGljZSwgaW4gYml0cy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGJlbmQgVGhlIG9mZnNldCB0byB0aGUgZW5kIG9mIHRoZSBzbGljZSwgaW4gYml0cy4gIElmIHRoaXMgaXMgdW5kZWZpbmVkLFxuICAgKiBzbGljZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBhcnJheS5cbiAgICogQHJldHVybiB7Yml0QXJyYXl9IFRoZSByZXF1ZXN0ZWQgc2xpY2UuXG4gICAqL1xuICBiaXRTbGljZTogZnVuY3Rpb24gKGEsIGJzdGFydCwgYmVuZCkge1xuICAgIGEgPSBzamNsLmJpdEFycmF5Ll9zaGlmdFJpZ2h0KGEuc2xpY2UoYnN0YXJ0LzMyKSwgMzIgLSAoYnN0YXJ0ICYgMzEpKS5zbGljZSgxKTtcbiAgICByZXR1cm4gKGJlbmQgPT09IHVuZGVmaW5lZCkgPyBhIDogc2pjbC5iaXRBcnJheS5jbGFtcChhLCBiZW5kLWJzdGFydCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYSBudW1iZXIgcGFja2VkIGludG8gYSBiaXQgYXJyYXkuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IGEgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgKiBAcGFyYW0ge051bWJlcn0gYnN0YXJ0IFRoZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzbGljZSwgaW4gYml0cy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBudW1iZXIgdG8gZXh0cmFjdC5cbiAgICogQHJldHVybiB7TnVtYmVyfSBUaGUgcmVxdWVzdGVkIHNsaWNlLlxuICAgKi9cbiAgZXh0cmFjdDogZnVuY3Rpb24oYSwgYnN0YXJ0LCBibGVuZ3RoKSB7XG4gICAgLy8gRklYTUU6IHRoaXMgTWF0aC5mbG9vciBpcyBub3QgbmVjZXNzYXJ5IGF0IGFsbCwgYnV0IGZvciBzb21lIHJlYXNvblxuICAgIC8vIHNlZW1zIHRvIHN1cHByZXNzIGEgYnVnIGluIHRoZSBDaHJvbWl1bSBKSVQuXG4gICAgdmFyIHgsIHNoID0gTWF0aC5mbG9vcigoLWJzdGFydC1ibGVuZ3RoKSAmIDMxKTtcbiAgICBpZiAoKGJzdGFydCArIGJsZW5ndGggLSAxIF4gYnN0YXJ0KSAmIC0zMikge1xuICAgICAgLy8gaXQgY3Jvc3NlcyBhIGJvdW5kYXJ5XG4gICAgICB4ID0gKGFbYnN0YXJ0LzMyfDBdIDw8ICgzMiAtIHNoKSkgXiAoYVtic3RhcnQvMzIrMXwwXSA+Pj4gc2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB3aXRoaW4gYSBzaW5nbGUgd29yZFxuICAgICAgeCA9IGFbYnN0YXJ0LzMyfDBdID4+PiBzaDtcbiAgICB9XG4gICAgcmV0dXJuIHggJiAoKDE8PGJsZW5ndGgpIC0gMSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbmNhdGVuYXRlIHR3byBiaXQgYXJyYXlzLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBhMSBUaGUgZmlyc3QgYXJyYXkuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IGEyIFRoZSBzZWNvbmQgYXJyYXkuXG4gICAqIEByZXR1cm4ge2JpdEFycmF5fSBUaGUgY29uY2F0ZW5hdGlvbiBvZiBhMSBhbmQgYTIuXG4gICAqL1xuICBjb25jYXQ6IGZ1bmN0aW9uIChhMSwgYTIpIHtcbiAgICBpZiAoYTEubGVuZ3RoID09PSAwIHx8IGEyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGExLmNvbmNhdChhMik7XG4gICAgfVxuICAgIFxuICAgIHZhciBvdXQsIGksIGxhc3QgPSBhMVthMS5sZW5ndGgtMV0sIHNoaWZ0ID0gc2pjbC5iaXRBcnJheS5nZXRQYXJ0aWFsKGxhc3QpO1xuICAgIGlmIChzaGlmdCA9PT0gMzIpIHtcbiAgICAgIHJldHVybiBhMS5jb25jYXQoYTIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2pjbC5iaXRBcnJheS5fc2hpZnRSaWdodChhMiwgc2hpZnQsIGxhc3R8MCwgYTEuc2xpY2UoMCxhMS5sZW5ndGgtMSkpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRmluZCB0aGUgbGVuZ3RoIG9mIGFuIGFycmF5IG9mIGJpdHMuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IGEgVGhlIGFycmF5LlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBsZW5ndGggb2YgYSwgaW4gYml0cy5cbiAgICovXG4gIGJpdExlbmd0aDogZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgbCA9IGEubGVuZ3RoLCB4O1xuICAgIGlmIChsID09PSAwKSB7IHJldHVybiAwOyB9XG4gICAgeCA9IGFbbCAtIDFdO1xuICAgIHJldHVybiAobC0xKSAqIDMyICsgc2pjbC5iaXRBcnJheS5nZXRQYXJ0aWFsKHgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUcnVuY2F0ZSBhbiBhcnJheS5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gYSBUaGUgYXJyYXkuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW4gVGhlIGxlbmd0aCB0byB0cnVuY2F0ZSB0bywgaW4gYml0cy5cbiAgICogQHJldHVybiB7Yml0QXJyYXl9IEEgbmV3IGFycmF5LCB0cnVuY2F0ZWQgdG8gbGVuIGJpdHMuXG4gICAqL1xuICBjbGFtcDogZnVuY3Rpb24gKGEsIGxlbikge1xuICAgIGlmIChhLmxlbmd0aCAqIDMyIDwgbGVuKSB7IHJldHVybiBhOyB9XG4gICAgYSA9IGEuc2xpY2UoMCwgTWF0aC5jZWlsKGxlbiAvIDMyKSk7XG4gICAgdmFyIGwgPSBhLmxlbmd0aDtcbiAgICBsZW4gPSBsZW4gJiAzMTtcbiAgICBpZiAobCA+IDAgJiYgbGVuKSB7XG4gICAgICBhW2wtMV0gPSBzamNsLmJpdEFycmF5LnBhcnRpYWwobGVuLCBhW2wtMV0gJiAweDgwMDAwMDAwID4+IChsZW4tMSksIDEpO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfSxcblxuICAvKipcbiAgICogTWFrZSBhIHBhcnRpYWwgd29yZCBmb3IgYSBiaXQgYXJyYXkuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW4gVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSB3b3JkLlxuICAgKiBAcGFyYW0ge051bWJlcn0geCBUaGUgYml0cy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFswXSBfZW5kIFBhc3MgMSBpZiB4IGhhcyBhbHJlYWR5IGJlZW4gc2hpZnRlZCB0byB0aGUgaGlnaCBzaWRlLlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBwYXJ0aWFsIHdvcmQuXG4gICAqL1xuICBwYXJ0aWFsOiBmdW5jdGlvbiAobGVuLCB4LCBfZW5kKSB7XG4gICAgaWYgKGxlbiA9PT0gMzIpIHsgcmV0dXJuIHg7IH1cbiAgICByZXR1cm4gKF9lbmQgPyB4fDAgOiB4IDw8ICgzMi1sZW4pKSArIGxlbiAqIDB4MTAwMDAwMDAwMDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBieSBhIHBhcnRpYWwgd29yZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHggVGhlIHBhcnRpYWwgd29yZC5cbiAgICogQHJldHVybiB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBieSB0aGUgcGFydGlhbCB3b3JkLlxuICAgKi9cbiAgZ2V0UGFydGlhbDogZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh4LzB4MTAwMDAwMDAwMDApIHx8IDMyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDb21wYXJlIHR3byBhcnJheXMgZm9yIGVxdWFsaXR5IGluIGEgcHJlZGljdGFibGUgYW1vdW50IG9mIHRpbWUuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IGEgVGhlIGZpcnN0IGFycmF5LlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBiIFRoZSBzZWNvbmQgYXJyYXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYSA9PSBiOyBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBlcXVhbDogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICBpZiAoc2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYSkgIT09IHNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB4ID0gMCwgaTtcbiAgICBmb3IgKGk9MDsgaTxhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB4IHw9IGFbaV1eYltpXTtcbiAgICB9XG4gICAgcmV0dXJuICh4ID09PSAwKTtcbiAgfSxcblxuICAvKiogU2hpZnQgYW4gYXJyYXkgcmlnaHQuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IGEgVGhlIGFycmF5IHRvIHNoaWZ0LlxuICAgKiBAcGFyYW0ge051bWJlcn0gc2hpZnQgVGhlIG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0LlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2NhcnJ5PTBdIEEgYnl0ZSB0byBjYXJyeSBpblxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBbb3V0PVtdXSBBbiBhcnJheSB0byBwcmVwZW5kIHRvIHRoZSBvdXRwdXQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2hpZnRSaWdodDogZnVuY3Rpb24gKGEsIHNoaWZ0LCBjYXJyeSwgb3V0KSB7XG4gICAgdmFyIGksIGxhc3QyPTAsIHNoaWZ0MjtcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gW107IH1cbiAgICBcbiAgICBmb3IgKDsgc2hpZnQgPj0gMzI7IHNoaWZ0IC09IDMyKSB7XG4gICAgICBvdXQucHVzaChjYXJyeSk7XG4gICAgICBjYXJyeSA9IDA7XG4gICAgfVxuICAgIGlmIChzaGlmdCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG91dC5jb25jYXQoYSk7XG4gICAgfVxuICAgIFxuICAgIGZvciAoaT0wOyBpPGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIG91dC5wdXNoKGNhcnJ5IHwgYVtpXT4+PnNoaWZ0KTtcbiAgICAgIGNhcnJ5ID0gYVtpXSA8PCAoMzItc2hpZnQpO1xuICAgIH1cbiAgICBsYXN0MiA9IGEubGVuZ3RoID8gYVthLmxlbmd0aC0xXSA6IDA7XG4gICAgc2hpZnQyID0gc2pjbC5iaXRBcnJheS5nZXRQYXJ0aWFsKGxhc3QyKTtcbiAgICBvdXQucHVzaChzamNsLmJpdEFycmF5LnBhcnRpYWwoc2hpZnQrc2hpZnQyICYgMzEsIChzaGlmdCArIHNoaWZ0MiA+IDMyKSA/IGNhcnJ5IDogb3V0LnBvcCgpLDEpKTtcbiAgICByZXR1cm4gb3V0O1xuICB9LFxuICBcbiAgLyoqIHhvciBhIGJsb2NrIG9mIDQgd29yZHMgdG9nZXRoZXIuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfeG9yNDogZnVuY3Rpb24oeCx5KSB7XG4gICAgcmV0dXJuIFt4WzBdXnlbMF0seFsxXV55WzFdLHhbMl1eeVsyXSx4WzNdXnlbM11dO1xuICB9XG59O1xuLyoqIEBmaWxlT3ZlcnZpZXcgQml0IGFycmF5IGNvZGVjIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAYXV0aG9yIEVtaWx5IFN0YXJrXG4gKiBAYXV0aG9yIE1pa2UgSGFtYnVyZ1xuICogQGF1dGhvciBEYW4gQm9uZWhcbiAqL1xuIFxuLyoqIEBuYW1lc3BhY2UgVVRGLTggc3RyaW5ncyAqL1xuc2pjbC5jb2RlYy51dGY4U3RyaW5nID0ge1xuICAvKiogQ29udmVydCBmcm9tIGEgYml0QXJyYXkgdG8gYSBVVEYtOCBzdHJpbmcuICovXG4gIGZyb21CaXRzOiBmdW5jdGlvbiAoYXJyKSB7XG4gICAgdmFyIG91dCA9IFwiXCIsIGJsID0gc2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoYXJyKSwgaSwgdG1wO1xuICAgIGZvciAoaT0wOyBpPGJsLzg7IGkrKykge1xuICAgICAgaWYgKChpJjMpID09PSAwKSB7XG4gICAgICAgIHRtcCA9IGFycltpLzRdO1xuICAgICAgfVxuICAgICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodG1wID4+PiAyNCk7XG4gICAgICB0bXAgPDw9IDg7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKG91dCkpO1xuICB9LFxuICBcbiAgLyoqIENvbnZlcnQgZnJvbSBhIFVURi04IHN0cmluZyB0byBhIGJpdEFycmF5LiAqL1xuICB0b0JpdHM6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICBzdHIgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG4gICAgdmFyIG91dCA9IFtdLCBpLCB0bXA9MDtcbiAgICBmb3IgKGk9MDsgaTxzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRtcCA9IHRtcCA8PCA4IHwgc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoKGkmMykgPT09IDMpIHtcbiAgICAgICAgb3V0LnB1c2godG1wKTtcbiAgICAgICAgdG1wID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkmMykge1xuICAgICAgb3V0LnB1c2goc2pjbC5iaXRBcnJheS5wYXJ0aWFsKDgqKGkmMyksIHRtcCkpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG59O1xuLyoqIEBmaWxlT3ZlcnZpZXcgQml0IGFycmF5IGNvZGVjIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAYXV0aG9yIEVtaWx5IFN0YXJrXG4gKiBAYXV0aG9yIE1pa2UgSGFtYnVyZ1xuICogQGF1dGhvciBEYW4gQm9uZWhcbiAqL1xuXG4vKiogQG5hbWVzcGFjZSBIZXhhZGVjaW1hbCAqL1xuc2pjbC5jb2RlYy5oZXggPSB7XG4gIC8qKiBDb252ZXJ0IGZyb20gYSBiaXRBcnJheSB0byBhIGhleCBzdHJpbmcuICovXG4gIGZyb21CaXRzOiBmdW5jdGlvbiAoYXJyKSB7XG4gICAgdmFyIG91dCA9IFwiXCIsIGksIHg7XG4gICAgZm9yIChpPTA7IGk8YXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvdXQgKz0gKChhcnJbaV18MCkrMHhGMDAwMDAwMDAwMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoNCk7XG4gICAgfVxuICAgIHJldHVybiBvdXQuc3Vic3RyKDAsIHNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGFycikvNCk7Ly8ucmVwbGFjZSgvKC57OH0pL2csIFwiJDEgXCIpO1xuICB9LFxuICAvKiogQ29udmVydCBmcm9tIGEgaGV4IHN0cmluZyB0byBhIGJpdEFycmF5LiAqL1xuICB0b0JpdHM6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICB2YXIgaSwgb3V0PVtdLCBsZW47XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcc3wweC9nLCBcIlwiKTtcbiAgICBsZW4gPSBzdHIubGVuZ3RoO1xuICAgIHN0ciA9IHN0ciArIFwiMDAwMDAwMDBcIjtcbiAgICBmb3IgKGk9MDsgaTxzdHIubGVuZ3RoOyBpKz04KSB7XG4gICAgICBvdXQucHVzaChwYXJzZUludChzdHIuc3Vic3RyKGksOCksMTYpXjApO1xuICAgIH1cbiAgICByZXR1cm4gc2pjbC5iaXRBcnJheS5jbGFtcChvdXQsIGxlbio0KTtcbiAgfVxufTtcblxuLyoqIEBmaWxlT3ZlcnZpZXcgQml0IGFycmF5IGNvZGVjIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAYXV0aG9yIEVtaWx5IFN0YXJrXG4gKiBAYXV0aG9yIE1pa2UgSGFtYnVyZ1xuICogQGF1dGhvciBEYW4gQm9uZWhcbiAqL1xuXG4vKiogQG5hbWVzcGFjZSBCYXNlNjQgZW5jb2RpbmcvZGVjb2RpbmcgKi9cbnNqY2wuY29kZWMuYmFzZTY0ID0ge1xuICAvKiogVGhlIGJhc2U2NCBhbHBoYWJldC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGFyczogXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsXG4gIFxuICAvKiogQ29udmVydCBmcm9tIGEgYml0QXJyYXkgdG8gYSBiYXNlNjQgc3RyaW5nLiAqL1xuICBmcm9tQml0czogZnVuY3Rpb24gKGFyciwgX25vRXF1YWxzLCBfdXJsKSB7XG4gICAgdmFyIG91dCA9IFwiXCIsIGksIGJpdHM9MCwgYyA9IHNqY2wuY29kZWMuYmFzZTY0Ll9jaGFycywgdGE9MCwgYmwgPSBzamNsLmJpdEFycmF5LmJpdExlbmd0aChhcnIpO1xuICAgIGlmIChfdXJsKSB7XG4gICAgICBjID0gYy5zdWJzdHIoMCw2MikgKyAnLV8nO1xuICAgIH1cbiAgICBmb3IgKGk9MDsgb3V0Lmxlbmd0aCAqIDYgPCBibDsgKSB7XG4gICAgICBvdXQgKz0gYy5jaGFyQXQoKHRhIF4gYXJyW2ldPj4+Yml0cykgPj4+IDI2KTtcbiAgICAgIGlmIChiaXRzIDwgNikge1xuICAgICAgICB0YSA9IGFycltpXSA8PCAoNi1iaXRzKTtcbiAgICAgICAgYml0cyArPSAyNjtcbiAgICAgICAgaSsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGEgPDw9IDY7XG4gICAgICAgIGJpdHMgLT0gNjtcbiAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKChvdXQubGVuZ3RoICYgMykgJiYgIV9ub0VxdWFscykgeyBvdXQgKz0gXCI9XCI7IH1cbiAgICByZXR1cm4gb3V0O1xuICB9LFxuICBcbiAgLyoqIENvbnZlcnQgZnJvbSBhIGJhc2U2NCBzdHJpbmcgdG8gYSBiaXRBcnJheSAqL1xuICB0b0JpdHM6IGZ1bmN0aW9uKHN0ciwgX3VybCkge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHN8PS9nLCcnKTtcbiAgICB2YXIgb3V0ID0gW10sIGksIGJpdHM9MCwgYyA9IHNqY2wuY29kZWMuYmFzZTY0Ll9jaGFycywgdGE9MCwgeDtcbiAgICBpZiAoX3VybCkge1xuICAgICAgYyA9IGMuc3Vic3RyKDAsNjIpICsgJy1fJztcbiAgICB9XG4gICAgZm9yIChpPTA7IGk8c3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICB4ID0gYy5pbmRleE9mKHN0ci5jaGFyQXQoaSkpO1xuICAgICAgaWYgKHggPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwidGhpcyBpc24ndCBiYXNlNjQhXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGJpdHMgPiAyNikge1xuICAgICAgICBiaXRzIC09IDI2O1xuICAgICAgICBvdXQucHVzaCh0YSBeIHg+Pj5iaXRzKTtcbiAgICAgICAgdGEgID0geCA8PCAoMzItYml0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaXRzICs9IDY7XG4gICAgICAgIHRhIF49IHggPDwgKDMyLWJpdHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYml0cyY1Nikge1xuICAgICAgb3V0LnB1c2goc2pjbC5iaXRBcnJheS5wYXJ0aWFsKGJpdHMmNTYsIHRhLCAxKSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cbn07XG5cbnNqY2wuY29kZWMuYmFzZTY0dXJsID0ge1xuICBmcm9tQml0czogZnVuY3Rpb24gKGFycikgeyByZXR1cm4gc2pjbC5jb2RlYy5iYXNlNjQuZnJvbUJpdHMoYXJyLDEsMSk7IH0sXG4gIHRvQml0czogZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKHN0ciwxKTsgfVxufTtcbi8qKiBAZmlsZU92ZXJ2aWV3IEphdmFzY3JpcHQgU0hBLTI1NiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBBbiBvbGRlciB2ZXJzaW9uIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBwdWJsaWNcbiAqIGRvbWFpbiwgYnV0IHRoaXMgb25lIGlzIChjKSBFbWlseSBTdGFyaywgTWlrZSBIYW1idXJnLCBEYW4gQm9uZWgsXG4gKiBTdGFuZm9yZCBVbml2ZXJzaXR5IDIwMDgtMjAxMCBhbmQgQlNELWxpY2Vuc2VkIGZvciBsaWFiaWxpdHlcbiAqIHJlYXNvbnMuXG4gKlxuICogU3BlY2lhbCB0aGFua3MgdG8gQWxkbyBDb3J0ZXNpIGZvciBwb2ludGluZyBvdXQgc2V2ZXJhbCBidWdzIGluXG4gKiB0aGlzIGNvZGUuXG4gKlxuICogQGF1dGhvciBFbWlseSBTdGFya1xuICogQGF1dGhvciBNaWtlIEhhbWJ1cmdcbiAqIEBhdXRob3IgRGFuIEJvbmVoXG4gKi9cblxuLyoqXG4gKiBDb250ZXh0IGZvciBhIFNIQS0yNTYgb3BlcmF0aW9uIGluIHByb2dyZXNzLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAY2xhc3MgU2VjdXJlIEhhc2ggQWxnb3JpdGhtLCAyNTYgYml0cy5cbiAqL1xuc2pjbC5oYXNoLnNoYTI1NiA9IGZ1bmN0aW9uIChoYXNoKSB7XG4gIGlmICghdGhpcy5fa2V5WzBdKSB7IHRoaXMuX3ByZWNvbXB1dGUoKTsgfVxuICBpZiAoaGFzaCkge1xuICAgIHRoaXMuX2ggPSBoYXNoLl9oLnNsaWNlKDApO1xuICAgIHRoaXMuX2J1ZmZlciA9IGhhc2guX2J1ZmZlci5zbGljZSgwKTtcbiAgICB0aGlzLl9sZW5ndGggPSBoYXNoLl9sZW5ndGg7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEhhc2ggYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygd29yZHMuXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge2JpdEFycmF5fFN0cmluZ30gZGF0YSB0aGUgZGF0YSB0byBoYXNoLlxuICogQHJldHVybiB7Yml0QXJyYXl9IFRoZSBoYXNoIHZhbHVlLCBhbiBhcnJheSBvZiAxNiBiaWctZW5kaWFuIHdvcmRzLlxuICovXG5zamNsLmhhc2guc2hhMjU2Lmhhc2ggPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gKG5ldyBzamNsLmhhc2guc2hhMjU2KCkpLnVwZGF0ZShkYXRhKS5maW5hbGl6ZSgpO1xufTtcblxuc2pjbC5oYXNoLnNoYTI1Ni5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBUaGUgaGFzaCdzIGJsb2NrIHNpemUsIGluIGJpdHMuXG4gICAqIEBjb25zdGFudFxuICAgKi9cbiAgYmxvY2tTaXplOiA1MTIsXG4gICBcbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBoYXNoIHN0YXRlLlxuICAgKiBAcmV0dXJuIHRoaXNcbiAgICovXG4gIHJlc2V0OmZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9oID0gdGhpcy5faW5pdC5zbGljZSgwKTtcbiAgICB0aGlzLl9idWZmZXIgPSBbXTtcbiAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBcbiAgLyoqXG4gICAqIElucHV0IHNldmVyYWwgd29yZHMgdG8gdGhlIGhhc2guXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl8U3RyaW5nfSBkYXRhIHRoZSBkYXRhIHRvIGhhc2guXG4gICAqIEByZXR1cm4gdGhpc1xuICAgKi9cbiAgdXBkYXRlOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZGF0YSA9IHNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMoZGF0YSk7XG4gICAgfVxuICAgIHZhciBpLCBiID0gdGhpcy5fYnVmZmVyID0gc2pjbC5iaXRBcnJheS5jb25jYXQodGhpcy5fYnVmZmVyLCBkYXRhKSxcbiAgICAgICAgb2wgPSB0aGlzLl9sZW5ndGgsXG4gICAgICAgIG5sID0gdGhpcy5fbGVuZ3RoID0gb2wgKyBzamNsLmJpdEFycmF5LmJpdExlbmd0aChkYXRhKTtcbiAgICBmb3IgKGkgPSA1MTIrb2wgJiAtNTEyOyBpIDw9IG5sOyBpKz0gNTEyKSB7XG4gICAgICB0aGlzLl9ibG9jayhiLnNwbGljZSgwLDE2KSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBcbiAgLyoqXG4gICAqIENvbXBsZXRlIGhhc2hpbmcgYW5kIG91dHB1dCB0aGUgaGFzaCB2YWx1ZS5cbiAgICogQHJldHVybiB7Yml0QXJyYXl9IFRoZSBoYXNoIHZhbHVlLCBhbiBhcnJheSBvZiA4IGJpZy1lbmRpYW4gd29yZHMuXG4gICAqL1xuICBmaW5hbGl6ZTpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGksIGIgPSB0aGlzLl9idWZmZXIsIGggPSB0aGlzLl9oO1xuXG4gICAgLy8gUm91bmQgb3V0IGFuZCBwdXNoIHRoZSBidWZmZXJcbiAgICBiID0gc2pjbC5iaXRBcnJheS5jb25jYXQoYiwgW3NqY2wuYml0QXJyYXkucGFydGlhbCgxLDEpXSk7XG4gICAgXG4gICAgLy8gUm91bmQgb3V0IHRoZSBidWZmZXIgdG8gYSBtdWx0aXBsZSBvZiAxNiB3b3JkcywgbGVzcyB0aGUgMiBsZW5ndGggd29yZHMuXG4gICAgZm9yIChpID0gYi5sZW5ndGggKyAyOyBpICYgMTU7IGkrKykge1xuICAgICAgYi5wdXNoKDApO1xuICAgIH1cbiAgICBcbiAgICAvLyBhcHBlbmQgdGhlIGxlbmd0aFxuICAgIGIucHVzaChNYXRoLmZsb29yKHRoaXMuX2xlbmd0aCAvIDB4MTAwMDAwMDAwKSk7XG4gICAgYi5wdXNoKHRoaXMuX2xlbmd0aCB8IDApO1xuXG4gICAgd2hpbGUgKGIubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9ibG9jayhiLnNwbGljZSgwLDE2KSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHJldHVybiBoO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaGUgU0hBLTI1NiBpbml0aWFsaXphdGlvbiB2ZWN0b3IsIHRvIGJlIHByZWNvbXB1dGVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2luaXQ6W10sXG4gIC8qXG4gIF9pbml0OlsweDZhMDllNjY3LDB4YmI2N2FlODUsMHgzYzZlZjM3MiwweGE1NGZmNTNhLDB4NTEwZTUyN2YsMHg5YjA1Njg4YywweDFmODNkOWFiLDB4NWJlMGNkMTldLFxuICAqL1xuICBcbiAgLyoqXG4gICAqIFRoZSBTSEEtMjU2IGhhc2gga2V5LCB0byBiZSBwcmVjb21wdXRlZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9rZXk6W10sXG4gIC8qXG4gIF9rZXk6XG4gICAgWzB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gICAgIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gICAgIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gICAgIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gICAgIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gICAgIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gICAgIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gICAgIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJdLFxuICAqL1xuXG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIHByZWNvbXB1dGUgX2luaXQgYW5kIF9rZXkuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHJlY29tcHV0ZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBpID0gMCwgcHJpbWUgPSAyLCBmYWN0b3I7XG5cbiAgICBmdW5jdGlvbiBmcmFjKHgpIHsgcmV0dXJuICh4LU1hdGguZmxvb3IoeCkpICogMHgxMDAwMDAwMDAgfCAwOyB9XG5cbiAgICBvdXRlcjogZm9yICg7IGk8NjQ7IHByaW1lKyspIHtcbiAgICAgIGZvciAoZmFjdG9yPTI7IGZhY3RvcipmYWN0b3IgPD0gcHJpbWU7IGZhY3RvcisrKSB7XG4gICAgICAgIGlmIChwcmltZSAlIGZhY3RvciA9PT0gMCkge1xuICAgICAgICAgIC8vIG5vdCBhIHByaW1lXG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGk8OCkge1xuICAgICAgICB0aGlzLl9pbml0W2ldID0gZnJhYyhNYXRoLnBvdyhwcmltZSwgMS8yKSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9rZXlbaV0gPSBmcmFjKE1hdGgucG93KHByaW1lLCAxLzMpKTtcbiAgICAgIGkrKztcbiAgICB9XG4gIH0sXG4gIFxuICAvKipcbiAgICogUGVyZm9ybSBvbmUgY3ljbGUgb2YgU0hBLTI1Ni5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gd29yZHMgb25lIGJsb2NrIG9mIHdvcmRzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2Jsb2NrOmZ1bmN0aW9uICh3b3JkcykgeyAgXG4gICAgdmFyIGksIHRtcCwgYSwgYixcbiAgICAgIHcgPSB3b3Jkcy5zbGljZSgwKSxcbiAgICAgIGggPSB0aGlzLl9oLFxuICAgICAgayA9IHRoaXMuX2tleSxcbiAgICAgIGgwID0gaFswXSwgaDEgPSBoWzFdLCBoMiA9IGhbMl0sIGgzID0gaFszXSxcbiAgICAgIGg0ID0gaFs0XSwgaDUgPSBoWzVdLCBoNiA9IGhbNl0sIGg3ID0gaFs3XTtcblxuICAgIC8qIFJhdGlvbmFsZSBmb3IgcGxhY2VtZW50IG9mIHwwIDpcbiAgICAgKiBJZiBhIHZhbHVlIGNhbiBvdmVyZmxvdyBpcyBvcmlnaW5hbCAzMiBiaXRzIGJ5IGEgZmFjdG9yIG9mIG1vcmUgdGhhbiBhIGZld1xuICAgICAqIG1pbGxpb24gKDJeMjMgaXNoKSwgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGl0IG1pZ2h0IG92ZXJmbG93IHRoZVxuICAgICAqIDUzLWJpdCBtYW50aXNzYSBhbmQgbG9zZSBwcmVjaXNpb24uXG4gICAgICpcbiAgICAgKiBUbyBhdm9pZCB0aGlzLCB3ZSBjbGFtcCBiYWNrIHRvIDMyIGJpdHMgYnkgfCdpbmcgd2l0aCAwIG9uIGFueSB2YWx1ZSB0aGF0XG4gICAgICogcHJvcGFnYXRlcyBhcm91bmQgdGhlIGxvb3AsIGFuZCBvbiB0aGUgaGFzaCBzdGF0ZSBoW10uICBJIGRvbid0IGJlbGlldmVcbiAgICAgKiB0aGF0IHRoZSBjbGFtcHMgb24gaDQgYW5kIG9uIGgwIGFyZSBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCBpdCdzIGNsb3NlXG4gICAgICogKGZvciBoNCBhbnl3YXkpLCBhbmQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeS5cbiAgICAgKlxuICAgICAqIFRoZSBjbGFtcHMgb24gaFtdIGFyZSBuZWNlc3NhcnkgZm9yIHRoZSBvdXRwdXQgdG8gYmUgY29ycmVjdCBldmVuIGluIHRoZVxuICAgICAqIGNvbW1vbiBjYXNlIGFuZCBmb3Igc2hvcnQgaW5wdXRzLlxuICAgICAqL1xuICAgIGZvciAoaT0wOyBpPDY0OyBpKyspIHtcbiAgICAgIC8vIGxvYWQgdXAgdGhlIGlucHV0IHdvcmQgZm9yIHRoaXMgcm91bmRcbiAgICAgIGlmIChpPDE2KSB7XG4gICAgICAgIHRtcCA9IHdbaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhICAgPSB3WyhpKzEgKSAmIDE1XTtcbiAgICAgICAgYiAgID0gd1soaSsxNCkgJiAxNV07XG4gICAgICAgIHRtcCA9IHdbaSYxNV0gPSAoKGE+Pj43ICBeIGE+Pj4xOCBeIGE+Pj4zICBeIGE8PDI1IF4gYTw8MTQpICsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGI+Pj4xNyBeIGI+Pj4xOSBeIGI+Pj4xMCBeIGI8PDE1IF4gYjw8MTMpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICB3W2kmMTVdICsgd1soaSs5KSAmIDE1XSkgfCAwO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0bXAgPSAodG1wICsgaDcgKyAoaDQ+Pj42IF4gaDQ+Pj4xMSBeIGg0Pj4+MjUgXiBoNDw8MjYgXiBoNDw8MjEgXiBoNDw8NykgKyAgKGg2IF4gaDQmKGg1Xmg2KSkgKyBrW2ldKTsgLy8gfCAwO1xuICAgICAgXG4gICAgICAvLyBzaGlmdCByZWdpc3RlclxuICAgICAgaDcgPSBoNjsgaDYgPSBoNTsgaDUgPSBoNDtcbiAgICAgIGg0ID0gaDMgKyB0bXAgfCAwO1xuICAgICAgaDMgPSBoMjsgaDIgPSBoMTsgaDEgPSBoMDtcblxuICAgICAgaDAgPSAodG1wICsgICgoaDEmaDIpIF4gKGgzJihoMV5oMikpKSArIChoMT4+PjIgXiBoMT4+PjEzIF4gaDE+Pj4yMiBeIGgxPDwzMCBeIGgxPDwxOSBeIGgxPDwxMCkpIHwgMDtcbiAgICB9XG5cbiAgICBoWzBdID0gaFswXStoMCB8IDA7XG4gICAgaFsxXSA9IGhbMV0raDEgfCAwO1xuICAgIGhbMl0gPSBoWzJdK2gyIHwgMDtcbiAgICBoWzNdID0gaFszXStoMyB8IDA7XG4gICAgaFs0XSA9IGhbNF0raDQgfCAwO1xuICAgIGhbNV0gPSBoWzVdK2g1IHwgMDtcbiAgICBoWzZdID0gaFs2XStoNiB8IDA7XG4gICAgaFs3XSA9IGhbN10raDcgfCAwO1xuICB9XG59O1xuXG5cbi8qKiBAZmlsZU92ZXJ2aWV3IENDTSBtb2RlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIFNwZWNpYWwgdGhhbmtzIHRvIFJveSBOaWNob2xzb24gZm9yIHBvaW50aW5nIG91dCBhIGJ1ZyBpbiBvdXJcbiAqIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBhdXRob3IgRW1pbHkgU3RhcmtcbiAqIEBhdXRob3IgTWlrZSBIYW1idXJnXG4gKiBAYXV0aG9yIERhbiBCb25laFxuICovXG5cbi8qKiBAbmFtZXNwYWNlIENUUiBtb2RlIHdpdGggQ0JDIE1BQy4gKi9cbnNqY2wubW9kZS5jY20gPSB7XG4gIC8qKiBUaGUgbmFtZSBvZiB0aGUgbW9kZS5cbiAgICogQGNvbnN0YW50XG4gICAqL1xuICBuYW1lOiBcImNjbVwiLFxuICBcbiAgLyoqIEVuY3J5cHQgaW4gQ0NNIG1vZGUuXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZiBUaGUgcHNldWRvcmFuZG9tIGZ1bmN0aW9uLiAgSXQgbXVzdCBoYXZlIGEgYmxvY2sgc2l6ZSBvZiAxNiBieXRlcy5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gcGxhaW50ZXh0IFRoZSBwbGFpbnRleHQgZGF0YS5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gaXYgVGhlIGluaXRpYWxpemF0aW9uIHZhbHVlLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBbYWRhdGE9W11dIFRoZSBhdXRoZW50aWNhdGVkIGRhdGEuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbdGxlbj02NF0gdGhlIGRlc2lyZWQgdGFnIGxlbmd0aCwgaW4gYml0cy5cbiAgICogQHJldHVybiB7Yml0QXJyYXl9IFRoZSBlbmNyeXB0ZWQgZGF0YSwgYW4gYXJyYXkgb2YgYnl0ZXMuXG4gICAqL1xuICBlbmNyeXB0OiBmdW5jdGlvbihwcmYsIHBsYWludGV4dCwgaXYsIGFkYXRhLCB0bGVuKSB7XG4gICAgdmFyIEwsIGksIG91dCA9IHBsYWludGV4dC5zbGljZSgwKSwgdGFnLCB3PXNqY2wuYml0QXJyYXksIGl2bCA9IHcuYml0TGVuZ3RoKGl2KSAvIDgsIG9sID0gdy5iaXRMZW5ndGgob3V0KSAvIDg7XG4gICAgdGxlbiA9IHRsZW4gfHwgNjQ7XG4gICAgYWRhdGEgPSBhZGF0YSB8fCBbXTtcbiAgICBcbiAgICBpZiAoaXZsIDwgNykge1xuICAgICAgdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJjY206IGl2IG11c3QgYmUgYXQgbGVhc3QgNyBieXRlc1wiKTtcbiAgICB9XG4gICAgXG4gICAgLy8gY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBsZW5ndGhcbiAgICBmb3IgKEw9MjsgTDw0ICYmIG9sID4+PiA4Kkw7IEwrKykge31cbiAgICBpZiAoTCA8IDE1IC0gaXZsKSB7IEwgPSAxNS1pdmw7IH1cbiAgICBpdiA9IHcuY2xhbXAoaXYsOCooMTUtTCkpO1xuICAgIFxuICAgIC8vIGNvbXB1dGUgdGhlIHRhZ1xuICAgIHRhZyA9IHNqY2wubW9kZS5jY20uX2NvbXB1dGVUYWcocHJmLCBwbGFpbnRleHQsIGl2LCBhZGF0YSwgdGxlbiwgTCk7XG4gICAgXG4gICAgLy8gZW5jcnlwdFxuICAgIG91dCA9IHNqY2wubW9kZS5jY20uX2N0ck1vZGUocHJmLCBvdXQsIGl2LCB0YWcsIHRsZW4sIEwpO1xuICAgIFxuICAgIHJldHVybiB3LmNvbmNhdChvdXQuZGF0YSwgb3V0LnRhZyk7XG4gIH0sXG4gIFxuICAvKiogRGVjcnlwdCBpbiBDQ00gbW9kZS5cbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge09iamVjdH0gcHJmIFRoZSBwc2V1ZG9yYW5kb20gZnVuY3Rpb24uICBJdCBtdXN0IGhhdmUgYSBibG9jayBzaXplIG9mIDE2IGJ5dGVzLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0IGRhdGEuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IGl2IFRoZSBpbml0aWFsaXphdGlvbiB2YWx1ZS5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gW1tdXSBhZGF0YSBUaGUgYXV0aGVudGljYXRlZCBkYXRhLlxuICAgKiBAcGFyYW0ge051bWJlcn0gWzY0XSB0bGVuIHRoZSBkZXNpcmVkIHRhZyBsZW5ndGgsIGluIGJpdHMuXG4gICAqIEByZXR1cm4ge2JpdEFycmF5fSBUaGUgZGVjcnlwdGVkIGRhdGEuXG4gICAqL1xuICBkZWNyeXB0OiBmdW5jdGlvbihwcmYsIGNpcGhlcnRleHQsIGl2LCBhZGF0YSwgdGxlbikge1xuICAgIHRsZW4gPSB0bGVuIHx8IDY0O1xuICAgIGFkYXRhID0gYWRhdGEgfHwgW107XG4gICAgdmFyIEwsIGksIFxuICAgICAgICB3PXNqY2wuYml0QXJyYXksXG4gICAgICAgIGl2bCA9IHcuYml0TGVuZ3RoKGl2KSAvIDgsXG4gICAgICAgIG9sID0gdy5iaXRMZW5ndGgoY2lwaGVydGV4dCksIFxuICAgICAgICBvdXQgPSB3LmNsYW1wKGNpcGhlcnRleHQsIG9sIC0gdGxlbiksXG4gICAgICAgIHRhZyA9IHcuYml0U2xpY2UoY2lwaGVydGV4dCwgb2wgLSB0bGVuKSwgdGFnMjtcbiAgICBcblxuICAgIG9sID0gKG9sIC0gdGxlbikgLyA4O1xuICAgICAgICBcbiAgICBpZiAoaXZsIDwgNykge1xuICAgICAgdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJjY206IGl2IG11c3QgYmUgYXQgbGVhc3QgNyBieXRlc1wiKTtcbiAgICB9XG4gICAgXG4gICAgLy8gY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBsZW5ndGhcbiAgICBmb3IgKEw9MjsgTDw0ICYmIG9sID4+PiA4Kkw7IEwrKykge31cbiAgICBpZiAoTCA8IDE1IC0gaXZsKSB7IEwgPSAxNS1pdmw7IH1cbiAgICBpdiA9IHcuY2xhbXAoaXYsOCooMTUtTCkpO1xuICAgIFxuICAgIC8vIGRlY3J5cHRcbiAgICBvdXQgPSBzamNsLm1vZGUuY2NtLl9jdHJNb2RlKHByZiwgb3V0LCBpdiwgdGFnLCB0bGVuLCBMKTtcbiAgICBcbiAgICAvLyBjaGVjayB0aGUgdGFnXG4gICAgdGFnMiA9IHNqY2wubW9kZS5jY20uX2NvbXB1dGVUYWcocHJmLCBvdXQuZGF0YSwgaXYsIGFkYXRhLCB0bGVuLCBMKTtcbiAgICBpZiAoIXcuZXF1YWwob3V0LnRhZywgdGFnMikpIHtcbiAgICAgIHRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5jb3JydXB0KFwiY2NtOiB0YWcgZG9lc24ndCBtYXRjaFwiKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dC5kYXRhO1xuICB9LFxuXG4gIC8qIENvbXB1dGUgdGhlICh1bmVuY3J5cHRlZCkgYXV0aGVudGljYXRpb24gdGFnLCBhY2NvcmRpbmcgdG8gdGhlIENDTSBzcGVjaWZpY2F0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcmYgVGhlIHBzZXVkb3JhbmRvbSBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gcGxhaW50ZXh0IFRoZSBwbGFpbnRleHQgZGF0YS5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gaXYgVGhlIGluaXRpYWxpemF0aW9uIHZhbHVlLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBhZGF0YSBUaGUgYXV0aGVudGljYXRlZCBkYXRhLlxuICAgKiBAcGFyYW0ge051bWJlcn0gdGxlbiB0aGUgZGVzaXJlZCB0YWcgbGVuZ3RoLCBpbiBiaXRzLlxuICAgKiBAcmV0dXJuIHtiaXRBcnJheX0gVGhlIHRhZywgYnV0IG5vdCB5ZXQgZW5jcnlwdGVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvbXB1dGVUYWc6IGZ1bmN0aW9uKHByZiwgcGxhaW50ZXh0LCBpdiwgYWRhdGEsIHRsZW4sIEwpIHtcbiAgICAvLyBjb21wdXRlIEJbMF1cbiAgICB2YXIgcSwgbWFjLCBmaWVsZCA9IDAsIG9mZnNldCA9IDI0LCB0bXAsIGksIG1hY0RhdGEgPSBbXSwgdz1zamNsLmJpdEFycmF5LCB4b3IgPSB3Ll94b3I0O1xuXG4gICAgdGxlbiAvPSA4O1xuICBcbiAgICAvLyBjaGVjayB0YWcgbGVuZ3RoIGFuZCBtZXNzYWdlIGxlbmd0aFxuICAgIGlmICh0bGVuICUgMiB8fCB0bGVuIDwgNCB8fCB0bGVuID4gMTYpIHtcbiAgICAgIHRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiY2NtOiBpbnZhbGlkIHRhZyBsZW5ndGhcIik7XG4gICAgfVxuICBcbiAgICBpZiAoYWRhdGEubGVuZ3RoID4gMHhGRkZGRkZGRiB8fCBwbGFpbnRleHQubGVuZ3RoID4gMHhGRkZGRkZGRikge1xuICAgICAgLy8gSSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBleHRyYWN0aW5nIGhpZ2ggd29yZHMgZnJvbSBkb3VibGVzLlxuICAgICAgdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmJ1ZyhcImNjbTogY2FuJ3QgZGVhbCB3aXRoIDRHaUIgb3IgbW9yZSBkYXRhXCIpO1xuICAgIH1cblxuICAgIC8vIG1hYyB0aGUgZmxhZ3NcbiAgICBtYWMgPSBbdy5wYXJ0aWFsKDgsIChhZGF0YS5sZW5ndGggPyAxPDw2IDogMCkgfCAodGxlbi0yKSA8PCAyIHwgTC0xKV07XG5cbiAgICAvLyBtYWMgdGhlIGl2IGFuZCBsZW5ndGhcbiAgICBtYWMgPSB3LmNvbmNhdChtYWMsIGl2KTtcbiAgICBtYWNbM10gfD0gdy5iaXRMZW5ndGgocGxhaW50ZXh0KS84O1xuICAgIG1hYyA9IHByZi5lbmNyeXB0KG1hYyk7XG4gICAgXG4gIFxuICAgIGlmIChhZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vIG1hYyB0aGUgYXNzb2NpYXRlZCBkYXRhLiAgc3RhcnQgd2l0aCBpdHMgbGVuZ3RoLi4uXG4gICAgICB0bXAgPSB3LmJpdExlbmd0aChhZGF0YSkvODtcbiAgICAgIGlmICh0bXAgPD0gMHhGRUZGKSB7XG4gICAgICAgIG1hY0RhdGEgPSBbdy5wYXJ0aWFsKDE2LCB0bXApXTtcbiAgICAgIH0gZWxzZSBpZiAodG1wIDw9IDB4RkZGRkZGRkYpIHtcbiAgICAgICAgbWFjRGF0YSA9IHcuY29uY2F0KFt3LnBhcnRpYWwoMTYsMHhGRkZFKV0sIFt0bXBdKTtcbiAgICAgIH0gLy8gZWxzZSAuLi5cbiAgICBcbiAgICAgIC8vIG1hYyB0aGUgZGF0YSBpdHNlbGZcbiAgICAgIG1hY0RhdGEgPSB3LmNvbmNhdChtYWNEYXRhLCBhZGF0YSk7XG4gICAgICBmb3IgKGk9MDsgaTxtYWNEYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIG1hYyA9IHByZi5lbmNyeXB0KHhvcihtYWMsIG1hY0RhdGEuc2xpY2UoaSxpKzQpLmNvbmNhdChbMCwwLDBdKSkpO1xuICAgICAgfVxuICAgIH1cbiAgXG4gICAgLy8gbWFjIHRoZSBwbGFpbnRleHRcbiAgICBmb3IgKGk9MDsgaTxwbGFpbnRleHQubGVuZ3RoOyBpKz00KSB7XG4gICAgICBtYWMgPSBwcmYuZW5jcnlwdCh4b3IobWFjLCBwbGFpbnRleHQuc2xpY2UoaSxpKzQpLmNvbmNhdChbMCwwLDBdKSkpO1xuICAgIH1cblxuICAgIHJldHVybiB3LmNsYW1wKG1hYywgdGxlbiAqIDgpO1xuICB9LFxuXG4gIC8qKiBDQ00gQ1RSIG1vZGUuXG4gICAqIEVuY3J5cHQgb3IgZGVjcnlwdCBkYXRhIGFuZCB0YWcgd2l0aCB0aGUgcHJmIGluIENDTS1zdHlsZSBDVFIgbW9kZS5cbiAgICogTWF5IG11dGF0ZSBpdHMgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJmIFRoZSBQUkYuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IGRhdGEgVGhlIGRhdGEgdG8gYmUgZW5jcnlwdGVkIG9yIGRlY3J5cHRlZC5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gaXYgVGhlIGluaXRpYWxpemF0aW9uIHZlY3Rvci5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gdGFnIFRoZSBhdXRoZW50aWNhdGlvbiB0YWcuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0bGVuIFRoZSBsZW5ndGggb2YgdGggZXRhZywgaW4gYml0cy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IEwgVGhlIENDTSBMIHZhbHVlLlxuICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIGRhdGEgYW5kIHRhZywgdGhlIGVuL2RlY3J5cHRpb24gb2YgZGF0YSBhbmQgdGFnIHZhbHVlcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jdHJNb2RlOiBmdW5jdGlvbihwcmYsIGRhdGEsIGl2LCB0YWcsIHRsZW4sIEwpIHtcbiAgICB2YXIgZW5jLCBpLCB3PXNqY2wuYml0QXJyYXksIHhvciA9IHcuX3hvcjQsIGN0ciwgYiwgbCA9IGRhdGEubGVuZ3RoLCBibD13LmJpdExlbmd0aChkYXRhKTtcblxuICAgIC8vIHN0YXJ0IHRoZSBjdHJcbiAgICBjdHIgPSB3LmNvbmNhdChbdy5wYXJ0aWFsKDgsTC0xKV0saXYpLmNvbmNhdChbMCwwLDBdKS5zbGljZSgwLDQpO1xuICAgIFxuICAgIC8vIGVuL2RlY3J5cHQgdGhlIHRhZ1xuICAgIHRhZyA9IHcuYml0U2xpY2UoeG9yKHRhZyxwcmYuZW5jcnlwdChjdHIpKSwgMCwgdGxlbik7XG4gIFxuICAgIC8vIGVuL2RlY3J5cHQgdGhlIGRhdGFcbiAgICBpZiAoIWwpIHsgcmV0dXJuIHt0YWc6dGFnLCBkYXRhOltdfTsgfVxuICAgIFxuICAgIGZvciAoaT0wOyBpPGw7IGkrPTQpIHtcbiAgICAgIGN0clszXSsrO1xuICAgICAgZW5jID0gcHJmLmVuY3J5cHQoY3RyKTtcbiAgICAgIGRhdGFbaV0gICBePSBlbmNbMF07XG4gICAgICBkYXRhW2krMV0gXj0gZW5jWzFdO1xuICAgICAgZGF0YVtpKzJdIF49IGVuY1syXTtcbiAgICAgIGRhdGFbaSszXSBePSBlbmNbM107XG4gICAgfVxuICAgIHJldHVybiB7IHRhZzp0YWcsIGRhdGE6dy5jbGFtcChkYXRhLGJsKSB9O1xuICB9XG59O1xuLyoqIEBmaWxlT3ZlcnZpZXcgT0NCIDIuMCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIEBhdXRob3IgRW1pbHkgU3RhcmtcbiAqIEBhdXRob3IgTWlrZSBIYW1idXJnXG4gKiBAYXV0aG9yIERhbiBCb25laFxuICovXG5cbi8qKiBAbmFtZXNwYWNlXG4gKiBQaGlsIFJvZ2F3YXkncyBPZmZzZXQgQ29kZUJvb2sgbW9kZSwgdmVyc2lvbiAyLjAuXG4gKiBNYXkgYmUgY292ZXJlZCBieSBVUyBhbmQgaW50ZXJuYXRpb25hbCBwYXRlbnRzLlxuICpcbiAqIEBhdXRob3IgRW1pbHkgU3RhcmtcbiAqIEBhdXRob3IgTWlrZSBIYW1idXJnXG4gKiBAYXV0aG9yIERhbiBCb25laFxuICovXG5zamNsLm1vZGUub2NiMiA9IHtcbiAgLyoqIFRoZSBuYW1lIG9mIHRoZSBtb2RlLlxuICAgKiBAY29uc3RhbnRcbiAgICovXG4gIG5hbWU6IFwib2NiMlwiLFxuICBcbiAgLyoqIEVuY3J5cHQgaW4gT0NCIG1vZGUsIHZlcnNpb24gMi4wLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJwIFRoZSBibG9jayBjaXBoZXIuICBJdCBtdXN0IGhhdmUgYSBibG9jayBzaXplIG9mIDE2IGJ5dGVzLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBwbGFpbnRleHQgVGhlIHBsYWludGV4dCBkYXRhLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBpdiBUaGUgaW5pdGlhbGl6YXRpb24gdmFsdWUuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IFthZGF0YT1bXV0gVGhlIGF1dGhlbnRpY2F0ZWQgZGF0YS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFt0bGVuPTY0XSB0aGUgZGVzaXJlZCB0YWcgbGVuZ3RoLCBpbiBiaXRzLlxuICAgKiBAcGFyYW0gW2ZhbHNlXSBwcmVtYWMgMSBpZiB0aGUgYXV0aGVudGljYXRpb24gZGF0YSBpcyBwcmUtbWFjY2VkIHdpdGggUE1BQy5cbiAgICogQHJldHVybiBUaGUgZW5jcnlwdGVkIGRhdGEsIGFuIGFycmF5IG9mIGJ5dGVzLlxuICAgKiBAdGhyb3dzIHtzamNsLmV4Y2VwdGlvbi5pbnZhbGlkfSBpZiB0aGUgSVYgaXNuJ3QgZXhhY3RseSAxMjggYml0cy5cbiAgICovXG4gIGVuY3J5cHQ6IGZ1bmN0aW9uKHBycCwgcGxhaW50ZXh0LCBpdiwgYWRhdGEsIHRsZW4sIHByZW1hYykge1xuICAgIGlmIChzamNsLmJpdEFycmF5LmJpdExlbmd0aChpdikgIT09IDEyOCkge1xuICAgICAgdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJvY2IgaXYgbXVzdCBiZSAxMjggYml0c1wiKTtcbiAgICB9XG4gICAgdmFyIGksXG4gICAgICAgIHRpbWVzMiA9IHNqY2wubW9kZS5vY2IyLl90aW1lczIsXG4gICAgICAgIHcgPSBzamNsLmJpdEFycmF5LFxuICAgICAgICB4b3IgPSB3Ll94b3I0LFxuICAgICAgICBjaGVja3N1bSA9IFswLDAsMCwwXSxcbiAgICAgICAgZGVsdGEgPSB0aW1lczIocHJwLmVuY3J5cHQoaXYpKSxcbiAgICAgICAgYmksIGJsLFxuICAgICAgICBvdXRwdXQgPSBbXSxcbiAgICAgICAgcGFkO1xuICAgICAgICBcbiAgICBhZGF0YSA9IGFkYXRhIHx8IFtdO1xuICAgIHRsZW4gID0gdGxlbiB8fCA2NDtcbiAgXG4gICAgZm9yIChpPTA7IGkrNCA8IHBsYWludGV4dC5sZW5ndGg7IGkrPTQpIHtcbiAgICAgIC8qIEVuY3J5cHQgYSBub24tZmluYWwgYmxvY2sgKi9cbiAgICAgIGJpID0gcGxhaW50ZXh0LnNsaWNlKGksaSs0KTtcbiAgICAgIGNoZWNrc3VtID0geG9yKGNoZWNrc3VtLCBiaSk7XG4gICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KHhvcihkZWx0YSxwcnAuZW5jcnlwdCh4b3IoZGVsdGEsIGJpKSkpKTtcbiAgICAgIGRlbHRhID0gdGltZXMyKGRlbHRhKTtcbiAgICB9XG4gICAgXG4gICAgLyogQ2hvcCBvdXQgdGhlIGZpbmFsIGJsb2NrICovXG4gICAgYmkgPSBwbGFpbnRleHQuc2xpY2UoaSk7XG4gICAgYmwgPSB3LmJpdExlbmd0aChiaSk7XG4gICAgcGFkID0gcHJwLmVuY3J5cHQoeG9yKGRlbHRhLFswLDAsMCxibF0pKTtcbiAgICBiaSA9IHcuY2xhbXAoeG9yKGJpLmNvbmNhdChbMCwwLDBdKSxwYWQpLCBibCk7XG4gICAgXG4gICAgLyogQ2hlY2tzdW0gdGhlIGZpbmFsIGJsb2NrLCBhbmQgZmluYWxpemUgdGhlIGNoZWNrc3VtICovXG4gICAgY2hlY2tzdW0gPSB4b3IoY2hlY2tzdW0seG9yKGJpLmNvbmNhdChbMCwwLDBdKSxwYWQpKTtcbiAgICBjaGVja3N1bSA9IHBycC5lbmNyeXB0KHhvcihjaGVja3N1bSx4b3IoZGVsdGEsdGltZXMyKGRlbHRhKSkpKTtcbiAgICBcbiAgICAvKiBNQUMgdGhlIGhlYWRlciAqL1xuICAgIGlmIChhZGF0YS5sZW5ndGgpIHtcbiAgICAgIGNoZWNrc3VtID0geG9yKGNoZWNrc3VtLCBwcmVtYWMgPyBhZGF0YSA6IHNqY2wubW9kZS5vY2IyLnBtYWMocHJwLCBhZGF0YSkpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gb3V0cHV0LmNvbmNhdCh3LmNvbmNhdChiaSwgdy5jbGFtcChjaGVja3N1bSwgdGxlbikpKTtcbiAgfSxcbiAgXG4gIC8qKiBEZWNyeXB0IGluIE9DQiBtb2RlLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJwIFRoZSBibG9jayBjaXBoZXIuICBJdCBtdXN0IGhhdmUgYSBibG9jayBzaXplIG9mIDE2IGJ5dGVzLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0IGRhdGEuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IGl2IFRoZSBpbml0aWFsaXphdGlvbiB2YWx1ZS5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gW2FkYXRhPVtdXSBUaGUgYXV0aGVudGljYXRlZCBkYXRhLlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3RsZW49NjRdIHRoZSBkZXNpcmVkIHRhZyBsZW5ndGgsIGluIGJpdHMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZW1hYz1mYWxzZV0gdHJ1ZSBpZiB0aGUgYXV0aGVudGljYXRpb24gZGF0YSBpcyBwcmUtbWFjY2VkIHdpdGggUE1BQy5cbiAgICogQHJldHVybiBUaGUgZGVjcnlwdGVkIGRhdGEsIGFuIGFycmF5IG9mIGJ5dGVzLlxuICAgKiBAdGhyb3dzIHtzamNsLmV4Y2VwdGlvbi5pbnZhbGlkfSBpZiB0aGUgSVYgaXNuJ3QgZXhhY3RseSAxMjggYml0cy5cbiAgICogQHRocm93cyB7c2pjbC5leGNlcHRpb24uY29ycnVwdH0gaWYgaWYgdGhlIG1lc3NhZ2UgaXMgY29ycnVwdC5cbiAgICovXG4gIGRlY3J5cHQ6IGZ1bmN0aW9uKHBycCwgY2lwaGVydGV4dCwgaXYsIGFkYXRhLCB0bGVuLCBwcmVtYWMpIHtcbiAgICBpZiAoc2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoaXYpICE9PSAxMjgpIHtcbiAgICAgIHRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwib2NiIGl2IG11c3QgYmUgMTI4IGJpdHNcIik7XG4gICAgfVxuICAgIHRsZW4gID0gdGxlbiB8fCA2NDtcbiAgICB2YXIgaSxcbiAgICAgICAgdGltZXMyID0gc2pjbC5tb2RlLm9jYjIuX3RpbWVzMixcbiAgICAgICAgdyA9IHNqY2wuYml0QXJyYXksXG4gICAgICAgIHhvciA9IHcuX3hvcjQsXG4gICAgICAgIGNoZWNrc3VtID0gWzAsMCwwLDBdLFxuICAgICAgICBkZWx0YSA9IHRpbWVzMihwcnAuZW5jcnlwdChpdikpLFxuICAgICAgICBiaSwgYmwsXG4gICAgICAgIGxlbiA9IHNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKGNpcGhlcnRleHQpIC0gdGxlbixcbiAgICAgICAgb3V0cHV0ID0gW10sXG4gICAgICAgIHBhZDtcbiAgICAgICAgXG4gICAgYWRhdGEgPSBhZGF0YSB8fCBbXTtcbiAgXG4gICAgZm9yIChpPTA7IGkrNCA8IGxlbi8zMjsgaSs9NCkge1xuICAgICAgLyogRGVjcnlwdCBhIG5vbi1maW5hbCBibG9jayAqL1xuICAgICAgYmkgPSB4b3IoZGVsdGEsIHBycC5kZWNyeXB0KHhvcihkZWx0YSwgY2lwaGVydGV4dC5zbGljZShpLGkrNCkpKSk7XG4gICAgICBjaGVja3N1bSA9IHhvcihjaGVja3N1bSwgYmkpO1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChiaSk7XG4gICAgICBkZWx0YSA9IHRpbWVzMihkZWx0YSk7XG4gICAgfVxuICAgIFxuICAgIC8qIENob3Agb3V0IGFuZCBkZWNyeXB0IHRoZSBmaW5hbCBibG9jayAqL1xuICAgIGJsID0gbGVuLWkqMzI7XG4gICAgcGFkID0gcHJwLmVuY3J5cHQoeG9yKGRlbHRhLFswLDAsMCxibF0pKTtcbiAgICBiaSA9IHhvcihwYWQsIHcuY2xhbXAoY2lwaGVydGV4dC5zbGljZShpKSxibCkuY29uY2F0KFswLDAsMF0pKTtcbiAgICBcbiAgICAvKiBDaGVja3N1bSB0aGUgZmluYWwgYmxvY2ssIGFuZCBmaW5hbGl6ZSB0aGUgY2hlY2tzdW0gKi9cbiAgICBjaGVja3N1bSA9IHhvcihjaGVja3N1bSwgYmkpO1xuICAgIGNoZWNrc3VtID0gcHJwLmVuY3J5cHQoeG9yKGNoZWNrc3VtLCB4b3IoZGVsdGEsIHRpbWVzMihkZWx0YSkpKSk7XG4gICAgXG4gICAgLyogTUFDIHRoZSBoZWFkZXIgKi9cbiAgICBpZiAoYWRhdGEubGVuZ3RoKSB7XG4gICAgICBjaGVja3N1bSA9IHhvcihjaGVja3N1bSwgcHJlbWFjID8gYWRhdGEgOiBzamNsLm1vZGUub2NiMi5wbWFjKHBycCwgYWRhdGEpKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF3LmVxdWFsKHcuY2xhbXAoY2hlY2tzdW0sIHRsZW4pLCB3LmJpdFNsaWNlKGNpcGhlcnRleHQsIGxlbikpKSB7XG4gICAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uY29ycnVwdChcIm9jYjogdGFnIGRvZXNuJ3QgbWF0Y2hcIik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBvdXRwdXQuY29uY2F0KHcuY2xhbXAoYmksYmwpKTtcbiAgfSxcbiAgXG4gIC8qKiBQTUFDIGF1dGhlbnRpY2F0aW9uIGZvciBPQ0IgYXNzb2NpYXRlZCBkYXRhLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJwIFRoZSBibG9jayBjaXBoZXIuICBJdCBtdXN0IGhhdmUgYSBibG9jayBzaXplIG9mIDE2IGJ5dGVzLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBhZGF0YSBUaGUgYXV0aGVudGljYXRlZCBkYXRhLlxuICAgKi9cbiAgcG1hYzogZnVuY3Rpb24ocHJwLCBhZGF0YSkge1xuICAgIHZhciBpLFxuICAgICAgICB0aW1lczIgPSBzamNsLm1vZGUub2NiMi5fdGltZXMyLFxuICAgICAgICB3ID0gc2pjbC5iaXRBcnJheSxcbiAgICAgICAgeG9yID0gdy5feG9yNCxcbiAgICAgICAgY2hlY2tzdW0gPSBbMCwwLDAsMF0sXG4gICAgICAgIGRlbHRhID0gcHJwLmVuY3J5cHQoWzAsMCwwLDBdKSxcbiAgICAgICAgYmk7XG4gICAgICAgIFxuICAgIGRlbHRhID0geG9yKGRlbHRhLHRpbWVzMih0aW1lczIoZGVsdGEpKSk7XG4gXG4gICAgZm9yIChpPTA7IGkrNDxhZGF0YS5sZW5ndGg7IGkrPTQpIHtcbiAgICAgIGRlbHRhID0gdGltZXMyKGRlbHRhKTtcbiAgICAgIGNoZWNrc3VtID0geG9yKGNoZWNrc3VtLCBwcnAuZW5jcnlwdCh4b3IoZGVsdGEsIGFkYXRhLnNsaWNlKGksaSs0KSkpKTtcbiAgICB9XG4gICAgXG4gICAgYmkgPSBhZGF0YS5zbGljZShpKTtcbiAgICBpZiAody5iaXRMZW5ndGgoYmkpIDwgMTI4KSB7XG4gICAgICBkZWx0YSA9IHhvcihkZWx0YSx0aW1lczIoZGVsdGEpKTtcbiAgICAgIGJpID0gdy5jb25jYXQoYmksWzB4ODAwMDAwMDB8MCwwLDAsMF0pO1xuICAgIH1cbiAgICBjaGVja3N1bSA9IHhvcihjaGVja3N1bSwgYmkpO1xuICAgIHJldHVybiBwcnAuZW5jcnlwdCh4b3IodGltZXMyKHhvcihkZWx0YSx0aW1lczIoZGVsdGEpKSksIGNoZWNrc3VtKSk7XG4gIH0sXG4gIFxuICAvKiogRG91YmxlIGEgYmxvY2sgb2Ygd29yZHMsIE9DQiBzdHlsZS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF90aW1lczI6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gW3hbMF08PDEgXiB4WzFdPj4+MzEsXG4gICAgICAgICAgICB4WzFdPDwxIF4geFsyXT4+PjMxLFxuICAgICAgICAgICAgeFsyXTw8MSBeIHhbM10+Pj4zMSxcbiAgICAgICAgICAgIHhbM108PDEgXiAoeFswXT4+PjMxKSoweDg3XTtcbiAgfVxufTtcbi8qKiBAZmlsZU92ZXJ2aWV3IEdDTSBtb2RlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBhdXRob3IgSnVobyBWw6Row6QtSGVydHR1YVxuICovXG5cbi8qKiBAbmFtZXNwYWNlIEdhbG9pcy9Db3VudGVyIG1vZGUuICovXG5zamNsLm1vZGUuZ2NtID0ge1xuICAvKiogVGhlIG5hbWUgb2YgdGhlIG1vZGUuXG4gICAqIEBjb25zdGFudFxuICAgKi9cbiAgbmFtZTogXCJnY21cIixcbiAgXG4gIC8qKiBFbmNyeXB0IGluIEdDTSBtb2RlLlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcmYgVGhlIHBzZXVkb3JhbmRvbSBmdW5jdGlvbi4gIEl0IG11c3QgaGF2ZSBhIGJsb2NrIHNpemUgb2YgMTYgYnl0ZXMuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IHBsYWludGV4dCBUaGUgcGxhaW50ZXh0IGRhdGEuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IGl2IFRoZSBpbml0aWFsaXphdGlvbiB2YWx1ZS5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gW2FkYXRhPVtdXSBUaGUgYXV0aGVudGljYXRlZCBkYXRhLlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3RsZW49MTI4XSBUaGUgZGVzaXJlZCB0YWcgbGVuZ3RoLCBpbiBiaXRzLlxuICAgKiBAcmV0dXJuIHtiaXRBcnJheX0gVGhlIGVuY3J5cHRlZCBkYXRhLCBhbiBhcnJheSBvZiBieXRlcy5cbiAgICovXG4gIGVuY3J5cHQ6IGZ1bmN0aW9uIChwcmYsIHBsYWludGV4dCwgaXYsIGFkYXRhLCB0bGVuKSB7XG4gICAgdmFyIG91dCwgZGF0YSA9IHBsYWludGV4dC5zbGljZSgwKSwgdz1zamNsLmJpdEFycmF5O1xuICAgIHRsZW4gPSB0bGVuIHx8IDEyODtcbiAgICBhZGF0YSA9IGFkYXRhIHx8IFtdO1xuXG4gICAgLy8gZW5jcnlwdCBhbmQgdGFnXG4gICAgb3V0ID0gc2pjbC5tb2RlLmdjbS5fY3RyTW9kZSh0cnVlLCBwcmYsIGRhdGEsIGFkYXRhLCBpdiwgdGxlbik7XG5cbiAgICByZXR1cm4gdy5jb25jYXQob3V0LmRhdGEsIG91dC50YWcpO1xuICB9LFxuICBcbiAgLyoqIERlY3J5cHQgaW4gR0NNIG1vZGUuXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZiBUaGUgcHNldWRvcmFuZG9tIGZ1bmN0aW9uLiAgSXQgbXVzdCBoYXZlIGEgYmxvY2sgc2l6ZSBvZiAxNiBieXRlcy5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dCBkYXRhLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBpdiBUaGUgaW5pdGlhbGl6YXRpb24gdmFsdWUuXG4gICAqIEBwYXJhbSB7Yml0QXJyYXl9IFthZGF0YT1bXV0gVGhlIGF1dGhlbnRpY2F0ZWQgZGF0YS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFt0bGVuPTEyOF0gVGhlIGRlc2lyZWQgdGFnIGxlbmd0aCwgaW4gYml0cy5cbiAgICogQHJldHVybiB7Yml0QXJyYXl9IFRoZSBkZWNyeXB0ZWQgZGF0YS5cbiAgICovXG4gIGRlY3J5cHQ6IGZ1bmN0aW9uIChwcmYsIGNpcGhlcnRleHQsIGl2LCBhZGF0YSwgdGxlbikge1xuICAgIHZhciBvdXQsIGRhdGEgPSBjaXBoZXJ0ZXh0LnNsaWNlKDApLCB0YWcsIHc9c2pjbC5iaXRBcnJheSwgbD13LmJpdExlbmd0aChkYXRhKTtcbiAgICB0bGVuID0gdGxlbiB8fCAxMjg7XG4gICAgYWRhdGEgPSBhZGF0YSB8fCBbXTtcblxuICAgIC8vIFNsaWNlIHRhZyBvdXQgb2YgZGF0YVxuICAgIGlmICh0bGVuIDw9IGwpIHtcbiAgICAgIHRhZyA9IHcuYml0U2xpY2UoZGF0YSwgbC10bGVuKTtcbiAgICAgIGRhdGEgPSB3LmJpdFNsaWNlKGRhdGEsIDAsIGwtdGxlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZyA9IGRhdGE7XG4gICAgICBkYXRhID0gW107XG4gICAgfVxuXG4gICAgLy8gZGVjcnlwdCBhbmQgdGFnXG4gICAgb3V0ID0gc2pjbC5tb2RlLmdjbS5fY3RyTW9kZShmYWxzZSwgcHJmLCBkYXRhLCBhZGF0YSwgaXYsIHRsZW4pO1xuXG4gICAgaWYgKCF3LmVxdWFsKG91dC50YWcsIHRhZykpIHtcbiAgICAgIHRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5jb3JydXB0KFwiZ2NtOiB0YWcgZG9lc24ndCBtYXRjaFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dC5kYXRhO1xuICB9LFxuXG4gIC8qIENvbXB1dGUgdGhlIGdhbG9pcyBtdWx0aXBsaWNhdGlvbiBvZiBYIGFuZCBZXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZ2Fsb2lzTXVsdGlwbHk6IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgdmFyIGksIGosIHhpLCBaaSwgVmksIGxzYl9WaSwgdz1zamNsLmJpdEFycmF5LCB4b3I9dy5feG9yNDtcblxuICAgIFppID0gWzAsMCwwLDBdO1xuICAgIFZpID0geS5zbGljZSgwKTtcblxuICAgIC8vIEJsb2NrIHNpemUgaXMgMTI4IGJpdHMsIHJ1biAxMjggdGltZXMgdG8gZ2V0IFpfMTI4XG4gICAgZm9yIChpPTA7IGk8MTI4OyBpKyspIHtcbiAgICAgIHhpID0gKHhbTWF0aC5mbG9vcihpLzMyKV0gJiAoMSA8PCAoMzEtaSUzMikpKSAhPT0gMDtcbiAgICAgIGlmICh4aSkge1xuICAgICAgICAvLyBaX2krMSA9IFpfaSBeIFZfaVxuICAgICAgICBaaSA9IHhvcihaaSwgVmkpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGUgdmFsdWUgb2YgTFNCKFZfaSlcbiAgICAgIGxzYl9WaSA9IChWaVszXSAmIDEpICE9PSAwO1xuXG4gICAgICAvLyBWX2krMSA9IFZfaSA+PiAxXG4gICAgICBmb3IgKGo9Mzsgaj4wOyBqLS0pIHtcbiAgICAgICAgVmlbal0gPSAoVmlbal0gPj4+IDEpIHwgKChWaVtqLTFdJjEpIDw8IDMxKTtcbiAgICAgIH1cbiAgICAgIFZpWzBdID0gVmlbMF0gPj4+IDE7XG5cbiAgICAgIC8vIElmIExTQihWX2kpIGlzIDEsIFZfaSsxID0gKFZfaSA+PiAxKSBeIFJcbiAgICAgIGlmIChsc2JfVmkpIHtcbiAgICAgICAgVmlbMF0gPSBWaVswXSBeICgweGUxIDw8IDI0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFppO1xuICB9LFxuXG4gIF9naGFzaDogZnVuY3Rpb24oSCwgWTAsIGRhdGEpIHtcbiAgICB2YXIgWWksIGksIGwgPSBkYXRhLmxlbmd0aDtcblxuICAgIFlpID0gWTAuc2xpY2UoMCk7XG4gICAgZm9yIChpPTA7IGk8bDsgaSs9NCkge1xuICAgICAgWWlbMF0gXj0gMHhmZmZmZmZmZiZkYXRhW2ldO1xuICAgICAgWWlbMV0gXj0gMHhmZmZmZmZmZiZkYXRhW2krMV07XG4gICAgICBZaVsyXSBePSAweGZmZmZmZmZmJmRhdGFbaSsyXTtcbiAgICAgIFlpWzNdIF49IDB4ZmZmZmZmZmYmZGF0YVtpKzNdO1xuICAgICAgWWkgPSBzamNsLm1vZGUuZ2NtLl9nYWxvaXNNdWx0aXBseShZaSwgSCk7XG4gICAgfVxuICAgIHJldHVybiBZaTtcbiAgfSxcblxuICAvKiogR0NNIENUUiBtb2RlLlxuICAgKiBFbmNyeXB0IG9yIGRlY3J5cHQgZGF0YSBhbmQgdGFnIHdpdGggdGhlIHByZiBpbiBHQ00tc3R5bGUgQ1RSIG1vZGUuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5jcnlwdCBUcnVlIGlmIGVuY3J5cHQsIGZhbHNlIGlmIGRlY3J5cHQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcmYgVGhlIFBSRi5cbiAgICogQHBhcmFtIHtiaXRBcnJheX0gZGF0YSBUaGUgZGF0YSB0byBiZSBlbmNyeXB0ZWQgb3IgZGVjcnlwdGVkLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBpdiBUaGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yLlxuICAgKiBAcGFyYW0ge2JpdEFycmF5fSBhZGF0YSBUaGUgYXNzb2NpYXRlZCBkYXRhIHRvIGJlIHRhZ2dlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRsZW4gVGhlIGxlbmd0aCBvZiB0aGUgdGFnLCBpbiBiaXRzLlxuICAgKi9cbiAgX2N0ck1vZGU6IGZ1bmN0aW9uKGVuY3J5cHQsIHByZiwgZGF0YSwgYWRhdGEsIGl2LCB0bGVuKSB7XG4gICAgdmFyIEgsIEowLCBTMCwgZW5jLCBpLCBjdHIsIHRhZywgbGFzdCwgbCwgYmwsIGFibCwgaXZibCwgdz1zamNsLmJpdEFycmF5LCB4b3I9dy5feG9yNDtcblxuICAgIC8vIENhbGN1bGF0ZSBkYXRhIGxlbmd0aHNcbiAgICBsID0gZGF0YS5sZW5ndGg7XG4gICAgYmwgPSB3LmJpdExlbmd0aChkYXRhKTtcbiAgICBhYmwgPSB3LmJpdExlbmd0aChhZGF0YSk7XG4gICAgaXZibCA9IHcuYml0TGVuZ3RoKGl2KTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcGFyYW1ldGVyc1xuICAgIEggPSBwcmYuZW5jcnlwdChbMCwwLDAsMF0pO1xuICAgIGlmIChpdmJsID09PSA5Nikge1xuICAgICAgSjAgPSBpdi5zbGljZSgwKTtcbiAgICAgIEowID0gdy5jb25jYXQoSjAsIFsxXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEowID0gc2pjbC5tb2RlLmdjbS5fZ2hhc2goSCwgWzAsMCwwLDBdLCBpdik7XG4gICAgICBKMCA9IHNqY2wubW9kZS5nY20uX2doYXNoKEgsIEowLCBbMCwwLE1hdGguZmxvb3IoaXZibC8weDEwMDAwMDAwMCksaXZibCYweGZmZmZmZmZmXSk7XG4gICAgfVxuICAgIFMwID0gc2pjbC5tb2RlLmdjbS5fZ2hhc2goSCwgWzAsMCwwLDBdLCBhZGF0YSk7XG5cbiAgICAvLyBJbml0aWFsaXplIGN0ciBhbmQgdGFnXG4gICAgY3RyID0gSjAuc2xpY2UoMCk7XG4gICAgdGFnID0gUzAuc2xpY2UoMCk7XG5cbiAgICAvLyBJZiBkZWNyeXB0aW5nLCBjYWxjdWxhdGUgaGFzaFxuICAgIGlmICghZW5jcnlwdCkge1xuICAgICAgdGFnID0gc2pjbC5tb2RlLmdjbS5fZ2hhc2goSCwgUzAsIGRhdGEpO1xuICAgIH1cblxuICAgIC8vIEVuY3J5cHQgYWxsIHRoZSBkYXRhXG4gICAgZm9yIChpPTA7IGk8bDsgaSs9NCkge1xuICAgICAgIGN0clszXSsrO1xuICAgICAgIGVuYyA9IHByZi5lbmNyeXB0KGN0cik7XG4gICAgICAgZGF0YVtpXSAgIF49IGVuY1swXTtcbiAgICAgICBkYXRhW2krMV0gXj0gZW5jWzFdO1xuICAgICAgIGRhdGFbaSsyXSBePSBlbmNbMl07XG4gICAgICAgZGF0YVtpKzNdIF49IGVuY1szXTtcbiAgICB9XG4gICAgZGF0YSA9IHcuY2xhbXAoZGF0YSwgYmwpO1xuXG4gICAgLy8gSWYgZW5jcnlwdGluZywgY2FsY3VsYXRlIGhhc2hcbiAgICBpZiAoZW5jcnlwdCkge1xuICAgICAgdGFnID0gc2pjbC5tb2RlLmdjbS5fZ2hhc2goSCwgUzAsIGRhdGEpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBsYXN0IGJsb2NrIGZyb20gYml0IGxlbmd0aHMsIHVnbHkgYmVjYXVzZSBiaXR3aXNlIG9wZXJhdGlvbnMgYXJlIDMyLWJpdFxuICAgIGxhc3QgPSBbXG4gICAgICBNYXRoLmZsb29yKGFibC8weDEwMDAwMDAwMCksIGFibCYweGZmZmZmZmZmLFxuICAgICAgTWF0aC5mbG9vcihibC8weDEwMDAwMDAwMCksIGJsJjB4ZmZmZmZmZmZcbiAgICBdO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBmaW5hbCB0YWcgYmxvY2tcbiAgICB0YWcgPSBzamNsLm1vZGUuZ2NtLl9naGFzaChILCB0YWcsIGxhc3QpO1xuICAgIGVuYyA9IHByZi5lbmNyeXB0KEowKTtcbiAgICB0YWdbMF0gXj0gZW5jWzBdO1xuICAgIHRhZ1sxXSBePSBlbmNbMV07XG4gICAgdGFnWzJdIF49IGVuY1syXTtcbiAgICB0YWdbM10gXj0gZW5jWzNdO1xuXG4gICAgcmV0dXJuIHsgdGFnOncuYml0U2xpY2UodGFnLCAwLCB0bGVuKSwgZGF0YTpkYXRhIH07XG4gIH1cbn07XG4vKiogQGZpbGVPdmVydmlldyBITUFDIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBhdXRob3IgRW1pbHkgU3RhcmtcbiAqIEBhdXRob3IgTWlrZSBIYW1idXJnXG4gKiBAYXV0aG9yIERhbiBCb25laFxuICovXG5cbi8qKiBITUFDIHdpdGggdGhlIHNwZWNpZmllZCBoYXNoIGZ1bmN0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2JpdEFycmF5fSBrZXkgdGhlIGtleSBmb3IgSE1BQy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbaGFzaD1zamNsLmhhc2guc2hhMjU2XSBUaGUgaGFzaCBmdW5jdGlvbiB0byB1c2UuXG4gKi9cbnNqY2wubWlzYy5obWFjID0gZnVuY3Rpb24gKGtleSwgSGFzaCkge1xuICB0aGlzLl9oYXNoID0gSGFzaCA9IEhhc2ggfHwgc2pjbC5oYXNoLnNoYTI1NjtcbiAgdmFyIGV4S2V5ID0gW1tdLFtdXSwgaSxcbiAgICAgIGJzID0gSGFzaC5wcm90b3R5cGUuYmxvY2tTaXplIC8gMzI7XG4gIHRoaXMuX2Jhc2VIYXNoID0gW25ldyBIYXNoKCksIG5ldyBIYXNoKCldO1xuXG4gIGlmIChrZXkubGVuZ3RoID4gYnMpIHtcbiAgICBrZXkgPSBIYXNoLmhhc2goa2V5KTtcbiAgfVxuICBcbiAgZm9yIChpPTA7IGk8YnM7IGkrKykge1xuICAgIGV4S2V5WzBdW2ldID0ga2V5W2ldXjB4MzYzNjM2MzY7XG4gICAgZXhLZXlbMV1baV0gPSBrZXlbaV1eMHg1QzVDNUM1QztcbiAgfVxuICBcbiAgdGhpcy5fYmFzZUhhc2hbMF0udXBkYXRlKGV4S2V5WzBdKTtcbiAgdGhpcy5fYmFzZUhhc2hbMV0udXBkYXRlKGV4S2V5WzFdKTtcbiAgdGhpcy5fcmVzdWx0SGFzaCA9IG5ldyBIYXNoKHRoaXMuX2Jhc2VIYXNoWzBdKTtcbn07XG5cbi8qKiBITUFDIHdpdGggdGhlIHNwZWNpZmllZCBoYXNoIGZ1bmN0aW9uLiAgQWxzbyBjYWxsZWQgZW5jcnlwdCBzaW5jZSBpdCdzIGEgcHJmLlxuICogQHBhcmFtIHtiaXRBcnJheXxTdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gbWFjLlxuICovXG5zamNsLm1pc2MuaG1hYy5wcm90b3R5cGUuZW5jcnlwdCA9IHNqY2wubWlzYy5obWFjLnByb3RvdHlwZS5tYWMgPSBmdW5jdGlvbiAoZGF0YSkge1xuICBpZiAoIXRoaXMuX3VwZGF0ZWQpIHtcbiAgICB0aGlzLnVwZGF0ZShkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5kaWdlc3QoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJlbmNyeXB0IG9uIGFscmVhZHkgdXBkYXRlZCBobWFjIGNhbGxlZCFcIik7XG4gIH1cbn07XG5cbnNqY2wubWlzYy5obWFjLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fcmVzdWx0SGFzaCA9IG5ldyB0aGlzLl9oYXNoKHRoaXMuX2Jhc2VIYXNoWzBdKTtcbiAgdGhpcy5fdXBkYXRlZCA9IGZhbHNlO1xufTtcblxuc2pjbC5taXNjLmhtYWMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHRoaXMuX3VwZGF0ZWQgPSB0cnVlO1xuICB0aGlzLl9yZXN1bHRIYXNoLnVwZGF0ZShkYXRhKTtcbn07XG5cbnNqY2wubWlzYy5obWFjLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB3ID0gdGhpcy5fcmVzdWx0SGFzaC5maW5hbGl6ZSgpLCByZXN1bHQgPSBuZXcgKHRoaXMuX2hhc2gpKHRoaXMuX2Jhc2VIYXNoWzFdKS51cGRhdGUodykuZmluYWxpemUoKTtcblxuICB0aGlzLnJlc2V0KCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07LyoqIEBmaWxlT3ZlcnZpZXcgUGFzc3dvcmQtYmFzZWQga2V5LWRlcml2YXRpb24gZnVuY3Rpb24sIHZlcnNpb24gMi4wLlxuICpcbiAqIEBhdXRob3IgRW1pbHkgU3RhcmtcbiAqIEBhdXRob3IgTWlrZSBIYW1idXJnXG4gKiBAYXV0aG9yIERhbiBCb25laFxuICovXG5cbi8qKiBQYXNzd29yZC1CYXNlZCBLZXktRGVyaXZhdGlvbiBGdW5jdGlvbiwgdmVyc2lvbiAyLjAuXG4gKlxuICogR2VuZXJhdGUga2V5cyBmcm9tIHBhc3N3b3JkcyB1c2luZyBQQktERjItSE1BQy1TSEEyNTYuXG4gKlxuICogVGhpcyBpcyB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSBSU0EncyBQS0NTICM1IHN0YW5kYXJkLlxuICpcbiAqIEBwYXJhbSB7Yml0QXJyYXl8U3RyaW5nfSBwYXNzd29yZCAgVGhlIHBhc3N3b3JkLlxuICogQHBhcmFtIHtiaXRBcnJheXxTdHJpbmd9IHNhbHQgVGhlIHNhbHQuICBTaG91bGQgaGF2ZSBsb3RzIG9mIGVudHJvcHkuXG4gKiBAcGFyYW0ge051bWJlcn0gW2NvdW50PTEwMDBdIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucy4gIEhpZ2hlciBudW1iZXJzIG1ha2UgdGhlIGZ1bmN0aW9uIHNsb3dlciBidXQgbW9yZSBzZWN1cmUuXG4gKiBAcGFyYW0ge051bWJlcn0gW2xlbmd0aF0gVGhlIGxlbmd0aCBvZiB0aGUgZGVyaXZlZCBrZXkuICBEZWZhdWx0cyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgc2l6ZSBvZiB0aGUgaGFzaCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbUHJmZj1zamNsLm1pc2MuaG1hY10gVGhlIHBzZXVkb3JhbmRvbSBmdW5jdGlvbiBmYW1pbHkuXG4gKiBAcmV0dXJuIHtiaXRBcnJheX0gdGhlIGRlcml2ZWQga2V5LlxuICovXG5zamNsLm1pc2MucGJrZGYyID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0LCBjb3VudCwgbGVuZ3RoLCBQcmZmKSB7XG4gIGNvdW50ID0gY291bnQgfHwgMTAwMDtcbiAgXG4gIGlmIChsZW5ndGggPCAwIHx8IGNvdW50IDwgMCkge1xuICAgIHRocm93IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJpbnZhbGlkIHBhcmFtcyB0byBwYmtkZjJcIik7XG4gIH1cbiAgXG4gIGlmICh0eXBlb2YgcGFzc3dvcmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBwYXNzd29yZCA9IHNqY2wuY29kZWMudXRmOFN0cmluZy50b0JpdHMocGFzc3dvcmQpO1xuICB9XG4gIFxuICBpZiAodHlwZW9mIHNhbHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBzYWx0ID0gc2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhzYWx0KTtcbiAgfVxuICBcbiAgUHJmZiA9IFByZmYgfHwgc2pjbC5taXNjLmhtYWM7XG4gIFxuICB2YXIgcHJmID0gbmV3IFByZmYocGFzc3dvcmQpLFxuICAgICAgdSwgdWksIGksIGosIGssIG91dCA9IFtdLCBiID0gc2pjbC5iaXRBcnJheTtcblxuICBmb3IgKGsgPSAxOyAzMiAqIG91dC5sZW5ndGggPCAobGVuZ3RoIHx8IDEpOyBrKyspIHtcbiAgICB1ID0gdWkgPSBwcmYuZW5jcnlwdChiLmNvbmNhdChzYWx0LFtrXSkpO1xuICAgIFxuICAgIGZvciAoaT0xOyBpPGNvdW50OyBpKyspIHtcbiAgICAgIHVpID0gcHJmLmVuY3J5cHQodWkpO1xuICAgICAgZm9yIChqPTA7IGo8dWkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdVtqXSBePSB1aVtqXTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgb3V0ID0gb3V0LmNvbmNhdCh1KTtcbiAgfVxuXG4gIGlmIChsZW5ndGgpIHsgb3V0ID0gYi5jbGFtcChvdXQsIGxlbmd0aCk7IH1cblxuICByZXR1cm4gb3V0O1xufTtcbi8qKiBAZmlsZU92ZXJ2aWV3IFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICpcbiAqIEBhdXRob3IgRW1pbHkgU3RhcmtcbiAqIEBhdXRob3IgTWlrZSBIYW1idXJnXG4gKiBAYXV0aG9yIERhbiBCb25laFxuICogQGF1dGhvciBNaWNoYWVsIEJyb29rc1xuICovXG5cbi8qKiBAY29uc3RydWN0b3JcbiAqIEBjbGFzcyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuICogQGRlc2NyaXB0aW9uXG4gKiA8Yj5Vc2Ugc2pjbC5yYW5kb20gYXMgYSBzaW5nbGV0b24gZm9yIHRoaXMgY2xhc3MhPC9iPlxuICogPHA+XG4gKiBUaGlzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzIGEgZGVyaXZhdGl2ZSBvZiBGZXJndXNvbiBhbmQgU2NobmVpZXInc1xuICogZ2VuZXJhdG9yIEZvcnR1bmEuICBJdCBjb2xsZWN0cyBlbnRyb3B5IGZyb20gdmFyaW91cyBldmVudHMgaW50byBzZXZlcmFsXG4gKiBwb29scywgaW1wbGVtZW50ZWQgYnkgc3RyZWFtaW5nIFNIQS0yNTYgaW5zdGFuY2VzLiAgSXQgZGlmZmVycyBmcm9tXG4gKiBvcmRpbmFyeSBGb3J0dW5hIGluIGEgZmV3IHdheXMsIHRob3VnaC5cbiAqIDwvcD5cbiAqXG4gKiA8cD5cbiAqIE1vc3QgaW1wb3J0YW50bHksIGl0IGhhcyBhbiBlbnRyb3B5IGVzdGltYXRvci4gIFRoaXMgaXMgcHJlc2VudCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBhIHN0cm9uZyBjb25mbGljdCBoZXJlIGJldHdlZW4gbWFraW5nIHRoZSBnZW5lcmF0b3IgYXZhaWxhYmxlXG4gKiBhcyBzb29uIGFzIHBvc3NpYmxlLCBhbmQgbWFraW5nIHN1cmUgdGhhdCBpdCBkb2Vzbid0IFwicnVuIG9uIGVtcHR5XCIuXG4gKiBJbiBGb3J0dW5hLCB0aGVyZSBpcyBhIHNhdmVkIHN0YXRlIGZpbGUsIGFuZCB0aGUgc3lzdGVtIGlzIGxpa2VseSB0byBoYXZlXG4gKiB0aW1lIHRvIHdhcm0gdXAuXG4gKiA8L3A+XG4gKlxuICogPHA+XG4gKiBTZWNvbmQsIGJlY2F1c2UgdXNlcnMgYXJlIHVubGlrZWx5IHRvIHN0YXkgb24gdGhlIHBhZ2UgZm9yIHZlcnkgbG9uZyxcbiAqIGFuZCB0byBzcGVlZCBzdGFydHVwIHRpbWUsIHRoZSBudW1iZXIgb2YgcG9vbHMgaW5jcmVhc2VzIGxvZ2FyaXRobWljYWxseTpcbiAqIGEgbmV3IHBvb2wgaXMgY3JlYXRlZCB3aGVuIHRoZSBwcmV2aW91cyBvbmUgaXMgYWN0dWFsbHkgdXNlZCBmb3IgYSByZXNlZWQuXG4gKiBUaGlzIGdpdmVzIHRoZSBzYW1lIGFzeW1wdG90aWMgZ3VhcmFudGVlcyBhcyBGb3J0dW5hLCBidXQgZ2l2ZXMgbW9yZVxuICogZW50cm9weSB0byBlYXJseSByZXNlZWRzLlxuICogPC9wPlxuICpcbiAqIDxwPlxuICogVGhlIGVudGlyZSBtZWNoYW5pc20gaGVyZSBmZWVscyBwcmV0dHkga2x1bmt5LiAgRnVydGhlcm1vcmUsIHRoZXJlIGFyZVxuICogc2V2ZXJhbCBpbXByb3ZlbWVudHMgdGhhdCBzaG91bGQgYmUgbWFkZSwgaW5jbHVkaW5nIHN1cHBvcnQgZm9yXG4gKiBkZWRpY2F0ZWQgY3J5cHRvZ3JhcGhpYyBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgcHJlc2VudCBpbiBzb21lIGJyb3dzZXJzO1xuICogc3RhdGUgZmlsZXMgaW4gbG9jYWwgc3RvcmFnZTsgY29va2llcyBjb250YWluaW5nIHJhbmRvbW5lc3M7IGV0Yy4gIFNvXG4gKiBsb29rIGZvciBpbXByb3ZlbWVudHMgaW4gZnV0dXJlIHZlcnNpb25zLlxuICogPC9wPlxuICovXG5zamNsLnBybmcgPSBmdW5jdGlvbihkZWZhdWx0UGFyYW5vaWEpIHtcbiAgXG4gIC8qIHByaXZhdGUgKi9cbiAgdGhpcy5fcG9vbHMgICAgICAgICAgICAgICAgICAgPSBbbmV3IHNqY2wuaGFzaC5zaGEyNTYoKV07XG4gIHRoaXMuX3Bvb2xFbnRyb3B5ICAgICAgICAgICAgID0gWzBdO1xuICB0aGlzLl9yZXNlZWRDb3VudCAgICAgICAgICAgICA9IDA7XG4gIHRoaXMuX3JvYmlucyAgICAgICAgICAgICAgICAgID0ge307XG4gIHRoaXMuX2V2ZW50SWQgICAgICAgICAgICAgICAgID0gMDtcbiAgXG4gIHRoaXMuX2NvbGxlY3RvcklkcyAgICAgICAgICAgID0ge307XG4gIHRoaXMuX2NvbGxlY3RvcklkTmV4dCAgICAgICAgID0gMDtcbiAgXG4gIHRoaXMuX3N0cmVuZ3RoICAgICAgICAgICAgICAgID0gMDtcbiAgdGhpcy5fcG9vbFN0cmVuZ3RoICAgICAgICAgICAgPSAwO1xuICB0aGlzLl9uZXh0UmVzZWVkICAgICAgICAgICAgICA9IDA7XG4gIHRoaXMuX2tleSAgICAgICAgICAgICAgICAgICAgID0gWzAsMCwwLDAsMCwwLDAsMF07XG4gIHRoaXMuX2NvdW50ZXIgICAgICAgICAgICAgICAgID0gWzAsMCwwLDBdO1xuICB0aGlzLl9jaXBoZXIgICAgICAgICAgICAgICAgICA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fZGVmYXVsdFBhcmFub2lhICAgICAgICAgPSBkZWZhdWx0UGFyYW5vaWE7XG4gIFxuICAvKiBldmVudCBsaXN0ZW5lciBzdHVmZiAqL1xuICB0aGlzLl9jb2xsZWN0b3JzU3RhcnRlZCAgICAgICA9IGZhbHNlO1xuICB0aGlzLl9jYWxsYmFja3MgICAgICAgICAgICAgICA9IHtwcm9ncmVzczoge30sIHNlZWRlZDoge319O1xuICB0aGlzLl9jYWxsYmFja0kgICAgICAgICAgICAgICA9IDA7XG4gIFxuICAvKiBjb25zdGFudHMgKi9cbiAgdGhpcy5fTk9UX1JFQURZICAgICAgICAgICAgICAgPSAwO1xuICB0aGlzLl9SRUFEWSAgICAgICAgICAgICAgICAgICA9IDE7XG4gIHRoaXMuX1JFUVVJUkVTX1JFU0VFRCAgICAgICAgID0gMjtcblxuICB0aGlzLl9NQVhfV09SRFNfUEVSX0JVUlNUICAgICA9IDY1NTM2O1xuICB0aGlzLl9QQVJBTk9JQV9MRVZFTFMgICAgICAgICA9IFswLDQ4LDY0LDk2LDEyOCwxOTIsMjU2LDM4NCw1MTIsNzY4LDEwMjRdO1xuICB0aGlzLl9NSUxMSVNFQ09ORFNfUEVSX1JFU0VFRCA9IDMwMDAwO1xuICB0aGlzLl9CSVRTX1BFUl9SRVNFRUQgICAgICAgICA9IDgwO1xufTtcbiBcbnNqY2wucHJuZy5wcm90b3R5cGUgPSB7XG4gIC8qKiBHZW5lcmF0ZSBzZXZlcmFsIHJhbmRvbSB3b3JkcywgYW5kIHJldHVybiB0aGVtIGluIGFuIGFycmF5LlxuICAgKiBBIHdvcmQgY29uc2lzdHMgb2YgMzIgYml0cyAoNCBieXRlcylcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG53b3JkcyBUaGUgbnVtYmVyIG9mIHdvcmRzIHRvIGdlbmVyYXRlLlxuICAgKi9cbiAgcmFuZG9tV29yZHM6IGZ1bmN0aW9uIChud29yZHMsIHBhcmFub2lhKSB7XG4gICAgdmFyIG91dCA9IFtdLCBpLCByZWFkaW5lc3MgPSB0aGlzLmlzUmVhZHkocGFyYW5vaWEpLCBnO1xuICBcbiAgICBpZiAocmVhZGluZXNzID09PSB0aGlzLl9OT1RfUkVBRFkpIHtcbiAgICAgIHRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5ub3RSZWFkeShcImdlbmVyYXRvciBpc24ndCBzZWVkZWRcIik7XG4gICAgfSBlbHNlIGlmIChyZWFkaW5lc3MgJiB0aGlzLl9SRVFVSVJFU19SRVNFRUQpIHtcbiAgICAgIHRoaXMuX3Jlc2VlZEZyb21Qb29scyghKHJlYWRpbmVzcyAmIHRoaXMuX1JFQURZKSk7XG4gICAgfVxuICBcbiAgICBmb3IgKGk9MDsgaTxud29yZHM7IGkrPSA0KSB7XG4gICAgICBpZiAoKGkrMSkgJSB0aGlzLl9NQVhfV09SRFNfUEVSX0JVUlNUID09PSAwKSB7XG4gICAgICAgIHRoaXMuX2dhdGUoKTtcbiAgICAgIH1cbiAgIFxuICAgICAgZyA9IHRoaXMuX2dlbjR3b3JkcygpO1xuICAgICAgb3V0LnB1c2goZ1swXSxnWzFdLGdbMl0sZ1szXSk7XG4gICAgfVxuICAgIHRoaXMuX2dhdGUoKTtcbiAgXG4gICAgcmV0dXJuIG91dC5zbGljZSgwLG53b3Jkcyk7XG4gIH0sXG4gIFxuICBzZXREZWZhdWx0UGFyYW5vaWE6IGZ1bmN0aW9uIChwYXJhbm9pYSwgYWxsb3daZXJvUGFyYW5vaWEpIHtcbiAgICBpZiAocGFyYW5vaWEgPT09IDAgJiYgYWxsb3daZXJvUGFyYW5vaWEgIT09IFwiU2V0dGluZyBwYXJhbm9pYT0wIHdpbGwgcnVpbiB5b3VyIHNlY3VyaXR5OyB1c2UgaXQgb25seSBmb3IgdGVzdGluZ1wiKSB7XG4gICAgICB0aHJvdyBcIlNldHRpbmcgcGFyYW5vaWE9MCB3aWxsIHJ1aW4geW91ciBzZWN1cml0eTsgdXNlIGl0IG9ubHkgZm9yIHRlc3RpbmdcIjtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWZhdWx0UGFyYW5vaWEgPSBwYXJhbm9pYTtcbiAgfSxcbiAgXG4gIC8qKlxuICAgKiBBZGQgZW50cm9weSB0byB0aGUgcG9vbHMuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBlbnRyb3BpYyB2YWx1ZS4gIFNob3VsZCBiZSBhIDMyLWJpdCBpbnRlZ2VyLCBhcnJheSBvZiAzMi1iaXQgaW50ZWdlcnMsIG9yIHN0cmluZ1xuICAgKiBAcGFyYW0ge051bWJlcn0gZXN0aW1hdGVkRW50cm9weSBUaGUgZXN0aW1hdGVkIGVudHJvcHkgb2YgZGF0YSwgaW4gYml0c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gc291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIGVudHJvcHksIGVnIFwibW91c2VcIlxuICAgKi9cbiAgYWRkRW50cm9weTogZnVuY3Rpb24gKGRhdGEsIGVzdGltYXRlZEVudHJvcHksIHNvdXJjZSkge1xuICAgIHNvdXJjZSA9IHNvdXJjZSB8fCBcInVzZXJcIjtcbiAgXG4gICAgdmFyIGlkLFxuICAgICAgaSwgdG1wLFxuICAgICAgdCA9IChuZXcgRGF0ZSgpKS52YWx1ZU9mKCksXG4gICAgICByb2JpbiA9IHRoaXMuX3JvYmluc1tzb3VyY2VdLFxuICAgICAgb2xkUmVhZHkgPSB0aGlzLmlzUmVhZHkoKSwgZXJyID0gMCwgb2JqTmFtZTtcbiAgICAgIFxuICAgIGlkID0gdGhpcy5fY29sbGVjdG9ySWRzW3NvdXJjZV07XG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHsgaWQgPSB0aGlzLl9jb2xsZWN0b3JJZHNbc291cmNlXSA9IHRoaXMuX2NvbGxlY3RvcklkTmV4dCArKzsgfVxuICAgICAgXG4gICAgaWYgKHJvYmluID09PSB1bmRlZmluZWQpIHsgcm9iaW4gPSB0aGlzLl9yb2JpbnNbc291cmNlXSA9IDA7IH1cbiAgICB0aGlzLl9yb2JpbnNbc291cmNlXSA9ICggdGhpcy5fcm9iaW5zW3NvdXJjZV0gKyAxICkgJSB0aGlzLl9wb29scy5sZW5ndGg7XG4gIFxuICAgIHN3aXRjaCh0eXBlb2YoZGF0YSkpIHtcbiAgICAgIFxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGlmIChlc3RpbWF0ZWRFbnRyb3B5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXN0aW1hdGVkRW50cm9weSA9IDE7XG4gICAgICB9XG4gICAgICB0aGlzLl9wb29sc1tyb2Jpbl0udXBkYXRlKFtpZCx0aGlzLl9ldmVudElkKyssMSxlc3RpbWF0ZWRFbnRyb3B5LHQsMSxkYXRhfDBdKTtcbiAgICAgIGJyZWFrO1xuICAgICAgXG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgb2JqTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKTtcbiAgICAgIGlmIChvYmpOYW1lID09PSBcIltvYmplY3QgVWludDMyQXJyYXldXCIpIHtcbiAgICAgICAgdG1wID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdG1wLnB1c2goZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IHRtcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YS5sZW5ndGggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBlcnIgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaT0wOyBpPGRhdGEubGVuZ3RoICYmICFlcnI7IGkrKykge1xuICAgICAgICAgIGlmICh0eXBlb2YoZGF0YVtpXSkgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGVyciA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWVycikge1xuICAgICAgICBpZiAoZXN0aW1hdGVkRW50cm9weSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLyogaG9ycmlibGUgZW50cm9weSBlc3RpbWF0b3IgKi9cbiAgICAgICAgICBlc3RpbWF0ZWRFbnRyb3B5ID0gMDtcbiAgICAgICAgICBmb3IgKGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0bXA9IGRhdGFbaV07XG4gICAgICAgICAgICB3aGlsZSAodG1wPjApIHtcbiAgICAgICAgICAgICAgZXN0aW1hdGVkRW50cm9weSsrO1xuICAgICAgICAgICAgICB0bXAgPSB0bXAgPj4+IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bvb2xzW3JvYmluXS51cGRhdGUoW2lkLHRoaXMuX2V2ZW50SWQrKywyLGVzdGltYXRlZEVudHJvcHksdCxkYXRhLmxlbmd0aF0uY29uY2F0KGRhdGEpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgICAgXG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgaWYgKGVzdGltYXRlZEVudHJvcHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgIC8qIEVuZ2xpc2ggdGV4dCBoYXMganVzdCBvdmVyIDEgYml0IHBlciBjaGFyYWN0ZXIgb2YgZW50cm9weS5cbiAgICAgICAgKiBCdXQgdGhpcyBtaWdodCBiZSBIVE1MIG9yIHNvbWV0aGluZywgYW5kIGhhdmUgZmFyIGxlc3NcbiAgICAgICAgKiBlbnRyb3B5IHRoYW4gRW5nbGlzaC4uLiAgT2ggd2VsbCwgbGV0J3MganVzdCBzYXkgb25lIGJpdC5cbiAgICAgICAgKi9cbiAgICAgICBlc3RpbWF0ZWRFbnRyb3B5ID0gZGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgICB0aGlzLl9wb29sc1tyb2Jpbl0udXBkYXRlKFtpZCx0aGlzLl9ldmVudElkKyssMyxlc3RpbWF0ZWRFbnRyb3B5LHQsZGF0YS5sZW5ndGhdKTtcbiAgICAgIHRoaXMuX3Bvb2xzW3JvYmluXS51cGRhdGUoZGF0YSk7XG4gICAgICBicmVhaztcbiAgICAgIFxuICAgIGRlZmF1bHQ6XG4gICAgICBlcnI9MTtcbiAgICB9XG4gICAgaWYgKGVycikge1xuICAgICAgdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmJ1ZyhcInJhbmRvbTogYWRkRW50cm9weSBvbmx5IHN1cHBvcnRzIG51bWJlciwgYXJyYXkgb2YgbnVtYmVycyBvciBzdHJpbmdcIik7XG4gICAgfVxuICBcbiAgICAvKiByZWNvcmQgdGhlIG5ldyBzdHJlbmd0aCAqL1xuICAgIHRoaXMuX3Bvb2xFbnRyb3B5W3JvYmluXSArPSBlc3RpbWF0ZWRFbnRyb3B5O1xuICAgIHRoaXMuX3Bvb2xTdHJlbmd0aCArPSBlc3RpbWF0ZWRFbnRyb3B5O1xuICBcbiAgICAvKiBmaXJlIG9mZiBldmVudHMgKi9cbiAgICBpZiAob2xkUmVhZHkgPT09IHRoaXMuX05PVF9SRUFEWSkge1xuICAgICAgaWYgKHRoaXMuaXNSZWFkeSgpICE9PSB0aGlzLl9OT1RfUkVBRFkpIHtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KFwic2VlZGVkXCIsIE1hdGgubWF4KHRoaXMuX3N0cmVuZ3RoLCB0aGlzLl9wb29sU3RyZW5ndGgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpcmVFdmVudChcInByb2dyZXNzXCIsIHRoaXMuZ2V0UHJvZ3Jlc3MoKSk7XG4gICAgfVxuICB9LFxuICBcbiAgLyoqIElzIHRoZSBnZW5lcmF0b3IgcmVhZHk/ICovXG4gIGlzUmVhZHk6IGZ1bmN0aW9uIChwYXJhbm9pYSkge1xuICAgIHZhciBlbnRyb3B5UmVxdWlyZWQgPSB0aGlzLl9QQVJBTk9JQV9MRVZFTFNbIChwYXJhbm9pYSAhPT0gdW5kZWZpbmVkKSA/IHBhcmFub2lhIDogdGhpcy5fZGVmYXVsdFBhcmFub2lhIF07XG4gIFxuICAgIGlmICh0aGlzLl9zdHJlbmd0aCAmJiB0aGlzLl9zdHJlbmd0aCA+PSBlbnRyb3B5UmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5fcG9vbEVudHJvcHlbMF0gPiB0aGlzLl9CSVRTX1BFUl9SRVNFRUQgJiYgKG5ldyBEYXRlKCkpLnZhbHVlT2YoKSA+IHRoaXMuX25leHRSZXNlZWQpID9cbiAgICAgICAgdGhpcy5fUkVRVUlSRVNfUkVTRUVEIHwgdGhpcy5fUkVBRFkgOlxuICAgICAgICB0aGlzLl9SRUFEWTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICh0aGlzLl9wb29sU3RyZW5ndGggPj0gZW50cm9weVJlcXVpcmVkKSA/XG4gICAgICAgIHRoaXMuX1JFUVVJUkVTX1JFU0VFRCB8IHRoaXMuX05PVF9SRUFEWSA6XG4gICAgICAgIHRoaXMuX05PVF9SRUFEWTtcbiAgICB9XG4gIH0sXG4gIFxuICAvKiogR2V0IHRoZSBnZW5lcmF0b3IncyBwcm9ncmVzcyB0b3dhcmQgcmVhZGluZXNzLCBhcyBhIGZyYWN0aW9uICovXG4gIGdldFByb2dyZXNzOiBmdW5jdGlvbiAocGFyYW5vaWEpIHtcbiAgICB2YXIgZW50cm9weVJlcXVpcmVkID0gdGhpcy5fUEFSQU5PSUFfTEVWRUxTWyBwYXJhbm9pYSA/IHBhcmFub2lhIDogdGhpcy5fZGVmYXVsdFBhcmFub2lhIF07XG4gIFxuICAgIGlmICh0aGlzLl9zdHJlbmd0aCA+PSBlbnRyb3B5UmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiAxLjA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAodGhpcy5fcG9vbFN0cmVuZ3RoID4gZW50cm9weVJlcXVpcmVkKSA/XG4gICAgICAgIDEuMCA6XG4gICAgICAgIHRoaXMuX3Bvb2xTdHJlbmd0aCAvIGVudHJvcHlSZXF1aXJlZDtcbiAgICB9XG4gIH0sXG4gIFxuICAvKiogc3RhcnQgdGhlIGJ1aWx0LWluIGVudHJvcHkgY29sbGVjdG9ycyAqL1xuICBzdGFydENvbGxlY3RvcnM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fY29sbGVjdG9yc1N0YXJ0ZWQpIHsgcmV0dXJuOyB9XG4gIFxuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXIgPSB7XG4gICAgICBsb2FkVGltZUNvbGxlY3RvcjogdGhpcy5fYmluZCh0aGlzLl9sb2FkVGltZUNvbGxlY3RvciksXG4gICAgICBtb3VzZUNvbGxlY3RvcjogdGhpcy5fYmluZCh0aGlzLl9tb3VzZUNvbGxlY3RvciksXG4gICAgICBrZXlib2FyZENvbGxlY3RvcjogdGhpcy5fYmluZCh0aGlzLl9rZXlib2FyZENvbGxlY3RvciksXG4gICAgICBhY2NlbGVyb21ldGVyQ29sbGVjdG9yOiB0aGlzLl9iaW5kKHRoaXMuX2FjY2VsZXJvbWV0ZXJDb2xsZWN0b3IpXG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgdGhpcy5fZXZlbnRMaXN0ZW5lci5sb2FkVGltZUNvbGxlY3RvciwgZmFsc2UpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5fZXZlbnRMaXN0ZW5lci5tb3VzZUNvbGxlY3RvciwgZmFsc2UpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLCB0aGlzLl9ldmVudExpc3RlbmVyLmtleWJvYXJkQ29sbGVjdG9yLCBmYWxzZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImRldmljZW1vdGlvblwiLCB0aGlzLl9ldmVudExpc3RlbmVyLmFjY2VsZXJvbWV0ZXJDb2xsZWN0b3IsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSB7XG4gICAgICBkb2N1bWVudC5hdHRhY2hFdmVudChcIm9ubG9hZFwiLCB0aGlzLl9ldmVudExpc3RlbmVyLmxvYWRUaW1lQ29sbGVjdG9yKTtcbiAgICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KFwib25tb3VzZW1vdmVcIiwgdGhpcy5fZXZlbnRMaXN0ZW5lci5tb3VzZUNvbGxlY3Rvcik7XG4gICAgICBkb2N1bWVudC5hdHRhY2hFdmVudChcImtleXByZXNzXCIsIHRoaXMuX2V2ZW50TGlzdGVuZXIua2V5Ym9hcmRDb2xsZWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uYnVnKFwiY2FuJ3QgYXR0YWNoIGV2ZW50XCIpO1xuICAgIH1cbiAgXG4gICAgdGhpcy5fY29sbGVjdG9yc1N0YXJ0ZWQgPSB0cnVlO1xuICB9LFxuICBcbiAgLyoqIHN0b3AgdGhlIGJ1aWx0LWluIGVudHJvcHkgY29sbGVjdG9ycyAqL1xuICBzdG9wQ29sbGVjdG9yczogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fY29sbGVjdG9yc1N0YXJ0ZWQpIHsgcmV0dXJuOyB9XG4gIFxuICAgIGlmICh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIHRoaXMuX2V2ZW50TGlzdGVuZXIubG9hZFRpbWVDb2xsZWN0b3IsIGZhbHNlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuX2V2ZW50TGlzdGVuZXIubW91c2VDb2xsZWN0b3IsIGZhbHNlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgdGhpcy5fZXZlbnRMaXN0ZW5lci5rZXlib2FyZENvbGxlY3RvciwgZmFsc2UpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkZXZpY2Vtb3Rpb25cIiwgdGhpcy5fZXZlbnRMaXN0ZW5lci5hY2NlbGVyb21ldGVyQ29sbGVjdG9yLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5kZXRhY2hFdmVudCkge1xuICAgICAgZG9jdW1lbnQuZGV0YWNoRXZlbnQoXCJvbmxvYWRcIiwgdGhpcy5fZXZlbnRMaXN0ZW5lci5sb2FkVGltZUNvbGxlY3Rvcik7XG4gICAgICBkb2N1bWVudC5kZXRhY2hFdmVudChcIm9ubW91c2Vtb3ZlXCIsIHRoaXMuX2V2ZW50TGlzdGVuZXIubW91c2VDb2xsZWN0b3IpO1xuICAgICAgZG9jdW1lbnQuZGV0YWNoRXZlbnQoXCJrZXlwcmVzc1wiLCB0aGlzLl9ldmVudExpc3RlbmVyLmtleWJvYXJkQ29sbGVjdG9yKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jb2xsZWN0b3JzU3RhcnRlZCA9IGZhbHNlO1xuICB9LFxuICBcbiAgLyogdXNlIGEgY29va2llIHRvIHN0b3JlIGVudHJvcHkuXG4gIHVzZUNvb2tpZTogZnVuY3Rpb24gKGFsbF9jb29raWVzKSB7XG4gICAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uYnVnKFwicmFuZG9tOiB1c2VDb29raWUgaXMgdW5pbXBsZW1lbnRlZFwiKTtcbiAgfSwqL1xuICBcbiAgLyoqIGFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgcHJvZ3Jlc3Mgb3Igc2VlZGVkLW5lc3MuICovXG4gIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2NhbGxiYWNrc1tuYW1lXVt0aGlzLl9jYWxsYmFja0krK10gPSBjYWxsYmFjaztcbiAgfSxcbiAgXG4gIC8qKiByZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHByb2dyZXNzIG9yIHNlZWRlZC1uZXNzICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIChuYW1lLCBjYikge1xuICAgIHZhciBpLCBqLCBjYnM9dGhpcy5fY2FsbGJhY2tzW25hbWVdLCBqc1RlbXA9W107XG5cbiAgICAvKiBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBuZWNlc3Nhcnk7IGluIEMrKywgaXRlcmF0aW5nIG92ZXIgYVxuICAgICAqIGNvbGxlY3Rpb24gYW5kIG1vZGlmeWluZyBpdCBhdCB0aGUgc2FtZSB0aW1lIGlzIGEgbm8tbm8uXG4gICAgICovXG5cbiAgICBmb3IgKGogaW4gY2JzKSB7XG4gICAgICBpZiAoY2JzLmhhc093blByb3BlcnR5KGopICYmIGNic1tqXSA9PT0gY2IpIHtcbiAgICAgICAganNUZW1wLnB1c2goaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChpPTA7IGk8anNUZW1wLmxlbmd0aDsgaSsrKSB7XG4gICAgICBqID0ganNUZW1wW2ldO1xuICAgICAgZGVsZXRlIGNic1tqXTtcbiAgICB9XG4gIH0sXG4gIFxuICBfYmluZDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmMuYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9LFxuXG4gIC8qKiBHZW5lcmF0ZSA0IHJhbmRvbSB3b3Jkcywgbm8gcmVzZWVkLCBubyBnYXRlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dlbjR3b3JkczogZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGk9MDsgaTw0OyBpKyspIHtcbiAgICAgIHRoaXMuX2NvdW50ZXJbaV0gPSB0aGlzLl9jb3VudGVyW2ldKzEgfCAwO1xuICAgICAgaWYgKHRoaXMuX2NvdW50ZXJbaV0pIHsgYnJlYWs7IH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NpcGhlci5lbmNyeXB0KHRoaXMuX2NvdW50ZXIpO1xuICB9LFxuICBcbiAgLyogUmVrZXkgdGhlIEFFUyBpbnN0YW5jZSB3aXRoIGl0c2VsZiBhZnRlciBhIHJlcXVlc3QsIG9yIGV2ZXJ5IF9NQVhfV09SRFNfUEVSX0JVUlNUIHdvcmRzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9rZXkgPSB0aGlzLl9nZW40d29yZHMoKS5jb25jYXQodGhpcy5fZ2VuNHdvcmRzKCkpO1xuICAgIHRoaXMuX2NpcGhlciA9IG5ldyBzamNsLmNpcGhlci5hZXModGhpcy5fa2V5KTtcbiAgfSxcbiAgXG4gIC8qKiBSZXNlZWQgdGhlIGdlbmVyYXRvciB3aXRoIHRoZSBnaXZlbiB3b3Jkc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3Jlc2VlZDogZnVuY3Rpb24gKHNlZWRXb3Jkcykge1xuICAgIHRoaXMuX2tleSA9IHNqY2wuaGFzaC5zaGEyNTYuaGFzaCh0aGlzLl9rZXkuY29uY2F0KHNlZWRXb3JkcykpO1xuICAgIHRoaXMuX2NpcGhlciA9IG5ldyBzamNsLmNpcGhlci5hZXModGhpcy5fa2V5KTtcbiAgICBmb3IgKHZhciBpPTA7IGk8NDsgaSsrKSB7XG4gICAgICB0aGlzLl9jb3VudGVyW2ldID0gdGhpcy5fY291bnRlcltpXSsxIHwgMDtcbiAgICAgIGlmICh0aGlzLl9jb3VudGVyW2ldKSB7IGJyZWFrOyB9XG4gICAgfVxuICB9LFxuICBcbiAgLyoqIHJlc2VlZCB0aGUgZGF0YSBmcm9tIHRoZSBlbnRyb3B5IHBvb2xzXG4gICAqIEBwYXJhbSBmdWxsIElmIHNldCwgdXNlIGFsbCB0aGUgZW50cm9weSBwb29scyBpbiB0aGUgcmVzZWVkLlxuICAgKi9cbiAgX3Jlc2VlZEZyb21Qb29sczogZnVuY3Rpb24gKGZ1bGwpIHtcbiAgICB2YXIgcmVzZWVkRGF0YSA9IFtdLCBzdHJlbmd0aCA9IDAsIGk7XG4gIFxuICAgIHRoaXMuX25leHRSZXNlZWQgPSByZXNlZWREYXRhWzBdID1cbiAgICAgIChuZXcgRGF0ZSgpKS52YWx1ZU9mKCkgKyB0aGlzLl9NSUxMSVNFQ09ORFNfUEVSX1JFU0VFRDtcbiAgICBcbiAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKSB7XG4gICAgICAvKiBPbiBzb21lIGJyb3dzZXJzLCB0aGlzIGlzIGNyeXB0b2dyYXBoaWNhbGx5IHJhbmRvbS4gIFNvIHdlIG1pZ2h0XG4gICAgICAgKiBhcyB3ZWxsIHRvc3MgaXQgaW4gdGhlIHBvdCBhbmQgc3Rpci4uLlxuICAgICAgICovXG4gICAgICByZXNlZWREYXRhLnB1c2goTWF0aC5yYW5kb20oKSoweDEwMDAwMDAwMHwwKTtcbiAgICB9XG4gICAgXG4gICAgZm9yIChpPTA7IGk8dGhpcy5fcG9vbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgcmVzZWVkRGF0YSA9IHJlc2VlZERhdGEuY29uY2F0KHRoaXMuX3Bvb2xzW2ldLmZpbmFsaXplKCkpO1xuICAgICBzdHJlbmd0aCArPSB0aGlzLl9wb29sRW50cm9weVtpXTtcbiAgICAgdGhpcy5fcG9vbEVudHJvcHlbaV0gPSAwO1xuICAgXG4gICAgIGlmICghZnVsbCAmJiAodGhpcy5fcmVzZWVkQ291bnQgJiAoMTw8aSkpKSB7IGJyZWFrOyB9XG4gICAgfVxuICBcbiAgICAvKiBpZiB3ZSB1c2VkIHRoZSBsYXN0IHBvb2wsIHB1c2ggYSBuZXcgb25lIG9udG8gdGhlIHN0YWNrICovXG4gICAgaWYgKHRoaXMuX3Jlc2VlZENvdW50ID49IDEgPDwgdGhpcy5fcG9vbHMubGVuZ3RoKSB7XG4gICAgIHRoaXMuX3Bvb2xzLnB1c2gobmV3IHNqY2wuaGFzaC5zaGEyNTYoKSk7XG4gICAgIHRoaXMuX3Bvb2xFbnRyb3B5LnB1c2goMCk7XG4gICAgfVxuICBcbiAgICAvKiBob3cgc3Ryb25nIHdhcyB0aGlzIHJlc2VlZD8gKi9cbiAgICB0aGlzLl9wb29sU3RyZW5ndGggLT0gc3RyZW5ndGg7XG4gICAgaWYgKHN0cmVuZ3RoID4gdGhpcy5fc3RyZW5ndGgpIHtcbiAgICAgIHRoaXMuX3N0cmVuZ3RoID0gc3RyZW5ndGg7XG4gICAgfVxuICBcbiAgICB0aGlzLl9yZXNlZWRDb3VudCArKztcbiAgICB0aGlzLl9yZXNlZWQocmVzZWVkRGF0YSk7XG4gIH0sXG4gIFxuICBfa2V5Ym9hcmRDb2xsZWN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9hZGRDdXJyZW50VGltZVRvRW50cm9weSgxKTtcbiAgfSxcbiAgXG4gIF9tb3VzZUNvbGxlY3RvcjogZnVuY3Rpb24gKGV2KSB7XG4gICAgdmFyIHggPSBldi54IHx8IGV2LmNsaWVudFggfHwgZXYub2Zmc2V0WCB8fCAwLCB5ID0gZXYueSB8fCBldi5jbGllbnRZIHx8IGV2Lm9mZnNldFkgfHwgMDtcbiAgICBzamNsLnJhbmRvbS5hZGRFbnRyb3B5KFt4LHldLCAyLCBcIm1vdXNlXCIpO1xuICAgIHRoaXMuX2FkZEN1cnJlbnRUaW1lVG9FbnRyb3B5KDApO1xuICB9LFxuICBcbiAgX2xvYWRUaW1lQ29sbGVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fYWRkQ3VycmVudFRpbWVUb0VudHJvcHkoMik7XG4gIH0sXG5cbiAgX2FkZEN1cnJlbnRUaW1lVG9FbnRyb3B5OiBmdW5jdGlvbiAoZXN0aW1hdGVkRW50cm9weSkge1xuICAgIGlmICh3aW5kb3cgJiYgd2luZG93LnBlcmZvcm1hbmNlICYmIHR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vaG93IG11Y2ggZW50cm9weSBkbyB3ZSB3YW50IHRvIGFkZCBoZXJlP1xuICAgICAgc2pjbC5yYW5kb20uYWRkRW50cm9weSh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCksIGVzdGltYXRlZEVudHJvcHksIFwibG9hZHRpbWVcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNqY2wucmFuZG9tLmFkZEVudHJvcHkoKG5ldyBEYXRlKCkpLnZhbHVlT2YoKSwgZXN0aW1hdGVkRW50cm9weSwgXCJsb2FkdGltZVwiKTtcbiAgICB9XG4gIH0sXG4gIF9hY2NlbGVyb21ldGVyQ29sbGVjdG9yOiBmdW5jdGlvbiAoZXYpIHtcbiAgICB2YXIgYWMgPSBldi5hY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5Lnh8fGV2LmFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkueXx8ZXYuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eS56O1xuICAgIHZhciBvciA9IFwiXCI7XG4gICAgaWYod2luZG93Lm9yaWVudGF0aW9uKXtcbiAgICAgIG9yID0gd2luZG93Lm9yaWVudGF0aW9uO1xuICAgIH1cbiAgICBzamNsLnJhbmRvbS5hZGRFbnRyb3B5KFthYyxvcl0sIDMsIFwiYWNjZWxlcm9tZXRlclwiKTtcbiAgICB0aGlzLl9hZGRDdXJyZW50VGltZVRvRW50cm9weSgwKTtcbiAgfSxcblxuICBfZmlyZUV2ZW50OiBmdW5jdGlvbiAobmFtZSwgYXJnKSB7XG4gICAgdmFyIGosIGNicz1zamNsLnJhbmRvbS5fY2FsbGJhY2tzW25hbWVdLCBjYnNUZW1wPVtdO1xuICAgIC8qIFRPRE86IHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiByZW1vdmluZyBjb2xsZWN0b3JzIGFuZCBmaXJpbmcgdGhlbSAqL1xuXG4gICAgLyogSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgbmVjZXNzYXJ5OyBpbiBDKyssIGl0ZXJhdGluZyBvdmVyIGFcbiAgICAgKiBjb2xsZWN0aW9uIGFuZCBtb2RpZnlpbmcgaXQgYXQgdGhlIHNhbWUgdGltZSBpcyBhIG5vLW5vLlxuICAgICAqL1xuXG4gICAgZm9yIChqIGluIGNicykge1xuICAgICAgaWYgKGNicy5oYXNPd25Qcm9wZXJ0eShqKSkge1xuICAgICAgICBjYnNUZW1wLnB1c2goY2JzW2pdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGo9MDsgajxjYnNUZW1wLmxlbmd0aDsgaisrKSB7XG4gICAgICBjYnNUZW1wW2pdKGFyZyk7XG4gICAgfVxuICB9XG59O1xuXG4vKiogYW4gaW5zdGFuY2UgZm9yIHRoZSBwcm5nLlxuKiBAc2VlIHNqY2wucHJuZ1xuKi9cbnNqY2wucmFuZG9tID0gbmV3IHNqY2wucHJuZyg2KTtcblxuKGZ1bmN0aW9uKCl7XG4gIHRyeSB7XG4gICAgdmFyIGJ1ZiwgY3J5cHQsIGdldFJhbmRvbVZhbHVlcywgYWI7XG5cblxuXG5cbiAgICAvLyBnZXQgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nIGVudHJvcHkgZGVwZW5kaW5nIG9uIHJ1bnRpbWUgZW52aXJvbm1lbnRcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMgJiYgKGNyeXB0ID0gcmVxdWlyZSgnY3J5cHRvJykpICYmIGNyeXB0LnJhbmRvbUJ5dGVzKSB7XG4gICAgICBidWYgPSBjcnlwdC5yYW5kb21CeXRlcygxMDI0LzgpO1xuXG4gICAgICBzamNsLnJhbmRvbS5hZGRFbnRyb3B5KGJ1Zi5zbGljZSgpLCAxMDI0LCBcImNyeXB0by5yYW5kb21CeXRlc1wiKTtcblxuICAgIH0gZWxzZSBpZiAod2luZG93ICYmIFVpbnQzMkFycmF5KSB7XG4gICAgICBhYiA9IG5ldyBVaW50MzJBcnJheSgzMik7XG4gICAgICBpZiAod2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgICAgICB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhYik7XG4gICAgICB9IGVsc2UgaWYgKHdpbmRvdy5tc0NyeXB0byAmJiB3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICAgIHdpbmRvdy5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYWIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBnZXQgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nIGVudHJvcHkgaW4gV2Via2l0XG4gICAgICBzamNsLnJhbmRvbS5hZGRFbnRyb3B5KGFiLCAxMDI0LCBcImNyeXB0by5nZXRSYW5kb21WYWx1ZXNcIik7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm8gZ2V0UmFuZG9tVmFsdWVzIDotKFxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKFwiVGhlcmUgd2FzIGFuIGVycm9yIGNvbGxlY3RpbmcgZW50cm9weSBmcm9tIHRoZSBicm93c2VyOlwiKTtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAvL3dlIGRvIG5vdCB3YW50IHRoZSBsaWJyYXJ5IHRvIGZhaWwgZHVlIHRvIHJhbmRvbW5lc3Mgbm90IGJlaW5nIG1haW50YWluZWQuXG4gIH1cbn0oKSk7XG4vKiogQGZpbGVPdmVydmlldyBDb252ZW5pbmNlIGZ1bmN0aW9ucyBjZW50ZXJlZCBhcm91bmQgSlNPTiBlbmNhcHN1bGF0aW9uLlxuICpcbiAqIEBhdXRob3IgRW1pbHkgU3RhcmtcbiAqIEBhdXRob3IgTWlrZSBIYW1idXJnXG4gKiBAYXV0aG9yIERhbiBCb25laFxuICovXG4gXG4gLyoqIEBuYW1lc3BhY2UgSlNPTiBlbmNhcHN1bGF0aW9uICovXG4gc2pjbC5qc29uID0ge1xuICAvKiogRGVmYXVsdCB2YWx1ZXMgZm9yIGVuY3J5cHRpb24gKi9cbiAgZGVmYXVsdHM6IHsgdjoxLCBpdGVyOjEwMDAsIGtzOjEyOCwgdHM6NjQsIG1vZGU6XCJjY21cIiwgYWRhdGE6XCJcIiwgY2lwaGVyOlwiYWVzXCIgfSxcblxuICAvKiogU2ltcGxlIGVuY3J5cHRpb24gZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfGJpdEFycmF5fSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgb3Iga2V5LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGxhaW50ZXh0IFRoZSBkYXRhIHRvIGVuY3J5cHQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1ldGVycyBpbmNsdWRpbmcgdGFnLCBpdiBhbmQgc2FsdC5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtycF0gQSByZXR1cm5lZCB2ZXJzaW9uIHdpdGggZmlsbGVkLWluIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNpcGhlciByYXcgZGF0YS5cbiAgICogQHRocm93cyB7c2pjbC5leGNlcHRpb24uaW52YWxpZH0gaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cbiAgICovXG4gIF9lbmNyeXB0OiBmdW5jdGlvbiAocGFzc3dvcmQsIHBsYWludGV4dCwgcGFyYW1zLCBycCkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBycCA9IHJwIHx8IHt9O1xuXG4gICAgdmFyIGogPSBzamNsLmpzb24sIHAgPSBqLl9hZGQoeyBpdjogc2pjbC5yYW5kb20ucmFuZG9tV29yZHMoNCwwKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGouZGVmYXVsdHMpLCB0bXAsIHBycCwgYWRhdGE7XG4gICAgai5fYWRkKHAsIHBhcmFtcyk7XG4gICAgYWRhdGEgPSBwLmFkYXRhO1xuICAgIGlmICh0eXBlb2YgcC5zYWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwLnNhbHQgPSBzamNsLmNvZGVjLmJhc2U2NC50b0JpdHMocC5zYWx0KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwLml2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwLml2ID0gc2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKHAuaXYpO1xuICAgIH1cblxuICAgIGlmICghc2pjbC5tb2RlW3AubW9kZV0gfHxcbiAgICAgICAgIXNqY2wuY2lwaGVyW3AuY2lwaGVyXSB8fFxuICAgICAgICAodHlwZW9mIHBhc3N3b3JkID09PSBcInN0cmluZ1wiICYmIHAuaXRlciA8PSAxMDApIHx8XG4gICAgICAgIChwLnRzICE9PSA2NCAmJiBwLnRzICE9PSA5NiAmJiBwLnRzICE9PSAxMjgpIHx8XG4gICAgICAgIChwLmtzICE9PSAxMjggJiYgcC5rcyAhPT0gMTkyICYmIHAua3MgIT09IDI1NikgfHxcbiAgICAgICAgKHAuaXYubGVuZ3RoIDwgMiB8fCBwLml2Lmxlbmd0aCA+IDQpKSB7XG4gICAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZW5jcnlwdDogaW52YWxpZCBwYXJhbWV0ZXJzXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRtcCA9IHNqY2wubWlzYy5jYWNoZWRQYmtkZjIocGFzc3dvcmQsIHApO1xuICAgICAgcGFzc3dvcmQgPSB0bXAua2V5LnNsaWNlKDAscC5rcy8zMik7XG4gICAgICBwLnNhbHQgPSB0bXAuc2FsdDtcbiAgICB9IGVsc2UgaWYgKHNqY2wuZWNjICYmIHBhc3N3b3JkIGluc3RhbmNlb2Ygc2pjbC5lY2MuZWxHYW1hbC5wdWJsaWNLZXkpIHtcbiAgICAgIHRtcCA9IHBhc3N3b3JkLmtlbSgpO1xuICAgICAgcC5rZW10YWcgPSB0bXAudGFnO1xuICAgICAgcGFzc3dvcmQgPSB0bXAua2V5LnNsaWNlKDAscC5rcy8zMik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGxhaW50ZXh0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwbGFpbnRleHQgPSBzamNsLmNvZGVjLnV0ZjhTdHJpbmcudG9CaXRzKHBsYWludGV4dCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGFkYXRhID0gc2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhhZGF0YSk7XG4gICAgfVxuICAgIHBycCA9IG5ldyBzamNsLmNpcGhlcltwLmNpcGhlcl0ocGFzc3dvcmQpO1xuXG4gICAgLyogcmV0dXJuIHRoZSBqc29uIGRhdGEgKi9cbiAgICBqLl9hZGQocnAsIHApO1xuICAgIHJwLmtleSA9IHBhc3N3b3JkO1xuXG4gICAgLyogZG8gdGhlIGVuY3J5cHRpb24gKi9cbiAgICBwLmN0ID0gc2pjbC5tb2RlW3AubW9kZV0uZW5jcnlwdChwcnAsIHBsYWludGV4dCwgcC5pdiwgYWRhdGEsIHAudHMpO1xuXG4gICAgLy9yZXR1cm4gai5lbmNvZGUoai5fc3VidHJhY3QocCwgai5kZWZhdWx0cykpO1xuICAgIHJldHVybiBwO1xuICB9LFxuXG4gIC8qKiBTaW1wbGUgZW5jcnlwdGlvbiBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtTdHJpbmd8Yml0QXJyYXl9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCBvciBrZXkuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwbGFpbnRleHQgVGhlIGRhdGEgdG8gZW5jcnlwdC5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbWV0ZXJzIGluY2x1ZGluZyB0YWcsIGl2IGFuZCBzYWx0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gW3JwXSBBIHJldHVybmVkIHZlcnNpb24gd2l0aCBmaWxsZWQtaW4gcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgY2lwaGVydGV4dCBzZXJpYWxpemVkIGRhdGEuXG4gICAqIEB0aHJvd3Mge3NqY2wuZXhjZXB0aW9uLmludmFsaWR9IGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQuXG4gICAqL1xuICBlbmNyeXB0OiBmdW5jdGlvbiAocGFzc3dvcmQsIHBsYWludGV4dCwgcGFyYW1zLCBycCkge1xuICAgIHZhciBqID0gc2pjbC5qc29uLCBwID0gai5fZW5jcnlwdC5hcHBseShqLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiBqLmVuY29kZShwKTtcbiAgfSxcblxuICAvKiogU2ltcGxlIGRlY3J5cHRpb24gZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfGJpdEFycmF5fSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgb3Iga2V5LlxuICAgKiBAcGFyYW0ge09iamVjdH0gY2lwaGVydGV4dCBUaGUgY2lwaGVyIHJhdyBkYXRhIHRvIGRlY3J5cHQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBBZGRpdGlvbmFsIG5vbi1kZWZhdWx0IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcnBdIEEgcmV0dXJuZWQgb2JqZWN0IHdpdGggZmlsbGVkIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHBsYWludGV4dC5cbiAgICogQHRocm93cyB7c2pjbC5leGNlcHRpb24uaW52YWxpZH0gaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cbiAgICogQHRocm93cyB7c2pjbC5leGNlcHRpb24uY29ycnVwdH0gaWYgdGhlIGNpcGhlcnRleHQgaXMgY29ycnVwdC5cbiAgICovXG4gIF9kZWNyeXB0OiBmdW5jdGlvbiAocGFzc3dvcmQsIGNpcGhlcnRleHQsIHBhcmFtcywgcnApIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgcnAgPSBycCB8fCB7fTtcblxuICAgIHZhciBqID0gc2pjbC5qc29uLCBwID0gai5fYWRkKGouX2FkZChqLl9hZGQoe30sai5kZWZhdWx0cyksY2lwaGVydGV4dCksIHBhcmFtcywgdHJ1ZSksIGN0LCB0bXAsIHBycCwgYWRhdGE9cC5hZGF0YTtcbiAgICBpZiAodHlwZW9mIHAuc2FsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcC5zYWx0ID0gc2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKHAuc2FsdCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcC5pdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcC5pdiA9IHNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhwLml2KTtcbiAgICB9XG5cbiAgICBpZiAoIXNqY2wubW9kZVtwLm1vZGVdIHx8XG4gICAgICAgICFzamNsLmNpcGhlcltwLmNpcGhlcl0gfHxcbiAgICAgICAgKHR5cGVvZiBwYXNzd29yZCA9PT0gXCJzdHJpbmdcIiAmJiBwLml0ZXIgPD0gMTAwKSB8fFxuICAgICAgICAocC50cyAhPT0gNjQgJiYgcC50cyAhPT0gOTYgJiYgcC50cyAhPT0gMTI4KSB8fFxuICAgICAgICAocC5rcyAhPT0gMTI4ICYmIHAua3MgIT09IDE5MiAmJiBwLmtzICE9PSAyNTYpIHx8XG4gICAgICAgICghcC5pdikgfHxcbiAgICAgICAgKHAuaXYubGVuZ3RoIDwgMiB8fCBwLml2Lmxlbmd0aCA+IDQpKSB7XG4gICAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZGVjcnlwdDogaW52YWxpZCBwYXJhbWV0ZXJzXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRtcCA9IHNqY2wubWlzYy5jYWNoZWRQYmtkZjIocGFzc3dvcmQsIHApO1xuICAgICAgcGFzc3dvcmQgPSB0bXAua2V5LnNsaWNlKDAscC5rcy8zMik7XG4gICAgICBwLnNhbHQgID0gdG1wLnNhbHQ7XG4gICAgfSBlbHNlIGlmIChzamNsLmVjYyAmJiBwYXNzd29yZCBpbnN0YW5jZW9mIHNqY2wuZWNjLmVsR2FtYWwuc2VjcmV0S2V5KSB7XG4gICAgICBwYXNzd29yZCA9IHBhc3N3b3JkLnVua2VtKHNqY2wuY29kZWMuYmFzZTY0LnRvQml0cyhwLmtlbXRhZykpLnNsaWNlKDAscC5rcy8zMik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGFkYXRhID0gc2pjbC5jb2RlYy51dGY4U3RyaW5nLnRvQml0cyhhZGF0YSk7XG4gICAgfVxuICAgIHBycCA9IG5ldyBzamNsLmNpcGhlcltwLmNpcGhlcl0ocGFzc3dvcmQpO1xuXG4gICAgLyogZG8gdGhlIGRlY3J5cHRpb24gKi9cbiAgICBjdCA9IHNqY2wubW9kZVtwLm1vZGVdLmRlY3J5cHQocHJwLCBwLmN0LCBwLml2LCBhZGF0YSwgcC50cyk7XG5cbiAgICAvKiByZXR1cm4gdGhlIGpzb24gZGF0YSAqL1xuICAgIGouX2FkZChycCwgcCk7XG4gICAgcnAua2V5ID0gcGFzc3dvcmQ7XG5cbiAgICByZXR1cm4gc2pjbC5jb2RlYy51dGY4U3RyaW5nLmZyb21CaXRzKGN0KTtcbiAgfSxcblxuICAvKiogU2ltcGxlIGRlY3J5cHRpb24gZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfGJpdEFycmF5fSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgb3Iga2V5LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dCB0byBkZWNyeXB0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gQWRkaXRpb25hbCBub24tZGVmYXVsdCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW3JwXSBBIHJldHVybmVkIG9iamVjdCB3aXRoIGZpbGxlZCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBwbGFpbnRleHQuXG4gICAqIEB0aHJvd3Mge3NqY2wuZXhjZXB0aW9uLmludmFsaWR9IGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQuXG4gICAqIEB0aHJvd3Mge3NqY2wuZXhjZXB0aW9uLmNvcnJ1cHR9IGlmIHRoZSBjaXBoZXJ0ZXh0IGlzIGNvcnJ1cHQuXG4gICAqL1xuICBkZWNyeXB0OiBmdW5jdGlvbiAocGFzc3dvcmQsIGNpcGhlcnRleHQsIHBhcmFtcywgcnApIHtcbiAgICB2YXIgaiA9IHNqY2wuanNvbjtcbiAgICByZXR1cm4gai5fZGVjcnlwdChwYXNzd29yZCwgai5kZWNvZGUoY2lwaGVydGV4dCksIHBhcmFtcywgcnApO1xuICB9LFxuICBcbiAgLyoqIEVuY29kZSBhIGZsYXQgc3RydWN0dXJlIGludG8gYSBKU09OIHN0cmluZy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgc3RydWN0dXJlIHRvIGVuY29kZS5cbiAgICogQHJldHVybiB7U3RyaW5nfSBBIEpTT04gc3RyaW5nLlxuICAgKiBAdGhyb3dzIHtzamNsLmV4Y2VwdGlvbi5pbnZhbGlkfSBpZiBvYmogaGFzIGEgbm9uLWFscGhhbnVtZXJpYyBwcm9wZXJ0eS5cbiAgICogQHRocm93cyB7c2pjbC5leGNlcHRpb24uYnVnfSBpZiBhIHBhcmFtZXRlciBoYXMgYW4gdW5zdXBwb3J0ZWQgdHlwZS5cbiAgICovXG4gIGVuY29kZTogZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBpLCBvdXQ9J3snLCBjb21tYT0nJztcbiAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIGlmICghaS5tYXRjaCgvXlthLXowLTldKyQvaSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZW5jb2RlOiBpbnZhbGlkIHByb3BlcnR5IG5hbWVcIik7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9IGNvbW1hICsgJ1wiJyArIGkgKyAnXCI6JztcbiAgICAgICAgY29tbWEgPSAnLCc7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlb2Ygb2JqW2ldKSB7XG4gICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgIG91dCArPSBvYmpbaV07XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICBvdXQgKz0gJ1wiJyArIGVzY2FwZShvYmpbaV0pICsgJ1wiJztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgIG91dCArPSAnXCInICsgc2pjbC5jb2RlYy5iYXNlNjQuZnJvbUJpdHMob2JqW2ldLDApICsgJ1wiJztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5idWcoXCJqc29uIGVuY29kZTogdW5zdXBwb3J0ZWQgdHlwZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0Kyd9JztcbiAgfSxcbiAgXG4gIC8qKiBEZWNvZGUgYSBzaW1wbGUgKGZsYXQpIEpTT04gc3RyaW5nIGludG8gYSBzdHJ1Y3R1cmUuICBUaGUgY2lwaGVydGV4dCxcbiAgICogYWRhdGEsIHNhbHQgYW5kIGl2IHdpbGwgYmUgYmFzZTY0LWRlY29kZWQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZy5cbiAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgZGVjb2RlZCBzdHJ1Y3R1cmUuXG4gICAqIEB0aHJvd3Mge3NqY2wuZXhjZXB0aW9uLmludmFsaWR9IGlmIHN0ciBpc24ndCAoc2ltcGxlKSBKU09OLlxuICAgKi9cbiAgZGVjb2RlOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL1xccy9nLCcnKTtcbiAgICBpZiAoIXN0ci5tYXRjaCgvXlxcey4qXFx9JC8pKSB7IFxuICAgICAgdGhyb3cgbmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJqc29uIGRlY29kZTogdGhpcyBpc24ndCBqc29uIVwiKTtcbiAgICB9XG4gICAgdmFyIGEgPSBzdHIucmVwbGFjZSgvXlxce3xcXH0kL2csICcnKS5zcGxpdCgvLC8pLCBvdXQ9e30sIGksIG07XG4gICAgZm9yIChpPTA7IGk8YS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCEobT1hW2ldLm1hdGNoKC9eKD86KFtcIiddPykoW2Etel1bYS16MC05XSopXFwxKTooPzooXFxkKyl8XCIoW2EtejAtOStcXC8lKl8uQD1cXC1dKilcIikkL2kpKSkge1xuICAgICAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcImpzb24gZGVjb2RlOiB0aGlzIGlzbid0IGpzb24hXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG1bM10pIHtcbiAgICAgICAgb3V0W21bMl1dID0gcGFyc2VJbnQobVszXSwxMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRbbVsyXV0gPSBtWzJdLm1hdGNoKC9eKGN0fHNhbHR8aXYpJC8pID8gc2pjbC5jb2RlYy5iYXNlNjQudG9CaXRzKG1bNF0pIDogdW5lc2NhcGUobVs0XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH0sXG4gIFxuICAvKiogSW5zZXJ0IGFsbCBlbGVtZW50cyBvZiBzcmMgaW50byB0YXJnZXQsIG1vZGlmeWluZyBhbmQgcmV0dXJuaW5nIHRhcmdldC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUaGUgb2JqZWN0IHRvIGJlIG1vZGlmaWVkLlxuICAgKiBAcGFyYW0ge09iamVjdH0gc3JjIFRoZSBvYmplY3QgdG8gcHVsbCBkYXRhIGZyb20uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlcXVpcmVTYW1lPWZhbHNlXSBJZiB0cnVlLCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW55IGZpZWxkIG9mIHRhcmdldCBkaWZmZXJzIGZyb20gY29ycmVzcG9uZGluZyBmaWVsZCBvZiBzcmMuXG4gICAqIEByZXR1cm4ge09iamVjdH0gdGFyZ2V0LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2FkZDogZnVuY3Rpb24gKHRhcmdldCwgc3JjLCByZXF1aXJlU2FtZSkge1xuICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkgeyB0YXJnZXQgPSB7fTsgfVxuICAgIGlmIChzcmMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdGFyZ2V0OyB9XG4gICAgdmFyIGk7XG4gICAgZm9yIChpIGluIHNyYykge1xuICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICBpZiAocmVxdWlyZVNhbWUgJiYgdGFyZ2V0W2ldICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0W2ldICE9PSBzcmNbaV0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcInJlcXVpcmVkIHBhcmFtZXRlciBvdmVycmlkZGVuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtpXSA9IHNyY1tpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfSxcbiAgXG4gIC8qKiBSZW1vdmUgYWxsIGVsZW1lbnRzIG9mIG1pbnVzIGZyb20gcGx1cy4gIERvZXMgbm90IG1vZGlmeSBwbHVzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3N1YnRyYWN0OiBmdW5jdGlvbiAocGx1cywgbWludXMpIHtcbiAgICB2YXIgb3V0ID0ge30sIGk7XG5cbiAgICBmb3IgKGkgaW4gcGx1cykge1xuICAgICAgaWYgKHBsdXMuaGFzT3duUHJvcGVydHkoaSkgJiYgcGx1c1tpXSAhPT0gbWludXNbaV0pIHtcbiAgICAgICAgb3V0W2ldID0gcGx1c1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9LFxuICBcbiAgLyoqIFJldHVybiBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgb2Ygc3JjLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2ZpbHRlcjogZnVuY3Rpb24gKHNyYywgZmlsdGVyKSB7XG4gICAgdmFyIG91dCA9IHt9LCBpO1xuICAgIGZvciAoaT0wOyBpPGZpbHRlci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHNyY1tmaWx0ZXJbaV1dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3V0W2ZpbHRlcltpXV0gPSBzcmNbZmlsdGVyW2ldXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxufTtcblxuLyoqIFNpbXBsZSBlbmNyeXB0aW9uIGZ1bmN0aW9uOyBjb252ZW5pZW50IHNob3J0aGFuZCBmb3Igc2pjbC5qc29uLmVuY3J5cHQuXG4gKiBAcGFyYW0ge1N0cmluZ3xiaXRBcnJheX0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIG9yIGtleS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwbGFpbnRleHQgVGhlIGRhdGEgdG8gZW5jcnlwdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1ldGVycyBpbmNsdWRpbmcgdGFnLCBpdiBhbmQgc2FsdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcnBdIEEgcmV0dXJuZWQgdmVyc2lvbiB3aXRoIGZpbGxlZC1pbiBwYXJhbWV0ZXJzLlxuICogQHJldHVybiB7U3RyaW5nfSBUaGUgY2lwaGVydGV4dC5cbiAqL1xuc2pjbC5lbmNyeXB0ID0gc2pjbC5qc29uLmVuY3J5cHQ7XG5cbi8qKiBTaW1wbGUgZGVjcnlwdGlvbiBmdW5jdGlvbjsgY29udmVuaWVudCBzaG9ydGhhbmQgZm9yIHNqY2wuanNvbi5kZWNyeXB0LlxuICogQHBhcmFtIHtTdHJpbmd8Yml0QXJyYXl9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCBvciBrZXkuXG4gKiBAcGFyYW0ge1N0cmluZ30gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dCB0byBkZWNyeXB0LlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIEFkZGl0aW9uYWwgbm9uLWRlZmF1bHQgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcnBdIEEgcmV0dXJuZWQgb2JqZWN0IHdpdGggZmlsbGVkIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBwbGFpbnRleHQuXG4gKi9cbnNqY2wuZGVjcnlwdCA9IHNqY2wuanNvbi5kZWNyeXB0O1xuXG4vKiogVGhlIGNhY2hlIGZvciBjYWNoZWRQYmtkZjIuXG4gKiBAcHJpdmF0ZVxuICovXG5zamNsLm1pc2MuX3Bia2RmMkNhY2hlID0ge307XG5cbi8qKiBDYWNoZWQgUEJLREYyIGtleSBkZXJpdmF0aW9uLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqXSBUaGUgZGVyaXZhdGlvbiBwYXJhbXMgKGl0ZXJhdGlvbiBjb3VudCBhbmQgb3B0aW9uYWwgc2FsdCkuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBkZXJpdmVkIGRhdGEgaW4ga2V5LCB0aGUgc2FsdCBpbiBzYWx0LlxuICovXG5zamNsLm1pc2MuY2FjaGVkUGJrZGYyID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBvYmopIHtcbiAgdmFyIGNhY2hlID0gc2pjbC5taXNjLl9wYmtkZjJDYWNoZSwgYywgY3AsIHN0ciwgc2FsdCwgaXRlcjtcbiAgXG4gIG9iaiA9IG9iaiB8fCB7fTtcbiAgaXRlciA9IG9iai5pdGVyIHx8IDEwMDA7XG4gIFxuICAvKiBvcGVuIHRoZSBjYWNoZSBmb3IgdGhpcyBwYXNzd29yZCBhbmQgaXRlcmF0aW9uIGNvdW50ICovXG4gIGNwID0gY2FjaGVbcGFzc3dvcmRdID0gY2FjaGVbcGFzc3dvcmRdIHx8IHt9O1xuICBjID0gY3BbaXRlcl0gPSBjcFtpdGVyXSB8fCB7IGZpcnN0U2FsdDogKG9iai5zYWx0ICYmIG9iai5zYWx0Lmxlbmd0aCkgP1xuICAgICAgICAgICAgICAgICAgICAgb2JqLnNhbHQuc2xpY2UoMCkgOiBzamNsLnJhbmRvbS5yYW5kb21Xb3JkcygyLDApIH07XG4gICAgICAgICAgXG4gIHNhbHQgPSAob2JqLnNhbHQgPT09IHVuZGVmaW5lZCkgPyBjLmZpcnN0U2FsdCA6IG9iai5zYWx0O1xuICBcbiAgY1tzYWx0XSA9IGNbc2FsdF0gfHwgc2pjbC5taXNjLnBia2RmMihwYXNzd29yZCwgc2FsdCwgb2JqLml0ZXIpO1xuICByZXR1cm4geyBrZXk6IGNbc2FsdF0uc2xpY2UoMCksIHNhbHQ6c2FsdC5zbGljZSgwKSB9O1xufTtcblxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQ29uc3RydWN0cyBhIG5ldyBiaWdudW0gZnJvbSBhbm90aGVyIGJpZ251bSwgYSBudW1iZXIgb3IgYSBoZXggc3RyaW5nLlxuICovXG5zamNsLmJuID0gZnVuY3Rpb24oaXQpIHtcbiAgdGhpcy5pbml0V2l0aChpdCk7XG59O1xuXG5zamNsLmJuLnByb3RvdHlwZSA9IHtcbiAgcmFkaXg6IDI0LFxuICBtYXhNdWw6IDgsXG4gIF9jbGFzczogc2pjbC5ibixcbiAgXG4gIGNvcHk6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgdGhpcy5fY2xhc3ModGhpcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoaXMgd2l0aCBpdCwgZWl0aGVyIGFzIGEgYm4sIGEgbnVtYmVyLCBvciBhIGhleCBzdHJpbmcuXG4gICAqL1xuICBpbml0V2l0aDogZnVuY3Rpb24oaXQpIHtcbiAgICB2YXIgaT0wLCBrLCBuLCBsO1xuICAgIHN3aXRjaCh0eXBlb2YgaXQpIHtcbiAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICB0aGlzLmxpbWJzID0gaXQubGltYnMuc2xpY2UoMCk7XG4gICAgICBicmVhaztcbiAgICAgIFxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHRoaXMubGltYnMgPSBbaXRdO1xuICAgICAgdGhpcy5ub3JtYWxpemUoKTtcbiAgICAgIGJyZWFrO1xuICAgICAgXG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgaXQgPSBpdC5yZXBsYWNlKC9eMHgvLCAnJyk7XG4gICAgICB0aGlzLmxpbWJzID0gW107XG4gICAgICAvLyBoYWNrXG4gICAgICBrID0gdGhpcy5yYWRpeCAvIDQ7XG4gICAgICBmb3IgKGk9MDsgaSA8IGl0Lmxlbmd0aDsgaSs9aykge1xuICAgICAgICB0aGlzLmxpbWJzLnB1c2gocGFyc2VJbnQoaXQuc3Vic3RyaW5nKE1hdGgubWF4KGl0Lmxlbmd0aCAtIGkgLSBrLCAwKSwgaXQubGVuZ3RoIC0gaSksMTYpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMubGltYnMgPSBbMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgXCJ0aGlzXCIgYW5kIFwidGhhdFwiIGFyZSBlcXVhbC4gIENhbGxzIGZ1bGxSZWR1Y2UoKS5cbiAgICogRXF1YWxpdHkgdGVzdCBpcyBpbiBjb25zdGFudCB0aW1lLlxuICAgKi9cbiAgZXF1YWxzOiBmdW5jdGlvbih0aGF0KSB7XG4gICAgaWYgKHR5cGVvZiB0aGF0ID09PSBcIm51bWJlclwiKSB7IHRoYXQgPSBuZXcgdGhpcy5fY2xhc3ModGhhdCk7IH1cbiAgICB2YXIgZGlmZmVyZW5jZSA9IDAsIGk7XG4gICAgdGhpcy5mdWxsUmVkdWNlKCk7XG4gICAgdGhhdC5mdWxsUmVkdWNlKCk7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGltYnMubGVuZ3RoIHx8IGkgPCB0aGF0LmxpbWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkaWZmZXJlbmNlIHw9IHRoaXMuZ2V0TGltYihpKSBeIHRoYXQuZ2V0TGltYihpKTtcbiAgICB9XG4gICAgcmV0dXJuIChkaWZmZXJlbmNlID09PSAwKTtcbiAgfSxcbiAgXG4gIC8qKlxuICAgKiBHZXQgdGhlIGkndGggbGltYiBvZiB0aGlzLCB6ZXJvIGlmIGkgaXMgdG9vIGxhcmdlLlxuICAgKi9cbiAgZ2V0TGltYjogZnVuY3Rpb24oaSkge1xuICAgIHJldHVybiAoaSA+PSB0aGlzLmxpbWJzLmxlbmd0aCkgPyAwIDogdGhpcy5saW1ic1tpXTtcbiAgfSxcbiAgXG4gIC8qKlxuICAgKiBDb25zdGFudCB0aW1lIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gICAqIFJldHVybnMgMSBpZiB0aGlzID49IHRoYXQsIG9yIHplcm8gb3RoZXJ3aXNlLlxuICAgKi9cbiAgZ3JlYXRlckVxdWFsczogZnVuY3Rpb24odGhhdCkge1xuICAgIGlmICh0eXBlb2YgdGhhdCA9PT0gXCJudW1iZXJcIikgeyB0aGF0ID0gbmV3IHRoaXMuX2NsYXNzKHRoYXQpOyB9XG4gICAgdmFyIGxlc3MgPSAwLCBncmVhdGVyID0gMCwgaSwgYSwgYjtcbiAgICBpID0gTWF0aC5tYXgodGhpcy5saW1icy5sZW5ndGgsIHRoYXQubGltYnMubGVuZ3RoKSAtIDE7XG4gICAgZm9yICg7IGk+PSAwOyBpLS0pIHtcbiAgICAgIGEgPSB0aGlzLmdldExpbWIoaSk7XG4gICAgICBiID0gdGhhdC5nZXRMaW1iKGkpO1xuICAgICAgZ3JlYXRlciB8PSAoYiAtIGEpICYgfmxlc3M7XG4gICAgICBsZXNzIHw9IChhIC0gYikgJiB+Z3JlYXRlcjtcbiAgICB9XG4gICAgcmV0dXJuIChncmVhdGVyIHwgfmxlc3MpID4+PiAzMTtcbiAgfSxcbiAgXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRvIGEgaGV4IHN0cmluZy5cbiAgICovXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmZ1bGxSZWR1Y2UoKTtcbiAgICB2YXIgb3V0PVwiXCIsIGksIHMsIGwgPSB0aGlzLmxpbWJzO1xuICAgIGZvciAoaT0wOyBpIDwgdGhpcy5saW1icy5sZW5ndGg7IGkrKykge1xuICAgICAgcyA9IGxbaV0udG9TdHJpbmcoMTYpO1xuICAgICAgd2hpbGUgKGkgPCB0aGlzLmxpbWJzLmxlbmd0aCAtIDEgJiYgcy5sZW5ndGggPCA2KSB7XG4gICAgICAgIHMgPSBcIjBcIiArIHM7XG4gICAgICB9XG4gICAgICBvdXQgPSBzICsgb3V0O1xuICAgIH1cbiAgICByZXR1cm4gXCIweFwiK291dDtcbiAgfSxcbiAgXG4gIC8qKiB0aGlzICs9IHRoYXQuICBEb2VzIG5vdCBub3JtYWxpemUuICovXG4gIGFkZE06IGZ1bmN0aW9uKHRoYXQpIHtcbiAgICBpZiAodHlwZW9mKHRoYXQpICE9PSBcIm9iamVjdFwiKSB7IHRoYXQgPSBuZXcgdGhpcy5fY2xhc3ModGhhdCk7IH1cbiAgICB2YXIgaSwgbD10aGlzLmxpbWJzLCBsbD10aGF0LmxpbWJzO1xuICAgIGZvciAoaT1sLmxlbmd0aDsgaTxsbC5sZW5ndGg7IGkrKykge1xuICAgICAgbFtpXSA9IDA7XG4gICAgfVxuICAgIGZvciAoaT0wOyBpPGxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsW2ldICs9IGxsW2ldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgXG4gIC8qKiB0aGlzICo9IDIuICBSZXF1aXJlcyBub3JtYWxpemVkOyBlbmRzIHVwIG5vcm1hbGl6ZWQuICovXG4gIGRvdWJsZU06IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpLCBjYXJyeT0wLCB0bXAsIHI9dGhpcy5yYWRpeCwgbT10aGlzLnJhZGl4TWFzaywgbD10aGlzLmxpbWJzO1xuICAgIGZvciAoaT0wOyBpPGwubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRtcCA9IGxbaV07XG4gICAgICB0bXAgPSB0bXArdG1wK2NhcnJ5O1xuICAgICAgbFtpXSA9IHRtcCAmIG07XG4gICAgICBjYXJyeSA9IHRtcCA+PiByO1xuICAgIH1cbiAgICBpZiAoY2FycnkpIHtcbiAgICAgIGwucHVzaChjYXJyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBcbiAgLyoqIHRoaXMgLz0gMiwgcm91bmRlZCBkb3duLiAgUmVxdWlyZXMgbm9ybWFsaXplZDsgZW5kcyB1cCBub3JtYWxpemVkLiAqL1xuICBoYWx2ZU06IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpLCBjYXJyeT0wLCB0bXAsIHI9dGhpcy5yYWRpeCwgbD10aGlzLmxpbWJzO1xuICAgIGZvciAoaT1sLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgIHRtcCA9IGxbaV07XG4gICAgICBsW2ldID0gKHRtcCtjYXJyeSk+PjE7XG4gICAgICBjYXJyeSA9ICh0bXAmMSkgPDwgcjtcbiAgICB9XG4gICAgaWYgKCFsW2wubGVuZ3RoLTFdKSB7XG4gICAgICBsLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKiogdGhpcyAtPSB0aGF0LiAgRG9lcyBub3Qgbm9ybWFsaXplLiAqL1xuICBzdWJNOiBmdW5jdGlvbih0aGF0KSB7XG4gICAgaWYgKHR5cGVvZih0aGF0KSAhPT0gXCJvYmplY3RcIikgeyB0aGF0ID0gbmV3IHRoaXMuX2NsYXNzKHRoYXQpOyB9XG4gICAgdmFyIGksIGw9dGhpcy5saW1icywgbGw9dGhhdC5saW1icztcbiAgICBmb3IgKGk9bC5sZW5ndGg7IGk8bGwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxbaV0gPSAwO1xuICAgIH1cbiAgICBmb3IgKGk9MDsgaTxsbC5sZW5ndGg7IGkrKykge1xuICAgICAgbFtpXSAtPSBsbFtpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIFxuICBtb2Q6IGZ1bmN0aW9uKHRoYXQpIHtcbiAgICB2YXIgbmVnID0gIXRoaXMuZ3JlYXRlckVxdWFscyhuZXcgc2pjbC5ibigwKSk7XG4gICAgXG4gICAgdGhhdCA9IG5ldyBzamNsLmJuKHRoYXQpLm5vcm1hbGl6ZSgpOyAvLyBjb3B5IGJlZm9yZSB3ZSBiZWdpblxuICAgIHZhciBvdXQgPSBuZXcgc2pjbC5ibih0aGlzKS5ub3JtYWxpemUoKSwgY2k9MDtcbiAgICBcbiAgICBpZiAobmVnKSBvdXQgPSAobmV3IHNqY2wuYm4oMCkpLnN1Yk0ob3V0KS5ub3JtYWxpemUoKTtcbiAgICBcbiAgICBmb3IgKDsgb3V0LmdyZWF0ZXJFcXVhbHModGhhdCk7IGNpKyspIHtcbiAgICAgIHRoYXQuZG91YmxlTSgpO1xuICAgIH1cbiAgICBcbiAgICBpZiAobmVnKSBvdXQgPSB0aGF0LnN1YihvdXQpLm5vcm1hbGl6ZSgpO1xuICAgIFxuICAgIGZvciAoOyBjaSA+IDA7IGNpLS0pIHtcbiAgICAgIHRoYXQuaGFsdmVNKCk7XG4gICAgICBpZiAob3V0LmdyZWF0ZXJFcXVhbHModGhhdCkpIHtcbiAgICAgICAgb3V0LnN1Yk0odGhhdCkubm9ybWFsaXplKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQudHJpbSgpO1xuICB9LFxuICBcbiAgLyoqIHJldHVybiBpbnZlcnNlIG1vZCBwcmltZSBwLiAgcCBtdXN0IGJlIG9kZC4gQmluYXJ5IGV4dGVuZGVkIEV1Y2xpZGVhbiBhbGdvcml0aG0gbW9kIHAuICovXG4gIGludmVyc2VNb2Q6IGZ1bmN0aW9uKHApIHtcbiAgICB2YXIgYSA9IG5ldyBzamNsLmJuKDEpLCBiID0gbmV3IHNqY2wuYm4oMCksIHggPSBuZXcgc2pjbC5ibih0aGlzKSwgeSA9IG5ldyBzamNsLmJuKHApLCB0bXAsIGksIG56PTE7XG4gICAgXG4gICAgaWYgKCEocC5saW1ic1swXSAmIDEpKSB7XG4gICAgICB0aHJvdyAobmV3IHNqY2wuZXhjZXB0aW9uLmludmFsaWQoXCJpbnZlcnNlTW9kOiBwIG11c3QgYmUgb2RkXCIpKTtcbiAgICB9XG4gICAgXG4gICAgLy8gaW52YXJpYW50OiB5IGlzIG9kZFxuICAgIGRvIHtcbiAgICAgIGlmICh4LmxpbWJzWzBdICYgMSkge1xuICAgICAgICBpZiAoIXguZ3JlYXRlckVxdWFscyh5KSkge1xuICAgICAgICAgIC8vIHggPCB5OyBzd2FwIGV2ZXJ5dGhpbmdcbiAgICAgICAgICB0bXAgPSB4OyB4ID0geTsgeSA9IHRtcDtcbiAgICAgICAgICB0bXAgPSBhOyBhID0gYjsgYiA9IHRtcDtcbiAgICAgICAgfVxuICAgICAgICB4LnN1Yk0oeSk7XG4gICAgICAgIHgubm9ybWFsaXplKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWEuZ3JlYXRlckVxdWFscyhiKSkge1xuICAgICAgICAgIGEuYWRkTShwKTtcbiAgICAgICAgfVxuICAgICAgICBhLnN1Yk0oYik7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIGN1dCBldmVyeXRoaW5nIGluIGhhbGZcbiAgICAgIHguaGFsdmVNKCk7XG4gICAgICBpZiAoYS5saW1ic1swXSAmIDEpIHtcbiAgICAgICAgYS5hZGRNKHApO1xuICAgICAgfVxuICAgICAgYS5ub3JtYWxpemUoKTtcbiAgICAgIGEuaGFsdmVNKCk7XG4gICAgICBcbiAgICAgIC8vIGNoZWNrIGZvciB0ZXJtaW5hdGlvbjogeCA/PSAwXG4gICAgICBmb3IgKGk9bno9MDsgaTx4LmxpbWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG56IHw9IHgubGltYnNbaV07XG4gICAgICB9XG4gICAgfSB3aGlsZShueik7XG4gICAgXG4gICAgaWYgKCF5LmVxdWFscygxKSkge1xuICAgICAgdGhyb3cgKG5ldyBzamNsLmV4Y2VwdGlvbi5pbnZhbGlkKFwiaW52ZXJzZU1vZDogcCBhbmQgeCBtdXN0IGJlIHJlbGF0aXZlbHkgcHJpbWVcIikpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYjtcbiAgfSxcbiAgXG4gIC8qKiB0aGlzICsgdGhhdC4gIERvZXMgbm90IG5vcm1hbGl6ZS4gKi9cbiAgYWRkOiBmdW5jdGlvbih0aGF0KSB7XG4gICAgcmV0dXJuIHRoaXMuY29weSgpLmFkZE0odGhhdCk7XG4gIH0sXG5cbiAgLyoqIHRoaXMgLSB0aGF0LiAgRG9lcyBub3Qgbm9ybWFsaXplLiAqL1xuICBzdWI6IGZ1bmN0aW9uKHRoYXQpIHtcbiAgICByZXR1cm4gdGhpcy5jb3B5KCkuc3ViTSh0aGF0KTtcbiAgfSxcbiAgXG4gIC8qKiB0aGlzICogdGhhdC4gIE5vcm1hbGl6ZXMgYW5kIHJlZHVjZXMuICovXG4gIG11bDogZnVuY3Rpb24odGhhdCkge1xuICAgIGlmICh0eXBlb2YodGhhdCkgPT09IFwibnVtYmVyXCIpIHsgdGhhdCA9IG5ldyB0aGlzLl9jbGFzcyh0aGF0KTsgfVxuICAgIHZhciBpLCBqLCBhID0gdGhpcy5saW1icywgYiA9IHRoYXQubGltYnMsIGFsID0gYS5sZW5ndGgsIGJsID0gYi5sZW5ndGgsIG91dCA9IG5ldyB0aGlzLl9jbGFzcygpLCBjID0gb3V0LmxpbWJzLCBhaSwgaWk9dGhpcy5tYXhNdWw7XG5cbiAgICBmb3IgKGk9MDsgaSA8IHRoaXMubGltYnMubGVuZ3RoICsgdGhhdC5saW1icy5sZW5ndGggKyAxOyBpKyspIHtcbiAgICAgIGNbaV0gPSAwO1xuICAgIH1cbiAgICBmb3IgKGk9MDsgaTxhbDsgaSsrKSB7XG4gICAgICBhaSA9IGFbaV07XG4gICAgICBmb3IgKGo9MDsgajxibDsgaisrKSB7XG4gICAgICAgIGNbaStqXSArPSBhaSAqIGJbal07XG4gICAgICB9XG4gICAgIFxuICAgICAgaWYgKCEtLWlpKSB7XG4gICAgICAgIGlpID0gdGhpcy5tYXhNdWw7XG4gICAgICAgIG91dC5jbm9ybWFsaXplKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQuY25vcm1hbGl6ZSgpLnJlZHVjZSgpO1xuICB9LFxuXG4gIC8qKiB0aGlzIF4gMi4gIE5vcm1hbGl6ZXMgYW5kIHJlZHVjZXMuICovXG4gIHNxdWFyZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKHRoaXMpO1xuICB9LFxuXG4gIC8qKiB0aGlzIF4gbi4gIFVzZXMgc3F1YXJlLWFuZC1tdWx0aXBseS4gIE5vcm1hbGl6ZXMgYW5kIHJlZHVjZXMuICovXG4gIHBvd2VyOiBmdW5jdGlvbihsKSB7XG4gICAgaWYgKHR5cGVvZihsKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbCA9IFtsXTtcbiAgICB9IGVsc2UgaWYgKGwubGltYnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbCA9IGwubm9ybWFsaXplKCkubGltYnM7XG4gICAgfVxuICAgIHZhciBpLCBqLCBvdXQgPSBuZXcgdGhpcy5fY2xhc3MoMSksIHBvdyA9IHRoaXM7XG5cbiAgICBmb3IgKGk9MDsgaTxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGo9MDsgajx0aGlzLnJhZGl4OyBqKyspIHtcbiAgICAgICAgaWYgKGxbaV0gJiAoMTw8aikpIHtcbiAgICAgICAgICBvdXQgPSBvdXQubXVsKHBvdyk7XG4gICAgICAgIH1cbiAgICAgICAgcG93ID0gcG93LnNxdWFyZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gb3V0O1xuICB9LFxuXG4gIC8qKiB0aGlzICogdGhhdCBtb2QgTiAqL1xuICBtdWxtb2Q6IGZ1bmN0aW9uKHRoYXQsIE4pIHtcbiAgICByZXR1cm4gdGhpcy5tb2QoTikubXVsKHRoYXQubW9kKE4pKS5tb2QoTik7XG4gIH0sXG5cbiAgLyoqIHRoaXMgXiB4IG1vZCBOICovXG4gIHBvd2VybW9kOiBmdW5jdGlvbih4LCBOKSB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBzamNsLmJuKDEpLCBhID0gbmV3IHNqY2wuYm4odGhpcyksIGsgPSBuZXcgc2pjbC5ibih4KTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGsubGltYnNbMF0gJiAxKSB7IHJlc3VsdCA9IHJlc3VsdC5tdWxtb2QoYSwgTik7IH1cbiAgICAgIGsuaGFsdmVNKCk7XG4gICAgICBpZiAoay5lcXVhbHMoMCkpIHsgYnJlYWs7IH1cbiAgICAgIGEgPSBhLm11bG1vZChhLCBOKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5ub3JtYWxpemUoKS5yZWR1Y2UoKTtcbiAgfSxcblxuICB0cmltOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbCA9IHRoaXMubGltYnMsIHA7XG4gICAgZG8ge1xuICAgICAgcCA9IGwucG9wKCk7XG4gICAgfSB3aGlsZSAobC5sZW5ndGggJiYgcCA9PT0gMCk7XG4gICAgbC5wdXNoKHApO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBcbiAgLyoqIFJlZHVjZSBtb2QgYSBtb2R1bHVzLiAgU3R1YmJlZCBmb3Igc3ViY2xhc3NpbmcuICovXG4gIHJlZHVjZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqIFJlZHVjZSBhbmQgbm9ybWFsaXplLiAqL1xuICBmdWxsUmVkdWNlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcbiAgfSxcbiAgXG4gIC8qKiBQcm9wYWdhdGUgY2Fycmllcy4gKi9cbiAgbm9ybWFsaXplOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2Fycnk9MCwgaSwgcHYgPSB0aGlzLnBsYWNlVmFsLCBpcHYgPSB0aGlzLmlwdiwgbCwgbSwgbGltYnMgPSB0aGlzLmxpbWJzLCBsbCA9IGxpbWJzLmxlbmd0aCwgbWFzayA9IHRoaXMucmFkaXhNYXNrO1xuICAgIGZvciAoaT0wOyBpIDwgbGwgfHwgKGNhcnJ5ICE9PSAwICYmIGNhcnJ5ICE9PSAtMSk7IGkrKykge1xuICAgICAgbCA9IChsaW1ic1tpXXx8MCkgKyBjYXJyeTtcbiAgICAgIG0gPSBsaW1ic1tpXSA9IGwgJiBtYXNrO1xuICAgICAgY2FycnkgPSAobC1tKSppcHY7XG4gICAgfVxuICAgIGlmIChjYXJyeSA9PT0gLTEpIHtcbiAgICAgIGxpbWJzW2ktMV0gLT0gdGhpcy5wbGFjZVZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqIENvbnN0YW50LXRpbWUgbm9ybWFsaXplLiBEb2VzIG5vdCBhbGxvY2F0ZSBhZGRpdGlvbmFsIHNwYWNlLiAqL1xuICBjbm9ybWFsaXplOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2Fycnk9MCwgaSwgaXB2ID0gdGhpcy5pcHYsIGwsIG0sIGxpbWJzID0gdGhpcy5saW1icywgbGwgPSBsaW1icy5sZW5ndGgsIG1hc2sgPSB0aGlzLnJhZGl4TWFzaztcbiAgICBmb3IgKGk9MDsgaSA8IGxsLTE7IGkrKykge1xuICAgICAgbCA9IGxpbWJzW2ldICsgY2Fycnk7XG4gICAgICBtID0gbGltYnNbaV0gPSBsICYgbWFzaztcbiAgICAgIGNhcnJ5ID0gKGwtbSkqaXB2O1xuICAgIH1cbiAgICBsaW1ic1tpXSArPSBjYXJyeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgXG4gIC8qKiBTZXJpYWxpemUgdG8gYSBiaXQgYXJyYXkgKi9cbiAgdG9CaXRzOiBmdW5jdGlvbihsZW4pIHtcbiAgICB0aGlzLmZ1bGxSZWR1Y2UoKTtcbiAgICBsZW4gPSBsZW4gfHwgdGhpcy5leHBvbmVudCB8fCB0aGlzLmJpdExlbmd0aCgpO1xuICAgIHZhciBpID0gTWF0aC5mbG9vcigobGVuLTEpLzI0KSwgdz1zamNsLmJpdEFycmF5LCBlID0gKGxlbiArIDcgJiAtOCkgJSB0aGlzLnJhZGl4IHx8IHRoaXMucmFkaXgsXG4gICAgICAgIG91dCA9IFt3LnBhcnRpYWwoZSwgdGhpcy5nZXRMaW1iKGkpKV07XG4gICAgZm9yIChpLS07IGkgPj0gMDsgaS0tKSB7XG4gICAgICBvdXQgPSB3LmNvbmNhdChvdXQsIFt3LnBhcnRpYWwoTWF0aC5taW4odGhpcy5yYWRpeCxsZW4pLCB0aGlzLmdldExpbWIoaSkpXSk7XG4gICAgICBsZW4gLT0gdGhpcy5yYWRpeDtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfSxcbiAgXG4gIC8qKiBSZXR1cm4gdGhlIGxlbmd0aCBpbiBiaXRzLCByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGJ5dGUuICovXG4gIGJpdExlbmd0aDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5mdWxsUmVkdWNlKCk7XG4gICAgdmFyIG91dCA9IHRoaXMucmFkaXggKiAodGhpcy5saW1icy5sZW5ndGggLSAxKSxcbiAgICAgICAgYiA9IHRoaXMubGltYnNbdGhpcy5saW1icy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKDsgYjsgYiA+Pj49IDEpIHtcbiAgICAgIG91dCArKztcbiAgICB9XG4gICAgcmV0dXJuIG91dCs3ICYgLTg7XG4gIH1cbn07XG5cbi8qKiBAbWVtYmVyT2Ygc2pjbC5iblxuKiBAdGhpcyB7IHNqY2wuYm4gfVxuKi9cbnNqY2wuYm4uZnJvbUJpdHMgPSBmdW5jdGlvbihiaXRzKSB7XG4gIHZhciBDbGFzcyA9IHRoaXMsIG91dCA9IG5ldyBDbGFzcygpLCB3b3Jkcz1bXSwgdz1zamNsLmJpdEFycmF5LCB0ID0gdGhpcy5wcm90b3R5cGUsXG4gICAgICBsID0gTWF0aC5taW4odGhpcy5iaXRMZW5ndGggfHwgMHgxMDAwMDAwMDAsIHcuYml0TGVuZ3RoKGJpdHMpKSwgZSA9IGwgJSB0LnJhZGl4IHx8IHQucmFkaXg7XG4gIFxuICB3b3Jkc1swXSA9IHcuZXh0cmFjdChiaXRzLCAwLCBlKTtcbiAgZm9yICg7IGUgPCBsOyBlICs9IHQucmFkaXgpIHtcbiAgICB3b3Jkcy51bnNoaWZ0KHcuZXh0cmFjdChiaXRzLCBlLCB0LnJhZGl4KSk7XG4gIH1cblxuICBvdXQubGltYnMgPSB3b3JkcztcbiAgcmV0dXJuIG91dDtcbn07XG5cblxuXG5zamNsLmJuLnByb3RvdHlwZS5pcHYgPSAxIC8gKHNqY2wuYm4ucHJvdG90eXBlLnBsYWNlVmFsID0gTWF0aC5wb3coMixzamNsLmJuLnByb3RvdHlwZS5yYWRpeCkpO1xuc2pjbC5ibi5wcm90b3R5cGUucmFkaXhNYXNrID0gKDEgPDwgc2pjbC5ibi5wcm90b3R5cGUucmFkaXgpIC0gMTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHN1YmNsYXNzIG9mIGJuLCBiYXNlZCBvbiByZWR1Y3Rpb24gbW9kdWxvIGEgcHNldWRvLU1lcnNlbm5lIHByaW1lLFxuICogaS5lLiBhIHByaW1lIG9mIHRoZSBmb3JtIDJeZSArIHN1bShhICogMl5iKSx3aGVyZSB0aGUgc3VtIGlzIG5lZ2F0aXZlIGFuZCBzcGFyc2UuXG4gKi9cbnNqY2wuYm4ucHNldWRvTWVyc2VubmVQcmltZSA9IGZ1bmN0aW9uKGV4cG9uZW50LCBjb2VmZikge1xuICAvKiogQGNvbnN0cnVjdG9yIFxuICAqIEBwcml2YXRlXG4gICovXG4gIGZ1bmN0aW9uIHAoaXQpIHtcbiAgICB0aGlzLmluaXRXaXRoKGl0KTtcbiAgICAvKmlmICh0aGlzLmxpbWJzW3RoaXMubW9kT2Zmc2V0XSkge1xuICAgICAgdGhpcy5yZWR1Y2UoKTtcbiAgICB9Ki9cbiAgfVxuXG4gIHZhciBwcHIgPSBwLnByb3RvdHlwZSA9IG5ldyBzamNsLmJuKCksIGksIHRtcCwgbW87XG4gIG1vID0gcHByLm1vZE9mZnNldCA9IE1hdGguY2VpbCh0bXAgPSBleHBvbmVudCAvIHBwci5yYWRpeCk7XG4gIHBwci5leHBvbmVudCA9IGV4cG9uZW50O1xuICBwcHIub2Zmc2V0ID0gW107XG4gIHBwci5mYWN0b3IgPSBbXTtcbiAgcHByLm1pbk9mZnNldCA9IG1vO1xuICBwcHIuZnVsbE1hc2sgPSAwO1xuICBwcHIuZnVsbE9mZnNldCA9IFtdO1xuICBwcHIuZnVsbEZhY3RvciA9IFtdO1xuICBwcHIubW9kdWx1cyA9IHAubW9kdWx1cyA9IG5ldyBzamNsLmJuKE1hdGgucG93KDIsZXhwb25lbnQpKTtcbiAgXG4gIHBwci5mdWxsTWFzayA9IDB8LU1hdGgucG93KDIsIGV4cG9uZW50ICUgcHByLnJhZGl4KTtcblxuICBmb3IgKGk9MDsgaTxjb2VmZi5sZW5ndGg7IGkrKykge1xuICAgIHBwci5vZmZzZXRbaV0gPSBNYXRoLmZsb29yKGNvZWZmW2ldWzBdIC8gcHByLnJhZGl4IC0gdG1wKTtcbiAgICBwcHIuZnVsbE9mZnNldFtpXSA9IE1hdGguY2VpbChjb2VmZltpXVswXSAvIHBwci5yYWRpeCAtIHRtcCk7XG4gICAgcHByLmZhY3RvcltpXSA9IGNvZWZmW2ldWzFdICogTWF0aC5wb3coMS8yLCBleHBvbmVudCAtIGNvZWZmW2ldWzBdICsgcHByLm9mZnNldFtpXSAqIHBwci5yYWRpeCk7XG4gICAgcHByLmZ1bGxGYWN0b3JbaV0gPSBjb2VmZltpXVsxXSAqIE1hdGgucG93KDEvMiwgZXhwb25lbnQgLSBjb2VmZltpXVswXSArIHBwci5mdWxsT2Zmc2V0W2ldICogcHByLnJhZGl4KTtcbiAgICBwcHIubW9kdWx1cy5hZGRNKG5ldyBzamNsLmJuKE1hdGgucG93KDIsY29lZmZbaV1bMF0pKmNvZWZmW2ldWzFdKSk7XG4gICAgcHByLm1pbk9mZnNldCA9IE1hdGgubWluKHBwci5taW5PZmZzZXQsIC1wcHIub2Zmc2V0W2ldKTsgLy8gY29uc2VydmF0aXZlXG4gIH1cbiAgcHByLl9jbGFzcyA9IHA7XG4gIHBwci5tb2R1bHVzLmNub3JtYWxpemUoKTtcblxuICAvKiogQXBwcm94aW1hdGUgcmVkdWN0aW9uIG1vZCBwLiAgTWF5IGxlYXZlIGEgbnVtYmVyIHdoaWNoIGlzIG5lZ2F0aXZlIG9yIHNsaWdodGx5IGxhcmdlciB0aGFuIHAuXG4gICAqIEBtZW1iZXJvZiBzamNsLmJuXG4gICAqIEB0aGlzIHsgc2pjbC5ibiB9XG4gICAqL1xuICBwcHIucmVkdWNlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGksIGssIGwsIG1vID0gdGhpcy5tb2RPZmZzZXQsIGxpbWJzID0gdGhpcy5saW1icywgYWZmLCBvZmYgPSB0aGlzLm9mZnNldCwgb2wgPSB0aGlzLm9mZnNldC5sZW5ndGgsIGZhYyA9IHRoaXMuZmFjdG9yLCBsbDtcblxuICAgIGkgPSB0aGlzLm1pbk9mZnNldDtcbiAgICB3aGlsZSAobGltYnMubGVuZ3RoID4gbW8pIHtcbiAgICAgIGwgPSBsaW1icy5wb3AoKTtcbiAgICAgIGxsID0gbGltYnMubGVuZ3RoO1xuICAgICAgZm9yIChrPTA7IGs8b2w7IGsrKykge1xuICAgICAgICBsaW1ic1tsbCtvZmZba11dIC09IGZhY1trXSAqIGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGktLTtcbiAgICAgIGlmICghaSkge1xuICAgICAgICBsaW1icy5wdXNoKDApO1xuICAgICAgICB0aGlzLmNub3JtYWxpemUoKTtcbiAgICAgICAgaSA9IHRoaXMubWluT2Zmc2V0O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNub3JtYWxpemUoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBcbiAgLyoqIEBtZW1iZXJvZiBzamNsLmJuXG4gICogQHRoaXMgeyBzamNsLmJuIH1cbiAgKi9cbiAgcHByLl9zdHJvbmdSZWR1Y2UgPSAocHByLmZ1bGxNYXNrID09PSAtMSkgPyBwcHIucmVkdWNlIDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxpbWJzID0gdGhpcy5saW1icywgaSA9IGxpbWJzLmxlbmd0aCAtIDEsIGssIGw7XG4gICAgdGhpcy5yZWR1Y2UoKTtcbiAgICBpZiAoaSA9PT0gdGhpcy5tb2RPZmZzZXQgLSAxKSB7XG4gICAgICBsID0gbGltYnNbaV0gJiB0aGlzLmZ1bGxNYXNrO1xuICAgICAgbGltYnNbaV0gLT0gbDtcbiAgICAgIGZvciAoaz0wOyBrPHRoaXMuZnVsbE9mZnNldC5sZW5ndGg7IGsrKykge1xuICAgICAgICBsaW1ic1tpK3RoaXMuZnVsbE9mZnNldFtrXV0gLT0gdGhpcy5mdWxsRmFjdG9yW2tdICogbDtcbiAgICAgIH1cbiAgICAgIHRoaXMubm9ybWFsaXplKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBtb3N0bHkgY29uc3RhbnQtdGltZSwgdmVyeSBleHBlbnNpdmUgZnVsbCByZWR1Y3Rpb24uXG4gICAqIEBtZW1iZXJvZiBzamNsLmJuXG4gICAqIEB0aGlzIHsgc2pjbC5ibiB9XG4gICAqL1xuICBwcHIuZnVsbFJlZHVjZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBncmVhdGVyLCBpO1xuICAgIC8vIG1hc3NpdmVseSBhYm92ZSB0aGUgbW9kdWx1cywgbWF5IGJlIG5lZ2F0aXZlXG4gICAgXG4gICAgdGhpcy5fc3Ryb25nUmVkdWNlKCk7XG4gICAgLy8gbGVzcyB0aGFuIHR3aWNlIHRoZSBtb2R1bHVzLCBtYXkgYmUgbmVnYXRpdmVcblxuICAgIHRoaXMuYWRkTSh0aGlzLm1vZHVsdXMpO1xuICAgIHRoaXMuYWRkTSh0aGlzLm1vZHVsdXMpO1xuICAgIHRoaXMubm9ybWFsaXplKCk7XG4gICAgLy8gcHJvYmFibHkgMi0zeCB0aGUgbW9kdWx1c1xuICAgIFxuICAgIHRoaXMuX3N0cm9uZ1JlZHVjZSgpO1xuICAgIC8vIGxlc3MgdGhhbiB0aGUgcG93ZXIgb2YgMi4gIHN0aWxsIG1heSBiZSBtb3JlIHRoYW5cbiAgICAvLyB0aGUgbW9kdWx1c1xuXG4gICAgLy8gSEFDSzogcGFkIG91dCB0byB0aGlzIGxlbmd0aFxuICAgIGZvciAoaT10aGlzLmxpbWJzLmxlbmd0aDsgaTx0aGlzLm1vZE9mZnNldDsgaSsrKSB7XG4gICAgICB0aGlzLmxpbWJzW2ldID0gMDtcbiAgICB9XG4gICAgXG4gICAgLy8gY29uc3RhbnQtdGltZSBzdWJ0cmFjdCBtb2R1bHVzXG4gICAgZ3JlYXRlciA9IHRoaXMuZ3JlYXRlckVxdWFscyh0aGlzLm1vZHVsdXMpO1xuICAgIGZvciAoaT0wOyBpPHRoaXMubGltYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMubGltYnNbaV0gLT0gdGhpcy5tb2R1bHVzLmxpbWJzW2ldICogZ3JlYXRlcjtcbiAgICB9XG4gICAgdGhpcy5jbm9ybWFsaXplKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuXG4gIC8qKiBAbWVtYmVyb2Ygc2pjbC5iblxuICAqIEB0aGlzIHsgc2pjbC5ibiB9XG4gICovXG4gIHBwci5pbnZlcnNlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICh0aGlzLnBvd2VyKHRoaXMubW9kdWx1cy5zdWIoMikpKTtcbiAgfTtcblxuICBwLmZyb21CaXRzID0gc2pjbC5ibi5mcm9tQml0cztcblxuICByZXR1cm4gcDtcbn07XG5cbi8vIGEgc21hbGwgTWVyc2VubmUgcHJpbWVcbnZhciBzYnAgPSBzamNsLmJuLnBzZXVkb01lcnNlbm5lUHJpbWU7XG5zamNsLmJuLnByaW1lID0ge1xuICBwMTI3OiBzYnAoMTI3LCBbWzAsLTFdXSksXG5cbiAgLy8gQmVybnN0ZWluJ3MgcHJpbWUgZm9yIEN1cnZlMjU1MTlcbiAgcDI1NTE5OiBzYnAoMjU1LCBbWzAsLTE5XV0pLFxuXG4gIC8vIEtvYmxpdHogcHJpbWVzXG4gIHAxOTJrOiBzYnAoMTkyLCBbWzMyLC0xXSxbMTIsLTFdLFs4LC0xXSxbNywtMV0sWzYsLTFdLFszLC0xXSxbMCwtMV1dKSxcbiAgcDIyNGs6IHNicCgyMjQsIFtbMzIsLTFdLFsxMiwtMV0sWzExLC0xXSxbOSwtMV0sWzcsLTFdLFs0LC0xXSxbMSwtMV0sWzAsLTFdXSksXG4gIHAyNTZrOiBzYnAoMjU2LCBbWzMyLC0xXSxbOSwtMV0sWzgsLTFdLFs3LC0xXSxbNiwtMV0sWzQsLTFdLFswLC0xXV0pLFxuXG4gIC8vIE5JU1QgcHJpbWVzXG4gIHAxOTI6IHNicCgxOTIsIFtbMCwtMV0sWzY0LC0xXV0pLFxuICBwMjI0OiBzYnAoMjI0LCBbWzAsMV0sWzk2LC0xXV0pLFxuICBwMjU2OiBzYnAoMjU2LCBbWzAsLTFdLFs5NiwxXSxbMTkyLDFdLFsyMjQsLTFdXSksXG4gIHAzODQ6IHNicCgzODQsIFtbMCwtMV0sWzMyLDFdLFs5NiwtMV0sWzEyOCwtMV1dKSxcbiAgcDUyMTogc2JwKDUyMSwgW1swLC0xXV0pXG59O1xuXG5zamNsLmJuLnJhbmRvbSA9IGZ1bmN0aW9uKG1vZHVsdXMsIHBhcmFub2lhKSB7XG4gIGlmICh0eXBlb2YgbW9kdWx1cyAhPT0gXCJvYmplY3RcIikgeyBtb2R1bHVzID0gbmV3IHNqY2wuYm4obW9kdWx1cyk7IH1cbiAgdmFyIHdvcmRzLCBpLCBsID0gbW9kdWx1cy5saW1icy5sZW5ndGgsIG0gPSBtb2R1bHVzLmxpbWJzW2wtMV0rMSwgb3V0ID0gbmV3IHNqY2wuYm4oKTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyBnZXQgYSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCBkaWdpdHMgbWFrZSBzZW5zZVxuICAgIGRvIHtcbiAgICAgIHdvcmRzID0gc2pjbC5yYW5kb20ucmFuZG9tV29yZHMobCwgcGFyYW5vaWEpO1xuICAgICAgaWYgKHdvcmRzW2wtMV0gPCAwKSB7IHdvcmRzW2wtMV0gKz0gMHgxMDAwMDAwMDA7IH1cbiAgICB9IHdoaWxlIChNYXRoLmZsb29yKHdvcmRzW2wtMV0gLyBtKSA9PT0gTWF0aC5mbG9vcigweDEwMDAwMDAwMCAvIG0pKTtcbiAgICB3b3Jkc1tsLTFdICU9IG07XG5cbiAgICAvLyBtYXNrIG9mZiBhbGwgdGhlIGxpbWJzXG4gICAgZm9yIChpPTA7IGk8bC0xOyBpKyspIHtcbiAgICAgIHdvcmRzW2ldICY9IG1vZHVsdXMucmFkaXhNYXNrO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIHRoZSByZXN0IG9mIHRoZSBkaWdpdHNzalxuICAgIG91dC5saW1icyA9IHdvcmRzO1xuICAgIGlmICghb3V0LmdyZWF0ZXJFcXVhbHMobW9kdWx1cykpIHtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIGJhc2UgY2xhc3MgZm9yIGFsbCBlY2Mgb3BlcmF0aW9ucy5cbiAqL1xuc2pjbC5lY2MgPSB7fTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcG9pbnQgb24gYSBjdXJ2ZSBpbiBhZmZpbmUgY29vcmRpbmF0ZXMuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7c2pjbC5lY2MuY3VydmV9IGN1cnZlIFRoZSBjdXJ2ZSB0aGF0IHRoaXMgcG9pbnQgbGllcyBvbi5cbiAqIEBwYXJhbSB7YmlnSW50fSB4IFRoZSB4IGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0ge2JpZ0ludH0geSBUaGUgeSBjb29yZGluYXRlLlxuICovXG5zamNsLmVjYy5wb2ludCA9IGZ1bmN0aW9uKGN1cnZlLHgseSkge1xuICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5pc0lkZW50aXR5ID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy5pc0lkZW50aXR5ID0gZmFsc2U7XG4gIH1cbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xufTtcblxuXG5cbnNqY2wuZWNjLnBvaW50LnByb3RvdHlwZSA9IHtcbiAgdG9KYWM6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgc2pjbC5lY2MucG9pbnRKYWModGhpcy5jdXJ2ZSwgdGhpcy54LCB0aGlzLnksIG5ldyB0aGlzLmN1cnZlLmZpZWxkKDEpKTtcbiAgfSxcblxuICBtdWx0OiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIHRoaXMudG9KYWMoKS5tdWx0KGssIHRoaXMpLnRvQWZmaW5lKCk7XG4gIH0sXG4gIFxuICAvKipcbiAgICogTXVsdGlwbHkgdGhpcyBwb2ludCBieSBrLCBhZGRlZCB0byBhZmZpbmUyKmsyLCBhbmQgcmV0dXJuIHRoZSBhbnN3ZXIgaW4gSmFjb2JpYW4gY29vcmRpbmF0ZXMuXG4gICAqIEBwYXJhbSB7YmlnSW50fSBrIFRoZSBjb2VmZmljaWVudCB0byBtdWx0aXBseSB0aGlzIGJ5LlxuICAgKiBAcGFyYW0ge2JpZ0ludH0gazIgVGhlIGNvZWZmaWNpZW50IHRvIG11bHRpcGx5IGFmZmluZTIgdGhpcyBieS5cbiAgICogQHBhcmFtIHtzamNsLmVjYy5wb2ludH0gYWZmaW5lIFRoZSBvdGhlciBwb2ludCBpbiBhZmZpbmUgY29vcmRpbmF0ZXMuXG4gICAqIEByZXR1cm4ge3NqY2wuZWNjLnBvaW50SmFjfSBUaGUgcmVzdWx0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbiBhbmQgYWRkaXRpb24sIGluIEphY29iaWFuIGNvb3JkaW5hdGVzLlxuICAgKi9cbiAgbXVsdDI6IGZ1bmN0aW9uKGssIGsyLCBhZmZpbmUyKSB7XG4gICAgcmV0dXJuIHRoaXMudG9KYWMoKS5tdWx0MihrLCB0aGlzLCBrMiwgYWZmaW5lMikudG9BZmZpbmUoKTtcbiAgfSxcbiAgXG4gIG11bHRpcGxlczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIG0sIGksIGo7XG4gICAgaWYgKHRoaXMuX211bHRpcGxlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBqID0gdGhpcy50b0phYygpLmRvdWJsKCk7XG4gICAgICBtID0gdGhpcy5fbXVsdGlwbGVzID0gW25ldyBzamNsLmVjYy5wb2ludCh0aGlzLmN1cnZlKSwgdGhpcywgai50b0FmZmluZSgpXTtcbiAgICAgIGZvciAoaT0zOyBpPDE2OyBpKyspIHtcbiAgICAgICAgaiA9IGouYWRkKHRoaXMpO1xuICAgICAgICBtLnB1c2goai50b0FmZmluZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlcztcbiAgfSxcblxuICBpc1ZhbGlkOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy55LnNxdWFyZSgpLmVxdWFscyh0aGlzLmN1cnZlLmIuYWRkKHRoaXMueC5tdWwodGhpcy5jdXJ2ZS5hLmFkZCh0aGlzLnguc3F1YXJlKCkpKSkpO1xuICB9LFxuXG4gIHRvQml0czogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNqY2wuYml0QXJyYXkuY29uY2F0KHRoaXMueC50b0JpdHMoKSwgdGhpcy55LnRvQml0cygpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcG9pbnQgb24gYSBjdXJ2ZSBpbiBKYWNvYmlhbiBjb29yZGluYXRlcy4gQ29vcmRpbmF0ZXMgY2FuIGJlIHNwZWNpZmllZCBhcyBiaWdJbnRzIG9yIHN0cmluZ3MgKHdoaWNoXG4gKiB3aWxsIGJlIGNvbnZlcnRlZCB0byBiaWdJbnRzKS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7YmlnSW50L3N0cmluZ30geCBUaGUgeCBjb29yZGluYXRlLlxuICogQHBhcmFtIHtiaWdJbnQvc3RyaW5nfSB5IFRoZSB5IGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0ge2JpZ0ludC9zdHJpbmd9IHogVGhlIHogY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7c2pjbC5lY2MuY3VydmV9IGN1cnZlIFRoZSBjdXJ2ZSB0aGF0IHRoaXMgcG9pbnQgbGllcyBvbi5cbiAqL1xuc2pjbC5lY2MucG9pbnRKYWMgPSBmdW5jdGlvbihjdXJ2ZSwgeCwgeSwgeikge1xuICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5pc0lkZW50aXR5ID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy56ID0gejtcbiAgICB0aGlzLmlzSWRlbnRpdHkgPSBmYWxzZTtcbiAgfVxuICB0aGlzLmN1cnZlID0gY3VydmU7XG59O1xuXG5zamNsLmVjYy5wb2ludEphYy5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBBZGRzIFMgYW5kIFQgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBpbiBKYWNvYmlhbiBjb29yZGluYXRlcy4gTm90ZSB0aGF0IFMgbXVzdCBiZSBpbiBKYWNvYmlhbiBjb29yZGluYXRlcyBhbmQgVCBtdXN0IGJlIGluIGFmZmluZSBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHtzamNsLmVjYy5wb2ludEphY30gUyBPbmUgb2YgdGhlIHBvaW50cyB0byBhZGQsIGluIEphY29iaWFuIGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0ge3NqY2wuZWNjLnBvaW50fSBUIFRoZSBvdGhlciBwb2ludCB0byBhZGQsIGluIGFmZmluZSBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7c2pjbC5lY2MucG9pbnRKYWN9IFRoZSBzdW0gb2YgdGhlIHR3byBwb2ludHMsIGluIEphY29iaWFuIGNvb3JkaW5hdGVzLiBcbiAgICovXG4gIGFkZDogZnVuY3Rpb24oVCkge1xuICAgIHZhciBTID0gdGhpcywgc3oyLCBjLCBkLCBjMiwgeDEsIHgyLCB4LCB5MSwgeTIsIHksIHo7XG4gICAgaWYgKFMuY3VydmUgIT09IFQuY3VydmUpIHtcbiAgICAgIHRocm93KFwic2pjbC5lY2MuYWRkKCk6IFBvaW50cyBtdXN0IGJlIG9uIHRoZSBzYW1lIGN1cnZlIHRvIGFkZCB0aGVtIVwiKTtcbiAgICB9XG5cbiAgICBpZiAoUy5pc0lkZW50aXR5KSB7XG4gICAgICByZXR1cm4gVC50b0phYygpO1xuICAgIH0gZWxzZSBpZiAoVC5pc0lkZW50aXR5KSB7XG4gICAgICByZXR1cm4gUztcbiAgICB9XG5cbiAgICBzejIgPSBTLnouc3F1YXJlKCk7XG4gICAgYyA9IFQueC5tdWwoc3oyKS5zdWJNKFMueCk7XG5cbiAgICBpZiAoYy5lcXVhbHMoMCkpIHtcbiAgICAgIGlmIChTLnkuZXF1YWxzKFQueS5tdWwoc3oyLm11bChTLnopKSkpIHtcbiAgICAgICAgLy8gc2FtZSBwb2ludFxuICAgICAgICByZXR1cm4gUy5kb3VibCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaW52ZXJzZXNcbiAgICAgICAgcmV0dXJuIG5ldyBzamNsLmVjYy5wb2ludEphYyhTLmN1cnZlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgZCA9IFQueS5tdWwoc3oyLm11bChTLnopKS5zdWJNKFMueSk7XG4gICAgYzIgPSBjLnNxdWFyZSgpO1xuXG4gICAgeDEgPSBkLnNxdWFyZSgpO1xuICAgIHgyID0gYy5zcXVhcmUoKS5tdWwoYykuYWRkTSggUy54LmFkZChTLngpLm11bChjMikgKTtcbiAgICB4ICA9IHgxLnN1Yk0oeDIpO1xuXG4gICAgeTEgPSBTLngubXVsKGMyKS5zdWJNKHgpLm11bChkKTtcbiAgICB5MiA9IFMueS5tdWwoYy5zcXVhcmUoKS5tdWwoYykpO1xuICAgIHkgID0geTEuc3ViTSh5Mik7XG5cbiAgICB6ICA9IFMuei5tdWwoYyk7XG5cbiAgICByZXR1cm4gbmV3IHNqY2wuZWNjLnBvaW50SmFjKHRoaXMuY3VydmUseCx5LHopO1xuICB9LFxuICBcbiAgLyoqXG4gICAqIGRvdWJsZXMgdGhpcyBwb2ludC5cbiAgICogQHJldHVybiB7c2pjbC5lY2MucG9pbnRKYWN9IFRoZSBkb3VibGVkIHBvaW50LlxuICAgKi9cbiAgZG91Ymw6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmlzSWRlbnRpdHkpIHsgcmV0dXJuIHRoaXM7IH1cblxuICAgIHZhclxuICAgICAgeTIgPSB0aGlzLnkuc3F1YXJlKCksXG4gICAgICBhICA9IHkyLm11bCh0aGlzLngubXVsKDQpKSxcbiAgICAgIGIgID0geTIuc3F1YXJlKCkubXVsKDgpLFxuICAgICAgejIgPSB0aGlzLnouc3F1YXJlKCksXG4gICAgICBjICA9IHRoaXMuY3VydmUuYS50b1N0cmluZygpID09IChuZXcgc2pjbC5ibigtMykpLnRvU3RyaW5nKCkgP1xuICAgICAgICAgICAgICAgIHRoaXMueC5zdWIoejIpLm11bCgzKS5tdWwodGhpcy54LmFkZCh6MikpIDpcbiAgICAgICAgICAgICAgICB0aGlzLnguc3F1YXJlKCkubXVsKDMpLmFkZCh6Mi5zcXVhcmUoKS5tdWwodGhpcy5jdXJ2ZS5hKSksXG4gICAgICB4ICA9IGMuc3F1YXJlKCkuc3ViTShhKS5zdWJNKGEpLFxuICAgICAgeSAgPSBhLnN1Yih4KS5tdWwoYykuc3ViTShiKSxcbiAgICAgIHogID0gdGhpcy55LmFkZCh0aGlzLnkpLm11bCh0aGlzLnopO1xuICAgIHJldHVybiBuZXcgc2pjbC5lY2MucG9pbnRKYWModGhpcy5jdXJ2ZSwgeCwgeSwgeik7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgcG9pbnQgY29udmVydGVkIHRvIGFmZmluZSBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7c2pjbC5lY2MucG9pbnR9IFRoZSBjb252ZXJ0ZWQgcG9pbnQuXG4gICAqL1xuICB0b0FmZmluZTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNJZGVudGl0eSB8fCB0aGlzLnouZXF1YWxzKDApKSB7XG4gICAgICByZXR1cm4gbmV3IHNqY2wuZWNjLnBvaW50KHRoaXMuY3VydmUpO1xuICAgIH1cbiAgICB2YXIgemkgPSB0aGlzLnouaW52ZXJzZSgpLCB6aTIgPSB6aS5zcXVhcmUoKTtcbiAgICByZXR1cm4gbmV3IHNqY2wuZWNjLnBvaW50KHRoaXMuY3VydmUsIHRoaXMueC5tdWwoemkyKS5mdWxsUmVkdWNlKCksIHRoaXMueS5tdWwoemkyLm11bCh6aSkpLmZ1bGxSZWR1Y2UoKSk7XG4gIH0sXG4gIFxuICAvKipcbiAgICogTXVsdGlwbHkgdGhpcyBwb2ludCBieSBrIGFuZCByZXR1cm4gdGhlIGFuc3dlciBpbiBKYWNvYmlhbiBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHtiaWdJbnR9IGsgVGhlIGNvZWZmaWNpZW50IHRvIG11bHRpcGx5IGJ5LlxuICAgKiBAcGFyYW0ge3NqY2wuZWNjLnBvaW50fSBhZmZpbmUgVGhpcyBwb2ludCBpbiBhZmZpbmUgY29vcmRpbmF0ZXMuXG4gICAqIEByZXR1cm4ge3NqY2wuZWNjLnBvaW50SmFjfSBUaGUgcmVzdWx0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbiwgaW4gSmFjb2JpYW4gY29vcmRpbmF0ZXMuXG4gICAqL1xuICBtdWx0OiBmdW5jdGlvbihrLCBhZmZpbmUpIHtcbiAgICBpZiAodHlwZW9mKGspID09PSBcIm51bWJlclwiKSB7XG4gICAgICBrID0gW2tdO1xuICAgIH0gZWxzZSBpZiAoay5saW1icyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBrID0gay5ub3JtYWxpemUoKS5saW1icztcbiAgICB9XG4gICAgXG4gICAgdmFyIGksIGosIG91dCA9IG5ldyBzamNsLmVjYy5wb2ludCh0aGlzLmN1cnZlKS50b0phYygpLCBtdWx0aXBsZXMgPSBhZmZpbmUubXVsdGlwbGVzKCk7XG5cbiAgICBmb3IgKGk9ay5sZW5ndGgtMTsgaT49MDsgaS0tKSB7XG4gICAgICBmb3IgKGo9c2pjbC5ibi5wcm90b3R5cGUucmFkaXgtNDsgaj49MDsgai09NCkge1xuICAgICAgICBvdXQgPSBvdXQuZG91YmwoKS5kb3VibCgpLmRvdWJsKCkuZG91YmwoKS5hZGQobXVsdGlwbGVzW2tbaV0+PmogJiAweEZdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG91dDtcbiAgfSxcbiAgXG4gIC8qKlxuICAgKiBNdWx0aXBseSB0aGlzIHBvaW50IGJ5IGssIGFkZGVkIHRvIGFmZmluZTIqazIsIGFuZCByZXR1cm4gdGhlIGFuc3dlciBpbiBKYWNvYmlhbiBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHtiaWdJbnR9IGsgVGhlIGNvZWZmaWNpZW50IHRvIG11bHRpcGx5IHRoaXMgYnkuXG4gICAqIEBwYXJhbSB7c2pjbC5lY2MucG9pbnR9IGFmZmluZSBUaGlzIHBvaW50IGluIGFmZmluZSBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHtiaWdJbnR9IGsyIFRoZSBjb2VmZmljaWVudCB0byBtdWx0aXBseSBhZmZpbmUyIHRoaXMgYnkuXG4gICAqIEBwYXJhbSB7c2pjbC5lY2MucG9pbnR9IGFmZmluZSBUaGUgb3RoZXIgcG9pbnQgaW4gYWZmaW5lIGNvb3JkaW5hdGVzLlxuICAgKiBAcmV0dXJuIHtzamNsLmVjYy5wb2ludEphY30gVGhlIHJlc3VsdCBvZiB0aGUgbXVsdGlwbGljYXRpb24gYW5kIGFkZGl0aW9uLCBpbiBKYWNvYmlhbiBjb29yZGluYXRlcy5cbiAgICovXG4gIG11bHQyOiBmdW5jdGlvbihrMSwgYWZmaW5lLCBrMiwgYWZmaW5lMikge1xuICAgIGlmICh0eXBlb2YoazEpID09PSBcIm51bWJlclwiKSB7XG4gICAgICBrMSA9IFtrMV07XG4gICAgfSBlbHNlIGlmIChrMS5saW1icyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBrMSA9IGsxLm5vcm1hbGl6ZSgpLmxpbWJzO1xuICAgIH1cbiAgICBcbiAgICBpZiAodHlwZW9mKGsyKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgazIgPSBbazJdO1xuICAgIH0gZWxzZSBpZiAoazIubGltYnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgazIgPSBrMi5ub3JtYWxpemUoKS5saW1icztcbiAgICB9XG4gICAgXG4gICAgdmFyIGksIGosIG91dCA9IG5ldyBzamNsLmVjYy5wb2ludCh0aGlzLmN1cnZlKS50b0phYygpLCBtMSA9IGFmZmluZS5tdWx0aXBsZXMoKSxcbiAgICAgICAgbTIgPSBhZmZpbmUyLm11bHRpcGxlcygpLCBsMSwgbDI7XG5cbiAgICBmb3IgKGk9TWF0aC5tYXgoazEubGVuZ3RoLGsyLmxlbmd0aCktMTsgaT49MDsgaS0tKSB7XG4gICAgICBsMSA9IGsxW2ldIHwgMDtcbiAgICAgIGwyID0gazJbaV0gfCAwO1xuICAgICAgZm9yIChqPXNqY2wuYm4ucHJvdG90eXBlLnJhZGl4LTQ7IGo+PTA7IGotPTQpIHtcbiAgICAgICAgb3V0ID0gb3V0LmRvdWJsKCkuZG91YmwoKS5kb3VibCgpLmRvdWJsKCkuYWRkKG0xW2wxPj5qICYgMHhGXSkuYWRkKG0yW2wyPj5qICYgMHhGXSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBvdXQ7XG4gIH0sXG5cbiAgaXNWYWxpZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHoyID0gdGhpcy56LnNxdWFyZSgpLCB6NCA9IHoyLnNxdWFyZSgpLCB6NiA9IHo0Lm11bCh6Mik7XG4gICAgcmV0dXJuIHRoaXMueS5zcXVhcmUoKS5lcXVhbHMoXG4gICAgICAgICAgICAgdGhpcy5jdXJ2ZS5iLm11bCh6NikuYWRkKHRoaXMueC5tdWwoXG4gICAgICAgICAgICAgICB0aGlzLmN1cnZlLmEubXVsKHo0KS5hZGQodGhpcy54LnNxdWFyZSgpKSkpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYW4gZWxsaXB0aWMgY3VydmUuIE1vc3QgdXNlcnMgd2lsbCBub3QgdXNlIHRoaXMgYW5kIGluc3RlYWQgc3RhcnQgd2l0aCBvbmUgb2YgdGhlIE5JU1QgY3VydmVzIGRlZmluZWQgYmVsb3cuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2JpZ0ludH0gcCBUaGUgcHJpbWUgbW9kdWx1cy5cbiAqIEBwYXJhbSB7YmlnSW50fSByIFRoZSBwcmltZSBvcmRlciBvZiB0aGUgY3VydmUuXG4gKiBAcGFyYW0ge2JpZ0ludH0gYSBUaGUgY29uc3RhbnQgYSBpbiB0aGUgZXF1YXRpb24gb2YgdGhlIGN1cnZlIHleMiA9IHheMyArIGF4ICsgYiAoZm9yIE5JU1QgY3VydmVzLCBhIGlzIGFsd2F5cyAtMykuXG4gKiBAcGFyYW0ge2JpZ0ludH0geCBUaGUgeCBjb29yZGluYXRlIG9mIGEgYmFzZSBwb2ludCBvZiB0aGUgY3VydmUuXG4gKiBAcGFyYW0ge2JpZ0ludH0geSBUaGUgeSBjb29yZGluYXRlIG9mIGEgYmFzZSBwb2ludCBvZiB0aGUgY3VydmUuXG4gKi9cbnNqY2wuZWNjLmN1cnZlID0gZnVuY3Rpb24oRmllbGQsIHIsIGEsIGIsIHgsIHkpIHtcbiAgdGhpcy5maWVsZCA9IEZpZWxkO1xuICB0aGlzLnIgPSBuZXcgc2pjbC5ibihyKTtcbiAgdGhpcy5hID0gbmV3IEZpZWxkKGEpO1xuICB0aGlzLmIgPSBuZXcgRmllbGQoYik7XG4gIHRoaXMuRyA9IG5ldyBzamNsLmVjYy5wb2ludCh0aGlzLCBuZXcgRmllbGQoeCksIG5ldyBGaWVsZCh5KSk7XG59O1xuXG5zamNsLmVjYy5jdXJ2ZS5wcm90b3R5cGUuZnJvbUJpdHMgPSBmdW5jdGlvbiAoYml0cykge1xuICB2YXIgdyA9IHNqY2wuYml0QXJyYXksIGwgPSB0aGlzLmZpZWxkLnByb3RvdHlwZS5leHBvbmVudCArIDcgJiAtOCxcbiAgICAgIHAgPSBuZXcgc2pjbC5lY2MucG9pbnQodGhpcywgdGhpcy5maWVsZC5mcm9tQml0cyh3LmJpdFNsaWNlKGJpdHMsIDAsIGwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZC5mcm9tQml0cyh3LmJpdFNsaWNlKGJpdHMsIGwsIDIqbCkpKTtcbiAgaWYgKCFwLmlzVmFsaWQoKSkge1xuICAgIHRocm93IG5ldyBzamNsLmV4Y2VwdGlvbi5jb3JydXB0KFwibm90IG9uIHRoZSBjdXJ2ZSFcIik7XG4gIH1cbiAgcmV0dXJuIHA7XG59O1xuXG5zamNsLmVjYy5jdXJ2ZXMgPSB7XG4gIGMxOTI6IG5ldyBzamNsLmVjYy5jdXJ2ZShcbiAgICBzamNsLmJuLnByaW1lLnAxOTIsXG4gICAgXCIweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjk5ZGVmODM2MTQ2YmM5YjFiNGQyMjgzMVwiLFxuICAgIC0zLFxuICAgIFwiMHg2NDIxMDUxOWU1OWM4MGU3MGZhN2U5YWI3MjI0MzA0OWZlYjhkZWVjYzE0NmI5YjFcIixcbiAgICBcIjB4MTg4ZGE4MGViMDMwOTBmNjdjYmYyMGViNDNhMTg4MDBmNGZmMGFmZDgyZmYxMDEyXCIsXG4gICAgXCIweDA3MTkyYjk1ZmZjOGRhNzg2MzEwMTFlZDZiMjRjZGQ1NzNmOTc3YTExZTc5NDgxMVwiKSxcblxuICBjMjI0OiBuZXcgc2pjbC5lY2MuY3VydmUoXG4gICAgc2pjbC5ibi5wcmltZS5wMjI0LFxuICAgIFwiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTZhMmUwYjhmMDNlMTNkZDI5NDU1YzVjMmEzZFwiLFxuICAgIC0zLFxuICAgIFwiMHhiNDA1MGE4NTBjMDRiM2FiZjU0MTMyNTY1MDQ0YjBiN2Q3YmZkOGJhMjcwYjM5NDMyMzU1ZmZiNFwiLFxuICAgIFwiMHhiNzBlMGNiZDZiYjRiZjdmMzIxMzkwYjk0YTAzYzFkMzU2YzIxMTIyMzQzMjgwZDYxMTVjMWQyMVwiLFxuICAgIFwiMHhiZDM3NjM4OGI1ZjcyM2ZiNGMyMmRmZTZjZDQzNzVhMDVhMDc0NzY0NDRkNTgxOTk4NTAwN2UzNFwiKSxcblxuICBjMjU2OiBuZXcgc2pjbC5lY2MuY3VydmUoXG4gICAgc2pjbC5ibi5wcmltZS5wMjU2LFxuICAgIFwiMHhmZmZmZmZmZjAwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmJjZTZmYWFkYTcxNzllODRmM2I5Y2FjMmZjNjMyNTUxXCIsXG4gICAgLTMsXG4gICAgXCIweDVhYzYzNWQ4YWEzYTkzZTdiM2ViYmQ1NTc2OTg4NmJjNjUxZDA2YjBjYzUzYjBmNjNiY2UzYzNlMjdkMjYwNGJcIixcbiAgICBcIjB4NmIxN2QxZjJlMTJjNDI0N2Y4YmNlNmU1NjNhNDQwZjI3NzAzN2Q4MTJkZWIzM2EwZjRhMTM5NDVkODk4YzI5NlwiLFxuICAgIFwiMHg0ZmUzNDJlMmZlMWE3ZjliOGVlN2ViNGE3YzBmOWUxNjJiY2UzMzU3NmIzMTVlY2VjYmI2NDA2ODM3YmY1MWY1XCIpLFxuXG4gIGMzODQ6IG5ldyBzamNsLmVjYy5jdXJ2ZShcbiAgICBzamNsLmJuLnByaW1lLnAzODQsXG4gICAgXCIweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmM3NjM0ZDgxZjQzNzJkZGY1ODFhMGRiMjQ4YjBhNzdhZWNlYzE5NmFjY2M1Mjk3M1wiLFxuICAgIC0zLFxuICAgIFwiMHhiMzMxMmZhN2UyM2VlN2U0OTg4ZTA1NmJlM2Y4MmQxOTE4MWQ5YzZlZmU4MTQxMTIwMzE0MDg4ZjUwMTM4NzVhYzY1NjM5OGQ4YTJlZDE5ZDJhODVjOGVkZDNlYzJhZWZcIixcbiAgICBcIjB4YWE4N2NhMjJiZThiMDUzNzhlYjFjNzFlZjMyMGFkNzQ2ZTFkM2I2MjhiYTc5Yjk4NTlmNzQxZTA4MjU0MmEzODU1MDJmMjVkYmY1NTI5NmMzYTU0NWUzODcyNzYwYWI3XCIsXG4gICAgXCIweDM2MTdkZTRhOTYyNjJjNmY1ZDllOThiZjkyOTJkYzI5ZjhmNDFkYmQyODlhMTQ3Y2U5ZGEzMTEzYjVmMGI4YzAwYTYwYjFjZTFkN2U4MTlkN2E0MzFkN2M5MGVhMGU1ZlwiKSxcblxuICBrMTkyOiBuZXcgc2pjbC5lY2MuY3VydmUoXG4gICAgc2pjbC5ibi5wcmltZS5wMTkyayxcbiAgICBcIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlMjZmMmZjMTcwZjY5NDY2YTc0ZGVmZDhkXCIsXG4gICAgMCxcbiAgICAzLFxuICAgIFwiMHhkYjRmZjEwZWMwNTdlOWFlMjZiMDdkMDI4MGI3ZjQzNDFkYTVkMWIxZWFlMDZjN2RcIixcbiAgICBcIjB4OWIyZjJmNmQ5YzU2MjhhNzg0NDE2M2QwMTViZTg2MzQ0MDgyYWE4OGQ5NWUyZjlkXCIpLFxuXG4gIGsyMjQ6IG5ldyBzamNsLmVjYy5jdXJ2ZShcbiAgICBzamNsLmJuLnByaW1lLnAyMjRrLFxuICAgIFwiMHgwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFkY2U4ZDJlYzYxODRjYWYwYTk3MTc2OWZiMWY3XCIsXG4gICAgMCxcbiAgICA1LFxuICAgIFwiMHhhMTQ1NWIzMzRkZjA5OWRmMzBmYzI4YTE2OWE0NjdlOWU0NzA3NWE5MGY3ZTY1MGViNmI3YTQ1Y1wiLFxuICAgIFwiMHg3ZTA4OWZlZDdmYmEzNDQyODJjYWZiZDZmN2UzMTlmN2MwYjBiZDU5ZTJjYTRiZGI1NTZkNjFhNVwiKSxcblxuICBrMjU2OiBuZXcgc2pjbC5lY2MuY3VydmUoXG4gICAgc2pjbC5ibi5wcmltZS5wMjU2ayxcbiAgICBcIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmViYWFlZGNlNmFmNDhhMDNiYmZkMjVlOGNkMDM2NDE0MVwiLFxuICAgIDAsXG4gICAgNyxcbiAgICBcIjB4NzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OFwiLFxuICAgIFwiMHg0ODNhZGE3NzI2YTNjNDY1NWRhNGZiZmMwZTExMDhhOGZkMTdiNDQ4YTY4NTU0MTk5YzQ3ZDA4ZmZiMTBkNGI4XCIpXG5cbn07XG5cbi8qKiBvdXIgYmFzaWNLZXkgY2xhc3Nlc1xuKi9cbnNqY2wuZWNjLmJhc2ljS2V5ID0ge1xuICAvKiogZWNjIHB1YmxpY0tleS4gXG4gICogQGNvbnN0cnVjdG9yXG4gICogQHBhcmFtIHtjdXJ2ZX0gY3VydmUgdGhlIGVsbGlwdGljIGN1cnZlXG4gICogQHBhcmFtIHtwb2ludH0gcG9pbnQgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZVxuICAqL1xuICBwdWJsaWNLZXk6IGZ1bmN0aW9uKGN1cnZlLCBwb2ludCkge1xuICAgIHRoaXMuX2N1cnZlID0gY3VydmU7XG4gICAgdGhpcy5fY3VydmVCaXRMZW5ndGggPSBjdXJ2ZS5yLmJpdExlbmd0aCgpO1xuICAgIGlmIChwb2ludCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICB0aGlzLl9wb2ludCA9IGN1cnZlLmZyb21CaXRzKHBvaW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcG9pbnQgPSBwb2ludDtcbiAgICB9XG5cbiAgICAvKiogZ2V0IHRoaXMga2V5cyBwb2ludCBkYXRhXG4gICAgKiBAcmV0dXJuIHggYW5kIHkgYXMgYml0QXJyYXlzXG4gICAgKi9cbiAgICB0aGlzLmdldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBvaW50Yml0cyA9IHRoaXMuX3BvaW50LnRvQml0cygpO1xuICAgICAgdmFyIGxlbiA9IHNqY2wuYml0QXJyYXkuYml0TGVuZ3RoKHBvaW50Yml0cyk7XG4gICAgICB2YXIgeCA9IHNqY2wuYml0QXJyYXkuYml0U2xpY2UocG9pbnRiaXRzLCAwLCBsZW4vMik7XG4gICAgICB2YXIgeSA9IHNqY2wuYml0QXJyYXkuYml0U2xpY2UocG9pbnRiaXRzLCBsZW4vMik7XG4gICAgICByZXR1cm4geyB4OiB4LCB5OiB5IH07XG4gICAgfTtcbiAgfSxcblxuICAvKiogZWNjIHNlY3JldEtleVxuICAqIEBjb25zdHJ1Y3RvclxuICAqIEBwYXJhbSB7Y3VydmV9IGN1cnZlIHRoZSBlbGxpcHRpYyBjdXJ2ZVxuICAqIEBwYXJhbSBleHBvbmVudFxuICAqL1xuICBzZWNyZXRLZXk6IGZ1bmN0aW9uKGN1cnZlLCBleHBvbmVudCkge1xuICAgIHRoaXMuX2N1cnZlID0gY3VydmU7XG4gICAgdGhpcy5fY3VydmVCaXRMZW5ndGggPSBjdXJ2ZS5yLmJpdExlbmd0aCgpO1xuICAgIHRoaXMuX2V4cG9uZW50ID0gZXhwb25lbnQ7XG5cbiAgICAvKiogZ2V0IHRoaXMga2V5cyBleHBvbmVudCBkYXRhXG4gICAgKiBAcmV0dXJuIHtiaXRBcnJheX0gZXhwb25lbnRcbiAgICAqL1xuICAgIHRoaXMuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4cG9uZW50LnRvQml0cygpO1xuICAgIH07XG4gIH1cbn07XG5cbi8qKiBAcHJpdmF0ZSAqL1xuc2pjbC5lY2MuYmFzaWNLZXkuZ2VuZXJhdGVLZXlzID0gZnVuY3Rpb24oY24pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlS2V5cyhjdXJ2ZSwgcGFyYW5vaWEsIHNlYykge1xuICAgIGN1cnZlID0gY3VydmUgfHwgMjU2O1xuICAgIHBhcmFub2lhID0gcGFyYW5vaWEgfHwgMDtcblxuICAgIGlmICh0eXBlb2YgY3VydmUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGN1cnZlID0gc2pjbC5lY2MuY3VydmVzWydjJytjdXJ2ZV07XG4gICAgICBpZiAoY3VydmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgc2pjbC5leGNlcHRpb24uaW52YWxpZChcIm5vIHN1Y2ggY3VydmVcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHNlYyA9IHNlYyB8fCBzamNsLmJuLnJhbmRvbShjdXJ2ZS5yLCBwYXJhbm9pYSk7XG5cbiAgICB2YXIgcHViID0gY3VydmUuRy5tdWx0KHNlYyk7XG4gICAgcmV0dXJuIHsgcHViOiBuZXcgc2pjbC5lY2NbY25dLnB1YmxpY0tleShjdXJ2ZSwgcHViKSxcbiAgICAgICAgICAgICBzZWM6IG5ldyBzamNsLmVjY1tjbl0uc2VjcmV0S2V5KGN1cnZlLCBzZWMpIH07XG4gIH07XG59O1xuXG4vKiogZWxHYW1hbCBrZXlzICovXG5zamNsLmVjYy5lbEdhbWFsID0ge1xuICAvKiogZ2VuZXJhdGUga2V5c1xuICAqIEBmdW5jdGlvblxuICAqIEBwYXJhbSBjdXJ2ZVxuICAqIEBwYXJhbSB7aW50fSBwYXJhbm9pYSBQYXJhbm9pYSBmb3IgZ2VuZXJhdGlvbiAoZGVmYXVsdCA2KVxuICAqIEBwYXJhbSB7c2VjcmV0S2V5fSBzZWMgc2VjcmV0IEtleSB0byB1c2UuIHVzZWQgdG8gZ2V0IHRoZSBwdWJsaWNLZXkgZm9yIG9uZXMgc2VjcmV0S2V5XG4gICovXG4gIGdlbmVyYXRlS2V5czogc2pjbC5lY2MuYmFzaWNLZXkuZ2VuZXJhdGVLZXlzKFwiZWxHYW1hbFwiKSxcbiAgLyoqIGVsR2FtYWwgcHVibGljS2V5LiBcbiAgKiBAY29uc3RydWN0b3JcbiAgKiBAYXVnbWVudHMgc2pjbC5lY2MuYmFzaWNLZXkucHVibGljS2V5XG4gICovXG4gIHB1YmxpY0tleTogZnVuY3Rpb24gKGN1cnZlLCBwb2ludCkge1xuICAgIHNqY2wuZWNjLmJhc2ljS2V5LnB1YmxpY0tleS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9LFxuICAvKiogZWxHYW1hbCBzZWNyZXRLZXlcbiAgKiBAY29uc3RydWN0b3JcbiAgKiBAYXVnbWVudHMgc2pjbC5lY2MuYmFzaWNLZXkuc2VjcmV0S2V5XG4gICovXG4gIHNlY3JldEtleTogZnVuY3Rpb24gKGN1cnZlLCBleHBvbmVudCkge1xuICAgIHNqY2wuZWNjLmJhc2ljS2V5LnNlY3JldEtleS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG5zamNsLmVjYy5lbEdhbWFsLnB1YmxpY0tleS5wcm90b3R5cGUgPSB7XG4gIC8qKiBLZW0gZnVuY3Rpb24gb2YgZWxHYW1hbCBQdWJsaWMgS2V5XG4gICogQHBhcmFtIHBhcmFub2lhIHBhcmFub2lhIHRvIHVzZSBmb3IgcmFuZG9taXphdGlvbi5cbiAgKiBAcmV0dXJuIHtvYmplY3R9IGtleSBhbmQgdGFnLiB1bmtlbSh0YWcpIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgc2VjcmV0IGtleSByZXN1bHRzIGluIHRoZSBrZXkgcmV0dXJuZWQuXG4gICovXG4gIGtlbTogZnVuY3Rpb24ocGFyYW5vaWEpIHtcbiAgICB2YXIgc2VjID0gc2pjbC5ibi5yYW5kb20odGhpcy5fY3VydmUuciwgcGFyYW5vaWEpLFxuICAgICAgICB0YWcgPSB0aGlzLl9jdXJ2ZS5HLm11bHQoc2VjKS50b0JpdHMoKSxcbiAgICAgICAga2V5ID0gc2pjbC5oYXNoLnNoYTI1Ni5oYXNoKHRoaXMuX3BvaW50Lm11bHQoc2VjKS50b0JpdHMoKSk7XG4gICAgcmV0dXJuIHsga2V5OiBrZXksIHRhZzogdGFnIH07XG4gIH1cbn07XG5cbnNqY2wuZWNjLmVsR2FtYWwuc2VjcmV0S2V5LnByb3RvdHlwZSA9IHtcbiAgLyoqIFVuS2VtIGZ1bmN0aW9uIG9mIGVsR2FtYWwgU2VjcmV0IEtleVxuICAqIEBwYXJhbSB7Yml0QXJyYXl9IHRhZyBUaGUgVGFnIHRvIGRlY3J5cHQuXG4gICogQHJldHVybiB7Yml0QXJyYXl9IGRlY3J5cHRlZCBrZXkuXG4gICovXG4gIHVua2VtOiBmdW5jdGlvbih0YWcpIHtcbiAgICByZXR1cm4gc2pjbC5oYXNoLnNoYTI1Ni5oYXNoKHRoaXMuX2N1cnZlLmZyb21CaXRzKHRhZykubXVsdCh0aGlzLl9leHBvbmVudCkudG9CaXRzKCkpO1xuICB9LFxuXG4gIC8qKiBEaWZmaWUtSGVsbG1hbm4gZnVuY3Rpb25cbiAgKiBAcGFyYW0ge2VsR2FtYWwucHVibGljS2V5fSBwayBUaGUgUHVibGljIEtleSB0byBkbyBEaWZmaWUtSGVsbG1hbm4gd2l0aFxuICAqIEByZXR1cm4ge2JpdEFycmF5fSBkaWZmaWUtaGVsbG1hbm4gcmVzdWx0IGZvciB0aGlzIGtleSBjb21iaW5hdGlvbi5cbiAgKi9cbiAgZGg6IGZ1bmN0aW9uKHBrKSB7XG4gICAgcmV0dXJuIHNqY2wuaGFzaC5zaGEyNTYuaGFzaChway5fcG9pbnQubXVsdCh0aGlzLl9leHBvbmVudCkudG9CaXRzKCkpO1xuICB9XG59O1xuXG4vKiogZWNkc2Ega2V5cyAqL1xuc2pjbC5lY2MuZWNkc2EgPSB7XG4gIC8qKiBnZW5lcmF0ZSBrZXlzXG4gICogQGZ1bmN0aW9uXG4gICogQHBhcmFtIGN1cnZlXG4gICogQHBhcmFtIHtpbnR9IHBhcmFub2lhIFBhcmFub2lhIGZvciBnZW5lcmF0aW9uIChkZWZhdWx0IDYpXG4gICogQHBhcmFtIHtzZWNyZXRLZXl9IHNlYyBzZWNyZXQgS2V5IHRvIHVzZS4gdXNlZCB0byBnZXQgdGhlIHB1YmxpY0tleSBmb3Igb25lcyBzZWNyZXRLZXlcbiAgKi9cbiAgZ2VuZXJhdGVLZXlzOiBzamNsLmVjYy5iYXNpY0tleS5nZW5lcmF0ZUtleXMoXCJlY2RzYVwiKVxufTtcblxuLyoqIGVjZHNhIHB1YmxpY0tleS4gXG4qIEBjb25zdHJ1Y3RvclxuKiBAYXVnbWVudHMgc2pjbC5lY2MuYmFzaWNLZXkucHVibGljS2V5XG4qL1xuc2pjbC5lY2MuZWNkc2EucHVibGljS2V5ID0gZnVuY3Rpb24gKGN1cnZlLCBwb2ludCkge1xuICBzamNsLmVjYy5iYXNpY0tleS5wdWJsaWNLZXkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbi8qKiBzcGVjaWZpYyBmdW5jdGlvbnMgZm9yIGVjZHNhIHB1YmxpY0tleS4gKi9cbnNqY2wuZWNjLmVjZHNhLnB1YmxpY0tleS5wcm90b3R5cGUgPSB7XG4gIC8qKiBEaWZmaWUtSGVsbG1hbm4gZnVuY3Rpb25cbiAgKiBAcGFyYW0ge2JpdEFycmF5fSBoYXNoIGhhc2ggdG8gdmVyaWZ5LiBcbiAgKiBAcGFyYW0ge2JpdEFycmF5fSBycyBzaWduYXR1cmUgYml0QXJyYXkuXG4gICogQHBhcmFtIHtib29sZWFufSAgZmFrZUxlZ2FjeVZlcnNpb24gdXNlIG9sZCBsZWdhY3kgdmVyc2lvblxuICAqL1xuICB2ZXJpZnk6IGZ1bmN0aW9uKGhhc2gsIHJzLCBmYWtlTGVnYWN5VmVyc2lvbikge1xuICAgIGlmIChzamNsLmJpdEFycmF5LmJpdExlbmd0aChoYXNoKSA+IHRoaXMuX2N1cnZlQml0TGVuZ3RoKSB7XG4gICAgICBoYXNoID0gc2pjbC5iaXRBcnJheS5jbGFtcChoYXNoLCB0aGlzLl9jdXJ2ZUJpdExlbmd0aCk7XG4gICAgfVxuICAgIHZhciB3ID0gc2pjbC5iaXRBcnJheSxcbiAgICAgICAgUiA9IHRoaXMuX2N1cnZlLnIsXG4gICAgICAgIGwgPSB0aGlzLl9jdXJ2ZUJpdExlbmd0aCxcbiAgICAgICAgciA9IHNqY2wuYm4uZnJvbUJpdHMody5iaXRTbGljZShycywwLGwpKSxcbiAgICAgICAgc3MgPSBzamNsLmJuLmZyb21CaXRzKHcuYml0U2xpY2UocnMsbCwyKmwpKSxcbiAgICAgICAgcyA9IGZha2VMZWdhY3lWZXJzaW9uID8gc3MgOiBzcy5pbnZlcnNlTW9kKFIpLFxuICAgICAgICBoRyA9IHNqY2wuYm4uZnJvbUJpdHMoaGFzaCkubXVsKHMpLm1vZChSKSxcbiAgICAgICAgaEEgPSByLm11bChzKS5tb2QoUiksXG4gICAgICAgIHIyID0gdGhpcy5fY3VydmUuRy5tdWx0MihoRywgaEEsIHRoaXMuX3BvaW50KS54O1xuICAgIGlmIChyLmVxdWFscygwKSB8fCBzcy5lcXVhbHMoMCkgfHwgci5ncmVhdGVyRXF1YWxzKFIpIHx8IHNzLmdyZWF0ZXJFcXVhbHMoUikgfHwgIXIyLmVxdWFscyhyKSkge1xuICAgICAgaWYgKGZha2VMZWdhY3lWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVyaWZ5KGhhc2gsIHJzLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IChuZXcgc2pjbC5leGNlcHRpb24uY29ycnVwdChcInNpZ25hdHVyZSBkaWRuJ3QgY2hlY2sgb3V0XCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbi8qKiBlY2RzYSBzZWNyZXRLZXlcbiogQGNvbnN0cnVjdG9yXG4qIEBhdWdtZW50cyBzamNsLmVjYy5iYXNpY0tleS5wdWJsaWNLZXlcbiovXG5zamNsLmVjYy5lY2RzYS5zZWNyZXRLZXkgPSBmdW5jdGlvbiAoY3VydmUsIGV4cG9uZW50KSB7XG4gIHNqY2wuZWNjLmJhc2ljS2V5LnNlY3JldEtleS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuLyoqIHNwZWNpZmljIGZ1bmN0aW9ucyBmb3IgZWNkc2Egc2VjcmV0S2V5LiAqL1xuc2pjbC5lY2MuZWNkc2Euc2VjcmV0S2V5LnByb3RvdHlwZSA9IHtcbiAgLyoqIERpZmZpZS1IZWxsbWFubiBmdW5jdGlvblxuICAqIEBwYXJhbSB7Yml0QXJyYXl9IGhhc2ggaGFzaCB0byBzaWduLiBcbiAgKiBAcGFyYW0ge2ludH0gcGFyYW5vaWEgcGFyYW5vaWEgZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvblxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gZmFrZUxlZ2FjeVZlcnNpb24gdXNlIG9sZCBsZWdhY3kgdmVyc2lvblxuICAqL1xuICBzaWduOiBmdW5jdGlvbihoYXNoLCBwYXJhbm9pYSwgZmFrZUxlZ2FjeVZlcnNpb24sIGZpeGVkS0ZvclRlc3RpbmcpIHtcbiAgICBpZiAoc2pjbC5iaXRBcnJheS5iaXRMZW5ndGgoaGFzaCkgPiB0aGlzLl9jdXJ2ZUJpdExlbmd0aCkge1xuICAgICAgaGFzaCA9IHNqY2wuYml0QXJyYXkuY2xhbXAoaGFzaCwgdGhpcy5fY3VydmVCaXRMZW5ndGgpO1xuICAgIH1cbiAgICB2YXIgUiAgPSB0aGlzLl9jdXJ2ZS5yLFxuICAgICAgICBsICA9IFIuYml0TGVuZ3RoKCksXG4gICAgICAgIGsgID0gZml4ZWRLRm9yVGVzdGluZyB8fCBzamNsLmJuLnJhbmRvbShSLnN1YigxKSwgcGFyYW5vaWEpLmFkZCgxKSxcbiAgICAgICAgciAgPSB0aGlzLl9jdXJ2ZS5HLm11bHQoaykueC5tb2QoUiksXG4gICAgICAgIHNzID0gc2pjbC5ibi5mcm9tQml0cyhoYXNoKS5hZGQoci5tdWwodGhpcy5fZXhwb25lbnQpKSxcbiAgICAgICAgcyAgPSBmYWtlTGVnYWN5VmVyc2lvbiA/IHNzLmludmVyc2VNb2QoUikubXVsKGspLm1vZChSKVxuICAgICAgICAgICAgIDogc3MubXVsKGsuaW52ZXJzZU1vZChSKSkubW9kKFIpO1xuICAgIHJldHVybiBzamNsLmJpdEFycmF5LmNvbmNhdChyLnRvQml0cyhsKSwgcy50b0JpdHMobCkpO1xuICB9XG59O1xuXG52YXIgZWNjID0ge30sXG4gICAgREVGQVVMVF9DVVJWRSA9IDE5MixcbiAgICBFTkNfREVDID0gZWNjLkVOQ19ERUMgPSB7fSxcbiAgICBTSUdfVkVSID0gZWNjLlNJR19WRVIgPSB7fSxcbiAgICBlbGcgPSBlY2NBUEkoJ2VsR2FtYWwnKSxcbiAgICBkc2EgPSBlY2NBUEkoJ2VjZHNhJyksXG4gICAgc2hhMjU2ID0gaGFzaEFQSSgnc2hhMjU2Jyk7XG5cbmVjYy5zamNsID0gc2pjbDtcblxuZWNjLmdlbmVyYXRlID0gZnVuY3Rpb24odHlwZSwgY3VydmUpIHtcbiAgaWYoIWN1cnZlKVxuICAgIGN1cnZlID0gREVGQVVMVF9DVVJWRTtcbiAgdmFyIGtleXMsIHB1Yiwgc2VjO1xuICBpZih0eXBlID09PSBFTkNfREVDKSB7XG4gICAgcHViID0gJ2VuYyc7XG4gICAgc2VjID0gJ2RlYyc7XG4gICAga2V5cyA9IGVsZy5nZW5lcmF0ZShjdXJ2ZSk7XG4gIH0gZWxzZSBpZih0eXBlID09PSBTSUdfVkVSKSB7XG4gICAgcHViID0gJ3Zlcic7XG4gICAgc2VjID0gJ3NpZyc7XG4gICAga2V5cyA9IGRzYS5nZW5lcmF0ZShjdXJ2ZSk7XG4gIH0gZWxzZVxuICAgIHRocm93IFwiZWNjanM6IGdlbmVyYXRlOiBVbmtub3duIHR5cGVcIjtcblxuICB2YXIgbmV3a2V5cyA9IHt9O1xuICBuZXdrZXlzW3B1Yl0gPSBleHBvcnRQdWJsaWMoa2V5cy5wdWIpO1xuICBuZXdrZXlzW3NlY10gPSBleHBvcnRTZWNyZXQoa2V5cy5zZWMpO1xuICByZXR1cm4gbmV3a2V5cztcbn07XG5cbnZhciBjYWNoZSA9IHtcbiAgZW5jOiB7fSwgZGVjOiB7fSwgc2lnOiB7fSwgdmVyOiB7fVxufTtcblxuZWNjLmVuY3J5cHQgPSBmdW5jdGlvbihlbmNrZXksIHBsYWludGV4dCkge1xuICB2YXIga2VtID0gY2FjaGUuZW5jW2VuY2tleV07XG5cbiAgaWYoIWtlbSkge1xuICAgIGtlbSA9IGNhY2hlLmVuY1tlbmNrZXldID0gZWxnLmltcG9ydFB1YmxpYyhlbmNrZXkpLmtlbSgpO1xuICAgIGtlbS50YWdIZXggPSBzamNsLmNvZGVjLmhleC5mcm9tQml0cyhrZW0udGFnKTtcbiAgfVxuXG4gIHZhciBvYmogPSBzamNsLmpzb24uX2VuY3J5cHQoa2VtLmtleSwgcGxhaW50ZXh0KTtcbiAgb2JqLnRhZyA9IGtlbS50YWdIZXg7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xufTtcblxuXG5lY2MuZGVjcnlwdCA9IGZ1bmN0aW9uKGRlY2tleSwgY2lwaGVydGV4dCkge1xuICB2YXIgb2JqID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcblxuICB2YXIga2VtID0gY2FjaGUuZGVjW2RlY2tleV07XG4gIGlmKCFrZW0pIHtcbiAgICBrZW0gPSBjYWNoZS5kZWNbZGVja2V5XSA9IGVsZy5pbXBvcnRTZWNyZXQoZGVja2V5KTtcbiAgICBrZW0uJGtleXMgPSB7fTtcbiAgfVxuXG4gIHZhciBrZXkgPSBrZW0uJGtleXNbb2JqLnRhZ107XG4gIGlmKCFrZXkpXG4gICAga2V5ID0ga2VtLiRrZXlzW29iai50YWddID0ga2VtLnVua2VtKHNqY2wuY29kZWMuaGV4LnRvQml0cyhvYmoudGFnKSk7XG5cbiAgcmV0dXJuIHNqY2wuanNvbi5fZGVjcnlwdChrZXksIG9iaik7XG59O1xuXG5lY2Muc2lnbiA9IGZ1bmN0aW9uKHNpZ2tleSwgdGV4dCwgaGFzaCkge1xuICB2YXIga2V5ID0gY2FjaGUuc2lnW3NpZ2tleV07XG4gIGlmKCFrZXkpXG4gICAga2V5ID0gY2FjaGUuc2lnW3NpZ2tleV0gPSBkc2EuaW1wb3J0U2VjcmV0KHNpZ2tleSk7XG5cbiAgLy9oYXNoIGZpcnN0XG4gIGlmKGhhc2ggIT09IGZhbHNlKVxuICAgIHRleHQgPSBzaGEyNTYuaGFzaCh0ZXh0KTtcblxuICByZXR1cm4ga2V5LnNpZ24odGV4dCk7XG59O1xuXG5lY2MudmVyaWZ5ID0gZnVuY3Rpb24odmVya2V5LCBzaWduYXR1cmUsIHRleHQsIGhhc2gpIHtcbiAgdmFyIGtleSA9IGNhY2hlLnZlclt2ZXJrZXldO1xuICBpZigha2V5KVxuICAgIGtleSA9IGNhY2hlLnZlclt2ZXJrZXldID0gZHNhLmltcG9ydFB1YmxpYyh2ZXJrZXkpO1xuXG4gIC8vaGFzaCBmaXJzdFxuICBpZihoYXNoICE9PSBmYWxzZSlcbiAgICB0ZXh0ID0gc2hhMjU2Lmhhc2godGV4dCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4ga2V5LnZlcmlmeSh0ZXh0LCBzaWduYXR1cmUpO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cblxuLy9lY2MgYWxnb3JpdGhtIGhlbHBlcnNcbmZ1bmN0aW9uIGVjY0FQSShhbGdvTmFtZSkge1xuICB2YXIgYWxnbyA9IHNqY2wuZWNjW2FsZ29OYW1lXTtcbiAgaWYoIWFsZ28pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBFQ0MgYWxnb3JpdGhtOiBcIiArIGFsZ29OYW1lKTtcbiAgcmV0dXJuIHtcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24oY3VydmUpIHtcbiAgICAgIHZhciBrZXlzID0gYWxnby5nZW5lcmF0ZUtleXMoY3VydmUsIDEpO1xuICAgICAga2V5cy5wdWIuJGN1cnZlID0gY3VydmU7XG4gICAgICBrZXlzLnNlYy4kY3VydmUgPSBjdXJ2ZTtcbiAgICAgIHJldHVybiBrZXlzO1xuICAgIH0sXG4gICAgaW1wb3J0UHVibGljOiBmdW5jdGlvbihrZXlTdHIpIHtcbiAgICAgIHZhciBrZXkgPSBleHRyYWN0KGtleVN0cik7XG4gICAgICByZXR1cm4gbmV3IGFsZ28ucHVibGljS2V5KGtleS5jdXJ2ZSwgc2pjbC5jb2RlYy5oZXgudG9CaXRzKGtleS5oZXgpKTtcbiAgICB9LFxuICAgIGltcG9ydFNlY3JldDogZnVuY3Rpb24oa2V5U3RyKSB7XG4gICAgICB2YXIga2V5ID0gZXh0cmFjdChrZXlTdHIpO1xuICAgICAgcmV0dXJuIG5ldyBhbGdvLnNlY3JldEtleShrZXkuY3VydmUsIG5ldyBzamNsLmJuKGtleS5oZXgpKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3Qoc3RyKSB7XG4gIHJldHVybiB7XG4gICAgY3VydmU6IHNqY2wuZWNjLmN1cnZlc1snYycrc3RyLnN1YnN0cigwLCAzKV0sXG4gICAgaGV4OiBzdHIuc3Vic3RyKDMpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9ydFB1YmxpYyhrZXlPYmopIHtcbiAgdmFyIG9iaiA9IGtleU9iai5nZXQoKTtcbiAgcmV0dXJuIGtleU9iai4kY3VydmUgK1xuICAgICAgICAgc2pjbC5jb2RlYy5oZXguZnJvbUJpdHMob2JqLngpICtcbiAgICAgICAgIHNqY2wuY29kZWMuaGV4LmZyb21CaXRzKG9iai55KTtcbn1cbmZ1bmN0aW9uIGV4cG9ydFNlY3JldChrZXlPYmopIHtcbiAgcmV0dXJuIGtleU9iai4kY3VydmUgKyBzamNsLmNvZGVjLmhleC5mcm9tQml0cyhrZXlPYmouZ2V0KCkpO1xufVxuXG4vL2hhc2ggYWxnb3JpdGhtIGhlbHBlcnNcbmZ1bmN0aW9uIGhhc2hBUEkoYWxnb05hbWUpIHtcbiAgdmFyIGFsZ28gPSBzamNsLmhhc2hbYWxnb05hbWVdO1xuICBpZighYWxnbylcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGhhc2ggYWxnb3JpdGhtOiBcIiArIGFsZ29OYW1lKTtcbiAgcmV0dXJuIHtcbiAgICBoYXNoOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgcmV0dXJuIGFsZ28uaGFzaChpbnB1dCk7XG4gICAgfVxuICB9O1xufVxuXG4vL3B1YmxpY2lzZVxuaWYodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpXG4gIG1vZHVsZS5leHBvcnRzID0gZWNjO1xuZWxzZVxuICB3aW5kb3cuZWNjID0gZWNjO1xuXG5cbn0odGhpcykpOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIGVsbGlwdGljID0gZXhwb3J0cztcblxuZWxsaXB0aWMudmVyc2lvbiA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG5lbGxpcHRpYy51dGlscyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvdXRpbHMnKTtcbmVsbGlwdGljLnJhbmQgPSByZXF1aXJlKCdicm9yYW5kJyk7XG5lbGxpcHRpYy5obWFjRFJCRyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvaG1hYy1kcmJnJyk7XG5lbGxpcHRpYy5jdXJ2ZSA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvY3VydmUnKTtcbmVsbGlwdGljLmN1cnZlcyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvY3VydmVzJyk7XG5cbi8vIFByb3RvY29sc1xuZWxsaXB0aWMuZWMgPSByZXF1aXJlKCcuL2VsbGlwdGljL2VjJyk7XG5lbGxpcHRpYy5lZGRzYSA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvZWRkc2EnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcbnZhciBnZXROQUYgPSB1dGlscy5nZXROQUY7XG52YXIgZ2V0SlNGID0gdXRpbHMuZ2V0SlNGO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gQmFzZUN1cnZlKHR5cGUsIGNvbmYpIHtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5wID0gbmV3IEJOKGNvbmYucCwgMTYpO1xuXG4gIC8vIFVzZSBNb250Z29tZXJ5LCB3aGVuIHRoZXJlIGlzIG5vIGZhc3QgcmVkdWN0aW9uIGZvciB0aGUgcHJpbWVcbiAgdGhpcy5yZWQgPSBjb25mLnByaW1lID8gQk4ucmVkKGNvbmYucHJpbWUpIDogQk4ubW9udCh0aGlzLnApO1xuXG4gIC8vIFVzZWZ1bCBmb3IgbWFueSBjdXJ2ZXNcbiAgdGhpcy56ZXJvID0gbmV3IEJOKDApLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5vbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnR3byA9IG5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8gQ3VydmUgY29uZmlndXJhdGlvbiwgb3B0aW9uYWxcbiAgdGhpcy5uID0gY29uZi5uICYmIG5ldyBCTihjb25mLm4sIDE2KTtcbiAgdGhpcy5nID0gY29uZi5nICYmIHRoaXMucG9pbnRGcm9tSlNPTihjb25mLmcsIGNvbmYuZ1JlZCk7XG5cbiAgLy8gVGVtcG9yYXJ5IGFycmF5c1xuICB0aGlzLl93bmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUMiA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQzID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDQgPSBuZXcgQXJyYXkoNCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEJhc2VDdXJ2ZTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5fZml4ZWROYWZNdWwgPSBmdW5jdGlvbiBfZml4ZWROYWZNdWwocCwgaykge1xuICBhc3NlcnQocC5wcmVjb21wdXRlZCk7XG4gIHZhciBkb3VibGVzID0gcC5fZ2V0RG91YmxlcygpO1xuXG4gIHZhciBuYWYgPSBnZXROQUYoaywgMSk7XG4gIHZhciBJID0gKDEgPDwgKGRvdWJsZXMuc3RlcCArIDEpKSAtIChkb3VibGVzLnN0ZXAgJSAyID09PSAwID8gMiA6IDEpO1xuICBJIC89IDM7XG5cbiAgLy8gVHJhbnNsYXRlIGludG8gbW9yZSB3aW5kb3dlZCBmb3JtXG4gIHZhciByZXByID0gW107XG4gIGZvciAodmFyIGogPSAwOyBqIDwgbmFmLmxlbmd0aDsgaiArPSBkb3VibGVzLnN0ZXApIHtcbiAgICB2YXIgbmFmVyA9IDA7XG4gICAgZm9yICh2YXIgayA9IGogKyBkb3VibGVzLnN0ZXAgLSAxOyBrID49IGo7IGstLSlcbiAgICAgIG5hZlcgPSAobmFmVyA8PCAxKSArIG5hZltrXTtcbiAgICByZXByLnB1c2gobmFmVyk7XG4gIH1cblxuICB2YXIgYSA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgYiA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gSTsgaSA+IDA7IGktLSkge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVwci5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG5hZlcgPSByZXByW2pdO1xuICAgICAgaWYgKG5hZlcgPT09IGkpXG4gICAgICAgIGIgPSBiLm1peGVkQWRkKGRvdWJsZXMucG9pbnRzW2pdKTtcbiAgICAgIGVsc2UgaWYgKG5hZlcgPT09IC1pKVxuICAgICAgICBiID0gYi5taXhlZEFkZChkb3VibGVzLnBvaW50c1tqXS5uZWcoKSk7XG4gICAgfVxuICAgIGEgPSBhLmFkZChiKTtcbiAgfVxuICByZXR1cm4gYS50b1AoKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX3duYWZNdWwgPSBmdW5jdGlvbiBfd25hZk11bChwLCBrKSB7XG4gIHZhciB3ID0gNDtcblxuICAvLyBQcmVjb21wdXRlIHdpbmRvd1xuICB2YXIgbmFmUG9pbnRzID0gcC5fZ2V0TkFGUG9pbnRzKHcpO1xuICB3ID0gbmFmUG9pbnRzLnduZDtcbiAgdmFyIHduZCA9IG5hZlBvaW50cy5wb2ludHM7XG5cbiAgLy8gR2V0IE5BRiBmb3JtXG4gIHZhciBuYWYgPSBnZXROQUYoaywgdyk7XG5cbiAgLy8gQWRkIGB0aGlzYCooTisxKSBmb3IgZXZlcnkgdy1OQUYgaW5kZXhcbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gbmFmLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgLy8gQ291bnQgemVyb2VzXG4gICAgZm9yICh2YXIgayA9IDA7IGkgPj0gMCAmJiBuYWZbaV0gPT09IDA7IGktLSlcbiAgICAgIGsrKztcbiAgICBpZiAoaSA+PSAwKVxuICAgICAgaysrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGspO1xuXG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG4gICAgdmFyIHogPSBuYWZbaV07XG4gICAgYXNzZXJ0KHogIT09IDApO1xuICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKSB7XG4gICAgICAvLyBKICstIFBcbiAgICAgIGlmICh6ID4gMClcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoLXogLSAxKSA+PiAxXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEogKy0gSlxuICAgICAgaWYgKHogPiAwKVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLmFkZCh3bmRbKC16IC0gMSkgPj4gMV0ubmVnKCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcC50eXBlID09PSAnYWZmaW5lJyA/IGFjYy50b1AoKSA6IGFjYztcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX3duYWZNdWxBZGQgPSBmdW5jdGlvbiBfd25hZk11bEFkZChkZWZXLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKSB7XG4gIHZhciB3bmRXaWR0aCA9IHRoaXMuX3duYWZUMTtcbiAgdmFyIHduZCA9IHRoaXMuX3duYWZUMjtcbiAgdmFyIG5hZiA9IHRoaXMuX3duYWZUMztcblxuICAvLyBGaWxsIGFsbCBhcnJheXNcbiAgdmFyIG1heCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgcCA9IHBvaW50c1tpXTtcbiAgICB2YXIgbmFmUG9pbnRzID0gcC5fZ2V0TkFGUG9pbnRzKGRlZlcpO1xuICAgIHduZFdpZHRoW2ldID0gbmFmUG9pbnRzLnduZDtcbiAgICB3bmRbaV0gPSBuYWZQb2ludHMucG9pbnRzO1xuICB9XG5cbiAgLy8gQ29tYiBzbWFsbCB3aW5kb3cgTkFGc1xuICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAxOyBpIC09IDIpIHtcbiAgICB2YXIgYSA9IGkgLSAxO1xuICAgIHZhciBiID0gaTtcbiAgICBpZiAod25kV2lkdGhbYV0gIT09IDEgfHwgd25kV2lkdGhbYl0gIT09IDEpIHtcbiAgICAgIG5hZlthXSA9IGdldE5BRihjb2VmZnNbYV0sIHduZFdpZHRoW2FdKTtcbiAgICAgIG5hZltiXSA9IGdldE5BRihjb2VmZnNbYl0sIHduZFdpZHRoW2JdKTtcbiAgICAgIG1heCA9IE1hdGgubWF4KG5hZlthXS5sZW5ndGgsIG1heCk7XG4gICAgICBtYXggPSBNYXRoLm1heChuYWZbYl0ubGVuZ3RoLCBtYXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGNvbWIgPSBbXG4gICAgICBwb2ludHNbYV0sIC8qIDEgKi9cbiAgICAgIG51bGwsIC8qIDMgKi9cbiAgICAgIG51bGwsIC8qIDUgKi9cbiAgICAgIHBvaW50c1tiXSAvKiA3ICovXG4gICAgXTtcblxuICAgIC8vIFRyeSB0byBhdm9pZCBQcm9qZWN0aXZlIHBvaW50cywgaWYgcG9zc2libGVcbiAgICBpZiAocG9pbnRzW2FdLnkuY21wKHBvaW50c1tiXS55KSA9PT0gMCkge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS5hZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9IGVsc2UgaWYgKHBvaW50c1thXS55LmNtcChwb2ludHNbYl0ueS5yZWROZWcoKSkgPT09IDApIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0uYWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBbXG4gICAgICAtMywgLyogLTEgLTEgKi9cbiAgICAgIC0xLCAvKiAtMSAwICovXG4gICAgICAtNSwgLyogLTEgMSAqL1xuICAgICAgLTcsIC8qIDAgLTEgKi9cbiAgICAgIDAsIC8qIDAgMCAqL1xuICAgICAgNywgLyogMCAxICovXG4gICAgICA1LCAvKiAxIC0xICovXG4gICAgICAxLCAvKiAxIDAgKi9cbiAgICAgIDMgIC8qIDEgMSAqL1xuICAgIF07XG5cbiAgICB2YXIganNmID0gZ2V0SlNGKGNvZWZmc1thXSwgY29lZmZzW2JdKTtcbiAgICBtYXggPSBNYXRoLm1heChqc2ZbMF0ubGVuZ3RoLCBtYXgpO1xuICAgIG5hZlthXSA9IG5ldyBBcnJheShtYXgpO1xuICAgIG5hZltiXSA9IG5ldyBBcnJheShtYXgpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWF4OyBqKyspIHtcbiAgICAgIHZhciBqYSA9IGpzZlswXVtqXSB8IDA7XG4gICAgICB2YXIgamIgPSBqc2ZbMV1bal0gfCAwO1xuXG4gICAgICBuYWZbYV1bal0gPSBpbmRleFsoamEgKyAxKSAqIDMgKyAoamIgKyAxKV07XG4gICAgICBuYWZbYl1bal0gPSAwO1xuICAgICAgd25kW2FdID0gY29tYjtcbiAgICB9XG4gIH1cblxuICB2YXIgYWNjID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIHZhciB0bXAgPSB0aGlzLl93bmFmVDQ7XG4gIGZvciAodmFyIGkgPSBtYXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGsgPSAwO1xuXG4gICAgd2hpbGUgKGkgPj0gMCkge1xuICAgICAgdmFyIHplcm8gPSB0cnVlO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgICB0bXBbal0gPSBuYWZbal1baV0gfCAwO1xuICAgICAgICBpZiAodG1wW2pdICE9PSAwKVxuICAgICAgICAgIHplcm8gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghemVybylcbiAgICAgICAgYnJlYWs7XG4gICAgICBrKys7XG4gICAgICBpLS07XG4gICAgfVxuICAgIGlmIChpID49IDApXG4gICAgICBrKys7XG4gICAgYWNjID0gYWNjLmRibHAoayk7XG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICB2YXIgeiA9IHRtcFtqXTtcbiAgICAgIHZhciBwO1xuICAgICAgaWYgKHogPT09IDApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgZWxzZSBpZiAoeiA+IDApXG4gICAgICAgIHAgPSB3bmRbal1bKHogLSAxKSA+PiAxXTtcbiAgICAgIGVsc2UgaWYgKHogPCAwKVxuICAgICAgICBwID0gd25kW2pdWygteiAtIDEpID4+IDFdLm5lZygpO1xuXG4gICAgICBpZiAocC50eXBlID09PSAnYWZmaW5lJylcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHApO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHApO1xuICAgIH1cbiAgfVxuICAvLyBaZXJvaWZ5IHJlZmVyZW5jZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICB3bmRbaV0gPSBudWxsO1xuICByZXR1cm4gYWNjLnRvUCgpO1xufTtcblxuZnVuY3Rpb24gQmFzZVBvaW50KGN1cnZlLCB0eXBlKSB7XG4gIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5wcmVjb21wdXRlZCA9IG51bGw7XG59XG5CYXNlQ3VydmUuQmFzZVBvaW50ID0gQmFzZVBvaW50O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEoLypvdGhlciovKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLnZhbGlkYXRlKHRoaXMpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzLCBlbmMpIHtcbiAgYnl0ZXMgPSB1dGlscy50b0FycmF5KGJ5dGVzLCBlbmMpO1xuXG4gIHZhciBsZW4gPSB0aGlzLnAuYnl0ZUxlbmd0aCgpO1xuICBpZiAoYnl0ZXNbMF0gPT09IDB4MDQgJiYgYnl0ZXMubGVuZ3RoIC0gMSA9PT0gMiAqIGxlbikge1xuICAgIHJldHVybiB0aGlzLnBvaW50KGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLFxuICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLnNsaWNlKDEgKyBsZW4sIDEgKyAyICogbGVuKSk7XG4gIH0gZWxzZSBpZiAoKGJ5dGVzWzBdID09PSAweDAyIHx8IGJ5dGVzWzBdID09PSAweDAzKSAmJlxuICAgICAgICAgICAgICBieXRlcy5sZW5ndGggLSAxID09PSBsZW4pIHtcbiAgICByZXR1cm4gdGhpcy5wb2ludEZyb21YKGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLCBieXRlc1swXSA9PT0gMHgwMyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBvaW50IGZvcm1hdCcpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGVDb21wcmVzc2VkID0gZnVuY3Rpb24gZW5jb2RlQ29tcHJlc3NlZChlbmMpIHtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlKGVuYywgdHJ1ZSk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKGNvbXBhY3QpIHtcbiAgdmFyIGxlbiA9IHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCk7XG4gIHZhciB4ID0gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCBsZW4pO1xuXG4gIGlmIChjb21wYWN0KVxuICAgIHJldHVybiBbIHRoaXMuZ2V0WSgpLmlzRXZlbigpID8gMHgwMiA6IDB4MDMgXS5jb25jYXQoeCk7XG5cbiAgcmV0dXJuIFsgMHgwNCBdLmNvbmNhdCh4LCB0aGlzLmdldFkoKS50b0FycmF5KCdiZScsIGxlbikpIDtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGVuYywgY29tcGFjdCkge1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMuX2VuY29kZShjb21wYWN0KSwgZW5jKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUucHJlY29tcHV0ZSA9IGZ1bmN0aW9uIHByZWNvbXB1dGUocG93ZXIpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIHByZWNvbXB1dGVkID0ge1xuICAgIGRvdWJsZXM6IG51bGwsXG4gICAgbmFmOiBudWxsLFxuICAgIGJldGE6IG51bGxcbiAgfTtcbiAgcHJlY29tcHV0ZWQubmFmID0gdGhpcy5fZ2V0TkFGUG9pbnRzKDgpO1xuICBwcmVjb21wdXRlZC5kb3VibGVzID0gdGhpcy5fZ2V0RG91Ymxlcyg0LCBwb3dlcik7XG4gIHByZWNvbXB1dGVkLmJldGEgPSB0aGlzLl9nZXRCZXRhKCk7XG4gIHRoaXMucHJlY29tcHV0ZWQgPSBwcmVjb21wdXRlZDtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2hhc0RvdWJsZXMgPSBmdW5jdGlvbiBfaGFzRG91YmxlcyhrKSB7XG4gIGlmICghdGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGRvdWJsZXMgPSB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7XG4gIGlmICghZG91YmxlcylcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRvdWJsZXMucG9pbnRzLmxlbmd0aCA+PSBNYXRoLmNlaWwoKGsuYml0TGVuZ3RoKCkgKyAxKSAvIGRvdWJsZXMuc3RlcCk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXREb3VibGVzID0gZnVuY3Rpb24gX2dldERvdWJsZXMoc3RlcCwgcG93ZXIpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQgJiYgdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7XG5cbiAgdmFyIGRvdWJsZXMgPSBbIHRoaXMgXTtcbiAgdmFyIGFjYyA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG93ZXI7IGkgKz0gc3RlcCkge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3RlcDsgaisrKVxuICAgICAgYWNjID0gYWNjLmRibCgpO1xuICAgIGRvdWJsZXMucHVzaChhY2MpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RlcDogc3RlcCxcbiAgICBwb2ludHM6IGRvdWJsZXNcbiAgfTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldE5BRlBvaW50cyA9IGZ1bmN0aW9uIF9nZXROQUZQb2ludHMod25kKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkICYmIHRoaXMucHJlY29tcHV0ZWQubmFmKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLm5hZjtcblxuICB2YXIgcmVzID0gWyB0aGlzIF07XG4gIHZhciBtYXggPSAoMSA8PCB3bmQpIC0gMTtcbiAgdmFyIGRibCA9IG1heCA9PT0gMSA/IG51bGwgOiB0aGlzLmRibCgpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IG1heDsgaSsrKVxuICAgIHJlc1tpXSA9IHJlc1tpIC0gMV0uYWRkKGRibCk7XG4gIHJldHVybiB7XG4gICAgd25kOiB3bmQsXG4gICAgcG9pbnRzOiByZXNcbiAgfTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldEJldGEgPSBmdW5jdGlvbiBfZ2V0QmV0YSgpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmRibHAgPSBmdW5jdGlvbiBkYmxwKGspIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGs7IGkrKylcbiAgICByID0gci5kYmwoKTtcbiAgcmV0dXJuIHI7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmUgPSByZXF1aXJlKCcuLi9jdXJ2ZScpO1xudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnLi4vLi4vZWxsaXB0aWMnKTtcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSBjdXJ2ZS5iYXNlO1xuXG52YXIgYXNzZXJ0ID0gZWxsaXB0aWMudXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBFZHdhcmRzQ3VydmUoY29uZikge1xuICAvLyBOT1RFOiBJbXBvcnRhbnQgYXMgd2UgYXJlIGNyZWF0aW5nIHBvaW50IGluIEJhc2UuY2FsbCgpXG4gIHRoaXMudHdpc3RlZCA9IChjb25mLmEgfCAwKSAhPT0gMTtcbiAgdGhpcy5tT25lQSA9IHRoaXMudHdpc3RlZCAmJiAoY29uZi5hIHwgMCkgPT09IC0xO1xuICB0aGlzLmV4dGVuZGVkID0gdGhpcy5tT25lQTtcblxuICBCYXNlLmNhbGwodGhpcywgJ2Vkd2FyZHMnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudW1vZCh0aGlzLnJlZC5tKTtcbiAgdGhpcy5hID0gdGhpcy5hLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jID0gbmV3IEJOKGNvbmYuYywgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jMiA9IHRoaXMuYy5yZWRTcXIoKTtcbiAgdGhpcy5kID0gbmV3IEJOKGNvbmYuZCwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5kZCA9IHRoaXMuZC5yZWRBZGQodGhpcy5kKTtcblxuICBhc3NlcnQoIXRoaXMudHdpc3RlZCB8fCB0aGlzLmMuZnJvbVJlZCgpLmNtcG4oMSkgPT09IDApO1xuICB0aGlzLm9uZUMgPSAoY29uZi5jIHwgMCkgPT09IDE7XG59XG5pbmhlcml0cyhFZHdhcmRzQ3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBFZHdhcmRzQ3VydmU7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEEgPSBmdW5jdGlvbiBfbXVsQShudW0pIHtcbiAgaWYgKHRoaXMubU9uZUEpXG4gICAgcmV0dXJuIG51bS5yZWROZWcoKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmEucmVkTXVsKG51bSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLl9tdWxDID0gZnVuY3Rpb24gX211bEMobnVtKSB7XG4gIGlmICh0aGlzLm9uZUMpXG4gICAgcmV0dXJuIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmMucmVkTXVsKG51bSk7XG59O1xuXG4vLyBKdXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggU2hvcnQgY3VydmVcbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSwgeiwgdCk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHRoaXMuYzIucmVkU3ViKHRoaXMuYS5yZWRNdWwoeDIpKTtcbiAgdmFyIGxocyA9IHRoaXMub25lLnJlZFN1Yih0aGlzLmMyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh4MikpO1xuXG4gIHZhciB5MiA9IHJocy5yZWRNdWwobGhzLnJlZEludm0oKSk7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVkgPSBmdW5jdGlvbiBwb2ludEZyb21ZKHksIG9kZCkge1xuICB5ID0gbmV3IEJOKHksIDE2KTtcbiAgaWYgKCF5LnJlZClcbiAgICB5ID0geS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8geF4yID0gKHleMiAtIDEpIC8gKGQgeV4yICsgMSlcbiAgdmFyIHkyID0geS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHkyLnJlZFN1Yih0aGlzLm9uZSk7XG4gIHZhciByaHMgPSB5Mi5yZWRNdWwodGhpcy5kKS5yZWRBZGQodGhpcy5vbmUpO1xuICB2YXIgeDIgPSBsaHMucmVkTXVsKHJocy5yZWRJbnZtKCkpO1xuXG4gIGlmICh4Mi5jbXAodGhpcy56ZXJvKSA9PT0gMCkge1xuICAgIGlmIChvZGQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5wb2ludCh0aGlzLnplcm8sIHkpO1xuICB9XG5cbiAgdmFyIHggPSB4Mi5yZWRTcXJ0KCk7XG4gIGlmICh4LnJlZFNxcigpLnJlZFN1Yih4MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgaWYgKHguaXNPZGQoKSAhPT0gb2RkKVxuICAgIHggPSB4LnJlZE5lZygpO1xuXG4gIHJldHVybiB0aGlzLnBvaW50KHgsIHkpO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIGlmIChwb2ludC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgLy8gQ3VydmU6IEEgKiBYXjIgKyBZXjIgPSBDXjIgKiAoMSArIEQgKiBYXjIgKiBZXjIpXG4gIHBvaW50Lm5vcm1hbGl6ZSgpO1xuXG4gIHZhciB4MiA9IHBvaW50LngucmVkU3FyKCk7XG4gIHZhciB5MiA9IHBvaW50LnkucmVkU3FyKCk7XG4gIHZhciBsaHMgPSB4Mi5yZWRNdWwodGhpcy5hKS5yZWRBZGQoeTIpO1xuICB2YXIgcmhzID0gdGhpcy5jMi5yZWRNdWwodGhpcy5vbmUucmVkQWRkKHRoaXMuZC5yZWRNdWwoeDIpLnJlZE11bCh5MikpKTtcblxuICByZXR1cm4gbGhzLmNtcChyaHMpID09PSAwO1xufTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHksIHosIHQpIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ3Byb2plY3RpdmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICAgIHRoaXMueSA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMudCA9IHRoaXMuY3VydmUuemVybztcbiAgICB0aGlzLnpPbmUgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICB0aGlzLnogPSB6ID8gbmV3IEJOKHosIDE2KSA6IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMudCA9IHQgJiYgbmV3IEJOKHQsIDE2KTtcbiAgICBpZiAoIXRoaXMueC5yZWQpXG4gICAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy55LnJlZClcbiAgICAgIHRoaXMueSA9IHRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnoucmVkKVxuICAgICAgdGhpcy56ID0gdGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAodGhpcy50ICYmICF0aGlzLnQucmVkKVxuICAgICAgdGhpcy50ID0gdGhpcy50LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB0aGlzLnpPbmUgPSB0aGlzLnogPT09IHRoaXMuY3VydmUub25lO1xuXG4gICAgLy8gVXNlIGV4dGVuZGVkIGNvb3JkaW5hdGVzXG4gICAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQgJiYgIXRoaXMudCkge1xuICAgICAgdGhpcy50ID0gdGhpcy54LnJlZE11bCh0aGlzLnkpO1xuICAgICAgaWYgKCF0aGlzLnpPbmUpXG4gICAgICAgIHRoaXMudCA9IHRoaXMudC5yZWRNdWwodGhpcy56LnJlZEludm0oKSk7XG4gICAgfVxuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaikge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqKTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCh4LCB5LCB6LCB0KSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeSwgeiwgdCk7XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmopIHtcbiAgcmV0dXJuIG5ldyBQb2ludChjdXJ2ZSwgb2JqWzBdLCBvYmpbMV0sIG9ialsyXSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gJzxFQyBQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBQb2ludCB4OiAnICsgdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB5OiAnICsgdGhpcy55LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB6OiAnICsgdGhpcy56LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaXNJbmZpbml0eSA9IGZ1bmN0aW9uIGlzSW5maW5pdHkoKSB7XG4gIC8vIFhYWCBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHplcm8gaXMgYWx3YXlzIHplcm8gaW4gcmVkXG4gIHJldHVybiB0aGlzLnguY21wbigwKSA9PT0gMCAmJlxuICAgICAgICAgdGhpcy55LmNtcCh0aGlzLnopID09PSAwO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9leHREYmwgPSBmdW5jdGlvbiBfZXh0RGJsKCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1leHRlbmRlZC0xLmh0bWxcbiAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOC1od2NkXG4gIC8vIDRNICsgNFNcblxuICAvLyBBID0gWDFeMlxuICB2YXIgYSA9IHRoaXMueC5yZWRTcXIoKTtcbiAgLy8gQiA9IFkxXjJcbiAgdmFyIGIgPSB0aGlzLnkucmVkU3FyKCk7XG4gIC8vIEMgPSAyICogWjFeMlxuICB2YXIgYyA9IHRoaXMuei5yZWRTcXIoKTtcbiAgYyA9IGMucmVkSUFkZChjKTtcbiAgLy8gRCA9IGEgKiBBXG4gIHZhciBkID0gdGhpcy5jdXJ2ZS5fbXVsQShhKTtcbiAgLy8gRSA9IChYMSArIFkxKV4yIC0gQSAtIEJcbiAgdmFyIGUgPSB0aGlzLngucmVkQWRkKHRoaXMueSkucmVkU3FyKCkucmVkSVN1YihhKS5yZWRJU3ViKGIpO1xuICAvLyBHID0gRCArIEJcbiAgdmFyIGcgPSBkLnJlZEFkZChiKTtcbiAgLy8gRiA9IEcgLSBDXG4gIHZhciBmID0gZy5yZWRTdWIoYyk7XG4gIC8vIEggPSBEIC0gQlxuICB2YXIgaCA9IGQucmVkU3ViKGIpO1xuICAvLyBYMyA9IEUgKiBGXG4gIHZhciBueCA9IGUucmVkTXVsKGYpO1xuICAvLyBZMyA9IEcgKiBIXG4gIHZhciBueSA9IGcucmVkTXVsKGgpO1xuICAvLyBUMyA9IEUgKiBIXG4gIHZhciBudCA9IGUucmVkTXVsKGgpO1xuICAvLyBaMyA9IEYgKiBHXG4gIHZhciBueiA9IGYucmVkTXVsKGcpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56LCBudCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX3Byb2pEYmwgPSBmdW5jdGlvbiBfcHJvakRibCgpIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtcHJvamVjdGl2ZS5odG1sXG4gIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDgtYmJqbHBcbiAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwNy1ibFxuICAvLyBhbmQgb3RoZXJzXG4gIC8vIEdlbmVyYWxseSAzTSArIDRTIG9yIDJNICsgNFNcblxuICAvLyBCID0gKFgxICsgWTEpXjJcbiAgdmFyIGIgPSB0aGlzLngucmVkQWRkKHRoaXMueSkucmVkU3FyKCk7XG4gIC8vIEMgPSBYMV4yXG4gIHZhciBjID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBEID0gWTFeMlxuICB2YXIgZCA9IHRoaXMueS5yZWRTcXIoKTtcblxuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICBpZiAodGhpcy5jdXJ2ZS50d2lzdGVkKSB7XG4gICAgLy8gRSA9IGEgKiBDXG4gICAgdmFyIGUgPSB0aGlzLmN1cnZlLl9tdWxBKGMpO1xuICAgIC8vIEYgPSBFICsgRFxuICAgIHZhciBmID0gZS5yZWRBZGQoZCk7XG4gICAgaWYgKHRoaXMuek9uZSkge1xuICAgICAgLy8gWDMgPSAoQiAtIEMgLSBEKSAqIChGIC0gMilcbiAgICAgIG54ID0gYi5yZWRTdWIoYykucmVkU3ViKGQpLnJlZE11bChmLnJlZFN1Yih0aGlzLmN1cnZlLnR3bykpO1xuICAgICAgLy8gWTMgPSBGICogKEUgLSBEKVxuICAgICAgbnkgPSBmLnJlZE11bChlLnJlZFN1YihkKSk7XG4gICAgICAvLyBaMyA9IEZeMiAtIDIgKiBGXG4gICAgICBueiA9IGYucmVkU3FyKCkucmVkU3ViKGYpLnJlZFN1YihmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSCA9IFoxXjJcbiAgICAgIHZhciBoID0gdGhpcy56LnJlZFNxcigpO1xuICAgICAgLy8gSiA9IEYgLSAyICogSFxuICAgICAgdmFyIGogPSBmLnJlZFN1YihoKS5yZWRJU3ViKGgpO1xuICAgICAgLy8gWDMgPSAoQi1DLUQpKkpcbiAgICAgIG54ID0gYi5yZWRTdWIoYykucmVkSVN1YihkKS5yZWRNdWwoaik7XG4gICAgICAvLyBZMyA9IEYgKiAoRSAtIEQpXG4gICAgICBueSA9IGYucmVkTXVsKGUucmVkU3ViKGQpKTtcbiAgICAgIC8vIFozID0gRiAqIEpcbiAgICAgIG56ID0gZi5yZWRNdWwoaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEUgPSBDICsgRFxuICAgIHZhciBlID0gYy5yZWRBZGQoZCk7XG4gICAgLy8gSCA9IChjICogWjEpXjJcbiAgICB2YXIgaCA9IHRoaXMuY3VydmUuX211bEModGhpcy5jLnJlZE11bCh0aGlzLnopKS5yZWRTcXIoKTtcbiAgICAvLyBKID0gRSAtIDIgKiBIXG4gICAgdmFyIGogPSBlLnJlZFN1YihoKS5yZWRTdWIoaCk7XG4gICAgLy8gWDMgPSBjICogKEIgLSBFKSAqIEpcbiAgICBueCA9IHRoaXMuY3VydmUuX211bEMoYi5yZWRJU3ViKGUpKS5yZWRNdWwoaik7XG4gICAgLy8gWTMgPSBjICogRSAqIChDIC0gRClcbiAgICBueSA9IHRoaXMuY3VydmUuX211bEMoZSkucmVkTXVsKGMucmVkSVN1YihkKSk7XG4gICAgLy8gWjMgPSBFICogSlxuICAgIG56ID0gZS5yZWRNdWwoaik7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gRG91YmxlIGluIGV4dGVuZGVkIGNvb3JkaW5hdGVzXG4gIGlmICh0aGlzLmN1cnZlLmV4dGVuZGVkKVxuICAgIHJldHVybiB0aGlzLl9leHREYmwoKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl9wcm9qRGJsKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2V4dEFkZCA9IGZ1bmN0aW9uIF9leHRBZGQocCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1leHRlbmRlZC0xLmh0bWxcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwOC1od2NkLTNcbiAgLy8gOE1cblxuICAvLyBBID0gKFkxIC0gWDEpICogKFkyIC0gWDIpXG4gIHZhciBhID0gdGhpcy55LnJlZFN1Yih0aGlzLngpLnJlZE11bChwLnkucmVkU3ViKHAueCkpO1xuICAvLyBCID0gKFkxICsgWDEpICogKFkyICsgWDIpXG4gIHZhciBiID0gdGhpcy55LnJlZEFkZCh0aGlzLngpLnJlZE11bChwLnkucmVkQWRkKHAueCkpO1xuICAvLyBDID0gVDEgKiBrICogVDJcbiAgdmFyIGMgPSB0aGlzLnQucmVkTXVsKHRoaXMuY3VydmUuZGQpLnJlZE11bChwLnQpO1xuICAvLyBEID0gWjEgKiAyICogWjJcbiAgdmFyIGQgPSB0aGlzLnoucmVkTXVsKHAuei5yZWRBZGQocC56KSk7XG4gIC8vIEUgPSBCIC0gQVxuICB2YXIgZSA9IGIucmVkU3ViKGEpO1xuICAvLyBGID0gRCAtIENcbiAgdmFyIGYgPSBkLnJlZFN1YihjKTtcbiAgLy8gRyA9IEQgKyBDXG4gIHZhciBnID0gZC5yZWRBZGQoYyk7XG4gIC8vIEggPSBCICsgQVxuICB2YXIgaCA9IGIucmVkQWRkKGEpO1xuICAvLyBYMyA9IEUgKiBGXG4gIHZhciBueCA9IGUucmVkTXVsKGYpO1xuICAvLyBZMyA9IEcgKiBIXG4gIHZhciBueSA9IGcucmVkTXVsKGgpO1xuICAvLyBUMyA9IEUgKiBIXG4gIHZhciBudCA9IGUucmVkTXVsKGgpO1xuICAvLyBaMyA9IEYgKiBHXG4gIHZhciBueiA9IGYucmVkTXVsKGcpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56LCBudCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX3Byb2pBZGQgPSBmdW5jdGlvbiBfcHJvakFkZChwKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLXByb2plY3RpdmUuaHRtbFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA4LWJiamxwXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDctYmxcbiAgLy8gMTBNICsgMVNcblxuICAvLyBBID0gWjEgKiBaMlxuICB2YXIgYSA9IHRoaXMuei5yZWRNdWwocC56KTtcbiAgLy8gQiA9IEFeMlxuICB2YXIgYiA9IGEucmVkU3FyKCk7XG4gIC8vIEMgPSBYMSAqIFgyXG4gIHZhciBjID0gdGhpcy54LnJlZE11bChwLngpO1xuICAvLyBEID0gWTEgKiBZMlxuICB2YXIgZCA9IHRoaXMueS5yZWRNdWwocC55KTtcbiAgLy8gRSA9IGQgKiBDICogRFxuICB2YXIgZSA9IHRoaXMuY3VydmUuZC5yZWRNdWwoYykucmVkTXVsKGQpO1xuICAvLyBGID0gQiAtIEVcbiAgdmFyIGYgPSBiLnJlZFN1YihlKTtcbiAgLy8gRyA9IEIgKyBFXG4gIHZhciBnID0gYi5yZWRBZGQoZSk7XG4gIC8vIFgzID0gQSAqIEYgKiAoKFgxICsgWTEpICogKFgyICsgWTIpIC0gQyAtIEQpXG4gIHZhciB0bXAgPSB0aGlzLngucmVkQWRkKHRoaXMueSkucmVkTXVsKHAueC5yZWRBZGQocC55KSkucmVkSVN1YihjKS5yZWRJU3ViKGQpO1xuICB2YXIgbnggPSBhLnJlZE11bChmKS5yZWRNdWwodG1wKTtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIGlmICh0aGlzLmN1cnZlLnR3aXN0ZWQpIHtcbiAgICAvLyBZMyA9IEEgKiBHICogKEQgLSBhICogQylcbiAgICBueSA9IGEucmVkTXVsKGcpLnJlZE11bChkLnJlZFN1Yih0aGlzLmN1cnZlLl9tdWxBKGMpKSk7XG4gICAgLy8gWjMgPSBGICogR1xuICAgIG56ID0gZi5yZWRNdWwoZyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gWTMgPSBBICogRyAqIChEIC0gQylcbiAgICBueSA9IGEucmVkTXVsKGcpLnJlZE11bChkLnJlZFN1YihjKSk7XG4gICAgLy8gWjMgPSBjICogRiAqIEdcbiAgICBueiA9IHRoaXMuY3VydmUuX211bEMoZikucmVkTXVsKGcpO1xuICB9XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcDtcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGlmICh0aGlzLmN1cnZlLmV4dGVuZGVkKVxuICAgIHJldHVybiB0aGlzLl9leHRBZGQocCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fcHJvakFkZChwKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICBpZiAodGhpcy5faGFzRG91YmxlcyhrKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcywgayk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLCBrKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoazEsIHAsIGsyKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIFsgdGhpcywgcCBdLCBbIGsxLCBrMiBdLCAyKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gIGlmICh0aGlzLnpPbmUpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gTm9ybWFsaXplIGNvb3JkaW5hdGVzXG4gIHZhciB6aSA9IHRoaXMuei5yZWRJbnZtKCk7XG4gIHRoaXMueCA9IHRoaXMueC5yZWRNdWwoemkpO1xuICB0aGlzLnkgPSB0aGlzLnkucmVkTXVsKHppKTtcbiAgaWYgKHRoaXMudClcbiAgICB0aGlzLnQgPSB0aGlzLnQucmVkTXVsKHppKTtcbiAgdGhpcy56ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gIHRoaXMuek9uZSA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZygpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQodGhpcy54LnJlZE5lZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ICYmIHRoaXMudC5yZWROZWcoKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIHRoaXMubm9ybWFsaXplKCk7XG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiBnZXRZKCkge1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuICByZXR1cm4gdGhpcy55LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gIHJldHVybiB0aGlzID09PSBvdGhlciB8fFxuICAgICAgICAgdGhpcy5nZXRYKCkuY21wKG90aGVyLmdldFgoKSkgPT09IDAgJiZcbiAgICAgICAgIHRoaXMuZ2V0WSgpLmNtcChvdGhlci5nZXRZKCkpID09PSAwO1xufTtcblxuLy8gQ29tcGF0aWJpbGl0eSB3aXRoIEJhc2VDdXJ2ZVxuUG9pbnQucHJvdG90eXBlLnRvUCA9IFBvaW50LnByb3RvdHlwZS5ub3JtYWxpemU7XG5Qb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBQb2ludC5wcm90b3R5cGUuYWRkO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmUgPSBleHBvcnRzO1xuXG5jdXJ2ZS5iYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5jdXJ2ZS5zaG9ydCA9IHJlcXVpcmUoJy4vc2hvcnQnKTtcbmN1cnZlLm1vbnQgPSByZXF1aXJlKCcuL21vbnQnKTtcbmN1cnZlLmVkd2FyZHMgPSByZXF1aXJlKCcuL2Vkd2FyZHMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlID0gcmVxdWlyZSgnLi4vY3VydmUnKTtcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSBjdXJ2ZS5iYXNlO1xuXG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG5cbmZ1bmN0aW9uIE1vbnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnbW9udCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuaTQgPSBuZXcgQk4oNCkudG9SZWQodGhpcy5yZWQpLnJlZEludm0oKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmEyNCA9IHRoaXMuaTQucmVkTXVsKHRoaXMuYS5yZWRBZGQodGhpcy50d28pKTtcbn1cbmluaGVyaXRzKE1vbnRDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IE1vbnRDdXJ2ZTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIHZhciB4ID0gcG9pbnQubm9ybWFsaXplKCkueDtcbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHgyLnJlZE11bCh4KS5yZWRBZGQoeDIucmVkTXVsKHRoaXMuYSkpLnJlZEFkZCh4KTtcbiAgdmFyIHkgPSByaHMucmVkU3FydCgpO1xuXG4gIHJldHVybiB5LnJlZFNxcigpLmNtcChyaHMpID09PSAwO1xufTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHopIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ3Byb2plY3RpdmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IHRoaXMuY3VydmUuemVybztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICByZXR1cm4gdGhpcy5wb2ludCh1dGlscy50b0FycmF5KGJ5dGVzLCBlbmMpLCAxKTtcbn07XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCh4LCB6KSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeik7XG59O1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaikge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5wcmVjb21wdXRlID0gZnVuY3Rpb24gcHJlY29tcHV0ZSgpIHtcbiAgLy8gTm8tb3Bcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gX2VuY29kZSgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0WCgpLnRvQXJyYXkoJ2JlJywgdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKSk7XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmopIHtcbiAgcmV0dXJuIG5ldyBQb2ludChjdXJ2ZSwgb2JqWzBdLCBvYmpbMV0gfHwgY3VydmUub25lKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZG91YmxpbmctZGJsLTE5ODctbS0zXG4gIC8vIDJNICsgMlMgKyA0QVxuXG4gIC8vIEEgPSBYMSArIFoxXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBBQSA9IEFeMlxuICB2YXIgYWEgPSBhLnJlZFNxcigpO1xuICAvLyBCID0gWDEgLSBaMVxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQkIgPSBCXjJcbiAgdmFyIGJiID0gYi5yZWRTcXIoKTtcbiAgLy8gQyA9IEFBIC0gQkJcbiAgdmFyIGMgPSBhYS5yZWRTdWIoYmIpO1xuICAvLyBYMyA9IEFBICogQkJcbiAgdmFyIG54ID0gYWEucmVkTXVsKGJiKTtcbiAgLy8gWjMgPSBDICogKEJCICsgQTI0ICogQylcbiAgdmFyIG56ID0gYy5yZWRNdWwoYmIucmVkQWRkKHRoaXMuY3VydmUuYTI0LnJlZE11bChjKSkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kaWZmQWRkID0gZnVuY3Rpb24gZGlmZkFkZChwLCBkaWZmKSB7XG4gIC8vIGh0dHA6Ly9oeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tbW9udGdvbS14ei5odG1sI2RpZmZhZGQtZGFkZC0xOTg3LW0tM1xuICAvLyA0TSArIDJTICsgNkFcblxuICAvLyBBID0gWDIgKyBaMlxuICB2YXIgYSA9IHRoaXMueC5yZWRBZGQodGhpcy56KTtcbiAgLy8gQiA9IFgyIC0gWjJcbiAgdmFyIGIgPSB0aGlzLngucmVkU3ViKHRoaXMueik7XG4gIC8vIEMgPSBYMyArIFozXG4gIHZhciBjID0gcC54LnJlZEFkZChwLnopO1xuICAvLyBEID0gWDMgLSBaM1xuICB2YXIgZCA9IHAueC5yZWRTdWIocC56KTtcbiAgLy8gREEgPSBEICogQVxuICB2YXIgZGEgPSBkLnJlZE11bChhKTtcbiAgLy8gQ0IgPSBDICogQlxuICB2YXIgY2IgPSBjLnJlZE11bChiKTtcbiAgLy8gWDUgPSBaMSAqIChEQSArIENCKV4yXG4gIHZhciBueCA9IGRpZmYuei5yZWRNdWwoZGEucmVkQWRkKGNiKS5yZWRTcXIoKSk7XG4gIC8vIFo1ID0gWDEgKiAoREEgLSBDQileMlxuICB2YXIgbnogPSBkaWZmLngucmVkTXVsKGRhLnJlZElTdWIoY2IpLnJlZFNxcigpKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICB2YXIgdCA9IGsuY2xvbmUoKTtcbiAgdmFyIGEgPSB0aGlzOyAvLyAoTiAvIDIpICogUSArIFFcbiAgdmFyIGIgPSB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpOyAvLyAoTiAvIDIpICogUVxuICB2YXIgYyA9IHRoaXM7IC8vIFFcblxuICBmb3IgKHZhciBiaXRzID0gW107IHQuY21wbigwKSAhPT0gMDsgdC5pdXNocm4oMSkpXG4gICAgYml0cy5wdXNoKHQuYW5kbG4oMSkpO1xuXG4gIGZvciAodmFyIGkgPSBiaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGJpdHNbaV0gPT09IDApIHtcbiAgICAgIC8vIE4gKiBRICsgUSA9ICgoTiAvIDIpICogUSArIFEpKSArIChOIC8gMikgKiBRXG4gICAgICBhID0gYS5kaWZmQWRkKGIsIGMpO1xuICAgICAgLy8gTiAqIFEgPSAyICogKChOIC8gMikgKiBRICsgUSkpXG4gICAgICBiID0gYi5kYmwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTiAqIFEgPSAoKE4gLyAyKSAqIFEgKyBRKSArICgoTiAvIDIpICogUSlcbiAgICAgIGIgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSArIFEgPSAyICogKChOIC8gMikgKiBRICsgUSlcbiAgICAgIGEgPSBhLmRibCgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYjtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShvdGhlcikge1xuICByZXR1cm4gdGhpcy5nZXRYKCkuY21wKG90aGVyLmdldFgoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICB0aGlzLnggPSB0aGlzLngucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIC8vIE5vcm1hbGl6ZSBjb29yZGluYXRlc1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlID0gcmVxdWlyZSgnLi4vY3VydmUnKTtcbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gY3VydmUuYmFzZTtcblxudmFyIGFzc2VydCA9IGVsbGlwdGljLnV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gU2hvcnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnc2hvcnQnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmIgPSBuZXcgQk4oY29uZi5iLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnRpbnYgPSB0aGlzLnR3by5yZWRJbnZtKCk7XG5cbiAgdGhpcy56ZXJvQSA9IHRoaXMuYS5mcm9tUmVkKCkuY21wbigwKSA9PT0gMDtcbiAgdGhpcy50aHJlZUEgPSB0aGlzLmEuZnJvbVJlZCgpLnN1Yih0aGlzLnApLmNtcG4oLTMpID09PSAwO1xuXG4gIC8vIElmIHRoZSBjdXJ2ZSBpcyBlbmRvbW9ycGhpYywgcHJlY2FsY3VsYXRlIGJldGEgYW5kIGxhbWJkYVxuICB0aGlzLmVuZG8gPSB0aGlzLl9nZXRFbmRvbW9ycGhpc20oY29uZik7XG4gIHRoaXMuX2VuZG9XbmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX2VuZG9XbmFmVDIgPSBuZXcgQXJyYXkoNCk7XG59XG5pbmhlcml0cyhTaG9ydEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gU2hvcnRDdXJ2ZTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9tb3JwaGlzbSA9IGZ1bmN0aW9uIF9nZXRFbmRvbW9ycGhpc20oY29uZikge1xuICAvLyBObyBlZmZpY2llbnQgZW5kb21vcnBoaXNtXG4gIGlmICghdGhpcy56ZXJvQSB8fCAhdGhpcy5nIHx8ICF0aGlzLm4gfHwgdGhpcy5wLm1vZG4oMykgIT09IDEpXG4gICAgcmV0dXJuO1xuXG4gIC8vIENvbXB1dGUgYmV0YSBhbmQgbGFtYmRhLCB0aGF0IGxhbWJkYSAqIFAgPSAoYmV0YSAqIFB4OyBQeSlcbiAgdmFyIGJldGE7XG4gIHZhciBsYW1iZGE7XG4gIGlmIChjb25mLmJldGEpIHtcbiAgICBiZXRhID0gbmV3IEJOKGNvbmYuYmV0YSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmV0YXMgPSB0aGlzLl9nZXRFbmRvUm9vdHModGhpcy5wKTtcbiAgICAvLyBDaG9vc2UgdGhlIHNtYWxsZXN0IGJldGFcbiAgICBiZXRhID0gYmV0YXNbMF0uY21wKGJldGFzWzFdKSA8IDAgPyBiZXRhc1swXSA6IGJldGFzWzFdO1xuICAgIGJldGEgPSBiZXRhLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxuICBpZiAoY29uZi5sYW1iZGEpIHtcbiAgICBsYW1iZGEgPSBuZXcgQk4oY29uZi5sYW1iZGEsIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDaG9vc2UgdGhlIGxhbWJkYSB0aGF0IGlzIG1hdGNoaW5nIHNlbGVjdGVkIGJldGFcbiAgICB2YXIgbGFtYmRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLm4pO1xuICAgIGlmICh0aGlzLmcubXVsKGxhbWJkYXNbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMV07XG4gICAgICBhc3NlcnQodGhpcy5nLm11bChsYW1iZGEpLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBiYXNpcyB2ZWN0b3JzLCB1c2VkIGZvciBiYWxhbmNlZCBsZW5ndGgtdHdvIHJlcHJlc2VudGF0aW9uXG4gIHZhciBiYXNpcztcbiAgaWYgKGNvbmYuYmFzaXMpIHtcbiAgICBiYXNpcyA9IGNvbmYuYmFzaXMubWFwKGZ1bmN0aW9uKHZlYykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYTogbmV3IEJOKHZlYy5hLCAxNiksXG4gICAgICAgIGI6IG5ldyBCTih2ZWMuYiwgMTYpXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJhc2lzID0gdGhpcy5fZ2V0RW5kb0Jhc2lzKGxhbWJkYSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJldGE6IGJldGEsXG4gICAgbGFtYmRhOiBsYW1iZGEsXG4gICAgYmFzaXM6IGJhc2lzXG4gIH07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb1Jvb3RzID0gZnVuY3Rpb24gX2dldEVuZG9Sb290cyhudW0pIHtcbiAgLy8gRmluZCByb290cyBvZiBmb3IgeF4yICsgeCArIDEgaW4gRlxuICAvLyBSb290ID0gKC0xICstIFNxcnQoLTMpKSAvIDJcbiAgLy9cbiAgdmFyIHJlZCA9IG51bSA9PT0gdGhpcy5wID8gdGhpcy5yZWQgOiBCTi5tb250KG51bSk7XG4gIHZhciB0aW52ID0gbmV3IEJOKDIpLnRvUmVkKHJlZCkucmVkSW52bSgpO1xuICB2YXIgbnRpbnYgPSB0aW52LnJlZE5lZygpO1xuXG4gIHZhciBzID0gbmV3IEJOKDMpLnRvUmVkKHJlZCkucmVkTmVnKCkucmVkU3FydCgpLnJlZE11bCh0aW52KTtcblxuICB2YXIgbDEgPSBudGludi5yZWRBZGQocykuZnJvbVJlZCgpO1xuICB2YXIgbDIgPSBudGludi5yZWRTdWIocykuZnJvbVJlZCgpO1xuICByZXR1cm4gWyBsMSwgbDIgXTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9nZXRFbmRvQmFzaXMgPSBmdW5jdGlvbiBfZ2V0RW5kb0Jhc2lzKGxhbWJkYSkge1xuICAvLyBhcHJ4U3FydCA+PSBzcXJ0KHRoaXMubilcbiAgdmFyIGFwcnhTcXJ0ID0gdGhpcy5uLnVzaHJuKE1hdGguZmxvb3IodGhpcy5uLmJpdExlbmd0aCgpIC8gMikpO1xuXG4gIC8vIDMuNzRcbiAgLy8gUnVuIEVHQ0QsIHVudGlsIHIoTCArIDEpIDwgYXByeFNxcnRcbiAgdmFyIHUgPSBsYW1iZGE7XG4gIHZhciB2ID0gdGhpcy5uLmNsb25lKCk7XG4gIHZhciB4MSA9IG5ldyBCTigxKTtcbiAgdmFyIHkxID0gbmV3IEJOKDApO1xuICB2YXIgeDIgPSBuZXcgQk4oMCk7XG4gIHZhciB5MiA9IG5ldyBCTigxKTtcblxuICAvLyBOT1RFOiBhbGwgdmVjdG9ycyBhcmUgcm9vdHMgb2Y6IGEgKyBiICogbGFtYmRhID0gMCAobW9kIG4pXG4gIHZhciBhMDtcbiAgdmFyIGIwO1xuICAvLyBGaXJzdCB2ZWN0b3JcbiAgdmFyIGExO1xuICB2YXIgYjE7XG4gIC8vIFNlY29uZCB2ZWN0b3JcbiAgdmFyIGEyO1xuICB2YXIgYjI7XG5cbiAgdmFyIHByZXZSO1xuICB2YXIgaSA9IDA7XG4gIHZhciByO1xuICB2YXIgeDtcbiAgd2hpbGUgKHUuY21wbigwKSAhPT0gMCkge1xuICAgIHZhciBxID0gdi5kaXYodSk7XG4gICAgciA9IHYuc3ViKHEubXVsKHUpKTtcbiAgICB4ID0geDIuc3ViKHEubXVsKHgxKSk7XG4gICAgdmFyIHkgPSB5Mi5zdWIocS5tdWwoeTEpKTtcblxuICAgIGlmICghYTEgJiYgci5jbXAoYXByeFNxcnQpIDwgMCkge1xuICAgICAgYTAgPSBwcmV2Ui5uZWcoKTtcbiAgICAgIGIwID0geDE7XG4gICAgICBhMSA9IHIubmVnKCk7XG4gICAgICBiMSA9IHg7XG4gICAgfSBlbHNlIGlmIChhMSAmJiArK2kgPT09IDIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwcmV2UiA9IHI7XG5cbiAgICB2ID0gdTtcbiAgICB1ID0gcjtcbiAgICB4MiA9IHgxO1xuICAgIHgxID0geDtcbiAgICB5MiA9IHkxO1xuICAgIHkxID0geTtcbiAgfVxuICBhMiA9IHIubmVnKCk7XG4gIGIyID0geDtcblxuICB2YXIgbGVuMSA9IGExLnNxcigpLmFkZChiMS5zcXIoKSk7XG4gIHZhciBsZW4yID0gYTIuc3FyKCkuYWRkKGIyLnNxcigpKTtcbiAgaWYgKGxlbjIuY21wKGxlbjEpID49IDApIHtcbiAgICBhMiA9IGEwO1xuICAgIGIyID0gYjA7XG4gIH1cblxuICAvLyBOb3JtYWxpemUgc2lnbnNcbiAgaWYgKGExLm5lZ2F0aXZlKSB7XG4gICAgYTEgPSBhMS5uZWcoKTtcbiAgICBiMSA9IGIxLm5lZygpO1xuICB9XG4gIGlmIChhMi5uZWdhdGl2ZSkge1xuICAgIGEyID0gYTIubmVnKCk7XG4gICAgYjIgPSBiMi5uZWcoKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgeyBhOiBhMSwgYjogYjEgfSxcbiAgICB7IGE6IGEyLCBiOiBiMiB9XG4gIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1NwbGl0ID0gZnVuY3Rpb24gX2VuZG9TcGxpdChrKSB7XG4gIHZhciBiYXNpcyA9IHRoaXMuZW5kby5iYXNpcztcbiAgdmFyIHYxID0gYmFzaXNbMF07XG4gIHZhciB2MiA9IGJhc2lzWzFdO1xuXG4gIHZhciBjMSA9IHYyLmIubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG4gIHZhciBjMiA9IHYxLmIubmVnKCkubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG5cbiAgdmFyIHAxID0gYzEubXVsKHYxLmEpO1xuICB2YXIgcDIgPSBjMi5tdWwodjIuYSk7XG4gIHZhciBxMSA9IGMxLm11bCh2MS5iKTtcbiAgdmFyIHEyID0gYzIubXVsKHYyLmIpO1xuXG4gIC8vIENhbGN1bGF0ZSBhbnN3ZXJcbiAgdmFyIGsxID0gay5zdWIocDEpLnN1YihwMik7XG4gIHZhciBrMiA9IHExLmFkZChxMikubmVnKCk7XG4gIHJldHVybiB7IGsxOiBrMSwgazI6IGsyIH07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21YID0gZnVuY3Rpb24gcG9pbnRGcm9tWCh4LCBvZGQpIHtcbiAgeCA9IG5ldyBCTih4LCAxNik7XG4gIGlmICgheC5yZWQpXG4gICAgeCA9IHgudG9SZWQodGhpcy5yZWQpO1xuXG4gIHZhciB5MiA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoeC5yZWRNdWwodGhpcy5hKSkucmVkSUFkZCh0aGlzLmIpO1xuICB2YXIgeSA9IHkyLnJlZFNxcnQoKTtcbiAgaWYgKHkucmVkU3FyKCkucmVkU3ViKHkyKS5jbXAodGhpcy56ZXJvKSAhPT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcblxuICAvLyBYWFggSXMgdGhlcmUgYW55IHdheSB0byB0ZWxsIGlmIHRoZSBudW1iZXIgaXMgb2RkIHdpdGhvdXQgY29udmVydGluZyBpdFxuICAvLyB0byBub24tcmVkIGZvcm0/XG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIGlmIChwb2ludC5pbmYpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHggPSBwb2ludC54O1xuICB2YXIgeSA9IHBvaW50Lnk7XG5cbiAgdmFyIGF4ID0gdGhpcy5hLnJlZE11bCh4KTtcbiAgdmFyIHJocyA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoYXgpLnJlZElBZGQodGhpcy5iKTtcbiAgcmV0dXJuIHkucmVkU3FyKCkucmVkSVN1YihyaHMpLmNtcG4oMCkgPT09IDA7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1duYWZNdWxBZGQgPVxuICAgIGZ1bmN0aW9uIF9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcykge1xuICB2YXIgbnBvaW50cyA9IHRoaXMuX2VuZG9XbmFmVDE7XG4gIHZhciBuY29lZmZzID0gdGhpcy5fZW5kb1duYWZUMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc3BsaXQgPSB0aGlzLl9lbmRvU3BsaXQoY29lZmZzW2ldKTtcbiAgICB2YXIgcCA9IHBvaW50c1tpXTtcbiAgICB2YXIgYmV0YSA9IHAuX2dldEJldGEoKTtcblxuICAgIGlmIChzcGxpdC5rMS5uZWdhdGl2ZSkge1xuICAgICAgc3BsaXQuazEuaW5lZygpO1xuICAgICAgcCA9IHAubmVnKHRydWUpO1xuICAgIH1cbiAgICBpZiAoc3BsaXQuazIubmVnYXRpdmUpIHtcbiAgICAgIHNwbGl0LmsyLmluZWcoKTtcbiAgICAgIGJldGEgPSBiZXRhLm5lZyh0cnVlKTtcbiAgICB9XG5cbiAgICBucG9pbnRzW2kgKiAyXSA9IHA7XG4gICAgbnBvaW50c1tpICogMiArIDFdID0gYmV0YTtcbiAgICBuY29lZmZzW2kgKiAyXSA9IHNwbGl0LmsxO1xuICAgIG5jb2VmZnNbaSAqIDIgKyAxXSA9IHNwbGl0LmsyO1xuICB9XG4gIHZhciByZXMgPSB0aGlzLl93bmFmTXVsQWRkKDEsIG5wb2ludHMsIG5jb2VmZnMsIGkgKiAyKTtcblxuICAvLyBDbGVhbi11cCByZWZlcmVuY2VzIHRvIHBvaW50cyBhbmQgY29lZmZpY2llbnRzXG4gIGZvciAodmFyIGogPSAwOyBqIDwgaSAqIDI7IGorKykge1xuICAgIG5wb2ludHNbal0gPSBudWxsO1xuICAgIG5jb2VmZnNbal0gPSBudWxsO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeSwgaXNSZWQpIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ2FmZmluZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gbnVsbDtcbiAgICB0aGlzLnkgPSBudWxsO1xuICAgIHRoaXMuaW5mID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueSA9IG5ldyBCTih5LCAxNik7XG4gICAgLy8gRm9yY2UgcmVkZ29tZXJ5IHJlcHJlc2VudGF0aW9uIHdoZW4gbG9hZGluZyBmcm9tIEpTT05cbiAgICBpZiAoaXNSZWQpIHtcbiAgICAgIHRoaXMueC5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgICB0aGlzLnkuZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMueC5yZWQpXG4gICAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy55LnJlZClcbiAgICAgIHRoaXMueSA9IHRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgdGhpcy5pbmYgPSBmYWxzZTtcbiAgfVxufVxuaW5oZXJpdHMoUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCh4LCB5LCBpc1JlZCkge1xuICByZXR1cm4gbmV3IFBvaW50KHRoaXMsIHgsIHksIGlzUmVkKTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaiwgcmVkKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmosIHJlZCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2dldEJldGEgPSBmdW5jdGlvbiBfZ2V0QmV0YSgpIHtcbiAgaWYgKCF0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuO1xuXG4gIHZhciBwcmUgPSB0aGlzLnByZWNvbXB1dGVkO1xuICBpZiAocHJlICYmIHByZS5iZXRhKVxuICAgIHJldHVybiBwcmUuYmV0YTtcblxuICB2YXIgYmV0YSA9IHRoaXMuY3VydmUucG9pbnQodGhpcy54LnJlZE11bCh0aGlzLmN1cnZlLmVuZG8uYmV0YSksIHRoaXMueSk7XG4gIGlmIChwcmUpIHtcbiAgICB2YXIgY3VydmUgPSB0aGlzLmN1cnZlO1xuICAgIHZhciBlbmRvTXVsID0gZnVuY3Rpb24ocCkge1xuICAgICAgcmV0dXJuIGN1cnZlLnBvaW50KHAueC5yZWRNdWwoY3VydmUuZW5kby5iZXRhKSwgcC55KTtcbiAgICB9O1xuICAgIHByZS5iZXRhID0gYmV0YTtcbiAgICBiZXRhLnByZWNvbXB1dGVkID0ge1xuICAgICAgYmV0YTogbnVsbCxcbiAgICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICAgIHBvaW50czogcHJlLm5hZi5wb2ludHMubWFwKGVuZG9NdWwpXG4gICAgICB9LFxuICAgICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgICBwb2ludHM6IHByZS5kb3VibGVzLnBvaW50cy5tYXAoZW5kb011bClcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiBiZXRhO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgaWYgKCF0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiBbIHRoaXMueCwgdGhpcy55IF07XG5cbiAgcmV0dXJuIFsgdGhpcy54LCB0aGlzLnksIHRoaXMucHJlY29tcHV0ZWQgJiYge1xuICAgIGRvdWJsZXM6IHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcyAmJiB7XG4gICAgICBzdGVwOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMuc3RlcCxcbiAgICAgIHBvaW50czogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzLnBvaW50cy5zbGljZSgxKVxuICAgIH0sXG4gICAgbmFmOiB0aGlzLnByZWNvbXB1dGVkLm5hZiAmJiB7XG4gICAgICB3bmQ6IHRoaXMucHJlY29tcHV0ZWQubmFmLnduZCxcbiAgICAgIHBvaW50czogdGhpcy5wcmVjb21wdXRlZC5uYWYucG9pbnRzLnNsaWNlKDEpXG4gICAgfVxuICB9IF07XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmosIHJlZCkge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpXG4gICAgb2JqID0gSlNPTi5wYXJzZShvYmopO1xuICB2YXIgcmVzID0gY3VydmUucG9pbnQob2JqWzBdLCBvYmpbMV0sIHJlZCk7XG4gIGlmICghb2JqWzJdKVxuICAgIHJldHVybiByZXM7XG5cbiAgZnVuY3Rpb24gb2JqMnBvaW50KG9iaikge1xuICAgIHJldHVybiBjdXJ2ZS5wb2ludChvYmpbMF0sIG9ialsxXSwgcmVkKTtcbiAgfVxuXG4gIHZhciBwcmUgPSBvYmpbMl07XG4gIHJlcy5wcmVjb21wdXRlZCA9IHtcbiAgICBiZXRhOiBudWxsLFxuICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICBwb2ludHM6IFsgcmVzIF0uY29uY2F0KHByZS5kb3VibGVzLnBvaW50cy5tYXAob2JqMnBvaW50KSlcbiAgICB9LFxuICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgcG9pbnRzOiBbIHJlcyBdLmNvbmNhdChwcmUubmFmLnBvaW50cy5tYXAob2JqMnBvaW50KSlcbiAgICB9XG4gIH07XG4gIHJldHVybiByZXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gJzxFQyBQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBQb2ludCB4OiAnICsgdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB5OiAnICsgdGhpcy55LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaXNJbmZpbml0eSA9IGZ1bmN0aW9uIGlzSW5maW5pdHkoKSB7XG4gIHJldHVybiB0aGlzLmluZjtcbn07XG5cblBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiBwO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pbmYpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gUCArIFAgPSAyUFxuICBpZiAodGhpcy5lcShwKSlcbiAgICByZXR1cm4gdGhpcy5kYmwoKTtcblxuICAvLyBQICsgKC1QKSA9IE9cbiAgaWYgKHRoaXMubmVnKCkuZXEocCkpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgLy8gUCArIFEgPSBPXG4gIGlmICh0aGlzLnguY21wKHAueCkgPT09IDApXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIGMgPSB0aGlzLnkucmVkU3ViKHAueSk7XG4gIGlmIChjLmNtcG4oMCkgIT09IDApXG4gICAgYyA9IGMucmVkTXVsKHRoaXMueC5yZWRTdWIocC54KS5yZWRJbnZtKCkpO1xuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodGhpcy54KS5yZWRJU3ViKHAueCk7XG4gIHZhciBueSA9IGMucmVkTXVsKHRoaXMueC5yZWRTdWIobngpKS5yZWRJU3ViKHRoaXMueSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gMlAgPSBPXG4gIHZhciB5czEgPSB0aGlzLnkucmVkQWRkKHRoaXMueSk7XG4gIGlmICh5czEuY21wbigwKSA9PT0gMClcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcblxuICB2YXIgeDIgPSB0aGlzLngucmVkU3FyKCk7XG4gIHZhciBkeWludiA9IHlzMS5yZWRJbnZtKCk7XG4gIHZhciBjID0geDIucmVkQWRkKHgyKS5yZWRJQWRkKHgyKS5yZWRJQWRkKGEpLnJlZE11bChkeWludik7XG5cbiAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueC5yZWRBZGQodGhpcy54KSk7XG4gIHZhciBueSA9IGMucmVkTXVsKHRoaXMueC5yZWRTdWIobngpKS5yZWRJU3ViKHRoaXMueSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiBnZXRZKCkge1xuICByZXR1cm4gdGhpcy55LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICBrID0gbmV3IEJOKGssIDE2KTtcblxuICBpZiAodGhpcy5faGFzRG91YmxlcyhrKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcywgayk7XG4gIGVsc2UgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoWyB0aGlzIF0sIFsgayBdKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcDIsIGsyKSB7XG4gIHZhciBwb2ludHMgPSBbIHRoaXMsIHAyIF07XG4gIHZhciBjb2VmZnMgPSBbIGsxLCBrMiBdO1xuICBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBwb2ludHMsIGNvZWZmcywgMik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShwKSB7XG4gIHJldHVybiB0aGlzID09PSBwIHx8XG4gICAgICAgICB0aGlzLmluZiA9PT0gcC5pbmYgJiZcbiAgICAgICAgICAgICAodGhpcy5pbmYgfHwgdGhpcy54LmNtcChwLngpID09PSAwICYmIHRoaXMueS5jbXAocC55KSA9PT0gMCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKF9wcmVjb21wdXRlKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICB2YXIgcmVzID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSk7XG4gIGlmIChfcHJlY29tcHV0ZSAmJiB0aGlzLnByZWNvbXB1dGVkKSB7XG4gICAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gICAgdmFyIG5lZ2F0ZSA9IGZ1bmN0aW9uKHApIHtcbiAgICAgIHJldHVybiBwLm5lZygpO1xuICAgIH07XG4gICAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAobmVnYXRlKVxuICAgICAgfSxcbiAgICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgICAgcG9pbnRzOiBwcmUuZG91Ymxlcy5wb2ludHMubWFwKG5lZ2F0ZSlcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KID0gZnVuY3Rpb24gdG9KKCkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuXG4gIHZhciByZXMgPSB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueSwgdGhpcy5jdXJ2ZS5vbmUpO1xuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gSlBvaW50KGN1cnZlLCB4LCB5LCB6KSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdqYWNvYmlhbicpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnkgPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnogPSBuZXcgQk4oMCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gIH1cbiAgaWYgKCF0aGlzLngucmVkKVxuICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIGlmICghdGhpcy55LnJlZClcbiAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICBpZiAoIXRoaXMuei5yZWQpXG4gICAgdGhpcy56ID0gdGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcblxuICB0aGlzLnpPbmUgPSB0aGlzLnogPT09IHRoaXMuY3VydmUub25lO1xufVxuaW5oZXJpdHMoSlBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cblNob3J0Q3VydmUucHJvdG90eXBlLmpwb2ludCA9IGZ1bmN0aW9uIGpwb2ludCh4LCB5LCB6KSB7XG4gIHJldHVybiBuZXcgSlBvaW50KHRoaXMsIHgsIHksIHopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50b1AgPSBmdW5jdGlvbiB0b1AoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgemludiA9IHRoaXMuei5yZWRJbnZtKCk7XG4gIHZhciB6aW52MiA9IHppbnYucmVkU3FyKCk7XG4gIHZhciBheCA9IHRoaXMueC5yZWRNdWwoemludjIpO1xuICB2YXIgYXkgPSB0aGlzLnkucmVkTXVsKHppbnYyKS5yZWRNdWwoemludik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQoYXgsIGF5KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQodGhpcy54LCB0aGlzLnkucmVkTmVnKCksIHRoaXMueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHA7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyAxMk0gKyA0UyArIDdBXG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIHZhciB6MiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHUxID0gdGhpcy54LnJlZE11bChwejIpO1xuICB2YXIgdTIgPSBwLngucmVkTXVsKHoyKTtcbiAgdmFyIHMxID0gdGhpcy55LnJlZE11bChwejIucmVkTXVsKHAueikpO1xuICB2YXIgczIgPSBwLnkucmVkTXVsKHoyLnJlZE11bCh0aGlzLnopKTtcblxuICB2YXIgaCA9IHUxLnJlZFN1Yih1Mik7XG4gIHZhciByID0gczEucmVkU3ViKHMyKTtcbiAgaWYgKGguY21wbigwKSA9PT0gMCkge1xuICAgIGlmIChyLmNtcG4oMCkgIT09IDApXG4gICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMuZGJsKCk7XG4gIH1cblxuICB2YXIgaDIgPSBoLnJlZFNxcigpO1xuICB2YXIgaDMgPSBoMi5yZWRNdWwoaCk7XG4gIHZhciB2ID0gdTEucmVkTXVsKGgyKTtcblxuICB2YXIgbnggPSByLnJlZFNxcigpLnJlZElBZGQoaDMpLnJlZElTdWIodikucmVkSVN1Yih2KTtcbiAgdmFyIG55ID0gci5yZWRNdWwodi5yZWRJU3ViKG54KSkucmVkSVN1YihzMS5yZWRNdWwoaDMpKTtcbiAgdmFyIG56ID0gdGhpcy56LnJlZE11bChwLnopLnJlZE11bChoKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm1peGVkQWRkID0gZnVuY3Rpb24gbWl4ZWRBZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwLnRvSigpO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gOE0gKyAzUyArIDdBXG4gIHZhciB6MiA9IHRoaXMuei5yZWRTcXIoKTtcbiAgdmFyIHUxID0gdGhpcy54O1xuICB2YXIgdTIgPSBwLngucmVkTXVsKHoyKTtcbiAgdmFyIHMxID0gdGhpcy55O1xuICB2YXIgczIgPSBwLnkucmVkTXVsKHoyKS5yZWRNdWwodGhpcy56KTtcblxuICB2YXIgaCA9IHUxLnJlZFN1Yih1Mik7XG4gIHZhciByID0gczEucmVkU3ViKHMyKTtcbiAgaWYgKGguY21wbigwKSA9PT0gMCkge1xuICAgIGlmIChyLmNtcG4oMCkgIT09IDApXG4gICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMuZGJsKCk7XG4gIH1cblxuICB2YXIgaDIgPSBoLnJlZFNxcigpO1xuICB2YXIgaDMgPSBoMi5yZWRNdWwoaCk7XG4gIHZhciB2ID0gdTEucmVkTXVsKGgyKTtcblxuICB2YXIgbnggPSByLnJlZFNxcigpLnJlZElBZGQoaDMpLnJlZElTdWIodikucmVkSVN1Yih2KTtcbiAgdmFyIG55ID0gci5yZWRNdWwodi5yZWRJU3ViKG54KSkucmVkSVN1YihzMS5yZWRNdWwoaDMpKTtcbiAgdmFyIG56ID0gdGhpcy56LnJlZE11bChoKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmRibHAgPSBmdW5jdGlvbiBkYmxwKHBvdykge1xuICBpZiAocG93ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG4gIGlmICghcG93KVxuICAgIHJldHVybiB0aGlzLmRibCgpO1xuXG4gIGlmICh0aGlzLmN1cnZlLnplcm9BIHx8IHRoaXMuY3VydmUudGhyZWVBKSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG93OyBpKyspXG4gICAgICByID0gci5kYmwoKTtcbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8vIDFNICsgMlMgKyAxQSArIE4gKiAoNFMgKyA1TSArIDhBKVxuICAvLyBOID0gMSA9PiA2TSArIDZTICsgOUFcbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG4gIHZhciB0aW52ID0gdGhpcy5jdXJ2ZS50aW52O1xuXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICAvLyBSZXVzZSByZXN1bHRzXG4gIHZhciBqeWQgPSBqeS5yZWRBZGQoankpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvdzsgaSsrKSB7XG4gICAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICAgIHZhciBqeWQyID0ganlkLnJlZFNxcigpO1xuICAgIHZhciBqeWQ0ID0ganlkMi5yZWRTcXIoKTtcbiAgICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICAgIHZhciB0MSA9IGp4LnJlZE11bChqeWQyKTtcbiAgICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gICAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG4gICAgdmFyIGRueSA9IGMucmVkTXVsKHQyKTtcbiAgICBkbnkgPSBkbnkucmVkSUFkZChkbnkpLnJlZElTdWIoanlkNCk7XG4gICAgdmFyIG56ID0ganlkLnJlZE11bChqeik7XG4gICAgaWYgKGkgKyAxIDwgcG93KVxuICAgICAgano0ID0gano0LnJlZE11bChqeWQ0KTtcblxuICAgIGp4ID0gbng7XG4gICAganogPSBuejtcbiAgICBqeWQgPSBkbnk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoangsIGp5ZC5yZWRNdWwodGludiksIGp6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuemVyb0EpXG4gICAgcmV0dXJuIHRoaXMuX3plcm9EYmwoKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS50aHJlZUEpXG4gICAgcmV0dXJuIHRoaXMuX3RocmVlRGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fZGJsKCk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl96ZXJvRGJsID0gZnVuY3Rpb24gX3plcm9EYmwoKSB7XG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIC8vIFogPSAxXG4gIGlmICh0aGlzLnpPbmUpIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctbWRibC0yMDA3LWJsXG4gICAgLy8gMU0gKyA1UyArIDE0QVxuXG4gICAgLy8gWFggPSBYMV4yXG4gICAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIFlZID0gWTFeMlxuICAgIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBZWVlZID0gWVleMlxuICAgIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gICAgLy8gUyA9IDIgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpXG4gICAgdmFyIHMgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICAgIHMgPSBzLnJlZElBZGQocyk7XG4gICAgLy8gTSA9IDMgKiBYWCArIGE7IGEgPSAwXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAgIC8vIFQgPSBNIF4gMiAtIDIqU1xuICAgIHZhciB0ID0gbS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7XG5cbiAgICAvLyA4ICogWVlZWVxuICAgIHZhciB5eXl5OCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG5cbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgbnkgPSBtLnJlZE11bChzLnJlZElTdWIodCkpLnJlZElTdWIoeXl5eTgpO1xuICAgIC8vIFozID0gMipZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOS1sXG4gICAgLy8gMk0gKyA1UyArIDEzQVxuXG4gICAgLy8gQSA9IFgxXjJcbiAgICB2YXIgYSA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBCID0gWTFeMlxuICAgIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIEMgPSBCXjJcbiAgICB2YXIgYyA9IGIucmVkU3FyKCk7XG4gICAgLy8gRCA9IDIgKiAoKFgxICsgQileMiAtIEEgLSBDKVxuICAgIHZhciBkID0gdGhpcy54LnJlZEFkZChiKS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYyk7XG4gICAgZCA9IGQucmVkSUFkZChkKTtcbiAgICAvLyBFID0gMyAqIEFcbiAgICB2YXIgZSA9IGEucmVkQWRkKGEpLnJlZElBZGQoYSk7XG4gICAgLy8gRiA9IEVeMlxuICAgIHZhciBmID0gZS5yZWRTcXIoKTtcblxuICAgIC8vIDggKiBDXG4gICAgdmFyIGM4ID0gYy5yZWRJQWRkKGMpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG4gICAgYzggPSBjOC5yZWRJQWRkKGM4KTtcblxuICAgIC8vIFgzID0gRiAtIDIgKiBEXG4gICAgbnggPSBmLnJlZElTdWIoZCkucmVkSVN1YihkKTtcbiAgICAvLyBZMyA9IEUgKiAoRCAtIFgzKSAtIDggKiBDXG4gICAgbnkgPSBlLnJlZE11bChkLnJlZElTdWIobngpKS5yZWRJU3ViKGM4KTtcbiAgICAvLyBaMyA9IDIgKiBZMSAqIFoxXG4gICAgbnogPSB0aGlzLnkucmVkTXVsKHRoaXMueik7XG4gICAgbnogPSBuei5yZWRJQWRkKG56KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX3RocmVlRGJsID0gZnVuY3Rpb24gX3RocmVlRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0zLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNUFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpLnJlZElBZGQodGhpcy5jdXJ2ZS5hKTtcbiAgICAvLyBUID0gTV4yIC0gMiAqIFNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuICAgIC8vIFgzID0gVFxuICAgIG54ID0gdDtcbiAgICAvLyBZMyA9IE0gKiAoUyAtIFQpIC0gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIgKiBZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sI2RvdWJsaW5nLWRibC0yMDAxLWJcbiAgICAvLyAzTSArIDVTXG5cbiAgICAvLyBkZWx0YSA9IFoxXjJcbiAgICB2YXIgZGVsdGEgPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgLy8gZ2FtbWEgPSBZMV4yXG4gICAgdmFyIGdhbW1hID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIGJldGEgPSBYMSAqIGdhbW1hXG4gICAgdmFyIGJldGEgPSB0aGlzLngucmVkTXVsKGdhbW1hKTtcbiAgICAvLyBhbHBoYSA9IDMgKiAoWDEgLSBkZWx0YSkgKiAoWDEgKyBkZWx0YSlcbiAgICB2YXIgYWxwaGEgPSB0aGlzLngucmVkU3ViKGRlbHRhKS5yZWRNdWwodGhpcy54LnJlZEFkZChkZWx0YSkpO1xuICAgIGFscGhhID0gYWxwaGEucmVkQWRkKGFscGhhKS5yZWRJQWRkKGFscGhhKTtcbiAgICAvLyBYMyA9IGFscGhhXjIgLSA4ICogYmV0YVxuICAgIHZhciBiZXRhNCA9IGJldGEucmVkSUFkZChiZXRhKTtcbiAgICBiZXRhNCA9IGJldGE0LnJlZElBZGQoYmV0YTQpO1xuICAgIHZhciBiZXRhOCA9IGJldGE0LnJlZEFkZChiZXRhNCk7XG4gICAgbnggPSBhbHBoYS5yZWRTcXIoKS5yZWRJU3ViKGJldGE4KTtcbiAgICAvLyBaMyA9IChZMSArIFoxKV4yIC0gZ2FtbWEgLSBkZWx0YVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnopLnJlZFNxcigpLnJlZElTdWIoZ2FtbWEpLnJlZElTdWIoZGVsdGEpO1xuICAgIC8vIFkzID0gYWxwaGEgKiAoNCAqIGJldGEgLSBYMykgLSA4ICogZ2FtbWFeMlxuICAgIHZhciBnZ2FtbWE4ID0gZ2FtbWEucmVkU3FyKCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgbnkgPSBhbHBoYS5yZWRNdWwoYmV0YTQucmVkSVN1YihueCkpLnJlZElTdWIoZ2dhbW1hOCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl9kYmwgPSBmdW5jdGlvbiBfZGJsKCkge1xuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcblxuICAvLyA0TSArIDZTICsgMTBBXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICB2YXIgangyID0gangucmVkU3FyKCk7XG4gIHZhciBqeTIgPSBqeS5yZWRTcXIoKTtcblxuICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICB2YXIganhkNCA9IGp4LnJlZEFkZChqeCk7XG4gIGp4ZDQgPSBqeGQ0LnJlZElBZGQoanhkNCk7XG4gIHZhciB0MSA9IGp4ZDQucmVkTXVsKGp5Mik7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0MS5yZWRBZGQodDEpKTtcbiAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG5cbiAgdmFyIGp5ZDggPSBqeTIucmVkU3FyKCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIHZhciBueSA9IGMucmVkTXVsKHQyKS5yZWRJU3ViKGp5ZDgpO1xuICB2YXIgbnogPSBqeS5yZWRBZGQoankpLnJlZE11bChqeik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50cnBsID0gZnVuY3Rpb24gdHJwbCgpIHtcbiAgaWYgKCF0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLmRibCgpLmFkZCh0aGlzKTtcblxuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbCN0cmlwbGluZy10cGwtMjAwNy1ibFxuICAvLyA1TSArIDEwUyArIC4uLlxuXG4gIC8vIFhYID0gWDFeMlxuICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIFlZID0gWTFeMlxuICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gIC8vIFpaID0gWjFeMlxuICB2YXIgenogPSB0aGlzLnoucmVkU3FyKCk7XG4gIC8vIFlZWVkgPSBZWV4yXG4gIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gIC8vIE0gPSAzICogWFggKyBhICogWloyOyBhID0gMFxuICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCk7XG4gIC8vIE1NID0gTV4yXG4gIHZhciBtbSA9IG0ucmVkU3FyKCk7XG4gIC8vIEUgPSA2ICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKSAtIE1NXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgZSA9IGUucmVkSUFkZChlKTtcbiAgZSA9IGUucmVkQWRkKGUpLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZElTdWIobW0pO1xuICAvLyBFRSA9IEVeMlxuICB2YXIgZWUgPSBlLnJlZFNxcigpO1xuICAvLyBUID0gMTYqWVlZWVxuICB2YXIgdCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgLy8gVSA9IChNICsgRSleMiAtIE1NIC0gRUUgLSBUXG4gIHZhciB1ID0gbS5yZWRJQWRkKGUpLnJlZFNxcigpLnJlZElTdWIobW0pLnJlZElTdWIoZWUpLnJlZElTdWIodCk7XG4gIC8vIFgzID0gNCAqIChYMSAqIEVFIC0gNCAqIFlZICogVSlcbiAgdmFyIHl5dTQgPSB5eS5yZWRNdWwodSk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHZhciBueCA9IHRoaXMueC5yZWRNdWwoZWUpLnJlZElTdWIoeXl1NCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIC8vIFkzID0gOCAqIFkxICogKFUgKiAoVCAtIFUpIC0gRSAqIEVFKVxuICB2YXIgbnkgPSB0aGlzLnkucmVkTXVsKHUucmVkTXVsKHQucmVkSVN1Yih1KSkucmVkSVN1YihlLnJlZE11bChlZSkpKTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgLy8gWjMgPSAoWjEgKyBFKV4yIC0gWlogLSBFRVxuICB2YXIgbnogPSB0aGlzLnoucmVkQWRkKGUpLnJlZFNxcigpLnJlZElTdWIoenopLnJlZElTdWIoZWUpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGssIGtiYXNlKSB7XG4gIGsgPSBuZXcgQk4oaywga2Jhc2UpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpXG4gICAgcmV0dXJuIHRoaXMuZXEocC50b0ooKSk7XG5cbiAgaWYgKHRoaXMgPT09IHApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgLy8geDEgKiB6Ml4yID09IHgyICogejFeMlxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIGlmICh0aGlzLngucmVkTXVsKHB6MikucmVkSVN1YihwLngucmVkTXVsKHoyKSkuY21wbigwKSAhPT0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8geTEgKiB6Ml4zID09IHkyICogejFeM1xuICB2YXIgejMgPSB6Mi5yZWRNdWwodGhpcy56KTtcbiAgdmFyIHB6MyA9IHB6Mi5yZWRNdWwocC56KTtcbiAgcmV0dXJuIHRoaXMueS5yZWRNdWwocHozKS5yZWRJU3ViKHAueS5yZWRNdWwoejMpKS5jbXBuKDApID09PSAwO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIEpQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBKUG9pbnQgeDogJyArIHRoaXMueC50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB5OiAnICsgdGhpcy55LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnoudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlcyA9IGV4cG9ydHM7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIGVsbGlwdGljID0gcmVxdWlyZSgnLi4vZWxsaXB0aWMnKTtcblxudmFyIGFzc2VydCA9IGVsbGlwdGljLnV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gUHJlc2V0Q3VydmUob3B0aW9ucykge1xuICBpZiAob3B0aW9ucy50eXBlID09PSAnc2hvcnQnKVxuICAgIHRoaXMuY3VydmUgPSBuZXcgZWxsaXB0aWMuY3VydmUuc2hvcnQob3B0aW9ucyk7XG4gIGVsc2UgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ2Vkd2FyZHMnKVxuICAgIHRoaXMuY3VydmUgPSBuZXcgZWxsaXB0aWMuY3VydmUuZWR3YXJkcyhvcHRpb25zKTtcbiAgZWxzZVxuICAgIHRoaXMuY3VydmUgPSBuZXcgZWxsaXB0aWMuY3VydmUubW9udChvcHRpb25zKTtcbiAgdGhpcy5nID0gdGhpcy5jdXJ2ZS5nO1xuICB0aGlzLm4gPSB0aGlzLmN1cnZlLm47XG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaDtcblxuICBhc3NlcnQodGhpcy5nLnZhbGlkYXRlKCksICdJbnZhbGlkIGN1cnZlJyk7XG4gIGFzc2VydCh0aGlzLmcubXVsKHRoaXMubikuaXNJbmZpbml0eSgpLCAnSW52YWxpZCBjdXJ2ZSwgRypOICE9IE8nKTtcbn1cbmN1cnZlcy5QcmVzZXRDdXJ2ZSA9IFByZXNldEN1cnZlO1xuXG5mdW5jdGlvbiBkZWZpbmVDdXJ2ZShuYW1lLCBvcHRpb25zKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdXJ2ZXMsIG5hbWUsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGN1cnZlID0gbmV3IFByZXNldEN1cnZlKG9wdGlvbnMpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1cnZlcywgbmFtZSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBjdXJ2ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY3VydmU7XG4gICAgfVxuICB9KTtcbn1cblxuZGVmaW5lQ3VydmUoJ3AxOTInLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAncDE5MicsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICc2NDIxMDUxOSBlNTljODBlNyAwZmE3ZTlhYiA3MjI0MzA0OSBmZWI4ZGVlYyBjMTQ2YjliMScsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiA5OWRlZjgzNiAxNDZiYzliMSBiNGQyMjgzMScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcxODhkYTgwZSBiMDMwOTBmNiA3Y2JmMjBlYiA0M2ExODgwMCBmNGZmMGFmZCA4MmZmMTAxMicsXG4gICAgJzA3MTkyYjk1IGZmYzhkYTc4IDYzMTAxMWVkIDZiMjRjZGQ1IDczZjk3N2ExIDFlNzk0ODExJ1xuICBdXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AyMjQnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAncDIyNCcsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMScsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZScsXG4gIGI6ICdiNDA1MGE4NSAwYzA0YjNhYiBmNTQxMzI1NiA1MDQ0YjBiNyBkN2JmZDhiYSAyNzBiMzk0MyAyMzU1ZmZiNCcsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmMTZhMiBlMGI4ZjAzZSAxM2RkMjk0NSA1YzVjMmEzZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICdiNzBlMGNiZCA2YmI0YmY3ZiAzMjEzOTBiOSA0YTAzYzFkMyA1NmMyMTEyMiAzNDMyODBkNiAxMTVjMWQyMScsXG4gICAgJ2JkMzc2Mzg4IGI1ZjcyM2ZiIDRjMjJkZmU2IGNkNDM3NWEwIDVhMDc0NzY0IDQ0ZDU4MTk5IDg1MDA3ZTM0J1xuICBdXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AyNTYnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmMnLFxuICBiOiAnNWFjNjM1ZDggYWEzYTkzZTcgYjNlYmJkNTUgNzY5ODg2YmMgNjUxZDA2YjAgY2M1M2IwZjYgM2JjZTNjM2UgMjdkMjYwNGInLFxuICBuOiAnZmZmZmZmZmYgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgYmNlNmZhYWQgYTcxNzllODQgZjNiOWNhYzIgZmM2MzI1NTEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnNmIxN2QxZjIgZTEyYzQyNDcgZjhiY2U2ZTUgNjNhNDQwZjIgNzcwMzdkODEgMmRlYjMzYTAgZjRhMTM5NDUgZDg5OGMyOTYnLFxuICAgICc0ZmUzNDJlMiBmZTFhN2Y5YiA4ZWU3ZWI0YSA3YzBmOWUxNiAyYmNlMzM1NyA2YjMxNWVjZSBjYmI2NDA2OCAzN2JmNTFmNSdcbiAgXVxufSk7XG5cbmRlZmluZUN1cnZlKCdwMzg0Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmYycsXG4gIGI6ICdiMzMxMmZhNyBlMjNlZTdlNCA5ODhlMDU2YiBlM2Y4MmQxOSAxODFkOWM2ZSBmZTgxNDExMiAwMzE0MDg4ZiAnICtcbiAgICAgJzUwMTM4NzVhIGM2NTYzOThkIDhhMmVkMTlkIDJhODVjOGVkIGQzZWMyYWVmJyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxICcgK1xuICAgICAnZjQzNzJkZGYgNTgxYTBkYjIgNDhiMGE3N2EgZWNlYzE5NmEgY2NjNTI5NzMnLFxuICBoYXNoOiBoYXNoLnNoYTM4NCxcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnYWE4N2NhMjIgYmU4YjA1MzcgOGViMWM3MWUgZjMyMGFkNzQgNmUxZDNiNjIgOGJhNzliOTggNTlmNzQxZTAgODI1NDJhMzggJyArXG4gICAgJzU1MDJmMjVkIGJmNTUyOTZjIDNhNTQ1ZTM4IDcyNzYwYWI3JyxcbiAgICAnMzYxN2RlNGEgOTYyNjJjNmYgNWQ5ZTk4YmYgOTI5MmRjMjkgZjhmNDFkYmQgMjg5YTE0N2MgZTlkYTMxMTMgYjVmMGI4YzAgJyArXG4gICAgJzBhNjBiMWNlIDFkN2U4MTlkIDdhNDMxZDdjIDkwZWEwZTVmJ1xuICBdXG59KTtcblxuZGVmaW5lQ3VydmUoJ3A1MjEnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJzAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICcwMDAwMDA1MSA5NTNlYjk2MSA4ZTFjOWExZiA5MjlhMjFhMCBiNjg1NDBlZSBhMmRhNzI1YiAnICtcbiAgICAgJzk5YjMxNWYzIGI4YjQ4OTkxIDhlZjEwOWUxIDU2MTkzOTUxIGVjN2U5MzdiIDE2NTJjMGJkICcgK1xuICAgICAnM2JiMWJmMDcgMzU3M2RmODggM2QyYzM0ZjEgZWY0NTFmZDQgNmI1MDNmMDAnLFxuICBuOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYSA1MTg2ODc4MyBiZjJmOTY2YiA3ZmNjMDE0OCAnICtcbiAgICAgJ2Y3MDlhNWQwIDNiYjVjOWI4IDg5OWM0N2FlIGJiNmZiNzFlIDkxMzg2NDA5JyxcbiAgaGFzaDogaGFzaC5zaGE1MTIsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzAwMDAwMGM2IDg1OGUwNmI3IDA0MDRlOWNkIDllM2VjYjY2IDIzOTViNDQyIDljNjQ4MTM5ICcgK1xuICAgICcwNTNmYjUyMSBmODI4YWY2MCA2YjRkM2RiYSBhMTRiNWU3NyBlZmU3NTkyOCBmZTFkYzEyNyAnICtcbiAgICAnYTJmZmE4ZGUgMzM0OGIzYzEgODU2YTQyOWIgZjk3ZTdlMzEgYzJlNWJkNjYnLFxuICAgICcwMDAwMDExOCAzOTI5NmE3OCA5YTNiYzAwNCA1YzhhNWZiNCAyYzdkMWJkOSA5OGY1NDQ0OSAnICtcbiAgICAnNTc5YjQ0NjggMTdhZmJkMTcgMjczZTY2MmMgOTdlZTcyOTkgNWVmNDI2NDAgYzU1MGI5MDEgJyArXG4gICAgJzNmYWQwNzYxIDM1M2M3MDg2IGEyNzJjMjQwIDg4YmU5NDc2IDlmZDE2NjUwJ1xuICBdXG59KTtcblxuZGVmaW5lQ3VydmUoJ2N1cnZlMjU1MTknLCB7XG4gIHR5cGU6ICdtb250JyxcbiAgcHJpbWU6ICdwMjU1MTknLFxuICBwOiAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcsXG4gIGE6ICc3NmQwNicsXG4gIGI6ICcwJyxcbiAgbjogJzEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAxNGRlZjlkZWEyZjc5Y2Q2IDU4MTI2MzFhNWNmNWQzZWQnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnOSdcbiAgXVxufSk7XG5cbmRlZmluZUN1cnZlKCdlZDI1NTE5Jywge1xuICB0eXBlOiAnZWR3YXJkcycsXG4gIHByaW1lOiAncDI1NTE5JyxcbiAgcDogJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnLFxuICBhOiAnLTEnLFxuICBjOiAnMScsXG4gIC8vIC0xMjE2NjUgKiAoMTIxNjY2XigtMSkpIChtb2QgUClcbiAgZDogJzUyMDM2Y2VlMmI2ZmZlNzMgOGNjNzQwNzk3Nzc5ZTg5OCAwMDcwMGE0ZDQxNDFkOGFiIDc1ZWI0ZGNhMTM1OTc4YTMnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcyMTY5MzZkM2NkNmU1M2ZlYzBhNGUyMzFmZGQ2ZGM1YzY5MmNjNzYwOTUyNWE3YjJjOTU2MmQ2MDhmMjVkNTFhJyxcblxuICAgIC8vIDQvNVxuICAgICc2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjU4J1xuICBdXG59KTtcblxudmFyIHByZTtcbnRyeSB7XG4gIHByZSA9IHJlcXVpcmUoJy4vcHJlY29tcHV0ZWQvc2VjcDI1NmsxJyk7XG59IGNhdGNoIChlKSB7XG4gIHByZSA9IHVuZGVmaW5lZDtcbn1cblxuZGVmaW5lQ3VydmUoJ3NlY3AyNTZrMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdrMjU2JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmJyxcbiAgYTogJzAnLFxuICBiOiAnNycsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBiYWFlZGNlNiBhZjQ4YTAzYiBiZmQyNWU4YyBkMDM2NDE0MScsXG4gIGg6ICcxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG5cbiAgLy8gUHJlY29tcHV0ZWQgZW5kb21vcnBoaXNtXG4gIGJldGE6ICc3YWU5NmEyYjY1N2MwNzEwNmU2NDQ3OWVhYzM0MzRlOTljZjA0OTc1MTJmNTg5OTVjMTM5NmMyODcxOTUwMWVlJyxcbiAgbGFtYmRhOiAnNTM2M2FkNGNjMDVjMzBlMGE1MjYxYzAyODgxMjY0NWExMjJlMjJlYTIwODE2Njc4ZGYwMjk2N2MxYjIzYmQ3MicsXG4gIGJhc2lzOiBbXG4gICAge1xuICAgICAgYTogJzMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1JyxcbiAgICAgIGI6ICctZTQ0MzdlZDYwMTBlODgyODZmNTQ3ZmE5MGFiZmU0YzMnXG4gICAgfSxcbiAgICB7XG4gICAgICBhOiAnMTE0Y2E1MGY3YThlMmYzZjY1N2MxMTA4ZDlkNDRjZmQ4JyxcbiAgICAgIGI6ICczMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNSdcbiAgICB9XG4gIF0sXG5cbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCcsXG4gICAgJzQ4M2FkYTc3MjZhM2M0NjU1ZGE0ZmJmYzBlMTEwOGE4ZmQxN2I0NDhhNjg1NTQxOTljNDdkMDhmZmIxMGQ0YjgnLFxuICAgIHByZVxuICBdXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJy4uLy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbnZhciBLZXlQYWlyID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFQyhvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFQykpXG4gICAgcmV0dXJuIG5ldyBFQyhvcHRpb25zKTtcblxuICAvLyBTaG9ydGN1dCBgZWxsaXB0aWMuZWMoY3VydmUtbmFtZSlgXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBhc3NlcnQoZWxsaXB0aWMuY3VydmVzLmhhc093blByb3BlcnR5KG9wdGlvbnMpLCAnVW5rbm93biBjdXJ2ZSAnICsgb3B0aW9ucyk7XG5cbiAgICBvcHRpb25zID0gZWxsaXB0aWMuY3VydmVzW29wdGlvbnNdO1xuICB9XG5cbiAgLy8gU2hvcnRjdXQgZm9yIGBlbGxpcHRpYy5lYyhlbGxpcHRpYy5jdXJ2ZXMuY3VydmVOYW1lKWBcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBlbGxpcHRpYy5jdXJ2ZXMuUHJlc2V0Q3VydmUpXG4gICAgb3B0aW9ucyA9IHsgY3VydmU6IG9wdGlvbnMgfTtcblxuICB0aGlzLmN1cnZlID0gb3B0aW9ucy5jdXJ2ZS5jdXJ2ZTtcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLm5oID0gdGhpcy5uLnVzaHJuKDEpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG5cbiAgLy8gUG9pbnQgb24gY3VydmVcbiAgdGhpcy5nID0gb3B0aW9ucy5jdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShvcHRpb25zLmN1cnZlLm4uYml0TGVuZ3RoKCkgKyAxKTtcblxuICAvLyBIYXNoIGZvciBmdW5jdGlvbiBmb3IgRFJCR1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2ggfHwgb3B0aW9ucy5jdXJ2ZS5oYXNoO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFQztcblxuRUMucHJvdG90eXBlLmtleVBhaXIgPSBmdW5jdGlvbiBrZXlQYWlyKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKHRoaXMsIG9wdGlvbnMpO1xufTtcblxuRUMucHJvdG90eXBlLmtleUZyb21Qcml2YXRlID0gZnVuY3Rpb24ga2V5RnJvbVByaXZhdGUocHJpdiwgZW5jKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21Qcml2YXRlKHRoaXMsIHByaXYsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUua2V5RnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGtleUZyb21QdWJsaWMocHViLCBlbmMpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVB1YmxpYyh0aGlzLCBwdWIsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUuZ2VuS2V5UGFpciA9IGZ1bmN0aW9uIGdlbktleVBhaXIob3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIC8vIEluc3RhbnRpYXRlIEhtYWNfRFJCR1xuICB2YXIgZHJiZyA9IG5ldyBlbGxpcHRpYy5obWFjRFJCRyh7XG4gICAgaGFzaDogdGhpcy5oYXNoLFxuICAgIHBlcnM6IG9wdGlvbnMucGVycyxcbiAgICBlbnRyb3B5OiBvcHRpb25zLmVudHJvcHkgfHwgZWxsaXB0aWMucmFuZCh0aGlzLmhhc2guaG1hY1N0cmVuZ3RoKSxcbiAgICBub25jZTogdGhpcy5uLnRvQXJyYXkoKVxuICB9KTtcblxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgbnMyID0gdGhpcy5uLnN1YihuZXcgQk4oMikpO1xuICBkbyB7XG4gICAgdmFyIHByaXYgPSBuZXcgQk4oZHJiZy5nZW5lcmF0ZShieXRlcykpO1xuICAgIGlmIChwcml2LmNtcChuczIpID4gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgcHJpdi5pYWRkbigxKTtcbiAgICByZXR1cm4gdGhpcy5rZXlGcm9tUHJpdmF0ZShwcml2KTtcbiAgfSB3aGlsZSAodHJ1ZSk7XG59O1xuXG5FQy5wcm90b3R5cGUuX3RydW5jYXRlVG9OID0gZnVuY3Rpb24gdHJ1bmNhdGVUb04obXNnLCB0cnVuY09ubHkpIHtcbiAgdmFyIGRlbHRhID0gbXNnLmJ5dGVMZW5ndGgoKSAqIDggLSB0aGlzLm4uYml0TGVuZ3RoKCk7XG4gIGlmIChkZWx0YSA+IDApXG4gICAgbXNnID0gbXNnLnVzaHJuKGRlbHRhKTtcbiAgaWYgKCF0cnVuY09ubHkgJiYgbXNnLmNtcCh0aGlzLm4pID49IDApXG4gICAgcmV0dXJuIG1zZy5zdWIodGhpcy5uKTtcbiAgZWxzZVxuICAgIHJldHVybiBtc2c7XG59O1xuXG5FQy5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBrZXksIGVuYywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGVuYyA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zID0gZW5jO1xuICAgIGVuYyA9IG51bGw7XG4gIH1cbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICBrZXkgPSB0aGlzLmtleUZyb21Qcml2YXRlKGtleSwgZW5jKTtcbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obmV3IEJOKG1zZywgMTYpKTtcblxuICAvLyBaZXJvLWV4dGVuZCBrZXkgdG8gcHJvdmlkZSBlbm91Z2ggZW50cm9weVxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgYmtleSA9IGtleS5nZXRQcml2YXRlKCkudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gWmVyby1leHRlbmQgbm9uY2UgdG8gaGF2ZSB0aGUgc2FtZSBieXRlIHNpemUgYXMgTlxuICB2YXIgbm9uY2UgPSBtc2cudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IGVsbGlwdGljLmhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgZW50cm9weTogYmtleSxcbiAgICBub25jZTogbm9uY2UsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuY1xuICB9KTtcblxuICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2VuZXJhdGVcbiAgdmFyIG5zMSA9IHRoaXMubi5zdWIobmV3IEJOKDEpKTtcblxuICBmb3IgKHZhciBpdGVyID0gMDsgdHJ1ZTsgaXRlcisrKSB7XG4gICAgdmFyIGsgPSBvcHRpb25zLmsgP1xuICAgICAgICBvcHRpb25zLmsoaXRlcikgOlxuICAgICAgICBuZXcgQk4oZHJiZy5nZW5lcmF0ZSh0aGlzLm4uYnl0ZUxlbmd0aCgpKSk7XG4gICAgayA9IHRoaXMuX3RydW5jYXRlVG9OKGssIHRydWUpO1xuICAgIGlmIChrLmNtcG4oMSkgPD0gMCB8fCBrLmNtcChuczEpID49IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcCA9IHRoaXMuZy5tdWwoayk7XG4gICAgaWYgKGtwLmlzSW5maW5pdHkoKSlcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIGtwWCA9IGtwLmdldFgoKTtcbiAgICB2YXIgciA9IGtwWC51bW9kKHRoaXMubik7XG4gICAgaWYgKHIuY21wbigwKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIHMgPSBrLmludm0odGhpcy5uKS5tdWwoci5tdWwoa2V5LmdldFByaXZhdGUoKSkuaWFkZChtc2cpKTtcbiAgICBzID0gcy51bW9kKHRoaXMubik7XG4gICAgaWYgKHMuY21wbigwKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIHJlY292ZXJ5UGFyYW0gPSAoa3AuZ2V0WSgpLmlzT2RkKCkgPyAxIDogMCkgfFxuICAgICAgICAgICAgICAgICAgICAgICAgKGtwWC5jbXAocikgIT09IDAgPyAyIDogMCk7XG5cbiAgICAvLyBVc2UgY29tcGxlbWVudCBvZiBgc2AsIGlmIGl0IGlzID4gYG4gLyAyYFxuICAgIGlmIChvcHRpb25zLmNhbm9uaWNhbCAmJiBzLmNtcCh0aGlzLm5oKSA+IDApIHtcbiAgICAgIHMgPSB0aGlzLm4uc3ViKHMpO1xuICAgICAgcmVjb3ZlcnlQYXJhbSBePSAxO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKHsgcjogciwgczogcywgcmVjb3ZlcnlQYXJhbTogcmVjb3ZlcnlQYXJhbSB9KTtcbiAgfVxufTtcblxuRUMucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtc2csIHNpZ25hdHVyZSwga2V5LCBlbmMpIHtcbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obmV3IEJOKG1zZywgMTYpKTtcbiAga2V5ID0gdGhpcy5rZXlGcm9tUHVibGljKGtleSwgZW5jKTtcbiAgc2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZShzaWduYXR1cmUsICdoZXgnKTtcblxuICAvLyBQZXJmb3JtIHByaW1pdGl2ZSB2YWx1ZXMgdmFsaWRhdGlvblxuICB2YXIgciA9IHNpZ25hdHVyZS5yO1xuICB2YXIgcyA9IHNpZ25hdHVyZS5zO1xuICBpZiAoci5jbXBuKDEpIDwgMCB8fCByLmNtcCh0aGlzLm4pID49IDApXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAocy5jbXBuKDEpIDwgMCB8fCBzLmNtcCh0aGlzLm4pID49IDApXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIFZhbGlkYXRlIHNpZ25hdHVyZVxuICB2YXIgc2ludiA9IHMuaW52bSh0aGlzLm4pO1xuICB2YXIgdTEgPSBzaW52Lm11bChtc2cpLnVtb2QodGhpcy5uKTtcbiAgdmFyIHUyID0gc2ludi5tdWwocikudW1vZCh0aGlzLm4pO1xuXG4gIHZhciBwID0gdGhpcy5nLm11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHAuZ2V0WCgpLnVtb2QodGhpcy5uKS5jbXAocikgPT09IDA7XG59O1xuXG5FQy5wcm90b3R5cGUucmVjb3ZlclB1YktleSA9IGZ1bmN0aW9uKG1zZywgc2lnbmF0dXJlLCBqLCBlbmMpIHtcbiAgYXNzZXJ0KCgzICYgaikgPT09IGosICdUaGUgcmVjb3ZlcnkgcGFyYW0gaXMgbW9yZSB0aGFuIHR3byBiaXRzJyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCBlbmMpO1xuXG4gIHZhciBuID0gdGhpcy5uO1xuICB2YXIgZSA9IG5ldyBCTihtc2cpO1xuICB2YXIgciA9IHNpZ25hdHVyZS5yO1xuICB2YXIgcyA9IHNpZ25hdHVyZS5zO1xuXG4gIC8vIEEgc2V0IExTQiBzaWduaWZpZXMgdGhhdCB0aGUgeS1jb29yZGluYXRlIGlzIG9kZFxuICB2YXIgaXNZT2RkID0gaiAmIDE7XG4gIHZhciBpc1NlY29uZEtleSA9IGogPj4gMTtcbiAgaWYgKHIuY21wKHRoaXMuY3VydmUucC51bW9kKHRoaXMuY3VydmUubikpID49IDAgJiYgaXNTZWNvbmRLZXkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBzZW5jb25kIGtleSBjYW5kaW5hdGUnKTtcblxuICAvLyAxLjEuIExldCB4ID0gciArIGpuLlxuICBpZiAoaXNTZWNvbmRLZXkpXG4gICAgciA9IHRoaXMuY3VydmUucG9pbnRGcm9tWChyLmFkZCh0aGlzLmN1cnZlLm4pLCBpc1lPZGQpO1xuICBlbHNlXG4gICAgciA9IHRoaXMuY3VydmUucG9pbnRGcm9tWChyLCBpc1lPZGQpO1xuXG4gIHZhciBlTmVnID0gbi5zdWIoZSk7XG5cbiAgLy8gMS42LjEgQ29tcHV0ZSBRID0gcl4tMSAoc1IgLSAgZUcpXG4gIC8vICAgICAgICAgICAgICAgUSA9IHJeLTEgKHNSICsgLWVHKVxuICB2YXIgckludiA9IHNpZ25hdHVyZS5yLmludm0obik7XG4gIHJldHVybiB0aGlzLmcubXVsQWRkKGVOZWcsIHIsIHMpLm11bChySW52KTtcbn07XG5cbkVDLnByb3RvdHlwZS5nZXRLZXlSZWNvdmVyeVBhcmFtID0gZnVuY3Rpb24oZSwgc2lnbmF0dXJlLCBRLCBlbmMpIHtcbiAgc2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZShzaWduYXR1cmUsIGVuYyk7XG4gIGlmIChzaWduYXR1cmUucmVjb3ZlcnlQYXJhbSAhPT0gbnVsbClcbiAgICByZXR1cm4gc2lnbmF0dXJlLnJlY292ZXJ5UGFyYW07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgUXByaW1lO1xuICAgIHRyeSB7XG4gICAgICBRcHJpbWUgPSB0aGlzLnJlY292ZXJQdWJLZXkoZSwgc2lnbmF0dXJlLCBpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoUXByaW1lLmVxKFEpKVxuICAgICAgcmV0dXJuIGk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCB2YWxpZCByZWNvdmVyeSBmYWN0b3InKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG5cbmZ1bmN0aW9uIEtleVBhaXIoZWMsIG9wdGlvbnMpIHtcbiAgdGhpcy5lYyA9IGVjO1xuICB0aGlzLnByaXYgPSBudWxsO1xuICB0aGlzLnB1YiA9IG51bGw7XG5cbiAgLy8gS2V5UGFpcihlYywgeyBwcml2OiAuLi4sIHB1YjogLi4uIH0pXG4gIGlmIChvcHRpb25zLnByaXYpXG4gICAgdGhpcy5faW1wb3J0UHJpdmF0ZShvcHRpb25zLnByaXYsIG9wdGlvbnMucHJpdkVuYyk7XG4gIGlmIChvcHRpb25zLnB1YilcbiAgICB0aGlzLl9pbXBvcnRQdWJsaWMob3B0aW9ucy5wdWIsIG9wdGlvbnMucHViRW5jKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gS2V5UGFpcjtcblxuS2V5UGFpci5mcm9tUHVibGljID0gZnVuY3Rpb24gZnJvbVB1YmxpYyhlYywgcHViLCBlbmMpIHtcbiAgaWYgKHB1YiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHB1YjtcblxuICByZXR1cm4gbmV3IEtleVBhaXIoZWMsIHtcbiAgICBwdWI6IHB1YixcbiAgICBwdWJFbmM6IGVuY1xuICB9KTtcbn07XG5cbktleVBhaXIuZnJvbVByaXZhdGUgPSBmdW5jdGlvbiBmcm9tUHJpdmF0ZShlYywgcHJpdiwgZW5jKSB7XG4gIGlmIChwcml2IGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHJpdjtcblxuICByZXR1cm4gbmV3IEtleVBhaXIoZWMsIHtcbiAgICBwcml2OiBwcml2LFxuICAgIHByaXZFbmM6IGVuY1xuICB9KTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHZhciBwdWIgPSB0aGlzLmdldFB1YmxpYygpO1xuXG4gIGlmIChwdWIuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ0ludmFsaWQgcHVibGljIGtleScgfTtcbiAgaWYgKCFwdWIudmFsaWRhdGUoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdQdWJsaWMga2V5IGlzIG5vdCBhIHBvaW50JyB9O1xuICBpZiAoIXB1Yi5tdWwodGhpcy5lYy5jdXJ2ZS5uKS5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnUHVibGljIGtleSAqIE4gIT0gTycgfTtcblxuICByZXR1cm4geyByZXN1bHQ6IHRydWUsIHJlYXNvbjogbnVsbCB9O1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0UHVibGljID0gZnVuY3Rpb24gZ2V0UHVibGljKGNvbXBhY3QsIGVuYykge1xuICAvLyBjb21wYWN0IGlzIG9wdGlvbmFsIGFyZ3VtZW50XG4gIGlmICh0eXBlb2YgY29tcGFjdCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmMgPSBjb21wYWN0O1xuICAgIGNvbXBhY3QgPSBudWxsO1xuICB9XG5cbiAgaWYgKCF0aGlzLnB1YilcbiAgICB0aGlzLnB1YiA9IHRoaXMuZWMuZy5tdWwodGhpcy5wcml2KTtcblxuICBpZiAoIWVuYylcbiAgICByZXR1cm4gdGhpcy5wdWI7XG5cbiAgcmV0dXJuIHRoaXMucHViLmVuY29kZShlbmMsIGNvbXBhY3QpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0UHJpdmF0ZSA9IGZ1bmN0aW9uIGdldFByaXZhdGUoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB0aGlzLnByaXYudG9TdHJpbmcoMTYsIDIpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMucHJpdjtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLl9pbXBvcnRQcml2YXRlID0gZnVuY3Rpb24gX2ltcG9ydFByaXZhdGUoa2V5LCBlbmMpIHtcbiAgdGhpcy5wcml2ID0gbmV3IEJOKGtleSwgZW5jIHx8IDE2KTtcblxuICAvLyBFbnN1cmUgdGhhdCB0aGUgcHJpdiB3b24ndCBiZSBiaWdnZXIgdGhhbiBuLCBvdGhlcndpc2Ugd2UgbWF5IGZhaWxcbiAgLy8gaW4gZml4ZWQgbXVsdGlwbGljYXRpb24gbWV0aG9kXG4gIHRoaXMucHJpdiA9IHRoaXMucHJpdi51bW9kKHRoaXMuZWMuY3VydmUubik7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5faW1wb3J0UHVibGljID0gZnVuY3Rpb24gX2ltcG9ydFB1YmxpYyhrZXksIGVuYykge1xuICBpZiAoa2V5LnggfHwga2V5LnkpIHtcbiAgICB0aGlzLnB1YiA9IHRoaXMuZWMuY3VydmUucG9pbnQoa2V5LngsIGtleS55KTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5wdWIgPSB0aGlzLmVjLmN1cnZlLmRlY29kZVBvaW50KGtleSwgZW5jKTtcbn07XG5cbi8vIEVDREhcbktleVBhaXIucHJvdG90eXBlLmRlcml2ZSA9IGZ1bmN0aW9uIGRlcml2ZShwdWIpIHtcbiAgcmV0dXJuIHB1Yi5tdWwodGhpcy5wcml2KS5nZXRYKCk7XG59O1xuXG4vLyBFQ0RTQVxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBlbmMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuZWMuc2lnbihtc2csIHRoaXMsIGVuYywgb3B0aW9ucyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUpIHtcbiAgcmV0dXJuIHRoaXMuZWMudmVyaWZ5KG1zZywgc2lnbmF0dXJlLCB0aGlzKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICByZXR1cm4gJzxLZXkgcHJpdjogJyArICh0aGlzLnByaXYgJiYgdGhpcy5wcml2LnRvU3RyaW5nKDE2LCAyKSkgK1xuICAgICAgICAgJyBwdWI6ICcgKyAodGhpcy5wdWIgJiYgdGhpcy5wdWIuaW5zcGVjdCgpKSArICcgPic7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xuXG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBTaWduYXR1cmUob3B0aW9ucywgZW5jKSB7XG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgU2lnbmF0dXJlKVxuICAgIHJldHVybiBvcHRpb25zO1xuXG4gIGlmICh0aGlzLl9pbXBvcnRERVIob3B0aW9ucywgZW5jKSlcbiAgICByZXR1cm47XG5cbiAgYXNzZXJ0KG9wdGlvbnMuciAmJiBvcHRpb25zLnMsICdTaWduYXR1cmUgd2l0aG91dCByIG9yIHMnKTtcbiAgdGhpcy5yID0gbmV3IEJOKG9wdGlvbnMuciwgMTYpO1xuICB0aGlzLnMgPSBuZXcgQk4ob3B0aW9ucy5zLCAxNik7XG4gIGlmIChvcHRpb25zLnJlY292ZXJ5UGFyYW0gPT09IHVuZGVmaW5lZClcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuICBlbHNlXG4gICAgdGhpcy5yZWNvdmVyeVBhcmFtID0gb3B0aW9ucy5yZWNvdmVyeVBhcmFtO1xufVxubW9kdWxlLmV4cG9ydHMgPSBTaWduYXR1cmU7XG5cbmZ1bmN0aW9uIFBvc2l0aW9uKCkge1xuICB0aGlzLnBsYWNlID0gMDtcbn1cblxuZnVuY3Rpb24gZ2V0TGVuZ3RoKGJ1ZiwgcCkge1xuICB2YXIgaW5pdGlhbCA9IGJ1ZltwLnBsYWNlKytdO1xuICBpZiAoIShpbml0aWFsICYgMHg4MCkpIHtcbiAgICByZXR1cm4gaW5pdGlhbDtcbiAgfVxuICB2YXIgb2N0ZXRMZW4gPSBpbml0aWFsICYgMHhmO1xuICB2YXIgdmFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIG9mZiA9IHAucGxhY2U7IGkgPCBvY3RldExlbjsgaSsrLCBvZmYrKykge1xuICAgIHZhbCA8PD0gODtcbiAgICB2YWwgfD0gYnVmW29mZl07XG4gIH1cbiAgcC5wbGFjZSA9IG9mZjtcbiAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gcm1QYWRkaW5nKGJ1Zikge1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKCFidWZbaV0gJiYgIShidWZbaSArIDFdICYgMHg4MCkgJiYgaSA8IGxlbikge1xuICAgIGkrKztcbiAgfVxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuIGJ1Zi5zbGljZShpKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS5faW1wb3J0REVSID0gZnVuY3Rpb24gX2ltcG9ydERFUihkYXRhLCBlbmMpIHtcbiAgZGF0YSA9IHV0aWxzLnRvQXJyYXkoZGF0YSwgZW5jKTtcbiAgdmFyIHAgPSBuZXcgUG9zaXRpb24oKTtcbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgzMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAoKGxlbiArIHAucGxhY2UpICE9PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBybGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICB2YXIgciA9IGRhdGEuc2xpY2UocC5wbGFjZSwgcmxlbiArIHAucGxhY2UpO1xuICBwLnBsYWNlICs9IHJsZW47XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHNsZW4gPSBnZXRMZW5ndGgoZGF0YSwgcCk7XG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gc2xlbiArIHAucGxhY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHMgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHNsZW4gKyBwLnBsYWNlKTtcbiAgaWYgKHJbMF0gPT09IDAgJiYgKHJbMV0gJiAweDgwKSkge1xuICAgIHIgPSByLnNsaWNlKDEpO1xuICB9XG4gIGlmIChzWzBdID09PSAwICYmIChzWzFdICYgMHg4MCkpIHtcbiAgICBzID0gcy5zbGljZSgxKTtcbiAgfVxuXG4gIHRoaXMuciA9IG5ldyBCTihyKTtcbiAgdGhpcy5zID0gbmV3IEJOKHMpO1xuICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gY29uc3RydWN0TGVuZ3RoKGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPCAweDgwKSB7XG4gICAgYXJyLnB1c2gobGVuKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG9jdGV0cyA9IDEgKyAoTWF0aC5sb2cobGVuKSAvIE1hdGguTE4yID4+PiAzKTtcbiAgYXJyLnB1c2gob2N0ZXRzIHwgMHg4MCk7XG4gIHdoaWxlICgtLW9jdGV0cykge1xuICAgIGFyci5wdXNoKChsZW4gPj4+IChvY3RldHMgPDwgMykpICYgMHhmZik7XG4gIH1cbiAgYXJyLnB1c2gobGVuKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0RFUiA9IGZ1bmN0aW9uIHRvREVSKGVuYykge1xuICB2YXIgciA9IHRoaXMuci50b0FycmF5KCk7XG4gIHZhciBzID0gdGhpcy5zLnRvQXJyYXkoKTtcblxuICAvLyBQYWQgdmFsdWVzXG4gIGlmIChyWzBdICYgMHg4MClcbiAgICByID0gWyAwIF0uY29uY2F0KHIpO1xuICAvLyBQYWQgdmFsdWVzXG4gIGlmIChzWzBdICYgMHg4MClcbiAgICBzID0gWyAwIF0uY29uY2F0KHMpO1xuXG4gIHIgPSBybVBhZGRpbmcocik7XG4gIHMgPSBybVBhZGRpbmcocyk7XG5cbiAgd2hpbGUgKCFzWzBdICYmICEoc1sxXSAmIDB4ODApKSB7XG4gICAgcyA9IHMuc2xpY2UoMSk7XG4gIH1cbiAgdmFyIGFyciA9IFsgMHgwMiBdO1xuICBjb25zdHJ1Y3RMZW5ndGgoYXJyLCByLmxlbmd0aCk7XG4gIGFyciA9IGFyci5jb25jYXQocik7XG4gIGFyci5wdXNoKDB4MDIpO1xuICBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBzLmxlbmd0aCk7XG4gIHZhciBiYWNrSGFsZiA9IGFyci5jb25jYXQocyk7XG4gIHZhciByZXMgPSBbIDB4MzAgXTtcbiAgY29uc3RydWN0TGVuZ3RoKHJlcywgYmFja0hhbGYubGVuZ3RoKTtcbiAgcmVzID0gcmVzLmNvbmNhdChiYWNrSGFsZik7XG4gIHJldHVybiB1dGlscy5lbmNvZGUocmVzLCBlbmMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xudmFyIHBhcnNlQnl0ZXMgPSB1dGlscy5wYXJzZUJ5dGVzO1xudmFyIEtleVBhaXIgPSByZXF1aXJlKCcuL2tleScpO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG5cbmZ1bmN0aW9uIEVERFNBKGN1cnZlKSB7XG4gIGFzc2VydChjdXJ2ZSA9PT0gJ2VkMjU1MTknLCAnb25seSB0ZXN0ZWQgd2l0aCBlZDI1NTE5IHNvIGZhcicpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFRERTQSkpXG4gICAgcmV0dXJuIG5ldyBFRERTQShjdXJ2ZSk7XG5cbiAgdmFyIGN1cnZlID0gZWxsaXB0aWMuY3VydmVzW2N1cnZlXS5jdXJ2ZTtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLmcgPSBjdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShjdXJ2ZS5uLmJpdExlbmd0aCgpICsgMSk7XG5cbiAgdGhpcy5wb2ludENsYXNzID0gY3VydmUucG9pbnQoKS5jb25zdHJ1Y3RvcjtcbiAgdGhpcy5lbmNvZGluZ0xlbmd0aCA9IE1hdGguY2VpbChjdXJ2ZS5uLmJpdExlbmd0aCgpIC8gOCk7XG4gIHRoaXMuaGFzaCA9IGhhc2guc2hhNTEyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVERFNBO1xuXG4vKipcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfEtleVBhaXJ9IHNlY3JldCAtIHNlY3JldCBieXRlcyBvciBhIGtleXBhaXJcbiogQHJldHVybnMge1NpZ25hdHVyZX0gLSBzaWduYXR1cmVcbiovXG5FRERTQS5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSwgc2VjcmV0KSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICB2YXIga2V5ID0gdGhpcy5rZXlGcm9tU2VjcmV0KHNlY3JldCk7XG4gIHZhciByID0gdGhpcy5oYXNoSW50KGtleS5tZXNzYWdlUHJlZml4KCksIG1lc3NhZ2UpO1xuICB2YXIgUiA9IHRoaXMuZy5tdWwocik7XG4gIHZhciBSZW5jb2RlZCA9IHRoaXMuZW5jb2RlUG9pbnQoUik7XG4gIHZhciBzXyA9IHRoaXMuaGFzaEludChSZW5jb2RlZCwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAubXVsKGtleS5wcml2KCkpO1xuICB2YXIgUyA9IHIuYWRkKHNfKS51bW9kKHRoaXMuY3VydmUubik7XG4gIHJldHVybiB0aGlzLm1ha2VTaWduYXR1cmUoeyBSOiBSLCBTOiBTLCBSZW5jb2RlZDogUmVuY29kZWQgfSk7XG59O1xuXG4vKipcbiogQHBhcmFtIHtBcnJheX0gbWVzc2FnZSAtIG1lc3NhZ2UgYnl0ZXNcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd8U2lnbmF0dXJlfSBzaWcgLSBzaWcgYnl0ZXNcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd8UG9pbnR8S2V5UGFpcn0gcHViIC0gcHVibGljIGtleVxuKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSB0cnVlIGlmIHB1YmxpYyBrZXkgbWF0Y2hlcyBzaWcgb2YgbWVzc2FnZVxuKi9cbkVERFNBLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobWVzc2FnZSwgc2lnLCBwdWIpIHtcbiAgbWVzc2FnZSA9IHBhcnNlQnl0ZXMobWVzc2FnZSk7XG4gIHNpZyA9IHRoaXMubWFrZVNpZ25hdHVyZShzaWcpO1xuICB2YXIga2V5ID0gdGhpcy5rZXlGcm9tUHVibGljKHB1Yik7XG4gIHZhciBoID0gdGhpcy5oYXNoSW50KHNpZy5SZW5jb2RlZCgpLCBrZXkucHViQnl0ZXMoKSwgbWVzc2FnZSk7XG4gIHZhciBTRyA9IHRoaXMuZy5tdWwoc2lnLlMoKSk7XG4gIHZhciBScGx1c0FoID0gc2lnLlIoKS5hZGQoa2V5LnB1YigpLm11bChoKSk7XG4gIHJldHVybiBScGx1c0FoLmVxKFNHKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5oYXNoSW50ID0gZnVuY3Rpb24gaGFzaEludCgpIHtcbiAgdmFyIGhhc2ggPSB0aGlzLmhhc2goKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgaGFzaC51cGRhdGUoYXJndW1lbnRzW2ldKTtcbiAgcmV0dXJuIHV0aWxzLmludEZyb21MRShoYXNoLmRpZ2VzdCgpKS51bW9kKHRoaXMuY3VydmUubik7XG59O1xuXG5FRERTQS5wcm90b3R5cGUua2V5RnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGtleUZyb21QdWJsaWMocHViKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21QdWJsaWModGhpcywgcHViKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5rZXlGcm9tU2VjcmV0ID0gZnVuY3Rpb24ga2V5RnJvbVNlY3JldChzZWNyZXQpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVNlY3JldCh0aGlzLCBzZWNyZXQpO1xufTtcblxuRUREU0EucHJvdG90eXBlLm1ha2VTaWduYXR1cmUgPSBmdW5jdGlvbiBtYWtlU2lnbmF0dXJlKHNpZykge1xuICBpZiAoc2lnIGluc3RhbmNlb2YgU2lnbmF0dXJlKVxuICAgIHJldHVybiBzaWc7XG4gIHJldHVybiBuZXcgU2lnbmF0dXJlKHRoaXMsIHNpZyk7XG59O1xuXG4vKipcbiogKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtam9zZWZzc29uLWVkZHNhLWVkMjU1MTktMDMjc2VjdGlvbi01LjJcbipcbiogRUREU0EgZGVmaW5lcyBtZXRob2RzIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgcG9pbnRzIGFuZCBpbnRlZ2Vycy4gVGhlc2UgYXJlXG4qIGhlbHBlciBjb252ZW5pZW5jZSBtZXRob2RzLCB0aGF0IHBhc3MgYWxvbmcgdG8gdXRpbGl0eSBmdW5jdGlvbnMgaW1wbGllZFxuKiBwYXJhbWV0ZXJzLlxuKlxuKi9cbkVERFNBLnByb3RvdHlwZS5lbmNvZGVQb2ludCA9IGZ1bmN0aW9uIGVuY29kZVBvaW50KHBvaW50KSB7XG4gIHZhciBlbmMgPSBwb2ludC5nZXRZKCkudG9BcnJheSgnbGUnLCB0aGlzLmVuY29kaW5nTGVuZ3RoKTtcbiAgZW5jW3RoaXMuZW5jb2RpbmdMZW5ndGggLSAxXSB8PSBwb2ludC5nZXRYKCkuaXNPZGQoKSA/IDB4ODAgOiAwO1xuICByZXR1cm4gZW5jO1xufTtcblxuRUREU0EucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMpIHtcbiAgYnl0ZXMgPSB1dGlscy5wYXJzZUJ5dGVzKGJ5dGVzKTtcblxuICB2YXIgbGFzdEl4ID0gYnl0ZXMubGVuZ3RoIC0gMTtcbiAgdmFyIG5vcm1lZCA9IGJ5dGVzLnNsaWNlKDAsIGxhc3RJeCkuY29uY2F0KGJ5dGVzW2xhc3RJeF0gJiB+MHg4MCk7XG4gIHZhciB4SXNPZGQgPSAoYnl0ZXNbbGFzdEl4XSAmIDB4ODApICE9PSAwO1xuXG4gIHZhciB5ID0gdXRpbHMuaW50RnJvbUxFKG5vcm1lZCk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50RnJvbVkoeSwgeElzT2RkKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5lbmNvZGVJbnQgPSBmdW5jdGlvbiBlbmNvZGVJbnQobnVtKSB7XG4gIHJldHVybiBudW0udG9BcnJheSgnbGUnLCB0aGlzLmVuY29kaW5nTGVuZ3RoKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5kZWNvZGVJbnQgPSBmdW5jdGlvbiBkZWNvZGVJbnQoYnl0ZXMpIHtcbiAgcmV0dXJuIHV0aWxzLmludEZyb21MRShieXRlcyk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuaXNQb2ludCA9IGZ1bmN0aW9uIGlzUG9pbnQodmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiB0aGlzLnBvaW50Q2xhc3M7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xudmFyIHBhcnNlQnl0ZXMgPSB1dGlscy5wYXJzZUJ5dGVzO1xudmFyIGNhY2hlZFByb3BlcnR5ID0gdXRpbHMuY2FjaGVkUHJvcGVydHk7XG5cbi8qKlxuKiBAcGFyYW0ge0VERFNBfSBlZGRzYSAtIGluc3RhbmNlXG4qIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFyYW1ldGVyc1xuKlxuKiBAcGFyYW0ge0FycmF5PEJ5dGU+fSBbcGFyYW1zLnNlY3JldF0gLSBzZWNyZXQgc2VlZCBieXRlc1xuKiBAcGFyYW0ge1BvaW50fSBbcGFyYW1zLnB1Yl0gLSBwdWJsaWMga2V5IHBvaW50IChha2EgYEFgIGluIGVkZHNhIHRlcm1zKVxuKiBAcGFyYW0ge0FycmF5PEJ5dGU+fSBbcGFyYW1zLnB1Yl0gLSBwdWJsaWMga2V5IHBvaW50IGVuY29kZWQgYXMgYnl0ZXNcbipcbiovXG5mdW5jdGlvbiBLZXlQYWlyKGVkZHNhLCBwYXJhbXMpIHtcbiAgdGhpcy5lZGRzYSA9IGVkZHNhO1xuICB0aGlzLl9zZWNyZXQgPSBwYXJzZUJ5dGVzKHBhcmFtcy5zZWNyZXQpO1xuICBpZiAoZWRkc2EuaXNQb2ludChwYXJhbXMucHViKSlcbiAgICB0aGlzLl9wdWIgPSBwYXJhbXMucHViO1xuICBlbHNlXG4gICAgdGhpcy5fcHViQnl0ZXMgPSBwYXJzZUJ5dGVzKHBhcmFtcy5wdWIpO1xufVxuXG5LZXlQYWlyLmZyb21QdWJsaWMgPSBmdW5jdGlvbiBmcm9tUHVibGljKGVkZHNhLCBwdWIpIHtcbiAgaWYgKHB1YiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHB1YjtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVkZHNhLCB7IHB1YjogcHViIH0pO1xufTtcblxuS2V5UGFpci5mcm9tU2VjcmV0ID0gZnVuY3Rpb24gZnJvbVNlY3JldChlZGRzYSwgc2VjcmV0KSB7XG4gIGlmIChzZWNyZXQgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBzZWNyZXQ7XG4gIHJldHVybiBuZXcgS2V5UGFpcihlZGRzYSwgeyBzZWNyZXQ6IHNlY3JldCB9KTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnNlY3JldCA9IGZ1bmN0aW9uIHNlY3JldCgpIHtcbiAgcmV0dXJuIHRoaXMuX3NlY3JldDtcbn07XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsIGZ1bmN0aW9uIHB1YkJ5dGVzKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLnB1YigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCBmdW5jdGlvbiBwdWIoKSB7XG4gIGlmICh0aGlzLl9wdWJCeXRlcylcbiAgICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLl9wdWJCeXRlcyk7XG4gIHJldHVybiB0aGlzLmVkZHNhLmcubXVsKHRoaXMucHJpdigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCBmdW5jdGlvbiBwcml2Qnl0ZXMoKSB7XG4gIHZhciBlZGRzYSA9IHRoaXMuZWRkc2E7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIHZhciBsYXN0SXggPSBlZGRzYS5lbmNvZGluZ0xlbmd0aCAtIDE7XG5cbiAgdmFyIGEgPSBoYXNoLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKTtcbiAgYVswXSAmPSAyNDg7XG4gIGFbbGFzdEl4XSAmPSAxMjc7XG4gIGFbbGFzdEl4XSB8PSA2NDtcblxuICByZXR1cm4gYTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCBmdW5jdGlvbiBwcml2KCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5wcml2Qnl0ZXMoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgZnVuY3Rpb24gaGFzaCgpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuaGFzaCgpLnVwZGF0ZSh0aGlzLnNlY3JldCgpKS5kaWdlc3QoKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCBmdW5jdGlvbiBtZXNzYWdlUHJlZml4KCkge1xuICByZXR1cm4gdGhpcy5oYXNoKCkuc2xpY2UodGhpcy5lZGRzYS5lbmNvZGluZ0xlbmd0aCk7XG59KTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSkge1xuICBhc3NlcnQodGhpcy5fc2VjcmV0LCAnS2V5UGFpciBjYW4gb25seSB2ZXJpZnknKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2Euc2lnbihtZXNzYWdlLCB0aGlzKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EudmVyaWZ5KG1lc3NhZ2UsIHNpZywgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRTZWNyZXQgPSBmdW5jdGlvbiBnZXRTZWNyZXQoZW5jKSB7XG4gIGFzc2VydCh0aGlzLl9zZWNyZXQsICdLZXlQYWlyIGlzIHB1YmxpYyBvbmx5Jyk7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5zZWNyZXQoKSwgZW5jKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhlbmMpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnB1YkJ5dGVzKCksIGVuYyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleVBhaXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgZWxsaXB0aWMgPSByZXF1aXJlKCcuLi8uLi9lbGxpcHRpYycpO1xudmFyIHV0aWxzID0gZWxsaXB0aWMudXRpbHM7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xudmFyIGNhY2hlZFByb3BlcnR5ID0gdXRpbHMuY2FjaGVkUHJvcGVydHk7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG5cbi8qKlxuKiBAcGFyYW0ge0VERFNBfSBlZGRzYSAtIGVkZHNhIGluc3RhbmNlXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fE9iamVjdH0gc2lnIC1cbiogQHBhcmFtIHtBcnJheTxCeXRlcz58UG9pbnR9IFtzaWcuUl0gLSBSIHBvaW50IGFzIFBvaW50IG9yIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fGJufSBbc2lnLlNdIC0gUyBzY2FsYXIgYXMgYm4gb3IgYnl0ZXNcbiogQHBhcmFtIHtBcnJheTxCeXRlcz59IFtzaWcuUmVuY29kZWRdIC0gUiBwb2ludCBlbmNvZGVkXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fSBbc2lnLlNlbmNvZGVkXSAtIFMgc2NhbGFyIGVuY29kZWRcbiovXG5mdW5jdGlvbiBTaWduYXR1cmUoZWRkc2EsIHNpZykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG5cbiAgaWYgKHR5cGVvZiBzaWcgIT09ICdvYmplY3QnKVxuICAgIHNpZyA9IHBhcnNlQnl0ZXMoc2lnKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzaWcpKSB7XG4gICAgc2lnID0ge1xuICAgICAgUjogc2lnLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKSxcbiAgICAgIFM6IHNpZy5zbGljZShlZGRzYS5lbmNvZGluZ0xlbmd0aClcbiAgICB9O1xuICB9XG5cbiAgYXNzZXJ0KHNpZy5SICYmIHNpZy5TLCAnU2lnbmF0dXJlIHdpdGhvdXQgUiBvciBTJyk7XG5cbiAgaWYgKGVkZHNhLmlzUG9pbnQoc2lnLlIpKVxuICAgIHRoaXMuX1IgPSBzaWcuUjtcbiAgaWYgKHNpZy5TIGluc3RhbmNlb2YgQk4pXG4gICAgdGhpcy5fUyA9IHNpZy5TO1xuXG4gIHRoaXMuX1JlbmNvZGVkID0gQXJyYXkuaXNBcnJheShzaWcuUikgPyBzaWcuUiA6IHNpZy5SZW5jb2RlZDtcbiAgdGhpcy5fU2VuY29kZWQgPSBBcnJheS5pc0FycmF5KHNpZy5TKSA/IHNpZy5TIDogc2lnLlNlbmNvZGVkO1xufVxuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsIGZ1bmN0aW9uIFMoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLlNlbmNvZGVkKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgZnVuY3Rpb24gUigpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5SZW5jb2RlZCgpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsIGZ1bmN0aW9uIFJlbmNvZGVkKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLlIoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCBmdW5jdGlvbiBTZW5jb2RlZCgpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlSW50KHRoaXMuUygpKTtcbn0pO1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKCkge1xuICByZXR1cm4gdGhpcy5SZW5jb2RlZCgpLmNvbmNhdCh0aGlzLlNlbmNvZGVkKCkpO1xufTtcblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0hleCA9IGZ1bmN0aW9uIHRvSGV4KCkge1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMudG9CeXRlcygpLCAnaGV4JykudG9VcHBlckNhc2UoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2lnbmF0dXJlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzaCA9IHJlcXVpcmUoJ2hhc2guanMnKTtcbnZhciBlbGxpcHRpYyA9IHJlcXVpcmUoJy4uL2VsbGlwdGljJyk7XG52YXIgdXRpbHMgPSBlbGxpcHRpYy51dGlscztcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEhtYWNEUkJHKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEhtYWNEUkJHKSlcbiAgICByZXR1cm4gbmV3IEhtYWNEUkJHKG9wdGlvbnMpO1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2g7XG4gIHRoaXMucHJlZFJlc2lzdCA9ICEhb3B0aW9ucy5wcmVkUmVzaXN0O1xuXG4gIHRoaXMub3V0TGVuID0gdGhpcy5oYXNoLm91dFNpemU7XG4gIHRoaXMubWluRW50cm9weSA9IG9wdGlvbnMubWluRW50cm9weSB8fCB0aGlzLmhhc2guaG1hY1N0cmVuZ3RoO1xuXG4gIHRoaXMucmVzZWVkID0gbnVsbDtcbiAgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IG51bGw7XG4gIHRoaXMuSyA9IG51bGw7XG4gIHRoaXMuViA9IG51bGw7XG5cbiAgdmFyIGVudHJvcHkgPSB1dGlscy50b0FycmF5KG9wdGlvbnMuZW50cm9weSwgb3B0aW9ucy5lbnRyb3B5RW5jKTtcbiAgdmFyIG5vbmNlID0gdXRpbHMudG9BcnJheShvcHRpb25zLm5vbmNlLCBvcHRpb25zLm5vbmNlRW5jKTtcbiAgdmFyIHBlcnMgPSB1dGlscy50b0FycmF5KG9wdGlvbnMucGVycywgb3B0aW9ucy5wZXJzRW5jKTtcbiAgYXNzZXJ0KGVudHJvcHkubGVuZ3RoID49ICh0aGlzLm1pbkVudHJvcHkgLyA4KSxcbiAgICAgICAgICdOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICcgKyB0aGlzLm1pbkVudHJvcHkgKyAnIGJpdHMnKTtcbiAgdGhpcy5faW5pdChlbnRyb3B5LCBub25jZSwgcGVycyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEhtYWNEUkJHO1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGVudHJvcHksIG5vbmNlLCBwZXJzKSB7XG4gIHZhciBzZWVkID0gZW50cm9weS5jb25jYXQobm9uY2UpLmNvbmNhdChwZXJzKTtcblxuICB0aGlzLksgPSBuZXcgQXJyYXkodGhpcy5vdXRMZW4gLyA4KTtcbiAgdGhpcy5WID0gbmV3IEFycmF5KHRoaXMub3V0TGVuIC8gOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5WLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5LW2ldID0gMHgwMDtcbiAgICB0aGlzLlZbaV0gPSAweDAxO1xuICB9XG5cbiAgdGhpcy5fdXBkYXRlKHNlZWQpO1xuICB0aGlzLnJlc2VlZCA9IDE7XG4gIHRoaXMucmVzZWVkSW50ZXJ2YWwgPSAweDEwMDAwMDAwMDAwMDA7ICAvLyAyXjQ4XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX2htYWMgPSBmdW5jdGlvbiBobWFjKCkge1xuICByZXR1cm4gbmV3IGhhc2guaG1hYyh0aGlzLmhhc2gsIHRoaXMuSyk7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVkKSB7XG4gIHZhciBrbWFjID0gdGhpcy5faG1hYygpXG4gICAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5WKVxuICAgICAgICAgICAgICAgICAudXBkYXRlKFsgMHgwMCBdKTtcbiAgaWYgKHNlZWQpXG4gICAga21hYyA9IGttYWMudXBkYXRlKHNlZWQpO1xuICB0aGlzLksgPSBrbWFjLmRpZ2VzdCgpO1xuICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG4gIGlmICghc2VlZClcbiAgICByZXR1cm47XG5cbiAgdGhpcy5LID0gdGhpcy5faG1hYygpXG4gICAgICAgICAgICAgICAudXBkYXRlKHRoaXMuVilcbiAgICAgICAgICAgICAgIC51cGRhdGUoWyAweDAxIF0pXG4gICAgICAgICAgICAgICAudXBkYXRlKHNlZWQpXG4gICAgICAgICAgICAgICAuZGlnZXN0KCk7XG4gIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5yZXNlZWQgPSBmdW5jdGlvbiByZXNlZWQoZW50cm9weSwgZW50cm9weUVuYywgYWRkLCBhZGRFbmMpIHtcbiAgLy8gT3B0aW9uYWwgZW50cm9weSBlbmNcbiAgaWYgKHR5cGVvZiBlbnRyb3B5RW5jICE9PSAnc3RyaW5nJykge1xuICAgIGFkZEVuYyA9IGFkZDtcbiAgICBhZGQgPSBlbnRyb3B5RW5jO1xuICAgIGVudHJvcHlFbmMgPSBudWxsO1xuICB9XG5cbiAgZW50cm9weSA9IHV0aWxzLnRvQnVmZmVyKGVudHJvcHksIGVudHJvcHlFbmMpO1xuICBhZGQgPSB1dGlscy50b0J1ZmZlcihhZGQsIGFkZEVuYyk7XG5cbiAgYXNzZXJ0KGVudHJvcHkubGVuZ3RoID49ICh0aGlzLm1pbkVudHJvcHkgLyA4KSxcbiAgICAgICAgICdOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICcgKyB0aGlzLm1pbkVudHJvcHkgKyAnIGJpdHMnKTtcblxuICB0aGlzLl91cGRhdGUoZW50cm9weS5jb25jYXQoYWRkIHx8IFtdKSk7XG4gIHRoaXMucmVzZWVkID0gMTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uIGdlbmVyYXRlKGxlbiwgZW5jLCBhZGQsIGFkZEVuYykge1xuICBpZiAodGhpcy5yZXNlZWQgPiB0aGlzLnJlc2VlZEludGVydmFsKVxuICAgIHRocm93IG5ldyBFcnJvcignUmVzZWVkIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gT3B0aW9uYWwgZW5jb2RpbmdcbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdzdHJpbmcnKSB7XG4gICAgYWRkRW5jID0gYWRkO1xuICAgIGFkZCA9IGVuYztcbiAgICBlbmMgPSBudWxsO1xuICB9XG5cbiAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhXG4gIGlmIChhZGQpIHtcbiAgICBhZGQgPSB1dGlscy50b0FycmF5KGFkZCwgYWRkRW5jKTtcbiAgICB0aGlzLl91cGRhdGUoYWRkKTtcbiAgfVxuXG4gIHZhciB0ZW1wID0gW107XG4gIHdoaWxlICh0ZW1wLmxlbmd0aCA8IGxlbikge1xuICAgIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbiAgICB0ZW1wID0gdGVtcC5jb25jYXQodGhpcy5WKTtcbiAgfVxuXG4gIHZhciByZXMgPSB0ZW1wLnNsaWNlKDAsIGxlbik7XG4gIHRoaXMuX3VwZGF0ZShhZGQpO1xuICB0aGlzLnJlc2VlZCsrO1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHJlcywgZW5jKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZG91Ymxlczoge1xuICAgIHN0ZXA6IDQsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdlNjBmY2U5M2I1OWU5ZWM1MzAxMWFhYmMyMWMyM2U5N2IyYTMxMzY5Yjg3YTVhZTljNDRlZTg5ZTJhNmRlYzBhJyxcbiAgICAgICAgJ2Y3ZTM1MDczOTllNTk1OTI5ZGI5OWYzNGY1NzkzNzEwMTI5Njg5MWU0NGQyM2YwYmUxZjMyY2NlNjk2MTY4MjEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODI4MjI2MzIxMmM2MDlkOWVhMmE2ZTNlMTcyZGUyMzhkOGMzOWNhYmQ1YWMxY2ExMDY0NmUyM2ZkNWY1MTUwOCcsXG4gICAgICAgICcxMWY4YTgwOTg1NTdkZmU0NWU4MjU2ZTgzMGI2MGFjZTYyZDYxM2FjMmY3YjE3YmVkMzFiNmVhZmY2ZTI2Y2FmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE3NWUxNTlmNzI4Yjg2NWE3MmY5OWNjNmM2ZmM4NDZkZTBiOTM4MzNmZDIyMjJlZDczZmNlNWI1NTFlNWI3MzknLFxuICAgICAgICAnZDM1MDZlMGQ5ZTNjNzllYmE0ZWY5N2E1MWZmNzFmNWVhY2I1OTU1YWRkMjQzNDVjNmVmYTZmZmVlOWZlZDY5NSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNjNkOTBkNDQ3YjAwYzljOTljZWFjMDViNjI2MmVlMDUzNDQxYzdlNTU1NTJmZmU1MjZiYWQ4ZjgzZmY0NjQwJyxcbiAgICAgICAgJzRlMjczYWRmYzczMjIyMTk1M2I0NDUzOTdmMzM2MzE0NWI5YTg5MDA4MTk5ZWNiNjIwMDNjN2YzYmVlOWRlOSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YjRiNWYxNjVkZjNjMmJlOGM2MjQ0YjViNzQ1NjM4ODQzZTRhNzgxYTE1YmNkMWI2OWY3OWE1NWRmZmRmODBjJyxcbiAgICAgICAgJzRhYWQwYTZmNjhkMzA4YjRiM2ZiZDc4MTNhYjBkYTA0ZjllMzM2NTQ2MTYyZWU1NmIzZWZmMGM2NWZkNGZkMzYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzIzY2JhYTZlNWRiOTk2ZDZiZjc3MWMwMGJkNTQ4YzdiNzAwZGJmZmE2YzBlNzdiY2I2MTE1OTI1MjMyZmNkYScsXG4gICAgICAgICc5NmU4NjdiNTU5NWNjNDk4YTkyMTEzNzQ4ODgyNGQ2ZTI2NjBhMDY1Mzc3OTQ5NDgwMWRjMDY5ZDllYjM5ZjVmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlYmZhNGQ0OTNiZWJmOThiYTVmZWVjODEyYzJkM2I1MDk0Nzk2MTIzN2E5MTk4MzlhNTMzZWNhMGU3ZGQ3ZmEnLFxuICAgICAgICAnNWQ5YThjYTM5NzBlZjBmMjY5ZWU3ZWRhZjE3ODA4OWQ5YWU0Y2RjM2E3MTFmNzEyZGRmZDRmZGFlMWRlODk5OSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxMDBmNDRkYTY5NmU3MTY3Mjc5MWQwYTA5YjdiZGU0NTlmMTIxNWEyOWIzYzAzYmZlZmQ3ODM1YjM5YTQ4ZGIwJyxcbiAgICAgICAgJ2NkZDllMTMxOTJhMDBiNzcyZWM4ZjMzMDBjMDkwNjY2YjdmZjRhMThmZjUxOTVhYzBmYmQ1Y2Q2MmJjNjVhMDknXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTEwMzFiZTI2MmM3ZWQxYjFkYzkyMjdhNGEwNGMwMTdhNzdmOGQ0NDY0ZjNiMzg1MmM4YWNkZTZlNTM0ZmQyZCcsXG4gICAgICAgICc5ZDcwNjE5Mjg5NDA0MDVlNmJiNmE0MTc2NTk3NTM1YWYyOTJkZDQxOWUxY2VkNzlhNDRmMThmMjk0NTZhMDBkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZlZWE2Y2FlNDZkNTViNTMwYWMyODM5ZjE0M2JkN2VjNWNmOGIyNjZhNDFkNmFmNTJkNWU2ODhkOTA5NDY5NmQnLFxuICAgICAgICAnZTU3YzZiNmM5N2RjZTFiYWIwNmU0ZTEyYmYzZWNkNWM5ODFjODk1N2NjNDE0NDJkMzE1NWRlYmYxODA5MDA4OCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTY3YTkxZDkxMDQ5Y2RjYjM2N2JlNGJlNmZmY2EzY2ZlZWQ2NTdkODA4NTgzZGUzM2ZhOTc4YmMxZWM2Y2IxJyxcbiAgICAgICAgJzliYWNhYTM1NDgxNjQyYmM0MWY0NjNmN2VjOTc4MGU1ZGVjN2FkYzUwOGY3NDBhMTdlOWVhOGUyN2E2OGJlMWQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTM5MDRmYWEwYjMzNGNkZGE2ZTAwMDkzNWVmMjIxNTFlYzA4ZDBmN2JiMTEwNjlmNTc1NDVjY2MxYTM3YjdjMCcsXG4gICAgICAgICc1YmMwODdkMGJjODAxMDZkODhjOWVjY2FjMjBkM2MxYzEzOTk5OTgxZTE0NDM0Njk5ZGNiMDk2YjAyMjc3MWM4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhlN2JjZDBiZDM1OTgzYTc3MTljY2E3NzY0Y2E5MDY3NzliNTNhMDQzYTliOGJjYWVmZjk1OWY0M2FkODYwNDcnLFxuICAgICAgICAnMTBiNzc3MGIyYTNkYTRiMzk0MDMxMDQyMGNhOTUxNDU3OWU4OGUyZTQ3ZmQ2OGIzZWExMDA0N2U4NDYwMzcyYSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczODVlZWQzNGMxY2RmZjIxZTZkMDgxODY4OWI4MWJkZTcxYTdmNGYxODM5N2U2NjkwYTg0MWUxNTk5YzQzODYyJyxcbiAgICAgICAgJzI4M2JlYmMzZThlYTIzZjU2NzAxZGUxOWU5ZWJmNDU3NmIzMDRlZWMyMDg2ZGM4Y2MwNDU4ZmU1NTQyZTU0NTMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNmY5ZDliODAzZWNmMTkxNjM3YzczYTQ0MTNkZmExODBmZGRmODRhNTk0N2ZiYzljNjA2ZWQ4NmMzZmFjM2E3JyxcbiAgICAgICAgJzdjODBjNjhlNjAzMDU5YmE2OWI4ZTJhMzBlNDVjNGQ0N2VhNGRkMmY1YzI4MTAwMmQ4Njg5MDYwM2E4NDIxNjAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzMyMmQ0MDEyNDNjNGUyNTgyYTIxNDdjMTA0ZDZlY2JmNzc0ZDE2M2RiMGY1ZTUzMTNiN2UwZTc0MmQwZTZiZCcsXG4gICAgICAgICc1NmU3MDc5N2U5NjY0ZWY1YmZiMDE5YmM0ZGRhZjliNzI4MDVmNjNlYTI4NzNhZjYyNGYzYTJlOTZjMjhiMmEwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1NjcyYzdkMmRlMGI3ZGEyYmQxNzcwZDg5NjY1ODY4NzQxYjNmOWFmNzY0MzM5NzcyMWQ3NGQyODEzNGFiODMnLFxuICAgICAgICAnN2M0ODFiOWI1YjQzYjJlYjYzNzQwNDliZmE2MmMyZTVlNzdmMTdmY2M1Mjk4ZjQ0YzhlMzA5NGY3OTAzMTNhNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5NDhiZjgwOWIxOTg4YTQ2YjA2YzlmMTkxOTQxM2IxMGY5MjI2YzYwZjY2ODgzMmZmZDk1OWFmNjBjODJhMGEnLFxuICAgICAgICAnNTNhNTYyODU2ZGNiNjY0NmRjNmI3NGM1ZDFjMzQxOGM2ZDRkZmYwOGM5N2NkMmJlZDRjYjdmODhkOGM4ZTU4OSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MjYwY2U3ZjQ2MTgwMWMzNGYwNjdjZTBmMDI4NzNhOGYxYjBlNDRkZmM2OTc1MmFjY2VjZDgxOWYzOGZkOGU4JyxcbiAgICAgICAgJ2JjMmRhODJiNmZhNWI1NzFhN2YwOTA0OTc3NmExZWY3ZWNkMjkyMjM4MDUxYzE5OGMxYTg0ZTk1YjJiNGFlMTcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTUwMzdkZTBhZmMxZDhkNDNkODM0ODQxNGJiZjQxMDMwNDNlYzhmNTc1YmZkYzQzMjk1M2NjOGQyMDM3ZmEyZCcsXG4gICAgICAgICc0NTcxNTM0YmFhOTRkM2I1ZjlmOThkMDlmYjk5MGJkZGJkNWY1YjAzZWM0ODFmMTBlMGU1ZGM4NDFkNzU1YmRhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UwNjM3MmIwZjRhMjA3YWRmNWVhOTA1ZThmMTc3MWI0ZTdlOGRiZDFjNmE2YzViNzI1ODY2YTBhZTRmY2U3MjUnLFxuICAgICAgICAnN2E5MDg5NzRiY2UxOGNmZTEyYTI3YmIyYWQ1YTQ4OGNkNzQ4NGE3Nzg3MTA0ODcwYjI3MDM0Zjk0ZWVlMzFkZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyMTNjN2E3MTVjZDVkNDUzNThkMGJiZjlkYzBjZTAyMjA0YjEwYmRkZTJhM2Y1ODU0MGFkNjkwOGQwNTU5NzU0JyxcbiAgICAgICAgJzRiNmRhZDBiNWFlNDYyNTA3MDEzYWQwNjI0NWJhMTkwYmI0ODUwZjVmMzZhN2VlZGRmZjJjMjc1MzRiNDU4ZjInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU3YzI3MmE3YWY0YjM0ZThkYmI5MzUyYTU0MTlhODdlMjgzOGM3MGFkYzYyY2RkZjBjYzNhM2IwOGZiZDUzYycsXG4gICAgICAgICcxNzc0OWM3NjZjOWQwYjE4ZTE2ZmQwOWY2ZGVmNjgxYjUzMGI5NjE0YmZmN2RkMzNlMGIzOTQxODE3ZGNhYWU2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZlYTc0ZTNkYmU3NzhiMWIxMGYyMzhhZDYxNjg2YWE1Yzc2ZTNkYjJiZTQzMDU3NjMyNDI3ZTI4NDBmYjI3YjYnLFxuICAgICAgICAnNmUwNTY4ZGI5YjBiMTMyOTdjZjY3NGRlY2NiNmFmOTMxMjZiNTk2Yjk3M2Y3Yjc3NzAxZDNkYjdmMjNjYjk2ZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NmU2NDExM2Y2NzdjZjBlMTBhMjU3MGQ1OTk5NjhkMzE1NDRlMTc5Yjc2MDQzMjk1MmMwMmE0NDE3YmRkZTM5JyxcbiAgICAgICAgJ2M5MGRkZjhkZWU0ZTk1Y2Y1NzcwNjZkNzA2ODFmMGQzNWUyYTMzZDJiNTZkMjAzMmI0YjE3NTJkMTkwMWFjMDEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzczOGM1NmIwM2IyYWJlMWU4MjgxYmFhNzQzZjhmOWE4ZjdjYzY0M2RmMjZjYmVlM2FiMTUwMjQyYmNiYjg5MScsXG4gICAgICAgICc4OTNmYjU3ODk1MWFkMjUzN2Y3MThmMmVhY2JmYmJiYjgyMzE0ZWVmNzg4MGNmZTkxN2U3MzVkOTY5OWE4NGMzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q4OTU2MjY1NDhiNjViODFlMjY0Yzc2MzdjOTcyODc3ZDFkNzJlNWYzYTkyNTAxNDM3MmU5ZjY1ODhmNmMxNGInLFxuICAgICAgICAnZmViZmFhMzhmMmJjN2VhZTcyOGVjNjA4MThjMzQwZWIwMzQyOGQ2MzJiYjA2N2UxNzkzNjNlZDc1ZDdkOTkxZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiOGRhOTQwMzJhOTU3NTE4ZWIwZjY0MzM1NzFlODc2MWNlZmZjNzM2OTNlODRlZGQ0OTE1MGE1NjRmNjc2ZTAzJyxcbiAgICAgICAgJzI4MDRkZmE0NDgwNWExZTRkN2M5OWNjOTc2MjgwOGIwOTJjYzU4NGQ5NWZmM2I1MTE0ODhlNGU3NGVmZGY2ZTcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTgwZmVhMTQ0NDFmYjMzYTdkOGFkYWI5NDc1ZDdmYWIyMDE5ZWZmYjUxNTZhNzkyZjFhMTE3NzhlM2MwZGY1ZCcsXG4gICAgICAgICdlZWQxZGU3ZjYzOGUwMDc3MWU4OTc2OGNhM2NhOTQ0NzJkMTU1ZTgwYWYzMjJlYTlmY2I0MjkxYjZhYzllYzc4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2EzMDE2OTdiZGZjZDcwNDMxM2JhNDhlNTFkNTY3NTQzZjJhMTgyMDMxZWZkNjkxNWRkYzA3YmJjYzRlMTYwNzAnLFxuICAgICAgICAnNzM3MGY5MWNmYjY3ZTRmNTA4MTgwOWZhMjVkNDBmOWIxNzM1ZGJmN2MwYTExYTEzMGMwZDFhMDQxZTE3N2VhMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MGFkODViMzg5ZDZiOTM2NDYzZjlkMDUxMjY3OGRlMjA4Y2MzMzBiMTEzMDdmZmZhYjdhYzYzZTNmYjA0ZWQ0JyxcbiAgICAgICAgJ2U1MDdhMzYyMGEzODI2MWFmZmRjYmQ5NDI3MjIyYjgzOWFlZmFiZTE1ODI4OTRkOTkxZDRkNDhjYjZlZjE1MCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZjY4YjlkMmY2M2I1ZjMzOTIzOWMxYWQ5ODFmMTYyZWU4OGM1Njc4NzIzZWEzMzUxYjdiNDQ0YzllYzRjMGRhJyxcbiAgICAgICAgJzY2MmE5ZjJkYmEwNjM5ODZkZTFkOTBjMmI2YmUyMTVkYmJlYTJjZmU5NTUxMGJmZGYyM2NiZjc5NTAxZmZmODInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTRmM2ZiMDE3NmFmODVkNjVmZjk5ZmY5MTk4YzM2MDkxZjQ4ZTg2NTAzNjgxZTNlNjY4NmZkNTA1MzIzMWUxMScsXG4gICAgICAgICcxZTYzNjMzYWQwZWY0ZjFjMTY2MWE2ZDBlYTAyYjcyODZjYzdlNzRlYzk1MWQxYzk4MjJjMzg1NzZmZWI3M2JjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhjMDBmYTliMThlYmYzMzFlYjk2MTUzN2E0NWE0MjY2YzcwMzRmMmYwZDRlMWQwNzE2ZmI2ZWFlMjBlYWUyOWUnLFxuICAgICAgICAnZWZhNDcyNjdmZWE1MjFhMWE5ZGMzNDNhMzczNmM5NzRjMmZhZGFmYTgxZTM2YzU0ZTdkMmE0YzY2NzAyNDE0YidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlN2EyNmNlNjlkZDQ4MjlmM2UxMGNlYzBhOWU5OGVkMzE0M2QwODRmMzA4YjkyYzA5OTdmZGRmYzYwY2IzZTQxJyxcbiAgICAgICAgJzJhNzU4ZTMwMGZhNzk4NGI0NzFiMDA2YTFhYWZiYjE4ZDBhNmIyYzA0MjBlODNlMjBlOGE5NDIxY2YyY2ZkNTEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjY0NTllMGVlMzY2MmVjOGQyMzU0MGMyMjNiY2JkYzU3MWNiY2I5NjdkNzk0MjRmM2NmMjllYjNkZTZiODBlZicsXG4gICAgICAgICc2N2M4NzZkMDZmM2UwNmRlMWRhZGYxNmU1NjYxZGIzYzRiM2FlNmQ0OGUzNWIyZmYzMGJmMGI2MWE3MWJhNDUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDY4YTgwYzgyODBiYjg0MDc5MzIzNGFhMTE4ZjA2MjMxZDZmMWZjNjdlNzNjNWE1ZGVkYTBmNWI0OTY5NDNlOCcsXG4gICAgICAgICdkYjhiYTlmZmY0YjU4NmQwMGM0YjFmOTE3N2IwZTI4YjViMGU3YjhmNzg0NTI5NWEyOTRjODQyNjZiMTMzMTIwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyNGFlZDdkZjY1YzgwNDI1MmRjMDI3MDkwN2EzMGIwOTYxMmFlYjk3MzQ0OWNlYTQwOTU5ODBmYzI4ZDNkNWQnLFxuICAgICAgICAnNjQ4YTM2NTc3NGI2MWYyZmYxMzBjMGMzNWFlYzFmNGYxOTIxM2IwYzdlMzMyODQzOTY3MjI0YWY5NmFiN2M4NCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZGY5YzE0OTE5Y2RlNjFmNmQ1MWRmZGJlNWZlZTVkY2VlYzQxNDNiYThkMWNhODg4ZThiZDM3M2ZkMDU0Yzk2JyxcbiAgICAgICAgJzM1ZWM1MTA5MmQ4NzI4MDUwOTc0YzIzYTFkODVkNGI1ZDUwNmNkYzI4ODQ5MDE5MmViYWMwNmNhZDEwZDVkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzljMzkxOWE4NGE0NzQ4NzBmYWVkOGE5YzFjYzY2MDIxNTIzNDg5MDU0ZDdmMDMwOGNiZmM5OWM4YWMxZjk4Y2QnLFxuICAgICAgICAnZGRiODRmMGY0YTRkZGQ1NzU4NGYwNDRiZjI2MGU2NDE5MDUzMjZmNzZjNjRjOGU2YmU3ZTVlMDNkNGZjNTk5ZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MDU3MTcwYjFkZDEyZmRmOGRlMDVmMjgxZDhlMDZiYjkxZTE0OTNhOGI5MWQ0Y2M1YTIxMzgyMTIwYTk1OWU1JyxcbiAgICAgICAgJzlhMWFmMGIyNmE2YTQ4MDdhZGQ5YTJkYWY3MWRmMjYyNDY1MTUyYmMzZWUyNGM2NWU4OTliZTkzMjM4NWEyYTgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTU3NmRmOGUyM2EwODQxMTQyMTQzOWE0NTE4ZGEzMTg4MGNlZjBmYmE3ZDRkZjEyYjFhNjk3M2VlY2I5NDI2NicsXG4gICAgICAgICc0MGE2YmYyMGU3NjY0MGIyYzkyYjk3YWZlNThjZDgyYzQzMmUxMGE3ZjUxNGQ5ZjNlZThiZTExYWUxYjI4ZWM4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NzhhNzhjMjhkZWMzZTMwYTA1ZmU5NjI5ZGU4YzM4YmIzMGQxZjVjZjlhM2EyMDhmNzYzODg5YmU1OGFkNzEnLFxuICAgICAgICAnMzQ2MjZkOWFiNWE1YjIyZmY3MDk4ZTEyZjJmZjU4MDA4N2IzODQxMWZmMjRhYzU2M2I1MTNmYzFmZDlmNDNhYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5Mjg5NTVlZTYzN2E4NDQ2MzcyOWZkMzBlN2FmZDJlZDVmOTYyNzRlNWFkN2U1Y2IwOWVkYTljMDZkOTAzYWMnLFxuICAgICAgICAnYzI1NjIxMDAzZDNmNDJhODI3Yjc4YTEzMDkzYTk1ZWVhYzNkMjZlZmE4YThkODNmYzUxODBlOTM1YmNkMDkxZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NWQwZmVmM2VjNmRiMTA5Mzk5MDY0ZjNhMGUzYjI4NTU2NDViNGE5MDdhZDM1NDUyN2FhZTc1MTYzZDgyNzUxJyxcbiAgICAgICAgJzFmMDM2NDg0MTNhMzhjMGJlMjlkNDk2ZTU4MmNmNTY2M2U4NzUxZTk2ODc3MzMxNTgyYzIzN2EyNGViMWY5NjInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYyYjBkY2U5N2VlY2U5N2MxYzliNjA0MTc5OGI4NWRmZGZiNmQ4ODgyZGEyMDMwOGY1NDA0ODI0NTI2MDg3ZScsXG4gICAgICAgICc0OTNkMTNmZWY1MjRiYTE4OGFmNGM0ZGM1NGQwNzkzNmM3YjdlZDZmYjkwZTJjZWIyYzk1MWUwMWYwYzI5OTA3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgyN2ZiYmU0YjFlODgwZWE5ZWQyYjJlNjMwMWIyMTJiNTdmMWVlMTQ4Y2Q2ZGQyODc4MGU1ZTJjZjg1NmUyNDEnLFxuICAgICAgICAnYzYwZjljOTIzYzcyN2IwYjcxYmVmMmM2N2QxZDEyNjg3ZmY3YTYzMTg2OTAzMTY2ZDYwNWI2OGJhZWMyOTNlYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYWE2NDlmMjFmNTFiZGJhZTdiZTRhZTM0Y2U2ZTUyMTdhNThmZGNlN2Y0N2Y5YWE3ZjNiNThmYTIxMjBlMmIzJyxcbiAgICAgICAgJ2JlMzI3OWVkNWJiYmIwM2FjNjlhODBmODk4NzlhYTVhMDFhNmI5NjVmMTNmN2U1OWQ0N2E1MzA1YmE1YWQ5M2QnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTRhNDJkNDNjNWNmMTY5ZDkzOTFkZjZkZWNmNDJlZTU0MWI2ZDhmMGM5YTEzNzQwMWUyMzYzMmRkYTM0ZDI0ZicsXG4gICAgICAgICc0ZDlmOTJlNzE2ZDFjNzM1MjZmYzk5Y2NmYjhhZDM0Y2U4ODZlZWRmYThkOGU0ZjEzYTdmNzEzMWRlYmE5NDE0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlYzgwZmVmMzYwY2JkZDk1NDE2MGZhZGFiMzUyYjZiOTJiNTM1NzZhODhmZWE0OTQ3MTczYjlkNDMwMGJmMTknLFxuICAgICAgICAnYWVlZmU5Mzc1NmI1MzQwZDJmM2E0OTU4YTdhYmJmNWUwMTQ2ZTc3ZjYyOTVhMDdiNjcxY2RjMWNjMTA3Y2VmZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNDZhNzc4YzA0NjcwYzJmOTFiMDBhZjQ2ODBkZmE4YmNlMzQ5MDcxN2Q1OGJhODg5ZGRiNTkyODM2NjY0MmJlJyxcbiAgICAgICAgJ2IzMThlMGVjMzM1NDAyOGFkZDY2OTgyN2Y5ZDRiMjg3MGFhYTk3MWQyZjdlNWVkMWQwYjI5NzQ4M2Q4M2VmZDAnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmE1MGMwZjYxZDIyZTVmMDdlM2FjZWJiMWFhMDdiMTI4ZDAwMTIyMDlhMjhiOTc3NmQ3NmE4NzkzMTgwZWVmOScsXG4gICAgICAgICc2Yjg0YzY5MjIzOTdlYmE5YjcyY2QyODcyMjgxYTY4YTVlNjgzMjkzYTU3YTIxM2IzOGNkOGQ3ZDNmNGYyODExJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhMWQ2MWQwY2E3MjFhMTFiMWE1YmY2YjdkODhlODQyMWEyODhhYjVkNWJiYTUyMjBlNTNkMzJiNWYwNjdlYzInLFxuICAgICAgICAnODE1N2Y1NWE3Yzk5MzA2Yzc5YzA3NjYxNjFjOTFlMjk2NmE3Mzg5OWQyNzliNDhhNjU1ZmJhMGYxYWQ4MzZmMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhOGUyODJmZjBjOTcwNjkwNzIxNWZmOThlOGZkNDE2NjE1MzExZGUwNDQ2ZjFlMDYyYTczYjA2MTBkMDY0ZTEzJyxcbiAgICAgICAgJzdmOTczNTViOGRiODFjMDlhYmZiN2YzYzViMjUxNTg4OGI2NzlhM2U1MGRkNmJkNmNlZjdjNzMxMTFmNGNjMGMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc0YTUzYjljOWEyODU4NzJkMzllNTZlNjkxM2NhYjE1ZDU5YjFmYTUxMjUwOGMwMjJmMzgyZGU4MzE5NDk3YycsXG4gICAgICAgICdjY2M5ZGMzN2FiZmM5YzE2NTdiNDE1NWYyYzQ3ZjllNjY0NmIzYTFkOGNiOTg1NDM4M2RhMTNhYzA3OWFmYTczJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk1OTM5Njk4MTk0Mzc4NWMzZDNlNTdlZGY1MDE4Y2RiZTAzOWU3MzBlNDkxOGIzZDg4NGZkZmYwOTQ3NWI3YmEnLFxuICAgICAgICAnMmU3ZTU1Mjg4OGMzMzFkZDhiYTAzODZhNGI5Y2Q2ODQ5YzY1M2Y2NGM4NzA5Mzg1ZTliOGFiZjg3NTI0ZjJmZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkMmE2M2E1MGFlNDAxZTU2ZDY0NWExMTUzYjEwOWE4ZmNjYTBhNDNkNTYxZmJhMmRiYjUxMzQwYzlkODJiMTUxJyxcbiAgICAgICAgJ2U4MmQ4NmZiNjQ0M2ZjYjc1NjVhZWU1OGIyOTQ4MjIwYTcwZjc1MGFmNDg0Y2E1MmQ0MTQyMTc0ZGNmODk0MDUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjQ1ODdlMjMzNTQ3MWViODkwZWU3ODk2ZDdjZmRjODY2YmFjYmRiZDM4MzkzMTdiMzQzNmY5YjQ1NjE3ZTA3MycsXG4gICAgICAgICdkOTlmY2RkNWJmNjkwMmUyYWU5NmRkNjQ0N2MyOTlhMTg1YjkwYTM5MTMzYWVhYjM1ODI5OWU1ZTlmYWY2NTg5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0ODFiZGUwZTRlNGQ4ODViM2E1NDZkM2U1NDlkZTA0MmYwYWE2Y2VhMjUwZTdmZDM1OGQ2Yzg2ZGQ0NWU0NTgnLFxuICAgICAgICAnMzhlZTdiOGNiYTU0MDRkZDg0YTI1YmYzOWNlY2IyY2E5MDBhNzljNDJiMjYyZTU1NmQ2NGIxYjU5Nzc5MDU3ZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxMzQ2NGE1N2E3ODEwMmFhNjJiNjk3OWFlODE3ZjQ2MzdmZmNmZWQzYzRiMWNlMzBiY2Q2MzAzZjZjYWY2NjZiJyxcbiAgICAgICAgJzY5YmUxNTkwMDQ2MTQ1ODBlZjdlNDMzNDUzY2NiMGNhNDhmMzAwYTgxZDA5NDJlMTNmNDk1YTkwN2Y2ZWNjMjcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYmM0YTlkZjViNzEzZmUyZTlhZWY0MzBiY2MxZGM5N2EwY2Q5Y2NlZGUyZjI4NTg4Y2FkYTNhMGQyZDgzZjM2NicsXG4gICAgICAgICdkM2E4MWNhNmU3ODVjMDYzODM5MzdhZGY0Yjc5OGNhYTZlOGE5ZmJmYTU0N2IxNmQ3NThkNjY2NTgxZjMzYzEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMyOGE5N2JmODI5OGJjMGQyM2Q4Yzc0OTQ1MmEzMmU2OTRiNjVlMzBhOTQ3MmEzOTU0YWIzMGZlNTMyNGNhYScsXG4gICAgICAgICc0MGEzMDQ2M2EzMzA1MTkzMzc4ZmVkZjMxZjdjYzBlYjdhZTc4NGYwNDUxY2I5NDU5ZTcxZGM3M2NiZWY5NDgyJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhlYTk2NjYxMzk1MjdhOGMxZGQ5NGNlNGYwNzFmZDIzYzhiMzUwYzVhNGJiMzM3NDhjNGJhMTExZmFjY2FlMCcsXG4gICAgICAgICc2MjBlZmFiYmM4ZWUyNzgyZTI0ZTdjMGNmYjk1YzVkNzM1Yjc4M2JlOWNmMGY4ZTk1NWFmMzRhMzBlNjJiOTQ1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RkMzYyNWZhZWY1YmEwNjA3NDY2OTcxNmJiZDM3ODhkODliZGRlODE1OTU5OTY4MDkyZjc2Y2M0ZWI5YTk3ODcnLFxuICAgICAgICAnN2ExODhmYTM1MjBlMzBkNDYxZGEyNTAxMDQ1NzMxY2E5NDE0NjE5ODI4ODMzOTU5MzdmNjhkMDBjNjQ0YTU3MydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmNzEwZDc5ZDllYjk2MjI5N2U0ZjYyMzJiNDBlOGY3ZmViMmJjNjM4MTQ2MTRkNjkyYzEyZGU3NTI0MDgyMjFlJyxcbiAgICAgICAgJ2VhOThlNjcyMzJkM2IzMjk1ZDNiNTM1NTMyMTE1Y2NhYzg2MTJjNzIxODUxNjE3NTI2YWU0N2E5Yzc3YmZjODInXG4gICAgICBdXG4gICAgXVxuICB9LFxuICBuYWY6IHtcbiAgICB3bmQ6IDcsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdmOTMwOGEwMTkyNThjMzEwNDkzNDRmODVmODlkNTIyOWI1MzFjODQ1ODM2Zjk5YjA4NjAxZjExM2JjZTAzNmY5JyxcbiAgICAgICAgJzM4OGY3YjBmNjMyZGU4MTQwZmUzMzdlNjJhMzdmMzU2NjUwMGE5OTkzNGMyMjMxYjZjYjlmZDc1ODRiOGU2NzInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmY4YmRlNGQxYTA3MjA5MzU1YjRhNzI1MGE1YzUxMjhlODhiODRiZGRjNjE5YWI3Y2JhOGQ1NjliMjQwZWZlNCcsXG4gICAgICAgICdkOGFjMjIyNjM2ZTVlM2Q2ZDRkYmE5ZGRhNmM5YzQyNmY3ODgyNzFiYWIwZDY4NDBkY2E4N2QzYWE2YWM2MmQ2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVjYmRmMDY0NmU1ZGI0ZWFhMzk4ZjM2NWYyZWE3YTBlM2Q0MTliN2UwMzMwZTM5Y2U5MmJkZGVkY2FjNGY5YmMnLFxuICAgICAgICAnNmFlYmNhNDBiYTI1NTk2MGEzMTc4ZDZkODYxYTU0ZGJhODEzZDBiODEzZmRlN2I1YTUwODI2MjgwODcyNjRkYSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhY2Q0ODRlMmYwYzdmNjUzMDlhZDE3OGE5ZjU1OWFiZGUwOTc5Njk3NGM1N2U3MTRjMzVmMTEwZGZjMjdjY2JlJyxcbiAgICAgICAgJ2NjMzM4OTIxYjBhN2Q5ZmQ2NDM4MDk3MTc2M2I2MWU5YWRkODg4YTQzNzVmOGUwZjA1Y2MyNjJhYzY0ZjljMzcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc0YWU3Zjg1OGE5NDExZTVlZjQyNDZiNzBjNjVhYWM1NjQ5OTgwYmU1YzE3ODkxYmJlYzE3ODk1ZGEwMDhjYicsXG4gICAgICAgICdkOTg0YTAzMmViNmI1ZTE5MDI0M2RkNTZkN2I3YjM2NTM3MmRiMWUyZGZmOWQ2YTgzMDFkNzRjOWM5NTNjNjFiJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyODc3M2MyZDk3NTI4OGJjN2QxZDIwNWMzNzQ4NjUxYjA3NWZiYzY2MTBlNThjZGRlZWRkZjhmMTk0MDVhYTgnLFxuICAgICAgICAnYWIwOTAyZThkODgwYTg5NzU4MjEyZWI2NWNkYWY0NzNhMWEwNmRhNTIxZmE5MWYyOWI1Y2I1MmRiMDNlZDgxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q3OTI0ZDRmN2Q0M2VhOTY1YTQ2NWFlMzA5NWZmNDExMzFlNTk0NmYzYzg1Zjc5ZTQ0YWRiY2Y4ZTI3ZTA4MGUnLFxuICAgICAgICAnNTgxZTI4NzJhODZjNzJhNjgzODQyZWMyMjhjYzZkZWZlYTQwYWYyYmQ4OTZkM2E1YzUwNGRjOWZmNmEyNmI1OCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZWZkZWE0Y2RiNjc3NzUwYTQyMGZlZTgwN2VhY2YyMWViOTg5OGFlNzliOTc2ODc2NmU0ZmFhMDRhMmQ0YTM0JyxcbiAgICAgICAgJzQyMTFhYjA2OTQ2MzUxNjhlOTk3YjBlYWQyYTkzZGFlY2VkMWY0YTA0YTk1YzBmNmNmYjE5OWY2OWU1NmViNzcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmI0ZWEwYTc5N2E0NDNkMjkzZWY1Y2ZmNDQ0ZjQ5NzlmMDZhY2ZlYmQ3ZTg2ZDI3NzQ3NTY1NjEzODM4NWI2YycsXG4gICAgICAgICc4NWU4OWJjMDM3OTQ1ZDkzYjM0MzA4M2I1YTFjODYxMzFhMDFmNjBjNTAyNjk3NjNiNTcwYzg1NGU1YzA5YjdhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MmJiZjRhNGNkZDEyNTY0ZjkzZmEzMzJjZTMzMzMwMWQ5YWQ0MDI3MWY4MTA3MTgxMzQwYWVmMjViZTU5ZDUnLFxuICAgICAgICAnMzIxZWI0MDc1MzQ4ZjUzNGQ1OWMxODI1OWRkYTNlMWY0YTFiM2IyZTcxYjEwMzljNjdiZDNkOGJjZjgxOTk4YydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyZmEyMTA0ZDZiMzhkMTFiMDIzMDAxMDU1OTg3OTEyNGU0MmFiOGRmZWZmNWZmMjlkYzljZGFkZDRlY2FjYzNmJyxcbiAgICAgICAgJzJkZTEwNjgyOTVkZDg2NWI2NDU2OTMzNWJkNWRkODAxODFkNzBlY2ZjODgyNjQ4NDIzYmE3NmI1MzJiN2Q2NydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MjQ4Mjc5YjA5YjRkNjhkYWIyMWE5YjA2NmVkZGE4MzI2M2MzZDg0ZTA5NTcyZTI2OWNhMGNkN2Y1NDUzNzE0JyxcbiAgICAgICAgJzczMDE2ZjdiZjIzNGFhZGU1ZDFhYTcxYmRlYTJiMWZmM2ZjMGRlMmE4ODc5MTJmZmU1NGEzMmNlOTdjYjM0MDInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGFlZDRmMmJlM2E4YmYyNzhlNzAxMzJmYjBiZWI3NTIyZjU3MGUxNDRiZjYxNWMwN2U5OTZkNDQzZGVlODcyOScsXG4gICAgICAgICdhNjlkY2U0YTdkNmM5OGU4ZDRhMWFjYTg3ZWY4ZDcwMDNmODNjMjMwZjNhZmE3MjZhYjQwZTUyMjkwYmUxYzU1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0NGQxMmM3MDY1ZDgxMmU4YWNmMjhkN2NiYjE5ZjkwMTFlY2Q5ZTlmZGYyODFiMGU2YTNiNWU4N2QyMmU3ZGInLFxuICAgICAgICAnMjExOWE0NjBjZTMyNmNkYzc2YzQ1OTI2Yzk4MmZkYWMwZTEwNmU4NjFlZGY2MWM1YTAzOTA2M2YwZTBlNjQ4MidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2YTI0NWJmNmRjNjk4NTA0Yzg5YTIwY2ZkZWQ2MDg1MzE1MmI2OTUzMzZjMjgwNjNiNjFjNjVjYmQyNjllNmI0JyxcbiAgICAgICAgJ2UwMjJjZjQyYzJiZDRhNzA4YjNmNTEyNmYxNmEyNGFkOGIzM2JhNDhkMDQyM2I2ZWZkNWU2MzQ4MTAwZDhhODInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTY5N2ZmYTZmZDlkZTYyN2MwNzdlM2QyZmU1NDEwODRjZTEzMzAwYjBiZWMxMTQ2Zjk1YWU1N2YwZDBiZDZhNScsXG4gICAgICAgICdiOWMzOThmMTg2ODA2ZjVkMjc1NjE1MDZlNDU1NzQzM2EyY2YxNTAwOWU0OThhZTdhZGVlOWQ2M2QwMWIyMzk2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYwNWJkYjAxOTk4MTcxOGI5ODZkMGYwN2U4MzRjYjBkOWRlYjgzNjBmZmI3ZjYxZGY5ODIzNDVlZjI3YTc0NzknLFxuICAgICAgICAnMjk3MmQyZGU0ZjhkMjA2ODFhNzhkOTNlYzk2ZmUyM2MyNmJmYWU4NGZiMTRkYjQzYjAxZTFlOTA1NmI4YzQ5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyZDE0ZGFiNDE1MGJmNDk3NDAyZmRjNDVhMjE1ZTEwZGNiMDFjMzU0OTU5YjEwY2ZlMzFjN2U5ZDg3ZmYzM2QnLFxuICAgICAgICAnODBmYzA2YmQ4Y2M1YjAxMDk4MDg4YTE5NTBlZWQwZGIwMWFhMTMyOTY3YWI0NzIyMzVmNTY0MjQ4M2IyNWVhZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MGM2MGFkMDA0MGYyN2RhZGU1YjRiMDZjNDA4ZTU2YjJjNTBlOWY1NmI5YjhiNDI1ZTU1NWMyZjg2MzA4YjZmJyxcbiAgICAgICAgJzFjMzgzMDNmMWNjNWMzMGYyNmU2NmJhZDdmZTcyZjcwYTY1ZWVkNGNiZTcwMjRlYjFhYTAxZjU2NDMwYmQ1N2EnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnN2E5Mzc1YWQ2MTY3YWQ1NGFhNzRjNjM0OGNjNTRkMzQ0Y2M1ZGM5NDg3ZDg0NzA0OWQ1ZWFiYjBmYTAzYzhmYicsXG4gICAgICAgICdkMGUzZmE5ZWNhODcyNjkwOTU1OWUwZDc5MjY5MDQ2YmRjNTllYTEwYzcwY2UyYjAyZDQ5OWVjMjI0ZGM3ZjcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDUyOGVjZDliNjk2YjU0YzkwN2E5ZWQwNDU0NDdhNzliYjQwOGVjMzliNjhkZjUwNGJiNTFmNDU5YmMzZmZjOScsXG4gICAgICAgICdlZWNmNDEyNTMxMzZlNWY5OTk2NmYyMTg4MWZkNjU2ZWJjNDM0NTQwNWM1MjBkYmMwNjM0NjViNTIxNDA5OTMzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ5MzcwYTRiNWY0MzQxMmVhMjVmNTE0ZThlY2RhZDA1MjY2MTE1ZTRhN2VjYjEzODcyMzE4MDhmOGI0NTk2MycsXG4gICAgICAgICc3NThmM2Y0MWFmZDZlZDQyOGIzMDgxYjA1MTJmZDYyYTU0YzNmM2FmYmI1YjY3NjRiNjUzMDUyYTEyOTQ5YzlhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3ZjIzMDkzNmVlODhjYmJkNzNkZjkzMGQ2NDcwMmVmODgxZDgxMWUwZTE0OThlMmYxYzEzZWIxZmMzNDVkNzQnLFxuICAgICAgICAnOTU4ZWY0MmE3ODg2YjY0MDBhMDgyNjZlOWJhMWIzNzg5NmM5NTMzMGQ5NzA3N2NiYmU4ZWIzYzc2NzFjNjBkNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMmRhYzk5MWNjNGNlNGI5ZWE0NDg4N2U1YzdjMGJjZTU4YzgwMDc0YWI5ZDRkYmFlYjI4NTMxYjc3MzlmNTMwJyxcbiAgICAgICAgJ2UwZGVkYzliM2IyZjhkYWQ0ZGExZjMyZGVjMjUzMWRmOWViNWZiZWIwNTk4ZTRmZDFhMTE3ZGJhNzAzYTNjMzcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzYjNkOWY2NjI2MjFmYjFiNGJlOGZiYmUyNTIwMTI1YTIxNmNkZmM5ZGFlM2RlYmNiYTQ4NTBjNjkwZDQ1YicsXG4gICAgICAgICc1ZWQ0MzBkNzhjMjk2YzM1NDMxMTQzMDZkZDg2MjJkN2M2MjJlMjdjOTcwYTFkZTMxY2IzNzdiMDFhZjczMDdlJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YxNmY4MDQyNDRlNDZlMmEwOTIzMmQ0YWZmM2I1OTk3NmI5OGZhYzE0MzI4YTJkMWEzMjQ5NmI0OTk5OGYyNDcnLFxuICAgICAgICAnY2VkYWJkOWI4MjIwM2Y3ZTEzZDIwNmZjZGY0ZTMzZDkyYTZjNTNjMjZlNWNjZTI2ZDY1Nzk5NjJjNGUzMWRmNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjYWY3NTQyNzJkYzg0NTYzYjAzNTJiN2ExNDMxMWFmNTVkMjQ1MzE1YWNlMjdjNjUzNjllMTVmNzE1MWQ0MWQxJyxcbiAgICAgICAgJ2NiNDc0NjYwZWYzNWY1ZjJhNDFiNjQzZmE1ZTQ2MDU3NWY0ZmE5Yjc5NjIyMzJhNWMzMmY5MDgzMThhMDQ0NzYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjYwMGNhNGIyODJjYjk4NmY4NWQwZjE3MDk5NzlkOGI0NGEwOWMwN2NiODZkN2MxMjQ0OTdiYzg2ZjA4MjEyMCcsXG4gICAgICAgICc0MTE5Yjg4NzUzYzE1YmQ2YTY5M2IwM2ZjZGRiYjQ1ZDVhYzZiZTc0YWI1ZjBlZjQ0YjBiZTk0NzVhN2U0YjQwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2MzVjYTcyZDdlODQzMmMzMzhlYzUzY2QxMjIyMGJjMDFjNDg2ODVlMjRmN2RjOGM2MDJhNzc0Njk5OGU0MzUnLFxuICAgICAgICAnOTFiNjQ5NjA5NDg5ZDYxM2QxZDVlNTkwZjc4ZTZkNzRlY2ZjMDYxZDU3MDQ4YmFkOWU3NmYzMDJjNWI5YzYxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc1NGUzMjM5ZjMyNTU3MGNkYmJmNGE4N2RlZWU4YTY2YjdmMmIzMzQ3OWQ0NjhmYmMxYTUwNzQzYmY1NmNjMTgnLFxuICAgICAgICAnNjczZmI4NmU1YmRhMzBmYjNjZDBlZDMwNGVhNDlhMDIzZWUzM2QwMTk3YTY5NWQwYzVkOTgwOTNjNTM2NjgzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzZTZiZDEwNzFhMWU5NmFmZjU3ODU5YzgyZDU3MGYwMzMwODAwNjYxZDFjOTUyZjlmZTI2OTQ2OTFkOWI5ZTgnLFxuICAgICAgICAnNTljOWUwYmJhMzk0ZTc2ZjQwYzBhYTU4Mzc5YTNjYjZhNWEyMjgzOTkzZTkwYzQxNjcwMDJhZjQ5MjBlMzdmNSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxODZiNDgzZDA1NmEwMzM4MjZhZTczZDg4ZjczMjk4NWM0Y2NiMWYzMmJhMzVmNGI0Y2M0N2ZkY2YwNGFhNmViJyxcbiAgICAgICAgJzNiOTUyZDMyYzY3Y2Y3N2UyZTE3NDQ2ZTIwNDE4MGFiMjFmYjgwOTA4OTUxMzhiNGE0YTc5N2Y4NmU4MDg4OGInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGY5ZDcwYTZiOTg3NmNlNTQ0Yzk4NTYxZjRiZTRmNzI1NDQyZTZkMmI3MzdkOWM5MWE4MzIxNzI0Y2UwOTYzZicsXG4gICAgICAgICc1NWViMmRhZmQ4NGQ2Y2NkNWY4NjJiNzg1ZGMzOWQ0YWIxNTcyMjI3MjBlZjlkYTIxN2I4YzQ1Y2YyYmEyNDE3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVlZGQ1Y2MyM2M1MWU4N2E0OTdjYTgxNWQ1ZGNlMGY4YWI1MjU1NGY4NDllZDg5OTVkZTY0YzVmMzRjZTcxNDMnLFxuICAgICAgICAnZWZhZTljOGRiYzE0MTMwNjYxZThjZWMwMzBjODlhZDBjMTNjNjZjMGQxN2EyOTA1Y2RjNzA2YWI3Mzk5YTg2OCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyOTA3OThjMmI2NDc2ODMwZGExMmZlMDIyODdlOWU3NzdhYTNmYmExYzM1NWIxN2E3MjJkMzYyZjg0NjE0ZmJhJyxcbiAgICAgICAgJ2UzOGRhNzZkY2Q0NDA2MjE5ODhkMDBiY2Y3OWFmMjVkNWIyOWMwOTRkYjJhMjMxNDZkMDAzYWZkNDE5NDNlN2EnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWYzYzQyM2E5NWQ5ZjViMzA1NDc1NGVmYTE1MGFjMzljZDI5NTUyZmUzNjAyNTczNjJkZmRlY2VmNDA1M2I0NScsXG4gICAgICAgICdmOThhM2ZkODMxZWIyYjc0OWE5M2IwZTZmMzVjZmI0MGM4Y2Q1YWE2NjdhMTU1ODFiYzJmZWRlZDQ5OGZkOWM2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2NmRiYjI0ZDEzNGU3NDVjY2NhYTI4Yzk5YmYyNzQ5MDZiYjY2YjI2ZGNmOThkZjhkMmZlZDUwZDg4NDI0OWEnLFxuICAgICAgICAnNzQ0YjExNTJlYWNiZTVlMzhkY2M4ODc5ODBkYTM4Yjg5NzU4NGE2NWZhMDZjZWRkMmM5MjRmOTdjYmFjNTk5NidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1OWRiZjQ2ZjhjOTQ3NTliYTIxMjc3YzMzNzg0ZjQxNjQ1ZjdiNDRmNmM1OTZhNThjZTkyZTY2NjE5MWFiZTNlJyxcbiAgICAgICAgJ2M1MzRhZDQ0MTc1ZmJjMzAwZjRlYTZjZTY0ODMwOWEwNDJjZTczOWE3OTE5Nzk4Y2Q4NWUyMTZjNGEzMDdmNmUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjEzYWRhOTUxMDNjNDUzNzMwNWU2OTFlNzRlOWE0YThkZDY0N2U3MTFhOTVlNzNjYjYyZGM2MDE4Y2ZkODdiOCcsXG4gICAgICAgICdlMTM4MTdiNDRlZTE0ZGU2NjNiZjRiYzgwODM0MWYzMjY5NDllMjFhNmE3NWMyNTcwNzc4NDE5YmRhZjU3MzNkJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NTRiNGZhMGU4YWNlZDA2ZDQxNjdhMmM1OWNjYTRjZGExODY5YzA2ZWJhZGZiNjQ4ODU1MDAxNWE4ODUyMmMnLFxuICAgICAgICAnMzBlOTNlODY0ZTY2OWQ4MjIyNGI5NjdjMzAyMGI4ZmE4ZDFlNGUzNTBiNmNiY2M1MzdhNDhiNTc4NDExNjNhMidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5NDhkY2FkZjU5OTBlMDQ4YWEzODc0ZDQ2YWJlZjlkNzAxODU4Zjk1ZGU4MDQxZDJhNjgyOGM5OWUyMjYyNTE5JyxcbiAgICAgICAgJ2U0OTFhNDI1MzdmNmU1OTdkNWQyOGEzMjI0YjFiYzI1ZGY5MTU0ZWZiZDJlZjFkMmNiYmEyY2FlNTM0N2Q1N2UnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzk2MjQxNDQ1MGM3NmMxNjg5YzdiNDhmODIwMmVjMzdmYjIyNGNmNWFjMGJmYTE1NzAzMjhhOGEzZDdjNzdhYicsXG4gICAgICAgICcxMDBiNjEwZWM0ZmZiNDc2MGQ1YzFmYzEzM2VmNmY2YjEyNTA3YTA1MWYwNGFjNTc2MGFmYTViMjlkYjgzNDM3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MTQwODc4MzQ5NjRiNTRiMTViMTYwNjQ0ZDkxNTQ4NWExNjk3NzIyNWI4ODQ3YmIwZGQwODUxMzdlYzQ3Y2EnLFxuICAgICAgICAnZWYwYWZiYjIwNTYyMDU0NDhlMTY1MmM0OGU4MTI3ZmM2MDM5ZTc3YzE1YzIzNzhiN2U3ZDE1YTBkZTI5MzMxMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkM2NjMzBhZDZiNDgzZTRiYzc5Y2UyYzlkZDhiYzU0OTkzZTk0N2ViOGRmNzg3YjQ0Mjk0M2QzZjdiNTI3ZWFmJyxcbiAgICAgICAgJzhiMzc4YTIyZDgyNzI3OGQ4OWM1ZTliZThmOTUwOGFlM2MyYWQ0NjI5MDM1ODYzMGFmYjM0ZGIwNGVlZGUwYTQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTYyNGQ4NDc4MDczMjg2MGNlMWM3OGZjYmZlZmUwOGIyYjI5ODIzZGI5MTNmNjQ5Mzk3NWJhMGZmNDg0NzYxMCcsXG4gICAgICAgICc2ODY1MWNmOWI2ZGE5MDNlMDkxNDQ0OGM2Y2Q5ZDRjYTg5Njg3OGY1MjgyYmU0YzhjYzA2ZTJhNDA0MDc4NTc1J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzczM2NlODBkYTk1NWE4YTI2OTAyYzk1NjMzZTYyYTk4NTE5MjQ3NGI1YWYyMDdkYTZkZjdiNGZkNWZjNjFjZDQnLFxuICAgICAgICAnZjU0MzVhMmJkMmJhZGY3ZDQ4NWE0ZDhiOGRiOWZjY2UzZTFlZjhlMDIwMWU0NTc4YzU0NjczYmMxZGM1ZWExZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNWQ5NDQxMjU0OTQ1MDY0Y2YxYTFjMzNiYmQzYjQ5Zjg5NjZjNTA5MjE3MWU2OTllZjI1OGRmYWI4MWMwNDVjJyxcbiAgICAgICAgJ2Q1NmViMzBiNjk0NjNlNzIzNGY1MTM3YjczYjg0MTc3NDM0ODAwYmFjZWJmYzY4NWZjMzdiYmU5ZWZlNDA3MGQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTFkMGZjZjJlYzlkZTY3NWI2MTIxMzZlNWNlNzBkMjcxYzIxNDE3YzlkMmI4YWFhYWMxMzg1OTlkMDcxNzk0MCcsXG4gICAgICAgICdlZGQ3N2Y1MGJjYjVhM2NhYjJlOTA3MzczMDk2NjdmMjY0MTQ2MmE1NDA3MGYzZDUxOTIxMmQzOWMxOTdhNjI5J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyMmZiZTE1YzBhZjhjY2M1NzgwYzA3MzVmODRkYmU5YTc5MGJhZGVlODI0NWMwNmM3Y2EzNzMzMWNiMzY5ODAnLFxuICAgICAgICAnYTg1NWJhYmFkNWNkNjBjODhiNDMwYTY5ZjUzYTFhN2EzODI4OTE1NDk2NDc5OWJlNDNkMDZkNzdkMzFkYTA2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMxMTA5MWRkOTg2MGU4ZTIwZWUxMzQ3M2MxMTU1ZjVmNjk2MzVlMzk0NzA0ZWFhNzQwMDk0NTIyNDZjZmE5YjMnLFxuICAgICAgICAnNjZkYjY1NmY4N2QxZjA0ZmZmZDFmMDQ3ODhjMDY4MzA4NzFlYzVhNjRmZWVlNjg1YmQ4MGYwYjEyODZkODM3NCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNGMxZmQwNGQzMDFiZTg5YjMxYzA0NDJkM2U2YWMyNDg4MzkyOGI0NWE5MzQwNzgxODY3ZDQyMzJlYzJkYmRmJyxcbiAgICAgICAgJzk0MTQ2ODVlOTdiMWI1OTU0YmQ0NmY3MzAxNzQxMzZkNTdmMWNlZWI0ODc0NDNkYzUzMjE4NTdiYTczYWJlZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMjE5ZWE1ZDZiNTQ3MDFjMWMxNGRlNWI1NTdlYjQyYThkMTNmM2FiYmNkMDhhZmZjYzJhNWU2YjA0OWI4ZDYzJyxcbiAgICAgICAgJzRjYjk1OTU3ZTgzZDQwYjBmNzNhZjQ1NDRjY2NmNmIxZjRiMDhkM2MwN2IyN2ZiOGQ4YzI5NjJhNDAwNzY2ZDEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDdiODc0MGY3NGE4ZmJhYWIxZjY4M2RiOGY0NWRlMjY1NDNhNTQ5MGJjYTYyNzA4NzIzNjkxMjQ2OWEwYjQ0OCcsXG4gICAgICAgICdmYTc3OTY4MTI4ZDljOTJlZTEwMTBmMzM3YWQ0NzE3ZWZmMTVkYjVlZDNjMDQ5YjM0MTFlMDMxNWVhYTQ1OTNiJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyZDMxYzIyMmY4ZjZmMGVmODZmN2M5OGQzYTMzMzVlYWQ1YmNkMzJhYmRkOTQyODlmZTRkMzA5MWFhODI0YmYnLFxuICAgICAgICAnNWYzMDMyZjU4OTIxNTZlMzljY2QzZDc5MTViOWUxZGEyZTZkYWM5ZTZmMjZlOTYxMTE4ZDE0Yjg0NjJlMTY2MSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NDYxZjM3MTkxNGFiMzI2NzEwNDVhMTU1ZDk4MzFlYTg3OTNkNzdjZDU5NTkyYzQzNDBmODZjYmMxODM0N2I1JyxcbiAgICAgICAgJzhlYzBiYTIzOGI5NmJlYzBjYmRkZGNhZTBhYTQ0MjU0MmVlZTFmZjUwYzk4NmVhNmIzOTg0N2IzY2MwOTJmZjYnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWUwNzlhZGIxZGYxODYwMDc0MzU2YTI1YWEzODIwNmE2ZDcxNmIyYzNlNjc0NTNkMjg3Njk4YmFkN2IyYjJkNicsXG4gICAgICAgICc4ZGMyNDEyYWFmZTNiZTVjNGM1ZjM3ZTBlY2M1ZjlmNmE0NDY5ODlhZjA0YzRlMjVlYmFhYzQ3OWVjMWM4YzFlJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE2ZWM5M2U0NDdlYzgzZjA0NjdiMTgzMDJlZTYyMGY3ZTY1ZGUzMzE4NzRjOWRjNzJiZmQ4NjE2YmE5ZGE2YjUnLFxuICAgICAgICAnNWU0NjMxMTUwZTYyZmI0MGQwZThjMmE3Y2E1ODA0YTM5ZDU4MTg2YTUwZTQ5NzEzOTYyNjc3OGUyNWIwNjc0ZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYWE1Zjk4MGMyNDVmNmYwMzg5NzgyOTBhZmE3MGI2YmQ4ODU1ODk3Zjk4YjZhYTQ4NWI5NjA2NWQ1MzdiZDk5JyxcbiAgICAgICAgJ2Y2NWY1ZDNlMjkyYzJlMDgxOWE1MjgzOTFjOTk0NjI0ZDc4NDg2OWQ3ZTZlYTY3ZmIxODA0MTAyNGVkYzA3ZGMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzhjOTQwNzU0NGFjMTMyNjkyZWUxOTEwYTAyNDM5OTU4YWUwNDg3NzE1MTM0MmVhOTZjNGI2YjM1YTQ5ZjUxJyxcbiAgICAgICAgJ2YzZTAzMTkxNjllYjliODVkNTQwNDc5NTUzOWE1ZTY4ZmExZmJkNTgzYzA2NGQyNDYyYjY3NWYxOTRhM2RkYjQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDk0ZjRiZTIxOWExYTc3MDE2ZGNkODM4NDMxYWVhMDAwMWNkYzhhZTdhNmZjNjg4NzI2NTc4ZDk3MDI4NTdhNScsXG4gICAgICAgICc0MjI0MmE5NjkyODNhNWYzMzliYTdmMDc1ZTM2YmEyYWY5MjVjZTMwZDc2N2VkNmU1NWY0YjAzMTg4MGQ1NjJjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E1OThhODAzMGRhNmQ4NmM2YmM3ZjJmNTE0NGVhNTQ5ZDI4MjExZWE1OGZhYTcwZWJmNGMxZTY2NWMxZmU5YjUnLFxuICAgICAgICAnMjA0YjVkNmY4NDgyMmMzMDdlNGI0YTcxNDA3MzdhZWMyM2ZjNjNiNjViMzVmODZhMTAwMjZkYmQyZDg2NGU2YidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDE5MTYzNjVhYmIyYjVkMDkxOTJmNWYyZGJlYWZlYzIwOGYwMjBmMTI1NzBhMTg0ZGJhZGMzZTU4NTk1OTk3JyxcbiAgICAgICAgJzRmMTQzNTFkMDA4N2VmYTQ5ZDI0NWIzMjg5ODQ5ODlkNWNhZjk0NTBmMzRiZmMwZWQxNmU5NmI1OGZhOTkxMydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDFkNjA2M2E1ODZmYTQ3NWE3MjQ2MDRkYTAzYmM1YjkyYTJlMGQyZTBhMzZhY2ZlNGM3M2E1NTE0NzQyODgxJyxcbiAgICAgICAgJzczODY3ZjU5YzA2NTllODE5MDRmOWExYzc1NDM2OThlNjI1NjJkNjc0NGMxNjljZTdhMzZkZTAxYThkNjE1NCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1ZTk1YmIzOTlhNjk3MWQzNzYwMjY5NDdmODliZGUyZjI4MmIzMzgxMDkyOGJlNGRlZDExMmFjNGQ3MGUyMGQ1JyxcbiAgICAgICAgJzM5ZjIzZjM2NjgwOTA4NWJlZWJmYzcxMTgxMzEzNzc1YTk5YzlhZWQ3ZDhiYTM4YjE2MTM4NGM3NDYwMTI4NjUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzZlNDY0MWE1Mzk0OGZkNDc2YzM5ZjhhOTlmZDk3NGU1ZWMwNzU2NGI1MzE1ZDhiZjk5NDcxYmNhMGVmMmY2NicsXG4gICAgICAgICdkMjQyNGIxYjFhYmU0ZWI4MTY0MjI3YjA4NWM5YWE5NDU2ZWExMzQ5M2ZkNTYzZTA2ZmQ1MWNmNTY5NGM3OGZjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMzNjU4MWVhN2JmYmJiMjkwYzE5MWEyZjUwN2E0MWNmNTY0Mzg0MjE3MGU5MTRmYWVhYjI3YzJjNTc5ZjcyNicsXG4gICAgICAgICdlYWQxMjE2ODU5NWZlMWJlOTkyNTIxMjliNmU1NmIzMzkxZjdhYjE0MTBjZDFlMGVmM2RjZGNhYmQyZmRhMjI0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhhYjg5ODE2ZGFkZmQ2YjZhMWYyNjM0ZmNmMDBlYzg0MDM3ODEwMjVlZDY4OTBjNDg0OTc0MjcwNmJkNDNlZGUnLFxuICAgICAgICAnNmZkY2VmMDlmMmY2ZDBhMDQ0ZTY1NGFlZjYyNDEzNmY1MDNkNDU5YzNlODk4NDU4NThhNDdhOTEyOWNkZDI0ZSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxZTMzZjFhNzQ2YzljNTc3ODEzMzM0NGQ5Mjk5ZmNhYTIwYjA5MzhlOGFjZmYyNTQ0YmI0MDI4NGI4YzVmYjk0JyxcbiAgICAgICAgJzYwNjYwMjU3ZGQxMWIzYWE5YzhlZDYxOGQyNGVkZmYyMzA2ZDMyMGYxZDAzMDEwZTMzYTdkMjA1N2YzYjNiNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NWI3YzFkY2IzY2VjMWI3ZWU3ZjMwZGVkNzlkZDIwYTBlZDFmNGNjMThjYmNmY2ZhNDEwMzYxZmQ4ZjA4ZjMxJyxcbiAgICAgICAgJzNkOThhOWNkZDAyNmRkNDNmMzkwNDhmMjVhODg0N2Y0ZmNhZmFkMTg5NWQ3YTYzM2M2ZmVkM2MzNWU5OTk1MTEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjlkZjlmYmQ4ZDllNDY1MDkyNzVmNGIxMjVkNmQ0NWQ3ZmJlOWEzYjg3OGE3YWY4NzJhMjgwMDY2MWFjNWY1MScsXG4gICAgICAgICdiNGM0ZmU5OWM3NzVhNjA2ZTJkODg2MjE3OTEzOWZmZGE2MWRjODYxYzAxOWU1NWNkMjg3NmViMmEyN2Q4NGInXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTBiMWNhZTA2YjBhODQ3YTNmZWE2ZTY3MWFhZjhhZGZkZmU1OGNhMmY3NjgxMDVjODA4MmIyZTQ0OWZjZTI1MicsXG4gICAgICAgICdhZTQzNDEwMmVkZGUwOTU4ZWM0YjE5ZDkxN2E2YTI4ZTZiNzJkYTE4MzRhZmYwZTY1MGYwNDk1MDNhMjk2Y2YyJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlOGNlYWZiOWIzZTlhMTM2ZGM3ZmY2N2U4NDAyOTViNDk5ZGZiM2IyMTMzZTRiYTExM2YyZTRjMGUxMjFlNScsXG4gICAgICAgICdjZjIxNzQxMThjOGI2ZDdhNGI0OGY2ZDUzNGNlNWM3OTQyMmMwODZhNjM0NjA1MDJiODI3Y2U2MmEzMjY2ODNjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyNGE0NGUwNDdlMTliNmY1YWZiODFjN2NhMmY2OTA4MGE1MDc2Njg5YTAxMDkxOWY0MjcyNWMyYjc4OWEzM2InLFxuICAgICAgICAnNmZiOGQ1NTkxYjQ2NmY4ZmM2M2RiNTBmMWMwZjFjNjkwMTNmOTk2ODg3YjgyNDRkMmNkZWM0MTdhZmVhOGZhMydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYTAxNjA2YTdhNmM5Y2RkMjQ5ZmRmY2ZhY2I5OTU4NDAwMWVkZDI4YWJiYWI3N2I1MTA0ZTk4ZThlM2IzNWQ0JyxcbiAgICAgICAgJzMyMmFmNDkwOGM3MzEyYjBjZmJmZTM2OWY3YTdiM2NkYjdkNDQ5NGJjMjgyMzcwMGNmZDY1MjE4OGEzZWE5OGQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWY4YWRkYmYyYjY2MWM4YTZjNjMyODY1NWViOTY2NTEyNTIwMDdkOGM1ZWEzMWJlNGFkMTk2ZGU4Y2UyMTMxZicsXG4gICAgICAgICc2NzQ5ZTY3YzAyOWI4NWY1MmEwMzRlYWZkMDk2ODM2YjI1MjA4MTg2ODBlMjZhYzhmM2RmYmNkYjcxNzQ5NzAwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzYWUxOTc0NTY2Y2EwNmNjNTE2ZDQ3ZTBmYjE2NWE2NzRhM2RhYmNmY2ExNWU3MjJmMGUzNDUwZjQ1ODg5JyxcbiAgICAgICAgJzJhZWFiZTdlNDUzMTUxMDExNjIxN2YwN2JmNGQwNzMwMGRlOTdlNDg3NGY4MWY1MzM0MjBhNzJlZWIwYmQ2YTQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTkxZWUzNTUzMTNkOTk3MjFjZjY5OTNmZmVkMWUzZTMwMTk5M2ZmM2VkMjU4ODAyMDc1ZWE4Y2VkMzk3ZTI0NicsXG4gICAgICAgICdiMGVhNTU4YTExM2MzMGJlYTYwZmM0Nzc1NDYwYzc5MDFmZjBiMDUzZDI1Y2EyYmRlZWU5OGYxYTRiZTVkMTk2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzExMzk2ZDU1ZmRhNTRjNDlmMTlhYTk3MzE4ZDhkYTYxZmE4NTg0ZTQ3YjA4NDk0NTA3N2NmMDMyNTViNTI5ODQnLFxuICAgICAgICAnOTk4Yzc0YThjZDQ1YWMwMTI4OWQ1ODMzYTdiZWI0NzQ0ZmY1MzZiMDFiMjU3YmU0YzU3NjdiZWE5M2VhNTdhNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczYzVkMmExYmEzOWM1YTE3OTAwMDA3MzhjOWUwYzQwYjhkY2RmZDU0Njg3NTRiNjQwNTU0MDE1N2UwMTdhYTdhJyxcbiAgICAgICAgJ2IyMjg0Mjc5OTk1YTM0ZTJmOWQ0ZGU3Mzk2ZmMxOGI4MGY5YjhiOWZkZDI3MGY2NjYxZjc5Y2E0YzgxYmQyNTcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnY2M4NzA0YjhhNjBhMGRlZmEzYTk5YTcyOTlmMmU5YzNmYmMzOTVhZmIwNGFjMDc4NDI1ZWY4YTE3OTNjYzAzMCcsXG4gICAgICAgICdiZGQ0NjAzOWZlZWQxNzg4MWQxZTA4NjJkYjM0N2Y4Y2YzOTViNzRmYzRiY2RjNGU5NDBiNzRlM2FjMWYxYjEzJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M1MzNlNGY3ZWE4NTU1YWFjZDk3NzdhYzVjYWQyOWI5N2RkNGRlZmNjYzUzZWU3ZWEyMDQxMTliMjg4OWIxOTcnLFxuICAgICAgICAnNmYwYTI1NmJjNWVmZGY0MjlhMmZiNjI0MmYxYTQzYTJkOWI5MjViYjRhNGIzYTI2YmI4ZTBmNDVlYjU5NjA5NidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjMTRmOGYyY2NiMjdkNmYxMDlmNmQwOGQwM2NjOTZhNjliYThjMzRlZWMwN2JiY2Y1NjZkNDhlMzNkYTY1OTMnLFxuICAgICAgICAnYzM1OWQ2OTIzYmIzOThmN2ZkNDQ3M2UxNmZlMWMyODQ3NWI3NDBkZDA5ODA3NWU2YzBlODY0OTExM2RjM2EzOCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNmNiYzMwNDZiYzZhNDUwYmFjMjQ3ODlmYTE3MTE1YTRjOTczOWVkNzVmOGYyMWNlNDQxZjcyZTBiOTBlNmVmJyxcbiAgICAgICAgJzIxYWU3ZjQ2ODBlODg5YmIxMzA2MTllMmMwZjk1YTM2MGNlYjU3M2M3MDYwMzEzOTg2MmFmZDYxN2ZhOWI5ZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNDdkNmQ5YTAyYzQ4OTI3ZWJmYjg2YzEzNTliMWNhZjEzMGEzYzAyNjdkMTFjZTYzNDRiMzlmOTlkNDNjYzM4JyxcbiAgICAgICAgJzYwZWE3ZjYxYTM1MzUyNGQxYzk4N2Y2ZWNlYzkyZjA4NmQ1NjVhYjY4Nzg3MGNiMTI2ODlmZjFlMzFjNzQ0NDgnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGE2NTQ1ZDIxODFkYjhkOTgzZjdkY2IzNzVlZjU4NjZkNDdjNjdiMWJmMzFjOGNmODU1ZWY3NDM3YjcyNjU2YScsXG4gICAgICAgICc0OWI5NjcxNWFiNjg3OGE3OWU3OGYwN2NlNTY4MGM1ZDY2NzMwNTFiNDkzNWJkODk3ZmVhODI0Yjc3ZGMyMDhhJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0MDc0N2NjOWQwMTJjYjFhMTNiODE0ODMwOWM2ZGU3ZWMyNWQ2OTQ1ZDY1NzE0NmI5ZDU5OTRiOGZlYjExMTEnLFxuICAgICAgICAnNWNhNTYwNzUzYmUyYTEyZmM2ZGU2Y2FmMmNiNDg5NTY1ZGI5MzYxNTZiOTUxNGUxYmI1ZTgzMDM3ZTBmYTJkNCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZTQyYzhlYzgyYzk5Nzk4Y2NmM2E2MTBiZTg3MGU3ODMzOGM3ZjcxMzM0OGJkMzRjODIwM2VmNDAzN2YzNTAyJyxcbiAgICAgICAgJzc1NzFkNzRlZTVlMGZiOTJhN2E4YjMzYTA3NzgzMzQxYTU0OTIxNDRjYzU0YmNjNDBhOTQ0NzM2OTM2MDY0MzcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzc3NWFiNzA4OWJjNmFmODIzYWJhMmUxYWY3MGIyMzZkMjUxY2FkYjBjODY3NDMyODc1MjJhMWIzYjBkZWRlYScsXG4gICAgICAgICdiZTUyZDEwN2JjZmEwOWQ4YmNiOTczNmE4MjhjZmE3ZmFjOGRiMTdiZjdhNzZhMmM0MmFkOTYxNDA5MDE4Y2Y3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NlZTMxY2JmN2UzNGVjMzc5ZDk0ZmI4MTRkM2Q3NzVhZDk1NDU5NWQxMzE0YmE4ODQ2OTU5ZTNlODJmNzRlMjYnLFxuICAgICAgICAnOGZkNjRhMTRjMDZiNTg5YzI2Yjk0N2FlMmJjZjZiZmEwMTQ5ZWYwYmUxNGVkNGQ4MGY0NDhhMDFjNDNiMWM2ZCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiNGY5ZWFlYTA5YjY5MTc2MTlmNmVhNmE0ZWI1NDY0ZWZkZGI1OGZkNDViMWViZWZjZGMxYTAxZDA4YjQ3OTg2JyxcbiAgICAgICAgJzM5ZTVjOTkyNWI1YTU0YjA3NDMzYTRmMThjNjE3MjZmOGJiMTMxYzAxMmNhNTQyZWIyNGE4YWMwNzIwMDY4MmEnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDQyNjNkZmMzZDJkZjkyM2EwMTc5YTQ4OTY2ZDMwY2U4NGUyNTE1YWZjM2RjY2MxYjc3OTA3NzkyZWJjYzYwZScsXG4gICAgICAgICc2MmRmYWYwN2EwZjc4ZmViMzBlMzBkNjI5NTg1M2NlMTg5ZTEyNzc2MGFkNmNmN2ZhZTE2NGUxMjJhMjA4ZDU0J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ4NDU3NTI0ODIwZmE2NWE0ZjhkMzVlYjY5MzA4NTdjMDAzMmFjYzBhNGEyZGU0MjIyMzNlZWRhODk3NjEyYzQnLFxuICAgICAgICAnMjVhNzQ4YWIzNjc5NzlkOTg3MzNjMzhhMWZhMWMyZTdkYzZjYzA3ZGIyZDYwYTlhZTdhNzZhYWE0OWJkMGY3NydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZmVlZWYxODgxMTAxZjJjYjExNjQ0ZjNhMmFmZGZjMjA0NWUxOTkxOTE1MjkyM2YzNjdhMTc2N2MxMWNjZWRhJyxcbiAgICAgICAgJ2VjZmI3MDU2Y2YxZGUwNDJmOTQyMGJhYjM5Njc5M2MwYzM5MGJkZTc0YjRiYmRmZjE2YTgzYWUwOWE5YTc1MTcnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNmQ3ZWY2YjE3NTQzZjgzNzNjNTczZjQ0ZTFmMzg5ODM1ZDg5YmNiYzYwNjJjZWQzNmM4MmRmODNiOGZhZTg1OScsXG4gICAgICAgICdjZDQ1MGVjMzM1NDM4OTg2ZGZlZmExMGM1N2ZlYTliY2M1MjFhMDk1OWIyZDgwYmJmNzRiMTkwZGNhNzEyZDEwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U3NTYwNWQ1OTEwMmE1YTI2ODQ1MDBkM2I5OTFmMmUzZjNjODhiOTMyMjU1NDcwMzVhZjI1YWY2NmUwNDU0MWYnLFxuICAgICAgICAnZjVjNTQ3NTRhOGY3MWVlNTQwYjliNDg3Mjg0NzNlMzE0ZjcyOWFjNTMwOGIwNjkzODM2MDk5MGUyYmZhZDEyNSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYjk4NjYwZjRjNGRmYWEwNmEyYmU0NTNkNTAyMGJjOTlhMGMyZTYwYWJlMzg4NDU3ZGQ0M2ZlZmIxZWQ2MjBjJyxcbiAgICAgICAgJzZjYjlhODg3NmQ5Y2I4NTIwNjA5YWYzYWRkMjZjZDIwYTBhN2NkOGE5NDExMTMxY2U4NWY0NDEwMDA5OTIyM2UnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTNlODdiMDI3ZDg1MTRkMzU5MzlmMmU2ODkyYjE5OTIyMTU0NTk2OTQxODg4MzM2ZGMzNTYzZTNiOGRiYTk0MicsXG4gICAgICAgICdmZWY1YTNjNjgwNTlhNmRlYzVkNjI0MTE0YmYxZTkxYWFjMmI5ZGE1NjhkNmFiZWIyNTcwZDU1NjQ2YjhhZGYxJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlMTYzMDI2ZTlmZDZmZTAxN2MzOGYwNmE1YmU2ZmMxMjU0MjRiMzcxY2UyNzA4ZTdiZjQ0OTE2OTFlNTc2NGEnLFxuICAgICAgICAnMWFjYjI1MGYyNTVkZDYxYzQzZDk0Y2NjNjcwZDBmNThmNDlhZTNmYTE1Yjk2NjIzZTU0MzBkYTBhZDZjNjJiMidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiMjY4ZjVlZjlhZDUxZTRkNzhkZTNhNzUwYzJkYzg5YjFlNjI2ZDQzNTA1ODY3OTk5OTMyZTVkYjMzYWYzZDgwJyxcbiAgICAgICAgJzVmMzEwZDRiM2M5OWI5ZWJiMTlmNzdkNDFjMWRlZTAxOGNmMGQzNGZkNDE5MTYxNDAwM2U5NDVhMTIxNmU0MjMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYwN2YzMTE4YTlkZjAzNWU5ZmFkODVlYjZjN2JmZTQyYjAyZjAxY2E5OWNlZWEzYmY3ZmZkYmE5M2M0NzUwZCcsXG4gICAgICAgICc0MzgxMzZkNjAzZTg1OGEzYTVjNDQwYzM4ZWNjYmFkZGMxZDI5NDIxMTRlMmVkZGQ0NzQwZDA5OGNlZDFmMGQ4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhkOGI5ODU1YzdjMDUyYTM0MTQ2ZmQyMGZmYjY1OGJlYTRiOWY2OWUwZDgyNWViZWMxNmU4YzNjZTJiNTI2YTEnLFxuICAgICAgICAnY2RiNTU5ZWVkYzJkNzlmOTI2YmFmNDRmYjg0ZWE0ZDQ0YmNmNTBmZWU1MWQ3Y2ViMzBlMmU3ZjQ2MzAzNjc1OCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MmRiMGI1Mzg0ZGZiZjA1YmZhOWQ0NzJkN2FlMjZkZmU0Yjg1MWNlY2E5MWIxZWJhNTQyNjMxODBkYTMyYjYzJyxcbiAgICAgICAgJ2MzYjk5N2QwNTBlZTVkNDIzZWJhZjY2YTZkYjlmNTdiMzE4MGM5MDI4NzU2NzlkZTkyNGI2OWQ4NGE3YjM3NSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNjJmOTQ5MGQzZDUxZGE2Mzk1ZWZkMjRlODA5MTljYzdkMGYyOWMzZjNmYTQ4YzZmZmY1NDNiZWNiZDQzMzUyJyxcbiAgICAgICAgJzZkODlhZDdiYTQ4NzZiMGIyMmMyY2EyODBjNjgyODYyZjM0MmM4NTkxZjFkYWY1MTcwZTA3YmZkOWNjYWZhN2QnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnN2YzMGVhMjQ3NmIzOTliNDk1NzUwOWM4OGY3N2QwMTkxYWZhMmZmNWNiN2IxNGZkNmQ4ZTdkNjVhYWFiMTE5MycsXG4gICAgICAgICdjYTVlZjdkNGIyMzFjOTRjM2IxNTM4OWE1ZjYzMTFlOWRhZmY3YmI2N2IxMDNlOTg4MGVmNGJmZjYzN2FjYWVjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUwOThmZjFlMWQ5ZjE0ZmI0NmEyMTBmYWRhNmM5MDNmZWYwZmI3YjRhMWRkMWQ5YWM2MGEwMzYxODAwYjdhMDAnLFxuICAgICAgICAnOTczMTE0MWQ4MWZjOGY4MDg0ZDM3YzZlNzU0MjAwNmIzZWUxYjQwZDYwZGZlNTM2MmE1YjEzMmZkMTdkZGMwJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyYjc4YzdkZTllZTUxMmE3Mjg5NWJlNmI5Y2JlZmE2ZTJmM2M0Y2NjZTQ0NWM5NmI5ZjJjODFlMjc3OGFkNTgnLFxuICAgICAgICAnZWUxODQ5ZjUxM2RmNzFlMzJlZmMzODk2ZWUyODI2MGM3M2JiODA1NDdhZTIyNzViYTQ5NzIzNzc5NGM4NzUzYydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMmNiNzRmZGRjOGU5ZmJjZDA3NmVlZjJhN2M3MmIwY2UzN2Q1MGYwODI2OWRmYzA3NGI1ODE1NTA1NDdhNGY3JyxcbiAgICAgICAgJ2QzYWEyZWQ3MWM5ZGQyMjQ3YTYyZGYwNjI3MzZlYjBiYWRkZWE5ZTM2MTIyZDJiZTg2NDFhYmNiMDA1Y2M0YTQnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODQzODQ0NzU2NmQ0ZDdiZWRhZGMyOTk0OTZhYjM1NzQyNjAwOWEzNWYyMzVjYjE0MWJlMGQ5OWNkMTBhZTNhOCcsXG4gICAgICAgICdjNGUxMDIwOTE2OTgwYTRkYTVkMDFhYzVlNmFkMzMwNzM0ZWYwZDc5MDY2MzFjNGYyMzkwNDI2YjJlZGQ3OTFmJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQxNjJkNDg4Yjg5NDAyMDM5YjU4NGM2ZmM2YzMwODg3MDU4N2Q5YzQ2ZjY2MGI4NzhhYjY1YzgyYzcxMWQ2N2UnLFxuICAgICAgICAnNjcxNjNlOTAzMjM2Mjg5Zjc3NmYyMmMyNWZiOGEzYWZjMTczMmYyYjg0YjRlOTVkYmRhNDdhZTVhMDg1MjY0OSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczZmFkM2ZhODRjYWYwZjM0ZjBmODliZmQyZGNmNTRmYzE3NWQ3NjdhZWMzZTUwNjg0ZjNiYTRhNGJmNWY2ODNkJyxcbiAgICAgICAgJ2NkMWJjN2NiNmNjNDA3YmIyZjBjYTY0N2M3MThhNzMwY2Y3MTg3MmU3ZDBkMmE1M2ZhMjBlZmNkZmU2MTgyNidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NzRmMjYwMGEzMDA3YTAwNTY4YzFhN2NlMDVkMDgxNmMxZmI4NGJmMTM3MDc5OGYxYzY5NTMyZmFlYjFhODZiJyxcbiAgICAgICAgJzI5OWQyMWY5NDEzZjMzYjNlZGY0M2IyNTcwMDQ1ODBiNzBkYjU3ZGEwYjE4MjI1OWUwOWVlY2M2OWUwZDM4YTUnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDMyZjRkYTU0YWRlNzRhYmI4MWI4MTVhZDFmYjNiMjYzZDgyZDZjNjkyNzE0YmNmZjg3ZDI5YmQ1ZWU5ZjA4ZicsXG4gICAgICAgICdmOTQyOWU3MzhiOGU1M2I5NjhlOTkwMTZjMDU5NzA3NzgyZTE0ZjQ1MzUzNTlkNTgyZmM0MTY5MTBiM2VlYTg3J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMwZTRlNjcwNDM1Mzg1NTU2ZTU5MzY1NzEzNTg0NWQzNmZiYjY5MzFmNzJiMDhjYjFlZDk1NGYxZTNjZTNmZjYnLFxuICAgICAgICAnNDYyZjliY2U2MTk4OTg2Mzg0OTkzNTAxMTNiYmM5YjEwYTg3OGQzNWRhNzA3NDBkYzY5NWE1NTllYjg4ZGI3YidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiZTIwNjIwMDNjNTFjYzMwMDQ2ODI5MDQzMzBlNGRlZTdmM2RjZDEwYjAxZTU4MGJmMTk3MWIwNGQ0Y2FkMjk3JyxcbiAgICAgICAgJzYyMTg4YmM0OWQ2MWU1NDI4NTczZDQ4YTc0ZTFjNjU1YjFjNjEwOTA5MDU2ODJhMGQ1NTU4ZWQ3MmRjY2I5YmMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTMxNDQ0MjNhY2UzNDUxZWQyOWUwZmI5YWMyYWYyMTFjYjZlODRhNjAxZGY1OTkzYzQxOTg1OWZmZjVkZjA0YScsXG4gICAgICAgICc3YzEwZGZiMTY0YzM0MjVmNWM3MWEzZjlkNzk5MjAzOGYxMDY1MjI0ZjcyYmI5ZDFkOTAyYTZkMTMwMzdiNDdjJ1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2IwMTVmODA0NGY1ZmNiZGNmMjFjYTI2ZDZjMzRmYjgxOTc4MjkyMDVjN2I3ZDJhN2NiNjY0MThjMTU3YjExMmMnLFxuICAgICAgICAnYWI4YzFlMDg2ZDA0ZTgxMzc0NGE2NTViMmRmOGQ1ZjgzYjNjZGM2ZmFhMzA4OGMxZDNhZWExNDU0ZTNhMWQ1ZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNWU5ZTFkYTY0OWQ5N2Q4OWU0ODY4MTE3YTQ2NWEzYTRmOGExOGRlNTdhMTQwZDM2YjNmMmFmMzQxYTIxYjUyJyxcbiAgICAgICAgJzRjYjA0NDM3ZjM5MWVkNzMxMTFhMTNjYzFkNGRkMGRiMTY5MzQ2NWMyMjQwNDgwZDg5NTVlODU5MmYyNzQ0N2EnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDNhZTQxMDQ3ZGQ3Y2EwNjVkYmY4ZWQ3N2I5OTI0Mzk5ODMwMDVjZDcyZTE2ZDZmOTk2YTUzMTZkMzY5NjZiYicsXG4gICAgICAgICdiZDFhZWIyMWFkMjJlYmIyMmExMGYwMzAzNDE3YzZkOTY0ZjhjZGQ3ZGYwYWNhNjE0YjEwZGMxNGQxMjVhYzQ2J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ2M2UyNzYzZDg4NWY5NThmYzY2Y2RkMjI4MDBmMGE0ODcxOTdkMGE4MmUzNzdiNDlmODBhZjg3Yzg5N2IwNjUnLFxuICAgICAgICAnYmZlZmFjZGIwZTVkMGZkN2RmM2EzMTFhOTRkZTA2MmIyNmI4MGM2MWZiYzk3NTA4Yjc5OTkyNjcxZWY3Y2E3ZidcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTg1ZmRmZDEyN2MwNTY3YzZmNTNlYzFiYjYzZWMzMTU4ZTU5N2M0MGJmZTc0N2M4M2NkZGZjOTEwNjQxOTE3JyxcbiAgICAgICAgJzYwM2MxMmRhZjNkOTg2MmVmMmIyNWZlMWRlMjg5YWVkMjRlZDI5MWUwZWM2NzA4NzAzYTViZDU2N2YzMmVkMDMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzRhMWFkNmI1Zjc2ZTM5ZGIyZGQyNDk0MTBlYWM3Zjk5ZTc0YzU5Y2I4M2QyZDBlZDVmZjE1NDNkYTc3MDNlOScsXG4gICAgICAgICdjYzYxNTdlZjE4YzljNjNjZDYxOTNkODM2MzFiYmVhMDA5M2UwOTY4OTQyZThjMzNkNTczN2ZkNzkwZTBkYjA4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMwNjgyYTUwNzAzMzc1ZjYwMmQ0MTY2NjRiYTE5YjdmYzliYWI0MmM3Mjc0NzQ2M2E3MWQwODk2YjIyZjZkYTMnLFxuICAgICAgICAnNTUzZTA0ZjZiMDE4YjRmYTZjOGYzOWU3ZjMxMWQzMTc2MjkwZDBlMGYxOWNhNzNmMTc3MTRkOTk3N2EyMmZmOCdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5ZTIxNThmMGQ3YzBkNWYyNmMzNzkxZWZlZmE3OTU5NzY1NGU3YTJiMjQ2NGY1MmIxZWU2YzEzNDc3NjllZjU3JyxcbiAgICAgICAgJzcxMmZjZGQxYjkwNTNmMDkwMDNhMzQ4MWZhNzc2MmU5ZmZkN2M4ZWYzNWEzODUwOWUyZmJmMjYyOTAwODM3MydcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzZlMjY5ODlhNDNjOWNmZWJhNDAyOWMyMDI1MzhjMjgxNzJlNTY2ZTNjNGZjZTczMjI4NTdmM2JlMzI3ZDY2JyxcbiAgICAgICAgJ2VkOGNjOWQwNGIyOWViODc3ZDI3MGI0ODc4ZGM0M2MxOWFlZmQzMWY0ZWVlMDllZTdiNDc4MzRjMWZhNGIxYzMnXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzVkNDZlZmVhMzc3MWU2ZTY4YWJiODlhMTNhZDc0N2VjZjE4OTIzOTNkZmM0ZjFiNzAwNDc4OGM1MDM3NGRhOCcsXG4gICAgICAgICc5ODUyMzkwYTk5NTA3Njc5ZmQwYjg2ZmQyYjM5YTg2OGQ3ZWZjMjIxNTEzNDZlMWEzY2E0NzI2NTg2YTZiZWQ4J1xuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgwOWEyMGM2N2Q2NDkwMGZmYjY5OGM0YzgyNWY2ZDVmMjMxMGZiMDQ1MWM4NjkzNDViNzMxOWY2NDU2MDU3MjEnLFxuICAgICAgICAnOWU5OTQ5ODBkOTkxN2UyMmI3NmIwNjE5MjdmYTA0MTQzZDA5NmNjYzU0OTYzZTZhNWViZmE1ZjNmOGUyODZjMSdcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxYjM4OTAzYTQzZjdmMTE0ZWQ0NTAwYjRlYWM3MDgzZmRlZmVjZTFjZjI5YzYzNTI4ZDU2MzQ0NmY5NzJjMTgwJyxcbiAgICAgICAgJzQwMzZlZGM5MzFhNjBhZTg4OTM1M2Y3N2ZkNTNkZTRhMjcwOGIyNmI2ZjVkYTcyYWQzMzk0MTE5ZGFmNDA4ZjknXG4gICAgICBdXG4gICAgXVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBleHBvcnRzO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcblxudXRpbHMuYXNzZXJ0ID0gZnVuY3Rpb24gYXNzZXJ0KHZhbCwgbXNnKSB7XG4gIGlmICghdmFsKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbn07XG5cbmZ1bmN0aW9uIHRvQXJyYXkobXNnLCBlbmMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobXNnKSlcbiAgICByZXR1cm4gbXNnLnNsaWNlKCk7XG4gIGlmICghbXNnKVxuICAgIHJldHVybiBbXTtcbiAgdmFyIHJlcyA9IFtdO1xuICBpZiAodHlwZW9mIG1zZyAhPT0gJ3N0cmluZycpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICAgIHJlc1tpXSA9IG1zZ1tpXSB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoIWVuYykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgdmFyIGhpID0gYyA+PiA4O1xuICAgICAgdmFyIGxvID0gYyAmIDB4ZmY7XG4gICAgICBpZiAoaGkpXG4gICAgICAgIHJlcy5wdXNoKGhpLCBsbyk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlcy5wdXNoKGxvKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZW5jID09PSAnaGV4Jykge1xuICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9bXmEtejAtOV0rL2lnLCAnJyk7XG4gICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgbXNnID0gJzAnICsgbXNnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgcmVzLnB1c2gocGFyc2VJbnQobXNnW2ldICsgbXNnW2kgKyAxXSwgMTYpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxudXRpbHMudG9BcnJheSA9IHRvQXJyYXk7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG51dGlscy56ZXJvMiA9IHplcm8yO1xuXG5mdW5jdGlvbiB0b0hleChtc2cpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICByZXMgKz0gemVybzIobXNnW2ldLnRvU3RyaW5nKDE2KSk7XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0hleCA9IHRvSGV4O1xuXG51dGlscy5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoYXJyLCBlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHRvSGV4KGFycik7XG4gIGVsc2VcbiAgICByZXR1cm4gYXJyO1xufTtcblxuLy8gUmVwcmVzZW50IG51bSBpbiBhIHctTkFGIGZvcm1cbmZ1bmN0aW9uIGdldE5BRihudW0sIHcpIHtcbiAgdmFyIG5hZiA9IFtdO1xuICB2YXIgd3MgPSAxIDw8ICh3ICsgMSk7XG4gIHZhciBrID0gbnVtLmNsb25lKCk7XG4gIHdoaWxlIChrLmNtcG4oMSkgPj0gMCkge1xuICAgIHZhciB6O1xuICAgIGlmIChrLmlzT2RkKCkpIHtcbiAgICAgIHZhciBtb2QgPSBrLmFuZGxuKHdzIC0gMSk7XG4gICAgICBpZiAobW9kID4gKHdzID4+IDEpIC0gMSlcbiAgICAgICAgeiA9ICh3cyA+PiAxKSAtIG1vZDtcbiAgICAgIGVsc2VcbiAgICAgICAgeiA9IG1vZDtcbiAgICAgIGsuaXN1Ym4oeik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHogPSAwO1xuICAgIH1cbiAgICBuYWYucHVzaCh6KTtcblxuICAgIC8vIE9wdGltaXphdGlvbiwgc2hpZnQgYnkgd29yZCBpZiBwb3NzaWJsZVxuICAgIHZhciBzaGlmdCA9IChrLmNtcG4oMCkgIT09IDAgJiYgay5hbmRsbih3cyAtIDEpID09PSAwKSA/ICh3ICsgMSkgOiAxO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgc2hpZnQ7IGkrKylcbiAgICAgIG5hZi5wdXNoKDApO1xuICAgIGsuaXVzaHJuKHNoaWZ0KTtcbiAgfVxuXG4gIHJldHVybiBuYWY7XG59XG51dGlscy5nZXROQUYgPSBnZXROQUY7XG5cbi8vIFJlcHJlc2VudCBrMSwgazIgaW4gYSBKb2ludCBTcGFyc2UgRm9ybVxuZnVuY3Rpb24gZ2V0SlNGKGsxLCBrMikge1xuICB2YXIganNmID0gW1xuICAgIFtdLFxuICAgIFtdXG4gIF07XG5cbiAgazEgPSBrMS5jbG9uZSgpO1xuICBrMiA9IGsyLmNsb25lKCk7XG4gIHZhciBkMSA9IDA7XG4gIHZhciBkMiA9IDA7XG4gIHdoaWxlIChrMS5jbXBuKC1kMSkgPiAwIHx8IGsyLmNtcG4oLWQyKSA+IDApIHtcblxuICAgIC8vIEZpcnN0IHBoYXNlXG4gICAgdmFyIG0xNCA9IChrMS5hbmRsbigzKSArIGQxKSAmIDM7XG4gICAgdmFyIG0yNCA9IChrMi5hbmRsbigzKSArIGQyKSAmIDM7XG4gICAgaWYgKG0xNCA9PT0gMylcbiAgICAgIG0xNCA9IC0xO1xuICAgIGlmIChtMjQgPT09IDMpXG4gICAgICBtMjQgPSAtMTtcbiAgICB2YXIgdTE7XG4gICAgaWYgKChtMTQgJiAxKSA9PT0gMCkge1xuICAgICAgdTEgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbTggPSAoazEuYW5kbG4oNykgKyBkMSkgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTI0ID09PSAyKVxuICAgICAgICB1MSA9IC1tMTQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUxID0gbTE0O1xuICAgIH1cbiAgICBqc2ZbMF0ucHVzaCh1MSk7XG5cbiAgICB2YXIgdTI7XG4gICAgaWYgKChtMjQgJiAxKSA9PT0gMCkge1xuICAgICAgdTIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbTggPSAoazIuYW5kbG4oNykgKyBkMikgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTE0ID09PSAyKVxuICAgICAgICB1MiA9IC1tMjQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUyID0gbTI0O1xuICAgIH1cbiAgICBqc2ZbMV0ucHVzaCh1Mik7XG5cbiAgICAvLyBTZWNvbmQgcGhhc2VcbiAgICBpZiAoMiAqIGQxID09PSB1MSArIDEpXG4gICAgICBkMSA9IDEgLSBkMTtcbiAgICBpZiAoMiAqIGQyID09PSB1MiArIDEpXG4gICAgICBkMiA9IDEgLSBkMjtcbiAgICBrMS5pdXNocm4oMSk7XG4gICAgazIuaXVzaHJuKDEpO1xuICB9XG5cbiAgcmV0dXJuIGpzZjtcbn1cbnV0aWxzLmdldEpTRiA9IGdldEpTRjtcblxuZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkob2JqLCBjb21wdXRlcikge1xuICB2YXIgbmFtZSA9IGNvbXB1dGVyLm5hbWU7XG4gIHZhciBrZXkgPSAnXycgKyBuYW1lO1xuICBvYmoucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkoKSB7XG4gICAgcmV0dXJuIHRoaXNba2V5XSAhPT0gdW5kZWZpbmVkID8gdGhpc1trZXldIDpcbiAgICAgICAgICAgdGhpc1trZXldID0gY29tcHV0ZXIuY2FsbCh0aGlzKTtcbiAgfTtcbn1cbnV0aWxzLmNhY2hlZFByb3BlcnR5ID0gY2FjaGVkUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHBhcnNlQnl0ZXMoYnl0ZXMpIHtcbiAgcmV0dXJuIHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycgPyB1dGlscy50b0FycmF5KGJ5dGVzLCAnaGV4JykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzO1xufVxudXRpbHMucGFyc2VCeXRlcyA9IHBhcnNlQnl0ZXM7XG5cbmZ1bmN0aW9uIGludEZyb21MRShieXRlcykge1xuICByZXR1cm4gbmV3IEJOKGJ5dGVzLCAnaGV4JywgJ2xlJyk7XG59XG51dGlscy5pbnRGcm9tTEUgPSBpbnRGcm9tTEU7XG5cbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJfYXJnc1wiOiBbXG4gICAgW1xuICAgICAgXCJlbGxpcHRpY0BeNi4wLjBcIixcbiAgICAgIFwiL1VzZXJzL2pvcmFuL0RvY3VtZW50cy9kZXZlbG9wbWVudC9wYXRjaGRlY2svbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnblwiXG4gICAgXVxuICBdLFxuICBcIl9mcm9tXCI6IFwiZWxsaXB0aWNAPj02LjAuMCA8Ny4wLjBcIixcbiAgXCJfaWRcIjogXCJlbGxpcHRpY0A2LjIuM1wiLFxuICBcIl9pbkNhY2hlXCI6IHRydWUsXG4gIFwiX2luc3RhbGxhYmxlXCI6IHRydWUsXG4gIFwiX2xvY2F0aW9uXCI6IFwiL2VsbGlwdGljXCIsXG4gIFwiX25vZGVWZXJzaW9uXCI6IFwiNS40LjFcIixcbiAgXCJfbnBtVXNlclwiOiB7XG4gICAgXCJlbWFpbFwiOiBcImZlZG9yQGluZHV0bnkuY29tXCIsXG4gICAgXCJuYW1lXCI6IFwiaW5kdXRueVwiXG4gIH0sXG4gIFwiX25wbVZlcnNpb25cIjogXCIzLjMuMTJcIixcbiAgXCJfcGhhbnRvbUNoaWxkcmVuXCI6IHt9LFxuICBcIl9yZXF1ZXN0ZWRcIjoge1xuICAgIFwibmFtZVwiOiBcImVsbGlwdGljXCIsXG4gICAgXCJyYXdcIjogXCJlbGxpcHRpY0BeNi4wLjBcIixcbiAgICBcInJhd1NwZWNcIjogXCJeNi4wLjBcIixcbiAgICBcInNjb3BlXCI6IG51bGwsXG4gICAgXCJzcGVjXCI6IFwiPj02LjAuMCA8Ny4wLjBcIixcbiAgICBcInR5cGVcIjogXCJyYW5nZVwiXG4gIH0sXG4gIFwiX3JlcXVpcmVkQnlcIjogW1xuICAgIFwiL2Jyb3dzZXJpZnktc2lnblwiLFxuICAgIFwiL2NyZWF0ZS1lY2RoXCJcbiAgXSxcbiAgXCJfcmVzb2x2ZWRcIjogXCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbGxpcHRpYy8tL2VsbGlwdGljLTYuMi4zLnRnelwiLFxuICBcIl9zaGFzdW1cIjogXCIxOGU0NmQ3MzA2YjA5NTEyNzVhMmQ0MjA2MzI3MGExNGI3NGViZTk5XCIsXG4gIFwiX3Nocmlua3dyYXBcIjogbnVsbCxcbiAgXCJfc3BlY1wiOiBcImVsbGlwdGljQF42LjAuMFwiLFxuICBcIl93aGVyZVwiOiBcIi9Vc2Vycy9qb3Jhbi9Eb2N1bWVudHMvZGV2ZWxvcG1lbnQvcGF0Y2hkZWNrL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ25cIixcbiAgXCJhdXRob3JcIjoge1xuICAgIFwiZW1haWxcIjogXCJmZWRvckBpbmR1dG55LmNvbVwiLFxuICAgIFwibmFtZVwiOiBcIkZlZG9yIEluZHV0bnlcIlxuICB9LFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvZWxsaXB0aWMvaXNzdWVzXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYm4uanNcIjogXCJeNC4wLjBcIixcbiAgICBcImJyb3JhbmRcIjogXCJeMS4wLjFcIixcbiAgICBcImhhc2guanNcIjogXCJeMS4wLjBcIixcbiAgICBcImluaGVyaXRzXCI6IFwiXjIuMC4xXCJcbiAgfSxcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkVDIGNyeXB0b2dyYXBoeVwiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJjb3ZlcmFsbHNcIjogXCJeMi4xMS4zXCIsXG4gICAgXCJpc3RhbmJ1bFwiOiBcIl4wLjQuMlwiLFxuICAgIFwianNjc1wiOiBcIl4yLjkuMFwiLFxuICAgIFwianNoaW50XCI6IFwiXjIuNi4wXCIsXG4gICAgXCJtb2NoYVwiOiBcIl4yLjEuMFwiXG4gIH0sXG4gIFwiZGlyZWN0b3JpZXNcIjoge30sXG4gIFwiZGlzdFwiOiB7XG4gICAgXCJzaGFzdW1cIjogXCIxOGU0NmQ3MzA2YjA5NTEyNzVhMmQ0MjA2MzI3MGExNGI3NGViZTk5XCIsXG4gICAgXCJ0YXJiYWxsXCI6IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWxsaXB0aWMvLS9lbGxpcHRpYy02LjIuMy50Z3pcIlxuICB9LFxuICBcImZpbGVzXCI6IFtcbiAgICBcImxpYlwiXG4gIF0sXG4gIFwiZ2l0SGVhZFwiOiBcImMzMmYyMGIyMmI0MjBlYjZhZjNjNmRkYTI4OTYzZGViN2ZhY2Y4MjNcIixcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9pbmR1dG55L2VsbGlwdGljXCIsXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwiQ3J5cHRvZ3JhcGh5XCIsXG4gICAgXCJFQ1wiLFxuICAgIFwiRWxsaXB0aWNcIixcbiAgICBcImN1cnZlXCJcbiAgXSxcbiAgXCJsaWNlbnNlXCI6IFwiTUlUXCIsXG4gIFwibWFpblwiOiBcImxpYi9lbGxpcHRpYy5qc1wiLFxuICBcIm1haW50YWluZXJzXCI6IFtcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJpbmR1dG55XCIsXG4gICAgICBcImVtYWlsXCI6IFwiZmVkb3JAaW5kdXRueS5jb21cIlxuICAgIH1cbiAgXSxcbiAgXCJuYW1lXCI6IFwiZWxsaXB0aWNcIixcbiAgXCJvcHRpb25hbERlcGVuZGVuY2llc1wiOiB7fSxcbiAgXCJyZWFkbWVcIjogXCJFUlJPUjogTm8gUkVBRE1FIGRhdGEgZm91bmQhXCIsXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQrc3NoOi8vZ2l0QGdpdGh1Yi5jb20vaW5kdXRueS9lbGxpcHRpYy5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiY292ZXJhZ2VcIjogXCJucG0gcnVuIHVuaXQgLS1jb3ZlcmFnZVwiLFxuICAgIFwiY292ZXJhbGxzXCI6IFwibnBtIHJ1biBjb3ZlcmFnZSAmJiBjYXQgLi9jb3ZlcmFnZS9sY292LmluZm8gfCBjb3ZlcmFsbHNcIixcbiAgICBcImpzY3NcIjogXCJqc2NzIGJlbmNobWFya3MvKi5qcyBsaWIvKi5qcyBsaWIvKiovKi5qcyBsaWIvKiovKiovKi5qcyB0ZXN0LyouanNcIixcbiAgICBcImpzaGludFwiOiBcImpzY3MgYmVuY2htYXJrcy8qLmpzIGxpYi8qLmpzIGxpYi8qKi8qLmpzIGxpYi8qKi8qKi8qLmpzIHRlc3QvKi5qc1wiLFxuICAgIFwibGludFwiOiBcIm5wbSBydW4ganNjcyAmJiBucG0gcnVuIGpzaGludFwiLFxuICAgIFwidGVzdFwiOiBcIm5wbSBydW4gbGludCAmJiBucG0gcnVuIHVuaXRcIixcbiAgICBcInVuaXRcIjogXCJpc3RhbmJ1bCB0ZXN0IF9tb2NoYSAtLXJlcG9ydGVyPXNwZWMgdGVzdC8qLXRlc3QuanNcIlxuICB9LFxuICBcInZlcnNpb25cIjogXCI2LjIuM1wiXG59XG4iLCJ2YXIgcHJyID0gcmVxdWlyZSgncHJyJylcblxuZnVuY3Rpb24gaW5pdCAodHlwZSwgbWVzc2FnZSwgY2F1c2UpIHtcbiAgcHJyKHRoaXMsIHtcbiAgICAgIHR5cGUgICAgOiB0eXBlXG4gICAgLCBuYW1lICAgIDogdHlwZVxuICAgICAgLy8gY2FuIGJlIHBhc3NlZCBqdXN0IGEgJ2NhdXNlJ1xuICAgICwgY2F1c2UgICA6IHR5cGVvZiBtZXNzYWdlICE9ICdzdHJpbmcnID8gbWVzc2FnZSA6IGNhdXNlXG4gICAgLCBtZXNzYWdlIDogISFtZXNzYWdlICYmIHR5cGVvZiBtZXNzYWdlICE9ICdzdHJpbmcnID8gbWVzc2FnZS5tZXNzYWdlIDogbWVzc2FnZVxuXG4gIH0sICdld3InKVxufVxuXG4vLyBnZW5lcmljIHByb3RvdHlwZSwgbm90IGludGVuZGVkIHRvIGJlIGFjdHVhbGx5IHVzZWQgLSBoZWxwZnVsIGZvciBgaW5zdGFuY2VvZmBcbmZ1bmN0aW9uIEN1c3RvbUVycm9yIChtZXNzYWdlLCBjYXVzZSkge1xuICBFcnJvci5jYWxsKHRoaXMpXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBhcmd1bWVudHMuY2FsbGVlKVxuICBpbml0LmNhbGwodGhpcywgJ0N1c3RvbUVycm9yJywgbWVzc2FnZSwgY2F1c2UpXG59XG5cbkN1c3RvbUVycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpXG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yIChlcnJubywgdHlwZSwgcHJvdG8pIHtcbiAgdmFyIGVyciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBjYXVzZSkge1xuICAgIGluaXQuY2FsbCh0aGlzLCB0eXBlLCBtZXNzYWdlLCBjYXVzZSlcbiAgICAvL1RPRE86IHRoZSBzcGVjaWZpY2l0eSBoZXJlIGlzIHN0dXBpZCwgZXJybm8gc2hvdWxkIGJlIGF2YWlsYWJsZSBldmVyeXdoZXJlXG4gICAgaWYgKHR5cGUgPT0gJ0ZpbGVzeXN0ZW1FcnJvcicpIHtcbiAgICAgIHRoaXMuY29kZSAgICA9IHRoaXMuY2F1c2UuY29kZVxuICAgICAgdGhpcy5wYXRoICAgID0gdGhpcy5jYXVzZS5wYXRoXG4gICAgICB0aGlzLmVycm5vICAgPSB0aGlzLmNhdXNlLmVycm5vXG4gICAgICB0aGlzLm1lc3NhZ2UgPVxuICAgICAgICAoZXJybm8uZXJybm9bdGhpcy5jYXVzZS5lcnJub11cbiAgICAgICAgICA/IGVycm5vLmVycm5vW3RoaXMuY2F1c2UuZXJybm9dLmRlc2NyaXB0aW9uXG4gICAgICAgICAgOiB0aGlzLmNhdXNlLm1lc3NhZ2UpXG4gICAgICAgICsgKHRoaXMuY2F1c2UucGF0aCA/ICcgWycgKyB0aGlzLmNhdXNlLnBhdGggKyAnXScgOiAnJylcbiAgICB9XG4gICAgRXJyb3IuY2FsbCh0aGlzKVxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIGFyZ3VtZW50cy5jYWxsZWUpXG4gIH1cbiAgZXJyLnByb3RvdHlwZSA9ICEhcHJvdG8gPyBuZXcgcHJvdG8oKSA6IG5ldyBDdXN0b21FcnJvcigpXG4gIHJldHVybiBlcnJcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXJybm8pIHtcbiAgdmFyIGNlID0gZnVuY3Rpb24gKHR5cGUsIHByb3RvKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVycm9yKGVycm5vLCB0eXBlLCBwcm90bylcbiAgfVxuICByZXR1cm4ge1xuICAgICAgQ3VzdG9tRXJyb3IgICAgIDogQ3VzdG9tRXJyb3JcbiAgICAsIEZpbGVzeXN0ZW1FcnJvciA6IGNlKCdGaWxlc3lzdGVtRXJyb3InKVxuICAgICwgY3JlYXRlRXJyb3IgICAgIDogY2VcbiAgfVxufVxuIiwidmFyIGFsbCA9IG1vZHVsZS5leHBvcnRzLmFsbCA9IFtcbiAge1xuICAgIGVycm5vOiAtMixcbiAgICBjb2RlOiAnRU5PRU5UJyxcbiAgICBkZXNjcmlwdGlvbjogJ25vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknXG4gIH0sXG4gIHtcbiAgICBlcnJubzogLTEsXG4gICAgY29kZTogJ1VOS05PV04nLFxuICAgIGRlc2NyaXB0aW9uOiAndW5rbm93biBlcnJvcidcbiAgfSxcbiAge1xuICAgIGVycm5vOiAwLFxuICAgIGNvZGU6ICdPSycsXG4gICAgZGVzY3JpcHRpb246ICdzdWNjZXNzJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDEsXG4gICAgY29kZTogJ0VPRicsXG4gICAgZGVzY3JpcHRpb246ICdlbmQgb2YgZmlsZSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAyLFxuICAgIGNvZGU6ICdFQUREUklORk8nLFxuICAgIGRlc2NyaXB0aW9uOiAnZ2V0YWRkcmluZm8gZXJyb3InXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMyxcbiAgICBjb2RlOiAnRUFDQ0VTJyxcbiAgICBkZXNjcmlwdGlvbjogJ3Blcm1pc3Npb24gZGVuaWVkJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDQsXG4gICAgY29kZTogJ0VBR0FJTicsXG4gICAgZGVzY3JpcHRpb246ICdyZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA1LFxuICAgIGNvZGU6ICdFQUREUklOVVNFJyxcbiAgICBkZXNjcmlwdGlvbjogJ2FkZHJlc3MgYWxyZWFkeSBpbiB1c2UnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNixcbiAgICBjb2RlOiAnRUFERFJOT1RBVkFJTCcsXG4gICAgZGVzY3JpcHRpb246ICdhZGRyZXNzIG5vdCBhdmFpbGFibGUnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNyxcbiAgICBjb2RlOiAnRUFGTk9TVVBQT1JUJyxcbiAgICBkZXNjcmlwdGlvbjogJ2FkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogOCxcbiAgICBjb2RlOiAnRUFMUkVBRFknLFxuICAgIGRlc2NyaXB0aW9uOiAnY29ubmVjdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDksXG4gICAgY29kZTogJ0VCQURGJyxcbiAgICBkZXNjcmlwdGlvbjogJ2JhZCBmaWxlIGRlc2NyaXB0b3InXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMTAsXG4gICAgY29kZTogJ0VCVVNZJyxcbiAgICBkZXNjcmlwdGlvbjogJ3Jlc291cmNlIGJ1c3kgb3IgbG9ja2VkJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDExLFxuICAgIGNvZGU6ICdFQ09OTkFCT1JURUQnLFxuICAgIGRlc2NyaXB0aW9uOiAnc29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMTIsXG4gICAgY29kZTogJ0VDT05OUkVGVVNFRCcsXG4gICAgZGVzY3JpcHRpb246ICdjb25uZWN0aW9uIHJlZnVzZWQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMTMsXG4gICAgY29kZTogJ0VDT05OUkVTRVQnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29ubmVjdGlvbiByZXNldCBieSBwZWVyJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDE0LFxuICAgIGNvZGU6ICdFREVTVEFERFJSRVEnLFxuICAgIGRlc2NyaXB0aW9uOiAnZGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAxNSxcbiAgICBjb2RlOiAnRUZBVUxUJyxcbiAgICBkZXNjcmlwdGlvbjogJ2JhZCBhZGRyZXNzIGluIHN5c3RlbSBjYWxsIGFyZ3VtZW50J1xuICB9LFxuICB7XG4gICAgZXJybm86IDE2LFxuICAgIGNvZGU6ICdFSE9TVFVOUkVBQ0gnLFxuICAgIGRlc2NyaXB0aW9uOiAnaG9zdCBpcyB1bnJlYWNoYWJsZSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAxNyxcbiAgICBjb2RlOiAnRUlOVFInLFxuICAgIGRlc2NyaXB0aW9uOiAnaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMTgsXG4gICAgY29kZTogJ0VJTlZBTCcsXG4gICAgZGVzY3JpcHRpb246ICdpbnZhbGlkIGFyZ3VtZW50J1xuICB9LFxuICB7XG4gICAgZXJybm86IDE5LFxuICAgIGNvZGU6ICdFSVNDT05OJyxcbiAgICBkZXNjcmlwdGlvbjogJ3NvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAyMCxcbiAgICBjb2RlOiAnRU1GSUxFJyxcbiAgICBkZXNjcmlwdGlvbjogJ3RvbyBtYW55IG9wZW4gZmlsZXMnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMjEsXG4gICAgY29kZTogJ0VNU0dTSVpFJyxcbiAgICBkZXNjcmlwdGlvbjogJ21lc3NhZ2UgdG9vIGxvbmcnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMjIsXG4gICAgY29kZTogJ0VORVRET1dOJyxcbiAgICBkZXNjcmlwdGlvbjogJ25ldHdvcmsgaXMgZG93bidcbiAgfSxcbiAge1xuICAgIGVycm5vOiAyMyxcbiAgICBjb2RlOiAnRU5FVFVOUkVBQ0gnLFxuICAgIGRlc2NyaXB0aW9uOiAnbmV0d29yayBpcyB1bnJlYWNoYWJsZSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAyNCxcbiAgICBjb2RlOiAnRU5GSUxFJyxcbiAgICBkZXNjcmlwdGlvbjogJ2ZpbGUgdGFibGUgb3ZlcmZsb3cnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMjUsXG4gICAgY29kZTogJ0VOT0JVRlMnLFxuICAgIGRlc2NyaXB0aW9uOiAnbm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAyNixcbiAgICBjb2RlOiAnRU5PTUVNJyxcbiAgICBkZXNjcmlwdGlvbjogJ25vdCBlbm91Z2ggbWVtb3J5J1xuICB9LFxuICB7XG4gICAgZXJybm86IDI3LFxuICAgIGNvZGU6ICdFTk9URElSJyxcbiAgICBkZXNjcmlwdGlvbjogJ25vdCBhIGRpcmVjdG9yeSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAyOCxcbiAgICBjb2RlOiAnRUlTRElSJyxcbiAgICBkZXNjcmlwdGlvbjogJ2lsbGVnYWwgb3BlcmF0aW9uIG9uIGEgZGlyZWN0b3J5J1xuICB9LFxuICB7XG4gICAgZXJybm86IDI5LFxuICAgIGNvZGU6ICdFTk9ORVQnLFxuICAgIGRlc2NyaXB0aW9uOiAnbWFjaGluZSBpcyBub3Qgb24gdGhlIG5ldHdvcmsnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMzEsXG4gICAgY29kZTogJ0VOT1RDT05OJyxcbiAgICBkZXNjcmlwdGlvbjogJ3NvY2tldCBpcyBub3QgY29ubmVjdGVkJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDMyLFxuICAgIGNvZGU6ICdFTk9UU09DSycsXG4gICAgZGVzY3JpcHRpb246ICdzb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMzMsXG4gICAgY29kZTogJ0VOT1RTVVAnLFxuICAgIGRlc2NyaXB0aW9uOiAnb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gc29ja2V0J1xuICB9LFxuICB7XG4gICAgZXJybm86IDM0LFxuICAgIGNvZGU6ICdFTk9FTlQnLFxuICAgIGRlc2NyaXB0aW9uOiAnbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAzNSxcbiAgICBjb2RlOiAnRU5PU1lTJyxcbiAgICBkZXNjcmlwdGlvbjogJ2Z1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiAzNixcbiAgICBjb2RlOiAnRVBJUEUnLFxuICAgIGRlc2NyaXB0aW9uOiAnYnJva2VuIHBpcGUnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMzcsXG4gICAgY29kZTogJ0VQUk9UTycsXG4gICAgZGVzY3JpcHRpb246ICdwcm90b2NvbCBlcnJvcidcbiAgfSxcbiAge1xuICAgIGVycm5vOiAzOCxcbiAgICBjb2RlOiAnRVBST1RPTk9TVVBQT1JUJyxcbiAgICBkZXNjcmlwdGlvbjogJ3Byb3RvY29sIG5vdCBzdXBwb3J0ZWQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogMzksXG4gICAgY29kZTogJ0VQUk9UT1RZUEUnLFxuICAgIGRlc2NyaXB0aW9uOiAncHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0J1xuICB9LFxuICB7XG4gICAgZXJybm86IDQwLFxuICAgIGNvZGU6ICdFVElNRURPVVQnLFxuICAgIGRlc2NyaXB0aW9uOiAnY29ubmVjdGlvbiB0aW1lZCBvdXQnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNDEsXG4gICAgY29kZTogJ0VDSEFSU0VUJyxcbiAgICBkZXNjcmlwdGlvbjogJ2ludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXInXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNDIsXG4gICAgY29kZTogJ0VBSUZBTU5PU1VQUE9SVCcsXG4gICAgZGVzY3JpcHRpb246ICdhZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA0NCxcbiAgICBjb2RlOiAnRUFJU0VSVklDRScsXG4gICAgZGVzY3JpcHRpb246ICdzZXJ2bmFtZSBub3Qgc3VwcG9ydGVkIGZvciBhaV9zb2NrdHlwZSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA0NSxcbiAgICBjb2RlOiAnRUFJU09DS1RZUEUnLFxuICAgIGRlc2NyaXB0aW9uOiAnYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA0NixcbiAgICBjb2RlOiAnRVNIVVRET1dOJyxcbiAgICBkZXNjcmlwdGlvbjogJ2Nhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93bidcbiAgfSxcbiAge1xuICAgIGVycm5vOiA0NyxcbiAgICBjb2RlOiAnRUVYSVNUJyxcbiAgICBkZXNjcmlwdGlvbjogJ2ZpbGUgYWxyZWFkeSBleGlzdHMnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNDgsXG4gICAgY29kZTogJ0VTUkNIJyxcbiAgICBkZXNjcmlwdGlvbjogJ25vIHN1Y2ggcHJvY2VzcydcbiAgfSxcbiAge1xuICAgIGVycm5vOiA0OSxcbiAgICBjb2RlOiAnRU5BTUVUT09MT05HJyxcbiAgICBkZXNjcmlwdGlvbjogJ25hbWUgdG9vIGxvbmcnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNTAsXG4gICAgY29kZTogJ0VQRVJNJyxcbiAgICBkZXNjcmlwdGlvbjogJ29wZXJhdGlvbiBub3QgcGVybWl0dGVkJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDUxLFxuICAgIGNvZGU6ICdFTE9PUCcsXG4gICAgZGVzY3JpcHRpb246ICd0b28gbWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA1MixcbiAgICBjb2RlOiAnRVhERVYnLFxuICAgIGRlc2NyaXB0aW9uOiAnY3Jvc3MtZGV2aWNlIGxpbmsgbm90IHBlcm1pdHRlZCdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA1MyxcbiAgICBjb2RlOiAnRU5PVEVNUFRZJyxcbiAgICBkZXNjcmlwdGlvbjogJ2RpcmVjdG9yeSBub3QgZW1wdHknXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNTQsXG4gICAgY29kZTogJ0VOT1NQQycsXG4gICAgZGVzY3JpcHRpb246ICdubyBzcGFjZSBsZWZ0IG9uIGRldmljZSdcbiAgfSxcbiAge1xuICAgIGVycm5vOiA1NSxcbiAgICBjb2RlOiAnRUlPJyxcbiAgICBkZXNjcmlwdGlvbjogJ2kvbyBlcnJvcidcbiAgfSxcbiAge1xuICAgIGVycm5vOiA1NixcbiAgICBjb2RlOiAnRVJPRlMnLFxuICAgIGRlc2NyaXB0aW9uOiAncmVhZC1vbmx5IGZpbGUgc3lzdGVtJ1xuICB9LFxuICB7XG4gICAgZXJybm86IDU3LFxuICAgIGNvZGU6ICdFTk9ERVYnLFxuICAgIGRlc2NyaXB0aW9uOiAnbm8gc3VjaCBkZXZpY2UnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNTgsXG4gICAgY29kZTogJ0VTUElQRScsXG4gICAgZGVzY3JpcHRpb246ICdpbnZhbGlkIHNlZWsnXG4gIH0sXG4gIHtcbiAgICBlcnJubzogNTksXG4gICAgY29kZTogJ0VDQU5DRUxFRCcsXG4gICAgZGVzY3JpcHRpb246ICdvcGVyYXRpb24gY2FuY2VsZWQnXG4gIH1cbl1cblxubW9kdWxlLmV4cG9ydHMuZXJybm8gPSB7fVxubW9kdWxlLmV4cG9ydHMuY29kZSA9IHt9XG5cbmFsbC5mb3JFYWNoKGZ1bmN0aW9uIChlcnJvcikge1xuICBtb2R1bGUuZXhwb3J0cy5lcnJub1tlcnJvci5lcnJub10gPSBlcnJvclxuICBtb2R1bGUuZXhwb3J0cy5jb2RlW2Vycm9yLmNvZGVdID0gZXJyb3Jcbn0pXG5cbm1vZHVsZS5leHBvcnRzLmN1c3RvbSA9IHJlcXVpcmUoJy4vY3VzdG9tJykobW9kdWxlLmV4cG9ydHMpXG5tb2R1bGUuZXhwb3J0cy5jcmVhdGUgPSBtb2R1bGUuZXhwb3J0cy5jdXN0b20uY3JlYXRlRXJyb3JcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuJyk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gSUUgMTBcbiAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgICBpZiAoaXNGdW5jdGlvbihldmxpc3RlbmVyKSlcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGV2bGlzdGVuZXIpXG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsInZhciBtZDUgPSByZXF1aXJlKCdjcmVhdGUtaGFzaC9tZDUnKVxubW9kdWxlLmV4cG9ydHMgPSBFVlBfQnl0ZXNUb0tleVxuZnVuY3Rpb24gRVZQX0J5dGVzVG9LZXkgKHBhc3N3b3JkLCBzYWx0LCBrZXlMZW4sIGl2TGVuKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHBhc3N3b3JkKSkge1xuICAgIHBhc3N3b3JkID0gbmV3IEJ1ZmZlcihwYXNzd29yZCwgJ2JpbmFyeScpXG4gIH1cbiAgaWYgKHNhbHQgJiYgIUJ1ZmZlci5pc0J1ZmZlcihzYWx0KSkge1xuICAgIHNhbHQgPSBuZXcgQnVmZmVyKHNhbHQsICdiaW5hcnknKVxuICB9XG4gIGtleUxlbiA9IGtleUxlbiAvIDhcbiAgaXZMZW4gPSBpdkxlbiB8fCAwXG4gIHZhciBraSA9IDBcbiAgdmFyIGlpID0gMFxuICB2YXIga2V5ID0gbmV3IEJ1ZmZlcihrZXlMZW4pXG4gIHZhciBpdiA9IG5ldyBCdWZmZXIoaXZMZW4pXG4gIHZhciBhZGRtZCA9IDBcbiAgdmFyIG1kX2J1ZlxuICB2YXIgaVxuICB2YXIgYnVmcyA9IFtdXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGFkZG1kKysgPiAwKSB7XG4gICAgICBidWZzLnB1c2gobWRfYnVmKVxuICAgIH1cbiAgICBidWZzLnB1c2gocGFzc3dvcmQpXG4gICAgaWYgKHNhbHQpIHtcbiAgICAgIGJ1ZnMucHVzaChzYWx0KVxuICAgIH1cbiAgICBtZF9idWYgPSBtZDUoQnVmZmVyLmNvbmNhdChidWZzKSlcbiAgICBidWZzID0gW11cbiAgICBpID0gMFxuICAgIGlmIChrZXlMZW4gPiAwKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoa2V5TGVuID09PSAwKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gbWRfYnVmLmxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAga2V5W2tpKytdID0gbWRfYnVmW2ldXG4gICAgICAgIGtleUxlbi0tXG4gICAgICAgIGkrK1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXZMZW4gPiAwICYmIGkgIT09IG1kX2J1Zi5sZW5ndGgpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlmIChpdkxlbiA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IG1kX2J1Zi5sZW5ndGgpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGl2W2lpKytdID0gbWRfYnVmW2ldXG4gICAgICAgIGl2TGVuLS1cbiAgICAgICAgaSsrXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZXlMZW4gPT09IDAgJiYgaXZMZW4gPT09IDApIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBtZF9idWYubGVuZ3RoOyBpKyspIHtcbiAgICBtZF9idWZbaV0gPSAwXG4gIH1cbiAgcmV0dXJuIHtcbiAgICBrZXk6IGtleSxcbiAgICBpdjogaXZcbiAgfVxufVxuIiwiXG5mdW5jdGlvbiBnZXRTdGFjayhlcnIpIHtcbiAgcmV0dXJuIGVyci5zdGFjay5zdWJzdHJpbmcoZXJyLm5hbWUubGVuZ3RoICsgMyArIGVyci5tZXNzYWdlLmxlbmd0aClcbiAgICAuc3BsaXQoJ1xcbicpXG59XG5cbmZ1bmN0aW9uIHJlbW92ZVByZWZpeCAoYSwgYikge1xuICByZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gIX5iLmluZGV4T2YoZSlcbiAgfSlcbn1cblxudmFyIGV4cGxhaW4gPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlcnIsIG1lc3NhZ2UpIHtcbiAgdmFyIF9lcnIgPSBuZXcgRXJyb3IobWVzc2FnZSlcbiAgdmFyIHN0YWNrID0gcmVtb3ZlUHJlZml4KGdldFN0YWNrKF9lcnIpLnNsaWNlKDEpLCBnZXRTdGFjayhlcnIpKS5qb2luKCdcXG4nKVxuXG4gIF9lcnIuc3RhY2sgPVxuICAgIF9lcnIubmFtZSArICc6ICcgKyBfZXJyLm1lc3NhZ2UgKyAnXFxuJyArXG4gICAgc3RhY2sgKyAnXFxuICAnICsgZXJyLnN0YWNrXG5cbiAgcmV0dXJuIF9lcnJcbn1cblxuIiwiLyoqXG4gKiBFeHRlbmQgYW4gb2JqZWN0IHdpdGggYW5vdGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdCwgLi4ufSBzcmMsIC4uLlxuICogQHJldHVybiB7T2JqZWN0fSBtZXJnZWRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3JjKSB7XG4gIHZhciBvYmpzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCBvYmo7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG9ianMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBvYmogPSBvYmpzW2ldO1xuICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgICBzcmNbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNyYztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG52YXIgaXNBcnJheSA9IGZ1bmN0aW9uIGlzQXJyYXkoYXJyKSB7XG5cdGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiBBcnJheS5pc0FycmF5KGFycik7XG5cdH1cblxuXHRyZXR1cm4gdG9TdHIuY2FsbChhcnIpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxudmFyIGlzUGxhaW5PYmplY3QgPSBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuXHRpZiAoIW9iaiB8fCB0b1N0ci5jYWxsKG9iaikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dmFyIGhhc093bkNvbnN0cnVjdG9yID0gaGFzT3duLmNhbGwob2JqLCAnY29uc3RydWN0b3InKTtcblx0dmFyIGhhc0lzUHJvdG90eXBlT2YgPSBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSAmJiBoYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCAnaXNQcm90b3R5cGVPZicpO1xuXHQvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0XG5cdGlmIChvYmouY29uc3RydWN0b3IgJiYgIWhhc093bkNvbnN0cnVjdG9yICYmICFoYXNJc1Byb3RvdHlwZU9mKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsXG5cdC8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLlxuXHR2YXIga2V5O1xuXHRmb3IgKGtleSBpbiBvYmopIHsvKiovfVxuXG5cdHJldHVybiB0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJyB8fCBoYXNPd24uY2FsbChvYmosIGtleSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4dGVuZCgpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1swXSxcblx0XHRpID0gMSxcblx0XHRsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuXHRcdGRlZXAgPSBmYWxzZTtcblxuXHQvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uXG5cdGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnYm9vbGVhbicpIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sxXSB8fCB7fTtcblx0XHQvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0aSA9IDI7XG5cdH0gZWxzZSBpZiAoKHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicpIHx8IHRhcmdldCA9PSBudWxsKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHRmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1tpXTtcblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yIChuYW1lIGluIG9wdGlvbnMpIHtcblx0XHRcdFx0c3JjID0gdGFyZ2V0W25hbWVdO1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1tuYW1lXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICh0YXJnZXQgIT09IGNvcHkpIHtcblx0XHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0XHRpZiAoZGVlcCAmJiBjb3B5ICYmIChpc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGlzQXJyYXkoY29weSkpKSkge1xuXHRcdFx0XHRcdFx0aWYgKGNvcHlJc0FycmF5KSB7XG5cdFx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gZXh0ZW5kKGRlZXAsIGNsb25lLCBjb3B5KTtcblxuXHRcdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb3B5ICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gY29weTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxuIiwidmFyIExJTUlUID0gcHJvY2Vzcy5tYXhUaWNrRGVwdGggLyAyXG4gICwgZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjb3VudCA9IDBcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKGNvdW50ID49IExJTUlUKXtcbiAgICAgICAgICBnbG9iYWwuc2V0SW1tZWRpYXRlKGNhbGxiYWNrKVxuICAgICAgICAgIGNvdW50ID0gMFxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxuICAgICAgICBjb3VudCsrXG4gICAgICB9XG4gICAgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5zZXRJbW1lZGlhdGUgPyBmYWN0b3J5IDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayB9IiwiZXhwb3J0cy5hbHBoYXNvcnQgPSBhbHBoYXNvcnRcbmV4cG9ydHMuYWxwaGFzb3J0aSA9IGFscGhhc29ydGlcbmV4cG9ydHMuc2V0b3B0cyA9IHNldG9wdHNcbmV4cG9ydHMub3duUHJvcCA9IG93blByb3BcbmV4cG9ydHMubWFrZUFicyA9IG1ha2VBYnNcbmV4cG9ydHMuZmluaXNoID0gZmluaXNoXG5leHBvcnRzLm1hcmsgPSBtYXJrXG5leHBvcnRzLmlzSWdub3JlZCA9IGlzSWdub3JlZFxuZXhwb3J0cy5jaGlsZHJlbklnbm9yZWQgPSBjaGlsZHJlbklnbm9yZWRcblxuZnVuY3Rpb24gb3duUHJvcCAob2JqLCBmaWVsZCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgZmllbGQpXG59XG5cbnZhciBwYXRoID0gcmVxdWlyZShcInBhdGhcIilcbnZhciBtaW5pbWF0Y2ggPSByZXF1aXJlKFwibWluaW1hdGNoXCIpXG52YXIgaXNBYnNvbHV0ZSA9IHJlcXVpcmUoXCJwYXRoLWlzLWFic29sdXRlXCIpXG52YXIgTWluaW1hdGNoID0gbWluaW1hdGNoLk1pbmltYXRjaFxuXG5mdW5jdGlvbiBhbHBoYXNvcnRpIChhLCBiKSB7XG4gIHJldHVybiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpXG59XG5cbmZ1bmN0aW9uIGFscGhhc29ydCAoYSwgYikge1xuICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpXG59XG5cbmZ1bmN0aW9uIHNldHVwSWdub3JlcyAoc2VsZiwgb3B0aW9ucykge1xuICBzZWxmLmlnbm9yZSA9IG9wdGlvbnMuaWdub3JlIHx8IFtdXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGYuaWdub3JlKSlcbiAgICBzZWxmLmlnbm9yZSA9IFtzZWxmLmlnbm9yZV1cblxuICBpZiAoc2VsZi5pZ25vcmUubGVuZ3RoKSB7XG4gICAgc2VsZi5pZ25vcmUgPSBzZWxmLmlnbm9yZS5tYXAoaWdub3JlTWFwKVxuICB9XG59XG5cbi8vIGlnbm9yZSBwYXR0ZXJucyBhcmUgYWx3YXlzIGluIGRvdDp0cnVlIG1vZGUuXG5mdW5jdGlvbiBpZ25vcmVNYXAgKHBhdHRlcm4pIHtcbiAgdmFyIGdtYXRjaGVyID0gbnVsbFxuICBpZiAocGF0dGVybi5zbGljZSgtMykgPT09ICcvKionKSB7XG4gICAgdmFyIGdwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC8oXFwvXFwqXFwqKSskLywgJycpXG4gICAgZ21hdGNoZXIgPSBuZXcgTWluaW1hdGNoKGdwYXR0ZXJuLCB7IGRvdDogdHJ1ZSB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVyOiBuZXcgTWluaW1hdGNoKHBhdHRlcm4sIHsgZG90OiB0cnVlIH0pLFxuICAgIGdtYXRjaGVyOiBnbWF0Y2hlclxuICB9XG59XG5cbmZ1bmN0aW9uIHNldG9wdHMgKHNlbGYsIHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fVxuXG4gIC8vIGJhc2UtbWF0Y2hpbmc6IGp1c3QgdXNlIGdsb2JzdGFyIGZvciB0aGF0LlxuICBpZiAob3B0aW9ucy5tYXRjaEJhc2UgJiYgLTEgPT09IHBhdHRlcm4uaW5kZXhPZihcIi9cIikpIHtcbiAgICBpZiAob3B0aW9ucy5ub2dsb2JzdGFyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYXNlIG1hdGNoaW5nIHJlcXVpcmVzIGdsb2JzdGFyXCIpXG4gICAgfVxuICAgIHBhdHRlcm4gPSBcIioqL1wiICsgcGF0dGVyblxuICB9XG5cbiAgc2VsZi5zaWxlbnQgPSAhIW9wdGlvbnMuc2lsZW50XG4gIHNlbGYucGF0dGVybiA9IHBhdHRlcm5cbiAgc2VsZi5zdHJpY3QgPSBvcHRpb25zLnN0cmljdCAhPT0gZmFsc2VcbiAgc2VsZi5yZWFscGF0aCA9ICEhb3B0aW9ucy5yZWFscGF0aFxuICBzZWxmLnJlYWxwYXRoQ2FjaGUgPSBvcHRpb25zLnJlYWxwYXRoQ2FjaGUgfHwgT2JqZWN0LmNyZWF0ZShudWxsKVxuICBzZWxmLmZvbGxvdyA9ICEhb3B0aW9ucy5mb2xsb3dcbiAgc2VsZi5kb3QgPSAhIW9wdGlvbnMuZG90XG4gIHNlbGYubWFyayA9ICEhb3B0aW9ucy5tYXJrXG4gIHNlbGYubm9kaXIgPSAhIW9wdGlvbnMubm9kaXJcbiAgaWYgKHNlbGYubm9kaXIpXG4gICAgc2VsZi5tYXJrID0gdHJ1ZVxuICBzZWxmLnN5bmMgPSAhIW9wdGlvbnMuc3luY1xuICBzZWxmLm5vdW5pcXVlID0gISFvcHRpb25zLm5vdW5pcXVlXG4gIHNlbGYubm9udWxsID0gISFvcHRpb25zLm5vbnVsbFxuICBzZWxmLm5vc29ydCA9ICEhb3B0aW9ucy5ub3NvcnRcbiAgc2VsZi5ub2Nhc2UgPSAhIW9wdGlvbnMubm9jYXNlXG4gIHNlbGYuc3RhdCA9ICEhb3B0aW9ucy5zdGF0XG4gIHNlbGYubm9wcm9jZXNzID0gISFvcHRpb25zLm5vcHJvY2Vzc1xuXG4gIHNlbGYubWF4TGVuZ3RoID0gb3B0aW9ucy5tYXhMZW5ndGggfHwgSW5maW5pdHlcbiAgc2VsZi5jYWNoZSA9IG9wdGlvbnMuY2FjaGUgfHwgT2JqZWN0LmNyZWF0ZShudWxsKVxuICBzZWxmLnN0YXRDYWNoZSA9IG9wdGlvbnMuc3RhdENhY2hlIHx8IE9iamVjdC5jcmVhdGUobnVsbClcbiAgc2VsZi5zeW1saW5rcyA9IG9wdGlvbnMuc3ltbGlua3MgfHwgT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIHNldHVwSWdub3JlcyhzZWxmLCBvcHRpb25zKVxuXG4gIHNlbGYuY2hhbmdlZEN3ZCA9IGZhbHNlXG4gIHZhciBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIGlmICghb3duUHJvcChvcHRpb25zLCBcImN3ZFwiKSlcbiAgICBzZWxmLmN3ZCA9IGN3ZFxuICBlbHNlIHtcbiAgICBzZWxmLmN3ZCA9IG9wdGlvbnMuY3dkXG4gICAgc2VsZi5jaGFuZ2VkQ3dkID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMuY3dkKSAhPT0gY3dkXG4gIH1cblxuICBzZWxmLnJvb3QgPSBvcHRpb25zLnJvb3QgfHwgcGF0aC5yZXNvbHZlKHNlbGYuY3dkLCBcIi9cIilcbiAgc2VsZi5yb290ID0gcGF0aC5yZXNvbHZlKHNlbGYucm9vdClcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIilcbiAgICBzZWxmLnJvb3QgPSBzZWxmLnJvb3QucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcblxuICBzZWxmLm5vbW91bnQgPSAhIW9wdGlvbnMubm9tb3VudFxuXG4gIC8vIGRpc2FibGUgY29tbWVudHMgYW5kIG5lZ2F0aW9uIGluIE1pbmltYXRjaC5cbiAgLy8gTm90ZSB0aGF0IHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gR2xvYiBpdHNlbGYgYW55d2F5LlxuICBvcHRpb25zLm5vbmVnYXRlID0gdHJ1ZVxuICBvcHRpb25zLm5vY29tbWVudCA9IHRydWVcblxuICBzZWxmLm1pbmltYXRjaCA9IG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucylcbiAgc2VsZi5vcHRpb25zID0gc2VsZi5taW5pbWF0Y2gub3B0aW9uc1xufVxuXG5mdW5jdGlvbiBmaW5pc2ggKHNlbGYpIHtcbiAgdmFyIG5vdSA9IHNlbGYubm91bmlxdWVcbiAgdmFyIGFsbCA9IG5vdSA/IFtdIDogT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gc2VsZi5tYXRjaGVzLmxlbmd0aDsgaSA8IGw7IGkgKyspIHtcbiAgICB2YXIgbWF0Y2hlcyA9IHNlbGYubWF0Y2hlc1tpXVxuICAgIGlmICghbWF0Y2hlcyB8fCBPYmplY3Qua2V5cyhtYXRjaGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChzZWxmLm5vbnVsbCkge1xuICAgICAgICAvLyBkbyBsaWtlIHRoZSBzaGVsbCwgYW5kIHNwaXQgb3V0IHRoZSBsaXRlcmFsIGdsb2JcbiAgICAgICAgdmFyIGxpdGVyYWwgPSBzZWxmLm1pbmltYXRjaC5nbG9iU2V0W2ldXG4gICAgICAgIGlmIChub3UpXG4gICAgICAgICAgYWxsLnB1c2gobGl0ZXJhbClcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGFsbFtsaXRlcmFsXSA9IHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaGFkIG1hdGNoZXNcbiAgICAgIHZhciBtID0gT2JqZWN0LmtleXMobWF0Y2hlcylcbiAgICAgIGlmIChub3UpXG4gICAgICAgIGFsbC5wdXNoLmFwcGx5KGFsbCwgbSlcbiAgICAgIGVsc2VcbiAgICAgICAgbS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgYWxsW21dID0gdHJ1ZVxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmICghbm91KVxuICAgIGFsbCA9IE9iamVjdC5rZXlzKGFsbClcblxuICBpZiAoIXNlbGYubm9zb3J0KVxuICAgIGFsbCA9IGFsbC5zb3J0KHNlbGYubm9jYXNlID8gYWxwaGFzb3J0aSA6IGFscGhhc29ydClcblxuICAvLyBhdCAqc29tZSogcG9pbnQgd2Ugc3RhdHRlZCBhbGwgb2YgdGhlc2VcbiAgaWYgKHNlbGYubWFyaykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhbGxbaV0gPSBzZWxmLl9tYXJrKGFsbFtpXSlcbiAgICB9XG4gICAgaWYgKHNlbGYubm9kaXIpIHtcbiAgICAgIGFsbCA9IGFsbC5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuICEoL1xcLyQvLnRlc3QoZSkpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChzZWxmLmlnbm9yZS5sZW5ndGgpXG4gICAgYWxsID0gYWxsLmZpbHRlcihmdW5jdGlvbihtKSB7XG4gICAgICByZXR1cm4gIWlzSWdub3JlZChzZWxmLCBtKVxuICAgIH0pXG5cbiAgc2VsZi5mb3VuZCA9IGFsbFxufVxuXG5mdW5jdGlvbiBtYXJrIChzZWxmLCBwKSB7XG4gIHZhciBhYnMgPSBtYWtlQWJzKHNlbGYsIHApXG4gIHZhciBjID0gc2VsZi5jYWNoZVthYnNdXG4gIHZhciBtID0gcFxuICBpZiAoYykge1xuICAgIHZhciBpc0RpciA9IGMgPT09ICdESVInIHx8IEFycmF5LmlzQXJyYXkoYylcbiAgICB2YXIgc2xhc2ggPSBwLnNsaWNlKC0xKSA9PT0gJy8nXG5cbiAgICBpZiAoaXNEaXIgJiYgIXNsYXNoKVxuICAgICAgbSArPSAnLydcbiAgICBlbHNlIGlmICghaXNEaXIgJiYgc2xhc2gpXG4gICAgICBtID0gbS5zbGljZSgwLCAtMSlcblxuICAgIGlmIChtICE9PSBwKSB7XG4gICAgICB2YXIgbWFicyA9IG1ha2VBYnMoc2VsZiwgbSlcbiAgICAgIHNlbGYuc3RhdENhY2hlW21hYnNdID0gc2VsZi5zdGF0Q2FjaGVbYWJzXVxuICAgICAgc2VsZi5jYWNoZVttYWJzXSA9IHNlbGYuY2FjaGVbYWJzXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtXG59XG5cbi8vIGxvdHRhIHNpdHVwcy4uLlxuZnVuY3Rpb24gbWFrZUFicyAoc2VsZiwgZikge1xuICB2YXIgYWJzID0gZlxuICBpZiAoZi5jaGFyQXQoMCkgPT09ICcvJykge1xuICAgIGFicyA9IHBhdGguam9pbihzZWxmLnJvb3QsIGYpXG4gIH0gZWxzZSBpZiAoaXNBYnNvbHV0ZShmKSB8fCBmID09PSAnJykge1xuICAgIGFicyA9IGZcbiAgfSBlbHNlIGlmIChzZWxmLmNoYW5nZWRDd2QpIHtcbiAgICBhYnMgPSBwYXRoLnJlc29sdmUoc2VsZi5jd2QsIGYpXG4gIH0gZWxzZSB7XG4gICAgYWJzID0gcGF0aC5yZXNvbHZlKGYpXG4gIH1cbiAgcmV0dXJuIGFic1xufVxuXG5cbi8vIFJldHVybiB0cnVlLCBpZiBwYXR0ZXJuIGVuZHMgd2l0aCBnbG9ic3RhciAnKionLCBmb3IgdGhlIGFjY29tcGFueWluZyBwYXJlbnQgZGlyZWN0b3J5LlxuLy8gRXg6LSBJZiBub2RlX21vZHVsZXMvKiogaXMgdGhlIHBhdHRlcm4sIGFkZCAnbm9kZV9tb2R1bGVzJyB0byBpZ25vcmUgbGlzdCBhbG9uZyB3aXRoIGl0J3MgY29udGVudHNcbmZ1bmN0aW9uIGlzSWdub3JlZCAoc2VsZiwgcGF0aCkge1xuICBpZiAoIXNlbGYuaWdub3JlLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gc2VsZi5pZ25vcmUuc29tZShmdW5jdGlvbihpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ubWF0Y2hlci5tYXRjaChwYXRoKSB8fCAhIShpdGVtLmdtYXRjaGVyICYmIGl0ZW0uZ21hdGNoZXIubWF0Y2gocGF0aCkpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuSWdub3JlZCAoc2VsZiwgcGF0aCkge1xuICBpZiAoIXNlbGYuaWdub3JlLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gc2VsZi5pZ25vcmUuc29tZShmdW5jdGlvbihpdGVtKSB7XG4gICAgcmV0dXJuICEhKGl0ZW0uZ21hdGNoZXIgJiYgaXRlbS5nbWF0Y2hlci5tYXRjaChwYXRoKSlcbiAgfSlcbn1cbiIsIi8vIEFwcHJvYWNoOlxuLy9cbi8vIDEuIEdldCB0aGUgbWluaW1hdGNoIHNldFxuLy8gMi4gRm9yIGVhY2ggcGF0dGVybiBpbiB0aGUgc2V0LCBQUk9DRVNTKHBhdHRlcm4sIGZhbHNlKVxuLy8gMy4gU3RvcmUgbWF0Y2hlcyBwZXItc2V0LCB0aGVuIHVuaXEgdGhlbVxuLy9cbi8vIFBST0NFU1MocGF0dGVybiwgaW5HbG9iU3Rhcilcbi8vIEdldCB0aGUgZmlyc3QgW25dIGl0ZW1zIGZyb20gcGF0dGVybiB0aGF0IGFyZSBhbGwgc3RyaW5nc1xuLy8gSm9pbiB0aGVzZSB0b2dldGhlci4gIFRoaXMgaXMgUFJFRklYLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtb3JlIHJlbWFpbmluZywgdGhlbiBzdGF0KFBSRUZJWCkgYW5kXG4vLyAgIGFkZCB0byBtYXRjaGVzIGlmIGl0IHN1Y2NlZWRzLiAgRU5ELlxuLy9cbi8vIElmIGluR2xvYlN0YXIgYW5kIFBSRUZJWCBpcyBzeW1saW5rIGFuZCBwb2ludHMgdG8gZGlyXG4vLyAgIHNldCBFTlRSSUVTID0gW11cbi8vIGVsc2UgcmVhZGRpcihQUkVGSVgpIGFzIEVOVFJJRVNcbi8vICAgSWYgZmFpbCwgRU5EXG4vL1xuLy8gd2l0aCBFTlRSSUVTXG4vLyAgIElmIHBhdHRlcm5bbl0gaXMgR0xPQlNUQVJcbi8vICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGdsb2JzdGFyIG1hdGNoIGlzIGVtcHR5XG4vLyAgICAgLy8gYnkgcHJ1bmluZyBpdCBvdXQsIGFuZCB0ZXN0aW5nIHRoZSByZXN1bHRpbmcgcGF0dGVyblxuLy8gICAgIFBST0NFU1MocGF0dGVyblswLi5uXSArIHBhdHRlcm5bbisxIC4uICRdLCBmYWxzZSlcbi8vICAgICAvLyBoYW5kbGUgb3RoZXIgY2FzZXMuXG4vLyAgICAgZm9yIEVOVFJZIGluIEVOVFJJRVMgKG5vdCBkb3RmaWxlcylcbi8vICAgICAgIC8vIGF0dGFjaCBnbG9ic3RhciArIHRhaWwgb250byB0aGUgZW50cnlcbi8vICAgICAgIC8vIE1hcmsgdGhhdCB0aGlzIGVudHJ5IGlzIGEgZ2xvYnN0YXIgbWF0Y2hcbi8vICAgICAgIFBST0NFU1MocGF0dGVyblswLi5uXSArIEVOVFJZICsgcGF0dGVybltuIC4uICRdLCB0cnVlKVxuLy9cbi8vICAgZWxzZSAvLyBub3QgZ2xvYnN0YXJcbi8vICAgICBmb3IgRU5UUlkgaW4gRU5UUklFUyAobm90IGRvdGZpbGVzLCB1bmxlc3MgcGF0dGVybltuXSBpcyBkb3QpXG4vLyAgICAgICBUZXN0IEVOVFJZIGFnYWluc3QgcGF0dGVybltuXVxuLy8gICAgICAgSWYgZmFpbHMsIGNvbnRpbnVlXG4vLyAgICAgICBJZiBwYXNzZXMsIFBST0NFU1MocGF0dGVyblswLi5uXSArIGl0ZW0gKyBwYXR0ZXJuW24rMSAuLiAkXSlcbi8vXG4vLyBDYXZlYXQ6XG4vLyAgIENhY2hlIGFsbCBzdGF0cyBhbmQgcmVhZGRpcnMgcmVzdWx0cyB0byBtaW5pbWl6ZSBzeXNjYWxsLiAgU2luY2UgYWxsXG4vLyAgIHdlIGV2ZXIgY2FyZSBhYm91dCBpcyBleGlzdGVuY2UgYW5kIGRpcmVjdG9yeS1uZXNzLCB3ZSBjYW4ganVzdCBrZWVwXG4vLyAgIGB0cnVlYCBmb3IgZmlsZXMsIGFuZCBbY2hpbGRyZW4sLi4uXSBmb3IgZGlyZWN0b3JpZXMsIG9yIGBmYWxzZWAgZm9yXG4vLyAgIHRoaW5ncyB0aGF0IGRvbid0IGV4aXN0LlxuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIG1pbmltYXRjaCA9IHJlcXVpcmUoJ21pbmltYXRjaCcpXG52YXIgTWluaW1hdGNoID0gbWluaW1hdGNoLk1pbmltYXRjaFxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG52YXIgaXNBYnNvbHV0ZSA9IHJlcXVpcmUoJ3BhdGgtaXMtYWJzb2x1dGUnKVxudmFyIGdsb2JTeW5jID0gcmVxdWlyZSgnLi9zeW5jLmpzJylcbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbi5qcycpXG52YXIgYWxwaGFzb3J0ID0gY29tbW9uLmFscGhhc29ydFxudmFyIGFscGhhc29ydGkgPSBjb21tb24uYWxwaGFzb3J0aVxudmFyIHNldG9wdHMgPSBjb21tb24uc2V0b3B0c1xudmFyIG93blByb3AgPSBjb21tb24ub3duUHJvcFxudmFyIGluZmxpZ2h0ID0gcmVxdWlyZSgnaW5mbGlnaHQnKVxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJylcbnZhciBjaGlsZHJlbklnbm9yZWQgPSBjb21tb24uY2hpbGRyZW5JZ25vcmVkXG52YXIgaXNJZ25vcmVkID0gY29tbW9uLmlzSWdub3JlZFxuXG52YXIgb25jZSA9IHJlcXVpcmUoJ29uY2UnKVxuXG5mdW5jdGlvbiBnbG9iIChwYXR0ZXJuLCBvcHRpb25zLCBjYikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IHt9XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9XG5cbiAgaWYgKG9wdGlvbnMuc3luYykge1xuICAgIGlmIChjYilcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHByb3ZpZGVkIHRvIHN5bmMgZ2xvYicpXG4gICAgcmV0dXJuIGdsb2JTeW5jKHBhdHRlcm4sIG9wdGlvbnMpXG4gIH1cblxuICByZXR1cm4gbmV3IEdsb2IocGF0dGVybiwgb3B0aW9ucywgY2IpXG59XG5cbmdsb2Iuc3luYyA9IGdsb2JTeW5jXG52YXIgR2xvYlN5bmMgPSBnbG9iLkdsb2JTeW5jID0gZ2xvYlN5bmMuR2xvYlN5bmNcblxuLy8gb2xkIGFwaSBzdXJmYWNlXG5nbG9iLmdsb2IgPSBnbG9iXG5cbmZ1bmN0aW9uIGV4dGVuZCAob3JpZ2luLCBhZGQpIHtcbiAgaWYgKGFkZCA9PT0gbnVsbCB8fCB0eXBlb2YgYWRkICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvcmlnaW5cbiAgfVxuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKVxuICB2YXIgaSA9IGtleXMubGVuZ3RoXG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV1cbiAgfVxuICByZXR1cm4gb3JpZ2luXG59XG5cbmdsb2IuaGFzTWFnaWMgPSBmdW5jdGlvbiAocGF0dGVybiwgb3B0aW9uc18pIHtcbiAgdmFyIG9wdGlvbnMgPSBleHRlbmQoe30sIG9wdGlvbnNfKVxuICBvcHRpb25zLm5vcHJvY2VzcyA9IHRydWVcblxuICB2YXIgZyA9IG5ldyBHbG9iKHBhdHRlcm4sIG9wdGlvbnMpXG4gIHZhciBzZXQgPSBnLm1pbmltYXRjaC5zZXRcbiAgaWYgKHNldC5sZW5ndGggPiAxKVxuICAgIHJldHVybiB0cnVlXG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCBzZXRbMF0ubGVuZ3RoOyBqKyspIHtcbiAgICBpZiAodHlwZW9mIHNldFswXVtqXSAhPT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmdsb2IuR2xvYiA9IEdsb2JcbmluaGVyaXRzKEdsb2IsIEVFKVxuZnVuY3Rpb24gR2xvYiAocGF0dGVybiwgb3B0aW9ucywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvcHRpb25zXG4gICAgb3B0aW9ucyA9IG51bGxcbiAgfVxuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc3luYykge1xuICAgIGlmIChjYilcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHByb3ZpZGVkIHRvIHN5bmMgZ2xvYicpXG4gICAgcmV0dXJuIG5ldyBHbG9iU3luYyhwYXR0ZXJuLCBvcHRpb25zKVxuICB9XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEdsb2IpKVxuICAgIHJldHVybiBuZXcgR2xvYihwYXR0ZXJuLCBvcHRpb25zLCBjYilcblxuICBzZXRvcHRzKHRoaXMsIHBhdHRlcm4sIG9wdGlvbnMpXG4gIHRoaXMuX2RpZFJlYWxQYXRoID0gZmFsc2VcblxuICAvLyBwcm9jZXNzIGVhY2ggcGF0dGVybiBpbiB0aGUgbWluaW1hdGNoIHNldFxuICB2YXIgbiA9IHRoaXMubWluaW1hdGNoLnNldC5sZW5ndGhcblxuICAvLyBUaGUgbWF0Y2hlcyBhcmUgc3RvcmVkIGFzIHs8ZmlsZW5hbWU+OiB0cnVlLC4uLn0gc28gdGhhdFxuICAvLyBkdXBsaWNhdGVzIGFyZSBhdXRvbWFnaWNhbGx5IHBydW5lZC5cbiAgLy8gTGF0ZXIsIHdlIGRvIGFuIE9iamVjdC5rZXlzKCkgb24gdGhlc2UuXG4gIC8vIEtlZXAgdGhlbSBhcyBhIGxpc3Qgc28gd2UgY2FuIGZpbGwgaW4gd2hlbiBub251bGwgaXMgc2V0LlxuICB0aGlzLm1hdGNoZXMgPSBuZXcgQXJyYXkobilcblxuICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBvbmNlKGNiKVxuICAgIHRoaXMub24oJ2Vycm9yJywgY2IpXG4gICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKG1hdGNoZXMpIHtcbiAgICAgIGNiKG51bGwsIG1hdGNoZXMpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgbiA9IHRoaXMubWluaW1hdGNoLnNldC5sZW5ndGhcbiAgdGhpcy5fcHJvY2Vzc2luZyA9IDBcbiAgdGhpcy5tYXRjaGVzID0gbmV3IEFycmF5KG4pXG5cbiAgdGhpcy5fZW1pdFF1ZXVlID0gW11cbiAgdGhpcy5fcHJvY2Vzc1F1ZXVlID0gW11cbiAgdGhpcy5wYXVzZWQgPSBmYWxzZVxuXG4gIGlmICh0aGlzLm5vcHJvY2VzcylcbiAgICByZXR1cm4gdGhpc1xuXG4gIGlmIChuID09PSAwKVxuICAgIHJldHVybiBkb25lKClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkgKyspIHtcbiAgICB0aGlzLl9wcm9jZXNzKHRoaXMubWluaW1hdGNoLnNldFtpXSwgaSwgZmFsc2UsIGRvbmUpXG4gIH1cblxuICBmdW5jdGlvbiBkb25lICgpIHtcbiAgICAtLXNlbGYuX3Byb2Nlc3NpbmdcbiAgICBpZiAoc2VsZi5fcHJvY2Vzc2luZyA8PSAwKVxuICAgICAgc2VsZi5fZmluaXNoKClcbiAgfVxufVxuXG5HbG9iLnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICBhc3NlcnQodGhpcyBpbnN0YW5jZW9mIEdsb2IpXG4gIGlmICh0aGlzLmFib3J0ZWQpXG4gICAgcmV0dXJuXG5cbiAgaWYgKHRoaXMucmVhbHBhdGggJiYgIXRoaXMuX2RpZFJlYWxwYXRoKVxuICAgIHJldHVybiB0aGlzLl9yZWFscGF0aCgpXG5cbiAgY29tbW9uLmZpbmlzaCh0aGlzKVxuICB0aGlzLmVtaXQoJ2VuZCcsIHRoaXMuZm91bmQpXG59XG5cbkdsb2IucHJvdG90eXBlLl9yZWFscGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX2RpZFJlYWxwYXRoKVxuICAgIHJldHVyblxuXG4gIHRoaXMuX2RpZFJlYWxwYXRoID0gdHJ1ZVxuXG4gIHZhciBuID0gdGhpcy5tYXRjaGVzLmxlbmd0aFxuICBpZiAobiA9PT0gMClcbiAgICByZXR1cm4gdGhpcy5fZmluaXNoKClcblxuICB2YXIgc2VsZiA9IHRoaXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1hdGNoZXMubGVuZ3RoOyBpKyspXG4gICAgdGhpcy5fcmVhbHBhdGhTZXQoaSwgbmV4dClcblxuICBmdW5jdGlvbiBuZXh0ICgpIHtcbiAgICBpZiAoLS1uID09PSAwKVxuICAgICAgc2VsZi5fZmluaXNoKClcbiAgfVxufVxuXG5HbG9iLnByb3RvdHlwZS5fcmVhbHBhdGhTZXQgPSBmdW5jdGlvbiAoaW5kZXgsIGNiKSB7XG4gIHZhciBtYXRjaHNldCA9IHRoaXMubWF0Y2hlc1tpbmRleF1cbiAgaWYgKCFtYXRjaHNldClcbiAgICByZXR1cm4gY2IoKVxuXG4gIHZhciBmb3VuZCA9IE9iamVjdC5rZXlzKG1hdGNoc2V0KVxuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIG4gPSBmb3VuZC5sZW5ndGhcblxuICBpZiAobiA9PT0gMClcbiAgICByZXR1cm4gY2IoKVxuXG4gIHZhciBzZXQgPSB0aGlzLm1hdGNoZXNbaW5kZXhdID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICBmb3VuZC5mb3JFYWNoKGZ1bmN0aW9uIChwLCBpKSB7XG4gICAgLy8gSWYgdGhlcmUncyBhIHByb2JsZW0gd2l0aCB0aGUgc3RhdCwgdGhlbiBpdCBtZWFucyB0aGF0XG4gICAgLy8gb25lIG9yIG1vcmUgb2YgdGhlIGxpbmtzIGluIHRoZSByZWFscGF0aCBjb3VsZG4ndCBiZVxuICAgIC8vIHJlc29sdmVkLiAganVzdCByZXR1cm4gdGhlIGFicyB2YWx1ZSBpbiB0aGF0IGNhc2UuXG4gICAgcCA9IHNlbGYuX21ha2VBYnMocClcbiAgICBmcy5yZWFscGF0aChwLCBzZWxmLnJlYWxwYXRoQ2FjaGUsIGZ1bmN0aW9uIChlciwgcmVhbCkge1xuICAgICAgaWYgKCFlcilcbiAgICAgICAgc2V0W3JlYWxdID0gdHJ1ZVxuICAgICAgZWxzZSBpZiAoZXIuc3lzY2FsbCA9PT0gJ3N0YXQnKVxuICAgICAgICBzZXRbcF0gPSB0cnVlXG4gICAgICBlbHNlXG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcikgLy8gc3JzbHkgd3RmIHJpZ2h0IGhlcmVcblxuICAgICAgaWYgKC0tbiA9PT0gMCkge1xuICAgICAgICBzZWxmLm1hdGNoZXNbaW5kZXhdID0gc2V0XG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICB9KVxufVxuXG5HbG9iLnByb3RvdHlwZS5fbWFyayA9IGZ1bmN0aW9uIChwKSB7XG4gIHJldHVybiBjb21tb24ubWFyayh0aGlzLCBwKVxufVxuXG5HbG9iLnByb3RvdHlwZS5fbWFrZUFicyA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiBjb21tb24ubWFrZUFicyh0aGlzLCBmKVxufVxuXG5HbG9iLnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5hYm9ydGVkID0gdHJ1ZVxuICB0aGlzLmVtaXQoJ2Fib3J0Jylcbn1cblxuR2xvYi5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5wYXVzZWQpIHtcbiAgICB0aGlzLnBhdXNlZCA9IHRydWVcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJylcbiAgfVxufVxuXG5HbG9iLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnBhdXNlZCkge1xuICAgIHRoaXMuZW1pdCgncmVzdW1lJylcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlXG4gICAgaWYgKHRoaXMuX2VtaXRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHZhciBlcSA9IHRoaXMuX2VtaXRRdWV1ZS5zbGljZSgwKVxuICAgICAgdGhpcy5fZW1pdFF1ZXVlLmxlbmd0aCA9IDBcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXEubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgIHZhciBlID0gZXFbaV1cbiAgICAgICAgdGhpcy5fZW1pdE1hdGNoKGVbMF0sIGVbMV0pXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9wcm9jZXNzUXVldWUubGVuZ3RoKSB7XG4gICAgICB2YXIgcHEgPSB0aGlzLl9wcm9jZXNzUXVldWUuc2xpY2UoMClcbiAgICAgIHRoaXMuX3Byb2Nlc3NRdWV1ZS5sZW5ndGggPSAwXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBxLmxlbmd0aDsgaSArKykge1xuICAgICAgICB2YXIgcCA9IHBxW2ldXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NpbmctLVxuICAgICAgICB0aGlzLl9wcm9jZXNzKHBbMF0sIHBbMV0sIHBbMl0sIHBbM10pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkdsb2IucHJvdG90eXBlLl9wcm9jZXNzID0gZnVuY3Rpb24gKHBhdHRlcm4sIGluZGV4LCBpbkdsb2JTdGFyLCBjYikge1xuICBhc3NlcnQodGhpcyBpbnN0YW5jZW9mIEdsb2IpXG4gIGFzc2VydCh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG5cbiAgaWYgKHRoaXMuYWJvcnRlZClcbiAgICByZXR1cm5cblxuICB0aGlzLl9wcm9jZXNzaW5nKytcbiAgaWYgKHRoaXMucGF1c2VkKSB7XG4gICAgdGhpcy5fcHJvY2Vzc1F1ZXVlLnB1c2goW3BhdHRlcm4sIGluZGV4LCBpbkdsb2JTdGFyLCBjYl0pXG4gICAgcmV0dXJuXG4gIH1cblxuICAvL2NvbnNvbGUuZXJyb3IoJ1BST0NFU1MgJWQnLCB0aGlzLl9wcm9jZXNzaW5nLCBwYXR0ZXJuKVxuXG4gIC8vIEdldCB0aGUgZmlyc3QgW25dIHBhcnRzIG9mIHBhdHRlcm4gdGhhdCBhcmUgYWxsIHN0cmluZ3MuXG4gIHZhciBuID0gMFxuICB3aGlsZSAodHlwZW9mIHBhdHRlcm5bbl0gPT09ICdzdHJpbmcnKSB7XG4gICAgbiArK1xuICB9XG4gIC8vIG5vdyBuIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgKm5vdCogYSBzdHJpbmcuXG5cbiAgLy8gc2VlIGlmIHRoZXJlJ3MgYW55dGhpbmcgZWxzZVxuICB2YXIgcHJlZml4XG4gIHN3aXRjaCAobikge1xuICAgIC8vIGlmIG5vdCwgdGhlbiB0aGlzIGlzIHJhdGhlciBzaW1wbGVcbiAgICBjYXNlIHBhdHRlcm4ubGVuZ3RoOlxuICAgICAgdGhpcy5fcHJvY2Vzc1NpbXBsZShwYXR0ZXJuLmpvaW4oJy8nKSwgaW5kZXgsIGNiKVxuICAgICAgcmV0dXJuXG5cbiAgICBjYXNlIDA6XG4gICAgICAvLyBwYXR0ZXJuICpzdGFydHMqIHdpdGggc29tZSBub24tdHJpdmlhbCBpdGVtLlxuICAgICAgLy8gZ29pbmcgdG8gcmVhZGRpcihjd2QpLCBidXQgbm90IGluY2x1ZGUgdGhlIHByZWZpeCBpbiBtYXRjaGVzLlxuICAgICAgcHJlZml4ID0gbnVsbFxuICAgICAgYnJlYWtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBwYXR0ZXJuIGhhcyBzb21lIHN0cmluZyBiaXRzIGluIHRoZSBmcm9udC5cbiAgICAgIC8vIHdoYXRldmVyIGl0IHN0YXJ0cyB3aXRoLCB3aGV0aGVyIHRoYXQncyAnYWJzb2x1dGUnIGxpa2UgL2Zvby9iYXIsXG4gICAgICAvLyBvciAncmVsYXRpdmUnIGxpa2UgJy4uL2JheidcbiAgICAgIHByZWZpeCA9IHBhdHRlcm4uc2xpY2UoMCwgbikuam9pbignLycpXG4gICAgICBicmVha1xuICB9XG5cbiAgdmFyIHJlbWFpbiA9IHBhdHRlcm4uc2xpY2UobilcblxuICAvLyBnZXQgdGhlIGxpc3Qgb2YgZW50cmllcy5cbiAgdmFyIHJlYWRcbiAgaWYgKHByZWZpeCA9PT0gbnVsbClcbiAgICByZWFkID0gJy4nXG4gIGVsc2UgaWYgKGlzQWJzb2x1dGUocHJlZml4KSB8fCBpc0Fic29sdXRlKHBhdHRlcm4uam9pbignLycpKSkge1xuICAgIGlmICghcHJlZml4IHx8ICFpc0Fic29sdXRlKHByZWZpeCkpXG4gICAgICBwcmVmaXggPSAnLycgKyBwcmVmaXhcbiAgICByZWFkID0gcHJlZml4XG4gIH0gZWxzZVxuICAgIHJlYWQgPSBwcmVmaXhcblxuICB2YXIgYWJzID0gdGhpcy5fbWFrZUFicyhyZWFkKVxuXG4gIC8vaWYgaWdub3JlZCwgc2tpcCBfcHJvY2Vzc2luZ1xuICBpZiAoY2hpbGRyZW5JZ25vcmVkKHRoaXMsIHJlYWQpKVxuICAgIHJldHVybiBjYigpXG5cbiAgdmFyIGlzR2xvYlN0YXIgPSByZW1haW5bMF0gPT09IG1pbmltYXRjaC5HTE9CU1RBUlxuICBpZiAoaXNHbG9iU3RhcilcbiAgICB0aGlzLl9wcm9jZXNzR2xvYlN0YXIocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIsIGNiKVxuICBlbHNlXG4gICAgdGhpcy5fcHJvY2Vzc1JlYWRkaXIocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIsIGNiKVxufVxuXG5HbG9iLnByb3RvdHlwZS5fcHJvY2Vzc1JlYWRkaXIgPSBmdW5jdGlvbiAocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIsIGNiKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB0aGlzLl9yZWFkZGlyKGFicywgaW5HbG9iU3RhciwgZnVuY3Rpb24gKGVyLCBlbnRyaWVzKSB7XG4gICAgcmV0dXJuIHNlbGYuX3Byb2Nlc3NSZWFkZGlyMihwcmVmaXgsIHJlYWQsIGFicywgcmVtYWluLCBpbmRleCwgaW5HbG9iU3RhciwgZW50cmllcywgY2IpXG4gIH0pXG59XG5cbkdsb2IucHJvdG90eXBlLl9wcm9jZXNzUmVhZGRpcjIgPSBmdW5jdGlvbiAocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIsIGVudHJpZXMsIGNiKSB7XG5cbiAgLy8gaWYgdGhlIGFicyBpc24ndCBhIGRpciwgdGhlbiBub3RoaW5nIGNhbiBtYXRjaCFcbiAgaWYgKCFlbnRyaWVzKVxuICAgIHJldHVybiBjYigpXG5cbiAgLy8gSXQgd2lsbCBvbmx5IG1hdGNoIGRvdCBlbnRyaWVzIGlmIGl0IHN0YXJ0cyB3aXRoIGEgZG90LCBvciBpZlxuICAvLyBkb3QgaXMgc2V0LiAgU3R1ZmYgbGlrZSBAKC5mb298LmJhcikgaXNuJ3QgYWxsb3dlZC5cbiAgdmFyIHBuID0gcmVtYWluWzBdXG4gIHZhciBuZWdhdGUgPSAhIXRoaXMubWluaW1hdGNoLm5lZ2F0ZVxuICB2YXIgcmF3R2xvYiA9IHBuLl9nbG9iXG4gIHZhciBkb3RPayA9IHRoaXMuZG90IHx8IHJhd0dsb2IuY2hhckF0KDApID09PSAnLidcblxuICB2YXIgbWF0Y2hlZEVudHJpZXMgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZSA9IGVudHJpZXNbaV1cbiAgICBpZiAoZS5jaGFyQXQoMCkgIT09ICcuJyB8fCBkb3RPaykge1xuICAgICAgdmFyIG1cbiAgICAgIGlmIChuZWdhdGUgJiYgIXByZWZpeCkge1xuICAgICAgICBtID0gIWUubWF0Y2gocG4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtID0gZS5tYXRjaChwbilcbiAgICAgIH1cbiAgICAgIGlmIChtKVxuICAgICAgICBtYXRjaGVkRW50cmllcy5wdXNoKGUpXG4gICAgfVxuICB9XG5cbiAgLy9jb25zb2xlLmVycm9yKCdwcmQyJywgcHJlZml4LCBlbnRyaWVzLCByZW1haW5bMF0uX2dsb2IsIG1hdGNoZWRFbnRyaWVzKVxuXG4gIHZhciBsZW4gPSBtYXRjaGVkRW50cmllcy5sZW5ndGhcbiAgLy8gSWYgdGhlcmUgYXJlIG5vIG1hdGNoZWQgZW50cmllcywgdGhlbiBub3RoaW5nIG1hdGNoZXMuXG4gIGlmIChsZW4gPT09IDApXG4gICAgcmV0dXJuIGNiKClcblxuICAvLyBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlbWFpbmluZyBwYXR0ZXJuIGJpdCwgdGhlbiBubyBuZWVkIGZvclxuICAvLyBhbiBhZGRpdGlvbmFsIHN0YXQgKnVubGVzcyogdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBtYXJrIG9yXG4gIC8vIHN0YXQgZXhwbGljaXRseS4gIFdlIGtub3cgdGhleSBleGlzdCwgc2luY2UgcmVhZGRpciByZXR1cm5lZFxuICAvLyB0aGVtLlxuXG4gIGlmIChyZW1haW4ubGVuZ3RoID09PSAxICYmICF0aGlzLm1hcmsgJiYgIXRoaXMuc3RhdCkge1xuICAgIGlmICghdGhpcy5tYXRjaGVzW2luZGV4XSlcbiAgICAgIHRoaXMubWF0Y2hlc1tpbmRleF0gPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArKykge1xuICAgICAgdmFyIGUgPSBtYXRjaGVkRW50cmllc1tpXVxuICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICBpZiAocHJlZml4ICE9PSAnLycpXG4gICAgICAgICAgZSA9IHByZWZpeCArICcvJyArIGVcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGUgPSBwcmVmaXggKyBlXG4gICAgICB9XG5cbiAgICAgIGlmIChlLmNoYXJBdCgwKSA9PT0gJy8nICYmICF0aGlzLm5vbW91bnQpIHtcbiAgICAgICAgZSA9IHBhdGguam9pbih0aGlzLnJvb3QsIGUpXG4gICAgICB9XG4gICAgICB0aGlzLl9lbWl0TWF0Y2goaW5kZXgsIGUpXG4gICAgfVxuICAgIC8vIFRoaXMgd2FzIHRoZSBsYXN0IG9uZSwgYW5kIG5vIHN0YXRzIHdlcmUgbmVlZGVkXG4gICAgcmV0dXJuIGNiKClcbiAgfVxuXG4gIC8vIG5vdyB0ZXN0IGFsbCBtYXRjaGVkIGVudHJpZXMgYXMgc3RhbmQtaW5zIGZvciB0aGF0IHBhcnRcbiAgLy8gb2YgdGhlIHBhdHRlcm4uXG4gIHJlbWFpbi5zaGlmdCgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7XG4gICAgdmFyIGUgPSBtYXRjaGVkRW50cmllc1tpXVxuICAgIHZhciBuZXdQYXR0ZXJuXG4gICAgaWYgKHByZWZpeCkge1xuICAgICAgaWYgKHByZWZpeCAhPT0gJy8nKVxuICAgICAgICBlID0gcHJlZml4ICsgJy8nICsgZVxuICAgICAgZWxzZVxuICAgICAgICBlID0gcHJlZml4ICsgZVxuICAgIH1cbiAgICB0aGlzLl9wcm9jZXNzKFtlXS5jb25jYXQocmVtYWluKSwgaW5kZXgsIGluR2xvYlN0YXIsIGNiKVxuICB9XG4gIGNiKClcbn1cblxuR2xvYi5wcm90b3R5cGUuX2VtaXRNYXRjaCA9IGZ1bmN0aW9uIChpbmRleCwgZSkge1xuICBpZiAodGhpcy5hYm9ydGVkKVxuICAgIHJldHVyblxuXG4gIGlmICh0aGlzLm1hdGNoZXNbaW5kZXhdW2VdKVxuICAgIHJldHVyblxuXG4gIGlmIChpc0lnbm9yZWQodGhpcywgZSkpXG4gICAgcmV0dXJuXG5cbiAgaWYgKHRoaXMucGF1c2VkKSB7XG4gICAgdGhpcy5fZW1pdFF1ZXVlLnB1c2goW2luZGV4LCBlXSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBhYnMgPSB0aGlzLl9tYWtlQWJzKGUpXG5cbiAgaWYgKHRoaXMubm9kaXIpIHtcbiAgICB2YXIgYyA9IHRoaXMuY2FjaGVbYWJzXVxuICAgIGlmIChjID09PSAnRElSJyB8fCBBcnJheS5pc0FycmF5KGMpKVxuICAgICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGhpcy5tYXJrKVxuICAgIGUgPSB0aGlzLl9tYXJrKGUpXG5cbiAgdGhpcy5tYXRjaGVzW2luZGV4XVtlXSA9IHRydWVcblxuICB2YXIgc3QgPSB0aGlzLnN0YXRDYWNoZVthYnNdXG4gIGlmIChzdClcbiAgICB0aGlzLmVtaXQoJ3N0YXQnLCBlLCBzdClcblxuICB0aGlzLmVtaXQoJ21hdGNoJywgZSlcbn1cblxuR2xvYi5wcm90b3R5cGUuX3JlYWRkaXJJbkdsb2JTdGFyID0gZnVuY3Rpb24gKGFicywgY2IpIHtcbiAgaWYgKHRoaXMuYWJvcnRlZClcbiAgICByZXR1cm5cblxuICAvLyBmb2xsb3cgYWxsIHN5bWxpbmtlZCBkaXJlY3RvcmllcyBmb3JldmVyXG4gIC8vIGp1c3QgcHJvY2VlZCBhcyBpZiB0aGlzIGlzIGEgbm9uLWdsb2JzdGFyIHNpdHVhdGlvblxuICBpZiAodGhpcy5mb2xsb3cpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRkaXIoYWJzLCBmYWxzZSwgY2IpXG5cbiAgdmFyIGxzdGF0a2V5ID0gJ2xzdGF0XFwwJyArIGFic1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGxzdGF0Y2IgPSBpbmZsaWdodChsc3RhdGtleSwgbHN0YXRjYl8pXG5cbiAgaWYgKGxzdGF0Y2IpXG4gICAgZnMubHN0YXQoYWJzLCBsc3RhdGNiKVxuXG4gIGZ1bmN0aW9uIGxzdGF0Y2JfIChlciwgbHN0YXQpIHtcbiAgICBpZiAoZXIpXG4gICAgICByZXR1cm4gY2IoKVxuXG4gICAgdmFyIGlzU3ltID0gbHN0YXQuaXNTeW1ib2xpY0xpbmsoKVxuICAgIHNlbGYuc3ltbGlua3NbYWJzXSA9IGlzU3ltXG5cbiAgICAvLyBJZiBpdCdzIG5vdCBhIHN5bWxpbmsgb3IgYSBkaXIsIHRoZW4gaXQncyBkZWZpbml0ZWx5IGEgcmVndWxhciBmaWxlLlxuICAgIC8vIGRvbid0IGJvdGhlciBkb2luZyBhIHJlYWRkaXIgaW4gdGhhdCBjYXNlLlxuICAgIGlmICghaXNTeW0gJiYgIWxzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHNlbGYuY2FjaGVbYWJzXSA9ICdGSUxFJ1xuICAgICAgY2IoKVxuICAgIH0gZWxzZVxuICAgICAgc2VsZi5fcmVhZGRpcihhYnMsIGZhbHNlLCBjYilcbiAgfVxufVxuXG5HbG9iLnByb3RvdHlwZS5fcmVhZGRpciA9IGZ1bmN0aW9uIChhYnMsIGluR2xvYlN0YXIsIGNiKSB7XG4gIGlmICh0aGlzLmFib3J0ZWQpXG4gICAgcmV0dXJuXG5cbiAgY2IgPSBpbmZsaWdodCgncmVhZGRpclxcMCcrYWJzKydcXDAnK2luR2xvYlN0YXIsIGNiKVxuICBpZiAoIWNiKVxuICAgIHJldHVyblxuXG4gIC8vY29uc29sZS5lcnJvcignUkQgJWogJWonLCAraW5HbG9iU3RhciwgYWJzKVxuICBpZiAoaW5HbG9iU3RhciAmJiAhb3duUHJvcCh0aGlzLnN5bWxpbmtzLCBhYnMpKVxuICAgIHJldHVybiB0aGlzLl9yZWFkZGlySW5HbG9iU3RhcihhYnMsIGNiKVxuXG4gIGlmIChvd25Qcm9wKHRoaXMuY2FjaGUsIGFicykpIHtcbiAgICB2YXIgYyA9IHRoaXMuY2FjaGVbYWJzXVxuICAgIGlmICghYyB8fCBjID09PSAnRklMRScpXG4gICAgICByZXR1cm4gY2IoKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpXG4gICAgICByZXR1cm4gY2IobnVsbCwgYylcbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpc1xuICBmcy5yZWFkZGlyKGFicywgcmVhZGRpckNiKHRoaXMsIGFicywgY2IpKVxufVxuXG5mdW5jdGlvbiByZWFkZGlyQ2IgKHNlbGYsIGFicywgY2IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChlciwgZW50cmllcykge1xuICAgIGlmIChlcilcbiAgICAgIHNlbGYuX3JlYWRkaXJFcnJvcihhYnMsIGVyLCBjYilcbiAgICBlbHNlXG4gICAgICBzZWxmLl9yZWFkZGlyRW50cmllcyhhYnMsIGVudHJpZXMsIGNiKVxuICB9XG59XG5cbkdsb2IucHJvdG90eXBlLl9yZWFkZGlyRW50cmllcyA9IGZ1bmN0aW9uIChhYnMsIGVudHJpZXMsIGNiKSB7XG4gIGlmICh0aGlzLmFib3J0ZWQpXG4gICAgcmV0dXJuXG5cbiAgLy8gaWYgd2UgaGF2ZW4ndCBhc2tlZCB0byBzdGF0IGV2ZXJ5dGhpbmcsIHRoZW4ganVzdFxuICAvLyBhc3N1bWUgdGhhdCBldmVyeXRoaW5nIGluIHRoZXJlIGV4aXN0cywgc28gd2UgY2FuIGF2b2lkXG4gIC8vIGhhdmluZyB0byBzdGF0IGl0IGEgc2Vjb25kIHRpbWUuXG4gIGlmICghdGhpcy5tYXJrICYmICF0aGlzLnN0YXQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICB2YXIgZSA9IGVudHJpZXNbaV1cbiAgICAgIGlmIChhYnMgPT09ICcvJylcbiAgICAgICAgZSA9IGFicyArIGVcbiAgICAgIGVsc2VcbiAgICAgICAgZSA9IGFicyArICcvJyArIGVcbiAgICAgIHRoaXMuY2FjaGVbZV0gPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgdGhpcy5jYWNoZVthYnNdID0gZW50cmllc1xuICByZXR1cm4gY2IobnVsbCwgZW50cmllcylcbn1cblxuR2xvYi5wcm90b3R5cGUuX3JlYWRkaXJFcnJvciA9IGZ1bmN0aW9uIChmLCBlciwgY2IpIHtcbiAgaWYgKHRoaXMuYWJvcnRlZClcbiAgICByZXR1cm5cblxuICAvLyBoYW5kbGUgZXJyb3JzLCBhbmQgY2FjaGUgdGhlIGluZm9ybWF0aW9uXG4gIHN3aXRjaCAoZXIuY29kZSkge1xuICAgIGNhc2UgJ0VOT1RTVVAnOiAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ2xvYi9pc3N1ZXMvMjA1XG4gICAgY2FzZSAnRU5PVERJUic6IC8vIHRvdGFsbHkgbm9ybWFsLiBtZWFucyBpdCAqZG9lcyogZXhpc3QuXG4gICAgICB0aGlzLmNhY2hlW3RoaXMuX21ha2VBYnMoZildID0gJ0ZJTEUnXG4gICAgICBicmVha1xuXG4gICAgY2FzZSAnRU5PRU5UJzogLy8gbm90IHRlcnJpYmx5IHVudXN1YWxcbiAgICBjYXNlICdFTE9PUCc6XG4gICAgY2FzZSAnRU5BTUVUT09MT05HJzpcbiAgICBjYXNlICdVTktOT1dOJzpcbiAgICAgIHRoaXMuY2FjaGVbdGhpcy5fbWFrZUFicyhmKV0gPSBmYWxzZVxuICAgICAgYnJlYWtcblxuICAgIGRlZmF1bHQ6IC8vIHNvbWUgdW51c3VhbCBlcnJvci4gIFRyZWF0IGFzIGZhaWx1cmUuXG4gICAgICB0aGlzLmNhY2hlW3RoaXMuX21ha2VBYnMoZildID0gZmFsc2VcbiAgICAgIGlmICh0aGlzLnN0cmljdCkge1xuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXIpXG4gICAgICAgIC8vIElmIHRoZSBlcnJvciBpcyBoYW5kbGVkLCB0aGVuIHdlIGFib3J0XG4gICAgICAgIC8vIGlmIG5vdCwgd2UgdGhyZXcgb3V0IG9mIGhlcmVcbiAgICAgICAgdGhpcy5hYm9ydCgpXG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuc2lsZW50KVxuICAgICAgICBjb25zb2xlLmVycm9yKCdnbG9iIGVycm9yJywgZXIpXG4gICAgICBicmVha1xuICB9XG5cbiAgcmV0dXJuIGNiKClcbn1cblxuR2xvYi5wcm90b3R5cGUuX3Byb2Nlc3NHbG9iU3RhciA9IGZ1bmN0aW9uIChwcmVmaXgsIHJlYWQsIGFicywgcmVtYWluLCBpbmRleCwgaW5HbG9iU3RhciwgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHRoaXMuX3JlYWRkaXIoYWJzLCBpbkdsb2JTdGFyLCBmdW5jdGlvbiAoZXIsIGVudHJpZXMpIHtcbiAgICBzZWxmLl9wcm9jZXNzR2xvYlN0YXIyKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyLCBlbnRyaWVzLCBjYilcbiAgfSlcbn1cblxuXG5HbG9iLnByb3RvdHlwZS5fcHJvY2Vzc0dsb2JTdGFyMiA9IGZ1bmN0aW9uIChwcmVmaXgsIHJlYWQsIGFicywgcmVtYWluLCBpbmRleCwgaW5HbG9iU3RhciwgZW50cmllcywgY2IpIHtcbiAgLy9jb25zb2xlLmVycm9yKCdwZ3MyJywgcHJlZml4LCByZW1haW5bMF0sIGVudHJpZXMpXG5cbiAgLy8gbm8gZW50cmllcyBtZWFucyBub3QgYSBkaXIsIHNvIGl0IGNhbiBuZXZlciBoYXZlIG1hdGNoZXNcbiAgLy8gZm9vLnR4dC8qKiBkb2Vzbid0IG1hdGNoIGZvby50eHRcbiAgaWYgKCFlbnRyaWVzKVxuICAgIHJldHVybiBjYigpXG5cbiAgLy8gdGVzdCB3aXRob3V0IHRoZSBnbG9ic3RhciwgYW5kIHdpdGggZXZlcnkgY2hpbGQgYm90aCBiZWxvd1xuICAvLyBhbmQgcmVwbGFjaW5nIHRoZSBnbG9ic3Rhci5cbiAgdmFyIHJlbWFpbldpdGhvdXRHbG9iU3RhciA9IHJlbWFpbi5zbGljZSgxKVxuICB2YXIgZ3NwcmVmID0gcHJlZml4ID8gWyBwcmVmaXggXSA6IFtdXG4gIHZhciBub0dsb2JTdGFyID0gZ3NwcmVmLmNvbmNhdChyZW1haW5XaXRob3V0R2xvYlN0YXIpXG5cbiAgLy8gdGhlIG5vR2xvYlN0YXIgcGF0dGVybiBleGl0cyB0aGUgaW5HbG9iU3RhciBzdGF0ZVxuICB0aGlzLl9wcm9jZXNzKG5vR2xvYlN0YXIsIGluZGV4LCBmYWxzZSwgY2IpXG5cbiAgdmFyIGlzU3ltID0gdGhpcy5zeW1saW5rc1thYnNdXG4gIHZhciBsZW4gPSBlbnRyaWVzLmxlbmd0aFxuXG4gIC8vIElmIGl0J3MgYSBzeW1saW5rLCBhbmQgd2UncmUgaW4gYSBnbG9ic3RhciwgdGhlbiBzdG9wXG4gIGlmIChpc1N5bSAmJiBpbkdsb2JTdGFyKVxuICAgIHJldHVybiBjYigpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBlID0gZW50cmllc1tpXVxuICAgIGlmIChlLmNoYXJBdCgwKSA9PT0gJy4nICYmICF0aGlzLmRvdClcbiAgICAgIGNvbnRpbnVlXG5cbiAgICAvLyB0aGVzZSB0d28gY2FzZXMgZW50ZXIgdGhlIGluR2xvYlN0YXIgc3RhdGVcbiAgICB2YXIgaW5zdGVhZCA9IGdzcHJlZi5jb25jYXQoZW50cmllc1tpXSwgcmVtYWluV2l0aG91dEdsb2JTdGFyKVxuICAgIHRoaXMuX3Byb2Nlc3MoaW5zdGVhZCwgaW5kZXgsIHRydWUsIGNiKVxuXG4gICAgdmFyIGJlbG93ID0gZ3NwcmVmLmNvbmNhdChlbnRyaWVzW2ldLCByZW1haW4pXG4gICAgdGhpcy5fcHJvY2VzcyhiZWxvdywgaW5kZXgsIHRydWUsIGNiKVxuICB9XG5cbiAgY2IoKVxufVxuXG5HbG9iLnByb3RvdHlwZS5fcHJvY2Vzc1NpbXBsZSA9IGZ1bmN0aW9uIChwcmVmaXgsIGluZGV4LCBjYikge1xuICAvLyBYWFggcmV2aWV3IHRoaXMuICBTaG91bGRuJ3QgaXQgYmUgZG9pbmcgdGhlIG1vdW50aW5nIGV0Y1xuICAvLyBiZWZvcmUgZG9pbmcgc3RhdD8gIGtpbmRhIHdlaXJkP1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdGhpcy5fc3RhdChwcmVmaXgsIGZ1bmN0aW9uIChlciwgZXhpc3RzKSB7XG4gICAgc2VsZi5fcHJvY2Vzc1NpbXBsZTIocHJlZml4LCBpbmRleCwgZXIsIGV4aXN0cywgY2IpXG4gIH0pXG59XG5HbG9iLnByb3RvdHlwZS5fcHJvY2Vzc1NpbXBsZTIgPSBmdW5jdGlvbiAocHJlZml4LCBpbmRleCwgZXIsIGV4aXN0cywgY2IpIHtcblxuICAvL2NvbnNvbGUuZXJyb3IoJ3BzMicsIHByZWZpeCwgZXhpc3RzKVxuXG4gIGlmICghdGhpcy5tYXRjaGVzW2luZGV4XSlcbiAgICB0aGlzLm1hdGNoZXNbaW5kZXhdID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIC8vIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4ganVzdCBtYXJrIHRoZSBsYWNrIG9mIHJlc3VsdHNcbiAgaWYgKCFleGlzdHMpXG4gICAgcmV0dXJuIGNiKClcblxuICBpZiAocHJlZml4ICYmIGlzQWJzb2x1dGUocHJlZml4KSAmJiAhdGhpcy5ub21vdW50KSB7XG4gICAgdmFyIHRyYWlsID0gL1tcXC9cXFxcXSQvLnRlc3QocHJlZml4KVxuICAgIGlmIChwcmVmaXguY2hhckF0KDApID09PSAnLycpIHtcbiAgICAgIHByZWZpeCA9IHBhdGguam9pbih0aGlzLnJvb3QsIHByZWZpeClcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZml4ID0gcGF0aC5yZXNvbHZlKHRoaXMucm9vdCwgcHJlZml4KVxuICAgICAgaWYgKHRyYWlsKVxuICAgICAgICBwcmVmaXggKz0gJy8nXG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpXG4gICAgcHJlZml4ID0gcHJlZml4LnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuXG4gIC8vIE1hcmsgdGhpcyBhcyBhIG1hdGNoXG4gIHRoaXMuX2VtaXRNYXRjaChpbmRleCwgcHJlZml4KVxuICBjYigpXG59XG5cbi8vIFJldHVybnMgZWl0aGVyICdESVInLCAnRklMRScsIG9yIGZhbHNlXG5HbG9iLnByb3RvdHlwZS5fc3RhdCA9IGZ1bmN0aW9uIChmLCBjYikge1xuICB2YXIgYWJzID0gdGhpcy5fbWFrZUFicyhmKVxuICB2YXIgbmVlZERpciA9IGYuc2xpY2UoLTEpID09PSAnLydcblxuICBpZiAoZi5sZW5ndGggPiB0aGlzLm1heExlbmd0aClcbiAgICByZXR1cm4gY2IoKVxuXG4gIGlmICghdGhpcy5zdGF0ICYmIG93blByb3AodGhpcy5jYWNoZSwgYWJzKSkge1xuICAgIHZhciBjID0gdGhpcy5jYWNoZVthYnNdXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSlcbiAgICAgIGMgPSAnRElSJ1xuXG4gICAgLy8gSXQgZXhpc3RzLCBidXQgbWF5YmUgbm90IGhvdyB3ZSBuZWVkIGl0XG4gICAgaWYgKCFuZWVkRGlyIHx8IGMgPT09ICdESVInKVxuICAgICAgcmV0dXJuIGNiKG51bGwsIGMpXG5cbiAgICBpZiAobmVlZERpciAmJiBjID09PSAnRklMRScpXG4gICAgICByZXR1cm4gY2IoKVxuXG4gICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgdG8gc3RhdCwgYmVjYXVzZSBtYXliZSBjPXRydWVcbiAgICAvLyBpZiB3ZSBrbm93IGl0IGV4aXN0cywgYnV0IG5vdCB3aGF0IGl0IGlzLlxuICB9XG5cbiAgdmFyIGV4aXN0c1xuICB2YXIgc3RhdCA9IHRoaXMuc3RhdENhY2hlW2Fic11cbiAgaWYgKHN0YXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0ID09PSBmYWxzZSlcbiAgICAgIHJldHVybiBjYihudWxsLCBzdGF0KVxuICAgIGVsc2Uge1xuICAgICAgdmFyIHR5cGUgPSBzdGF0LmlzRGlyZWN0b3J5KCkgPyAnRElSJyA6ICdGSUxFJ1xuICAgICAgaWYgKG5lZWREaXIgJiYgdHlwZSA9PT0gJ0ZJTEUnKVxuICAgICAgICByZXR1cm4gY2IoKVxuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gY2IobnVsbCwgdHlwZSwgc3RhdClcbiAgICB9XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIHN0YXRjYiA9IGluZmxpZ2h0KCdzdGF0XFwwJyArIGFicywgbHN0YXRjYl8pXG4gIGlmIChzdGF0Y2IpXG4gICAgZnMubHN0YXQoYWJzLCBzdGF0Y2IpXG5cbiAgZnVuY3Rpb24gbHN0YXRjYl8gKGVyLCBsc3RhdCkge1xuICAgIGlmIChsc3RhdCAmJiBsc3RhdC5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAvLyBJZiBpdCdzIGEgc3ltbGluaywgdGhlbiB0cmVhdCBpdCBhcyB0aGUgdGFyZ2V0LCB1bmxlc3NcbiAgICAgIC8vIHRoZSB0YXJnZXQgZG9lcyBub3QgZXhpc3QsIHRoZW4gdHJlYXQgaXQgYXMgYSBmaWxlLlxuICAgICAgcmV0dXJuIGZzLnN0YXQoYWJzLCBmdW5jdGlvbiAoZXIsIHN0YXQpIHtcbiAgICAgICAgaWYgKGVyKVxuICAgICAgICAgIHNlbGYuX3N0YXQyKGYsIGFicywgbnVsbCwgbHN0YXQsIGNiKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgc2VsZi5fc3RhdDIoZiwgYWJzLCBlciwgc3RhdCwgY2IpXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLl9zdGF0MihmLCBhYnMsIGVyLCBsc3RhdCwgY2IpXG4gICAgfVxuICB9XG59XG5cbkdsb2IucHJvdG90eXBlLl9zdGF0MiA9IGZ1bmN0aW9uIChmLCBhYnMsIGVyLCBzdGF0LCBjYikge1xuICBpZiAoZXIpIHtcbiAgICB0aGlzLnN0YXRDYWNoZVthYnNdID0gZmFsc2VcbiAgICByZXR1cm4gY2IoKVxuICB9XG5cbiAgdmFyIG5lZWREaXIgPSBmLnNsaWNlKC0xKSA9PT0gJy8nXG4gIHRoaXMuc3RhdENhY2hlW2Fic10gPSBzdGF0XG5cbiAgaWYgKGFicy5zbGljZSgtMSkgPT09ICcvJyAmJiAhc3RhdC5pc0RpcmVjdG9yeSgpKVxuICAgIHJldHVybiBjYihudWxsLCBmYWxzZSwgc3RhdClcblxuICB2YXIgYyA9IHN0YXQuaXNEaXJlY3RvcnkoKSA/ICdESVInIDogJ0ZJTEUnXG4gIHRoaXMuY2FjaGVbYWJzXSA9IHRoaXMuY2FjaGVbYWJzXSB8fCBjXG5cbiAgaWYgKG5lZWREaXIgJiYgYyAhPT0gJ0RJUicpXG4gICAgcmV0dXJuIGNiKClcblxuICByZXR1cm4gY2IobnVsbCwgYywgc3RhdClcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZ2xvYlN5bmNcbmdsb2JTeW5jLkdsb2JTeW5jID0gR2xvYlN5bmNcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIG1pbmltYXRjaCA9IHJlcXVpcmUoJ21pbmltYXRjaCcpXG52YXIgTWluaW1hdGNoID0gbWluaW1hdGNoLk1pbmltYXRjaFxudmFyIEdsb2IgPSByZXF1aXJlKCcuL2dsb2IuanMnKS5HbG9iXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKVxudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJylcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxudmFyIGlzQWJzb2x1dGUgPSByZXF1aXJlKCdwYXRoLWlzLWFic29sdXRlJylcbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbi5qcycpXG52YXIgYWxwaGFzb3J0ID0gY29tbW9uLmFscGhhc29ydFxudmFyIGFscGhhc29ydGkgPSBjb21tb24uYWxwaGFzb3J0aVxudmFyIHNldG9wdHMgPSBjb21tb24uc2V0b3B0c1xudmFyIG93blByb3AgPSBjb21tb24ub3duUHJvcFxudmFyIGNoaWxkcmVuSWdub3JlZCA9IGNvbW1vbi5jaGlsZHJlbklnbm9yZWRcblxuZnVuY3Rpb24gZ2xvYlN5bmMgKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDMpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgcHJvdmlkZWQgdG8gc3luYyBnbG9iXFxuJytcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1nbG9iL2lzc3Vlcy8xNjcnKVxuXG4gIHJldHVybiBuZXcgR2xvYlN5bmMocGF0dGVybiwgb3B0aW9ucykuZm91bmRcbn1cblxuZnVuY3Rpb24gR2xvYlN5bmMgKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgaWYgKCFwYXR0ZXJuKVxuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIHBhdHRlcm4nKVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAzKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIHByb3ZpZGVkIHRvIHN5bmMgZ2xvYlxcbicrXG4gICAgICAgICAgICAgICAgICAgICAgICAnU2VlOiBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ2xvYi9pc3N1ZXMvMTY3JylcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgR2xvYlN5bmMpKVxuICAgIHJldHVybiBuZXcgR2xvYlN5bmMocGF0dGVybiwgb3B0aW9ucylcblxuICBzZXRvcHRzKHRoaXMsIHBhdHRlcm4sIG9wdGlvbnMpXG5cbiAgaWYgKHRoaXMubm9wcm9jZXNzKVxuICAgIHJldHVybiB0aGlzXG5cbiAgdmFyIG4gPSB0aGlzLm1pbmltYXRjaC5zZXQubGVuZ3RoXG4gIHRoaXMubWF0Y2hlcyA9IG5ldyBBcnJheShuKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkgKyspIHtcbiAgICB0aGlzLl9wcm9jZXNzKHRoaXMubWluaW1hdGNoLnNldFtpXSwgaSwgZmFsc2UpXG4gIH1cbiAgdGhpcy5fZmluaXNoKClcbn1cblxuR2xvYlN5bmMucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gIGFzc2VydCh0aGlzIGluc3RhbmNlb2YgR2xvYlN5bmMpXG4gIGlmICh0aGlzLnJlYWxwYXRoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgdGhpcy5tYXRjaGVzLmZvckVhY2goZnVuY3Rpb24gKG1hdGNoc2V0LCBpbmRleCkge1xuICAgICAgdmFyIHNldCA9IHNlbGYubWF0Y2hlc1tpbmRleF0gPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgICBmb3IgKHZhciBwIGluIG1hdGNoc2V0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcCA9IHNlbGYuX21ha2VBYnMocClcbiAgICAgICAgICB2YXIgcmVhbCA9IGZzLnJlYWxwYXRoU3luYyhwLCBzZWxmLnJlYWxwYXRoQ2FjaGUpXG4gICAgICAgICAgc2V0W3JlYWxdID0gdHJ1ZVxuICAgICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICAgIGlmIChlci5zeXNjYWxsID09PSAnc3RhdCcpXG4gICAgICAgICAgICBzZXRbc2VsZi5fbWFrZUFicyhwKV0gPSB0cnVlXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgY29tbW9uLmZpbmlzaCh0aGlzKVxufVxuXG5cbkdsb2JTeW5jLnByb3RvdHlwZS5fcHJvY2VzcyA9IGZ1bmN0aW9uIChwYXR0ZXJuLCBpbmRleCwgaW5HbG9iU3Rhcikge1xuICBhc3NlcnQodGhpcyBpbnN0YW5jZW9mIEdsb2JTeW5jKVxuXG4gIC8vIEdldCB0aGUgZmlyc3QgW25dIHBhcnRzIG9mIHBhdHRlcm4gdGhhdCBhcmUgYWxsIHN0cmluZ3MuXG4gIHZhciBuID0gMFxuICB3aGlsZSAodHlwZW9mIHBhdHRlcm5bbl0gPT09ICdzdHJpbmcnKSB7XG4gICAgbiArK1xuICB9XG4gIC8vIG5vdyBuIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgKm5vdCogYSBzdHJpbmcuXG5cbiAgLy8gU2VlIGlmIHRoZXJlJ3MgYW55dGhpbmcgZWxzZVxuICB2YXIgcHJlZml4XG4gIHN3aXRjaCAobikge1xuICAgIC8vIGlmIG5vdCwgdGhlbiB0aGlzIGlzIHJhdGhlciBzaW1wbGVcbiAgICBjYXNlIHBhdHRlcm4ubGVuZ3RoOlxuICAgICAgdGhpcy5fcHJvY2Vzc1NpbXBsZShwYXR0ZXJuLmpvaW4oJy8nKSwgaW5kZXgpXG4gICAgICByZXR1cm5cblxuICAgIGNhc2UgMDpcbiAgICAgIC8vIHBhdHRlcm4gKnN0YXJ0cyogd2l0aCBzb21lIG5vbi10cml2aWFsIGl0ZW0uXG4gICAgICAvLyBnb2luZyB0byByZWFkZGlyKGN3ZCksIGJ1dCBub3QgaW5jbHVkZSB0aGUgcHJlZml4IGluIG1hdGNoZXMuXG4gICAgICBwcmVmaXggPSBudWxsXG4gICAgICBicmVha1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHBhdHRlcm4gaGFzIHNvbWUgc3RyaW5nIGJpdHMgaW4gdGhlIGZyb250LlxuICAgICAgLy8gd2hhdGV2ZXIgaXQgc3RhcnRzIHdpdGgsIHdoZXRoZXIgdGhhdCdzICdhYnNvbHV0ZScgbGlrZSAvZm9vL2JhcixcbiAgICAgIC8vIG9yICdyZWxhdGl2ZScgbGlrZSAnLi4vYmF6J1xuICAgICAgcHJlZml4ID0gcGF0dGVybi5zbGljZSgwLCBuKS5qb2luKCcvJylcbiAgICAgIGJyZWFrXG4gIH1cblxuICB2YXIgcmVtYWluID0gcGF0dGVybi5zbGljZShuKVxuXG4gIC8vIGdldCB0aGUgbGlzdCBvZiBlbnRyaWVzLlxuICB2YXIgcmVhZFxuICBpZiAocHJlZml4ID09PSBudWxsKVxuICAgIHJlYWQgPSAnLidcbiAgZWxzZSBpZiAoaXNBYnNvbHV0ZShwcmVmaXgpIHx8IGlzQWJzb2x1dGUocGF0dGVybi5qb2luKCcvJykpKSB7XG4gICAgaWYgKCFwcmVmaXggfHwgIWlzQWJzb2x1dGUocHJlZml4KSlcbiAgICAgIHByZWZpeCA9ICcvJyArIHByZWZpeFxuICAgIHJlYWQgPSBwcmVmaXhcbiAgfSBlbHNlXG4gICAgcmVhZCA9IHByZWZpeFxuXG4gIHZhciBhYnMgPSB0aGlzLl9tYWtlQWJzKHJlYWQpXG5cbiAgLy9pZiBpZ25vcmVkLCBza2lwIHByb2Nlc3NpbmdcbiAgaWYgKGNoaWxkcmVuSWdub3JlZCh0aGlzLCByZWFkKSlcbiAgICByZXR1cm5cblxuICB2YXIgaXNHbG9iU3RhciA9IHJlbWFpblswXSA9PT0gbWluaW1hdGNoLkdMT0JTVEFSXG4gIGlmIChpc0dsb2JTdGFyKVxuICAgIHRoaXMuX3Byb2Nlc3NHbG9iU3RhcihwcmVmaXgsIHJlYWQsIGFicywgcmVtYWluLCBpbmRleCwgaW5HbG9iU3RhcilcbiAgZWxzZVxuICAgIHRoaXMuX3Byb2Nlc3NSZWFkZGlyKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyKVxufVxuXG5cbkdsb2JTeW5jLnByb3RvdHlwZS5fcHJvY2Vzc1JlYWRkaXIgPSBmdW5jdGlvbiAocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIpIHtcbiAgdmFyIGVudHJpZXMgPSB0aGlzLl9yZWFkZGlyKGFicywgaW5HbG9iU3RhcilcblxuICAvLyBpZiB0aGUgYWJzIGlzbid0IGEgZGlyLCB0aGVuIG5vdGhpbmcgY2FuIG1hdGNoIVxuICBpZiAoIWVudHJpZXMpXG4gICAgcmV0dXJuXG5cbiAgLy8gSXQgd2lsbCBvbmx5IG1hdGNoIGRvdCBlbnRyaWVzIGlmIGl0IHN0YXJ0cyB3aXRoIGEgZG90LCBvciBpZlxuICAvLyBkb3QgaXMgc2V0LiAgU3R1ZmYgbGlrZSBAKC5mb298LmJhcikgaXNuJ3QgYWxsb3dlZC5cbiAgdmFyIHBuID0gcmVtYWluWzBdXG4gIHZhciBuZWdhdGUgPSAhIXRoaXMubWluaW1hdGNoLm5lZ2F0ZVxuICB2YXIgcmF3R2xvYiA9IHBuLl9nbG9iXG4gIHZhciBkb3RPayA9IHRoaXMuZG90IHx8IHJhd0dsb2IuY2hhckF0KDApID09PSAnLidcblxuICB2YXIgbWF0Y2hlZEVudHJpZXMgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZSA9IGVudHJpZXNbaV1cbiAgICBpZiAoZS5jaGFyQXQoMCkgIT09ICcuJyB8fCBkb3RPaykge1xuICAgICAgdmFyIG1cbiAgICAgIGlmIChuZWdhdGUgJiYgIXByZWZpeCkge1xuICAgICAgICBtID0gIWUubWF0Y2gocG4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtID0gZS5tYXRjaChwbilcbiAgICAgIH1cbiAgICAgIGlmIChtKVxuICAgICAgICBtYXRjaGVkRW50cmllcy5wdXNoKGUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGxlbiA9IG1hdGNoZWRFbnRyaWVzLmxlbmd0aFxuICAvLyBJZiB0aGVyZSBhcmUgbm8gbWF0Y2hlZCBlbnRyaWVzLCB0aGVuIG5vdGhpbmcgbWF0Y2hlcy5cbiAgaWYgKGxlbiA9PT0gMClcbiAgICByZXR1cm5cblxuICAvLyBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlbWFpbmluZyBwYXR0ZXJuIGJpdCwgdGhlbiBubyBuZWVkIGZvclxuICAvLyBhbiBhZGRpdGlvbmFsIHN0YXQgKnVubGVzcyogdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBtYXJrIG9yXG4gIC8vIHN0YXQgZXhwbGljaXRseS4gIFdlIGtub3cgdGhleSBleGlzdCwgc2luY2UgcmVhZGRpciByZXR1cm5lZFxuICAvLyB0aGVtLlxuXG4gIGlmIChyZW1haW4ubGVuZ3RoID09PSAxICYmICF0aGlzLm1hcmsgJiYgIXRoaXMuc3RhdCkge1xuICAgIGlmICghdGhpcy5tYXRjaGVzW2luZGV4XSlcbiAgICAgIHRoaXMubWF0Y2hlc1tpbmRleF0gPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArKykge1xuICAgICAgdmFyIGUgPSBtYXRjaGVkRW50cmllc1tpXVxuICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICBpZiAocHJlZml4LnNsaWNlKC0xKSAhPT0gJy8nKVxuICAgICAgICAgIGUgPSBwcmVmaXggKyAnLycgKyBlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBlID0gcHJlZml4ICsgZVxuICAgICAgfVxuXG4gICAgICBpZiAoZS5jaGFyQXQoMCkgPT09ICcvJyAmJiAhdGhpcy5ub21vdW50KSB7XG4gICAgICAgIGUgPSBwYXRoLmpvaW4odGhpcy5yb290LCBlKVxuICAgICAgfVxuICAgICAgdGhpcy5tYXRjaGVzW2luZGV4XVtlXSA9IHRydWVcbiAgICB9XG4gICAgLy8gVGhpcyB3YXMgdGhlIGxhc3Qgb25lLCBhbmQgbm8gc3RhdHMgd2VyZSBuZWVkZWRcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIG5vdyB0ZXN0IGFsbCBtYXRjaGVkIGVudHJpZXMgYXMgc3RhbmQtaW5zIGZvciB0aGF0IHBhcnRcbiAgLy8gb2YgdGhlIHBhdHRlcm4uXG4gIHJlbWFpbi5zaGlmdCgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7XG4gICAgdmFyIGUgPSBtYXRjaGVkRW50cmllc1tpXVxuICAgIHZhciBuZXdQYXR0ZXJuXG4gICAgaWYgKHByZWZpeClcbiAgICAgIG5ld1BhdHRlcm4gPSBbcHJlZml4LCBlXVxuICAgIGVsc2VcbiAgICAgIG5ld1BhdHRlcm4gPSBbZV1cbiAgICB0aGlzLl9wcm9jZXNzKG5ld1BhdHRlcm4uY29uY2F0KHJlbWFpbiksIGluZGV4LCBpbkdsb2JTdGFyKVxuICB9XG59XG5cblxuR2xvYlN5bmMucHJvdG90eXBlLl9lbWl0TWF0Y2ggPSBmdW5jdGlvbiAoaW5kZXgsIGUpIHtcbiAgdmFyIGFicyA9IHRoaXMuX21ha2VBYnMoZSlcbiAgaWYgKHRoaXMubWFyaylcbiAgICBlID0gdGhpcy5fbWFyayhlKVxuXG4gIGlmICh0aGlzLm1hdGNoZXNbaW5kZXhdW2VdKVxuICAgIHJldHVyblxuXG4gIGlmICh0aGlzLm5vZGlyKSB7XG4gICAgdmFyIGMgPSB0aGlzLmNhY2hlW3RoaXMuX21ha2VBYnMoZSldXG4gICAgaWYgKGMgPT09ICdESVInIHx8IEFycmF5LmlzQXJyYXkoYykpXG4gICAgICByZXR1cm5cbiAgfVxuXG4gIHRoaXMubWF0Y2hlc1tpbmRleF1bZV0gPSB0cnVlXG4gIGlmICh0aGlzLnN0YXQpXG4gICAgdGhpcy5fc3RhdChlKVxufVxuXG5cbkdsb2JTeW5jLnByb3RvdHlwZS5fcmVhZGRpckluR2xvYlN0YXIgPSBmdW5jdGlvbiAoYWJzKSB7XG4gIC8vIGZvbGxvdyBhbGwgc3ltbGlua2VkIGRpcmVjdG9yaWVzIGZvcmV2ZXJcbiAgLy8ganVzdCBwcm9jZWVkIGFzIGlmIHRoaXMgaXMgYSBub24tZ2xvYnN0YXIgc2l0dWF0aW9uXG4gIGlmICh0aGlzLmZvbGxvdylcbiAgICByZXR1cm4gdGhpcy5fcmVhZGRpcihhYnMsIGZhbHNlKVxuXG4gIHZhciBlbnRyaWVzXG4gIHZhciBsc3RhdFxuICB2YXIgc3RhdFxuICB0cnkge1xuICAgIGxzdGF0ID0gZnMubHN0YXRTeW5jKGFicylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICAvLyBsc3RhdCBmYWlsZWQsIGRvZXNuJ3QgZXhpc3RcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgdmFyIGlzU3ltID0gbHN0YXQuaXNTeW1ib2xpY0xpbmsoKVxuICB0aGlzLnN5bWxpbmtzW2Fic10gPSBpc1N5bVxuXG4gIC8vIElmIGl0J3Mgbm90IGEgc3ltbGluayBvciBhIGRpciwgdGhlbiBpdCdzIGRlZmluaXRlbHkgYSByZWd1bGFyIGZpbGUuXG4gIC8vIGRvbid0IGJvdGhlciBkb2luZyBhIHJlYWRkaXIgaW4gdGhhdCBjYXNlLlxuICBpZiAoIWlzU3ltICYmICFsc3RhdC5pc0RpcmVjdG9yeSgpKVxuICAgIHRoaXMuY2FjaGVbYWJzXSA9ICdGSUxFJ1xuICBlbHNlXG4gICAgZW50cmllcyA9IHRoaXMuX3JlYWRkaXIoYWJzLCBmYWxzZSlcblxuICByZXR1cm4gZW50cmllc1xufVxuXG5HbG9iU3luYy5wcm90b3R5cGUuX3JlYWRkaXIgPSBmdW5jdGlvbiAoYWJzLCBpbkdsb2JTdGFyKSB7XG4gIHZhciBlbnRyaWVzXG5cbiAgaWYgKGluR2xvYlN0YXIgJiYgIW93blByb3AodGhpcy5zeW1saW5rcywgYWJzKSlcbiAgICByZXR1cm4gdGhpcy5fcmVhZGRpckluR2xvYlN0YXIoYWJzKVxuXG4gIGlmIChvd25Qcm9wKHRoaXMuY2FjaGUsIGFicykpIHtcbiAgICB2YXIgYyA9IHRoaXMuY2FjaGVbYWJzXVxuICAgIGlmICghYyB8fCBjID09PSAnRklMRScpXG4gICAgICByZXR1cm4gbnVsbFxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpXG4gICAgICByZXR1cm4gY1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGRpckVudHJpZXMoYWJzLCBmcy5yZWFkZGlyU3luYyhhYnMpKVxuICB9IGNhdGNoIChlcikge1xuICAgIHRoaXMuX3JlYWRkaXJFcnJvcihhYnMsIGVyKVxuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuR2xvYlN5bmMucHJvdG90eXBlLl9yZWFkZGlyRW50cmllcyA9IGZ1bmN0aW9uIChhYnMsIGVudHJpZXMpIHtcbiAgLy8gaWYgd2UgaGF2ZW4ndCBhc2tlZCB0byBzdGF0IGV2ZXJ5dGhpbmcsIHRoZW4ganVzdFxuICAvLyBhc3N1bWUgdGhhdCBldmVyeXRoaW5nIGluIHRoZXJlIGV4aXN0cywgc28gd2UgY2FuIGF2b2lkXG4gIC8vIGhhdmluZyB0byBzdGF0IGl0IGEgc2Vjb25kIHRpbWUuXG4gIGlmICghdGhpcy5tYXJrICYmICF0aGlzLnN0YXQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICB2YXIgZSA9IGVudHJpZXNbaV1cbiAgICAgIGlmIChhYnMgPT09ICcvJylcbiAgICAgICAgZSA9IGFicyArIGVcbiAgICAgIGVsc2VcbiAgICAgICAgZSA9IGFicyArICcvJyArIGVcbiAgICAgIHRoaXMuY2FjaGVbZV0gPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgdGhpcy5jYWNoZVthYnNdID0gZW50cmllc1xuXG4gIC8vIG1hcmsgYW5kIGNhY2hlIGRpci1uZXNzXG4gIHJldHVybiBlbnRyaWVzXG59XG5cbkdsb2JTeW5jLnByb3RvdHlwZS5fcmVhZGRpckVycm9yID0gZnVuY3Rpb24gKGYsIGVyKSB7XG4gIC8vIGhhbmRsZSBlcnJvcnMsIGFuZCBjYWNoZSB0aGUgaW5mb3JtYXRpb25cbiAgc3dpdGNoIChlci5jb2RlKSB7XG4gICAgY2FzZSAnRU5PVFNVUCc6IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1nbG9iL2lzc3Vlcy8yMDVcbiAgICBjYXNlICdFTk9URElSJzogLy8gdG90YWxseSBub3JtYWwuIG1lYW5zIGl0ICpkb2VzKiBleGlzdC5cbiAgICAgIHRoaXMuY2FjaGVbdGhpcy5fbWFrZUFicyhmKV0gPSAnRklMRSdcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdFTk9FTlQnOiAvLyBub3QgdGVycmlibHkgdW51c3VhbFxuICAgIGNhc2UgJ0VMT09QJzpcbiAgICBjYXNlICdFTkFNRVRPT0xPTkcnOlxuICAgIGNhc2UgJ1VOS05PV04nOlxuICAgICAgdGhpcy5jYWNoZVt0aGlzLl9tYWtlQWJzKGYpXSA9IGZhbHNlXG4gICAgICBicmVha1xuXG4gICAgZGVmYXVsdDogLy8gc29tZSB1bnVzdWFsIGVycm9yLiAgVHJlYXQgYXMgZmFpbHVyZS5cbiAgICAgIHRoaXMuY2FjaGVbdGhpcy5fbWFrZUFicyhmKV0gPSBmYWxzZVxuICAgICAgaWYgKHRoaXMuc3RyaWN0KVxuICAgICAgICB0aHJvdyBlclxuICAgICAgaWYgKCF0aGlzLnNpbGVudClcbiAgICAgICAgY29uc29sZS5lcnJvcignZ2xvYiBlcnJvcicsIGVyKVxuICAgICAgYnJlYWtcbiAgfVxufVxuXG5HbG9iU3luYy5wcm90b3R5cGUuX3Byb2Nlc3NHbG9iU3RhciA9IGZ1bmN0aW9uIChwcmVmaXgsIHJlYWQsIGFicywgcmVtYWluLCBpbmRleCwgaW5HbG9iU3Rhcikge1xuXG4gIHZhciBlbnRyaWVzID0gdGhpcy5fcmVhZGRpcihhYnMsIGluR2xvYlN0YXIpXG5cbiAgLy8gbm8gZW50cmllcyBtZWFucyBub3QgYSBkaXIsIHNvIGl0IGNhbiBuZXZlciBoYXZlIG1hdGNoZXNcbiAgLy8gZm9vLnR4dC8qKiBkb2Vzbid0IG1hdGNoIGZvby50eHRcbiAgaWYgKCFlbnRyaWVzKVxuICAgIHJldHVyblxuXG4gIC8vIHRlc3Qgd2l0aG91dCB0aGUgZ2xvYnN0YXIsIGFuZCB3aXRoIGV2ZXJ5IGNoaWxkIGJvdGggYmVsb3dcbiAgLy8gYW5kIHJlcGxhY2luZyB0aGUgZ2xvYnN0YXIuXG4gIHZhciByZW1haW5XaXRob3V0R2xvYlN0YXIgPSByZW1haW4uc2xpY2UoMSlcbiAgdmFyIGdzcHJlZiA9IHByZWZpeCA/IFsgcHJlZml4IF0gOiBbXVxuICB2YXIgbm9HbG9iU3RhciA9IGdzcHJlZi5jb25jYXQocmVtYWluV2l0aG91dEdsb2JTdGFyKVxuXG4gIC8vIHRoZSBub0dsb2JTdGFyIHBhdHRlcm4gZXhpdHMgdGhlIGluR2xvYlN0YXIgc3RhdGVcbiAgdGhpcy5fcHJvY2Vzcyhub0dsb2JTdGFyLCBpbmRleCwgZmFsc2UpXG5cbiAgdmFyIGxlbiA9IGVudHJpZXMubGVuZ3RoXG4gIHZhciBpc1N5bSA9IHRoaXMuc3ltbGlua3NbYWJzXVxuXG4gIC8vIElmIGl0J3MgYSBzeW1saW5rLCBhbmQgd2UncmUgaW4gYSBnbG9ic3RhciwgdGhlbiBzdG9wXG4gIGlmIChpc1N5bSAmJiBpbkdsb2JTdGFyKVxuICAgIHJldHVyblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgZSA9IGVudHJpZXNbaV1cbiAgICBpZiAoZS5jaGFyQXQoMCkgPT09ICcuJyAmJiAhdGhpcy5kb3QpXG4gICAgICBjb250aW51ZVxuXG4gICAgLy8gdGhlc2UgdHdvIGNhc2VzIGVudGVyIHRoZSBpbkdsb2JTdGFyIHN0YXRlXG4gICAgdmFyIGluc3RlYWQgPSBnc3ByZWYuY29uY2F0KGVudHJpZXNbaV0sIHJlbWFpbldpdGhvdXRHbG9iU3RhcilcbiAgICB0aGlzLl9wcm9jZXNzKGluc3RlYWQsIGluZGV4LCB0cnVlKVxuXG4gICAgdmFyIGJlbG93ID0gZ3NwcmVmLmNvbmNhdChlbnRyaWVzW2ldLCByZW1haW4pXG4gICAgdGhpcy5fcHJvY2VzcyhiZWxvdywgaW5kZXgsIHRydWUpXG4gIH1cbn1cblxuR2xvYlN5bmMucHJvdG90eXBlLl9wcm9jZXNzU2ltcGxlID0gZnVuY3Rpb24gKHByZWZpeCwgaW5kZXgpIHtcbiAgLy8gWFhYIHJldmlldyB0aGlzLiAgU2hvdWxkbid0IGl0IGJlIGRvaW5nIHRoZSBtb3VudGluZyBldGNcbiAgLy8gYmVmb3JlIGRvaW5nIHN0YXQ/ICBraW5kYSB3ZWlyZD9cbiAgdmFyIGV4aXN0cyA9IHRoaXMuX3N0YXQocHJlZml4KVxuXG4gIGlmICghdGhpcy5tYXRjaGVzW2luZGV4XSlcbiAgICB0aGlzLm1hdGNoZXNbaW5kZXhdID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIC8vIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4ganVzdCBtYXJrIHRoZSBsYWNrIG9mIHJlc3VsdHNcbiAgaWYgKCFleGlzdHMpXG4gICAgcmV0dXJuXG5cbiAgaWYgKHByZWZpeCAmJiBpc0Fic29sdXRlKHByZWZpeCkgJiYgIXRoaXMubm9tb3VudCkge1xuICAgIHZhciB0cmFpbCA9IC9bXFwvXFxcXF0kLy50ZXN0KHByZWZpeClcbiAgICBpZiAocHJlZml4LmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgICBwcmVmaXggPSBwYXRoLmpvaW4odGhpcy5yb290LCBwcmVmaXgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeCA9IHBhdGgucmVzb2x2ZSh0aGlzLnJvb3QsIHByZWZpeClcbiAgICAgIGlmICh0cmFpbClcbiAgICAgICAgcHJlZml4ICs9ICcvJ1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKVxuICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXFxcL2csICcvJylcblxuICAvLyBNYXJrIHRoaXMgYXMgYSBtYXRjaFxuICB0aGlzLm1hdGNoZXNbaW5kZXhdW3ByZWZpeF0gPSB0cnVlXG59XG5cbi8vIFJldHVybnMgZWl0aGVyICdESVInLCAnRklMRScsIG9yIGZhbHNlXG5HbG9iU3luYy5wcm90b3R5cGUuX3N0YXQgPSBmdW5jdGlvbiAoZikge1xuICB2YXIgYWJzID0gdGhpcy5fbWFrZUFicyhmKVxuICB2YXIgbmVlZERpciA9IGYuc2xpY2UoLTEpID09PSAnLydcblxuICBpZiAoZi5sZW5ndGggPiB0aGlzLm1heExlbmd0aClcbiAgICByZXR1cm4gZmFsc2VcblxuICBpZiAoIXRoaXMuc3RhdCAmJiBvd25Qcm9wKHRoaXMuY2FjaGUsIGFicykpIHtcbiAgICB2YXIgYyA9IHRoaXMuY2FjaGVbYWJzXVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpXG4gICAgICBjID0gJ0RJUidcblxuICAgIC8vIEl0IGV4aXN0cywgYnV0IG1heWJlIG5vdCBob3cgd2UgbmVlZCBpdFxuICAgIGlmICghbmVlZERpciB8fCBjID09PSAnRElSJylcbiAgICAgIHJldHVybiBjXG5cbiAgICBpZiAobmVlZERpciAmJiBjID09PSAnRklMRScpXG4gICAgICByZXR1cm4gZmFsc2VcblxuICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIHRvIHN0YXQsIGJlY2F1c2UgbWF5YmUgYz10cnVlXG4gICAgLy8gaWYgd2Uga25vdyBpdCBleGlzdHMsIGJ1dCBub3Qgd2hhdCBpdCBpcy5cbiAgfVxuXG4gIHZhciBleGlzdHNcbiAgdmFyIHN0YXQgPSB0aGlzLnN0YXRDYWNoZVthYnNdXG4gIGlmICghc3RhdCkge1xuICAgIHZhciBsc3RhdFxuICAgIHRyeSB7XG4gICAgICBsc3RhdCA9IGZzLmxzdGF0U3luYyhhYnMpXG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChsc3RhdC5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGF0ID0gZnMuc3RhdFN5bmMoYWJzKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgc3RhdCA9IGxzdGF0XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXQgPSBsc3RhdFxuICAgIH1cbiAgfVxuXG4gIHRoaXMuc3RhdENhY2hlW2Fic10gPSBzdGF0XG5cbiAgdmFyIGMgPSBzdGF0LmlzRGlyZWN0b3J5KCkgPyAnRElSJyA6ICdGSUxFJ1xuICB0aGlzLmNhY2hlW2Fic10gPSB0aGlzLmNhY2hlW2Fic10gfHwgY1xuXG4gIGlmIChuZWVkRGlyICYmIGMgIT09ICdESVInKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBjXG59XG5cbkdsb2JTeW5jLnByb3RvdHlwZS5fbWFyayA9IGZ1bmN0aW9uIChwKSB7XG4gIHJldHVybiBjb21tb24ubWFyayh0aGlzLCBwKVxufVxuXG5HbG9iU3luYy5wcm90b3R5cGUuX21ha2VBYnMgPSBmdW5jdGlvbiAoZikge1xuICByZXR1cm4gY29tbW9uLm1ha2VBYnModGhpcywgZilcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8vXG4vLyBBbGdvcml0aG1zXG4vL1xuXG4vLyBwcm9iYWJseSBtb3ZlIHRoZXNlIHRvIGFub3RoZXIgZmlsZSB3aGVuIHRoZXJlIGdldCB0byBiZSBsb3RzIG9mIHRoZW0uXG5cbmZ1bmN0aW9uIGNvdW50KG9iaikge1xuICB2YXIgYyA9IDBcbiAgZm9yKHZhciBrIGluIG9iaikgYysrXG4gIHJldHVybiBjXG59XG5cbmZ1bmN0aW9uIHdpZHRoVHJhdmVyc2UgKGdyYXBoLCByZWFjaGFibGUsIHN0YXJ0LCBkZXB0aCwgaG9wcywgbWF4LCBpdGVyKSB7XG4gIGlmKCFzdGFydClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyYXBobWl0dGVyI3RyYXZlcnNlOiBzdGFydCBtdXN0IGJlIHByb3ZpZGVkJylcblxuICB2YXIgbm9kZXMgPSAxXG5cbiAgcmVhY2hhYmxlW3N0YXJ0XSA9IHJlYWNoYWJsZVtzdGFydF0gPT0gbnVsbCA/IDAgOiByZWFjaGFibGVbc3RhcnRdXG5cbiAgdmFyIHF1ZXVlID0gW3trZXk6IHN0YXJ0LCBob3BzOiBkZXB0aH1dXG4gIGl0ZXIgPSBpdGVyIHx8IGZ1bmN0aW9uICgpIHt9XG4gIHZhciBhYm9ydCA9IGZhbHNlXG4gIHdoaWxlKHF1ZXVlLmxlbmd0aCAmJiAoIW1heCB8fCBub2RlcyA8IG1heCkgJiYgIWFib3J0KSB7XG4gICAgdmFyIG8gPSBxdWV1ZS5zaGlmdCgpXG4gICAgdmFyIGggPSBvLmhvcHNcbiAgICB2YXIgbiA9IGdyYXBoLm5vZGVzW28ua2V5XVxuICAgIGlmKG4gJiYgKCFob3BzIHx8IChoICsgMSA8PSBob3BzKSkpXG4gICAgICBmb3IodmFyIGsgaW4gbi5lZGdlcykge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgYmVlbiB0byB0aGlzIG5vZGUgYnkgYSBzaG9ydGVyIHBhdGgsXG4gICAgICAgIC8vIHRoZW4gc2tpcCB0aGlzIG5vZGUgKHRoaXMgb25seSBoYXBwZW5zIHdoZW4gcHJvY2Vzc2luZ1xuICAgICAgICAvLyBhIHJlYWx0aW1lIGVkZ2UpXG4gICAgICAgIGlmKCEocmVhY2hhYmxlW2tdICE9IG51bGwgJiYgcmVhY2hhYmxlW2tdIDwgaCArIDEpKSB7XG4gICAgICAgICAgaWYoZmFsc2UgPT09IGl0ZXIoby5rZXksIGssIGggKyAxLCByZWFjaGFibGVba10pKVxuICAgICAgICAgICAgcmV0dXJuIHJlYWNoYWJsZVxuXG4gICAgICAgICAgcmVhY2hhYmxlW2tdID0gaCArIDFcbiAgICAgICAgICBub2RlcyArK1xuICAgICAgICAgIHF1ZXVlLnB1c2goe2tleTogaywgaG9wczogaCArIDF9KVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlYWNoYWJsZVxufVxuXG5leHBvcnRzLnRyYXZlcnNlID0gZnVuY3Rpb24gKG9wdHMsIG9uRWFjaCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIG1heEhvcHMgPSBvcHRzLmhvcHMgfHwgM1xuICB2YXIgbWF4Tm9kZXMgPSBvcHRzLm1heCB8fCAxNTBcbiAgdmFyIHJlYWNoYWJsZSA9IHt9XG4gIG9wdHMuZWFjaCA9IG9uRWFjaCA9IG9uRWFjaCB8fCBvcHRzLmVhY2hcblxuICB3aWR0aFRyYXZlcnNlKFxuICAgIHRoaXMsIHJlYWNoYWJsZSxcbiAgICBvcHRzLnN0YXJ0LFxuICAgIDAsICAgICAgICAgICAgIC8vaW5pdGlhbCBob3BzXG4gICAgb3B0cy5ob3BzLCAgICAgLy9tYXggaG9wc1xuICAgIG9wdHMubWF4LCAgICAgIC8vbWF4IG5vZGVzXG4gICAgb3B0cy5vbGQgIT09IGZhbHNlICYmIG9uRWFjaFxuICApXG5cbiAgaWYoIW9uRWFjaCB8fCBvcHRzLmxpdmUgPT09IGZhbHNlKSByZXR1cm4gcmVhY2hhYmxlXG5cbiAgZnVuY3Rpb24gb25FZGdlIChmcm9tLCB0bykge1xuICAgIC8vaWYgdGhpcyBlZGdlIGlzIHBhcnQgb2YgdGhlIGluaXRpYWwgc2V0ZFxuICAgIGlmKHJlYWNoYWJsZVtmcm9tXSAhPSBudWxsICYmIHJlYWNoYWJsZVtmcm9tXSA8IG1heEhvcHMpIHtcbiAgICAgIC8vZWRnZXMgdG8gbmV3IG5vZGVzLlxuICAgICAgdmFyIGggPSByZWFjaGFibGVbZnJvbV0gKyAxXG4gICAgICB2YXIgX2ggPSByZWFjaGFibGVbdG9dXG4gICAgICBpZihfaCA9PSBudWxsKVxuICAgICAgICBvbkVhY2goZnJvbSwgdG8sIHJlYWNoYWJsZVt0b10gPSBoLCBfaClcbiAgICAgIGVsc2UgaWYoTWF0aC5taW4oaCwgX2gpICE9IF9oKVxuICAgICAgICBvbkVhY2goZnJvbSwgdG8sIHJlYWNoYWJsZVt0b10gPSBNYXRoLm1pbihoLCBfaCksIF9oKVxuXG4gICAgICBpZihoIDw9IG1heEhvcHMgJiYgaCAhPSBfaCkge1xuICAgICAgICAvL2Fsc28gYWRkIG90aGVyIG5vZGVzIHRoYXQgYXJlIG5vdyByZWFjaGFibGUuXG4gICAgICAgIHdpZHRoVHJhdmVyc2Uoc2VsZiwgcmVhY2hhYmxlLCB0bywgaCwgbWF4SG9wcywgbWF4Tm9kZXMsIG9uRWFjaClcblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMub24oJ2VkZ2UnLCBvbkVkZ2UpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKCdlZGdlJywgb25FZGdlKVxuICB9XG59XG5cbi8vIHBhZ2UgcmFuay4gSSBhZGFwdGVkIHRoZSBhbGdvcml0aG0gdG8gdXNlXG4vLyBmb3J3YXJkIGxpbmtzIGluc3RlYWQgb2YgYmFja3dhcmQgbGlua3Mgd2hpY2ggbWVhbnNcbi8vIHdlIG9ubHkgaGF2ZSB0byB0cmF2ZXJzZSB0aGUgZ3JhcGggb25lIHRpbWUuXG5cbmV4cG9ydHMucmFuayA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgdmFyIHJhbmtzID0ge30sIGxpbmtzID0ge30sIF9yYW5rcyA9IHt9XG4gIHZhciBOID0gY291bnQodGhpcy5ub2RlcylcbiAgdmFyIGl0ZXJhdGlvbnMgPSBvcHRzLml0ZXJhdGlvbnMgfHwgMVxuICB2YXIgZGFtcGluZyA9IG9wdHMuZGFtcGluZyB8fCAwLjg1XG4gIHZhciBpbml0ID0gKDEgLSBkYW1waW5nKSAvIE5cblxuICAvL2luaXRpYWxpemVcbiAgdGhpcy5lYWNoKGZ1bmN0aW9uIChrLCBuKSB7XG4gICAgcmFua3Nba10gPSAxL047IF9yYW5rc1trXSA9IGluaXRcbiAgICBsaW5rc1trXSA9IGNvdW50KG4uZWRnZXMpXG4gIH0pXG5cbiAgd2hpbGUoaXRlcmF0aW9ucyAtLT4gMCkge1xuXG4gICAgLy9pdGVyYXRpb25cbiAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGosIG4pIHtcbiAgICAgIHZhciByID0gZGFtcGluZyoocmFua3Nbal0vbGlua3Nbal0pXG4gICAgICBuLmVhY2goZnVuY3Rpb24gKGspIHsgX3JhbmtzW2tdICs9IHIgfSlcbiAgICB9KVxuXG4gICAgLy9yZXNldFxuICAgIGZvcih2YXIgayBpbiByYW5rcylcbiAgICAgIHJhbmtzW2tdID0gaW5pdFxuXG4gICAgdmFyIF9fcmFua3MgPSByYW5rc1xuICAgIHJhbmtzID0gX3JhbmtzXG4gICAgX3JhbmtzID0gX19yYW5rc1xuICB9XG4gIHJldHVybiByYW5rc1xufVxuXG4vL2ZpbmQgdGhlIHNob3J0ZXN0IHBhdGggYmV0d2VlbiB0d28gbm9kZXMuXG4vL2lmIHRoZXJlIHdhcyBubyBwYXRoIHdpdGhpbiBtYXggaG9wcywgcmV0dXJuIG51bGwuXG5cbi8vY29udmVydCBhIHNwYW5uaW5nIHRyZWUgdG8gYW4gYXJyYXkuXG5mdW5jdGlvbiB0b0FycmF5IChzcGFuLCByb290KSB7XG4gIGlmKCFzcGFuW3Jvb3RdKSByZXR1cm4gbnVsbFxuICB2YXIgYSA9IFtyb290XVxuICB3aGlsZShzcGFuW3Jvb3RdKVxuICAgIGEucHVzaChyb290ID0gc3Bhbltyb290XSlcbiAgcmV0dXJuIGEucmV2ZXJzZSgpXG59XG5cbmV4cG9ydHMucGF0aCA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHZhciByZXZlcnNlID0ge31cbiAgaWYob3B0cy5zb3VyY2UgPT0gb3B0cy5kZXN0KVxuICAgIHJldHVybiBbb3B0cy5zb3VyY2VdXG5cbiAgb3B0cy5zdGFydCA9IG9wdHMuc291cmNlXG4gIG9wdHMubGl2ZSA9IGZhbHNlXG4gIG9wdHMuZWFjaCA9IGZ1bmN0aW9uIChmLCB0LCBoKSB7XG4gICAgcmV2ZXJzZVt0XSA9IGZcbiAgfVxuXG4gIHRoaXMudHJhdmVyc2Uob3B0cylcbiAgcmV0dXJuIHRvQXJyYXkocmV2ZXJzZSwgb3B0cy5kZXN0KVxufVxuXG5cbiIsIlxuXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0c1xuXG5pbmhlcml0cyhHcmFwaG1pdHRlciwgRXZlbnRFbWl0dGVyKVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdyYXBobWl0dGVyXG5cbmZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyKSB7XG4gIGZvcih2YXIgayBpbiBvYmopIGl0ZXIoaywgb2JqW2tdKVxufVxuXG4vL1xuLy8gTm9kZSAvIFZlcnRpY2Vcbi8vXG5cbmZ1bmN0aW9uIE5vZGUgKCkge1xuICB0aGlzLmVkZ2VzID0ge31cbn1cblxudmFyIG5wcm90byA9IE5vZGUucHJvdG90eXBlXG5cbi8vcmV0dXJucyB0aGUgb2xkIGRhdGEgZm9yIHRoaXMgZWRnZS4uXG5ucHJvdG8uZWRnZSA9IGZ1bmN0aW9uICh0bywgZGF0YSkge1xuICB2YXIgX2RhdGEgPSB0aGlzLmVkZ2VzW3RvXVxuICB0aGlzLmVkZ2VzW3RvXSA9IChkYXRhID09IG51bGwgPyB0cnVlIDogZGF0YSlcbiAgcmV0dXJuIF9kYXRhXG59XG5cbm5wcm90by5oYXMgPSBmdW5jdGlvbiAodG8pIHtcbiAgcmV0dXJuIHRoaXMuZWRnZXNbdG9dXG59XG5cbi8vYWxzbyByZXR1cm5zIHRoZSBvbGQgZGF0YSBmb3IgdGhpcyBlZGdlLi5cbm5wcm90by5kZWwgPSBmdW5jdGlvbiAodG8sIGRhdGEpIHtcbiAgdmFyIF9kYXRhID0gdGhpcy5lZGdlc1t0b11cbiAgZGVsZXRlIHRoaXMuZWRnZXNbdG9dXG4gIHJldHVybiBfZGF0YVxufVxuXG5ucHJvdG8uZWFjaCA9IGZ1bmN0aW9uIChpdGVyKSB7XG4gIGVhY2godGhpcy5lZGdlcywgaXRlcilcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy9cbi8vIHRoZSB3aG9sZSBncmFwaFxuLy9cblxuZnVuY3Rpb24gR3JhcGhtaXR0ZXIgKCkge1xuICBpZighKHRoaXMgaW5zdGFuY2VvZiBHcmFwaG1pdHRlcikpIHJldHVybiBuZXcgR3JhcGhtaXR0ZXIoKVxuICB0aGlzLm5vZGVzID0ge31cbn1cblxudmFyIHByb3RvID0gR3JhcGhtaXR0ZXIucHJvdG90eXBlXG5cbnByb3RvLmhhc05vZGUgPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gISF0aGlzLm5vZGVzW25dXG59XG5cbnByb3RvLmhhc0VkZ2UgPSBmdW5jdGlvbiAoZiwgdCkge1xuICByZXR1cm4gdGhpcy5oYXNOb2RlKGYpICYmICEhdGhpcy5ub2Rlc1tmXS5lZGdlc1t0XSAhPSBudWxsXG59XG5cbnByb3RvLm5vZGUgPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gdGhpcy5ub2Rlc1tuXSA9IHRoaXMubm9kZXNbbl0gfHwgbmV3IE5vZGUobilcbn1cblxucHJvdG8uZ2V0ID0gZnVuY3Rpb24gKGYsIHQpIHtcbiAgaWYodCA9PSBudWxsKSByZXR1cm4gdGhpcy5ub2Rlc1tmXVxuICByZXR1cm4gdGhpcy5oYXNOb2RlKGYpID8gdGhpcy5ub2Rlc1tmXS5lZGdlc1t0XSA6IG51bGxcbn1cblxucHJvdG8uZWRnZSA9IGZ1bmN0aW9uIChmcm9tLCB0bywgZGF0YSkge1xuICBkYXRhID0gKGRhdGEgPT0gbnVsbCA/IHRydWUgOiBkYXRhKVxuICB2YXIgZiA9IHRoaXMubm9kZShmcm9tKVxuICB0aGlzLm5vZGUodG8pXG4gIHZhciBfZGF0YSA9IGYuZWRnZSh0bywgZGF0YSlcblxuICBpZihfZGF0YSAhPT0gZGF0YSlcbiAgICB0aGlzLmVtaXQoJ2VkZ2UnLCBmcm9tLCB0bywgZGF0YSwgX2RhdGEpXG4gIHJldHVybiB0aGlzXG59XG5cbnByb3RvLmRlbCA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICB2YXIgZGF0YSA9IHRoaXMubm9kZShmcm9tKS5kZWwodG8pXG4gIGlmICh0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgdGhpcy5lbWl0KCdkZWwnLCBmcm9tLCB0bywgZGF0YSlcbiAgcmV0dXJuIHRoaXNcbn1cblxucHJvdG8uZWFjaCA9IGZ1bmN0aW9uIChpdGVyKSB7XG4gIGVhY2godGhpcy5ub2RlcywgaXRlcilcbiAgcmV0dXJuIHRoaXNcbn1cblxucHJvdG8uZWFjaEVkZ2UgPSBmdW5jdGlvbiAoaXRlcikge1xuICBlYWNoKHRoaXMubm9kZXMsIGZ1bmN0aW9uIChmcm9tLCBuKSB7XG4gICAgZWFjaChuLmVkZ2VzLCBmdW5jdGlvbiAodG8sIGRhdGEpIHtcbiAgICAgIGl0ZXIoZnJvbSwgdG8sIGRhdGEpXG4gICAgfSlcbiAgfSlcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy9nZXQgYSByYW5kb20gbm9kZVxucHJvdG8ucmFuZG9tID0gZnVuY3Rpb24gKCkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubm9kZXMpXG4gIHJldHVybiBrZXlzW35+KGtleXMubGVuZ3RoKk1hdGgucmFuZG9tKCkpXVxufVxuXG4vL2FkZCBhbm90aGVyIHN1YmdyYXBoXG5wcm90by5hZGQgPSBmdW5jdGlvbiAoZzIpIHtcbiAgdmFyIGcxID0gdGhpc1xuICBnMi5lYWNoRWRnZShmdW5jdGlvbiAoZnJvbSwgdG8sIGRhdGEpIHtcbiAgICBnMS5lZGdlKGZyb20sIHRvLCBkYXRhKVxuICB9KVxuICByZXR1cm4gdGhpc1xufVxuXG5wcm90by50b0pTT04gPSBmdW5jdGlvbiAoaXRlcikge1xuICB2YXIgZyA9IHt9XG4gIHRoaXMuZWFjaChmdW5jdGlvbiAoaywgdikge1xuICAgIHZhciBlID0ge31cbiAgICB2LmVhY2goZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgIGVba10gPSB2XG4gICAgfSlcbiAgICBnW2tdID0gZVxuICB9KVxuICByZXR1cm4gZ1xufVxuXG4vL1xuLy8gZ3JhcGggZ2VuZXJhdG9yc1xuLy9cblxuR3JhcGhtaXR0ZXIucmFuZG9tID0gZnVuY3Rpb24gKG5vZGVzLCBlZGdlcywgcHJlZml4KSB7XG4gIHByZWZpeCA9IHByZWZpeCB8fCAnIydcbiAgaWYoaXNOYU4oK25vZGVzKSkgdGhyb3cgbmV3IEVycm9yKCdub2RlcyBtdXN0IGJlIGEgbnVtYmVyJylcbiAgaWYoaXNOYU4oK2VkZ2VzKSkgdGhyb3cgbmV3IEVycm9yKCdlZGdlcyBtdXN0IGJlIGEgbnVtYmVyJylcblxuICB2YXIgbiA9IDAsIGcgPSBuZXcgR3JhcGhtaXR0ZXIoKVxuXG4gIGZ1bmN0aW9uIHJhbmQobikge1xuICAgIHJldHVybiBwcmVmaXgrfn4oTWF0aC5yYW5kb20oKSpuKVxuICB9XG5cbiAgZm9yKHZhciBpID0gMDsgaSA8IG5vZGVzOyBpKyspXG4gICAgZy5ub2RlKHByZWZpeCtpKVxuXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBlZGdlczsgaSsrKSB7XG4gICAgdmFyIGEgPSByYW5kKG5vZGVzKSwgYiA9IHJhbmQobm9kZXMpXG4gICAgZy5lZGdlKGEsIGIpLmVkZ2UoYiwgYSlcbiAgfVxuXG4gIHJldHVybiBnXG59XG5cblxudmFyIGFsZ29yaXRobXMgPSByZXF1aXJlKCcuL2FsZ29yaXRobXMnKVxuXG5mb3IodmFyIGsgaW4gYWxnb3JpdGhtcykgcHJvdG9ba10gPSBhbGdvcml0aG1zW2tdXG5cbiIsInZhciBoYXNoID0gZXhwb3J0cztcblxuaGFzaC51dGlscyA9IHJlcXVpcmUoJy4vaGFzaC91dGlscycpO1xuaGFzaC5jb21tb24gPSByZXF1aXJlKCcuL2hhc2gvY29tbW9uJyk7XG5oYXNoLnNoYSA9IHJlcXVpcmUoJy4vaGFzaC9zaGEnKTtcbmhhc2gucmlwZW1kID0gcmVxdWlyZSgnLi9oYXNoL3JpcGVtZCcpO1xuaGFzaC5obWFjID0gcmVxdWlyZSgnLi9oYXNoL2htYWMnKTtcblxuLy8gUHJveHkgaGFzaCBmdW5jdGlvbnMgdG8gdGhlIG1haW4gb2JqZWN0XG5oYXNoLnNoYTEgPSBoYXNoLnNoYS5zaGExO1xuaGFzaC5zaGEyNTYgPSBoYXNoLnNoYS5zaGEyNTY7XG5oYXNoLnNoYTIyNCA9IGhhc2guc2hhLnNoYTIyNDtcbmhhc2guc2hhMzg0ID0gaGFzaC5zaGEuc2hhMzg0O1xuaGFzaC5zaGE1MTIgPSBoYXNoLnNoYS5zaGE1MTI7XG5oYXNoLnJpcGVtZDE2MCA9IGhhc2gucmlwZW1kLnJpcGVtZDE2MDtcbiIsInZhciBoYXNoID0gcmVxdWlyZSgnLi4vaGFzaCcpO1xudmFyIHV0aWxzID0gaGFzaC51dGlscztcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEJsb2NrSGFzaCgpIHtcbiAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nVG90YWwgPSAwO1xuICB0aGlzLmJsb2NrU2l6ZSA9IHRoaXMuY29uc3RydWN0b3IuYmxvY2tTaXplO1xuICB0aGlzLm91dFNpemUgPSB0aGlzLmNvbnN0cnVjdG9yLm91dFNpemU7XG4gIHRoaXMuaG1hY1N0cmVuZ3RoID0gdGhpcy5jb25zdHJ1Y3Rvci5obWFjU3RyZW5ndGg7XG4gIHRoaXMucGFkTGVuZ3RoID0gdGhpcy5jb25zdHJ1Y3Rvci5wYWRMZW5ndGggLyA4O1xuICB0aGlzLmVuZGlhbiA9ICdiaWcnO1xuXG4gIHRoaXMuX2RlbHRhOCA9IHRoaXMuYmxvY2tTaXplIC8gODtcbiAgdGhpcy5fZGVsdGEzMiA9IHRoaXMuYmxvY2tTaXplIC8gMzI7XG59XG5leHBvcnRzLkJsb2NrSGFzaCA9IEJsb2NrSGFzaDtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBlbmMpIHtcbiAgLy8gQ29udmVydCBtZXNzYWdlIHRvIGFycmF5LCBwYWQgaXQsIGFuZCBqb2luIGludG8gMzJiaXQgYmxvY2tzXG4gIG1zZyA9IHV0aWxzLnRvQXJyYXkobXNnLCBlbmMpO1xuICBpZiAoIXRoaXMucGVuZGluZylcbiAgICB0aGlzLnBlbmRpbmcgPSBtc2c7XG4gIGVsc2VcbiAgICB0aGlzLnBlbmRpbmcgPSB0aGlzLnBlbmRpbmcuY29uY2F0KG1zZyk7XG4gIHRoaXMucGVuZGluZ1RvdGFsICs9IG1zZy5sZW5ndGg7XG5cbiAgLy8gRW5vdWdoIGRhdGEsIHRyeSB1cGRhdGluZ1xuICBpZiAodGhpcy5wZW5kaW5nLmxlbmd0aCA+PSB0aGlzLl9kZWx0YTgpIHtcbiAgICBtc2cgPSB0aGlzLnBlbmRpbmc7XG5cbiAgICAvLyBQcm9jZXNzIHBlbmRpbmcgZGF0YSBpbiBibG9ja3NcbiAgICB2YXIgciA9IG1zZy5sZW5ndGggJSB0aGlzLl9kZWx0YTg7XG4gICAgdGhpcy5wZW5kaW5nID0gbXNnLnNsaWNlKG1zZy5sZW5ndGggLSByLCBtc2cubGVuZ3RoKTtcbiAgICBpZiAodGhpcy5wZW5kaW5nLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG5cbiAgICBtc2cgPSB1dGlscy5qb2luMzIobXNnLCAwLCBtc2cubGVuZ3RoIC0gciwgdGhpcy5lbmRpYW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSB0aGlzLl9kZWx0YTMyKVxuICAgICAgdGhpcy5fdXBkYXRlKG1zZywgaSwgaSArIHRoaXMuX2RlbHRhMzIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgdGhpcy51cGRhdGUodGhpcy5fcGFkKCkpO1xuICBhc3NlcnQodGhpcy5wZW5kaW5nID09PSBudWxsKTtcblxuICByZXR1cm4gdGhpcy5fZGlnZXN0KGVuYyk7XG59O1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLl9wYWQgPSBmdW5jdGlvbiBwYWQoKSB7XG4gIHZhciBsZW4gPSB0aGlzLnBlbmRpbmdUb3RhbDtcbiAgdmFyIGJ5dGVzID0gdGhpcy5fZGVsdGE4O1xuICB2YXIgayA9IGJ5dGVzIC0gKChsZW4gKyB0aGlzLnBhZExlbmd0aCkgJSBieXRlcyk7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkoayArIHRoaXMucGFkTGVuZ3RoKTtcbiAgcmVzWzBdID0gMHg4MDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBrOyBpKyspXG4gICAgcmVzW2ldID0gMDtcblxuICAvLyBBcHBlbmQgbGVuZ3RoXG4gIGxlbiA8PD0gMztcbiAgaWYgKHRoaXMuZW5kaWFuID09PSAnYmlnJykge1xuICAgIGZvciAodmFyIHQgPSA4OyB0IDwgdGhpcy5wYWRMZW5ndGg7IHQrKylcbiAgICAgIHJlc1tpKytdID0gMDtcblxuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDI0KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAxNikgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gOCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gbGVuICYgMHhmZjtcbiAgfSBlbHNlIHtcbiAgICByZXNbaSsrXSA9IGxlbiAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiA4KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAxNikgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMjQpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG5cbiAgICBmb3IgKHZhciB0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcbiIsInZhciBobWFjID0gZXhwb3J0cztcblxudmFyIGhhc2ggPSByZXF1aXJlKCcuLi9oYXNoJyk7XG52YXIgdXRpbHMgPSBoYXNoLnV0aWxzO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gSG1hYyhoYXNoLCBrZXksIGVuYykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hYykpXG4gICAgcmV0dXJuIG5ldyBIbWFjKGhhc2gsIGtleSwgZW5jKTtcbiAgdGhpcy5IYXNoID0gaGFzaDtcbiAgdGhpcy5ibG9ja1NpemUgPSBoYXNoLmJsb2NrU2l6ZSAvIDg7XG4gIHRoaXMub3V0U2l6ZSA9IGhhc2gub3V0U2l6ZSAvIDg7XG4gIHRoaXMuaW5uZXIgPSBudWxsO1xuICB0aGlzLm91dGVyID0gbnVsbDtcblxuICB0aGlzLl9pbml0KHV0aWxzLnRvQXJyYXkoa2V5LCBlbmMpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gSG1hYztcblxuSG1hYy5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGtleSkge1xuICAvLyBTaG9ydGVuIGtleSwgaWYgbmVlZGVkXG4gIGlmIChrZXkubGVuZ3RoID4gdGhpcy5ibG9ja1NpemUpXG4gICAga2V5ID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpO1xuICBhc3NlcnQoa2V5Lmxlbmd0aCA8PSB0aGlzLmJsb2NrU2l6ZSk7XG5cbiAgLy8gQWRkIHBhZGRpbmcgdG8ga2V5XG4gIGZvciAodmFyIGkgPSBrZXkubGVuZ3RoOyBpIDwgdGhpcy5ibG9ja1NpemU7IGkrKylcbiAgICBrZXkucHVzaCgwKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHgzNjtcbiAgdGhpcy5pbm5lciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcblxuICAvLyAweDM2IF4gMHg1YyA9IDB4NmFcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXG4gICAga2V5W2ldIF49IDB4NmE7XG4gIHRoaXMub3V0ZXIgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSk7XG59O1xuXG5IbWFjLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBlbmMpIHtcbiAgdGhpcy5pbm5lci51cGRhdGUobXNnLCBlbmMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkhtYWMucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgdGhpcy5vdXRlci51cGRhdGUodGhpcy5pbm5lci5kaWdlc3QoKSk7XG4gIHJldHVybiB0aGlzLm91dGVyLmRpZ2VzdChlbmMpO1xufTtcbiIsInZhciBoYXNoID0gcmVxdWlyZSgnLi4vaGFzaCcpO1xudmFyIHV0aWxzID0gaGFzaC51dGlscztcblxudmFyIHJvdGwzMiA9IHV0aWxzLnJvdGwzMjtcbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzMgPSB1dGlscy5zdW0zMl8zO1xudmFyIHN1bTMyXzQgPSB1dGlscy5zdW0zMl80O1xudmFyIEJsb2NrSGFzaCA9IGhhc2guY29tbW9uLkJsb2NrSGFzaDtcblxuZnVuY3Rpb24gUklQRU1EMTYwKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUklQRU1EMTYwKSlcbiAgICByZXR1cm4gbmV3IFJJUEVNRDE2MCgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMuaCA9IFsgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLmVuZGlhbiA9ICdsaXR0bGUnO1xufVxudXRpbHMuaW5oZXJpdHMoUklQRU1EMTYwLCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5yaXBlbWQxNjAgPSBSSVBFTUQxNjA7XG5cblJJUEVNRDE2MC5ibG9ja1NpemUgPSA1MTI7XG5SSVBFTUQxNjAub3V0U2l6ZSA9IDE2MDtcblJJUEVNRDE2MC5obWFjU3RyZW5ndGggPSAxOTI7XG5SSVBFTUQxNjAucGFkTGVuZ3RoID0gNjQ7XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBBID0gdGhpcy5oWzBdO1xuICB2YXIgQiA9IHRoaXMuaFsxXTtcbiAgdmFyIEMgPSB0aGlzLmhbMl07XG4gIHZhciBEID0gdGhpcy5oWzNdO1xuICB2YXIgRSA9IHRoaXMuaFs0XTtcbiAgdmFyIEFoID0gQTtcbiAgdmFyIEJoID0gQjtcbiAgdmFyIENoID0gQztcbiAgdmFyIERoID0gRDtcbiAgdmFyIEVoID0gRTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgaisrKSB7XG4gICAgdmFyIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBLCBmKGosIEIsIEMsIEQpLCBtc2dbcltqXSArIHN0YXJ0XSwgSyhqKSksXG4gICAgICAgIHNbal0pLFxuICAgICAgRSk7XG4gICAgQSA9IEU7XG4gICAgRSA9IEQ7XG4gICAgRCA9IHJvdGwzMihDLCAxMCk7XG4gICAgQyA9IEI7XG4gICAgQiA9IFQ7XG4gICAgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEFoLCBmKDc5IC0gaiwgQmgsIENoLCBEaCksIG1zZ1tyaFtqXSArIHN0YXJ0XSwgS2goaikpLFxuICAgICAgICBzaFtqXSksXG4gICAgICBFaCk7XG4gICAgQWggPSBFaDtcbiAgICBFaCA9IERoO1xuICAgIERoID0gcm90bDMyKENoLCAxMCk7XG4gICAgQ2ggPSBCaDtcbiAgICBCaCA9IFQ7XG4gIH1cbiAgVCA9IHN1bTMyXzModGhpcy5oWzFdLCBDLCBEaCk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyXzModGhpcy5oWzJdLCBELCBFaCk7XG4gIHRoaXMuaFsyXSA9IHN1bTMyXzModGhpcy5oWzNdLCBFLCBBaCk7XG4gIHRoaXMuaFszXSA9IHN1bTMyXzModGhpcy5oWzRdLCBBLCBCaCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyXzModGhpcy5oWzBdLCBCLCBDaCk7XG4gIHRoaXMuaFswXSA9IFQ7XG59O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnbGl0dGxlJyk7XG59O1xuXG5mdW5jdGlvbiBmKGosIHgsIHksIHopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIHggXiB5IF4gejtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gKHggJiB5KSB8ICgofngpICYgeik7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuICh4IHwgKH55KSkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiAofnopKTtcbiAgZWxzZVxuICAgIHJldHVybiB4IF4gKHkgfCAofnopKTtcbn1cblxuZnVuY3Rpb24gSyhqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVhODI3OTk5O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZlZDllYmExO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDhmMWJiY2RjO1xuICBlbHNlXG4gICAgcmV0dXJuIDB4YTk1M2ZkNGU7XG59XG5cbmZ1bmN0aW9uIEtoKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4NTBhMjhiZTY7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWM0ZGQxMjQ7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmQ3MDNlZjM7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4N2E2ZDc2ZTk7XG4gIGVsc2VcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbn1cblxudmFyIHIgPSBbXG4gIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gIDcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDgsXG4gIDMsIDEwLCAxNCwgNCwgOSwgMTUsIDgsIDEsIDIsIDcsIDAsIDYsIDEzLCAxMSwgNSwgMTIsXG4gIDEsIDksIDExLCAxMCwgMCwgOCwgMTIsIDQsIDEzLCAzLCA3LCAxNSwgMTQsIDUsIDYsIDIsXG4gIDQsIDAsIDUsIDksIDcsIDEyLCAyLCAxMCwgMTQsIDEsIDMsIDgsIDExLCA2LCAxNSwgMTNcbl07XG5cbnZhciByaCA9IFtcbiAgNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMixcbiAgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMixcbiAgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMyxcbiAgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCxcbiAgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMVxuXTtcblxudmFyIHMgPSBbXG4gIDExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCxcbiAgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLFxuICAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsXG4gIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMixcbiAgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XG5dO1xuXG52YXIgc2ggPSBbXG4gIDgsIDksIDksIDExLCAxMywgMTUsIDE1LCA1LCA3LCA3LCA4LCAxMSwgMTQsIDE0LCAxMiwgNixcbiAgOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExLFxuICA5LCA3LCAxNSwgMTEsIDgsIDYsIDYsIDE0LCAxMiwgMTMsIDUsIDE0LCAxMywgMTMsIDcsIDUsXG4gIDE1LCA1LCA4LCAxMSwgMTQsIDE0LCA2LCAxNCwgNiwgOSwgMTIsIDksIDEyLCA1LCAxNSwgOCxcbiAgOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExXG5dO1xuIiwidmFyIGhhc2ggPSByZXF1aXJlKCcuLi9oYXNoJyk7XG52YXIgdXRpbHMgPSBoYXNoLnV0aWxzO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxudmFyIHJvdHIzMiA9IHV0aWxzLnJvdHIzMjtcbnZhciByb3RsMzIgPSB1dGlscy5yb3RsMzI7XG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl80ID0gdXRpbHMuc3VtMzJfNDtcbnZhciBzdW0zMl81ID0gdXRpbHMuc3VtMzJfNTtcbnZhciByb3RyNjRfaGkgPSB1dGlscy5yb3RyNjRfaGk7XG52YXIgcm90cjY0X2xvID0gdXRpbHMucm90cjY0X2xvO1xudmFyIHNocjY0X2hpID0gdXRpbHMuc2hyNjRfaGk7XG52YXIgc2hyNjRfbG8gPSB1dGlscy5zaHI2NF9sbztcbnZhciBzdW02NCA9IHV0aWxzLnN1bTY0O1xudmFyIHN1bTY0X2hpID0gdXRpbHMuc3VtNjRfaGk7XG52YXIgc3VtNjRfbG8gPSB1dGlscy5zdW02NF9sbztcbnZhciBzdW02NF80X2hpID0gdXRpbHMuc3VtNjRfNF9oaTtcbnZhciBzdW02NF80X2xvID0gdXRpbHMuc3VtNjRfNF9sbztcbnZhciBzdW02NF81X2hpID0gdXRpbHMuc3VtNjRfNV9oaTtcbnZhciBzdW02NF81X2xvID0gdXRpbHMuc3VtNjRfNV9sbztcbnZhciBCbG9ja0hhc2ggPSBoYXNoLmNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGEyNTZfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSxcbiAgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMyxcbiAgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCxcbiAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYyxcbiAgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSxcbiAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNyxcbiAgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMyxcbiAgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSxcbiAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMyxcbiAgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCxcbiAgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSxcbiAgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCxcbiAgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMlxuXTtcblxudmFyIHNoYTUxMl9LID0gW1xuICAweDQyOGEyZjk4LCAweGQ3MjhhZTIyLCAweDcxMzc0NDkxLCAweDIzZWY2NWNkLFxuICAweGI1YzBmYmNmLCAweGVjNGQzYjJmLCAweGU5YjVkYmE1LCAweDgxODlkYmJjLFxuICAweDM5NTZjMjViLCAweGYzNDhiNTM4LCAweDU5ZjExMWYxLCAweGI2MDVkMDE5LFxuICAweDkyM2Y4MmE0LCAweGFmMTk0ZjliLCAweGFiMWM1ZWQ1LCAweGRhNmQ4MTE4LFxuICAweGQ4MDdhYTk4LCAweGEzMDMwMjQyLCAweDEyODM1YjAxLCAweDQ1NzA2ZmJlLFxuICAweDI0MzE4NWJlLCAweDRlZTRiMjhjLCAweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyLFxuICAweDcyYmU1ZDc0LCAweGYyN2I4OTZmLCAweDgwZGViMWZlLCAweDNiMTY5NmIxLFxuICAweDliZGMwNmE3LCAweDI1YzcxMjM1LCAweGMxOWJmMTc0LCAweGNmNjkyNjk0LFxuICAweGU0OWI2OWMxLCAweDllZjE0YWQyLCAweGVmYmU0Nzg2LCAweDM4NGYyNWUzLFxuICAweDBmYzE5ZGM2LCAweDhiOGNkNWI1LCAweDI0MGNhMWNjLCAweDc3YWM5YzY1LFxuICAweDJkZTkyYzZmLCAweDU5MmIwMjc1LCAweDRhNzQ4NGFhLCAweDZlYTZlNDgzLFxuICAweDVjYjBhOWRjLCAweGJkNDFmYmQ0LCAweDc2Zjk4OGRhLCAweDgzMTE1M2I1LFxuICAweDk4M2U1MTUyLCAweGVlNjZkZmFiLCAweGE4MzFjNjZkLCAweDJkYjQzMjEwLFxuICAweGIwMDMyN2M4LCAweDk4ZmIyMTNmLCAweGJmNTk3ZmM3LCAweGJlZWYwZWU0LFxuICAweGM2ZTAwYmYzLCAweDNkYTg4ZmMyLCAweGQ1YTc5MTQ3LCAweDkzMGFhNzI1LFxuICAweDA2Y2E2MzUxLCAweGUwMDM4MjZmLCAweDE0MjkyOTY3LCAweDBhMGU2ZTcwLFxuICAweDI3YjcwYTg1LCAweDQ2ZDIyZmZjLCAweDJlMWIyMTM4LCAweDVjMjZjOTI2LFxuICAweDRkMmM2ZGZjLCAweDVhYzQyYWVkLCAweDUzMzgwZDEzLCAweDlkOTViM2RmLFxuICAweDY1MGE3MzU0LCAweDhiYWY2M2RlLCAweDc2NmEwYWJiLCAweDNjNzdiMmE4LFxuICAweDgxYzJjOTJlLCAweDQ3ZWRhZWU2LCAweDkyNzIyYzg1LCAweDE0ODIzNTNiLFxuICAweGEyYmZlOGExLCAweDRjZjEwMzY0LCAweGE4MWE2NjRiLCAweGJjNDIzMDAxLFxuICAweGMyNGI4YjcwLCAweGQwZjg5NzkxLCAweGM3NmM1MWEzLCAweDA2NTRiZTMwLFxuICAweGQxOTJlODE5LCAweGQ2ZWY1MjE4LCAweGQ2OTkwNjI0LCAweDU1NjVhOTEwLFxuICAweGY0MGUzNTg1LCAweDU3NzEyMDJhLCAweDEwNmFhMDcwLCAweDMyYmJkMWI4LFxuICAweDE5YTRjMTE2LCAweGI4ZDJkMGM4LCAweDFlMzc2YzA4LCAweDUxNDFhYjUzLFxuICAweDI3NDg3NzRjLCAweGRmOGVlYjk5LCAweDM0YjBiY2I1LCAweGUxOWI0OGE4LFxuICAweDM5MWMwY2IzLCAweGM1Yzk1YTYzLCAweDRlZDhhYTRhLCAweGUzNDE4YWNiLFxuICAweDViOWNjYTRmLCAweDc3NjNlMzczLCAweDY4MmU2ZmYzLCAweGQ2YjJiOGEzLFxuICAweDc0OGY4MmVlLCAweDVkZWZiMmZjLCAweDc4YTU2MzZmLCAweDQzMTcyZjYwLFxuICAweDg0Yzg3ODE0LCAweGExZjBhYjcyLCAweDhjYzcwMjA4LCAweDFhNjQzOWVjLFxuICAweDkwYmVmZmZhLCAweDIzNjMxZTI4LCAweGE0NTA2Y2ViLCAweGRlODJiZGU5LFxuICAweGJlZjlhM2Y3LCAweGIyYzY3OTE1LCAweGM2NzE3OGYyLCAweGUzNzI1MzJiLFxuICAweGNhMjczZWNlLCAweGVhMjY2MTljLCAweGQxODZiOGM3LCAweDIxYzBjMjA3LFxuICAweGVhZGE3ZGQ2LCAweGNkZTBlYjFlLCAweGY1N2Q0ZjdmLCAweGVlNmVkMTc4LFxuICAweDA2ZjA2N2FhLCAweDcyMTc2ZmJhLCAweDBhNjM3ZGM1LCAweGEyYzg5OGE2LFxuICAweDExM2Y5ODA0LCAweGJlZjkwZGFlLCAweDFiNzEwYjM1LCAweDEzMWM0NzFiLFxuICAweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0LCAweDMyY2FhYjdiLCAweDQwYzcyNDkzLFxuICAweDNjOWViZTBhLCAweDE1YzliZWJjLCAweDQzMWQ2N2M0LCAweDljMTAwZDRjLFxuICAweDRjYzVkNGJlLCAweGNiM2U0MmI2LCAweDU5N2YyOTljLCAweGZjNjU3ZTJhLFxuICAweDVmY2I2ZmFiLCAweDNhZDZmYWVjLCAweDZjNDQxOThjLCAweDRhNDc1ODE3XG5dO1xuXG52YXIgc2hhMV9LID0gW1xuICAweDVBODI3OTk5LCAweDZFRDlFQkExLFxuICAweDhGMUJCQ0RDLCAweENBNjJDMUQ2XG5dO1xuXG5mdW5jdGlvbiBTSEEyNTYoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEyNTYpKVxuICAgIHJldHVybiBuZXcgU0hBMjU2KCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFsgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSxcbiAgICAgICAgICAgICAweDUxMGU1MjdmLCAweDliMDU2ODhjLCAweDFmODNkOWFiLCAweDViZTBjZDE5IF07XG4gIHRoaXMuayA9IHNoYTI1Nl9LO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoNjQpO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBMjU2LCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5zaGEyNTYgPSBTSEEyNTY7XG5cblNIQTI1Ni5ibG9ja1NpemUgPSA1MTI7XG5TSEEyNTYub3V0U2l6ZSA9IDI1NjtcblNIQTI1Ni5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEyNTYucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTI1Ni5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXG4gICAgV1tpXSA9IG1zZ1tzdGFydCArIGldO1xuICBmb3IgKDsgaSA8IFcubGVuZ3RoOyBpKyspXG4gICAgV1tpXSA9IHN1bTMyXzQoZzFfMjU2KFdbaSAtIDJdKSwgV1tpIC0gN10sIGcwXzI1NihXW2kgLSAxNV0pLCBXW2kgLSAxNl0pO1xuXG4gIHZhciBhID0gdGhpcy5oWzBdO1xuICB2YXIgYiA9IHRoaXMuaFsxXTtcbiAgdmFyIGMgPSB0aGlzLmhbMl07XG4gIHZhciBkID0gdGhpcy5oWzNdO1xuICB2YXIgZSA9IHRoaXMuaFs0XTtcbiAgdmFyIGYgPSB0aGlzLmhbNV07XG4gIHZhciBnID0gdGhpcy5oWzZdO1xuICB2YXIgaCA9IHRoaXMuaFs3XTtcblxuICBhc3NlcnQodGhpcy5rLmxlbmd0aCA9PT0gVy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgVDEgPSBzdW0zMl81KGgsIHMxXzI1NihlKSwgY2gzMihlLCBmLCBnKSwgdGhpcy5rW2ldLCBXW2ldKTtcbiAgICB2YXIgVDIgPSBzdW0zMihzMF8yNTYoYSksIG1hajMyKGEsIGIsIGMpKTtcbiAgICBoID0gZztcbiAgICBnID0gZjtcbiAgICBmID0gZTtcbiAgICBlID0gc3VtMzIoZCwgVDEpO1xuICAgIGQgPSBjO1xuICAgIGMgPSBiO1xuICAgIGIgPSBhO1xuICAgIGEgPSBzdW0zMihUMSwgVDIpO1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbiAgdGhpcy5oWzVdID0gc3VtMzIodGhpcy5oWzVdLCBmKTtcbiAgdGhpcy5oWzZdID0gc3VtMzIodGhpcy5oWzZdLCBnKTtcbiAgdGhpcy5oWzddID0gc3VtMzIodGhpcy5oWzddLCBoKTtcbn07XG5cblNIQTI1Ni5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG5cbmZ1bmN0aW9uIFNIQTIyNCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTIyNCkpXG4gICAgcmV0dXJuIG5ldyBTSEEyMjQoKTtcblxuICBTSEEyNTYuY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gWyAweGMxMDU5ZWQ4LCAweDM2N2NkNTA3LCAweDMwNzBkZDE3LCAweGY3MGU1OTM5LFxuICAgICAgICAgICAgIDB4ZmZjMDBiMzEsIDB4Njg1ODE1MTEsIDB4NjRmOThmYTcsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTIyNCwgU0hBMjU2KTtcbmV4cG9ydHMuc2hhMjI0ID0gU0hBMjI0O1xuXG5TSEEyMjQuYmxvY2tTaXplID0gNTEyO1xuU0hBMjI0Lm91dFNpemUgPSAyMjQ7XG5TSEEyMjQuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjI0LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyMjQucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIC8vIEp1c3QgdHJ1bmNhdGUgb3V0cHV0XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLCA3KSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG59O1xuXG5mdW5jdGlvbiBTSEE1MTIoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEE1MTIpKVxuICAgIHJldHVybiBuZXcgU0hBNTEyKCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFsgMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCxcbiAgICAgICAgICAgICAweGJiNjdhZTg1LCAweDg0Y2FhNzNiLFxuICAgICAgICAgICAgIDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIsXG4gICAgICAgICAgICAgMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSxcbiAgICAgICAgICAgICAweDUxMGU1MjdmLCAweGFkZTY4MmQxLFxuICAgICAgICAgICAgIDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYsXG4gICAgICAgICAgICAgMHgxZjgzZDlhYiwgMHhmYjQxYmQ2YixcbiAgICAgICAgICAgICAweDViZTBjZDE5LCAweDEzN2UyMTc5IF07XG4gIHRoaXMuayA9IHNoYTUxMl9LO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoMTYwKTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTUxMiwgQmxvY2tIYXNoKTtcbmV4cG9ydHMuc2hhNTEyID0gU0hBNTEyO1xuXG5TSEE1MTIuYmxvY2tTaXplID0gMTAyNDtcblNIQTUxMi5vdXRTaXplID0gNTEyO1xuU0hBNTEyLmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTUxMi5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTUxMi5wcm90b3R5cGUuX3ByZXBhcmVCbG9jayA9IGZ1bmN0aW9uIF9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICAvLyAzMiB4IDMyYml0IHdvcmRzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGcxXzUxMl9oaShXW2kgLSA0XSwgV1tpIC0gM10pOyAgLy8gaSAtIDJcbiAgICB2YXIgYzBfbG8gPSBnMV81MTJfbG8oV1tpIC0gNF0sIFdbaSAtIDNdKTtcbiAgICB2YXIgYzFfaGkgPSBXW2kgLSAxNF07ICAvLyBpIC0gN1xuICAgIHZhciBjMV9sbyA9IFdbaSAtIDEzXTtcbiAgICB2YXIgYzJfaGkgPSBnMF81MTJfaGkoV1tpIC0gMzBdLCBXW2kgLSAyOV0pOyAgLy8gaSAtIDE1XG4gICAgdmFyIGMyX2xvID0gZzBfNTEyX2xvKFdbaSAtIDMwXSwgV1tpIC0gMjldKTtcbiAgICB2YXIgYzNfaGkgPSBXW2kgLSAzMl07ICAvLyBpIC0gMTZcbiAgICB2YXIgYzNfbG8gPSBXW2kgLSAzMV07XG5cbiAgICBXW2ldID0gc3VtNjRfNF9oaShjMF9oaSwgYzBfbG8sXG4gICAgICAgICAgICAgICAgICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgICAgICAgICAgICAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgICAgICAgICAgICAgICAgICBjM19oaSwgYzNfbG8pO1xuICAgIFdbaSArIDFdID0gc3VtNjRfNF9sbyhjMF9oaSwgYzBfbG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjM19oaSwgYzNfbG8pO1xuICB9XG59O1xuXG5TSEE1MTIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdGhpcy5fcHJlcGFyZUJsb2NrKG1zZywgc3RhcnQpO1xuXG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIHZhciBhaCA9IHRoaXMuaFswXTtcbiAgdmFyIGFsID0gdGhpcy5oWzFdO1xuICB2YXIgYmggPSB0aGlzLmhbMl07XG4gIHZhciBibCA9IHRoaXMuaFszXTtcbiAgdmFyIGNoID0gdGhpcy5oWzRdO1xuICB2YXIgY2wgPSB0aGlzLmhbNV07XG4gIHZhciBkaCA9IHRoaXMuaFs2XTtcbiAgdmFyIGRsID0gdGhpcy5oWzddO1xuICB2YXIgZWggPSB0aGlzLmhbOF07XG4gIHZhciBlbCA9IHRoaXMuaFs5XTtcbiAgdmFyIGZoID0gdGhpcy5oWzEwXTtcbiAgdmFyIGZsID0gdGhpcy5oWzExXTtcbiAgdmFyIGdoID0gdGhpcy5oWzEyXTtcbiAgdmFyIGdsID0gdGhpcy5oWzEzXTtcbiAgdmFyIGhoID0gdGhpcy5oWzE0XTtcbiAgdmFyIGhsID0gdGhpcy5oWzE1XTtcblxuICBhc3NlcnQodGhpcy5rLmxlbmd0aCA9PT0gVy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IFcubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgYzBfaGkgPSBoaDtcbiAgICB2YXIgYzBfbG8gPSBobDtcbiAgICB2YXIgYzFfaGkgPSBzMV81MTJfaGkoZWgsIGVsKTtcbiAgICB2YXIgYzFfbG8gPSBzMV81MTJfbG8oZWgsIGVsKTtcbiAgICB2YXIgYzJfaGkgPSBjaDY0X2hpKGVoLCBlbCwgZmgsIGZsLCBnaCwgZ2wpO1xuICAgIHZhciBjMl9sbyA9IGNoNjRfbG8oZWgsIGVsLCBmaCwgZmwsIGdoLCBnbCk7XG4gICAgdmFyIGMzX2hpID0gdGhpcy5rW2ldO1xuICAgIHZhciBjM19sbyA9IHRoaXMua1tpICsgMV07XG4gICAgdmFyIGM0X2hpID0gV1tpXTtcbiAgICB2YXIgYzRfbG8gPSBXW2kgKyAxXTtcblxuICAgIHZhciBUMV9oaSA9IHN1bTY0XzVfaGkoYzBfaGksIGMwX2xvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYzRfaGksIGM0X2xvKTtcbiAgICB2YXIgVDFfbG8gPSBzdW02NF81X2xvKGMwX2hpLCBjMF9sbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGMzX2hpLCBjM19sbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGM0X2hpLCBjNF9sbyk7XG5cbiAgICB2YXIgYzBfaGkgPSBzMF81MTJfaGkoYWgsIGFsKTtcbiAgICB2YXIgYzBfbG8gPSBzMF81MTJfbG8oYWgsIGFsKTtcbiAgICB2YXIgYzFfaGkgPSBtYWo2NF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsKTtcbiAgICB2YXIgYzFfbG8gPSBtYWo2NF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsKTtcblxuICAgIHZhciBUMl9oaSA9IHN1bTY0X2hpKGMwX2hpLCBjMF9sbywgYzFfaGksIGMxX2xvKTtcbiAgICB2YXIgVDJfbG8gPSBzdW02NF9sbyhjMF9oaSwgYzBfbG8sIGMxX2hpLCBjMV9sbyk7XG5cbiAgICBoaCA9IGdoO1xuICAgIGhsID0gZ2w7XG5cbiAgICBnaCA9IGZoO1xuICAgIGdsID0gZmw7XG5cbiAgICBmaCA9IGVoO1xuICAgIGZsID0gZWw7XG5cbiAgICBlaCA9IHN1bTY0X2hpKGRoLCBkbCwgVDFfaGksIFQxX2xvKTtcbiAgICBlbCA9IHN1bTY0X2xvKGRsLCBkbCwgVDFfaGksIFQxX2xvKTtcblxuICAgIGRoID0gY2g7XG4gICAgZGwgPSBjbDtcblxuICAgIGNoID0gYmg7XG4gICAgY2wgPSBibDtcblxuICAgIGJoID0gYWg7XG4gICAgYmwgPSBhbDtcblxuICAgIGFoID0gc3VtNjRfaGkoVDFfaGksIFQxX2xvLCBUMl9oaSwgVDJfbG8pO1xuICAgIGFsID0gc3VtNjRfbG8oVDFfaGksIFQxX2xvLCBUMl9oaSwgVDJfbG8pO1xuICB9XG5cbiAgc3VtNjQodGhpcy5oLCAwLCBhaCwgYWwpO1xuICBzdW02NCh0aGlzLmgsIDIsIGJoLCBibCk7XG4gIHN1bTY0KHRoaXMuaCwgNCwgY2gsIGNsKTtcbiAgc3VtNjQodGhpcy5oLCA2LCBkaCwgZGwpO1xuICBzdW02NCh0aGlzLmgsIDgsIGVoLCBlbCk7XG4gIHN1bTY0KHRoaXMuaCwgMTAsIGZoLCBmbCk7XG4gIHN1bTY0KHRoaXMuaCwgMTIsIGdoLCBnbCk7XG4gIHN1bTY0KHRoaXMuaCwgMTQsIGhoLCBobCk7XG59O1xuXG5TSEE1MTIucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuXG5mdW5jdGlvbiBTSEEzODQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEzODQpKVxuICAgIHJldHVybiBuZXcgU0hBMzg0KCk7XG5cbiAgU0hBNTEyLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFsgMHhjYmJiOWQ1ZCwgMHhjMTA1OWVkOCxcbiAgICAgICAgICAgICAweDYyOWEyOTJhLCAweDM2N2NkNTA3LFxuICAgICAgICAgICAgIDB4OTE1OTAxNWEsIDB4MzA3MGRkMTcsXG4gICAgICAgICAgICAgMHgxNTJmZWNkOCwgMHhmNzBlNTkzOSxcbiAgICAgICAgICAgICAweDY3MzMyNjY3LCAweGZmYzAwYjMxLFxuICAgICAgICAgICAgIDB4OGViNDRhODcsIDB4Njg1ODE1MTEsXG4gICAgICAgICAgICAgMHhkYjBjMmUwZCwgMHg2NGY5OGZhNyxcbiAgICAgICAgICAgICAweDQ3YjU0ODFkLCAweGJlZmE0ZmE0IF07XG59XG51dGlscy5pbmhlcml0cyhTSEEzODQsIFNIQTUxMik7XG5leHBvcnRzLnNoYTM4NCA9IFNIQTM4NDtcblxuU0hBMzg0LmJsb2NrU2l6ZSA9IDEwMjQ7XG5TSEEzODQub3V0U2l6ZSA9IDM4NDtcblNIQTM4NC5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEzODQucGFkTGVuZ3RoID0gMTI4O1xuXG5TSEEzODQucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLCAxMiksICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLCAxMiksICdiaWcnKTtcbn07XG5cbmZ1bmN0aW9uIFNIQTEoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEExKSlcbiAgICByZXR1cm4gbmV3IFNIQTEoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gWyAweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLFxuICAgICAgICAgICAgIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjAgXTtcbiAgdGhpcy5XID0gbmV3IEFycmF5KDgwKTtcbn1cblxudXRpbHMuaW5oZXJpdHMoU0hBMSwgQmxvY2tIYXNoKTtcbmV4cG9ydHMuc2hhMSA9IFNIQTE7XG5cblNIQTEuYmxvY2tTaXplID0gNTEyO1xuU0hBMS5vdXRTaXplID0gMTYwO1xuU0hBMS5obWFjU3RyZW5ndGggPSA4MDtcblNIQTEucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcblxuICBmb3IoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gcm90bDMyKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0sIDEpO1xuXG4gIHZhciBhID0gdGhpcy5oWzBdO1xuICB2YXIgYiA9IHRoaXMuaFsxXTtcbiAgdmFyIGMgPSB0aGlzLmhbMl07XG4gIHZhciBkID0gdGhpcy5oWzNdO1xuICB2YXIgZSA9IHRoaXMuaFs0XTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcyA9IH5+KGkgLyAyMCk7XG4gICAgdmFyIHQgPSBzdW0zMl81KHJvdGwzMihhLCA1KSwgZnRfMShzLCBiLCBjLCBkKSwgZSwgV1tpXSwgc2hhMV9LW3NdKTtcbiAgICBlID0gZDtcbiAgICBkID0gYztcbiAgICBjID0gcm90bDMyKGIsIDMwKTtcbiAgICBiID0gYTtcbiAgICBhID0gdDtcbiAgfVxuXG4gIHRoaXMuaFswXSA9IHN1bTMyKHRoaXMuaFswXSwgYSk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyKHRoaXMuaFsxXSwgYik7XG4gIHRoaXMuaFsyXSA9IHN1bTMyKHRoaXMuaFsyXSwgYyk7XG4gIHRoaXMuaFszXSA9IHN1bTMyKHRoaXMuaFszXSwgZCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyKHRoaXMuaFs0XSwgZSk7XG59O1xuXG5TSEExLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcblxuZnVuY3Rpb24gY2gzMih4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIF4gKCh+eCkgJiB6KTtcbn1cblxuZnVuY3Rpb24gbWFqMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopO1xufVxuXG5mdW5jdGlvbiBwMzIoeCwgeSwgeikge1xuICByZXR1cm4geCBeIHkgXiB6O1xufVxuXG5mdW5jdGlvbiBzMF8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDIpIF4gcm90cjMyKHgsIDEzKSBeIHJvdHIzMih4LCAyMik7XG59XG5cbmZ1bmN0aW9uIHMxXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgNikgXiByb3RyMzIoeCwgMTEpIF4gcm90cjMyKHgsIDI1KTtcbn1cblxuZnVuY3Rpb24gZzBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA3KSBeIHJvdHIzMih4LCAxOCkgXiAoeCA+Pj4gMyk7XG59XG5cbmZ1bmN0aW9uIGcxXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMTcpIF4gcm90cjMyKHgsIDE5KSBeICh4ID4+PiAxMCk7XG59XG5cbmZ1bmN0aW9uIGZ0XzEocywgeCwgeSwgeikge1xuICBpZiAocyA9PT0gMClcbiAgICByZXR1cm4gY2gzMih4LCB5LCB6KTtcbiAgaWYgKHMgPT09IDEgfHwgcyA9PT0gMylcbiAgICByZXR1cm4gcDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMilcbiAgICByZXR1cm4gbWFqMzIoeCwgeSwgeik7XG59XG5cbmZ1bmN0aW9uIGNoNjRfaGkoeGgsIHhsLCB5aCwgeWwsIHpoLCB6bCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICgofnhoKSAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBjaDY0X2xvKHhoLCB4bCwgeWgsIHlsLCB6aCwgemwpIHtcbiAgdmFyIHIgPSAoeGwgJiB5bCkgXiAoKH54bCkgJiB6bCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gbWFqNjRfaGkoeGgsIHhsLCB5aCwgeWwsIHpoLCB6bCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICh4aCAmIHpoKSBeICh5aCAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKHhsICYgemwpIF4gKHlsICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDEpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDEpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuIiwidmFyIHV0aWxzID0gZXhwb3J0cztcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmZ1bmN0aW9uIHRvQXJyYXkobXNnLCBlbmMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobXNnKSlcbiAgICByZXR1cm4gbXNnLnNsaWNlKCk7XG4gIGlmICghbXNnKVxuICAgIHJldHVybiBbXTtcbiAgdmFyIHJlcyA9IFtdO1xuICBpZiAodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIWVuYykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGMgPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICAgICAgdmFyIGhpID0gYyA+PiA4O1xuICAgICAgICB2YXIgbG8gPSBjICYgMHhmZjtcbiAgICAgICAgaWYgKGhpKVxuICAgICAgICAgIHJlcy5wdXNoKGhpLCBsbyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXMucHVzaChsbyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvW15hLXowLTldKy9pZywgJycpO1xuICAgICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgcmVzLnB1c2gocGFyc2VJbnQobXNnW2ldICsgbXNnW2kgKyAxXSwgMTYpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgICByZXNbaV0gPSBtc2dbaV0gfCAwO1xuICB9XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxudXRpbHMudG9IZXggPSB0b0hleDtcblxuZnVuY3Rpb24gaHRvbmwodykge1xuICB2YXIgcmVzID0gKHcgPj4+IDI0KSB8XG4gICAgICAgICAgICAoKHcgPj4+IDgpICYgMHhmZjAwKSB8XG4gICAgICAgICAgICAoKHcgPDwgOCkgJiAweGZmMDAwMCkgfFxuICAgICAgICAgICAgKCh3ICYgMHhmZikgPDwgMjQpO1xuICByZXR1cm4gcmVzID4+PiAwO1xufVxudXRpbHMuaHRvbmwgPSBodG9ubDtcblxuZnVuY3Rpb24gdG9IZXgzMihtc2csIGVuZGlhbikge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHcgPSBtc2dbaV07XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2xpdHRsZScpXG4gICAgICB3ID0gaHRvbmwodyk7XG4gICAgcmVzICs9IHplcm84KHcudG9TdHJpbmcoMTYpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxudXRpbHMudG9IZXgzMiA9IHRvSGV4MzI7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG51dGlscy56ZXJvMiA9IHplcm8yO1xuXG5mdW5jdGlvbiB6ZXJvOCh3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gNylcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDYpXG4gICAgcmV0dXJuICcwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNSlcbiAgICByZXR1cm4gJzAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNClcbiAgICByZXR1cm4gJzAwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDMpXG4gICAgcmV0dXJuICcwMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMilcbiAgICByZXR1cm4gJzAwMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAwMDAwMDAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxudXRpbHMuemVybzggPSB6ZXJvODtcblxuZnVuY3Rpb24gam9pbjMyKG1zZywgc3RhcnQsIGVuZCwgZW5kaWFuKSB7XG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydDtcbiAgYXNzZXJ0KGxlbiAlIDQgPT09IDApO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGxlbiAvIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IHN0YXJ0OyBpIDwgcmVzLmxlbmd0aDsgaSsrLCBrICs9IDQpIHtcbiAgICB2YXIgdztcbiAgICBpZiAoZW5kaWFuID09PSAnYmlnJylcbiAgICAgIHcgPSAobXNnW2tdIDw8IDI0KSB8IChtc2dbayArIDFdIDw8IDE2KSB8IChtc2dbayArIDJdIDw8IDgpIHwgbXNnW2sgKyAzXTtcbiAgICBlbHNlXG4gICAgICB3ID0gKG1zZ1trICsgM10gPDwgMjQpIHwgKG1zZ1trICsgMl0gPDwgMTYpIHwgKG1zZ1trICsgMV0gPDwgOCkgfCBtc2dba107XG4gICAgcmVzW2ldID0gdyA+Pj4gMDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxudXRpbHMuam9pbjMyID0gam9pbjMyO1xuXG5mdW5jdGlvbiBzcGxpdDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobXNnLmxlbmd0aCAqIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciBtID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgICByZXNba10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2sgKyAzXSA9IG0gJiAweGZmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNbayArIDNdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trXSA9IG0gJiAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxudXRpbHMuc3BsaXQzMiA9IHNwbGl0MzI7XG5cbmZ1bmN0aW9uIHJvdHIzMih3LCBiKSB7XG4gIHJldHVybiAodyA+Pj4gYikgfCAodyA8PCAoMzIgLSBiKSk7XG59XG51dGlscy5yb3RyMzIgPSByb3RyMzI7XG5cbmZ1bmN0aW9uIHJvdGwzMih3LCBiKSB7XG4gIHJldHVybiAodyA8PCBiKSB8ICh3ID4+PiAoMzIgLSBiKSk7XG59XG51dGlscy5yb3RsMzIgPSByb3RsMzI7XG5cbmZ1bmN0aW9uIHN1bTMyKGEsIGIpIHtcbiAgcmV0dXJuIChhICsgYikgPj4+IDA7XG59XG51dGlscy5zdW0zMiA9IHN1bTMyO1xuXG5mdW5jdGlvbiBzdW0zMl8zKGEsIGIsIGMpIHtcbiAgcmV0dXJuIChhICsgYiArIGMpID4+PiAwO1xufVxudXRpbHMuc3VtMzJfMyA9IHN1bTMyXzM7XG5cbmZ1bmN0aW9uIHN1bTMyXzQoYSwgYiwgYywgZCkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQpID4+PiAwO1xufVxudXRpbHMuc3VtMzJfNCA9IHN1bTMyXzQ7XG5cbmZ1bmN0aW9uIHN1bTMyXzUoYSwgYiwgYywgZCwgZSkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQgKyBlKSA+Pj4gMDtcbn1cbnV0aWxzLnN1bTMyXzUgPSBzdW0zMl81O1xuXG5mdW5jdGlvbiBhc3NlcnQoY29uZCwgbXNnKSB7XG4gIGlmICghY29uZClcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICdBc3NlcnRpb24gZmFpbGVkJyk7XG59XG51dGlscy5hc3NlcnQgPSBhc3NlcnQ7XG5cbnV0aWxzLmluaGVyaXRzID0gaW5oZXJpdHM7XG5cbmZ1bmN0aW9uIHN1bTY0KGJ1ZiwgcG9zLCBhaCwgYWwpIHtcbiAgdmFyIGJoID0gYnVmW3Bvc107XG4gIHZhciBibCA9IGJ1Zltwb3MgKyAxXTtcblxuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgYnVmW3Bvc10gPSBoaSA+Pj4gMDtcbiAgYnVmW3BvcyArIDFdID0gbG87XG59XG5leHBvcnRzLnN1bTY0ID0gc3VtNjQ7XG5cbmZ1bmN0aW9uIHN1bTY0X2hpKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICByZXR1cm4gaGkgPj4+IDA7XG59O1xuZXhwb3J0cy5zdW02NF9oaSA9IHN1bTY0X2hpO1xuXG5mdW5jdGlvbiBzdW02NF9sbyhhaCwgYWwsIGJoLCBibCkge1xuICB2YXIgbG8gPSBhbCArIGJsO1xuICByZXR1cm4gbG8gPj4+IDA7XG59O1xuZXhwb3J0cy5zdW02NF9sbyA9IHN1bTY0X2xvO1xuXG5mdW5jdGlvbiBzdW02NF80X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCkge1xuICB2YXIgY2FycnkgPSAwO1xuICB2YXIgbG8gPSBhbDtcbiAgbG8gPSAobG8gKyBibCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgYWwgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBjbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgY2wgPyAxIDogMDtcbiAgbG8gPSAobG8gKyBkbCkgPj4+IDA7XG4gIGNhcnJ5ICs9IGxvIDwgZGwgPyAxIDogMDtcblxuICB2YXIgaGkgPSBhaCArIGJoICsgY2ggKyBkaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59O1xuZXhwb3J0cy5zdW02NF80X2hpID0gc3VtNjRfNF9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn07XG5leHBvcnRzLnN1bTY0XzRfbG8gPSBzdW02NF80X2xvO1xuXG5mdW5jdGlvbiBzdW02NF81X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBsbyA9IGFsO1xuICBsbyA9IChsbyArIGJsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBhbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGNsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBjbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGRsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBkbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGVsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBlbCA/IDEgOiAwO1xuXG4gIHZhciBoaSA9IGFoICsgYmggKyBjaCArIGRoICsgZWggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufTtcbmV4cG9ydHMuc3VtNjRfNV9oaSA9IHN1bTY0XzVfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0XzVfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGwgKyBlbDtcblxuICByZXR1cm4gbG8gPj4+IDA7XG59O1xuZXhwb3J0cy5zdW02NF81X2xvID0gc3VtNjRfNV9sbztcblxuZnVuY3Rpb24gcm90cjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFsIDw8ICgzMiAtIG51bSkpIHwgKGFoID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn07XG5leHBvcnRzLnJvdHI2NF9oaSA9IHJvdHI2NF9oaTtcblxuZnVuY3Rpb24gcm90cjY0X2xvKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFoIDw8ICgzMiAtIG51bSkpIHwgKGFsID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn07XG5leHBvcnRzLnJvdHI2NF9sbyA9IHJvdHI2NF9sbztcblxuZnVuY3Rpb24gc2hyNjRfaGkoYWgsIGFsLCBudW0pIHtcbiAgcmV0dXJuIGFoID4+PiBudW07XG59O1xuZXhwb3J0cy5zaHI2NF9oaSA9IHNocjY0X2hpO1xuXG5mdW5jdGlvbiBzaHI2NF9sbyhhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhaCA8PCAoMzIgLSBudW0pKSB8IChhbCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59O1xuZXhwb3J0cy5zaHI2NF9sbyA9IHNocjY0X2xvO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHplcm9CdWZmZXIgPSBuZXcgQnVmZmVyKDEyOClcbnplcm9CdWZmZXIuZmlsbCgwKVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhtYWNcblxuZnVuY3Rpb24gSG1hYyAoY3JlYXRlSGFzaCwgYmxvY2tzaXplLCBrZXkpIHtcbiAgaWYoISh0aGlzIGluc3RhbmNlb2YgSG1hYykpIHJldHVybiBuZXcgSG1hYyhjcmVhdGVIYXNoLCBibG9ja3NpemUsIGtleSlcblxuICB0aGlzLl9vcGFkID0gb3BhZFxuICB0aGlzLl9jcmVhdGVIYXNoID0gY3JlYXRlSGFzaFxuXG4gIGlmKGJsb2Nrc2l6ZSAhPT0gMTI4ICYmIGJsb2Nrc2l6ZSAhPT0gNjQpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdibG9ja3NpemUgbXVzdCBiZSBlaXRoZXIgNjQgZm9yIG9yIDEyOCAsIGJ1dCB3YXM6JytibG9ja3NpemUpXG5cbiAga2V5ID0gdGhpcy5fa2V5ID0gIUJ1ZmZlci5pc0J1ZmZlcihrZXkpID8gbmV3IEJ1ZmZlcihrZXkpIDoga2V5XG5cbiAgaWYoa2V5Lmxlbmd0aCA+IGJsb2Nrc2l6ZSkge1xuICAgIGtleSA9IHRoaXMuX2NyZWF0ZUhhc2goKS51cGRhdGUoa2V5KS5kaWdlc3QoKVxuICB9IGVsc2UgaWYoa2V5Lmxlbmd0aCA8IGJsb2Nrc2l6ZSkge1xuICAgIGtleSA9IEJ1ZmZlci5jb25jYXQoW2tleSwgemVyb0J1ZmZlcl0sIGJsb2Nrc2l6ZSlcbiAgfVxuXG4gIHZhciBpcGFkID0gdGhpcy5faXBhZCA9IG5ldyBCdWZmZXIoYmxvY2tzaXplKVxuICB2YXIgb3BhZCA9IHRoaXMuX29wYWQgPSBuZXcgQnVmZmVyKGJsb2Nrc2l6ZSlcblxuICBmb3IodmFyIGkgPSAwOyBpIDwgYmxvY2tzaXplOyBpKyspIHtcbiAgICBpcGFkW2ldID0ga2V5W2ldIF4gMHgzNlxuICAgIG9wYWRbaV0gPSBrZXlbaV0gXiAweDVDXG4gIH1cblxuICB0aGlzLl9oYXNoID0gdGhpcy5fY3JlYXRlSGFzaCgpLnVwZGF0ZShpcGFkKVxufVxuXG5IbWFjLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZGF0YSwgZW5jKSB7XG4gIHRoaXMuX2hhc2gudXBkYXRlKGRhdGEsIGVuYylcbiAgcmV0dXJuIHRoaXNcbn1cblxuSG1hYy5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gKGVuYykge1xuICB2YXIgaCA9IHRoaXMuX2hhc2guZGlnZXN0KClcbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUhhc2goKS51cGRhdGUodGhpcy5fb3BhZCkudXBkYXRlKGgpLmRpZ2VzdChlbmMpXG59XG5cblxuIiwiZnVuY3Rpb24gd3JhcCAoZm4sIGhvb2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaG9vay5jYWxsKHRoaXMsIGZuLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBob29rYWJsZShmbikge1xuXG4gIGZ1bmN0aW9uIGhvb2tlZCAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgfVxuXG4gIGhvb2tlZC5ob29rID0gZnVuY3Rpb24gKGhvb2spIHtcbiAgICBmbiA9IHdyYXAoZm4sIGhvb2spXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiBob29rZWRcbn1cbiIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJ1Zikge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aCwgaVxuXG4gIGZvcihpID0gbGVuIC0gMTsgYnVmW2ldID09PSAyNTU7IGktLSkgYnVmW2ldID0gMFxuICBpZih+aSkgYnVmW2ldID0gYnVmW2ldICsgMVxuXG4gIHJldHVybiBidWZcbn1cbiIsIlxudmFyIGluZGV4T2YgPSBbXS5pbmRleE9mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFyciwgb2JqKXtcbiAgaWYgKGluZGV4T2YpIHJldHVybiBhcnIuaW5kZXhPZihvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgIGlmIChhcnJbaV0gPT09IG9iaikgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufTsiLCJ2YXIgd3JhcHB5ID0gcmVxdWlyZSgnd3JhcHB5JylcbnZhciByZXFzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxudmFyIG9uY2UgPSByZXF1aXJlKCdvbmNlJylcblxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHkoaW5mbGlnaHQpXG5cbmZ1bmN0aW9uIGluZmxpZ2h0IChrZXksIGNiKSB7XG4gIGlmIChyZXFzW2tleV0pIHtcbiAgICByZXFzW2tleV0ucHVzaChjYilcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHJlcXNba2V5XSA9IFtjYl1cbiAgICByZXR1cm4gbWFrZXJlcyhrZXkpXG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZXJlcyAoa2V5KSB7XG4gIHJldHVybiBvbmNlKGZ1bmN0aW9uIFJFUyAoKSB7XG4gICAgdmFyIGNicyA9IHJlcXNba2V5XVxuICAgIHZhciBsZW4gPSBjYnMubGVuZ3RoXG4gICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY2JzW2ldLmFwcGx5KG51bGwsIGFyZ3MpXG4gICAgfVxuICAgIGlmIChjYnMubGVuZ3RoID4gbGVuKSB7XG4gICAgICAvLyBhZGRlZCBtb3JlIGluIHRoZSBpbnRlcmltLlxuICAgICAgLy8gZGUtemFsZ28sIGp1c3QgaW4gY2FzZSwgYnV0IGRvbid0IGNhbGwgYWdhaW4uXG4gICAgICBjYnMuc3BsaWNlKDAsIGxlbilcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBSRVMuYXBwbHkobnVsbCwgYXJncylcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSByZXFzW2tleV1cbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIHNsaWNlIChhcmdzKSB7XG4gIHZhciBsZW5ndGggPSBhcmdzLmxlbmd0aFxuICB2YXIgYXJyYXkgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIGFycmF5W2ldID0gYXJnc1tpXVxuICByZXR1cm4gYXJyYXlcbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdjQgPSAnKD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSl7M30nO1xudmFyIHY2ID0gJyg/Oig/OlswLTlhLWZBLUY6XSl7MSw0fSg/Oig/OjooPzpbMC05YS1mQS1GXSl7MSw0fXw6KSl7Miw3fSkrJztcblxudmFyIGlwID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0cykge1xuXHRvcHRzID0gb3B0cyB8fCB7fTtcblx0cmV0dXJuIG9wdHMuZXhhY3QgPyBuZXcgUmVnRXhwKCcoPzpeJyArIHY0ICsgJyQpfCg/Ol4nICsgdjYgKyAnJCknKSA6XG5cdCAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cCgnKD86JyArIHY0ICsgJyl8KD86JyArIHY2ICsgJyknLCAnZycpO1xufTtcblxuaXAudjQgPSBmdW5jdGlvbiAob3B0cykge1xuXHRvcHRzID0gb3B0cyB8fCB7fTtcblx0cmV0dXJuIG9wdHMuZXhhY3QgPyBuZXcgUmVnRXhwKCdeJyArIHY0ICsgJyQnKSA6IG5ldyBSZWdFeHAodjQsICdnJyk7XG59O1xuXG5pcC52NiA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cdG9wdHMgPSBvcHRzIHx8IHt9O1xuXHRyZXR1cm4gb3B0cy5leGFjdCA/IG5ldyBSZWdFeHAoJ14nICsgdjYgKyAnJCcpIDogbmV3IFJlZ0V4cCh2NiwgJ2cnKTtcbn07XG4iLCJ2YXIgaXAgPSBleHBvcnRzLFxuICAgIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcixcbiAgICBvcyA9IHJlcXVpcmUoJ29zJyk7XG5cbmlwLnRvQnVmZmVyID0gZnVuY3Rpb24gdG9CdWZmZXIoaXAsIGJ1ZmYsIG9mZnNldCkge1xuICBvZmZzZXQgPSB+fm9mZnNldDtcblxuICB2YXIgcmVzdWx0O1xuXG4gIGlmICgvXihcXGR7MSwzfVxcLil7MywzfVxcZHsxLDN9JC8udGVzdChpcCkpIHtcbiAgICByZXN1bHQgPSBidWZmIHx8IG5ldyBCdWZmZXIob2Zmc2V0ICsgNCk7XG4gICAgaXAuc3BsaXQoL1xcLi9nKS5tYXAoZnVuY3Rpb24oYnl0ZSkge1xuICAgICAgcmVzdWx0W29mZnNldCsrXSA9IHBhcnNlSW50KGJ5dGUsIDEwKSAmIDB4ZmY7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoL15bYS1mMC05Ol0rJC8udGVzdChpcCkpIHtcbiAgICB2YXIgcyA9IGlwLnNwbGl0KC86Oi9nLCAyKSxcbiAgICAgICAgaGVhZCA9IChzWzBdIHx8ICcnKS5zcGxpdCgvOi9nLCA4KSxcbiAgICAgICAgdGFpbCA9IChzWzFdIHx8ICcnKS5zcGxpdCgvOi9nLCA4KTtcblxuICAgIGlmICh0YWlsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8geHh4eDo6XG4gICAgICB3aGlsZSAoaGVhZC5sZW5ndGggPCA4KSBoZWFkLnB1c2goJzAwMDAnKTtcbiAgICB9IGVsc2UgaWYgKGhlYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyA6Onh4eHhcbiAgICAgIHdoaWxlICh0YWlsLmxlbmd0aCA8IDgpIHRhaWwudW5zaGlmdCgnMDAwMCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB4eHh4Ojp4eHh4XG4gICAgICB3aGlsZSAoaGVhZC5sZW5ndGggKyB0YWlsLmxlbmd0aCA8IDgpIGhlYWQucHVzaCgnMDAwMCcpO1xuICAgIH1cblxuICAgIHJlc3VsdCA9IGJ1ZmYgfHwgbmV3IEJ1ZmZlcihvZmZzZXQgKyAxNik7XG4gICAgaGVhZC5jb25jYXQodGFpbCkubWFwKGZ1bmN0aW9uKHdvcmQpIHtcbiAgICAgIHdvcmQgPSBwYXJzZUludCh3b3JkLCAxNik7XG4gICAgICByZXN1bHRbb2Zmc2V0KytdID0gKHdvcmQgPj4gOCkgJiAweGZmO1xuICAgICAgcmVzdWx0W29mZnNldCsrXSA9IHdvcmQgJiAweGZmO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKCdJbnZhbGlkIGlwIGFkZHJlc3M6ICcgKyBpcCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuaXAudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhidWZmLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSB+fm9mZnNldDtcbiAgbGVuZ3RoID0gbGVuZ3RoIHx8IChidWZmLmxlbmd0aCAtIG9mZnNldCk7XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAobGVuZ3RoID09PSA0KSB7XG4gICAgLy8gSVB2NFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKGJ1ZmZbb2Zmc2V0ICsgaV0pO1xuICAgIH1cbiAgICByZXN1bHQgPSByZXN1bHQuam9pbignLicpO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMTYpIHtcbiAgICAvLyBJUHY2XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMikge1xuICAgICAgcmVzdWx0LnB1c2goYnVmZi5yZWFkVUludDE2QkUob2Zmc2V0ICsgaSkudG9TdHJpbmcoMTYpKTtcbiAgICB9XG4gICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJzonKTtcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvKF58OikwKDowKSo6MCg6fCQpLywgJyQxOjokMycpO1xuICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC86ezMsNH0vLCAnOjonKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5pcC5mcm9tUHJlZml4TGVuID0gZnVuY3Rpb24gZnJvbVByZWZpeExlbihwcmVmaXhsZW4sIGZhbWlseSkge1xuICBpZiAocHJlZml4bGVuID4gMzIpIHtcbiAgICBmYW1pbHkgPSAnaXB2Nic7XG4gIH0gZWxzZSB7XG4gICAgZmFtaWx5ID0gX25vcm1hbGl6ZUZhbWlseShmYW1pbHkpO1xuICB9XG5cbiAgdmFyIGxlbiA9IDQ7XG4gIGlmIChmYW1pbHkgPT09ICdpcHY2Jykge1xuICAgIGxlbiA9IDE2O1xuICB9XG4gIHZhciBidWZmID0gbmV3IEJ1ZmZlcihsZW4pO1xuXG4gIGZvciAodmFyIGkgPSAwLCBuID0gYnVmZi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICB2YXIgYml0cyA9IDg7XG4gICAgaWYgKHByZWZpeGxlbiA8IDgpIHtcbiAgICAgIGJpdHMgPSBwcmVmaXhsZW47XG4gICAgfVxuICAgIHByZWZpeGxlbiAtPSBiaXRzO1xuXG4gICAgYnVmZltpXSA9IH4oMHhmZiA+PiBiaXRzKTtcbiAgfVxuXG4gIHJldHVybiBpcC50b1N0cmluZyhidWZmKTtcbn07XG5cbmlwLm1hc2sgPSBmdW5jdGlvbiBtYXNrKGFkZHIsIG1hc2spIHtcbiAgYWRkciA9IGlwLnRvQnVmZmVyKGFkZHIpO1xuICBtYXNrID0gaXAudG9CdWZmZXIobWFzayk7XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBCdWZmZXIoTWF0aC5tYXgoYWRkci5sZW5ndGgsIG1hc2subGVuZ3RoKSk7XG5cbiAgLy8gU2FtZSBwcm90b2NvbCAtIGRvIGJpdHdpc2UgYW5kXG4gIGlmIChhZGRyLmxlbmd0aCA9PT0gbWFzay5sZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFkZHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IGFkZHJbaV0gJiBtYXNrW2ldO1xuICAgIH1cbiAgfSBlbHNlIGlmIChtYXNrLmxlbmd0aCA9PT0gNCkge1xuICAgIC8vIElQdjYgYWRkcmVzcyBhbmQgSVB2NCBtYXNrXG4gICAgLy8gKE1hc2sgbG93IGJpdHMpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBhZGRyW2FkZHIubGVuZ3RoIC0gNCAgKyBpXSAmIG1hc2tbaV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElQdjYgbWFzayBhbmQgSVB2NCBhZGRyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoIC0gNjsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSAwO1xuICAgIH1cblxuICAgIC8vIDo6ZmZmZjppcHY0XG4gICAgcmVzdWx0WzEwXSA9IDB4ZmY7XG4gICAgcmVzdWx0WzExXSA9IDB4ZmY7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhZGRyLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaSArIDEyXSA9IGFkZHJbaV0gJiBtYXNrW2kgKyAxMl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlwLnRvU3RyaW5nKHJlc3VsdCk7XG59O1xuXG5pcC5jaWRyID0gZnVuY3Rpb24gY2lkcihjaWRyU3RyaW5nKSB7XG4gIHZhciBjaWRyUGFydHMgPSBjaWRyU3RyaW5nLnNwbGl0KCcvJyk7XG5cbiAgaWYgKGNpZHJQYXJ0cy5sZW5ndGggIT0gMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgQ0lEUiBzdWJuZXQ6ICcgKyBhZGRyKTtcblxuICB2YXIgYWRkciA9IGNpZHJQYXJ0c1swXTtcbiAgdmFyIG1hc2sgPSBpcC5mcm9tUHJlZml4TGVuKHBhcnNlSW50KGNpZHJQYXJ0c1sxXSwgMTApKTtcblxuICByZXR1cm4gaXAubWFzayhhZGRyLCBtYXNrKTtcbn1cblxuaXAuc3VibmV0ID0gZnVuY3Rpb24gc3VibmV0KGFkZHIsIG1hc2spIHtcbiAgdmFyIG5ldHdvcmtBZGRyZXNzID0gaXAudG9Mb25nKGlwLm1hc2soYWRkciwgbWFzaykpO1xuXG4gIC8vIENhbGN1bGF0ZSB0aGUgbWFzaydzIGxlbmd0aC5cbiAgdmFyIG1hc2tCdWZmZXIgPSBpcC50b0J1ZmZlcihtYXNrKTtcbiAgdmFyIG1hc2tMZW5ndGggPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWFza0J1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChtYXNrQnVmZmVyW2ldID09IDB4ZmYpIHtcbiAgICAgIG1hc2tMZW5ndGggKz0gODtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9jdGV0ID0gbWFza0J1ZmZlcltpXSAmIDB4ZmY7XG4gICAgICB3aGlsZSAob2N0ZXQpIHtcbiAgICAgICAgb2N0ZXQgPSAob2N0ZXQgPDwgMSkgJiAweGZmO1xuICAgICAgICBtYXNrTGVuZ3RoKys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG51bWJlck9mQWRkcmVzc2VzID0gTWF0aC5wb3coMiwgMzIgLSBtYXNrTGVuZ3RoKTtcblxuICByZXR1cm4ge1xuICAgIG5ldHdvcmtBZGRyZXNzOiBpcC5mcm9tTG9uZyhuZXR3b3JrQWRkcmVzcyksXG4gICAgZmlyc3RBZGRyZXNzOiBudW1iZXJPZkFkZHJlc3NlcyA8PSAyID9cbiAgICAgICAgICAgICAgICAgICAgaXAuZnJvbUxvbmcobmV0d29ya0FkZHJlc3MpIDpcbiAgICAgICAgICAgICAgICAgICAgaXAuZnJvbUxvbmcobmV0d29ya0FkZHJlc3MgKyAxKSxcbiAgICBsYXN0QWRkcmVzczogbnVtYmVyT2ZBZGRyZXNzZXMgPD0gMiA/XG4gICAgICAgICAgICAgICAgICAgIGlwLmZyb21Mb25nKG5ldHdvcmtBZGRyZXNzICsgbnVtYmVyT2ZBZGRyZXNzZXMgLSAxKSA6XG4gICAgICAgICAgICAgICAgICAgIGlwLmZyb21Mb25nKG5ldHdvcmtBZGRyZXNzICsgbnVtYmVyT2ZBZGRyZXNzZXMgLSAyKSxcbiAgICBicm9hZGNhc3RBZGRyZXNzOiBpcC5mcm9tTG9uZyhuZXR3b3JrQWRkcmVzcyArIG51bWJlck9mQWRkcmVzc2VzIC0gMSksXG4gICAgc3VibmV0TWFzazogbWFzayxcbiAgICBzdWJuZXRNYXNrTGVuZ3RoOiBtYXNrTGVuZ3RoLFxuICAgIG51bUhvc3RzOiBudW1iZXJPZkFkZHJlc3NlcyA8PSAyID9cbiAgICAgICAgICAgICAgICBudW1iZXJPZkFkZHJlc3NlcyA6IG51bWJlck9mQWRkcmVzc2VzIC0gMixcbiAgICBsZW5ndGg6IG51bWJlck9mQWRkcmVzc2VzXG4gIH07XG59XG5cbmlwLmNpZHJTdWJuZXQgPSBmdW5jdGlvbiBjaWRyU3VibmV0KGNpZHJTdHJpbmcpIHtcbiAgdmFyIGNpZHJQYXJ0cyA9IGNpZHJTdHJpbmcuc3BsaXQoJy8nKTtcblxuICBpZiAoY2lkclBhcnRzLmxlbmd0aCAhPT0gMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgQ0lEUiBzdWJuZXQ6ICcgKyBhZGRyKTtcblxuICB2YXIgYWRkciA9IGNpZHJQYXJ0c1swXTtcbiAgdmFyIG1hc2sgPSBpcC5mcm9tUHJlZml4TGVuKHBhcnNlSW50KGNpZHJQYXJ0c1sxXSwgMTApKTtcblxuICByZXR1cm4gaXAuc3VibmV0KGFkZHIsIG1hc2spO1xufVxuXG5pcC5ub3QgPSBmdW5jdGlvbiBub3QoYWRkcikge1xuICB2YXIgYnVmZiA9IGlwLnRvQnVmZmVyKGFkZHIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoOyBpKyspIHtcbiAgICBidWZmW2ldID0gMHhmZiBeIGJ1ZmZbaV07XG4gIH1cbiAgcmV0dXJuIGlwLnRvU3RyaW5nKGJ1ZmYpO1xufTtcblxuaXAub3IgPSBmdW5jdGlvbiBvcihhLCBiKSB7XG4gIGEgPSBpcC50b0J1ZmZlcihhKTtcbiAgYiA9IGlwLnRvQnVmZmVyKGIpO1xuXG4gIC8vIHNhbWUgcHJvdG9jb2xcbiAgaWYgKGEubGVuZ3RoID09IGIubGVuZ3RoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG4gICAgICBhW2ldIHw9IGJbaV07XG4gICAgfVxuICAgIHJldHVybiBpcC50b1N0cmluZyhhKTtcblxuICAvLyBtaXhlZCBwcm90b2NvbHNcbiAgfSBlbHNlIHtcbiAgICB2YXIgYnVmZiA9IGE7XG4gICAgdmFyIG90aGVyID0gYjtcbiAgICBpZiAoYi5sZW5ndGggPiBhLmxlbmd0aCkge1xuICAgICAgYnVmZiA9IGI7XG4gICAgICBvdGhlciA9IGE7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldCA9IGJ1ZmYubGVuZ3RoIC0gb3RoZXIubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSBvZmZzZXQ7IGkgPCBidWZmLmxlbmd0aDsgKytpKSB7XG4gICAgICBidWZmW2ldIHw9IG90aGVyW2kgLSBvZmZzZXRdO1xuICAgIH1cblxuICAgIHJldHVybiBpcC50b1N0cmluZyhidWZmKTtcbiAgfVxufTtcblxuaXAuaXNFcXVhbCA9IGZ1bmN0aW9uIGlzRXF1YWwoYSwgYikge1xuICBhID0gaXAudG9CdWZmZXIoYSk7XG4gIGIgPSBpcC50b0J1ZmZlcihiKTtcblxuICAvLyBTYW1lIHByb3RvY29sXG4gIGlmIChhLmxlbmd0aCA9PT0gYi5sZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gU3dhcFxuICBpZiAoYi5sZW5ndGggPT09IDQpIHtcbiAgICB2YXIgdCA9IGI7XG4gICAgYiA9IGE7XG4gICAgYSA9IHQ7XG4gIH1cblxuICAvLyBhIC0gSVB2NCwgYiAtIElQdjZcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgaWYgKGJbaV0gIT09IDApIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB3b3JkID0gYi5yZWFkVUludDE2QkUoMTApO1xuICBpZiAod29yZCAhPT0gMCAmJiB3b3JkICE9PSAweGZmZmYpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIGlmIChhW2ldICE9PSBiW2kgKyAxMl0pIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuaXAuaXNQcml2YXRlID0gZnVuY3Rpb24gaXNQcml2YXRlKGFkZHIpIHtcbiAgcmV0dXJuIGFkZHIubWF0Y2goL14xMFxcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KS8pICE9IG51bGwgfHxcbiAgICBhZGRyLm1hdGNoKC9eMTkyXFwuMTY4XFwuKFswLTldezEsM30pXFwuKFswLTldezEsM30pLykgIT0gbnVsbCB8fFxuICAgIGFkZHIubWF0Y2goXG4gICAgICAgIC9eMTcyXFwuKDFbNi05XXwyXFxkfDMwfDMxKVxcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KS8pICE9IG51bGwgfHxcbiAgICBhZGRyLm1hdGNoKC9eMTI3XFwuKFswLTldezEsM30pXFwuKFswLTldezEsM30pXFwuKFswLTldezEsM30pLykgIT0gbnVsbCB8fFxuICAgIGFkZHIubWF0Y2goL14xNjlcXC4yNTRcXC4oWzAtOV17MSwzfSlcXC4oWzAtOV17MSwzfSkvKSAhPSBudWxsIHx8XG4gICAgYWRkci5tYXRjaCgvXmZjMDA6LykgIT0gbnVsbCB8fCBhZGRyLm1hdGNoKC9eZmU4MDovKSAhPSBudWxsIHx8XG4gICAgYWRkci5tYXRjaCgvXjo6MSQvKSAhPSBudWxsIHx8IGFkZHIubWF0Y2goL146OiQvKSAhPSBudWxsO1xufTtcblxuaXAuaXNQdWJsaWMgPSBmdW5jdGlvbiBpc1B1YmxpYyhhZGRyKSB7XG4gIHJldHVybiAhaXAuaXNQcml2YXRlKGFkZHIpO1xufVxuXG5pcC5pc0xvb3BiYWNrID0gZnVuY3Rpb24gaXNMb29wYmFjayhhZGRyKSB7XG4gIHJldHVybiAvXjEyN1xcLjBcXC4wXFwuMSQvLnRlc3QoYWRkcilcbiAgICB8fCAvXmZlODA6OjEkLy50ZXN0KGFkZHIpXG4gICAgfHwgL146OjEkLy50ZXN0KGFkZHIpXG4gICAgfHwgL146OiQvLnRlc3QoYWRkcik7XG59O1xuXG5pcC5sb29wYmFjayA9IGZ1bmN0aW9uIGxvb3BiYWNrKGZhbWlseSkge1xuICAvL1xuICAvLyBEZWZhdWx0IHRvIGBpcHY0YFxuICAvL1xuICBmYW1pbHkgPSBfbm9ybWFsaXplRmFtaWx5KGZhbWlseSk7XG5cbiAgaWYgKGZhbWlseSAhPT0gJ2lwdjQnICYmIGZhbWlseSAhPT0gJ2lwdjYnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmYW1pbHkgbXVzdCBiZSBpcHY0IG9yIGlwdjYnKTtcbiAgfVxuXG4gIHJldHVybiBmYW1pbHkgPT09ICdpcHY0J1xuICAgID8gJzEyNy4wLjAuMSdcbiAgICA6ICdmZTgwOjoxJztcbn07XG5cbi8vXG4vLyAjIyMgZnVuY3Rpb24gYWRkcmVzcyAobmFtZSwgZmFtaWx5KVxuLy8gIyMjIyBAbmFtZSB7c3RyaW5nfCdwdWJsaWMnfCdwcml2YXRlJ30gKipPcHRpb25hbCoqIE5hbWUgb3Igc2VjdXJpdHlcbi8vICAgICAgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlLlxuLy8gIyMjIyBAZmFtaWx5IHtpcHY0fGlwdjZ9ICoqT3B0aW9uYWwqKiBJUCBmYW1pbHkgb2YgdGhlIGFkZHJlc3MgKGRlZmF1bHRzXG4vLyAgICAgIHRvIGlwdjQpLlxuLy9cbi8vIFJldHVybnMgdGhlIGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrIGludGVyZmFjZSBvbiB0aGUgY3VycmVudCBzeXN0ZW0gd2l0aFxuLy8gdGhlIHNwZWNpZmllZCBgbmFtZWA6XG4vLyAgICogU3RyaW5nOiBGaXJzdCBgZmFtaWx5YCBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UuXG4vLyAgICAgICAgICAgICBJZiBub3QgZm91bmQgc2VlIGB1bmRlZmluZWRgLlxuLy8gICAqICdwdWJsaWMnOiB0aGUgZmlyc3QgcHVibGljIGlwIGFkZHJlc3Mgb2YgZmFtaWx5LlxuLy8gICAqICdwcml2YXRlJzogdGhlIGZpcnN0IHByaXZhdGUgaXAgYWRkcmVzcyBvZiBmYW1pbHkuXG4vLyAgICogdW5kZWZpbmVkOiBGaXJzdCBhZGRyZXNzIHdpdGggYGlwdjRgIG9yIGxvb3BiYWNrIGFkZHJlcyBgMTI3LjAuMC4xYC5cbi8vXG5pcC5hZGRyZXNzID0gZnVuY3Rpb24gYWRkcmVzcyhuYW1lLCBmYW1pbHkpIHtcbiAgdmFyIGludGVyZmFjZXMgPSBvcy5uZXR3b3JrSW50ZXJmYWNlcygpLFxuICAgICAgYWxsO1xuXG4gIC8vXG4gIC8vIERlZmF1bHQgdG8gYGlwdjRgXG4gIC8vXG4gIGZhbWlseSA9IF9ub3JtYWxpemVGYW1pbHkoZmFtaWx5KTtcblxuICAvL1xuICAvLyBJZiBhIHNwZWNpZmljIG5ldHdvcmsgaW50ZXJmYWNlIGhhcyBiZWVuIG5hbWVkLFxuICAvLyByZXR1cm4gdGhlIGFkZHJlc3MuXG4gIC8vXG4gIGlmIChuYW1lICYmICF+WydwdWJsaWMnLCAncHJpdmF0ZSddLmluZGV4T2YobmFtZSkpIHtcbiAgICByZXR1cm4gaW50ZXJmYWNlc1tuYW1lXS5maWx0ZXIoZnVuY3Rpb24gKGRldGFpbHMpIHtcbiAgICAgIGRldGFpbHMuZmFtaWx5ID0gZGV0YWlscy5mYW1pbHkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBkZXRhaWxzLmZhbWlseSA9PT0gZmFtaWx5O1xuICAgIH0pWzBdLmFkZHJlc3M7XG4gIH1cblxuICB2YXIgYWxsID0gT2JqZWN0LmtleXMoaW50ZXJmYWNlcykubWFwKGZ1bmN0aW9uIChuaWMpIHtcbiAgICAvL1xuICAgIC8vIE5vdGU6IG5hbWUgd2lsbCBvbmx5IGJlIGBwdWJsaWNgIG9yIGBwcml2YXRlYFxuICAgIC8vIHdoZW4gdGhpcyBpcyBjYWxsZWQuXG4gICAgLy9cbiAgICB2YXIgYWRkcmVzc2VzID0gaW50ZXJmYWNlc1tuaWNdLmZpbHRlcihmdW5jdGlvbiAoZGV0YWlscykge1xuICAgICAgZGV0YWlscy5mYW1pbHkgPSBkZXRhaWxzLmZhbWlseS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGRldGFpbHMuZmFtaWx5ICE9PSBmYW1pbHkgfHwgaXAuaXNMb29wYmFjayhkZXRhaWxzLmFkZHJlc3MpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCFuYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmFtZSA9PT0gJ3B1YmxpYydcbiAgICAgICAgPyAhaXAuaXNQcml2YXRlKGRldGFpbHMuYWRkcmVzcylcbiAgICAgICAgOiBpcC5pc1ByaXZhdGUoZGV0YWlscy5hZGRyZXNzKVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFkZHJlc3Nlcy5sZW5ndGhcbiAgICAgID8gYWRkcmVzc2VzWzBdLmFkZHJlc3NcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9KS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgcmV0dXJuICFhbGwubGVuZ3RoXG4gICAgPyBpcC5sb29wYmFjayhmYW1pbHkpXG4gICAgOiBhbGxbMF07XG59O1xuXG5pcC50b0xvbmcgPSBmdW5jdGlvbiB0b0ludChpcCl7XG4gIHZhciBpcGw9MDtcbiAgaXAuc3BsaXQoJy4nKS5mb3JFYWNoKGZ1bmN0aW9uKCBvY3RldCApIHtcbiAgICAgIGlwbDw8PTg7XG4gICAgICBpcGwrPXBhcnNlSW50KG9jdGV0KTtcbiAgfSk7XG4gIHJldHVybihpcGwgPj4+MCk7XG59O1xuXG5pcC5mcm9tTG9uZyA9IGZ1bmN0aW9uIGZyb21JbnQoaXBsKXtcbiAgcmV0dXJuICggKGlwbD4+PjI0KSArJy4nICtcbiAgICAgIChpcGw+PjE2ICYgMjU1KSArJy4nICtcbiAgICAgIChpcGw+PjggJiAyNTUpICsnLicgK1xuICAgICAgKGlwbCAmIDI1NSkgKTtcbn07XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVGYW1pbHkoZmFtaWx5KSB7XG4gIHJldHVybiBmYW1pbHkgPyBmYW1pbHkudG9Mb3dlckNhc2UoKSA6ICdpcHY0Jztcbn1cbiIsIi8qKlxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBCdWZmZXJcbiAqXG4gKiBBdXRob3I6ICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIExpY2Vuc2U6ICBNSVRcbiAqXG4gKiBgbnBtIGluc3RhbGwgaXMtYnVmZmVyYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gISEob2JqICE9IG51bGwgJiZcbiAgICAob2JqLl9pc0J1ZmZlciB8fCAvLyBGb3IgU2FmYXJpIDUtNyAobWlzc2luZyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yKVxuICAgICAgKG9iai5jb25zdHJ1Y3RvciAmJlxuICAgICAgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpXG4gICAgKSlcbn1cbiIsIihmdW5jdGlvbihyb290KSB7XG5cbiAgZnVuY3Rpb24gaXNWYWxpZERvbWFpbih2KSB7XG4gICAgaWYgKCF2KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHJlID0gL14oPyE6XFwvXFwvKShbYS16QS1aMC05LV0rXFwuKXswLDV9W2EtekEtWjAtOS1dW2EtekEtWjAtOS1dK1xcLlthLXpBLVpdezIsNjR9PyQvZ2k7XG4gICAgcmV0dXJuIHJlLnRlc3Qodik7XG4gIH1cblxuICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBpc1ZhbGlkRG9tYWluO1xuICAgIH1cbiAgICBleHBvcnRzLmlzVmFsaWREb21haW4gPSBpc1ZhbGlkRG9tYWluO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXNWYWxpZERvbWFpbjtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByb290LmlzVmFsaWREb21haW4gPSBpc1ZhbGlkRG9tYWluO1xuICB9XG5cbn0pKHRoaXMpOyIsIm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsInZhciBlbmNvZGluZ3MgPSByZXF1aXJlKCcuL2xpYi9lbmNvZGluZ3MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb2RlYztcblxuZnVuY3Rpb24gQ29kZWMob3B0cyl7XG4gIHRoaXMub3B0cyA9IG9wdHMgfHwge307XG4gIHRoaXMuZW5jb2RpbmdzID0gZW5jb2RpbmdzO1xufVxuXG5Db2RlYy5wcm90b3R5cGUuX2VuY29kaW5nID0gZnVuY3Rpb24oZW5jb2Rpbmcpe1xuICBpZiAodHlwZW9mIGVuY29kaW5nID09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nc1tlbmNvZGluZ107XG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gZW5jb2RpbmdzLmlkO1xuICByZXR1cm4gZW5jb2Rpbmc7XG59O1xuXG5Db2RlYy5wcm90b3R5cGUuX2tleUVuY29kaW5nID0gZnVuY3Rpb24ob3B0cywgYmF0Y2hPcHRzKXtcbiAgcmV0dXJuIHRoaXMuX2VuY29kaW5nKGJhdGNoT3B0cyAmJiBiYXRjaE9wdHMua2V5RW5jb2RpbmdcbiAgICB8fCBvcHRzICYmIG9wdHMua2V5RW5jb2RpbmdcbiAgICB8fCB0aGlzLm9wdHMua2V5RW5jb2RpbmcpO1xufTtcblxuQ29kZWMucHJvdG90eXBlLl92YWx1ZUVuY29kaW5nID0gZnVuY3Rpb24ob3B0cywgYmF0Y2hPcHRzKXtcbiAgcmV0dXJuIHRoaXMuX2VuY29kaW5nKFxuICAgIGJhdGNoT3B0cyAmJiAoYmF0Y2hPcHRzLnZhbHVlRW5jb2RpbmcgfHwgYmF0Y2hPcHRzLmVuY29kaW5nKVxuICAgIHx8IG9wdHMgJiYgKG9wdHMudmFsdWVFbmNvZGluZyB8fCBvcHRzLmVuY29kaW5nKVxuICAgIHx8ICh0aGlzLm9wdHMudmFsdWVFbmNvZGluZyB8fCB0aGlzLm9wdHMuZW5jb2RpbmcpKTtcbn07XG5cbkNvZGVjLnByb3RvdHlwZS5lbmNvZGVLZXkgPSBmdW5jdGlvbihrZXksIG9wdHMsIGJhdGNoT3B0cyl7XG4gIHJldHVybiB0aGlzLl9rZXlFbmNvZGluZyhvcHRzLCBiYXRjaE9wdHMpLmVuY29kZShrZXkpO1xufTtcblxuQ29kZWMucHJvdG90eXBlLmVuY29kZVZhbHVlID0gZnVuY3Rpb24odmFsdWUsIG9wdHMsIGJhdGNoT3B0cyl7XG4gIHJldHVybiB0aGlzLl92YWx1ZUVuY29kaW5nKG9wdHMsIGJhdGNoT3B0cykuZW5jb2RlKHZhbHVlKTtcbn07XG5cbkNvZGVjLnByb3RvdHlwZS5kZWNvZGVLZXkgPSBmdW5jdGlvbihrZXksIG9wdHMpe1xuICByZXR1cm4gdGhpcy5fa2V5RW5jb2Rpbmcob3B0cykuZGVjb2RlKGtleSk7XG59O1xuXG5Db2RlYy5wcm90b3R5cGUuZGVjb2RlVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSwgb3B0cyl7XG4gIHJldHVybiB0aGlzLl92YWx1ZUVuY29kaW5nKG9wdHMpLmRlY29kZSh2YWx1ZSk7XG59O1xuXG5Db2RlYy5wcm90b3R5cGUuZW5jb2RlQmF0Y2ggPSBmdW5jdGlvbihvcHMsIG9wdHMpe1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgcmV0dXJuIG9wcy5tYXAoZnVuY3Rpb24oX29wKXtcbiAgICB2YXIgb3AgPSB7XG4gICAgICB0eXBlOiBfb3AudHlwZSxcbiAgICAgIGtleTogc2VsZi5lbmNvZGVLZXkoX29wLmtleSwgb3B0cywgX29wKVxuICAgIH07XG4gICAgaWYgKHNlbGYua2V5QXNCdWZmZXIob3B0cywgX29wKSkgb3Aua2V5RW5jb2RpbmcgPSAnYmluYXJ5JztcbiAgICBpZiAoX29wLnByZWZpeCkgb3AucHJlZml4ID0gX29wLnByZWZpeDtcbiAgICBpZiAoJ3ZhbHVlJyBpbiBfb3ApIHtcbiAgICAgIG9wLnZhbHVlID0gc2VsZi5lbmNvZGVWYWx1ZShfb3AudmFsdWUsIG9wdHMsIF9vcCk7XG4gICAgICBpZiAoc2VsZi52YWx1ZUFzQnVmZmVyKG9wdHMsIF9vcCkpIG9wLnZhbHVlRW5jb2RpbmcgPSAnYmluYXJ5JztcbiAgICB9XG4gICAgcmV0dXJuIG9wO1xuICB9KTtcbn07XG5cbnZhciBsdGd0S2V5cyA9IFsnbHQnLCAnZ3QnLCAnbHRlJywgJ2d0ZScsICdzdGFydCcsICdlbmQnXTtcblxuQ29kZWMucHJvdG90eXBlLmVuY29kZUx0Z3QgPSBmdW5jdGlvbihsdGd0KXtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcmV0ID0ge307XG4gIE9iamVjdC5rZXlzKGx0Z3QpLmZvckVhY2goZnVuY3Rpb24oa2V5KXtcbiAgICByZXRba2V5XSA9IGx0Z3RLZXlzLmluZGV4T2Yoa2V5KSA+IC0xXG4gICAgICA/IHNlbGYuZW5jb2RlS2V5KGx0Z3Rba2V5XSwgbHRndClcbiAgICAgIDogbHRndFtrZXldXG4gIH0pO1xuICByZXR1cm4gcmV0O1xufTtcblxuQ29kZWMucHJvdG90eXBlLmNyZWF0ZVN0cmVhbURlY29kZXIgPSBmdW5jdGlvbihvcHRzKXtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGlmIChvcHRzLmtleXMgJiYgb3B0cy52YWx1ZXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6IHNlbGYuZGVjb2RlS2V5KGtleSwgb3B0cyksXG4gICAgICAgIHZhbHVlOiBzZWxmLmRlY29kZVZhbHVlKHZhbHVlLCBvcHRzKVxuICAgICAgfTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKG9wdHMua2V5cykge1xuICAgIHJldHVybiBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBzZWxmLmRlY29kZUtleShrZXksIG9wdHMpO1xuICAgIH07IFxuICB9IGVsc2UgaWYgKG9wdHMudmFsdWVzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKF8sIHZhbHVlKXtcbiAgICAgIHJldHVybiBzZWxmLmRlY29kZVZhbHVlKHZhbHVlLCBvcHRzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCl7fTtcbiAgfVxufTtcblxuQ29kZWMucHJvdG90eXBlLmtleUFzQnVmZmVyID0gZnVuY3Rpb24ob3B0cyl7XG4gIHJldHVybiB0aGlzLl9rZXlFbmNvZGluZyhvcHRzKS5idWZmZXI7XG59O1xuXG5Db2RlYy5wcm90b3R5cGUudmFsdWVBc0J1ZmZlciA9IGZ1bmN0aW9uKG9wdHMpe1xuICByZXR1cm4gdGhpcy5fdmFsdWVFbmNvZGluZyhvcHRzKS5idWZmZXI7XG59O1xuXG4iLCJcbmV4cG9ydHMudXRmOCA9IGV4cG9ydHNbJ3V0Zi04J10gPSB7XG4gIGVuY29kZTogZnVuY3Rpb24oZGF0YSl7XG4gICAgcmV0dXJuIGlzQmluYXJ5KGRhdGEpXG4gICAgICA/IGRhdGFcbiAgICAgIDogU3RyaW5nKGRhdGEpO1xuICB9LFxuICBkZWNvZGU6IGlkZW50aXR5LFxuICBidWZmZXI6IGZhbHNlLFxuICB0eXBlOiAndXRmOCdcbn07XG5cbmV4cG9ydHMuanNvbiA9IHtcbiAgZW5jb2RlOiBKU09OLnN0cmluZ2lmeSxcbiAgZGVjb2RlOiBKU09OLnBhcnNlLFxuICBidWZmZXI6IGZhbHNlLFxuICB0eXBlOiAnanNvbidcbn07XG5cbmV4cG9ydHMuYmluYXJ5ID0ge1xuICBlbmNvZGU6IGZ1bmN0aW9uKGRhdGEpe1xuICAgIHJldHVybiBpc0JpbmFyeShkYXRhKVxuICAgICAgPyBkYXRhXG4gICAgICA6IG5ldyBCdWZmZXIoZGF0YSk7ICAgICAgXG4gIH0sXG4gIGRlY29kZTogaWRlbnRpdHksXG4gIGJ1ZmZlcjogdHJ1ZSxcbiAgdHlwZTogJ2JpbmFyeSdcbn07XG5cbmV4cG9ydHMuaWQgPSB7XG4gIGVuY29kZTogZnVuY3Rpb24oZGF0YSl7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0sXG4gIGRlY29kZTogZnVuY3Rpb24oZGF0YSl7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0sXG4gIGJ1ZmZlcjogZmFsc2UsXG4gIHR5cGU6ICdpZCdcbn07XG5cbnZhciBidWZmZXJFbmNvZGluZ3MgPSBbXG4gICdoZXgnLFxuICAnYXNjaWknLFxuICAnYmFzZTY0JyxcbiAgJ3VjczInLFxuICAndWNzLTInLFxuICAndXRmMTZsZScsXG4gICd1dGYtMTZsZSdcbl07XG5cbmJ1ZmZlckVuY29kaW5ncy5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUpe1xuICBleHBvcnRzW3R5cGVdID0ge1xuICAgIGVuY29kZTogZnVuY3Rpb24oZGF0YSl7XG4gICAgICByZXR1cm4gaXNCaW5hcnkoZGF0YSlcbiAgICAgICAgPyBkYXRhXG4gICAgICAgIDogbmV3IEJ1ZmZlcihkYXRhLCB0eXBlKTtcbiAgICB9LFxuICAgIGRlY29kZTogZnVuY3Rpb24oYnVmZmVyKXtcbiAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcodHlwZSk7XG4gICAgfSxcbiAgICBidWZmZXI6IHRydWUsXG4gICAgdHlwZTogdHlwZVxuICB9O1xufSk7XG5cbmZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKXtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc0JpbmFyeShkYXRhKXtcbiAgcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZFxuICAgIHx8IGRhdGEgPT09IG51bGxcbiAgICB8fCBCdWZmZXIuaXNCdWZmZXIoZGF0YSk7XG59XG5cbiIsIi8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IExldmVsVVAgY29udHJpYnV0b3JzXG4gKiBTZWUgbGlzdCBhdCA8aHR0cHM6Ly9naXRodWIuY29tL3J2YWdnL25vZGUtbGV2ZWx1cCNjb250cmlidXRpbmc+XG4gKiBNSVQgTGljZW5zZVxuICogPGh0dHBzOi8vZ2l0aHViLmNvbS9ydmFnZy9ub2RlLWxldmVsdXAvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZD5cbiAqL1xuXG52YXIgY3JlYXRlRXJyb3IgICA9IHJlcXVpcmUoJ2Vycm5vJykuY3JlYXRlXG4gICwgTGV2ZWxVUEVycm9yICA9IGNyZWF0ZUVycm9yKCdMZXZlbFVQRXJyb3InKVxuICAsIE5vdEZvdW5kRXJyb3IgPSBjcmVhdGVFcnJvcignTm90Rm91bmRFcnJvcicsIExldmVsVVBFcnJvcilcblxuTm90Rm91bmRFcnJvci5wcm90b3R5cGUubm90Rm91bmQgPSB0cnVlXG5Ob3RGb3VuZEVycm9yLnByb3RvdHlwZS5zdGF0dXMgICA9IDQwNFxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBMZXZlbFVQRXJyb3IgICAgICAgIDogTGV2ZWxVUEVycm9yXG4gICwgSW5pdGlhbGl6YXRpb25FcnJvciA6IGNyZWF0ZUVycm9yKCdJbml0aWFsaXphdGlvbkVycm9yJywgTGV2ZWxVUEVycm9yKVxuICAsIE9wZW5FcnJvciAgICAgICAgICAgOiBjcmVhdGVFcnJvcignT3BlbkVycm9yJywgTGV2ZWxVUEVycm9yKVxuICAsIFJlYWRFcnJvciAgICAgICAgICAgOiBjcmVhdGVFcnJvcignUmVhZEVycm9yJywgTGV2ZWxVUEVycm9yKVxuICAsIFdyaXRlRXJyb3IgICAgICAgICAgOiBjcmVhdGVFcnJvcignV3JpdGVFcnJvcicsIExldmVsVVBFcnJvcilcbiAgLCBOb3RGb3VuZEVycm9yICAgICAgIDogTm90Rm91bmRFcnJvclxuICAsIEVuY29kaW5nRXJyb3IgICAgICAgOiBjcmVhdGVFcnJvcignRW5jb2RpbmdFcnJvcicsIExldmVsVVBFcnJvcilcbn1cbiIsInZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKS5SZWFkYWJsZTtcbnZhciBleHRlbmQgPSByZXF1aXJlKCd4dGVuZCcpO1xudmFyIEVuY29kaW5nRXJyb3IgPSByZXF1aXJlKCdsZXZlbC1lcnJvcnMnKS5FbmNvZGluZ0Vycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRTdHJlYW07XG5pbmhlcml0cyhSZWFkU3RyZWFtLCBSZWFkYWJsZSk7XG5cbmZ1bmN0aW9uIFJlYWRTdHJlYW0oaXRlcmF0b3IsIG9wdGlvbnMpe1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZFN0cmVhbSkpIHJldHVybiBuZXcgUmVhZFN0cmVhbShpdGVyYXRvciwgb3B0aW9ucyk7XG4gIFJlYWRhYmxlLmNhbGwodGhpcywgZXh0ZW5kKG9wdGlvbnMsIHtcbiAgICBvYmplY3RNb2RlOiB0cnVlXG4gIH0pKTtcbiAgdGhpcy5faXRlcmF0b3IgPSBpdGVyYXRvcjtcbiAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7XG4gIHRoaXMuX2RlY29kZXIgPSBudWxsO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlY29kZXIpIHRoaXMuX2RlY29kZXIgPSBvcHRpb25zLmRlY29kZXI7XG4gIHRoaXMub24oJ2VuZCcsIHRoaXMuX2NsZWFudXAuYmluZCh0aGlzKSk7XG59XG5cblJlYWRTdHJlYW0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24oKXtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgdGhpcy5faXRlcmF0b3IubmV4dChmdW5jdGlvbihlcnIsIGtleSwgdmFsdWUpe1xuICAgIGlmIChzZWxmLl9kZXN0cm95ZWQpIHJldHVybjtcbiAgICBpZiAoZXJyKSByZXR1cm4gc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlbGYucHVzaChudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzZWxmLl9kZWNvZGVyKSByZXR1cm4gc2VsZi5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHZhbHVlID0gc2VsZi5fZGVjb2RlcihrZXksIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVuY29kaW5nRXJyb3IoZXJyKSk7XG4gICAgICAgIHNlbGYucHVzaChudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2VsZi5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xufTtcblxuUmVhZFN0cmVhbS5wcm90b3R5cGUuZGVzdHJveSA9XG5SZWFkU3RyZWFtLnByb3RvdHlwZS5fY2xlYW51cCA9IGZ1bmN0aW9uKCl7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuXG4gIHRoaXMuX2l0ZXJhdG9yLmVuZChmdW5jdGlvbihlcnIpe1xuICAgIGlmIChlcnIpIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICBzZWxmLmVtaXQoJ2Nsb3NlJyk7XG4gIH0pO1xufTtcblxuIiwibW9kdWxlLmV4cG9ydHMgPSBleHRlbmRcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIHZhciB0YXJnZXQgPSB7fVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRcbn1cbiIsInZhciBwbCAgID0gcmVxdWlyZSgncHVsbC1sZXZlbCcpXG52YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGIsIHVwZGF0ZSwgZ2V0KSB7XG4gIHZhciB3YWl0aW5nID0gW10sIHJlYWR5ID0gZmFsc2VcbiAgcHVsbChcbiAgICBwbC5yZWFkKGRiLCB7XG4gICAgICBvblN5bmM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVhZHkgPSB0cnVlXG4gICAgICAgIHdoaWxlKHdhaXRpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgd2FpdGluZy5zaGlmdCgpKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpdmU6IHRydWVcbiAgICB9KSxcbiAgICBwdWxsLmRyYWluKHVwZGF0ZSlcbiAgKVxuXG4gIGZ1bmN0aW9uIGNhbGwgKG9wdHMsIGNiKSB7XG4gICAgdmFyIHZhbHVlXG4gICAgdHJ5IHsgdmFsdWUgPSBnZXQob3B0cykgfVxuICAgIGNhdGNoIChlcnIpIHsgcmV0dXJuIGNiKGVycikgfVxuICAgIGNiKG51bGwsIHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvcHRzLCBjYikge1xuICAgIGlmKCFjYikgY2IgPSBvcHRzLCBvcHRzID0gbnVsbFxuICAgIGlmKHJlYWR5KSBjYWxsKG9wdHMsIGNiKVxuICAgIGVsc2Ugd2FpdGluZy5wdXNoKGZ1bmN0aW9uICgpIHsgY2FsbChvcHRzLCBjYikgfSlcbiAgfVxuXG59XG4iLCJ2YXIgc291cmNlcyAgPSByZXF1aXJlKCcuL3NvdXJjZXMnKVxudmFyIHNpbmtzICAgID0gcmVxdWlyZSgnLi9zaW5rcycpXG52YXIgdGhyb3VnaHMgPSByZXF1aXJlKCcuL3Rocm91Z2hzJylcbnZhciB1ICAgICAgICA9IHJlcXVpcmUoJ3B1bGwtY29yZScpXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGZ1bikge1xuICByZXR1cm4gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZ1blxufVxuXG5mdW5jdGlvbiBpc1JlYWRlciAoZnVuKSB7XG4gIHJldHVybiBmdW4gJiYgKGZ1bi50eXBlID09PSBcIlRocm91Z2hcIiB8fCBmdW4ubGVuZ3RoID09PSAxKVxufVxudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHB1bGwgKCkge1xuICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuXG4gIGlmKGlzUmVhZGVyKGFyZ3NbMF0pKVxuICAgIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgICAgYXJncy51bnNoaWZ0KHJlYWQpXG4gICAgICByZXR1cm4gcHVsbC5hcHBseShudWxsLCBhcmdzKVxuICAgIH1cblxuICB2YXIgcmVhZCA9IGFyZ3Muc2hpZnQoKVxuXG4gIC8vaWYgdGhlIGZpcnN0IGZ1bmN0aW9uIGlzIGEgZHVwbGV4IHN0cmVhbSxcbiAgLy9waXBlIGZyb20gdGhlIHNvdXJjZS5cbiAgaWYoaXNGdW5jdGlvbihyZWFkLnNvdXJjZSkpXG4gICAgcmVhZCA9IHJlYWQuc291cmNlXG5cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgdmFyIHMgPSBhcmdzLnNoaWZ0KClcblxuICAgIGlmKG51bGwgPT0gcylcbiAgICAgIHJldHVybiBuZXh0KClcblxuICAgIGlmKGlzRnVuY3Rpb24ocykpIHJldHVybiBzXG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICAgIHMuc2luayhyZWFkKVxuICAgICAgLy90aGlzIHN1cHBvcnRzIHBpcGVpbmcgdGhyb3VnaCBhIGR1cGxleCBzdHJlYW1cbiAgICAgIC8vcHVsbChhLCBiLCBhKSBcInRlbGVwaG9uZSBzdHlsZVwiLlxuICAgICAgLy9pZiB0aGlzIHN0cmVhbSBpcyBpbiB0aGUgYSAoZmlyc3QgJiBsYXN0IHBvc2l0aW9uKVxuICAgICAgLy9zLnNvdXJjZSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHVzZWQsIGJ1dCB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWRcbiAgICAgIC8vc28gdGhhdCBpcyBva2F5LlxuICAgICAgcmV0dXJuIHMuc291cmNlXG4gICAgfVxuICB9XG5cbiAgd2hpbGUoYXJncy5sZW5ndGgpXG4gICAgcmVhZCA9IG5leHQoKSAocmVhZClcblxuICByZXR1cm4gcmVhZFxufVxuXG5cbmZvcih2YXIgayBpbiBzb3VyY2VzKVxuICBleHBvcnRzW2tdID0gdS5Tb3VyY2Uoc291cmNlc1trXSlcblxuZm9yKHZhciBrIGluIHRocm91Z2hzKVxuICBleHBvcnRzW2tdID0gdS5UaHJvdWdoKHRocm91Z2hzW2tdKVxuXG5mb3IodmFyIGsgaW4gc2lua3MpXG4gIGV4cG9ydHNba10gPSB1LlNpbmsoc2lua3Nba10pXG5cbnZhciBtYXliZSA9IHJlcXVpcmUoJy4vbWF5YmUnKShleHBvcnRzKVxuXG5mb3IodmFyIGsgaW4gbWF5YmUpXG4gIGV4cG9ydHNba10gPSBtYXliZVtrXVxuXG5leHBvcnRzLkR1cGxleCAgPSBcbmV4cG9ydHMuVGhyb3VnaCA9IGV4cG9ydHMucGlwZWFibGUgICAgICAgPSB1LlRocm91Z2hcbmV4cG9ydHMuU291cmNlICA9IGV4cG9ydHMucGlwZWFibGVTb3VyY2UgPSB1LlNvdXJjZVxuZXhwb3J0cy5TaW5rICAgID0gZXhwb3J0cy5waXBlYWJsZVNpbmsgICA9IHUuU2lua1xuXG5cbiIsInZhciB1ID0gcmVxdWlyZSgncHVsbC1jb3JlJylcbnZhciBwcm9wID0gdS5wcm9wXG52YXIgaWQgICA9IHUuaWRcbnZhciBtYXliZVNpbmsgPSB1Lm1heWJlU2lua1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwdWxsKSB7XG5cbiAgdmFyIGV4cG9ydHMgPSB7fVxuICB2YXIgZHJhaW4gPSBwdWxsLmRyYWluXG5cbiAgdmFyIGZpbmQgPVxuICBleHBvcnRzLmZpbmQgPSBmdW5jdGlvbiAodGVzdCwgY2IpIHtcbiAgICByZXR1cm4gbWF5YmVTaW5rKGZ1bmN0aW9uIChjYikge1xuICAgICAgdmFyIGVuZGVkID0gZmFsc2VcbiAgICAgIGlmKCFjYilcbiAgICAgICAgY2IgPSB0ZXN0LCB0ZXN0ID0gaWRcbiAgICAgIGVsc2VcbiAgICAgICAgdGVzdCA9IHByb3AodGVzdCkgfHwgaWRcblxuICAgICAgcmV0dXJuIGRyYWluKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmKHRlc3QoZGF0YSkpIHtcbiAgICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgICBjYihudWxsLCBkYXRhKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZihlbmRlZCkgcmV0dXJuIC8vYWxyZWFkeSBjYWxsZWQgYmFja1xuICAgICAgICBjYihlcnIgPT09IHRydWUgPyBudWxsIDogZXJyLCBudWxsKVxuICAgICAgfSlcblxuICAgIH0sIGNiKVxuICB9XG5cbiAgdmFyIHJlZHVjZSA9IGV4cG9ydHMucmVkdWNlID1cbiAgZnVuY3Rpb24gKHJlZHVjZSwgYWNjLCBjYikge1xuXG4gICAgcmV0dXJuIG1heWJlU2luayhmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHJldHVybiBkcmFpbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBhY2MgPSByZWR1Y2UoYWNjLCBkYXRhKVxuICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBjYihlcnIsIGFjYylcbiAgICAgIH0pXG5cbiAgICB9LCBjYilcbiAgfVxuXG4gIHZhciBjb2xsZWN0ID0gZXhwb3J0cy5jb2xsZWN0ID0gZXhwb3J0cy53cml0ZUFycmF5ID1cbiAgZnVuY3Rpb24gKGNiKSB7XG4gICAgcmV0dXJuIHJlZHVjZShmdW5jdGlvbiAoYXJyLCBpdGVtKSB7XG4gICAgICBhcnIucHVzaChpdGVtKVxuICAgICAgcmV0dXJuIGFyclxuICAgIH0sIFtdLCBjYilcbiAgfVxuXG4gIHZhciBjb25jYXQgPSBleHBvcnRzLmNvbmNhdCA9XG4gIGZ1bmN0aW9uIChjYikge1xuICAgIHJldHVybiByZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhICsgYlxuICAgIH0sICcnLCBjYilcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzXG59XG4iLCJ2YXIgZHJhaW4gPSBleHBvcnRzLmRyYWluID0gZnVuY3Rpb24gKHJlYWQsIG9wLCBkb25lKSB7XG5cbiAgOyhmdW5jdGlvbiBuZXh0KCkge1xuICAgIHZhciBsb29wID0gdHJ1ZSwgY2JlZCA9IGZhbHNlXG4gICAgd2hpbGUobG9vcCkge1xuICAgICAgY2JlZCA9IGZhbHNlXG4gICAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgY2JlZCA9IHRydWVcbiAgICAgICAgaWYoZW5kKSB7XG4gICAgICAgICAgbG9vcCA9IGZhbHNlXG4gICAgICAgICAgaWYoZG9uZSkgZG9uZShlbmQgPT09IHRydWUgPyBudWxsIDogZW5kKVxuICAgICAgICAgIGVsc2UgaWYoZW5kICYmIGVuZCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgIHRocm93IGVuZFxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYob3AgJiYgZmFsc2UgPT09IG9wKGRhdGEpKSB7XG4gICAgICAgICAgbG9vcCA9IGZhbHNlXG4gICAgICAgICAgcmVhZCh0cnVlLCBkb25lIHx8IGZ1bmN0aW9uICgpIHt9KVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIWxvb3Ape1xuICAgICAgICAgIG5leHQoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYoIWNiZWQpIHtcbiAgICAgICAgbG9vcCA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfSkoKVxufVxuXG52YXIgb25FbmQgPSBleHBvcnRzLm9uRW5kID0gZnVuY3Rpb24gKHJlYWQsIGRvbmUpIHtcbiAgcmV0dXJuIGRyYWluKHJlYWQsIG51bGwsIGRvbmUpXG59XG5cbnZhciBsb2cgPSBleHBvcnRzLmxvZyA9IGZ1bmN0aW9uIChyZWFkLCBkb25lKSB7XG4gIHJldHVybiBkcmFpbihyZWFkLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGNvbnNvbGUubG9nKGRhdGEpXG4gIH0sIGRvbmUpXG59XG5cbiIsIlxudmFyIGtleXMgPSBleHBvcnRzLmtleXMgPVxuZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdmFsdWVzKE9iamVjdC5rZXlzKG9iamVjdCkpXG59XG5cbnZhciBvbmNlID0gZXhwb3J0cy5vbmNlID1cbmZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGFib3J0KSByZXR1cm4gY2IoYWJvcnQpXG4gICAgaWYodmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFyIF92YWx1ZSA9IHZhbHVlOyB2YWx1ZSA9IG51bGxcbiAgICAgIGNiKG51bGwsIF92YWx1ZSlcbiAgICB9IGVsc2VcbiAgICAgIGNiKHRydWUpXG4gIH1cbn1cblxudmFyIHZhbHVlcyA9IGV4cG9ydHMudmFsdWVzID0gZXhwb3J0cy5yZWFkQXJyYXkgPVxuZnVuY3Rpb24gKGFycmF5KSB7XG4gIGlmKCFhcnJheSlcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgICAgcmV0dXJuIGNiKGFib3J0IHx8IHRydWUpXG4gICAgfVxuICBpZighQXJyYXkuaXNBcnJheShhcnJheSkpXG4gICAgYXJyYXkgPSBPYmplY3Qua2V5cyhhcnJheSkubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gYXJyYXlba11cbiAgICB9KVxuICB2YXIgaSA9IDBcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKVxuICAgICAgcmV0dXJuIGNiICYmIGNiKGVuZClcbiAgICBjYihpID49IGFycmF5Lmxlbmd0aCB8fCBudWxsLCBhcnJheVtpKytdKVxuICB9XG59XG5cblxudmFyIGNvdW50ID0gZXhwb3J0cy5jb3VudCA9XG5mdW5jdGlvbiAobWF4KSB7XG4gIHZhciBpID0gMDsgbWF4ID0gbWF4IHx8IEluZmluaXR5XG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIGNiICYmIGNiKGVuZClcbiAgICBpZihpID4gbWF4KVxuICAgICAgcmV0dXJuIGNiKHRydWUpXG4gICAgY2IobnVsbCwgaSsrKVxuICB9XG59XG5cbnZhciBpbmZpbml0ZSA9IGV4cG9ydHMuaW5maW5pdGUgPVxuZnVuY3Rpb24gKGdlbmVyYXRlKSB7XG4gIGdlbmVyYXRlID0gZ2VuZXJhdGUgfHwgTWF0aC5yYW5kb21cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSByZXR1cm4gY2IgJiYgY2IoZW5kKVxuICAgIHJldHVybiBjYihudWxsLCBnZW5lcmF0ZSgpKVxuICB9XG59XG5cbnZhciBkZWZlciA9IGV4cG9ydHMuZGVmZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVhZCwgY2JzID0gW10sIF9lbmRcblxuICB2YXIgcmVhZCA9IGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoIV9yZWFkKSB7XG4gICAgICBfZW5kID0gZW5kXG4gICAgICBjYnMucHVzaChjYilcbiAgICB9IFxuICAgIGVsc2UgX3JlYWQoZW5kLCBjYilcbiAgfVxuICByZWFkLnJlc29sdmUgPSBmdW5jdGlvbiAocmVhZCkge1xuICAgIGlmKF9yZWFkKSB0aHJvdyBuZXcgRXJyb3IoJ2FscmVhZHkgcmVzb2x2ZWQnKVxuICAgIF9yZWFkID0gcmVhZFxuICAgIGlmKCFfcmVhZCkgdGhyb3cgbmV3IEVycm9yKCdubyByZWFkIGNhbm5vdCByZXNvbHZlIScgKyBfcmVhZClcbiAgICB3aGlsZShjYnMubGVuZ3RoKVxuICAgICAgX3JlYWQoX2VuZCwgY2JzLnNoaWZ0KCkpXG4gIH1cbiAgcmVhZC5hYm9ydCA9IGZ1bmN0aW9uKGVycikge1xuICAgIHJlYWQucmVzb2x2ZShmdW5jdGlvbiAoXywgY2IpIHtcbiAgICAgIGNiKGVyciB8fCB0cnVlKVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlYWRcbn1cblxudmFyIGVtcHR5ID0gZXhwb3J0cy5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBjYih0cnVlKVxuICB9XG59XG5cbnZhciBlcnJvciA9IGV4cG9ydHMuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgY2IoZXJyKVxuICB9XG59XG5cbnZhciBkZXB0aEZpcnN0ID0gZXhwb3J0cy5kZXB0aEZpcnN0ID1cbmZ1bmN0aW9uIChzdGFydCwgY3JlYXRlU3RyZWFtKSB7XG4gIHZhciByZWFkcyA9IFtdXG5cbiAgcmVhZHMudW5zaGlmdChvbmNlKHN0YXJ0KSlcblxuICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoZW5kLCBjYikge1xuICAgIGlmKCFyZWFkcy5sZW5ndGgpXG4gICAgICByZXR1cm4gY2IodHJ1ZSlcbiAgICByZWFkc1swXShlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkge1xuICAgICAgICAvL2lmIHRoaXMgc3RyZWFtIGhhcyBlbmRlZCwgZ28gdG8gdGhlIG5leHQgcXVldWVcbiAgICAgICAgcmVhZHMuc2hpZnQoKVxuICAgICAgICByZXR1cm4gbmV4dChudWxsLCBjYilcbiAgICAgIH1cbiAgICAgIHJlYWRzLnVuc2hpZnQoY3JlYXRlU3RyZWFtKGRhdGEpKVxuICAgICAgY2IoZW5kLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cbi8vd2lkdGggZmlyc3QgaXMganVzdCBsaWtlIGRlcHRoIGZpcnN0LFxuLy9idXQgcHVzaCBlYWNoIG5ldyBzdHJlYW0gb250byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxudmFyIHdpZHRoRmlyc3QgPSBleHBvcnRzLndpZHRoRmlyc3QgPVxuZnVuY3Rpb24gKHN0YXJ0LCBjcmVhdGVTdHJlYW0pIHtcbiAgdmFyIHJlYWRzID0gW11cblxuICByZWFkcy5wdXNoKG9uY2Uoc3RhcnQpKVxuXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgaWYoIXJlYWRzLmxlbmd0aClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIHJlYWRzWzBdKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSB7XG4gICAgICAgIHJlYWRzLnNoaWZ0KClcbiAgICAgICAgcmV0dXJuIG5leHQobnVsbCwgY2IpXG4gICAgICB9XG4gICAgICByZWFkcy5wdXNoKGNyZWF0ZVN0cmVhbShkYXRhKSlcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbi8vdGhpcyBjYW1lIG91dCBkaWZmZXJlbnQgdG8gdGhlIGZpcnN0IChzdHJtKVxuLy9hdHRlbXB0IGF0IGxlYWZGaXJzdCwgYnV0IGl0J3Mgc3RpbGwgYSB2YWxpZFxuLy90b3BvbG9naWNhbCBzb3J0LlxudmFyIGxlYWZGaXJzdCA9IGV4cG9ydHMubGVhZkZpcnN0ID1cbmZ1bmN0aW9uIChzdGFydCwgY3JlYXRlU3RyZWFtKSB7XG4gIHZhciByZWFkcyA9IFtdXG4gIHZhciBvdXRwdXQgPSBbXVxuICByZWFkcy5wdXNoKG9uY2Uoc3RhcnQpKVxuXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgcmVhZHNbMF0oZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHtcbiAgICAgICAgcmVhZHMuc2hpZnQoKVxuICAgICAgICBpZighb3V0cHV0Lmxlbmd0aClcbiAgICAgICAgICByZXR1cm4gY2IodHJ1ZSlcbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIG91dHB1dC5zaGlmdCgpKVxuICAgICAgfVxuICAgICAgcmVhZHMudW5zaGlmdChjcmVhdGVTdHJlYW0oZGF0YSkpXG4gICAgICBvdXRwdXQudW5zaGlmdChkYXRhKVxuICAgICAgbmV4dChudWxsLCBjYilcbiAgICB9KVxuICB9XG59XG5cbiIsInZhciB1ICAgICAgPSByZXF1aXJlKCdwdWxsLWNvcmUnKVxudmFyIHNvdXJjZXMgPSByZXF1aXJlKCcuL3NvdXJjZXMnKVxudmFyIHNpbmtzID0gcmVxdWlyZSgnLi9zaW5rcycpXG5cbnZhciBwcm9wICAgPSB1LnByb3BcbnZhciBpZCAgICAgPSB1LmlkXG52YXIgdGVzdGVyID0gdS50ZXN0ZXJcblxudmFyIG1hcCA9IGV4cG9ydHMubWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXApIHtcbiAgbWFwID0gcHJvcChtYXApIHx8IGlkXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgcmVhZChhYm9ydCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgIGRhdGEgPSAhZW5kID8gbWFwKGRhdGEpIDogbnVsbFxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiByZWFkKGVyciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgYXN5bmNNYXAgPSBleHBvcnRzLmFzeW5jTWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXApIHtcbiAgaWYoIW1hcCkgcmV0dXJuIHJlYWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmQsIGNiKSAvL2Fib3J0XG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHJldHVybiBjYihlbmQsIGRhdGEpXG4gICAgICBtYXAoZGF0YSwgY2IpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgcGFyYU1hcCA9IGV4cG9ydHMucGFyYU1hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwLCB3aWR0aCkge1xuICBpZighbWFwKSByZXR1cm4gcmVhZFxuICB2YXIgZW5kZWQgPSBmYWxzZSwgcXVldWUgPSBbXSwgX2NiXG5cbiAgZnVuY3Rpb24gZHJhaW4gKCkge1xuICAgIGlmKCFfY2IpIHJldHVyblxuICAgIHZhciBjYiA9IF9jYlxuICAgIF9jYiA9IG51bGxcbiAgICBpZihxdWV1ZS5sZW5ndGgpXG4gICAgICByZXR1cm4gY2IobnVsbCwgcXVldWUuc2hpZnQoKSlcbiAgICBlbHNlIGlmKGVuZGVkICYmICFuKVxuICAgICAgcmV0dXJuIGNiKGVuZGVkKVxuICAgIF9jYiA9IGNiXG4gIH1cblxuICBmdW5jdGlvbiBwdWxsICgpIHtcbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkge1xuICAgICAgICBlbmRlZCA9IGVuZFxuICAgICAgICByZXR1cm4gZHJhaW4oKVxuICAgICAgfVxuICAgICAgbisrXG4gICAgICBtYXAoZGF0YSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICBuLS1cblxuICAgICAgICBxdWV1ZS5wdXNoKGRhdGEpXG4gICAgICAgIGRyYWluKClcbiAgICAgIH0pXG5cbiAgICAgIGlmKG4gPCB3aWR0aCAmJiAhZW5kZWQpXG4gICAgICAgIHB1bGwoKVxuICAgIH0pXG4gIH1cblxuICB2YXIgbiA9IDBcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmQsIGNiKSAvL2Fib3J0XG4gICAgLy9jb250aW51ZSB0byByZWFkIHdoaWxlIHRoZXJlIGFyZSBsZXNzIHRoYW4gMyBtYXBzIGluIGZsaWdodFxuICAgIF9jYiA9IGNiXG4gICAgaWYocXVldWUubGVuZ3RoIHx8IGVuZGVkKVxuICAgICAgcHVsbCgpLCBkcmFpbigpXG4gICAgZWxzZSBwdWxsKClcbiAgfVxuICByZXR1cm4gaGlnaFdhdGVyTWFyayhhc3luY01hcChyZWFkLCBtYXApLCB3aWR0aClcbn1cblxudmFyIGZpbHRlciA9IGV4cG9ydHMuZmlsdGVyID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIC8vcmVnZXhwXG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZ1bmN0aW9uIG5leHQgKGVuZCwgY2IpIHtcbiAgICB2YXIgc3luYywgbG9vcCA9IHRydWVcbiAgICB3aGlsZShsb29wKSB7XG4gICAgICBsb29wID0gZmFsc2VcbiAgICAgIHN5bmMgPSB0cnVlXG4gICAgICByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZighZW5kICYmICF0ZXN0KGRhdGEpKVxuICAgICAgICAgIHJldHVybiBzeW5jID8gbG9vcCA9IHRydWUgOiBuZXh0KGVuZCwgY2IpXG4gICAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICAgIH0pXG4gICAgICBzeW5jID0gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxudmFyIGZpbHRlck5vdCA9IGV4cG9ydHMuZmlsdGVyTm90ID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZpbHRlcihyZWFkLCBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAhdGVzdChlKVxuICB9KVxufVxuXG52YXIgdGhyb3VnaCA9IGV4cG9ydHMudGhyb3VnaCA9XG5mdW5jdGlvbiAocmVhZCwgb3AsIG9uRW5kKSB7XG4gIHZhciBhID0gZmFsc2VcbiAgZnVuY3Rpb24gb25jZSAoYWJvcnQpIHtcbiAgICBpZihhIHx8ICFvbkVuZCkgcmV0dXJuXG4gICAgYSA9IHRydWVcbiAgICBvbkVuZChhYm9ydCA9PT0gdHJ1ZSA/IG51bGwgOiBhYm9ydClcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgb25jZShlbmQpXG4gICAgcmV0dXJuIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZighZW5kKSBvcCAmJiBvcChkYXRhKVxuICAgICAgZWxzZSBvbmNlKGVuZClcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciB0YWtlID0gZXhwb3J0cy50YWtlID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHZhciBlbmRlZCA9IGZhbHNlXG4gIGlmKCdudW1iZXInID09PSB0eXBlb2YgdGVzdCkge1xuICAgIHZhciBuID0gdGVzdDsgdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuIC0tXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kZWQpIHJldHVybiBjYihlbmRlZClcbiAgICBpZihlbmRlZCA9IGVuZCkgcmV0dXJuIHJlYWQoZW5kZWQsIGNiKVxuXG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkgcmV0dXJuIGNiKGVuZGVkKVxuICAgICAgaWYoIXRlc3QoZGF0YSkpIHtcbiAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgIHJlYWQodHJ1ZSwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGNiKGVuZGVkLCBkYXRhKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBjYihudWxsLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHVuaXF1ZSA9IGV4cG9ydHMudW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkLCBpbnZlcnQpIHtcbiAgZmllbGQgPSBwcm9wKGZpZWxkKSB8fCBpZFxuICB2YXIgc2VlbiA9IHt9XG4gIHJldHVybiBmaWx0ZXIocmVhZCwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIga2V5ID0gZmllbGQoZGF0YSlcbiAgICBpZihzZWVuW2tleV0pIHJldHVybiAhIWludmVydCAvL2ZhbHNlLCBieSBkZWZhdWx0XG4gICAgZWxzZSBzZWVuW2tleV0gPSB0cnVlXG4gICAgcmV0dXJuICFpbnZlcnQgLy90cnVlIGJ5IGRlZmF1bHRcbiAgfSlcbn1cblxudmFyIG5vblVuaXF1ZSA9IGV4cG9ydHMubm9uVW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkKSB7XG4gIHJldHVybiB1bmlxdWUocmVhZCwgZmllbGQsIHRydWUpXG59XG5cbnZhciBncm91cCA9IGV4cG9ydHMuZ3JvdXAgPVxuZnVuY3Rpb24gKHJlYWQsIHNpemUpIHtcbiAgdmFyIGVuZGVkOyBzaXplID0gc2l6ZSB8fCA1XG4gIHZhciBxdWV1ZSA9IFtdXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgLy90aGlzIG1lYW5zIHRoYXQgdGhlIHVwc3RyZWFtIGlzIHNlbmRpbmcgYW4gZXJyb3IuXG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmRlZCA9IGVuZCwgY2IpXG4gICAgLy90aGlzIG1lYW5zIHRoYXQgd2UgcmVhZCBhbiBlbmQgYmVmb3JlLlxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIG5leHQoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkge1xuICAgICAgICBpZighcXVldWUubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiBjYihlbmRlZClcblxuICAgICAgICB2YXIgX3F1ZXVlID0gcXVldWU7IHF1ZXVlID0gW11cbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIF9xdWV1ZSlcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goZGF0YSlcbiAgICAgIGlmKHF1ZXVlLmxlbmd0aCA8IHNpemUpXG4gICAgICAgIHJldHVybiByZWFkKG51bGwsIG5leHQpXG5cbiAgICAgIHZhciBfcXVldWUgPSBxdWV1ZTsgcXVldWUgPSBbXVxuICAgICAgY2IobnVsbCwgX3F1ZXVlKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGZsYXR0ZW4gPSBleHBvcnRzLmZsYXR0ZW4gPSBmdW5jdGlvbiAocmVhZCkge1xuICB2YXIgX3JlYWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihfcmVhZCkgbmV4dENodW5rKClcbiAgICBlbHNlICAgICAgbmV4dFN0cmVhbSgpXG5cbiAgICBmdW5jdGlvbiBuZXh0Q2h1bmsgKCkge1xuICAgICAgX3JlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZihlbmQpIG5leHRTdHJlYW0oKVxuICAgICAgICBlbHNlICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgICBmdW5jdGlvbiBuZXh0U3RyZWFtICgpIHtcbiAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgc3RyZWFtKSB7XG4gICAgICAgIGlmKGVuZClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kKVxuICAgICAgICBpZihBcnJheS5pc0FycmF5KHN0cmVhbSkgfHwgc3RyZWFtICYmICdvYmplY3QnID09PSB0eXBlb2Ygc3RyZWFtKVxuICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZXMudmFsdWVzKHN0cmVhbSlcbiAgICAgICAgZWxzZSBpZignZnVuY3Rpb24nICE9IHR5cGVvZiBzdHJlYW0pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJlYW0gb2Ygc3RyZWFtcycpXG4gICAgICAgIF9yZWFkID0gc3RyZWFtXG4gICAgICAgIG5leHRDaHVuaygpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG52YXIgcHJlcGVuZCA9XG5leHBvcnRzLnByZXBlbmQgPVxuZnVuY3Rpb24gKHJlYWQsIGhlYWQpIHtcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGhlYWQgIT09IG51bGwpIHtcbiAgICAgIGlmKGFib3J0KVxuICAgICAgICByZXR1cm4gcmVhZChhYm9ydCwgY2IpXG4gICAgICB2YXIgX2hlYWQgPSBoZWFkXG4gICAgICBoZWFkID0gbnVsbFxuICAgICAgY2IobnVsbCwgX2hlYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWQoYWJvcnQsIGNiKVxuICAgIH1cbiAgfVxuXG59XG5cbi8vdmFyIGRyYWluSWYgPSBleHBvcnRzLmRyYWluSWYgPSBmdW5jdGlvbiAob3AsIGRvbmUpIHtcbi8vICBzaW5rcy5kcmFpbihcbi8vfVxuXG52YXIgX3JlZHVjZSA9IGV4cG9ydHMuX3JlZHVjZSA9IGZ1bmN0aW9uIChyZWFkLCByZWR1Y2UsIGluaXRpYWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjbG9zZSwgY2IpIHtcbiAgICBpZihjbG9zZSkgcmV0dXJuIHJlYWQoY2xvc2UsIGNiKVxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICBzaW5rcy5kcmFpbihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaW5pdGlhbCA9IHJlZHVjZShpbml0aWFsLCBpdGVtKVxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGVuZGVkID0gZXJyIHx8IHRydWVcbiAgICAgIGlmKCFlcnIpIGNiKG51bGwsIGluaXRpYWwpXG4gICAgICBlbHNlICAgICBjYihlbmRlZClcbiAgICB9KVxuICAgIChyZWFkKVxuICB9XG59XG5cbnZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2tcblxudmFyIGhpZ2hXYXRlck1hcmsgPSBleHBvcnRzLmhpZ2hXYXRlck1hcmsgPVxuZnVuY3Rpb24gKHJlYWQsIGhpZ2hXYXRlck1hcmspIHtcbiAgdmFyIGJ1ZmZlciA9IFtdLCB3YWl0aW5nID0gW10sIGVuZGVkLCBlbmRpbmcsIHJlYWRpbmcgPSBmYWxzZVxuICBoaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyayB8fCAxMFxuXG4gIGZ1bmN0aW9uIHJlYWRBaGVhZCAoKSB7XG4gICAgd2hpbGUod2FpdGluZy5sZW5ndGggJiYgKGJ1ZmZlci5sZW5ndGggfHwgZW5kZWQpKVxuICAgICAgd2FpdGluZy5zaGlmdCgpKGVuZGVkLCBlbmRlZCA/IG51bGwgOiBidWZmZXIuc2hpZnQoKSlcblxuICAgIGlmICghYnVmZmVyLmxlbmd0aCAmJiBlbmRpbmcpIGVuZGVkID0gZW5kaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgaWYoZW5kZWQgfHwgZW5kaW5nIHx8IHJlYWRpbmcgfHwgYnVmZmVyLmxlbmd0aCA+PSBoaWdoV2F0ZXJNYXJrKVxuICAgICAgcmV0dXJuXG4gICAgcmVhZGluZyA9IHRydWVcbiAgICByZXR1cm4gcmVhZChlbmRlZCB8fCBlbmRpbmcsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgZW5kaW5nID0gZW5kaW5nIHx8IGVuZFxuICAgICAgaWYoZGF0YSAhPSBudWxsKSBidWZmZXIucHVzaChkYXRhKVxuXG4gICAgICBuZXh0KCk7IHJlYWRBaGVhZCgpXG4gICAgfSlcbiAgfVxuXG4gIHByb2Nlc3MubmV4dFRpY2sobmV4dClcblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBlbmRlZCA9IGVuZGVkIHx8IGVuZFxuICAgIHdhaXRpbmcucHVzaChjYilcblxuICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgfVxufVxuXG52YXIgZmxhdE1hcCA9IGV4cG9ydHMuZmxhdE1hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwcGVyKSB7XG4gIG1hcHBlciA9IG1hcHBlciB8fCBpZFxuICB2YXIgcXVldWUgPSBbXSwgZW5kZWRcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKHF1ZXVlLmxlbmd0aCkgcmV0dXJuIGNiKG51bGwsIHF1ZXVlLnNoaWZ0KCkpXG4gICAgZWxzZSBpZihlbmRlZCkgICByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICByZWFkKGFib3J0LCBmdW5jdGlvbiBuZXh0IChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkgZW5kZWQgPSBlbmRcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgYWRkID0gbWFwcGVyKGRhdGEpXG4gICAgICAgIHdoaWxlKGFkZCAmJiBhZGQubGVuZ3RoKVxuICAgICAgICAgIHF1ZXVlLnB1c2goYWRkLnNoaWZ0KCkpXG4gICAgICB9XG5cbiAgICAgIGlmKHF1ZXVlLmxlbmd0aCkgY2IobnVsbCwgcXVldWUuc2hpZnQoKSlcbiAgICAgIGVsc2UgaWYoZW5kZWQpICAgY2IoZW5kZWQpXG4gICAgICBlbHNlICAgICAgICAgICAgIHJlYWQobnVsbCwgbmV4dClcbiAgICB9KVxuICB9XG59XG5cbiIsImNvbnN0IGxldmVsdXAgPSByZXF1aXJlKCdsZXZlbHVwJylcblxuZnVuY3Rpb24gcGFja2FnZXIgKGxldmVsZG93bikge1xuICBmdW5jdGlvbiBMZXZlbCAobG9jYXRpb24sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zXG4gICAgaWYgKCEodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwpKVxuICAgICAgb3B0aW9ucyAgPSB7fVxuXG4gICAgb3B0aW9ucy5kYiA9IGxldmVsZG93blxuXG4gICAgcmV0dXJuIGxldmVsdXAobG9jYXRpb24sIG9wdGlvbnMsIGNhbGxiYWNrKVxuICB9XG5cbiAgWyAnZGVzdHJveScsICdyZXBhaXInIF0uZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWxkb3duW21dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBMZXZlbFttXSA9IGZ1bmN0aW9uIChsb2NhdGlvbiwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV2ZWxkb3duW21dKGxvY2F0aW9uLCBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fSlcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIExldmVsXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFja2FnZXJcbiIsIi8qIENvcHlyaWdodCAoYykgMjAxMyBSb2QgVmFnZywgTUlUIExpY2Vuc2UgKi9cblxuZnVuY3Rpb24gQWJzdHJhY3RDaGFpbmVkQmF0Y2ggKGRiKSB7XG4gIHRoaXMuX2RiICAgICAgICAgPSBkYlxuICB0aGlzLl9vcGVyYXRpb25zID0gW11cbiAgdGhpcy5fd3JpdHRlbiAgICA9IGZhbHNlXG59XG5cbkFic3RyYWN0Q2hhaW5lZEJhdGNoLnByb3RvdHlwZS5fY2hlY2tXcml0dGVuID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fd3JpdHRlbilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlKCkgYWxyZWFkeSBjYWxsZWQgb24gdGhpcyBiYXRjaCcpXG59XG5cbkFic3RyYWN0Q2hhaW5lZEJhdGNoLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB0aGlzLl9jaGVja1dyaXR0ZW4oKVxuXG4gIHZhciBlcnIgPSB0aGlzLl9kYi5fY2hlY2tLZXkoa2V5LCAna2V5JywgdGhpcy5fZGIuX2lzQnVmZmVyKVxuICBpZiAoZXJyKVxuICAgIHRocm93IGVyclxuXG4gIGlmICghdGhpcy5fZGIuX2lzQnVmZmVyKGtleSkpIGtleSA9IFN0cmluZyhrZXkpXG4gIGlmICghdGhpcy5fZGIuX2lzQnVmZmVyKHZhbHVlKSkgdmFsdWUgPSBTdHJpbmcodmFsdWUpXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9wdXQgPT0gJ2Z1bmN0aW9uJyApXG4gICAgdGhpcy5fcHV0KGtleSwgdmFsdWUpXG4gIGVsc2VcbiAgICB0aGlzLl9vcGVyYXRpb25zLnB1c2goeyB0eXBlOiAncHV0Jywga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9KVxuXG4gIHJldHVybiB0aGlzXG59XG5cbkFic3RyYWN0Q2hhaW5lZEJhdGNoLnByb3RvdHlwZS5kZWwgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHRoaXMuX2NoZWNrV3JpdHRlbigpXG5cbiAgdmFyIGVyciA9IHRoaXMuX2RiLl9jaGVja0tleShrZXksICdrZXknLCB0aGlzLl9kYi5faXNCdWZmZXIpXG4gIGlmIChlcnIpIHRocm93IGVyclxuXG4gIGlmICghdGhpcy5fZGIuX2lzQnVmZmVyKGtleSkpIGtleSA9IFN0cmluZyhrZXkpXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9kZWwgPT0gJ2Z1bmN0aW9uJyApXG4gICAgdGhpcy5fZGVsKGtleSlcbiAgZWxzZVxuICAgIHRoaXMuX29wZXJhdGlvbnMucHVzaCh7IHR5cGU6ICdkZWwnLCBrZXk6IGtleSB9KVxuXG4gIHJldHVybiB0aGlzXG59XG5cbkFic3RyYWN0Q2hhaW5lZEJhdGNoLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fY2hlY2tXcml0dGVuKClcblxuICB0aGlzLl9vcGVyYXRpb25zID0gW11cblxuICBpZiAodHlwZW9mIHRoaXMuX2NsZWFyID09ICdmdW5jdGlvbicgKVxuICAgIHRoaXMuX2NsZWFyKClcblxuICByZXR1cm4gdGhpc1xufVxuXG5BYnN0cmFjdENoYWluZWRCYXRjaC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdGhpcy5fY2hlY2tXcml0dGVuKClcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJylcbiAgICBjYWxsYmFjayA9IG9wdGlvbnNcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignd3JpdGUoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGFyZ3VtZW50JylcbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKVxuICAgIG9wdGlvbnMgPSB7fVxuXG4gIHRoaXMuX3dyaXR0ZW4gPSB0cnVlXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl93cml0ZSA9PSAnZnVuY3Rpb24nIClcbiAgICByZXR1cm4gdGhpcy5fd3JpdGUoY2FsbGJhY2spXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9kYi5fYmF0Y2ggPT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdGhpcy5fZGIuX2JhdGNoKHRoaXMuX29wZXJhdGlvbnMsIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG59XG5cbm1vZHVsZS5leHBvcnRzID0gQWJzdHJhY3RDaGFpbmVkQmF0Y2giLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTMgUm9kIFZhZ2csIE1JVCBMaWNlbnNlICovXG5cbmZ1bmN0aW9uIEFic3RyYWN0SXRlcmF0b3IgKGRiKSB7XG4gIHRoaXMuZGIgPSBkYlxuICB0aGlzLl9lbmRlZCA9IGZhbHNlXG4gIHRoaXMuX25leHRpbmcgPSBmYWxzZVxufVxuXG5BYnN0cmFjdEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25leHQoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGFyZ3VtZW50JylcblxuICBpZiAoc2VsZi5fZW5kZWQpXG4gICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignY2Fubm90IGNhbGwgbmV4dCgpIGFmdGVyIGVuZCgpJykpXG4gIGlmIChzZWxmLl9uZXh0aW5nKVxuICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ2Nhbm5vdCBjYWxsIG5leHQoKSBiZWZvcmUgcHJldmlvdXMgbmV4dCgpIGhhcyBjb21wbGV0ZWQnKSlcblxuICBzZWxmLl9uZXh0aW5nID0gdHJ1ZVxuICBpZiAodHlwZW9mIHNlbGYuX25leHQgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzZWxmLl9uZXh0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuX25leHRpbmcgPSBmYWxzZVxuICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKVxuICAgIH0pXG4gIH1cblxuICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLl9uZXh0aW5nID0gZmFsc2VcbiAgICBjYWxsYmFjaygpXG4gIH0pXG59XG5cbkFic3RyYWN0SXRlcmF0b3IucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdlbmQoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGFyZ3VtZW50JylcblxuICBpZiAodGhpcy5fZW5kZWQpXG4gICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignZW5kKCkgYWxyZWFkeSBjYWxsZWQgb24gaXRlcmF0b3InKSlcblxuICB0aGlzLl9lbmRlZCA9IHRydWVcblxuICBpZiAodHlwZW9mIHRoaXMuX2VuZCA9PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB0aGlzLl9lbmQoY2FsbGJhY2spXG5cbiAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBYnN0cmFjdEl0ZXJhdG9yXG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTMgUm9kIFZhZ2csIE1JVCBMaWNlbnNlICovXG5cbnZhciB4dGVuZCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJ3h0ZW5kJylcbiAgLCBBYnN0cmFjdEl0ZXJhdG9yICAgICA9IHJlcXVpcmUoJy4vYWJzdHJhY3QtaXRlcmF0b3InKVxuICAsIEFic3RyYWN0Q2hhaW5lZEJhdGNoID0gcmVxdWlyZSgnLi9hYnN0cmFjdC1jaGFpbmVkLWJhdGNoJylcblxuZnVuY3Rpb24gQWJzdHJhY3RMZXZlbERPV04gKGxvY2F0aW9uKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCB8fCBsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKVxuICAgIHRocm93IG5ldyBFcnJvcignY29uc3RydWN0b3IgcmVxdWlyZXMgYXQgbGVhc3QgYSBsb2NhdGlvbiBhcmd1bWVudCcpXG5cbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPSAnc3RyaW5nJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbnN0cnVjdG9yIHJlcXVpcmVzIGEgbG9jYXRpb24gc3RyaW5nIGFyZ3VtZW50JylcblxuICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb25cbiAgdGhpcy5zdGF0dXMgPSAnbmV3J1xufVxuXG5BYnN0cmFjdExldmVsRE9XTi5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uIChvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiAgICAgID0gdGhpc1xuICAgICwgb2xkU3RhdHVzID0gdGhpcy5zdGF0dXNcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJylcbiAgICBjYWxsYmFjayA9IG9wdGlvbnNcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvcGVuKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKVxuICAgIG9wdGlvbnMgPSB7fVxuXG4gIG9wdGlvbnMuY3JlYXRlSWZNaXNzaW5nID0gb3B0aW9ucy5jcmVhdGVJZk1pc3NpbmcgIT0gZmFsc2VcbiAgb3B0aW9ucy5lcnJvcklmRXhpc3RzID0gISFvcHRpb25zLmVycm9ySWZFeGlzdHNcblxuICBpZiAodHlwZW9mIHRoaXMuX29wZW4gPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuc3RhdHVzID0gJ29wZW5pbmcnXG4gICAgdGhpcy5fb3BlbihvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHNlbGYuc3RhdHVzID0gb2xkU3RhdHVzXG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgICB9XG4gICAgICBzZWxmLnN0YXR1cyA9ICdvcGVuJ1xuICAgICAgY2FsbGJhY2soKVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5zdGF0dXMgPSAnb3BlbidcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxuICB9XG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgc2VsZiAgICAgID0gdGhpc1xuICAgICwgb2xkU3RhdHVzID0gdGhpcy5zdGF0dXNcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbG9zZSgpIHJlcXVpcmVzIGEgY2FsbGJhY2sgYXJndW1lbnQnKVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fY2xvc2UgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuc3RhdHVzID0gJ2Nsb3NpbmcnXG4gICAgdGhpcy5fY2xvc2UoZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBzZWxmLnN0YXR1cyA9IG9sZFN0YXR1c1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgICAgfVxuICAgICAgc2VsZi5zdGF0dXMgPSAnY2xvc2VkJ1xuICAgICAgY2FsbGJhY2soKVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5zdGF0dXMgPSAnY2xvc2VkJ1xuICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG4gIH1cbn1cblxuQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBlcnJcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJylcbiAgICBjYWxsYmFjayA9IG9wdGlvbnNcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdnZXQoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGFyZ3VtZW50JylcblxuICBpZiAoZXJyID0gdGhpcy5fY2hlY2tLZXkoa2V5LCAna2V5JywgdGhpcy5faXNCdWZmZXIpKVxuICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG5cbiAgaWYgKCF0aGlzLl9pc0J1ZmZlcihrZXkpKVxuICAgIGtleSA9IFN0cmluZyhrZXkpXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKVxuICAgIG9wdGlvbnMgPSB7fVxuXG4gIG9wdGlvbnMuYXNCdWZmZXIgPSBvcHRpb25zLmFzQnVmZmVyICE9IGZhbHNlXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9nZXQgPT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdGhpcy5fZ2V0KGtleSwgb3B0aW9ucywgY2FsbGJhY2spXG5cbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7IGNhbGxiYWNrKG5ldyBFcnJvcignTm90Rm91bmQnKSkgfSlcbn1cblxuQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlLnB1dCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZXJyXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcigncHV0KCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKGVyciA9IHRoaXMuX2NoZWNrS2V5KGtleSwgJ2tleScsIHRoaXMuX2lzQnVmZmVyKSlcbiAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuXG4gIGlmICghdGhpcy5faXNCdWZmZXIoa2V5KSlcbiAgICBrZXkgPSBTdHJpbmcoa2V5KVxuXG4gIC8vIGNvZXJjZSB2YWx1ZSB0byBzdHJpbmcgaW4gbm9kZSwgZG9uJ3QgdG91Y2ggaXQgaW4gYnJvd3NlclxuICAvLyAoaW5kZXhlZGRiIGNhbiBzdG9yZSBhbnkgSlMgdHlwZSlcbiAgaWYgKHZhbHVlICE9IG51bGwgJiYgIXRoaXMuX2lzQnVmZmVyKHZhbHVlKSAmJiAhcHJvY2Vzcy5icm93c2VyKVxuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICBpZiAodHlwZW9mIHRoaXMuX3B1dCA9PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB0aGlzLl9wdXQoa2V5LCB2YWx1ZSwgb3B0aW9ucywgY2FsbGJhY2spXG5cbiAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaylcbn1cblxuQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlLmRlbCA9IGZ1bmN0aW9uIChrZXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBlcnJcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJylcbiAgICBjYWxsYmFjayA9IG9wdGlvbnNcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZWwoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGFyZ3VtZW50JylcblxuICBpZiAoZXJyID0gdGhpcy5fY2hlY2tLZXkoa2V5LCAna2V5JywgdGhpcy5faXNCdWZmZXIpKVxuICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG5cbiAgaWYgKCF0aGlzLl9pc0J1ZmZlcihrZXkpKVxuICAgIGtleSA9IFN0cmluZyhrZXkpXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKVxuICAgIG9wdGlvbnMgPSB7fVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fZGVsID09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRoaXMuX2RlbChrZXksIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5iYXRjaCA9IGZ1bmN0aW9uIChhcnJheSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKVxuICAgIHJldHVybiB0aGlzLl9jaGFpbmVkQmF0Y2goKVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnZnVuY3Rpb24nKVxuICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuXG4gIGlmICh0eXBlb2YgYXJyYXkgPT0gJ2Z1bmN0aW9uJylcbiAgICBjYWxsYmFjayA9IGFycmF5XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignYmF0Y2goYXJyYXkpIHJlcXVpcmVzIGEgY2FsbGJhY2sgYXJndW1lbnQnKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkpXG4gICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignYmF0Y2goYXJyYXkpIHJlcXVpcmVzIGFuIGFycmF5IGFyZ3VtZW50JykpXG5cbiAgaWYgKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKVxuICAgIG9wdGlvbnMgPSB7fVxuXG4gIHZhciBpID0gMFxuICAgICwgbCA9IGFycmF5Lmxlbmd0aFxuICAgICwgZVxuICAgICwgZXJyXG5cbiAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICBlID0gYXJyYXlbaV1cbiAgICBpZiAodHlwZW9mIGUgIT0gJ29iamVjdCcpXG4gICAgICBjb250aW51ZVxuXG4gICAgaWYgKGVyciA9IHRoaXMuX2NoZWNrS2V5KGUudHlwZSwgJ3R5cGUnLCB0aGlzLl9pc0J1ZmZlcikpXG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuXG4gICAgaWYgKGVyciA9IHRoaXMuX2NoZWNrS2V5KGUua2V5LCAna2V5JywgdGhpcy5faXNCdWZmZXIpKVxuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgfVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fYmF0Y2ggPT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdGhpcy5fYmF0Y2goYXJyYXksIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG59XG5cbi8vVE9ETzogcmVtb3ZlIGZyb20gaGVyZSwgbm90IGEgbmVjZXNzYXJ5IHByaW1pdGl2ZVxuQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlLmFwcHJveGltYXRlU2l6ZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kLCBjYWxsYmFjaykge1xuICBpZiAoICAgc3RhcnQgPT0gbnVsbFxuICAgICAgfHwgZW5kID09IG51bGxcbiAgICAgIHx8IHR5cGVvZiBzdGFydCA9PSAnZnVuY3Rpb24nXG4gICAgICB8fCB0eXBlb2YgZW5kID09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcHJveGltYXRlU2l6ZSgpIHJlcXVpcmVzIHZhbGlkIGBzdGFydGAsIGBlbmRgIGFuZCBgY2FsbGJhY2tgIGFyZ3VtZW50cycpXG4gIH1cblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdhcHByb3hpbWF0ZVNpemUoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGFyZ3VtZW50JylcblxuICBpZiAoIXRoaXMuX2lzQnVmZmVyKHN0YXJ0KSlcbiAgICBzdGFydCA9IFN0cmluZyhzdGFydClcblxuICBpZiAoIXRoaXMuX2lzQnVmZmVyKGVuZCkpXG4gICAgZW5kID0gU3RyaW5nKGVuZClcblxuICBpZiAodHlwZW9mIHRoaXMuX2FwcHJveGltYXRlU2l6ZSA9PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB0aGlzLl9hcHByb3hpbWF0ZVNpemUoc3RhcnQsIGVuZCwgY2FsbGJhY2spXG5cbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgY2FsbGJhY2sobnVsbCwgMClcbiAgfSlcbn1cblxuQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlLl9zZXR1cEl0ZXJhdG9yT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIG9wdGlvbnMgPSB4dGVuZChvcHRpb25zKVxuXG4gIDtbICdzdGFydCcsICdlbmQnLCAnZ3QnLCAnZ3RlJywgJ2x0JywgJ2x0ZScgXS5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7XG4gICAgaWYgKG9wdGlvbnNbb10gJiYgc2VsZi5faXNCdWZmZXIob3B0aW9uc1tvXSkgJiYgb3B0aW9uc1tvXS5sZW5ndGggPT09IDApXG4gICAgICBkZWxldGUgb3B0aW9uc1tvXVxuICB9KVxuXG4gIG9wdGlvbnMucmV2ZXJzZSA9ICEhb3B0aW9ucy5yZXZlcnNlXG4gIG9wdGlvbnMua2V5cyA9IG9wdGlvbnMua2V5cyAhPSBmYWxzZVxuICBvcHRpb25zLnZhbHVlcyA9IG9wdGlvbnMudmFsdWVzICE9IGZhbHNlXG4gIG9wdGlvbnMubGltaXQgPSAnbGltaXQnIGluIG9wdGlvbnMgPyBvcHRpb25zLmxpbWl0IDogLTFcbiAgb3B0aW9ucy5rZXlBc0J1ZmZlciA9IG9wdGlvbnMua2V5QXNCdWZmZXIgIT0gZmFsc2VcbiAgb3B0aW9ucy52YWx1ZUFzQnVmZmVyID0gb3B0aW9ucy52YWx1ZUFzQnVmZmVyICE9IGZhbHNlXG5cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlLml0ZXJhdG9yID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKVxuICAgIG9wdGlvbnMgPSB7fVxuXG4gIG9wdGlvbnMgPSB0aGlzLl9zZXR1cEl0ZXJhdG9yT3B0aW9ucyhvcHRpb25zKVxuXG4gIGlmICh0eXBlb2YgdGhpcy5faXRlcmF0b3IgPT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdGhpcy5faXRlcmF0b3Iob3B0aW9ucylcblxuICByZXR1cm4gbmV3IEFic3RyYWN0SXRlcmF0b3IodGhpcylcbn1cblxuQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlLl9jaGFpbmVkQmF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgQWJzdHJhY3RDaGFpbmVkQmF0Y2godGhpcylcbn1cblxuQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlLl9pc0J1ZmZlciA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5fY2hlY2tLZXkgPSBmdW5jdGlvbiAob2JqLCB0eXBlKSB7XG5cbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gbmV3IEVycm9yKHR5cGUgKyAnIGNhbm5vdCBiZSBgbnVsbGAgb3IgYHVuZGVmaW5lZGAnKVxuXG4gIGlmICh0aGlzLl9pc0J1ZmZlcihvYmopKSB7XG4gICAgaWYgKG9iai5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gbmV3IEVycm9yKHR5cGUgKyAnIGNhbm5vdCBiZSBhbiBlbXB0eSBCdWZmZXInKVxuICB9IGVsc2UgaWYgKFN0cmluZyhvYmopID09PSAnJylcbiAgICByZXR1cm4gbmV3IEVycm9yKHR5cGUgKyAnIGNhbm5vdCBiZSBhbiBlbXB0eSBTdHJpbmcnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEFic3RyYWN0TGV2ZWxET1dOXG4iLCJleHBvcnRzLkFic3RyYWN0TGV2ZWxET1dOICAgID0gcmVxdWlyZSgnLi9hYnN0cmFjdC1sZXZlbGRvd24nKVxuZXhwb3J0cy5BYnN0cmFjdEl0ZXJhdG9yICAgICA9IHJlcXVpcmUoJy4vYWJzdHJhY3QtaXRlcmF0b3InKVxuZXhwb3J0cy5BYnN0cmFjdENoYWluZWRCYXRjaCA9IHJlcXVpcmUoJy4vYWJzdHJhY3QtY2hhaW5lZC1iYXRjaCcpXG5leHBvcnRzLmlzTGV2ZWxET1dOICAgICAgICAgID0gcmVxdWlyZSgnLi9pcy1sZXZlbGRvd24nKVxuIiwidmFyIEFic3RyYWN0TGV2ZWxET1dOID0gcmVxdWlyZSgnLi9hYnN0cmFjdC1sZXZlbGRvd24nKVxuXG5mdW5jdGlvbiBpc0xldmVsRE9XTiAoZGIpIHtcbiAgaWYgKCFkYiB8fCB0eXBlb2YgZGIgIT09ICdvYmplY3QnKVxuICAgIHJldHVybiBmYWxzZVxuICByZXR1cm4gT2JqZWN0LmtleXMoQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAvLyBUT0RPIHJlbW92ZSBhcHByb3hpbWF0ZVNpemUgY2hlY2sgd2hlbiBtZXRob2QgaXMgZ29uZVxuICAgIHJldHVybiBuYW1lWzBdICE9ICdfJyAmJiBuYW1lICE9ICdhcHByb3hpbWF0ZVNpemUnXG4gIH0pLmV2ZXJ5KGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYltuYW1lXSA9PSAnZnVuY3Rpb24nXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZXZlbERPV05cbiIsInZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG4gICwgQWJzdHJhY3RJdGVyYXRvciA9IHJlcXVpcmUoJ2Fic3RyYWN0LWxldmVsZG93bicpLkFic3RyYWN0SXRlcmF0b3JcblxuXG5mdW5jdGlvbiBEZWZlcnJlZEl0ZXJhdG9yIChvcHRpb25zKSB7XG4gIEFic3RyYWN0SXRlcmF0b3IuY2FsbCh0aGlzLCBvcHRpb25zKVxuXG4gIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zXG4gIHRoaXMuX2l0ZXJhdG9yID0gbnVsbFxuICB0aGlzLl9vcGVyYXRpb25zID0gW11cbn1cblxudXRpbC5pbmhlcml0cyhEZWZlcnJlZEl0ZXJhdG9yLCBBYnN0cmFjdEl0ZXJhdG9yKVxuXG5EZWZlcnJlZEl0ZXJhdG9yLnByb3RvdHlwZS5zZXREYiA9IGZ1bmN0aW9uIChkYikge1xuICB2YXIgaXQgPSB0aGlzLl9pdGVyYXRvciA9IGRiLml0ZXJhdG9yKHRoaXMuX29wdGlvbnMpXG4gIHRoaXMuX29wZXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob3ApIHtcbiAgICBpdFtvcC5tZXRob2RdLmFwcGx5KGl0LCBvcC5hcmdzKVxuICB9KVxufVxuXG5EZWZlcnJlZEl0ZXJhdG9yLnByb3RvdHlwZS5fb3BlcmF0aW9uID0gZnVuY3Rpb24gKG1ldGhvZCwgYXJncykge1xuICBpZiAodGhpcy5faXRlcmF0b3IpXG4gICAgcmV0dXJuIHRoaXMuX2l0ZXJhdG9yW21ldGhvZF0uYXBwbHkodGhpcy5faXRlcmF0b3IsIGFyZ3MpXG4gIHRoaXMuX29wZXJhdGlvbnMucHVzaCh7IG1ldGhvZDogbWV0aG9kLCBhcmdzOiBhcmdzIH0pXG59XG5cbiduZXh0IGVuZCcuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG4gIERlZmVycmVkSXRlcmF0b3IucHJvdG90eXBlWydfJyArIG1dID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX29wZXJhdGlvbihtLCBhcmd1bWVudHMpXG4gIH1cbn0pXG5cbm1vZHVsZS5leHBvcnRzID0gRGVmZXJyZWRJdGVyYXRvcjtcbiIsInZhciB1dGlsICAgICAgICAgICAgICA9IHJlcXVpcmUoJ3V0aWwnKVxuICAsIEFic3RyYWN0TGV2ZWxET1dOID0gcmVxdWlyZSgnYWJzdHJhY3QtbGV2ZWxkb3duJykuQWJzdHJhY3RMZXZlbERPV05cbiAgLCBEZWZlcnJlZEl0ZXJhdG9yICA9IHJlcXVpcmUoJy4vZGVmZXJyZWQtaXRlcmF0b3InKVxuXG5mdW5jdGlvbiBEZWZlcnJlZExldmVsRE9XTiAobG9jYXRpb24pIHtcbiAgQWJzdHJhY3RMZXZlbERPV04uY2FsbCh0aGlzLCB0eXBlb2YgbG9jYXRpb24gPT0gJ3N0cmluZycgPyBsb2NhdGlvbiA6ICcnKSAvLyBvcHRpb25hbCBsb2NhdGlvbiwgd2hvIGNhcmVzP1xuICB0aGlzLl9kYiAgICAgICAgID0gdW5kZWZpbmVkXG4gIHRoaXMuX29wZXJhdGlvbnMgPSBbXVxuICB0aGlzLl9pdGVyYXRvcnMgID0gW11cbn1cblxudXRpbC5pbmhlcml0cyhEZWZlcnJlZExldmVsRE9XTiwgQWJzdHJhY3RMZXZlbERPV04pXG5cbi8vIGNhbGxlZCBieSBMZXZlbFVQIHdoZW4gd2UgaGF2ZSBhIHJlYWwgREIgdG8gdGFrZSBpdHMgcGxhY2VcbkRlZmVycmVkTGV2ZWxET1dOLnByb3RvdHlwZS5zZXREYiA9IGZ1bmN0aW9uIChkYikge1xuICB0aGlzLl9kYiA9IGRiXG4gIHRoaXMuX29wZXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob3ApIHtcbiAgICBkYltvcC5tZXRob2RdLmFwcGx5KGRiLCBvcC5hcmdzKVxuICB9KVxuICB0aGlzLl9pdGVyYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAoaXQpIHtcbiAgICBpdC5zZXREYihkYilcbiAgfSlcbn1cblxuRGVmZXJyZWRMZXZlbERPV04ucHJvdG90eXBlLl9vcGVuID0gZnVuY3Rpb24gKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxufVxuXG4vLyBxdWV1ZSBhIG5ldyBkZWZlcnJlZCBvcGVyYXRpb25cbkRlZmVycmVkTGV2ZWxET1dOLnByb3RvdHlwZS5fb3BlcmF0aW9uID0gZnVuY3Rpb24gKG1ldGhvZCwgYXJncykge1xuICBpZiAodGhpcy5fZGIpXG4gICAgcmV0dXJuIHRoaXMuX2RiW21ldGhvZF0uYXBwbHkodGhpcy5fZGIsIGFyZ3MpXG4gIHRoaXMuX29wZXJhdGlvbnMucHVzaCh7IG1ldGhvZDogbWV0aG9kLCBhcmdzOiBhcmdzIH0pXG59XG5cbi8vIGRlZmVycmFibGVzXG4ncHV0IGdldCBkZWwgYmF0Y2ggYXBwcm94aW1hdGVTaXplJy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgRGVmZXJyZWRMZXZlbERPV04ucHJvdG90eXBlWydfJyArIG1dID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX29wZXJhdGlvbihtLCBhcmd1bWVudHMpXG4gIH1cbn0pXG5cbkRlZmVycmVkTGV2ZWxET1dOLnByb3RvdHlwZS5faXNCdWZmZXIgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKVxufVxuXG5EZWZlcnJlZExldmVsRE9XTi5wcm90b3R5cGUuX2l0ZXJhdG9yID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKHRoaXMuX2RiKVxuICAgIHJldHVybiB0aGlzLl9kYi5pdGVyYXRvci5hcHBseSh0aGlzLl9kYiwgYXJndW1lbnRzKVxuICB2YXIgaXQgPSBuZXcgRGVmZXJyZWRJdGVyYXRvcihvcHRpb25zKVxuICB0aGlzLl9pdGVyYXRvcnMucHVzaChpdClcbiAgcmV0dXJuIGl0XG59XG5cbm1vZHVsZS5leHBvcnRzICAgICAgICAgICAgICAgICAgPSBEZWZlcnJlZExldmVsRE9XTlxubW9kdWxlLmV4cG9ydHMuRGVmZXJyZWRJdGVyYXRvciA9IERlZmVycmVkSXRlcmF0b3JcbiIsIi8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IExldmVsVVAgY29udHJpYnV0b3JzXG4gKiBTZWUgbGlzdCBhdCA8aHR0cHM6Ly9naXRodWIuY29tL2xldmVsL2xldmVsdXAjY29udHJpYnV0aW5nPlxuICogTUlUIExpY2Vuc2VcbiAqIDxodHRwczovL2dpdGh1Yi5jb20vbGV2ZWwvbGV2ZWx1cC9ibG9iL21hc3Rlci9MSUNFTlNFLm1kPlxuICovXG5cbnZhciB1dGlsICAgICAgICAgID0gcmVxdWlyZSgnLi91dGlsJylcbiAgLCBXcml0ZUVycm9yICAgID0gcmVxdWlyZSgnbGV2ZWwtZXJyb3JzJykuV3JpdGVFcnJvclxuXG4gICwgZ2V0T3B0aW9ucyAgICA9IHV0aWwuZ2V0T3B0aW9uc1xuICAsIGRpc3BhdGNoRXJyb3IgPSB1dGlsLmRpc3BhdGNoRXJyb3JcblxuZnVuY3Rpb24gQmF0Y2ggKGxldmVsdXAsIGNvZGVjKSB7XG4gIHRoaXMuX2xldmVsdXAgPSBsZXZlbHVwXG4gIHRoaXMuX2NvZGVjID0gY29kZWNcbiAgdGhpcy5iYXRjaCA9IGxldmVsdXAuZGIuYmF0Y2goKVxuICB0aGlzLm9wcyA9IFtdXG4gIHRoaXMubGVuZ3RoID0gMFxufVxuXG5CYXRjaC5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24gKGtleV8sIHZhbHVlXywgb3B0aW9ucykge1xuICBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25zKVxuXG4gIHZhciBrZXkgICA9IHRoaXMuX2NvZGVjLmVuY29kZUtleShrZXlfLCBvcHRpb25zKVxuICAgICwgdmFsdWUgPSB0aGlzLl9jb2RlYy5lbmNvZGVWYWx1ZSh2YWx1ZV8sIG9wdGlvbnMpXG5cbiAgdHJ5IHtcbiAgICB0aGlzLmJhdGNoLnB1dChrZXksIHZhbHVlKVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IFdyaXRlRXJyb3IoZSlcbiAgfVxuICB0aGlzLm9wcy5wdXNoKHsgdHlwZSA6ICdwdXQnLCBrZXkgOiBrZXksIHZhbHVlIDogdmFsdWUgfSlcbiAgdGhpcy5sZW5ndGgrK1xuXG4gIHJldHVybiB0aGlzXG59XG5cbkJhdGNoLnByb3RvdHlwZS5kZWwgPSBmdW5jdGlvbiAoa2V5Xywgb3B0aW9ucykge1xuICBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25zKVxuXG4gIHZhciBrZXkgPSB0aGlzLl9jb2RlYy5lbmNvZGVLZXkoa2V5Xywgb3B0aW9ucylcblxuICB0cnkge1xuICAgIHRoaXMuYmF0Y2guZGVsKGtleSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IFdyaXRlRXJyb3IoZXJyKVxuICB9XG4gIHRoaXMub3BzLnB1c2goeyB0eXBlIDogJ2RlbCcsIGtleSA6IGtleSB9KVxuICB0aGlzLmxlbmd0aCsrXG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuQmF0Y2gucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIHRoaXMuYmF0Y2guY2xlYXIoKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgV3JpdGVFcnJvcihlcnIpXG4gIH1cblxuICB0aGlzLm9wcyA9IFtdXG4gIHRoaXMubGVuZ3RoID0gMFxuICByZXR1cm4gdGhpc1xufVxuXG5CYXRjaC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIGxldmVsdXAgPSB0aGlzLl9sZXZlbHVwXG4gICAgLCBvcHMgICAgID0gdGhpcy5vcHNcblxuICB0cnkge1xuICAgIHRoaXMuYmF0Y2gud3JpdGUoZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycilcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoRXJyb3IobGV2ZWx1cCwgbmV3IFdyaXRlRXJyb3IoZXJyKSwgY2FsbGJhY2spXG4gICAgICBsZXZlbHVwLmVtaXQoJ2JhdGNoJywgb3BzKVxuICAgICAgaWYgKGNhbGxiYWNrKVxuICAgICAgICBjYWxsYmFjaygpXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IFdyaXRlRXJyb3IoZXJyKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQmF0Y2hcbiIsIi8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IExldmVsVVAgY29udHJpYnV0b3JzXG4gKiBTZWUgbGlzdCBhdCA8aHR0cHM6Ly9naXRodWIuY29tL2xldmVsL2xldmVsdXAjY29udHJpYnV0aW5nPlxuICogTUlUIExpY2Vuc2VcbiAqIDxodHRwczovL2dpdGh1Yi5jb20vbGV2ZWwvbGV2ZWx1cC9ibG9iL21hc3Rlci9MSUNFTlNFLm1kPlxuICovXG5cbnZhciBFdmVudEVtaXR0ZXIgICAgICAgID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyXG4gICwgaW5oZXJpdHMgICAgICAgICAgICA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0c1xuICAsIGRlcHJlY2F0ZSAgICAgICAgICAgPSByZXF1aXJlKCd1dGlsJykuZGVwcmVjYXRlXG4gICwgZXh0ZW5kICAgICAgICAgICAgICA9IHJlcXVpcmUoJ3h0ZW5kJylcbiAgLCBwcnIgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgncHJyJylcbiAgLCBEZWZlcnJlZExldmVsRE9XTiAgID0gcmVxdWlyZSgnZGVmZXJyZWQtbGV2ZWxkb3duJylcbiAgLCBJdGVyYXRvclN0cmVhbSAgICAgID0gcmVxdWlyZSgnbGV2ZWwtaXRlcmF0b3Itc3RyZWFtJylcblxuICAsIGVycm9ycyAgICAgICAgICAgICAgPSByZXF1aXJlKCdsZXZlbC1lcnJvcnMnKVxuICAsIFdyaXRlRXJyb3IgICAgICAgICAgPSBlcnJvcnMuV3JpdGVFcnJvclxuICAsIFJlYWRFcnJvciAgICAgICAgICAgPSBlcnJvcnMuUmVhZEVycm9yXG4gICwgTm90Rm91bmRFcnJvciAgICAgICA9IGVycm9ycy5Ob3RGb3VuZEVycm9yXG4gICwgT3BlbkVycm9yICAgICAgICAgICA9IGVycm9ycy5PcGVuRXJyb3JcbiAgLCBFbmNvZGluZ0Vycm9yICAgICAgID0gZXJyb3JzLkVuY29kaW5nRXJyb3JcbiAgLCBJbml0aWFsaXphdGlvbkVycm9yID0gZXJyb3JzLkluaXRpYWxpemF0aW9uRXJyb3JcblxuICAsIHV0aWwgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL3V0aWwnKVxuICAsIEJhdGNoICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2JhdGNoJylcbiAgLCBDb2RlYyAgICAgICAgICAgICAgID0gcmVxdWlyZSgnbGV2ZWwtY29kZWMnKVxuXG4gICwgZ2V0T3B0aW9ucyAgICAgICAgICA9IHV0aWwuZ2V0T3B0aW9uc1xuICAsIGRlZmF1bHRPcHRpb25zICAgICAgPSB1dGlsLmRlZmF1bHRPcHRpb25zXG4gICwgZ2V0TGV2ZWxET1dOICAgICAgICA9IHV0aWwuZ2V0TGV2ZWxET1dOXG4gICwgZGlzcGF0Y2hFcnJvciAgICAgICA9IHV0aWwuZGlzcGF0Y2hFcnJvclxuICAsIGlzRGVmaW5lZCAgICAgICAgICAgPSB1dGlsLmlzRGVmaW5lZFxuXG5mdW5jdGlvbiBnZXRDYWxsYmFjayAob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicgPyBvcHRpb25zIDogY2FsbGJhY2tcbn1cblxuLy8gUG9zc2libGUgTGV2ZWxVUCNfc3RhdHVzIHZhbHVlczpcbi8vICAtICduZXcnICAgICAtIG5ld2x5IGNyZWF0ZWQsIG5vdCBvcGVuZWQgb3IgY2xvc2VkXG4vLyAgLSAnb3BlbmluZycgLSB3YWl0aW5nIGZvciB0aGUgZGF0YWJhc2UgdG8gYmUgb3BlbmVkLCBwb3N0IG9wZW4oKVxuLy8gIC0gJ29wZW4nICAgIC0gc3VjY2Vzc2Z1bGx5IG9wZW5lZCB0aGUgZGF0YWJhc2UsIGF2YWlsYWJsZSBmb3IgdXNlXG4vLyAgLSAnY2xvc2luZycgLSB3YWl0aW5nIGZvciB0aGUgZGF0YWJhc2UgdG8gYmUgY2xvc2VkLCBwb3N0IGNsb3NlKClcbi8vICAtICdjbG9zZWQnICAtIGRhdGFiYXNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjbG9zZWQsIHNob3VsZCBub3QgYmVcbi8vICAgICAgICAgICAgICAgICB1c2VkIGV4Y2VwdCBmb3IgYW5vdGhlciBvcGVuKCkgb3BlcmF0aW9uXG5cbmZ1bmN0aW9uIExldmVsVVAgKGxvY2F0aW9uLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGV2ZWxVUCkpXG4gICAgcmV0dXJuIG5ldyBMZXZlbFVQKGxvY2F0aW9uLCBvcHRpb25zLCBjYWxsYmFjaylcblxuICB2YXIgZXJyb3JcblxuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKVxuICB0aGlzLnNldE1heExpc3RlbmVycyhJbmZpbml0eSlcblxuICBpZiAodHlwZW9mIGxvY2F0aW9uID09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT0gJ29iamVjdCcgPyBvcHRpb25zIDoge31cbiAgICBvcHRpb25zLmRiID0gbG9jYXRpb25cbiAgICBsb2NhdGlvbiA9IG51bGxcbiAgfSBlbHNlIGlmICh0eXBlb2YgbG9jYXRpb24gPT0gJ29iamVjdCcgJiYgdHlwZW9mIGxvY2F0aW9uLmRiID09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRpb25zID0gbG9jYXRpb25cbiAgICBsb2NhdGlvbiA9IG51bGxcbiAgfVxuXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnNcbiAgICBvcHRpb25zICA9IHt9XG4gIH1cblxuICBpZiAoKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zLmRiICE9ICdmdW5jdGlvbicpICYmIHR5cGVvZiBsb2NhdGlvbiAhPSAnc3RyaW5nJykge1xuICAgIGVycm9yID0gbmV3IEluaXRpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICdNdXN0IHByb3ZpZGUgYSBsb2NhdGlvbiBmb3IgdGhlIGRhdGFiYXNlJylcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyb3IpXG4gICAgICB9KVxuICAgIH1cbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgb3B0aW9ucyAgICAgID0gZ2V0T3B0aW9ucyhvcHRpb25zKVxuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpXG4gIHRoaXMuX2NvZGVjID0gbmV3IENvZGVjKHRoaXMub3B0aW9ucylcbiAgdGhpcy5fc3RhdHVzID0gJ25ldydcbiAgLy8gc2V0IHRoaXMubG9jYXRpb24gYXMgZW51bWVyYWJsZSBidXQgbm90IGNvbmZpZ3VyYWJsZSBvciB3cml0YWJsZVxuICBwcnIodGhpcywgJ2xvY2F0aW9uJywgbG9jYXRpb24sICdlJylcblxuICB0aGlzLm9wZW4oY2FsbGJhY2spXG59XG5cbmluaGVyaXRzKExldmVsVVAsIEV2ZW50RW1pdHRlcilcblxuTGV2ZWxVUC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgICAsIGRiRmFjdG9yeVxuICAgICwgZGJcblxuICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgIGlmIChjYWxsYmFjaylcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBjYWxsYmFjayhudWxsLCBzZWxmKSB9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBpZiAodGhpcy5faXNPcGVuaW5nKCkpIHtcbiAgICByZXR1cm4gY2FsbGJhY2sgJiYgdGhpcy5vbmNlKFxuICAgICAgICAnb3BlbidcbiAgICAgICwgZnVuY3Rpb24gKCkgeyBjYWxsYmFjayhudWxsLCBzZWxmKSB9XG4gICAgKVxuICB9XG5cbiAgdGhpcy5lbWl0KCdvcGVuaW5nJylcblxuICB0aGlzLl9zdGF0dXMgPSAnb3BlbmluZydcbiAgdGhpcy5kYiAgICAgID0gbmV3IERlZmVycmVkTGV2ZWxET1dOKHRoaXMubG9jYXRpb24pXG4gIGRiRmFjdG9yeSAgICA9IHRoaXMub3B0aW9ucy5kYiB8fCBnZXRMZXZlbERPV04oKVxuICBkYiAgICAgICAgICAgPSBkYkZhY3RvcnkodGhpcy5sb2NhdGlvbilcblxuICBkYi5vcGVuKHRoaXMub3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaEVycm9yKHNlbGYsIG5ldyBPcGVuRXJyb3IoZXJyKSwgY2FsbGJhY2spXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuZGIuc2V0RGIoZGIpXG4gICAgICBzZWxmLmRiID0gZGJcbiAgICAgIHNlbGYuX3N0YXR1cyA9ICdvcGVuJ1xuICAgICAgaWYgKGNhbGxiYWNrKVxuICAgICAgICBjYWxsYmFjayhudWxsLCBzZWxmKVxuICAgICAgc2VsZi5lbWl0KCdvcGVuJylcbiAgICAgIHNlbGYuZW1pdCgncmVhZHknKVxuICAgIH1cbiAgfSlcbn1cblxuTGV2ZWxVUC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICB0aGlzLl9zdGF0dXMgPSAnY2xvc2luZydcbiAgICB0aGlzLmRiLmNsb3NlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuX3N0YXR1cyA9ICdjbG9zZWQnXG4gICAgICBzZWxmLmVtaXQoJ2Nsb3NlZCcpXG4gICAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICB9KVxuICAgIHRoaXMuZW1pdCgnY2xvc2luZycpXG4gICAgdGhpcy5kYiA9IG5ldyBEZWZlcnJlZExldmVsRE9XTih0aGlzLmxvY2F0aW9uKVxuICB9IGVsc2UgaWYgKHRoaXMuX3N0YXR1cyA9PSAnY2xvc2VkJyAmJiBjYWxsYmFjaykge1xuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxuICB9IGVsc2UgaWYgKHRoaXMuX3N0YXR1cyA9PSAnY2xvc2luZycgJiYgY2FsbGJhY2spIHtcbiAgICB0aGlzLm9uY2UoJ2Nsb3NlZCcsIGNhbGxiYWNrKVxuICB9IGVsc2UgaWYgKHRoaXMuX2lzT3BlbmluZygpKSB7XG4gICAgdGhpcy5vbmNlKCdvcGVuJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5jbG9zZShjYWxsYmFjaylcbiAgICB9KVxuICB9XG59XG5cbkxldmVsVVAucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3N0YXR1cyA9PSAnb3Blbidcbn1cblxuTGV2ZWxVUC5wcm90b3R5cGUuX2lzT3BlbmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3N0YXR1cyA9PSAnb3BlbmluZydcbn1cblxuTGV2ZWxVUC5wcm90b3R5cGUuaXNDbG9zZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoL15jbG9zLykudGVzdCh0aGlzLl9zdGF0dXMpXG59XG5cbmZ1bmN0aW9uIG1heWJlRXJyb3IoZGIsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICghZGIuX2lzT3BlbmluZygpICYmICFkYi5pc09wZW4oKSkge1xuICAgIGRpc3BhdGNoRXJyb3IoXG4gICAgICAgIGRiXG4gICAgICAsIG5ldyBSZWFkRXJyb3IoJ0RhdGFiYXNlIGlzIG5vdCBvcGVuJylcbiAgICAgICwgY2FsbGJhY2tcbiAgICApXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUVycm9yIChkYiwgbWVzc2FnZSwgY2FsbGJhY2spIHtcbiAgZGlzcGF0Y2hFcnJvcihcbiAgICAgIGRiXG4gICAgICwgbmV3IFdyaXRlRXJyb3IobWVzc2FnZSlcbiAgICAgLCBjYWxsYmFja1xuICApXG59XG5cbmZ1bmN0aW9uIHJlYWRFcnJvciAoZGIsIG1lc3NhZ2UsIGNhbGxiYWNrKSB7XG4gIGRpc3BhdGNoRXJyb3IoXG4gICAgICBkYlxuICAgICAsIG5ldyBSZWFkRXJyb3IobWVzc2FnZSlcbiAgICAgLCBjYWxsYmFja1xuICApXG59XG5cblxuTGV2ZWxVUC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleV8sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICAgICwga2V5XG5cbiAgY2FsbGJhY2sgPSBnZXRDYWxsYmFjayhvcHRpb25zLCBjYWxsYmFjaylcblxuICBpZiAobWF5YmVFcnJvcih0aGlzLCBvcHRpb25zLCBjYWxsYmFjaykpXG4gICAgcmV0dXJuXG5cbiAgaWYgKGtleV8gPT09IG51bGwgfHwga2V5XyA9PT0gdW5kZWZpbmVkIHx8ICdmdW5jdGlvbicgIT09IHR5cGVvZiBjYWxsYmFjaylcbiAgICByZXR1cm4gcmVhZEVycm9yKHRoaXNcbiAgICAgICwgJ2dldCgpIHJlcXVpcmVzIGtleSBhbmQgY2FsbGJhY2sgYXJndW1lbnRzJywgY2FsbGJhY2spXG5cbiAgb3B0aW9ucyA9IHV0aWwuZ2V0T3B0aW9ucyhvcHRpb25zKVxuICBrZXkgPSB0aGlzLl9jb2RlYy5lbmNvZGVLZXkoa2V5Xywgb3B0aW9ucylcblxuICBvcHRpb25zLmFzQnVmZmVyID0gdGhpcy5fY29kZWMudmFsdWVBc0J1ZmZlcihvcHRpb25zKVxuXG4gIHRoaXMuZGIuZ2V0KGtleSwgb3B0aW9ucywgZnVuY3Rpb24gKGVyciwgdmFsdWUpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBpZiAoKC9ub3Rmb3VuZC9pKS50ZXN0KGVycikgfHwgZXJyLm5vdEZvdW5kKSB7XG4gICAgICAgIGVyciA9IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICAgICAgJ0tleSBub3QgZm91bmQgaW4gZGF0YWJhc2UgWycgKyBrZXlfICsgJ10nLCBlcnIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnIgPSBuZXcgUmVhZEVycm9yKGVycilcbiAgICAgIH1cbiAgICAgIHJldHVybiBkaXNwYXRjaEVycm9yKHNlbGYsIGVyciwgY2FsbGJhY2spXG4gICAgfVxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWUgPSBzZWxmLl9jb2RlYy5kZWNvZGVWYWx1ZSh2YWx1ZSwgb3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFbmNvZGluZ0Vycm9yKGUpKVxuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgdmFsdWUpXG4gICAgfVxuICB9KVxufVxuXG5MZXZlbFVQLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAoa2V5XywgdmFsdWVfLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgICAsIGtleVxuICAgICwgdmFsdWVcblxuICBjYWxsYmFjayA9IGdldENhbGxiYWNrKG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIGlmIChrZXlfID09PSBudWxsIHx8IGtleV8gPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gd3JpdGVFcnJvcih0aGlzLCAncHV0KCkgcmVxdWlyZXMgYSBrZXkgYXJndW1lbnQnLCBjYWxsYmFjaylcblxuICBpZiAobWF5YmVFcnJvcih0aGlzLCBvcHRpb25zLCBjYWxsYmFjaykpXG4gICAgcmV0dXJuXG5cbiAgb3B0aW9ucyA9IGdldE9wdGlvbnMob3B0aW9ucylcbiAga2V5ICAgICA9IHRoaXMuX2NvZGVjLmVuY29kZUtleShrZXlfLCBvcHRpb25zKVxuICB2YWx1ZSAgID0gdGhpcy5fY29kZWMuZW5jb2RlVmFsdWUodmFsdWVfLCBvcHRpb25zKVxuXG4gIHRoaXMuZGIucHV0KGtleSwgdmFsdWUsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2hFcnJvcihzZWxmLCBuZXcgV3JpdGVFcnJvcihlcnIpLCBjYWxsYmFjaylcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5lbWl0KCdwdXQnLCBrZXlfLCB2YWx1ZV8pXG4gICAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICB9XG4gIH0pXG59XG5cbkxldmVsVVAucHJvdG90eXBlLmRlbCA9IGZ1bmN0aW9uIChrZXlfLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgICAsIGtleVxuXG4gIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2sob3B0aW9ucywgY2FsbGJhY2spXG5cbiAgaWYgKGtleV8gPT09IG51bGwgfHwga2V5XyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiB3cml0ZUVycm9yKHRoaXMsICdkZWwoKSByZXF1aXJlcyBhIGtleSBhcmd1bWVudCcsIGNhbGxiYWNrKVxuXG4gIGlmIChtYXliZUVycm9yKHRoaXMsIG9wdGlvbnMsIGNhbGxiYWNrKSlcbiAgICByZXR1cm5cblxuICBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25zKVxuICBrZXkgICAgID0gdGhpcy5fY29kZWMuZW5jb2RlS2V5KGtleV8sIG9wdGlvbnMpXG5cbiAgdGhpcy5kYi5kZWwoa2V5LCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoRXJyb3Ioc2VsZiwgbmV3IFdyaXRlRXJyb3IoZXJyKSwgY2FsbGJhY2spXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuZW1pdCgnZGVsJywga2V5XylcbiAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfSlcbn1cblxuTGV2ZWxVUC5wcm90b3R5cGUuYmF0Y2ggPSBmdW5jdGlvbiAoYXJyXywgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gICAgLCBrZXlFbmNcbiAgICAsIHZhbHVlRW5jXG4gICAgLCBhcnJcblxuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgcmV0dXJuIG5ldyBCYXRjaCh0aGlzLCB0aGlzLl9jb2RlYylcblxuICBjYWxsYmFjayA9IGdldENhbGxiYWNrKG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJfKSlcbiAgICByZXR1cm4gd3JpdGVFcnJvcih0aGlzLCAnYmF0Y2goKSByZXF1aXJlcyBhbiBhcnJheSBhcmd1bWVudCcsIGNhbGxiYWNrKVxuXG4gIGlmIChtYXliZUVycm9yKHRoaXMsIG9wdGlvbnMsIGNhbGxiYWNrKSlcbiAgICByZXR1cm5cblxuICBvcHRpb25zICA9IGdldE9wdGlvbnMob3B0aW9ucylcbiAgYXJyICAgICAgPSBzZWxmLl9jb2RlYy5lbmNvZGVCYXRjaChhcnJfLCBvcHRpb25zKVxuICBhcnIgICAgICA9IGFyci5tYXAoZnVuY3Rpb24gKG9wKSB7XG4gICAgaWYgKCFvcC50eXBlICYmIG9wLmtleSAhPT0gdW5kZWZpbmVkICYmIG9wLnZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICBvcC50eXBlID0gJ3B1dCdcbiAgICByZXR1cm4gb3BcbiAgfSlcblxuICB0aGlzLmRiLmJhdGNoKGFyciwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaEVycm9yKHNlbGYsIG5ldyBXcml0ZUVycm9yKGVyciksIGNhbGxiYWNrKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmVtaXQoJ2JhdGNoJywgYXJyXylcbiAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfSlcbn1cblxuTGV2ZWxVUC5wcm90b3R5cGUuYXBwcm94aW1hdGVTaXplID0gZGVwcmVjYXRlKGZ1bmN0aW9uIChzdGFydF8sIGVuZF8sIG9wdGlvbnMsIGNhbGxiYWNrKSB7ICAgXG4gIHZhciBzZWxmID0gdGhpcyAgICBcbiAgICAsIHN0YXJ0ICAgIFxuICAgICwgZW5kICAgIFxuICAgXG4gIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2sob3B0aW9ucywgY2FsbGJhY2spICAgIFxuICAgXG4gIG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbnMpICAgIFxuICAgXG4gIGlmIChzdGFydF8gPT09IG51bGwgfHwgc3RhcnRfID09PSB1bmRlZmluZWQgICAgXG4gICAgICAgIHx8IGVuZF8gPT09IG51bGwgfHwgZW5kXyA9PT0gdW5kZWZpbmVkIHx8ICdmdW5jdGlvbicgIT09IHR5cGVvZiBjYWxsYmFjaykgICAgXG4gICAgcmV0dXJuIHJlYWRFcnJvcih0aGlzLCAnYXBwcm94aW1hdGVTaXplKCkgcmVxdWlyZXMgc3RhcnQsIGVuZCBhbmQgY2FsbGJhY2sgYXJndW1lbnRzJywgY2FsbGJhY2spICAgXG4gICBcbiAgc3RhcnQgPSB0aGlzLl9jb2RlYy5lbmNvZGVLZXkoc3RhcnRfLCBvcHRpb25zKSAgIFxuICBlbmQgICA9IHRoaXMuX2NvZGVjLmVuY29kZUtleShlbmRfLCBvcHRpb25zKSAgIFxuICAgXG4gIHRoaXMuZGIuYXBwcm94aW1hdGVTaXplKHN0YXJ0LCBlbmQsIGZ1bmN0aW9uIChlcnIsIHNpemUpIHsgICBcbiAgICBpZiAoZXJyKSB7ICAgXG4gICAgICByZXR1cm4gZGlzcGF0Y2hFcnJvcihzZWxmLCBuZXcgT3BlbkVycm9yKGVyciksIGNhbGxiYWNrKSAgIFxuICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHsgICBcbiAgICAgIGNhbGxiYWNrKG51bGwsIHNpemUpICAgXG4gICAgfSAgICBcbiAgfSkgICBcbn0sICdkYi5hcHByb3hpbWF0ZVNpemUoKSBpcyBkZXByZWNhdGVkLiBVc2UgZGIuZGIuYXBwcm94aW1hdGVTaXplKCkgaW5zdGVhZCcpXG5cbkxldmVsVVAucHJvdG90eXBlLnJlYWRTdHJlYW0gPVxuTGV2ZWxVUC5wcm90b3R5cGUuY3JlYXRlUmVhZFN0cmVhbSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBleHRlbmQoIHtrZXlzOiB0cnVlLCB2YWx1ZXM6IHRydWV9LCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMpXG5cbiAgb3B0aW9ucy5rZXlFbmNvZGluZyAgID0gb3B0aW9ucy5rZXlFbmNvZGluZ1xuICBvcHRpb25zLnZhbHVlRW5jb2RpbmcgPSBvcHRpb25zLnZhbHVlRW5jb2RpbmdcblxuICBvcHRpb25zID0gdGhpcy5fY29kZWMuZW5jb2RlTHRndChvcHRpb25zKTtcbiAgb3B0aW9ucy5rZXlBc0J1ZmZlciAgID0gdGhpcy5fY29kZWMua2V5QXNCdWZmZXIob3B0aW9ucylcbiAgb3B0aW9ucy52YWx1ZUFzQnVmZmVyID0gdGhpcy5fY29kZWMudmFsdWVBc0J1ZmZlcihvcHRpb25zKVxuXG4gIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIG9wdGlvbnMubGltaXQpXG4gICAgb3B0aW9ucy5saW1pdCA9IC0xXG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvclN0cmVhbSh0aGlzLmRiLml0ZXJhdG9yKG9wdGlvbnMpLCBleHRlbmQob3B0aW9ucywge1xuICAgIGRlY29kZXI6IHRoaXMuX2NvZGVjLmNyZWF0ZVN0cmVhbURlY29kZXIob3B0aW9ucylcbiAgfSkpXG59XG5cbkxldmVsVVAucHJvdG90eXBlLmtleVN0cmVhbSA9XG5MZXZlbFVQLnByb3RvdHlwZS5jcmVhdGVLZXlTdHJlYW0gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5jcmVhdGVSZWFkU3RyZWFtKGV4dGVuZChvcHRpb25zLCB7IGtleXM6IHRydWUsIHZhbHVlczogZmFsc2UgfSkpXG59XG5cbkxldmVsVVAucHJvdG90eXBlLnZhbHVlU3RyZWFtID1cbkxldmVsVVAucHJvdG90eXBlLmNyZWF0ZVZhbHVlU3RyZWFtID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuY3JlYXRlUmVhZFN0cmVhbShleHRlbmQob3B0aW9ucywgeyBrZXlzOiBmYWxzZSwgdmFsdWVzOiB0cnVlIH0pKVxufVxuXG5MZXZlbFVQLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdMZXZlbFVQJ1xufVxuXG5mdW5jdGlvbiB1dGlsU3RhdGljIChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAobG9jYXRpb24sIGNhbGxiYWNrKSB7XG4gICAgZ2V0TGV2ZWxET1dOKClbbmFtZV0obG9jYXRpb24sIGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9KVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzICAgICAgICAgPSBMZXZlbFVQXG5tb2R1bGUuZXhwb3J0cy5lcnJvcnMgID0gcmVxdWlyZSgnbGV2ZWwtZXJyb3JzJylcbm1vZHVsZS5leHBvcnRzLmRlc3Ryb3kgPSBkZXByZWNhdGUoXG4gICAgdXRpbFN0YXRpYygnZGVzdHJveScpXG4gICwgJ2xldmVsdXAuZGVzdHJveSgpIGlzIGRlcHJlY2F0ZWQuIFVzZSBsZXZlbGRvd24uZGVzdHJveSgpIGluc3RlYWQnXG4pXG5tb2R1bGUuZXhwb3J0cy5yZXBhaXIgID0gZGVwcmVjYXRlKFxuICAgIHV0aWxTdGF0aWMoJ3JlcGFpcicpXG4gICwgJ2xldmVsdXAucmVwYWlyKCkgaXMgZGVwcmVjYXRlZC4gVXNlIGxldmVsZG93bi5yZXBhaXIoKSBpbnN0ZWFkJ1xuKVxuXG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBMZXZlbFVQIGNvbnRyaWJ1dG9yc1xuICogU2VlIGxpc3QgYXQgPGh0dHBzOi8vZ2l0aHViLmNvbS9sZXZlbC9sZXZlbHVwI2NvbnRyaWJ1dGluZz5cbiAqIE1JVCBMaWNlbnNlXG4gKiA8aHR0cHM6Ly9naXRodWIuY29tL2xldmVsL2xldmVsdXAvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZD5cbiAqL1xuXG52YXIgZXh0ZW5kICAgICAgICAgPSByZXF1aXJlKCd4dGVuZCcpXG4gICwgTGV2ZWxVUEVycm9yICAgPSByZXF1aXJlKCdsZXZlbC1lcnJvcnMnKS5MZXZlbFVQRXJyb3JcbiAgLCBmb3JtYXQgICAgICAgICA9IHJlcXVpcmUoJ3V0aWwnKS5mb3JtYXRcbiAgLCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgY3JlYXRlSWZNaXNzaW5nIDogdHJ1ZVxuICAgICAgLCBlcnJvcklmRXhpc3RzICAgOiBmYWxzZVxuICAgICAgLCBrZXlFbmNvZGluZyAgICAgOiAndXRmOCdcbiAgICAgICwgdmFsdWVFbmNvZGluZyAgIDogJ3V0ZjgnXG4gICAgICAsIGNvbXByZXNzaW9uICAgICA6IHRydWVcbiAgICB9XG5cbiAgLCBsZXZlbGRvd25cblxuZnVuY3Rpb24gZ2V0T3B0aW9ucyAob3B0aW9ucykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ3N0cmluZycpXG4gICAgb3B0aW9ucyA9IHsgdmFsdWVFbmNvZGluZzogb3B0aW9ucyB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gZ2V0TGV2ZWxET1dOICgpIHtcbiAgaWYgKGxldmVsZG93bilcbiAgICByZXR1cm4gbGV2ZWxkb3duXG5cbiAgdmFyIHJlcXVpcmVkVmVyc2lvbiAgPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKS5kZXZEZXBlbmRlbmNpZXMubGV2ZWxkb3duXG4gICAgLCBsZXZlbGRvd25WZXJzaW9uXG5cbiAgdHJ5IHtcbiAgICBsZXZlbGRvd25WZXJzaW9uID0gcmVxdWlyZSgnbGV2ZWxkb3duL3BhY2thZ2UnKS52ZXJzaW9uXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyByZXF1aXJlRXJyb3IoZSlcbiAgfVxuXG4gIGlmICghcmVxdWlyZSgnc2VtdmVyJykuc2F0aXNmaWVzKGxldmVsZG93blZlcnNpb24sIHJlcXVpcmVkVmVyc2lvbikpIHtcbiAgICB0aHJvdyBuZXcgTGV2ZWxVUEVycm9yKFxuICAgICAgICAnSW5zdGFsbGVkIHZlcnNpb24gb2YgTGV2ZWxET1dOICgnXG4gICAgICArIGxldmVsZG93blZlcnNpb25cbiAgICAgICsgJykgZG9lcyBub3QgbWF0Y2ggcmVxdWlyZWQgdmVyc2lvbiAoJ1xuICAgICAgKyByZXF1aXJlZFZlcnNpb25cbiAgICAgICsgJyknXG4gICAgKVxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbGV2ZWxkb3duID0gcmVxdWlyZSgnbGV2ZWxkb3duJylcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IHJlcXVpcmVFcnJvcihlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVFcnJvciAoZSkge1xuICB2YXIgdGVtcGxhdGUgPSAnRmFpbGVkIHRvIHJlcXVpcmUgTGV2ZWxET1dOICglcykuIFRyeSBgbnBtIGluc3RhbGwgbGV2ZWxkb3duYCBpZiBpdFxcJ3MgbWlzc2luZydcbiAgcmV0dXJuIG5ldyBMZXZlbFVQRXJyb3IoZm9ybWF0KHRlbXBsYXRlLCBlLm1lc3NhZ2UpKVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEVycm9yIChkYiwgZXJyb3IsIGNhbGxiYWNrKSB7XG4gIHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nID8gY2FsbGJhY2soZXJyb3IpIDogZGIuZW1pdCgnZXJyb3InLCBlcnJvcilcbn1cblxuZnVuY3Rpb24gaXNEZWZpbmVkICh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiAhPT0gJ3VuZGVmaW5lZCdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZGVmYXVsdE9wdGlvbnMgIDogZGVmYXVsdE9wdGlvbnNcbiAgLCBnZXRPcHRpb25zICAgICAgOiBnZXRPcHRpb25zXG4gICwgZ2V0TGV2ZWxET1dOICAgIDogZ2V0TGV2ZWxET1dOXG4gICwgZGlzcGF0Y2hFcnJvciAgIDogZGlzcGF0Y2hFcnJvclxuICAsIGlzRGVmaW5lZCAgICAgICA6IGlzRGVmaW5lZFxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIl9hcmdzXCI6IFtcbiAgICBbXG4gICAgICBcImxldmVsdXBAfjEuMy4wXCIsXG4gICAgICBcIi9Vc2Vycy9qb3Jhbi9Eb2N1bWVudHMvZGV2ZWxvcG1lbnQvcGF0Y2hkZWNrL25vZGVfbW9kdWxlcy9sZXZlbC1wYWNrYWdlclwiXG4gICAgXVxuICBdLFxuICBcIl9mcm9tXCI6IFwibGV2ZWx1cEA+PTEuMy4wIDwxLjQuMFwiLFxuICBcIl9pZFwiOiBcImxldmVsdXBAMS4zLjFcIixcbiAgXCJfaW5DYWNoZVwiOiB0cnVlLFxuICBcIl9pbnN0YWxsYWJsZVwiOiB0cnVlLFxuICBcIl9sb2NhdGlvblwiOiBcIi9sZXZlbC1wYWNrYWdlci9sZXZlbHVwXCIsXG4gIFwiX25vZGVWZXJzaW9uXCI6IFwiNC4yLjJcIixcbiAgXCJfbnBtVXNlclwiOiB7XG4gICAgXCJlbWFpbFwiOiBcInJhbHBodGhlbmluamFAcmlzZXVwLm5ldFwiLFxuICAgIFwibmFtZVwiOiBcInJhbHBodGhlbmluamFcIlxuICB9LFxuICBcIl9ucG1WZXJzaW9uXCI6IFwiMy41LjBcIixcbiAgXCJfcGhhbnRvbUNoaWxkcmVuXCI6IHt9LFxuICBcIl9yZXF1ZXN0ZWRcIjoge1xuICAgIFwibmFtZVwiOiBcImxldmVsdXBcIixcbiAgICBcInJhd1wiOiBcImxldmVsdXBAfjEuMy4wXCIsXG4gICAgXCJyYXdTcGVjXCI6IFwifjEuMy4wXCIsXG4gICAgXCJzY29wZVwiOiBudWxsLFxuICAgIFwic3BlY1wiOiBcIj49MS4zLjAgPDEuNC4wXCIsXG4gICAgXCJ0eXBlXCI6IFwicmFuZ2VcIlxuICB9LFxuICBcIl9yZXF1aXJlZEJ5XCI6IFtcbiAgICBcIi9sZXZlbC1wYWNrYWdlclwiXG4gIF0sXG4gIFwiX3Jlc29sdmVkXCI6IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGV2ZWx1cC8tL2xldmVsdXAtMS4zLjEudGd6XCIsXG4gIFwiX3NoYXN1bVwiOiBcIjgwMzA3NThiYjFiMWRhZmRiNzFiZmI1NWZmZjBjYWEyNzQwY2I4NDZcIixcbiAgXCJfc2hyaW5rd3JhcFwiOiBudWxsLFxuICBcIl9zcGVjXCI6IFwibGV2ZWx1cEB+MS4zLjBcIixcbiAgXCJfd2hlcmVcIjogXCIvVXNlcnMvam9yYW4vRG9jdW1lbnRzL2RldmVsb3BtZW50L3BhdGNoZGVjay9ub2RlX21vZHVsZXMvbGV2ZWwtcGFja2FnZXJcIixcbiAgXCJicm93c2VyXCI6IHtcbiAgICBcImxldmVsZG93blwiOiBmYWxzZSxcbiAgICBcImxldmVsZG93bi9wYWNrYWdlXCI6IGZhbHNlLFxuICAgIFwic2VtdmVyXCI6IGZhbHNlXG4gIH0sXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vbGV2ZWwvbGV2ZWx1cC9pc3N1ZXNcIlxuICB9LFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiSnVsaWFuIEdydWJlclwiLFxuICAgICAgXCJlbWFpbFwiOiBcImp1bGlhbkBqdWxpYW5ncnViZXIuY29tXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9qdWxpYW5ncnViZXJcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiUm9kIFZhZ2dcIixcbiAgICAgIFwiZW1haWxcIjogXCJyQHZhLmdnXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ydmFnZ1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJKYWtlIFZlcmJhdGVuXCIsXG4gICAgICBcImVtYWlsXCI6IFwicmF5bm9zMkBnbWFpbC5jb21cIixcbiAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JheW5vc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJEb21pbmljIFRhcnJcIixcbiAgICAgIFwiZW1haWxcIjogXCJkb21pbmljLnRhcnJAZ21haWwuY29tXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9kb21pbmljdGFyclwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJNYXggT2dkZW5cIixcbiAgICAgIFwiZW1haWxcIjogXCJtYXhAbWF4b2dkZW4uY29tXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9tYXhvZ2RlblwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJMYXJzLU1hZ251cyBTa29nXCIsXG4gICAgICBcImVtYWlsXCI6IFwicmFscGh0aGVuaW5qYUByaXNldXAubmV0XCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYWxwaHRoZW5pbmphXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcIkRhdmlkIEJqw7Zya2x1bmRcIixcbiAgICAgIFwiZW1haWxcIjogXCJkYXZpZC5iam9ya2x1bmRAZ21haWwuY29tXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9rZXNsYVwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJKb2huIENoZXNsZXlcIixcbiAgICAgIFwiZW1haWxcIjogXCJqb2huQGNoZXNsLmVzXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9jaGVzbGVzL1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJQYW9sbyBGcmFnb21lbmlcIixcbiAgICAgIFwiZW1haWxcIjogXCJwYW9sb0Bhc3luYy5seVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vaGlqMW54XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcIkFudG9uIFdoYWxsZXlcIixcbiAgICAgIFwiZW1haWxcIjogXCJhbnRvbi53aGFsbGV5QG5lYXJmb3JtLmNvbVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vTm85XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcIk1hdHRlbyBDb2xsaW5hXCIsXG4gICAgICBcImVtYWlsXCI6IFwibWF0dGVvLmNvbGxpbmFAZ21haWwuY29tXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9tY29sbGluYVwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJQZWRybyBUZWl4ZWlyYVwiLFxuICAgICAgXCJlbWFpbFwiOiBcInBlZHJvLnRlaXhlaXJhQGdtYWlsLmNvbVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vcGd0ZVwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJKYW1lcyBIYWxsaWRheVwiLFxuICAgICAgXCJlbWFpbFwiOiBcIm1haWxAc3Vic3RhY2submV0XCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9zdWJzdGFja1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJKYXJyZXR0IENydWdlclwiLFxuICAgICAgXCJlbWFpbFwiOiBcImpjcnVnenpAZ21haWwuY29tXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9qY3J1Z3p6XCJcbiAgICB9XG4gIF0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImRlZmVycmVkLWxldmVsZG93blwiOiBcIn4xLjIuMVwiLFxuICAgIFwibGV2ZWwtY29kZWNcIjogXCJ+Ni4xLjBcIixcbiAgICBcImxldmVsLWVycm9yc1wiOiBcIn4xLjAuM1wiLFxuICAgIFwibGV2ZWwtaXRlcmF0b3Itc3RyZWFtXCI6IFwifjEuMy4wXCIsXG4gICAgXCJwcnJcIjogXCJ+MS4wLjFcIixcbiAgICBcInNlbXZlclwiOiBcIn41LjEuMFwiLFxuICAgIFwieHRlbmRcIjogXCJ+NC4wLjBcIlxuICB9LFxuICBcImRlc2NyaXB0aW9uXCI6IFwiRmFzdCAmIHNpbXBsZSBzdG9yYWdlIC0gYSBOb2RlLmpzLXN0eWxlIExldmVsREIgd3JhcHBlclwiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJhc3luY1wiOiBcIn4xLjUuMFwiLFxuICAgIFwiYnVzdGVybW92ZVwiOiBcIn4xLjAuMFwiLFxuICAgIFwiZGVsYXllZFwiOiBcIn4xLjAuMVwiLFxuICAgIFwiZmF1Y2V0XCI6IFwifjAuMC4xXCIsXG4gICAgXCJsZXZlbGRvd25cIjogXCJeMS4xLjBcIixcbiAgICBcIm1lbWRvd25cIjogXCJ+MS4xLjBcIixcbiAgICBcIm1zZ3BhY2stanNcIjogXCJ+MC4zLjBcIixcbiAgICBcInJlZmVyZWVcIjogXCJ+MS4yLjBcIixcbiAgICBcInJpbXJhZlwiOiBcIn4yLjQuM1wiLFxuICAgIFwic2xvdy1zdHJlYW1cIjogXCIwLjAuNFwiLFxuICAgIFwidGFwXCI6IFwifjIuMy4xXCIsXG4gICAgXCJ0YXBlXCI6IFwifjQuMi4xXCJcbiAgfSxcbiAgXCJkaXJlY3Rvcmllc1wiOiB7fSxcbiAgXCJkaXN0XCI6IHtcbiAgICBcInNoYXN1bVwiOiBcIjgwMzA3NThiYjFiMWRhZmRiNzFiZmI1NWZmZjBjYWEyNzQwY2I4NDZcIixcbiAgICBcInRhcmJhbGxcIjogXCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sZXZlbHVwLy0vbGV2ZWx1cC0xLjMuMS50Z3pcIlxuICB9LFxuICBcImdpdEhlYWRcIjogXCI0MGJkNjY4NzI5NzQxNDBjNzlhNzRkOTQxMWI5OTJkZGZmYTkyNmE0XCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vbGV2ZWwvbGV2ZWx1cFwiLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImRhdGFiYXNlXCIsXG4gICAgXCJkYlwiLFxuICAgIFwianNvblwiLFxuICAgIFwibGV2ZWxkYlwiLFxuICAgIFwic3RvcmFnZVwiLFxuICAgIFwic3RvcmVcIixcbiAgICBcInN0cmVhbVwiXG4gIF0sXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcIm1haW5cIjogXCJsaWIvbGV2ZWx1cC5qc1wiLFxuICBcIm1haW50YWluZXJzXCI6IFtcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJydmFnZ1wiLFxuICAgICAgXCJlbWFpbFwiOiBcInJvZEB2YWdnLm9yZ1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJyYWxwaHRoZW5pbmphXCIsXG4gICAgICBcImVtYWlsXCI6IFwicmFscGh0aGVuaW5qYUByaXNldXAubmV0XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcImp1bGlhbmdydWJlclwiLFxuICAgICAgXCJlbWFpbFwiOiBcImp1bGlhbkBqdWxpYW5ncnViZXIuY29tXCJcbiAgICB9XG4gIF0sXG4gIFwibmFtZVwiOiBcImxldmVsdXBcIixcbiAgXCJvcHRpb25hbERlcGVuZGVuY2llc1wiOiB7fSxcbiAgXCJyZWFkbWVcIjogXCJFUlJPUjogTm8gUkVBRE1FIGRhdGEgZm91bmQhXCIsXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL2xldmVsL2xldmVsdXAuZ2l0XCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInRlc3RcIjogXCJ0YXBlIHRlc3QvKi10ZXN0LmpzIHwgZmF1Y2V0XCJcbiAgfSxcbiAgXCJ2ZXJzaW9uXCI6IFwiMS4zLjFcIlxufVxuIiwiLyohXG4gICogcHJyXG4gICogKGMpIDIwMTMgUm9kIFZhZ2cgPHJvZEB2YWdnLm9yZz5cbiAgKiBodHRwczovL2dpdGh1Yi5jb20vcnZhZ2cvcHJyXG4gICogTGljZW5zZTogTUlUXG4gICovXG5cbihmdW5jdGlvbiAobmFtZSwgY29udGV4dCwgZGVmaW5pdGlvbikge1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cylcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKVxuICBlbHNlXG4gICAgY29udGV4dFtuYW1lXSA9IGRlZmluaXRpb24oKVxufSkoJ3BycicsIHRoaXMsIGZ1bmN0aW9uKCkge1xuXG4gIHZhciBzZXRQcm9wZXJ0eSA9IHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBmdW5jdGlvbiAob2JqLCBrZXksIG9wdGlvbnMpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIG9wdGlvbnMpXG4gICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICB9XG4gICAgICA6IGZ1bmN0aW9uIChvYmosIGtleSwgb3B0aW9ucykgeyAvLyA8IGVzNVxuICAgICAgICAgIG9ialtrZXldID0gb3B0aW9ucy52YWx1ZVxuICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgfVxuXG4gICAgLCBtYWtlT3B0aW9ucyA9IGZ1bmN0aW9uICh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgb28gPSB0eXBlb2Ygb3B0aW9ucyA9PSAnb2JqZWN0J1xuICAgICAgICAgICwgb3MgPSAhb28gJiYgdHlwZW9mIG9wdGlvbnMgPT0gJ3N0cmluZydcbiAgICAgICAgICAsIG9wID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9vXG4gICAgICAgICAgICAgICAgPyAhIW9wdGlvbnNbcF1cbiAgICAgICAgICAgICAgICA6IG9zXG4gICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuaW5kZXhPZihwWzBdKSA+IC0xXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVudW1lcmFibGUgICA6IG9wKCdlbnVtZXJhYmxlJylcbiAgICAgICAgICAsIGNvbmZpZ3VyYWJsZSA6IG9wKCdjb25maWd1cmFibGUnKVxuICAgICAgICAgICwgd3JpdGFibGUgICAgIDogb3AoJ3dyaXRhYmxlJylcbiAgICAgICAgICAsIHZhbHVlICAgICAgICA6IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICwgcHJyID0gZnVuY3Rpb24gKG9iaiwga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIga1xuXG4gICAgICAgIG9wdGlvbnMgPSBtYWtlT3B0aW9ucyh2YWx1ZSwgb3B0aW9ucylcblxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGZvciAoayBpbiBrZXkpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChrZXksIGspKSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMudmFsdWUgPSBrZXlba11cbiAgICAgICAgICAgICAgc2V0UHJvcGVydHkob2JqLCBrLCBvcHRpb25zKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2V0UHJvcGVydHkob2JqLCBrZXksIG9wdGlvbnMpXG4gICAgICB9XG5cbiAgcmV0dXJuIHByclxufSkiLCJcbnZhciBzciA9IHJlcXVpcmUoJ3N0cmluZy1yYW5nZScpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJ2RlZmluZWQnKVxudmFyIGJlcSA9IHJlcXVpcmUoJ2J1ZmZlci1lcXVhbCcpXG5cbmZ1bmN0aW9uIGVxIChhLCBiKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoYSkgJiYgQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgcmV0dXJuIGJlcShhLCBiKVxuICB9XG4gIGVsc2UgcmV0dXJuIGEgPT09IGJcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwb3N0IChkYiwgb3B0cywgZWFjaCkge1xuICBpZighZWFjaClcbiAgICBlYWNoID0gb3B0cywgb3B0cyA9IHt9XG5cbiAgaWYoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGRiLnBvc3QpXG4gICAgcmV0dXJuIGRiLnBvc3Qob3B0cywgZWFjaClcblxuICB2YXIgZW5jb2RlID0gKG9wdHMgJiYgb3B0cy5rZXlFbmNvZGluZyAmJiBvcHRzLmtleUVuY29kaW5nLmVuY29kZSlcbiAgICB8fCAoZGIub3B0aW9ucyAmJiBkYi5vcHRpb25zLmtleUVuY29kaW5nICYmIGRiLm9wdGlvbnMua2V5RW5jb2RpbmcuZW5jb2RlKVxuICAgIHx8IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4IH1cblxuICB2YXIgbWluID0gZGVmaW5lZChvcHRzLm1pbiwgb3B0cy5ndCwgb3B0cy5ndGUsIG9wdHMuc3RhcnQpXG4gIHZhciBtYXggPSBkZWZpbmVkKG9wdHMubWF4LCBvcHRzLmx0LCBvcHRzLmx0ZSwgb3B0cy5lbmQpXG5cbiAgdmFyIGNvcHRzID0ge31cbiAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkKSBjb3B0cy5taW4gPSBlbmNvZGUobWluKVxuICBpZiAobWF4ICE9PSB1bmRlZmluZWQpIGNvcHRzLm1heCA9IGVuY29kZShtYXgpXG4gIHZhciBjaGVja2VyID0gc3IuY2hlY2tlcihjb3B0cylcbiBcbiAgZnVuY3Rpb24gY21wIChrZXkpIHtcbiAgICB2YXIgZWsgPSBlbmNvZGUoa2V5KVxuICAgIGlmIChvcHRzLmd0ICYmIGVxKGVrLCBjb3B0cy5taW4pKSByZXR1cm4gZmFsc2VcbiAgICBpZiAob3B0cy5sdCAmJiBlcShlaywgY29wdHMubWF4KSkgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGNoZWNrZXIoZWspXG4gIH1cblxuICBmdW5jdGlvbiBvblB1dCAoa2V5LCB2YWwpIHtcbiAgICBpZihjbXAoa2V5KSlcbiAgICAgIGVhY2goe3R5cGU6ICdwdXQnLCBrZXk6IGtleSwgdmFsdWU6IHZhbH0pXG4gIH1cblxuICBmdW5jdGlvbiBvbkRlbCAoa2V5LCB2YWwpIHtcbiAgICBpZihjbXAoa2V5KSlcbiAgICAgIGVhY2goe3R5cGU6ICdkZWwnLCBrZXk6IGtleSwgdmFsdWU6IHZhbH0pXG4gIH1cblxuICBmdW5jdGlvbiBvbkJhdGNoIChhcnkpIHtcbiAgICBhcnkuZm9yRWFjaChmdW5jdGlvbiAob3ApIHtcbiAgICAgIGlmKGNtcChvcC5rZXkpKVxuICAgICAgICBlYWNoKG9wKVxuICAgIH0pXG4gIH1cblxuICBkYi5vbigncHV0Jywgb25QdXQpXG4gIGRiLm9uKCdkZWwnLCBvbkRlbClcbiAgZGIub24oJ2JhdGNoJywgb25CYXRjaClcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGRiLnJlbW92ZUxpc3RlbmVyKCdwdXQnLCBvblB1dClcbiAgICBkYi5yZW1vdmVMaXN0ZW5lcignZGVsJywgb25QdXQpXG4gICAgZGIucmVtb3ZlTGlzdGVuZXIoJ2JhdGNoJywgb25QdXQpXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnbGV2ZWwtcGFja2FnZXInKShyZXF1aXJlKCdsZXZlbGRvd24nKSkiLCJjb25zdCB1dGlsICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJ3V0aWwnKVxuICAgICwgQWJzdHJhY3RDaGFpbmVkQmF0Y2ggPSByZXF1aXJlKCdhYnN0cmFjdC1sZXZlbGRvd24nKS5BYnN0cmFjdENoYWluZWRCYXRjaFxuXG5cbmZ1bmN0aW9uIENoYWluZWRCYXRjaCAoZGIpIHtcbiAgQWJzdHJhY3RDaGFpbmVkQmF0Y2guY2FsbCh0aGlzLCBkYilcbiAgdGhpcy5iaW5kaW5nID0gZGIuYmluZGluZy5iYXRjaCgpXG59XG5cblxuQ2hhaW5lZEJhdGNoLnByb3RvdHlwZS5fcHV0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdGhpcy5iaW5kaW5nLnB1dChrZXksIHZhbHVlKVxufVxuXG5cbkNoYWluZWRCYXRjaC5wcm90b3R5cGUuX2RlbCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgdGhpcy5iaW5kaW5nLmRlbChrZXkpXG59XG5cblxuQ2hhaW5lZEJhdGNoLnByb3RvdHlwZS5fY2xlYXIgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHRoaXMuYmluZGluZy5jbGVhcihrZXkpXG59XG5cblxuQ2hhaW5lZEJhdGNoLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdGhpcy5iaW5kaW5nLndyaXRlKG9wdGlvbnMsIGNhbGxiYWNrKVxufVxuXG51dGlsLmluaGVyaXRzKENoYWluZWRCYXRjaCwgQWJzdHJhY3RDaGFpbmVkQmF0Y2gpXG5cblxubW9kdWxlLmV4cG9ydHMgPSBDaGFpbmVkQmF0Y2giLCJjb25zdCB1dGlsICAgICAgICAgICAgID0gcmVxdWlyZSgndXRpbCcpXG4gICAgLCBBYnN0cmFjdEl0ZXJhdG9yID0gcmVxdWlyZSgnYWJzdHJhY3QtbGV2ZWxkb3duJykuQWJzdHJhY3RJdGVyYXRvclxuICAgICwgZmFzdEZ1dHVyZSAgICAgICA9IHJlcXVpcmUoJ2Zhc3QtZnV0dXJlJylcblxuXG5mdW5jdGlvbiBJdGVyYXRvciAoZGIsIG9wdGlvbnMpIHtcbiAgQWJzdHJhY3RJdGVyYXRvci5jYWxsKHRoaXMsIGRiKVxuXG4gIHRoaXMuYmluZGluZyAgICA9IGRiLmJpbmRpbmcuaXRlcmF0b3Iob3B0aW9ucylcbiAgdGhpcy5jYWNoZSAgICAgID0gbnVsbFxuICB0aGlzLmZpbmlzaGVkICAgPSBmYWxzZVxuICB0aGlzLmZhc3RGdXR1cmUgPSBmYXN0RnV0dXJlKClcbn1cblxudXRpbC5pbmhlcml0cyhJdGVyYXRvciwgQWJzdHJhY3RJdGVyYXRvcilcblxuSXRlcmF0b3IucHJvdG90eXBlLnNlZWsgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlZWsgcmVxdWlyZXMgYSBzdHJpbmcga2V5JylcbiAgdGhpcy5jYWNoZSA9IG51bGxcbiAgdGhpcy5iaW5kaW5nLnNlZWsoa2V5KVxufVxuXG5JdGVyYXRvci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIHRoYXQgPSB0aGlzXG4gICAgLCBrZXlcbiAgICAsIHZhbHVlXG5cbiAgaWYgKHRoaXMuY2FjaGUgJiYgdGhpcy5jYWNoZS5sZW5ndGgpIHtcbiAgICBrZXkgICA9IHRoaXMuY2FjaGUucG9wKClcbiAgICB2YWx1ZSA9IHRoaXMuY2FjaGUucG9wKClcblxuICAgIHRoaXMuZmFzdEZ1dHVyZShmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCBrZXksIHZhbHVlKVxuICAgIH0pXG5cbiAgfSBlbHNlIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgdGhpcy5mYXN0RnV0dXJlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHRoaXMuYmluZGluZy5uZXh0KGZ1bmN0aW9uIChlcnIsIGFycmF5LCBmaW5pc2hlZCkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycilcblxuICAgICAgdGhhdC5jYWNoZSAgICA9IGFycmF5XG4gICAgICB0aGF0LmZpbmlzaGVkID0gZmluaXNoZWRcbiAgICAgIHRoYXQuX25leHQoY2FsbGJhY2spXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cblxuSXRlcmF0b3IucHJvdG90eXBlLl9lbmQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgZGVsZXRlIHRoaXMuY2FjaGVcbiAgdGhpcy5iaW5kaW5nLmVuZChjYWxsYmFjaylcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IEl0ZXJhdG9yXG4iLCJjb25zdCB1dGlsICAgICAgICAgICAgICA9IHJlcXVpcmUoJ3V0aWwnKVxuICAgICwgQWJzdHJhY3RMZXZlbERPV04gPSByZXF1aXJlKCdhYnN0cmFjdC1sZXZlbGRvd24nKS5BYnN0cmFjdExldmVsRE9XTlxuXG4gICAgLCBiaW5kaW5nICAgICAgICAgICA9IHJlcXVpcmUoJ2JpbmRpbmdzJykoJ2xldmVsZG93bicpLmxldmVsZG93blxuXG4gICAgLCBDaGFpbmVkQmF0Y2ggICAgICA9IHJlcXVpcmUoJy4vY2hhaW5lZC1iYXRjaCcpXG4gICAgLCBJdGVyYXRvciAgICAgICAgICA9IHJlcXVpcmUoJy4vaXRlcmF0b3InKVxuXG5cbmZ1bmN0aW9uIExldmVsRE9XTiAobG9jYXRpb24pIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIExldmVsRE9XTikpXG4gICAgcmV0dXJuIG5ldyBMZXZlbERPV04obG9jYXRpb24pXG5cbiAgQWJzdHJhY3RMZXZlbERPV04uY2FsbCh0aGlzLCBsb2NhdGlvbilcbiAgdGhpcy5iaW5kaW5nID0gYmluZGluZyhsb2NhdGlvbilcbn1cblxudXRpbC5pbmhlcml0cyhMZXZlbERPV04sIEFic3RyYWN0TGV2ZWxET1dOKVxuXG5cbkxldmVsRE9XTi5wcm90b3R5cGUuX29wZW4gPSBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdGhpcy5iaW5kaW5nLm9wZW4ob3B0aW9ucywgY2FsbGJhY2spXG59XG5cblxuTGV2ZWxET1dOLnByb3RvdHlwZS5fY2xvc2UgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy5iaW5kaW5nLmNsb3NlKGNhbGxiYWNrKVxufVxuXG5cbkxldmVsRE9XTi5wcm90b3R5cGUuX3B1dCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB0aGlzLmJpbmRpbmcucHV0KGtleSwgdmFsdWUsIG9wdGlvbnMsIGNhbGxiYWNrKVxufVxuXG5cbkxldmVsRE9XTi5wcm90b3R5cGUuX2dldCA9IGZ1bmN0aW9uIChrZXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHRoaXMuYmluZGluZy5nZXQoa2V5LCBvcHRpb25zLCBjYWxsYmFjaylcbn1cblxuXG5MZXZlbERPV04ucHJvdG90eXBlLl9kZWwgPSBmdW5jdGlvbiAoa2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB0aGlzLmJpbmRpbmcuZGVsKGtleSwgb3B0aW9ucywgY2FsbGJhY2spXG59XG5cblxuTGV2ZWxET1dOLnByb3RvdHlwZS5fY2hhaW5lZEJhdGNoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IENoYWluZWRCYXRjaCh0aGlzKVxufVxuXG5cbkxldmVsRE9XTi5wcm90b3R5cGUuX2JhdGNoID0gZnVuY3Rpb24gKG9wZXJhdGlvbnMsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLmJpbmRpbmcuYmF0Y2gob3BlcmF0aW9ucywgb3B0aW9ucywgY2FsbGJhY2spXG59XG5cblxuTGV2ZWxET1dOLnByb3RvdHlwZS5fYXBwcm94aW1hdGVTaXplID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQsIGNhbGxiYWNrKSB7XG4gIHRoaXMuYmluZGluZy5hcHByb3hpbWF0ZVNpemUoc3RhcnQsIGVuZCwgY2FsbGJhY2spXG59XG5cblxuTGV2ZWxET1dOLnByb3RvdHlwZS5nZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICBpZiAodHlwZW9mIHByb3BlcnR5ICE9ICdzdHJpbmcnKVxuICAgIHRocm93IG5ldyBFcnJvcignZ2V0UHJvcGVydHkoKSByZXF1aXJlcyBhIHZhbGlkIGBwcm9wZXJ0eWAgYXJndW1lbnQnKVxuXG4gIHJldHVybiB0aGlzLmJpbmRpbmcuZ2V0UHJvcGVydHkocHJvcGVydHkpXG59XG5cblxuTGV2ZWxET1dOLnByb3RvdHlwZS5faXRlcmF0b3IgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEl0ZXJhdG9yKHRoaXMsIG9wdGlvbnMpXG59XG5cblxuTGV2ZWxET1dOLmRlc3Ryb3kgPSBmdW5jdGlvbiAobG9jYXRpb24sIGNhbGxiYWNrKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlc3Ryb3koKSByZXF1aXJlcyBgbG9jYXRpb25gIGFuZCBgY2FsbGJhY2tgIGFyZ3VtZW50cycpXG5cbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPSAnc3RyaW5nJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlc3Ryb3koKSByZXF1aXJlcyBhIGxvY2F0aW9uIHN0cmluZyBhcmd1bWVudCcpXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZGVzdHJveSgpIHJlcXVpcmVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gYXJndW1lbnQnKVxuXG4gIGJpbmRpbmcuZGVzdHJveShsb2NhdGlvbiwgY2FsbGJhY2spXG59XG5cblxuTGV2ZWxET1dOLnJlcGFpciA9IGZ1bmN0aW9uIChsb2NhdGlvbiwgY2FsbGJhY2spIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKVxuICAgIHRocm93IG5ldyBFcnJvcigncmVwYWlyKCkgcmVxdWlyZXMgYGxvY2F0aW9uYCBhbmQgYGNhbGxiYWNrYCBhcmd1bWVudHMnKVxuXG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT0gJ3N0cmluZycpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXBhaXIoKSByZXF1aXJlcyBhIGxvY2F0aW9uIHN0cmluZyBhcmd1bWVudCcpXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcigncmVwYWlyKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBmdW5jdGlvbiBhcmd1bWVudCcpXG5cbiAgYmluZGluZy5yZXBhaXIobG9jYXRpb24sIGNhbGxiYWNrKVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gTGV2ZWxET1dOXG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTMgUm9kIFZhZ2csIE1JVCBMaWNlbnNlICovXG5cbmZ1bmN0aW9uIEFic3RyYWN0Q2hhaW5lZEJhdGNoIChkYikge1xuICB0aGlzLl9kYiAgICAgICAgID0gZGJcbiAgdGhpcy5fb3BlcmF0aW9ucyA9IFtdXG4gIHRoaXMuX3dyaXR0ZW4gICAgPSBmYWxzZVxufVxuXG5BYnN0cmFjdENoYWluZWRCYXRjaC5wcm90b3R5cGUuX2NoZWNrV3JpdHRlbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX3dyaXR0ZW4pXG4gICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZSgpIGFscmVhZHkgY2FsbGVkIG9uIHRoaXMgYmF0Y2gnKVxufVxuXG5BYnN0cmFjdENoYWluZWRCYXRjaC5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdGhpcy5fY2hlY2tXcml0dGVuKClcblxuICB2YXIgZXJyID0gdGhpcy5fZGIuX2NoZWNrS2V5KGtleSwgJ2tleScsIHRoaXMuX2RiLl9pc0J1ZmZlcilcbiAgaWYgKGVycilcbiAgICB0aHJvdyBlcnJcblxuICBpZiAoIXRoaXMuX2RiLl9pc0J1ZmZlcihrZXkpKSBrZXkgPSBTdHJpbmcoa2V5KVxuICBpZiAoIXRoaXMuX2RiLl9pc0J1ZmZlcih2YWx1ZSkpIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fcHV0ID09ICdmdW5jdGlvbicgKVxuICAgIHRoaXMuX3B1dChrZXksIHZhbHVlKVxuICBlbHNlXG4gICAgdGhpcy5fb3BlcmF0aW9ucy5wdXNoKHsgdHlwZTogJ3B1dCcsIGtleToga2V5LCB2YWx1ZTogdmFsdWUgfSlcblxuICByZXR1cm4gdGhpc1xufVxuXG5BYnN0cmFjdENoYWluZWRCYXRjaC5wcm90b3R5cGUuZGVsID0gZnVuY3Rpb24gKGtleSkge1xuICB0aGlzLl9jaGVja1dyaXR0ZW4oKVxuXG4gIHZhciBlcnIgPSB0aGlzLl9kYi5fY2hlY2tLZXkoa2V5LCAna2V5JywgdGhpcy5fZGIuX2lzQnVmZmVyKVxuICBpZiAoZXJyKSB0aHJvdyBlcnJcblxuICBpZiAoIXRoaXMuX2RiLl9pc0J1ZmZlcihrZXkpKSBrZXkgPSBTdHJpbmcoa2V5KVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fZGVsID09ICdmdW5jdGlvbicgKVxuICAgIHRoaXMuX2RlbChrZXkpXG4gIGVsc2VcbiAgICB0aGlzLl9vcGVyYXRpb25zLnB1c2goeyB0eXBlOiAnZGVsJywga2V5OiBrZXkgfSlcblxuICByZXR1cm4gdGhpc1xufVxuXG5BYnN0cmFjdENoYWluZWRCYXRjaC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2NoZWNrV3JpdHRlbigpXG5cbiAgdGhpcy5fb3BlcmF0aW9ucyA9IFtdXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9jbGVhciA9PSAnZnVuY3Rpb24nIClcbiAgICB0aGlzLl9jbGVhcigpXG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuQWJzdHJhY3RDaGFpbmVkQmF0Y2gucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHRoaXMuX2NoZWNrV3JpdHRlbigpXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICB0aGlzLl93cml0dGVuID0gdHJ1ZVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fd3JpdGUgPT0gJ2Z1bmN0aW9uJyApXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKGNhbGxiYWNrKVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fZGIuX2JhdGNoID09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRoaXMuX2RiLl9iYXRjaCh0aGlzLl9vcGVyYXRpb25zLCBvcHRpb25zLCBjYWxsYmFjaylcblxuICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEFic3RyYWN0Q2hhaW5lZEJhdGNoIiwiLyogQ29weXJpZ2h0IChjKSAyMDEzIFJvZCBWYWdnLCBNSVQgTGljZW5zZSAqL1xuXG5mdW5jdGlvbiBBYnN0cmFjdEl0ZXJhdG9yIChkYikge1xuICB0aGlzLmRiID0gZGJcbiAgdGhpcy5fZW5kZWQgPSBmYWxzZVxuICB0aGlzLl9uZXh0aW5nID0gZmFsc2Vcbn1cblxuQWJzdHJhY3RJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCduZXh0KCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKHNlbGYuX2VuZGVkKVxuICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ2Nhbm5vdCBjYWxsIG5leHQoKSBhZnRlciBlbmQoKScpKVxuICBpZiAoc2VsZi5fbmV4dGluZylcbiAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdjYW5ub3QgY2FsbCBuZXh0KCkgYmVmb3JlIHByZXZpb3VzIG5leHQoKSBoYXMgY29tcGxldGVkJykpXG5cbiAgc2VsZi5fbmV4dGluZyA9IHRydWVcbiAgaWYgKHR5cGVvZiBzZWxmLl9uZXh0ID09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2VsZi5fbmV4dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9uZXh0aW5nID0gZmFsc2VcbiAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICB9KVxuICB9XG5cbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fbmV4dGluZyA9IGZhbHNlXG4gICAgY2FsbGJhY2soKVxuICB9KVxufVxuXG5BYnN0cmFjdEl0ZXJhdG9yLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZW5kKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKHRoaXMuX2VuZGVkKVxuICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ2VuZCgpIGFscmVhZHkgY2FsbGVkIG9uIGl0ZXJhdG9yJykpXG5cbiAgdGhpcy5fZW5kZWQgPSB0cnVlXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9lbmQgPT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdGhpcy5fZW5kKGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG59XG5cbm1vZHVsZS5leHBvcnRzID0gQWJzdHJhY3RJdGVyYXRvclxuIiwiLyogQ29weXJpZ2h0IChjKSAyMDEzIFJvZCBWYWdnLCBNSVQgTGljZW5zZSAqL1xuXG52YXIgeHRlbmQgICAgICAgICAgICAgICAgPSByZXF1aXJlKCd4dGVuZCcpXG4gICwgQWJzdHJhY3RJdGVyYXRvciAgICAgPSByZXF1aXJlKCcuL2Fic3RyYWN0LWl0ZXJhdG9yJylcbiAgLCBBYnN0cmFjdENoYWluZWRCYXRjaCA9IHJlcXVpcmUoJy4vYWJzdHJhY3QtY2hhaW5lZC1iYXRjaCcpXG5cbmZ1bmN0aW9uIEFic3RyYWN0TGV2ZWxET1dOIChsb2NhdGlvbikge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGggfHwgbG9jYXRpb24gPT09IHVuZGVmaW5lZClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbnN0cnVjdG9yIHJlcXVpcmVzIGF0IGxlYXN0IGEgbG9jYXRpb24gYXJndW1lbnQnKVxuXG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT0gJ3N0cmluZycpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb25zdHJ1Y3RvciByZXF1aXJlcyBhIGxvY2F0aW9uIHN0cmluZyBhcmd1bWVudCcpXG5cbiAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uXG4gIHRoaXMuc3RhdHVzID0gJ25ldydcbn1cblxuQWJzdHJhY3RMZXZlbERPV04ucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgICAgICA9IHRoaXNcbiAgICAsIG9sZFN0YXR1cyA9IHRoaXMuc3RhdHVzXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignb3BlbigpIHJlcXVpcmVzIGEgY2FsbGJhY2sgYXJndW1lbnQnKVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICBvcHRpb25zLmNyZWF0ZUlmTWlzc2luZyA9IG9wdGlvbnMuY3JlYXRlSWZNaXNzaW5nICE9IGZhbHNlXG4gIG9wdGlvbnMuZXJyb3JJZkV4aXN0cyA9ICEhb3B0aW9ucy5lcnJvcklmRXhpc3RzXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9vcGVuID09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLnN0YXR1cyA9ICdvcGVuaW5nJ1xuICAgIHRoaXMuX29wZW4ob3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBzZWxmLnN0YXR1cyA9IG9sZFN0YXR1c1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgICAgfVxuICAgICAgc2VsZi5zdGF0dXMgPSAnb3BlbidcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhdHVzID0gJ29wZW4nXG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaylcbiAgfVxufVxuXG5BYnN0cmFjdExldmVsRE9XTi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgICAgICA9IHRoaXNcbiAgICAsIG9sZFN0YXR1cyA9IHRoaXMuc3RhdHVzXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignY2xvc2UoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGFyZ3VtZW50JylcblxuICBpZiAodHlwZW9mIHRoaXMuX2Nsb3NlID09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLnN0YXR1cyA9ICdjbG9zaW5nJ1xuICAgIHRoaXMuX2Nsb3NlKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgc2VsZi5zdGF0dXMgPSBvbGRTdGF0dXNcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICAgIH1cbiAgICAgIHNlbGYuc3RhdHVzID0gJ2Nsb3NlZCdcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhdHVzID0gJ2Nsb3NlZCdcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxuICB9XG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZXJyXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ2V0KCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKGVyciA9IHRoaXMuX2NoZWNrS2V5KGtleSwgJ2tleScsIHRoaXMuX2lzQnVmZmVyKSlcbiAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuXG4gIGlmICghdGhpcy5faXNCdWZmZXIoa2V5KSlcbiAgICBrZXkgPSBTdHJpbmcoa2V5KVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICBvcHRpb25zLmFzQnVmZmVyID0gb3B0aW9ucy5hc0J1ZmZlciAhPSBmYWxzZVxuXG4gIGlmICh0eXBlb2YgdGhpcy5fZ2V0ID09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRoaXMuX2dldChrZXksIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBjYWxsYmFjayhuZXcgRXJyb3IoJ05vdEZvdW5kJykpIH0pXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGVyclxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnZnVuY3Rpb24nKVxuICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1dCgpIHJlcXVpcmVzIGEgY2FsbGJhY2sgYXJndW1lbnQnKVxuXG4gIGlmIChlcnIgPSB0aGlzLl9jaGVja0tleShrZXksICdrZXknLCB0aGlzLl9pc0J1ZmZlcikpXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVycilcblxuICBpZiAoIXRoaXMuX2lzQnVmZmVyKGtleSkpXG4gICAga2V5ID0gU3RyaW5nKGtleSlcblxuICAvLyBjb2VyY2UgdmFsdWUgdG8gc3RyaW5nIGluIG5vZGUsIGRvbid0IHRvdWNoIGl0IGluIGJyb3dzZXJcbiAgLy8gKGluZGV4ZWRkYiBjYW4gc3RvcmUgYW55IEpTIHR5cGUpXG4gIGlmICh2YWx1ZSAhPSBudWxsICYmICF0aGlzLl9pc0J1ZmZlcih2YWx1ZSkgJiYgIXByb2Nlc3MuYnJvd3NlcilcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgIT0gJ29iamVjdCcpXG4gICAgb3B0aW9ucyA9IHt9XG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9wdXQgPT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdGhpcy5fcHV0KGtleSwgdmFsdWUsIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5kZWwgPSBmdW5jdGlvbiAoa2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZXJyXG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZGVsKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKGVyciA9IHRoaXMuX2NoZWNrS2V5KGtleSwgJ2tleScsIHRoaXMuX2lzQnVmZmVyKSlcbiAgICByZXR1cm4gY2FsbGJhY2soZXJyKVxuXG4gIGlmICghdGhpcy5faXNCdWZmZXIoa2V5KSlcbiAgICBrZXkgPSBTdHJpbmcoa2V5KVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICBpZiAodHlwZW9mIHRoaXMuX2RlbCA9PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB0aGlzLl9kZWwoa2V5LCBvcHRpb25zLCBjYWxsYmFjaylcblxuICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxufVxuXG5BYnN0cmFjdExldmVsRE9XTi5wcm90b3R5cGUuYmF0Y2ggPSBmdW5jdGlvbiAoYXJyYXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aClcbiAgICByZXR1cm4gdGhpcy5fY2hhaW5lZEJhdGNoKClcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJylcbiAgICBjYWxsYmFjayA9IG9wdGlvbnNcblxuICBpZiAodHlwZW9mIGFycmF5ID09ICdmdW5jdGlvbicpXG4gICAgY2FsbGJhY2sgPSBhcnJheVxuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhdGNoKGFycmF5KSByZXF1aXJlcyBhIGNhbGxiYWNrIGFyZ3VtZW50JylcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKVxuICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ2JhdGNoKGFycmF5KSByZXF1aXJlcyBhbiBhcnJheSBhcmd1bWVudCcpKVxuXG4gIGlmICghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICB2YXIgaSA9IDBcbiAgICAsIGwgPSBhcnJheS5sZW5ndGhcbiAgICAsIGVcbiAgICAsIGVyclxuXG4gIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgZSA9IGFycmF5W2ldXG4gICAgaWYgKHR5cGVvZiBlICE9ICdvYmplY3QnKVxuICAgICAgY29udGludWVcblxuICAgIGlmIChlcnIgPSB0aGlzLl9jaGVja0tleShlLnR5cGUsICd0eXBlJywgdGhpcy5faXNCdWZmZXIpKVxuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycilcblxuICAgIGlmIChlcnIgPSB0aGlzLl9jaGVja0tleShlLmtleSwgJ2tleScsIHRoaXMuX2lzQnVmZmVyKSlcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpXG4gIH1cblxuICBpZiAodHlwZW9mIHRoaXMuX2JhdGNoID09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRoaXMuX2JhdGNoKGFycmF5LCBvcHRpb25zLCBjYWxsYmFjaylcblxuICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKVxufVxuXG4vL1RPRE86IHJlbW92ZSBmcm9tIGhlcmUsIG5vdCBhIG5lY2Vzc2FyeSBwcmltaXRpdmVcbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5hcHByb3hpbWF0ZVNpemUgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgY2FsbGJhY2spIHtcbiAgaWYgKCAgIHN0YXJ0ID09IG51bGxcbiAgICAgIHx8IGVuZCA9PSBudWxsXG4gICAgICB8fCB0eXBlb2Ygc3RhcnQgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgfHwgdHlwZW9mIGVuZCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhcHByb3hpbWF0ZVNpemUoKSByZXF1aXJlcyB2YWxpZCBgc3RhcnRgLCBgZW5kYCBhbmQgYGNhbGxiYWNrYCBhcmd1bWVudHMnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignYXBwcm94aW1hdGVTaXplKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBhcmd1bWVudCcpXG5cbiAgaWYgKCF0aGlzLl9pc0J1ZmZlcihzdGFydCkpXG4gICAgc3RhcnQgPSBTdHJpbmcoc3RhcnQpXG5cbiAgaWYgKCF0aGlzLl9pc0J1ZmZlcihlbmQpKVxuICAgIGVuZCA9IFN0cmluZyhlbmQpXG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9hcHByb3hpbWF0ZVNpemUgPT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdGhpcy5fYXBwcm94aW1hdGVTaXplKHN0YXJ0LCBlbmQsIGNhbGxiYWNrKVxuXG4gIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKG51bGwsIDApXG4gIH0pXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5fc2V0dXBJdGVyYXRvck9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBvcHRpb25zID0geHRlbmQob3B0aW9ucylcblxuICA7WyAnc3RhcnQnLCAnZW5kJywgJ2d0JywgJ2d0ZScsICdsdCcsICdsdGUnIF0uZm9yRWFjaChmdW5jdGlvbiAobykge1xuICAgIGlmIChvcHRpb25zW29dICYmIHNlbGYuX2lzQnVmZmVyKG9wdGlvbnNbb10pICYmIG9wdGlvbnNbb10ubGVuZ3RoID09PSAwKVxuICAgICAgZGVsZXRlIG9wdGlvbnNbb11cbiAgfSlcblxuICBvcHRpb25zLnJldmVyc2UgPSAhIW9wdGlvbnMucmV2ZXJzZVxuICBvcHRpb25zLmtleXMgPSBvcHRpb25zLmtleXMgIT0gZmFsc2VcbiAgb3B0aW9ucy52YWx1ZXMgPSBvcHRpb25zLnZhbHVlcyAhPSBmYWxzZVxuICBvcHRpb25zLmxpbWl0ID0gJ2xpbWl0JyBpbiBvcHRpb25zID8gb3B0aW9ucy5saW1pdCA6IC0xXG4gIG9wdGlvbnMua2V5QXNCdWZmZXIgPSBvcHRpb25zLmtleUFzQnVmZmVyICE9IGZhbHNlXG4gIG9wdGlvbnMudmFsdWVBc0J1ZmZlciA9IG9wdGlvbnMudmFsdWVBc0J1ZmZlciAhPSBmYWxzZVxuXG4gIHJldHVybiBvcHRpb25zXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5pdGVyYXRvciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0JylcbiAgICBvcHRpb25zID0ge31cblxuICBvcHRpb25zID0gdGhpcy5fc2V0dXBJdGVyYXRvck9wdGlvbnMob3B0aW9ucylcblxuICBpZiAodHlwZW9mIHRoaXMuX2l0ZXJhdG9yID09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRoaXMuX2l0ZXJhdG9yKG9wdGlvbnMpXG5cbiAgcmV0dXJuIG5ldyBBYnN0cmFjdEl0ZXJhdG9yKHRoaXMpXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5fY2hhaW5lZEJhdGNoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IEFic3RyYWN0Q2hhaW5lZEJhdGNoKHRoaXMpXG59XG5cbkFic3RyYWN0TGV2ZWxET1dOLnByb3RvdHlwZS5faXNCdWZmZXIgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKVxufVxuXG5BYnN0cmFjdExldmVsRE9XTi5wcm90b3R5cGUuX2NoZWNrS2V5ID0gZnVuY3Rpb24gKG9iaiwgdHlwZSkge1xuXG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIG5ldyBFcnJvcih0eXBlICsgJyBjYW5ub3QgYmUgYG51bGxgIG9yIGB1bmRlZmluZWRgJylcblxuICBpZiAodGhpcy5faXNCdWZmZXIob2JqKSkge1xuICAgIGlmIChvYmoubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIG5ldyBFcnJvcih0eXBlICsgJyBjYW5ub3QgYmUgYW4gZW1wdHkgQnVmZmVyJylcbiAgfSBlbHNlIGlmIChTdHJpbmcob2JqKSA9PT0gJycpXG4gICAgcmV0dXJuIG5ldyBFcnJvcih0eXBlICsgJyBjYW5ub3QgYmUgYW4gZW1wdHkgU3RyaW5nJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBYnN0cmFjdExldmVsRE9XTlxuIiwiLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgTGV2ZWxVUCBjb250cmlidXRvcnNcbiAqIFNlZSBsaXN0IGF0IDxodHRwczovL2dpdGh1Yi5jb20vcnZhZ2cvbm9kZS1sZXZlbHVwI2NvbnRyaWJ1dGluZz5cbiAqIE1JVCBMaWNlbnNlXG4gKiA8aHR0cHM6Ly9naXRodWIuY29tL3J2YWdnL25vZGUtbGV2ZWx1cC9ibG9iL21hc3Rlci9MSUNFTlNFLm1kPlxuICovXG5cbnZhciBlbmNvZGluZ3MgPSByZXF1aXJlKCcuL2VuY29kaW5ncycpXG5cbmZ1bmN0aW9uIGdldEtleUVuY29kZXIgKG9wdGlvbnMsIG9wKSB7XG4gIHZhciB0eXBlID0gKChvcCAmJiBvcC5rZXlFbmNvZGluZykgfHwgb3B0aW9ucy5rZXlFbmNvZGluZykgfHwgJ3V0ZjgnXG4gIHJldHVybiBlbmNvZGluZ3NbdHlwZV0gfHwgdHlwZVxufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZUVuY29kZXIgKG9wdGlvbnMsIG9wKSB7XG4gIHZhciB0eXBlID0gKCgob3AgJiYgKG9wLnZhbHVlRW5jb2RpbmcgfHwgb3AuZW5jb2RpbmcpKVxuICAgICAgfHwgb3B0aW9ucy52YWx1ZUVuY29kaW5nIHx8IG9wdGlvbnMuZW5jb2RpbmcpKSB8fCAndXRmOCdcbiAgcmV0dXJuIGVuY29kaW5nc1t0eXBlXSB8fCB0eXBlXG59XG5cbi8qXG4gIEVuY29kZSBhIGtleS5cbiAgVGhpcyBtZXRob2QgdGFrZXMgdHdvIG9wdGlvbnMsIGJlY2F1c2UgdGhlIGxldmVsZGIgaW5zdGFuY2VcbiAgaGFzIG9wdGlvbnMsIGFuZCB0aGlzIG9wZXJhdGlvbiAoYSBwdXQsIGRlbCwgb3IgYmF0Y2gpXG4gIGFsc28gaGFzIG9wdGlvbnMgdGhhdCBtYXkgb3ZlcnJpZGUgdGhlIGxldmVsZGIncyBvcHRpb25zLlxuKi9cblxuZnVuY3Rpb24gZW5jb2RlS2V5IChrZXksIG9wdGlvbnMsIG9wKSB7XG4gIHJldHVybiBnZXRLZXlFbmNvZGVyKG9wdGlvbnMsIG9wKS5lbmNvZGUoa2V5KVxufVxuXG4vKlxuICBFbmNvZGUgYSB2YWx1ZS5cbiAgVGFrZXMgMiBvcHRpb25zLCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGVuY29kZUtleVxuKi9cblxuZnVuY3Rpb24gZW5jb2RlVmFsdWUgKHZhbHVlLCBvcHRpb25zLCBvcCkge1xuICByZXR1cm4gZ2V0VmFsdWVFbmNvZGVyKG9wdGlvbnMsIG9wKS5lbmNvZGUodmFsdWUpXG59XG5cbi8qXG4gIERlY29kZSBhbiBlbmNvZGVkIGtleVxuKi9cblxuZnVuY3Rpb24gZGVjb2RlS2V5IChrZXksIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGdldEtleUVuY29kZXIob3B0aW9ucykuZGVjb2RlKGtleSlcbn1cblxuLypcbiAgRGVjb2RlIGFuIGVuY29kZWQgdmFsdWVcbiovXG5cbmZ1bmN0aW9uIGRlY29kZVZhbHVlICh2YWx1ZSwgb3B0aW9ucykge1xuICByZXR1cm4gZ2V0VmFsdWVFbmNvZGVyKG9wdGlvbnMpLmRlY29kZSh2YWx1ZSlcbn1cblxuLypcbiAgY2hlY2sgd2hldGhlciB0aGlzIHZhbHVlIHNob3VsZCBiZSByZXF1ZXN0ZWQgYXMgYSBidWZmZXJcbiAgKGlmIGZhbHNlLCB0aGVuIGl0IHdpbGwgYmUgYSBzdHJpbmcpXG4gIHRoaXMgYWxsb3dzIGFuIG9wdGltaXphdGlvbiBpbiBsZXZlbGRvd24gd2hlcmUgbGV2ZWxkb3duXG4gIHJldHJpdmVzIGEgc3RyaW5nIGRpcmVjdGx5LCBhbmQgdGh1cyBhdm9pZHMgYSBtZW1vcnkgY29weS5cbiovXG5cbmZ1bmN0aW9uIGlzVmFsdWVBc0J1ZmZlciAob3B0aW9ucywgb3ApIHtcbiAgcmV0dXJuIGdldFZhbHVlRW5jb2RlcihvcHRpb25zLCBvcCkuYnVmZmVyXG59XG5cbi8qXG4gIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBrZXkgc2hvdWxkIGJlIHJlcXVlc3RlZCBhcyBhIGJ1ZmZlci5cbiovXG5cbmZ1bmN0aW9uIGlzS2V5QXNCdWZmZXIgKG9wdGlvbnMsIG9wKSB7XG4gIHJldHVybiBnZXRLZXlFbmNvZGVyKG9wdGlvbnMsIG9wKS5idWZmZXJcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBlbmNvZGVLZXkgICAgICAgOiBlbmNvZGVLZXlcbiAgLCBlbmNvZGVWYWx1ZSAgICAgOiBlbmNvZGVWYWx1ZVxuICAsIGlzVmFsdWVBc0J1ZmZlciA6IGlzVmFsdWVBc0J1ZmZlclxuICAsIGlzS2V5QXNCdWZmZXIgICA6IGlzS2V5QXNCdWZmZXJcbiAgLCBkZWNvZGVWYWx1ZSAgICAgOiBkZWNvZGVWYWx1ZVxuICAsIGRlY29kZUtleSAgICAgICA6IGRlY29kZUtleVxufVxuIiwiLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgTGV2ZWxVUCBjb250cmlidXRvcnNcbiAqIFNlZSBsaXN0IGF0IDxodHRwczovL2dpdGh1Yi5jb20vcnZhZ2cvbm9kZS1sZXZlbHVwI2NvbnRyaWJ1dGluZz5cbiAqIE1JVCBMaWNlbnNlXG4gKiA8aHR0cHM6Ly9naXRodWIuY29tL3J2YWdnL25vZGUtbGV2ZWx1cC9ibG9iL21hc3Rlci9MSUNFTlNFLm1kPlxuICovXG5cbnZhciBlbmNvZGluZ05hbWVzID0gW1xuICAgICAgICAnaGV4J1xuICAgICAgLCAndXRmOCdcbiAgICAgICwgJ3V0Zi04J1xuICAgICAgLCAnYXNjaWknXG4gICAgICAsICdiaW5hcnknXG4gICAgICAsICdiYXNlNjQnXG4gICAgICAsICd1Y3MyJ1xuICAgICAgLCAndWNzLTInXG4gICAgICAsICd1dGYxNmxlJ1xuICAgICAgLCAndXRmLTE2bGUnXG4gICAgXVxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGlzQmluYXJ5IChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsIHx8IEJ1ZmZlci5pc0J1ZmZlcihkYXRhKVxuICB9XG5cbiAgdmFyIGVuY29kaW5ncyA9IHt9XG5cbiAgZW5jb2RpbmdzLnV0ZjggPSBlbmNvZGluZ3NbJ3V0Zi04J10gPSB7XG4gICAgICBlbmNvZGUgOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICByZXR1cm4gaXNCaW5hcnkoZGF0YSkgPyBkYXRhIDogU3RyaW5nKGRhdGEpXG4gICAgICB9XG4gICAgLCBkZWNvZGUgOiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSB9XG4gICAgLCBidWZmZXIgOiBmYWxzZVxuICAgICwgdHlwZSAgIDogJ3V0ZjgnXG4gIH1cblxuICBlbmNvZGluZ3MuanNvbiA9IHtcbiAgICAgIGVuY29kZSA6IEpTT04uc3RyaW5naWZ5XG4gICAgLCBkZWNvZGUgOiBKU09OLnBhcnNlXG4gICAgLCBidWZmZXIgOiBmYWxzZVxuICAgICwgdHlwZSAgIDogJ2pzb24nXG4gIH1cblxuICBlbmNvZGluZ3MuYmluYXJ5ID0ge1xuICAgICAgZW5jb2RlIDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIGlzQmluYXJ5KGRhdGEpID8gZGF0YSA6IG5ldyBCdWZmZXIoZGF0YSlcbiAgICAgIH1cbiAgICAsIGRlY29kZSA6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9XG4gICAgLCBidWZmZXIgOiB0cnVlXG4gICAgLCB0eXBlICAgOiAnYmluYXJ5J1xuICB9XG5cbiAgZW5jb2RpbmdOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgaWYgKGVuY29kaW5nc1t0eXBlXSlcbiAgICAgIHJldHVyblxuXG4gICAgZW5jb2RpbmdzW3R5cGVdID0ge1xuICAgICAgICBlbmNvZGUgOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIHJldHVybiBpc0JpbmFyeShkYXRhKSA/IGRhdGEgOiBuZXcgQnVmZmVyKGRhdGEsIHR5cGUpXG4gICAgICAgIH1cbiAgICAgICwgZGVjb2RlIDogZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcodHlwZSlcbiAgICAgICAgfVxuICAgICAgLCBidWZmZXIgOiB0cnVlXG4gICAgICAsIHR5cGUgICA6IHR5cGUgLy8gdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGVuY29kaW5nc1xufSkoKVxuXG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBMZXZlbFVQIGNvbnRyaWJ1dG9yc1xuICogU2VlIGxpc3QgYXQgPGh0dHBzOi8vZ2l0aHViLmNvbS9ydmFnZy9ub2RlLWxldmVsdXAjY29udHJpYnV0aW5nPlxuICogTUlUIExpY2Vuc2VcbiAqIDxodHRwczovL2dpdGh1Yi5jb20vcnZhZ2cvbm9kZS1sZXZlbHVwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWQ+XG4gKi9cblxudmFyIGNyZWF0ZUVycm9yICAgPSByZXF1aXJlKCdlcnJubycpLmNyZWF0ZVxuICAsIExldmVsVVBFcnJvciAgPSBjcmVhdGVFcnJvcignTGV2ZWxVUEVycm9yJylcbiAgLCBOb3RGb3VuZEVycm9yID0gY3JlYXRlRXJyb3IoJ05vdEZvdW5kRXJyb3InLCBMZXZlbFVQRXJyb3IpXG5cbk5vdEZvdW5kRXJyb3IucHJvdG90eXBlLm5vdEZvdW5kID0gdHJ1ZVxuTm90Rm91bmRFcnJvci5wcm90b3R5cGUuc3RhdHVzICAgPSA0MDRcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgTGV2ZWxVUEVycm9yICAgICAgICA6IExldmVsVVBFcnJvclxuICAsIEluaXRpYWxpemF0aW9uRXJyb3IgOiBjcmVhdGVFcnJvcignSW5pdGlhbGl6YXRpb25FcnJvcicsIExldmVsVVBFcnJvcilcbiAgLCBPcGVuRXJyb3IgICAgICAgICAgIDogY3JlYXRlRXJyb3IoJ09wZW5FcnJvcicsIExldmVsVVBFcnJvcilcbiAgLCBSZWFkRXJyb3IgICAgICAgICAgIDogY3JlYXRlRXJyb3IoJ1JlYWRFcnJvcicsIExldmVsVVBFcnJvcilcbiAgLCBXcml0ZUVycm9yICAgICAgICAgIDogY3JlYXRlRXJyb3IoJ1dyaXRlRXJyb3InLCBMZXZlbFVQRXJyb3IpXG4gICwgTm90Rm91bmRFcnJvciAgICAgICA6IE5vdEZvdW5kRXJyb3JcbiAgLCBFbmNvZGluZ0Vycm9yICAgICAgIDogY3JlYXRlRXJyb3IoJ0VuY29kaW5nRXJyb3InLCBMZXZlbFVQRXJyb3IpXG59XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBMZXZlbFVQIGNvbnRyaWJ1dG9yc1xuICogU2VlIGxpc3QgYXQgPGh0dHBzOi8vZ2l0aHViLmNvbS9ydmFnZy9ub2RlLWxldmVsdXAjY29udHJpYnV0aW5nPlxuICogTUlUIExpY2Vuc2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9ydmFnZy9ub2RlLWxldmVsdXAvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZD5cbiAqL1xuXG4vLyBOT1RFOiB3ZSBhcmUgZml4ZWQgdG8gcmVhZGFibGUtc3RyZWFtQDEuMC54IGZvciBub3dcbi8vIGZvciBwdXJlIFN0cmVhbXMyIGFjcm9zcyBOb2RlIHZlcnNpb25zXG52YXIgUmVhZGFibGUgICAgICA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlJlYWRhYmxlXG4gICwgaW5oZXJpdHMgICAgICA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0c1xuICAsIGV4dGVuZCAgICAgICAgPSByZXF1aXJlKCd4dGVuZCcpXG4gICwgRW5jb2RpbmdFcnJvciA9IHJlcXVpcmUoJy4vZXJyb3JzJykuRW5jb2RpbmdFcnJvclxuICAsIHV0aWwgICAgICAgICAgPSByZXF1aXJlKCcuL3V0aWwnKVxuXG5cblxuZnVuY3Rpb24gUmVhZFN0cmVhbSAob3B0aW9ucywgbWFrZURhdGEpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRTdHJlYW0pKVxuICAgIHJldHVybiBuZXcgUmVhZFN0cmVhbShvcHRpb25zLCBtYWtlRGF0YSlcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIHsgb2JqZWN0TW9kZTogdHJ1ZSwgaGlnaFdhdGVyTWFyazogb3B0aW9ucy5oaWdoV2F0ZXJNYXJrIH0pXG5cbiAgLy8gcHVyZWx5IHRvIGtlZXAgYGRiYCBhcm91bmQgdW50aWwgd2UncmUgZG9uZSBzbyBpdCdzIG5vdCBHQ2VkIGlmIHRoZSB1c2VyIGRvZXNuJ3Qga2VlcCBhIHJlZlxuXG4gIHRoaXMuX3dhaXRpbmcgPSBmYWxzZVxuICB0aGlzLl9vcHRpb25zID0gb3B0aW9uc1xuICB0aGlzLl9tYWtlRGF0YSA9IG1ha2VEYXRhXG59XG5cbmluaGVyaXRzKFJlYWRTdHJlYW0sIFJlYWRhYmxlKVxuXG5SZWFkU3RyZWFtLnByb3RvdHlwZS5zZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdGhpcy5faXRlcmF0b3IgPSBpdFxuICBpZih0aGlzLl9kZXN0cm95ZWQpIHJldHVybiBpdC5lbmQoZnVuY3Rpb24gKCkge30pXG4gIGlmKHRoaXMuX3dhaXRpbmcpIHtcbiAgICB0aGlzLl93YWl0aW5nID0gZmFsc2VcbiAgICByZXR1cm4gdGhpcy5fcmVhZCgpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuUmVhZFN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiByZWFkICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChzZWxmLl9kZXN0cm95ZWQpXG4gICAgcmV0dXJuXG4gIGlmKCFzZWxmLl9pdGVyYXRvcilcbiAgICByZXR1cm4gdGhpcy5fd2FpdGluZyA9IHRydWVcblxuICBzZWxmLl9pdGVyYXRvci5uZXh0KGZ1bmN0aW9uKGVyciwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChlcnIgfHwgKGtleSA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICBpZiAoIWVyciAmJiAhc2VsZi5fZGVzdHJveWVkKVxuICAgICAgICBzZWxmLnB1c2gobnVsbClcbiAgICAgIHJldHVybiBzZWxmLl9jbGVhbnVwKGVycilcbiAgICB9XG5cblxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IHNlbGYuX21ha2VEYXRhKGtleSwgdmFsdWUpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHNlbGYuX2NsZWFudXAobmV3IEVuY29kaW5nRXJyb3IoZSkpXG4gICAgfVxuICAgIGlmICghc2VsZi5fZGVzdHJveWVkKVxuICAgICAgc2VsZi5wdXNoKHZhbHVlKVxuICB9KVxufVxuXG5SZWFkU3RyZWFtLnByb3RvdHlwZS5fY2xlYW51cCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgaWYgKHRoaXMuX2Rlc3Ryb3llZClcbiAgICByZXR1cm5cblxuICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlXG5cbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChlcnIpXG4gICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycilcblxuICBpZiAoc2VsZi5faXRlcmF0b3IpIHtcbiAgICBzZWxmLl9pdGVyYXRvci5lbmQoZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5faXRlcmF0b3IgPSBudWxsXG4gICAgICBzZWxmLmVtaXQoJ2Nsb3NlJylcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHNlbGYuZW1pdCgnY2xvc2UnKVxuICB9XG59XG5cblJlYWRTdHJlYW0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2NsZWFudXAoKVxufVxuXG5SZWFkU3RyZWFtLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdMZXZlbFVQLlJlYWRTdHJlYW0nXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkU3RyZWFtXG5cbiIsIi8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IExldmVsVVAgY29udHJpYnV0b3JzXG4gKiBTZWUgbGlzdCBhdCA8aHR0cHM6Ly9naXRodWIuY29tL3J2YWdnL25vZGUtbGV2ZWx1cCNjb250cmlidXRpbmc+XG4gKiBNSVQgTGljZW5zZVxuICogPGh0dHBzOi8vZ2l0aHViLmNvbS9ydmFnZy9ub2RlLWxldmVsdXAvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZD5cbiAqL1xuXG52YXIgZXh0ZW5kICAgICAgICA9IHJlcXVpcmUoJ3h0ZW5kJylcbiAgLCBMZXZlbFVQRXJyb3IgID0gcmVxdWlyZSgnLi9lcnJvcnMnKS5MZXZlbFVQRXJyb3JcbiAgLCBlbmNvZGluZ3MgICAgID0gcmVxdWlyZSgnLi9lbmNvZGluZ3MnKVxuICAsIGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICBjcmVhdGVJZk1pc3NpbmcgOiB0cnVlXG4gICAgICAsIGVycm9ySWZFeGlzdHMgICA6IGZhbHNlXG4gICAgICAsIGtleUVuY29kaW5nICAgICA6ICd1dGY4J1xuICAgICAgLCB2YWx1ZUVuY29kaW5nICAgOiAndXRmOCdcbiAgICAgICwgY29tcHJlc3Npb24gICAgIDogdHJ1ZVxuICAgIH1cblxuICAsIGxldmVsZG93blxuICAsIGVuY29kaW5nT3B0cyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZW8gPSB7fVxuICAgICAgZm9yKHZhciBlIGluIGVuY29kaW5ncylcbiAgICAgICAgZW9bZV0gPSB7dmFsdWVFbmNvZGluZzogZW5jb2RpbmdzW2VdfVxuICAgICAgcmV0dXJuIGVvXG4gICAgfSgpKVxuXG5mdW5jdGlvbiBjb3B5IChzcmNkYiwgZHN0ZGIsIGNhbGxiYWNrKSB7XG4gIHNyY2RiLnJlYWRTdHJlYW0oKVxuICAgIC5waXBlKGRzdGRiLndyaXRlU3RyZWFtKCkpXG4gICAgLm9uKCdjbG9zZScsIGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbiAoKSB7fSlcbiAgICAub24oJ2Vycm9yJywgY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uIChlcnIpIHsgdGhyb3cgZXJyIH0pXG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvbnMgKGxldmVsdXAsIG9wdGlvbnMpIHtcbiAgdmFyIHMgPSB0eXBlb2Ygb3B0aW9ucyA9PSAnc3RyaW5nJyAvLyBqdXN0IGFuIGVuY29kaW5nXG4gIGlmICghcyAmJiBvcHRpb25zICYmIG9wdGlvbnMuZW5jb2RpbmcgJiYgIW9wdGlvbnMudmFsdWVFbmNvZGluZylcbiAgICBvcHRpb25zLnZhbHVlRW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nXG4gIHJldHVybiBleHRlbmQoXG4gICAgICAobGV2ZWx1cCAmJiBsZXZlbHVwLm9wdGlvbnMpIHx8IHt9XG4gICAgLCBzID8gZW5jb2RpbmdPcHRzW29wdGlvbnNdIHx8IGVuY29kaW5nT3B0c1tkZWZhdWx0T3B0aW9ucy52YWx1ZUVuY29kaW5nXVxuICAgICAgICA6IG9wdGlvbnNcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRMZXZlbERPV04gKCkge1xuICBpZiAobGV2ZWxkb3duKVxuICAgIHJldHVybiBsZXZlbGRvd25cblxuICB2YXIgcmVxdWlyZWRWZXJzaW9uICAgICAgID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJykuZGV2RGVwZW5kZW5jaWVzLmxldmVsZG93blxuICAgICwgbWlzc2luZ0xldmVsRE9XTkVycm9yID0gJ0NvdWxkIG5vdCBsb2NhdGUgTGV2ZWxET1dOLCB0cnkgYG5wbSBpbnN0YWxsIGxldmVsZG93bmAnXG4gICAgLCBsZXZlbGRvd25WZXJzaW9uXG5cbiAgdHJ5IHtcbiAgICBsZXZlbGRvd25WZXJzaW9uID0gcmVxdWlyZSgnbGV2ZWxkb3duL3BhY2thZ2UnKS52ZXJzaW9uXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgTGV2ZWxVUEVycm9yKG1pc3NpbmdMZXZlbERPV05FcnJvcilcbiAgfVxuXG4gIGlmICghcmVxdWlyZSgnc2VtdmVyJykuc2F0aXNmaWVzKGxldmVsZG93blZlcnNpb24sIHJlcXVpcmVkVmVyc2lvbikpIHtcbiAgICB0aHJvdyBuZXcgTGV2ZWxVUEVycm9yKFxuICAgICAgICAnSW5zdGFsbGVkIHZlcnNpb24gb2YgTGV2ZWxET1dOICgnXG4gICAgICArIGxldmVsZG93blZlcnNpb25cbiAgICAgICsgJykgZG9lcyBub3QgbWF0Y2ggcmVxdWlyZWQgdmVyc2lvbiAoJ1xuICAgICAgKyByZXF1aXJlZFZlcnNpb25cbiAgICAgICsgJyknXG4gICAgKVxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbGV2ZWxkb3duID0gcmVxdWlyZSgnbGV2ZWxkb3duJylcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBMZXZlbFVQRXJyb3IobWlzc2luZ0xldmVsRE9XTkVycm9yKVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXJyb3IgKGxldmVsdXAsIGVycm9yLCBjYWxsYmFjaykge1xuICByZXR1cm4gdHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbidcbiAgICA/IGNhbGxiYWNrKGVycm9yKVxuICAgIDogbGV2ZWx1cC5lbWl0KCdlcnJvcicsIGVycm9yKVxufVxuXG5mdW5jdGlvbiBpc0RlZmluZWQgKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ICE9PSAndW5kZWZpbmVkJ1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBkZWZhdWx0T3B0aW9ucyAgOiBkZWZhdWx0T3B0aW9uc1xuICAsIGNvcHkgICAgICAgICAgICA6IGNvcHlcbiAgLCBnZXRPcHRpb25zICAgICAgOiBnZXRPcHRpb25zXG4gICwgZ2V0TGV2ZWxET1dOICAgIDogZ2V0TGV2ZWxET1dOXG4gICwgZGlzcGF0Y2hFcnJvciAgIDogZGlzcGF0Y2hFcnJvclxuICAsIGlzRGVmaW5lZCAgICAgICA6IGlzRGVmaW5lZFxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICByZXR1cm4ga2V5cztcbn1cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxuZm9yRWFjaChvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSksIGZ1bmN0aW9uKG1ldGhvZCkge1xuICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSlcbiAgICBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn0pO1xuXG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSlcbiAgICByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKVxuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSlcbiAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSlcbiAgICB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIGlmIHdlIGFsbG93IGhhbGYtb3BlbiBzdGF0ZSwgb3IgaWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsXG4gIC8vIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLmFsbG93SGFsZk9wZW4gfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZClcbiAgICByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzcy5uZXh0VGljayh0aGlzLmVuZC5iaW5kKHRoaXMpKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaCAoeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgcGFzc3Rocm91Z2ggc3RyZWFtLlxuLy8gYmFzaWNhbGx5IGp1c3QgdGhlIG1vc3QgbWluaW1hbCBzb3J0IG9mIFRyYW5zZm9ybSBzdHJlYW0uXG4vLyBFdmVyeSB3cml0dGVuIGNodW5rIGdldHMgb3V0cHV0IGFzLWlzLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9fc3RyZWFtX3RyYW5zZm9ybScpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSlcbiAgICByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuaWYgKCFFRS5saXN0ZW5lckNvdW50KSBFRS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFN0cmluZ0RlY29kZXI7XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogMTYgKiAxMDI0O1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gZmFsc2U7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIEluIHN0cmVhbXMgdGhhdCBuZXZlciBoYXZlIGFueSBkYXRhLCBhbmQgZG8gcHVzaChudWxsKSByaWdodCBhd2F5LFxuICAvLyB0aGUgY29uc3VtZXIgY2FuIG1pc3MgdGhlICdlbmQnIGV2ZW50IGlmIHRoZXkgZG8gc29tZSBJL08gYmVmb3JlXG4gIC8vIGNvbnN1bWluZyB0aGUgc3RyZWFtLiAgU28sIHdlIGRvbid0IGVtaXQoJ2VuZCcpIHVudGlsIHNvbWUgcmVhZGluZ1xuICAvLyBoYXBwZW5zLlxuICB0aGlzLmNhbGxlZFJlYWQgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjdWFzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuXG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgICAgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKVxuICAgIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJyAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbihjaHVuaykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssICcnLCB0cnVlKTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250KSB7XG4gIHZhciBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIH0gZWxzZSBpZiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKVxuICAgICAgb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RhdGUuZW5kZWQgJiYgIWFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRicpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRFbWl0dGVkICYmIGFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZylcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKVxuICAgICAgICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuXG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICAoc3RhdGUubmVlZFJlYWRhYmxlIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fFxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24oZW5jKSB7XG4gIGlmICghU3RyaW5nRGVjb2RlcilcbiAgICBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiAxMjhNQlxudmFyIE1BWF9IV00gPSAweDgwMDAwMDtcbmZ1bmN0aW9uIHJvdW5kVXBUb05leHRQb3dlck9mMihuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyXG4gICAgbi0tO1xuICAgIGZvciAodmFyIHAgPSAxOyBwIDwgMzI7IHAgPDw9IDEpIG4gfD0gbiA+PiBwO1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKVxuICAgIHJldHVybiAwO1xuXG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKVxuICAgIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKVxuICAgICAgcmV0dXJuIHN0YXRlLmJ1ZmZlclswXS5sZW5ndGg7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChuIDw9IDApXG4gICAgcmV0dXJuIDA7XG5cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIHRhcmdldCBidWZmZXIgbGV2ZWwsXG4gIC8vIHRoZW4gcmFpc2UgdGhlIHdhdGVyIG1hcmsuICBCdW1wIHVwIHRvIHRoZSBuZXh0IGhpZ2hlc3RcbiAgLy8gcG93ZXIgb2YgMiwgdG8gcHJldmVudCBpbmNyZWFzaW5nIGl0IGV4Y2Vzc2l2ZWx5IGluIHRpbnlcbiAgLy8gYW1vdW50cy5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKVxuICAgIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSByb3VuZFVwVG9OZXh0UG93ZXJPZjIobik7XG5cbiAgLy8gZG9uJ3QgaGF2ZSB0aGF0IG11Y2guICByZXR1cm4gbnVsbCwgdW5sZXNzIHdlJ3ZlIGVuZGVkLlxuICBpZiAobiA+IHN0YXRlLmxlbmd0aCkge1xuICAgIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICByZXR1cm4gbjtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5jYWxsZWRSZWFkID0gdHJ1ZTtcbiAgdmFyIG5PcmlnID0gbjtcbiAgdmFyIHJldDtcblxuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPiAwKVxuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiZcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSAmJlxuICAgICAgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgcmV0ID0gbnVsbDtcblxuICAgIC8vIEluIGNhc2VzIHdoZXJlIHRoZSBkZWNvZGVyIGRpZCBub3QgcmVjZWl2ZSBlbm91Z2ggZGF0YVxuICAgIC8vIHRvIHByb2R1Y2UgYSBmdWxsIGNodW5rLCB0aGVuIGltbWVkaWF0ZWx5IHJlY2VpdmVkIGFuXG4gICAgLy8gRU9GLCBzdGF0ZS5idWZmZXIgd2lsbCBjb250YWluIFs8QnVmZmVyID4sIDxCdWZmZXIgMDAgLi4uPl0uXG4gICAgLy8gaG93TXVjaFRvUmVhZCB3aWxsIHNlZSB0aGlzIGFuZCBjb2VyY2UgdGhlIGFtb3VudCB0b1xuICAgIC8vIHJlYWQgdG8gemVybyAoYmVjYXVzZSBpdCdzIGxvb2tpbmcgYXQgdGhlIGxlbmd0aCBvZiB0aGVcbiAgICAvLyBmaXJzdCA8QnVmZmVyID4gaW4gc3RhdGUuYnVmZmVyKSwgYW5kIHdlJ2xsIGVuZCB1cCBoZXJlLlxuICAgIC8vXG4gICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gdmlhIHN0YXRlLmRlY29kZXIgLS0gbm8gb3RoZXIgdmVudWVcbiAgICAvLyBleGlzdHMgZm9yIHB1c2hpbmcgYSB6ZXJvLWxlbmd0aCBjaHVuayBpbnRvIHN0YXRlLmJ1ZmZlclxuICAgIC8vIGFuZCB0cmlnZ2VyaW5nIHRoaXMgYmVoYXZpb3IuIEluIHRoaXMgY2FzZSwgd2UgcmV0dXJuIG91clxuICAgIC8vIHJlbWFpbmluZyBkYXRhIGFuZCBlbmQgdGhlIHN0cmVhbSwgaWYgYXBwcm9wcmlhdGUuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA+IDAgJiYgc3RhdGUuZGVjb2Rlcikge1xuICAgICAgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO1xuICAgICAgc3RhdGUubGVuZ3RoIC09IHJldC5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMClcbiAgICAgIGVuZFJlYWRhYmxlKHRoaXMpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoIC0gbiA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrKVxuICAgIGRvUmVhZCA9IHRydWU7XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZylcbiAgICBkb1JlYWQgPSBmYWxzZTtcblxuICBpZiAoZG9SZWFkKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKVxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBjYWxsZWQgaXRzIGNhbGxiYWNrIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgXG4gIC8vIHdpbGwgYmUgZmFsc2UsIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2VcbiAgLy8gY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgaWYgKGRvUmVhZCAmJiAhc3RhdGUucmVhZGluZylcbiAgICBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIGlmIChuID4gMClcbiAgICByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7XG4gIGVsc2VcbiAgICByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBJZiB3ZSBoYXBwZW5lZCB0byByZWFkKCkgZXhhY3RseSB0aGUgcmVtYWluaW5nIGFtb3VudCBpbiB0aGVcbiAgLy8gYnVmZmVyLCBhbmQgdGhlIEVPRiBoYXMgYmVlbiBzZWVuIGF0IHRoaXMgcG9pbnQsIHRoZW4gbWFrZSBzdXJlXG4gIC8vIHRoYXQgd2UgZW1pdCAnZW5kJyBvbiB0aGUgdmVyeSBuZXh0IHRpY2suXG4gIGlmIChzdGF0ZS5lbmRlZCAmJiAhc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyID0gbnVsbDtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmXG4gICAgICAnc3RyaW5nJyAhPT0gdHlwZW9mIGNodW5rICYmXG4gICAgICBjaHVuayAhPT0gbnVsbCAmJlxuICAgICAgY2h1bmsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQgYW5kIHdlIGhhdmUgc29tZSBkYXRhIGxlZnQsIHRoZW4gZW1pdFxuICAvLyAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKVxuICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICBlbHNlXG4gICAgZW5kUmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSlcbiAgICByZXR1cm47XG5cbiAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgaWYgKHN0YXRlLnN5bmMpXG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgICB9KTtcbiAgZWxzZVxuICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbn1cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pIHtcbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG59XG5cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO1xuICAgIGVsc2VcbiAgICAgIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBwaXBlT3B0cykge1xuICB2YXIgc3JjID0gdGhpcztcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcblxuICB2YXIgZG9FbmQgPSAoIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2UpICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3Rkb3V0ICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3RkZXJyO1xuXG4gIHZhciBlbmRGbiA9IGRvRW5kID8gb25lbmQgOiBjbGVhbnVwO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZClcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVuZEZuKTtcbiAgZWxzZVxuICAgIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSkge1xuICAgIGlmIChyZWFkYWJsZSAhPT0gc3JjKSByZXR1cm47XG4gICAgY2xlYW51cCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pXG4gICAgICBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUUubGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMClcbiAgICAgIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cbiAgLy8gVGhpcyBpcyBhIGJydXRhbGx5IHVnbHkgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlclxuICAvLyBpcyBhdHRhY2hlZCBiZWZvcmUgYW55IHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLlxuICBpZiAoIWRlc3QuX2V2ZW50cyB8fCAhZGVzdC5fZXZlbnRzLmVycm9yKVxuICAgIGRlc3Qub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGVsc2UgaWYgKGlzQXJyYXkoZGVzdC5fZXZlbnRzLmVycm9yKSlcbiAgICBkZXN0Ll9ldmVudHMuZXJyb3IudW5zaGlmdChvbmVycm9yKTtcbiAgZWxzZVxuICAgIGRlc3QuX2V2ZW50cy5lcnJvciA9IFtvbmVycm9yLCBkZXN0Ll9ldmVudHMuZXJyb3JdO1xuXG5cblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgLy8gdGhlIGhhbmRsZXIgdGhhdCB3YWl0cyBmb3IgcmVhZGFibGUgZXZlbnRzIGFmdGVyIGFsbFxuICAgIC8vIHRoZSBkYXRhIGdldHMgc3Vja2VkIG91dCBpbiBmbG93LlxuICAgIC8vIFRoaXMgd291bGQgYmUgZWFzaWVyIHRvIGZvbGxvdyB3aXRoIGEgLm9uY2UoKSBoYW5kbGVyXG4gICAgLy8gaW4gZmxvdygpLCBidXQgdGhhdCBpcyB0b28gc2xvdy5cbiAgICB0aGlzLm9uKCdyZWFkYWJsZScsIHBpcGVPblJlYWRhYmxlKTtcblxuICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRlc3QgPSB0aGlzO1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDApXG4gICAgICBmbG93KHNyYyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZsb3coc3JjKSB7XG4gIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIGNodW5rO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcblxuICBmdW5jdGlvbiB3cml0ZShkZXN0LCBpLCBsaXN0KSB7XG4gICAgdmFyIHdyaXR0ZW4gPSBkZXN0LndyaXRlKGNodW5rKTtcbiAgICBpZiAoZmFsc2UgPT09IHdyaXR0ZW4pIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoc3RhdGUucGlwZXNDb3VudCAmJiBudWxsICE9PSAoY2h1bmsgPSBzcmMucmVhZCgpKSkge1xuXG4gICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgICB3cml0ZShzdGF0ZS5waXBlcywgMCwgbnVsbCk7XG4gICAgZWxzZVxuICAgICAgZm9yRWFjaChzdGF0ZS5waXBlcywgd3JpdGUpO1xuXG4gICAgc3JjLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG5cbiAgICAvLyBpZiBhbnlvbmUgbmVlZHMgYSBkcmFpbiwgdGhlbiB3ZSBoYXZlIHRvIHdhaXQgZm9yIHRoYXQuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPiAwKVxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaWYgZXZlcnkgZGVzdGluYXRpb24gd2FzIHVucGlwZWQsIGVpdGhlciBiZWZvcmUgZW50ZXJpbmcgdGhpc1xuICAvLyBmdW5jdGlvbiwgb3IgaW4gdGhlIHdoaWxlIGxvb3AsIHRoZW4gc3RvcCBmbG93aW5nLlxuICAvL1xuICAvLyBOQjogVGhpcyBpcyBhIHByZXR0eSByYXJlIGVkZ2UgY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICAvLyBpZiB0aGVyZSB3ZXJlIGRhdGEgZXZlbnQgbGlzdGVuZXJzIGFkZGVkLCB0aGVuIHN3aXRjaCB0byBvbGQgbW9kZS5cbiAgICBpZiAoRUUubGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykgPiAwKVxuICAgICAgZW1pdERhdGFFdmVudHMoc3JjKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBhdCB0aGlzIHBvaW50LCBubyBvbmUgbmVlZGVkIGEgZHJhaW4sIHNvIHdlIGp1c3QgcmFuIG91dCBvZiBkYXRhXG4gIC8vIG9uIHRoZSBuZXh0IHJlYWRhYmxlIGV2ZW50LCBzdGFydCBpdCBvdmVyIGFnYWluLlxuICBzdGF0ZS5yYW5PdXQgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBwaXBlT25SZWFkYWJsZSgpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUucmFuT3V0KSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yYW5PdXQgPSBmYWxzZTtcbiAgICBmbG93KHRoaXMpO1xuICB9XG59XG5cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcylcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KVxuICAgICAgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgcGlwZU9uUmVhZGFibGUpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdClcbiAgICAgIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgcGlwZU9uUmVhZGFibGUpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSlcbiAgICByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpXG4gICAgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScgJiYgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZylcbiAgICBlbWl0RGF0YUV2ZW50cyh0aGlzKTtcblxuICBpZiAoZXYgPT09ICdyZWFkYWJsZScgJiYgdGhpcy5yZWFkYWJsZSkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHRoaXMucmVhZCgwKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgZW1pdERhdGFFdmVudHModGhpcyk7XG4gIHRoaXMucmVhZCgwKTtcbiAgdGhpcy5lbWl0KCdyZXN1bWUnKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBlbWl0RGF0YUV2ZW50cyh0aGlzLCB0cnVlKTtcbiAgdGhpcy5lbWl0KCdwYXVzZScpO1xufTtcblxuZnVuY3Rpb24gZW1pdERhdGFFdmVudHMoc3RyZWFtLCBzdGFydFBhdXNlZCkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmZsb3dpbmcpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL3JlYWRhYmxlLXN0cmVhbS9pc3N1ZXMvMTZcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzd2l0Y2ggdG8gb2xkIG1vZGUgbm93LicpO1xuICB9XG5cbiAgdmFyIHBhdXNlZCA9IHN0YXJ0UGF1c2VkIHx8IGZhbHNlO1xuICB2YXIgcmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBjb252ZXJ0IHRvIGFuIG9sZC1zdHlsZSBzdHJlYW0uXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHRydWU7XG4gIHN0cmVhbS5waXBlID0gU3RyZWFtLnByb3RvdHlwZS5waXBlO1xuICBzdHJlYW0ub24gPSBzdHJlYW0uYWRkTGlzdGVuZXIgPSBTdHJlYW0ucHJvdG90eXBlLm9uO1xuXG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBmdW5jdGlvbigpIHtcbiAgICByZWFkYWJsZSA9IHRydWU7XG5cbiAgICB2YXIgYztcbiAgICB3aGlsZSAoIXBhdXNlZCAmJiAobnVsbCAhPT0gKGMgPSBzdHJlYW0ucmVhZCgpKSkpXG4gICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGMpO1xuXG4gICAgaWYgKGMgPT09IG51bGwpIHtcbiAgICAgIHJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAgIHBhdXNlZCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9O1xuXG4gIHN0cmVhbS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICBpZiAocmVhZGFibGUpXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgICAgIH0pO1xuICAgIGVsc2VcbiAgICAgIHRoaXMucmVhZCgwKTtcbiAgICB0aGlzLmVtaXQoJ3Jlc3VtZScpO1xuICB9O1xuXG4gIC8vIG5vdyBtYWtlIGl0IHN0YXJ0LCBqdXN0IGluIGNhc2UgaXQgaGFkbid0IGFscmVhZHkuXG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpXG4gICAgICAgIHNlbGYucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgc2VsZi5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKVxuICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIC8vaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgdXRpbC5pc051bGxPclVuZGVmaW5lZChjaHVuaykpXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKVxuICAgICAgcmV0dXJuO1xuICAgIGVsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gc2VsZi5wdXNoKGNodW5rKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcHJveHkgYWxsIHRoZSBvdGhlciBtZXRob2RzLlxuICAvLyBpbXBvcnRhbnQgd2hlbiB3cmFwcGluZyBmaWx0ZXJzIGFuZCBkdXBsZXhlcy5cbiAgZm9yICh2YXIgaSBpbiBzdHJlYW0pIHtcbiAgICBpZiAodHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgdGhpc1tpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXNbaV0gPSBmdW5jdGlvbihtZXRob2QpIHsgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgfX0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICB2YXIgZXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuICBmb3JFYWNoKGV2ZW50cywgZnVuY3Rpb24oZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuXG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgdmFyIGxpc3QgPSBzdGF0ZS5idWZmZXI7XG4gIHZhciBsZW5ndGggPSBzdGF0ZS5sZW5ndGg7XG4gIHZhciBzdHJpbmdNb2RlID0gISFzdGF0ZS5kZWNvZGVyO1xuICB2YXIgb2JqZWN0TW9kZSA9ICEhc3RhdGUub2JqZWN0TW9kZTtcbiAgdmFyIHJldDtcblxuICAvLyBub3RoaW5nIGluIHRoZSBsaXN0LCBkZWZpbml0ZWx5IGVtcHR5LlxuICBpZiAobGlzdC5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMClcbiAgICByZXQgPSBudWxsO1xuICBlbHNlIGlmIChvYmplY3RNb2RlKVxuICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgcmV0ID0gbGlzdC5qb2luKCcnKTtcbiAgICBlbHNlXG4gICAgICByZXQgPSBCdWZmZXIuY29uY2F0KGxpc3QsIGxlbmd0aCk7XG4gICAgbGlzdC5sZW5ndGggPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQganVzdCBzb21lIG9mIGl0LlxuICAgIGlmIChuIDwgbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGp1c3QgdGFrZSBhIHBhcnQgb2YgdGhlIGZpcnN0IGxpc3QgaXRlbS5cbiAgICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICByZXQgPSBidWYuc2xpY2UoMCwgbik7XG4gICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKG4pO1xuICAgIH0gZWxzZSBpZiAobiA9PT0gbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGZpcnN0IGxpc3QgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBsZXggY2FzZS5cbiAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIGNvdmVyIGl0LCBidXQgaXQgc3BhbnMgcGFzdCB0aGUgZmlyc3QgYnVmZmVyLlxuICAgICAgaWYgKHN0cmluZ01vZGUpXG4gICAgICAgIHJldCA9ICcnO1xuICAgICAgZWxzZVxuICAgICAgICByZXQgPSBuZXcgQnVmZmVyKG4pO1xuXG4gICAgICB2YXIgYyA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbCAmJiBjIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgICB2YXIgY3B5ID0gTWF0aC5taW4obiAtIGMsIGJ1Zi5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgICAgIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aClcbiAgICAgICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKGNweSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG5cbiAgICAgICAgYyArPSBjcHk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdlbmRSZWFkYWJsZSBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5jYWxsZWRSZWFkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCAoeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mICh4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgdGhpcy5hZnRlclRyYW5zZm9ybSA9IGZ1bmN0aW9uKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYilcbiAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcycpKTtcblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT09IG51bGwgJiYgZGF0YSAhPT0gdW5kZWZpbmVkKVxuICAgIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIGlmIChjYilcbiAgICBjYihlcik7XG5cbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHN0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKVxuICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZmluaXNoJywgZnVuY3Rpb24oKSB7XG4gICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiB0aGlzLl9mbHVzaClcbiAgICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uKGVyKSB7XG4gICAgICAgIGRvbmUoc3RyZWFtLCBlcik7XG4gICAgICB9KTtcbiAgICBlbHNlXG4gICAgICBkb25lKHN0cmVhbSk7XG4gIH0pO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIGlmICghdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fFxuICAgICAgICBycy5uZWVkUmVhZGFibGUgfHxcbiAgICAgICAgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaylcbiAgICAgIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmIHRzLndyaXRlY2IgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcilcbiAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh3cy5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKVxuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IChod20gfHwgaHdtID09PSAwKSA/IGh3bSA6IDE2ICogMTAyNDtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH5+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjdWFzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICB2YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdGhvdWdoIHRoZXkncmUgbm90XG4gIC8vIGluc3RhbmNlb2YgV3JpdGFibGUsIHRoZXkncmUgaW5zdGFuY2VvZiBSZWFkYWJsZS5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdyaXRhYmxlKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKVxuICAgIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLiBOb3QgcmVhZGFibGUuJykpO1xufTtcblxuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7XG4gIC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICBjYihlcik7XG4gIH0pO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJlxuICAgICAgJ3N0cmluZycgIT09IHR5cGVvZiBjaHVuayAmJlxuICAgICAgY2h1bmsgIT09IG51bGwgJiZcbiAgICAgIGNodW5rICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgdmFyIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2IoZXIpO1xuICAgIH0pO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSlcbiAgICBlbmNvZGluZyA9ICdidWZmZXInO1xuICBlbHNlIGlmICghZW5jb2RpbmcpXG4gICAgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJylcbiAgICBjYiA9IGZ1bmN0aW9uKCkge307XG5cbiAgaWYgKHN0YXRlLmVuZGVkKVxuICAgIHdyaXRlQWZ0ZXJFbmQodGhpcywgc3RhdGUsIGNiKTtcbiAgZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSlcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiZcbiAgICAgIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmXG4gICAgICB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKVxuICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpXG4gICAgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZylcbiAgICBzdGF0ZS5idWZmZXIucHVzaChuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikpO1xuICBlbHNlXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgaWYgKHN5bmMpXG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGNiKGVyKTtcbiAgICB9KTtcbiAgZWxzZVxuICAgIGNiKGVyKTtcblxuICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcilcbiAgICBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtcbiAgZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKVxuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZClcbiAgICBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIGNiKCk7XG4gIGlmIChmaW5pc2hlZClcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG5cbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBzdGF0ZS5idWZmZXIubGVuZ3RoOyBjKyspIHtcbiAgICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJbY107XG4gICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgYysrO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuICBpZiAoYyA8IHN0YXRlLmJ1ZmZlci5sZW5ndGgpXG4gICAgc3RhdGUuYnVmZmVyID0gc3RhdGUuYnVmZmVyLnNsaWNlKGMpO1xuICBlbHNlXG4gICAgc3RhdGUuYnVmZmVyLmxlbmd0aCA9IDA7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3VuZGVmaW5lZCcgJiYgY2h1bmsgIT09IG51bGwpXG4gICAgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKVxuICAgIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICByZXR1cm4gKHN0YXRlLmVuZGluZyAmJlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICFzdGF0ZS5maW5pc2hlZCAmJlxuICAgICAgICAgICFzdGF0ZS53cml0aW5nKTtcbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZClcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2IpO1xuICAgIGVsc2VcbiAgICAgIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xufVxuIiwidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpOyAvLyBoYWNrIHRvIGZpeCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWUgd2hlbiB1c2VkIHdpdGggYnJvd3NlcmlmeVxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcycpO1xuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW07XG5leHBvcnRzLlJlYWRhYmxlID0gZXhwb3J0cztcbmV4cG9ydHMuV3JpdGFibGUgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG5leHBvcnRzLkR1cGxleCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7XG5leHBvcnRzLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzJyk7XG5leHBvcnRzLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcycpO1xuaWYgKCFwcm9jZXNzLmJyb3dzZXIgJiYgcHJvY2Vzcy5lbnYuUkVBREFCTEVfU1RSRUFNID09PSAnZGlzYWJsZScpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdzdHJlYW0nKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZXh0ZW5kXG5cbmZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgICB2YXIgdGFyZ2V0ID0ge31cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV1cblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwiX2FyZ3NcIjogW1xuICAgIFtcbiAgICAgIFwibGV2ZWx1cEB+MC4xOS4wXCIsXG4gICAgICBcIi9Vc2Vycy9qb3Jhbi9Eb2N1bWVudHMvZGV2ZWxvcG1lbnQvcGF0Y2hkZWNrL25vZGVfbW9kdWxlcy9sZXZlbC1zdWJsZXZlbFwiXG4gICAgXVxuICBdLFxuICBcIl9mcm9tXCI6IFwibGV2ZWx1cEA+PTAuMTkuMCA8MC4yMC4wXCIsXG4gIFwiX2lkXCI6IFwibGV2ZWx1cEAwLjE5LjFcIixcbiAgXCJfaW5DYWNoZVwiOiB0cnVlLFxuICBcIl9pbnN0YWxsYWJsZVwiOiB0cnVlLFxuICBcIl9sb2NhdGlvblwiOiBcIi9sZXZlbHVwXCIsXG4gIFwiX25vZGVWZXJzaW9uXCI6IFwiNS41LjBcIixcbiAgXCJfbnBtVXNlclwiOiB7XG4gICAgXCJlbWFpbFwiOiBcInJhbHBodGhlbmluamFAcmlzZXVwLm5ldFwiLFxuICAgIFwibmFtZVwiOiBcInJhbHBodGhlbmluamFcIlxuICB9LFxuICBcIl9ucG1WZXJzaW9uXCI6IFwiMy4zLjEyXCIsXG4gIFwiX3BoYW50b21DaGlsZHJlblwiOiB7XG4gICAgXCJjb3JlLXV0aWwtaXNcIjogXCIxLjAuMlwiLFxuICAgIFwiaW5oZXJpdHNcIjogXCIyLjAuMVwiLFxuICAgIFwiaXNhcnJheVwiOiBcIjAuMC4xXCIsXG4gICAgXCJzdHJpbmdfZGVjb2RlclwiOiBcIjAuMTAuMzFcIlxuICB9LFxuICBcIl9yZXF1ZXN0ZWRcIjoge1xuICAgIFwibmFtZVwiOiBcImxldmVsdXBcIixcbiAgICBcInJhd1wiOiBcImxldmVsdXBAfjAuMTkuMFwiLFxuICAgIFwicmF3U3BlY1wiOiBcIn4wLjE5LjBcIixcbiAgICBcInNjb3BlXCI6IG51bGwsXG4gICAgXCJzcGVjXCI6IFwiPj0wLjE5LjAgPDAuMjAuMFwiLFxuICAgIFwidHlwZVwiOiBcInJhbmdlXCJcbiAgfSxcbiAgXCJfcmVxdWlyZWRCeVwiOiBbXG4gICAgXCIvbGV2ZWwtc3VibGV2ZWxcIixcbiAgICBcIi9zZWN1cmUtc2N1dHRsZWJ1dHQvbGV2ZWwtc3VibGV2ZWxcIlxuICBdLFxuICBcIl9yZXNvbHZlZFwiOiBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xldmVsdXAvLS9sZXZlbHVwLTAuMTkuMS50Z3pcIixcbiAgXCJfc2hhc3VtXCI6IFwiZjNhNmE3MjA1MjcyYzRiNWYzNWU0MTJmZjAwNGEwM2EwYWVkZjUwYlwiLFxuICBcIl9zaHJpbmt3cmFwXCI6IG51bGwsXG4gIFwiX3NwZWNcIjogXCJsZXZlbHVwQH4wLjE5LjBcIixcbiAgXCJfd2hlcmVcIjogXCIvVXNlcnMvam9yYW4vRG9jdW1lbnRzL2RldmVsb3BtZW50L3BhdGNoZGVjay9ub2RlX21vZHVsZXMvbGV2ZWwtc3VibGV2ZWxcIixcbiAgXCJicm93c2VyXCI6IHtcbiAgICBcImxldmVsZG93blwiOiBmYWxzZSxcbiAgICBcImxldmVsZG93bi9wYWNrYWdlXCI6IGZhbHNlLFxuICAgIFwic2VtdmVyXCI6IGZhbHNlXG4gIH0sXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vcnZhZ2cvbm9kZS1sZXZlbHVwL2lzc3Vlc1wiXG4gIH0sXG4gIFwiY29udHJpYnV0b3JzXCI6IFtcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJEYXZpZCBCasO2cmtsdW5kXCIsXG4gICAgICBcImVtYWlsXCI6IFwiZGF2aWQuYmpvcmtsdW5kQGdtYWlsLmNvbVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20va2VzbGFcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiUm9kIFZhZ2dcIixcbiAgICAgIFwiZW1haWxcIjogXCJyQHZhLmdnXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ydmFnZ1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJKYWtlIFZlcmJhdGVuXCIsXG4gICAgICBcImVtYWlsXCI6IFwicmF5bm9zMkBnbWFpbC5jb21cIixcbiAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JheW5vc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJEb21pbmljIFRhcnJcIixcbiAgICAgIFwiZW1haWxcIjogXCJkb21pbmljLnRhcnJAZ21haWwuY29tXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9kb21pbmljdGFyclwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJNYXggT2dkZW5cIixcbiAgICAgIFwiZW1haWxcIjogXCJtYXhAbWF4b2dkZW4uY29tXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9tYXhvZ2RlblwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJMYXJzLU1hZ251cyBTa29nXCIsXG4gICAgICBcImVtYWlsXCI6IFwibGFycy5tYWdudXMuc2tvZ0BnbWFpbC5jb21cIixcbiAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhbHBodGhlbmluamFcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiSm9obiBDaGVzbGV5XCIsXG4gICAgICBcImVtYWlsXCI6IFwiam9obkBjaGVzbC5lc1wiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vY2hlc2xlcy9cIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiSnVsaWFuIEdydWJlclwiLFxuICAgICAgXCJlbWFpbFwiOiBcImp1bGlhbkBqdWxpYW5ncnViZXIuY29tXCIsXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9qdWxpYW5ncnViZXJcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiUGFvbG8gRnJhZ29tZW5pXCIsXG4gICAgICBcImVtYWlsXCI6IFwicGFvbG9AYXN5bmMubHlcIixcbiAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2hpajFueFwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJBbnRvbiBXaGFsbGV5XCIsXG4gICAgICBcImVtYWlsXCI6IFwiYW50b24ud2hhbGxleUBuZWFyZm9ybS5jb21cIixcbiAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL05vOVwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJNYXR0ZW8gQ29sbGluYVwiLFxuICAgICAgXCJlbWFpbFwiOiBcIm1hdHRlby5jb2xsaW5hQGdtYWlsLmNvbVwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vbWNvbGxpbmFcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiUGVkcm8gVGVpeGVpcmFcIixcbiAgICAgIFwiZW1haWxcIjogXCJwZWRyby50ZWl4ZWlyYUBnbWFpbC5jb21cIixcbiAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3BndGVcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiSmFtZXMgSGFsbGlkYXlcIixcbiAgICAgIFwiZW1haWxcIjogXCJtYWlsQHN1YnN0YWNrLm5ldFwiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vc3Vic3RhY2tcIlxuICAgIH1cbiAgXSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYmxcIjogXCJ+MC44LjFcIixcbiAgICBcImRlZmVycmVkLWxldmVsZG93blwiOiBcIn4wLjIuMFwiLFxuICAgIFwiZXJybm9cIjogXCJ+MC4xLjFcIixcbiAgICBcInByclwiOiBcIn4wLjAuMFwiLFxuICAgIFwicmVhZGFibGUtc3RyZWFtXCI6IFwifjEuMC4yNlwiLFxuICAgIFwic2VtdmVyXCI6IFwifjUuMS4wXCIsXG4gICAgXCJ4dGVuZFwiOiBcIn4zLjAuMFwiXG4gIH0sXG4gIFwiZGVzY3JpcHRpb25cIjogXCJGYXN0ICYgc2ltcGxlIHN0b3JhZ2UgLSBhIE5vZGUuanMtc3R5bGUgTGV2ZWxEQiB3cmFwcGVyXCIsXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImFzeW5jXCI6IFwiKlwiLFxuICAgIFwiYm9nYW5pcHN1bVwiOiBcIipcIixcbiAgICBcImJ1c3Rlcm1vdmVcIjogXCJ+MS4wLjFcIixcbiAgICBcImRlbGF5ZWRcIjogXCIqXCIsXG4gICAgXCJkdVwiOiBcIipcIixcbiAgICBcImZzdHJlYW1cIjogXCIqXCIsXG4gICAgXCJsZXZlbGRvd25cIjogXCJ+MC4xMC4wXCIsXG4gICAgXCJtZW1kb3duXCI6IFwiXjAuMTEuMFwiLFxuICAgIFwibWtmaWxldHJlZVwiOiBcIipcIixcbiAgICBcIm1zZ3BhY2stanNcIjogXCIqXCIsXG4gICAgXCJyZWFkZmlsZXRyZWVcIjogXCIqXCIsXG4gICAgXCJyZWZlcmVlXCI6IFwiKlwiLFxuICAgIFwicmltcmFmXCI6IFwiKlwiLFxuICAgIFwic2xvdy1zdHJlYW1cIjogXCI+PTAuMC40XCIsXG4gICAgXCJ0YXBcIjogXCIyLngueFwiLFxuICAgIFwidGFwZVwiOiBcIjQueC54XCIsXG4gICAgXCJ0YXJcIjogXCIqXCJcbiAgfSxcbiAgXCJkaXJlY3Rvcmllc1wiOiB7fSxcbiAgXCJkaXN0XCI6IHtcbiAgICBcInNoYXN1bVwiOiBcImYzYTZhNzIwNTI3MmM0YjVmMzVlNDEyZmYwMDRhMDNhMGFlZGY1MGJcIixcbiAgICBcInRhcmJhbGxcIjogXCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sZXZlbHVwLy0vbGV2ZWx1cC0wLjE5LjEudGd6XCJcbiAgfSxcbiAgXCJnaXRIZWFkXCI6IFwiMjg0Nzc5NWQ1NGM2ZWNlYjg2NWUyYzZiNTE1N2JjY2Y2ODEzMmM1NVwiLFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3J2YWdnL25vZGUtbGV2ZWx1cFwiLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImRhdGFiYXNlXCIsXG4gICAgXCJkYlwiLFxuICAgIFwianNvblwiLFxuICAgIFwibGV2ZWxkYlwiLFxuICAgIFwic3RvcmFnZVwiLFxuICAgIFwic3RvcmVcIixcbiAgICBcInN0cmVhbVwiXG4gIF0sXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcIm1haW5cIjogXCJsaWIvbGV2ZWx1cC5qc1wiLFxuICBcIm1haW50YWluZXJzXCI6IFtcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJydmFnZ1wiLFxuICAgICAgXCJlbWFpbFwiOiBcInJvZEB2YWdnLm9yZ1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJyYWxwaHRoZW5pbmphXCIsXG4gICAgICBcImVtYWlsXCI6IFwicmFscGh0aGVuaW5qYUByaXNldXAubmV0XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcImp1bGlhbmdydWJlclwiLFxuICAgICAgXCJlbWFpbFwiOiBcImp1bGlhbkBqdWxpYW5ncnViZXIuY29tXCJcbiAgICB9XG4gIF0sXG4gIFwibmFtZVwiOiBcImxldmVsdXBcIixcbiAgXCJvcHRpb25hbERlcGVuZGVuY2llc1wiOiB7fSxcbiAgXCJyZWFkbWVcIjogXCJFUlJPUjogTm8gUkVBRE1FIGRhdGEgZm91bmQhXCIsXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL3J2YWdnL25vZGUtbGV2ZWx1cC5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiYWxsdGVzdHNcIjogXCJucG0gdGVzdCAmJiBucG0gcnVuLXNjcmlwdCBmdW5jdGlvbmFsdGVzdHNcIixcbiAgICBcImZ1bmN0aW9uYWx0ZXN0c1wiOiBcIm5vZGUgLi90ZXN0L2Z1bmN0aW9uYWwvZnN0cmVhbS10ZXN0LmpzICYmIG5vZGUgLi90ZXN0L2Z1bmN0aW9uYWwvYmluYXJ5LWRhdGEtdGVzdC5qcyAmJiBub2RlIC4vdGVzdC9mdW5jdGlvbmFsL2NvbXBhdC10ZXN0LmpzXCIsXG4gICAgXCJ0ZXN0XCI6IFwidGFwIHRlc3QvKi10ZXN0LmpzXCJcbiAgfSxcbiAgXCJ2ZXJzaW9uXCI6IFwiMC4xOS4xXCJcbn1cbiIsIihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0ID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0cHJvY2Vzcy5zdGRlcnIgPSBwcm9jZXNzLnN0ZG91dCA9IHsgd3JpdGU6IGZ1bmN0aW9uKCkgeyB9IH07XG5cdH1cblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0ZGVmaW5lKFtcImV4cG9ydHNcIiwgXCJsaWJzb2RpdW1cIl0sIGZhY3RvcnkpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0ZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKFwibGlic29kaXVtXCIpKTtcblx0fSBlbHNlIHtcblx0XHR2YXIgY2IgPSByb290LnNvZGl1bSAmJiByb290LnNvZGl1bS5vbmxvYWQ7XG5cdFx0ZmFjdG9yeSgocm9vdC5zb2RpdW0gPSB7fSksIHJvb3QubGlic29kaXVtKTtcblx0XHRpZiAodHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdGNiKHJvb3Quc29kaXVtKTtcblx0XHR9XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsIGxpYnNvZGl1bSkge1xuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuXHR2YXIgb3V0cHV0X2Zvcm1hdCA9IFwidWludDhhcnJheVwiO1xuXG5cdGxpYnNvZGl1bS5fc29kaXVtX2luaXQoKTtcblxuXHQvLyBMaXN0IG9mIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhlIHdyYXBwZWQgbGlic29kaXVtXG5cdGZ1bmN0aW9uIHN5bWJvbHMoKSB7XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKGV4cG9ydHMpLnNvcnQoKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGluY3JlbWVudChieXRlcykge1xuXHRcdGlmICghIGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcIk9ubHkgVWludDhBcnJheSBpbnN0YW5jZXMgY2FuIGJlIGluY3JlbWVudGVkXCIpO1xuXHRcdH1cbiAgICAgICAgdmFyIGMgPSAxIDw8IDg7XG5cdFx0Zm9yICh2YXIgaSA9IDAgfCAwLCBqID0gYnl0ZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICBjID4+PSA4O1xuICAgICAgICAgICAgYyArPSBieXRlc1tpXTtcblx0XHRcdGJ5dGVzW2ldID0gYyAmIDB4ZmY7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gbWVtemVybyhieXRlcykge1xuXHRcdGlmICghIGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcIk9ubHkgVWludDhBcnJheSBpbnN0YW5jZXMgY2FuIGJlIHdpcGVkXCIpO1xuXHRcdH1cblx0XHRmb3IgKHZhciBpID0gMCB8IDAsIGogPSBieXRlcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcblx0XHRcdGJ5dGVzW2ldID0gMDtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBtZW1jbXAoYjEsIGIyKSB7XG5cdFx0aWYgKCEoYjEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGIyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJPbmx5IFVpbnQ4QXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBjb21wYXJlZFwiKTtcblx0XHR9XG5cdFx0aWYgKGIxLmxlbmd0aCAhPT0gYjIubGVuZ3RoKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiT25seSBpbnN0YW5jZXMgb2YgaWRlbnRpY2FsIGxlbmd0aCBjYW4gYmUgY29tcGFyZWRcIik7XG5cdFx0fVxuXHRcdGZvciAodmFyIGQgPSAwIHwgMCwgaSA9IDAgfCAwLCBqID0gYjEubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG5cdFx0XHRkIHw9IGIxW2ldIF4gYjJbaV07XG5cdFx0fVxuXHRcdHJldHVybiBkID09PSAwO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29tcGFyZShiMSwgYjIpIHtcblx0XHRpZiAoIShiMSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgYjIgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcIk9ubHkgVWludDhBcnJheSBpbnN0YW5jZXMgY2FuIGJlIGNvbXBhcmVkXCIpO1xuXHRcdH1cblx0XHRpZiAoYjEubGVuZ3RoICE9PSBiMi5sZW5ndGgpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJPbmx5IGluc3RhbmNlcyBvZiBpZGVudGljYWwgbGVuZ3RoIGNhbiBiZSBjb21wYXJlZFwiKTtcblx0XHR9XG5cdFx0Zm9yICh2YXIgZ3QgPSAwIHwgMCwgZXEgPSAxIHwgMSwgaSA9IGIxLmxlbmd0aDsgaS0tID4gMDspIHtcblx0XHRcdGd0IHw9ICgoYjJbaV0gLSBiMVtpXSkgPj4gOCkgJiBlcTtcblx0XHRcdGVxICY9ICgoYjJbaV0gXiBiMVtpXSkgLSAxKSA+PiA4O1xuXHRcdH1cblx0XHRyZXR1cm4gKGd0ICsgZ3QgKyBlcSkgLSAxO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ29kZWNzXG5cblx0ZnVuY3Rpb24gZnJvbV9zdHJpbmcoc3RyKSB7XG5cdFx0aWYgKHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFRleHRFbmNvZGVyKFwidXRmLThcIikuZW5jb2RlKHN0cik7XG5cdFx0fVxuXHRcdHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcblx0XHR2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuXHRcdFx0Ynl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGJ5dGVzO1xuXHR9XG5cblx0ZnVuY3Rpb24gdG9fc3RyaW5nKGJ5dGVzKSB7XG5cdFx0aWYgKHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIiwge2ZhdGFsOiB0cnVlfSkuZGVjb2RlKGJ5dGVzKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcykpKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKF8pIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZW5jb2RlZCBkYXRhIHdhcyBub3QgdmFsaWQuXCIpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGZyb21faGV4KHN0cikge1xuXHRcdGlmICghaXNfaGV4KHN0cikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgcHJvdmlkZWQgc3RyaW5nIGRvZXNuJ3QgbG9vayBsaWtlIGhleCBkYXRhXCIpO1xuXHRcdHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMik7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDIpIHtcblx0XHRcdHJlc3VsdFtpID4+PiAxXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoaSwgMiksIDE2KTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZ1bmN0aW9uIHRvX2hleChieXRlcykge1xuXHRcdHZhciBzdHIgPSBcIlwiLCBiLCBjLCB4O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGMgPSBieXRlc1tpXSAmIDB4Zjtcblx0XHRcdGIgPSBieXRlc1tpXSA+Pj4gNDtcblx0XHRcdHggPSAoODcgKyBjICsgKCgoYyAtIDEwKSA+PiA4KSAmIH4zOCkpIDw8IDggfFxuXHRcdFx0ICAgICg4NyArIGIgKyAoKChiIC0gMTApID4+IDgpICYgfjM4KSk7XG5cdFx0XHRzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh4ICYgMHhmZikgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHggPj4+IDgpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RyO1xuXHR9XG5cblx0ZnVuY3Rpb24gaXNfaGV4KHN0cikge1xuXHRcdHJldHVybiAodHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIiAmJiAvXlswLTlhLWZdKyQvaS50ZXN0KHN0cikgJiYgc3RyLmxlbmd0aCAlIDIgPT09IDApO1xuXHR9XG5cblx0ZnVuY3Rpb24gZnJvbV9iYXNlNjQoc0Jhc2U2NCwgbkJsb2Nrc1NpemUpIHtcblx0XHRmdW5jdGlvbiBfYjY0VG9VaW50NihuQ2hyKSB7XG5cdFx0XHRyZXR1cm4gbkNociA+IDY0ICYmIG5DaHIgPCA5MSA/XG5cdFx0XHRcdG5DaHIgLSA2NSA6IG5DaHIgPiA5NiAmJiBuQ2hyIDwgMTIzID9cblx0XHRcdFx0bkNociAtIDcxIDogbkNociA+IDQ3ICYmIG5DaHIgPCA1OCA/XG5cdFx0XHRcdG5DaHIgKyA0IDogbkNociA9PT0gNDMgP1xuXHRcdFx0XHQ2MiA6IG5DaHIgPT09IDQ3ID9cblx0XHRcdFx0NjMgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblx0XHR2YXJcblx0XHRcdHNCNjRFbmMgPSBzQmFzZTY0LnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXS9nLCBcIlwiKSxcblx0XHRcdG5JbkxlbiA9IHNCNjRFbmMubGVuZ3RoLFxuXHRcdFx0bk91dExlbiA9IG5CbG9ja3NTaXplID8gTWF0aC5jZWlsKChuSW5MZW4gKiAzICsgMSA+PiAyKSAvIG5CbG9ja3NTaXplKSAqIG5CbG9ja3NTaXplIDogbkluTGVuICogMyArIDEgPj4gMixcblx0XHRcdHRhQnl0ZXMgPSBuZXcgVWludDhBcnJheShuT3V0TGVuKTtcblx0XHRmb3IgKHZhciBuTW9kMywgbk1vZDQsIG5VaW50MjQgPSAwLCBuT3V0SWR4ID0gMCwgbkluSWR4ID0gMDsgbkluSWR4IDwgbkluTGVuOyBuSW5JZHgrKykge1xuXHRcdFx0bk1vZDQgPSBuSW5JZHggJiAzO1xuXHRcdFx0blVpbnQyNCB8PSBfYjY0VG9VaW50NihzQjY0RW5jLmNoYXJDb2RlQXQobkluSWR4KSkgPDwgMTggLSA2ICogbk1vZDQ7XG5cdFx0XHRpZiAobk1vZDQgPT09IDMgfHwgbkluTGVuIC0gbkluSWR4ID09PSAxKSB7XG5cdFx0XHRcdGZvciAobk1vZDMgPSAwOyBuTW9kMyA8IDMgJiYgbk91dElkeCA8IG5PdXRMZW47IG5Nb2QzKyssIG5PdXRJZHgrKykge1xuXHRcdFx0XHRcdHRhQnl0ZXNbbk91dElkeF0gPSBuVWludDI0ID4+PiAoMTYgPj4+IG5Nb2QzICYgMjQpICYgMjU1O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5VaW50MjQgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGFCeXRlcztcblx0fVxuXG5cdGZ1bmN0aW9uIHRvX2Jhc2U2NChhQnl0ZXMsIG5vTmV3TGluZSkge1xuXHRcdGZ1bmN0aW9uIF91aW50NlRvQjY0KG5VaW50Nikge1xuXHRcdFx0cmV0dXJuIG5VaW50NiA8IDI2ID9cblx0XHRcdFx0blVpbnQ2ICsgNjUgOiBuVWludDYgPCA1MiA/XG5cdFx0XHRcdG5VaW50NiArIDcxIDogblVpbnQ2IDwgNjIgP1xuXHRcdFx0XHRuVWludDYgLSA0IDogblVpbnQ2ID09PSA2MiA/XG5cdFx0XHRcdDQzIDogblVpbnQ2ID09PSA2MyA/XG5cdFx0XHRcdDQ3IDpcblx0XHRcdFx0NjU7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgYUJ5dGVzID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXhjZXB0aW9uKFwiaW5wdXQgaGFzIHRvIGJlIGFuIGFycmF5XCIpO1xuXHRcdH1cblx0XHR2YXIgbk1vZDMgPSAyLFxuXHRcdFx0c0I2NEVuYyA9IFwiXCI7XG5cdFx0Zm9yICh2YXIgbkxlbiA9IGFCeXRlcy5sZW5ndGgsIG5VaW50MjQgPSAwLCBuSWR4ID0gMDsgbklkeCA8IG5MZW47IG5JZHgrKykge1xuXHRcdFx0bk1vZDMgPSBuSWR4ICUgMztcblx0XHRcdGlmIChuSWR4ID4gMCAmJiAobklkeCAqIDQgLyAzKSAlIDc2ID09PSAwICYmICFub05ld0xpbmUpIHtcblx0XHRcdFx0c0I2NEVuYyArPSBcIlxcclxcblwiO1xuXHRcdFx0fVxuXHRcdFx0blVpbnQyNCB8PSBhQnl0ZXNbbklkeF0gPDwgKDE2ID4+PiBuTW9kMyAmIDI0KTtcblx0XHRcdGlmIChuTW9kMyA9PT0gMiB8fCBhQnl0ZXMubGVuZ3RoIC0gbklkeCA9PT0gMSkge1xuXHRcdFx0XHRzQjY0RW5jICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoX3VpbnQ2VG9CNjQoblVpbnQyNCA+Pj4gMTggJiA2MyksIF91aW50NlRvQjY0KG5VaW50MjQgPj4+IDEyICYgNjMpLCBfdWludDZUb0I2NChuVWludDI0ID4+PiA2ICYgNjMpLCBfdWludDZUb0I2NChuVWludDI0ICYgNjMpKTtcblx0XHRcdFx0blVpbnQyNCA9IDA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzQjY0RW5jLnN1YnN0cigwLCBzQjY0RW5jLmxlbmd0aCAtIDIgKyBuTW9kMykgKyAobk1vZDMgPT09IDIgPyBcIlwiIDogbk1vZDMgPT09IDEgPyBcIj1cIiA6IFwiPT1cIik7XG5cdH1cblxuXHRmdW5jdGlvbiBvdXRwdXRfZm9ybWF0cygpIHtcblx0XHRyZXR1cm4gW1widWludDhhcnJheVwiLCBcInRleHRcIiwgXCJoZXhcIiwgXCJiYXNlNjRcIl07XG5cdH1cblxuXHRmdW5jdGlvbiBfZm9ybWF0X291dHB1dChvdXRwdXQsIG9wdGlvbmFsT3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIHNlbGVjdGVkT3V0cHV0Rm9ybWF0ID0gb3B0aW9uYWxPdXRwdXRGb3JtYXQgfHwgb3V0cHV0X2Zvcm1hdDtcblx0XHRpZiAoIV9pc19vdXRwdXRfZm9ybWF0KHNlbGVjdGVkT3V0cHV0Rm9ybWF0KSkgdGhyb3cgbmV3IEVycm9yKHNlbGVjdGVkT3V0cHV0Rm9ybWF0ICsgXCIgb3V0cHV0IGZvcm1hdCBpcyBub3QgYXZhaWxhYmxlXCIpO1xuXHRcdGlmIChvdXRwdXQgaW5zdGFuY2VvZiBBbGxvY2F0ZWRCdWYpIHtcblx0XHRcdGlmIChzZWxlY3RlZE91dHB1dEZvcm1hdCA9PT0gXCJ1aW50OGFycmF5XCIpIHJldHVybiBvdXRwdXQudG9fVWludDhBcnJheSgpO1xuXHRcdFx0ZWxzZSBpZiAoc2VsZWN0ZWRPdXRwdXRGb3JtYXQgPT09IFwidGV4dFwiKSByZXR1cm4gbGlic29kaXVtLlBvaW50ZXJfc3RyaW5naWZ5KG91dHB1dC5hZGRyZXNzLCBvdXRwdXQubGVuZ3RoKTtcblx0XHRcdGVsc2UgaWYgKHNlbGVjdGVkT3V0cHV0Rm9ybWF0ID09PSBcImhleFwiKSByZXR1cm4gdG9faGV4KG91dHB1dC50b19VaW50OEFycmF5KCkpO1xuXHRcdFx0ZWxzZSBpZiAoc2VsZWN0ZWRPdXRwdXRGb3JtYXQgPT09IFwiYmFzZTY0XCIpIHJldHVybiB0b19iYXNlNjQob3V0cHV0LnRvX1VpbnQ4QXJyYXkoKSk7XG5cdFx0XHRlbHNlIHRocm93IG5ldyBFcnJvcihcIldoYXQgaXMgb3V0cHV0IGZvcm1hdCBcXFwiXCIgKyBzZWxlY3RlZE91dHB1dEZvcm1hdCArIFwiXFxcIj9cIik7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2Ygb3V0cHV0ID09PSBcIm9iamVjdFwiKSB7IC8vQ29tcG9zZWQgb3V0cHV0LiBFeGFtcGxlIDoga2V5IHBhaXJzXG5cdFx0XHR2YXIgcHJvcHMgPSBPYmplY3Qua2V5cyhvdXRwdXQpO1xuXHRcdFx0dmFyIGZvcm1hdHRlZE91dHB1dCA9IHt9O1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRmb3JtYXR0ZWRPdXRwdXRbcHJvcHNbaV1dID0gX2Zvcm1hdF9vdXRwdXQob3V0cHV0W3Byb3BzW2ldXSwgc2VsZWN0ZWRPdXRwdXRGb3JtYXQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZvcm1hdHRlZE91dHB1dDtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgZm9ybWF0IG91dHB1dFwiKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBfaXNfb3V0cHV0X2Zvcm1hdChmb3JtYXQpIHtcblx0XHR2YXIgZm9ybWF0cyA9IG91dHB1dF9mb3JtYXRzKCk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtYXRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoZm9ybWF0c1tpXSA9PT0gZm9ybWF0KSByZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gX2NoZWNrX291dHB1dF9mb3JtYXQoZm9ybWF0KSB7XG5cdFx0aWYgKCFmb3JtYXQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBmb3JtYXQgIT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJXaGVuIGRlZmluZWQsIHRoZSBvdXRwdXQgZm9ybWF0IG11c3QgYmUgYSBzdHJpbmdcIik7XG5cdFx0fSBlbHNlIGlmICghX2lzX291dHB1dF9mb3JtYXQoZm9ybWF0KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGZvcm1hdCArIFwiIGlzIG5vdCBhIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0XCIpO1xuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50XG5cblx0Ly8gQWxsb2NhdGVkQnVmOiBhZGRyZXNzIGFsbG9jYXRlZCB1c2luZyBfbWFsbG9jKCkgKyBsZW5ndGhcblx0ZnVuY3Rpb24gQWxsb2NhdGVkQnVmKGxlbmd0aCkge1xuXHRcdHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuXHRcdHRoaXMuYWRkcmVzcyA9IF9tYWxsb2MobGVuZ3RoKTtcblx0fVxuXG5cdC8vIENvcHkgdGhlIGNvbnRlbnQgb2YgYSBBbGxvY2F0ZWRCdWYgKF9tYWxsb2MoKSdkIG1lbW9yeSkgaW50byBhIFVpbnQ4QXJyYXlcblx0QWxsb2NhdGVkQnVmLnByb3RvdHlwZS50b19VaW50OEFycmF5ID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZXN1bHQgPSBuZXcgVWludDhBcnJheSh0aGlzLmxlbmd0aCk7XG5cdFx0cmVzdWx0LnNldChsaWJzb2RpdW0uSEVBUFU4LnN1YmFycmF5KHRoaXMuYWRkcmVzcywgdGhpcy5hZGRyZXNzICsgdGhpcy5sZW5ndGgpKTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdC8vIF9tYWxsb2MoKSBhIHJlZ2lvbiBhbmQgaW5pdGlhbGl6ZSBpdCB3aXRoIHRoZSBjb250ZW50IG9mIGEgVWludDhBcnJheVxuXHRmdW5jdGlvbiBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGJ5dGVzKSB7XG5cdFx0dmFyIGFkZHJlc3MgPSBfbWFsbG9jKGJ5dGVzLmxlbmd0aCk7XG5cdFx0bGlic29kaXVtLkhFQVBVOC5zZXQoYnl0ZXMsIGFkZHJlc3MpO1xuXHRcdHJldHVybiBhZGRyZXNzO1xuXHR9XG5cblx0ZnVuY3Rpb24gX21hbGxvYyhsZW5ndGgpIHtcblx0XHR2YXIgcmVzdWx0ID0gbGlic29kaXVtLl9tYWxsb2MobGVuZ3RoKTtcblx0XHRpZiAocmVzdWx0ID09PSAwKSB7XG5cdFx0XHR0aHJvdyB7XG5cdFx0XHRcdG1lc3NhZ2U6IFwiX21hbGxvYygpIGZhaWxlZFwiLFxuXHRcdFx0XHRsZW5ndGg6IGxlbmd0aFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZ1bmN0aW9uIF9mcmVlKGFkZHJlc3MpIHtcblx0XHRsaWJzb2RpdW0uX2ZyZWUoYWRkcmVzcyk7XG5cdH1cblxuXHRmdW5jdGlvbiBfZnJlZV9hbGwoYWRkcmVzc2VzKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdF9mcmVlKGFkZHJlc3Nlc1tpXSk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gX2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCwgZXJyKSB7XG5cdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGVycik7XG5cdH1cblxuXHRmdW5jdGlvbiBfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIGVycikge1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoZXJyKTtcblx0fVxuXG5cdGZ1bmN0aW9uIF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCB2YXJWYWx1ZSwgdmFyTmFtZSkge1xuXHRcdGlmICh2YXJWYWx1ZSA9PSB1bmRlZmluZWQpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgdmFyTmFtZSArIFwiIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZFwiKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCB2YXJWYWx1ZSwgdmFyTmFtZSkge1xuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCB2YXJWYWx1ZSwgdmFyTmFtZSk7XG5cdFx0aWYgKHZhclZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuXHRcdFx0cmV0dXJuIHZhclZhbHVlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhclZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRyZXR1cm4gZnJvbV9zdHJpbmcodmFyVmFsdWUpO1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwidW5zdXBwb3J0ZWQgaW5wdXQgdHlwZSBmb3IgXCIgKyB2YXJOYW1lKTtcblx0fVxuXG5cdFxuXHRmdW5jdGlvbiBjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2RlY3J5cHQoc2VjcmV0X25vbmNlLCBjaXBoZXJ0ZXh0LCBhZGRpdGlvbmFsX2RhdGEsIHB1YmxpY19ub25jZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHNlY3JldF9ub25jZSAodW5zaXplZF9idWZfb3B0aW9uYWwpXG5cdFx0XG5cdFx0dmFyIHNlY3JldF9ub25jZV9hZGRyZXNzID0gbnVsbCwgc2VjcmV0X25vbmNlX2xlbmd0aCA9IDA7XG5cdFx0aWYgKHNlY3JldF9ub25jZSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdHNlY3JldF9ub25jZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNlY3JldF9ub25jZSwgXCJzZWNyZXRfbm9uY2VcIik7XG5cdFx0XHRzZWNyZXRfbm9uY2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VjcmV0X25vbmNlKTtcblx0XHRcdHNlY3JldF9ub25jZV9sZW5ndGggPSBzZWNyZXRfbm9uY2UubGVuZ3RoO1xuXHRcdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0X25vbmNlX2FkZHJlc3MpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBjaXBoZXJ0ZXh0ICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRjaXBoZXJ0ZXh0ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgY2lwaGVydGV4dCwgXCJjaXBoZXJ0ZXh0XCIpO1xuXHRcdHZhciBjaXBoZXJ0ZXh0X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGNpcGhlcnRleHQpLFxuXHRcdCAgICBjaXBoZXJ0ZXh0X2xlbmd0aCA9IGNpcGhlcnRleHQubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogYWRkaXRpb25hbF9kYXRhICh1bnNpemVkX2J1Zl9vcHRpb25hbClcblx0XHRcblx0XHR2YXIgYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MgPSBudWxsLCBhZGRpdGlvbmFsX2RhdGFfbGVuZ3RoID0gMDtcblx0XHRpZiAoYWRkaXRpb25hbF9kYXRhICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0YWRkaXRpb25hbF9kYXRhID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgYWRkaXRpb25hbF9kYXRhLCBcImFkZGl0aW9uYWxfZGF0YVwiKTtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhhZGRpdGlvbmFsX2RhdGEpO1xuXHRcdFx0YWRkaXRpb25hbF9kYXRhX2xlbmd0aCA9IGFkZGl0aW9uYWxfZGF0YS5sZW5ndGg7XG5cdFx0XHRhZGRyZXNzX3Bvb2wucHVzaChhZGRpdGlvbmFsX2RhdGFfYWRkcmVzcyk7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHB1YmxpY19ub25jZSAoYnVmKVxuXHRcdFxuXHRcdHB1YmxpY19ub25jZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHB1YmxpY19ub25jZSwgXCJwdWJsaWNfbm9uY2VcIik7XG5cdFx0dmFyIHB1YmxpY19ub25jZV9hZGRyZXNzLCBwdWJsaWNfbm9uY2VfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9ucHViYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNfbm9uY2UubGVuZ3RoICE9PSBwdWJsaWNfbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNfbm9uY2UgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNfbm9uY2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljX25vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNfbm9uY2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IG1lc3NhZ2UgKGJ1Zilcblx0XHRcblx0XHR2YXIgbWVzc2FnZV9sZW5ndGggPSAoY2lwaGVydGV4dF9sZW5ndGggLSBsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfYWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgbWVzc2FnZSA9IG5ldyBBbGxvY2F0ZWRCdWYobWVzc2FnZV9sZW5ndGgpLFxuXHRcdCAgICBtZXNzYWdlX2FkZHJlc3MgPSBtZXNzYWdlLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9kZWNyeXB0KG1lc3NhZ2VfYWRkcmVzcywgbnVsbCwgc2VjcmV0X25vbmNlX2FkZHJlc3MsIGNpcGhlcnRleHRfYWRkcmVzcywgY2lwaGVydGV4dF9sZW5ndGgsIDAsIGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzLCBhZGRpdGlvbmFsX2RhdGFfbGVuZ3RoLCAwLCBwdWJsaWNfbm9uY2VfYWRkcmVzcywga2V5X2FkZHJlc3MpKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KG1lc3NhZ2UsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9lbmNyeXB0KG1lc3NhZ2UsIGFkZGl0aW9uYWxfZGF0YSwgc2VjcmV0X25vbmNlLCBwdWJsaWNfbm9uY2UsIGtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogYWRkaXRpb25hbF9kYXRhICh1bnNpemVkX2J1Zl9vcHRpb25hbClcblx0XHRcblx0XHR2YXIgYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MgPSBudWxsLCBhZGRpdGlvbmFsX2RhdGFfbGVuZ3RoID0gMDtcblx0XHRpZiAoYWRkaXRpb25hbF9kYXRhICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0YWRkaXRpb25hbF9kYXRhID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgYWRkaXRpb25hbF9kYXRhLCBcImFkZGl0aW9uYWxfZGF0YVwiKTtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhhZGRpdGlvbmFsX2RhdGEpO1xuXHRcdFx0YWRkaXRpb25hbF9kYXRhX2xlbmd0aCA9IGFkZGl0aW9uYWxfZGF0YS5sZW5ndGg7XG5cdFx0XHRhZGRyZXNzX3Bvb2wucHVzaChhZGRpdGlvbmFsX2RhdGFfYWRkcmVzcyk7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHNlY3JldF9ub25jZSAodW5zaXplZF9idWZfb3B0aW9uYWwpXG5cdFx0XG5cdFx0dmFyIHNlY3JldF9ub25jZV9hZGRyZXNzID0gbnVsbCwgc2VjcmV0X25vbmNlX2xlbmd0aCA9IDA7XG5cdFx0aWYgKHNlY3JldF9ub25jZSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdHNlY3JldF9ub25jZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNlY3JldF9ub25jZSwgXCJzZWNyZXRfbm9uY2VcIik7XG5cdFx0XHRzZWNyZXRfbm9uY2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VjcmV0X25vbmNlKTtcblx0XHRcdHNlY3JldF9ub25jZV9sZW5ndGggPSBzZWNyZXRfbm9uY2UubGVuZ3RoO1xuXHRcdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0X25vbmNlX2FkZHJlc3MpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNfbm9uY2UgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNfbm9uY2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNfbm9uY2UsIFwicHVibGljX25vbmNlXCIpO1xuXHRcdHZhciBwdWJsaWNfbm9uY2VfYWRkcmVzcywgcHVibGljX25vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfbnB1YmJ5dGVzKCkpIHwgMDtcblx0XHRpZiAocHVibGljX25vbmNlLmxlbmd0aCAhPT0gcHVibGljX25vbmNlX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHVibGljX25vbmNlIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0cHVibGljX25vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHB1YmxpY19ub25jZSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljX25vbmNlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGtleSAoYnVmKVxuXHRcdFxuXHRcdGtleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGtleSwgXCJrZXlcIik7XG5cdFx0dmFyIGtleV9hZGRyZXNzLCBrZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9rZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGtleS5sZW5ndGggIT09IGtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBjaXBoZXJ0ZXh0IChidWYpXG5cdFx0XG5cdFx0dmFyIGNpcGhlcnRleHRfbGVuZ3RoID0gKG1lc3NhZ2VfbGVuZ3RoICsgbGlic29kaXVtLl9jcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2FieXRlcygpKSB8IDAsXG5cdFx0ICAgIGNpcGhlcnRleHQgPSBuZXcgQWxsb2NhdGVkQnVmKGNpcGhlcnRleHRfbGVuZ3RoKSxcblx0XHQgICAgY2lwaGVydGV4dF9hZGRyZXNzID0gY2lwaGVydGV4dC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfZW5jcnlwdChjaXBoZXJ0ZXh0X2FkZHJlc3MsIG51bGwsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzLCBhZGRpdGlvbmFsX2RhdGFfbGVuZ3RoLCAwLCBzZWNyZXRfbm9uY2VfYWRkcmVzcywgcHVibGljX25vbmNlX2FkZHJlc3MsIGtleV9hZGRyZXNzKSkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChjaXBoZXJ0ZXh0LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfaWV0Zl9kZWNyeXB0KHNlY3JldF9ub25jZSwgY2lwaGVydGV4dCwgYWRkaXRpb25hbF9kYXRhLCBwdWJsaWNfbm9uY2UsIGtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWNyZXRfbm9uY2UgKHVuc2l6ZWRfYnVmX29wdGlvbmFsKVxuXHRcdFxuXHRcdHZhciBzZWNyZXRfbm9uY2VfYWRkcmVzcyA9IG51bGwsIHNlY3JldF9ub25jZV9sZW5ndGggPSAwO1xuXHRcdGlmIChzZWNyZXRfbm9uY2UgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZWNyZXRfbm9uY2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzZWNyZXRfbm9uY2UsIFwic2VjcmV0X25vbmNlXCIpO1xuXHRcdFx0c2VjcmV0X25vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHNlY3JldF9ub25jZSk7XG5cdFx0XHRzZWNyZXRfbm9uY2VfbGVuZ3RoID0gc2VjcmV0X25vbmNlLmxlbmd0aDtcblx0XHRcdGFkZHJlc3NfcG9vbC5wdXNoKHNlY3JldF9ub25jZV9hZGRyZXNzKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogY2lwaGVydGV4dCAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0Y2lwaGVydGV4dCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGNpcGhlcnRleHQsIFwiY2lwaGVydGV4dFwiKTtcblx0XHR2YXIgY2lwaGVydGV4dF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhjaXBoZXJ0ZXh0KSxcblx0XHQgICAgY2lwaGVydGV4dF9sZW5ndGggPSBjaXBoZXJ0ZXh0Lmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjaXBoZXJ0ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGFkZGl0aW9uYWxfZGF0YSAodW5zaXplZF9idWZfb3B0aW9uYWwpXG5cdFx0XG5cdFx0dmFyIGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzID0gbnVsbCwgYWRkaXRpb25hbF9kYXRhX2xlbmd0aCA9IDA7XG5cdFx0aWYgKGFkZGl0aW9uYWxfZGF0YSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGFkZGl0aW9uYWxfZGF0YSwgXCJhZGRpdGlvbmFsX2RhdGFcIik7XG5cdFx0XHRhZGRpdGlvbmFsX2RhdGFfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoYWRkaXRpb25hbF9kYXRhKTtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YV9sZW5ndGggPSBhZGRpdGlvbmFsX2RhdGEubGVuZ3RoO1xuXHRcdFx0YWRkcmVzc19wb29sLnB1c2goYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNfbm9uY2UgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNfbm9uY2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNfbm9uY2UsIFwicHVibGljX25vbmNlXCIpO1xuXHRcdHZhciBwdWJsaWNfbm9uY2VfYWRkcmVzcywgcHVibGljX25vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfaWV0Zl9ucHViYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNfbm9uY2UubGVuZ3RoICE9PSBwdWJsaWNfbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNfbm9uY2UgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNfbm9uY2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljX25vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNfbm9uY2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IG1lc3NhZ2UgKGJ1Zilcblx0XHRcblx0XHR2YXIgbWVzc2FnZV9sZW5ndGggPSAoY2lwaGVydGV4dF9sZW5ndGggLSBsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfYWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgbWVzc2FnZSA9IG5ldyBBbGxvY2F0ZWRCdWYobWVzc2FnZV9sZW5ndGgpLFxuXHRcdCAgICBtZXNzYWdlX2FkZHJlc3MgPSBtZXNzYWdlLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9pZXRmX2RlY3J5cHQobWVzc2FnZV9hZGRyZXNzLCBudWxsLCBzZWNyZXRfbm9uY2VfYWRkcmVzcywgY2lwaGVydGV4dF9hZGRyZXNzLCBjaXBoZXJ0ZXh0X2xlbmd0aCwgMCwgYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MsIGFkZGl0aW9uYWxfZGF0YV9sZW5ndGgsIDAsIHB1YmxpY19ub25jZV9hZGRyZXNzLCBrZXlfYWRkcmVzcykpID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQobWVzc2FnZSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2lldGZfZW5jcnlwdChtZXNzYWdlLCBhZGRpdGlvbmFsX2RhdGEsIHNlY3JldF9ub25jZSwgcHVibGljX25vbmNlLCBrZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbWVzc2FnZSAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0bWVzc2FnZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1lc3NhZ2UsIFwibWVzc2FnZVwiKTtcblx0XHR2YXIgbWVzc2FnZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtZXNzYWdlKSxcblx0XHQgICAgbWVzc2FnZV9sZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtZXNzYWdlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGFkZGl0aW9uYWxfZGF0YSAodW5zaXplZF9idWZfb3B0aW9uYWwpXG5cdFx0XG5cdFx0dmFyIGFkZGl0aW9uYWxfZGF0YV9hZGRyZXNzID0gbnVsbCwgYWRkaXRpb25hbF9kYXRhX2xlbmd0aCA9IDA7XG5cdFx0aWYgKGFkZGl0aW9uYWxfZGF0YSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGFkZGl0aW9uYWxfZGF0YSwgXCJhZGRpdGlvbmFsX2RhdGFcIik7XG5cdFx0XHRhZGRpdGlvbmFsX2RhdGFfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoYWRkaXRpb25hbF9kYXRhKTtcblx0XHRcdGFkZGl0aW9uYWxfZGF0YV9sZW5ndGggPSBhZGRpdGlvbmFsX2RhdGEubGVuZ3RoO1xuXHRcdFx0YWRkcmVzc19wb29sLnB1c2goYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWNyZXRfbm9uY2UgKHVuc2l6ZWRfYnVmX29wdGlvbmFsKVxuXHRcdFxuXHRcdHZhciBzZWNyZXRfbm9uY2VfYWRkcmVzcyA9IG51bGwsIHNlY3JldF9ub25jZV9sZW5ndGggPSAwO1xuXHRcdGlmIChzZWNyZXRfbm9uY2UgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZWNyZXRfbm9uY2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzZWNyZXRfbm9uY2UsIFwic2VjcmV0X25vbmNlXCIpO1xuXHRcdFx0c2VjcmV0X25vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHNlY3JldF9ub25jZSk7XG5cdFx0XHRzZWNyZXRfbm9uY2VfbGVuZ3RoID0gc2VjcmV0X25vbmNlLmxlbmd0aDtcblx0XHRcdGFkZHJlc3NfcG9vbC5wdXNoKHNlY3JldF9ub25jZV9hZGRyZXNzKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogcHVibGljX25vbmNlIChidWYpXG5cdFx0XG5cdFx0cHVibGljX25vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgcHVibGljX25vbmNlLCBcInB1YmxpY19ub25jZVwiKTtcblx0XHR2YXIgcHVibGljX25vbmNlX2FkZHJlc3MsIHB1YmxpY19ub25jZV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2lldGZfbnB1YmJ5dGVzKCkpIHwgMDtcblx0XHRpZiAocHVibGljX25vbmNlLmxlbmd0aCAhPT0gcHVibGljX25vbmNlX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHVibGljX25vbmNlIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0cHVibGljX25vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHB1YmxpY19ub25jZSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljX25vbmNlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGtleSAoYnVmKVxuXHRcdFxuXHRcdGtleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGtleSwgXCJrZXlcIik7XG5cdFx0dmFyIGtleV9hZGRyZXNzLCBrZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9rZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGtleS5sZW5ndGggIT09IGtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBjaXBoZXJ0ZXh0IChidWYpXG5cdFx0XG5cdFx0dmFyIGNpcGhlcnRleHRfbGVuZ3RoID0gKG1lc3NhZ2VfbGVuZ3RoICsgbGlic29kaXVtLl9jcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2FieXRlcygpKSB8IDAsXG5cdFx0ICAgIGNpcGhlcnRleHQgPSBuZXcgQWxsb2NhdGVkQnVmKGNpcGhlcnRleHRfbGVuZ3RoKSxcblx0XHQgICAgY2lwaGVydGV4dF9hZGRyZXNzID0gY2lwaGVydGV4dC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfaWV0Zl9lbmNyeXB0KGNpcGhlcnRleHRfYWRkcmVzcywgbnVsbCwgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwgYWRkaXRpb25hbF9kYXRhX2FkZHJlc3MsIGFkZGl0aW9uYWxfZGF0YV9sZW5ndGgsIDAsIHNlY3JldF9ub25jZV9hZGRyZXNzLCBwdWJsaWNfbm9uY2VfYWRkcmVzcywga2V5X2FkZHJlc3MpKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGNpcGhlcnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2F1dGgobWVzc2FnZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hdXRoX2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHRhZyAoYnVmKVxuXHRcdFxuXHRcdHZhciB0YWdfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2F1dGhfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICB0YWcgPSBuZXcgQWxsb2NhdGVkQnVmKHRhZ19sZW5ndGgpLFxuXHRcdCAgICB0YWdfYWRkcmVzcyA9IHRhZy5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHRhZ19hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2F1dGgodGFnX2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQodGFnLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19hdXRoX2htYWNzaGEyNTYobWVzc2FnZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hdXRoX2htYWNzaGEyNTZfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgaGFzaCAoYnVmKVxuXHRcdFxuXHRcdHZhciBoYXNoX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hdXRoX2htYWNzaGEyNTZfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBoYXNoID0gbmV3IEFsbG9jYXRlZEJ1ZihoYXNoX2xlbmd0aCksXG5cdFx0ICAgIGhhc2hfYWRkcmVzcyA9IGhhc2guYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fYXV0aF9obWFjc2hhMjU2KGhhc2hfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwga2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChoYXNoLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19hdXRoX2htYWNzaGEyNTZfdmVyaWZ5KHRhZywgbWVzc2FnZSwga2V5KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogdGFnIChidWYpXG5cdFx0XG5cdFx0dGFnID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgdGFnLCBcInRhZ1wiKTtcblx0XHR2YXIgdGFnX2FkZHJlc3MsIHRhZ19sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9obWFjc2hhMjU2X2J5dGVzKCkpIHwgMDtcblx0XHRpZiAodGFnLmxlbmd0aCAhPT0gdGFnX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgdGFnIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0dGFnX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHRhZyk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2godGFnX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19hdXRoX2htYWNzaGEyNTZfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0dmFyIHJlc3VsdCA9IGxpYnNvZGl1bS5fY3J5cHRvX2F1dGhfaG1hY3NoYTI1Nl92ZXJpZnkodGFnX2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGtleV9hZGRyZXNzKSB8IDA7XG5cdFx0dmFyIHJldCA9IChyZXN1bHQgPT09IDApO1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHJldHVybiByZXQ7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYXV0aF9obWFjc2hhNTEyKG1lc3NhZ2UsIGtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9obWFjc2hhNTEyX2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IGhhc2ggKGJ1Zilcblx0XHRcblx0XHR2YXIgaGFzaF9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9obWFjc2hhNTEyX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2F1dGhfaG1hY3NoYTUxMihoYXNoX2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoaGFzaCwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYXV0aF9obWFjc2hhNTEyX3ZlcmlmeSh0YWcsIG1lc3NhZ2UsIGtleSkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHRhZyAoYnVmKVxuXHRcdFxuXHRcdHRhZyA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHRhZywgXCJ0YWdcIik7XG5cdFx0dmFyIHRhZ19hZGRyZXNzLCB0YWdfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2F1dGhfaG1hY3NoYTUxMl9ieXRlcygpKSB8IDA7XG5cdFx0aWYgKHRhZy5sZW5ndGggIT09IHRhZ19sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHRhZyBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHRhZ19hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyh0YWcpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHRhZ19hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9obWFjc2hhNTEyX2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdHZhciByZXN1bHQgPSBsaWJzb2RpdW0uX2NyeXB0b19hdXRoX2htYWNzaGE1MTJfdmVyaWZ5KHRhZ19hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBrZXlfYWRkcmVzcykgfCAwO1xuXHRcdHZhciByZXQgPSAocmVzdWx0ID09PSAwKTtcblx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRyZXR1cm4gcmV0O1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2F1dGhfdmVyaWZ5KHRhZywgbWVzc2FnZSwga2V5KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogdGFnIChidWYpXG5cdFx0XG5cdFx0dGFnID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgdGFnLCBcInRhZ1wiKTtcblx0XHR2YXIgdGFnX2FkZHJlc3MsIHRhZ19sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9ieXRlcygpKSB8IDA7XG5cdFx0aWYgKHRhZy5sZW5ndGggIT09IHRhZ19sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHRhZyBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHRhZ19hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyh0YWcpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHRhZ19hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYXV0aF9rZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGtleS5sZW5ndGggIT09IGtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHRcblx0XHR2YXIgcmVzdWx0ID0gbGlic29kaXVtLl9jcnlwdG9fYXV0aF92ZXJpZnkodGFnX2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGtleV9hZGRyZXNzKSB8IDA7XG5cdFx0dmFyIHJldCA9IChyZXN1bHQgPT09IDApO1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHJldHVybiByZXQ7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYm94X2JlZm9yZW5tKHB1YmxpY0tleSwgc2VjcmV0S2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHB1YmxpY0tleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHB1YmxpY0tleSwgXCJwdWJsaWNLZXlcIik7XG5cdFx0dmFyIHB1YmxpY0tleV9hZGRyZXNzLCBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKHB1YmxpY0tleS5sZW5ndGggIT09IHB1YmxpY0tleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHB1YmxpY0tleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHB1YmxpY0tleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwdWJsaWNLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHB1YmxpY0tleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWNyZXRLZXkgKGJ1Zilcblx0XHRcblx0XHRzZWNyZXRLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzZWNyZXRLZXksIFwic2VjcmV0S2V5XCIpO1xuXHRcdHZhciBzZWNyZXRLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChzZWNyZXRLZXkubGVuZ3RoICE9PSBzZWNyZXRLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzZWNyZXRLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRzZWNyZXRLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VjcmV0S2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzZWNyZXRLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgc2hhcmVkS2V5IChidWYpXG5cdFx0XG5cdFx0dmFyIHNoYXJlZEtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X2JlZm9yZW5tYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBzaGFyZWRLZXkgPSBuZXcgQWxsb2NhdGVkQnVmKHNoYXJlZEtleV9sZW5ndGgpLFxuXHRcdCAgICBzaGFyZWRLZXlfYWRkcmVzcyA9IHNoYXJlZEtleS5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHNoYXJlZEtleV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9iZWZvcmVubShzaGFyZWRLZXlfYWRkcmVzcywgcHVibGljS2V5X2FkZHJlc3MsIHNlY3JldEtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoc2hhcmVkS2V5LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19ib3hfZGV0YWNoZWQobWVzc2FnZSwgbm9uY2UsIHB1YmxpY0tleSwgc2VjcmV0S2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfcHVibGlja2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNLZXkubGVuZ3RoICE9PSBwdWJsaWNLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc2VjcmV0S2V5IChidWYpXG5cdFx0XG5cdFx0c2VjcmV0S2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgc2VjcmV0S2V5LCBcInNlY3JldEtleVwiKTtcblx0XHR2YXIgc2VjcmV0S2V5X2FkZHJlc3MsIHNlY3JldEtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X3NlY3JldGtleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gc2VjcmV0S2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgc2VjcmV0S2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0c2VjcmV0S2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHNlY3JldEtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0S2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IGNpcGhlcnRleHQgKGJ1Zilcblx0XHRcblx0XHR2YXIgY2lwaGVydGV4dF9sZW5ndGggPSAobWVzc2FnZV9sZW5ndGgpIHwgMCxcblx0XHQgICAgY2lwaGVydGV4dCA9IG5ldyBBbGxvY2F0ZWRCdWYoY2lwaGVydGV4dF9sZW5ndGgpLFxuXHRcdCAgICBjaXBoZXJ0ZXh0X2FkZHJlc3MgPSBjaXBoZXJ0ZXh0LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY2lwaGVydGV4dF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBtYWMgKGJ1Zilcblx0XHRcblx0XHR2YXIgbWFjX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfbWFjYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBtYWMgPSBuZXcgQWxsb2NhdGVkQnVmKG1hY19sZW5ndGgpLFxuXHRcdCAgICBtYWNfYWRkcmVzcyA9IG1hYy5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1hY19hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9kZXRhY2hlZChjaXBoZXJ0ZXh0X2FkZHJlc3MsIG1hY19hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBwdWJsaWNLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dCh7Y2lwaGVydGV4dDogY2lwaGVydGV4dCwgbWFjOiBtYWN9LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19ib3hfZWFzeShtZXNzYWdlLCBub25jZSwgcHVibGljS2V5LCBzZWNyZXRLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbWVzc2FnZSAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0bWVzc2FnZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1lc3NhZ2UsIFwibWVzc2FnZVwiKTtcblx0XHR2YXIgbWVzc2FnZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtZXNzYWdlKSxcblx0XHQgICAgbWVzc2FnZV9sZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtZXNzYWdlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG5vbmNlIChidWYpXG5cdFx0XG5cdFx0bm9uY2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBub25jZSwgXCJub25jZVwiKTtcblx0XHR2YXIgbm9uY2VfYWRkcmVzcywgbm9uY2VfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9ub25jZWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAobm9uY2UubGVuZ3RoICE9PSBub25jZV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIG5vbmNlIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0bm9uY2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Mobm9uY2UpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG5vbmNlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHB1YmxpY0tleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHB1YmxpY0tleSwgXCJwdWJsaWNLZXlcIik7XG5cdFx0dmFyIHB1YmxpY0tleV9hZGRyZXNzLCBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKHB1YmxpY0tleS5sZW5ndGggIT09IHB1YmxpY0tleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHB1YmxpY0tleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHB1YmxpY0tleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwdWJsaWNLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHB1YmxpY0tleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWNyZXRLZXkgKGJ1Zilcblx0XHRcblx0XHRzZWNyZXRLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzZWNyZXRLZXksIFwic2VjcmV0S2V5XCIpO1xuXHRcdHZhciBzZWNyZXRLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChzZWNyZXRLZXkubGVuZ3RoICE9PSBzZWNyZXRLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzZWNyZXRLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRzZWNyZXRLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VjcmV0S2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzZWNyZXRLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY2lwaGVydGV4dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBjaXBoZXJ0ZXh0X2xlbmd0aCA9IChtZXNzYWdlX2xlbmd0aCArIGxpYnNvZGl1bS5fY3J5cHRvX2JveF9tYWNieXRlcygpKSB8IDAsXG5cdFx0ICAgIGNpcGhlcnRleHQgPSBuZXcgQWxsb2NhdGVkQnVmKGNpcGhlcnRleHRfbGVuZ3RoKSxcblx0XHQgICAgY2lwaGVydGV4dF9hZGRyZXNzID0gY2lwaGVydGV4dC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19ib3hfZWFzeShjaXBoZXJ0ZXh0X2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIG5vbmNlX2FkZHJlc3MsIHB1YmxpY0tleV9hZGRyZXNzLCBzZWNyZXRLZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGNpcGhlcnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2JveF9lYXN5X2FmdGVybm0obWVzc2FnZSwgbm9uY2UsIHNoYXJlZEtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbm9uY2UgKGJ1Zilcblx0XHRcblx0XHRub25jZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG5vbmNlLCBcIm5vbmNlXCIpO1xuXHRcdHZhciBub25jZV9hZGRyZXNzLCBub25jZV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X25vbmNlYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChub25jZS5sZW5ndGggIT09IG5vbmNlX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgbm9uY2UgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRub25jZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhub25jZSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobm9uY2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc2hhcmVkS2V5IChidWYpXG5cdFx0XG5cdFx0c2hhcmVkS2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgc2hhcmVkS2V5LCBcInNoYXJlZEtleVwiKTtcblx0XHR2YXIgc2hhcmVkS2V5X2FkZHJlc3MsIHNoYXJlZEtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X2JlZm9yZW5tYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChzaGFyZWRLZXkubGVuZ3RoICE9PSBzaGFyZWRLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzaGFyZWRLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRzaGFyZWRLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2hhcmVkS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzaGFyZWRLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY2lwaGVydGV4dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBjaXBoZXJ0ZXh0X2xlbmd0aCA9IChtZXNzYWdlX2xlbmd0aCArIGxpYnNvZGl1bS5fY3J5cHRvX2JveF9tYWNieXRlcygpKSB8IDAsXG5cdFx0ICAgIGNpcGhlcnRleHQgPSBuZXcgQWxsb2NhdGVkQnVmKGNpcGhlcnRleHRfbGVuZ3RoKSxcblx0XHQgICAgY2lwaGVydGV4dF9hZGRyZXNzID0gY2lwaGVydGV4dC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19ib3hfZWFzeV9hZnRlcm5tKGNpcGhlcnRleHRfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwgbm9uY2VfYWRkcmVzcywgc2hhcmVkS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChjaXBoZXJ0ZXh0LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19ib3hfa2V5cGFpcihvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcygpKSB8IDAsXG5cdFx0ICAgIHB1YmxpY0tleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHVibGljS2V5X2xlbmd0aCksXG5cdFx0ICAgIHB1YmxpY0tleV9hZGRyZXNzID0gcHVibGljS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHNlY3JldEtleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBzZWNyZXRLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9zZWNyZXRrZXlieXRlcygpKSB8IDAsXG5cdFx0ICAgIHNlY3JldEtleSA9IG5ldyBBbGxvY2F0ZWRCdWYoc2VjcmV0S2V5X2xlbmd0aCksXG5cdFx0ICAgIHNlY3JldEtleV9hZGRyZXNzID0gc2VjcmV0S2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0S2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fYm94X2tleXBhaXIocHVibGljS2V5X2FkZHJlc3MsIHNlY3JldEtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoe3B1YmxpY0tleTogcHVibGljS2V5LCBwcml2YXRlS2V5OiBzZWNyZXRLZXksIGtleVR5cGU6IFwiY3VydmUyNTUxOVwifSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYm94X29wZW5fZGV0YWNoZWQoY2lwaGVydGV4dCwgbWFjLCBub25jZSwgcHVibGljS2V5LCBzZWNyZXRLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogY2lwaGVydGV4dCAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0Y2lwaGVydGV4dCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGNpcGhlcnRleHQsIFwiY2lwaGVydGV4dFwiKTtcblx0XHR2YXIgY2lwaGVydGV4dF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhjaXBoZXJ0ZXh0KSxcblx0XHQgICAgY2lwaGVydGV4dF9sZW5ndGggPSBjaXBoZXJ0ZXh0Lmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjaXBoZXJ0ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1hYyAoYnVmKVxuXHRcdFxuXHRcdG1hYyA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1hYywgXCJtYWNcIik7XG5cdFx0dmFyIG1hY19hZGRyZXNzLCBtYWNfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9tYWNieXRlcygpKSB8IDA7XG5cdFx0aWYgKG1hYy5sZW5ndGggIT09IG1hY19sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIG1hYyBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG1hY19hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtYWMpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1hY19hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfcHVibGlja2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNLZXkubGVuZ3RoICE9PSBwdWJsaWNLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc2VjcmV0S2V5IChidWYpXG5cdFx0XG5cdFx0c2VjcmV0S2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgc2VjcmV0S2V5LCBcInNlY3JldEtleVwiKTtcblx0XHR2YXIgc2VjcmV0S2V5X2FkZHJlc3MsIHNlY3JldEtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X3NlY3JldGtleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gc2VjcmV0S2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgc2VjcmV0S2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0c2VjcmV0S2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHNlY3JldEtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0S2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHBsYWludGV4dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBwbGFpbnRleHRfbGVuZ3RoID0gKGNpcGhlcnRleHRfbGVuZ3RoKSB8IDAsXG5cdFx0ICAgIHBsYWludGV4dCA9IG5ldyBBbGxvY2F0ZWRCdWYocGxhaW50ZXh0X2xlbmd0aCksXG5cdFx0ICAgIHBsYWludGV4dF9hZGRyZXNzID0gcGxhaW50ZXh0LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocGxhaW50ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fYm94X29wZW5fZGV0YWNoZWQocGxhaW50ZXh0X2FkZHJlc3MsIGNpcGhlcnRleHRfYWRkcmVzcywgbWFjX2FkZHJlc3MsIGNpcGhlcnRleHRfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBwdWJsaWNLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChwbGFpbnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2JveF9vcGVuX2Vhc3koY2lwaGVydGV4dCwgbm9uY2UsIHB1YmxpY0tleSwgc2VjcmV0S2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGNpcGhlcnRleHQgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdGNpcGhlcnRleHQgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBjaXBoZXJ0ZXh0LCBcImNpcGhlcnRleHRcIik7XG5cdFx0dmFyIGNpcGhlcnRleHRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoY2lwaGVydGV4dCksXG5cdFx0ICAgIGNpcGhlcnRleHRfbGVuZ3RoID0gY2lwaGVydGV4dC5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY2lwaGVydGV4dF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfcHVibGlja2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNLZXkubGVuZ3RoICE9PSBwdWJsaWNLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc2VjcmV0S2V5IChidWYpXG5cdFx0XG5cdFx0c2VjcmV0S2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgc2VjcmV0S2V5LCBcInNlY3JldEtleVwiKTtcblx0XHR2YXIgc2VjcmV0S2V5X2FkZHJlc3MsIHNlY3JldEtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X3NlY3JldGtleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gc2VjcmV0S2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgc2VjcmV0S2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0c2VjcmV0S2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHNlY3JldEtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2VjcmV0S2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHBsYWludGV4dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBwbGFpbnRleHRfbGVuZ3RoID0gKGNpcGhlcnRleHRfbGVuZ3RoIC0gbGlic29kaXVtLl9jcnlwdG9fYm94X21hY2J5dGVzKCkpIHwgMCxcblx0XHQgICAgcGxhaW50ZXh0ID0gbmV3IEFsbG9jYXRlZEJ1ZihwbGFpbnRleHRfbGVuZ3RoKSxcblx0XHQgICAgcGxhaW50ZXh0X2FkZHJlc3MgPSBwbGFpbnRleHQuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwbGFpbnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19ib3hfb3Blbl9lYXN5KHBsYWludGV4dF9hZGRyZXNzLCBjaXBoZXJ0ZXh0X2FkZHJlc3MsIGNpcGhlcnRleHRfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBwdWJsaWNLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChwbGFpbnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2JveF9vcGVuX2Vhc3lfYWZ0ZXJubShjaXBoZXJ0ZXh0LCBub25jZSwgc2hhcmVkS2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGNpcGhlcnRleHQgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdGNpcGhlcnRleHQgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBjaXBoZXJ0ZXh0LCBcImNpcGhlcnRleHRcIik7XG5cdFx0dmFyIGNpcGhlcnRleHRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoY2lwaGVydGV4dCksXG5cdFx0ICAgIGNpcGhlcnRleHRfbGVuZ3RoID0gY2lwaGVydGV4dC5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY2lwaGVydGV4dF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzaGFyZWRLZXkgKGJ1Zilcblx0XHRcblx0XHRzaGFyZWRLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzaGFyZWRLZXksIFwic2hhcmVkS2V5XCIpO1xuXHRcdHZhciBzaGFyZWRLZXlfYWRkcmVzcywgc2hhcmVkS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfYmVmb3Jlbm1ieXRlcygpKSB8IDA7XG5cdFx0aWYgKHNoYXJlZEtleS5sZW5ndGggIT09IHNoYXJlZEtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHNoYXJlZEtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHNoYXJlZEtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhzaGFyZWRLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHNoYXJlZEtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBwbGFpbnRleHQgKGJ1Zilcblx0XHRcblx0XHR2YXIgcGxhaW50ZXh0X2xlbmd0aCA9IChjaXBoZXJ0ZXh0X2xlbmd0aCAtIGxpYnNvZGl1bS5fY3J5cHRvX2JveF9tYWNieXRlcygpKSB8IDAsXG5cdFx0ICAgIHBsYWludGV4dCA9IG5ldyBBbGxvY2F0ZWRCdWYocGxhaW50ZXh0X2xlbmd0aCksXG5cdFx0ICAgIHBsYWludGV4dF9hZGRyZXNzID0gcGxhaW50ZXh0LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocGxhaW50ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fYm94X29wZW5fZWFzeV9hZnRlcm5tKHBsYWludGV4dF9hZGRyZXNzLCBjaXBoZXJ0ZXh0X2FkZHJlc3MsIGNpcGhlcnRleHRfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBzaGFyZWRLZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KHBsYWludGV4dCwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fYm94X3NlYWwobWVzc2FnZSwgcHVibGljS2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfcHVibGlja2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNLZXkubGVuZ3RoICE9PSBwdWJsaWNLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY2lwaGVydGV4dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBjaXBoZXJ0ZXh0X2xlbmd0aCA9IChtZXNzYWdlX2xlbmd0aCArIGxpYnNvZGl1bS5fY3J5cHRvX2JveF9zZWFsYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBjaXBoZXJ0ZXh0ID0gbmV3IEFsbG9jYXRlZEJ1ZihjaXBoZXJ0ZXh0X2xlbmd0aCksXG5cdFx0ICAgIGNpcGhlcnRleHRfYWRkcmVzcyA9IGNpcGhlcnRleHQuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjaXBoZXJ0ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fYm94X3NlYWwoY2lwaGVydGV4dF9hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBwdWJsaWNLZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGNpcGhlcnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2JveF9zZWFsX29wZW4oY2lwaGVydGV4dCwgcHVibGljS2V5LCBzZWNyZXRLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogY2lwaGVydGV4dCAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0Y2lwaGVydGV4dCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGNpcGhlcnRleHQsIFwiY2lwaGVydGV4dFwiKTtcblx0XHR2YXIgY2lwaGVydGV4dF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhjaXBoZXJ0ZXh0KSxcblx0XHQgICAgY2lwaGVydGV4dF9sZW5ndGggPSBjaXBoZXJ0ZXh0Lmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjaXBoZXJ0ZXh0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHB1YmxpY0tleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHB1YmxpY0tleSwgXCJwdWJsaWNLZXlcIik7XG5cdFx0dmFyIHB1YmxpY0tleV9hZGRyZXNzLCBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKHB1YmxpY0tleS5sZW5ndGggIT09IHB1YmxpY0tleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHB1YmxpY0tleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHB1YmxpY0tleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwdWJsaWNLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHB1YmxpY0tleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWNyZXRLZXkgKGJ1Zilcblx0XHRcblx0XHRzZWNyZXRLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzZWNyZXRLZXksIFwic2VjcmV0S2V5XCIpO1xuXHRcdHZhciBzZWNyZXRLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChzZWNyZXRLZXkubGVuZ3RoICE9PSBzZWNyZXRLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzZWNyZXRLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRzZWNyZXRLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VjcmV0S2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzZWNyZXRLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgcGxhaW50ZXh0IChidWYpXG5cdFx0XG5cdFx0dmFyIHBsYWludGV4dF9sZW5ndGggPSAoY2lwaGVydGV4dF9sZW5ndGggLSBsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VhbGJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcGxhaW50ZXh0ID0gbmV3IEFsbG9jYXRlZEJ1ZihwbGFpbnRleHRfbGVuZ3RoKSxcblx0XHQgICAgcGxhaW50ZXh0X2FkZHJlc3MgPSBwbGFpbnRleHQuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwbGFpbnRleHRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VhbF9vcGVuKHBsYWludGV4dF9hZGRyZXNzLCBjaXBoZXJ0ZXh0X2FkZHJlc3MsIGNpcGhlcnRleHRfbGVuZ3RoLCAwLCBwdWJsaWNLZXlfYWRkcmVzcywgc2VjcmV0S2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChwbGFpbnRleHQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2JveF9zZWVkX2tleXBhaXIoc2VlZCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWVkIChidWYpXG5cdFx0XG5cdFx0c2VlZCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNlZWQsIFwic2VlZFwiKTtcblx0XHR2YXIgc2VlZF9hZGRyZXNzLCBzZWVkX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19ib3hfc2VlZGJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoc2VlZC5sZW5ndGggIT09IHNlZWRfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzZWVkIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0c2VlZF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhzZWVkKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzZWVkX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcygpKSB8IDAsXG5cdFx0ICAgIHB1YmxpY0tleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHVibGljS2V5X2xlbmd0aCksXG5cdFx0ICAgIHB1YmxpY0tleV9hZGRyZXNzID0gcHVibGljS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHByaXZhdGVLZXkgKGJ1Zilcblx0XHRcblx0XHR2YXIgcHJpdmF0ZUtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fYm94X3NlY3JldGtleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHJpdmF0ZUtleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHJpdmF0ZUtleV9sZW5ndGgpLFxuXHRcdCAgICBwcml2YXRlS2V5X2FkZHJlc3MgPSBwcml2YXRlS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2JveF9zZWVkX2tleXBhaXIocHVibGljS2V5X2FkZHJlc3MsIHByaXZhdGVLZXlfYWRkcmVzcywgc2VlZF9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoe3B1YmxpY0tleTogcHVibGljS2V5LCBwcml2YXRlS2V5OiBwcml2YXRlS2V5fSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fZ2VuZXJpY2hhc2goaGFzaF9sZW5ndGgsIG1lc3NhZ2UsIGtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBoYXNoX2xlbmd0aCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgaGFzaF9sZW5ndGgsIFwiaGFzaF9sZW5ndGhcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIGhhc2hfbGVuZ3RoID09PSBcIm51bWJlclwiICYmIChoYXNoX2xlbmd0aCB8IDApID09PSBoYXNoX2xlbmd0aCkgJiYgKGhhc2hfbGVuZ3RoIHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaGFzaF9sZW5ndGggbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5ICh1bnNpemVkX2J1Zl9vcHRpb25hbClcblx0XHRcblx0XHR2YXIga2V5X2FkZHJlc3MgPSBudWxsLCBrZXlfbGVuZ3RoID0gMDtcblx0XHRpZiAoa2V5ICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdFx0a2V5X2xlbmd0aCA9IGtleS5sZW5ndGg7XG5cdFx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IGhhc2ggKGJ1Zilcblx0XHRcblx0XHR2YXIgaGFzaF9sZW5ndGggPSAoaGFzaF9sZW5ndGgpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2dlbmVyaWNoYXNoKGhhc2hfYWRkcmVzcywgaGFzaF9sZW5ndGgsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDAsIGtleV9hZGRyZXNzLCBrZXlfbGVuZ3RoKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoaGFzaCwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fZ2VuZXJpY2hhc2hfZmluYWwoc3RhdGVfYWRkcmVzcywgaGFzaF9sZW5ndGgsIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc3RhdGVfYWRkcmVzcyAoZ2VuZXJpY2hhc2hfc3RhdGVfYWRkcmVzcylcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgc3RhdGVfYWRkcmVzcywgXCJzdGF0ZV9hZGRyZXNzXCIpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGhhc2hfbGVuZ3RoICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBoYXNoX2xlbmd0aCwgXCJoYXNoX2xlbmd0aFwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2YgaGFzaF9sZW5ndGggPT09IFwibnVtYmVyXCIgJiYgKGhhc2hfbGVuZ3RoIHwgMCkgPT09IGhhc2hfbGVuZ3RoKSAmJiAoaGFzaF9sZW5ndGggfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJoYXNoX2xlbmd0aCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IGhhc2ggKGJ1Zilcblx0XHRcblx0XHR2YXIgaGFzaF9sZW5ndGggPSAoaGFzaF9sZW5ndGgpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2dlbmVyaWNoYXNoX2ZpbmFsKHN0YXRlX2FkZHJlc3MsIGhhc2hfYWRkcmVzcywgaGFzaF9sZW5ndGgpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSAobGlic29kaXVtLl9mcmVlKHN0YXRlX2FkZHJlc3MpLCBfZm9ybWF0X291dHB1dChoYXNoLCBvdXRwdXRGb3JtYXQpKTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fZ2VuZXJpY2hhc2hfaW5pdChrZXksIGhhc2hfbGVuZ3RoLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGtleSAodW5zaXplZF9idWZfb3B0aW9uYWwpXG5cdFx0XG5cdFx0dmFyIGtleV9hZGRyZXNzID0gbnVsbCwga2V5X2xlbmd0aCA9IDA7XG5cdFx0aWYgKGtleSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdGtleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIGtleSwgXCJrZXlcIik7XG5cdFx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRcdGtleV9sZW5ndGggPSBrZXkubGVuZ3RoO1xuXHRcdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBoYXNoX2xlbmd0aCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgaGFzaF9sZW5ndGgsIFwiaGFzaF9sZW5ndGhcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIGhhc2hfbGVuZ3RoID09PSBcIm51bWJlclwiICYmIChoYXNoX2xlbmd0aCB8IDApID09PSBoYXNoX2xlbmd0aCkgJiYgKGhhc2hfbGVuZ3RoIHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaGFzaF9sZW5ndGggbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBzdGF0ZSAoZ2VuZXJpY2hhc2hfc3RhdGUpXG5cdFx0XG5cdFx0dmFyIHN0YXRlX2FkZHJlc3MgPSBuZXcgQWxsb2NhdGVkQnVmKDM1NykuYWRkcmVzcztcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2dlbmVyaWNoYXNoX2luaXQoc3RhdGVfYWRkcmVzcywga2V5X2FkZHJlc3MsIGtleV9sZW5ndGgsIGhhc2hfbGVuZ3RoKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gc3RhdGVfYWRkcmVzcztcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fZ2VuZXJpY2hhc2hfdXBkYXRlKHN0YXRlX2FkZHJlc3MsIG1lc3NhZ2VfY2h1bmssIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc3RhdGVfYWRkcmVzcyAoZ2VuZXJpY2hhc2hfc3RhdGVfYWRkcmVzcylcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgc3RhdGVfYWRkcmVzcywgXCJzdGF0ZV9hZGRyZXNzXCIpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2VfY2h1bmsgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2VfY2h1bmsgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlX2NodW5rLCBcIm1lc3NhZ2VfY2h1bmtcIik7XG5cdFx0dmFyIG1lc3NhZ2VfY2h1bmtfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZV9jaHVuayksXG5cdFx0ICAgIG1lc3NhZ2VfY2h1bmtfbGVuZ3RoID0gbWVzc2FnZV9jaHVuay5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9jaHVua19hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2dlbmVyaWNoYXNoX3VwZGF0ZShzdGF0ZV9hZGRyZXNzLCBtZXNzYWdlX2NodW5rX2FkZHJlc3MsIG1lc3NhZ2VfY2h1bmtfbGVuZ3RoKSB8IDApID09PSAwKSB7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9faGFzaChtZXNzYWdlLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBoYXNoIChidWYpXG5cdFx0XG5cdFx0dmFyIGhhc2hfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2hhc2hfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBoYXNoID0gbmV3IEFsbG9jYXRlZEJ1ZihoYXNoX2xlbmd0aCksXG5cdFx0ICAgIGhhc2hfYWRkcmVzcyA9IGhhc2guYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9faGFzaChoYXNoX2FkZHJlc3MsIG1lc3NhZ2VfYWRkcmVzcywgbWVzc2FnZV9sZW5ndGgsIDApIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChoYXNoLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19oYXNoX3NoYTI1NihtZXNzYWdlLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBoYXNoIChidWYpXG5cdFx0XG5cdFx0dmFyIGhhc2hfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX2hhc2hfc2hhMjU2X2J5dGVzKCkpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX2hhc2hfc2hhMjU2KGhhc2hfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCkgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGhhc2gsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX2hhc2hfc2hhNTEyKG1lc3NhZ2UsIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbWVzc2FnZSAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0bWVzc2FnZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1lc3NhZ2UsIFwibWVzc2FnZVwiKTtcblx0XHR2YXIgbWVzc2FnZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtZXNzYWdlKSxcblx0XHQgICAgbWVzc2FnZV9sZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtZXNzYWdlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IGhhc2ggKGJ1Zilcblx0XHRcblx0XHR2YXIgaGFzaF9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9faGFzaF9zaGE1MTJfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBoYXNoID0gbmV3IEFsbG9jYXRlZEJ1ZihoYXNoX2xlbmd0aCksXG5cdFx0ICAgIGhhc2hfYWRkcmVzcyA9IGhhc2guYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9faGFzaF9zaGE1MTIoaGFzaF9hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoaGFzaCwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fb25ldGltZWF1dGgobWVzc2FnZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19vbmV0aW1lYXV0aF9rZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGtleS5sZW5ndGggIT09IGtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBoYXNoIChidWYpXG5cdFx0XG5cdFx0dmFyIGhhc2hfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoKGhhc2hfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwga2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChoYXNoLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19vbmV0aW1lYXV0aF9maW5hbChzdGF0ZV9hZGRyZXNzLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHN0YXRlX2FkZHJlc3MgKG9uZXRpbWVhdXRoX3N0YXRlX2FkZHJlc3MpXG5cdFx0XG5cdFx0X3JlcXVpcmVfZGVmaW5lZChhZGRyZXNzX3Bvb2wsIHN0YXRlX2FkZHJlc3MsIFwic3RhdGVfYWRkcmVzc1wiKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBoYXNoIChidWYpXG5cdFx0XG5cdFx0dmFyIGhhc2hfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgaGFzaCA9IG5ldyBBbGxvY2F0ZWRCdWYoaGFzaF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoX2FkZHJlc3MgPSBoYXNoLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goaGFzaF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoX2ZpbmFsKHN0YXRlX2FkZHJlc3MsIGhhc2hfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IChsaWJzb2RpdW0uX2ZyZWUoc3RhdGVfYWRkcmVzcyksIF9mb3JtYXRfb3V0cHV0KGhhc2gsIG91dHB1dEZvcm1hdCkpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19vbmV0aW1lYXV0aF9pbml0KGtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKHVuc2l6ZWRfYnVmX29wdGlvbmFsKVxuXHRcdFxuXHRcdHZhciBrZXlfYWRkcmVzcyA9IG51bGwsIGtleV9sZW5ndGggPSAwO1xuXHRcdGlmIChrZXkgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0XHRrZXlfbGVuZ3RoID0ga2V5Lmxlbmd0aDtcblx0XHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgc3RhdGUgKG9uZXRpbWVhdXRoX3N0YXRlKVxuXHRcdFxuXHRcdHZhciBzdGF0ZV9hZGRyZXNzID0gbmV3IEFsbG9jYXRlZEJ1ZigxNDQpLmFkZHJlc3M7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19vbmV0aW1lYXV0aF9pbml0KHN0YXRlX2FkZHJlc3MsIGtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gc3RhdGVfYWRkcmVzcztcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fb25ldGltZWF1dGhfdXBkYXRlKHN0YXRlX2FkZHJlc3MsIG1lc3NhZ2VfY2h1bmssIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc3RhdGVfYWRkcmVzcyAob25ldGltZWF1dGhfc3RhdGVfYWRkcmVzcylcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgc3RhdGVfYWRkcmVzcywgXCJzdGF0ZV9hZGRyZXNzXCIpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2VfY2h1bmsgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2VfY2h1bmsgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlX2NodW5rLCBcIm1lc3NhZ2VfY2h1bmtcIik7XG5cdFx0dmFyIG1lc3NhZ2VfY2h1bmtfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZV9jaHVuayksXG5cdFx0ICAgIG1lc3NhZ2VfY2h1bmtfbGVuZ3RoID0gbWVzc2FnZV9jaHVuay5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9jaHVua19hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoX3VwZGF0ZShzdGF0ZV9hZGRyZXNzLCBtZXNzYWdlX2NodW5rX2FkZHJlc3MsIG1lc3NhZ2VfY2h1bmtfbGVuZ3RoKSB8IDApID09PSAwKSB7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5KGhhc2gsIG1lc3NhZ2UsIGtleSkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGhhc2ggKGJ1Zilcblx0XHRcblx0XHRoYXNoID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgaGFzaCwgXCJoYXNoXCIpO1xuXHRcdHZhciBoYXNoX2FkZHJlc3MsIGhhc2hfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX29uZXRpbWVhdXRoX2J5dGVzKCkpIHwgMDtcblx0XHRpZiAoaGFzaC5sZW5ndGggIT09IGhhc2hfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBoYXNoIGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0aGFzaF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhoYXNoKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19vbmV0aW1lYXV0aF9rZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGtleS5sZW5ndGggIT09IGtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhrZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGtleV9hZGRyZXNzKTtcblx0XHRcblx0XHR2YXIgcmVzdWx0ID0gbGlic29kaXVtLl9jcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5KGhhc2hfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwga2V5X2FkZHJlc3MpIHwgMDtcblx0XHR2YXIgcmV0ID0gKHJlc3VsdCA9PT0gMCk7XG5cdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0cmV0dXJuIHJldDtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTYocGFzc3dvcmQsIHNhbHQsIG9wc0xpbWl0LCBtZW1MaW1pdCwga2V5TGVuZ3RoLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHBhc3N3b3JkICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRwYXNzd29yZCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHBhc3N3b3JkLCBcInBhc3N3b3JkXCIpO1xuXHRcdHZhciBwYXNzd29yZF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwYXNzd29yZCksXG5cdFx0ICAgIHBhc3N3b3JkX2xlbmd0aCA9IHBhc3N3b3JkLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwYXNzd29yZF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzYWx0IChidWYpXG5cdFx0XG5cdFx0c2FsdCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNhbHQsIFwic2FsdFwiKTtcblx0XHR2YXIgc2FsdF9hZGRyZXNzLCBzYWx0X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc2FsdGJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoc2FsdC5sZW5ndGggIT09IHNhbHRfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzYWx0IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0c2FsdF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhzYWx0KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzYWx0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG9wc0xpbWl0ICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBvcHNMaW1pdCwgXCJvcHNMaW1pdFwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2Ygb3BzTGltaXQgPT09IFwibnVtYmVyXCIgJiYgKG9wc0xpbWl0IHwgMCkgPT09IG9wc0xpbWl0KSAmJiAob3BzTGltaXQgfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJvcHNMaW1pdCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lbUxpbWl0ICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBtZW1MaW1pdCwgXCJtZW1MaW1pdFwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2YgbWVtTGltaXQgPT09IFwibnVtYmVyXCIgJiYgKG1lbUxpbWl0IHwgMCkgPT09IG1lbUxpbWl0KSAmJiAobWVtTGltaXQgfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJtZW1MaW1pdCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGtleUxlbmd0aCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwga2V5TGVuZ3RoLCBcImtleUxlbmd0aFwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2Yga2V5TGVuZ3RoID09PSBcIm51bWJlclwiICYmIChrZXlMZW5ndGggfCAwKSA9PT0ga2V5TGVuZ3RoKSAmJiAoa2V5TGVuZ3RoIHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwia2V5TGVuZ3RoIG11c3QgYmUgYW4gdW5zaWduZWQgaW50ZWdlclwiKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgZGVyaXZlZEtleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBkZXJpdmVkS2V5X2xlbmd0aCA9IChrZXlMZW5ndGgpIHwgMCxcblx0XHQgICAgZGVyaXZlZEtleSA9IG5ldyBBbGxvY2F0ZWRCdWYoZGVyaXZlZEtleV9sZW5ndGgpLFxuXHRcdCAgICBkZXJpdmVkS2V5X2FkZHJlc3MgPSBkZXJpdmVkS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goZGVyaXZlZEtleV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1NihkZXJpdmVkS2V5X2FkZHJlc3MsIGtleUxlbmd0aCwgMCwgcGFzc3dvcmRfYWRkcmVzcywgcGFzc3dvcmRfbGVuZ3RoLCAwLCBzYWx0X2FkZHJlc3MsIG9wc0xpbWl0LCAwLCBtZW1MaW1pdCkgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGRlcml2ZWRLZXksIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9sbChwYXNzd29yZCwgc2FsdCwgb3BzTGltaXQsIHIsIHAsIGtleUxlbmd0aCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwYXNzd29yZCAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0cGFzc3dvcmQgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwYXNzd29yZCwgXCJwYXNzd29yZFwiKTtcblx0XHR2YXIgcGFzc3dvcmRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocGFzc3dvcmQpLFxuXHRcdCAgICBwYXNzd29yZF9sZW5ndGggPSBwYXNzd29yZC5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocGFzc3dvcmRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogc2FsdCAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0c2FsdCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNhbHQsIFwic2FsdFwiKTtcblx0XHR2YXIgc2FsdF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhzYWx0KSxcblx0XHQgICAgc2FsdF9sZW5ndGggPSBzYWx0Lmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzYWx0X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG9wc0xpbWl0ICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBvcHNMaW1pdCwgXCJvcHNMaW1pdFwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2Ygb3BzTGltaXQgPT09IFwibnVtYmVyXCIgJiYgKG9wc0xpbWl0IHwgMCkgPT09IG9wc0xpbWl0KSAmJiAob3BzTGltaXQgfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJvcHNMaW1pdCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHIgKHVpbnQpXG5cdFx0XG5cdFx0X3JlcXVpcmVfZGVmaW5lZChhZGRyZXNzX3Bvb2wsIHIsIFwiclwiKTtcblx0XHRcblx0XHRpZiAoISh0eXBlb2YgciA9PT0gXCJudW1iZXJcIiAmJiAociB8IDApID09PSByKSAmJiAociB8IDApID4gMCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcInIgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBwLCBcInBcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIHAgPT09IFwibnVtYmVyXCIgJiYgKHAgfCAwKSA9PT0gcCkgJiYgKHAgfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJwIG11c3QgYmUgYW4gdW5zaWduZWQgaW50ZWdlclwiKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5TGVuZ3RoICh1aW50KVxuXHRcdFxuXHRcdF9yZXF1aXJlX2RlZmluZWQoYWRkcmVzc19wb29sLCBrZXlMZW5ndGgsIFwia2V5TGVuZ3RoXCIpO1xuXHRcdFxuXHRcdGlmICghKHR5cGVvZiBrZXlMZW5ndGggPT09IFwibnVtYmVyXCIgJiYgKGtleUxlbmd0aCB8IDApID09PSBrZXlMZW5ndGgpICYmIChrZXlMZW5ndGggfCAwKSA+IDApIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJrZXlMZW5ndGggbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBkZXJpdmVkS2V5IChidWYpXG5cdFx0XG5cdFx0dmFyIGRlcml2ZWRLZXlfbGVuZ3RoID0gKGtleUxlbmd0aCkgfCAwLFxuXHRcdCAgICBkZXJpdmVkS2V5ID0gbmV3IEFsbG9jYXRlZEJ1ZihkZXJpdmVkS2V5X2xlbmd0aCksXG5cdFx0ICAgIGRlcml2ZWRLZXlfYWRkcmVzcyA9IGRlcml2ZWRLZXkuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChkZXJpdmVkS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X2xsKHBhc3N3b3JkX2FkZHJlc3MsIHBhc3N3b3JkX2xlbmd0aCwgc2FsdF9hZGRyZXNzLCBzYWx0X2xlbmd0aCwgb3BzTGltaXQsIDAsIHIsIHAsIGRlcml2ZWRLZXlfYWRkcmVzcywga2V5TGVuZ3RoKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoZGVyaXZlZEtleSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cihwYXNzd29yZCwgb3BzTGltaXQsIG1lbUxpbWl0LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHBhc3N3b3JkICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRwYXNzd29yZCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHBhc3N3b3JkLCBcInBhc3N3b3JkXCIpO1xuXHRcdHZhciBwYXNzd29yZF9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwYXNzd29yZCksXG5cdFx0ICAgIHBhc3N3b3JkX2xlbmd0aCA9IHBhc3N3b3JkLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwYXNzd29yZF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBvcHNMaW1pdCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgb3BzTGltaXQsIFwib3BzTGltaXRcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIG9wc0xpbWl0ID09PSBcIm51bWJlclwiICYmIChvcHNMaW1pdCB8IDApID09PSBvcHNMaW1pdCkgJiYgKG9wc0xpbWl0IHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwib3BzTGltaXQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZW1MaW1pdCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgbWVtTGltaXQsIFwibWVtTGltaXRcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIG1lbUxpbWl0ID09PSBcIm51bWJlclwiICYmIChtZW1MaW1pdCB8IDApID09PSBtZW1MaW1pdCkgJiYgKG1lbUxpbWl0IHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwibWVtTGltaXQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBoYXNoZWRfcGFzc3dvcmQgKGJ1Zilcblx0XHRcblx0XHR2YXIgaGFzaGVkX3Bhc3N3b3JkX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBoYXNoZWRfcGFzc3dvcmQgPSBuZXcgQWxsb2NhdGVkQnVmKGhhc2hlZF9wYXNzd29yZF9sZW5ndGgpLFxuXHRcdCAgICBoYXNoZWRfcGFzc3dvcmRfYWRkcmVzcyA9IGhhc2hlZF9wYXNzd29yZC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGhhc2hlZF9wYXNzd29yZF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHIoaGFzaGVkX3Bhc3N3b3JkX2FkZHJlc3MsIHBhc3N3b3JkX2FkZHJlc3MsIHBhc3N3b3JkX2xlbmd0aCwgMCwgb3BzTGltaXQsIDAsIG1lbUxpbWl0KSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gbGlic29kaXVtLlBvaW50ZXJfc3RyaW5naWZ5KGhhc2hlZF9wYXNzd29yZF9hZGRyZXNzKTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cl92ZXJpZnkoaGFzaGVkX3Bhc3N3b3JkLCBwYXNzd29yZCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBoYXNoZWRfcGFzc3dvcmQgKHN0cmluZylcblx0XHRcblx0XHRoYXNoZWRfcGFzc3dvcmQgPSBmcm9tX3N0cmluZyhoYXNoZWRfcGFzc3dvcmQgKyBcIlxcMFwiKTtcblx0XHR2YXIgaGFzaGVkX3Bhc3N3b3JkX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGhhc2hlZF9wYXNzd29yZCksXG5cdFx0ICAgIGhhc2hlZF9wYXNzd29yZF9sZW5ndGggPSBoYXNoZWRfcGFzc3dvcmQubGVuZ3RoIC0gMTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoZWRfcGFzc3dvcmRfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogcGFzc3dvcmQgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdHBhc3N3b3JkID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgcGFzc3dvcmQsIFwicGFzc3dvcmRcIik7XG5cdFx0dmFyIHBhc3N3b3JkX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHBhc3N3b3JkKSxcblx0XHQgICAgcGFzc3dvcmRfbGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHBhc3N3b3JkX2FkZHJlc3MpO1xuXHRcdFxuXHRcdHZhciByZXN1bHQgPSBsaWJzb2RpdW0uX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyX3ZlcmlmeShoYXNoZWRfcGFzc3dvcmRfYWRkcmVzcywgcGFzc3dvcmRfYWRkcmVzcywgcGFzc3dvcmRfbGVuZ3RoLCAwKSB8IDA7XG5cdFx0dmFyIHJldCA9IChyZXN1bHQgPT09IDApO1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHJldHVybiByZXQ7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2NhbGFybXVsdChwcml2YXRlS2V5LCBwdWJsaWNLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogcHJpdmF0ZUtleSAoYnVmKVxuXHRcdFxuXHRcdHByaXZhdGVLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwcml2YXRlS2V5LCBcInByaXZhdGVLZXlcIik7XG5cdFx0dmFyIHByaXZhdGVLZXlfYWRkcmVzcywgcHJpdmF0ZUtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2NhbGFybXVsdF9zY2FsYXJieXRlcygpKSB8IDA7XG5cdFx0aWYgKHByaXZhdGVLZXkubGVuZ3RoICE9PSBwcml2YXRlS2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHJpdmF0ZUtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHByaXZhdGVLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHJpdmF0ZUtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zY2FsYXJtdWx0X3NjYWxhcmJ5dGVzKCkpIHwgMDtcblx0XHRpZiAocHVibGljS2V5Lmxlbmd0aCAhPT0gcHVibGljS2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHVibGljS2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0cHVibGljS2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHB1YmxpY0tleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHNoYXJlZFNlY3JldCAoYnVmKVxuXHRcdFxuXHRcdHZhciBzaGFyZWRTZWNyZXRfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NjYWxhcm11bHRfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBzaGFyZWRTZWNyZXQgPSBuZXcgQWxsb2NhdGVkQnVmKHNoYXJlZFNlY3JldF9sZW5ndGgpLFxuXHRcdCAgICBzaGFyZWRTZWNyZXRfYWRkcmVzcyA9IHNoYXJlZFNlY3JldC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHNoYXJlZFNlY3JldF9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NjYWxhcm11bHQoc2hhcmVkU2VjcmV0X2FkZHJlc3MsIHByaXZhdGVLZXlfYWRkcmVzcywgcHVibGljS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChzaGFyZWRTZWNyZXQsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX3NjYWxhcm11bHRfYmFzZShwcml2YXRlS2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHByaXZhdGVLZXkgKGJ1Zilcblx0XHRcblx0XHRwcml2YXRlS2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgcHJpdmF0ZUtleSwgXCJwcml2YXRlS2V5XCIpO1xuXHRcdHZhciBwcml2YXRlS2V5X2FkZHJlc3MsIHByaXZhdGVLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NjYWxhcm11bHRfc2NhbGFyYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwcml2YXRlS2V5Lmxlbmd0aCAhPT0gcHJpdmF0ZUtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHByaXZhdGVLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwcml2YXRlS2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHByaXZhdGVLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHByaXZhdGVLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgcHVibGljS2V5IChidWYpXG5cdFx0XG5cdFx0dmFyIHB1YmxpY0tleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2NhbGFybXVsdF9zY2FsYXJieXRlcygpKSB8IDAsXG5cdFx0ICAgIHB1YmxpY0tleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHVibGljS2V5X2xlbmd0aCksXG5cdFx0ICAgIHB1YmxpY0tleV9hZGRyZXNzID0gcHVibGljS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fc2NhbGFybXVsdF9iYXNlKHB1YmxpY0tleV9hZGRyZXNzLCBwcml2YXRlS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChwdWJsaWNLZXksIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX3NlY3JldGJveF9kZXRhY2hlZChtZXNzYWdlLCBub25jZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY2lwaGVyIChidWYpXG5cdFx0XG5cdFx0dmFyIGNpcGhlcl9sZW5ndGggPSAobWVzc2FnZV9sZW5ndGgpIHwgMCxcblx0XHQgICAgY2lwaGVyID0gbmV3IEFsbG9jYXRlZEJ1ZihjaXBoZXJfbGVuZ3RoKSxcblx0XHQgICAgY2lwaGVyX2FkZHJlc3MgPSBjaXBoZXIuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjaXBoZXJfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgbWFjIChidWYpXG5cdFx0XG5cdFx0dmFyIG1hY19sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2VjcmV0Ym94X21hY2J5dGVzKCkpIHwgMCxcblx0XHQgICAgbWFjID0gbmV3IEFsbG9jYXRlZEJ1ZihtYWNfbGVuZ3RoKSxcblx0XHQgICAgbWFjX2FkZHJlc3MgPSBtYWMuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtYWNfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfZGV0YWNoZWQoY2lwaGVyX2FkZHJlc3MsIG1hY19hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBrZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KHttYWM6IG1hYywgY2lwaGVyOiBjaXBoZXJ9LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zZWNyZXRib3hfZWFzeShtZXNzYWdlLCBub25jZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY2lwaGVyIChidWYpXG5cdFx0XG5cdFx0dmFyIGNpcGhlcl9sZW5ndGggPSAobWVzc2FnZV9sZW5ndGggKyBsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfbWFjYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBjaXBoZXIgPSBuZXcgQWxsb2NhdGVkQnVmKGNpcGhlcl9sZW5ndGgpLFxuXHRcdCAgICBjaXBoZXJfYWRkcmVzcyA9IGNpcGhlci5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGNpcGhlcl9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NlY3JldGJveF9lYXN5KGNpcGhlcl9hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBub25jZV9hZGRyZXNzLCBrZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGNpcGhlciwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2VjcmV0Ym94X29wZW5fZGV0YWNoZWQoY2lwaGVydGV4dCwgbWFjLCBub25jZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGNpcGhlcnRleHQgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdGNpcGhlcnRleHQgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBjaXBoZXJ0ZXh0LCBcImNpcGhlcnRleHRcIik7XG5cdFx0dmFyIGNpcGhlcnRleHRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoY2lwaGVydGV4dCksXG5cdFx0ICAgIGNpcGhlcnRleHRfbGVuZ3RoID0gY2lwaGVydGV4dC5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY2lwaGVydGV4dF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtYWMgKGJ1Zilcblx0XHRcblx0XHRtYWMgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtYWMsIFwibWFjXCIpO1xuXHRcdHZhciBtYWNfYWRkcmVzcywgbWFjX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfbWFjYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChtYWMubGVuZ3RoICE9PSBtYWNfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBtYWMgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRtYWNfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWFjKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtYWNfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbm9uY2UgKGJ1Zilcblx0XHRcblx0XHRub25jZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG5vbmNlLCBcIm5vbmNlXCIpO1xuXHRcdHZhciBub25jZV9hZGRyZXNzLCBub25jZV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2VjcmV0Ym94X25vbmNlYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChub25jZS5sZW5ndGggIT09IG5vbmNlX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgbm9uY2UgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRub25jZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhub25jZSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobm9uY2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDoga2V5IChidWYpXG5cdFx0XG5cdFx0a2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwga2V5LCBcImtleVwiKTtcblx0XHR2YXIga2V5X2FkZHJlc3MsIGtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2VjcmV0Ym94X2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAoa2V5Lmxlbmd0aCAhPT0ga2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQga2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0a2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goa2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IG1lc3NhZ2UgKGJ1Zilcblx0XHRcblx0XHR2YXIgbWVzc2FnZV9sZW5ndGggPSAoY2lwaGVydGV4dF9sZW5ndGgpIHwgMCxcblx0XHQgICAgbWVzc2FnZSA9IG5ldyBBbGxvY2F0ZWRCdWYobWVzc2FnZV9sZW5ndGgpLFxuXHRcdCAgICBtZXNzYWdlX2FkZHJlc3MgPSBtZXNzYWdlLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NlY3JldGJveF9vcGVuX2RldGFjaGVkKG1lc3NhZ2VfYWRkcmVzcywgY2lwaGVydGV4dF9hZGRyZXNzLCBtYWNfYWRkcmVzcywgY2lwaGVydGV4dF9sZW5ndGgsIDAsIG5vbmNlX2FkZHJlc3MsIGtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQobWVzc2FnZSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2VjcmV0Ym94X29wZW5fZWFzeShjaXBoZXJ0ZXh0LCBub25jZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGNpcGhlcnRleHQgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdGNpcGhlcnRleHQgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBjaXBoZXJ0ZXh0LCBcImNpcGhlcnRleHRcIik7XG5cdFx0dmFyIGNpcGhlcnRleHRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoY2lwaGVydGV4dCksXG5cdFx0ICAgIGNpcGhlcnRleHRfbGVuZ3RoID0gY2lwaGVydGV4dC5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY2lwaGVydGV4dF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBub25jZSAoYnVmKVxuXHRcdFxuXHRcdG5vbmNlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbm9uY2UsIFwibm9uY2VcIik7XG5cdFx0dmFyIG5vbmNlX2FkZHJlc3MsIG5vbmNlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfbm9uY2VieXRlcygpKSB8IDA7XG5cdFx0aWYgKG5vbmNlLmxlbmd0aCAhPT0gbm9uY2VfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBub25jZSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdG5vbmNlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG5vbmNlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChub25jZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgbWVzc2FnZSAoYnVmKVxuXHRcdFxuXHRcdHZhciBtZXNzYWdlX2xlbmd0aCA9IChjaXBoZXJ0ZXh0X2xlbmd0aCAtIGxpYnNvZGl1bS5fY3J5cHRvX3NlY3JldGJveF9tYWNieXRlcygpKSB8IDAsXG5cdFx0ICAgIG1lc3NhZ2UgPSBuZXcgQWxsb2NhdGVkQnVmKG1lc3NhZ2VfbGVuZ3RoKSxcblx0XHQgICAgbWVzc2FnZV9hZGRyZXNzID0gbWVzc2FnZS5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zZWNyZXRib3hfb3Blbl9lYXN5KG1lc3NhZ2VfYWRkcmVzcywgY2lwaGVydGV4dF9hZGRyZXNzLCBjaXBoZXJ0ZXh0X2xlbmd0aCwgMCwgbm9uY2VfYWRkcmVzcywga2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChtZXNzYWdlLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaG9ydGhhc2gobWVzc2FnZSwga2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IG1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdG1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBtZXNzYWdlLCBcIm1lc3NhZ2VcIik7XG5cdFx0dmFyIG1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MobWVzc2FnZSksXG5cdFx0ICAgIG1lc3NhZ2VfbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBrZXkgKGJ1Zilcblx0XHRcblx0XHRrZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBrZXksIFwia2V5XCIpO1xuXHRcdHZhciBrZXlfYWRkcmVzcywga2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaG9ydGhhc2hfa2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChrZXkubGVuZ3RoICE9PSBrZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBrZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRrZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moa2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChrZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgaGFzaCAoYnVmKVxuXHRcdFxuXHRcdHZhciBoYXNoX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaG9ydGhhc2hfYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBoYXNoID0gbmV3IEFsbG9jYXRlZEJ1ZihoYXNoX2xlbmd0aCksXG5cdFx0ICAgIGhhc2hfYWRkcmVzcyA9IGhhc2guYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChoYXNoX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fc2hvcnRoYXNoKGhhc2hfYWRkcmVzcywgbWVzc2FnZV9hZGRyZXNzLCBtZXNzYWdlX2xlbmd0aCwgMCwga2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChoYXNoLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaWduKG1lc3NhZ2UsIHByaXZhdGVLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbWVzc2FnZSAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0bWVzc2FnZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1lc3NhZ2UsIFwibWVzc2FnZVwiKTtcblx0XHR2YXIgbWVzc2FnZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtZXNzYWdlKSxcblx0XHQgICAgbWVzc2FnZV9sZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtZXNzYWdlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHByaXZhdGVLZXkgKGJ1Zilcblx0XHRcblx0XHRwcml2YXRlS2V5ID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgcHJpdmF0ZUtleSwgXCJwcml2YXRlS2V5XCIpO1xuXHRcdHZhciBwcml2YXRlS2V5X2FkZHJlc3MsIHByaXZhdGVLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fc2VjcmV0a2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwcml2YXRlS2V5Lmxlbmd0aCAhPT0gcHJpdmF0ZUtleV9sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIHByaXZhdGVLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwcml2YXRlS2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHByaXZhdGVLZXkpO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKHByaXZhdGVLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgc2lnbmF0dXJlIChidWYpXG5cdFx0XG5cdFx0dmFyIHNpZ25hdHVyZV9sZW5ndGggPSAobWVzc2FnZS5sZW5ndGggKyBsaWJzb2RpdW0uX2NyeXB0b19zaWduX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgc2lnbmF0dXJlID0gbmV3IEFsbG9jYXRlZEJ1ZihzaWduYXR1cmVfbGVuZ3RoKSxcblx0XHQgICAgc2lnbmF0dXJlX2FkZHJlc3MgPSBzaWduYXR1cmUuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzaWduYXR1cmVfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zaWduKHNpZ25hdHVyZV9hZGRyZXNzLCBudWxsLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBwcml2YXRlS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChzaWduYXR1cmUsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX3NpZ25fZGV0YWNoZWQobWVzc2FnZSwgcHJpdmF0ZUtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBtZXNzYWdlICh1bnNpemVkX2J1Zilcblx0XHRcblx0XHRtZXNzYWdlID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgbWVzc2FnZSwgXCJtZXNzYWdlXCIpO1xuXHRcdHZhciBtZXNzYWdlX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKG1lc3NhZ2UpLFxuXHRcdCAgICBtZXNzYWdlX2xlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG1lc3NhZ2VfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogcHJpdmF0ZUtleSAoYnVmKVxuXHRcdFxuXHRcdHByaXZhdGVLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwcml2YXRlS2V5LCBcInByaXZhdGVLZXlcIik7XG5cdFx0dmFyIHByaXZhdGVLZXlfYWRkcmVzcywgcHJpdmF0ZUtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2lnbl9zZWNyZXRrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKHByaXZhdGVLZXkubGVuZ3RoICE9PSBwcml2YXRlS2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHJpdmF0ZUtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHByaXZhdGVLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHJpdmF0ZUtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBzaWduYXR1cmUgKGJ1Zilcblx0XHRcblx0XHR2YXIgc2lnbmF0dXJlX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgc2lnbmF0dXJlID0gbmV3IEFsbG9jYXRlZEJ1ZihzaWduYXR1cmVfbGVuZ3RoKSxcblx0XHQgICAgc2lnbmF0dXJlX2FkZHJlc3MgPSBzaWduYXR1cmUuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzaWduYXR1cmVfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zaWduX2RldGFjaGVkKHNpZ25hdHVyZV9hZGRyZXNzLCBudWxsLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBwcml2YXRlS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChzaWduYXR1cmUsIG91dHB1dEZvcm1hdCk7XG5cdFx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gY3J5cHRvX3NpZ25fZWQyNTUxOV9wa190b19jdXJ2ZTI1NTE5KGVkUGssIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogZWRQayAoYnVmKVxuXHRcdFxuXHRcdGVkUGsgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBlZFBrLCBcImVkUGtcIik7XG5cdFx0dmFyIGVkUGtfYWRkcmVzcywgZWRQa19sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2lnbl9wdWJsaWNrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKGVkUGsubGVuZ3RoICE9PSBlZFBrX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgZWRQayBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdGVkUGtfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MoZWRQayk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goZWRQa19hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBjUGsgKGJ1Zilcblx0XHRcblx0XHR2YXIgY1BrX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zY2FsYXJtdWx0X3NjYWxhcmJ5dGVzKCkpIHwgMCxcblx0XHQgICAgY1BrID0gbmV3IEFsbG9jYXRlZEJ1ZihjUGtfbGVuZ3RoKSxcblx0XHQgICAgY1BrX2FkZHJlc3MgPSBjUGsuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChjUGtfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zaWduX2VkMjU1MTlfcGtfdG9fY3VydmUyNTUxOShjUGtfYWRkcmVzcywgZWRQa19hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoY1BrLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaWduX2VkMjU1MTlfc2tfdG9fY3VydmUyNTUxOShlZFNrLCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IGVkU2sgKGJ1Zilcblx0XHRcblx0XHRlZFNrID0gX2FueV90b19VaW50OEFycmF5KGFkZHJlc3NfcG9vbCwgZWRTaywgXCJlZFNrXCIpO1xuXHRcdHZhciBlZFNrX2FkZHJlc3MsIGVkU2tfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fc2VjcmV0a2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChlZFNrLmxlbmd0aCAhPT0gZWRTa19sZW5ndGgpIHtcblx0XHRcdF9mcmVlX2FuZF90aHJvd190eXBlX2Vycm9yKGFkZHJlc3NfcG9vbCwgXCJpbnZhbGlkIGVkU2sgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRlZFNrX2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKGVkU2spO1xuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKGVkU2tfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgY1NrIChidWYpXG5cdFx0XG5cdFx0dmFyIGNTa19sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2NhbGFybXVsdF9zY2FsYXJieXRlcygpKSB8IDAsXG5cdFx0ICAgIGNTayA9IG5ldyBBbGxvY2F0ZWRCdWYoY1NrX2xlbmd0aCksXG5cdFx0ICAgIGNTa19hZGRyZXNzID0gY1NrLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2goY1NrX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX2N1cnZlMjU1MTkoY1NrX2FkZHJlc3MsIGVkU2tfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KGNTaywgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX3BrKHByaXZhdGVLZXksIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogcHJpdmF0ZUtleSAoYnVmKVxuXHRcdFxuXHRcdHByaXZhdGVLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwcml2YXRlS2V5LCBcInByaXZhdGVLZXlcIik7XG5cdFx0dmFyIHByaXZhdGVLZXlfYWRkcmVzcywgcHJpdmF0ZUtleV9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2lnbl9zZWNyZXRrZXlieXRlcygpKSB8IDA7XG5cdFx0aWYgKHByaXZhdGVLZXkubGVuZ3RoICE9PSBwcml2YXRlS2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHJpdmF0ZUtleSBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHByaXZhdGVLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHJpdmF0ZUtleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHR2YXIgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHVibGljS2V5ID0gbmV3IEFsbG9jYXRlZEJ1ZihwdWJsaWNLZXlfbGVuZ3RoKSxcblx0XHQgICAgcHVibGljS2V5X2FkZHJlc3MgPSBwdWJsaWNLZXkuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0aWYgKChsaWJzb2RpdW0uX2NyeXB0b19zaWduX2VkMjU1MTlfc2tfdG9fcGsocHVibGljS2V5X2FkZHJlc3MsIHByaXZhdGVLZXlfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KHB1YmxpY0tleSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX3NlZWQocHJpdmF0ZUtleSwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwcml2YXRlS2V5IChidWYpXG5cdFx0XG5cdFx0cHJpdmF0ZUtleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHByaXZhdGVLZXksIFwicHJpdmF0ZUtleVwiKTtcblx0XHR2YXIgcHJpdmF0ZUtleV9hZGRyZXNzLCBwcml2YXRlS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3NlY3JldGtleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAocHJpdmF0ZUtleS5sZW5ndGggIT09IHByaXZhdGVLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwcml2YXRlS2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0cHJpdmF0ZUtleV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhwcml2YXRlS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwcml2YXRlS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IHNlZWQgKGJ1Zilcblx0XHRcblx0XHR2YXIgc2VlZF9sZW5ndGggPSAobGlic29kaXVtLl9jcnlwdG9fc2lnbl9zZWVkYnl0ZXMoKSkgfCAwLFxuXHRcdCAgICBzZWVkID0gbmV3IEFsbG9jYXRlZEJ1ZihzZWVkX2xlbmd0aCksXG5cdFx0ICAgIHNlZWRfYWRkcmVzcyA9IHNlZWQuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzZWVkX2FkZHJlc3MpO1xuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9jcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX3NlZWQoc2VlZF9hZGRyZXNzLCBwcml2YXRlS2V5X2FkZHJlc3MpIHwgMCkgPT09IDApIHtcblx0XHRcdHZhciByZXQgPSBfZm9ybWF0X291dHB1dChzZWVkLCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaWduX2tleXBhaXIob3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHR2YXIgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHVibGljS2V5ID0gbmV3IEFsbG9jYXRlZEJ1ZihwdWJsaWNLZXlfbGVuZ3RoKSxcblx0XHQgICAgcHVibGljS2V5X2FkZHJlc3MgPSBwdWJsaWNLZXkuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgcHJpdmF0ZUtleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBwcml2YXRlS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3NlY3JldGtleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHJpdmF0ZUtleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHJpdmF0ZUtleV9sZW5ndGgpLFxuXHRcdCAgICBwcml2YXRlS2V5X2FkZHJlc3MgPSBwcml2YXRlS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fa2V5cGFpcihwdWJsaWNLZXlfYWRkcmVzcywgcHJpdmF0ZUtleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQoe3B1YmxpY0tleTogcHVibGljS2V5LCBwcml2YXRlS2V5OiBwcml2YXRlS2V5LCBrZXlUeXBlOiAnZWQyNTUxOSd9LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaWduX29wZW4oc2lnbmVkTWVzc2FnZSwgcHVibGljS2V5LCBvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHNpZ25lZE1lc3NhZ2UgKHVuc2l6ZWRfYnVmKVxuXHRcdFxuXHRcdHNpZ25lZE1lc3NhZ2UgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBzaWduZWRNZXNzYWdlLCBcInNpZ25lZE1lc3NhZ2VcIik7XG5cdFx0dmFyIHNpZ25lZE1lc3NhZ2VfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2lnbmVkTWVzc2FnZSksXG5cdFx0ICAgIHNpZ25lZE1lc3NhZ2VfbGVuZ3RoID0gc2lnbmVkTWVzc2FnZS5sZW5ndGg7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2lnbmVkTWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHRwdWJsaWNLZXkgPSBfYW55X3RvX1VpbnQ4QXJyYXkoYWRkcmVzc19wb29sLCBwdWJsaWNLZXksIFwicHVibGljS2V5XCIpO1xuXHRcdHZhciBwdWJsaWNLZXlfYWRkcmVzcywgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzKCkpIHwgMDtcblx0XHRpZiAocHVibGljS2V5Lmxlbmd0aCAhPT0gcHVibGljS2V5X2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgcHVibGljS2V5IGxlbmd0aFwiKTtcblx0XHR9XG5cdFx0cHVibGljS2V5X2FkZHJlc3MgPSBfdG9fYWxsb2NhdGVkX2J1Zl9hZGRyZXNzKHB1YmxpY0tleSk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHVibGljS2V5X2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IG1lc3NhZ2UgKGJ1Zilcblx0XHRcblx0XHR2YXIgbWVzc2FnZV9sZW5ndGggPSAoc2lnbmVkTWVzc2FnZV9sZW5ndGggLSBsaWJzb2RpdW0uX2NyeXB0b19zaWduX2J5dGVzKCkpIHwgMCxcblx0XHQgICAgbWVzc2FnZSA9IG5ldyBBbGxvY2F0ZWRCdWYobWVzc2FnZV9sZW5ndGgpLFxuXHRcdCAgICBtZXNzYWdlX2FkZHJlc3MgPSBtZXNzYWdlLmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gobWVzc2FnZV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fb3BlbihtZXNzYWdlX2FkZHJlc3MsIG51bGwsIHNpZ25lZE1lc3NhZ2VfYWRkcmVzcywgc2lnbmVkTWVzc2FnZV9sZW5ndGgsIDAsIHB1YmxpY0tleV9hZGRyZXNzKSB8IDApID09PSAwKSB7XG5cdFx0XHR2YXIgcmV0ID0gX2Zvcm1hdF9vdXRwdXQobWVzc2FnZSwgb3V0cHV0Rm9ybWF0KTtcblx0XHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdFx0X2ZyZWVfYW5kX3Rocm93X2Vycm9yKGFkZHJlc3NfcG9vbCk7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiBjcnlwdG9fc2lnbl9zZWVkX2tleXBhaXIoc2VlZCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBzZWVkIChidWYpXG5cdFx0XG5cdFx0c2VlZCA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNlZWQsIFwic2VlZFwiKTtcblx0XHR2YXIgc2VlZF9hZGRyZXNzLCBzZWVkX2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3NlZWRieXRlcygpKSB8IDA7XG5cdFx0aWYgKHNlZWQubGVuZ3RoICE9PSBzZWVkX2xlbmd0aCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImludmFsaWQgc2VlZCBsZW5ndGhcIik7XG5cdFx0fVxuXHRcdHNlZWRfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2VlZCk7XG5cdFx0YWRkcmVzc19wb29sLnB1c2goc2VlZF9hZGRyZXNzKTtcblx0XHRcblx0XHQvLyAtLS0tLS0tLS0tIG91dHB1dCBwdWJsaWNLZXkgKGJ1Zilcblx0XHRcblx0XHR2YXIgcHVibGljS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHVibGljS2V5ID0gbmV3IEFsbG9jYXRlZEJ1ZihwdWJsaWNLZXlfbGVuZ3RoKSxcblx0XHQgICAgcHVibGljS2V5X2FkZHJlc3MgPSBwdWJsaWNLZXkuYWRkcmVzcztcblx0XHRcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBvdXRwdXQgcHJpdmF0ZUtleSAoYnVmKVxuXHRcdFxuXHRcdHZhciBwcml2YXRlS2V5X2xlbmd0aCA9IChsaWJzb2RpdW0uX2NyeXB0b19zaWduX3NlY3JldGtleWJ5dGVzKCkpIHwgMCxcblx0XHQgICAgcHJpdmF0ZUtleSA9IG5ldyBBbGxvY2F0ZWRCdWYocHJpdmF0ZUtleV9sZW5ndGgpLFxuXHRcdCAgICBwcml2YXRlS2V5X2FkZHJlc3MgPSBwcml2YXRlS2V5LmFkZHJlc3M7XG5cdFx0XG5cdFx0YWRkcmVzc19wb29sLnB1c2gocHJpdmF0ZUtleV9hZGRyZXNzKTtcblx0XHRcblx0XHRpZiAoKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fc2VlZF9rZXlwYWlyKHB1YmxpY0tleV9hZGRyZXNzLCBwcml2YXRlS2V5X2FkZHJlc3MsIHNlZWRfYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0dmFyIHJldCA9IF9mb3JtYXRfb3V0cHV0KHtwdWJsaWNLZXk6IHB1YmxpY0tleSwgcHJpdmF0ZUtleTogcHJpdmF0ZUtleSwga2V5VHlwZTogXCJlZDI1NTE5XCJ9LCBvdXRwdXRGb3JtYXQpO1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0XHRfZnJlZV9hbmRfdGhyb3dfZXJyb3IoYWRkcmVzc19wb29sKTtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIGNyeXB0b19zaWduX3ZlcmlmeV9kZXRhY2hlZChzaWduYXR1cmUsIG1lc3NhZ2UsIHB1YmxpY0tleSkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHNpZ25hdHVyZSAoYnVmKVxuXHRcdFxuXHRcdHNpZ25hdHVyZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHNpZ25hdHVyZSwgXCJzaWduYXR1cmVcIik7XG5cdFx0dmFyIHNpZ25hdHVyZV9hZGRyZXNzLCBzaWduYXR1cmVfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fYnl0ZXMoKSkgfCAwO1xuXHRcdGlmIChzaWduYXR1cmUubGVuZ3RoICE9PSBzaWduYXR1cmVfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBzaWduYXR1cmUgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRzaWduYXR1cmVfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3Moc2lnbmF0dXJlKTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChzaWduYXR1cmVfYWRkcmVzcyk7XG5cdFx0XG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogbWVzc2FnZSAodW5zaXplZF9idWYpXG5cdFx0XG5cdFx0bWVzc2FnZSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIG1lc3NhZ2UsIFwibWVzc2FnZVwiKTtcblx0XHR2YXIgbWVzc2FnZV9hZGRyZXNzID0gX3RvX2FsbG9jYXRlZF9idWZfYWRkcmVzcyhtZXNzYWdlKSxcblx0XHQgICAgbWVzc2FnZV9sZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChtZXNzYWdlX2FkZHJlc3MpO1xuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gaW5wdXQ6IHB1YmxpY0tleSAoYnVmKVxuXHRcdFxuXHRcdHB1YmxpY0tleSA9IF9hbnlfdG9fVWludDhBcnJheShhZGRyZXNzX3Bvb2wsIHB1YmxpY0tleSwgXCJwdWJsaWNLZXlcIik7XG5cdFx0dmFyIHB1YmxpY0tleV9hZGRyZXNzLCBwdWJsaWNLZXlfbGVuZ3RoID0gKGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fcHVibGlja2V5Ynl0ZXMoKSkgfCAwO1xuXHRcdGlmIChwdWJsaWNLZXkubGVuZ3RoICE9PSBwdWJsaWNLZXlfbGVuZ3RoKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwiaW52YWxpZCBwdWJsaWNLZXkgbGVuZ3RoXCIpO1xuXHRcdH1cblx0XHRwdWJsaWNLZXlfYWRkcmVzcyA9IF90b19hbGxvY2F0ZWRfYnVmX2FkZHJlc3MocHVibGljS2V5KTtcblx0XHRhZGRyZXNzX3Bvb2wucHVzaChwdWJsaWNLZXlfYWRkcmVzcyk7XG5cdFx0XG5cdFx0dmFyIHZlcmlmaWNhdGlvblJlc3VsdCA9IGxpYnNvZGl1bS5fY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkKHNpZ25hdHVyZV9hZGRyZXNzLCBtZXNzYWdlX2FkZHJlc3MsIG1lc3NhZ2VfbGVuZ3RoLCAwLCBwdWJsaWNLZXlfYWRkcmVzcykgfCAwO1xuXHRcdHZhciByZXQgPSAodmVyaWZpY2F0aW9uUmVzdWx0ID09PSAwKTtcblx0XHRfZnJlZV9hbGwoYWRkcmVzc19wb29sKTtcblx0XHRyZXR1cm4gcmV0O1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gcmFuZG9tYnl0ZXNfYnVmKGxlbmd0aCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiBsZW5ndGggKHVpbnQpXG5cdFx0XG5cdFx0X3JlcXVpcmVfZGVmaW5lZChhZGRyZXNzX3Bvb2wsIGxlbmd0aCwgXCJsZW5ndGhcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiAobGVuZ3RoIHwgMCkgPT09IGxlbmd0aCkgJiYgKGxlbmd0aCB8IDApID4gMCkge1xuXHRcdFx0X2ZyZWVfYW5kX3Rocm93X3R5cGVfZXJyb3IoYWRkcmVzc19wb29sLCBcImxlbmd0aCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVnZXJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIC0tLS0tLS0tLS0gb3V0cHV0IG91dHB1dCAoYnVmKVxuXHRcdFxuXHRcdHZhciBvdXRwdXRfbGVuZ3RoID0gKGxlbmd0aCkgfCAwLFxuXHRcdCAgICBvdXRwdXQgPSBuZXcgQWxsb2NhdGVkQnVmKG91dHB1dF9sZW5ndGgpLFxuXHRcdCAgICBvdXRwdXRfYWRkcmVzcyA9IG91dHB1dC5hZGRyZXNzO1xuXHRcdFxuXHRcdGFkZHJlc3NfcG9vbC5wdXNoKG91dHB1dF9hZGRyZXNzKTtcblx0XHRcblx0XHRsaWJzb2RpdW0uX3JhbmRvbWJ5dGVzX2J1ZihvdXRwdXRfYWRkcmVzcywgbGVuZ3RoKTtcblx0XHR2YXIgcmV0ID0gKF9mb3JtYXRfb3V0cHV0KG91dHB1dCwgb3V0cHV0Rm9ybWF0KSk7XG5cdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0cmV0dXJuIHJldDtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIHJhbmRvbWJ5dGVzX2Nsb3NlKG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0bGlic29kaXVtLl9yYW5kb21ieXRlc19jbG9zZSgpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gcmFuZG9tYnl0ZXNfcmFuZG9tKG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0dmFyIHJhbmRvbV92YWx1ZSA9IGxpYnNvZGl1bS5fcmFuZG9tYnl0ZXNfcmFuZG9tKCkgPj4+IDA7XG5cdFx0dmFyIHJldCA9IChyYW5kb21fdmFsdWUpO1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHJldHVybiByZXQ7XG5cdFx0XG5cdH1cblxuXHRmdW5jdGlvbiByYW5kb21ieXRlc19zZXRfaW1wbGVtZW50YXRpb24oaW1wbGVtZW50YXRpb24sIG91dHB1dEZvcm1hdCkge1xuXHRcdHZhciBhZGRyZXNzX3Bvb2wgPSBbXTtcblx0XHRfY2hlY2tfb3V0cHV0X2Zvcm1hdChvdXRwdXRGb3JtYXQpO1xuXG5cdFx0Ly8gLS0tLS0tLS0tLSBpbnB1dDogaW1wbGVtZW50YXRpb24gKHJhbmRvbWJ5dGVzX2ltcGxlbWVudGF0aW9uKVxuXHRcdFxuXHRcdHZhciBpbXBsZW1lbnRhdGlvbl9hZGRyZXNzID0gbGlic29kaXVtLl9tYWxsb2MoNiAqIDQpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKSB7XG5cdFx0XHRsaWJzb2RpdW0uc2V0VmFsdWUoaW1wbGVtZW50YXRpb25fYWRkcmVzcyArIGkgKiA0LFxuXHRcdFx0ICAgIGxpYnNvZGl1bS5SdW50aW1lLmFkZEZ1bmN0aW9uKGltcGxlbWVudGF0aW9uXG5cdFx0XHQgICAgW1tcImltcGxlbWVudGF0aW9uX25hbWVcIiwgXCJyYW5kb21cIiwgXCJzdGlyXCIsIFwidW5pZm9ybVwiLCBcImJ1ZlwiLCBcImNsb3NlXCJdW2ldXSksXG5cdFx0XHQgICAgXCJpMzJcIik7XG5cdFx0fVxuXHRcdFxuXHRcdGlmICgobGlic29kaXVtLl9yYW5kb21ieXRlc19zZXRfaW1wbGVtZW50YXRpb24oaW1wbGVtZW50YXRpb25fYWRkcmVzcykgfCAwKSA9PT0gMCkge1xuXHRcdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdF9mcmVlX2FuZF90aHJvd19lcnJvcihhZGRyZXNzX3Bvb2wpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gcmFuZG9tYnl0ZXNfc3RpcihvdXRwdXRGb3JtYXQpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cdFx0X2NoZWNrX291dHB1dF9mb3JtYXQob3V0cHV0Rm9ybWF0KTtcblxuXHRcdGxpYnNvZGl1bS5fcmFuZG9tYnl0ZXNfc3RpcigpO1xuXHRcdFxuXHR9XG5cblx0ZnVuY3Rpb24gcmFuZG9tYnl0ZXNfdW5pZm9ybSh1cHBlcl9ib3VuZCwgb3V0cHV0Rm9ybWF0KSB7XG5cdFx0dmFyIGFkZHJlc3NfcG9vbCA9IFtdO1xuXHRcdF9jaGVja19vdXRwdXRfZm9ybWF0KG91dHB1dEZvcm1hdCk7XG5cblx0XHQvLyAtLS0tLS0tLS0tIGlucHV0OiB1cHBlcl9ib3VuZCAodWludClcblx0XHRcblx0XHRfcmVxdWlyZV9kZWZpbmVkKGFkZHJlc3NfcG9vbCwgdXBwZXJfYm91bmQsIFwidXBwZXJfYm91bmRcIik7XG5cdFx0XG5cdFx0aWYgKCEodHlwZW9mIHVwcGVyX2JvdW5kID09PSBcIm51bWJlclwiICYmICh1cHBlcl9ib3VuZCB8IDApID09PSB1cHBlcl9ib3VuZCkgJiYgKHVwcGVyX2JvdW5kIHwgMCkgPiAwKSB7XG5cdFx0XHRfZnJlZV9hbmRfdGhyb3dfdHlwZV9lcnJvcihhZGRyZXNzX3Bvb2wsIFwidXBwZXJfYm91bmQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyXCIpO1xuXHRcdH1cblx0XHRcblx0XHR2YXIgcmFuZG9tX3ZhbHVlID0gbGlic29kaXVtLl9yYW5kb21ieXRlc191bmlmb3JtKHVwcGVyX2JvdW5kKSA+Pj4gMDtcblx0XHR2YXIgcmV0ID0gKHJhbmRvbV92YWx1ZSk7XG5cdFx0X2ZyZWVfYWxsKGFkZHJlc3NfcG9vbCk7XG5cdFx0cmV0dXJuIHJldDtcblx0XHRcblx0fVxuXG5cdGZ1bmN0aW9uIHNvZGl1bV92ZXJzaW9uX3N0cmluZygpIHtcblx0XHR2YXIgYWRkcmVzc19wb29sID0gW107XG5cblx0XHR2YXIgdmVyc2lvbiA9IGxpYnNvZGl1bS5fc29kaXVtX3ZlcnNpb25fc3RyaW5nKCk7XG5cdFx0dmFyIHJldCA9IChsaWJzb2RpdW0uUG9pbnRlcl9zdHJpbmdpZnkodmVyc2lvbikpO1xuXHRcdF9mcmVlX2FsbChhZGRyZXNzX3Bvb2wpO1xuXHRcdHJldHVybiByZXQ7XG5cdFx0XG5cdH1cblxuXG5cdGV4cG9ydHMuY29tcGFyZSA9IGNvbXBhcmU7XG5cdGV4cG9ydHMuZnJvbV9iYXNlNjQgPSBmcm9tX2Jhc2U2NDtcblx0ZXhwb3J0cy5mcm9tX2hleCA9IGZyb21faGV4O1xuXHRleHBvcnRzLmZyb21fc3RyaW5nID0gZnJvbV9zdHJpbmc7XG5cdGV4cG9ydHMuaW5jcmVtZW50ID0gaW5jcmVtZW50O1xuXHRleHBvcnRzLmxpYnNvZGl1bSA9IGxpYnNvZGl1bTtcblx0ZXhwb3J0cy5tZW1jbXAgPSBtZW1jbXA7XG5cdGV4cG9ydHMubWVtemVybyA9IG1lbXplcm87XG5cdGV4cG9ydHMub3V0cHV0X2Zvcm1hdHMgPSBvdXRwdXRfZm9ybWF0cztcblx0ZXhwb3J0cy5zeW1ib2xzID0gc3ltYm9scztcblx0ZXhwb3J0cy50b19iYXNlNjQgPSB0b19iYXNlNjQ7XG5cdGV4cG9ydHMudG9faGV4ID0gdG9faGV4O1xuXHRleHBvcnRzLnRvX3N0cmluZyA9IHRvX3N0cmluZztcblxuXHRcblx0dmFyIGV4cG9ydGVkX2Z1bmN0aW9ucyA9IFtcImNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfZGVjcnlwdFwiLCBcImNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfZW5jcnlwdFwiLCBcImNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfaWV0Zl9kZWNyeXB0XCIsIFwiY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9pZXRmX2VuY3J5cHRcIiwgXCJjcnlwdG9fYXV0aFwiLCBcImNyeXB0b19hdXRoX2htYWNzaGEyNTZcIiwgXCJjcnlwdG9fYXV0aF9obWFjc2hhMjU2X3ZlcmlmeVwiLCBcImNyeXB0b19hdXRoX2htYWNzaGE1MTJcIiwgXCJjcnlwdG9fYXV0aF9obWFjc2hhNTEyX3ZlcmlmeVwiLCBcImNyeXB0b19hdXRoX3ZlcmlmeVwiLCBcImNyeXB0b19ib3hfYmVmb3Jlbm1cIiwgXCJjcnlwdG9fYm94X2RldGFjaGVkXCIsIFwiY3J5cHRvX2JveF9lYXN5XCIsIFwiY3J5cHRvX2JveF9lYXN5X2FmdGVybm1cIiwgXCJjcnlwdG9fYm94X2tleXBhaXJcIiwgXCJjcnlwdG9fYm94X29wZW5fZGV0YWNoZWRcIiwgXCJjcnlwdG9fYm94X29wZW5fZWFzeVwiLCBcImNyeXB0b19ib3hfb3Blbl9lYXN5X2FmdGVybm1cIiwgXCJjcnlwdG9fYm94X3NlYWxcIiwgXCJjcnlwdG9fYm94X3NlYWxfb3BlblwiLCBcImNyeXB0b19ib3hfc2VlZF9rZXlwYWlyXCIsIFwiY3J5cHRvX2dlbmVyaWNoYXNoXCIsIFwiY3J5cHRvX2dlbmVyaWNoYXNoX2ZpbmFsXCIsIFwiY3J5cHRvX2dlbmVyaWNoYXNoX2luaXRcIiwgXCJjcnlwdG9fZ2VuZXJpY2hhc2hfdXBkYXRlXCIsIFwiY3J5cHRvX2hhc2hcIiwgXCJjcnlwdG9faGFzaF9zaGEyNTZcIiwgXCJjcnlwdG9faGFzaF9zaGE1MTJcIiwgXCJjcnlwdG9fb25ldGltZWF1dGhcIiwgXCJjcnlwdG9fb25ldGltZWF1dGhfZmluYWxcIiwgXCJjcnlwdG9fb25ldGltZWF1dGhfaW5pdFwiLCBcImNyeXB0b19vbmV0aW1lYXV0aF91cGRhdGVcIiwgXCJjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5XCIsIFwiY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1NlwiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfbGxcIiwgXCJjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0clwiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyX3ZlcmlmeVwiLCBcImNyeXB0b19zY2FsYXJtdWx0XCIsIFwiY3J5cHRvX3NjYWxhcm11bHRfYmFzZVwiLCBcImNyeXB0b19zZWNyZXRib3hfZGV0YWNoZWRcIiwgXCJjcnlwdG9fc2VjcmV0Ym94X2Vhc3lcIiwgXCJjcnlwdG9fc2VjcmV0Ym94X29wZW5fZGV0YWNoZWRcIiwgXCJjcnlwdG9fc2VjcmV0Ym94X29wZW5fZWFzeVwiLCBcImNyeXB0b19zaG9ydGhhc2hcIiwgXCJjcnlwdG9fc2lnblwiLCBcImNyeXB0b19zaWduX2RldGFjaGVkXCIsIFwiY3J5cHRvX3NpZ25fZWQyNTUxOV9wa190b19jdXJ2ZTI1NTE5XCIsIFwiY3J5cHRvX3NpZ25fZWQyNTUxOV9za190b19jdXJ2ZTI1NTE5XCIsIFwiY3J5cHRvX3NpZ25fZWQyNTUxOV9za190b19wa1wiLCBcImNyeXB0b19zaWduX2VkMjU1MTlfc2tfdG9fc2VlZFwiLCBcImNyeXB0b19zaWduX2tleXBhaXJcIiwgXCJjcnlwdG9fc2lnbl9vcGVuXCIsIFwiY3J5cHRvX3NpZ25fc2VlZF9rZXlwYWlyXCIsIFwiY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkXCIsIFwicmFuZG9tYnl0ZXNfYnVmXCIsIFwicmFuZG9tYnl0ZXNfY2xvc2VcIiwgXCJyYW5kb21ieXRlc19yYW5kb21cIiwgXCJyYW5kb21ieXRlc19zZXRfaW1wbGVtZW50YXRpb25cIiwgXCJyYW5kb21ieXRlc19zdGlyXCIsIFwicmFuZG9tYnl0ZXNfdW5pZm9ybVwiLCBcInNvZGl1bV92ZXJzaW9uX3N0cmluZ1wiXSxcblx0XHRmdW5jdGlvbnMgPSBbY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9kZWNyeXB0LCBjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2VuY3J5cHQsIGNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfaWV0Zl9kZWNyeXB0LCBjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X2lldGZfZW5jcnlwdCwgY3J5cHRvX2F1dGgsIGNyeXB0b19hdXRoX2htYWNzaGEyNTYsIGNyeXB0b19hdXRoX2htYWNzaGEyNTZfdmVyaWZ5LCBjcnlwdG9fYXV0aF9obWFjc2hhNTEyLCBjcnlwdG9fYXV0aF9obWFjc2hhNTEyX3ZlcmlmeSwgY3J5cHRvX2F1dGhfdmVyaWZ5LCBjcnlwdG9fYm94X2JlZm9yZW5tLCBjcnlwdG9fYm94X2RldGFjaGVkLCBjcnlwdG9fYm94X2Vhc3ksIGNyeXB0b19ib3hfZWFzeV9hZnRlcm5tLCBjcnlwdG9fYm94X2tleXBhaXIsIGNyeXB0b19ib3hfb3Blbl9kZXRhY2hlZCwgY3J5cHRvX2JveF9vcGVuX2Vhc3ksIGNyeXB0b19ib3hfb3Blbl9lYXN5X2FmdGVybm0sIGNyeXB0b19ib3hfc2VhbCwgY3J5cHRvX2JveF9zZWFsX29wZW4sIGNyeXB0b19ib3hfc2VlZF9rZXlwYWlyLCBjcnlwdG9fZ2VuZXJpY2hhc2gsIGNyeXB0b19nZW5lcmljaGFzaF9maW5hbCwgY3J5cHRvX2dlbmVyaWNoYXNoX2luaXQsIGNyeXB0b19nZW5lcmljaGFzaF91cGRhdGUsIGNyeXB0b19oYXNoLCBjcnlwdG9faGFzaF9zaGEyNTYsIGNyeXB0b19oYXNoX3NoYTUxMiwgY3J5cHRvX29uZXRpbWVhdXRoLCBjcnlwdG9fb25ldGltZWF1dGhfZmluYWwsIGNyeXB0b19vbmV0aW1lYXV0aF9pbml0LCBjcnlwdG9fb25ldGltZWF1dGhfdXBkYXRlLCBjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5LCBjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2LCBjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X2xsLCBjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0ciwgY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJfdmVyaWZ5LCBjcnlwdG9fc2NhbGFybXVsdCwgY3J5cHRvX3NjYWxhcm11bHRfYmFzZSwgY3J5cHRvX3NlY3JldGJveF9kZXRhY2hlZCwgY3J5cHRvX3NlY3JldGJveF9lYXN5LCBjcnlwdG9fc2VjcmV0Ym94X29wZW5fZGV0YWNoZWQsIGNyeXB0b19zZWNyZXRib3hfb3Blbl9lYXN5LCBjcnlwdG9fc2hvcnRoYXNoLCBjcnlwdG9fc2lnbiwgY3J5cHRvX3NpZ25fZGV0YWNoZWQsIGNyeXB0b19zaWduX2VkMjU1MTlfcGtfdG9fY3VydmUyNTUxOSwgY3J5cHRvX3NpZ25fZWQyNTUxOV9za190b19jdXJ2ZTI1NTE5LCBjcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX3BrLCBjcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX3NlZWQsIGNyeXB0b19zaWduX2tleXBhaXIsIGNyeXB0b19zaWduX29wZW4sIGNyeXB0b19zaWduX3NlZWRfa2V5cGFpciwgY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkLCByYW5kb21ieXRlc19idWYsIHJhbmRvbWJ5dGVzX2Nsb3NlLCByYW5kb21ieXRlc19yYW5kb20sIHJhbmRvbWJ5dGVzX3NldF9pbXBsZW1lbnRhdGlvbiwgcmFuZG9tYnl0ZXNfc3RpciwgcmFuZG9tYnl0ZXNfdW5pZm9ybSwgc29kaXVtX3ZlcnNpb25fc3RyaW5nXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAodHlwZW9mIGxpYnNvZGl1bVtcIl9cIiArIGV4cG9ydGVkX2Z1bmN0aW9uc1tpXV0gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0ZXhwb3J0c1tleHBvcnRlZF9mdW5jdGlvbnNbaV1dID0gZnVuY3Rpb25zW2ldO1xuXHRcdH1cblx0fVxuXHR2YXIgY29uc3RhbnRzID0gW1wiU09ESVVNX0xJQlJBUllfVkVSU0lPTl9NQUpPUlwiLCBcIlNPRElVTV9MSUJSQVJZX1ZFUlNJT05fTUlOT1JcIiwgXCJjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X0FCWVRFU1wiLCBcImNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfS0VZQllURVNcIiwgXCJjcnlwdG9fYWVhZF9jaGFjaGEyMHBvbHkxMzA1X05QVUJCWVRFU1wiLCBcImNyeXB0b19hZWFkX2NoYWNoYTIwcG9seTEzMDVfTlNFQ0JZVEVTXCIsIFwiY3J5cHRvX2FlYWRfY2hhY2hhMjBwb2x5MTMwNV9pZXRmX05QVUJCWVRFU1wiLCBcImNyeXB0b19hdXRoX0JZVEVTXCIsIFwiY3J5cHRvX2F1dGhfS0VZQllURVNcIiwgXCJjcnlwdG9fYXV0aF9obWFjc2hhMjU2X0JZVEVTXCIsIFwiY3J5cHRvX2F1dGhfaG1hY3NoYTI1Nl9LRVlCWVRFU1wiLCBcImNyeXB0b19hdXRoX2htYWNzaGE1MTJfQllURVNcIiwgXCJjcnlwdG9fYXV0aF9obWFjc2hhNTEyX0tFWUJZVEVTXCIsIFwiY3J5cHRvX2JveF9CRUZPUkVOTUJZVEVTXCIsIFwiY3J5cHRvX2JveF9NQUNCWVRFU1wiLCBcImNyeXB0b19ib3hfTk9OQ0VCWVRFU1wiLCBcImNyeXB0b19ib3hfUFVCTElDS0VZQllURVNcIiwgXCJjcnlwdG9fYm94X1NFQUxCWVRFU1wiLCBcImNyeXB0b19ib3hfU0VDUkVUS0VZQllURVNcIiwgXCJjcnlwdG9fYm94X1NFRURCWVRFU1wiLCBcImNyeXB0b19nZW5lcmljaGFzaF9CWVRFU1wiLCBcImNyeXB0b19nZW5lcmljaGFzaF9CWVRFU19NQVhcIiwgXCJjcnlwdG9fZ2VuZXJpY2hhc2hfQllURVNfTUlOXCIsIFwiY3J5cHRvX2dlbmVyaWNoYXNoX0tFWUJZVEVTXCIsIFwiY3J5cHRvX2dlbmVyaWNoYXNoX0tFWUJZVEVTX01BWFwiLCBcImNyeXB0b19nZW5lcmljaGFzaF9LRVlCWVRFU19NSU5cIiwgXCJjcnlwdG9faGFzaF9CWVRFU1wiLCBcImNyeXB0b19vbmV0aW1lYXV0aF9CWVRFU1wiLCBcImNyeXB0b19vbmV0aW1lYXV0aF9LRVlCWVRFU1wiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfTUVNTElNSVRfSU5URVJBQ1RJVkVcIiwgXCJjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X01FTUxJTUlUX1NFTlNJVElWRVwiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfT1BTTElNSVRfSU5URVJBQ1RJVkVcIiwgXCJjcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X09QU0xJTUlUX1NFTlNJVElWRVwiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfU0FMVEJZVEVTXCIsIFwiY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9TVFJCWVRFU1wiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfU1RSX1ZFUklGWVwiLCBcImNyeXB0b19zY2FsYXJtdWx0X0JZVEVTXCIsIFwiY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVNcIiwgXCJjcnlwdG9fc2VjcmV0Ym94X0tFWUJZVEVTXCIsIFwiY3J5cHRvX3NlY3JldGJveF9NQUNCWVRFU1wiLCBcImNyeXB0b19zZWNyZXRib3hfTk9OQ0VCWVRFU1wiLCBcImNyeXB0b19zaG9ydGhhc2hfQllURVNcIiwgXCJjcnlwdG9fc2hvcnRoYXNoX0tFWUJZVEVTXCIsIFwiY3J5cHRvX3NpZ25fQllURVNcIiwgXCJjcnlwdG9fc2lnbl9QVUJMSUNLRVlCWVRFU1wiLCBcImNyeXB0b19zaWduX1NFQ1JFVEtFWUJZVEVTXCIsIFwiY3J5cHRvX3NpZ25fU0VFREJZVEVTXCJdO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGNvbnN0YW50cy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciByYXcgPSBsaWJzb2RpdW1bXCJfXCIgKyBjb25zdGFudHNbaV0udG9Mb3dlckNhc2UoKV07XG5cdFx0aWYgKHR5cGVvZiByYXcgPT09IFwiZnVuY3Rpb25cIikgZXhwb3J0c1tjb25zdGFudHNbaV1dID0gcmF3KCl8MDtcblx0fVxuXHR2YXIgY29uc3RhbnRzX3N0ciA9IFtcIlNPRElVTV9WRVJTSU9OX1NUUklOR1wiLCBcImNyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfU1RSUFJFRklYXCJdO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGNvbnN0YW50c19zdHIubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgcmF3ID0gbGlic29kaXVtW1wiX1wiICsgY29uc3RhbnRzX3N0cltpXS50b0xvd2VyQ2FzZSgpXTtcblx0XHRpZiAodHlwZW9mIHJhdyA9PT0gXCJmdW5jdGlvblwiKSBleHBvcnRzW2NvbnN0YW50c19zdHJbaV1dID0gbGlic29kaXVtLlBvaW50ZXJfc3RyaW5naWZ5KHJhdygpKTtcblx0fVxuXG5cdHJldHVybiBleHBvcnRzO1xufSkpO1xuIiwiKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShbXCJleHBvcnRzXCJdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgdHlwZW9mIGV4cG9ydHMubm9kZU5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGZhY3RvcnkoZXhwb3J0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeShyb290LmxpYnNvZGl1bSA9IHt9KTtcbiAgICB9XG59KSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cykge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIHZhciBNb2R1bGUgPSBleHBvcnRzO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgTW9kdWxlO2lmKCFNb2R1bGUpTW9kdWxlPSh0eXBlb2YgTW9kdWxlIT09XCJ1bmRlZmluZWRcIj9Nb2R1bGU6bnVsbCl8fHt9O3ZhciBtb2R1bGVPdmVycmlkZXM9e307Zm9yKHZhciBrZXkgaW4gTW9kdWxlKXtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkoa2V5KSl7bW9kdWxlT3ZlcnJpZGVzW2tleV09TW9kdWxlW2tleV19fXZhciBFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PVwib2JqZWN0XCI7dmFyIEVOVklST05NRU5UX0lTX1dPUktFUj10eXBlb2YgaW1wb3J0U2NyaXB0cz09PVwiZnVuY3Rpb25cIjt2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERT10eXBlb2YgcHJvY2Vzcz09PVwib2JqZWN0XCImJnR5cGVvZiByZXF1aXJlPT09XCJmdW5jdGlvblwiJiYhRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfV09SS0VSO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZighTW9kdWxlW1wicHJpbnRcIl0pTW9kdWxlW1wicHJpbnRcIl09ZnVuY3Rpb24gcHJpbnQoeCl7cHJvY2Vzc1tcInN0ZG91dFwiXS53cml0ZSh4K1wiXFxuXCIpfTtpZighTW9kdWxlW1wicHJpbnRFcnJcIl0pTW9kdWxlW1wicHJpbnRFcnJcIl09ZnVuY3Rpb24gcHJpbnRFcnIoeCl7cHJvY2Vzc1tcInN0ZGVyclwiXS53cml0ZSh4K1wiXFxuXCIpfTt2YXIgbm9kZUZTPXJlcXVpcmUoXCJmc1wiKTt2YXIgbm9kZVBhdGg9cmVxdWlyZShcInBhdGhcIik7TW9kdWxlW1wicmVhZFwiXT1mdW5jdGlvbiByZWFkKGZpbGVuYW1lLGJpbmFyeSl7ZmlsZW5hbWU9bm9kZVBhdGhbXCJub3JtYWxpemVcIl0oZmlsZW5hbWUpO3ZhciByZXQ9bm9kZUZTW1wicmVhZEZpbGVTeW5jXCJdKGZpbGVuYW1lKTtpZighcmV0JiZmaWxlbmFtZSE9bm9kZVBhdGhbXCJyZXNvbHZlXCJdKGZpbGVuYW1lKSl7ZmlsZW5hbWU9cGF0aC5qb2luKF9fZGlybmFtZSxcIi4uXCIsXCJzcmNcIixmaWxlbmFtZSk7cmV0PW5vZGVGU1tcInJlYWRGaWxlU3luY1wiXShmaWxlbmFtZSl9aWYocmV0JiYhYmluYXJ5KXJldD1yZXQudG9TdHJpbmcoKTtyZXR1cm4gcmV0fTtNb2R1bGVbXCJyZWFkQmluYXJ5XCJdPWZ1bmN0aW9uIHJlYWRCaW5hcnkoZmlsZW5hbWUpe3ZhciByZXQ9TW9kdWxlW1wicmVhZFwiXShmaWxlbmFtZSx0cnVlKTtpZighcmV0LmJ1ZmZlcil7cmV0PW5ldyBVaW50OEFycmF5KHJldCl9YXNzZXJ0KHJldC5idWZmZXIpO3JldHVybiByZXR9O01vZHVsZVtcImxvYWRcIl09ZnVuY3Rpb24gbG9hZChmKXtnbG9iYWxFdmFsKHJlYWQoZikpfTtpZighTW9kdWxlW1widGhpc1Byb2dyYW1cIl0pe2lmKHByb2Nlc3NbXCJhcmd2XCJdLmxlbmd0aD4xKXtNb2R1bGVbXCJ0aGlzUHJvZ3JhbVwiXT1wcm9jZXNzW1wiYXJndlwiXVsxXS5yZXBsYWNlKC9cXFxcL2csXCIvXCIpfWVsc2V7TW9kdWxlW1widGhpc1Byb2dyYW1cIl09XCJ1bmtub3duLXByb2dyYW1cIn19TW9kdWxlW1wiYXJndW1lbnRzXCJdPXByb2Nlc3NbXCJhcmd2XCJdLnNsaWNlKDIpO2lmKHR5cGVvZiBtb2R1bGUhPT1cInVuZGVmaW5lZFwiKXttb2R1bGVbXCJleHBvcnRzXCJdPU1vZHVsZX1wcm9jZXNzW1wib25cIl0oXCJ1bmNhdWdodEV4Y2VwdGlvblwiLChmdW5jdGlvbihleCl7aWYoIShleCBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpKXt0aHJvdyBleH19KSk7TW9kdWxlW1wiaW5zcGVjdFwiXT0oZnVuY3Rpb24oKXtyZXR1cm5cIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdXCJ9KX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1NIRUxMKXtpZighTW9kdWxlW1wicHJpbnRcIl0pTW9kdWxlW1wicHJpbnRcIl09cHJpbnQ7aWYodHlwZW9mIHByaW50RXJyIT1cInVuZGVmaW5lZFwiKU1vZHVsZVtcInByaW50RXJyXCJdPXByaW50RXJyO2lmKHR5cGVvZiByZWFkIT1cInVuZGVmaW5lZFwiKXtNb2R1bGVbXCJyZWFkXCJdPXJlYWR9ZWxzZXtNb2R1bGVbXCJyZWFkXCJdPWZ1bmN0aW9uIHJlYWQoKXt0aHJvd1wibm8gcmVhZCgpIGF2YWlsYWJsZSAoanNjPylcIn19TW9kdWxlW1wicmVhZEJpbmFyeVwiXT1mdW5jdGlvbiByZWFkQmluYXJ5KGYpe2lmKHR5cGVvZiByZWFkYnVmZmVyPT09XCJmdW5jdGlvblwiKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVhZGJ1ZmZlcihmKSl9dmFyIGRhdGE9cmVhZChmLFwiYmluYXJ5XCIpO2Fzc2VydCh0eXBlb2YgZGF0YT09PVwib2JqZWN0XCIpO3JldHVybiBkYXRhfTtpZih0eXBlb2Ygc2NyaXB0QXJncyE9XCJ1bmRlZmluZWRcIil7TW9kdWxlW1wiYXJndW1lbnRzXCJdPXNjcmlwdEFyZ3N9ZWxzZSBpZih0eXBlb2YgYXJndW1lbnRzIT1cInVuZGVmaW5lZFwiKXtNb2R1bGVbXCJhcmd1bWVudHNcIl09YXJndW1lbnRzfX1lbHNlIGlmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKXtNb2R1bGVbXCJyZWFkXCJdPWZ1bmN0aW9uIHJlYWQodXJsKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbihcIkdFVFwiLHVybCxmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHR9O2lmKHR5cGVvZiBhcmd1bWVudHMhPVwidW5kZWZpbmVkXCIpe01vZHVsZVtcImFyZ3VtZW50c1wiXT1hcmd1bWVudHN9aWYodHlwZW9mIGNvbnNvbGUhPT1cInVuZGVmaW5lZFwiKXtpZighTW9kdWxlW1wicHJpbnRcIl0pTW9kdWxlW1wicHJpbnRcIl09ZnVuY3Rpb24gcHJpbnQoeCl7Y29uc29sZS5sb2coeCl9O2lmKCFNb2R1bGVbXCJwcmludEVyclwiXSlNb2R1bGVbXCJwcmludEVyclwiXT1mdW5jdGlvbiBwcmludEVycih4KXtjb25zb2xlLmxvZyh4KX19ZWxzZXt2YXIgVFJZX1VTRV9EVU1QPWZhbHNlO2lmKCFNb2R1bGVbXCJwcmludFwiXSlNb2R1bGVbXCJwcmludFwiXT1UUllfVVNFX0RVTVAmJnR5cGVvZiBkdW1wIT09XCJ1bmRlZmluZWRcIj8oZnVuY3Rpb24oeCl7ZHVtcCh4KX0pOihmdW5jdGlvbih4KXt9KX1pZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe01vZHVsZVtcImxvYWRcIl09aW1wb3J0U2NyaXB0c31pZih0eXBlb2YgTW9kdWxlW1wic2V0V2luZG93VGl0bGVcIl09PT1cInVuZGVmaW5lZFwiKXtNb2R1bGVbXCJzZXRXaW5kb3dUaXRsZVwiXT0oZnVuY3Rpb24odGl0bGUpe2RvY3VtZW50LnRpdGxlPXRpdGxlfSl9fWVsc2V7dGhyb3dcIlVua25vd24gcnVudGltZSBlbnZpcm9ubWVudC4gV2hlcmUgYXJlIHdlP1wifWZ1bmN0aW9uIGdsb2JhbEV2YWwoeCl7dGhyb3dcIk5PX0RZTkFNSUNfRVhFQ1VUSU9OIHdhcyBzZXQsIGNhbm5vdCBldmFsXCJ9aWYoIU1vZHVsZVtcImxvYWRcIl0mJk1vZHVsZVtcInJlYWRcIl0pe01vZHVsZVtcImxvYWRcIl09ZnVuY3Rpb24gbG9hZChmKXtnbG9iYWxFdmFsKE1vZHVsZVtcInJlYWRcIl0oZikpfX1pZighTW9kdWxlW1wicHJpbnRcIl0pe01vZHVsZVtcInByaW50XCJdPShmdW5jdGlvbigpe30pfWlmKCFNb2R1bGVbXCJwcmludEVyclwiXSl7TW9kdWxlW1wicHJpbnRFcnJcIl09TW9kdWxlW1wicHJpbnRcIl19aWYoIU1vZHVsZVtcImFyZ3VtZW50c1wiXSl7TW9kdWxlW1wiYXJndW1lbnRzXCJdPVtdfWlmKCFNb2R1bGVbXCJ0aGlzUHJvZ3JhbVwiXSl7TW9kdWxlW1widGhpc1Byb2dyYW1cIl09XCIuL3RoaXMucHJvZ3JhbVwifU1vZHVsZS5wcmludD1Nb2R1bGVbXCJwcmludFwiXTtNb2R1bGUucHJpbnRFcnI9TW9kdWxlW1wicHJpbnRFcnJcIl07TW9kdWxlW1wicHJlUnVuXCJdPVtdO01vZHVsZVtcInBvc3RSdW5cIl09W107Zm9yKHZhciBrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKXtpZihtb2R1bGVPdmVycmlkZXMuaGFzT3duUHJvcGVydHkoa2V5KSl7TW9kdWxlW2tleV09bW9kdWxlT3ZlcnJpZGVzW2tleV19fXZhciBSdW50aW1lPXtzZXRUZW1wUmV0MDooZnVuY3Rpb24odmFsdWUpe3RlbXBSZXQwPXZhbHVlfSksZ2V0VGVtcFJldDA6KGZ1bmN0aW9uKCl7cmV0dXJuIHRlbXBSZXQwfSksc3RhY2tTYXZlOihmdW5jdGlvbigpe3JldHVybiBTVEFDS1RPUH0pLHN0YWNrUmVzdG9yZTooZnVuY3Rpb24oc3RhY2tUb3Ape1NUQUNLVE9QPXN0YWNrVG9wfSksZ2V0TmF0aXZlVHlwZVNpemU6KGZ1bmN0aW9uKHR5cGUpe3N3aXRjaCh0eXBlKXtjYXNlXCJpMVwiOmNhc2VcImk4XCI6cmV0dXJuIDE7Y2FzZVwiaTE2XCI6cmV0dXJuIDI7Y2FzZVwiaTMyXCI6cmV0dXJuIDQ7Y2FzZVwiaTY0XCI6cmV0dXJuIDg7Y2FzZVwiZmxvYXRcIjpyZXR1cm4gNDtjYXNlXCJkb3VibGVcIjpyZXR1cm4gODtkZWZhdWx0OntpZih0eXBlW3R5cGUubGVuZ3RoLTFdPT09XCIqXCIpe3JldHVybiBSdW50aW1lLlFVQU5UVU1fU0laRX1lbHNlIGlmKHR5cGVbMF09PT1cImlcIil7dmFyIGJpdHM9cGFyc2VJbnQodHlwZS5zdWJzdHIoMSkpO2Fzc2VydChiaXRzJTg9PT0wKTtyZXR1cm4gYml0cy84fWVsc2V7cmV0dXJuIDB9fX19KSxnZXROYXRpdmVGaWVsZFNpemU6KGZ1bmN0aW9uKHR5cGUpe3JldHVybiBNYXRoLm1heChSdW50aW1lLmdldE5hdGl2ZVR5cGVTaXplKHR5cGUpLFJ1bnRpbWUuUVVBTlRVTV9TSVpFKX0pLFNUQUNLX0FMSUdOOjE2LHByZXBWYXJhcmc6KGZ1bmN0aW9uKHB0cix0eXBlKXtpZih0eXBlPT09XCJkb3VibGVcInx8dHlwZT09PVwiaTY0XCIpe2lmKHB0ciY3KXthc3NlcnQoKHB0ciY3KT09PTQpO3B0cis9NH19ZWxzZXthc3NlcnQoKHB0ciYzKT09PTApfXJldHVybiBwdHJ9KSxnZXRBbGlnblNpemU6KGZ1bmN0aW9uKHR5cGUsc2l6ZSx2YXJhcmcpe2lmKCF2YXJhcmcmJih0eXBlPT1cImk2NFwifHx0eXBlPT1cImRvdWJsZVwiKSlyZXR1cm4gODtpZighdHlwZSlyZXR1cm4gTWF0aC5taW4oc2l6ZSw4KTtyZXR1cm4gTWF0aC5taW4oc2l6ZXx8KHR5cGU/UnVudGltZS5nZXROYXRpdmVGaWVsZFNpemUodHlwZSk6MCksUnVudGltZS5RVUFOVFVNX1NJWkUpfSksZHluQ2FsbDooZnVuY3Rpb24oc2lnLHB0cixhcmdzKXtpZihhcmdzJiZhcmdzLmxlbmd0aCl7aWYoIWFyZ3Muc3BsaWNlKWFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7YXJncy5zcGxpY2UoMCwwLHB0cik7cmV0dXJuIE1vZHVsZVtcImR5bkNhbGxfXCIrc2lnXS5hcHBseShudWxsLGFyZ3MpfWVsc2V7cmV0dXJuIE1vZHVsZVtcImR5bkNhbGxfXCIrc2lnXS5jYWxsKG51bGwscHRyKX19KSxmdW5jdGlvblBvaW50ZXJzOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLGFkZEZ1bmN0aW9uOihmdW5jdGlvbihmdW5jKXtmb3IodmFyIGk9MDtpPFJ1bnRpbWUuZnVuY3Rpb25Qb2ludGVycy5sZW5ndGg7aSsrKXtpZighUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2ldKXtSdW50aW1lLmZ1bmN0aW9uUG9pbnRlcnNbaV09ZnVuYztyZXR1cm4gMiooMStpKX19dGhyb3dcIkZpbmlzaGVkIHVwIGFsbCByZXNlcnZlZCBmdW5jdGlvbiBwb2ludGVycy4gVXNlIGEgaGlnaGVyIHZhbHVlIGZvciBSRVNFUlZFRF9GVU5DVElPTl9QT0lOVEVSUy5cIn0pLHJlbW92ZUZ1bmN0aW9uOihmdW5jdGlvbihpbmRleCl7UnVudGltZS5mdW5jdGlvblBvaW50ZXJzWyhpbmRleC0yKS8yXT1udWxsfSksd2Fybk9uY2U6KGZ1bmN0aW9uKHRleHQpe2lmKCFSdW50aW1lLndhcm5PbmNlLnNob3duKVJ1bnRpbWUud2Fybk9uY2Uuc2hvd249e307aWYoIVJ1bnRpbWUud2Fybk9uY2Uuc2hvd25bdGV4dF0pe1J1bnRpbWUud2Fybk9uY2Uuc2hvd25bdGV4dF09MTtNb2R1bGUucHJpbnRFcnIodGV4dCl9fSksZnVuY1dyYXBwZXJzOnt9LGdldEZ1bmNXcmFwcGVyOihmdW5jdGlvbihmdW5jLHNpZyl7YXNzZXJ0KHNpZyk7aWYoIVJ1bnRpbWUuZnVuY1dyYXBwZXJzW3NpZ10pe1J1bnRpbWUuZnVuY1dyYXBwZXJzW3NpZ109e319dmFyIHNpZ0NhY2hlPVJ1bnRpbWUuZnVuY1dyYXBwZXJzW3NpZ107aWYoIXNpZ0NhY2hlW2Z1bmNdKXtzaWdDYWNoZVtmdW5jXT1mdW5jdGlvbiBkeW5DYWxsX3dyYXBwZXIoKXtyZXR1cm4gUnVudGltZS5keW5DYWxsKHNpZyxmdW5jLGFyZ3VtZW50cyl9fXJldHVybiBzaWdDYWNoZVtmdW5jXX0pLGdldENvbXBpbGVyU2V0dGluZzooZnVuY3Rpb24obmFtZSl7dGhyb3dcIllvdSBtdXN0IGJ1aWxkIHdpdGggLXMgUkVUQUlOX0NPTVBJTEVSX1NFVFRJTkdTPTEgZm9yIFJ1bnRpbWUuZ2V0Q29tcGlsZXJTZXR0aW5nIG9yIGVtc2NyaXB0ZW5fZ2V0X2NvbXBpbGVyX3NldHRpbmcgdG8gd29ya1wifSksc3RhY2tBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyIHJldD1TVEFDS1RPUDtTVEFDS1RPUD1TVEFDS1RPUCtzaXplfDA7U1RBQ0tUT1A9U1RBQ0tUT1ArMTUmLTE2O3JldHVybiByZXR9KSxzdGF0aWNBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyIHJldD1TVEFUSUNUT1A7U1RBVElDVE9QPVNUQVRJQ1RPUCtzaXplfDA7U1RBVElDVE9QPVNUQVRJQ1RPUCsxNSYtMTY7cmV0dXJuIHJldH0pLGR5bmFtaWNBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyIHJldD1EWU5BTUlDVE9QO0RZTkFNSUNUT1A9RFlOQU1JQ1RPUCtzaXplfDA7RFlOQU1JQ1RPUD1EWU5BTUlDVE9QKzE1Ji0xNjtpZihEWU5BTUlDVE9QPj1UT1RBTF9NRU1PUlkpe3ZhciBzdWNjZXNzPWVubGFyZ2VNZW1vcnkoKTtpZighc3VjY2Vzcyl7RFlOQU1JQ1RPUD1yZXQ7cmV0dXJuIDB9fXJldHVybiByZXR9KSxhbGlnbk1lbW9yeTooZnVuY3Rpb24oc2l6ZSxxdWFudHVtKXt2YXIgcmV0PXNpemU9TWF0aC5jZWlsKHNpemUvKHF1YW50dW0/cXVhbnR1bToxNikpKihxdWFudHVtP3F1YW50dW06MTYpO3JldHVybiByZXR9KSxtYWtlQmlnSW50OihmdW5jdGlvbihsb3csaGlnaCx1bnNpZ25lZCl7dmFyIHJldD11bnNpZ25lZD8rKGxvdz4+PjApKyArKGhpZ2g+Pj4wKSorNDI5NDk2NzI5NjorKGxvdz4+PjApKyArKGhpZ2h8MCkqKzQyOTQ5NjcyOTY7cmV0dXJuIHJldH0pLEdMT0JBTF9CQVNFOjgsUVVBTlRVTV9TSVpFOjQsX19kdW1teV9fOjB9O01vZHVsZVtcIlJ1bnRpbWVcIl09UnVudGltZTt2YXIgX19USFJFV19fPTA7dmFyIEFCT1JUPWZhbHNlO3ZhciBFWElUU1RBVFVTPTA7dmFyIHVuZGVmPTA7dmFyIHRlbXBWYWx1ZSx0ZW1wSW50LHRlbXBCaWdJbnQsdGVtcEludDIsdGVtcEJpZ0ludDIsdGVtcFBhaXIsdGVtcEJpZ0ludEksdGVtcEJpZ0ludFIsdGVtcEJpZ0ludFMsdGVtcEJpZ0ludFAsdGVtcEJpZ0ludEQsdGVtcERvdWJsZSx0ZW1wRmxvYXQ7dmFyIHRlbXBJNjQsdGVtcEk2NGI7dmFyIHRlbXBSZXQwLHRlbXBSZXQxLHRlbXBSZXQyLHRlbXBSZXQzLHRlbXBSZXQ0LHRlbXBSZXQ1LHRlbXBSZXQ2LHRlbXBSZXQ3LHRlbXBSZXQ4LHRlbXBSZXQ5O2Z1bmN0aW9uIGFzc2VydChjb25kaXRpb24sdGV4dCl7aWYoIWNvbmRpdGlvbil7YWJvcnQoXCJBc3NlcnRpb24gZmFpbGVkOiBcIit0ZXh0KX19dmFyIGdsb2JhbFNjb3BlPXRoaXM7ZnVuY3Rpb24gZ2V0Q0Z1bmMoaWRlbnQpe3ZhciBmdW5jPU1vZHVsZVtcIl9cIitpZGVudF07aWYoIWZ1bmMpe2Fib3J0KFwiTk9fRFlOQU1JQ19FWEVDVVRJT04gd2FzIHNldCwgY2Fubm90IGV2YWwgLSBjY2FsbC9jd3JhcCBhcmUgbm90IGZ1bmN0aW9uYWxcIil9YXNzZXJ0KGZ1bmMsXCJDYW5ub3QgY2FsbCB1bmtub3duIGZ1bmN0aW9uIFwiK2lkZW50K1wiIChwZXJoYXBzIExMVk0gb3B0aW1pemF0aW9ucyBvciBjbG9zdXJlIHJlbW92ZWQgaXQ/KVwiKTtyZXR1cm4gZnVuY312YXIgY3dyYXAsY2NhbGw7KChmdW5jdGlvbigpe3ZhciBKU2Z1bmNzPXtcInN0YWNrU2F2ZVwiOihmdW5jdGlvbigpe1J1bnRpbWUuc3RhY2tTYXZlKCl9KSxcInN0YWNrUmVzdG9yZVwiOihmdW5jdGlvbigpe1J1bnRpbWUuc3RhY2tSZXN0b3JlKCl9KSxcImFycmF5VG9DXCI6KGZ1bmN0aW9uKGFycil7dmFyIHJldD1SdW50aW1lLnN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7d3JpdGVBcnJheVRvTWVtb3J5KGFycixyZXQpO3JldHVybiByZXR9KSxcInN0cmluZ1RvQ1wiOihmdW5jdGlvbihzdHIpe3ZhciByZXQ9MDtpZihzdHIhPT1udWxsJiZzdHIhPT11bmRlZmluZWQmJnN0ciE9PTApe3JldD1SdW50aW1lLnN0YWNrQWxsb2MoKHN0ci5sZW5ndGg8PDIpKzEpO3dyaXRlU3RyaW5nVG9NZW1vcnkoc3RyLHJldCl9cmV0dXJuIHJldH0pfTt2YXIgdG9DPXtcInN0cmluZ1wiOkpTZnVuY3NbXCJzdHJpbmdUb0NcIl0sXCJhcnJheVwiOkpTZnVuY3NbXCJhcnJheVRvQ1wiXX07Y2NhbGw9ZnVuY3Rpb24gY2NhbGxGdW5jKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyxvcHRzKXt2YXIgZnVuYz1nZXRDRnVuYyhpZGVudCk7dmFyIGNBcmdzPVtdO3ZhciBzdGFjaz0wO2lmKGFyZ3Mpe2Zvcih2YXIgaT0wO2k8YXJncy5sZW5ndGg7aSsrKXt2YXIgY29udmVydGVyPXRvQ1thcmdUeXBlc1tpXV07aWYoY29udmVydGVyKXtpZihzdGFjaz09PTApc3RhY2s9UnVudGltZS5zdGFja1NhdmUoKTtjQXJnc1tpXT1jb252ZXJ0ZXIoYXJnc1tpXSl9ZWxzZXtjQXJnc1tpXT1hcmdzW2ldfX19dmFyIHJldD1mdW5jLmFwcGx5KG51bGwsY0FyZ3MpO2lmKHJldHVyblR5cGU9PT1cInN0cmluZ1wiKXJldD1Qb2ludGVyX3N0cmluZ2lmeShyZXQpO2lmKHN0YWNrIT09MCl7aWYob3B0cyYmb3B0cy5hc3luYyl7RW10ZXJwcmV0ZXJBc3luYy5hc3luY0ZpbmFsaXplcnMucHVzaCgoZnVuY3Rpb24oKXtSdW50aW1lLnN0YWNrUmVzdG9yZShzdGFjayl9KSk7cmV0dXJufVJ1bnRpbWUuc3RhY2tSZXN0b3JlKHN0YWNrKX1yZXR1cm4gcmV0fTtjd3JhcD1mdW5jdGlvbiBjd3JhcChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzKXtyZXR1cm4oZnVuY3Rpb24oKXtyZXR1cm4gY2NhbGwoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxhcmd1bWVudHMpfSl9fSkpKCk7TW9kdWxlW1wiY2NhbGxcIl09Y2NhbGw7TW9kdWxlW1wiY3dyYXBcIl09Y3dyYXA7ZnVuY3Rpb24gc2V0VmFsdWUocHRyLHZhbHVlLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fFwiaThcIjtpZih0eXBlLmNoYXJBdCh0eXBlLmxlbmd0aC0xKT09PVwiKlwiKXR5cGU9XCJpMzJcIjtzd2l0Y2godHlwZSl7Y2FzZVwiaTFcIjpIRUFQOFtwdHI+PjBdPXZhbHVlO2JyZWFrO2Nhc2VcImk4XCI6SEVBUDhbcHRyPj4wXT12YWx1ZTticmVhaztjYXNlXCJpMTZcIjpIRUFQMTZbcHRyPj4xXT12YWx1ZTticmVhaztjYXNlXCJpMzJcIjpIRUFQMzJbcHRyPj4yXT12YWx1ZTticmVhaztjYXNlXCJpNjRcIjp0ZW1wSTY0PVt2YWx1ZT4+PjAsKHRlbXBEb3VibGU9dmFsdWUsK01hdGhfYWJzKHRlbXBEb3VibGUpPj0rMT90ZW1wRG91YmxlPiswPyhNYXRoX21pbigrTWF0aF9mbG9vcih0ZW1wRG91YmxlLys0Mjk0OTY3Mjk2KSwrNDI5NDk2NzI5NSl8MCk+Pj4wOn5+K01hdGhfY2VpbCgodGVtcERvdWJsZS0gKyh+fnRlbXBEb3VibGU+Pj4wKSkvKzQyOTQ5NjcyOTYpPj4+MDowKV0sSEVBUDMyW3B0cj4+Ml09dGVtcEk2NFswXSxIRUFQMzJbcHRyKzQ+PjJdPXRlbXBJNjRbMV07YnJlYWs7Y2FzZVwiZmxvYXRcIjpIRUFQRjMyW3B0cj4+Ml09dmFsdWU7YnJlYWs7Y2FzZVwiZG91YmxlXCI6SEVBUEY2NFtwdHI+PjNdPXZhbHVlO2JyZWFrO2RlZmF1bHQ6YWJvcnQoXCJpbnZhbGlkIHR5cGUgZm9yIHNldFZhbHVlOiBcIit0eXBlKX19TW9kdWxlW1wic2V0VmFsdWVcIl09c2V0VmFsdWU7ZnVuY3Rpb24gZ2V0VmFsdWUocHRyLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fFwiaThcIjtpZih0eXBlLmNoYXJBdCh0eXBlLmxlbmd0aC0xKT09PVwiKlwiKXR5cGU9XCJpMzJcIjtzd2l0Y2godHlwZSl7Y2FzZVwiaTFcIjpyZXR1cm4gSEVBUDhbcHRyPj4wXTtjYXNlXCJpOFwiOnJldHVybiBIRUFQOFtwdHI+PjBdO2Nhc2VcImkxNlwiOnJldHVybiBIRUFQMTZbcHRyPj4xXTtjYXNlXCJpMzJcIjpyZXR1cm4gSEVBUDMyW3B0cj4+Ml07Y2FzZVwiaTY0XCI6cmV0dXJuIEhFQVAzMltwdHI+PjJdO2Nhc2VcImZsb2F0XCI6cmV0dXJuIEhFQVBGMzJbcHRyPj4yXTtjYXNlXCJkb3VibGVcIjpyZXR1cm4gSEVBUEY2NFtwdHI+PjNdO2RlZmF1bHQ6YWJvcnQoXCJpbnZhbGlkIHR5cGUgZm9yIHNldFZhbHVlOiBcIit0eXBlKX1yZXR1cm4gbnVsbH1Nb2R1bGVbXCJnZXRWYWx1ZVwiXT1nZXRWYWx1ZTt2YXIgQUxMT0NfTk9STUFMPTA7dmFyIEFMTE9DX1NUQUNLPTE7dmFyIEFMTE9DX1NUQVRJQz0yO3ZhciBBTExPQ19EWU5BTUlDPTM7dmFyIEFMTE9DX05PTkU9NDtNb2R1bGVbXCJBTExPQ19OT1JNQUxcIl09QUxMT0NfTk9STUFMO01vZHVsZVtcIkFMTE9DX1NUQUNLXCJdPUFMTE9DX1NUQUNLO01vZHVsZVtcIkFMTE9DX1NUQVRJQ1wiXT1BTExPQ19TVEFUSUM7TW9kdWxlW1wiQUxMT0NfRFlOQU1JQ1wiXT1BTExPQ19EWU5BTUlDO01vZHVsZVtcIkFMTE9DX05PTkVcIl09QUxMT0NfTk9ORTtmdW5jdGlvbiBhbGxvY2F0ZShzbGFiLHR5cGVzLGFsbG9jYXRvcixwdHIpe3ZhciB6ZXJvaW5pdCxzaXplO2lmKHR5cGVvZiBzbGFiPT09XCJudW1iZXJcIil7emVyb2luaXQ9dHJ1ZTtzaXplPXNsYWJ9ZWxzZXt6ZXJvaW5pdD1mYWxzZTtzaXplPXNsYWIubGVuZ3RofXZhciBzaW5nbGVUeXBlPXR5cGVvZiB0eXBlcz09PVwic3RyaW5nXCI/dHlwZXM6bnVsbDt2YXIgcmV0O2lmKGFsbG9jYXRvcj09QUxMT0NfTk9ORSl7cmV0PXB0cn1lbHNle3JldD1bX21hbGxvYyxSdW50aW1lLnN0YWNrQWxsb2MsUnVudGltZS5zdGF0aWNBbGxvYyxSdW50aW1lLmR5bmFtaWNBbGxvY11bYWxsb2NhdG9yPT09dW5kZWZpbmVkP0FMTE9DX1NUQVRJQzphbGxvY2F0b3JdKE1hdGgubWF4KHNpemUsc2luZ2xlVHlwZT8xOnR5cGVzLmxlbmd0aCkpfWlmKHplcm9pbml0KXt2YXIgcHRyPXJldCxzdG9wO2Fzc2VydCgocmV0JjMpPT0wKTtzdG9wPXJldCsoc2l6ZSZ+Myk7Zm9yKDtwdHI8c3RvcDtwdHIrPTQpe0hFQVAzMltwdHI+PjJdPTB9c3RvcD1yZXQrc2l6ZTt3aGlsZShwdHI8c3RvcCl7SEVBUDhbcHRyKys+PjBdPTB9cmV0dXJuIHJldH1pZihzaW5nbGVUeXBlPT09XCJpOFwiKXtpZihzbGFiLnN1YmFycmF5fHxzbGFiLnNsaWNlKXtIRUFQVTguc2V0KHNsYWIscmV0KX1lbHNle0hFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoc2xhYikscmV0KX1yZXR1cm4gcmV0fXZhciBpPTAsdHlwZSx0eXBlU2l6ZSxwcmV2aW91c1R5cGU7d2hpbGUoaTxzaXplKXt2YXIgY3Vycj1zbGFiW2ldO2lmKHR5cGVvZiBjdXJyPT09XCJmdW5jdGlvblwiKXtjdXJyPVJ1bnRpbWUuZ2V0RnVuY3Rpb25JbmRleChjdXJyKX10eXBlPXNpbmdsZVR5cGV8fHR5cGVzW2ldO2lmKHR5cGU9PT0wKXtpKys7Y29udGludWV9aWYodHlwZT09XCJpNjRcIil0eXBlPVwiaTMyXCI7c2V0VmFsdWUocmV0K2ksY3Vycix0eXBlKTtpZihwcmV2aW91c1R5cGUhPT10eXBlKXt0eXBlU2l6ZT1SdW50aW1lLmdldE5hdGl2ZVR5cGVTaXplKHR5cGUpO3ByZXZpb3VzVHlwZT10eXBlfWkrPXR5cGVTaXplfXJldHVybiByZXR9TW9kdWxlW1wiYWxsb2NhdGVcIl09YWxsb2NhdGU7ZnVuY3Rpb24gZ2V0TWVtb3J5KHNpemUpe2lmKCFzdGF0aWNTZWFsZWQpcmV0dXJuIFJ1bnRpbWUuc3RhdGljQWxsb2Moc2l6ZSk7aWYodHlwZW9mIF9zYnJrIT09XCJ1bmRlZmluZWRcIiYmIV9zYnJrLmNhbGxlZHx8IXJ1bnRpbWVJbml0aWFsaXplZClyZXR1cm4gUnVudGltZS5keW5hbWljQWxsb2Moc2l6ZSk7cmV0dXJuIF9tYWxsb2Moc2l6ZSl9TW9kdWxlW1wiZ2V0TWVtb3J5XCJdPWdldE1lbW9yeTtmdW5jdGlvbiBQb2ludGVyX3N0cmluZ2lmeShwdHIsbGVuZ3RoKXtpZihsZW5ndGg9PT0wfHwhcHRyKXJldHVyblwiXCI7dmFyIGhhc1V0Zj0wO3ZhciB0O3ZhciBpPTA7d2hpbGUoMSl7dD1IRUFQVThbcHRyK2k+PjBdO2hhc1V0Znw9dDtpZih0PT0wJiYhbGVuZ3RoKWJyZWFrO2krKztpZihsZW5ndGgmJmk9PWxlbmd0aClicmVha31pZighbGVuZ3RoKWxlbmd0aD1pO3ZhciByZXQ9XCJcIjtpZihoYXNVdGY8MTI4KXt2YXIgTUFYX0NIVU5LPTEwMjQ7dmFyIGN1cnI7d2hpbGUobGVuZ3RoPjApe2N1cnI9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsSEVBUFU4LnN1YmFycmF5KHB0cixwdHIrTWF0aC5taW4obGVuZ3RoLE1BWF9DSFVOSykpKTtyZXQ9cmV0P3JldCtjdXJyOmN1cnI7cHRyKz1NQVhfQ0hVTks7bGVuZ3RoLT1NQVhfQ0hVTkt9cmV0dXJuIHJldH1yZXR1cm4gTW9kdWxlW1wiVVRGOFRvU3RyaW5nXCJdKHB0cil9TW9kdWxlW1wiUG9pbnRlcl9zdHJpbmdpZnlcIl09UG9pbnRlcl9zdHJpbmdpZnk7ZnVuY3Rpb24gQXNjaWlUb1N0cmluZyhwdHIpe3ZhciBzdHI9XCJcIjt3aGlsZSgxKXt2YXIgY2g9SEVBUDhbcHRyKys+PjBdO2lmKCFjaClyZXR1cm4gc3RyO3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZShjaCl9fU1vZHVsZVtcIkFzY2lpVG9TdHJpbmdcIl09QXNjaWlUb1N0cmluZztmdW5jdGlvbiBzdHJpbmdUb0FzY2lpKHN0cixvdXRQdHIpe3JldHVybiB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyLG91dFB0cixmYWxzZSl9TW9kdWxlW1wic3RyaW5nVG9Bc2NpaVwiXT1zdHJpbmdUb0FzY2lpO2Z1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKHU4QXJyYXksaWR4KXt2YXIgdTAsdTEsdTIsdTMsdTQsdTU7dmFyIHN0cj1cIlwiO3doaWxlKDEpe3UwPXU4QXJyYXlbaWR4KytdO2lmKCF1MClyZXR1cm4gc3RyO2lmKCEodTAmMTI4KSl7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTtjb250aW51ZX11MT11OEFycmF5W2lkeCsrXSY2MztpZigodTAmMjI0KT09MTkyKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKHUwJjMxKTw8Nnx1MSk7Y29udGludWV9dTI9dThBcnJheVtpZHgrK10mNjM7aWYoKHUwJjI0MCk9PTIyNCl7dTA9KHUwJjE1KTw8MTJ8dTE8PDZ8dTJ9ZWxzZXt1Mz11OEFycmF5W2lkeCsrXSY2MztpZigodTAmMjQ4KT09MjQwKXt1MD0odTAmNyk8PDE4fHUxPDwxMnx1Mjw8Nnx1M31lbHNle3U0PXU4QXJyYXlbaWR4KytdJjYzO2lmKCh1MCYyNTIpPT0yNDgpe3UwPSh1MCYzKTw8MjR8dTE8PDE4fHUyPDwxMnx1Mzw8Nnx1NH1lbHNle3U1PXU4QXJyYXlbaWR4KytdJjYzO3UwPSh1MCYxKTw8MzB8dTE8PDI0fHUyPDwxOHx1Mzw8MTJ8dTQ8PDZ8dTV9fX1pZih1MDw2NTUzNil7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHUwKX1lbHNle3ZhciBjaD11MC02NTUzNjtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Y2g+PjEwLDU2MzIwfGNoJjEwMjMpfX19TW9kdWxlW1wiVVRGOEFycmF5VG9TdHJpbmdcIl09VVRGOEFycmF5VG9TdHJpbmc7ZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0cil7cmV0dXJuIFVURjhBcnJheVRvU3RyaW5nKEhFQVBVOCxwdHIpfU1vZHVsZVtcIlVURjhUb1N0cmluZ1wiXT1VVEY4VG9TdHJpbmc7ZnVuY3Rpb24gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLG91dFU4QXJyYXksb3V0SWR4LG1heEJ5dGVzVG9Xcml0ZSl7aWYoIShtYXhCeXRlc1RvV3JpdGU+MCkpcmV0dXJuIDA7dmFyIHN0YXJ0SWR4PW91dElkeDt2YXIgZW5kSWR4PW91dElkeCttYXhCeXRlc1RvV3JpdGUtMTtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpdT02NTUzNisoKHUmMTAyMyk8PDEwKXxzdHIuY2hhckNvZGVBdCgrK2kpJjEwMjM7aWYodTw9MTI3KXtpZihvdXRJZHg+PWVuZElkeClicmVhaztvdXRVOEFycmF5W291dElkeCsrXT11fWVsc2UgaWYodTw9MjA0Nyl7aWYob3V0SWR4KzE+PWVuZElkeClicmVhaztvdXRVOEFycmF5W291dElkeCsrXT0xOTJ8dT4+NjtvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTY1NTM1KXtpZihvdXRJZHgrMj49ZW5kSWR4KWJyZWFrO291dFU4QXJyYXlbb3V0SWR4KytdPTIyNHx1Pj4xMjtvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+NiY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTIwOTcxNTEpe2lmKG91dElkeCszPj1lbmRJZHgpYnJlYWs7b3V0VThBcnJheVtvdXRJZHgrK109MjQwfHU+PjE4O291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1Pj4xMiY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+NiY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dSY2M31lbHNlIGlmKHU8PTY3MTA4ODYzKXtpZihvdXRJZHgrND49ZW5kSWR4KWJyZWFrO291dFU4QXJyYXlbb3V0SWR4KytdPTI0OHx1Pj4yNDtvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+MTgmNjM7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHU+PjEyJjYzO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1Pj42JjYzO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2V7aWYob3V0SWR4KzU+PWVuZElkeClicmVhaztvdXRVOEFycmF5W291dElkeCsrXT0yNTJ8dT4+MzA7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHU+PjI0JjYzO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1Pj4xOCY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+MTImNjM7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHU+PjYmNjM7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHUmNjN9fW91dFU4QXJyYXlbb3V0SWR4XT0wO3JldHVybiBvdXRJZHgtc3RhcnRJZHh9TW9kdWxlW1wic3RyaW5nVG9VVEY4QXJyYXlcIl09c3RyaW5nVG9VVEY4QXJyYXk7ZnVuY3Rpb24gc3RyaW5nVG9VVEY4KHN0cixvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKXtyZXR1cm4gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLEhFQVBVOCxvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKX1Nb2R1bGVbXCJzdHJpbmdUb1VURjhcIl09c3RyaW5nVG9VVEY4O2Z1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGOChzdHIpe3ZhciBsZW49MDtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgdT1zdHIuY2hhckNvZGVBdChpKTtpZih1Pj01NTI5NiYmdTw9NTczNDMpdT02NTUzNisoKHUmMTAyMyk8PDEwKXxzdHIuY2hhckNvZGVBdCgrK2kpJjEwMjM7aWYodTw9MTI3KXsrK2xlbn1lbHNlIGlmKHU8PTIwNDcpe2xlbis9Mn1lbHNlIGlmKHU8PTY1NTM1KXtsZW4rPTN9ZWxzZSBpZih1PD0yMDk3MTUxKXtsZW4rPTR9ZWxzZSBpZih1PD02NzEwODg2Myl7bGVuKz01fWVsc2V7bGVuKz02fX1yZXR1cm4gbGVufU1vZHVsZVtcImxlbmd0aEJ5dGVzVVRGOFwiXT1sZW5ndGhCeXRlc1VURjg7ZnVuY3Rpb24gVVRGMTZUb1N0cmluZyhwdHIpe3ZhciBpPTA7dmFyIHN0cj1cIlwiO3doaWxlKDEpe3ZhciBjb2RlVW5pdD1IRUFQMTZbcHRyK2kqMj4+MV07aWYoY29kZVVuaXQ9PTApcmV0dXJuIHN0cjsrK2k7c3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVVbml0KX19TW9kdWxlW1wiVVRGMTZUb1N0cmluZ1wiXT1VVEYxNlRvU3RyaW5nO2Z1bmN0aW9uIHN0cmluZ1RvVVRGMTYoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe2lmKG1heEJ5dGVzVG9Xcml0ZT09PXVuZGVmaW5lZCl7bWF4Qnl0ZXNUb1dyaXRlPTIxNDc0ODM2NDd9aWYobWF4Qnl0ZXNUb1dyaXRlPDIpcmV0dXJuIDA7bWF4Qnl0ZXNUb1dyaXRlLT0yO3ZhciBzdGFydFB0cj1vdXRQdHI7dmFyIG51bUNoYXJzVG9Xcml0ZT1tYXhCeXRlc1RvV3JpdGU8c3RyLmxlbmd0aCoyP21heEJ5dGVzVG9Xcml0ZS8yOnN0ci5sZW5ndGg7Zm9yKHZhciBpPTA7aTxudW1DaGFyc1RvV3JpdGU7KytpKXt2YXIgY29kZVVuaXQ9c3RyLmNoYXJDb2RlQXQoaSk7SEVBUDE2W291dFB0cj4+MV09Y29kZVVuaXQ7b3V0UHRyKz0yfUhFQVAxNltvdXRQdHI+PjFdPTA7cmV0dXJuIG91dFB0ci1zdGFydFB0cn1Nb2R1bGVbXCJzdHJpbmdUb1VURjE2XCJdPXN0cmluZ1RvVVRGMTY7ZnVuY3Rpb24gbGVuZ3RoQnl0ZXNVVEYxNihzdHIpe3JldHVybiBzdHIubGVuZ3RoKjJ9TW9kdWxlW1wibGVuZ3RoQnl0ZXNVVEYxNlwiXT1sZW5ndGhCeXRlc1VURjE2O2Z1bmN0aW9uIFVURjMyVG9TdHJpbmcocHRyKXt2YXIgaT0wO3ZhciBzdHI9XCJcIjt3aGlsZSgxKXt2YXIgdXRmMzI9SEVBUDMyW3B0citpKjQ+PjJdO2lmKHV0ZjMyPT0wKXJldHVybiBzdHI7KytpO2lmKHV0ZjMyPj02NTUzNil7dmFyIGNoPXV0ZjMyLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9ZWxzZXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodXRmMzIpfX19TW9kdWxlW1wiVVRGMzJUb1N0cmluZ1wiXT1VVEYzMlRvU3RyaW5nO2Z1bmN0aW9uIHN0cmluZ1RvVVRGMzIoc3RyLG91dFB0cixtYXhCeXRlc1RvV3JpdGUpe2lmKG1heEJ5dGVzVG9Xcml0ZT09PXVuZGVmaW5lZCl7bWF4Qnl0ZXNUb1dyaXRlPTIxNDc0ODM2NDd9aWYobWF4Qnl0ZXNUb1dyaXRlPDQpcmV0dXJuIDA7dmFyIHN0YXJ0UHRyPW91dFB0cjt2YXIgZW5kUHRyPXN0YXJ0UHRyK21heEJ5dGVzVG9Xcml0ZS00O2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3ZhciBjb2RlVW5pdD1zdHIuY2hhckNvZGVBdChpKTtpZihjb2RlVW5pdD49NTUyOTYmJmNvZGVVbml0PD01NzM0Myl7dmFyIHRyYWlsU3Vycm9nYXRlPXN0ci5jaGFyQ29kZUF0KCsraSk7Y29kZVVuaXQ9NjU1MzYrKChjb2RlVW5pdCYxMDIzKTw8MTApfHRyYWlsU3Vycm9nYXRlJjEwMjN9SEVBUDMyW291dFB0cj4+Ml09Y29kZVVuaXQ7b3V0UHRyKz00O2lmKG91dFB0cis0PmVuZFB0cilicmVha31IRUFQMzJbb3V0UHRyPj4yXT0wO3JldHVybiBvdXRQdHItc3RhcnRQdHJ9TW9kdWxlW1wic3RyaW5nVG9VVEYzMlwiXT1zdHJpbmdUb1VURjMyO2Z1bmN0aW9uIGxlbmd0aEJ5dGVzVVRGMzIoc3RyKXt2YXIgbGVuPTA7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyIGNvZGVVbml0PXN0ci5jaGFyQ29kZUF0KGkpO2lmKGNvZGVVbml0Pj01NTI5NiYmY29kZVVuaXQ8PTU3MzQzKSsraTtsZW4rPTR9cmV0dXJuIGxlbn1Nb2R1bGVbXCJsZW5ndGhCeXRlc1VURjMyXCJdPWxlbmd0aEJ5dGVzVVRGMzI7ZnVuY3Rpb24gZGVtYW5nbGUoZnVuYyl7dmFyIGhhc0xpYmN4eGFiaT0hIU1vZHVsZVtcIl9fX2N4YV9kZW1hbmdsZVwiXTtpZihoYXNMaWJjeHhhYmkpe3RyeXt2YXIgYnVmPV9tYWxsb2MoZnVuYy5sZW5ndGgpO3dyaXRlU3RyaW5nVG9NZW1vcnkoZnVuYy5zdWJzdHIoMSksYnVmKTt2YXIgc3RhdHVzPV9tYWxsb2MoNCk7dmFyIHJldD1Nb2R1bGVbXCJfX19jeGFfZGVtYW5nbGVcIl0oYnVmLDAsMCxzdGF0dXMpO2lmKGdldFZhbHVlKHN0YXR1cyxcImkzMlwiKT09PTAmJnJldCl7cmV0dXJuIFBvaW50ZXJfc3RyaW5naWZ5KHJldCl9fWNhdGNoKGUpe31maW5hbGx5e2lmKGJ1ZilfZnJlZShidWYpO2lmKHN0YXR1cylfZnJlZShzdGF0dXMpO2lmKHJldClfZnJlZShyZXQpfX12YXIgaT0zO3ZhciBiYXNpY1R5cGVzPXtcInZcIjpcInZvaWRcIixcImJcIjpcImJvb2xcIixcImNcIjpcImNoYXJcIixcInNcIjpcInNob3J0XCIsXCJpXCI6XCJpbnRcIixcImxcIjpcImxvbmdcIixcImZcIjpcImZsb2F0XCIsXCJkXCI6XCJkb3VibGVcIixcIndcIjpcIndjaGFyX3RcIixcImFcIjpcInNpZ25lZCBjaGFyXCIsXCJoXCI6XCJ1bnNpZ25lZCBjaGFyXCIsXCJ0XCI6XCJ1bnNpZ25lZCBzaG9ydFwiLFwialwiOlwidW5zaWduZWQgaW50XCIsXCJtXCI6XCJ1bnNpZ25lZCBsb25nXCIsXCJ4XCI6XCJsb25nIGxvbmdcIixcInlcIjpcInVuc2lnbmVkIGxvbmcgbG9uZ1wiLFwielwiOlwiLi4uXCJ9O3ZhciBzdWJzPVtdO3ZhciBmaXJzdD10cnVlO2Z1bmN0aW9uIGR1bXAoeCl7aWYoeClNb2R1bGUucHJpbnQoeCk7TW9kdWxlLnByaW50KGZ1bmMpO3ZhciBwcmU9XCJcIjtmb3IodmFyIGE9MDthPGk7YSsrKXByZSs9XCIgXCI7TW9kdWxlLnByaW50KHByZStcIl5cIil9ZnVuY3Rpb24gcGFyc2VOZXN0ZWQoKXtpKys7aWYoZnVuY1tpXT09PVwiS1wiKWkrKzt2YXIgcGFydHM9W107d2hpbGUoZnVuY1tpXSE9PVwiRVwiKXtpZihmdW5jW2ldPT09XCJTXCIpe2krKzt2YXIgbmV4dD1mdW5jLmluZGV4T2YoXCJfXCIsaSk7dmFyIG51bT1mdW5jLnN1YnN0cmluZyhpLG5leHQpfHwwO3BhcnRzLnB1c2goc3Vic1tudW1dfHxcIj9cIik7aT1uZXh0KzE7Y29udGludWV9aWYoZnVuY1tpXT09PVwiQ1wiKXtwYXJ0cy5wdXNoKHBhcnRzW3BhcnRzLmxlbmd0aC0xXSk7aSs9Mjtjb250aW51ZX12YXIgc2l6ZT1wYXJzZUludChmdW5jLnN1YnN0cihpKSk7dmFyIHByZT1zaXplLnRvU3RyaW5nKCkubGVuZ3RoO2lmKCFzaXplfHwhcHJlKXtpLS07YnJlYWt9dmFyIGN1cnI9ZnVuYy5zdWJzdHIoaStwcmUsc2l6ZSk7cGFydHMucHVzaChjdXJyKTtzdWJzLnB1c2goY3Vycik7aSs9cHJlK3NpemV9aSsrO3JldHVybiBwYXJ0c31mdW5jdGlvbiBwYXJzZShyYXdMaXN0LGxpbWl0LGFsbG93Vm9pZCl7bGltaXQ9bGltaXR8fEluZmluaXR5O3ZhciByZXQ9XCJcIixsaXN0PVtdO2Z1bmN0aW9uIGZsdXNoTGlzdCgpe3JldHVyblwiKFwiK2xpc3Quam9pbihcIiwgXCIpK1wiKVwifXZhciBuYW1lO2lmKGZ1bmNbaV09PT1cIk5cIil7bmFtZT1wYXJzZU5lc3RlZCgpLmpvaW4oXCI6OlwiKTtsaW1pdC0tO2lmKGxpbWl0PT09MClyZXR1cm4gcmF3TGlzdD9bbmFtZV06bmFtZX1lbHNle2lmKGZ1bmNbaV09PT1cIktcInx8Zmlyc3QmJmZ1bmNbaV09PT1cIkxcIilpKys7dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO2lmKHNpemUpe3ZhciBwcmU9c2l6ZS50b1N0cmluZygpLmxlbmd0aDtuYW1lPWZ1bmMuc3Vic3RyKGkrcHJlLHNpemUpO2krPXByZStzaXplfX1maXJzdD1mYWxzZTtpZihmdW5jW2ldPT09XCJJXCIpe2krKzt2YXIgaUxpc3Q9cGFyc2UodHJ1ZSk7dmFyIGlSZXQ9cGFyc2UodHJ1ZSwxLHRydWUpO3JldCs9aVJldFswXStcIiBcIituYW1lK1wiPFwiK2lMaXN0LmpvaW4oXCIsIFwiKStcIj5cIn1lbHNle3JldD1uYW1lfXBhcmFtTG9vcDp3aGlsZShpPGZ1bmMubGVuZ3RoJiZsaW1pdC0tPjApe3ZhciBjPWZ1bmNbaSsrXTtpZihjIGluIGJhc2ljVHlwZXMpe2xpc3QucHVzaChiYXNpY1R5cGVzW2NdKX1lbHNle3N3aXRjaChjKXtjYXNlXCJQXCI6bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXStcIipcIik7YnJlYWs7Y2FzZVwiUlwiOmxpc3QucHVzaChwYXJzZSh0cnVlLDEsdHJ1ZSlbMF0rXCImXCIpO2JyZWFrO2Nhc2VcIkxcIjp7aSsrO3ZhciBlbmQ9ZnVuYy5pbmRleE9mKFwiRVwiLGkpO3ZhciBzaXplPWVuZC1pO2xpc3QucHVzaChmdW5jLnN1YnN0cihpLHNpemUpKTtpKz1zaXplKzI7YnJlYWt9O2Nhc2VcIkFcIjp7dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO2krPXNpemUudG9TdHJpbmcoKS5sZW5ndGg7aWYoZnVuY1tpXSE9PVwiX1wiKXRocm93XCI/XCI7aSsrO2xpc3QucHVzaChwYXJzZSh0cnVlLDEsdHJ1ZSlbMF0rXCIgW1wiK3NpemUrXCJdXCIpO2JyZWFrfTtjYXNlXCJFXCI6YnJlYWsgcGFyYW1Mb29wO2RlZmF1bHQ6cmV0Kz1cIj9cIitjO2JyZWFrIHBhcmFtTG9vcH19fWlmKCFhbGxvd1ZvaWQmJmxpc3QubGVuZ3RoPT09MSYmbGlzdFswXT09PVwidm9pZFwiKWxpc3Q9W107aWYocmF3TGlzdCl7aWYocmV0KXtsaXN0LnB1c2gocmV0K1wiP1wiKX1yZXR1cm4gbGlzdH1lbHNle3JldHVybiByZXQrZmx1c2hMaXN0KCl9fXZhciBwYXJzZWQ9ZnVuYzt0cnl7aWYoZnVuYz09XCJPYmplY3QuX21haW5cInx8ZnVuYz09XCJfbWFpblwiKXtyZXR1cm5cIm1haW4oKVwifWlmKHR5cGVvZiBmdW5jPT09XCJudW1iZXJcIilmdW5jPVBvaW50ZXJfc3RyaW5naWZ5KGZ1bmMpO2lmKGZ1bmNbMF0hPT1cIl9cIilyZXR1cm4gZnVuYztpZihmdW5jWzFdIT09XCJfXCIpcmV0dXJuIGZ1bmM7aWYoZnVuY1syXSE9PVwiWlwiKXJldHVybiBmdW5jO3N3aXRjaChmdW5jWzNdKXtjYXNlXCJuXCI6cmV0dXJuXCJvcGVyYXRvciBuZXcoKVwiO2Nhc2VcImRcIjpyZXR1cm5cIm9wZXJhdG9yIGRlbGV0ZSgpXCJ9cGFyc2VkPXBhcnNlKCl9Y2F0Y2goZSl7cGFyc2VkKz1cIj9cIn1pZihwYXJzZWQuaW5kZXhPZihcIj9cIik+PTAmJiFoYXNMaWJjeHhhYmkpe1J1bnRpbWUud2Fybk9uY2UoXCJ3YXJuaW5nOiBhIHByb2JsZW0gb2NjdXJyZWQgaW4gYnVpbHRpbiBDKysgbmFtZSBkZW1hbmdsaW5nOyBidWlsZCB3aXRoICAtcyBERU1BTkdMRV9TVVBQT1JUPTEgIHRvIGxpbmsgaW4gbGliY3h4YWJpIGRlbWFuZ2xpbmdcIil9cmV0dXJuIHBhcnNlZH1mdW5jdGlvbiBkZW1hbmdsZUFsbCh0ZXh0KXtyZXR1cm4gdGV4dC5yZXBsYWNlKC9fX1pbXFx3XFxkX10rL2csKGZ1bmN0aW9uKHgpe3ZhciB5PWRlbWFuZ2xlKHgpO3JldHVybiB4PT09eT94OngrXCIgW1wiK3krXCJdXCJ9KSl9ZnVuY3Rpb24ganNTdGFja1RyYWNlKCl7dmFyIGVycj1uZXcgRXJyb3I7aWYoIWVyci5zdGFjayl7dHJ5e3Rocm93IG5ldyBFcnJvcigwKX1jYXRjaChlKXtlcnI9ZX1pZighZXJyLnN0YWNrKXtyZXR1cm5cIihubyBzdGFjayB0cmFjZSBhdmFpbGFibGUpXCJ9fXJldHVybiBlcnIuc3RhY2sudG9TdHJpbmcoKX1mdW5jdGlvbiBzdGFja1RyYWNlKCl7cmV0dXJuIGRlbWFuZ2xlQWxsKGpzU3RhY2tUcmFjZSgpKX1Nb2R1bGVbXCJzdGFja1RyYWNlXCJdPXN0YWNrVHJhY2U7dmFyIFBBR0VfU0laRT00MDk2O2Z1bmN0aW9uIGFsaWduTWVtb3J5UGFnZSh4KXtpZih4JTQwOTY+MCl7eCs9NDA5Ni14JTQwOTZ9cmV0dXJuIHh9dmFyIEhFQVA7dmFyIEhFQVA4LEhFQVBVOCxIRUFQMTYsSEVBUFUxNixIRUFQMzIsSEVBUFUzMixIRUFQRjMyLEhFQVBGNjQ7dmFyIFNUQVRJQ19CQVNFPTAsU1RBVElDVE9QPTAsc3RhdGljU2VhbGVkPWZhbHNlO3ZhciBTVEFDS19CQVNFPTAsU1RBQ0tUT1A9MCxTVEFDS19NQVg9MDt2YXIgRFlOQU1JQ19CQVNFPTAsRFlOQU1JQ1RPUD0wO2Z1bmN0aW9uIGFib3J0T25DYW5ub3RHcm93TWVtb3J5KCl7YWJvcnQoXCJDYW5ub3QgZW5sYXJnZSBtZW1vcnkgYXJyYXlzLiBFaXRoZXIgKDEpIGNvbXBpbGUgd2l0aCAgLXMgVE9UQUxfTUVNT1JZPVggIHdpdGggWCBoaWdoZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSBcIitUT1RBTF9NRU1PUlkrXCIsICgyKSBjb21waWxlIHdpdGggIC1zIEFMTE9XX01FTU9SWV9HUk9XVEg9MSAgd2hpY2ggYWRqdXN0cyB0aGUgc2l6ZSBhdCBydW50aW1lIGJ1dCBwcmV2ZW50cyBzb21lIG9wdGltaXphdGlvbnMsICgzKSBzZXQgTW9kdWxlLlRPVEFMX01FTU9SWSB0byBhIGhpZ2hlciB2YWx1ZSBiZWZvcmUgdGhlIHByb2dyYW0gcnVucywgb3IgaWYgeW91IHdhbnQgbWFsbG9jIHRvIHJldHVybiBOVUxMICgwKSBpbnN0ZWFkIG9mIHRoaXMgYWJvcnQsIGNvbXBpbGUgd2l0aCAgLXMgQUJPUlRJTkdfTUFMTE9DPTAgXCIpfWZ1bmN0aW9uIGVubGFyZ2VNZW1vcnkoKXthYm9ydE9uQ2Fubm90R3Jvd01lbW9yeSgpfXZhciBUT1RBTF9TVEFDSz1Nb2R1bGVbXCJUT1RBTF9TVEFDS1wiXXx8NTI0Mjg4MDt2YXIgVE9UQUxfTUVNT1JZPU1vZHVsZVtcIlRPVEFMX01FTU9SWVwiXXx8MzM1NTQ0MzI7dmFyIHRvdGFsTWVtb3J5PTY0KjEwMjQ7d2hpbGUodG90YWxNZW1vcnk8VE9UQUxfTUVNT1JZfHx0b3RhbE1lbW9yeTwyKlRPVEFMX1NUQUNLKXtpZih0b3RhbE1lbW9yeTwxNioxMDI0KjEwMjQpe3RvdGFsTWVtb3J5Kj0yfWVsc2V7dG90YWxNZW1vcnkrPTE2KjEwMjQqMTAyNH19aWYodG90YWxNZW1vcnkhPT1UT1RBTF9NRU1PUlkpe1RPVEFMX01FTU9SWT10b3RhbE1lbW9yeX1hc3NlcnQodHlwZW9mIEludDMyQXJyYXkhPT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgRmxvYXQ2NEFycmF5IT09XCJ1bmRlZmluZWRcIiYmISEobmV3IEludDMyQXJyYXkoMSkpW1wic3ViYXJyYXlcIl0mJiEhKG5ldyBJbnQzMkFycmF5KDEpKVtcInNldFwiXSxcIkpTIGVuZ2luZSBkb2VzIG5vdCBwcm92aWRlIGZ1bGwgdHlwZWQgYXJyYXkgc3VwcG9ydFwiKTt2YXIgYnVmZmVyO2J1ZmZlcj1uZXcgQXJyYXlCdWZmZXIoVE9UQUxfTUVNT1JZKTtIRUFQOD1uZXcgSW50OEFycmF5KGJ1ZmZlcik7SEVBUDE2PW5ldyBJbnQxNkFycmF5KGJ1ZmZlcik7SEVBUDMyPW5ldyBJbnQzMkFycmF5KGJ1ZmZlcik7SEVBUFU4PW5ldyBVaW50OEFycmF5KGJ1ZmZlcik7SEVBUFUxNj1uZXcgVWludDE2QXJyYXkoYnVmZmVyKTtIRUFQVTMyPW5ldyBVaW50MzJBcnJheShidWZmZXIpO0hFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShidWZmZXIpO0hFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShidWZmZXIpO0hFQVAzMlswXT0yNTU7YXNzZXJ0KEhFQVBVOFswXT09PTI1NSYmSEVBUFU4WzNdPT09MCxcIlR5cGVkIGFycmF5cyAyIG11c3QgYmUgcnVuIG9uIGEgbGl0dGxlLWVuZGlhbiBzeXN0ZW1cIik7TW9kdWxlW1wiSEVBUFwiXT1IRUFQO01vZHVsZVtcImJ1ZmZlclwiXT1idWZmZXI7TW9kdWxlW1wiSEVBUDhcIl09SEVBUDg7TW9kdWxlW1wiSEVBUDE2XCJdPUhFQVAxNjtNb2R1bGVbXCJIRUFQMzJcIl09SEVBUDMyO01vZHVsZVtcIkhFQVBVOFwiXT1IRUFQVTg7TW9kdWxlW1wiSEVBUFUxNlwiXT1IRUFQVTE2O01vZHVsZVtcIkhFQVBVMzJcIl09SEVBUFUzMjtNb2R1bGVbXCJIRUFQRjMyXCJdPUhFQVBGMzI7TW9kdWxlW1wiSEVBUEY2NFwiXT1IRUFQRjY0O2Z1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcyl7d2hpbGUoY2FsbGJhY2tzLmxlbmd0aD4wKXt2YXIgY2FsbGJhY2s9Y2FsbGJhY2tzLnNoaWZ0KCk7aWYodHlwZW9mIGNhbGxiYWNrPT1cImZ1bmN0aW9uXCIpe2NhbGxiYWNrKCk7Y29udGludWV9dmFyIGZ1bmM9Y2FsbGJhY2suZnVuYztpZih0eXBlb2YgZnVuYz09PVwibnVtYmVyXCIpe2lmKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZCl7UnVudGltZS5keW5DYWxsKFwidlwiLGZ1bmMpfWVsc2V7UnVudGltZS5keW5DYWxsKFwidmlcIixmdW5jLFtjYWxsYmFjay5hcmddKX19ZWxzZXtmdW5jKGNhbGxiYWNrLmFyZz09PXVuZGVmaW5lZD9udWxsOmNhbGxiYWNrLmFyZyl9fX12YXIgX19BVFBSRVJVTl9fPVtdO3ZhciBfX0FUSU5JVF9fPVtdO3ZhciBfX0FUTUFJTl9fPVtdO3ZhciBfX0FURVhJVF9fPVtdO3ZhciBfX0FUUE9TVFJVTl9fPVtdO3ZhciBydW50aW1lSW5pdGlhbGl6ZWQ9ZmFsc2U7dmFyIHJ1bnRpbWVFeGl0ZWQ9ZmFsc2U7ZnVuY3Rpb24gcHJlUnVuKCl7aWYoTW9kdWxlW1wicHJlUnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicHJlUnVuXCJdPT1cImZ1bmN0aW9uXCIpTW9kdWxlW1wicHJlUnVuXCJdPVtNb2R1bGVbXCJwcmVSdW5cIl1dO3doaWxlKE1vZHVsZVtcInByZVJ1blwiXS5sZW5ndGgpe2FkZE9uUHJlUnVuKE1vZHVsZVtcInByZVJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBSRVJVTl9fKX1mdW5jdGlvbiBlbnN1cmVJbml0UnVudGltZSgpe2lmKHJ1bnRpbWVJbml0aWFsaXplZClyZXR1cm47cnVudGltZUluaXRpYWxpemVkPXRydWU7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyl9ZnVuY3Rpb24gcHJlTWFpbigpe2NhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pfWZ1bmN0aW9uIGV4aXRSdW50aW1lKCl7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVEVYSVRfXyk7cnVudGltZUV4aXRlZD10cnVlfWZ1bmN0aW9uIHBvc3RSdW4oKXtpZihNb2R1bGVbXCJwb3N0UnVuXCJdKXtpZih0eXBlb2YgTW9kdWxlW1wicG9zdFJ1blwiXT09XCJmdW5jdGlvblwiKU1vZHVsZVtcInBvc3RSdW5cIl09W01vZHVsZVtcInBvc3RSdW5cIl1dO3doaWxlKE1vZHVsZVtcInBvc3RSdW5cIl0ubGVuZ3RoKXthZGRPblBvc3RSdW4oTW9kdWxlW1wicG9zdFJ1blwiXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyl9ZnVuY3Rpb24gYWRkT25QcmVSdW4oY2Ipe19fQVRQUkVSVU5fXy51bnNoaWZ0KGNiKX1Nb2R1bGVbXCJhZGRPblByZVJ1blwiXT1hZGRPblByZVJ1bjtmdW5jdGlvbiBhZGRPbkluaXQoY2Ipe19fQVRJTklUX18udW5zaGlmdChjYil9TW9kdWxlW1wiYWRkT25Jbml0XCJdPWFkZE9uSW5pdDtmdW5jdGlvbiBhZGRPblByZU1haW4oY2Ipe19fQVRNQUlOX18udW5zaGlmdChjYil9TW9kdWxlW1wiYWRkT25QcmVNYWluXCJdPWFkZE9uUHJlTWFpbjtmdW5jdGlvbiBhZGRPbkV4aXQoY2Ipe19fQVRFWElUX18udW5zaGlmdChjYil9TW9kdWxlW1wiYWRkT25FeGl0XCJdPWFkZE9uRXhpdDtmdW5jdGlvbiBhZGRPblBvc3RSdW4oY2Ipe19fQVRQT1NUUlVOX18udW5zaGlmdChjYil9TW9kdWxlW1wiYWRkT25Qb3N0UnVuXCJdPWFkZE9uUG9zdFJ1bjtmdW5jdGlvbiBpbnRBcnJheUZyb21TdHJpbmcoc3RyaW5neSxkb250QWRkTnVsbCxsZW5ndGgpe3ZhciBsZW49bGVuZ3RoPjA/bGVuZ3RoOmxlbmd0aEJ5dGVzVVRGOChzdHJpbmd5KSsxO3ZhciB1OGFycmF5PW5ldyBBcnJheShsZW4pO3ZhciBudW1CeXRlc1dyaXR0ZW49c3RyaW5nVG9VVEY4QXJyYXkoc3RyaW5neSx1OGFycmF5LDAsdThhcnJheS5sZW5ndGgpO2lmKGRvbnRBZGROdWxsKXU4YXJyYXkubGVuZ3RoPW51bUJ5dGVzV3JpdHRlbjtyZXR1cm4gdThhcnJheX1Nb2R1bGVbXCJpbnRBcnJheUZyb21TdHJpbmdcIl09aW50QXJyYXlGcm9tU3RyaW5nO2Z1bmN0aW9uIGludEFycmF5VG9TdHJpbmcoYXJyYXkpe3ZhciByZXQ9W107Zm9yKHZhciBpPTA7aTxhcnJheS5sZW5ndGg7aSsrKXt2YXIgY2hyPWFycmF5W2ldO2lmKGNocj4yNTUpe2NociY9MjU1fXJldC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKSl9cmV0dXJuIHJldC5qb2luKFwiXCIpfU1vZHVsZVtcImludEFycmF5VG9TdHJpbmdcIl09aW50QXJyYXlUb1N0cmluZztmdW5jdGlvbiB3cml0ZVN0cmluZ1RvTWVtb3J5KHN0cmluZyxidWZmZXIsZG9udEFkZE51bGwpe3ZhciBhcnJheT1pbnRBcnJheUZyb21TdHJpbmcoc3RyaW5nLGRvbnRBZGROdWxsKTt2YXIgaT0wO3doaWxlKGk8YXJyYXkubGVuZ3RoKXt2YXIgY2hyPWFycmF5W2ldO0hFQVA4W2J1ZmZlcitpPj4wXT1jaHI7aT1pKzF9fU1vZHVsZVtcIndyaXRlU3RyaW5nVG9NZW1vcnlcIl09d3JpdGVTdHJpbmdUb01lbW9yeTtmdW5jdGlvbiB3cml0ZUFycmF5VG9NZW1vcnkoYXJyYXksYnVmZmVyKXtmb3IodmFyIGk9MDtpPGFycmF5Lmxlbmd0aDtpKyspe0hFQVA4W2J1ZmZlcisrPj4wXT1hcnJheVtpXX19TW9kdWxlW1wid3JpdGVBcnJheVRvTWVtb3J5XCJdPXdyaXRlQXJyYXlUb01lbW9yeTtmdW5jdGlvbiB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyLGJ1ZmZlcixkb250QWRkTnVsbCl7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7SEVBUDhbYnVmZmVyKys+PjBdPXN0ci5jaGFyQ29kZUF0KGkpfWlmKCFkb250QWRkTnVsbClIRUFQOFtidWZmZXI+PjBdPTB9TW9kdWxlW1wid3JpdGVBc2NpaVRvTWVtb3J5XCJdPXdyaXRlQXNjaWlUb01lbW9yeTtmdW5jdGlvbiB1blNpZ24odmFsdWUsYml0cyxpZ25vcmUpe2lmKHZhbHVlPj0wKXtyZXR1cm4gdmFsdWV9cmV0dXJuIGJpdHM8PTMyPzIqTWF0aC5hYnMoMTw8Yml0cy0xKSt2YWx1ZTpNYXRoLnBvdygyLGJpdHMpK3ZhbHVlfWZ1bmN0aW9uIHJlU2lnbih2YWx1ZSxiaXRzLGlnbm9yZSl7aWYodmFsdWU8PTApe3JldHVybiB2YWx1ZX12YXIgaGFsZj1iaXRzPD0zMj9NYXRoLmFicygxPDxiaXRzLTEpOk1hdGgucG93KDIsYml0cy0xKTtpZih2YWx1ZT49aGFsZiYmKGJpdHM8PTMyfHx2YWx1ZT5oYWxmKSl7dmFsdWU9LTIqaGFsZit2YWx1ZX1yZXR1cm4gdmFsdWV9aWYoIU1hdGhbXCJpbXVsXCJdfHxNYXRoW1wiaW11bFwiXSg0Mjk0OTY3Mjk1LDUpIT09LTUpTWF0aFtcImltdWxcIl09ZnVuY3Rpb24gaW11bChhLGIpe3ZhciBhaD1hPj4+MTY7dmFyIGFsPWEmNjU1MzU7dmFyIGJoPWI+Pj4xNjt2YXIgYmw9YiY2NTUzNTtyZXR1cm4gYWwqYmwrKGFoKmJsK2FsKmJoPDwxNil8MH07TWF0aC5pbXVsPU1hdGhbXCJpbXVsXCJdO2lmKCFNYXRoW1wiY2x6MzJcIl0pTWF0aFtcImNsejMyXCJdPShmdW5jdGlvbih4KXt4PXg+Pj4wO2Zvcih2YXIgaT0wO2k8MzI7aSsrKXtpZih4JjE8PDMxLWkpcmV0dXJuIGl9cmV0dXJuIDMyfSk7TWF0aC5jbHozMj1NYXRoW1wiY2x6MzJcIl07dmFyIE1hdGhfYWJzPU1hdGguYWJzO3ZhciBNYXRoX2Nvcz1NYXRoLmNvczt2YXIgTWF0aF9zaW49TWF0aC5zaW47dmFyIE1hdGhfdGFuPU1hdGgudGFuO3ZhciBNYXRoX2Fjb3M9TWF0aC5hY29zO3ZhciBNYXRoX2FzaW49TWF0aC5hc2luO3ZhciBNYXRoX2F0YW49TWF0aC5hdGFuO3ZhciBNYXRoX2F0YW4yPU1hdGguYXRhbjI7dmFyIE1hdGhfZXhwPU1hdGguZXhwO3ZhciBNYXRoX2xvZz1NYXRoLmxvZzt2YXIgTWF0aF9zcXJ0PU1hdGguc3FydDt2YXIgTWF0aF9jZWlsPU1hdGguY2VpbDt2YXIgTWF0aF9mbG9vcj1NYXRoLmZsb29yO3ZhciBNYXRoX3Bvdz1NYXRoLnBvdzt2YXIgTWF0aF9pbXVsPU1hdGguaW11bDt2YXIgTWF0aF9mcm91bmQ9TWF0aC5mcm91bmQ7dmFyIE1hdGhfbWluPU1hdGgubWluO3ZhciBNYXRoX2NsejMyPU1hdGguY2x6MzI7dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBnZXRVbmlxdWVSdW5EZXBlbmRlbmN5KGlkKXtyZXR1cm4gaWR9ZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzKys7aWYoTW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXSl7TW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXShydW5EZXBlbmRlbmNpZXMpfX1Nb2R1bGVbXCJhZGRSdW5EZXBlbmRlbmN5XCJdPWFkZFJ1bkRlcGVuZGVuY3k7ZnVuY3Rpb24gcmVtb3ZlUnVuRGVwZW5kZW5jeShpZCl7cnVuRGVwZW5kZW5jaWVzLS07aWYoTW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXSl7TW9kdWxlW1wibW9uaXRvclJ1bkRlcGVuZGVuY2llc1wiXShydW5EZXBlbmRlbmNpZXMpfWlmKHJ1bkRlcGVuZGVuY2llcz09MCl7aWYocnVuRGVwZW5kZW5jeVdhdGNoZXIhPT1udWxsKXtjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTtydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsfWlmKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCl7dmFyIGNhbGxiYWNrPWRlcGVuZGVuY2llc0Z1bGZpbGxlZDtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtjYWxsYmFjaygpfX19TW9kdWxlW1wicmVtb3ZlUnVuRGVwZW5kZW5jeVwiXT1yZW1vdmVSdW5EZXBlbmRlbmN5O01vZHVsZVtcInByZWxvYWRlZEltYWdlc1wiXT17fTtNb2R1bGVbXCJwcmVsb2FkZWRBdWRpb3NcIl09e307dmFyIG1lbW9yeUluaXRpYWxpemVyPW51bGw7dmFyIEFTTV9DT05TVFM9WyhmdW5jdGlvbigpe3tyZXR1cm4gTW9kdWxlLmdldFJhbmRvbVZhbHVlKCl9fSksKGZ1bmN0aW9uKCl7e2lmKE1vZHVsZS5nZXRSYW5kb21WYWx1ZT09PXVuZGVmaW5lZCl7dHJ5e3ZhciB3aW5kb3dfPVwib2JqZWN0XCI9PT10eXBlb2Ygd2luZG93P3dpbmRvdzpzZWxmLGNyeXB0b189dHlwZW9mIHdpbmRvd18uY3J5cHRvIT09XCJ1bmRlZmluZWRcIj93aW5kb3dfLmNyeXB0bzp3aW5kb3dfLm1zQ3J5cHRvLHJhbmRvbVZhbHVlc1N0YW5kYXJkPShmdW5jdGlvbigpe3ZhciBidWY9bmV3IFVpbnQzMkFycmF5KDEpO2NyeXB0b18uZ2V0UmFuZG9tVmFsdWVzKGJ1Zik7cmV0dXJuIGJ1ZlswXT4+PjB9KTtyYW5kb21WYWx1ZXNTdGFuZGFyZCgpO01vZHVsZS5nZXRSYW5kb21WYWx1ZT1yYW5kb21WYWx1ZXNTdGFuZGFyZH1jYXRjaChlKXt0cnl7dmFyIGNyeXB0bz1yZXF1aXJlKFwiY3J5cHRvXCIpLHJhbmRvbVZhbHVlTm9kZUpTPShmdW5jdGlvbigpe3ZhciBidWY9Y3J5cHRvLnJhbmRvbUJ5dGVzKDQpO3JldHVybihidWZbMF08PDI0fGJ1ZlsxXTw8MTZ8YnVmWzJdPDw4fGJ1ZlszXSk+Pj4wfSk7cmFuZG9tVmFsdWVOb2RlSlMoKTtNb2R1bGUuZ2V0UmFuZG9tVmFsdWU9cmFuZG9tVmFsdWVOb2RlSlN9Y2F0Y2goZSl7dGhyb3dcIk5vIHNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBmb3VuZFwifX19fX0pXTtmdW5jdGlvbiBfZW1zY3JpcHRlbl9hc21fY29uc3RfMChjb2RlKXtyZXR1cm4gQVNNX0NPTlNUU1tjb2RlXSgpfVNUQVRJQ19CQVNFPTg7U1RBVElDVE9QPVNUQVRJQ19CQVNFKzM0OTQ0O19fQVRJTklUX18ucHVzaCgpO2FsbG9jYXRlKFs4LDIwMSwxODgsMjQzLDEwMywyMzAsOSwxMDYsNTksMTY3LDIwMiwxMzIsMTMzLDE3NCwxMDMsMTg3LDQzLDI0OCwxNDgsMjU0LDExNCwyNDMsMTEwLDYwLDI0MSw1NCwyOSw5NSw1OCwyNDUsNzksMTY1LDIwOSwxMzAsMjMwLDE3MywxMjcsODIsMTQsODEsMzEsMTA4LDYyLDQzLDE0MCwxMDQsNSwxNTUsMTA3LDE4OSw2NSwyNTEsMTcxLDIxNywxMzEsMzEsMTIxLDMzLDEyNiwxOSwyNSwyMDUsMjI0LDkxLDEwMywyMzAsOSwxMDYsMTMzLDE3NCwxMDMsMTg3LDExNCwyNDMsMTEwLDYwLDU4LDI0NSw3OSwxNjUsMTI3LDgyLDE0LDgxLDE0MCwxMDQsNSwxNTUsMTcxLDIxNywxMzEsMzEsMjUsMjA1LDIyNCw5MSwxMzMsNTksMTQwLDEsMTg5LDI0MSwzNiwyNTUsMjQ4LDM3LDE5NSwxLDk2LDIyMCw1NSwwLDE4Myw3Niw2MiwyNTUsMTk1LDY2LDYxLDAsNTAsNzYsMTY0LDEsMjI1LDE2NCw3NiwyNTUsNzYsNjEsMTYzLDI1NSwxMTcsNjIsMzEsMCw4MSwxNDUsNjQsMjU1LDExOCw2NSwxNCwwLDE2MiwxMTUsMjE0LDI1NSw2LDEzOCw0NiwwLDEyNCwyMzAsMjQ0LDI1NSwxMCwxMzgsMTQzLDAsNTIsMjYsMTk0LDAsMTg0LDI0NCw3NiwwLDEyOSwxNDMsNDEsMSwxOTAsMjQ0LDE5LDI1NSwxMjMsMTcwLDEyMiwyNTUsOTgsMTI5LDY4LDAsMTIxLDIxMywxNDcsMCw4NiwxMDEsMzAsMjU1LDE2MSwxMDMsMTU1LDAsMTQwLDg5LDY3LDI1NSwyMzksMjI5LDE5MCwxLDY3LDExLDE4MSwwLDE5OCwyNDAsMTM3LDI1NCwyMzgsNjksMTg4LDI1NSw2NywxNTEsMjM4LDAsMTksNDIsMTA4LDI1NSwyMjksODUsMTEzLDEsNTAsNjgsMTM1LDI1NSwxNywxMDYsOSwwLDUwLDEwMywxLDI1NSw4MCwxLDE2OCwxLDM1LDE1MiwzMCwyNTUsMTYsMTY4LDE4NSwxLDU2LDg5LDIzMiwyNTUsMTAxLDIxMCwyNTIsMCw0MSwyNTAsNzEsMCwyMDQsMTcwLDc5LDI1NSwxNCw0NiwyMzksMjU1LDgwLDc3LDIzOSwwLDE4OSwyMTQsNzUsMjU1LDE3LDE0MSwyNDksMCwzOCw4MCw3NiwyNTUsMTkwLDg1LDExNywwLDg2LDIyOCwxNzAsMCwxNTYsMjE2LDIwOCwxLDE5NSwyMDcsMTY0LDI1NSwxNTAsNjYsNzYsMjU1LDE3NSwyMjUsMTYsMjU1LDE0MSw4MCw5OCwxLDc2LDIxOSwyNDIsMCwxOTgsMTYyLDExNCwwLDQ2LDIxOCwxNTIsMCwxNTUsNDMsMjQxLDI1NCwxNTUsMTYwLDEwNCwyNTUsNTEsMTg3LDE2NSwwLDIsMTcsMTc1LDAsNjYsODQsMTYwLDEsMjQ3LDU4LDMwLDAsMzUsNjUsNTMsMjU0LDY5LDIzNiwxOTEsMCw0NSwxMzQsMjQ1LDEsMTYzLDEyMywyMjEsMCwzMiwxMTAsMjAsMjU1LDUyLDIzLDE2NSwwLDE4NiwyMTQsNzEsMCwyMzMsMTc2LDk2LDAsMjQyLDIzOSw1NCwxLDU3LDg5LDEzOCwwLDgzLDAsODQsMjU1LDEzNiwxNjAsMTAwLDAsOTIsMTQyLDEyMCwyNTQsMTA0LDEyNCwxOTAsMCwxODEsMTc3LDYyLDI1NSwyNTAsNDEsODUsMCwxNTIsMTMwLDQyLDEsOTYsMjUyLDI0NiwwLDE1MSwxNTEsNjMsMjU0LDIzOSwxMzMsNjIsMCwzMiw1NiwxNTYsMCw0NSwxNjcsMTg5LDI1NSwxNDIsMTMzLDE3OSwxLDEzMSw4NiwyMTEsMCwxODcsMTc5LDE1MCwyNTQsMjUwLDE3MCwxNCwyNTUsMjEwLDE2Myw3OCwwLDM3LDUyLDE1MSwwLDk5LDc3LDI2LDAsMjM4LDE1NiwyMTMsMjU1LDIxMywxOTIsMjA5LDEsNzMsNDYsODQsMCwyMCw2NSw0MSwxLDU0LDIwNiw3OSwwLDIwMSwxMzEsMTQ2LDI1NCwxNzAsMTExLDI0LDI1NSwxNzcsMzMsNTAsMjU0LDE3MSwzOCwyMDMsMjU1LDc4LDI0NywxMTYsMCwyMDksMjIxLDE1MywwLDEzMywxMjgsMTc4LDEsNTgsNDQsMjUsMCwyMDEsMzksNTksMSwxODksMTksMjUyLDAsNDksMjI5LDIxMCwxLDExNywxODcsMTE3LDAsMTgxLDE3OSwxODQsMSwwLDExNCwyMTksMCw0OCw5NCwxNDcsMCwyNDUsNDEsNTYsMCwxMjUsMTMsMjA0LDI1NCwyNDQsMTczLDExOSwwLDQ0LDIyMSwzMiwyNTQsODQsMjM0LDIwLDAsMjQ5LDE2MCwxOTgsMSwyMzYsMTI2LDIzNCwyNTUsNDcsOTksMTY4LDI1NCwxNzAsMjI2LDE1MywyNTUsMTAyLDE3OSwyMTYsMCwyMjYsMTQxLDEyMiwyNTUsMTIyLDY2LDE1MywyNTQsMTgyLDI0NSwxMzQsMCwyMjcsMjI4LDI1LDEsMjE0LDU3LDIzNSwyNTUsMjE2LDE3Myw1NiwyNTUsMTgxLDIzMSwyMTAsMCwxMTksMTI4LDE1NywyNTUsMTI5LDk1LDEzNiwyNTUsMTEwLDEyNiw1MSwwLDIsMTY5LDE4MywyNTUsNywxMzAsOTgsMjU0LDY5LDE3Niw5NCwyNTUsMTE2LDQsMjI3LDEsMjE3LDI0MiwxNDUsMjU1LDIwMiwxNzMsMzEsMSwxMDUsMSwzOSwyNTUsNDYsMTc1LDY5LDAsMjI4LDQ3LDU4LDI1NSwyMTUsMjI0LDY5LDI1NCwyMDcsNTYsNjksMjU1LDE2LDI1NCwxMzksMjU1LDIzLDIwNywyMTIsMjU1LDIwMiwyMCwxMjYsMjU1LDk1LDIxMyw5NiwyNTUsOSwxNzYsMzMsMCwyMDAsNSwyMDcsMjU1LDI0MSw0MiwxMjgsMjU0LDM1LDMzLDE5MiwyNTUsMjQ4LDIyOSwxOTYsMSwxMjksMTcsMTIwLDAsMjUxLDEwMywxNTEsMjU1LDcsNTIsMTEyLDI1NSwxNDAsNTYsNjYsMjU1LDQwLDIyNiwyNDUsMjU1LDIxNyw3MCwzNywyNTQsMTcyLDIxNCw5LDI1NSw3Miw2NywxMzQsMSwxNDYsMTkyLDIxNCwyNTUsNDQsMzgsMTEyLDAsNjgsMTg0LDc1LDI1NSwyMDYsOTAsMjUxLDAsMTQ5LDIzNSwxNDEsMCwxODEsMTcwLDU4LDAsMTE2LDI0NCwyMzksMCw5MiwxNTcsMiwwLDEwMiwxNzMsOTgsMCwyMzMsMTM3LDk2LDEsMTI3LDQ5LDIwMywwLDUsMTU1LDE0OCwwLDIzLDE0OCw5LDI1NSwyMTEsMTIyLDEyLDAsMzQsMTM0LDI2LDI1NSwyMTksMjA0LDEzNiwwLDEzNCw4LDQxLDI1NSwyMjQsODMsNDMsMjU0LDg1LDI1LDI0NywwLDEwOSwxMjcsMCwyNTQsMTY5LDEzNiw0OCwwLDIzOCwxMTksMjE5LDI1NSwyMzEsMTczLDIxMywwLDIwNiwxOCwyNTQsMjU0LDgsMTg2LDcsMjU1LDEyNiw5LDcsMSwxMTEsNDIsNzIsMCwxMTEsNTIsMjM2LDI1NCw5Niw2MywxNDEsMCwxNDcsMTkxLDEyNywyNTQsMjA1LDc4LDE5MiwyNTUsMTQsMTA2LDIzNywxLDE4NywyMTksNzYsMCwxNzUsMjQzLDE4NywyNTQsMTA1LDg5LDE3MywwLDg1LDI1LDg5LDEsMTYyLDI0MywxNDgsMCwyLDExOCwyMDksMjU0LDMzLDE1OCw5LDAsMTM5LDE2Myw0NiwyNTUsOTMsNzAsNDAsMCwxMDgsNDIsMTQyLDI1NCwxMTEsMjUyLDE0MiwyNTUsMTU1LDIyMywxNDQsMCw1MSwyMjksMTY3LDI1NSw3MywyNTIsMTU1LDI1NSw5NCwxMTYsMTIsMjU1LDE1MiwxNjAsMjE4LDI1NSwxNTYsMjM4LDM3LDI1NSwxNzksMjM0LDIwNywyNTUsMTk3LDAsMTc5LDI1NSwxNTQsMTY0LDE0MSwwLDIyNSwxOTYsMTA0LDAsMTAsMzUsMjUsMjU0LDIwOSwyMTIsMjQyLDI1NSw5NywyNTMsMjIyLDI1NCwxODQsMTAxLDIyOSwwLDIyMiwxOCwxMjcsMSwxNjQsMTM2LDEzNSwyNTUsMzAsMjA3LDE0MCwyNTQsMTQ2LDk3LDI0MywwLDEyOSwxOTIsMjYsMjU0LDIwMSw4NCwzMywyNTUsMTExLDEwLDc4LDI1NSwxNDcsODEsMTc4LDI1NSw0LDQsMjQsMCwxNjEsMjM4LDIxNSwyNTUsNiwxNDEsMzMsMCw1MywyMTUsMTQsMjU1LDQxLDE4MSwyMDgsMjU1LDIzMSwxMzksMTU3LDAsMTc5LDIwMywyMjEsMjU1LDI1NSwxODUsMTEzLDAsMTg5LDIyNiwxNzIsMjU1LDExMyw2NiwyMTQsMjU1LDIwMiw2Miw0NSwyNTUsMTAyLDY0LDgsMjU1LDc4LDE3NCwxNiwyNTQsMTMzLDExNyw2OCwyNTUsMTgyLDEyMCw4OSwyNTUsMTMzLDExNCwyMTEsMCwxODksMTEwLDIxLDI1NSwxNSwxMCwxMDYsMCw0MSwxOTIsMSwwLDE1MiwyMzIsMTIxLDI1NSwxODgsNjAsMTYwLDI1NSwxNTMsMTEzLDIwNiwyNTUsMCwxODMsMjI2LDI1NCwxODAsMTMsNzIsMjU1LDE3NiwxNjAsMTQsMjU0LDIxMSwyMDEsMTM0LDI1NSwxNTgsMjQsMTQzLDAsMTI3LDEwNSw1MywwLDk2LDEyLDE4OSwwLDE2NywyMTUsMjUxLDI1NSwxNTksNzYsMTI4LDI1NCwxMDYsMTAxLDIyNSwyNTUsMzAsMjUyLDQsMCwxNDYsMTIsMTc0LDAsODksMjQxLDE3OCwyNTQsMTAsMjI5LDE2NiwyNTUsMTIzLDIyMSw0MiwyNTQsMzAsMjAsMjEyLDAsODIsMTI4LDMsMCw0OCwyMDksMjQzLDAsMTE5LDEyMSw2NCwyNTUsNTAsMjI3LDE1NiwyNTUsMCwxMTAsMTk3LDEsMTAzLDI3LDE0NCwwLDEzMyw1OSwxNDAsMSwxODksMjQxLDM2LDI1NSwyNDgsMzcsMTk1LDEsOTYsMjIwLDU1LDAsMTgzLDc2LDYyLDI1NSwxOTUsNjYsNjEsMCw1MCw3NiwxNjQsMSwyMjUsMTY0LDc2LDI1NSw3Niw2MSwxNjMsMjU1LDExNyw2MiwzMSwwLDgxLDE0NSw2NCwyNTUsMTE4LDY1LDE0LDAsMTYyLDExNSwyMTQsMjU1LDYsMTM4LDQ2LDAsMTI0LDIzMCwyNDQsMjU1LDEwLDEzOCwxNDMsMCw1MiwyNiwxOTQsMCwxODQsMjQ0LDc2LDAsMTI5LDE0Myw0MSwxLDE5MCwyNDQsMTksMjU1LDEyMywxNzAsMTIyLDI1NSw5OCwxMjksNjgsMCwxMjEsMjEzLDE0NywwLDg2LDEwMSwzMCwyNTUsMTYxLDEwMywxNTUsMCwxNDAsODksNjcsMjU1LDIzOSwyMjksMTkwLDEsNjcsMTEsMTgxLDAsMTk4LDI0MCwxMzcsMjU0LDIzOCw2OSwxODgsMjU1LDIzNCwxMTMsNjAsMjU1LDM3LDI1NSw1NywyNTUsNjksMTc4LDE4MiwyNTQsMTI4LDIwOCwxNzksMCwxMTgsMjYsMTI1LDI1NCwzLDcsMjE0LDI1NSwyNDEsNTAsNzcsMjU1LDg1LDIwMywxOTcsMjU1LDIxMSwxMzUsMjUwLDI1NSwyNSw0OCwxMDAsMjU1LDE4NywyMTMsMTgwLDI1NCwxNyw4OCwxMDUsMCw4MywyMDksMTU4LDEsNSwxMTUsOTgsMCw0LDE3NCw2MCwyNTQsMTcxLDU1LDExMCwyNTUsMjE3LDE4MSwxNywyNTUsMjAsMTg4LDE3MCwwLDE0NiwxNTYsMTAyLDI1NCw4NywyMTQsMTc0LDI1NSwxMTQsMTIyLDE1NSwxLDIzMyw0NCwxNzAsMCwxMjcsOCwyMzksMSwyMTQsMjM2LDIzNCwwLDE3NSw1LDIxOSwwLDQ5LDEwNiw2MSwyNTUsNiw2NiwyMDgsMjU1LDIsMTA2LDExMCwyNTUsODEsMjM0LDE5LDI1NSwyMTUsMTA3LDE5MiwyNTUsNjcsMTUxLDIzOCwwLDE5LDQyLDEwOCwyNTUsMjI5LDg1LDExMywxLDUwLDY4LDEzNSwyNTUsMTcsMTA2LDksMCw1MCwxMDMsMSwyNTUsODAsMSwxNjgsMSwzNSwxNTIsMzAsMjU1LDE2LDE2OCwxODUsMSw1Niw4OSwyMzIsMjU1LDEwMSwyMTAsMjUyLDAsNDEsMjUwLDcxLDAsMjA0LDE3MCw3OSwyNTUsMTQsNDYsMjM5LDI1NSw4MCw3NywyMzksMCwxODksMjE0LDc1LDI1NSwxNywxNDEsMjQ5LDAsMzgsODAsNzYsMjU1LDE5MCw4NSwxMTcsMCw4NiwyMjgsMTcwLDAsMTU2LDIxNiwyMDgsMSwxOTUsMjA3LDE2NCwyNTUsMTUwLDY2LDc2LDI1NSwxNzUsMjI1LDE2LDI1NSwxNDEsODAsOTgsMSw3NiwyMTksMjQyLDAsMTk4LDE2MiwxMTQsMCw0NiwyMTgsMTUyLDAsMTU1LDQzLDI0MSwyNTQsMTU1LDE2MCwxMDQsMjU1LDE3OCw5LDI1MiwyNTQsMTAwLDExMCwyMTIsMCwxNCw1LDE2NywwLDIzMywyMzksMTYzLDI1NSwyOCwxNTEsMTU3LDEsMTAxLDE0NiwxMCwyNTUsMjU0LDE1OCw3MCwyNTQsNzEsMjQ5LDIyOCwwLDg4LDMwLDUwLDAsNjgsNTgsMTYwLDI1NSwxOTEsMjQsMTA0LDEsMTI5LDY2LDEyOSwyNTUsMTkyLDUwLDg1LDI1NSw4LDE3OSwxMzgsMjU1LDM4LDI1MCwyMDEsMCwxMTUsODAsMTYwLDAsMTMxLDIzMCwxMTMsMCwxMjUsODgsMTQ3LDAsOTAsNjgsMTk5LDAsMjUzLDc2LDE1OCwwLDI4LDI1NSwxMTgsMCwxMTMsMjUwLDI1NCwwLDY2LDc1LDQ2LDAsMjMwLDIxOCw0MywwLDIyOSwxMjAsMTg2LDEsMTQ4LDY4LDQzLDAsMTM2LDEyNCwyMzgsMSwxODcsMTA3LDE5NywyNTUsODQsNTMsMjQ2LDI1NSw1MSwxMTYsMjU0LDI1NSw1MSwxODcsMTY1LDAsMiwxNywxNzUsMCw2Niw4NCwxNjAsMSwyNDcsNTgsMzAsMCwzNSw2NSw1MywyNTQsNjksMjM2LDE5MSwwLDQ1LDEzNCwyNDUsMSwxNjMsMTIzLDIyMSwwLDMyLDExMCwyMCwyNTUsNTIsMjMsMTY1LDAsMTg2LDIxNCw3MSwwLDIzMywxNzYsOTYsMCwyNDIsMjM5LDU0LDEsNTcsODksMTM4LDAsODMsMCw4NCwyNTUsMTM2LDE2MCwxMDAsMCw5MiwxNDIsMTIwLDI1NCwxMDQsMTI0LDE5MCwwLDE4MSwxNzcsNjIsMjU1LDI1MCw0MSw4NSwwLDE1MiwxMzAsNDIsMSw5NiwyNTIsMjQ2LDAsMTUxLDE1MSw2MywyNTQsMjM5LDEzMyw2MiwwLDMyLDU2LDE1NiwwLDQ1LDE2NywxODksMjU1LDE0MiwxMzMsMTc5LDEsMTMxLDg2LDIxMSwwLDE4NywxNzksMTUwLDI1NCwyNTAsMTcwLDE0LDI1NSw2OCwxMTMsMjEsMjU1LDIyMiwxODYsNTksMjU1LDY2LDcsMjQxLDEsNjksNiw3MiwwLDg2LDE1NiwxMDgsMjU0LDU1LDE2Nyw4OSwwLDEwOSw1MiwyMTksMjU0LDEzLDE3NiwyMywyNTUsMTk2LDQ0LDEwNiwyNTUsMjM5LDE0OSw3MSwyNTUsMTY0LDE0MCwxMjUsMjU1LDE1OSwxNzMsMSwwLDUxLDQxLDIzMSwwLDE0NSw2MiwzMywwLDEzOCwxMTEsOTMsMSwxODUsODMsNjksMCwxNDQsMTE1LDQ2LDAsOTcsMTUxLDE2LDI1NSwyNCwyMjgsMjYsMCw0OSwyMTcsMjI2LDAsMTEzLDc1LDIzNCwyNTQsMTkzLDE1MywxMiwyNTUsMTgyLDQ4LDk2LDI1NSwxNCwxMywyNiwwLDEyOCwxOTUsMjQ5LDI1NCw2OSwxOTMsNTksMCwxMzIsMzcsODEsMjU0LDEyNSwxMDYsNjAsMCwyMTQsMjQwLDE2OSwxLDE2NCwyMjcsNjYsMCwyMTAsMTYzLDc4LDAsMzcsNTIsMTUxLDAsOTksNzcsMjYsMCwyMzgsMTU2LDIxMywyNTUsMjEzLDE5MiwyMDksMSw3Myw0Niw4NCwwLDIwLDY1LDQxLDEsNTQsMjA2LDc5LDAsMjAxLDEzMSwxNDYsMjU0LDE3MCwxMTEsMjQsMjU1LDE3NywzMyw1MCwyNTQsMTcxLDM4LDIwMywyNTUsNzgsMjQ3LDExNiwwLDIwOSwyMjEsMTUzLDAsMTMzLDEyOCwxNzgsMSw1OCw0NCwyNSwwLDIwMSwzOSw1OSwxLDE4OSwxOSwyNTIsMCw0OSwyMjksMjEwLDEsMTE3LDE4NywxMTcsMCwxODEsMTc5LDE4NCwxLDAsMTE0LDIxOSwwLDQ4LDk0LDE0NywwLDI0NSw0MSw1NiwwLDEyNSwxMywyMDQsMjU0LDI0NCwxNzMsMTE5LDAsNDQsMjIxLDMyLDI1NCw4NCwyMzQsMjAsMCwyNDksMTYwLDE5OCwxLDIzNiwxMjYsMjM0LDI1NSwxNDMsNjIsMjIxLDAsMTI5LDg5LDIxNCwyNTUsNTUsMTM5LDUsMjU0LDY4LDIwLDE5MSwyNTUsMTQsMjA0LDE3OCwxLDM1LDE5NSwyMTcsMCw0Nyw1MSwyMDYsMSwzOCwyNDYsMTY1LDAsMjA2LDI3LDYsMjU0LDE1OCw4NywzNiwwLDIxNyw1MiwxNDYsMjU1LDEyNSwxMjMsMjE1LDI1NSw4NSw2MCwzMSwyNTUsMTcxLDEzLDcsMCwyMTgsMjQ1LDg4LDI1NCwyNTIsMzUsNjAsMCw1NSwyMTQsMTYwLDI1NSwxMzMsMTAxLDU2LDAsMjI0LDMyLDE5LDI1NCwxNDcsNjQsMjM0LDAsMjYsMTQ1LDE2MiwxLDExNCwxMTgsMTI1LDAsMjQ4LDI1MiwyNTAsMCwxMDEsOTQsMTk2LDI1NSwxOTgsMTQxLDIyNiwyNTQsNTEsNDIsMTgyLDAsMTM1LDEyLDksMjU0LDEwOSwxNzIsMjEwLDI1NSwxOTcsMjM2LDE5NCwxLDI0MSw2NSwxNTQsMCw0OCwxNTYsNDcsMjU1LDE1Myw2Nyw1NSwyNTUsMjE4LDE2NSwzNCwyNTQsNzQsMTgwLDE3OSwwLDIxOCw2Niw3MSwxLDg4LDEyMiw5OSwwLDIxMiwxODEsMjE5LDI1NSw5Miw0MiwyMzEsMjU1LDIzOSwwLDE1NCwwLDI0NSw3NywxODMsMjU1LDk0LDgxLDE3MCwxLDE4LDIxMywyMTYsMCwxNzEsOTMsNzEsMCw1Miw5NCwyNDgsMCwxOCwxNTEsMTYxLDI1NCwxOTcsMjA5LDY2LDI1NSwxNzQsMjQ0LDE1LDI1NCwxNjIsNDgsMTgzLDAsNDksNjEsMjQwLDI1NCwxODIsOTMsMTk1LDAsMTk5LDIyOCw2LDEsMjAwLDUsMTcsMjU1LDEzNyw0NSwyMzcsMjU1LDEwOCwxNDgsNCwwLDkwLDc5LDIzNywyNTUsMzksNjMsNzcsMjU1LDUzLDgyLDIwNywxLDE0MiwyMiwxMTgsMjU1LDEwMSwyMzIsMTgsMSw5MiwyNiw2NywwLDUsMjAwLDg4LDI1NSwzMywxNjgsMTM4LDI1NSwxNDksMjI1LDcyLDAsMiwyMDksMjcsMjU1LDQ0LDI0NSwxNjgsMSwyMjAsMjM3LDE3LDI1NSwzMCwyMTEsMTA1LDI1NCwxNDEsMjM4LDIyMSwwLDEyOCw4MCwyNDUsMjU0LDExMSwyNTQsMTQsMCwyMjIsOTUsMTkwLDEsMjIzLDksMjQxLDAsMTQ2LDc2LDIxMiwyNTUsMTA4LDIwNSwxMDQsMjU1LDYzLDExNywxNTMsMCwxNDQsNjksNDgsMCwzNSwyMjgsMTExLDAsMTkyLDMzLDE5MywyNTUsMTEyLDIxNCwxOTAsMjU0LDExNSwxNTIsMTUxLDAsMjMsMTAyLDg4LDAsNTEsNzQsMjQ4LDAsMjI2LDE5OSwxNDMsMjU0LDIwNCwxNjIsMTAxLDI1NSwyMDgsOTcsMTg5LDEsMjQ1LDEwNCwxOCwwLDIzMCwyNDYsMzAsMjU1LDIzLDE0OCw2OSwwLDExMCw4OCw1MiwyNTQsMjI2LDE4MSw4OSwyNTUsMjA4LDQ3LDkwLDI1NCwxMTQsMTYxLDgwLDI1NSwzMywxMTYsMjQ4LDAsMTc5LDE1Miw4NywyNTUsNjksMTQ0LDE3NywxLDg4LDIzOCwyNiwyNTUsNTgsMzIsMTEzLDEsMSw3Nyw2OSwwLDU5LDEyMSw1MiwyNTUsMTUyLDIzOCw4MywwLDUyLDgsMTkzLDAsMjMxLDM5LDIzMywyNTUsMTk5LDM0LDEzOCwwLDIyMiw2OCwxNzMsMCw5MSw1NywyNDIsMjU0LDIyMCwyMTAsMTI3LDI1NSwxOTIsNywyNDYsMjU0LDE1MSwzNSwxODcsMCwxOTUsMjM2LDE2NSwwLDExMSw5MywyMDYsMCwyMTIsMjQ3LDEzMywxLDE1NCwxMzMsMjA5LDI1NSwxNTUsMjMxLDEwLDAsNjQsNzgsMzgsMCwxMjIsMjQ5LDEwMCwxLDMwLDE5LDk3LDI1NSw2Miw5MSwyNDksMSwyNDgsMTMzLDc3LDAsMTk3LDYzLDE2OCwyNTQsMTE2LDEwLDgyLDAsMTg0LDIzNiwxMTMsMjU0LDIxMiwyMDMsMTk0LDI1NSw2MSwxMDAsMjUyLDI1NCwzNiw1LDIwMiwyNTUsMTE5LDkxLDE1MywyNTUsMTI5LDc5LDI5LDAsMTAzLDEwMywxNzEsMjU0LDIzNywyMTUsMTExLDI1NSwyMTYsNTMsNjksMCwyMzksMjQwLDIzLDAsMTk0LDE0OSwyMjEsMjU1LDM4LDIyNSwyMjIsMCwyMzIsMjU1LDE4MCwyNTQsMTE4LDgyLDEzMywyNTUsNTcsMjA5LDE3NywxLDEzOSwyMzIsMTMzLDAsMTU4LDE3Niw0NiwyNTQsMTk0LDExNSw0NiwwLDg4LDI0NywyMjksMSwyOCwxMDMsMTkxLDAsMjIxLDIyMiwxNzUsMjU0LDE0OSwyMzUsNDQsMCwxNTEsMjI4LDI1LDI1NCwyMTgsMTA1LDEwMywwLDE0Miw4NSwyMTAsMCwxNDksMTI5LDE5MCwyNTUsMjEzLDY1LDk0LDI1NCwxMTcsMTM0LDIyNCwyNTUsODIsMTk4LDExNywwLDE1NywyMjEsMjIwLDAsMTYzLDEwMSwzNiwwLDE5NywxMTQsMzcsMCwxMDQsMTcyLDE2NiwyNTQsMTEsMTgyLDAsMCw4MSw3MiwxODgsMjU1LDk3LDE4OCwxNiwyNTUsNjksNiwxMCwwLDE5OSwxNDcsMTQ1LDI1NSw4LDksMTE1LDEsNjUsMjE0LDE3NSwyNTUsMjE3LDE3MywyMDksMCw4MCwxMjcsMTY2LDAsMjQ3LDIyOSw0LDI1NCwxNjcsMTgzLDEyNCwyNTUsOTAsMjgsMjA0LDI1NCwxNzUsNTksMjQwLDI1NSwxMSw0MSwyNDgsMSwxMDgsNDAsNTEsMjU1LDE0NCwxNzcsMTk1LDI1NCwxNTAsMjUwLDEyNiwwLDEzOCw5MSw2NSwxLDEyMCw2MCwyMjIsMjU1LDI0NSwxOTMsMjM5LDAsMjksMjE0LDE4OSwyNTUsMTI4LDIsMjUsMCw4MCwxNTQsMTYyLDAsNzcsMjIwLDEwNywxLDIzNCwyMDUsNzQsMjU1LDU0LDE2NiwxMDMsMjU1LDExNiw3Miw5LDAsMjI4LDk0LDQ3LDI1NSwzMCwyMDAsMjUsMjU1LDM1LDIxNCw4OSwyNTUsNjEsMTc2LDE0MCwyNTUsODMsMjI2LDE2MywyNTUsNzUsMTMwLDE3MiwwLDEyOCwzOCwxNywwLDk1LDEzNywxNTIsMjU1LDIxNSwxMjQsMTU5LDEsNzksOTMsMCwwLDE0OCw4MiwxNTcsMjU0LDE5NSwxMzAsMjUxLDI1NSw0MCwyMDIsNzYsMjU1LDI1MSwxMjYsMjI0LDAsMTU3LDk5LDYyLDI1NCwyMDcsNywyMjUsMjU1LDk2LDY4LDE5NSwwLDE0MCwxODYsMTU3LDI1NSwxMzEsMTksMjMxLDI1NSw0MiwxMjgsMjU0LDAsNTIsMjE5LDYxLDI1NCwxMDIsMjAzLDcyLDAsMTQxLDcsMTEsMjU1LDE4NiwxNjQsMjEzLDAsMzEsMTIyLDExOSwwLDEzMywyNDIsMTQ1LDAsMjA4LDI1MiwyMzIsMjU1LDkxLDIxMywxODIsMjU1LDE0Myw0LDI1MCwyNTQsMjQ5LDIxNSw3NCwwLDE2NSwzMCwxMTEsMSwxNzEsOSwyMjMsMCwyMjksMTIzLDM0LDEsOTIsMTMwLDI2LDI1NSw3NywxNTUsNDUsMSwxOTUsMTM5LDI4LDI1NSw1OSwyMjQsNzgsMCwxMzYsMTcsMjQ3LDAsMTA4LDEyMSwzMiwwLDc5LDI1MCwxODksMjU1LDk2LDIyNywyNTIsMjU0LDM4LDI0MSw2MiwwLDYyLDE3NCwxMjUsMjU1LDE1NSwxMTEsOTMsMjU1LDEwLDIzMCwyMDYsMSw5NywxOTcsNDAsMjU1LDAsNDksNTcsMjU0LDY1LDI1MCwxMywwLDE4LDI1MSwxNTAsMjU1LDIyMCwxMDksMjEwLDI1NSw1LDE3NCwxNjYsMjU0LDQ0LDEyOSwxODksMCwyMzUsMzUsMTQ3LDI1NSwzNywyNDcsMTQxLDI1NSw3MiwxNDEsNCwyNTUsMTAzLDEwNywyNTUsMCwyNDcsOTAsNCwwLDUzLDQ0LDQyLDAsMiwzMCwyNDAsMCw0LDU5LDYzLDAsODgsNzgsMzYsMCwxMTMsMTY3LDE4MCwwLDE5MCw3MSwxOTMsMjU1LDE5OSwxNTgsMTY0LDI1NSw1OCw4LDE3MiwwLDc3LDMzLDEyLDAsNjUsNjMsMywwLDE1Myw3NywzMywyNTUsMTcyLDI1NCwxMDIsMSwyMjgsMjIxLDQsMjU1LDg3LDMwLDI1NCwxLDE0Niw0MSw4NiwyNTUsMTM4LDIwNCwyMzksMjU0LDEwOCwxNDEsMTcsMjU1LDE4NywyNDIsMTM1LDAsMjEwLDIwOCwxMjcsMCw2OCw0NSwxNCwyNTQsNzMsOTYsNjIsMCw4MSw2MCwyNCwyNTUsMTcwLDYsMzYsMjU1LDMsMjQ5LDI2LDAsMzUsMjEzLDEwOSwwLDIyLDEyOSw1NCwyNTUsMjEsMzUsMjI1LDI1NSwyMzQsNjEsNTYsMjU1LDU4LDIxNyw2LDAsMTQzLDEyNCw4OCwwLDIzNiwxMjYsNjYsMCwyMDksMzgsMTgzLDI1NSwzNCwyMzgsNiwyNTUsMTc0LDE0NSwxMDIsMCw5NSwyMiwyMTEsMCwxOTYsMTUsMTUzLDI1NCw0Niw4NCwyMzIsMjU1LDExNywzNCwxNDYsMSwyMzEsMjUwLDc0LDI1NSwyNywxMzQsMTAwLDEsOTIsMTg3LDE5NSwyNTUsMTcwLDE5OCwxMTIsMCwxMjAsMjgsNDIsMCwyMDksNzAsNjcsMCwyOSw4MSwzMSwwLDI5LDE2OCwxMDAsMSwxNjksMTczLDE2MCwwLDEwNywzNSwxMTcsMCw2Miw5Niw1OSwyNTUsODEsMTIsNjksMSwxMzUsMjM5LDE5MCwyNTUsMjIwLDI1MiwxOCwwLDE2MywyMjAsNTgsMjU1LDEzNywxMzcsMTg4LDI1NSw4MywxMDIsMTA5LDAsOTYsNiw3NiwwLDIzNCwyMjIsMjEwLDI1NSwxODUsMTc0LDIwNSwxLDYwLDE1OCwyMTMsMjU1LDEzLDI0MSwyMTQsMCwxNzIsMTI5LDE0MCwwLDkzLDEwNCwyNDIsMCwxOTIsMTU2LDI1MSwwLDQzLDExNywzMCwwLDIyNSw4MSwxNTgsMCwxMjcsMjMyLDIxOCwwLDIyNiwyOCwyMDMsMCwyMzMsMjcsMTUxLDI1NSwxMTcsNDMsNSwyNTUsMjQyLDE0LDQ3LDI1NSwzMywyMCw2LDAsMTM3LDI1MSw0NCwyNTQsMjcsMzEsMjQ1LDI1NSwxODMsMjE0LDEyNSwyNTQsNDAsMTIxLDE0OSwwLDE4NiwxNTgsMjEzLDI1NSw4OSw4LDIyNywwLDY5LDg4LDAsMjU0LDIwMywxMzUsMjI1LDAsMjAxLDE3NCwyMDMsMCwxNDcsNzEsMTg0LDAsMTgsMTIxLDQxLDI1NCw5NCw1LDc4LDAsMjI0LDIxNCwyNDAsMjU0LDM2LDUsMTgwLDAsMjUxLDEzNSwyMzEsMSwxNjMsMTM4LDIxMiwwLDIxMCwyNDksMTE2LDI1NCw4OCwxMjksMTg3LDAsMTksOCw0OSwyNTQsNjIsMTQsMTQ0LDI1NSwxNTksNzYsMjExLDAsMjE0LDUxLDgyLDAsMTA5LDExNywyMjgsMjU0LDEwMywyMjMsMjAzLDI1NSw3NSwyNTIsMTUsMSwxNTQsNzEsMjIwLDI1NSwyMywxMyw5MSwxLDE0MSwxNjgsOTYsMjU1LDE4MSwxODIsMTMzLDAsMjUwLDUxLDU1LDAsMjM0LDIzNCwyMTIsMjU0LDE3NSw2MywxNTgsMCwzOSwyNDAsNTIsMSwxNTgsMTg5LDM2LDI1NSwyMTMsNDAsODUsMSwzMiwxODAsMjQ3LDI1NSwxOSwxMDIsMjYsMSw4NCwyNCw5NywyNTUsNjksMjEsMjIyLDAsMTQ4LDEzOSwxMjIsMjU1LDIyMCwyMTMsMjM1LDEsMjMyLDIwMywyNTUsMCwxMjEsNTcsMTQ3LDAsMjI3LDcsMTU0LDAsNTMsMjIsMTQ3LDEsNzIsMSwyMjUsMCw4MiwxMzQsNDgsMjU0LDgzLDYwLDE1NywyNTUsMTQ1LDcyLDE2OSwwLDM0LDEwMywyMzksMCwxOTgsMjMzLDQ3LDAsMTE2LDE5LDQsMjU1LDE4NCwxMDYsOSwyNTUsMTgzLDEyOSw4MywwLDM2LDE3NiwyMzAsMSwzNCwxMDMsNzIsMCwyMTksMTYyLDEzNCwwLDI0NSw0MiwxNTgsMCwzMiwxNDksOTYsMjU0LDE2NSw0NCwxNDQsMCwyMDIsMjM5LDcyLDI1NCwyMTUsMTUwLDUsMCw0Miw2NiwzNiwxLDEzMiwyMTUsMTc1LDAsODYsMTc0LDg2LDI1NSwyNiwxOTcsMTU2LDI1NSw0OSwyMzIsMTM1LDI1NCwxMDMsMTgyLDgyLDAsMjUzLDEyOCwxNzYsMSwxNTMsMTc4LDEyMiwwLDI0NSwyNTAsMTAsMCwyMzYsMjQsMTc4LDAsMTM3LDEwNiwxMzIsMCw0MCwyOSw0MSwwLDUwLDMwLDE1MiwyNTUsMTI0LDEwNSwzOCwwLDIzMCwxOTEsNzUsMCwxNDMsNDMsMTcwLDAsNDQsMTMxLDIwLDI1NSw0NCwxMywyMywyNTUsMjM3LDI1NSwxNTUsMSwxNTksMTA5LDEwMCwyNTUsMTEyLDE4MSwyNCwyNTUsMTA0LDIyMCwxMDgsMCw1NSwyMTEsMTMxLDAsOTksMTIsMjEzLDI1NSwxNTIsMTUxLDE0NSwyNTUsMjM4LDUsMTU5LDAsOTcsMTU1LDgsMCwzMywxMDgsODEsMCwxLDMsMTAzLDAsNjIsMTA5LDM0LDI1NSwyNTAsMTU1LDE4MCwwLDMyLDcxLDE5NSwyNTUsMzgsNzAsMTQ1LDEsMTU5LDk1LDI0NSwwLDY5LDIyOSwxMDEsMSwxMzYsMjgsMjQwLDAsNzksMjI0LDI1LDAsNzgsMTEwLDEyMSwyNTUsMjQ4LDE2OCwxMjQsMCwxODcsMTI4LDI0NywwLDIsMTQ3LDIzNSwyNTQsNzksMTEsMTMyLDAsNzAsNTgsMTIsMSwxODEsOCwxNjMsMjU1LDc5LDEzNywxMzMsMjU1LDM3LDE3MCwxMSwyNTUsMTQxLDI0Myw4NSwyNTUsMTc2LDIzMSwyMTUsMjU1LDIwNCwxNTAsMTY0LDI1NSwyMzksMjE1LDM5LDI1NSw0Niw4NywxNTYsMjU0LDgsMTYzLDg4LDI1NSwxNzIsMzQsMjMyLDAsNjYsNDQsMTAyLDI1NSwyNyw1NCw0MSwyNTQsMjM2LDk5LDg3LDI1NSw0MSwxMjMsMTY5LDEsNTIsMTE0LDQzLDAsMTE3LDEzNCw0MCwwLDE1NSwxMzQsMjYsMCwyMzEsMjA3LDkxLDI1NCwzNSwxMzIsMzgsMjU1LDE5LDEwMiwxMjUsMjU0LDM2LDIyNywxMzMsMjU1LDExOCwzLDExMywyNTUsMjksMTMsMTI0LDAsMTUyLDk2LDc0LDEsODgsMTQ2LDIwNiwyNTUsMTY3LDE5MSwyMjAsMjU0LDE2MiwxOCw4OCwyNTUsMTgyLDEwMCwyMywwLDMxLDExNyw1MiwwLDgxLDQ2LDEwNiwxLDEyLDIsNywwLDY5LDgwLDIwMSwxLDIwOSwyNDYsMTcyLDAsMTIsNDgsMTQxLDEsMjI0LDIxMSw4OCwwLDExNiwyMjYsMTU5LDAsMTIyLDk4LDEzMCwwLDY1LDIzNiwyMzQsMSwyMjUsMjI2LDksMjU1LDIwNywyMjYsMTIzLDEsODksMjE0LDU5LDAsMTEyLDEzNSw4OCwxLDkwLDI0NCwyMDMsMjU1LDQ5LDExLDM4LDEsMTI5LDEwOCwxODYsMCw4OSwxMTIsMTUsMSwxMDEsNDYsMjA0LDI1NSwxMjcsMjA0LDQ1LDI1NCw3OSwyNTUsMjIxLDI1NSw1MSw3MywxOCwyNTUsMTI3LDQyLDEwMSwyNTUsMjQxLDIxLDIwMiwwLDE2MCwyMjcsNywwLDEwNSw1MCwyMzYsMCw3OSw1MiwxOTcsMjU1LDEwNCwyMDIsMjA4LDEsMTgwLDE1LDE2LDAsMTAxLDE5Nyw3OCwyNTUsOTgsNzcsMjAzLDAsNDEsMTg1LDI0MSwxLDM1LDE5MywxMjQsMCwzNSwxNTUsMjMsMjU1LDIwNyw1MywxOTIsMCwxMSwxMjUsMTYzLDEsMjQ5LDE1OCwxODUsMjU1LDQsMTMxLDQ4LDAsMjEsOTMsMTExLDI1NSw2MSwxMjEsMjMxLDEsNjksMjAwLDM2LDI1NSwxODUsNDgsMTg1LDI1NSwxMTEsMjM4LDIxLDI1NSwzOSw1MCwyNSwyNTUsOTksMjE1LDE2MywyNTUsODcsMjEyLDMwLDI1NSwxNjQsMTQ3LDUsMjU1LDEyOCw2LDM1LDEsMTA4LDIyMywxMTAsMjU1LDE5NCw3NiwxNzgsMCw3NCwxMDEsMTgwLDAsMjQzLDQ3LDQ4LDAsMTc0LDI1LDQzLDI1NSw4MiwxNzMsMjUzLDEsNTQsMTE0LDE5MiwyNTUsNDAsNTUsOTEsMCwyMTUsMTA4LDE3NiwyNTUsMTEsNTYsNywwLDIyNCwyMzMsNzYsMCwyMDksOTgsMjAyLDI1NCwyNDIsMjUsMTI1LDAsNDQsMTkzLDkzLDI1NCwyMDMsOCwxNzcsMCwxMzUsMTc2LDE5LDAsMTEyLDcxLDIxMywyNTUsMjA2LDU5LDE3NiwxLDQsNjcsMjYsMCwxNCwxNDMsMjEzLDI1NCw0Miw1NSwyMDgsMjU1LDYwLDY3LDEyMCwwLDE5MywyMSwxNjMsMCw5OSwxNjQsMTE1LDAsMTAsMjAsMTE4LDAsMTU2LDIxMiwyMjIsMjU0LDE2MCw3LDIxNywyNTUsMTE0LDI0NSw3NiwxLDExNyw1OSwxMjMsMCwxNzYsMTk0LDg2LDI1NCwyMTMsMTUsMTc2LDAsNzgsMjA2LDIwNywyNTQsMjEzLDEyOSw1OSwwLDIzMywyNTEsMjIsMSw5Niw1NSwxNTIsMjU1LDIzNiwyNTUsMTUsMjU1LDE5Nyw4OSw4NCwyNTUsOTMsMTQ5LDEzMywwLDE3NCwxNjAsMTEzLDAsMjM0LDk5LDE2OSwyNTUsMTUyLDExNiw4OCwwLDE0NCwxNjQsODMsMjU1LDk1LDI5LDE5OCwyNTUsMzQsNDcsMTUsMjU1LDk5LDEyMCwxMzQsMjU1LDUsMjM2LDE5MywwLDI0OSwyNDcsMTI2LDI1NSwxNDcsMTg3LDMwLDAsNTAsMjMwLDExNywyNTUsMTA4LDIxNywyMTksMjU1LDE2Myw4MSwxNjYsMjU1LDcyLDI1LDE2OSwyNTQsMTU1LDEyMSw3OSwyNTUsMjgsMTU1LDg5LDI1NCw3LDEyNiwxNywwLDE0Nyw2NSwzMywxLDQ3LDIzNCwyNTMsMCwyNiw1MSwxOCwwLDEwNSw4MywxOTksMjU1LDE2MywxOTYsMjMwLDAsMTEzLDI0OCwxNjQsMCwyMjYsMjU0LDIxOCwwLDE4OSwyMDksMjAzLDI1NSwxNjQsMjQ3LDIyMiwyNTQsMjU1LDM1LDE2NSwwLDQsMTg4LDI0MywxLDEyNywxNzksNzEsMCwzNywyMzcsMjU0LDI1NSwxMDAsMTg2LDI0MCwwLDUsNTcsNzEsMjU0LDEwMyw3Miw3MywyNTUsMjQ0LDE4LDgxLDI1NCwyMjksMjEwLDEzMiwyNTUsMjM4LDYsMTgwLDI1NSwxMSwyMjksMTc0LDI1NSwyMjcsMjIxLDE5MiwxLDE3LDQ5LDI4LDAsMTYzLDIxNSwxOTYsMjU0LDksMTE4LDQsMjU1LDUxLDI0MCw3MSwwLDExMywxMjksMTA5LDI1NSw3NiwyNDAsMjMxLDAsMTg4LDE3NywxMjcsMCwxMjUsNzEsNDQsMSwyNiwxNzUsMjQzLDAsOTQsMTY5LDI1LDI1NCwyNywyMzAsMjksMCwxNSwxMzksMTE5LDEsMTY4LDE3MCwxODYsMjU1LDE3MiwxOTcsNzYsMjU1LDI1Miw3NSwxODgsMCwxMzcsMTI0LDE5NiwwLDcyLDIyLDk2LDI1NSw0NSwxNTEsMjQ5LDEsMjIwLDE0NSwxMDAsMCw2NCwxOTIsMTU5LDI1NSwxMjAsMjM5LDIyNiwwLDEyOSwxNzgsMTQ2LDAsMCwxOTIsMTI1LDAsMjM1LDEzOCwyMzQsMCwxODMsMTU3LDE0NiwwLDgzLDE5OSwxOTIsMjU1LDE4NCwxNzIsNzIsMjU1LDczLDIyNSwxMjgsMCw3Nyw2LDI1MCwyNTUsMTg2LDY1LDY3LDAsMTA0LDI0NiwyMDcsMCwxODgsMzIsMTM4LDI1NSwyMTgsMjQsMjQyLDAsNjcsMTM4LDgxLDI1NCwyMzcsMTI5LDEyMSwyNTUsMjAsMjA3LDE1MCwxLDQxLDE5OSwxNiwyNTUsNiwyMCwxMjgsMCwxNTksMTE4LDUsMCwxODEsMTYsMTQzLDI1NSwyMjAsMzgsMTUsMCwyMyw2NCwxNDcsMjU0LDczLDI2LDEzLDAsODcsMjI4LDU3LDEsMjA0LDEyNCwxMjgsMCw0MywyNCwyMjMsMCwyMTksOTksMTk5LDAsMjIsNzUsMjAsMjU1LDE5LDI3LDEyNiwwLDE1Nyw2MiwyMTUsMCwxMTAsMjksMjMwLDAsMTc5LDE2NywyNTUsMSw1NCwyNTIsMTkwLDAsMjIxLDIwNCwxODIsMjU0LDE3OSwxNTgsNjUsMjU1LDgxLDE1NywzLDAsMTk0LDIxOCwxNTksMCwxNzAsMjIzLDAsMCwyMjQsMTEsMzIsMjU1LDM4LDE5Nyw5OCwwLDE2OCwxNjQsMzcsMCwyMyw4OCw3LDEsMTY0LDE4NiwxMTAsMCw5NiwzNiwxMzQsMCwyMzQsMjQyLDIyOSwwLDI1MCwxMjEsMTksMCwyNDIsMjU0LDExMiwyNTUsMyw0Nyw5NCwxLDksMjM5LDYsMjU1LDgxLDEzNCwxNTMsMjU0LDIxNCwyNTMsMTY4LDI1NSw2NywxMjQsMjI0LDAsMjQ1LDk1LDc0LDAsMjgsMzAsNDQsMjU0LDEsMTA5LDIyMCwyNTUsMTc4LDg5LDg5LDAsMjUyLDM2LDc2LDAsMjQsMTk4LDQ2LDI1NSw3Niw3NywxMTEsMCwxMzQsMjM0LDEzNiwyNTUsMzksOTQsMjksMCwxODUsNzIsMjM0LDI1NSw3MCw2OCwxMzUsMjU1LDIzMSwxMDIsNywyNTQsNzcsMjMxLDE0MCwwLDE2Nyw0Nyw1OCwxLDE0OCw5NywxMTgsMjU1LDE2LDI3LDIyNSwxLDE2NiwyMDYsMTQzLDI1NSwxMTAsMTc4LDIxNCwyNTUsMTgwLDEzMSwxNjIsMCwxNDMsMTQxLDIyNSwxLDEzLDIxOCw3OCwyNTUsMTE0LDE1MywzMywxLDk4LDEwNCwyMDQsMCwxNzUsMTE0LDExNywxLDE2NywyMDYsNzUsMCwyMDIsMTk2LDgzLDEsNTgsNjQsNjcsMCwxMzgsNDcsMTExLDEsMTk2LDI0NywxMjgsMjU1LDEzNywyMjQsMjI0LDI1NCwxNTgsMTEyLDIwNywwLDE1NCwxMDAsMjU1LDEsMTM0LDM3LDEwNywwLDE5OCwxMjgsNzksMjU1LDEyNywyMDksMTU1LDI1NSwxNjMsMjU0LDE4NSwyNTQsNjAsMTQsMjQzLDAsMzEsMjE5LDExMiwyNTQsMjksMjE3LDY1LDAsMjAwLDEzLDExNiwyNTQsMTIzLDYwLDE5NiwyNTUsMjI0LDU5LDE4NCwyNTQsMjQyLDg5LDE5NiwwLDEyMywxNiw3NSwyNTQsMTQ5LDE2LDIwNiwwLDY5LDI1NCw0OCwxLDIzMSwxMTYsMjIzLDI1NSwyMDksMTYwLDY1LDEsMjAwLDgwLDk4LDAsMzcsMTk0LDE4NCwyNTQsMTQ4LDYzLDM0LDAsMTM5LDI0MCw2NSwyNTUsMjE3LDE0NCwxMzIsMjU1LDU2LDM4LDQ1LDI1NCwxOTksMTIwLDIxMCwwLDEwOCwxNzcsMTY2LDI1NSwxNjAsMjIyLDQsMCwyMjAsMTI2LDExOSwyNTQsMTY1LDEwNywxNjAsMjU1LDgyLDIyMCwyNDgsMSwyNDEsMTc1LDEzNiwwLDE0NCwxNDEsMjMsMjU1LDE2OSwxMzgsODQsMCwxNjAsMTM3LDc4LDI1NSwyMjYsMTE4LDgwLDI1NSw1MiwyNywxMzIsMjU1LDYzLDk2LDEzOSwyNTUsMTUyLDI1MCwzOSwwLDE4OCwxNTUsMTUsMCwyMzIsNTEsMTUwLDI1NCw0MCwxNSwyMzIsMjU1LDI0MCwyMjksOSwyNTUsMTM3LDE3NSwyNywyNTUsNzUsNzMsOTcsMSwyMTgsMjEyLDExLDAsMTM1LDUsMTYyLDEsMTA3LDE4NSwyMTMsMCwyLDI0OSwxMDcsMjU1LDQwLDI0Miw3MCwwLDIxOSwyMDAsMjUsMCwyNSwxNTcsMTMsMCw2Nyw4Miw4MCwyNTUsMTk2LDI0OSwyMywyNTUsMTQ1LDIwLDE0OSwwLDUwLDcyLDE0NiwwLDk0LDc2LDE0OCwxLDI0LDI1MSw2NSwwLDMxLDE5MiwyMywwLDE4NCwyMTIsMjAxLDI1NSwxMjMsMjMzLDE2MiwxLDI0NywxNzMsNzIsMCwxNjIsODcsMjE5LDI1NCwxMjYsMTM0LDg5LDAsMTU5LDExLDEyLDI1NCwxNjYsMTA1LDI5LDAsNzMsMjcsMjI4LDEsMTEzLDEyMCwxODMsMjU1LDY2LDE2MywxMDksMSwyMTIsMTQzLDExLDI1NSwxNTksMjMxLDE2OCwxLDI1NSwxMjgsOTAsMCw1NywxNCw1OCwyNTQsODksNTIsMTAsMjU1LDI1Myw4LDE2MywxLDAsMTQ1LDIxMCwyNTUsMTAsMTI5LDg1LDEsNDYsMTgxLDI3LDAsMTAzLDEzNiwxNjAsMjU0LDEyNiwxODgsMjA5LDI1NSwzNCwzNSwxMTEsMCwyMTUsMjE5LDI0LDI1NSwyMTIsMTEsMjE0LDI1NCwxMDEsNSwxMTgsMCwyMzIsMTk3LDEzMywyNTUsMjIzLDE2NywxMDksMjU1LDIzNyw4MCw4NiwyNTUsNzAsMTM5LDk0LDAsMTU4LDE5MywxOTEsMSwxNTUsMTUsNTEsMjU1LDE1LDE5MCwxMTUsMCw3OCwxMzUsMjA3LDI1NSwyNDksMTAsMjcsMSwxODEsMTI1LDIzMywwLDk1LDE3MiwxMywyNTQsMTcwLDIxMywxNjEsMjU1LDM5LDIzNiwxMzgsMjU1LDk1LDkzLDg3LDI1NSwxOTAsMTI4LDk1LDAsMTI1LDE1LDIwNiwwLDE2NiwxNTAsMTU5LDAsMjI3LDE1LDE1OCwyNTUsMjA2LDE1OCwxMjAsMjU1LDQyLDE0MSwxMjgsMCwxMDEsMTc4LDEyMCwxLDE1NiwxMDksMTMxLDAsMjE4LDE0LDQ0LDI1NCwyNDcsMTY4LDIwNiwyNTUsMjEyLDExMiwyOCwwLDExMiwxNywyMjgsMjU1LDkwLDE2LDM3LDEsMTk3LDIyMiwxMDgsMCwyNTQsMjA3LDgzLDI1NSw5LDkwLDI0MywyNTUsMjQzLDI0NCwxNzIsMCwyNiw4OCwxMTUsMjU1LDIwNSwxMTYsMTIyLDAsMTkxLDIzMCwxOTMsMCwxODAsMTAwLDExLDEsMjE3LDM3LDk2LDI1NSwxNTQsNzgsMTU2LDAsMjM1LDIzNCwzMSwyNTUsMjA2LDE3OCwxNzgsMjU1LDE0OSwxOTIsMjUxLDAsMTgyLDI1MCwxMzUsMCwyNDYsMjIsMTA1LDAsMTI0LDE5MywxMDksMjU1LDIsMjEwLDE0OSwyNTUsMTY5LDE3LDE3MCwwLDAsOTYsMTEwLDI1NSwxMTcsOSw4LDEsNTAsMTIzLDQwLDI1NSwxOTMsMTg5LDk5LDAsMzQsMjI3LDE2MCwwLDQ4LDgwLDcwLDI1NCwyMTEsNTEsMjM2LDAsNDUsMTIyLDI0NSwyNTQsNDQsMTc0LDgsMCwxNzMsMzcsMjMzLDI1NSwxNTgsNjUsMTcxLDAsMTIyLDY5LDIxNSwyNTUsOTAsODAsMiwyNTUsMTMxLDEwNiw5NiwyNTQsMjI3LDExNCwxMzUsMCwyMDUsNDksMTE5LDI1NCwxNzYsNjIsNjQsMjU1LDgyLDUxLDE3LDI1NSwyNDEsMjAsMjQzLDI1NSwxMzAsMTMsOCwyNTQsMTI4LDIxNywyNDMsMjU1LDE2MiwyNywxLDI1NCw5MCwxMTgsMjQxLDAsMjQ2LDE5OCwyNDYsMjU1LDU1LDE2LDExOCwyNTUsMjAwLDE1OSwxNTcsMCwxNjMsMTcsMSwwLDE0MCwxMDcsMTIxLDAsODUsMTYxLDExOCwyNTUsMzgsMCwxNDksMCwxNTYsNDcsMjM4LDAsOSwxNjYsMTY2LDEsNzUsOTgsMTgxLDI1NSw1MCw3NCwyNSwwLDY2LDE1LDQ3LDAsMTM5LDIyNSwxNTksMCw3NiwzLDE0MiwyNTUsMTQsMjM4LDE4NCwwLDExLDIwNyw1MywyNTUsMTgzLDE5MiwxODYsMSwxNzEsMzIsMTc0LDI1NSwxOTEsNzYsMjIxLDEsMjQ3LDE3MCwyMTksMCwyNSwxNzIsNTAsMjU0LDIxNyw5LDIzMywwLDIwMywxMjYsNjgsMjU1LDE4Myw5Miw0OCwwLDEyNywxNjcsMTgzLDEsNjUsNDksMjU0LDAsMTYsNjMsMTI3LDEsMjU0LDIxLDE3MCwyNTUsNTksMjI0LDEyNywyNTQsMjIsNDgsNjMsMjU1LDI3LDc4LDEzMCwyNTQsNDAsMTk1LDI5LDAsMjUwLDEzMiwxMTIsMjU0LDM1LDIwMywxNDQsMCwxMDQsMTY5LDE2OCwwLDIwNywyNTMsMzAsMjU1LDEwNCw0MCwzOCwyNTQsOTQsMjI4LDg4LDAsMjA2LDE2LDEyOCwyNTUsMjEyLDU1LDEyMiwyNTUsMjIzLDIyLDIzNCwwLDIyMywxOTcsMTI3LDAsMjUzLDE4MSwxODEsMSwxNDUsMTAyLDExOCwwLDIzNiwxNTMsMzYsMjU1LDIxMiwyMTcsNzIsMjU1LDIwLDM4LDI0LDI1NCwxMzgsNjIsNjIsMCwxNTIsMTQwLDQsMCwyMzAsMjIwLDk5LDI1NSwxLDIxLDIxMiwyNTUsMTQ4LDIwMSwyMzEsMCwyNDQsMTIzLDksMjU0LDAsMTcxLDIxMCwwLDUxLDU4LDM3LDI1NSwxLDI1NSwxNCwyNTUsMjQ0LDE4MywxNDUsMjU0LDAsMjQyLDE2NiwwLDIyLDc0LDEzMiwwLDEyMSwyMTYsNDEsMCw5NSwxOTUsMTE0LDI1NCwxMzMsMjQsMTUxLDI1NSwxNTYsMjI2LDIzMSwyNTUsMjQ3LDUsNzcsMjU1LDI0NiwxNDgsMTE1LDI1NCwyMjUsOTIsODEsMjU1LDIyMiw4MCwyNDYsMjU0LDE3MCwxMjMsODksMjU1LDc0LDE5OSwxNDEsMCwyOSwyMCw4LDI1NSwxMzgsMTM2LDcwLDI1NSw5Myw3NSw5MiwwLDIyMSwxNDcsNDksMjU0LDUyLDEyNiwyMjYsMCwyMjksMTI0LDIzLDAsNDYsOSwxODEsMCwyMDUsNjQsNTIsMSwxMzEsMjU0LDI4LDAsMTUxLDE1OCwyMTIsMCwxMzEsNjQsNzgsMCwyMDYsMjUsMTcxLDAsMCwyMzAsMTM5LDAsMTkxLDI1MywxMTAsMjU0LDEwMywyNDcsMTY3LDAsNjQsNDAsNDAsMSw0MiwxNjUsMjQxLDI1NSw1OSw3NSwyMjgsMjU0LDEyNCwyNDMsMTg5LDI1NSwxOTYsOTIsMTc4LDI1NSwxMzAsMTQwLDg2LDI1NSwxNDEsODksNTYsMSwxNDcsMTk4LDUsMjU1LDIwMywyNDgsMTU4LDI1NCwxNDQsMTYyLDE0MSwwLDExLDE3MiwyMjYsMCwxMzAsNDIsMjEsMjU1LDEsMTY3LDE0MywyNTUsMTQ0LDM2LDM2LDI1NSw0OCw4OCwxNjQsMjU0LDE2OCwxNzAsMjIwLDAsOTgsNzEsMjE0LDAsOTEsMjA4LDc5LDAsMTU5LDc2LDIwMSwxLDE2Niw0MiwyMTQsMjU1LDY5LDI1NSwwLDI1NSw2LDEyOCwxMjUsMjU1LDE5MCwxLDE0MCwwLDE0Niw4MywyMTgsMjU1LDIxNSwyMzgsNzIsMSwxMjIsMTI3LDUzLDAsMTg5LDExNiwxNjUsMjU1LDg0LDgsNjYsMjU1LDIxNCwzLDIwOCwyNTUsMjEzLDExMCwxMzMsMCwxOTUsMTY4LDQ0LDEsMTU4LDIzMSw2OSwwLDE2Miw2NCwyMDAsMjU0LDkxLDU4LDEwNCwwLDE4Miw1OCwxODcsMjU0LDI0OSwyMjgsMTM2LDAsMjAzLDEzNCw3NiwyNTQsOTksMjIxLDIzMywwLDc1LDI1NCwyMTQsMjU0LDgwLDY5LDE1NCwwLDY0LDE1MiwyNDgsMjU0LDIzNiwxMzYsMjAyLDI1NSwxNTcsMTA1LDE1MywyNTQsMTQ5LDE3NSwyMCwwLDIyLDM1LDE5LDI1NSwxMjQsMTIxLDIzMywwLDE4NiwyNTAsMTk4LDI1NCwxMzIsMjI5LDEzOSwwLDEzNyw4MCwxNzQsMjU1LDE2NSwxMjUsNjgsMCwxNDQsMjAyLDE0OCwyNTQsMjM1LDIzOSwyNDgsMCwxMzUsMTg0LDExOCwwLDEwMSw5NCwxNywyNTUsMTIyLDcyLDcwLDI1NCw2OSwxMzAsMTQ2LDAsMTI3LDIyMiwyNDgsMSw2OSwxMjcsMTE4LDI1NSwzMCw4MiwyMTUsMjU0LDE4OCw3NCwxOSwyNTUsMjI5LDE2NywxOTQsMjU0LDExNywyNSw2NiwyNTUsNjUsMjM0LDU2LDI1NCwyMTMsMjIsMTU2LDAsMTUxLDU5LDkzLDI1NCw0NSwyOCwyNywyNTUsMTg2LDEyNiwxNjQsMjU1LDMyLDYsMjM5LDAsMTI3LDExNCw5OSwxLDIxOSw1MiwyLDI1NSw5OSw5NiwxNjYsMjU0LDYyLDE5MCwxMjYsMjU1LDEwOCwyMjIsMTY4LDEsNzUsMjI2LDE3NCwwLDIzMCwyMjYsMTk5LDAsNjAsMTE3LDIxOCwyNTUsMjUyLDI0OCwyMCwxLDIxNCwxODgsMjA0LDAsMzEsMTk0LDEzNCwyNTQsMTIzLDY5LDE5MiwyNTUsMTY5LDE3MywzNiwyNTQsNTUsOTgsOTEsMCwyMjMsNDIsMTAyLDI1NCwxMzcsMSwxMDIsMCwxNTcsOTAsMjUsMCwyMzksMTIyLDY0LDI1NSwyNTIsNiwyMzMsMCw3LDU0LDIwLDI1NSw4MiwxMTYsMTc0LDAsMTM1LDM3LDU0LDI1NSwxNSwxODYsMTI1LDAsMjI3LDExMiwxNzUsMjU1LDEwMCwxODAsMjI1LDI1NSw0MiwyMzcsMjQ0LDI1NSwyNDQsMTczLDIyNiwyNTQsMjQ4LDE4LDMzLDAsMTcxLDk5LDE1MCwyNTUsNzQsMjM1LDUwLDI1NSwxMTcsODIsMzIsMjU0LDEwNiwxNjgsMjM3LDAsMjA3LDEwOSwyMDgsMSwyMjgsOSwxODYsMCwxMzUsNjAsMTY5LDI1NCwxNzksOTIsMTQzLDAsMjQ0LDE3MCwxMDQsMjU1LDIzNSw0NSwxMjQsMjU1LDcwLDk5LDE4NiwwLDExNywxMzcsMTgzLDAsMjI0LDMxLDIxNSwwLDQwLDksMTAwLDAsMjYsMTYsOTUsMSw2OCwyMTcsODcsMCw4LDE1MSwyMCwyNTUsMjYsMTAwLDU4LDI1NSwxNzYsMTY1LDIwMywxLDUyLDExOCw3MCwwLDcsMzIsMjU0LDI1NCwyNDQsMjU0LDI0NSwyNTUsMTY3LDE0NCwxOTQsMjU1LDEyNSwxMTMsMjMsMjU1LDE3NiwxMjEsMTgxLDAsMTM2LDg0LDIwOSwwLDEzOCw2LDMwLDI1NSw4OSw0OCwyOCwwLDMzLDE1NSwxNCwyNTUsMjUsMjQwLDE1NCwwLDE0MSwyMDUsMTA5LDEsNzAsMTE1LDYyLDI1NSwyMCw0MCwxMDcsMjU0LDEzOCwxNTQsMTk5LDI1NSw5NCwyMjMsMjI2LDI1NSwxNTcsMTcxLDM4LDAsMTYzLDE3NywyNSwyNTQsNDUsMTE4LDMsMjU1LDE0LDIyMiwyMywxLDIwOSwxOTAsODEsMjU1LDExOCwxMjMsMjMyLDEsMTMsMjEzLDEwMSwyNTUsMTIzLDU1LDEyMywyNTQsMjcsMjQ2LDE2NSwwLDUwLDk5LDc2LDI1NSwxNDAsMjE0LDMyLDI1NSw5Nyw2NSw2NywyNTUsMjQsMTIsMjgsMCwxNzQsODYsNzgsMSw2NCwyNDcsOTYsMCwxNjAsMTM1LDY3LDAsNjYsNTUsMjQzLDI1NSwxNDcsMjA0LDk2LDI1NSwyNiw2LDMzLDI1NSw5OCw1MSw4MywxLDE1MywyMTMsMjA4LDI1NSwyLDE4NCw1NCwyNTUsMjUsMjE4LDExLDAsNDksNjcsMjQ2LDI1NCwxOCwxNDksNzIsMjU1LDEzLDI1LDcyLDAsNDIsNzksMjE0LDAsNDIsNCwzOCwxLDI3LDEzOSwxNDQsMjU1LDE0OSwxODcsMjMsMCwxOCwxNjQsMTMyLDAsMjQ1LDg0LDE4NCwyNTQsMTIwLDE5OCwxMDQsMjU1LDEyNiwyMTgsOTYsMCw1NiwxMTcsMjM0LDI1NSwxMywyOSwyMTQsMjU0LDY4LDQ3LDEwLDI1NSwxNjcsMTU0LDEzMiwyNTQsMTUyLDM4LDE5OCwwLDY2LDE3OCw4OSwyNTUsMjAwLDQ2LDE3MSwyNTUsMTMsOTksODMsMjU1LDIxMCwxODcsMjUzLDI1NSwxNzAsNDUsNDIsMSwxMzgsMjA5LDEyNCwwLDIxNCwxNjIsMTQxLDAsMTIsMjMwLDE1NiwwLDEwMiwzNiwxMTIsMjU0LDMsMTQ3LDY3LDAsNTIsMjE1LDEyMywyNTUsMjMzLDE3MSw1NCwyNTUsOTgsMTM3LDYyLDAsMjQ3LDIxOCwzOSwyNTUsMjMxLDIxOCwyMzYsMCwyNDcsMTkxLDEyNywwLDE5NSwxNDYsODQsMCwxNjUsMTc2LDkyLDI1NSwxOSwyMTIsOTQsMjU1LDE3LDc0LDIyNywwLDg4LDQwLDE1MywxLDE5OCwxNDcsMSwyNTUsMjA2LDY3LDI0NSwyNTQsMjQwLDMsMjE4LDI1NSw2MSwxNDEsMjEzLDI1NSw5NywxODMsMTA2LDAsMTk1LDIzMiwyMzUsMjU0LDk1LDg2LDE1NCwwLDIwOSw0OCwyMDUsMjU0LDExOCwyMDksMjQxLDI1NSwyNDAsMTIwLDIyMywxLDIxMywyOSwxNTksMCwxNjMsMTI3LDE0NywyNTUsMTMsMjE4LDkzLDAsODUsMjQsNjgsMjU0LDcwLDIwLDgwLDI1NSwxODksNSwxNDAsMSw4Miw5NywyNTQsMjU1LDk5LDk5LDE5MSwyNTUsMTMyLDg0LDEzMywyNTUsMTA3LDIxOCwxMTYsMjU1LDExMiwxMjIsNDYsMCwxMDUsMTcsMzIsMCwxOTQsMTYwLDYzLDI1NSw2OCwyMjIsMzksMSwyMTYsMjUzLDkyLDAsMTc3LDEwNSwyMDUsMjU1LDE0OSwyMDEsMTk1LDAsNDIsMjI1LDExLDI1NSw0MCwxNjIsMTE1LDAsOSw3LDgxLDAsMTY1LDIxOCwyMTksMCwxODAsMjIsMCwyNTQsMjksMTQ2LDI1MiwyNTUsMTQ2LDIwNywyMjUsMSwxODAsMTM1LDk2LDAsMzEsMTYzLDExMiwwLDE3NywxMSwyMTksMjU1LDEzMywxMiwxOTMsMjU0LDQzLDc4LDUwLDAsNjUsMTEzLDEyMSwxLDU5LDIxNyw2LDI1NSwxMTAsOTQsMjQsMSwxMTIsMTcyLDExMSwwLDcsMTUsOTYsMCwzNiw4NSwxMjMsMCw3MSwxNTAsMjEsMjU1LDIwOCw3MywxODgsMCwxOTIsMTEsMTY3LDEsMjEzLDI0NSwzNCwwLDksMjMwLDkyLDAsMTYyLDE0MiwzOSwyNTUsMjE1LDkwLDI3LDAsOTgsOTcsODksMCw5NCw3OSwyMTEsMCw5MCwxNTcsMjQwLDAsOTUsMjIwLDEyNiwxLDEwMiwxNzYsMjI2LDAsMzYsMzAsMjI0LDI1NCwzNSwzMSwxMjcsMCwyMzEsMjMyLDExNSwxLDg1LDgzLDEzMCwwLDIxMCw3MywyNDUsMjU1LDQ3LDE0MywxMTQsMjU1LDY4LDY1LDE5NywwLDU5LDcyLDYyLDI1NSwxODMsMTMzLDE3MywyNTQsOTMsMTIxLDExOCwyNTUsNTksMTc3LDgxLDI1NSwyMzQsNjksMTczLDI1NSwyMDUsMTI4LDE3NywwLDIyMCwyNDQsNTEsMCwyNiwyNDQsMjA5LDEsNzMsMjIyLDc3LDI1NSwxNjMsOCw5NiwyNTQsMTUwLDE0OSwyMTEsMCwxNTgsMjU0LDIwMywxLDU0LDEyNywxMzksMCwxNjEsMjI0LDU5LDAsNCwxMDksMjIsMjU1LDIyMiw0Miw0NSwyNTUsMjA4LDE0NiwxMDIsMjU1LDIzNiwxNDIsMTg3LDAsNTAsMjA1LDI0NSwyNTUsMTAsNzQsODksMjU0LDQ4LDc5LDE0MiwwLDIyMiw3NiwxMzAsMjU1LDMwLDE2Niw2MywwLDIzNiwxMiwxMywyNTUsNDksMTg0LDI0NCwwLDE4NywxMTMsMTAyLDAsMjE4LDEwMSwyNTMsMCwxNTMsNTcsMTgyLDI1NCwzMiwxNTAsNDIsMCwyNSwxOTgsMTQ2LDEsMjM3LDI0MSw1NiwwLDE0MCw2OCw1LDAsOTEsMTY0LDE3MiwyNTUsNzgsMTQ1LDE4NiwyNTQsNjcsNTIsMjA1LDAsMjE5LDIwNywxMjksMSwxMDksMTE1LDE3LDAsNTQsMTQzLDU4LDEsMjEsMjQ4LDEyMCwyNTUsMTc5LDI1NSwzMCwwLDE5MywyMzYsNjYsMjU1LDEsMjU1LDcsMjU1LDI1MywxOTIsNDgsMjU1LDE5LDY5LDIxNywxLDMsMjE0LDAsMjU1LDY0LDEwMSwxNDYsMSwyMjMsMTI1LDM1LDI1NSwyMzUsNzMsMTc5LDI1NSwyNDksMTY3LDIyNiwwLDIyNSwxNzUsMTAsMSw5NywxNjIsNTgsMCwxMDYsMTEyLDE3MSwxLDg0LDE3Miw1LDI1NSwxMzMsMTQwLDE3OCwyNTUsMTM0LDI0NSwxNDIsMCw5Nyw5MCwxMjUsMjU1LDE4NiwyMDMsMTg1LDI1NSwyMjMsNzcsMjMsMjU1LDE5Miw5MiwxMDYsMCwxNSwxOTgsMTE1LDI1NSwyMTcsMTUyLDI0OCwwLDE3MSwxNzgsMTIwLDI1NSwyMjgsMTM0LDUzLDAsMTc2LDU0LDE5MywxLDI1MCwyNTEsNTMsMCwyMTMsMTAsMTAwLDEsMzQsMTk5LDEwNiwwLDE1MSwzMSwyNDQsMjU0LDE3MiwyMjQsODcsMjU1LDE0LDIzNywyMywyNTUsMjUzLDg1LDI2LDI1NSwxMjcsMzksMTE2LDI1NSwxNzIsMTA0LDEwMCwwLDI1MSwxNCw3MCwyNTUsMjEyLDIwOCwxMzgsMjU1LDI1MywyMTEsMjUwLDAsMTc2LDQ5LDE2NSwwLDE1LDc2LDEyMywyNTUsMzcsMjE4LDE2MCwyNTUsOTIsMTM1LDE2LDEsMTAsMTI2LDExNCwyNTUsNzAsNSwyMjQsMjU1LDI0NywyNDksMTQxLDAsNjgsMjAsNjAsMSwyNDEsMjEwLDE4OSwyNTUsMTk1LDIxNywxODcsMSwxNTEsMywxMTMsMCwxNTEsOTIsMTc0LDAsMjMxLDYyLDE3OCwyNTUsMjE5LDE4MywyMjUsMCwyMywyMywzMywyNTUsMjA1LDE4MSw4MCwwLDU3LDE4NCwyNDgsMjU1LDY3LDE4MCwxLDI1NSw5MCwxMjMsOTMsMjU1LDM5LDAsMTYyLDI1NSw5NiwyNDgsNTIsMjU1LDg0LDY2LDE0MCwwLDM0LDEyNywyMjgsMjU1LDE5NCwxMzgsNywxLDE2NiwxMTAsMTg4LDAsMjEsMTcsMTU1LDEsMTU0LDE5MCwxOTgsMjU1LDIxNCw4MCw1OSwyNTUsMTgsNywxNDMsMCw3MiwyOSwyMjYsMSwxOTksMjE3LDI0OSwwLDIzMiwxNjEsNzEsMSwxNDksMTkwLDIwMSwwLDIxNywxNzUsOTUsMjU0LDExMywxNDcsNjcsMjU1LDEzOCwxNDMsMTk5LDI1NSwxMjcsMjA0LDEsMCwyOSwxODIsODMsMSwyMDYsMjMwLDE1NSwyNTUsMTg2LDIwNCw2MCwwLDEwLDEyNSw4NSwyNTUsMjMyLDk2LDI1LDI1NSwyNTUsODksMjQ3LDI1NSwyMTMsMjU0LDE3NSwxLDIzMiwxOTMsODEsMCwyOCw0MywxNTYsMjU0LDEyLDY5LDgsMCwxNDcsMjQsMjQ4LDAsMTgsMTk4LDQ5LDAsMTM0LDYwLDM1LDAsMTE4LDI0NiwxOCwyNTUsNDksODgsMjU0LDI1NCwyMjgsMjEsMTg2LDI1NSwxODIsNjUsMTEyLDEsMjE5LDIyLDEsMjU1LDIyLDEyNiw1MiwyNTUsMTg5LDUzLDQ5LDI1NSwxMTIsMjUsMTQzLDAsMzgsMTI3LDU1LDI1NSwyMjYsMTAxLDE2MywyNTQsMjA4LDEzMyw2MSwyNTUsMTM3LDY5LDE3NCwxLDE5MCwxMTgsMTQ1LDI1NSw2MCw5OCwyMTksMjU1LDIxNywxMywyNDUsMjU1LDI1MCwxMzYsMTAsMCw4NCwyNTQsMjI2LDAsMjAxLDMxLDEyNSwxLDI0MCw1MSwyNTEsMjU1LDMxLDEzMSwxMzAsMjU1LDIsMTM4LDUwLDI1NSwyMTUsMjE1LDE3NywxLDIyMywxMiwyMzgsMjU1LDI1MiwxNDksNTYsMjU1LDEyNCw5MSw2OCwyNTUsNzIsMTI2LDE3MCwyNTQsMTE5LDI1NSwxMDAsMCwxMzAsMTM1LDIzMiwyNTUsMTQsNzksMTc4LDAsMjUwLDEzMSwxOTcsMCwxMzgsMTk4LDIwOCwwLDEyMSwyMTYsMTM5LDI1NCwxMTksMTgsMzYsMjU1LDI5LDE5MywxMjIsMCwxNiw0Miw0NSwyNTUsMjEzLDI0MCwyMzUsMSwyMzAsMTkwLDE2OSwyNTUsMTk4LDM1LDIyOCwyNTQsMTEwLDE3Myw3MiwwLDIxNCwyMjEsMjQxLDI1NSw1NiwxNDgsMTM1LDAsMTkyLDExNyw3OCwyNTQsMTQxLDkzLDIwNywyNTUsMTQzLDY1LDE0OSwwLDIxLDE4LDk4LDI1NSw5NSw0NCwyNDQsMSwxMDYsMTkxLDc3LDAsMjU0LDg1LDgsMjU0LDIxNCwxMTAsMTc2LDI1NSw3MywxNzMsMTksMjU0LDE2MCwxOTYsMTk5LDI1NSwyMzcsOTAsMTQ0LDAsMTkzLDE3MiwxMTMsMjU1LDIwMCwxNTUsMTM2LDI1NCwyMjgsOTAsMjIxLDAsMTM3LDQ5LDc0LDEsMTY0LDIyMSwyMTUsMjU1LDIwOSwxODksNSwyNTUsMTA1LDIzNiw1NSwyNTUsNDIsMzEsMTI5LDEsMTkzLDI1NSwyMzYsMCw0NiwyMTcsNjAsMCwxMzgsODgsMTg3LDI1NSwyMjYsODIsMjM2LDI1NSw4MSw2OSwxNTEsMjU1LDE0MiwxOTAsMTYsMSwxMywxMzQsOCwwLDEyNywxMjIsNDgsMjU1LDgxLDY0LDE1NiwwLDE3MSwyNDMsMTM5LDAsMjM3LDM1LDI0NiwwLDEyMiwxNDMsMTkzLDI1NCwyMTIsMTIyLDE0NiwwLDk1LDQxLDI1NSwxLDg3LDEzMiw3NywwLDQsMjEyLDMxLDAsMTcsMzEsNzgsMCwzOSw0NSwxNzMsMjU0LDI0LDE0MiwyMTcsMjU1LDk1LDksNiwyNTUsMjI3LDgzLDYsMCw5OCw1OSwxMzAsMjU0LDYyLDMwLDMzLDAsOCwxMTUsMjExLDEsMTYyLDk3LDEyOCwyNTUsNywxODQsMjMsMjU0LDExNiwyOCwxNjgsMjU1LDI0OCwxMzgsMTUxLDI1NSw5OCwyNDQsMjQwLDAsMTg2LDExOCwxMzAsMCwxMTQsMjQ4LDIzNSwyNTUsMTA1LDE3MywyMDAsMSwxNjAsMTI0LDcxLDI1NSw5NCwzNiwxNjQsMSwxNzUsNjUsMTQ2LDI1NSwyMzgsMjQxLDE3MCwyNTQsMjAyLDE5OCwxOTcsMCwyMjgsNzEsMTM4LDI1NCw0NSwyNDYsMTA5LDI1NSwxOTQsNTIsMTU4LDAsMTMzLDE4NywxNzYsMCw4MywyNTIsMTU0LDI1NCw4OSwxODksMjIxLDI1NSwxNzAsNzMsMjUyLDAsMTQ4LDU4LDEyNSwwLDM2LDY4LDUxLDI1NCw0Miw2OSwxNzcsMjU1LDE2OCw3Niw4NiwyNTUsMzgsMTAwLDIwNCwyNTUsMzgsNTMsMzUsMCwxNzUsMTksOTcsMCwyMjUsMjM4LDI1MywyNTUsODEsODEsMTM1LDAsMjEwLDI3LDI1NSwyNTQsMjM1LDczLDEwNywwLDgsMjA3LDExNSwwLDgyLDEyNywxMzYsMCw4NCw5OSwyMSwyNTQsMjA3LDE5LDEzNiwwLDEwMCwxNjQsMTAxLDAsODAsMjA4LDc3LDI1NSwxMzIsMjA3LDIzNywyNTUsMTUsMywxNSwyNTUsMzMsMTY2LDExMCwwLDE1Niw5NSw4NSwyNTUsMzcsMTg1LDExMSwxLDE1MCwxMDYsMzUsMjU1LDE2NiwxNTEsNzYsMCwxMTQsODcsMTM1LDI1NSwxNTksMTk0LDY0LDAsMTIsMTIyLDMxLDI1NSwyMzIsNywxMDEsMjU0LDE3MywxMTksOTgsMCwxNTQsNzEsMjIwLDI1NCwxOTEsNTcsNTMsMjU1LDE2OCwyMzIsMTYwLDI1NSwyMjQsMzIsOTksMjU1LDIxOCwxNTYsMTY1LDAsMTUxLDE1MywxNjMsMCwyMTcsMTMsMTQ4LDEsMTk3LDExMyw4OSwwLDE0OSwyOCwxNjEsMjU0LDIwNywyMywzMCwwLDEwNSwxMzIsMjI3LDI1NSw1NCwyMzAsOTQsMjU1LDEzMywxNzMsMjA0LDI1NSw5MiwxODMsMTU3LDI1NSw4OCwxNDQsMjUyLDI1NCwxMDIsMzMsOTAsMCwxNTksOTcsMywwLDE4MSwyMTgsMTU1LDI1NSwyNDAsMTE0LDExOSwwLDEwNiwyMTQsNTMsMjU1LDE2NSwxOTAsMTE1LDEsMTUyLDkxLDIyNSwyNTUsODgsMTA2LDQ0LDI1NSwyMDgsNjEsMTEzLDAsMTUxLDUyLDEyNCwwLDE5MSwyNywxNTYsMjU1LDExMCw1NCwyMzYsMSwxNCwzMCwxNjYsMjU1LDM5LDEyNywyMDcsMSwyMjksMTk5LDI4LDAsMTg4LDIyOCwxODgsMjU0LDEwMCwxNTcsMjM1LDAsMjQ2LDIxOCwxODMsMSwxMDcsMjIsMTkzLDI1NSwyMDYsMTYwLDk1LDAsNzYsMjM5LDE0NywwLDIwNywxNjEsMTE3LDAsNTEsMTY2LDIsMjU1LDUyLDExNywxMCwyNTQsNzMsNTYsMjI3LDI1NSwxNTIsMTkzLDIyNSwwLDEzMiw5NCwxMzYsMjU1LDEwMSwxOTEsMjA5LDAsMzIsMTA3LDIyOSwyNTUsMTk4LDQzLDE4MCwxLDEwMCwyMTAsMTE4LDAsMTE0LDY3LDE1MywyNTUsMjMsODgsMjYsMjU1LDg5LDE1NCw5MiwxLDIyMCwxMjAsMTQwLDI1NSwxNDQsMTE0LDIwNywyNTUsMjUyLDExNSwyNTAsMjU1LDM0LDIwNiw3MiwwLDEzOCwxMzMsMTI3LDI1NSw4LDE3OCwxMjQsMSw4Nyw3NSw5NywwLDE1LDIyOSw5MiwyNTQsMjQwLDY3LDEzMSwyNTUsMTE4LDEyMywyMjcsMjU0LDE0NiwxMjAsMTA0LDI1NSwxNDUsMjEzLDI1NSwxLDEyOSwxODcsNzAsMjU1LDIxOSwxMTksNTQsMCwxLDE5LDE3MywwLDQ1LDE1MCwxNDgsMSwyNDgsODMsNzIsMCwyMDMsMjMzLDE2OSwxLDE0MiwxMDcsNTYsMCwyNDcsMjQ5LDM4LDEsNDUsMjQyLDgwLDI1NSwzMCwyMzMsMTAzLDAsOTYsODIsNzAsMCwyMywyMDEsMTExLDAsODEsMzksMzAsMjU1LDE2MSwxODMsNzgsMjU1LDE5NCwyMzQsMzMsMjU1LDY4LDIyNywxNDAsMjU0LDIxNiwyMDYsMTE2LDAsNzAsMjcsMjM1LDI1NSwxMDQsMTQ0LDc5LDAsMTY0LDIzMCw5MywyNTQsMjE0LDEzNSwxNTYsMCwxNTQsMTg3LDI0MiwyNTQsMTg4LDIwLDEzMSwyNTUsMzYsMTA5LDE3NCwwLDE1OSwxMTIsMjQxLDAsNSwxMTAsMTQ5LDEsMzYsMTY1LDIxOCwwLDE2NiwyOSwxOSwxLDE3OCw0Niw3MywwLDkzLDQzLDMyLDI1NCwyNDgsMTg5LDIzNywwLDEwMiwxNTUsMTQxLDAsMjAxLDkzLDE5NSwyNTUsMjQxLDEzOSwyNTMsMjU1LDE1LDExMSw5OCwyNTUsMTA4LDY1LDE2MywyNTQsMTU1LDc5LDE5MCwyNTUsNzMsMTc0LDE5MywyNTQsMjQ2LDQwLDQ4LDI1NSwxMDcsODgsMTEsMjU0LDIwMiw5Nyw4NSwyNTUsMjUzLDIwNCwxOCwyNTUsMTEzLDI0Miw2NiwwLDExMCwxNjAsMTk0LDI1NCwyMDgsMTgsMTg2LDAsODEsMjEsNjAsMCwxODgsMTA0LDE2NywyNTUsMTI0LDE2Niw5NywyNTQsMjEwLDEzMywxNDIsMCw1NiwyNDIsMTM3LDI1NCw0MSwxMTEsMTMwLDAsMTExLDE1MSw1OCwxLDExMSwyMTMsMTQxLDI1NSwxODMsMTcyLDI0MSwyNTUsMzgsNiwxOTYsMjU1LDE4NSw3LDEyMywyNTUsNDYsMTEsMjQ2LDAsMjQ1LDEwNSwxMTksMSwxNSwyLDE2MSwyNTUsOCwyMDYsNDUsMjU1LDE4LDIwMiw3NCwyNTUsODMsMTI0LDExNSwxLDIxMiwxNDEsMTU3LDAsODMsOCwyMDksMjU0LDEzOSwxNSwyMzIsMjU1LDE3Miw1NCwxNzMsMjU0LDUwLDI0NywxMzIsMCwyMTQsMTg5LDIxMywwLDE0NCwxODQsMTA1LDAsMjIzLDI1NCwyNDgsMCwyNTUsMTQ3LDI0MCwyNTUsMjMsMTg4LDcyLDAsNyw1MSw1NCwwLDE4OCwyNSwxODAsMjU0LDIyMCwxODAsMCwyNTUsODMsMTYwLDIwLDAsMTYzLDE4OSwyNDMsMjU1LDU4LDIwOSwxOTQsMjU1LDg3LDczLDYwLDAsMTA2LDI0LDQ5LDAsMjQ1LDI0OSwyMjAsMCwyMiwxNzMsMTY3LDAsMTE4LDExLDE5NSwyNTUsMTksMTI2LDIzNywwLDExMCwxNTksMzcsMjU1LDU5LDgyLDQ3LDAsMTgwLDE4Nyw4NiwwLDE4OCwxNDgsMjA4LDEsMTAwLDM3LDEzMywyNTUsNywxMTIsMTkzLDAsMTI5LDE4OCwxNTYsMjU1LDg0LDEwNiwxMjksMjU1LDEzMywyMjUsMjAyLDAsMTQsMjM2LDExMSwyNTUsNDAsMjAsMTAxLDAsMTcyLDE3Miw0OSwyNTQsNTEsNTQsNzQsMjU1LDI1MSwxODUsMTg0LDI1NSw5MywxNTUsMjI0LDI1NSwxODAsMjQ5LDIyNCwxLDIzMCwxNzgsMTQ2LDAsNzIsNTcsNTQsMjU0LDE3OCw2MiwxODQsMCwxMTksMjA1LDcyLDAsMTg1LDIzOSwyNTMsMjU1LDYxLDE1LDIxOCwwLDE5Niw2Nyw1NiwyNTUsMjM0LDMyLDE3MSwxLDQ2LDIxOSwyMjgsMCwyMDgsMTA4LDIzNCwyNTUsMjAsNjMsMjMyLDI1NSwxNjUsNTMsMTk5LDEsMTMzLDIyOCw1LDI1NSw1MiwyMDUsMTA3LDAsNzQsMjM4LDE0MCwyNTUsMTUwLDE1NiwyMTksMjU0LDIzOSwxNzIsMTc4LDI1NSwyNTEsMTg5LDIyMywyNTQsMzIsMTQyLDIxMSwyNTUsMjE4LDE1LDEzOCwxLDI0MSwxOTYsODAsMCwyOCwzNiw5OCwyNTQsMjIsMjM0LDE5OSwwLDYxLDIzNywyMjAsMjU1LDI0Niw1NywzNywwLDE0MiwxNywxNDIsMjU1LDE1Nyw2MiwyNiwwLDQzLDIzOCw5NSwyNTQsMywyMTcsNiwyNTUsMjEzLDI1LDI0MCwxLDM5LDIyMCwxNzQsMjU1LDE1NCwyMDUsNDgsMjU0LDE5LDEzLDE5MiwyNTUsMjQ0LDM0LDU0LDI1NCwxNDAsMTYsMTU1LDAsMjQwLDE4MSw1LDI1NCwxNTUsMTkzLDYwLDAsMTY2LDEyOCw0LDI1NSwzNiwxNDUsNTYsMjU1LDE1MCwyNDAsMjE5LDAsMTIwLDUxLDE0NSwwLDgyLDE1Myw0MiwxLDE0MCwyMzYsMTQ2LDAsMTA3LDkyLDI0OCwxLDE4OSwxMCwzLDAsNjMsMTM2LDI0MiwwLDIxMSwzOSwyNCwwLDE5LDIwMiwxNjEsMSwxNzMsMjcsMTg2LDI1NSwyMTAsMjA0LDIzOSwyNTQsNDEsMjA5LDE2MiwyNTUsMTgyLDI1NCwxNTksMjU1LDE3MiwxMTYsNTIsMCwxOTUsMTAzLDIyMiwyNTQsMjA1LDY5LDU5LDAsNTMsMjIsNDEsMSwyMTgsNDgsMTk0LDAsODAsMjEwLDI0MiwwLDIxMCwxODgsMjA3LDAsMTg3LDE2MSwxNjEsMjU0LDIxNiwxNywxLDAsMTM2LDIyNSwxMTMsMCwyNTAsMTg0LDYzLDAsMjIzLDMwLDk4LDI1NCw3NywxNjgsMTYyLDAsNTksNTMsMTc1LDAsMTksMjAxLDEwLDI1NSwxMzksMjI0LDE5NCwwLDE0NywxOTMsMTU0LDI1NSwyMTIsMTg5LDEyLDI1NCwxLDIwMCwxNzQsMjU1LDUwLDEzMywxMTMsMSw5NCwxNzksOTAsMCwxNzMsMTgyLDEzNSwwLDk0LDE3NywxMTMsMCw0Myw4OSwyMTUsMjU1LDEzNiwyNTIsMTA2LDI1NSwxMjMsMTM0LDgzLDI1NCw1LDI0NSw2NiwyNTUsODIsNDksMzksMSwyMjAsMiwyMjQsMCw5NywxMjksMTc3LDAsNzcsNTksODksMCw2MSwyOSwxNTUsMSwyMDMsMTcxLDIyMCwyNTUsOTIsNzgsMTM5LDAsMTQ1LDMzLDE4MSwyNTUsMTY5LDI0LDE0MSwxLDU1LDE1MCwxNzksMCwxMzksNjAsODAsMjU1LDIxOCwzOSw5NywwLDIsMTQ3LDEwNywyNTUsNjAsMjQ4LDcyLDAsMTczLDIzMCw0NywxLDYsODMsMTgyLDI1NSwxNiwxMDUsMTYyLDI1NCwxMzcsMjEyLDgxLDI1NSwxODAsMTg0LDEzNCwxLDM5LDIyMiwxNjQsMjU1LDIyMSwxMDUsMjUxLDEsMjM5LDExMiwxMjUsMCw2Myw3LDk3LDAsNjMsMTA0LDIyNywyNTUsMTQ4LDU4LDEyLDAsOTAsNjAsMjI0LDI1NSw4NCwyMTIsMjUyLDAsNzksMjE1LDE2OCwwLDI0OCwyMjEsMTk5LDEsMTE1LDEyMSwxLDAsMzYsMTcyLDEyMCwwLDMyLDE2MiwxODcsMjU1LDU3LDEwNyw0OSwyNTUsMTQ3LDQyLDIxLDAsMTA2LDE5OCw0MywxLDU3LDc0LDg3LDAsMTI2LDIwMyw4MSwyNTUsMTI5LDEzNSwxOTUsMCwxNDAsMzEsMTc3LDAsMjIxLDEzOSwxOTQsMCwzLDIyMiwyMTUsMCwxMzEsNjgsMjMxLDAsMTc3LDg2LDE3OCwyNTQsMTI0LDE1MSwxODAsMCwxODQsMTI0LDM4LDEsNzAsMTYzLDE3LDAsMjQ5LDI1MSwxODEsMSw0Miw1NSwyMjcsMCwyMjYsMTYxLDQ0LDAsMjMsMjM2LDExMCwwLDUxLDE0OSwxNDIsMSw5Myw1LDIzNiwwLDIxOCwxODMsMTA2LDI1NCw2NywyNCw3NywwLDQwLDI0NSwyMDksMjU1LDIyMiwxMjEsMTUzLDAsMTY1LDU3LDMwLDAsODMsMTI1LDYwLDAsNzAsMzgsODIsMSwyMjksNiwxODgsMCwxMDksMjIyLDE1NywyNTUsNTUsMTE4LDYzLDI1NSwyMDUsMTUxLDE4NiwwLDIyNywzMywxNDksMjU1LDI1NCwxNzYsMjQ2LDEsMjI3LDE3NywyMjcsMCwzNCwxMDYsMTYzLDI1NCwxNzYsNDMsNzksMCwxMDYsOTUsNzgsMSwxODUsMjQxLDEyMiwyNTUsMTg1LDE0LDYxLDAsMzYsMSwyMDIsMCwxMywxNzgsMTYyLDI1NSwyNDcsMTEsMTMyLDAsMTYxLDIzMCw5MiwxLDY1LDEsMTg1LDI1NSwyMTIsNTAsMTY1LDEsMTQxLDE0Niw2NCwyNTUsMTU4LDI0MiwyMTgsMCwyMSwxNjQsMTI1LDAsMjEzLDEzOSwxMjIsMSw2Nyw3MSw4NywwLDIwMywxNTgsMTc4LDEsMTUxLDkyLDQzLDAsMTUyLDExMSw1LDI1NSwzOSwzLDIzOSwyNTUsMjE3LDI1NSwyNTAsMjU1LDE3Niw2Myw3MSwyNTUsNzQsMjQ1LDc3LDEsMjUwLDE3NCwxOCwyNTUsMzQsNDksMjI3LDI1NSwyNDYsNDYsMjUxLDI1NSwxNTQsMzUsNDgsMSwxMjUsMTU3LDYxLDI1NSwxMDYsMzYsNzgsMjU1LDk3LDIzNiwxNTMsMCwxMzYsMTg3LDEyMCwyNTUsMTEzLDEzNCwxNzEsMjU1LDE5LDIxMywyMTcsMjU0LDIxNiw5NCwyMDksMjU1LDI1Miw1LDYxLDAsOTQsMywyMDIsMCwzLDI2LDE4MywyNTUsNjQsMTkxLDQzLDI1NSwzMCwyMywyMSwwLDEyOSwxNDEsNzcsMjU1LDEwMiwxMjAsNywxLDE5NCw3NiwxNDAsMCwxODgsMTc1LDUyLDI1NSwxNyw4MSwxNDgsMCwyMzIsODYsNTUsMSwyMjUsNDgsMTcyLDAsMTM0LDQyLDQyLDI1NSwyMzgsNTAsNDcsMCwxNjksMTgsMjU0LDAsMjAsMTQ3LDg3LDI1NSwxNCwxOTUsMjM5LDI1NSw2OSwyNDcsMjMsMCwyMzgsMjI5LDEyOCwyNTUsMTc3LDQ5LDExMiwwLDE2OCw5OCwyNTEsMjU1LDEyMSw3MSwyNDgsMCwyNDMsOCwxNDUsMjU0LDI0NiwyMjcsMTUzLDI1NSwyMTksMTY5LDE3NywyNTQsMjUxLDEzOSwxNjUsMjU1LDEyLDE2MywxODUsMjU1LDE2NCw0MCwxNzEsMjU1LDE1MywxNTksMjcsMjU0LDI0MywxMDksOTEsMjU1LDIyMiwyNCwxMTIsMSwxOCwyMTQsMjMxLDAsMTA3LDE1NywxODEsMjU0LDE5NSwxNDcsMCwyNTUsMTk0LDk5LDEwNCwyNTUsODksMTQwLDE5MCwyNTUsMTc3LDY2LDEyNiwyNTQsMTA2LDE4NSw2NiwwLDQ5LDIxOCwzMSwwLDI1MiwxNzQsMTU4LDAsMTg4LDc5LDIzMCwxLDIzOCw0MSwyMjQsMCwyMTIsMjM0LDgsMSwxMzYsMTEsMTgxLDAsMTY2LDExNyw4MywyNTUsNjgsMTk1LDk0LDAsNDYsMTMyLDIwMSwwLDI0MCwxNTIsODgsMCwxNjQsNTcsNjksMjU0LDE2MCwyMjQsNDIsMjU1LDU5LDIxNSw2NywyNTUsMTE5LDE5NSwxNDEsMjU1LDM2LDE4MCwxMjEsMjU0LDIwNyw0Nyw4LDI1NSwxNzQsMjEwLDIyMywwLDEwMSwxOTcsNjgsMjU1LDI1NSw4MiwxNDEsMSwyNTAsMTM3LDIzMywwLDk3LDg2LDEzMywxLDE2LDgwLDY5LDAsMTMyLDEzMSwxNTksMCwxMTYsOTMsMTAwLDAsNDUsMTQxLDEzOSwwLDE1MiwxNzIsMTU3LDI1NSw5MCw0Myw5MSwwLDcxLDE1Myw0NiwwLDM5LDE2LDExMiwyNTUsMjE3LDEzNiw5NywyNTUsMjIwLDE5OCwyNSwyNTQsMTc3LDUzLDQ5LDAsMjIyLDg4LDEzNCwyNTUsMTI4LDE1LDYwLDAsMjA3LDE5MiwxNjksMjU1LDE5MiwxMTYsMjA5LDI1NSwxMDYsNzgsMjExLDEsMjAwLDIxMywxODMsMjU1LDcsMTIsMTIyLDI1NCwyMjIsMjAzLDYwLDI1NSwzMywxMTAsMTk5LDI1NCwyNTEsMTA2LDExNywwLDIyOCwyMjUsNCwxLDEyMCw1OCw3LDI1NSwyMjEsMTkzLDg0LDI1NCwxMTIsMTMzLDI3LDAsMTg5LDIwMCwyMDEsMjU1LDEzOSwxMzUsMTUwLDAsMjM0LDU1LDE3NiwyNTUsNjEsNTAsNjUsMCwxNTIsMTA4LDE2OSwyNTUsMjIwLDg1LDEsMjU1LDExMiwxMzUsMjI3LDAsMTYyLDI2LDE4NiwwLDIwNyw5NiwxODUsMjU0LDI0NCwxMzYsMTA3LDAsOTMsMTUzLDUwLDEsMTk4LDk3LDE1MSwwLDExMCwxMSw4NiwyNTUsMTQzLDExNywxNzQsMjU1LDExNSwyMTIsMjAwLDAsNSwyMDIsMTgzLDAsMjM3LDE2NCwxMCwyNTQsMTg1LDIzOSw2MiwwLDIzNiwxMjAsMTgsMjU0LDk4LDEyMyw5OSwyNTUsMTY4LDIwMSwxOTQsMjU0LDQ2LDIzNCwyMTQsMCwxOTEsMTMzLDQ5LDI1NSw5OSwxNjksMTE5LDAsMTkwLDE4NywzNSwxLDExNSwyMSw0NSwyNTUsMjQ5LDEzMSw3MiwwLDExMiw2LDEyMywyNTUsMjE0LDQ5LDE4MSwyNTQsMTY2LDIzMywzNCwwLDkyLDE5NywxMDIsMjU0LDI1MywyMjgsMjA1LDI1NSwzLDU5LDIwMSwxLDQyLDk4LDQ2LDAsMjE5LDM3LDM1LDI1NSwxNjksMTk1LDM4LDAsOTQsMTI0LDE5MywxLDE1Niw0MywyMjMsMCw5NSw3MiwxMzMsMjU0LDEyMCwyMDYsMTkxLDAsMTIyLDE5NywyMzksMjU1LDE3NywxODcsNzksMjU1LDI1NCw0NiwyLDEsMjUwLDE2NywxOTAsMCw4NCwxMjksMTksMCwyMDMsMTEzLDE2NiwyNTUsMjQ5LDMxLDE4OSwyNTQsNzIsMTU3LDIwMiwyNTUsMjA4LDcxLDczLDI1NSwyMDcsMjQsNzIsMCwxMCwxNiwxOCwxLDIxMCw4MSw3NiwyNTUsODgsMjA4LDE5MiwyNTUsMTI2LDI0MywxMDcsMjU1LDIzOCwxNDEsMTIwLDI1NSwxOTksMTIxLDIzNCwyNTUsMTM3LDEyLDU5LDI1NSwzNiwyMjAsMTIzLDI1NSwxNDgsMTc5LDYwLDI1NCwyNDAsMTIsMjksMCw2NiwwLDk3LDEsMzYsMzAsMzgsMjU1LDExNSwxLDkzLDI1NSw5NiwxMDMsMjMxLDI1NSwxOTcsMTU4LDU5LDEsMTkyLDE2NCwyNDAsMCwyMDIsMjAyLDU3LDI1NSwyNCwxNzQsNDgsMCw4OSw3NywxNTUsMSw0Miw3NiwyMTUsMCwyNDQsMTUxLDIzMywwLDIzLDQ4LDgxLDAsMjM5LDEyNyw1MiwyNTQsMjI3LDEzMCwzNywyNTUsMjQ4LDExNiw5MywxLDEyNCwxMzIsMTE4LDAsMTczLDI1NCwxOTIsMSw2LDIzNSw4MywyNTUsMTEwLDE3NSwyMzEsMSwyNTEsMjgsMTgyLDAsMTI5LDI0OSw5MywyNTQsODQsMTg0LDEyOCwwLDc2LDE4MSw2MiwwLDE3NSwxMjgsMTg2LDAsMTAwLDUzLDEzNiwyNTQsMTA5LDI5LDIyNiwwLDIyMSwyMzMsNTgsMSwyMCw5OSw3NCwwLDAsMjIsMTYwLDAsMTM0LDEzLDIxLDAsOSw1Miw1NSwyNTUsMTcsODksMTQwLDAsMTc1LDM0LDU5LDAsODQsMTY1LDExOSwyNTUsMjI0LDIyNiwyMzQsMjU1LDcsNzIsMTY2LDI1NSwxMjMsMTE1LDI1NSwxLDE4LDIxNCwyNDYsMCwyNTAsNyw3MSwxLDIxNywyMjAsMTg1LDAsMjEyLDM1LDc2LDI1NSwzOCwxMjUsMTc1LDAsMTg5LDk3LDIxMCwwLDExNCwyMzgsNDQsMjU1LDQxLDE4OCwxNjksMjU0LDQ1LDE4NiwxNTQsMCw4MSw5MiwyMiwwLDEzMiwxNjAsMTkzLDAsMTIxLDIwOCw5OCwyNTUsMTMsODEsNDQsMjU1LDIwMywxNTYsODIsMCw3MSw1OCwyMSwyNTUsMjA4LDExNCwxOTEsMjU0LDUwLDM4LDE0NywwLDE1NCwyMTYsMTk1LDAsMTAxLDI1LDE4LDAsNjAsMjUwLDIxNSwyNTUsMjMzLDEzMiwyMzUsMjU1LDEwMywxNzUsMTQyLDEsMTYsMTQsOTIsMCwxNDEsMzEsMTEwLDI1NCwyMzgsMjQxLDQ1LDI1NSwxNTMsMjE3LDIzOSwxLDk3LDE2OCw0NywyNTUsMjQ5LDg1LDE2LDEsMjgsMTc1LDYyLDI1NSw1NywyNTQsNTQsMCwyMjIsMjMxLDEyNiwwLDE2Niw0NSwxMTcsMjU0LDE4LDE4OSw5NiwyNTUsMjI4LDc2LDUwLDAsMjAwLDI0NCw5NCwwLDE5OCwxNTIsMTIwLDEsNjgsMzQsNjksMjU1LDEyLDY1LDE2MCwyNTQsMTAxLDE5LDkwLDAsMTY3LDE5NywxMjAsMjU1LDY4LDU0LDE4NSwyNTUsNDEsMjE4LDE4OCwwLDExMywxNjgsNDgsMCw4OCwxMDUsMTg5LDEsMjYsODIsMzIsMjU1LDE4NSw5MywxNjQsMSwyMjgsMjQwLDIzNywyNTUsNjYsMTgyLDUzLDAsMTcxLDE5Nyw5MiwyNTUsMTA3LDksMjMzLDEsMTk5LDEyMCwxNDQsMjU1LDc4LDQ5LDEwLDI1NSwxMDksMTcwLDEwNSwyNTUsOTAsNCwzMSwyNTUsMjgsMjQ0LDExMywyNTUsNzQsNTgsMTEsMCw2MiwyMjAsMjQ2LDI1NSwxMjEsMTU0LDIwMCwyNTQsMTQ0LDIxMCwxNzgsMjU1LDEyNiw1NywxMjksMSw0MywyNTAsMTQsMjU1LDEwMSwxMTEsMjgsMSw0Nyw4NiwyNDEsMjU1LDYxLDcwLDE1MCwyNTUsNTMsNzMsNSwyNTUsMzAsMjYsMTU4LDAsMjA5LDI2LDg2LDAsMTM4LDIzNyw3NCwwLDE2NCw5NSwxODgsMCwxNDIsNjAsMjksMjU0LDE2MiwxMTYsMjQ4LDI1NSwxODcsMTc1LDE2MCwwLDE1MSwxOCwxNiwwLDIwOSwxMTEsNjUsMjU0LDIwMywxMzQsMzksMjU1LDg4LDEwOCw0OSwyNTUsMTMxLDI2LDcxLDI1NSwyMjEsMjcsMjE1LDI1NCwxMDQsMTA1LDkzLDI1NSwzMSwyMzYsMzEsMjU0LDEzNSwwLDIxMSwyNTUsMTQzLDEyNywxMTAsMSwyMTIsNzMsMjI5LDAsMjMzLDY3LDE2NywyNTQsMTk1LDEsMjA4LDI1NSwxMzIsMTcsMjIxLDI1NSw1MSwyMTcsOTAsMCw2NywyMzUsNTAsMjU1LDIyMywyMTAsMTQzLDAsMTc5LDUzLDEzMCwxLDIzMywxMDYsMTk4LDAsMjE3LDE3MywyMjAsMjU1LDExMiwyMjksMjQsMjU1LDE3NSwxNTQsOTMsMjU0LDcxLDIwMywyNDYsMjU1LDQ4LDY2LDEzMywyNTUsMywxMzYsMjMwLDI1NSwyMywyMjEsMTEzLDI1NCwyMzUsMTExLDIxMywwLDE3MCwxMjAsOTUsMjU0LDI1MSwyMjEsMiwwLDQ1LDEzMCwxNTgsMjU0LDEwNSw5NCwyMTcsMjU1LDI0Miw1MiwxODAsMjU0LDIxMyw2OCw0NSwyNTUsMTA0LDM4LDI4LDAsMjQ0LDE1OCw3NiwwLDE2MSwyMDAsOTYsMjU1LDIwNyw1MywxMywyNTUsMTg3LDY3LDE0OCwwLDE3MCw1NCwyNDgsMCwxMTksMTYyLDE3OCwyNTUsODMsMjAsMTEsMCw0Miw0MiwxOTIsMSwxNDYsMTU5LDE2MywyNTUsMTgzLDIzMiwxMTEsMCw3NywyMjksMjEsMjU1LDcxLDUzLDE0MywwLDI3LDc2LDM0XSxcImk4XCIsQUxMT0NfTk9ORSxSdW50aW1lLkdMT0JBTF9CQVNFKTthbGxvY2F0ZShbMjQ2LDEzNiw0NywyNTUsMjE5LDM5LDE4MiwyNTUsOTIsMjI0LDIwMSwxLDE5LDE0MiwxNCwyNTUsNjksMTgyLDI0MSwyNTUsMTYzLDExOCwyNDUsMCw5LDEwOSwxMDYsMSwxNzAsMTgxLDI0NywyNTUsNzgsNDcsMjM4LDI1NSw4NCwyMTAsMTc2LDI1NSwyMTMsMTA3LDEzOSwwLDM5LDM4LDExLDAsNzIsMjEsMTUwLDAsNzIsMTMwLDY5LDAsMjA1LDc3LDE1NSwyNTQsMTQyLDEzMywyMSwwLDcxLDExMSwxNzIsMjU0LDIyNiw0Miw1OSwyNTUsMTc5LDAsMjE1LDEsMzMsMTI4LDI0MSwwLDIzNCwyNTIsMTMsMSwxODQsNzksOCwwLDExMCwzMCw3MywyNTUsMjQ2LDE0MSwxODksMCwxNzAsMjA3LDIxOCwxLDc0LDE1NCw2OSwyNTUsMTM4LDI0Niw0OSwyNTUsMTU1LDMyLDEwMCwwLDEyNSw3NCwxMDUsMjU1LDkwLDg1LDYxLDI1NSwzNSwyMjksMTc3LDI1NSw2MiwxMjUsMTkzLDI1NSwxNTMsODYsMTg4LDEsNzMsMTIwLDIxMiwwLDIwOSwxMjMsMjQ2LDI1NCwxMzUsMjA5LDM4LDI1NSwxNTEsNTgsNDQsMSw5Miw2OSwyMTQsMjU1LDE0LDEyLDg4LDI1NSwyNTIsMTUzLDE2NiwyNTUsMjUzLDIwNywxMTIsMjU1LDYwLDc4LDgzLDI1NSwyMjcsMTI0LDExMCwwLDE4MCw5NiwyNTIsMjU1LDUzLDExNywzMywyNTQsMTY0LDIyMCw4MiwyNTUsNDEsMSwyNywyNTUsMzgsMTY0LDE2NiwyNTUsMTY0LDk5LDE2OSwyNTQsNjEsMTQ0LDcwLDI1NSwxOTIsMTY2LDE4LDAsMTA3LDI1MCw2NiwwLDE5Nyw2NSw1MCwwLDEsMTc5LDE4LDI1NSwyNTUsMTA0LDEsMjU1LDQzLDE1MywzNSwyNTUsODAsMTExLDE2OCwwLDExMCwxNzUsMTY4LDAsNDEsMTA1LDQ1LDI1NSwyMTksMTQsMjA1LDI1NSwxNjQsMjMzLDE0MCwyNTQsNDMsMSwxMTgsMCwyMzMsNjcsMTk1LDAsMTc4LDgyLDE1OSwyNTUsMTM4LDg3LDEyMiwyNTUsMjEyLDIzOCw5MCwyNTUsMTQ0LDM1LDEyNCwyNTQsMjUsMTQwLDE2NCwwLDI1MSwyMTUsNDQsMjU0LDEzMyw3MCwxMDcsMjU1LDEwMSwyMjcsODAsMjU0LDkyLDE2OSw1NSwwLDIxNSw0Miw0OSwwLDExNCwxODAsODUsMjU1LDMzLDIzMiwyNywxLDE3MiwyMTMsMjUsMCw2MiwxNzYsMTIzLDI1NCwzMiwxMzMsMjQsMjU1LDIyNSwxOTEsNjIsMCw5Myw3MCwxNTMsMCwxODEsNDIsMTA0LDEsMjIsMTkxLDIyNCwyNTUsMjAwLDIwMCwxNDAsMjU1LDI0OSwyMzQsMzcsMCwxNDksNTcsMTQxLDAsMTk1LDU2LDIwOCwyNTUsMjU0LDEzMCw3MCwyNTUsMzIsMTczLDI0MCwyNTUsMjksMjIwLDE5OSwwLDExMCwxMDAsMTE1LDI1NSwxMzIsMjI5LDI0OSwwLDIyOCwyMzMsMjIzLDI1NSwzNywyMTYsMjA5LDI1NCwxNzgsMTc3LDIwOSwyNTUsMTgzLDQ1LDE2NSwyNTQsMjI0LDk3LDExNCwwLDEzNyw5NywxNjgsMjU1LDIyNSwyMjIsMTcyLDAsMTY1LDEzLDQ5LDEsMjEwLDIzNSwyMDQsMjU1LDI1Miw0LDI4LDI1NCw3MCwxNjAsMTUxLDAsMjMyLDE5MCw1MiwyNTQsODMsMjQ4LDkzLDI1NSw2MiwyMTUsNzcsMSwxNzUsMTc1LDE3OSwyNTUsMTYwLDUwLDY2LDAsMTIxLDQ4LDIwOCwwLDYzLDE2OSwyMDksMjU1LDAsMjEwLDIwMCwwLDIyNCwxODcsNDQsMSw3MywxNjIsODIsMCw5LDE3NiwxNDMsMjU1LDE5LDc2LDE5MywyNTUsMjksNTksMTY3LDEsMjQsNDMsMTU0LDAsMjgsMTkwLDE5MCwwLDE0MSwxODgsMTI5LDAsMjMyLDIzNSwyMDMsMjU1LDIzNCwwLDEwOSwyNTUsNTQsNjUsMTU5LDAsNjAsODgsMjMyLDI1NSwxMjEsMjUzLDE1MCwyNTQsMjUyLDIzMywxMzEsMjU1LDE5OCwxMTAsNDEsMSw4Myw3Nyw3MSwyNTUsMjAwLDIyLDU5LDI1NCwxMDYsMjUzLDI0MiwyNTUsMjEsMTIsMjA3LDI1NSwyMzcsNjYsMTg5LDAsOTAsMTk4LDIwMiwxLDIyNSwxNzIsMTI3LDAsNTMsMjIsMjAyLDAsNTYsMjMwLDEzMiwwLDEsODYsMTgzLDAsMTA5LDE5MCw0MiwwLDI0Myw2OCwxNzQsMSwxMDksMjI4LDE1NCwwLDIwMCwxNzcsMTIyLDEsMzUsMTYwLDE4MywyNTUsMTc3LDQ4LDg1LDI1NSw5MCwyMTgsMTY5LDI1NSwyNDgsMTUyLDc4LDAsMjAyLDI1NCwxMTAsMCw2LDUyLDQzLDAsMTQyLDk4LDY1LDI1NSw2MywxNDUsMjIsMCw3MCwxMDYsOTMsMCwyMzIsMTM4LDEwNywxLDExMCwxNzksNjEsMjU1LDIxMSwxMjksMjE4LDEsMjQyLDIwOSw5MiwwLDM1LDkwLDIxNywxLDE4MiwxNDMsMTA2LDI1NSwxMTYsMTAxLDIxNywyNTUsMTE0LDI1MCwyMjEsMjU1LDE3MywyMDQsNiwwLDYwLDE1MCwxNjMsMCw3MywxNzIsNDQsMjU1LDIzOSwxMTAsODAsMjU1LDIzNyw3NiwxNTMsMjU0LDE2MSwxNDAsMjQ5LDAsMTQ5LDIzMiwyMjksMCwxMzMsMzEsNDAsMjU1LDE3NCwxNjQsMTE5LDAsMTEzLDUxLDIxNCwwLDEyOSwyMjgsMiwyNTQsNjQsMzQsMjQzLDAsMTA3LDIyNywyNDQsMjU1LDE3NCwxMDYsMjAwLDI1NSw4NCwxNTMsNzAsMSw1MCwzNSwxNiwwLDI1MCw3NCwyMTYsMjU0LDIzNiwxODksNjYsMjU1LDE1MywyNDksMTMsMCwyMzAsMTc4LDQsMjU1LDIyMSw0MSwyMzgsMCwxMTgsMjI3LDEyMSwyNTUsOTQsODcsMTQwLDI1NCwyNTQsMTE5LDkyLDAsNzMsMjM5LDI0NiwyNTQsMTE3LDg3LDEyOCwwLDE5LDIxMSwxNDUsMjU1LDE3Nyw0NiwyNTIsMCwyMjksOTEsMjQ2LDEsNjksMTI4LDI0NywyNTUsMjAyLDc3LDU0LDEsOCwxMSw5LDI1NSwxNTMsOTYsMTY2LDAsMjE3LDIxNCwxNzMsMjU1LDEzNCwxOTIsMiwxLDAsMjA3LDAsMCwxODksMTc0LDEwNywxLDE0MCwxMzQsMTAwLDAsMTU4LDE5MywyNDMsMSwxODIsMTAyLDE3MSwwLDIzNSwxNTQsNTEsMCwxNDIsNSwxMjMsMjU1LDYwLDE2OCw4OSwxLDIxNywxNCw5MiwyNTUsMTksMjE0LDUsMSwyMTEsMTY3LDI1NCwwLDQ0LDYsMjAyLDI1NCwxMjAsMTgsMjM2LDI1NSwxNSwxMTMsMTg0LDI1NSwxODQsMjIzLDEzOSwwLDQwLDE3NywxMTksMjU0LDE4MiwxMjMsOTAsMjU1LDE3NiwxNjUsMTc2LDAsMjQ3LDc3LDE5NCwwLDI3LDIzNCwxMjAsMCwyMzEsMCwyMTQsMjU1LDU5LDM5LDMwLDAsMTI1LDk5LDE0NSwyNTUsMTUwLDY4LDY4LDEsMTQxLDIyMiwyNDgsMCwxNTMsMTIzLDIxMCwyNTUsMTEwLDEyNywxNTIsMjU1LDIyOSwzMywyMTQsMSwxMzUsMjIxLDE5NywwLDEzNyw5NywyLDAsMTIsMTQzLDIwNCwyNTUsODEsNDEsMTg4LDAsMTE1LDc5LDEzMCwyNTUsOTQsMywxMzIsMCwxNTIsMTc1LDE4NywyNTUsMTI0LDE0MSwxMCwyNTUsMTI2LDE5MiwxNzksMjU1LDExLDEwMywxOTgsMCwxNDksNiw0NSwwLDIxOSw4NSwxODcsMSwyMzAsMTgsMTc4LDI1NSw3MiwxODIsMTUyLDAsMywxOTgsMTg0LDI1NSwxMjgsMTEyLDIyNCwxLDk3LDE2MSwyMzAsMCwyNTQsOTksMzgsMjU1LDU4LDE1OSwxOTcsMCwxNTEsNjYsMjE5LDAsNTksNjksMTQzLDI1NSwxODUsMTEyLDI0OSwwLDExOSwxMzYsNDcsMjU1LDEyMywxMzAsMTMyLDAsMTY4LDcxLDk1LDI1NSwxMTMsMTc2LDQwLDEsMjMyLDE4NSwxNzMsMCwyMDcsOTMsMTE3LDEsNjgsMTU3LDEwOCwyNTUsMTAyLDUsMTQ3LDI1NCw0OSw5NywzMywwLDg5LDY1LDExMSwyNTQsMjQ3LDMwLDE2MywyNTUsMTI0LDIxNywyMjEsMSwxMDIsMjUwLDIxNiwwLDE5OCwxNzQsNzUsMjU0LDU3LDU1LDE4LDAsMjI3LDUsMjM2LDEsMjI5LDIxMywxNzMsMCwyMDEsMTA5LDIxOCwxLDQ5LDIzMywyMzksMCwzMCw1NSwxNTgsMSwyNSwxNzgsMTA2LDAsMTU1LDExMSwxODgsMSw5NCwxMjYsMTQwLDAsMjE1LDMxLDIzOCwxLDc3LDI0MCwxNiwwLDIxMywyNDIsMjUsMSwzOCw3MSwxNjgsMCwyMDUsMTg2LDkzLDI1NCw0OSwyMTEsMTQwLDI1NSwyMTksMCwxODAsMjU1LDEzNCwxMTgsMTY1LDAsMTYwLDE0NywxMzQsMjU1LDExMCwxODYsMzUsMjU1LDE5OCwyNDMsNDIsMCwyNDMsMTQ2LDExOSwwLDEzNCwyMzUsMTYzLDEsNCwyNDEsMTM1LDI1NSwxOTMsNDYsMTkzLDI1NCwxMDMsMTgwLDc5LDI1NSwyMjUsNCwxODQsMjU0LDI0MiwxMTgsMTMwLDAsMTQ2LDEzNSwxNzYsMSwyMzQsMTExLDMwLDAsNjksNjYsMjEzLDI1NCw0MSw5NiwxMjMsMCwxMjEsOTQsNDIsMjU1LDE3OCwxOTEsMTk1LDI1NSw0NiwxMzAsNDIsMCwxMTcsODQsOCwyNTUsMjMzLDQ5LDIxNCwyNTQsMjM4LDEyMiwxMDksMCw2LDcxLDg5LDEsMjM2LDIxMSwxMjMsMCwyNDQsMTMsNDgsMjU0LDExOSwxNDgsMTQsMCwxMTQsMjgsODYsMjU1LDc1LDIzNywyNSwyNTUsMTQ1LDIyOSwxNiwyNTQsMTI5LDEwMCw1MywyNTUsMTM0LDE1MCwxMjAsMjU0LDE2OCwxNTcsNTAsMCwyMyw3MiwxMDQsMjU1LDIyNCw0OSwxNCwwLDI1NSwxMjMsMjIsMjU1LDE1MSwxODUsMTUxLDI1NSwxNzAsODAsMTg0LDEsMTM0LDE4MiwyMCwwLDQxLDEwMCwxMDEsMSwxNTMsMzMsMTYsMCw3NiwxNTQsMTExLDEsODYsMjA2LDIzNCwyNTUsMTkyLDE2MCwxNjQsMjU0LDE2NSwxMjMsOTMsMjU1LDEsMjE2LDE2NCwyNTQsNjcsMTcsMTc1LDI1NSwxNjksMTEsNTksMjU1LDE1OCw0MSw2MSwyNTUsNzMsMTg4LDE0LDI1NSwxOTUsNiwxMzcsMjU1LDIyLDE0NywyOSwyNTUsMjAsMTAzLDMsMjU1LDI0NiwxMzAsMjI3LDI1NSwxMjIsNDAsMTI4LDAsMjI2LDQ3LDI0LDI1NCwzNSwzNiwzMiwwLDE1MiwxODYsMTgzLDI1NSw2OSwyMDIsMjAsMCwxOTUsMTMzLDE5NSwwLDIyMiw1MSwyNDcsMCwxNjksMTcxLDk0LDEsMTgzLDAsMTYwLDI1NSw2NCwyMDUsMTgsMSwxNTYsODMsMTUsMjU1LDE5Nyw1OCwyNDksMjU0LDI1MSw4OSwxMTAsMjU1LDUwLDEwLDg4LDI1NCw1MSw0MywyMTYsMCw5OCwyNDIsMTk4LDEsMjQ1LDE1MSwxMTMsMCwxNzEsMjM2LDE5NCwxLDE5NywzMSwxOTksMjU1LDIyOSw4MSwzOCwxLDQxLDU5LDIwLDAsMjUzLDEwNCwyMzAsMCwxNTIsOTMsMTQsMjU1LDI0NiwyNDIsMTQ2LDI1NCwyMTQsMTY5LDI0MCwyNTUsMjQwLDEwMiwxMDgsMjU0LDE2MCwxNjcsMjM2LDAsMTU0LDIxOCwxODgsMCwxNTAsMjMzLDIwMiwyNTUsMjcsMTksMjUwLDEsMiw3MSwxMzMsMjU1LDE3NSwxMiw2MywxLDE0NSwxODMsMTk4LDAsMTA0LDEyMCwxMTUsMjU1LDEzMCwyNTEsMjQ3LDAsMTcsMjEyLDE2NywyNTUsNjIsMTIzLDEzMiwyNTUsMjQ3LDEwMCwxODksMCwxNTUsMjIzLDE1MiwwLDE0MywxOTcsMzMsMCwxNTUsNTksNDQsMjU1LDE1MCw5MywyNDAsMSwxMjcsMyw4NywyNTUsOTUsNzEsMjA3LDEsMTY3LDg1LDEsMjU1LDE4OCwxNTIsMTE2LDI1NSwxMCwyMywyMywwLDEzNywxOTUsOTMsMSw1NCw5OCw5NywwLDI0MCwwLDE2OCwyNTUsMTQ4LDE4OCwxMjcsMCwxMzQsMTA3LDE1MSwwLDc2LDI1MywxNzEsMCw5MCwxMzIsMTkyLDAsMTQ2LDIyLDU0LDAsMjI0LDY2LDU0LDI1NCwyMzAsMTg2LDIyOSwyNTUsMzksMTgyLDE5NiwwLDE0OCwyNTEsMTMwLDI1NSw2NSwxMzEsMTA4LDI1NCwxMjgsMSwxNjAsMCwxNjksNDksMTY3LDI1NCwxOTksMjU0LDE0OCwyNTUsMjUxLDYsMTMxLDAsMTg3LDI1NCwxMjksMjU1LDg1LDgyLDYyLDAsMTc4LDIzLDU4LDI1NSwyNTQsMTMyLDUsMCwxNjQsMjEzLDM5LDAsMTM0LDI1MiwxNDYsMjU0LDM3LDUzLDgxLDI1NSwxNTUsMTM0LDgyLDAsMjA1LDE2NywyMzgsMjU1LDk0LDQ1LDE4MCwyNTUsMTMyLDQwLDE2MSwwLDI1NCwxMTEsMTEyLDEsNTQsNzUsMjE3LDAsMTc5LDIzMCwyMjEsMSwyMzUsOTQsMTkxLDI1NSwyMywyNDMsNDgsMSwyMDIsMTQ1LDIwMywyNTUsMzksMTE4LDQyLDI1NSwxMTcsMTQxLDI1MywwLDI1NCwwLDIyMiwwLDQzLDI1MSw1MCwwLDU0LDE2OSwyMzQsMSw4MCw2OCwyMDgsMCwxNDgsMjAzLDI0MywyNTQsMTQ1LDcsMTM1LDAsNiwyNTQsMCwwLDI1MiwxODUsMTI3LDAsOTgsOCwxMjksMjU1LDM4LDM1LDcyLDI1NSwyMTEsMzYsMjIwLDEsNDAsMjYsODksMCwxNjgsNjQsMTk3LDI1NCwzLDIyMiwyMzksMjU1LDIsODMsMjE1LDI1NCwxODAsMTU5LDEwNSwwLDU4LDExNSwxOTQsMCwxODYsMTE2LDEwNiwyNTUsMjI5LDI0NywyMTksMjU1LDEyOSwxMTgsMTkzLDAsMjAyLDE3NCwxODMsMSwxNjYsMTYxLDcyLDAsMjAxLDEwNywxNDcsMjU0LDIzNywxMzYsNzQsMCwyMzMsMjMwLDEwNiwxLDEwNSwxMTEsMTY4LDAsNjQsMjI0LDMwLDEsMSwyMjksMywwLDEwMiwxNTEsMTc1LDI1NSwxOTQsMjM4LDIyOCwyNTUsMjU0LDI1MCwyMTIsMCwxODcsMjM3LDEyMSwwLDY3LDI1MSw5NiwxLDE5NywzMCwxMSwwLDE4Myw5NSwyMDQsMCwyMDUsODksMTM4LDAsNjQsMjIxLDM3LDEsMjU1LDIyMywzMCwyNTUsMTc4LDQ4LDIxMSwyNTUsMjQxLDIwMCw5MCwyNTUsMTY3LDIwOSw5NiwyNTUsNTcsMTMwLDIyMSwwLDQ2LDExNCwyMDAsMjU1LDYxLDE4NCw2NiwwLDU1LDE4MiwyNCwyNTQsMTEwLDE4MiwzMywwLDE3MSwxOTAsMjMyLDI1NSwxMTQsOTQsMzEsMCwxOCwyMjEsOCwwLDQ3LDIzMSwyNTQsMCwyNTUsMTEyLDgzLDAsMTE4LDE1LDIxNSwyNTUsMTczLDI1LDQwLDI1NCwxOTIsMTkzLDMxLDI1NSwyMzgsMjEsMTQ2LDI1NSwxNzEsMTkzLDExOCwyNTUsMTAxLDIzNCw1MywyNTQsMTMxLDIxMiwxMTIsMCw4OSwxOTIsMTA3LDEsOCwyMDgsMjcsMCwxODEsMjE3LDE1LDI1NSwyMzEsMTQ5LDIzMiwwLDE0MCwyMzYsMTI2LDAsMTQ0LDksMTk5LDI1NSwxMiw3OSwxODEsMjU0LDE0NywxODIsMjAyLDI1NSwxOSwxMDksMTgyLDI1NSw0OSwyMTIsMjI1LDAsNzQsMTYzLDIwMywwLDE3NSwyMzMsMTQ4LDAsMjYsMTEyLDUxLDAsMTkzLDE5Myw5LDI1NSwxNSwxMzUsMjQ5LDAsMTUwLDIyNywxMzAsMCwyMDQsMCwyMTksMSwyNCwyNDIsMjA1LDAsMjM4LDIwOCwxMTcsMjU1LDIyLDI0NCwxMTIsMCwyNiwyMjksMzQsMCwzNyw4MCwxODgsMjU1LDM4LDQ1LDIwNiwyNTQsMjQwLDkwLDIyNSwyNTUsMjksMyw0NywyNTUsNDIsMjI0LDc2LDAsMTg2LDI0MywxNjcsMCwzMiwxMzIsMTUsMjU1LDUsNTEsMTI1LDAsMTM5LDEzNSwyNCwwLDYsMjQxLDIxOSwwLDE3MiwyMjksMTMzLDI1NSwyNDYsMjE0LDUwLDAsMjMxLDExLDIwNywyNTUsMTkxLDEyNiw4MywxLDE4MCwxNjMsMTcwLDI1NSwyNDUsNTYsMjQsMSwxNzgsMTY0LDIxMSwyNTUsMywxNiwyMDIsMSw5OCw1NywxMTgsMjU1LDE0MSwxMzEsODksMjU0LDMzLDUxLDI0LDAsMjQzLDE0OSw5MSwyNTUsMjUzLDUyLDE0LDAsMzUsMTY5LDY3LDI1NCw0OSwzMCw4OCwyNTUsMTc5LDI3LDM2LDI1NSwxNjUsMTQwLDE4MywwLDU4LDE4OSwxNTEsMCw4OCwzMSwwLDAsNzUsMTY5LDY2LDAsNjYsMTAxLDE5OSwyNTUsMjQsMjE2LDE5OSwxLDEyMSwxOTYsMjYsMjU1LDE0LDc5LDIwMywyNTQsMjQwLDIyNiw4MSwyNTUsOTQsMjgsMTAsMjU1LDgzLDE5MywyNDAsMjU1LDIwNCwxOTMsMTMxLDI1NSw5NCwxNSw4NiwwLDIxOCw0MCwxNTcsMCw1MSwxOTMsMjA5LDAsMCwyNDIsMTc3LDAsMTAyLDE4NSwyNDcsMCwxNTgsMTA5LDExNiwwLDM4LDEzNSw5MSwwLDIyMywxNzUsMTQ5LDAsMjIwLDY2LDEsMjU1LDg2LDYwLDIzMiwwLDI1LDk2LDM3LDI1NSwyMjUsMTIyLDE2MiwxLDIxNSwxODcsMTY4LDI1NSwxNTgsMTU3LDQ2LDAsNTYsMTcxLDE2MiwwLDIzMiwyNDAsMTAxLDEsMTIyLDIyLDksMCw1MSw5LDIxLDI1NSw1MywyNSwyMzgsMjU1LDIxNywzMCwyMzIsMjU0LDEyNSwxNjksMTQ4LDAsMTMsMjMyLDEwMiwwLDE0OCw5LDM3LDAsMTY1LDk3LDE0MSwxLDIyOCwxMzEsNDEsMCwyMjIsMTUsMjQzLDI1NSwyNTQsMTgsMTcsMCw2LDYwLDIzNywxLDEwNiwzLDExMywwLDU5LDEzMiwxODksMCw5MiwxMTIsMzAsMCwxMDUsMjA4LDIxMywwLDQ4LDg0LDE3OSwyNTUsMTg3LDEyMSwyMzEsMjU0LDI3LDIxNiwxMDksMjU1LDE2MiwyMjEsMTA3LDI1NCw3MywyMzksMTk1LDI1NSwyNTAsMzEsNTcsMjU1LDE0OSwxMzUsODksMjU1LDE4NSwyMywxMTUsMSwzLDE2MywxNTcsMjU1LDE4LDExMiwyNTAsMCwyNSw1NywxODcsMjU1LDE2MSw5NiwxNjQsMCw0NywxNiwyNDMsMCwxMiwxNDEsMjUxLDI1NCw2NywyMzQsMTg0LDI1NSw0MSwxOCwxNjEsMCwxNzUsNiw5NiwyNTUsMTYwLDE3Miw1MiwyNTQsMjQsMTc2LDE4MywyNTUsMTk4LDE5Myw4NSwxLDEyNCwxMjEsMTM3LDI1NSwxNTEsNTAsMTE0LDI1NSwyMjAsMjAzLDYwLDI1NSwyMDcsMjM5LDUsMSwwLDM4LDEwNywyNTUsNTUsMjM4LDk0LDI1NCw3MCwxNTIsOTQsMCwyMTMsMjIwLDc3LDEsMTIwLDE3LDY5LDI1NSw4NSwxNjQsMTkwLDI1NSwyMDMsMjM0LDgxLDAsMzgsNDksMzcsMjU0LDYxLDE0NCwxMjQsMCwxMzcsNzgsNDksMjU0LDE2OCwyNDcsNDgsMCw5NSwxNjQsMjUyLDAsMTA1LDE2OSwxMzUsMCwyNTMsMjI4LDEzNCwwLDY0LDE2Niw3NSwwLDgxLDczLDIwLDI1NSwyMDcsMjEwLDEwLDAsMjM0LDEwNiwxNTAsMjU1LDk0LDM0LDkwLDI1NSwyNTQsMTU5LDU3LDI1NCwyMjAsMTMzLDk5LDAsMTM5LDE0NywxODAsMjU0LDI0LDIzLDE4NSwwLDQxLDU3LDMwLDI1NSwxODksOTcsNzYsMCw2NSwxODcsMjIzLDI1NSwyMjQsMTcyLDM3LDI1NSwzNCw2Miw5NSwxLDIzMSwxNDQsMjQwLDAsNzcsMTA2LDEyNiwyNTQsNjQsMTUyLDkxLDAsMjksOTgsMTU1LDAsMjI2LDI1MSw1MywyNTUsMjM0LDIxMSw1LDI1NSwxNDQsMjAzLDIyMiwyNTUsMTY0LDE3NiwyMjEsMjU0LDUsMjMxLDI0LDAsMTc5LDEyMiwyMDUsMCwzNiwxLDEzNCwyNTUsMTI1LDcwLDE1MSwyNTQsOTcsMjI4LDI1MiwwLDE3MiwxMjksMjMsMjU0LDQ4LDkwLDIwOSwyNTUsMTUwLDIyNCw4MiwxLDg0LDEzNCwzMCwwLDI0MSwxOTYsNDYsMCwxMDMsMTEzLDIzNCwyNTUsNDYsMTAxLDEyMSwyNTQsNDAsMTI0LDI1MCwyNTUsMTM1LDQ1LDI0MiwyNTQsOSwyNDksMTY4LDI1NSwxNDAsMTA4LDEzMSwyNTUsMTQzLDE2MywxNzEsMCw1MCwxNzMsMTk5LDI1NSw4OCwyMjIsMTQyLDI1NSwyMDAsOTUsMTU4LDAsMTQyLDE5MiwxNjMsMjU1LDcsMTE3LDEzNSwwLDExMSwxMjQsMjIsMCwyMzYsMTIsNjUsMjU0LDY4LDM4LDY1LDI1NSwyMjcsMTc0LDI1NCwwLDI0NCwyNDUsMzgsMCwyNDAsNTAsMjA4LDI1NSwxNjEsNjMsMjUwLDAsNjAsMjA5LDIzOSwwLDEyMiwzNSwxOSwwLDE0LDMzLDIzMCwyNTQsMiwxNTksMTEzLDAsMTA2LDIwLDEyNywyNTUsMjI4LDIwNSw5NiwwLDEzNywyMTAsMTc0LDI1NCwxODAsMjEyLDE0NCwyNTUsODksOTgsMTU0LDEsMzQsODgsMTM5LDAsMTY3LDE2MiwxMTIsMSw2NSwxMTAsMTk3LDAsMjQxLDM3LDE2OSwwLDY2LDU2LDEzMSwyNTUsMTAsMjAxLDgzLDI1NCwxMzMsMjUzLDE4NywyNTUsMTc3LDExMiw0NSwyNTQsMTk2LDI1MSwwLDAsMTk2LDI1MCwxNTEsMjU1LDIzOCwyMzIsMjE0LDI1NSwxNTAsMjA5LDIwNSwwLDI4LDI0MCwxMTgsMCw3MSw3Niw4MywxLDIzNiw5OSw5MSwwLDQyLDI1MCwxMzEsMSw5NiwxOCw2NCwyNTUsMTE4LDIyMiwzNSwwLDExMywyMTQsMjAzLDI1NSwxMjIsMTE5LDE4NCwyNTUsNjYsMTksMzYsMCwyMDQsNjQsMjQ5LDAsMTQ2LDg5LDEzOSwwLDEzNCw2MiwxMzUsMSwxMDQsMjMzLDEwMSwwLDE4OCw4NCwyNiwwLDQ5LDI0OSwxMjksMCwyMDgsMjE0LDc1LDI1NSwyMDcsMTMwLDc3LDI1NSwxMTUsMTc1LDIzNSwwLDE3MSwyLDEzNywyNTUsMTc1LDE0NSwxODYsMSw1NSwyNDUsMTM1LDI1NSwxNTQsODYsMTgxLDEsMTAwLDU4LDI0NiwyNTUsMTA5LDE5OSw2MCwyNTUsODIsMjA0LDEzNCwyNTUsMjE1LDQ5LDIzMCwxLDE0MCwyMjksMTkyLDI1NSwyMjIsMTkzLDI1MSwyNTUsODEsMTM2LDE1LDI1NSwxNzksMTQ5LDE2MiwyNTUsMjMsMzksMjksMjU1LDcsOTUsNzUsMjU0LDE5MSw4MSwyMjIsMCwyNDEsODEsOTAsMjU1LDEwNyw0OSwyMDEsMjU1LDI0NCwyMTEsMTU3LDAsMjIyLDE0MCwxNDksMjU1LDY1LDIxOSw1NiwyNTQsMTg5LDI0Niw5MCwyNTUsMTc4LDU5LDE1NywxLDQ4LDIxOSw1MiwwLDk4LDM0LDIxNSwwLDI4LDE3LDE4NywyNTUsMTc1LDE2OSwyNCwwLDkyLDc5LDE2MSwyNTUsMjM2LDIwMCwxOTQsMSwxNDcsMTQzLDIzNCwwLDIyOSwyMjUsNywxLDE5NywxNjgsMTQsMCwyMzUsNTEsNTMsMSwyNTMsMTIwLDE3NCwwLDE5Nyw2LDE2OCwyNTUsMjAyLDExNywxNzEsMCwxNjMsMjEsMjA2LDAsMTE0LDg1LDkwLDI1NSwxNSw0MSwxMCwyNTUsMTk0LDE5LDk5LDAsNjUsNTUsMjE2LDI1NCwxNjIsMTQ2LDExNiwwLDUwLDIwNiwyMTIsMjU1LDY0LDE0NiwyOSwyNTUsMTU4LDE1OCwxMzEsMSwxMDAsMTY1LDEzMCwyNTUsMTcyLDIzLDEyOSwyNTUsMTI1LDUzLDksMjU1LDE1LDE5MywxOCwxLDI2LDQ5LDExLDI1NSwxODEsMTc0LDIwMSwxLDEzNSwyMDEsMTQsMjU1LDEwMCwxOSwxNDksMCwyMTksOTgsNzksMCw0Miw5OSwxNDMsMjU0LDk2LDAsNDgsMjU1LDE5NywyNDksODMsMjU0LDEwNCwxNDksNzksMjU1LDIzNSwxMTAsMTM2LDI1NCw4MiwxMjgsNDQsMjU1LDY1LDQxLDM2LDI1NCw4OCwyMTEsMTAsMCwxODcsMTIxLDE4NywwLDk4LDEzNCwxOTksMCwxNzEsMTg4LDE3OSwyNTQsMjEwLDExLDIzOCwyNTUsNjYsMTIzLDEzMCwyNTQsNTIsMjM0LDYxLDAsNDgsMTEzLDIzLDI1NCw2LDg2LDEyMCwyNTUsMTE5LDE3OCwyNDUsMCw4NywxMjksMjAxLDAsMjQyLDE0MSwyMDksMCwyMDIsMTE0LDg1LDAsMTQ4LDIyLDE2MSwwLDEwMywxOTUsNDgsMCwyNSw0OSwxNzEsMjU1LDEzOCw2NywxMzAsMCwxODIsNzMsMTIyLDI1NCwxNDgsMjQsMTMwLDAsMjExLDIyOSwxNTQsMCwzMiwxNTUsMTU4LDAsODQsMTA1LDYxLDAsMTc3LDE5NCw5LDI1NSwxNjYsODksODYsMSw1NCw4MywxODcsMCwyNDksNDAsMTE3LDI1NSwxMDksMywyMTUsMjU1LDUzLDE0Niw0NCwxLDYzLDQ3LDE3OSwwLDE5NCwyMTYsMywyNTQsMTQsODQsMTM2LDAsMTM2LDE3NywxMywyNTUsNzIsMjQzLDE4NiwyNTUsMTE3LDE3LDEyNSwyNTUsMjExLDU4LDIxMSwyNTUsOTMsNzksMjIzLDAsOTAsODgsMjQ1LDI1NSwxMzksMjA5LDExMSwyNTUsNzAsMjIyLDQ3LDAsMTAsMjQ2LDc5LDI1NSwxOTgsMjE3LDE3OCwwLDIyNywyMjUsMTEsMSw3OCwxMjYsMTc5LDI1NSw2Miw0MywxMjYsMCwxMDMsMTQ4LDM1LDAsMTI5LDgsMTY1LDI1NCwyNDUsMjQwLDE0OCwwLDYxLDUxLDE0MiwwLDgxLDIwOCwxMzQsMCwxNSwxMzcsMTE1LDI1NSwyMTEsMTE5LDIzNiwyNTUsMTU5LDI0NSwyNDgsMjU1LDIsMTM0LDEzNiwyNTUsMjMwLDEzOSw1OCwxLDE2MCwxNjQsMjU0LDAsMTE0LDg1LDE0MSwyNTUsNDksMTY2LDE4MiwyNTUsMTQ0LDcwLDg0LDEsODUsMTgyLDcsMCw0Niw1Myw5MywwLDksMTY2LDE2MSwyNTUsNTUsMTYyLDE3OCwyNTUsNDUsMTg0LDE4OCwwLDE0NiwyOCw0NCwyNTQsMTY5LDkwLDQ5LDAsMTIwLDE3OCwyNDEsMSwxNCwxMjMsMTI3LDI1NSw3LDI0MSwxOTksMSwxODksNjYsNTAsMjU1LDE5OCwxNDMsMTAxLDI1NCwxODksMjQzLDEzNSwyNTUsMTQxLDI0LDI0LDI1NCw3NSw5Nyw4NywwLDExOCwyNTEsMTU0LDEsMjM3LDU0LDE1NiwwLDE3MSwxNDYsMjA3LDI1NSwxMzEsMTk2LDI0NiwyNTUsMTM2LDY0LDExMywxLDE1MSwyMzIsNTcsMCwyNDAsMjE4LDExNSwwLDQ5LDYxLDI3LDI1NSw2NCwxMjksNzMsMSwyNTIsMTY5LDI3LDI1NSw0MCwxMzIsMTAsMSw5MCwyMDEsMTkzLDI1NSwyNTIsMTIxLDI0MCwxLDE4NiwyMDYsNDEsMCw0MywxOTgsOTcsMCwxNDUsMTAwLDE4MywwLDIwNCwyMTYsODAsMjU0LDE3MiwxNTAsNjUsMCwyNDksMjI5LDE5NiwyNTQsMTA0LDEyMyw3MywyNTUsNzcsMTA0LDk2LDI1NCwxMzAsMTgwLDgsMCwxMDQsMTIzLDU3LDAsMjIwLDIwMiwyMjksMjU1LDEwMiwyNDksMjExLDAsODYsMTQsMjMyLDI1NSwxODIsNzgsMjA5LDAsMjM5LDIyNSwxNjQsMCwxMDYsMTMsMzIsMjU1LDEyMCw3MywxNywyNTUsMTM0LDY3LDIzMywwLDgzLDI1NCwxODEsMCwxODMsMjM2LDExMiwxLDQ4LDY0LDEzMSwyNTUsMjQxLDIxNiwyNDMsMjU1LDY1LDE5MywyMjYsMCwyMDYsMjQxLDEwMCwyNTQsMTAwLDEzNCwxNjYsMjU1LDIzNywyMDIsMTk3LDAsNTUsMTMsODEsMCwzMiwxMjQsMTAyLDI1NSw0MCwyMjgsMTc3LDAsMTE4LDE4MSwzMSwxLDIzMSwxNjAsMTM0LDI1NSwxMTksMTg3LDIwMiwwLDAsMTQyLDYwLDI1NSwxMjgsMzgsMTg5LDI1NSwxNjYsMjAxLDE1MCwwLDIwNywxMjAsMjYsMSw1NCwxODQsMTcyLDAsMTIsMjQyLDIwNCwyNTQsMTMzLDY2LDIzMCwwLDM0LDM4LDMxLDEsMTg0LDExMiw4MCwwLDMyLDUxLDE2NSwyNTQsMTkxLDI0Myw1NSwwLDU4LDczLDE0NiwyNTQsMTU1LDE2NywyMDUsMjU1LDEwMCwxMDQsMTUyLDI1NSwxOTcsMjU0LDIwNywyNTUsMTczLDE5LDI0NywwLDIzOCwxMCwyMDIsMCwyMzksMTUxLDI0MiwwLDk0LDU5LDM5LDI1NSwyNDAsMjksMTAyLDI1NSwxMCw5MiwxNTQsMjU1LDIyOSw4NCwyMTksMjU1LDE2MSwxMjksODAsMCwyMDgsOTAsMjA0LDEsMjQwLDIxOSwxNzQsMjU1LDE1OCwxMDIsMTQ1LDEsNTMsMTc4LDc2LDI1NSw1MiwxMDgsMTY4LDEsODMsMjIyLDEwNywwLDIxMSwzNiwxMDksMCwxMTgsNTgsNTYsMCw4LDI5LDIyLDAsMjM3LDE2MCwxOTksMCwxNzAsMjA5LDE1NywwLDEzNyw3MSw0NywwLDE0Myw4NiwzMiwwLDE5OCwyNDIsMiwwLDIxMiw0OCwxMzYsMSw5MiwxNzIsMTg2LDAsMjMwLDE1MSwxMDUsMSw5NiwxOTEsMjI5LDAsMTM4LDgwLDE5MSwyNTQsMjQwLDIxNiwxMzAsMjU1LDk4LDQzLDYsMjU0LDE2OCwxOTYsNDksMCwyNTMsMTgsOTEsMSwxNDQsNzMsMTIxLDAsNjEsMTQ2LDM5LDEsNjMsMTA0LDI0LDI1NSwxODQsMTY1LDExMiwyNTQsMTI2LDIzNSw5OCwwLDgwLDIxMyw5OCwyNTUsMTIzLDYwLDg3LDI1NSw4MiwxNDAsMjQ1LDEsMjIzLDEyMCwxNzMsMjU1LDE1LDE5OCwxMzQsMSwyMDYsNjAsMjM5LDAsMjMxLDIzNCw5MiwyNTUsMzMsMjM4LDE5LDI1NSwxNjUsMTEzLDE0MiwxLDE3NiwxMTksMzgsMCwxNjAsNDMsMTY2LDI1NCwyMzksOTEsMTA1LDAsMTA3LDYxLDE5NCwxLDI1LDQsNjgsMCwxNSwxMzksNTEsMCwxNjQsMTMyLDEwNiwyNTUsMzQsMTE2LDQ2LDI1NCwxNjgsOTUsMTk3LDAsMTM3LDIxMiwyMywwLDcyLDE1Niw1OCwwLDEzNywxMTIsNjksMjU0LDE1MCwxMDUsMTU0LDI1NSwyMzYsMjAxLDE1NywwLDIzLDIxMiwxNTQsMjU1LDEzNiw4MiwyMjcsMjU0LDIyNiw1OSwyMjEsMjU1LDk1LDE0OSwxOTIsMCw4MSwxMTgsNTIsMjU1LDMzLDQzLDIxNSwxLDE0LDE0Nyw3NSwyNTUsODksMTU2LDEyMSwyNTQsMTQsMTgsNzksMCwxNDcsMjA4LDEzOSwxLDE1MSwyMTgsNjIsMjU1LDE1Niw4OCw4LDEsMjEwLDE4NCw5OCwyNTUsMjAsMTc1LDEyMywyNTUsMTAyLDgzLDIyOSwwLDIyMCw2NSwxMTYsMSwxNTAsMjUwLDQsMjU1LDkyLDE0MiwyMjAsMjU1LDM0LDI0Nyw2NiwyNTUsMjA0LDIyNSwxNzksMjU0LDE1MSw4MSwxNTEsMCw3MSw0MCwyMzYsMjU1LDEzOCw2Myw2MiwwLDYsNzksMjQwLDI1NSwxODMsMTg1LDE4MSwwLDExOCw1MCwyNywwLDYzLDIyNywxOTIsMCwxMjMsOTksNTgsMSw1MCwyMjQsMTU1LDI1NSwxNywyMjUsMjIzLDI1NCwyMjAsMjI0LDc3LDI1NSwxNCw0NCwxMjMsMSwxNDEsMTI4LDE3NSwwLDI0OCwyMTIsMjAwLDAsMTUwLDU5LDE4MywyNTUsMTQ3LDk3LDI5LDAsMTUwLDIwNCwxODEsMCwyNTMsMzcsNzEsMCwxNDUsODUsMTE5LDAsMTU0LDIwMCwxODYsMCwyLDEyOCwyNDksMjU1LDgzLDI0LDEyNCwwLDE0LDg3LDE0MywwLDE2OCw1MSwyNDUsMSwxMjQsMTUxLDIzMSwyNTUsMjA4LDI0MCwxOTcsMSwxMjQsMTkwLDE4NSwwLDQ4LDU4LDI0NiwwLDIwLDIzMywyMzIsMCwxMjUsMTgsOTgsMjU1LDEzLDI1NCwzMSwyNTUsMjQ1LDE3NywxMzAsMjU1LDEwOCwxNDIsMzUsMCwxNzEsMTI1LDI0MiwyNTQsMTQwLDEyLDM0LDI1NSwxNjUsMTYxLDE2MiwwLDIwNiwyMDUsMTAxLDAsMjQ3LDI1LDM0LDEsMTAwLDE0NSw1NywwLDM5LDcwLDU3LDAsMTE4LDIwNCwyMDMsMjU1LDI0MiwwLDE2MiwwLDE2NSwyNDQsMzAsMCwxOTgsMTE2LDIyNiwwLDEyOCwxMTEsMTUzLDI1NSwxNDAsNTQsMTgyLDEsNjAsMTIyLDE1LDI1NSwxNTUsNTgsNTcsMSw1NCw1MCwxOTgsMCwxNzEsMjExLDI5LDI1NSwxMDcsMTM4LDE2NywyNTUsMTczLDEwNywxOTksMjU1LDEwOSwxNjEsMTkzLDAsODksNzIsMjQyLDI1NSwyMDYsMTE1LDg5LDI1NSwyNTAsMjU0LDE0MiwyNTQsMTc3LDIwMiw5NCwyNTUsODEsODksNTAsMCw3LDEwNSw2NiwyNTUsMjUsMjU0LDI1NSwyNTQsMjAzLDY0LDIzLDI1NSw3OSwyMjIsMTA4LDI1NSwzOSwyNDksNzUsMCwyNDEsMTI0LDUwLDAsMjM5LDE1MiwxMzMsMCwyMjEsMjQxLDEwNSwwLDE0NywxNTEsOTgsMCwyMTMsMTYxLDEyMSwyNTQsMjQyLDQ5LDEzNywwLDIzMywzNywyNDksMjU0LDQyLDE4MywyNywwLDE4NCwxMTksMjMwLDI1NSwyMTcsMzIsMTYzLDI1NSwyMDgsMjUxLDIyOCwxLDEzNyw2MiwxMzEsMjU1LDc5LDY0LDksMjU0LDk0LDQ4LDExMywwLDE3LDEzOCw1MCwyNTQsMTkzLDI1NSwyMiwwLDI0NywxOCwxOTcsMSw2Nyw1NSwxMDQsMCwxNiwyMDUsOTUsMjU1LDQ4LDM3LDY2LDAsNTUsMTU2LDYzLDEsNjQsODIsNzQsMjU1LDIwMCw1Myw3MSwyNTQsMjM5LDY3LDEyNSwwLDI2LDIyNCwyMjIsMCwyMjMsMTM3LDkzLDI1NSwzMCwyMjQsMjAyLDI1NSw5LDIyMCwxMzIsMCwxOTgsMzgsMjM1LDEsMTAyLDE0MSw4NiwwLDYwLDQzLDgxLDEsMTM2LDI4LDI2LDAsMjMzLDM2LDgsMjU0LDIwNywyNDIsMTQ4LDAsMTY0LDE2Miw2MywwLDUxLDQ2LDIyNCwyNTUsMTE0LDQ4LDc5LDI1NSw5LDE3NSwyMjYsMCwyMjIsMywxOTMsMjU1LDQ3LDE2MCwyMzIsMjU1LDI1NSw5MywxMDUsMjU0LDE0LDQyLDIzMCwwLDI2LDEzOCw4MiwxLDIwOCw0MywyNDQsMCwyNywzOSwzOCwyNTUsOTgsMjA4LDEyNywyNTUsNjQsMTQ5LDE4MiwyNTUsNSwyNTAsMjA5LDAsMTg3LDYwLDI4LDI1NCw0OSwyNSwyMTgsMjU1LDE2OSwxMTYsMjA1LDI1NSwxMTksMTgsMTIwLDAsMTU2LDExNiwxNDcsMjU1LDEzMiw1MywxMDksMjU1LDEzLDEwLDIwMiwwLDExMCw4MywxNjcsMCwxNTcsMjE5LDEzNywyNTUsNiwzLDEzMCwyNTUsNTAsMTY3LDMwLDI1NSw2MCwxNTksNDcsMjU1LDEyOSwxMjgsMTU3LDI1NCw5NCwzLDE4OSwwLDMsMTY2LDY4LDAsODMsMjIzLDIxNSwwLDE1MCw5MCwxOTQsMSwxNSwxNjgsNjUsMCwyMjcsODMsNTEsMjU1LDIwNSwxNzEsNjYsMjU1LDU0LDE4Nyw2MCwxLDE1MiwxMDIsNDUsMjU1LDExOSwxNTQsMjI1LDAsMjQwLDI0NywxMzYsMCwxMDAsMTk3LDE3OCwyNTUsMTM5LDcxLDIyMywyNTUsMjA0LDgyLDE2LDEsNDEsMjA2LDQyLDI1NSwxNTYsMTkyLDIyMSwyNTUsMjE2LDEyMywyNDQsMjU1LDIxOCwyMTgsMTg1LDI1NSwxODcsMTg2LDIzOSwyNTUsMjUyLDE3MiwxNjAsMjU1LDE5NSw1MiwyMiwwLDE0NCwxNzQsMTgxLDI1NCwxODcsMTAwLDExNSwyNTUsMjExLDc4LDE3NiwyNTUsMjcsNywxOTMsMCwxNDcsMjEzLDEwNCwyNTUsOTAsMjAxLDEwLDI1NSw4MCwxMjMsNjYsMSwyMiwzMywxODYsMCwxLDcsOTksMjU0LDMwLDIwNiwxMCwwLDIyOSwyMzQsNSwwLDUzLDMwLDIxMCwwLDEzOCw4LDIyMCwyNTQsNzEsNTUsMTY3LDAsNzIsMjI1LDg2LDEsMTE4LDE5MCwxODgsMCwyNTQsMTkzLDEwMSwxLDE3MSwyNDksMTcyLDI1NSw5NCwxNTgsMTgzLDI1NCw5MywyLDEwOCwyNTUsMTc2LDkzLDc2LDI1NSw3Myw5OSw3OSwyNTUsNzQsNjQsMTI5LDI1NCwyNDYsNDYsNjUsMCw5OSwyNDEsMTI3LDI1NCwyNDYsMTUxLDEwMiwyNTUsNDQsNTMsMjA4LDI1NCw1OSwxMDIsMjM0LDAsMTU0LDE3NSwxNjQsMjU1LDg4LDI0MiwzMiwwLDExMSwzOCwxLDAsMjU1LDE4MiwxOTAsMjU1LDExNSwxNzYsMTUsMjU0LDE2OSw2MCwxMjksMCwxMjIsMjM3LDI0MSwwLDkwLDc2LDYzLDAsNjIsNzQsMTIwLDI1NSwxMjIsMTk1LDExMCwwLDExOSw0LDE3OCwwLDIyMiwyNDIsMjEwLDAsMTMwLDMzLDQ2LDI1NCwxNTYsNDAsNDEsMCwxNjcsMTQ2LDExMiwxLDQ5LDE2MywxMTEsMjU1LDEyMSwxNzYsMjM1LDAsNzYsMjA3LDE0LDI1NSwzLDI1LDE5OCwxLDQxLDIzNSwyMTMsMCw4NSwzNiwyMTQsMSw0OSw5MiwxMDksMjU1LDIwMCwyNCwzMCwyNTQsMTY4LDIzNiwxOTUsMCwxNDUsMzksMTI0LDEsMjM2LDE5NSwxNDksMCw5MCwzNiwxODQsMjU1LDY3LDg1LDE3MCwyNTUsMzgsMzUsMjYsMjU0LDEzMSwxMjQsNjgsMjU1LDIzOSwxNTUsMzUsMjU1LDU0LDIwMSwxNjQsMCwxOTYsMjIsMTE3LDI1NSw0OSwxNSwyMDUsMCwyNCwyMjQsMjksMSwxMjYsMTEzLDE0NCwwLDExNywyMSwxODIsMCwyMDMsMTU5LDE0MSwwLDIyMywxMzUsNzcsMCwxNzYsMjMwLDE3NiwyNTUsMTkwLDIyOSwyMTUsMjU1LDk5LDM3LDE4MSwyNTUsNTEsMjEsMTM4LDI1NSwyNSwxODksODksMjU1LDQ5LDQ4LDE2NSwyNTQsMTUyLDQ1LDI0NywwLDE3MCwxMDgsMjIyLDAsODAsMjAyLDUsMCwyNyw2OSwxMDMsMjU0LDIwNCwyMiwxMjksMjU1LDE4MCwyNTIsNjIsMjU0LDIxMCwxLDkxLDI1NSwxNDYsMTEwLDI1NCwyNTUsMjE5LDE2MiwyOCwwLDIyMywyNTIsMjEzLDEsNTksOCwzMywwLDIwNiwxNiwyNDQsMCwxMjksMjExLDQ4LDAsMTA3LDE2MCwyMDgsMCwxMTIsNTksMjA5LDAsMTA5LDc3LDIxNiwyNTQsMzQsMjEsMTg1LDI1NSwyNDYsOTksNTYsMjU1LDE3OSwxMzksMTksMjU1LDE4NSwyOSw1MCwyNTUsODQsODksMTksMCw3NCwyNTAsOTgsMjU1LDIyNSw0MiwyMDAsMjU1LDE5MiwyMTcsMjA1LDI1NSwyMTAsMTYsMTY3LDAsOTksMTMyLDk1LDEsNDMsMjMwLDU3LDAsMjU0LDExLDIwMywyNTUsOTksMTg4LDYzLDI1NSwxMTksMTkzLDI1MSwyNTQsODAsMTA1LDU0LDAsMjMyLDE4MSwxODksMSwxODMsNjksMTEyLDI1NSwyMDgsMTcxLDE2NSwyNTUsNDcsMTA5LDE4MCwyNTUsMTIzLDgzLDE2NSwwLDE0NiwxNjIsNTIsMjU1LDE1NCwxMSw0LDI1NSwxNTEsMjI3LDkwLDI1NSwxNDYsMTM3LDk3LDI1NCw2MSwyMzMsNDEsMjU1LDk0LDQyLDU1LDI1NSwxMDgsMTY0LDIzNiwwLDE1Miw2OCwyNTQsMCwxMCwxNDAsMTMxLDI1NSwxMCwxMDYsNzksMjU0LDI0MywxNTgsMTM3LDAsNjcsMTc4LDY2LDI1NCwxNzcsMTIzLDE5OCwyNTUsMTUsNjIsMzQsMCwxOTcsODgsNDIsMjU1LDE0OSw5NSwxNzcsMjU1LDE1MiwwLDE5OCwyNTUsMTQ5LDI1NCwxMTMsMjU1LDIyNSw5MCwxNjMsMjU1LDEyNSwyMTcsMjQ3LDAsMTgsMTcsMjI0LDAsMTI4LDY2LDEyMCwyNTQsMTkyLDI1LDksMjU1LDUwLDIyMSwyMDUsMCw0OSwyMTIsNzAsMCwyMzMsMjU1LDE2NCwwLDIsMjA5LDksMCwyMjEsNTIsMjE5LDI1NCwxNzIsMjI0LDI0NCwyNTUsOTQsNTYsMjA2LDEsMjQyLDE3OSwyLDI1NSwzMSw5MSwxNjQsMSwyMzAsNDYsMTM4LDI1NSwxODksMjMwLDIyMCwwLDU3LDQ3LDYxLDI1NSwxMTEsMTEsMTU3LDAsMTc3LDkxLDE1MiwwLDI4LDIzMCw5OCwwLDk3LDg3LDEyNiwwLDE5OCw4OSwxNDUsMjU1LDE2Nyw3OSwxMDcsMCwyNDksNzcsMTYwLDEsMjksMjMzLDIzMCwyNTUsMTUwLDIxLDg2LDI1NCw2MCwxMSwxOTMsMCwxNTEsMzcsMzYsMjU0LDE4NSwxNTAsMjQzLDI1NSwyMjgsMjEyLDgzLDEsMTcyLDE1MSwxODAsMCwyMDEsMTY5LDE1NSwwLDI0NCw2MCwyMzQsMCwxNDIsMjM1LDQsMSw2NywyMTgsNjAsMCwxOTIsMTEzLDc1LDEsMTE2LDI0MywyMDcsMjU1LDY1LDE3MiwxNTUsMCw4MSwzMCwxNTYsMjU1LDgwLDcyLDMzLDI1NCwxOCwyMzEsMTA5LDI1NSwxNDIsMTA3LDIxLDI1NCwxMjUsMjYsMTMyLDI1NSwxNzYsMTYsNTksMjU1LDE1MCwyMDEsNTgsMCwyMDYsMTY5LDIwMSwwLDIwOCwxMjEsMjI2LDAsNDAsMTcyLDE0LDI1NSwxNTAsNjEsOTQsMjU1LDU2LDU3LDE1NiwyNTUsMTQxLDYwLDE0NSwyNTUsNDUsMTA4LDE0OSwyNTUsMjM4LDE0NSwxNTUsMjU1LDIwOSw4NSwzMSwyNTQsMTkyLDEyLDIxMCwwLDk5LDk4LDkzLDI1NCwxNTIsMTYsMTUxLDAsMjI1LDE4NSwyMjAsMCwxNDEsMjM1LDQ0LDI1NSwxNjAsMTcyLDIxLDI1NCw3MSwyNiwzMSwyNTUsMTMsNjQsOTMsMjU0LDI4LDU2LDE5OCwwLDE3Nyw2MiwyNDgsMSwxODIsOCwyNDEsMCwxNjYsMTAxLDE0OCwyNTUsNzgsODEsMTMzLDI1NSwxMjksMjIyLDIxNSwxLDE4OCwxNjksMTI5LDI1NSwyMzIsNyw5NywwLDQ5LDExMiw2MCwyNTUsMjE3LDIyOSwyNTEsMCwxMTksMTA4LDEzOCwwLDM5LDE5LDEyMywyNTQsMTMxLDQ5LDIzNSwwLDEzMiw4NCwxNDUsMCwxMzAsMjMwLDE0OCwyNTUsMjUsNzQsMTg3LDAsNSwyNDUsNTQsMjU1LDE4NSwyMTksMjQxLDEsMTgsMTk0LDIyOCwyNTUsMjQxLDIwMiwxMDIsMCwxMDUsMTEzLDIwMiwwLDE1NSwyMzUsNzksMCwyMSw5LDE3OCwyNTUsMTU2LDEsMjM5LDAsMjAwLDE0OCw2MSwwLDExNSwyNDcsMjEwLDI1NSw0OSwyMjEsMTM1LDAsNTgsMTg5LDgsMSwzNSw0Niw5LDAsODEsNjUsNSwyNTUsNTIsMTU4LDE4NSwyNTUsMTI1LDExNiw0NiwyNTUsNzQsMTQwLDEzLDI1NSwyMTAsOTIsMTcyLDI1NCwxNDcsMjMsNzEsMCwyMTcsMjI0LDI1MywyNTQsMTE1LDEwOCwxODAsMjU1LDE0NSw1OCw0OCwyNTQsMjE5LDE3NywyNCwyNTUsMTU2LDI1NSw2MCwxLDE1NCwxNDcsMjQyLDAsMjUzLDEzNCw4NywwLDUzLDc1LDIyOSwwLDQ4LDE5NSwyMjIsMjU1LDMxLDE3NSw1MCwyNTUsMTU2LDIxMCwxMjAsMjU1LDIwOCwzNSwyMjIsMjU1LDE4LDI0OCwxNzksMSwyLDEwLDEwMSwyNTUsMTU3LDE5NCwyNDgsMjU1LDE1OCwyMDQsMTAxLDI1NSwxMDQsMjU0LDE5NywyNTUsNzksNjIsNCwwLDE3OCwxNzIsMTAxLDEsOTYsMTQ2LDI1MSwyNTUsNjUsMTAsMTU2LDAsMiwxMzcsMTY1LDI1NSwxMTYsNCwyMzEsMCwyNDIsMjE1LDEsMCwxOSwzNSwyOSwyNTUsNDMsMTYxLDc5LDAsNTksMTQ5LDI0NiwxLDI1MSw2NiwxNzYsMCwyMDAsMzMsMywyNTUsODAsMTEwLDE0MiwyNTUsMTk1LDE2MSwxNywxLDIyOCw1Niw2NiwyNTUsMTIzLDQ3LDE0NSwyNTQsMTMyLDQsMTY0LDAsNjcsMTc0LDE3MiwwLDI1LDI1MywxMTQsMCw4Nyw5Nyw4NywxLDI1MCwyMjAsODQsMCw5Niw5MSwyMDAsMjU1LDM3LDEyNSw1OSwwLDE5LDY1LDExOCwwLDE2MSw1MiwyNDEsMjU1LDIzNywxNzIsNiwyNTUsMTc2LDE5MSwyNTUsMjU1LDEsNjUsMTMwLDI1NCwyMjMsMTkwLDIzMCwwLDEwMSwyNTMsMjMxLDI1NSwxNDYsMzUsMTA5LDAsMjUwLDI5LDc3LDEsNDksMCwxOSwwLDEyMyw5MCwxNTUsMSwyMiw4NiwzMiwyNTUsMjE4LDIxMyw2NSwwLDExMSw5MywxMjcsMCw2MCw5MywxNjksMjU1LDgsMTI3LDE4MiwwLDE3LDE4NiwxNCwyNTQsMjUzLDEzNywyNDYsMjU1LDIxMywyNSw0OCwyNTQsNzYsMjM4LDAsMjU1LDI0OCw5Miw3MCwyNTUsOTksMjI0LDEzOSwwLDE4NCw5LDI1NSwxLDcsMTY0LDIwOCwwLDIwNSwxMzEsMTk4LDEsODcsMjE0LDE5OSwwLDEzMCwyMTQsOTUsMCwyMjEsMTQ5LDIyMiwwLDIzLDM4LDE3MSwyNTQsMTk3LDExMCwyMTMsMCw0MywxMTUsMTQwLDI1NCwyMTUsMTc3LDExOCwwLDk2LDUyLDY2LDEsMTE3LDE1OCwyMzcsMCwxNCw2NCwxODIsMjU1LDQ2LDYzLDE3NCwyNTUsMTU4LDk1LDE5MCwyNTUsMjI1LDIwNSwxNzcsMjU1LDQzLDUsMTQyLDI1NSwxNzIsOTksMjEyLDI1NSwyNDQsMTg3LDE0NywwLDI5LDUxLDE1MywyNTUsMjI4LDExNiwyNCwyNTQsMzAsMTAxLDIwNywwLDE5LDI0NiwxNTAsMjU1LDEzNCwyMzEsNSwwLDEyNSwxMzQsMjI2LDEsNzcsNjUsOTgsMCwyMzYsMTMwLDMzLDI1NSw1LDExMCw2MiwwLDY5LDEwOCwxMjcsMjU1LDcsMTEzLDIyLDAsMTQ1LDIwLDgzLDI1NCwxOTQsMTYxLDIzMSwyNTUsMTMxLDE4MSw2MCwwLDIxNywyMDksMTc3LDI1NSwyMjksMTQ4LDIxMiwyNTQsMywxMzEsMTg0LDAsMTE3LDE3NywxODcsMSwyOCwxNCwzMSwyNTUsMTc2LDEwMiw4MCwwLDUwLDg0LDE1MSwyNTUsMTI1LDMxLDU0LDI1NSwyMSwxNTcsMTMzLDI1NSwxOSwxNzksMTM5LDEsMjI0LDIzMiwyNiwwLDM0LDExNywxNzAsMjU1LDE2NywyNTIsMTcxLDI1NSw3MywxNDEsMjA2LDI1NCwxMjksMjUwLDM1LDAsNzIsNzksMjM2LDEsMjIwLDIyOSwyMCwyNTUsNDEsMjAyLDE3MywyNTUsOTksNzYsMjM4LDI1NSwxOTgsMjIsMjI0LDI1NSwxMDgsMTk4LDE5NSwyNTUsMzYsMTQxLDk2LDEsMjM2LDE1OCw1OSwyNTUsMTA2LDEwMCw4NywwLDExMCwyMjYsMiwwLDIyNywyMzQsMjIyLDAsMTU0LDkzLDExOSwyNTUsNzQsMTEyLDE2NCwyNTUsNjcsOTEsMiwyNTUsMjEsMTQ1LDMzLDI1NSwxMDIsMjE0LDEzNywyNTUsMTc1LDIzMCwxMDMsMjU0LDE2MywyNDYsMTY2LDAsOTMsMjQ3LDExNiwyNTQsMTY3LDIyNCwyOCwyNTUsMjIwLDIsNTcsMSwxNzEsMjA2LDg0LDAsMTIzLDIyOCwxNywyNTUsMjcsMTIwLDExOSwwLDExOSwxMSwxNDcsMSwxODAsNDcsMjI1LDI1NSwxMDQsMjAwLDE4NSwyNTQsMTY1LDIsMTE0LDAsNzcsNzgsMjEyLDAsNDUsMTU0LDE3NywyNTUsMjQsMTk2LDEyMSwyNTQsODIsMTU3LDE4MiwwLDkwLDE2LDE5MCwxLDEyLDE0NywxOTcsMCw5NSwyMzksMTUyLDI1NSwxMSwyMzUsNzEsMCw4NiwxNDYsMTE5LDI1NSwxNzIsMTM0LDIxNCwwLDYwLDEzMSwxOTYsMCwxNjEsMjI1LDEyOSwwLDMxLDEzMCwxMjAsMjU0LDk1LDIwMCw1MSwwLDEwNSwyMzEsMjEwLDI1NSw1OCw5LDE0OCwyNTUsNDMsMTY4LDIyMSwyNTUsMTI0LDIzNywxNDIsMCwxOTgsMjExLDUwLDI1NCw0NiwyNDUsMTAzLDAsMTY0LDI0OCw4NCwwLDE1Miw3MCwyMDgsMjU1LDE4MCwxMTcsMTc3LDAsNzAsNzksMTg1LDAsMjQzLDc0LDMyLDAsMTQ5LDE1NiwyMDcsMCwxOTcsMTk2LDE2MSwxLDI0NSw1MywyMzksMCwxNSw5MywyNDYsMjU0LDEzOSwyNDAsNDksMjU1LDE5Niw4OCwzNiwyNTUsMTYyLDM4LDEyMywwLDEyOCwyMDAsMTU3LDEsMTc0LDc2LDEwMywyNTUsMTczLDE2OSwzNCwyNTQsMjE2LDEsMTcxLDI1NSwxMTQsNTEsMTcsMCwxMzYsMjI4LDE5NCwwLDExMCwxNTAsNTYsMjU0LDEwNiwyNDYsMTU5LDAsMTksMTg0LDc5LDI1NSwxNTAsNzcsMjQwLDI1NSwxNTUsODAsMTYyLDAsMCw1MywxNjksMjU1LDI5LDE1MSw4NiwwLDY4LDk0LDE2LDAsOTIsNywxMTAsMjU0LDk4LDExNywxNDksMjU1LDI0OSw3NywyMzAsMjU1LDI1MywxMCwxNDAsMCwyMTQsMTI0LDkyLDI1NCwzNSwxMTgsMjM1LDAsODksNDgsNTcsMSwyMiw1MywxNjYsMCwxODQsMTQ0LDYxLDI1NSwxNzksMjU1LDE5NCwwLDIxNCwyNDgsNjEsMjU0LDU5LDExMCwyNDYsMCwxMjEsMjEsODEsMjU0LDE2NiwzLDIyOCwwLDEwNiw2NCwyNiwyNTUsNjksMjMyLDEzNCwyNTUsMjQyLDIyMCw1MywyNTQsNDYsMjIwLDg1LDAsMTEzLDE0OSwyNDcsMjU1LDk3LDE3OSwxMDMsMjU1LDE5MCwxMjcsMTEsMCwxMzUsMjA5LDE4MiwwLDk1LDUyLDEyOSwxLDE3MCwxNDQsMjA2LDI1NSwxMjIsMjAwLDIwNCwyNTUsMTY4LDEwMCwxNDYsMCw2MCwxNDQsMTQ5LDI1NCw3MCw2MCw0MCwwLDEyMiw1MiwxNzcsMjU1LDI0NiwyMTEsMTAxLDI1NSwxNzQsMjM3LDgsMCw3LDUxLDEyMCwwLDE5LDMxLDE3MywwLDEyNiwyMzksMTU2LDI1NSwxNDMsMTg5LDIwMywwLDE5NiwxMjgsODgsMjU1LDIzMywxMzMsMjI2LDI1NSwzMCwxMjUsMTczLDI1NSwyMDEsMTA4LDUwLDAsMTIzLDEwMCw1OSwyNTUsMjU0LDE2MywzLDEsMjIxLDE0OCwxODEsMjU1LDIxNCwxMzYsNTcsMjU0LDIyMiwxODAsMTM3LDI1NSwyMDcsODgsNTQsMjU1LDI4LDMzLDI1MSwyNTUsNjcsMjE0LDUyLDEsMjEwLDIwOCwxMDAsMCw4MSwxNzAsOTQsMCwxNDUsNDAsNTMsMCwyMjQsMTExLDIzMSwyNTQsMzUsMjgsMjQ0LDI1NSwyMjYsMTk5LDE5NSwyNTQsMjM4LDE3LDIzMCwwLDIxNywyMTcsMTY0LDI1NCwxNjksMTU3LDIyMSwwLDIxOCw0NiwxNjIsMSwxOTksMjA3LDE2MywyNTUsMTA4LDExNSwxNjIsMSwxNCw5NiwxODcsMjU1LDExOCw2MCw3NiwwLDE4NCwxNTksMTUyLDAsMjA5LDIzMSw3MSwyNTQsNDIsMTY0LDE4NiwyNTUsMTg2LDE1Myw1MSwyNTQsMjIxLDE3MSwxODIsMjU1LDE2MiwxNDIsMTczLDAsMjM1LDQ3LDE5MywwLDcsMTM5LDE2LDEsOTUsMTY0LDY0LDI1NSwxNiwyMjEsMTY2LDAsMjE5LDE5NywxNiwwLDEzMiwyOSw0NCwyNTUsMTAwLDY5LDExNywyNTUsNjAsMjM1LDg4LDI1NCw0MCw4MSwxNzMsMCw3MSwxOTAsNjEsMjU1LDE4Nyw4OCwxNTcsMCwyMzEsMTEsMjMsMCwyMzcsMTE3LDE2NCwwLDIyNSwxNjgsMjIzLDI1NSwxNTQsMTE0LDExNiwyNTUsMTYzLDE1MiwyNDIsMSwyNCwzMiwxNzAsMCwxMjUsOTgsMTEzLDI1NCwxNjgsMTksNzYsMCwxNywxNTcsMjIwLDI1NCwxNTUsNTIsNSwwLDE5LDExMSwxNjEsMjU1LDcxLDkwLDI1MiwyNTUsMTczLDExMCwyNDAsMCwxMCwxOTgsMTIxLDI1NSwyNTMsMjU1LDI0MCwyNTUsNjYsMTIzLDIxMCwwLDIyMSwxOTQsMjE1LDI1NCwxMjEsMTYzLDE3LDI1NSwyMjUsNyw5OSwwLDE5MCw0OSwxODIsMCwxMTUsOSwxMzMsMSwyMzIsMjYsMTM4LDI1NSwyMTMsNjgsMTMyLDAsNDQsMTE5LDEyMiwyNTUsMTc5LDk4LDUxLDAsMTQ5LDkwLDEwNiwwLDcxLDUwLDIzMCwyNTUsMTAsMTUzLDExOCwyNTUsMTc3LDcwLDI1LDAsMTY1LDg3LDIwNSwwLDU1LDEzOCwyMzQsMCwyMzgsMzAsOTcsMCwxMTMsMTU1LDIwNywwLDk4LDE1MywxMjcsMCwzNCwxMDcsMjE5LDI1NCwxMTcsMTE0LDE3MiwyNTUsNzYsMTgwLDI1NSwyNTQsMjQyLDU3LDE3OSwyNTUsMjIxLDM0LDE3MiwyNTQsNTYsMTYyLDQ5LDI1NSw4MywzLDI1NSwyNTUsMTEzLDIyMSwxODksMjU1LDE4OCwyNSwyMjgsMjU0LDE2LDg4LDg5LDI1NSw3MSwyOCwxOTgsMjU0LDIyLDE3LDE0OSwyNTUsMjQzLDEyMSwyNTQsMjU1LDEwNywyMDIsOTksMjU1LDksMjA2LDE0LDEsMjIwLDQ3LDE1MywwLDEwNywxMzcsMzksMSw5Nyw0OSwxOTQsMjU1LDE0OSw1MSwxOTcsMjU0LDE4Niw1OCwxMSwyNTUsMTA3LDQzLDIzMiwxLDIwMCw2LDE0LDI1NSwxODEsMTMzLDY1LDI1NCwyMjEsMjI4LDE3MSwyNTUsMTIzLDYyLDIzMSwxLDIyNywyMzQsMTc5LDI1NSwzNCwxODksMjEyLDI1NCwyNDQsMTg3LDI0OSwwLDE5MCwxMyw4MCwxLDEzMCw4OSwxLDAsMjIzLDEzMywxNzMsMCw5LDIyMiwxOTgsMjU1LDY2LDEyNyw3NCwwLDE2NywyMTYsOTMsMjU1LDE1NSwxNjgsMTk4LDEsNjYsMTQ1LDAsMCw2OCwxMDIsNDYsMSwxNzIsOTAsMTU0LDAsMjE2LDEyOCw3NSwyNTUsMTYwLDQwLDUxLDAsMTU4LDE3LDI3LDEsMTI0LDI0MCw0OSwwLDIzNiwyMDIsMTc2LDI1NSwxNTEsMTI0LDE5MiwyNTUsMzgsMTkzLDE5MCwwLDk1LDE4Miw2MSwwLDE2MywxNDcsMTI0LDI1NSwyNTUsMTY1LDUxLDI1NSwyOCw0MCwxNywyNTQsMjE1LDk2LDc4LDAsODYsMTQ1LDIxOCwyNTQsMzEsMzYsMjAyLDI1NSw4Niw5LDUsMCwxMTEsNDEsMjAwLDI1NSwyMzcsMTA4LDk3LDAsNTcsNjIsNDQsMCwxMTcsMTg0LDE1LDEsNDUsMjQxLDExNiwwLDE1MiwxLDIyMCwyNTUsMTU3LDE2NSwxODgsMCwyNTAsMTUsMTMxLDEsNjAsNDQsMTI1LDI1NSw2NSwyMjAsMjUxLDI1NSw3NSw1MCwxODQsMCw1Myw5MCwxMjgsMjU1LDIzMSw4MCwxOTQsMjU1LDEzNiwxMjksMTI3LDEsMjEsMTgsMTg3LDI1NSw0NSw1OCwxNjEsMjU1LDcxLDE0NywzNCwwLDE3NCwyNDksMTEsMjU0LDM1LDE0MSwyOSwwLDIzOSw2OCwxNzcsMjU1LDExNSwxMTAsNTgsMCwyMzgsMTkwLDE3NywxLDg3LDI0NSwxNjYsMjU1LDE5MCw0OSwyNDcsMjU1LDE0Niw4MywxODQsMjU1LDE3MywxNCwzOSwyNTUsMTQ2LDIxNSwxMDQsMCwxNDIsMjIzLDEyMCwwLDE0OSwyMDAsMTU1LDI1NSwyMTIsMjA3LDE0NSwxLDE2LDE4MSwyMTcsMCwxNzMsMzIsODcsMjU1LDI1NSwzNSwxODEsMCwxMTksMjIzLDE2MSwxLDIwMCwyMjMsOTQsMjU1LDcwLDYsMTg2LDI1NSwxOTIsNjcsODUsMjU1LDUwLDE2OSwxNTIsMCwxNDQsMjYsMTIzLDI1NSw1NiwyNDMsMTc5LDI1NCwyMCw2OCwxMzYsMCwzOSwxNDAsMTg4LDI1NCwyNTMsMjA4LDUsMjU1LDIwMCwxMTUsMTM1LDEsNDMsMTcyLDIyOSwyNTUsMTU2LDEwNCwxODcsMCwxNTEsMjUxLDE2NywwLDUyLDEzNSwyMywwLDE1MSwxNTMsNzIsMCwxNDcsMTk3LDEwNywyNTQsMTQ4LDE1OCw1LDI1NSwyMzgsMTQzLDIwNiwwLDEyNiwxNTMsMTM3LDI1NSw4OCwxNTIsMTk3LDI1NCw3LDY4LDE2NywwLDI1MiwxNTksMTY1LDI1NSwyMzksNzgsNTQsMjU1LDI0LDYzLDU1LDI1NSwzOCwyMjIsOTQsMCwyMzcsMTgzLDEyLDI1NSwyMDYsMjA0LDIxMCwwLDE5LDM5LDI0NiwyNTQsMzAsNzQsMjMxLDAsMTM1LDEwOCwyOSwxLDE3OSwxMTUsMCwwLDExNywxMTgsMTE2LDEsMTMyLDYsMjUyLDI1NSwxNDUsMTI5LDE2MSwxLDEwNSw2NywxNDEsMCw4MiwzNywyMjYsMjU1LDIzOCwyMjYsMjI4LDI1NSwyMDQsMjE0LDEyOSwyNTQsMTYyLDEyMywxMDAsMjU1LDE4NSwxMjEsMjM0LDAsNDUsMTA4LDIzMSwwLDY2LDgsNTYsMjU1LDEzMiwxMzYsMTI4LDAsMTcyLDIyNCw2NiwyNTQsMTc1LDE1NywxODgsMCwyMzAsMjIzLDIyNiwyNTQsMjQyLDIxOSw2OSwwLDE4NCwxNCwxMTksMSw4MiwxNjIsNTYsMCwxMTQsMTIzLDIwLDAsMTYyLDEwMyw4NSwyNTUsNDksMjM5LDk5LDI1NCwxNTYsMTM1LDIxNSwwLDExMSwyNTUsMTY3LDI1NCwzOSwxOTYsMjE0LDAsMTQ0LDM4LDc5LDEsMjQ5LDE2OCwxMjUsMCwxNTUsOTcsMTU2LDI1NSwyMyw1MiwyMTksMjU1LDE1MCwyMiwxNDQsMCw0NCwxNDksMTY1LDI1NSw0MCwxMjcsMTgzLDAsMTk2LDc3LDIzMywyNTUsMTE4LDEyOSwyMTAsMjU1LDE3MCwxMzUsMjMwLDI1NSwyMTQsMTE5LDE5OCwwLDIzMywyNDAsMzUsMCwyNTMsNTIsNywyNTUsMTE3LDEwMiw0OCwyNTUsMjEsMjA0LDE1NCwyNTUsMTc5LDEzNiwxNzcsMjU1LDIzLDIsMywxLDE0OSwxMzAsODksMjU1LDI1MiwxNywxNTksMSw3MCw2MCwyNiwwLDE0NCwxMDcsMTcsMCwxODAsMTkwLDYwLDI1NSw1NiwxODIsNTksMjU1LDExMCw3MSw1NCwyNTUsMTk4LDE4LDEyOSwyNTUsMTQ5LDIyNCw4NywyNTUsMjIzLDIxLDE1MiwyNTUsMTM4LDIyLDE4MiwyNTUsMjUwLDE1NiwyMDUsMCwyMzYsNDUsMjA4LDI1NSw3OSwxNDgsMjQyLDEsMTAxLDcwLDIwOSwwLDEwMyw3OCwxNzQsMCwxMDEsMTQ0LDE3MiwyNTUsMTUyLDEzNiwyMzcsMSwxOTEsMTk0LDEzNiwwLDExMyw4MCwxMjUsMSwxNTIsNCwxNDEsMCwxNTUsMTUwLDUzLDI1NSwxOTYsMTE2LDI0NSwwLDIzOSwxMTQsNzMsMjU0LDE5LDgyLDE3LDI1NSwxMjQsMTI1LDIzNCwyNTUsNDAsNTIsMTkxLDAsNDIsMjEwLDE1OCwyNTUsMTU1LDEzMiwxNjUsMCwxNzgsNSw0MiwxLDY0LDkyLDQwLDI1NSwzNiw4NSw3NywyNTUsMTc4LDIyOCwxMTgsMCwxMzcsNjYsOTYsMjU0LDExNSwyMjYsNjYsMCwxMTAsMjQwLDY5LDI1NCwxNTEsMTExLDgwLDAsMTY3LDE3NCwyMzYsMjU1LDIyNywxMDgsMTA3LDI1NSwxODgsMjQyLDY1LDI1NSwxODMsODEsMjU1LDAsNTcsMjA2LDE4MSwyNTUsNDcsMzQsMTgxLDI1NSwyMTMsMjQwLDE1OCwxLDcxLDc1LDk1LDAsMTU2LDQwLDI0LDI1NSwxMDIsMjEwLDgxLDAsMTcxLDE5OSwyMjgsMjU1LDE1NCwzNCw0MSwwLDIyNywxNzUsNzUsMCwyMSwyMzksMTk1LDAsMTM4LDIyOSw5NSwxLDc2LDE5Miw0OSwwLDExNywxMjMsODcsMSwyMjcsMjI1LDEzMCwwLDEyNSw2Miw2MywyNTUsMiwxOTgsMTcxLDAsMjU0LDM2LDEzLDI1NCwxNDUsMTg2LDIwNiwwLDE0OCwyNTUsMjQ0LDI1NSwzNSwwLDE2NiwwLDMwLDE1MCwyMTksMSw5MiwyMjgsMjEyLDAsOTIsMTk4LDYwLDI1NCw2MiwxMzMsMjAwLDI1NSwyMDEsNDEsNTksMCwxMjUsMjM4LDEwOSwyNTUsMTgwLDE2MywyMzgsMSwxNDAsMTIyLDgyLDAsOSwyMiw4OCwyNTUsMTk3LDE1Nyw0NywyNTUsMTUzLDk0LDU3LDAsODgsMzAsMTgyLDAsODQsMTYxLDg1LDAsMTc4LDE0NiwxMjQsMCwxNjYsMTY2LDcsMjU1LDIxLDIwOCwyMjMsMCwxNTYsMTgyLDI0MiwwLDE1NSwxMjEsMTg1LDAsODMsMTU2LDE3NCwyNTQsMTU0LDE2LDExOCwyNTUsMTg2LDgzLDIzMiwxLDIyMyw1OCwxMjEsMjU1LDI5LDIzLDg4LDAsMzUsMTI1LDEyNywyNTUsMTcwLDUsMTQ5LDI1NCwxNjQsMTIsMTMwLDI1NSwxNTUsMTk2LDI5LDAsMTYxLDk2LDEzNiwwLDcsMzUsMjksMSwxNjIsMzcsMjUxLDAsMyw0NiwyNDIsMjU1LDAsMjE3LDE4OCwwLDU3LDE3NCwyMjYsMSwyMDYsMjMzLDIsMCw1NywxODcsMTM2LDI1NCwxMjMsMTg5LDksMjU1LDIwMSwxMTcsMTI3LDI1NSwxODYsMzYsMjA0LDAsMjMxLDI1LDIxNiwwLDgwLDc4LDEwNSwwLDE5LDEzNCwxMjksMjU1LDE0OCwyMDMsNjgsMCwxNDEsODEsMTI1LDI1NCwyNDgsMTY1LDIwMCwyNTUsMjE0LDE0NCwxMzUsMCwxNTEsNTUsMTY2LDI1NSwzOCwyMzUsOTEsMCwyMSw0NiwxNTQsMCwyMjMsMjU0LDE1MCwyNTUsMzUsMTUzLDE4MCwyNTUsMTI1LDE3NiwyOSwxLDQzLDk4LDMwLDI1NSwyMTYsMTIyLDIzMCwyNTUsMjMzLDE2MCwxMiwwLDU3LDE4NSwxMiwyNTQsMjQwLDExMyw3LDI1NSw1LDksMTYsMjU0LDI2LDkxLDEwOCwwLDEwOSwxOTgsMjAzLDAsOCwxNDcsNDAsMCwxMjksMTM0LDIyOCwyNTUsMTI0LDE4Niw0MCwyNTUsMTE0LDk4LDEzMiwyNTQsMTY2LDEzMiwyMywwLDk5LDY5LDQ0LDAsOSwyNDIsMjM4LDI1NSwxODQsNTMsNTksMCwxMzIsMTI5LDEwMiwyNTUsNTIsMzIsMjQzLDI1NCwxNDcsMjIzLDIwMCwyNTUsMTIzLDgzLDE3OSwyNTQsMTM1LDE0NCwyMDEsMjU1LDE0MSwzNyw1NiwxLDE1MSw2MCwyMjcsMjU1LDkwLDczLDE1NiwxLDIwMywxNzIsMTg3LDAsODAsMTUxLDQ3LDI1NSw5NCwxMzcsMjMxLDI1NSwzNiwxOTEsNTksMjU1LDIyNSwyMDksMTgxLDI1NSw3NCwyMTUsMjEzLDI1NCw2LDExOCwxNzksMjU1LDE1Myw1NCwxOTMsMSw1MCwwLDIzMSwwLDEwNCwxNTcsNzIsMSwxNDAsMjI3LDE1NCwyNTUsMTgyLDIyNiwxNiwyNTQsOTYsMjI1LDkyLDI1NSwxMTUsMjAsMTcwLDI1NCw2LDI1MCw3OCwwLDI0OCw3NSwxNzMsMjU1LDUzLDg5LDYsMjU1LDAsMTgwLDExOCwwLDcyLDE3MywxLDAsNjQsOCwyMDYsMSwxNzQsMTMzLDIyMywwLDE4NSw2MiwxMzMsMjU1LDIxNCwxMSw5OCwwLDE5NywzMSwyMDgsMCwxNzEsMTY3LDI0NCwyNTUsMjIsMjMxLDE4MSwxLDE1MCwyMTgsMTg1LDAsMjQ3LDE2OSw5NywxLDE2NSwxMzksMjQ3LDI1NSw0NywxMjAsMTQ5LDEsMTAzLDI0OCw1MSwwLDYwLDY5LDI4LDI1NCwyNSwxNzksMTk2LDAsMTI0LDcsMjE4LDI1NCw1OCwxMDcsODEsMCwxODQsMjMzLDE1NiwyNTUsMjUyLDc0LDM2LDAsMTE4LDE4OCw2NywwLDE0MSw5NSw1MywyNTUsMjIyLDk0LDE2NSwyNTQsNDYsNjEsNTMsMCwyMDYsNTksMTE1LDI1NSw0NywyMzYsMjUwLDI1NSw3NCw1LDMyLDEsMTI5LDE1NCwyMzgsMjU1LDEwNiwzMiwyMjYsMCwxMjEsMTg3LDYxLDI1NSwzLDE2NiwyNDEsMjU0LDY3LDE3MCwxNzIsMjU1LDI5LDIxNiwxNzgsMjU1LDIzLDIwMSwyNTIsMCwyNTMsMTEwLDI0MywwLDIwMCwxMjUsNTcsMCwxMDksMTkyLDk2LDI1NSw1MiwxMTUsMjM4LDAsMzgsMTIxLDI0MywyNTUsMjAxLDU2LDMzLDAsMTk0LDExOCwxMzAsMCw3NSw5NiwyNSwyNTUsMTcwLDMwLDIzMCwyNTQsMzksNjMsMjUzLDAsMzYsNDUsMjUwLDI1NSwyNTEsMSwyMzksMCwxNjAsMjEyLDkyLDEsNDUsMjA5LDIzNywwLDI0MywzMyw4NywyNTQsMjM3LDg0LDIwMSwyNTUsMjEyLDE4LDE1NywyNTQsMjEyLDk5LDEyNywyNTUsMjE3LDk4LDE2LDI1NCwxMzksMTcyLDIzOSwwLDE2OCwyMDEsMTMwLDI1NSwxNDMsMTkzLDE2OSwyNTUsMjM4LDE1MSwxOTMsMSwyMTUsMTA0LDQxLDAsMjM5LDYxLDE2NSwyNTQsMiwzLDI0MiwwLDIyLDIwMywxNzcsMjU0LDE3NywyMDQsMjIsMCwxNDksMTI5LDIxMywyNTQsMzEsMTEsNDEsMjU1LDAsMTU5LDEyMSwyNTQsMTYwLDI1LDExNCwyNTUsMTYyLDgwLDIwMCwwLDE1NywxNTEsMTEsMCwxNTQsMTM0LDc4LDEsMjE2LDU0LDI1MiwwLDQ4LDEwMywxMzMsMCwxMDUsMjIwLDE5NywwLDI1MywxNjgsNzcsMjU0LDUzLDE3OSwyMywwLDI0LDEyMSwyNDAsMSwyNTUsNDYsOTYsMjU1LDEwNyw2MCwxMzUsMjU0LDk4LDIwNSwyNDksMjU1LDYzLDI0OSwxMTksMjU1LDEyMCw1OSwyMTEsMjU1LDExNCwxODAsNTUsMjU0LDkxLDg1LDIzNywwLDE0OSwyMTIsNzcsMSw1Niw3Myw0OSwwLDg2LDE5OCwxNTAsMCw5MywyMDksMTYwLDAsNjksMjA1LDE4MiwyNTUsMjQ0LDkwLDQzLDAsMjAsMzYsMTc2LDAsMTIyLDExNiwyMjEsMCw1MSwxNjcsMzksMSwyMzEsMSw2MywyNTUsMTMsMTk3LDEzNCwwLDMsMjA5LDM0LDI1NSwxMzUsNTksMjAyLDAsMTY3LDEwMCw3OCwwLDQ3LDIyMyw3NiwwLDE4NSw2MCw2MiwwLDE3OCwxNjYsMTIzLDEsMTMyLDEyLDE2MSwyNTUsNjEsMTc0LDQzLDAsMTk1LDY5LDE0NCwwLDEyNyw0NywxOTEsMSwzNCw0NCw3OCwwLDU3LDIzNCw1MiwxLDI1NSwyMiw0MCwyNTUsMjQ2LDk0LDE0NiwwLDgzLDIyOCwxMjgsMCw2MCw3OCwyMjQsMjU1LDAsOTYsMjEwLDI1NSwxNTMsMTc1LDIzNiwwLDE1OSwyMSw3MywwLDE4MCwxMTUsMTk2LDI1NCwxMzEsMjI1LDEwNiwwLDI1NSwxNjcsMTM0LDAsMTU5LDgsMTEyLDI1NSwxMjAsNjgsMTk0LDI1NSwxNzYsMTk2LDE5OCwyNTUsMTE4LDQ4LDE2OCwyNTUsOTMsMTY5LDEsMCwxMTIsMjAwLDEwMiwxLDc0LDI0LDI1NCwwLDE5LDE0MSw0LDI1NCwxNDIsNjIsNjMsMCwxMzEsMTc5LDE4NywyNTUsNzcsMTU2LDE1NSwyNTUsMTE5LDg2LDE2NCwwLDE3MCwyMDgsMTQ2LDI1NSwyMDgsMTMzLDE1NCwyNTUsMTQ4LDE1NSw1OCwyNTUsMTYyLDEyMCwyMzIsMjU0LDI1MiwyMTMsMTU1LDAsMjQxLDEzLDQyLDAsOTQsNTAsMTMxLDAsMTc5LDE3MCwxMTIsMCwxNDAsODMsMTUxLDI1NSw1NSwxMTksODQsMSwxNDAsMzUsMjM5LDI1NSwxNTMsNDUsNjcsMSwyMzYsMTc1LDM5LDAsNTQsMTUxLDEwMywyNTUsMTU4LDQyLDY1LDI1NSwxOTYsMjM5LDEzNSwyNTQsODYsNTMsMjAzLDAsMTQ5LDk3LDQ3LDI1NCwyMTYsMzUsMTcsMjU1LDcwLDMsNzAsMSwxMDMsMzYsOTAsMjU1LDQwLDI2LDE3MywwLDE4NCw0OCwxMywwLDE2MywyMTksMjE3LDI1NSw4MSw2LDEsMjU1LDIyMSwxNzAsMTA4LDI1NCwyMzMsMjA4LDkzLDAsMTAwLDIwMSwyNDksMjU0LDg2LDM2LDM1LDI1NSwyMDksMTU0LDMwLDEsMjI3LDIwMSwyNTEsMjU1LDIsMTg5LDE2NywyNTQsMTAwLDU3LDMsMCwxMywxMjgsNDEsMCwxOTcsMTAwLDc1LDAsMTUwLDIwNCwyMzUsMjU1LDE0NSwxNzQsNTksMCwxMjAsMjQ4LDE0OSwyNTUsODUsNTUsMjI1LDAsMTE0LDIxMCw1MywyNTQsMTk5LDIwNCwxMTksMCwxNCwyNDcsNzQsMSw2MywyNTEsMTI5LDAsNjcsMTA0LDE1MSwxLDEzNSwxMzAsODAsMCw3OSw4OSw1NSwyNTUsMTE3LDIzMCwxNTcsMjU1LDI1LDk2LDE0MywwLDIxMywxNDUsNSwwLDY5LDI0MSwxMjAsMSwxNDksMjQzLDk1LDI1NSwxMTQsNDIsMjAsMCwxMzEsNzIsMiwwLDE1NCw1MywyMCwyNTUsNzMsNjIsMTA5LDAsMTk2LDEwMiwxNTIsMCw0MSwxMiwyMDQsMjU1LDEyMiwzOCwxMSwxLDI1MCwxMCwxNDUsMCwyMDcsMTI1LDE0OCwwLDI0NiwyNDQsMjIyLDI1NSw0MSwzMiw4NSwxLDExMiwyMTMsMTI2LDAsMTYyLDI0OSw4NiwxLDcxLDE5OCwxMjcsMjU1LDgxLDksMjEsMSw5OCwzOSw0LDI1NSwyMDQsNzEsNDUsMSw3NSwxMTEsMTM3LDAsMjM0LDU5LDIzMSwwLDMyLDQ4LDk1LDI1NSwyMDQsMzEsMTE0LDEsMjksMTk2LDE4MSwyNTUsNTEsMjQxLDE2NywyNTQsOTMsMTA5LDE0MiwwLDEwNCwxNDQsNDUsMCwyMzUsMTIsMTgxLDI1NSw1MiwxMTIsMTY0LDAsNzYsMjU0LDIwMiwyNTUsMTc0LDE0LDE2MiwwLDYxLDIzNSwxNDcsMjU1LDQzLDY0LDE4NSwyNTQsMjMzLDEyNSwyMTcsMCwyNDMsODgsMTY3LDI1NCw3NCw0OSw4LDAsMTU2LDIwNCw2NiwwLDEyNCwyMTQsMTIzLDAsMzgsMjIxLDExOCwxLDE0NiwxMTIsMjM2LDAsMTE0LDk4LDE3NywwLDE1MSw4OSwxOTksMCw4NywxOTcsMTEyLDAsMTg1LDE0OSwxNjEsMCw0NCw5NiwxNjUsMCwyNDgsMTc5LDIwLDI1NSwxODgsMjE5LDIxNiwyNTQsNDAsNjIsMTMsMCwyNDMsMTQyLDE0MSwwLDIyOSwyMjcsMjA2LDI1NSwxNzIsMjAyLDM1LDI1NSwxMTcsMTc2LDIyNSwyNTUsODIsMTEwLDM4LDEsNDIsMjQ1LDE0LDI1NSwyMCw4Myw5NywwLDQ5LDE3MSwxMCwwLDI0MiwxMTksMTIwLDAsMjUsMjMyLDYxLDAsMjEyLDI0MCwxNDcsMjU1LDQsMTE1LDU2LDI1NSwxNDUsMTcsMjM5LDI1NCwyMDIsMTcsMjUxLDI1NSwyNDksMTgsMjQ1LDI1NSw5OSwxMTcsMjM5LDAsMTg0LDQsMTc5LDI1NSwyNDYsMjM3LDUxLDI1NSwzNywyMzksMTM3LDI1NSwxNjYsMTEyLDE2NiwyNTUsODEsMTg4LDMzLDI1NSwxODUsMjUwLDE0MiwyNTUsNTQsMTg3LDE3MywwLDIwOCwxMTIsMjAxLDAsMjQ2LDQzLDIyOCwxLDEwNCwxODQsODgsMjU1LDIxMiw1MiwxOTYsMjU1LDUxLDExNywxMDgsMjU1LDI1NCwxMTcsMTU1LDAsNDYsOTEsMTUsMjU1LDg3LDE0LDE0NCwyNTUsODcsMjI3LDIwNCwwLDgzLDI2LDgzLDEsMTU5LDc2LDIyNywwLDE1OSwyNywyMTMsMSwyNCwxNTEsMTA4LDAsMTE3LDE0NCwxNzksMjU0LDEzNywyMDksODIsMCwzOCwxNTksMTAsMCwxMTUsMTMzLDIwMSwwLDIyMywxODIsMTU2LDEsMTEwLDE5Niw5MywyNTUsNTcsNjAsMjMzLDAsNSwxNjcsMTA1LDI1NSwxNTQsMTk3LDE2NCwwLDk2LDM0LDE4NiwyNTUsMTQ3LDEzMywzNywxLDIyMCw5OSwxOTAsMCwxLDE2Nyw4NCwyNTUsMjAsMTQ1LDE3MSwwLDE5NCwxOTcsMjUxLDI1NCw5NSw3OCwxMzMsMjU1LDI1MiwyNDgsMjQzLDI1NSwyMjUsOTMsMTMxLDI1NSwxODcsMTM0LDE5NiwyNTUsMjE2LDE1MywxNzAsMCwyMCwxMTgsMTU4LDI1NCwxNDAsMSwxMTgsMCw4NiwxNTgsMTUsMSw0NSwyMTEsNDEsMjU1LDE0NywxLDEwMCwyNTQsMTEzLDExNiw3NiwyNTUsMjExLDEyNywxMDgsMSwxMDMsMTUsNDgsMCwxOTMsMTYsMTAyLDEsNjksNTEsOTUsMjU1LDEwNywxMjgsMTU3LDAsMTM3LDE3MSwyMzMsMCw5MCwxMjQsMTQ0LDEsMTA2LDE2MSwxODIsMCwxNzUsNzYsMjM2LDEsMjAwLDE0MSwxNzIsMjU1LDE2Myw1OCwxMDQsMCwyMzMsMTgwLDUyLDI1NSwyNDAsMjUzLDE0LDI1NSwxNjIsMTEzLDI1NCwyNTUsMzgsMjM5LDEzOCwyNTQsNTIsNDYsMTY2LDAsMjQxLDEwMSwzMywyNTQsMTMxLDE4NiwxNTYsMCwxMTEsMjA4LDYyLDI1NSwxMjQsOTQsMTYwLDI1NSwzMSwxNzIsMjU0LDAsMTEyLDE3NCw1NiwyNTUsMTg4LDk5LDI3LDI1NSw2NywxMzgsMjUxLDAsMTI1LDU4LDEyOCwxLDE1NiwxNTIsMTc0LDI1NSwxNzgsMTIsMjQ3LDI1NSwyNTIsODQsMTU4LDAsODIsMTk3LDE0LDI1NCwxNzIsMjAwLDgzLDI1NSwzNywzOSw0NiwxLDEwNiwyMDcsMTY3LDAsMjQsMTg5LDM0LDAsMTMxLDE3OCwxNDQsMCwyMDYsMjEzLDQsMCwxNjEsMjI2LDIxMCwwLDcyLDUxLDEwNSwyNTUsOTcsNDUsMTg3LDI1NSw3OCwxODQsMjIzLDI1NSwxNzYsMjksMjUxLDAsNzksMTYwLDg2LDI1NSwxMTYsMzcsMTc4LDAsODIsNzcsMjEzLDEsODIsODQsMTQxLDI1NSwyMjYsMTAxLDIxMiwxLDE3NSw4OCwxOTksMjU1LDI0NSw5NCwyNDcsMSwxNzIsMTE4LDEwOSwyNTUsMTY2LDE4NSwxOTAsMCwxMzEsMTgxLDEyMCwwLDg3LDI1NCw5MywyNTUsMTM0LDI0MCw3MywyNTUsMzIsMjQ1LDE0MywyNTUsMTM5LDE2MiwxMDMsMjU1LDE3OSw5OCwxOCwyNTQsMjE3LDIwNCwxMTIsMCwxNDcsMjIzLDEyMCwyNTUsNTMsMTAsMjQzLDAsMTY2LDE0MCwxNTAsMCwxMjUsODAsMjAwLDI1NSwxNCwxMDksMjE5LDI1NSw5MSwyMTgsMSwyNTUsMjUyLDI1Miw0NywyNTQsMTA5LDE1NiwxMTYsMjU1LDExNSw0OSwxMjcsMSwyMDQsODcsMjExLDI1NSwxNDgsMjAyLDIxNywyNTUsMjYsODUsMjQ5LDI1NSwxNCwyNDUsMTM0LDEsNzYsODksMTY5LDI1NSwyNDIsNDUsMjMwLDAsNTksOTgsMTcyLDI1NSwxMTQsNzMsMTMyLDI1NCw3OCwxNTUsNDksMjU1LDE1OCwxMjYsODQsMCw0OSwxNzUsNDMsMjU1LDE2LDE4Miw4NCwyNTUsMTU3LDEwMywzNSwwLDEwNCwxOTMsMTA5LDI1NSw2NywyMjEsMTU0LDAsMjAxLDE3MiwxLDI1NCw4LDE2Miw4OCwwLDE2NSwxLDI5LDI1NSwxMjUsMTU1LDIyOSwyNTUsMzAsMTU0LDIyMCwxLDEwMywyMzksOTIsMCwyMjAsMSwxMDksMjU1LDIwMiwxOTgsMSwwLDk0LDIsMTQyLDEsMzYsNTQsNDQsMCwyMzUsMjI2LDE1OCwyNTUsMTcwLDI1MSwyMTQsMjU1LDE4NSw3Nyw5LDAsOTcsNzQsMjQyLDAsMjE5LDE2MywxNDksMjU1LDI0MCwzNSwxMTgsMjU1LDIyMywxMTQsODgsMjU0LDE5MiwxOTksMywwLDEwNiwzNywyNCwyNTUsMjAxLDE2MSwxMTgsMjU1LDk3LDg5LDk5LDEsMjI0LDU4LDEwMywyNTUsMTAxLDE5OSwxNDcsMjU0LDIyMiw2MCw5OSwwLDIzNCwyNSw1OSwxLDUyLDEzNSwyNywwLDEwMiwzLDkxLDI1NCwxNjgsMjE2LDIzNSwwLDIyOSwyMzIsMTM2LDAsMTA0LDYwLDEyOSwwLDQ2LDE2OCwyMzgsMCwzOSwxOTEsNjcsMCw3NSwxNjMsNDcsMCwxNDMsOTcsOTgsMjU1LDU2LDIxNiwxNjgsMSwxNjgsMjMzLDI1MiwyNTUsMzUsMTExLDIyLDI1NSw5Miw4NCw0MywwLDI2LDIwMCw4NywxLDkxLDI1MywxNTIsMCwyMDIsNTYsNzAsMCwxNDIsOCw3NywwLDgwLDEwLDE3NSwxLDI1MiwxOTksNzYsMCwyMiwxMTAsODIsMjU1LDEyOSwxLDE5NCwwLDExLDEyOCw2MSwxLDg3LDE0LDE0NSwyNTUsMjUzLDIyMiwxOTAsMSwxNSw3MiwxNzQsMCw4NSwxNjMsODYsMjU0LDU4LDk5LDQ0LDI1NSw0NSwyNCwxODgsMjU0LDI2LDIwNSwxNSwwLDE5LDIyOSwyMTAsMjU0LDI0OCw2NywxOTUsMCw5OSw3MSwxODQsMCwxNTQsMTk5LDM3LDI1NSwxNTEsMjQzLDEyMSwyNTUsMzgsNTEsNzUsMjU1LDIwMSw4NSwxMzAsMjU0LDQ0LDY1LDI1MCwwLDU3LDE0NywyNDMsMjU0LDE0Niw0Myw1OSwyNTUsODksMjgsNTMsMCwzMyw4NCwyNCwyNTUsMTc5LDUxLDE4LDI1NCwxODksNzAsODMsMCwxMSwxNTYsMTc5LDEsOTgsMTM0LDExOSwwLDE1OCwxMTEsMTExLDAsMTE5LDE1NCw3MywyNTUsMjAwLDYzLDE0MCwyNTQsNDUsMTMsMTMsMjU1LDE1NCwxOTIsMiwyNTQsODEsNzIsNDIsMCw0NiwxNjAsMTg1LDI1NCw0NCwxMTIsNiwwLDE0NiwyMTUsMTQ5LDEsMjYsMTc2LDEwNCwwLDY4LDI4LDg3LDEsMjM2LDUwLDE1MywyNTUsMTc5LDEyOCwyNTAsMjU0LDIwNiwxOTMsMTkxLDI1NSwxNjYsOTIsMTM3LDI1NCw1Myw0MCwyMzksMCwyMTAsMSwyMDQsMjU0LDE2OCwxNzMsMzUsMCwxNDEsMjQzLDQ1LDEsMzYsNTAsMTA5LDI1NSwxNSwyNDIsMTk0LDI1NSwyMjcsMTU5LDEyMiwyNTUsMTc2LDE3NSwyMDIsMjU0LDcwLDU3LDcyLDAsNDAsMjIzLDU2LDAsMjA4LDE2Miw1OCwyNTUsMTgzLDk4LDkzLDAsMTUsMTExLDEyLDAsMzAsOCw3NiwyNTUsMTMyLDEyNywyNDYsMjU1LDQ1LDI0MiwxMDMsMCw2OSwxODEsMTUsMjU1LDEwLDIwOSwzMCwwLDMsMTc5LDEyMSwwLDI0MSwyMzIsMjE4LDEsMTIzLDE5OSw4OCwyNTUsMiwyMTAsMjAyLDEsMTg4LDEzMCw4MSwyNTUsOTQsMTAxLDIwOCwxLDEwMywzNiw0NSwwLDc2LDE5MywyNCwxLDk1LDI2LDI0MSwyNTUsMTY1LDE2MiwxODcsMCwzNiwxMTQsMTQwLDAsMjAyLDY2LDUsMjU1LDM3LDU2LDE0NywwLDE1MiwxMSwyNDMsMSwxMjcsODUsMjMyLDI1NSwyNTAsMTM1LDIxMiwxLDE4NSwxNzcsMTEzLDAsOTAsMjIwLDc1LDI1NSw2OSwyNDgsMTQ2LDAsNTAsMTExLDUwLDAsOTIsMjIsODAsMCwyNDQsMzYsMTE1LDI1NCwxNjMsMTAwLDgyLDI1NSwyNSwxOTMsNiwxLDEyNyw2MSwzNiwwLDI1Myw2NywzMCwyNTQsNjUsMjM2LDE3MCwyNTUsMTYxLDE3LDIxNSwyNTQsNjMsMTc1LDE0MCwwLDU1LDEyNyw0LDAsNzksMTEyLDIzMywwLDEwOSwxNjAsNDAsMCwxNDMsODMsNywyNTUsNjUsMjYsMjM4LDI1NSwyMTcsMTY5LDE0MCwyNTUsNzgsOTQsMTg5LDI1NSwwLDE0NywxOTAsMjU1LDE0Nyw3MSwxODYsMjU0LDEwNiw3NywxMjcsMjU1LDIzMywxNTcsMjMzLDEsMTM1LDg3LDIzNywyNTUsMjA4LDEzLDIzNiwxLDE1NSwxMDksMzYsMjU1LDE4MCwxMDAsMjE4LDAsMTgwLDE2MywxOCwwLDE5MCwxMTAsOSwxLDE3LDYzLDEyMywyNTUsMTc5LDEzNiwxODAsMjU1LDE2NSwxMjMsMTIzLDI1NSwxNDQsMTg4LDgxLDI1NCw3MSwyNDAsMTA4LDI1NSwyNSwxMTIsMTEsMjU1LDIyNywyMTgsNTEsMjU1LDE2Nyw1MCwyMzQsMjU1LDExNCw3OSwxMDgsMjU1LDMxLDE5LDExNSwyNTUsMTgzLDI0MCw5OSwwLDIyNyw4NywxNDMsMjU1LDcyLDIxNywyNDgsMjU1LDEwMiwxNjksOTUsMSwxMjksMTQ5LDE0OSwwLDIzOCwxMzMsMTIsMSwyMjcsMjA0LDM1LDAsMjA4LDExNSwyNiwxLDEwMiw4LDIzNCwwLDExMiw4OCwxNDMsMSwxNDQsMjQ5LDE0LDAsMjQwLDE1OCwxNzIsMjU0LDEwMCwxMTIsMTE5LDAsMTk0LDE0MSwxNTMsMjU0LDQwLDU2LDgzLDI1NSwxMjEsMTc2LDQ2LDAsNDIsNTMsNzYsMjU1LDE1OCwxOTEsMTU0LDAsOTEsMjA5LDkyLDAsMTczLDEzLDE2LDEsNSw3MiwyMjYsMjU1LDIwNCwyNTQsMTQ5LDAsODAsMTg0LDIwNywwLDEwMCw5LDEyMiwyNTQsMTE4LDEwMSwxNzEsMjU1LDI1MiwyMDMsMCwyNTQsMTYwLDIwNyw1NCwwLDU2LDcyLDI0OSwxLDU2LDE0MCwxMywyNTUsMTAsNjQsMTA3LDI1NCw5MSwxMDEsNTIsMjU1LDIyNSwxODEsMjQ4LDEsMTM5LDI1NSwxMzIsMCwyMzAsMTQ1LDE3LDAsMjMzLDU2LDIzLDAsMTE5LDEsMjQxLDI1NSwyMTMsMTY5LDE1MSwyNTUsOTksOTksOSwyNTQsMTg1LDE1LDE5MSwyNTUsMTczLDEwMywxMDksMSwxNzQsMTMsMjUxLDI1NSwxNzgsODgsNywyNTQsMjcsNTksNjgsMjU1LDEwLDMzLDIsMjU1LDI0OCw5Nyw1OSwwLDI2LDMwLDE0NiwxLDE3NiwxNDcsMTAsMCw5NSwxMjEsMjA3LDEsMTg4LDg4LDI0LDAsMTg1LDk0LDI1NCwyNTQsMTE1LDU1LDIwMSwwLDI0LDUwLDcwLDAsMTIwLDUzLDYsMCwxNDIsNjYsMTQ2LDAsMjI4LDIyNiwyNDksMjU1LDEwNCwxOTIsMjIyLDEsMTczLDY4LDIxOSwwLDE2MiwxODQsMzYsMjU1LDE0MywxMDIsMTM3LDI1NSwxNTcsMTEsMjMsMCwxMjUsNDUsOTgsMCwyMzUsOTMsMjI1LDI1NCw1NiwxMTIsMTYwLDI1NSw3MCwxMTYsMjQzLDEsMTUzLDI0OSw1NSwyNTUsMTI5LDM5LDE3LDEsMjQxLDgwLDI0NCwwLDg3LDY5LDIxLDEsOTQsMjI4LDczLDI1NSw3OCw2Niw2NSwyNTUsMTk0LDIyNywyMzEsMCw2MSwxNDYsODcsMjU1LDE3MywxNTUsMjMsMjU1LDExMiwxMTYsMjE5LDI1NCwyMTYsMzgsMTEsMjU1LDEzMSwxODYsMTMzLDAsOTQsMjEyLDE4NywwLDEwMCw0Nyw5MSwwLDIwNCwyNTQsMTc1LDI1NSwyMjIsMTgsMjE1LDI1NCwxNzMsNjgsMTA4LDI1NSwyMjcsMjI4LDc5LDI1NSwzOCwyMjEsMjEzLDAsMTYzLDIyNywxNTAsMjU0LDMxLDE5MCwxOCwwLDE2MCwxNzksMTEsMSwxMCw5MCw5NCwyNTUsMjIwLDE3NCw4OCwwLDE2MywyMTEsMjI5LDI1NSwxOTksMTM2LDUyLDAsMTMwLDk1LDIyMSwyNTUsMTQwLDE4OCwyMzEsMjU0LDEzOSwxMTMsMTI4LDI1NSwxMTcsMTcxLDIzNiwyNTQsNDksMjIwLDIwLDI1NSw1OSwyMCwxNzEsMjU1LDIyOCwxMDksMTg4LDAsMjAsMjI1LDMyLDI1NCwxOTUsMTYsMTc0LDAsMjI3LDI1NCwxMzYsMSwxMzUsMzksMTA1LDAsMTUwLDc3LDIwNiwyNTUsMjEwLDIzOCwyMjZdLFwiaThcIixBTExPQ19OT05FLFJ1bnRpbWUuR0xPQkFMX0JBU0UrMTAyNDApO2FsbG9jYXRlKFs1NSwyMTIsMTMyLDI1NCwyMzksNTcsMTI0LDAsMTcwLDE5NCw5MywyNTUsMjQ5LDE2LDI0NywyNTUsMjQsMTUxLDYyLDI1NSwxMCwxNTEsMTAsMCw3OSwxMzksMTc4LDI1NSwxMjAsMjQyLDIwMiwwLDI2LDIxOSwyMTMsMCw2MiwxMjUsMzUsMjU1LDE0NCwyLDEwOCwyNTUsMjMwLDMzLDgzLDI1NSw4MSw0NSwyMTYsMSwyMjQsNjIsMTcsMCwyMTQsMjE3LDEyNSwwLDk4LDE1MywxNTMsMjU1LDE3OSwxNzYsMTA2LDI1NCwxMzEsOTMsMTM4LDI1NSwxMDksNjIsMzYsMjU1LDE3OCwxMjEsMzIsMjU1LDEyMCwyNTIsNzAsMCwyMjAsMjQ4LDM3LDAsMjA0LDg4LDEwMywxLDEyOCwyMjAsMjUxLDI1NSwyMzYsMjI3LDcsMSwxMDYsNDksMTk4LDI1NSw2MCw1NiwxMDcsMCw5OSwxMTQsMjM4LDAsMjIwLDIwNCw5NCwxLDczLDE4NywxLDAsODksMTU0LDM0LDAsNzgsMjE3LDE2NSwyNTUsMTQsMTk1LDI0OSwyNTUsOSwyMzAsMjUzLDI1NSwyMDUsMTM1LDI0NSwwLDI2LDI1Miw3LDI1NSw4NCwyMDUsMjcsMSwxMzQsMiwxMTIsMCwzNywxNTgsMzIsMCwyMzEsOTEsMjM3LDI1NSwxOTEsMTcwLDIwNCwyNTUsMTUyLDcsMjIyLDAsMTA5LDE5Miw0OSwwLDE5MywxNjYsMTQ2LDI1NSwyMzIsMTksMTgxLDI1NSwxMDUsMTQyLDUyLDI1NSwxMDMsMTYsMjcsMSwyNTMsMjAwLDE2NSwwLDE5NSwyMTcsNCwyNTUsNTIsMTg5LDE0NCwyNTUsMTIzLDE1NSwxNjAsMjU0LDg3LDEzMCw1NCwyNTUsNzgsMTIwLDYxLDI1NSwxNCw1Niw0MSwwLDI1LDQxLDEyNSwyNTUsODcsMTY4LDI0NSwwLDIxNCwxNjUsNzAsMCwyMTIsMTY5LDYsMjU1LDIxOSwyMTEsMTk0LDI1NCw3Miw5MywxNjQsMjU1LDE5NywzMywxMDMsMjU1LDQzLDE0MiwxNDEsMCwxMzEsMjI1LDE3MiwwLDI0NCwxMDUsMjgsMCw2OCw2OCwyMjUsMCwxMzYsODQsMTMsMjU1LDEzMCw1Nyw0MCwyNTQsMTM5LDc3LDU2LDAsODQsMTUwLDUzLDAsNTQsOTUsMTU3LDAsMTQ0LDEzLDE3NywyNTQsOTUsMTE1LDE4NiwwLDExNywyMywxMTgsMjU1LDI0NCwxNjYsMjQxLDI1NSwxMSwxODYsMTM1LDAsMTc4LDEwNiwyMDMsMjU1LDk3LDIxOCw5MywwLDQzLDI1Myw0NSwwLDE2NCwxNTIsNCwwLDEzOSwxMTgsMjM5LDAsOTYsMSwyNCwyNTQsMjM1LDE1MywyMTEsMjU1LDE2OCwxMTAsMjAsMjU1LDUwLDIzOSwxNzYsMCwxMTQsNDEsMjMyLDAsMTkzLDI1MCw1MywwLDI1NCwxNjAsMTExLDI1NCwxMzYsMTIyLDQxLDI1NSw5NywxMDgsNjcsMCwyMTUsMTUyLDIzLDI1NSwxNDAsMjA5LDIxMiwwLDQyLDE4OSwxNjMsMCwyMDIsNDIsNTAsMjU1LDEwNiwxMDYsMTg5LDI1NSwxOTAsNjgsMjE3LDI1NSwyMzMsNTgsMTE3LDAsMjI5LDIyMCwyNDMsMSwxOTcsMyw0LDAsMzcsMTIwLDU0LDI1NCw0LDE1NiwxMzQsMjU1LDM2LDYxLDE3MSwyNTQsMTY1LDEzNiwxMDAsMjU1LDIxMiwyMzIsMTQsMCw5MCwxNzQsMTAsMCwyMTYsMTk4LDY1LDI1NSwxMiwzLDY0LDAsMTE2LDExMywxMTUsMjU1LDI0OCwxMDMsOCwwLDIzMSwxMjUsMTgsMjU1LDE2MCwyOCwxOTcsMCwzMCwxODQsMzUsMSwyMjMsNzMsMjQ5LDI1NSwxMjMsMjAsNDYsMjU0LDEzNSw1NiwzNywyNTUsMTczLDEzLDIyOSwxLDExOSwxNjEsMzQsMjU1LDI0NSw2MSw3MywwLDIwNSwxMjUsMTEyLDAsMTM3LDEwNCwxMzQsMCwyMTcsMjQ2LDMwLDI1NSwyMzcsMTQyLDE0MywwLDY1LDE1OSwxMDIsMjU1LDEwOCwxNjQsMTkwLDAsMjE5LDExNywxNzMsMjU1LDM0LDM3LDEyMCwyNTQsMjAwLDY5LDgwLDAsMzEsMTI0LDIxOCwyNTQsNzQsMjcsMTYwLDI1NSwxODYsMTU0LDE5OSwyNTUsNzEsMTk5LDI1MiwwLDEwNCw4MSwxNTksMSwxNywyMDAsMzksMCwyMTEsNjEsMTkyLDEsMjYsMjM4LDkxLDAsMTQ4LDIxNywxMiwwLDU5LDkxLDIxMywyNTUsMTEsODEsMTgzLDI1NSwxMjksMjMwLDEyMiwyNTUsMTE0LDIwMywxNDUsMSwxMTksMTgwLDY2LDI1NSw3MiwxMzgsMTgwLDAsMjI0LDE0OSwxMDYsMCwxMTksODIsMTA0LDI1NSwyMDgsMTQwLDQzLDAsOTgsOSwxODIsMjU1LDIwNSwxMDEsMTM0LDI1NSwxOCwxMDEsMzgsMCw5NSwxOTcsMTY2LDI1NSwyMDMsMjQxLDE0NywwLDYyLDIwOCwxNDUsMjU1LDEzMywyNDYsMjUxLDAsMiwxNjksMTQsMCwxMywyNDcsMTg0LDAsMTQyLDcsMjU0LDAsMzYsMjAwLDIzLDI1NSw4OCwyMDUsMjIzLDAsOTEsMTI5LDUyLDI1NSwyMSwxODYsMzAsMCwxNDMsMjI4LDIxMCwxLDI0NywyMzQsMjQ4LDI1NSwyMzAsNjksMzEsMjU0LDE3NiwxODYsMTM1LDI1NSwyMzgsMjA1LDUyLDEsMTM5LDc5LDQzLDAsMTcsMTc2LDIxNywyNTQsMzIsMjQzLDY3LDAsMjQyLDExMSwyMzMsMCw0NCwzNSw5LDI1NSwyMjcsMTE0LDgxLDEsNCw3MSwxMiwyNTUsMzgsMTA1LDE5MSwwLDcsMTE3LDUwLDI1NSw4MSw3OSwxNiwwLDYzLDY4LDY1LDI1NSwxNTcsMzYsMTEwLDI1NSw3NywyNDEsMywyNTUsMjI2LDQ1LDI1MSwxLDE0MiwyNSwyMDYsMCwxMjAsMTIzLDIwOSwxLDI4LDI1NCwyMzgsMjU1LDUsMTI4LDEyNiwyNTUsOTEsMjIyLDIxNSwyNTUsMTYyLDE1LDE5MSwwLDg2LDI0MCw3MywwLDEzNSwxODUsODEsMjU0LDQ0LDI0MSwxNjMsMCwyMTIsMjE5LDIxMCwyNTUsMTEyLDE2MiwxNTUsMCwyMDcsMTAxLDExOCwwLDE2OCw3Miw1NiwyNTUsMTk2LDUsNTIsMCw3MiwxNzIsMjQyLDI1NSwxMjYsMjIsMTU3LDI1NSwxNDYsOTYsNTksMjU1LDE2MiwxMjEsMTUyLDI1NCwxNDAsMTYsOTUsMCwxOTUsMjU0LDIwMCwyNTQsODIsMTUwLDE2MiwwLDExOSw0MywxNDUsMjU0LDIwNCwxNzIsNzgsMjU1LDE2NiwyMjQsMTU5LDAsMTA0LDE5LDIzNywyNTUsMjQ1LDEyNiwyMDgsMjU1LDIyNiw1OSwyMTMsMCwxMTcsMjE3LDE5NywwLDE1Miw3MiwyMzcsMCwyMjAsMzEsMjMsMjU0LDE0LDkwLDIzMSwyNTUsMTg4LDIxMiw2NCwxLDYwLDEwMSwyNDYsMjU1LDg1LDI0LDg2LDAsMSwxNzcsMTA5LDAsMTQ2LDgzLDMyLDEsNzUsMTgyLDE5MiwwLDExOSwyNDEsMjI0LDAsMTg1LDIzNywyNywyNTUsMTg0LDEwMSw4MiwxLDIzNSwzNyw3NywyNTUsMjUzLDEzNCwxOSwwLDIzMiwyNDYsMTIyLDAsNjAsMTA2LDE3OSwwLDE5NSwxMSwxMiwwLDEwOSw2NiwyMzUsMSwxMjUsMTEzLDU5LDAsNjEsNDAsMTY0LDAsMTc1LDEwNCwyNDAsMCwyLDQ3LDE4NywyNTUsNTAsMTIsMTQxLDAsMTk0LDEzOSwxODEsMjU1LDEzNSwyNTAsMTA0LDAsOTcsOTIsMjIyLDI1NSwyMTcsMTQ5LDIwMSwyNTUsMjAzLDI0MSwxMTgsMjU1LDc5LDE1MSw2NywwLDEyMiwxNDIsMjE4LDI1NSwxNDksMjQ1LDIzOSwwLDEzOCw0MiwyMDAsMjU0LDgwLDM3LDk3LDI1NSwxMjQsMTEyLDE2NywyNTUsMzYsMTM4LDg3LDI1NSwxMzAsMjksMTQ3LDI1NSwyNDEsODcsNzgsMjU1LDIwNCw5NywxOSwxLDE3NywyMDksMjIsMjU1LDI0NywyMjcsMTI3LDI1NCw5OSwxMTksODMsMjU1LDIxMiwyNSwxOTgsMSwxNiwxNzksMTc5LDAsMTQ1LDc3LDE3MiwyNTQsODksMTUzLDE0LDI1NSwyMTgsMTg5LDE2NywwLDEwNywyMzMsNTksMjU1LDM1LDMzLDI0MywyNTQsNDQsMTEyLDExMiwyNTUsMTYxLDEyNyw3OSwxLDIwNCwxNzUsMTAsMCw0MCwyMSwxMzgsMjU0LDEwNCwxMTYsMjI4LDAsMTk5LDk1LDEzNywyNTUsMTMzLDE5MCwxNjgsMjU1LDE0NiwxNjUsMjM0LDEsMTgzLDk5LDM5LDAsMTgzLDIyMCw1NCwyNTQsMjU1LDIyMiwxMzMsMCwxNjIsMjE5LDEyMSwyNTQsNjMsMjM5LDYsMCwyMjUsMTAyLDU0LDI1NSwyNTEsMTgsMjQ2LDAsNCwzNCwxMjksMSwxMzUsMzYsMTMxLDAsMjA2LDUwLDU5LDEsMTUsOTcsMTgzLDAsMTcxLDIxNiwxMzUsMjU1LDEwMSwxNTIsNDMsMjU1LDE1MCwyNTEsOTEsMCwzOCwxNDUsOTUsMCwzNCwyMDQsMzgsMjU0LDE3OCwxNDAsODMsMjU1LDI1LDEyOSwyNDMsMjU1LDc2LDE0NCwzNywwLDEwNiwzNiwyNiwyNTQsMTE4LDE0NCwxNzIsMjU1LDY4LDE4NiwyMjksMjU1LDEwNywxNjEsMjEzLDI1NSw0NiwxNjMsNjgsMjU1LDE0OSwxNzAsMjUzLDAsMTg3LDE3LDE1LDAsMjE4LDE2MCwxNjUsMjU1LDE3MSwzNSwyNDYsMSw5NiwxMywxOSwwLDE2NSwyMDMsMTE3LDAsMjE0LDEwNywxOTIsMjU1LDI0NCwxMjMsMTc3LDEsMTAwLDMsMTA0LDAsMTc4LDI0Miw5NywyNTUsMjUxLDc2LDEzMCwyNTUsMjExLDc3LDQyLDEsMjUwLDc5LDcwLDI1NSw2MywyNDQsODAsMSwxMDUsMTAxLDI0NiwwLDYxLDEzNiw1OCwxLDIzOCw5MSwyMTMsMCwxNCw1OSw5OCwyNTUsMTY3LDg0LDc3LDAsMTcsMTMyLDQ2LDI1NCw1NywxNzUsMTk3LDI1NSwxODUsNjIsMTg0LDAsNzYsNjQsMjA3LDAsMTcyLDE3NSwyMDgsMjU0LDE3NSw3NCwzNywwLDEzOCwyNywyMTEsMjU0LDE0OCwxMjUsMTk0LDAsMTAsODksODEsMCwxNjgsMjAzLDEwMSwyNTUsNDMsMjEzLDIwOSwxLDIzNSwyNDUsNTQsMCwzMCwzNSwyMjYsMjU1LDksMTI2LDcwLDAsMjI2LDEyNSw5NCwyNTQsMTU2LDExNywyMCwyNTUsNTcsMjQ4LDExMiwxLDIzMCw0OCw2NCwyNTUsMTY0LDkyLDE2NiwxLDIyNCwyMTQsMjMwLDI1NSwzNiwxMjAsMTQzLDAsNTUsOCw0MywyNTUsMjUxLDEsMjQ1LDEsMTA2LDk4LDE2NSwwLDc0LDEwNywxMDYsMjU0LDUzLDQsNTQsMjU1LDkwLDE3OCwxNTAsMSwzLDEyMCwxMjMsMjU1LDI0NCw1LDg5LDEsMTE0LDI1MCw2MSwyNTUsMjU0LDE1Myw4MiwxLDc3LDE1LDE3LDAsNTcsMjM4LDkwLDEsOTUsMjIzLDIzMCwwLDIzNiw1Miw0NywyNTQsMTAzLDE0OCwxNjQsMjU1LDEyMSwyMDcsMzYsMSwxOCwxNiwxODUsMjU1LDc1LDIwLDc0LDAsMTg3LDExLDEwMSwwLDQ2LDQ4LDEyOSwyNTUsMjIsMjM5LDIxMCwyNTUsNzcsMjM2LDEyOSwyNTUsMTExLDc3LDIwNCwyNTUsNjEsNzIsOTcsMjU1LDE5OSwyMTcsMjUxLDI1NSw0MiwyMTUsMjA0LDAsMTMzLDE0NSwyMDEsMjU1LDU3LDIzMCwxNDYsMSwyMzUsMTAwLDE5OCwwLDE0Niw3MywzNSwyNTQsMTA4LDE5OCwyMCwyNTUsMTgyLDc5LDIxMCwyNTUsODIsMTAzLDEzNiwwLDI0NiwxMDgsMTc2LDAsMzQsMTcsNjAsMjU1LDE5LDc0LDExNCwyNTQsMTY4LDE3MCw3OCwyNTUsMTU3LDIzOSwyMCwyNTUsMTQ5LDQxLDE2OCwwLDU4LDEyMSwyOCwwLDc5LDE3OSwxMzQsMjU1LDIzMSwxMjEsMTM1LDI1NSwxNzQsMjA5LDk4LDI1NSwyNDMsMTIyLDE5MCwwLDE3MSwxNjYsMjA1LDAsMjEyLDExNiw0OCwwLDI5LDEwOCw2NiwyNTUsMTYyLDIyMiwxODIsMSwxNCwxMTksMjEsMCwyMTMsMzksMjQ5LDI1NSwyNTQsMjIzLDIyOCwyNTUsMTgzLDE2NSwxOTgsMCwxMzMsMTkwLDQ4LDAsMTI0LDIwOCwxMDksMjU1LDExOSwxNzUsODUsMjU1LDksMjA5LDEyMSwxLDQ4LDE3MSwxODksMjU1LDE5NSw3MSwxMzQsMSwxMzYsMjE5LDUxLDI1NSwxODIsOTEsMTQxLDI1NCw0OSwxNTksNzIsMCwzNSwxMTgsMjQ1LDI1NSwxMTIsMTg2LDIyNywyNTUsNTksMTM3LDMxLDAsMTM3LDQ0LDE2MywwLDExNCwxMDMsNjAsMjU0LDgsMjEzLDE1MCwwLDE2MiwxMCwxMTMsMjU1LDE5NCwxMDQsNzIsMCwyMjAsMTMxLDExNiwyNTUsMTc4LDc5LDkyLDAsMjAzLDI1MCwyMTMsMjU0LDkzLDE5MywxODksMjU1LDEzMCwyNTUsMzQsMjU0LDIxMiwxODgsMTUxLDAsMTM2LDE3LDIwLDI1NSwyMCwxMDEsODMsMjU1LDIxMiwyMDYsMTY2LDAsMjI5LDIzOCw3MywyNTUsMTUxLDc0LDMsMjU1LDE2OCw4NywyMTUsMCwxNTUsMTg4LDEzMywyNTUsMTY2LDEyOSw3MywwLDI0MCw3OSwxMzMsMjU1LDE3OCwyMTEsODEsMjU1LDIwMyw3MiwxNjMsMjU0LDE5MywxNjgsMTY1LDAsMTQsMTY0LDE5OSwyNTQsMzAsMjU1LDIwNCwwLDY1LDcyLDkxLDEsMTY2LDc0LDEwMiwyNTUsMjAwLDQyLDAsMjU1LDE5NCwxMTMsMjI3LDI1NSw2NiwyMywyMDgsMCwyMjksMjE2LDEwMCwyNTUsMjQsMjM5LDI2LDAsMTAsMjMzLDYyLDI1NSwxMjMsMTAsMTc4LDEsMjYsMzYsMTc0LDI1NSwxMTksMjE5LDE5OSwxLDQ1LDE2MywxOTAsMCwxNiwxNjgsNDIsMCwxNjYsNTcsMTk4LDI1NSwyOCwyNiwyNiwwLDEyNiwxNjUsMjMxLDAsMjUxLDEwOCwxMDAsMjU1LDYxLDIyOSwxMjEsMjU1LDU4LDExOCwxMzgsMCw3NiwyMDcsMTcsMCwxMywzNCwxMTIsMjU0LDg5LDE2LDE2OCwwLDM3LDIwOCwxMDUsMjU1LDM1LDIwMSwyMTUsMjU1LDQwLDEwNiwxMDEsMjU0LDYsMjM5LDExNCwwLDQwLDEwMywyMjYsMjU0LDI0NiwxMjcsMTEwLDI1NSw2MywxNjcsNTgsMCwxMzIsMjQwLDE0MiwwLDUsMTU4LDg4LDI1NSwxMjksNzMsMTU4LDI1NSw5NCw4OSwxNDYsMCwyMzAsNTQsMTQ2LDAsOCw0NSwxNzMsMCw3OSwxNjksMSwwLDExNSwxODYsMjQ3LDAsODQsNjQsMTMxLDAsNjcsMjI0LDI1MywyNTUsMjA3LDE4OSw2NCwwLDE1NCwyOCw4MSwxLDQ1LDE4NCw1NCwyNTUsODcsMjEyLDIyNCwyNTUsMCw5Niw3MywyNTUsMTI5LDMzLDIzNSwxLDUyLDY2LDgwLDI1NSwyNTEsMTc0LDE1NSwyNTUsNCwxNzksMzcsMCwyMzQsMTY0LDkzLDI1NCw5MywxNzUsMjUzLDAsMTk4LDY5LDg3LDI1NSwyMjQsMTA2LDQ2LDAsOTksMjksMjEwLDAsNjIsMTg4LDExNCwyNTUsNDQsMjM0LDgsMCwxNjksMTc1LDI0NywyNTUsMjMsMTA5LDEzNywyNTUsMjI5LDE4MiwzOSwwLDE5MiwxNjUsOTQsMjU0LDI0NSwxMDEsMjE3LDAsMTkxLDg4LDk2LDAsMTk2LDk0LDk5LDI1NSwxMDYsMjM4LDExLDI1NCw1MywxMjYsMjQzLDAsOTQsMSwxMDEsMjU1LDQ2LDE0NywyLDAsMjAxLDEyNCwxMjQsMjU1LDE0MSwxMiwyMTgsMCwxMywxNjYsMTU3LDEsNDgsMjUxLDIzNywyNTUsMTU1LDI1MCwxMjQsMjU1LDEwNiwxNDgsMTQ2LDI1NSwxODIsMTMsMjAyLDAsMjgsNjEsMTY3LDAsMjE3LDE1Miw4LDI1NCwyMjAsMTMwLDQ1LDI1NSwyMDAsMjMwLDI1NSwxLDU1LDY1LDg3LDI1NSw5MywxOTEsOTcsMjU0LDExNCwyNTEsMTQsMCwzMiwxMDUsOTIsMSwyNiwyMDcsMTQxLDAsMjQsMjA3LDEzLDI1NCwyMSw1MCw0OCwyNTUsMTg2LDE0OCwxMTYsMjU1LDIxMSw0MywyMjUsMCwzNywzNCwxNjIsMjU0LDE2NCwyMTAsNDIsMjU1LDY4LDIzLDk2LDI1NSwxODIsMjE0LDgsMjU1LDI0NSwxMTcsMTM3LDI1NSw2NiwxOTUsNTAsMCw3NSwxMiw4MywyNTQsODAsMTQwLDE2NCwwLDksMTY1LDM2LDEsMjI4LDExMCwyMjcsMCwyNDEsMTcsOTAsMSwyNSw1MiwyMTIsMCw2LDIyMywxMiwyNTUsMTM5LDI0Myw1NywwLDEyLDExMyw3NSwxLDI0NiwxODMsMTkxLDI1NSwyMTMsMTkxLDY5LDI1NSwyMzAsMTUsMTQyLDAsMSwxOTUsMTk2LDI1NSwxMzgsMTcxLDQ3LDI1NSw2NCw2MywxMDYsMSwxNiwxNjksMjE0LDI1NSwyMDcsMTc0LDU2LDEsODgsNzMsMTMzLDI1NSwxODIsMTMzLDE0MCwwLDE3NywxNCwyNSwyNTUsMTQ3LDE4NCw1MywyNTUsMTAsMjI3LDE2MSwyNTUsMTIwLDIxNiwyNDQsMjU1LDczLDc3LDIzMywwLDE1NywyMzgsMTM5LDEsNTksNjUsMjMzLDAsNzAsMjUxLDIxNiwxLDQxLDE4NCwxNTMsMjU1LDMyLDIwMywxMTIsMCwxNDYsMTQ3LDI1MywwLDg3LDEwMSwxMDksMSw0NCw4MiwxMzMsMjU1LDI0NCwxNTAsNTMsMjU1LDk0LDE1MiwyMzIsMjU1LDU5LDkzLDM5LDI1NSw4OCwxNDcsMjIwLDI1NSw3OCw4MSwxMywxLDMyLDQ3LDI1MiwyNTUsMTYwLDE5LDExNCwyNTUsOTMsMTA3LDM5LDI1NSwxMTgsMTYsMjExLDEsMTg1LDExOSwyMDksMjU1LDIyNywyMTksMTI3LDI1NCw4OCwxMDUsMjM2LDI1NSwxNjIsMTEwLDIzLDI1NSwzNiwxNjYsMTEwLDI1NSw5MSwyMzYsMjIxLDI1NSw2NiwyMzQsMTE2LDAsMTExLDE5LDI0NCwyNTQsMTAsMjMzLDI2LDAsMzIsMTgzLDYsMjU0LDIsMTkxLDI0MiwwLDIxOCwxNTYsNTMsMjU0LDQxLDYwLDcwLDI1NSwxNjgsMjM2LDExMSwwLDEyMSwxODUsMTI2LDI1NSwyMzgsMTQyLDIwNywyNTUsNTUsMTI2LDUyLDAsMjIwLDEyOSwyMDgsMjU0LDgwLDIwNCwxNjQsMjU1LDY3LDIzLDE0NCwyNTQsMjE4LDQwLDEwOCwyNTUsMTI3LDIwMiwxNjQsMCwyMDMsMzMsMywyNTUsMiwxNTgsMCwwLDM3LDk2LDE4OCwyNTUsMTkyLDQ5LDc0LDAsMTA5LDQsMCwwLDExMSwxNjcsMTAsMjU0LDkxLDIxOCwxMzUsMjU1LDIwMyw2NiwxNzMsMjU1LDE1MCwxOTQsMjI2LDAsMjAxLDI1Myw2LDI1NSwxNzQsMTAyLDEyMSwwLDIwNSwxOTEsMTEwLDAsNTMsMTk0LDQsMCw4MSw0MCw0NSwyNTQsMzUsMTAyLDE0MywyNTUsMTIsMTA4LDE5OCwyNTUsMTYsMjcsMjMyLDI1NSwyNTIsNzEsMTg2LDEsMTc2LDExMCwxMTQsMCwxNDIsMywxMTcsMSwxMTMsNzcsMTQyLDAsMTksMTU2LDE5NywxLDkyLDQ3LDI1MiwwLDUzLDIzMiwyMiwxLDU0LDE4LDIzNSwwLDQ2LDM1LDE4OSwyNTUsMjM2LDIxMiwxMjksMCwyLDk2LDIwOCwyNTQsMjAwLDIzOCwxOTksMjU1LDU5LDE3NSwxNjQsMjU1LDE0Niw0MywyMzEsMCwxOTQsMjE3LDUyLDI1NSwzLDIyMywxMiwwLDEzOCw1NCwxNzgsMjU0LDg1LDIzNSwyMDcsMCwyMzIsMjA3LDM0LDAsNDksNTIsNTAsMjU1LDE2NiwxMTMsODksMjU1LDEwLDQ1LDIxNiwyNTUsNjIsMTczLDI4LDAsMTExLDE2NSwyNDYsMCwxMTgsMTE1LDkxLDI1NSwxMjgsODQsNjAsMCwxNjcsMTQ0LDIwMywwLDg3LDEzLDI0MywwLDIyLDMwLDIyOCwxLDE3NywxMTMsMTQ2LDI1NSwxMjksMTcwLDIzMCwyNTQsMjUyLDE1MywxMjksMjU1LDE0NSwyMjUsNDMsMCw3MCwyMzEsNSwyNTUsMTIyLDEwNSwxMjYsMjU0LDg2LDI0NiwxNDgsMjU1LDExMCwzNywxNTQsMjU0LDIwOSwzLDkxLDAsNjgsMTQ1LDYyLDAsMjI4LDE2LDE2NSwyNTUsNTUsMjIxLDI0OSwyNTQsMTc4LDIxMCw5MSwwLDgzLDE0NiwyMjYsMjU0LDY5LDE0NiwxODYsMCw5MywyMTAsMTA0LDI1NCwxNiwyNSwxNzMsMCwyMzEsMTg2LDM4LDAsMTg5LDEyMiwxNDAsMjU1LDI1MSwxMywxMTIsMjU1LDEwNSwxMTAsOTMsMCwyNTEsNzIsMTcwLDAsMTkyLDIzLDIyMywyNTUsMjQsMywyMDIsMSwyMjUsOTMsMjI4LDAsMTUzLDE0NywxOTksMjU0LDEwOSwxNzAsMjIsMCwyNDgsMTAxLDI0NiwyNTUsMTc4LDEyNCwxMiwyNTUsMTc4LDI1NCwxMDIsMjU0LDU1LDQsNjUsMCwxMjUsMjE0LDE4MCwwLDE4Myw5NiwxNDcsMCw0NSwxMTcsMjMsMjU0LDEzMiwxOTEsMjQ5LDAsMTQzLDE3NiwyMDMsMjU0LDEzNiwxODMsNTQsMjU1LDE0NiwyMzQsMTc3LDAsMTQ2LDEwMSw4NiwyNTUsNDQsMTIzLDE0MywxLDMzLDIwOSwxNTIsMCwxOTIsOTAsNDEsMjU0LDgzLDE1LDEyNSwyNTUsMjEzLDE3Miw4MiwwLDIxNSwxNjksMTQ0LDAsMTYsMTMsMzQsMCwzMiwyMDksMTAwLDI1NSw4NCwxOCwyNDksMSwxOTcsMTcsMjM2LDI1NSwyMTcsMTg2LDIzMCwwLDQ5LDE2MCwxNzYsMjU1LDExMSwxMTgsOTcsMjU1LDIzNywxMDQsMjM1LDAsNzksNTksOTIsMjU0LDY5LDI0OSwxMSwyNTUsMzUsMTcyLDc0LDEsMTksMTE4LDY4LDAsMjIyLDEyNCwxNjUsMjU1LDE4MCw2NiwzNSwyNTUsODYsMTc0LDI0NiwwLDQzLDc0LDExMSwyNTUsMTI2LDE0NCw4NiwyNTUsMjI4LDIzNCw5MSwwLDI0MiwyMTMsMjQsMjU0LDY5LDQ0LDIzNSwyNTUsMjIwLDE4MCwzNSwwLDgsMjQ4LDcsMjU1LDEwMiw0Nyw5MiwyNTUsMjQwLDIwNSwxMDIsMjU1LDExMywyMzAsMTcxLDEsMzEsMTg1LDIwMSwyNTUsMTk0LDI0Niw3MCwyNTUsMTIyLDE3LDE4NywwLDEzNCw3MCwxOTksMjU1LDE0OSwzLDE1MCwyNTUsMTE3LDYzLDEwMywwLDY1LDEwNCwxMjMsMjU1LDIxMiw1NCwxOSwxLDYsMTQxLDg4LDAsODMsMTM0LDI0MywyNTUsMTM2LDUzLDEwMywwLDE2OSwyNywxODAsMCwxNzcsNDksMjQsMCwxMTEsNTQsMTY3LDAsMTk1LDYxLDIxNSwyNTUsMzEsMSwxMDgsMSw2MCw0Miw3MCwwLDE4NSwzLDE2MiwyNTUsMTk0LDE0OSw0MCwyNTUsMjQ2LDEyNywzOCwyNTQsMTkwLDExOSwzOCwyNTUsNjEsMTE5LDgsMSw5NiwxNjEsMjE5LDI1NSw0MiwyMDMsMjIxLDEsMTc3LDI0MiwxNjQsMjU1LDI0NSwxNTksMTAsMCwxMTYsMTk2LDAsMCw1LDkzLDIwNSwyNTQsMTI4LDEyNywxNzksMCwxMjUsMjM3LDI0NiwyNTUsMTQ5LDE2MiwyMTcsMjU1LDg3LDM3LDIwLDI1NCwxNDAsMjM4LDE5MiwwLDksOSwxOTMsMCw5NywxLDIyNiwwLDI5LDM4LDEwLDAsMCwxMzYsNjMsMjU1LDIyOSw3MiwyMTAsMjU0LDM4LDEzNCw5MiwyNTUsNzgsMjE4LDIwOCwxLDEwNCwzNiw4NCwyNTUsMTIsNSwxOTMsMjU1LDI0MiwxNzUsNjEsMjU1LDE5MSwxNjksNDYsMSwxNzksMTQ3LDE0NywyNTUsMTEzLDE5MCwxMzksMjU0LDEyNSwxNzIsMzEsMCwzLDc1LDI1MiwyNTQsMjE1LDM2LDE1LDAsMTkzLDI3LDI0LDEsMjU1LDY5LDE0OSwyNTUsMTEwLDEyOSwxMTgsMCwyMDMsOTMsMjQ5LDAsMTM4LDEzNyw2NCwyNTQsMzgsNzAsNiwwLDE1MywxMTYsMjIyLDAsMTYxLDc0LDEyMywwLDE5Myw5OSw3OSwyNTUsMTE4LDU5LDk0LDI1NSw2MSwxMiw0MywxLDE0NiwxNzcsMTU3LDAsNDYsMTQ3LDE5MSwwLDE2LDI1NSwzOCwwLDExLDUxLDMxLDEsNjAsNTgsOTgsMjU1LDExMSwxOTQsNzcsMSwxNTQsOTEsMjQ0LDAsMTQwLDQwLDE0NCwxLDE3MywxMCwyNTEsMCwyMDMsMjA5LDUwLDI1NCwxMDgsMTMwLDc4LDAsMjI4LDE4MCw5MCwwLDE3NCw3LDI1MCwwLDMxLDE3NCw2MCwwLDQxLDE3MSwzMCwwLDExNiw5OSw4MiwyNTUsMTE4LDE5MywxMzksMjU1LDE4NywxNzMsMTk4LDI1NCwyMTgsMTExLDU2LDAsMTg1LDEyMywyMTYsMCwyNDksMTU4LDUyLDAsNTIsMTgwLDkzLDI1NSwyMDEsOSw5MSwyNTUsNTYsNDUsMTY2LDI1NCwxMzIsMTU1LDIwMywyNTUsNTgsMjMyLDExMCwwLDUyLDIxMSw4OSwyNTUsMjUzLDAsMTYyLDEsOSw4NywxODMsMCwxNDUsMTM2LDQ0LDEsOTQsMTIyLDI0NSwwLDg1LDE4OCwxNzEsMSwxNDcsOTIsMTk4LDAsMCw4LDEwNCwwLDMwLDk1LDE3NCwwLDIyMSwyMzAsNTIsMSwyNDcsMjQ3LDIzNSwyNTUsMTM3LDE3NCw1MywyNTUsMzUsMjEsMjA0LDI1NSw3MSwyMjcsMjE0LDEsMjMyLDgyLDE5NCwwLDExLDQ4LDIyNywyNTUsMTcwLDczLDE4NCwyNTUsMTk4LDI1MSwyNTIsMjU0LDQ0LDExMiwzNCwwLDEzMSwxMDEsMTMxLDI1NSw3MiwxNjgsMTg3LDAsMTMyLDEzNSwxMjUsMjU1LDEzOCwxMDQsOTcsMjU1LDIzOCwxODQsMTY4LDI1NSwyNDMsMTA0LDg0LDI1NSwxMzUsMjE2LDIyNiwyNTUsMTM5LDE0NCwyMzcsMCwxODgsMTM3LDE1MCwxLDgwLDU2LDE0MCwyNTUsODYsMTY5LDE2NywyNTUsMTk0LDc4LDI1LDI1NSwyMjAsMTcsMTgwLDI1NSwxNywxMywxOTMsMCwxMTcsMTM3LDIxMiwyNTUsMTQxLDIyNCwxNTEsMCw0OSwyNDQsMTc1LDAsMTkzLDk5LDE3NSwyNTUsMTksOTksMTU0LDEsMjU1LDY1LDYyLDI1NSwxNTYsMjEwLDU1LDI1NSwyNDIsMjQ0LDMsMjU1LDI1MCwxNCwxNDksMCwxNTgsODgsMjE3LDI1NSwxNTcsMjA3LDEzNCwyNTQsMjUxLDIzMiwyOCwwLDQ2LDE1NiwyNTEsMjU1LDE3MSw1NiwxODQsMjU1LDIzOSw1MSwyMzQsMCwxNDIsMTM4LDEzMSwyNTUsMjUsMjU0LDI0MywxLDEwLDIwMSwxOTQsMCw2Myw5Nyw3NSwwLDIxMCwyMzksMTYyLDAsMTkyLDIwMCwzMSwxLDExNywyMTQsMjQzLDAsMjQsNzEsMjIyLDI1NCw1NCw0MCwyMzIsMjU1LDc2LDE4MywxMTEsMjU0LDE0NCwxNCw4NywyNTUsMjE0LDc5LDEzNiwyNTUsMjE2LDE5NiwyMTIsMCwxMzIsMjcsMTQwLDI1NCwxMzEsNSwyNTMsMCwxMjQsMTA4LDE5LDI1NSwyOCwyMTUsNzUsMCw3NiwyMjIsNTUsMjU0LDIzMywxODIsNjMsMCw2OCwxNzEsMTkxLDI1NCw1MiwxMTEsMjIyLDI1NSwxMCwxMDUsNzcsMjU1LDgwLDE3MCwyMzUsMCwxNDMsMjQsODgsMjU1LDQ1LDIzMSwxMjEsMCwxNDgsMTI5LDIyNCwxLDYxLDI0Niw4NCwwLDI1Myw0NiwyMTksMjU1LDIzOSw3NiwzMywwLDQ5LDE0OCwxOCwyNTQsMjMwLDM3LDY5LDAsNjcsMTM0LDIyLDI1NCwxNDIsMTU1LDk0LDAsMzEsMTU3LDIxMSwyNTQsMjEzLDQyLDMwLDI1NSw0LDIyOCwyNDcsMjU0LDI1MiwxNzYsMTMsMjU1LDM5LDAsMzEsMjU0LDI0MSwyNDQsMjU1LDI1NSwxNzAsNDUsMTAsMjU0LDI1MywyMjIsMjQ5LDAsMjIyLDExNCwxMzIsMCwyNTUsNDcsNiwyNTUsMTgwLDE2MywxNzksMSw4NCw5NCwxNTEsMjU1LDg5LDIwOSw4MiwyNTQsMjI5LDUyLDE2OSwyNTUsMjEzLDIzNiwwLDEsMjE0LDU2LDIyOCwyNTUsMTM1LDExOSwxNTEsMjU1LDExMiwyMDEsMTkzLDAsODMsMTYwLDUzLDI1NCw2LDE1MSw2NiwwLDE4LDE2MiwxNywwLDIzMyw5Nyw5MSwwLDEzMSw1LDc4LDEsMTgxLDEyMCw1MywyNTUsMTE3LDk1LDYzLDI1NSwyMzcsMTE3LDE4NSwwLDE5MSwxMjYsMTM2LDI1NSwxNDQsMTE5LDIzMywwLDE4Myw1Nyw5NywxLDQ3LDIwMSwxODcsMjU1LDE2NywxNjUsMTE5LDEsNDUsMTAwLDEyNiwwLDIxLDk4LDYsMjU0LDE0NSwxNTAsOTUsMjU1LDEyMCw1NCwxNTIsMCwyMDksOTgsMTA0LDAsMTQzLDExMSwzMCwyNTQsMTg0LDE0OCwyNDksMCwyMzUsMjE2LDQ2LDAsMjQ4LDIwMiwxNDgsMjU1LDU3LDk1LDIyLDAsMjQyLDIyNSwxNjMsMCwyMzMsMjQ3LDIzMiwyNTUsNzEsMTcxLDE5LDI1NSwxMDMsMjQ0LDQ5LDI1NSw4NCwxMDMsOTMsMjU1LDY4LDEyMSwyNDQsMSw4MiwyMjQsMTMsMCw0MSw3OSw0MywyNTUsMjQ5LDIwNiwxNjcsMjU1LDIxNSw1MiwyMSwyNTQsMTkyLDMyLDIyLDI1NSwyNDcsMTExLDYwLDAsMTAxLDc0LDM4LDI1NSwyMiw5MSw4NCwyNTQsMjksMjgsMTMsMjU1LDE5OCwyMzEsMjE1LDI1NCwyNDQsMTU0LDIwMCwwLDIyMywxMzcsMjM3LDAsMjExLDEzMiwxNCwwLDk1LDY0LDIwNiwyNTUsMTcsNjIsMjQ3LDI1NSwyMzMsMTMxLDEyMSwxLDkzLDIzLDc3LDAsMjA1LDIwNCw1MiwyNTQsODEsMTg5LDEzNiwwLDE4MCwyMTksMTM4LDEsMTQzLDE4LDk0LDAsMjA0LDQzLDE0MCwyNTQsMTg4LDE3NSwyMTksMCwxMTEsOTgsMTQzLDI1NSwxNTEsNjMsMTYyLDI1NSwyMTEsNTAsNzEsMjU0LDE5LDE0Niw1MywwLDE0Niw0NSw4MywyNTQsMTc4LDgyLDIzOCwyNTUsMTYsMTMzLDg0LDI1NSwyMjYsMTk4LDkzLDI1NSwyMDEsOTcsMjAsMjU1LDEyMCwxMTgsMzUsMjU1LDExNCw1MCwyMzEsMjU1LDE2MiwyMjksMTU2LDI1NSwyMTEsMjYsMTIsMCwxMTQsMzksMTE1LDI1NSwyMDYsMjEyLDEzNCwwLDE5NywyMTcsMTYwLDI1NSwxMTYsMTI5LDk0LDI1NCwxOTksMjE1LDIxOSwyNTUsNzUsMjIzLDI0OSwxLDI1MywxMTYsMTgxLDI1NSwyMzIsMjE1LDEwNCwyNTUsMjI4LDEzMCwyNDYsMjU1LDE4NSwxMTcsODYsMCwxNCw1LDgsMCwyMzksMjksNjEsMSwyMzcsODcsMTMzLDI1NSwxMjUsMTQ2LDEzNywyNTQsMjA0LDE2OCwyMjMsMCw0NiwxNjgsMjQ1LDAsMTU0LDEwNSwyMiwwLDIyMCwyMTIsMTYxLDI1NSwxMDcsNjksMjQsMjU1LDEzNywyMTgsMTgxLDI1NSwyNDEsODQsMTk4LDI1NSwxMzAsMTIyLDIxMSwyNTUsMTQxLDgsMTUzLDI1NSwxOTAsMTc3LDExOCwwLDk2LDg5LDE3OCwwLDI1NSwxNiw0OCwyNTQsMTIyLDk2LDEwNSwyNTUsMTE3LDU0LDIzMiwyNTUsMzQsMTI2LDEwNSwyNTUsMjA0LDY3LDE2NiwwLDIzMiw1MiwxMzgsMjU1LDIxMSwxNDcsMTIsMCwyNSw1NCw3LDAsNDQsMTUsMjE1LDI1NCw1MSwyMzYsNDUsMCwxOTAsNjgsMTI5LDEsMTA2LDE0NywyMjUsMCwyOCw5Myw0NSwyNTQsMjM2LDE0MSwxNSwyNTUsMTcsNjEsMTYxLDAsMjIwLDExNSwxOTIsMCwyMzYsMTQ1LDI0LDI1NCwxMTEsMTY4LDE2OSwwLDIyNCw1OCw2MywyNTUsMTI3LDE2NCwxODgsMCw4MiwyMzQsNzUsMSwyMjQsMTU4LDEzNCwwLDIwOSw2OCwxMTAsMSwyMTcsMTY2LDIxNywwLDcwLDIyNSwxNjYsMSwxODcsMTkzLDE0MywyNTUsMTYsNyw4OCwyNTUsMTAsMjA1LDE0MCwwLDExNywxOTIsMTU2LDEsMTcsNTYsMzgsMCwyNywxMjQsMTA4LDEsMTcxLDIxNSw1NSwyNTUsOTUsMjUzLDIxMiwwLDE1NSwxMzUsMTY4LDI1NSwyNDYsMTc4LDE1MywyNTQsMTU0LDY4LDc0LDAsMjMyLDYxLDk2LDI1NCwxMDUsMTMyLDU5LDAsMzMsNzYsMTk5LDEsMTg5LDE3NiwxMzAsMjU1LDksMTA0LDI1LDI1NCw3NSwxOTgsMTAyLDI1NSwyMzMsMSwxMTIsMCwxMDgsMjIwLDIwLDI1NSwxMTQsMjMwLDcwLDAsMTQwLDE5NCwxMzMsMjU1LDU3LDE1OCwxNjQsMjU0LDE0Niw2LDgwLDI1NSwxNjksMTk2LDk3LDEsODUsMTgzLDEzMCwwLDcwLDE1OCwyMjIsMSw1OSwyMzcsMjM0LDI1NSw5NiwyNSwyNiwyNTUsMjMyLDE3NSw5NywyNTUsMTEsMTIxLDI0OCwyNTQsODgsMzUsMTk0LDAsMjE5LDE4MCwyNTIsMjU0LDc0LDgsMjI3LDAsMTk1LDIyNyw3MywxLDE4NCwxMTAsMTYxLDI1NSw0OSwyMzMsMTY0LDEsMTI4LDUzLDQ3LDAsODIsMTQsMTIxLDI1NSwxOTMsMTkwLDU4LDAsNDgsMTc0LDExNywyNTUsMTMyLDIzLDMyLDAsNDAsMTAsMTM0LDEsMjIsNTEsMjUsMjU1LDI0MCwxMSwxNzYsMjU1LDExMCw1NywxNDYsMCwxMTcsMTQzLDIzOSwxLDE1NywxMDEsMTE4LDI1NSw1NCw4NCw3NiwwLDIwNSwxODQsMTgsMjU1LDQ3LDQsNzIsMjU1LDc4LDExMiw4NSwyNTUsMTkzLDUwLDY2LDEsOTMsMTYsNTIsMjU1LDgsMTA1LDEzNCwwLDEyLDEwOSw3MiwyNTUsNTgsMTU2LDI1MSwwLDE0NCwzNSwyMDQsMCw0NCwxNjAsMTE3LDI1NCw1MCwxMDcsMTk0LDAsMSw2OCwxNjUsMjU1LDExMSwxMTAsMTYyLDAsMTU4LDgzLDQwLDI1NCw3NiwyMTQsMjM0LDAsNTgsMjE2LDIwNSwyNTUsMTcxLDk2LDE0NywyNTUsNDAsMjI3LDExNCwxLDE3NiwyMjcsMjQxLDAsNzAsMjQ5LDE4MywxLDEzNiw4NCwxMzksMjU1LDYwLDEyMiwyNDcsMjU0LDE0Myw5LDExNywyNTUsMTc3LDE3NCwxMzcsMjU0LDczLDI0NywxNDMsMCwyMzYsMTg1LDEyNiwyNTUsNjIsMjUsMjQ3LDI1NSw0NSw2NCw1NiwyNTUsMTYxLDI0NCw2LDAsMzQsNTcsNTYsMSwxMDUsMjAyLDgzLDAsMTI4LDE0NywyMDgsMCw2LDEwMywxMCwyNTUsNzQsMTM4LDY1LDI1NSw5Nyw4MCwxMDAsMjU1LDIxNCwxNzQsMzMsMjU1LDUwLDEzNCw3NCwyNTUsMTEwLDE1MSwxMzAsMjU0LDExMSw4NCwxNzIsMCw4NCwxOTksNzUsMjU0LDI0OCw1OSwxMTIsMjU1LDgsMjE2LDE3OCwxLDksMTgzLDk1LDAsMjM4LDI3LDgsMjU0LDE3MCwyMDUsMjIwLDAsMTk1LDIyOSwxMzUsMCw5OCw3NiwyMzcsMjU1LDIyNiw5MSwyNiwxLDgyLDIxOSwzOSwyNTUsMjI1LDE5MCwxOTksMSwyMTcsMjAwLDEyMSwyNTUsODEsMTc5LDgsMjU1LDE0MCw2NSwyMDYsMCwxNzgsMjA3LDg3LDI1NCwyNTAsMjUyLDQ2LDI1NSwxMDQsODksMTEwLDEsMjUzLDE4OSwxNTgsMjU1LDE0NCwyMTQsMTU4LDI1NSwxNjAsMjQ1LDU0LDI1NSw1MywxODMsOTIsMSwyMSwyMDAsMTk0LDI1NSwxNDYsMzMsMTEzLDEsMjA5LDEsMjU1LDAsMjM1LDEwNiw0MywyNTUsMTY3LDUyLDIzMiwwLDE1NywyMjksMjIxLDAsNTEsMzAsMjUsMCwyNTAsMjIxLDI3LDEsNjUsMTQ3LDg3LDI1NSw3OSwxMjMsMTk2LDAsNjUsMTk2LDIyMywyNTUsNzYsNDQsMTcsMSw4NSwyNDEsNjgsMCwyMDIsMTgzLDI0OSwyNTUsNjUsMjEyLDIxMiwyNTUsOSwzMywxNTQsMSw3MSw1OSw4MCwwLDE3NSwxOTQsNTksMjU1LDE0MSw3Miw5LDAsMTAwLDE2MCwyNDQsMCwyMzAsMjA4LDU2LDAsNTksMjUsNzUsMjU0LDgwLDE5NCwxOTQsMCwxOCwzLDIwMCwyNTQsMTYwLDE1OSwxMTUsMCwxMzIsMTQzLDI0NywxLDExMSw5Myw1NywyNTUsNTgsMjM3LDExLDEsMTM0LDIyMiwxMzUsMjU1LDEyMiwxNjMsMTA4LDEsMTIzLDQzLDE5MCwyNTUsMjUxLDE4OSwyMDYsMjU0LDgwLDE4Miw3MiwyNTUsMjA4LDI0NiwyMjQsMSwxNyw2MCw5LDAsMTYxLDIwNywzOCwwLDE0MSwxMDksOTEsMCwyMTYsMTUsMjExLDI1NSwxMzYsNzgsMTEwLDAsOTgsMTYzLDEwNCwyNTUsMjEsODAsMTIxLDI1NSwxNzMsMTc4LDE4MywxLDEyNywxNDMsNCwwLDEwNCw2MCw4MiwyNTQsMjE0LDE2LDEzLDI1NSw5NiwyMzgsMzMsMSwxNTgsMTQ4LDIzMCwyNTUsMTI3LDEyOSw2MiwyNTUsNTEsMjU1LDIxMCwyNTUsNjIsMTQxLDIzNiwyNTQsMTU3LDU1LDIyNCwyNTUsMTE0LDM5LDI0NCwwLDE5MiwxODgsMjUwLDI1NSwyMjgsNzYsNTMsMCw5OCw4NCw4MSwyNTUsMTczLDIwMyw2MSwyNTQsMTQ3LDUwLDU1LDI1NSwyMDQsMjM1LDE5MSwwLDUyLDE5NywyNDQsMCw4OCw0MywyMTEsMjU0LDI3LDE5MSwxMTksMCwxODgsMjMxLDE1NCwwLDY2LDgxLDE2MSwwLDkyLDE5MywxNjAsMSwyNTAsMjI3LDEyMCwwLDEyMyw1NSwyMjYsMCwxODQsMTcsNzIsMCwxMzMsMTY4LDEwLDI1NCwyMiwxMzUsMTU2LDI1NSw0MSwyNSwxMDMsMjU1LDQ4LDIwMiw1OCwwLDE4NiwxNDksODEsMjU1LDE4OCwxMzQsMjM5LDAsMjM1LDE4MSwxODksMjU0LDIxNywxMzksMTg4LDI1NSw3NCw0OCw4MiwwLDQ2LDIxOCwyMjksMCwxODksMjUzLDI1MSwwLDUwLDIyOSwxMiwyNTUsMjExLDE0MSwxOTEsMSwxMjgsMjQ0LDI1LDI1NSwxNjksMjMxLDEyMiwyNTQsODYsNDcsMTg5LDI1NSwxMzIsMTgzLDIzLDI1NSwzNywxNzgsMTUwLDI1NSw1MSwxMzcsMjUzLDAsMjAwLDc4LDMxLDAsMjIsMTA1LDUwLDAsMTMwLDYwLDAsMCwxMzIsMTYzLDkxLDI1NCwyMywyMzEsMTg3LDAsMTkyLDc5LDIzOSwwLDE1NywxMDIsMTY0LDI1NSwxOTIsODIsMjAsMSwyNCwxODEsMTAzLDI1NSwyNDAsOSwyMzQsMCwxLDEyMywxNjQsMjU1LDEzMywyMzMsMCwyNTUsMjAyLDI0MiwyNDIsMCw2MCwxODYsMjQ1LDAsMjQxLDE2LDE5OSwyNTUsMjI0LDExNiwxNTgsMjU0LDE5MSwxMjUsOTEsMjU1LDIyNCw4NiwyMDcsMCwxMjEsMzcsMjMxLDI1NSwyMjcsOSwxOTgsMjU1LDE1LDE1MywyMzksMjU1LDEyMSwyMzIsMjE3LDI1NCw3NSwxMTIsODIsMCw5NSwxMiw1NywyNTQsNTEsMjE0LDEwNSwyNTUsMTQ4LDIyMCw5NywxLDE5OSw5OCwzNiwwLDE1NiwyMDksMTIsMjU0LDEwLDIxMiw1MiwwLDIxNywxODAsNTUsMjU0LDIxMiwxNzAsMjMyLDI1NSwyMTYsMjAsODQsMjU1LDE1NywyNTAsMTM1LDAsMTU3LDk5LDEyNywyNTQsMSwyMDYsNDEsMCwxNDksMzYsNzAsMSw1NCwxOTYsMjAxLDI1NSw4NywxMTYsMCwyNTQsMjM1LDE3MSwxNTAsMCwyNywxNjMsMjM0LDAsMjAyLDEzNSwxODAsMCwyMDgsOTUsMCwyNTQsMTIzLDE1Niw5MywwLDE4Myw2Miw3NSwwLDEzNywyMzUsMTgyLDAsMjA0LDIyNSwyNTUsMjU1LDIxNCwxMzksMjEwLDI1NSwyLDExNSw4LDI1NSwyOSwxMiwxMTEsMCw1MiwxNTYsMSwwLDI1MywyMSwyNTEsMjU1LDM3LDE2NSwzMSwyNTQsMTIsMTMwLDIxMSwwLDEwNiwxOCw1MywyNTQsNDIsOTksMTU0LDAsMTQsMjE3LDYxLDI1NCwyMTYsMTEsOTIsMjU1LDIwMCwxOTcsMTEyLDI1NCwxNDcsMzgsMTk5LDAsMzYsMjUyLDEyMCwyNTQsMTA3LDE2OSw3NywwLDEsMTIzLDE1OSwyNTUsMjA3LDc1LDEwMiwwLDE2MywxNzUsMTk2LDAsNDQsMSwyNDAsMCwxMjAsMTg2LDE3NiwyNTQsMTMsOTgsNzYsMjU1LDIzNywxMjQsMjQxLDI1NSwyMzIsMTQ2LDE4OCwyNTUsMjAwLDk2LDIyNCwwLDIwNCwzMSw0MSwwLDIwOCwyMDAsMTMsMCwyMSwyMjUsOTYsMjU1LDE3NSwxNTYsMTk2LDAsMjQ3LDIwOCwxMjYsMCw2MiwxODQsMjQ0LDI1NCwyLDE3MSw4MSwwLDg1LDExNSwxNTgsMCw1NCw2NCw0NSwyNTUsMTksMTM4LDExNCwwLDEzNSw3MSwyMDUsMCwyMjcsNDcsMTQ3LDEsMjE4LDIzMSw2NiwwLDI1MywyMDksMjgsMCwyNDQsMTUsMTczLDI1NSw2LDE1LDExOCwyNTQsMTYsMTUwLDIwOCwyNTUsMTg1LDIyLDUwLDI1NSw4NiwxMTIsMjA3LDI1NSw3NSwxMTMsMjE1LDEsNjMsMTQ2LDQzLDI1NSw0LDIyNSwxOSwyNTQsMjI3LDIzLDYyLDI1NSwxNCwyNTUsMjE0LDI1NCw0NSw4LDIwNSwyNTUsODcsMTk3LDE1MSwyNTQsMjEwLDgyLDIxNSwyNTUsMjQ1LDI0OCwyNDcsMjU1LDEyOCwyNDgsNzAsMCwyMjUsMjQ3LDg3LDAsOTAsMTIwLDcwLDAsMjEzLDI0NSw5MiwwLDEzLDEzMywyMjYsMCw0NywxODEsNSwxLDkyLDE2MywxMDUsMjU1LDYsMzAsMTMzLDI1NCwyMzIsMTc4LDYxLDI1NSwyMzAsMTQ5LDI0LDI1NSwxOCw0OSwxNTgsMCwyMjgsMTAwLDYxLDI1NCwxMTYsMjQzLDI1MSwyNTUsNzcsNzUsOTIsMSw4MSwyMTksMTQ3LDI1NSw3NiwxNjMsMjU0LDI1NCwxNDEsMjEzLDI0NiwwLDIzMiwzNywxNTIsMjU0LDk3LDQ0LDEwMCwwLDIwMSwzNyw1MCwxLDIxMiwyNDQsNTcsMCwxNzQsMTcxLDE4MywyNTUsMjQ5LDc0LDExMiwwLDE2NiwxNTYsMzAsMCwyMjIsMjIxLDk3LDI1NSwyNDMsOTMsNzMsMjU0LDI1MSwxMDEsMTAwLDI1NSwyMTYsMjE3LDkzLDI1NSwyNTQsMTM4LDE4NywyNTUsMTQyLDE5MCw1MiwyNTUsNTksMjAzLDE3NywyNTUsMjAwLDk0LDUyLDAsMTE1LDExNCwxNTgsMjU1LDE2NSwxNTIsMTA0LDEsMTI2LDk5LDIyNiwyNTUsMTE4LDE1NywyNDQsMSwxMDcsMjAwLDE2LDAsMTkzLDkwLDIyOSwwLDEyMSw2LDg4LDAsMTU2LDMyLDkzLDI1NCwxMjUsMjQxLDIxMSwyNTUsMTQsMjM3LDE1NywyNTUsMTY1LDE1NCwyMSwyNTUsMTg0LDIyNCwyMiwyNTUsMjUwLDI0LDE1MiwyNTUsMTEzLDc3LDMxLDAsMjQ3LDE3MSwyMywyNTUsMjM3LDE3NywyMDQsMjU1LDUyLDEzNywxNDUsMjU1LDE5NCwxODIsMTE0LDAsMjI0LDIzNCwxNDksMCwxMCwxMTEsMTAzLDEsMjAxLDEyOSw0LDAsMjM4LDE0Miw3OCwwLDUyLDYsNDAsMjU1LDExMCwyMTMsMTY1LDI1NCw2MCwyMDcsMjUzLDAsNjIsMjE1LDY5LDAsOTYsOTcsMCwyNTUsNDksNDUsMjAyLDAsMTIwLDEyMSwyMiwyNTUsMjM1LDEzOSw0OCwxLDE5OCw0NSwzNCwyNTUsMTgyLDUwLDI3LDEsMTMxLDIxMCw5MSwyNTUsNDYsNTQsMTI4LDAsMTc1LDEyMywxMDUsMjU1LDE5OCwxNDEsNzgsMjU0LDY3LDI0NCwyMzksMjU1LDI0NSw1NCwxMDMsMjU0LDc4LDM4LDI0MiwyNTUsMiw5MiwyNDksMjU0LDI1MSwxNzQsODcsMjU1LDEzOSw2MywxNDQsMCwyNCwxMDgsMjcsMjU1LDM0LDEwMiwxOCwxLDM0LDIyLDE1MiwwLDY2LDIyOSwxMTgsMjU0LDUwLDE0Myw5OSwwLDE0NCwxNjksMTQ5LDEsMTE4LDMwLDE1MiwwLDE3OCw4LDEyMSwxLDgsMTU5LDE4LDAsOTAsMTAxLDIzMCwyNTUsMTI5LDI5LDExOSwwLDY4LDM2LDExLDEsMjMyLDE4Myw1NSwwLDIzLDI1NSw5NiwyNTUsMTYxLDQxLDE5MywyNTUsNjMsMTM5LDIyMiwwLDE1LDE3OSwyNDMsMCwyNTUsMTAwLDE1LDI1NSw4Miw1MywxMzUsMCwxMzcsNTcsMTQ5LDEsOTksMjQwLDE3MCwyNTUsMjIsMjMwLDIyOCwyNTQsNDksMTgwLDgyLDI1NSw2MSw4Miw0MywwLDExMCwyNDUsMjE3LDAsMTk5LDEyNSw2MSwwLDQ2LDI1Myw1MiwwLDE0MSwxOTcsMjE5LDAsMjExLDE1OSwxOTMsMCw1NSwxMjEsMTA1LDI1NCwxODMsMjAsMTI5LDAsMTY5LDExOSwxNzAsMjU1LDIwMywxNzgsMTM5LDI1NSwxMzUsNDAsMTgyLDI1NSwxNzIsMTMsMjAyLDI1NSw2NSwxNzgsMTQ4LDAsOCwyMDcsNDMsMCwxMjIsNTMsMTI3LDEsNzQsMTYxLDQ4LDAsMjI3LDIxNCwxMjgsMjU0LDg2LDExLDI0MywyNTUsMTAwLDg2LDcsMSwyNDUsNjgsMTM0LDI1NSw2MSw0MywyMSwxLDE1Miw4NCw5NCwyNTUsMTkwLDYwLDI1MCwyNTQsMjM5LDExOCwyMzIsMjU1LDIxNCwxMzYsMzcsMSwxMTMsNzYsMTA3LDI1NSw5MywxMDQsMTAwLDEsMTQ0LDIwNiwyMywyNTUsMTEwLDE1MCwxNTQsMSwyMjgsMTAzLDE4NSwwLDIxOCw0OSw1MCwyNTQsMTM1LDc3LDEzOSwyNTUsMTg1LDEsNzgsMCwwLDE2MSwxNDgsMjU1LDk3LDI5LDIzMywyNTUsMjA3LDE0OCwxNDksMjU1LDE2MCwxNjgsMCwwLDkxLDEyOCwxNzEsMjU1LDYsMjgsMTksMjU0LDExLDExMSwyNDcsMCwzOSwxODcsMTUwLDI1NSwxMzgsMjMyLDE0OSwwLDExNyw2Miw2OCwyNTUsNjMsMjE2LDE4OCwyNTUsMjM1LDIzNCwzMiwyNTQsMjksNTcsMTYwLDI1NSwyNSwxMiwyNDEsMSwxNjksNjAsMTkxLDAsMzIsMTMxLDE0MSwyNTUsMjM3LDE1OSwxMjMsMjU1LDk0LDE5Nyw5NCwyNTQsMTE2LDI1NCwzLDI1NSw5MiwxNzksOTcsMjU0LDEyMSw5Nyw5MiwyNTUsMTcwLDExMiwxNCwwLDIxLDE0OSwyNDgsMCwyNDgsMjI3LDMsMCw4MCw5NiwxMDksMCw3NSwxOTIsNzQsMSwxMiw5MCwyMjYsMjU1LDE2MSwxMDYsNjgsMSwyMDgsMTE0LDEyNywyNTUsMTE0LDQyLDI1NSwyNTQsNzQsMjYsNzQsMjU1LDI0NywxNzksMTUwLDI1NCwxMjEsMTQwLDYwLDAsMTQ3LDcwLDIwMCwyNTUsMjE0LDQwLDE2MSwyNTUsMTYxLDE4OCwyMDEsMjU1LDE0MSw2NSwxMzUsMjU1LDI0MiwxMTUsMjUyLDAsNjIsNDcsMjAyLDAsMTgwLDE0OSwyNTUsMjU0LDEzMCw1NSwyMzcsMCwxNjUsMTcsMTg2LDI1NSwxMCwxNjksMTk0LDAsMTU2LDEwOSwyMTgsMjU1LDExMiwxNDAsMTIzLDI1NSwxMDQsMTI4LDIyMywyNTQsMTc3LDE0MiwxMDgsMjU1LDEyMSwzNywyMTksMjU1LDEyOCw3NywxOCwyNTUsMTExLDEwOCwyMywxLDkxLDE5Miw3NSwwLDE3NCwyNDUsMjIsMjU1LDQsMjM2LDYyLDI1NSw0Myw2NCwxNTMsMSwyMjcsMTczLDI1NCwwLDIzNywxMjIsMTMyLDEsMTI3LDg5LDE4NiwyNTUsMTQyLDgyLDEyOCwyNTQsMjUyLDg0LDE3NCwwLDkwLDE3OSwxNzcsMSwyNDMsMjE0LDg3LDI1NSwxMDMsNjAsMTYyLDI1NSwyMDgsMTMwLDE0LDI1NSwxMSwxMzAsMTM5LDAsMjA2LDEyOSwyMTksMjU1LDk0LDIxNywxNTcsMjU1LDIzOSwyMzAsMjMwLDI1NSwxMTYsMTE1LDE1OSwyNTQsMTY0LDEwNyw5NSwwLDUxLDIxOCwyLDEsMjE2LDEyNSwxOTgsMjU1LDE0MCwyMDIsMTI4LDI1NCwxMSw5NSw2OCwyNTUsNTUsOSw5MywyNTQsMTc0LDE1Myw2LDI1NSwyMDQsMTcyLDk2LDAsNjksMTYwLDExMCwwLDIxMywzOCw0OSwyNTQsMjcsODAsMjEzLDAsMTE4LDEyNSwxMTQsMCw3MCw3MCw2NywyNTUsMTUsMTQyLDczLDI1NSwxMzEsMTIyLDE4NSwyNTUsMjQzLDIwLDUwLDI1NCwxMzAsMjM3LDQwLDAsMjEwLDE1OSwxNDAsMSwxOTcsMTUxLDY1LDI1NSw4NCwxNTMsNjYsMCwxOTUsMTI2LDkwLDAsMTYsMjM4LDIzNiwxLDExOCwxODcsMTAyLDI1NSwzLDI0LDEzMywyNTUsMTg3LDY5LDIzMCwwLDU2LDE5Nyw5MiwxLDIxMyw2OSw5NCwyNTUsODAsMTM4LDIyOSwxLDIwNiw3LDIzMCwwLDIyMiwxMTEsMjMwLDEsOTEsMjMzLDExOSwyNTUsOSw4OSw3LDEsMiw5OCwxLDAsMTQ4LDc0LDEzMywyNTUsNTEsMjQ2LDE4MCwyNTUsMjI4LDE3NywxMTIsMSw1OCwxODksMTA4LDI1NSwxOTQsMjAzLDIzNywyNTQsMjEsMjA5LDE5NSwwLDE0NywxMCwzNSwxLDg2LDE1NywyMjYsMCwzMSwxNjMsMTM5LDI1NCw1Niw3LDc1LDI1NSw2Miw5MCwxMTYsMCwxODEsNjAsMTY5LDAsMTM4LDE2MiwyMTIsMjU0LDgxLDE2NywzMSwwLDIwNSw5MCwxMTIsMjU1LDMzLDExMiwyMjcsMCw4MywxNTEsMTE3LDEsMTc3LDIyNCw3MywyNTUsMTc0LDE0NCwyMTcsMjU1LDIzMCwyMDQsNzksMjU1LDIyLDc3LDIzMiwyNTUsMTE0LDc4LDIzNCwwLDIyNCw1NywxMjYsMjU0LDksNDksMTQxLDAsMjQyLDE0NywxNjUsMSwxMDQsMTgyLDE0MCwyNTUsMTY3LDEzMiwxMiwxLDEyMyw2OCwxMjcsMCwyMjUsODcsMzksMSwyNTEsMTA4LDgsMCwxOTgsMTkzLDE0MywxLDEyMSwxMzUsMjA3LDI1NSwxNzIsMjIsNzAsMCw1MCw2OCwxMTYsMjU1LDEwMSwxNzUsNDAsMjU1LDI0OCwxMDUsMjMzLDAsMTY2LDIwMyw3LDAsMTEwLDE5NywyMTgsMCwyMTUsMjU0LDI2LDI1NCwxNjgsMjI2LDI1MywwLDMxLDE0Myw5NiwwLDExLDEwMyw0MSwwLDE4MywxMjksMjAzLDI1NCwxMDAsMjQ3LDc0LDI1NSwyMTMsMTI2LDEzMiwwLDIxMCwxNDcsNDQsMCwxOTksMjM0LDI3LDEsMTQ4LDQ3LDE4MSwwLDE1NSw5MSwxNTgsMSw1NCwxMDUsMTc1LDI1NSwyLDc4LDE0NSwyNTQsMTAyLDE1NCw5NSwwLDEyOCwyMDcsMTI3LDI1NCw1MiwxMjQsMjM2LDI1NSwxMzAsODQsNzEsMCwyMjEsMjQzLDIxMSwwLDE1MiwxNzAsMjA3LDAsMjIyLDEwNiwxOTksMCwxODMsODQsOTQsMjU0LDkyLDIwMCw1NiwyNTUsMTM4LDE4MiwxMTUsMSwxNDIsOTYsMTQ2LDAsMTMzLDEzNiwyMjgsMCw5NywxOCwxNTAsMCw1NSwyNTEsNjYsMCwxNDAsMTAyLDQsMCwyMDIsMTAzLDE1MSwwLDMwLDE5LDI0OCwyNTUsNTEsMTg0LDIwNywwLDIwMiwxOTgsODksMCw1NSwxOTcsMjI1LDI1NCwxNjksOTUsMjQ5LDI1NSw2Niw2NSw2OCwyNTUsMTg4LDIzNCwxMjYsMCwxNjYsMjIzLDEwMCwxLDExMiwyMzksMjQ0LDAsMTQ0LDIzLDE5NCwwLDU4LDM5LDE4MiwwLDI0NCw0NCwyNCwyNTQsMTc1LDY4LDE3OSwyNTUsMTUyLDExOCwxNTQsMSwxNzYsMTYyLDEzMCwwLDIxNywxMTQsMjA0LDI1NCwxNzMsMTI2LDc4LDI1NSwzMywyMjIsMzAsMjU1LDM2LDIsOTEsMjU1LDIsMTQzLDI0MywwLDksMjM1LDIxNSwwLDMsMTcxLDE1MSwxLDI0LDIxNSwyNDUsMjU1LDE2OCw0NywxNjQsMjU0LDI0MSwxNDYsMjA3LDAsNjksMTI5LDE4MCwwLDY4LDI0MywxMTMsMCwxNDQsNTMsNzIsMjU0LDI1MSw0NSwxNCwwLDIzLDExMCwxNjgsMCw2OCw2OCw3OSwyNTUsMTEwLDcwLDk1LDI1NCwxNzQsOTEsMTQ0LDI1NSwzMywyMDYsOTUsMjU1LDEzNyw0MSw3LDI1NSwxOSwxODcsMTUzLDI1NCwzNSwyNTUsMTEyLDI1NSw5LDE0NSwxODUsMjU0LDUwLDE1NywzNywwLDExLDExMiw0OSwxLDEwMiw4LDE5MCwyNTUsMjM0LDI0MywxNjksMSw2MCw4NSwyMywwLDc0LDM5LDE4OSwwLDExNiw0OSwyMzksMCwxNzMsMjEzLDIxMCwwLDQ2LDE2MSwxMDgsMjU1LDE1OSwxNTAsMzcsMCwxOTYsMTIwLDE4NSwyNTUsMzQsOTgsNiwyNTUsMTUzLDE5NSw2MiwyNTUsOTcsMjMwLDcxLDI1NSwxMDIsNjEsNzYsMCwyNiwyMTIsMjM2LDI1NSwxNjQsOTcsMTYsMCwxOTgsNTksMTQ2LDAsMTYzLDIzLDE5NiwwLDU2LDI0LDYxLDAsMTgxLDk4LDE5MywwLDI1MSwxNDcsMjI5LDI1NSw5OCwxODksMjQsMjU1LDQ2LDU0LDIwNiwyNTUsMjM0LDgyLDI0NiwwLDE4MywxMDMsMzgsMSwxMDksNjIsMjA0LDAsMTAsMjQwLDIyNCwwLDE0NiwyMiwxMTcsMjU1LDE0MiwxNTQsMTIwLDAsNjksMjEyLDM1LDAsMjA4LDk5LDExOCwxLDEyMSwyNTUsMywyNTUsNzIsNiwxOTQsMCwxMTcsMTcsMTk3LDI1NSwxMjUsMTUsMjMsMCwxNTQsNzksMTUzLDAsMjE0LDk0LDE5NywyNTUsMTg1LDU1LDE0NywyNTUsNjIsMjU0LDc4LDI1NCwxMjcsODIsMTUzLDAsMTEwLDEwMiw2MywyNTUsMTA4LDgyLDE2MSwyNTUsMTA1LDE4NywyMTIsMSw4MCwxMzgsMzksMCw2MCwyNTUsOTMsMjU1LDcyLDEyLDE4NiwwLDIxMCwyNTEsMzEsMSwxOTAsMTY3LDE0NCwyNTUsMjI4LDQ0LDE5LDI1NCwxMjgsNjcsMjMyLDAsMjE0LDI0OSwxMDcsMjU0LDEzNiwxNDUsODYsMjU1LDEzMiw0NiwxNzYsMCwxODksMTg3LDIyNywyNTUsMjA4LDIyLDE0MCwwLDIxNywyMTEsMTE2LDAsNTAsODEsMTg2LDI1NCwxMzksMjUwLDMxLDAsMzAsNjQsMTk4LDEsMTM1LDE1NSwxMDAsMCwxNjAsMjA2LDIzLDI1NCwxODcsMTYyLDIxMSwyNTUsMTYsMTg4LDYzLDAsMjU0LDIwOCw0OSwwLDg1LDg0LDE5MSwwLDI0MSwxOTIsMjQyLDI1NSwxNTMsMTI2LDE0NSwxLDIzNCwxNjIsMTYyLDI1NSwyMzAsOTcsMjE2LDEsNjQsMTM1LDEyNiwwLDE5MCwxNDgsMjIzLDEsNTIsMCw0MywyNTUsMjgsMzksMTg5LDEsNjQsMTM2LDIzOCwwLDE3NSwxOTYsMTg1LDAsOTgsMjI2LDIxMywyNTUsMTI3LDE1OSwyNDQsMSwyMjYsMTc1LDYwLDAsMTYwLDIzMywxNDIsMSwxODAsMjQzLDIwNywyNTUsNjksMTUyLDg5LDEsMzEsMTAxLDIxLDAsMTQ0LDI1LDE2NCwyNTQsMTM5LDE5MSwyMDksMCw5MSwyNSwxMjEsMCwzMiwxNDcsNSwwLDM5LDE4NiwxMjMsMjU1LDYzLDExNSwyMzAsMjU1LDkzLDE2NywxOTgsMjU1LDE0MywyMTMsMjIwLDI1NSwxNzksMTU2LDE5LDI1NSwyNSw2NiwxMjIsMCwyMTQsMTYwLDIxNywyNTUsMiw0NSw2MiwyNTUsMTA2LDc5LDE0NiwyNTQsNTEsMTM3LDk5LDI1NSw4NywxMDAsMjMxLDI1NSwxNzUsMTQ1LDIzMiwyNTUsMTAxLDE4NCwxLDI1NSwxNzQsOSwxMjUsMCw4MiwzNywxNjEsMSwzNiwxMTQsMTQxLDI1NSw0OCwyMjIsMTQyLDI1NSwyNDUsMTg2LDE1NCwwLDUsMTc0LDIyMSwyNTQsNjMsMTE0LDE1NSwyNTUsMTM1LDU1LDE2MCwxLDgwLDMxLDEzNSwwLDEyNiwyNTAsMTc5LDEsMjM2LDIxOCw0NSwwLDIwLDI4LDE0NSwxLDE2LDE0Nyw3MywwLDI0OSwxODksMTMyLDEsMTcsMTg5LDE5MiwyNTUsMjIzLDE0MiwxOTgsMjU1LDcyLDIwLDE1LDI1NSwyNTAsNTMsMjM3LDI1NCwxNSwxMSwxOCwwLDI3LDIxMSwxMTMsMjU0LDIxMywxMDcsNTYsMjU1LDE3NCwxNDcsMTQ2LDI1NSw5NiwxMjYsNDgsMCwyMywxOTMsMTA5LDEsMzcsMTYyLDk0LDAsMTk5LDE1NywyNDksMjU0LDI0LDEyOCwxODcsMjU1LDIwNSw0OSwxNzgsMjU0LDkzLDE2NCw0MiwyNTUsNDMsMTE5LDIzNSwxLDg4LDE4MywyMzcsMjU1LDIxOCwyMTAsMSwyNTUsMTA3LDI1NCw0MiwwLDIzMCwxMCw5OSwyNTUsMTYyLDAsMjI2LDAsMjE5LDIzNyw5MSwwLDEyOSwxNzgsMjAzLDAsMjA4LDUwLDk1LDI1NCwyMDYsMjA4LDk1LDI1NSwyNDcsMTkxLDg5LDI1NCwxMTAsMjM0LDc5LDI1NSwxNjUsNjEsMjQzLDAsMjAsMTIyLDExMiwyNTUsMjQ2LDI0NiwxODUsMjU0LDEwMyw0LDEyMywwLDIzMyw5OSwyMzAsMSwyMTksOTEsMjUyLDI1NSwxOTksMjIyLDIyLDI1NSwxNzksMjQ1LDIzMywyNTUsMjExLDI0MSwyMzQsMCwxMTEsMjUwLDE5MiwyNTUsODUsODQsMTM2LDAsMTAxLDU4LDUwLDI1NSwxMzEsMTczLDE1NiwyNTQsMTE5LDQ1LDUxLDI1NSwxMTgsMjMzLDE2LDI1NCwyNDIsOTAsMjE0LDAsOTQsMTU5LDIxOSwxLDMsMywyMzQsMjU1LDk4LDc2LDkyLDI1NCw4MCw1NCwyMzAsMCw1LDIyOCwyMzEsMjU0LDUzLDI0LDIyMywyNTUsMTEzLDU2LDExOCwxLDIwLDEzMiwxLDI1NSwxNzEsMjEwLDIzNiwwLDU2LDI0MSwxNTgsMjU1LDE4NiwxMTUsMTksMjU1LDgsMjI5LDE3NCwwLDQ4LDQ0LDAsMSwxMTQsMTE0LDE2NiwyNTUsNiw3MywyMjYsMjU1LDIwNSw4OSwyNDQsMCwxMzcsMjI3LDc1LDEsMjQ4LDE3Myw1NiwwLDc0LDEyMCwyNDYsMjU0LDExOSwzLDExLDI1NSw4MSwxMjAsMTk4LDI1NSwxMzYsMTIyLDk4LDI1NSwxNDYsMjQxLDIyMSwxLDEwOSwxOTQsNzgsMjU1LDIyMywyNDEsNzAsMSwyMTQsMjAwLDE2OSwyNTUsOTcsMTkwLDQ3LDI1NSw0NywxMDMsMTc0LDI1NSw5OSw5Miw3MiwyNTQsMTE4LDIzMywxODAsMjU1LDE5MywzNSwyMzMsMjU0LDI2LDIyOSwzMiwyNTUsMjIyLDI1MiwxOTgsMCwyMDQsNDMsNzEsMjU1LDE5OSw4NCwxNzIsMCwxMzQsMTAyLDE5MCwwLDExMSwyMzgsOTcsMjU0LDIzMCw0MCwyMzAsMCwyMjcsMjA1LDY0LDI1NCwyMDAsMTIsMjI1LDAsMTY2LDI1LDIyMiwwLDExMyw2OSw1MSwyNTUsMTQzLDE1OSwyNCwwLDE2NywxODQsNzQsMCwyOSwyMjQsMTE2LDI1NCwxNTgsMjA4LDIzMywwLDE5MywxMTYsMTI2LDI1NSwyMTIsMTEsMTMzLDI1NSwyMiw1OCwxNDAsMSwyMDQsMzYsNTEsMjU1LDIzMiwzMCw0MywwLDIzNSw3MCwxODEsMjU1LDY0LDU2LDE0NiwyNTQsMTY5LDE4LDg0LDI1NSwyMjYsMSwxMywyNTUsMjAwLDUwLDE3NiwyNTUsNTIsMjEzLDI0NSwyNTQsMTY4LDIwOSw5NywwLDE5MSw3MSw1NSwwLDM0LDc4LDE1NiwwLDIzMiwxNDQsNTgsMSwxODUsNzQsMTg5LDAsMTg2LDE0MiwxNDksMjU0LDY0LDY5LDEyNywyNTUsMTYxLDIwMywxNDcsMjU1LDE3NiwxNTEsMTkxLDAsMTM2LDIzMSwyMDMsMjU0LDE2MywxODIsMTM3LDAsMTYxLDEyNiwyNTEsMjU0LDIzMywzMiw2NiwwLDY4LDIwNyw2NiwwLDMwLDI4LDM3LDAsOTMsMTE0LDk2LDEsMjU0LDkyLDI0NywyNTUsNDQsMTcxLDY5LDAsMjAyLDExOSwxMSwyNTUsMTg4LDExOCw1MCwxLDI1NSw4MywxMzYsMjU1LDcxLDgyLDI2LDAsNzAsMjI3LDIsMCwzMiwyMzUsMTIxLDEsMTgxLDQxLDE1NCwwLDcxLDEzNCwyMjksMjU0LDIwMiwyNTUsMzYsMCw0MSwxNTIsNSwwLDE1NCw2Myw3MywyNTUsMzQsMTgyLDEyNCwwLDEyMSwyMjEsMTUwLDI1NSwyNiwyMDQsMjEzLDEsNDEsMTcyLDg3LDAsOTAsMTU3LDE0NiwyNTUsMTA5LDEzMCwyMCwwLDcxLDEwNywyMDAsMjU1LDI0MywxMDIsMTg5LDAsMSwxOTUsMTQ1LDI1NCw0Niw4OCwxMTcsMCw4LDIwNiwyMjcsMCwxOTEsMTEwLDI1MywyNTUsMTA5LDEyOCwyMCwyNTQsMTM0LDg1LDUxLDI1NSwxMzcsMTc3LDExMiwxLDIxNiwzNCwyMiwyNTUsMTMxLDE2LDIwOCwyNTUsMTIxLDE0OSwxNzAsMCwxMTQsMTksMjMsMSwxNjYsODAsMzEsMjU1LDExMywyNDAsMTIyLDAsMjMyLDE3OSwyNTAsMCw2OCwxMTAsMTgwLDI1NCwyMTAsMTcwLDExOSwwLDIyMywxMDgsMTY0LDI1NSwyMDcsNzksMjMzLDI1NSwyNywyMjksMjI2LDI1NCwyMDksOTgsODEsMjU1LDc5LDY4LDcsMCwxMzEsMTg1LDEwMCwwLDE3MCwyOSwxNjIsMjU1LDE3LDE2MiwxMDcsMjU1LDU3LDIxLDExLDEsMTAwLDIwMCwxODEsMjU1LDEyNyw2NSwxNjYsMSwxNjUsMTM0LDIwNCwwLDEwNCwxNjcsMTY4LDAsMSwxNjQsNzksMCwxNDYsMTM1LDU5LDEsNzAsNTAsMTI4LDI1NSwxMDIsMTE5LDEzLDI1NCwyMjcsNiwxMzUsMCwxNjIsMTQyLDE3OSwyNTUsMTYwLDEwMCwyMjIsMCwyNywyMjQsMjE5LDEsMTU4LDkzLDE5NSwyNTUsMjM0LDE0MSwxMzcsMCwxNiwyNCwxMjUsMjU1LDIzOCwyMDYsNDcsMjU1LDk3LDE3LDk4LDI1NSwxMTYsMTEwLDEyLDI1NSw5NiwxMTUsNzcsMCw5MSwyMjcsMjMyLDI1NSwyNDgsMjU0LDc5LDI1NSw5MiwyMjksNiwyNTQsODgsMTk4LDEzOSwwLDIwNiw3NSwxMjksMCwyNTAsNzcsMjA2LDI1NSwxNDEsMjQ0LDEyMywxLDEzOCw2OSwyMjAsMCwzMiwxNTEsNiwxLDEzMSwxNjcsMjIsMjU1LDIzNyw2OCwxNjcsMjU0LDE5OSwxODksMTUwLDAsMTYzLDE3MSwxMzgsMjU1LDUxLDE4OCw2LDI1NSw5NSwyOSwxMzcsMjU0LDE0OCwyMjYsMTc5LDAsMTgxLDEwNywyMDgsMjU1LDEzNCwzMSw4MiwyNTUsMTUxLDEwMSw0NSwyNTUsMTI5LDIwMiwyMjUsMCwyMjQsNzIsMTQ3LDAsNDgsMTM4LDE1MSwyNTUsMTk1LDY0LDIwNiwyNTQsMjM3LDIxOCwxNTgsMCwxMDYsMjksMTM3LDI1NCwyNTMsMTg5LDIzMywyNTUsMTAzLDE1LDE3LDI1NSwxOTQsOTcsMjU1LDAsMTc4LDQ1LDE2OSwyNTQsMTk4LDIyNSwxNTUsMCwzOSw0OCwxMTcsMjU1LDEzNSwxMDYsMTE1LDAsOTcsMzgsMTgxLDAsMTUwLDQ3LDY1LDI1NSw4MywxMzAsMjI5LDI1NCwyNDYsMzgsMTI5LDAsOTIsMjM5LDE1NCwyNTQsOTEsOTksMTI3LDAsMTYxLDExMSwzMywyNTUsMjM4LDIxNywyNDIsMjU1LDEzMSwxODUsMTk1LDI1NSwyMTMsMTkxLDE1OCwyNTUsNDEsMTUwLDIxOCwwLDEzMiwxNjksMTMxLDAsODksODQsMjUyLDEsMTcxLDcwLDEyOCwyNTUsMTYzLDI0OCwyMDMsMjU0LDEsNTAsMTgwLDI1NSwxMjQsNzYsODUsMSwyNTEsMTExLDgwLDAsOTksNjYsMjM5LDI1NSwxNTQsMjM3LDE4MiwyNTUsMjIxLDEyNiwxMzMsMjU0LDc0LDIwNCw5OSwyNTUsNjUsMTQ3LDExOSwyNTUsOTksNTYsMTY3LDI1NSw3OSwyNDgsMTQ5LDI1NSwxMTYsMTU1LDIyOCwyNTUsMjM3LDQzLDE0LDI1NCw2OSwxMzcsMTEsMjU1LDIyLDI1MCwyNDEsMSw5MSwxMjIsMTQzLDI1NSwyMDUsMjQ5LDI0MywwLDIxMiwyNiw2MCwyNTUsNDgsMTgyLDE3NiwxLDQ4LDIzLDE5MSwyNTUsMjAzLDEyMSwxNTIsMjU0LDQ1LDc0LDIxMywyNTUsNjIsOTAsMTgsMjU0LDI0NSwxNjMsMjMwLDI1NSwxODUsMTA2LDExNiwyNTUsODMsMzUsMTU5LDAsMTIsMzMsMiwyNTUsODAsMzQsNjIsMCwxNiw4NywxNzQsMjU1LDE3MywxMDEsODUsMCwyMDIsMzYsODEsMjU0LDE2MCw2OSwyMDQsMjU1LDY0LDIyNSwxODcsMCw1OCwyMDYsOTQsMCw4NiwxNDQsNDcsMCwyMjksODYsMjQ1LDAsNjMsMTQ1LDE5MCwxLDM3LDUsMzksMCwxMDksMjUxLDI2LDAsMTM3LDE0NywyMzQsMCwxNjIsMTIxLDE0NSwyNTUsMTQ0LDExNiwyMDYsMjU1LDE5NywyMzIsMTg1LDI1NSwxODMsMTkwLDE0MCwyNTUsNzMsMTIsMjU0LDI1NSwxMzksMjAsMjQyLDI1NSwxNzAsOTAsMjM5LDI1NSw5Nyw2NiwxODcsMjU1LDI0NSwxODEsMTM1LDI1NCwyMjIsMTM2LDUyLDAsMjQ1LDUsNTEsMjU0LDIwMyw0Nyw3OCwwLDE1MiwxMDEsMjE2LDAsNzMsMjMsMTI1LDAsMjU0LDk2LDMzLDEsMjM1LDIxMCw3MywyNTUsNDMsMjA5LDg4LDEsNywxMjksMTA5LDAsMTIyLDEwNCwyMjgsMjU0LDE3MCwyNDIsMjAzLDAsMjQyLDIwNCwxMzUsMjU1LDIwMiwyOCwyMzMsMjU1LDY1LDYsMTI3LDAsMTU5LDE0NCw3MSwwLDEwMCwxNDAsOTUsMCw3OCwxNTAsMTMsMCwyNTEsMTA3LDExOCwxLDE4Miw1OCwxMjUsMjU1LDEsMzgsMTA4LDI1NSwxNDEsMTg5LDIwOSwyNTUsOCwxNTUsMTI1LDEsMTEzLDE2Myw5MSwyNTUsMTIxLDc5LDE5MCwyNTUsMTM0LDIzOSwxMDgsMjU1LDc2LDQ3LDI0OCwwLDE2MywyMjgsMjM5LDAsMTcsMTExLDEwLDAsODgsMTQ5LDc1LDI1NSwyMTUsMjM1LDIzOSwwLDE2NywxNTksMjQsMjU1LDQ3LDE1MSwxMDgsMjU1LDEwNywyMDksMTg4LDAsMjMzLDIzMSw5OSwyNTQsMjgsMjAyLDE0OCwyNTUsMTc0LDM1LDEzOCwyNTUsMTEwLDI0LDY4LDI1NSwyLDY5LDE4MSwwLDEwNywxMDIsODIsMCwxMDIsMjM3LDcsMCw5MiwzNiwyMzcsMjU1LDIyMSwxNjIsODMsMSw1NSwyMDIsNiwyNTUsMTM1LDIzNCwxMzUsMjU1LDI0LDI1MCwyMjIsMCw2NSw5NCwxNjgsMjU0LDI0NSwyNDgsMjEwLDI1NSwxNjcsMTA4LDIwMSwyNTQsMjU1LDE2MSwxMTEsMCwyMDUsOCwyNTQsMCwxMzYsMTMsMTE2LDAsMTAwLDE3NiwxMzIsMjU1LDQzLDIxNSwxMjYsMjU1LDE3NywxMzMsMTMwLDI1NSwxNTgsNzksMTQ4LDAsNjcsMjI0LDM3LDEsMTIsMjA2LDIxLDI1NSw2MiwzNCwxMTAsMSwyMzcsMTA0LDE3NSwyNTUsODAsMTMyLDExMSwyNTUsMTQyLDE3NCw3MiwwLDg0LDIyOSwxODAsMjU0LDEwNSwxNzksMTQwLDAsNjQsMjQ4LDE1LDI1NSwyMzMsMTM4LDE2LDAsMjQ1LDY3LDEyMywyNTQsMjE4LDEyMSwyMTIsMjU1LDYzLDk1LDIxOCwxLDIxMywxMzMsMTM3LDI1NSwxNDMsMTgyLDgyLDI1NSw0OCwyOCwxMSwwLDI0NCwxMTQsMTQxLDEsMjA5LDE3NSw3NiwyNTUsMTU3LDE4MSwxNTAsMjU1LDE4NiwyMjksMywyNTUsMTY0LDE1NywxMTEsMSwyMzEsMTg5LDEzOSwwLDExOSwyMDIsMTkwLDI1NSwyMTgsMTA2LDY0LDI1NSw2OCwyMzUsNjMsMjU0LDk2LDI2LDE3MiwyNTUsMTg3LDQ3LDExLDEsMjE1LDE4LDI1MSwyNTUsODEsODQsODksMCw2OCw1OCwxMjgsMCw5NCwxMTMsNSwxLDkyLDEyOSwyMDgsMjU1LDk3LDE1LDgzLDI1NCw5LDI4LDE4OCwwLDIzOSw5LDE2NCwwLDYwLDIwNSwxNTIsMCwxOTIsMTYzLDk4LDI1NSwxODQsMTgsNjAsMCwyMTcsMTgyLDEzOSwwLDEwOSw1OSwxMjAsMjU1LDQsMTkyLDI1MSwwLDE2OSwyMTAsMjQwLDI1NSwzNywxNzIsOTIsMjU0LDE0OCwyMTEsMjQ1LDI1NSwxNzksNjUsNTIsMCwyNTMsMTMsMTE1LDAsMTg1LDE3NCwyMDYsMSwxMTQsMTg4LDE0OSwyNTUsMjM3LDkwLDE3MywwLDQzLDE5OSwxOTIsMjU1LDg4LDEwOCwxMTMsMCw1MiwzNSw3NiwwLDY2LDI1LDE0OCwyNTUsMjIxLDQsNywyNTUsMTUxLDI0MSwxMTQsMjU1LDE5MCwyMDksMjMyLDAsOTgsNTAsMTk5LDAsMTUxLDE1MCwyMTMsMjU1LDE4LDc0LDM2LDEsNTMsNDAsNywwLDE5LDEzNSw2NSwyNTUsMjYsMTcyLDY5LDAsMTc0LDIzNyw4NSwwLDk5LDk1LDQxLDAsMyw1NiwxNiwwLDM5LDE2MCwxNzcsMjU1LDIwMCwxMDYsMjE4LDI1NCwxODUsNjgsODQsMjU1LDkxLDE4Niw2MSwyNTQsNjcsMTQzLDE0MSwyNTUsMTMsMjQ0LDE2NiwyNTUsOTksMTE0LDE5OCwwLDE5OSwxMTAsMTYzLDI1NSwxOTMsMTgsMTg2LDAsMTI0LDIzOSwyNDYsMSwxMTAsNjgsMjIsMCwyLDIzNSw0NiwxLDIxMiw2MCwxMDcsMCwxMDUsNDIsMTA1LDEsMTQsMjMwLDE1MiwwLDcsNSwxMzEsMCwxNDEsMTA0LDE1NCwyNTUsMjEzLDMsNiwwLDEzMSwyMjgsMTYyLDI1NSwxNzksMTAwLDI4LDEsMjMxLDEyMyw4NSwyNTUsMjA2LDE0LDIyMywxLDI1Myw5NiwyMzAsMCwzOCwxNTIsMTQ5LDEsOTgsMTM3LDEyMiwwLDIxNCwyMDUsMywyNTUsMjI2LDE1MiwxNzksMjU1LDYsMTMzLDEzNywwLDE1OCw2OSwxNDAsMjU1LDExMywxNjIsMTU0LDI1NSwxODAsMjQzLDE3MiwyNTUsMjcsMTg5LDExNSwyNTUsMTQzLDQ2LDIyMCwyNTUsMjEzLDEzNCwyMjUsMjU1LDEyNiwyOSw2OSwwLDE4OCw0MywxMzcsMSwyNDIsNzAsOSwwLDkwLDIwNCwyNTUsMjU1LDIzMSwxNzAsMTQ3LDAsMjMsNTYsMTksMjU0LDU2LDEyNSwxNTcsMjU1LDQ4LDE3OSwyMTgsMjU1LDc5LDE4MiwyNTMsMjU1LDM4LDIxMiwxOTEsMSw0MSwyMzUsMTI0LDAsOTYsMTUxLDI4LDAsMTM1LDE0OCwxOTAsMCwyMDUsMjQ5LDM5LDI1NCw1Miw5NiwxMzYsMjU1LDIxMiw0NCwxMzYsMjU1LDY3LDIwOSwxMzEsMjU1LDI1MiwxMzAsMjMsMjU1LDIxOSwxMjgsMjAsMjU1LDE5OCwxMjksMTE4LDAsMTA4LDEwMSwxMSwwLDE3OCw1LDE0NiwxLDYyLDcsMTAwLDI1NSwxODEsMjM2LDk0LDI1NCwyOCwyNiwxNjQsMCw3NiwyMiwxMTIsMjU1LDEyMCwxMDIsNzksMCwyMDIsMTkyLDIyOSwxLDIwMCwxNzYsMjE1LDAsNDEsNjQsMjQ0LDI1NSwyMDYsMTg0LDc4LDAsMTY3LDQ1LDYzLDEsMTYwLDM1LDAsMjU1LDU5LDEyLDE0MiwyNTUsMjA0LDksMTQ0LDI1NSwyMTksOTQsMjI5LDEsMTIyLDI3LDExMiwwLDE4OSwxMDUsMTA5LDI1NSw2NCwyMDgsNzQsMjU1LDI1MSwxMjcsNTUsMSwyLDIyNiwxOTgsMCw0NCw3NiwyMDksMCwxNTEsMTUyLDc3LDI1NSwyMTAsMjMsNDYsMSwyMDEsMTcxLDY5LDI1NSw0NCwyMTEsMjMxLDAsMTkwLDM3LDIyNCwyNTUsMjQ1LDE5Niw2MiwyNTUsMTY5LDE4MSwyMjIsMjU1LDM0LDIxMSwxNywwLDExOSwyNDEsMTk3LDI1NSwyMjksMzUsMTUyLDEsMjEsNjksNDAsMjU1LDE3OCwyMjYsMTYxLDAsMTQ4LDE3OSwxOTMsMCwyMTksMTk0LDI1NCwxLDQwLDIwNiw1MSwyNTUsMjMxLDkyLDI1MCwxLDY3LDE1MywxNzAsMCwyMSwxNDgsMjQxLDAsMTcwLDY5LDgyLDI1NSwxMjEsMTgsMjMxLDI1NSw5MiwxMTQsMywwLDE4NCw2MiwyMzAsMCwyMjUsMjAxLDg3LDI1NSwxNDYsOTYsMTYyLDI1NSwxODEsMjQyLDIyMCwwLDE3MywxODcsMjIxLDEsMjI2LDYyLDE3MCwyNTUsNTYsMTI2LDIxNywxLDExNywxMywyMjcsMjU1LDE3OSw0NCwyMzksMCwxNTcsMTQxLDE1NSwyNTUsMTQ0LDIyMSw4MywwLDIzNSwyMDksMjA4LDAsNDIsMTcsMTY1LDEsMjUxLDgxLDEzMywwLDEyNCwyNDUsMjAxLDI1NCw5NywyMTEsMjQsMjU1LDgzLDIxNCwxNjYsMCwxNTQsMzYsOSwyNTUsMjQ4LDQ3LDEyNywwLDkwLDIxOSwxNDAsMjU1LDE2MSwyMTcsMzgsMjU0LDIxMiwxNDcsNjMsMjU1LDY2LDg0LDE0OCwxLDIwNywzLDEsMCwyMzAsMTM0LDg5LDEsMTI3LDc4LDEyMiwyNTUsMjI0LDE1NSwxLDI1NSw4MiwxMzYsNzQsMCwxNzgsMTU2LDIwOCwyNTUsMTg2LDI1LDQ5LDI1NSwyMjIsMywyMTAsMSwyMjksMTUwLDE5MCwyNTUsODUsMTYyLDUyLDI1NSw0MSw4NCwxNDEsMjU1LDczLDEyMyw4NCwyNTQsOTMsMTcsMTUwLDAsMTE5LDE5LDI4LDEsMzIsMjIsMjE1LDI1NSwyOCwyMywyMDQsMjU1LDE0MiwyNDEsNTIsMjU1LDIyOCw1MiwxMjUsMCwyOSw3NiwyMDcsMCwyMTUsMTY3LDI1MCwyNTQsMTc1LDE2NCwyMzAsMCw1NSwyMDcsMTA1LDEsMTA5LDE4NywyNDUsMjU1LDE2MSw0NCwyMjAsMSw0MSwxMDEsMTI4LDI1NSwxNjcsMTYsOTQsMCw5MywyMTQsMTA3LDI1NSwxMTgsNzIsMCwyNTQsODAsNjEsMjM0LDI1NSwxMjEsMTc1LDEyNSwwLDEzOSwxNjksMjUxLDAsOTcsMzksMTQ3LDI1NCwyNTAsMTk2LDQ5LDI1NSwxNjUsMTc5LDExMCwyNTQsMjIzLDcwLDE4NywyNTUsMjIsMTQyLDEyNSwxLDE1NCwxNzksMTM4LDI1NSwxMTgsMTc2LDQyLDEsMTAsMTc0LDE1MywwLDE1Niw5MiwxMDIsMCwxNjgsMTMsMTYxLDI1NSwxNDMsMTYsMzIsMCwyNTAsMTk3LDE4MCwyNTUsMjAzLDE2Myw0NCwxLDg3LDMyLDM2LDAsMTYxLDE1MywyMCwyNTUsMTIzLDI1MiwxNSwwLDI1LDIyNyw4MCwwLDYwLDg4LDE0MiwwLDE3LDIyLDIwMSwxLDE1NCwyMDUsNzcsMjU1LDM5LDYzLDQ3LDAsOCwxMjIsMTQxLDAsMTI4LDIzLDE4MiwyNTQsMjA0LDM5LDE5LDI1NSw0LDExMiwyOSwyNTUsMjMsMzYsMTQwLDI1NSwyMTAsMjM0LDExNiwyNTQsNTMsNTAsNjMsMjU1LDEyMSwxNzEsMTA0LDI1NSwxNjAsMjE5LDk0LDAsODcsODIsMTQsMjU0LDIzMSw0Miw1LDAsMTY1LDEzOSwxMjcsMjU0LDg2LDc4LDM4LDAsMTMwLDYwLDY2LDI1NCwyMDMsMzAsNDUsMjU1LDQ2LDE5NiwxMjIsMSwyNDksNTMsMTYyLDI1NSwxMzYsMTQzLDEwMywyNTQsMjE1LDIxMCwxMTQsMCwyMzEsNywxNjAsMjU0LDE2OSwxNTIsNDIsMjU1LDExMSw0NSwyNDYsMCwxNDIsMTMxLDEzNSwyNTUsMTMxLDcxLDIwNCwyNTUsMzYsMjI2LDExLDAsMCwyOCwyNDIsMjU1LDIyNSwxMzgsMjEzLDI1NSwyNDcsNDYsMjE2LDI1NCwyNDUsMywxODMsMCwxMDgsMjUyLDc0LDEsMjA2LDI2LDQ4LDI1NSwyMDUsNTQsMjQ2LDI1NSwyMTEsMTk4LDM2LDI1NSwxMjEsMzUsNTAsMCw1MiwyMTYsMjAyLDI1NSwzOCwxMzksMTI5LDI1NCwyNDIsNzMsMTQ4LDAsNjcsMjMxLDE0MSwyNTUsNDIsNDcsMjA0LDAsNzgsMTE2LDI1LDEsNCwyMjUsMTkxLDI1NSw2LDE0NywyMjgsMCw1OCw4OCwxNzcsMCwxMjIsMTY1LDIyOSwyNTUsMjUyLDgzLDIwMSwyNTUsMjI0LDE2Nyw5NiwxLDE3NywxODQsMTU4LDI1NSwyNDIsMTA1LDE3OSwxLDI0OCwxOTgsMjQwLDAsMTMzLDY2LDIwMywxLDI1NCwzNiw0NywwLDQ1LDI0LDExNSwyNTUsMTE5LDYyLDI1NCwwLDE5NiwyMjUsMTg2LDI1NCwxMjMsMTQxLDE3MiwwLDI2LDg1LDQxLDI1NSwyMjYsMTExLDE4MywwLDIxMywyMzEsMTUxLDAsNCw1OSw3LDI1NSwyMzgsMTM4LDE0OCwwLDY2LDE0NywzMywyNTUsMzEsMjQ2LDE0MSwyNTUsMjA5LDE0MSwxMTYsMjU1LDEwNCwxMTIsMzEsMCw4OCwxNjEsMTcyLDAsODMsMjE1LDIzMCwyNTQsNDcsMTExLDE1MSwwLDQ1LDM4LDUyLDEsMTMyLDQ1LDIwNCwwLDEzOCwxMjgsMTA5LDI1NCwyMzMsMTE3LDEzNCwyNTUsMjQzLDE5MCwxNzMsMjU0LDI0MSwyMzYsMjQwLDAsODIsMTI3LDIzNiwyNTQsNDAsMjIzLDE2MSwyNTUsMTEwLDE4MiwyMjUsMjU1LDEyMywxNzQsMjM5LDAsMTM1LDI0MiwxNDUsMSw1MSwyMDksMTU0LDAsMTUwLDMsMTE1LDI1NCwyMTcsMTY0LDI1MiwyNTUsNTUsMTU2LDY5LDEsODQsOTQsMjU1LDI1NSwyMzIsNzMsNDUsMSwyMCwxOSwyMTIsMjU1LDk2LDE5Nyw1OSwyNTQsOTYsMjUxLDMzLDAsMzgsMTk5LDczLDEsNjQsMTcyLDI0NywyNTUsMTE3LDExNiw1NiwyNTUsMjI4LDE3LDE4LDAsNjIsMTM4LDEwMywxLDI0NiwyMjksMTY0LDI1NSwyNDQsMTE4LDIwMSwyNTQsODYsMzIsMTU5LDI1NSwxMDksMzQsMTM3LDEsODUsMjExLDE4NiwwLDEwLDE5MywxOTMsMjU0LDEyMiwxOTQsMTc3LDAsMTIyLDIzOCwxMDIsMjU1LDE2MiwyMTgsMTcxLDAsMTA4LDIxNywxNjEsMSwxNTgsMTcwLDM0LDAsMTc2LDQ3LDE1NSwxLDE4MSwyMjgsMTEsMjU1LDgsMTU2LDAsMCwxNiw3NSw5MywwLDIwNiw5OCwyNTUsMSw1OCwxNTQsMzUsMCwxMiwyNDMsMTg0LDI1NCw2NywxMTcsNjYsMjU1LDIzMCwyMjksMTIzLDAsMjAxLDQyLDExMCwwLDEzNCwyMjgsMTc4LDI1NCwxODYsMTA4LDExOCwyNTUsNTgsMTksMTU0LDI1NSw4MiwxNjksNjIsMjU1LDExNCwxNDMsMTE1LDEsMjM5LDE5Niw1MCwyNTUsMTczLDQ4LDE5MywyNTUsMTQ3LDIsODQsMjU1LDE1MCwxMzQsMTQ3LDI1NCw5NSwyMzIsNzMsMCwxMDksMjI3LDUyLDI1NCwxOTEsMTM3LDEwLDAsNDAsMjA0LDMwLDI1NCw3Niw1Miw5NywyNTUsMTY0LDIzNSwxMjYsMCwyNTQsMTI0LDE4OCwwLDc0LDE4MiwyMSwxLDEyMSwyOSwzNSwyNTUsMjQxLDMwLDcsMjU0LDg1LDIxOCwyMTQsMjU1LDcsODQsMTUwLDI1NCw4MSwyNywxMTcsMjU1LDE2MCwxNTksMTUyLDI1NCw2NiwyNCwyMjEsMjU1LDIyNywxMCw2MCwxLDE0MSwxMzUsMTAyLDAsMjA4LDE4OSwxNTAsMSwxMTcsMTc5LDkyLDAsMTMyLDIyLDEzNiwyNTUsMTIwLDE5OSwyOCwwLDIxLDEyOSw3OSwyNTQsMTgyLDksNjUsMCwyMTgsMTYzLDE2OSwwLDI0NiwxNDcsMTk4LDI1NSwxMDcsMzgsMTQ0LDEsNzgsMTc1LDIwNSwyNTUsMjE0LDUsMjUwLDI1NCw0Nyw4OCwyOSwyNTUsMTY0LDQ3LDIwNCwyNTUsNDMsNTUsNiwyNTUsMTMxLDEzNCwyMDcsMjU0LDExNiwxMDAsMjE0LDAsOTYsMTQwLDc1LDEsMTA2LDIyMCwxNDQsMCwxOTUsMzIsMjgsMSwxNzIsODEsNSwyNTUsMTk5LDE3OSw1MiwyNTUsMzcsODQsMjAzLDAsMTcwLDExMiwxNzQsMCwxMSw0LDkxLDAsNjksMjQ0LDI3LDEsMTE3LDEzMSw5MiwwLDMzLDE1MiwxNzUsMjU1LDE0MCwxNTMsMTA3LDI1NSwyNTEsMTM1LDQzLDI1NCw4NywxMzgsNCwyNTUsMTk4LDIzNCwxNDcsMjU0LDEyMSwxNTIsODQsMjU1LDIwNSwxMDEsMTU1LDEsMTU3LDksMjUsMCw3MiwxMDYsMTcsMjU0LDEwOCwxNTMsMCwyNTUsMTg5LDIyOSwxODYsMCwxOTMsOCwxNzYsMjU1LDE3NCwxNDksMjA5LDAsMjM4LDEzMCwyOSwwLDIzMywyMTQsMTI2LDEsNjEsMjI2LDEwMiwwLDU3LDE2Myw0LDEsMTk4LDExMSw1MSwyNTUsNDUsNzksNzgsMSwxMTUsMjEwLDEwLDI1NSwyMTgsOSwyNSwyNTUsMTU4LDEzOSwxOTgsMjU1LDIxMSw4MiwxODcsMjU0LDgwLDEzMyw4MywwLDE1NywxMjksMjMwLDEsMjQzLDEzMywxMzQsMjU1LDQwLDEzNiwxNiwwLDc3LDEwNyw3OSwyNTUsMTgzLDg1LDkyLDEsMTc3LDIwNCwyMDIsMCwxNjMsNzEsMTQ3LDI1NSwxNTIsNjksMTkwLDAsMTcyLDUxLDE4OCwxLDI1MCwyMTAsMTcyLDI1NSwyMTEsMjQyLDExMywxLDg5LDg5LDI2LDI1NSw2NCw2NiwxMTEsMjU0LDExNiwxNTIsNDIsMCwxNjEsMzksMjcsMjU1LDU0LDgwLDI1NCwwLDEwNiwyMDksMTE1LDEsMTAzLDEyNCw5NywwLDIyMSwyMzAsOTgsMjU1LDMxLDIzMSw2LDAsMTc4LDE5MiwxMjAsMjU0LDE1LDIxNywyMDMsMjU1LDEyNCwxNTgsNzksMCwxMTIsMTQ1LDI0NywwLDkyLDI1MCw0OCwxLDE2MywxODEsMTkzLDI1NSwzNyw0NywxNDIsMjU0LDE0NCwxODksMTY1LDI1NSw0NiwxNDYsMjQwLDAsNiw3NSwxMjgsMCw0MSwxNTcsMjAwLDI1NCw4NywxMjEsMjEzLDAsMSwxMTMsMjM2LDAsNSw0NSwyNTAsMCwxNDQsMTIsODIsMCwzMSwxMDgsMjMxLDAsMjI1LDIzOSwxMTksMjU1LDE2Nyw3LDE4OSwyNTUsMTg3LDIyOCwxMzIsMjU1LDExMCwxODksMzQsMCw5NCw0NCwyMDQsMSwxNjIsNTIsMTk3LDAsNzgsMTg4LDI0MSwyNTQsNTcsMjAsMTQxLDAsMjQ0LDE0Niw0NywxLDIwNiwxMDAsNTEsMCwxMjUsMTA3LDE0OCwyNTQsMjcsMTk1LDc3LDAsMTUyLDI1Myw5MCwxLDcsMTQzLDE0NCwyNTUsNTEsMzcsMzEsMCwzNCwxMTksMzgsMjU1LDcsMTk3LDExOCwwLDE1MywxODgsMjExLDAsMTUxLDIwLDExNiwyNTQsMjQ1LDY1LDUyLDI1NSwxODAsMjUzLDExMCwxLDQ3LDE3NywyMDksMCwxNjEsOTksMTcsMjU1LDExOCwyMjIsMjAyLDAsMTI1LDE3OSwyNTIsMSwxMjMsNTQsMTI2LDI1NSwxNDUsNTcsMTkxLDAsNTUsMTg2LDEyMSwwLDEwLDI0MywxMzgsMCwyMDUsMjExLDIyOSwyNTUsMTI1LDE1NiwyNDEsMjU0LDE0OCwxNTYsMTg1LDI1NSwyMjcsMTksMTg4LDI1NSwxMjQsNDEsMzIsMjU1LDMxLDM0LDIwNiwyNTQsMTcsNTcsODMsMCwyMDQsMjIsMzcsMjU1LDQyLDk2LDk4LDAsMTE5LDEwMiwxODQsMSwzLDE5MCwyOF0sXCJpOFwiLEFMTE9DX05PTkUsUnVudGltZS5HTE9CQUxfQkFTRSsyMDQ4MCk7YWxsb2NhdGUoWzExMCw4MiwyMTgsMjU1LDIwMCwyMDQsMTkyLDI1NSwyMDEsMTQ1LDExOCwwLDExNywyMDQsMTQ2LDAsMTMyLDMyLDk4LDEsMTkyLDE5NCwxMjEsMCwxMDYsMTYxLDI0OCwxLDIzNyw4OCwxMjQsMCwyMywyMTIsMjYsMCwyMDUsMTcxLDkwLDI1NSwyNDgsNDgsMjE2LDEsMTQxLDM3LDIzMCwyNTUsMTI0LDIwMywwLDI1NCwxNTgsMTY4LDMwLDI1NSwyMTQsMjQ4LDIxLDAsMTEyLDE4Nyw3LDI1NSw3NSwxMzMsMjM5LDI1NSw3NCwyMjcsMjQzLDI1NSwyNTAsMTQ3LDcwLDAsMjE0LDEyMCwxNjIsMCwxNjcsOSwxNzksMjU1LDIyLDE1OCwxOCwwLDIxOCw3NywyMDksMSw5NywxMDksODEsMjU1LDI0NCwzMywxNzksMjU1LDU3LDUyLDU3LDI1NSw2NSwxNzIsMjEwLDI1NSwyNDksNzEsMjA5LDI1NSwxNDIsMTY5LDIzOCwwLDE1OCwxODksMTUzLDI1NSwxNzQsMjU0LDEwMywyNTQsOTgsMzMsMTQsMCwxNDEsNzYsMjMwLDI1NSwxMTMsMTM5LDUyLDI1NSwxNSw1OCwyMTIsMCwxNjgsMjE1LDIwMSwyNTUsMjQ4LDIwNCwyMTUsMSwyMjMsNjgsMTYwLDI1NSw1NywxNTQsMTgzLDI1NCw0NywyMzEsMTIxLDAsMTA2LDE2NiwxMzcsMCw4MSwxMzYsMTM4LDAsMTY1LDQzLDUxLDAsMjMxLDEzOSw2MSwwLDU3LDk1LDU5LDI1NCwxMTgsOTgsMjUsMjU1LDE1MSw2MywyMzYsMSw5NCwxOTAsMjUwLDI1NSwxNjksMTg1LDExNCwxLDUsMjUwLDU4LDI1NSw3NSwxMDUsOTcsMSwyMTUsMjIzLDEzNCwwLDExMyw5OSwxNjMsMSwxMjgsNjIsMTEyLDAsOTksMTA2LDE0NywwLDE2MywxOTUsMTAsMCwzMywyMDUsMTgyLDAsMjE0LDE0LDE3NCwyNTUsMTI5LDM4LDIzMSwyNTUsNTMsMTgyLDIyMywwLDk4LDQyLDE1OSwyNTUsMjQ3LDEzLDQwLDAsMTg4LDIxMCwxNzcsMSw2LDIxLDAsMjU1LDI1NSw2MSwxNDgsMjU0LDEzNyw0NSwxMjksMjU1LDg5LDI2LDExNiwyNTQsMTI2LDM4LDExNCwwLDI1MSw1MCwyNDIsMjU0LDEyMSwxMzQsMTI4LDI1NSwyMDQsMjQ5LDE2NywyNTQsMTY1LDIzNSwyMTUsMCwyMDIsMTc3LDI0MywwLDEzMywxNDEsNjIsMCwyNDAsMTMwLDE5MCwxLDExMCwxNzUsMjU1LDAsMCwyMCwxNDYsMSwzNywyMTAsMTIxLDI1NSw3LDM5LDEzMCwwLDE0MiwyNTAsODQsMjU1LDE0MSwyMDAsMjA3LDAsOSw5NSwxMDQsMjU1LDExLDI0NCwxNzQsMCwxMzQsMjMyLDEyNiwwLDE2NywxLDEyMywyNTQsMTYsMTkzLDE0OSwyNTUsMjMyLDIzMywyMzksMSwyMTMsNzAsMTEyLDI1NSwyNTIsMTE2LDE2MCwyNTQsMjQyLDIyMiwyMjAsMjU1LDIwNSw4NSwyMjcsMCw3LDE4NSw1OCwwLDExOCwyNDcsNjMsMSwxMTYsNzcsMTc3LDI1NSw2MiwyNDUsMjAwLDI1NCw2MywxOCwzNywyNTUsMTA3LDUzLDIzMiwyNTQsNTAsMjIxLDIxMSwwLDE2MiwyMTksNywyNTQsMiw5NCw0MywwLDE4Miw2MiwxODIsMjU0LDE2MCw3OCwyMDAsMjU1LDEzNSwxNDAsMTcwLDAsMjM1LDE4NCwyMjgsMCwxNzUsNTMsMTM4LDI1NCw4MCw1OCw3NywyNTUsMTUyLDIwMSwyLDEsNjMsMTk2LDM0LDAsNSwzMCwxODQsMCwxNzEsMTc2LDE1NCwwLDEyMSw1OSwyMDYsMCwzOCw5OSwzOSwwLDE3Miw4MCw3NywyNTQsMCwxMzQsMTUxLDAsMTg2LDMzLDI0MSwyNTQsOTQsMjUzLDIyMywyNTUsNDQsMTE0LDI1MiwwLDEwOCwxMjYsNTcsMjU1LDIwMSw0MCwxMywyNTUsMzksMjI5LDI3LDI1NSwzOSwyMzksMjMsMSwxNTEsMTIxLDUxLDI1NSwxNTMsMTUwLDI0OCwwLDEwLDIzNCwxNzQsMjU1LDExOCwyNDYsNCwyNTQsMjAwLDI0NSwzOCwwLDY5LDE2MSwyNDIsMSwxNiwxNzgsMTUwLDAsMTEzLDU2LDEzMCwwLDE3MSwzMSwxMDUsMCwyNiw4OCwxMDgsMjU1LDQ5LDQyLDEwNiwwLDI1MSwxNjksNjYsMCw2OSw5MywxNDksMCwyMCw1NywyNTQsMCwxNjQsMjUsMTExLDAsOTAsMTg4LDkwLDI1NSwyMDQsNCwxOTcsMCw0MCwyMTMsNTAsMSwyMTIsOTYsMTMyLDI1NSw4OCwxMzgsMTgwLDI1NCwyMjgsMTQ2LDEyNCwyNTUsMTg0LDI0NiwyNDcsMCw2NSwxMTcsODYsMjU1LDI1MywxMDIsMjEwLDI1NCwyNTQsMTIxLDM2LDAsMTM3LDExNSwzLDI1NSw2MCwyNCwyMTYsMCwxMzQsMTgsMjksMCw1OSwyMjYsOTcsMCwxNzYsMTQyLDcxLDAsNywyMDksMTYxLDAsMTg5LDg0LDUxLDI1NCwxNTUsMjUwLDcyLDAsMjEzLDg0LDIzNSwyNTUsNDUsMjIyLDIyNCwwLDIzOCwxNDgsMTQzLDI1NSwxNzAsNDIsNTMsMjU1LDc4LDE2NywxMTcsMCwxODYsMCw0MCwyNTUsMTI1LDE3NywxMDMsMjU1LDY5LDIyNSw2NiwwLDIyNyw3LDg4LDEsNzUsMTcyLDYsMCwxNjksNDUsMjI3LDEsMTYsMzYsNzAsMjU1LDUwLDIsOSwyNTUsMTM5LDE5MywyMiwwLDE0MywxODMsMjMxLDI1NCwyMTgsNjksNTAsMCwyMzYsNTYsMTYxLDEsMjEzLDEzMSw0MiwwLDEzOCwxNDUsNDQsMjU0LDEzNiwyMjksNDAsMjU1LDQ5LDYzLDM1LDI1NSw2MSwxNDUsMjQ1LDI1NSwxMDEsMTkyLDIsMjU0LDIzMiwxNjcsMTEzLDAsMTUyLDEwNCwzOCwxLDEyMSwxODUsMjE4LDAsMTIxLDEzOSwyMTEsMjU0LDExOSwyNDAsMzUsMCw2NSwxODksMjE3LDI1NCwxODcsMTc5LDE2MiwyNTUsMTYwLDE4NywyMzAsMCw2MiwyNDgsMTQsMjU1LDYwLDc4LDk3LDAsMjU1LDI0NywxNjMsMjU1LDIyNSw1OSw5MSwyNTUsMTA3LDcxLDU4LDI1NSwyNDEsNDcsMzMsMSw1MCwxMTcsMjM2LDAsMjE5LDE3Nyw2MywyNTQsMjQ0LDkwLDE3OSwwLDM1LDE5NCwyMTUsMjU1LDE4OSw2Nyw1MCwyNTUsMjMsMTM1LDEyOSwwLDEwNCwxODksMzcsMjU1LDE4NSw1NywxOTQsMCwzNSw2MiwyMzEsMjU1LDIyMCwyNDgsMTA4LDAsMTIsMjMxLDE3OCwwLDE0Myw4MCw5MSwxLDEzMSw5MywxMDEsMjU1LDE0NCwzOSwyLDEsMjU1LDI1MCwxNzgsMCw1LDE3LDIzNiwyNTQsMTM5LDMyLDQ2LDAsMjA0LDE4OCwzOCwyNTQsMjQ1LDExNSw1MiwyNTUsMTkxLDExMyw3MywyNTQsMTkxLDEwOCw2OSwyNTUsMjIsNjksMjQ1LDEsMjMsMjAzLDE3OCwwLDE3MCw5OSwxNzAsMCw2NSwyNDgsMTExLDAsMzcsMTA4LDE1MywyNTUsNjQsMzcsNjksMCwwLDg4LDYyLDI1NCw4OSwxNDgsMTQ0LDI1NSwxOTEsNjgsMjI0LDEsMjQxLDM5LDUzLDAsNDEsMjAzLDIzNywyNTUsMTQ1LDEyNiwxOTQsMjU1LDIyMSw0MiwyNTMsMjU1LDI1LDk5LDE1MSwwLDk3LDI1MywyMjMsMSw3NCwxMTUsNDksMjU1LDYsMTc1LDcyLDI1NSw1OSwxNzYsMjAzLDAsMTI0LDE4MywyNDksMSwyMjgsMjI4LDk5LDAsMTI5LDEyLDIwNywyNTQsMTY4LDE5MiwxOTUsMjU1LDIwNCwxNzYsMTYsMjU0LDE1MiwyMzQsMTcxLDAsNzcsMzcsODUsMjU1LDMzLDEyMCwxMzUsMjU1LDE0MiwxOTQsMjI3LDEsMzEsMjE0LDU4LDAsMjEzLDE4NywxMjUsMjU1LDIzMiw0Niw2MCwyNTUsMTkwLDExNiw0MiwyNTQsMTUxLDE3OCwxOSwyNTUsNTEsNjIsMjM3LDI1NCwyMDQsMjM2LDE5MywwLDE5NCwyMzIsNjAsMCwxNzIsMzQsMTU3LDI1NSwxODksMTYsMTg0LDI1NCwxMDMsMyw5NSwyNTUsMTQxLDIzMywzNiwyNTQsNDEsMjUsMTEsMjU1LDIxLDE5NSwxNjYsMCwxMTgsMjQ1LDQ1LDAsNjcsMjEzLDE0OSwyNTUsMTU5LDEyLDE4LDI1NSwxODcsMTY0LDIyNywxLDE2MCwyNSw1LDAsMTIsNzgsMTk1LDEsNDMsMTk3LDIyNSwwLDQ4LDE0Miw0MSwyNTQsMTk2LDE1NSw2MCwyNTUsMjIzLDE5OSwxOCwxLDE0NSwxMzYsMTU2LDAsMjUyLDExNywxNjksMjU0LDE0NSwyMjYsMjM4LDAsMjM5LDIzLDEwNywwLDEwOSwxODEsMTg4LDI1NSwyMzAsMTEyLDQ5LDI1NCw3MywxNzAsMjM3LDI1NSwyMzEsMTgzLDIyNywyNTUsODAsMjIwLDIwLDAsMTk0LDEwNywxMjcsMSwxMjcsMjA1LDEwMSwwLDQ2LDUyLDE5NywxLDIxMCwxNzEsMzYsMjU1LDg4LDMsOTAsMjU1LDU2LDE1MSwxNDEsMCw5NiwxODcsMjU1LDI1NSw0Miw3OCwyMDAsMCwyNTQsNzAsNzAsMSwyNDQsMTI1LDE2OCwwLDIwNCw2OCwxMzgsMSwxMjQsMjE1LDcwLDAsMTAyLDY2LDIwMCwyNTQsMTcsNTIsMjI4LDAsMTE3LDIyMCwxNDMsMjU0LDIwMywyNDgsMTIzLDAsNTYsMTgsMTc0LDI1NSwxODYsMTUxLDE2NCwyNTUsNTEsMjMyLDIwOCwxLDE2MCwyMjgsNDMsMjU1LDI0OSwyOSwyNSwxLDY4LDE5MCw2MywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyMjQsMTI0LDAsMCwwLDAsMCwwLDUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDE4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxOCwwLDAsMCwxOSwwLDAsMCw2NSwxMzIsMCwwLDAsNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEwLDI1NSwyNTUsMjU1LDI1NSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEwMSwxMjAsMTEyLDk3LDExMCwxMDAsMzIsNTEsNTAsNDUsOTgsMTIxLDExNiwxMDEsMzIsMTA3LDExMSwxMTcsMTE2LDEwOCwxMDEsMTEwLDMyLDYwLDYxLDMyLDg1LDczLDc4LDg0LDU2LDk1LDc3LDY1LDg4LDAsOTksMTE0LDEyMSwxMTIsMTE2LDExMSw5NSwxMDMsMTAxLDExMCwxMDEsMTE0LDEwNSw5OSwxMDQsOTcsMTE1LDEwNCw0Nyw5OCwxMDgsOTcsMTA3LDEwMSw1MCw0NywxMTQsMTAxLDEwMiw0NywxMDMsMTAxLDExMCwxMDEsMTE0LDEwNSw5OSwxMDQsOTcsMTE1LDEwNCw5NSw5OCwxMDgsOTcsMTA3LDEwMSw1MCw5OCw0Niw5OSwwLDk5LDExNCwxMjEsMTEyLDExNiwxMTEsOTUsMTAzLDEwMSwxMTAsMTAxLDExNCwxMDUsOTksMTA0LDk3LDExNSwxMDQsOTUsOTgsMTA4LDk3LDEwNywxMDEsNTAsOTgsMCwxMDcsMTAxLDEyMSwxMDgsMTAxLDExMCwzMiw2MCw2MSwzMiw4NSw3Myw3OCw4NCw1Niw5NSw3Nyw2NSw4OCwwLDk5LDExNCwxMjEsMTEyLDExNiwxMTEsOTUsMTAzLDEwMSwxMTAsMTAxLDExNCwxMDUsOTksMTA0LDk3LDExNSwxMDQsOTUsOTgsMTA4LDk3LDEwNywxMDEsNTAsOTgsOTUsMTA1LDExMCwxMDUsMTE2LDAsOTksMTE0LDEyMSwxMTIsMTE2LDExMSw5NSwxMDMsMTAxLDExMCwxMDEsMTE0LDEwNSw5OSwxMDQsOTcsMTE1LDEwNCw5NSw5OCwxMDgsOTcsMTA3LDEwMSw1MCw5OCw5NSwxMDIsMTA1LDExMCw5NywxMDgsMCwxMjgsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTI4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzYsNTUsMzYsMCwxMDEsMTIwLDExMiw5NywxMTAsMTAwLDMyLDUxLDUwLDQ1LDk4LDEyMSwxMTYsMTAxLDMyLDEwNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTIzLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAzLDEwMSwxMTYsODIsOTcsMTEwLDEwMCwxMTEsMTA5LDg2LDk3LDEwOCwxMTcsMTAxLDQwLDQxLDU5LDMyLDEyNSwwLDEyMywzMiwxMDUsMTAyLDMyLDQwLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAzLDEwMSwxMTYsODIsOTcsMTEwLDEwMCwxMTEsMTA5LDg2LDk3LDEwOCwxMTcsMTAxLDMyLDYxLDYxLDYxLDMyLDExNywxMTAsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsMTAwLDQxLDMyLDEyMywzMiwxMTYsMTE0LDEyMSwzMiwxMjMsMzIsMTE4LDk3LDExNCwzMiwxMTksMTA1LDExMCwxMDAsMTExLDExOSw5NSwzMiw2MSwzMiwzNCwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzQsMzIsNjEsNjEsNjEsMzIsMTE2LDEyMSwxMTIsMTAxLDExMSwxMDIsMzIsMTE5LDEwNSwxMTAsMTAwLDExMSwxMTksMzIsNjMsMzIsMTE5LDEwNSwxMTAsMTAwLDExMSwxMTksMzIsNTgsMzIsMTE1LDEwMSwxMDgsMTAyLDQ0LDMyLDk5LDExNCwxMjEsMTEyLDExNiwxMTEsOTUsMzIsNjEsMzIsMTE2LDEyMSwxMTIsMTAxLDExMSwxMDIsMzIsMTE5LDEwNSwxMTAsMTAwLDExMSwxMTksOTUsNDYsOTksMTE0LDEyMSwxMTIsMTE2LDExMSwzMiwzMyw2MSw2MSwzMiwzNCwxMTcsMTEwLDEwMCwxMDEsMTAyLDEwNSwxMTAsMTAxLDEwMCwzNCwzMiw2MywzMiwxMTksMTA1LDExMCwxMDAsMTExLDExOSw5NSw0Niw5OSwxMTQsMTIxLDExMiwxMTYsMTExLDMyLDU4LDMyLDExOSwxMDUsMTEwLDEwMCwxMTEsMTE5LDk1LDQ2LDEwOSwxMTUsNjcsMTE0LDEyMSwxMTIsMTE2LDExMSw0NCwzMiwxMTQsOTcsMTEwLDEwMCwxMTEsMTA5LDg2LDk3LDEwOCwxMTcsMTAxLDExNSw4MywxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDMyLDYxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCw0MCw0MSwzMiwxMjMsMzIsMTE4LDk3LDExNCwzMiw5OCwxMTcsMTAyLDMyLDYxLDMyLDExMCwxMDEsMTE5LDMyLDg1LDEwNSwxMTAsMTE2LDUxLDUwLDY1LDExNCwxMTQsOTcsMTIxLDQwLDQ5LDQxLDU5LDMyLDk5LDExNCwxMjEsMTEyLDExNiwxMTEsOTUsNDYsMTAzLDEwMSwxMTYsODIsOTcsMTEwLDEwMCwxMTEsMTA5LDg2LDk3LDEwOCwxMTcsMTAxLDExNSw0MCw5OCwxMTcsMTAyLDQxLDU5LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDk4LDExNywxMDIsOTEsNDgsOTMsMzIsNjIsNjIsNjIsMzIsNDgsNTksMzIsMTI1LDU5LDMyLDExNCw5NywxMTAsMTAwLDExMSwxMDksODYsOTcsMTA4LDExNywxMDEsMTE1LDgzLDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsNDAsNDEsNTksMzIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMDMsMTAxLDExNiw4Miw5NywxMTAsMTAwLDExMSwxMDksODYsOTcsMTA4LDExNywxMDEsMzIsNjEsMzIsMTE0LDk3LDExMCwxMDAsMTExLDEwOSw4Niw5NywxMDgsMTE3LDEwMSwxMTUsODMsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw1OSwzMiwxMjUsMzIsOTksOTcsMTE2LDk5LDEwNCwzMiw0MCwxMDEsNDEsMzIsMTIzLDMyLDExNiwxMTQsMTIxLDMyLDEyMywzMiwxMTgsOTcsMTE0LDMyLDk5LDExNCwxMjEsMTEyLDExNiwxMTEsMzIsNjEsMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDQwLDM5LDk5LDExNCwxMjEsMTEyLDExNiwxMTEsMzksNDEsNDQsMzIsMTE0LDk3LDExMCwxMDAsMTExLDEwOSw4Niw5NywxMDgsMTE3LDEwMSw3OCwxMTEsMTAwLDEwMSw3NCw4MywzMiw2MSwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsNDAsNDEsMzIsMTIzLDMyLDExOCw5NywxMTQsMzIsOTgsMTE3LDEwMiwzMiw2MSwzMiw5OSwxMTQsMTIxLDExMiwxMTYsMTExLDQ2LDExNCw5NywxMTAsMTAwLDExMSwxMDksNjYsMTIxLDExNiwxMDEsMTE1LDQwLDUyLDQxLDU5LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDQwLDk4LDExNywxMDIsOTEsNDgsOTMsMzIsNjAsNjAsMzIsNTAsNTIsMzIsMTI0LDMyLDk4LDExNywxMDIsOTEsNDksOTMsMzIsNjAsNjAsMzIsNDksNTQsMzIsMTI0LDMyLDk4LDExNywxMDIsOTEsNTAsOTMsMzIsNjAsNjAsMzIsNTYsMzIsMTI0LDMyLDk4LDExNywxMDIsOTEsNTEsOTMsNDEsMzIsNjIsNjIsNjIsMzIsNDgsNTksMzIsMTI1LDU5LDMyLDExNCw5NywxMTAsMTAwLDExMSwxMDksODYsOTcsMTA4LDExNywxMDEsNzgsMTExLDEwMCwxMDEsNzQsODMsNDAsNDEsNTksMzIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMDMsMTAxLDExNiw4Miw5NywxMTAsMTAwLDExMSwxMDksODYsOTcsMTA4LDExNywxMDEsMzIsNjEsMzIsMTE0LDk3LDExMCwxMDAsMTExLDEwOSw4Niw5NywxMDgsMTE3LDEwMSw3OCwxMTEsMTAwLDEwMSw3NCw4Myw1OSwzMiwxMjUsMzIsOTksOTcsMTE2LDk5LDEwNCwzMiw0MCwxMDEsNDEsMzIsMTIzLDMyLDExNiwxMDQsMTE0LDExMSwxMTksMzIsMzksNzgsMTExLDMyLDExNSwxMDEsOTksMTE3LDExNCwxMDEsMzIsMTE0LDk3LDExMCwxMDAsMTExLDEwOSwzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LDMyLDEwMywxMDEsMTEwLDEwMSwxMTQsOTcsMTE2LDExMSwxMTQsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzOSw1OSwzMiwxMjUsMzIsMTI1LDMyLDEyNSwzMiwxMjUsMCw0OSw0Niw0OCw0Niw1NCwwLDksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMDEsMTIwLDExMiw5NywxMTAsMTAwLDMyLDUxLDUwLDQ1LDk4LDEyMSwxMTYsMTAxLDMyLDEwNywxMDEsMTIwLDExMiw5NywxMTAsMTAwLDMyLDUxLDUwLDQ1LDk4LDEyMSwxMTYsMTAxLDMyLDEwN10sXCJpOFwiLEFMTE9DX05PTkUsUnVudGltZS5HTE9CQUxfQkFTRSszMDcyMCk7YWxsb2NhdGUoWzQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMF0sXCJpOFwiLEFMTE9DX05PTkUsUnVudGltZS5HTE9CQUxfQkFTRSszNDg3Myk7dmFyIHRlbXBEb3VibGVQdHI9UnVudGltZS5hbGlnbk1lbW9yeShhbGxvY2F0ZSgxMixcImk4XCIsQUxMT0NfU1RBVElDKSw4KTthc3NlcnQodGVtcERvdWJsZVB0ciU4PT0wKTtmdW5jdGlvbiBjb3B5VGVtcEZsb2F0KHB0cil7SEVBUDhbdGVtcERvdWJsZVB0cl09SEVBUDhbcHRyXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzFdPUhFQVA4W3B0cisxXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzJdPUhFQVA4W3B0cisyXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzNdPUhFQVA4W3B0ciszXX1mdW5jdGlvbiBjb3B5VGVtcERvdWJsZShwdHIpe0hFQVA4W3RlbXBEb3VibGVQdHJdPUhFQVA4W3B0cl07SEVBUDhbdGVtcERvdWJsZVB0cisxXT1IRUFQOFtwdHIrMV07SEVBUDhbdGVtcERvdWJsZVB0cisyXT1IRUFQOFtwdHIrMl07SEVBUDhbdGVtcERvdWJsZVB0ciszXT1IRUFQOFtwdHIrM107SEVBUDhbdGVtcERvdWJsZVB0cis0XT1IRUFQOFtwdHIrNF07SEVBUDhbdGVtcERvdWJsZVB0cis1XT1IRUFQOFtwdHIrNV07SEVBUDhbdGVtcERvdWJsZVB0cis2XT1IRUFQOFtwdHIrNl07SEVBUDhbdGVtcERvdWJsZVB0cis3XT1IRUFQOFtwdHIrN119ZnVuY3Rpb24gX19fc2V0RXJyTm8odmFsdWUpe2lmKE1vZHVsZVtcIl9fX2Vycm5vX2xvY2F0aW9uXCJdKUhFQVAzMltNb2R1bGVbXCJfX19lcnJub19sb2NhdGlvblwiXSgpPj4yXT12YWx1ZTtyZXR1cm4gdmFsdWV9dmFyIEVSUk5PX0NPREVTPXtFUEVSTToxLEVOT0VOVDoyLEVTUkNIOjMsRUlOVFI6NCxFSU86NSxFTlhJTzo2LEUyQklHOjcsRU5PRVhFQzo4LEVCQURGOjksRUNISUxEOjEwLEVBR0FJTjoxMSxFV09VTERCTE9DSzoxMSxFTk9NRU06MTIsRUFDQ0VTOjEzLEVGQVVMVDoxNCxFTk9UQkxLOjE1LEVCVVNZOjE2LEVFWElTVDoxNyxFWERFVjoxOCxFTk9ERVY6MTksRU5PVERJUjoyMCxFSVNESVI6MjEsRUlOVkFMOjIyLEVORklMRToyMyxFTUZJTEU6MjQsRU5PVFRZOjI1LEVUWFRCU1k6MjYsRUZCSUc6MjcsRU5PU1BDOjI4LEVTUElQRToyOSxFUk9GUzozMCxFTUxJTks6MzEsRVBJUEU6MzIsRURPTTozMyxFUkFOR0U6MzQsRU5PTVNHOjQyLEVJRFJNOjQzLEVDSFJORzo0NCxFTDJOU1lOQzo0NSxFTDNITFQ6NDYsRUwzUlNUOjQ3LEVMTlJORzo0OCxFVU5BVENIOjQ5LEVOT0NTSTo1MCxFTDJITFQ6NTEsRURFQURMSzozNSxFTk9MQ0s6MzcsRUJBREU6NTIsRUJBRFI6NTMsRVhGVUxMOjU0LEVOT0FOTzo1NSxFQkFEUlFDOjU2LEVCQURTTFQ6NTcsRURFQURMT0NLOjM1LEVCRk9OVDo1OSxFTk9TVFI6NjAsRU5PREFUQTo2MSxFVElNRTo2MixFTk9TUjo2MyxFTk9ORVQ6NjQsRU5PUEtHOjY1LEVSRU1PVEU6NjYsRU5PTElOSzo2NyxFQURWOjY4LEVTUk1OVDo2OSxFQ09NTTo3MCxFUFJPVE86NzEsRU1VTFRJSE9QOjcyLEVET1RET1Q6NzMsRUJBRE1TRzo3NCxFTk9UVU5JUTo3NixFQkFERkQ6NzcsRVJFTUNIRzo3OCxFTElCQUNDOjc5LEVMSUJCQUQ6ODAsRUxJQlNDTjo4MSxFTElCTUFYOjgyLEVMSUJFWEVDOjgzLEVOT1NZUzozOCxFTk9URU1QVFk6MzksRU5BTUVUT09MT05HOjM2LEVMT09QOjQwLEVPUE5PVFNVUFA6OTUsRVBGTk9TVVBQT1JUOjk2LEVDT05OUkVTRVQ6MTA0LEVOT0JVRlM6MTA1LEVBRk5PU1VQUE9SVDo5NyxFUFJPVE9UWVBFOjkxLEVOT1RTT0NLOjg4LEVOT1BST1RPT1BUOjkyLEVTSFVURE9XTjoxMDgsRUNPTk5SRUZVU0VEOjExMSxFQUREUklOVVNFOjk4LEVDT05OQUJPUlRFRDoxMDMsRU5FVFVOUkVBQ0g6MTAxLEVORVRET1dOOjEwMCxFVElNRURPVVQ6MTEwLEVIT1NURE9XTjoxMTIsRUhPU1RVTlJFQUNIOjExMyxFSU5QUk9HUkVTUzoxMTUsRUFMUkVBRFk6MTE0LEVERVNUQUREUlJFUTo4OSxFTVNHU0laRTo5MCxFUFJPVE9OT1NVUFBPUlQ6OTMsRVNPQ0tUTk9TVVBQT1JUOjk0LEVBRERSTk9UQVZBSUw6OTksRU5FVFJFU0VUOjEwMixFSVNDT05OOjEwNixFTk9UQ09OTjoxMDcsRVRPT01BTllSRUZTOjEwOSxFVVNFUlM6ODcsRURRVU9UOjEyMixFU1RBTEU6MTE2LEVOT1RTVVA6OTUsRU5PTUVESVVNOjEyMyxFSUxTRVE6ODQsRU9WRVJGTE9XOjc1LEVDQU5DRUxFRDoxMjUsRU5PVFJFQ09WRVJBQkxFOjEzMSxFT1dORVJERUFEOjEzMCxFU1RSUElQRTo4Nn07ZnVuY3Rpb24gX3N5c2NvbmYobmFtZSl7c3dpdGNoKG5hbWUpe2Nhc2UgMzA6cmV0dXJuIFBBR0VfU0laRTtjYXNlIDg1OnJldHVybiB0b3RhbE1lbW9yeS9QQUdFX1NJWkU7Y2FzZSAxMzI6Y2FzZSAxMzM6Y2FzZSAxMjpjYXNlIDEzNzpjYXNlIDEzODpjYXNlIDE1OmNhc2UgMjM1OmNhc2UgMTY6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgMTk6Y2FzZSAyMDpjYXNlIDE0OTpjYXNlIDEzOmNhc2UgMTA6Y2FzZSAyMzY6Y2FzZSAxNTM6Y2FzZSA5OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDE1OTpjYXNlIDE1NDpjYXNlIDE0OmNhc2UgNzc6Y2FzZSA3ODpjYXNlIDEzOTpjYXNlIDgwOmNhc2UgODE6Y2FzZSA4MjpjYXNlIDY4OmNhc2UgNjc6Y2FzZSAxNjQ6Y2FzZSAxMTpjYXNlIDI5OmNhc2UgNDc6Y2FzZSA0ODpjYXNlIDk1OmNhc2UgNTI6Y2FzZSA1MTpjYXNlIDQ2OnJldHVybiAyMDA4MDk7Y2FzZSA3OTpyZXR1cm4gMDtjYXNlIDI3OmNhc2UgMjQ2OmNhc2UgMTI3OmNhc2UgMTI4OmNhc2UgMjM6Y2FzZSAyNDpjYXNlIDE2MDpjYXNlIDE2MTpjYXNlIDE4MTpjYXNlIDE4MjpjYXNlIDI0MjpjYXNlIDE4MzpjYXNlIDE4NDpjYXNlIDI0MzpjYXNlIDI0NDpjYXNlIDI0NTpjYXNlIDE2NTpjYXNlIDE3ODpjYXNlIDE3OTpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSAxNjg6Y2FzZSAxNjk6Y2FzZSAxNzU6Y2FzZSAxNzA6Y2FzZSAxNzE6Y2FzZSAxNzI6Y2FzZSA5NzpjYXNlIDc2OmNhc2UgMzI6Y2FzZSAxNzM6Y2FzZSAzNTpyZXR1cm4tMTtjYXNlIDE3NjpjYXNlIDE3NzpjYXNlIDc6Y2FzZSAxNTU6Y2FzZSA4OmNhc2UgMTU3OmNhc2UgMTI1OmNhc2UgMTI2OmNhc2UgOTI6Y2FzZSA5MzpjYXNlIDEyOTpjYXNlIDEzMDpjYXNlIDEzMTpjYXNlIDk0OmNhc2UgOTE6cmV0dXJuIDE7Y2FzZSA3NDpjYXNlIDYwOmNhc2UgNjk6Y2FzZSA3MDpjYXNlIDQ6cmV0dXJuIDEwMjQ7Y2FzZSAzMTpjYXNlIDQyOmNhc2UgNzI6cmV0dXJuIDMyO2Nhc2UgODc6Y2FzZSAyNjpjYXNlIDMzOnJldHVybiAyMTQ3NDgzNjQ3O2Nhc2UgMzQ6Y2FzZSAxOnJldHVybiA0NzgzOTtjYXNlIDM4OmNhc2UgMzY6cmV0dXJuIDk5O2Nhc2UgNDM6Y2FzZSAzNzpyZXR1cm4gMjA0ODtjYXNlIDA6cmV0dXJuIDIwOTcxNTI7Y2FzZSAzOnJldHVybiA2NTUzNjtjYXNlIDI4OnJldHVybiAzMjc2ODtjYXNlIDQ0OnJldHVybiAzMjc2NztjYXNlIDc1OnJldHVybiAxNjM4NDtjYXNlIDM5OnJldHVybiAxZTM7Y2FzZSA4OTpyZXR1cm4gNzAwO2Nhc2UgNzE6cmV0dXJuIDI1NjtjYXNlIDQwOnJldHVybiAyNTU7Y2FzZSAyOnJldHVybiAxMDA7Y2FzZSAxODA6cmV0dXJuIDY0O2Nhc2UgMjU6cmV0dXJuIDIwO2Nhc2UgNTpyZXR1cm4gMTY7Y2FzZSA2OnJldHVybiA2O2Nhc2UgNzM6cmV0dXJuIDQ7Y2FzZSA4NDp7aWYodHlwZW9mIG5hdmlnYXRvcj09PVwib2JqZWN0XCIpcmV0dXJuIG5hdmlnYXRvcltcImhhcmR3YXJlQ29uY3VycmVuY3lcIl18fDE7cmV0dXJuIDF9fV9fX3NldEVyck5vKEVSUk5PX0NPREVTLkVJTlZBTCk7cmV0dXJuLTF9TW9kdWxlW1wiX2k2NFN1YnRyYWN0XCJdPV9pNjRTdWJ0cmFjdDtNb2R1bGVbXCJfaTY0QWRkXCJdPV9pNjRBZGQ7TW9kdWxlW1wiX2JpdHNoaWZ0NjRBc2hyXCJdPV9iaXRzaGlmdDY0QXNocjtNb2R1bGVbXCJfbWVtc2V0XCJdPV9tZW1zZXQ7ZnVuY3Rpb24gX3B0aHJlYWRfY2xlYW51cF9wdXNoKHJvdXRpbmUsYXJnKXtfX0FURVhJVF9fLnB1c2goKGZ1bmN0aW9uKCl7UnVudGltZS5keW5DYWxsKFwidmlcIixyb3V0aW5lLFthcmddKX0pKTtfcHRocmVhZF9jbGVhbnVwX3B1c2gubGV2ZWw9X19BVEVYSVRfXy5sZW5ndGh9TW9kdWxlW1wiX2JpdHNoaWZ0NjRMc2hyXCJdPV9iaXRzaGlmdDY0THNocjtNb2R1bGVbXCJfYml0c2hpZnQ2NFNobFwiXT1fYml0c2hpZnQ2NFNobDtmdW5jdGlvbiBfcHRocmVhZF9jbGVhbnVwX3BvcCgpe2Fzc2VydChfcHRocmVhZF9jbGVhbnVwX3B1c2gubGV2ZWw9PV9fQVRFWElUX18ubGVuZ3RoLFwiY2Fubm90IHBvcCBpZiBzb21ldGhpbmcgZWxzZSBhZGRlZCBtZWFud2hpbGUhXCIpO19fQVRFWElUX18ucG9wKCk7X3B0aHJlYWRfY2xlYW51cF9wdXNoLmxldmVsPV9fQVRFWElUX18ubGVuZ3RofWZ1bmN0aW9uIF9hYm9ydCgpe01vZHVsZVtcImFib3J0XCJdKCl9ZnVuY3Rpb24gX19fbG9jaygpe31mdW5jdGlvbiBfX191bmxvY2soKXt9dmFyIEVSUk5PX01FU1NBR0VTPXswOlwiU3VjY2Vzc1wiLDE6XCJOb3Qgc3VwZXItdXNlclwiLDI6XCJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIsMzpcIk5vIHN1Y2ggcHJvY2Vzc1wiLDQ6XCJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbFwiLDU6XCJJL08gZXJyb3JcIiw2OlwiTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzc1wiLDc6XCJBcmcgbGlzdCB0b28gbG9uZ1wiLDg6XCJFeGVjIGZvcm1hdCBlcnJvclwiLDk6XCJCYWQgZmlsZSBudW1iZXJcIiwxMDpcIk5vIGNoaWxkcmVuXCIsMTE6XCJObyBtb3JlIHByb2Nlc3Nlc1wiLDEyOlwiTm90IGVub3VnaCBjb3JlXCIsMTM6XCJQZXJtaXNzaW9uIGRlbmllZFwiLDE0OlwiQmFkIGFkZHJlc3NcIiwxNTpcIkJsb2NrIGRldmljZSByZXF1aXJlZFwiLDE2OlwiTW91bnQgZGV2aWNlIGJ1c3lcIiwxNzpcIkZpbGUgZXhpc3RzXCIsMTg6XCJDcm9zcy1kZXZpY2UgbGlua1wiLDE5OlwiTm8gc3VjaCBkZXZpY2VcIiwyMDpcIk5vdCBhIGRpcmVjdG9yeVwiLDIxOlwiSXMgYSBkaXJlY3RvcnlcIiwyMjpcIkludmFsaWQgYXJndW1lbnRcIiwyMzpcIlRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtXCIsMjQ6XCJUb28gbWFueSBvcGVuIGZpbGVzXCIsMjU6XCJOb3QgYSB0eXBld3JpdGVyXCIsMjY6XCJUZXh0IGZpbGUgYnVzeVwiLDI3OlwiRmlsZSB0b28gbGFyZ2VcIiwyODpcIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlXCIsMjk6XCJJbGxlZ2FsIHNlZWtcIiwzMDpcIlJlYWQgb25seSBmaWxlIHN5c3RlbVwiLDMxOlwiVG9vIG1hbnkgbGlua3NcIiwzMjpcIkJyb2tlbiBwaXBlXCIsMzM6XCJNYXRoIGFyZyBvdXQgb2YgZG9tYWluIG9mIGZ1bmNcIiwzNDpcIk1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlXCIsMzU6XCJGaWxlIGxvY2tpbmcgZGVhZGxvY2sgZXJyb3JcIiwzNjpcIkZpbGUgb3IgcGF0aCBuYW1lIHRvbyBsb25nXCIsMzc6XCJObyByZWNvcmQgbG9ja3MgYXZhaWxhYmxlXCIsMzg6XCJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWRcIiwzOTpcIkRpcmVjdG9yeSBub3QgZW1wdHlcIiw0MDpcIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzXCIsNDI6XCJObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZVwiLDQzOlwiSWRlbnRpZmllciByZW1vdmVkXCIsNDQ6XCJDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2VcIiw0NTpcIkxldmVsIDIgbm90IHN5bmNocm9uaXplZFwiLDQ2OlwiTGV2ZWwgMyBoYWx0ZWRcIiw0NzpcIkxldmVsIDMgcmVzZXRcIiw0ODpcIkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZVwiLDQ5OlwiUHJvdG9jb2wgZHJpdmVyIG5vdCBhdHRhY2hlZFwiLDUwOlwiTm8gQ1NJIHN0cnVjdHVyZSBhdmFpbGFibGVcIiw1MTpcIkxldmVsIDIgaGFsdGVkXCIsNTI6XCJJbnZhbGlkIGV4Y2hhbmdlXCIsNTM6XCJJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvclwiLDU0OlwiRXhjaGFuZ2UgZnVsbFwiLDU1OlwiTm8gYW5vZGVcIiw1NjpcIkludmFsaWQgcmVxdWVzdCBjb2RlXCIsNTc6XCJJbnZhbGlkIHNsb3RcIiw1OTpcIkJhZCBmb250IGZpbGUgZm10XCIsNjA6XCJEZXZpY2Ugbm90IGEgc3RyZWFtXCIsNjE6XCJObyBkYXRhIChmb3Igbm8gZGVsYXkgaW8pXCIsNjI6XCJUaW1lciBleHBpcmVkXCIsNjM6XCJPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXNcIiw2NDpcIk1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrXCIsNjU6XCJQYWNrYWdlIG5vdCBpbnN0YWxsZWRcIiw2NjpcIlRoZSBvYmplY3QgaXMgcmVtb3RlXCIsNjc6XCJUaGUgbGluayBoYXMgYmVlbiBzZXZlcmVkXCIsNjg6XCJBZHZlcnRpc2UgZXJyb3JcIiw2OTpcIlNybW91bnQgZXJyb3JcIiw3MDpcIkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZFwiLDcxOlwiUHJvdG9jb2wgZXJyb3JcIiw3MjpcIk11bHRpaG9wIGF0dGVtcHRlZFwiLDczOlwiQ3Jvc3MgbW91bnQgcG9pbnQgKG5vdCByZWFsbHkgZXJyb3IpXCIsNzQ6XCJUcnlpbmcgdG8gcmVhZCB1bnJlYWRhYmxlIG1lc3NhZ2VcIiw3NTpcIlZhbHVlIHRvbyBsYXJnZSBmb3IgZGVmaW5lZCBkYXRhIHR5cGVcIiw3NjpcIkdpdmVuIGxvZy4gbmFtZSBub3QgdW5pcXVlXCIsNzc6XCJmLmQuIGludmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uXCIsNzg6XCJSZW1vdGUgYWRkcmVzcyBjaGFuZ2VkXCIsNzk6XCJDYW4gICBhY2Nlc3MgYSBuZWVkZWQgc2hhcmVkIGxpYlwiLDgwOlwiQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJcIiw4MTpcIi5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWRcIiw4MjpcIkF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBsaWJzXCIsODM6XCJBdHRlbXB0aW5nIHRvIGV4ZWMgYSBzaGFyZWQgbGlicmFyeVwiLDg0OlwiSWxsZWdhbCBieXRlIHNlcXVlbmNlXCIsODY6XCJTdHJlYW1zIHBpcGUgZXJyb3JcIiw4NzpcIlRvbyBtYW55IHVzZXJzXCIsODg6XCJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXRcIiw4OTpcIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWRcIiw5MDpcIk1lc3NhZ2UgdG9vIGxvbmdcIiw5MTpcIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldFwiLDkyOlwiUHJvdG9jb2wgbm90IGF2YWlsYWJsZVwiLDkzOlwiVW5rbm93biBwcm90b2NvbFwiLDk0OlwiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZFwiLDk1OlwiTm90IHN1cHBvcnRlZFwiLDk2OlwiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWRcIiw5NzpcIkFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wgZmFtaWx5XCIsOTg6XCJBZGRyZXNzIGFscmVhZHkgaW4gdXNlXCIsOTk6XCJBZGRyZXNzIG5vdCBhdmFpbGFibGVcIiwxMDA6XCJOZXR3b3JrIGludGVyZmFjZSBpcyBub3QgY29uZmlndXJlZFwiLDEwMTpcIk5ldHdvcmsgaXMgdW5yZWFjaGFibGVcIiwxMDI6XCJDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmtcIiwxMDM6XCJDb25uZWN0aW9uIGFib3J0ZWRcIiwxMDQ6XCJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXJcIiwxMDU6XCJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlXCIsMTA2OlwiU29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkXCIsMTA3OlwiU29ja2V0IGlzIG5vdCBjb25uZWN0ZWRcIiwxMDg6XCJDYW4ndCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93blwiLDEwOTpcIlRvbyBtYW55IHJlZmVyZW5jZXNcIiwxMTA6XCJDb25uZWN0aW9uIHRpbWVkIG91dFwiLDExMTpcIkNvbm5lY3Rpb24gcmVmdXNlZFwiLDExMjpcIkhvc3QgaXMgZG93blwiLDExMzpcIkhvc3QgaXMgdW5yZWFjaGFibGVcIiwxMTQ6XCJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWRcIiwxMTU6XCJDb25uZWN0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3NcIiwxMTY6XCJTdGFsZSBmaWxlIGhhbmRsZVwiLDEyMjpcIlF1b3RhIGV4Y2VlZGVkXCIsMTIzOlwiTm8gbWVkaXVtIChpbiB0YXBlIGRyaXZlKVwiLDEyNTpcIk9wZXJhdGlvbiBjYW5jZWxlZFwiLDEzMDpcIlByZXZpb3VzIG93bmVyIGRpZWRcIiwxMzE6XCJTdGF0ZSBub3QgcmVjb3ZlcmFibGVcIn07dmFyIFBBVEg9e3NwbGl0UGF0aDooZnVuY3Rpb24oZmlsZW5hbWUpe3ZhciBzcGxpdFBhdGhSZT0vXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztyZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSl9KSxub3JtYWxpemVBcnJheTooZnVuY3Rpb24ocGFydHMsYWxsb3dBYm92ZVJvb3Qpe3ZhciB1cD0wO2Zvcih2YXIgaT1wYXJ0cy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGxhc3Q9cGFydHNbaV07aWYobGFzdD09PVwiLlwiKXtwYXJ0cy5zcGxpY2UoaSwxKX1lbHNlIGlmKGxhc3Q9PT1cIi4uXCIpe3BhcnRzLnNwbGljZShpLDEpO3VwKyt9ZWxzZSBpZih1cCl7cGFydHMuc3BsaWNlKGksMSk7dXAtLX19aWYoYWxsb3dBYm92ZVJvb3Qpe2Zvcig7dXAtLTt1cCl7cGFydHMudW5zaGlmdChcIi4uXCIpfX1yZXR1cm4gcGFydHN9KSxub3JtYWxpemU6KGZ1bmN0aW9uKHBhdGgpe3ZhciBpc0Fic29sdXRlPXBhdGguY2hhckF0KDApPT09XCIvXCIsdHJhaWxpbmdTbGFzaD1wYXRoLnN1YnN0cigtMSk9PT1cIi9cIjtwYXRoPVBBVEgubm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSksIWlzQWJzb2x1dGUpLmpvaW4oXCIvXCIpO2lmKCFwYXRoJiYhaXNBYnNvbHV0ZSl7cGF0aD1cIi5cIn1pZihwYXRoJiZ0cmFpbGluZ1NsYXNoKXtwYXRoKz1cIi9cIn1yZXR1cm4oaXNBYnNvbHV0ZT9cIi9cIjpcIlwiKStwYXRofSksZGlybmFtZTooZnVuY3Rpb24ocGF0aCl7dmFyIHJlc3VsdD1QQVRILnNwbGl0UGF0aChwYXRoKSxyb290PXJlc3VsdFswXSxkaXI9cmVzdWx0WzFdO2lmKCFyb290JiYhZGlyKXtyZXR1cm5cIi5cIn1pZihkaXIpe2Rpcj1kaXIuc3Vic3RyKDAsZGlyLmxlbmd0aC0xKX1yZXR1cm4gcm9vdCtkaXJ9KSxiYXNlbmFtZTooZnVuY3Rpb24ocGF0aCl7aWYocGF0aD09PVwiL1wiKXJldHVyblwiL1wiO3ZhciBsYXN0U2xhc2g9cGF0aC5sYXN0SW5kZXhPZihcIi9cIik7aWYobGFzdFNsYXNoPT09LTEpcmV0dXJuIHBhdGg7cmV0dXJuIHBhdGguc3Vic3RyKGxhc3RTbGFzaCsxKX0pLGV4dG5hbWU6KGZ1bmN0aW9uKHBhdGgpe3JldHVybiBQQVRILnNwbGl0UGF0aChwYXRoKVszXX0pLGpvaW46KGZ1bmN0aW9uKCl7dmFyIHBhdGhzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aHMuam9pbihcIi9cIikpfSksam9pbjI6KGZ1bmN0aW9uKGwscil7cmV0dXJuIFBBVEgubm9ybWFsaXplKGwrXCIvXCIrcil9KSxyZXNvbHZlOihmdW5jdGlvbigpe3ZhciByZXNvbHZlZFBhdGg9XCJcIixyZXNvbHZlZEFic29sdXRlPWZhbHNlO2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLTE7aT49LTEmJiFyZXNvbHZlZEFic29sdXRlO2ktLSl7dmFyIHBhdGg9aT49MD9hcmd1bWVudHNbaV06RlMuY3dkKCk7aWYodHlwZW9mIHBhdGghPT1cInN0cmluZ1wiKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3NcIil9ZWxzZSBpZighcGF0aCl7cmV0dXJuXCJcIn1yZXNvbHZlZFBhdGg9cGF0aCtcIi9cIityZXNvbHZlZFBhdGg7cmVzb2x2ZWRBYnNvbHV0ZT1wYXRoLmNoYXJBdCgwKT09PVwiL1wifXJlc29sdmVkUGF0aD1QQVRILm5vcm1hbGl6ZUFycmF5KHJlc29sdmVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSksIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oXCIvXCIpO3JldHVybihyZXNvbHZlZEFic29sdXRlP1wiL1wiOlwiXCIpK3Jlc29sdmVkUGF0aHx8XCIuXCJ9KSxyZWxhdGl2ZTooZnVuY3Rpb24oZnJvbSx0byl7ZnJvbT1QQVRILnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO3RvPVBBVEgucmVzb2x2ZSh0bykuc3Vic3RyKDEpO2Z1bmN0aW9uIHRyaW0oYXJyKXt2YXIgc3RhcnQ9MDtmb3IoO3N0YXJ0PGFyci5sZW5ndGg7c3RhcnQrKyl7aWYoYXJyW3N0YXJ0XSE9PVwiXCIpYnJlYWt9dmFyIGVuZD1hcnIubGVuZ3RoLTE7Zm9yKDtlbmQ+PTA7ZW5kLS0pe2lmKGFycltlbmRdIT09XCJcIilicmVha31pZihzdGFydD5lbmQpcmV0dXJuW107cmV0dXJuIGFyci5zbGljZShzdGFydCxlbmQtc3RhcnQrMSl9dmFyIGZyb21QYXJ0cz10cmltKGZyb20uc3BsaXQoXCIvXCIpKTt2YXIgdG9QYXJ0cz10cmltKHRvLnNwbGl0KFwiL1wiKSk7dmFyIGxlbmd0aD1NYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLHRvUGFydHMubGVuZ3RoKTt2YXIgc2FtZVBhcnRzTGVuZ3RoPWxlbmd0aDtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe2lmKGZyb21QYXJ0c1tpXSE9PXRvUGFydHNbaV0pe3NhbWVQYXJ0c0xlbmd0aD1pO2JyZWFrfX12YXIgb3V0cHV0UGFydHM9W107Zm9yKHZhciBpPXNhbWVQYXJ0c0xlbmd0aDtpPGZyb21QYXJ0cy5sZW5ndGg7aSsrKXtvdXRwdXRQYXJ0cy5wdXNoKFwiLi5cIil9b3V0cHV0UGFydHM9b3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7cmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oXCIvXCIpfSl9O3ZhciBUVFk9e3R0eXM6W10saW5pdDooZnVuY3Rpb24oKXt9KSxzaHV0ZG93bjooZnVuY3Rpb24oKXt9KSxyZWdpc3RlcjooZnVuY3Rpb24oZGV2LG9wcyl7VFRZLnR0eXNbZGV2XT17aW5wdXQ6W10sb3V0cHV0OltdLG9wczpvcHN9O0ZTLnJlZ2lzdGVyRGV2aWNlKGRldixUVFkuc3RyZWFtX29wcyl9KSxzdHJlYW1fb3BzOntvcGVuOihmdW5jdGlvbihzdHJlYW0pe3ZhciB0dHk9VFRZLnR0eXNbc3RyZWFtLm5vZGUucmRldl07aWYoIXR0eSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PREVWKX1zdHJlYW0udHR5PXR0eTtzdHJlYW0uc2Vla2FibGU9ZmFsc2V9KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXtzdHJlYW0udHR5Lm9wcy5mbHVzaChzdHJlYW0udHR5KX0pLGZsdXNoOihmdW5jdGlvbihzdHJlYW0pe3N0cmVhbS50dHkub3BzLmZsdXNoKHN0cmVhbS50dHkpfSkscmVhZDooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7aWYoIXN0cmVhbS50dHl8fCFzdHJlYW0udHR5Lm9wcy5nZXRfY2hhcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5YSU8pfXZhciBieXRlc1JlYWQ9MDtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3ZhciByZXN1bHQ7dHJ5e3Jlc3VsdD1zdHJlYW0udHR5Lm9wcy5nZXRfY2hhcihzdHJlYW0udHR5KX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfWlmKHJlc3VsdD09PXVuZGVmaW5lZCYmYnl0ZXNSZWFkPT09MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX1pZihyZXN1bHQ9PT1udWxsfHxyZXN1bHQ9PT11bmRlZmluZWQpYnJlYWs7Ynl0ZXNSZWFkKys7YnVmZmVyW29mZnNldCtpXT1yZXN1bHR9aWYoYnl0ZXNSZWFkKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gYnl0ZXNSZWFkfSksd3JpdGU6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3Mpe2lmKCFzdHJlYW0udHR5fHwhc3RyZWFtLnR0eS5vcHMucHV0X2NoYXIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOWElPKX1mb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3RyeXtzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcihzdHJlYW0udHR5LGJ1ZmZlcltvZmZzZXQraV0pfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9fWlmKGxlbmd0aCl7c3RyZWFtLm5vZGUudGltZXN0YW1wPURhdGUubm93KCl9cmV0dXJuIGl9KX0sZGVmYXVsdF90dHlfb3BzOntnZXRfY2hhcjooZnVuY3Rpb24odHR5KXtpZighdHR5LmlucHV0Lmxlbmd0aCl7dmFyIHJlc3VsdD1udWxsO2lmKEVOVklST05NRU5UX0lTX05PREUpe3ZhciBCVUZTSVpFPTI1Njt2YXIgYnVmPW5ldyBCdWZmZXIoQlVGU0laRSk7dmFyIGJ5dGVzUmVhZD0wO3ZhciBmZD1wcm9jZXNzLnN0ZGluLmZkO3ZhciB1c2luZ0RldmljZT1mYWxzZTt0cnl7ZmQ9ZnMub3BlblN5bmMoXCIvZGV2L3N0ZGluXCIsXCJyXCIpO3VzaW5nRGV2aWNlPXRydWV9Y2F0Y2goZSl7fWJ5dGVzUmVhZD1mcy5yZWFkU3luYyhmZCxidWYsMCxCVUZTSVpFLG51bGwpO2lmKHVzaW5nRGV2aWNlKXtmcy5jbG9zZVN5bmMoZmQpfWlmKGJ5dGVzUmVhZD4wKXtyZXN1bHQ9YnVmLnNsaWNlKDAsYnl0ZXNSZWFkKS50b1N0cmluZyhcInV0Zi04XCIpfWVsc2V7cmVzdWx0PW51bGx9fWVsc2UgaWYodHlwZW9mIHdpbmRvdyE9XCJ1bmRlZmluZWRcIiYmdHlwZW9mIHdpbmRvdy5wcm9tcHQ9PVwiZnVuY3Rpb25cIil7cmVzdWx0PXdpbmRvdy5wcm9tcHQoXCJJbnB1dDogXCIpO2lmKHJlc3VsdCE9PW51bGwpe3Jlc3VsdCs9XCJcXG5cIn19ZWxzZSBpZih0eXBlb2YgcmVhZGxpbmU9PVwiZnVuY3Rpb25cIil7cmVzdWx0PXJlYWRsaW5lKCk7aWYocmVzdWx0IT09bnVsbCl7cmVzdWx0Kz1cIlxcblwifX1pZighcmVzdWx0KXtyZXR1cm4gbnVsbH10dHkuaW5wdXQ9aW50QXJyYXlGcm9tU3RyaW5nKHJlc3VsdCx0cnVlKX1yZXR1cm4gdHR5LmlucHV0LnNoaWZ0KCl9KSxwdXRfY2hhcjooZnVuY3Rpb24odHR5LHZhbCl7aWYodmFsPT09bnVsbHx8dmFsPT09MTApe01vZHVsZVtcInByaW50XCJdKFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsMCkpO3R0eS5vdXRwdXQ9W119ZWxzZXtpZih2YWwhPTApdHR5Lm91dHB1dC5wdXNoKHZhbCl9fSksZmx1c2g6KGZ1bmN0aW9uKHR0eSl7aWYodHR5Lm91dHB1dCYmdHR5Lm91dHB1dC5sZW5ndGg+MCl7TW9kdWxlW1wicHJpbnRcIl0oVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwwKSk7dHR5Lm91dHB1dD1bXX19KX0sZGVmYXVsdF90dHkxX29wczp7cHV0X2NoYXI6KGZ1bmN0aW9uKHR0eSx2YWwpe2lmKHZhbD09PW51bGx8fHZhbD09PTEwKXtNb2R1bGVbXCJwcmludEVyclwiXShVVEY4QXJyYXlUb1N0cmluZyh0dHkub3V0cHV0LDApKTt0dHkub3V0cHV0PVtdfWVsc2V7aWYodmFsIT0wKXR0eS5vdXRwdXQucHVzaCh2YWwpfX0pLGZsdXNoOihmdW5jdGlvbih0dHkpe2lmKHR0eS5vdXRwdXQmJnR0eS5vdXRwdXQubGVuZ3RoPjApe01vZHVsZVtcInByaW50RXJyXCJdKFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsMCkpO3R0eS5vdXRwdXQ9W119fSl9fTt2YXIgTUVNRlM9e29wc190YWJsZTpudWxsLG1vdW50OihmdW5jdGlvbihtb3VudCl7cmV0dXJuIE1FTUZTLmNyZWF0ZU5vZGUobnVsbCxcIi9cIiwxNjM4NHw1MTEsMCl9KSxjcmVhdGVOb2RlOihmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLGRldil7aWYoRlMuaXNCbGtkZXYobW9kZSl8fEZTLmlzRklGTyhtb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKCFNRU1GUy5vcHNfdGFibGUpe01FTUZTLm9wc190YWJsZT17ZGlyOntub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyLGxvb2t1cDpNRU1GUy5ub2RlX29wcy5sb29rdXAsbWtub2Q6TUVNRlMubm9kZV9vcHMubWtub2QscmVuYW1lOk1FTUZTLm5vZGVfb3BzLnJlbmFtZSx1bmxpbms6TUVNRlMubm9kZV9vcHMudW5saW5rLHJtZGlyOk1FTUZTLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6TUVNRlMubm9kZV9vcHMucmVhZGRpcixzeW1saW5rOk1FTUZTLm5vZGVfb3BzLnN5bWxpbmt9LHN0cmVhbTp7bGxzZWVrOk1FTUZTLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cn0sc3RyZWFtOntsbHNlZWs6TUVNRlMuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpNRU1GUy5zdHJlYW1fb3BzLnJlYWQsd3JpdGU6TUVNRlMuc3RyZWFtX29wcy53cml0ZSxhbGxvY2F0ZTpNRU1GUy5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6TUVNRlMuc3RyZWFtX29wcy5tbWFwLG1zeW5jOk1FTUZTLnN0cmVhbV9vcHMubXN5bmN9fSxsaW5rOntub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyLHJlYWRsaW5rOk1FTUZTLm5vZGVfb3BzLnJlYWRsaW5rfSxzdHJlYW06e319LGNocmRldjp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cn0sc3RyZWFtOkZTLmNocmRldl9zdHJlYW1fb3BzfX19dmFyIG5vZGU9RlMuY3JlYXRlTm9kZShwYXJlbnQsbmFtZSxtb2RlLGRldik7aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUuZGlyLm5vZGU7bm9kZS5zdHJlYW1fb3BzPU1FTUZTLm9wc190YWJsZS5kaXIuc3RyZWFtO25vZGUuY29udGVudHM9e319ZWxzZSBpZihGUy5pc0ZpbGUobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUuZmlsZS5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUuZmlsZS5zdHJlYW07bm9kZS51c2VkQnl0ZXM9MDtub2RlLmNvbnRlbnRzPW51bGx9ZWxzZSBpZihGUy5pc0xpbmsobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUubGluay5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUubGluay5zdHJlYW19ZWxzZSBpZihGUy5pc0NocmRldihub2RlLm1vZGUpKXtub2RlLm5vZGVfb3BzPU1FTUZTLm9wc190YWJsZS5jaHJkZXYubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmNocmRldi5zdHJlYW19bm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKTtpZihwYXJlbnQpe3BhcmVudC5jb250ZW50c1tuYW1lXT1ub2RlfXJldHVybiBub2RlfSksZ2V0RmlsZURhdGFBc1JlZ3VsYXJBcnJheTooZnVuY3Rpb24obm9kZSl7aWYobm9kZS5jb250ZW50cyYmbm9kZS5jb250ZW50cy5zdWJhcnJheSl7dmFyIGFycj1bXTtmb3IodmFyIGk9MDtpPG5vZGUudXNlZEJ5dGVzOysraSlhcnIucHVzaChub2RlLmNvbnRlbnRzW2ldKTtyZXR1cm4gYXJyfXJldHVybiBub2RlLmNvbnRlbnRzfSksZ2V0RmlsZURhdGFBc1R5cGVkQXJyYXk6KGZ1bmN0aW9uKG5vZGUpe2lmKCFub2RlLmNvbnRlbnRzKXJldHVybiBuZXcgVWludDhBcnJheTtpZihub2RlLmNvbnRlbnRzLnN1YmFycmF5KXJldHVybiBub2RlLmNvbnRlbnRzLnN1YmFycmF5KDAsbm9kZS51c2VkQnl0ZXMpO3JldHVybiBuZXcgVWludDhBcnJheShub2RlLmNvbnRlbnRzKX0pLGV4cGFuZEZpbGVTdG9yYWdlOihmdW5jdGlvbihub2RlLG5ld0NhcGFjaXR5KXtpZihub2RlLmNvbnRlbnRzJiZub2RlLmNvbnRlbnRzLnN1YmFycmF5JiZuZXdDYXBhY2l0eT5ub2RlLmNvbnRlbnRzLmxlbmd0aCl7bm9kZS5jb250ZW50cz1NRU1GUy5nZXRGaWxlRGF0YUFzUmVndWxhckFycmF5KG5vZGUpO25vZGUudXNlZEJ5dGVzPW5vZGUuY29udGVudHMubGVuZ3RofWlmKCFub2RlLmNvbnRlbnRzfHxub2RlLmNvbnRlbnRzLnN1YmFycmF5KXt2YXIgcHJldkNhcGFjaXR5PW5vZGUuY29udGVudHM/bm9kZS5jb250ZW50cy5idWZmZXIuYnl0ZUxlbmd0aDowO2lmKHByZXZDYXBhY2l0eT49bmV3Q2FwYWNpdHkpcmV0dXJuO3ZhciBDQVBBQ0lUWV9ET1VCTElOR19NQVg9MTAyNCoxMDI0O25ld0NhcGFjaXR5PU1hdGgubWF4KG5ld0NhcGFjaXR5LHByZXZDYXBhY2l0eSoocHJldkNhcGFjaXR5PENBUEFDSVRZX0RPVUJMSU5HX01BWD8yOjEuMTI1KXwwKTtpZihwcmV2Q2FwYWNpdHkhPTApbmV3Q2FwYWNpdHk9TWF0aC5tYXgobmV3Q2FwYWNpdHksMjU2KTt2YXIgb2xkQ29udGVudHM9bm9kZS5jb250ZW50cztub2RlLmNvbnRlbnRzPW5ldyBVaW50OEFycmF5KG5ld0NhcGFjaXR5KTtpZihub2RlLnVzZWRCeXRlcz4wKW5vZGUuY29udGVudHMuc2V0KG9sZENvbnRlbnRzLnN1YmFycmF5KDAsbm9kZS51c2VkQnl0ZXMpLDApO3JldHVybn1pZighbm9kZS5jb250ZW50cyYmbmV3Q2FwYWNpdHk+MClub2RlLmNvbnRlbnRzPVtdO3doaWxlKG5vZGUuY29udGVudHMubGVuZ3RoPG5ld0NhcGFjaXR5KW5vZGUuY29udGVudHMucHVzaCgwKX0pLHJlc2l6ZUZpbGVTdG9yYWdlOihmdW5jdGlvbihub2RlLG5ld1NpemUpe2lmKG5vZGUudXNlZEJ5dGVzPT1uZXdTaXplKXJldHVybjtpZihuZXdTaXplPT0wKXtub2RlLmNvbnRlbnRzPW51bGw7bm9kZS51c2VkQnl0ZXM9MDtyZXR1cm59aWYoIW5vZGUuY29udGVudHN8fG5vZGUuY29udGVudHMuc3ViYXJyYXkpe3ZhciBvbGRDb250ZW50cz1ub2RlLmNvbnRlbnRzO25vZGUuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKG5ld1NpemUpKTtpZihvbGRDb250ZW50cyl7bm9kZS5jb250ZW50cy5zZXQob2xkQ29udGVudHMuc3ViYXJyYXkoMCxNYXRoLm1pbihuZXdTaXplLG5vZGUudXNlZEJ5dGVzKSkpfW5vZGUudXNlZEJ5dGVzPW5ld1NpemU7cmV0dXJufWlmKCFub2RlLmNvbnRlbnRzKW5vZGUuY29udGVudHM9W107aWYobm9kZS5jb250ZW50cy5sZW5ndGg+bmV3U2l6ZSlub2RlLmNvbnRlbnRzLmxlbmd0aD1uZXdTaXplO2Vsc2Ugd2hpbGUobm9kZS5jb250ZW50cy5sZW5ndGg8bmV3U2l6ZSlub2RlLmNvbnRlbnRzLnB1c2goMCk7bm9kZS51c2VkQnl0ZXM9bmV3U2l6ZX0pLG5vZGVfb3BzOntnZXRhdHRyOihmdW5jdGlvbihub2RlKXt2YXIgYXR0cj17fTthdHRyLmRldj1GUy5pc0NocmRldihub2RlLm1vZGUpP25vZGUuaWQ6MTthdHRyLmlubz1ub2RlLmlkO2F0dHIubW9kZT1ub2RlLm1vZGU7YXR0ci5ubGluaz0xO2F0dHIudWlkPTA7YXR0ci5naWQ9MDthdHRyLnJkZXY9bm9kZS5yZGV2O2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT00MDk2fWVsc2UgaWYoRlMuaXNGaWxlKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT1ub2RlLnVzZWRCeXRlc31lbHNlIGlmKEZTLmlzTGluayhub2RlLm1vZGUpKXthdHRyLnNpemU9bm9kZS5saW5rLmxlbmd0aH1lbHNle2F0dHIuc2l6ZT0wfWF0dHIuYXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIubXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuY3RpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuYmxrc2l6ZT00MDk2O2F0dHIuYmxvY2tzPU1hdGguY2VpbChhdHRyLnNpemUvYXR0ci5ibGtzaXplKTtyZXR1cm4gYXR0cn0pLHNldGF0dHI6KGZ1bmN0aW9uKG5vZGUsYXR0cil7aWYoYXR0ci5tb2RlIT09dW5kZWZpbmVkKXtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXtub2RlLnRpbWVzdGFtcD1hdHRyLnRpbWVzdGFtcH1pZihhdHRyLnNpemUhPT11bmRlZmluZWQpe01FTUZTLnJlc2l6ZUZpbGVTdG9yYWdlKG5vZGUsYXR0ci5zaXplKX19KSxsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt0aHJvdyBGUy5nZW5lcmljRXJyb3JzW0VSUk5PX0NPREVTLkVOT0VOVF19KSxta25vZDooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe3JldHVybiBNRU1GUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUsZGV2KX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkX25vZGUsbmV3X2RpcixuZXdfbmFtZSl7aWYoRlMuaXNEaXIob2xkX25vZGUubW9kZSkpe3ZhciBuZXdfbm9kZTt0cnl7bmV3X25vZGU9RlMubG9va3VwTm9kZShuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt9aWYobmV3X25vZGUpe2Zvcih2YXIgaSBpbiBuZXdfbm9kZS5jb250ZW50cyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVEVNUFRZKX19fWRlbGV0ZSBvbGRfbm9kZS5wYXJlbnQuY29udGVudHNbb2xkX25vZGUubmFtZV07b2xkX25vZGUubmFtZT1uZXdfbmFtZTtuZXdfZGlyLmNvbnRlbnRzW25ld19uYW1lXT1vbGRfbm9kZTtvbGRfbm9kZS5wYXJlbnQ9bmV3X2Rpcn0pLHVubGluazooZnVuY3Rpb24ocGFyZW50LG5hbWUpe2RlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19KSxybWRpcjooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO2Zvcih2YXIgaSBpbiBub2RlLmNvbnRlbnRzKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9URU1QVFkpfWRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19KSxyZWFkZGlyOihmdW5jdGlvbihub2RlKXt2YXIgZW50cmllcz1bXCIuXCIsXCIuLlwiXTtmb3IodmFyIGtleSBpbiBub2RlLmNvbnRlbnRzKXtpZighbm9kZS5jb250ZW50cy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtjb250aW51ZX1lbnRyaWVzLnB1c2goa2V5KX1yZXR1cm4gZW50cmllc30pLHN5bWxpbms6KGZ1bmN0aW9uKHBhcmVudCxuZXduYW1lLG9sZHBhdGgpe3ZhciBub2RlPU1FTUZTLmNyZWF0ZU5vZGUocGFyZW50LG5ld25hbWUsNTExfDQwOTYwLDApO25vZGUubGluaz1vbGRwYXRoO3JldHVybiBub2RlfSkscmVhZGxpbms6KGZ1bmN0aW9uKG5vZGUpe2lmKCFGUy5pc0xpbmsobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZXR1cm4gbm9kZS5saW5rfSl9LHN0cmVhbV9vcHM6e3JlYWQ6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbil7dmFyIGNvbnRlbnRzPXN0cmVhbS5ub2RlLmNvbnRlbnRzO2lmKHBvc2l0aW9uPj1zdHJlYW0ubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHNpemU9TWF0aC5taW4oc3RyZWFtLm5vZGUudXNlZEJ5dGVzLXBvc2l0aW9uLGxlbmd0aCk7YXNzZXJ0KHNpemU+PTApO2lmKHNpemU+OCYmY29udGVudHMuc3ViYXJyYXkpe2J1ZmZlci5zZXQoY29udGVudHMuc3ViYXJyYXkocG9zaXRpb24scG9zaXRpb24rc2l6ZSksb2Zmc2V0KX1lbHNle2Zvcih2YXIgaT0wO2k8c2l6ZTtpKyspYnVmZmVyW29mZnNldCtpXT1jb250ZW50c1twb3NpdGlvbitpXX1yZXR1cm4gc2l6ZX0pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24sY2FuT3duKXtpZighbGVuZ3RoKXJldHVybiAwO3ZhciBub2RlPXN0cmVhbS5ub2RlO25vZGUudGltZXN0YW1wPURhdGUubm93KCk7aWYoYnVmZmVyLnN1YmFycmF5JiYoIW5vZGUuY29udGVudHN8fG5vZGUuY29udGVudHMuc3ViYXJyYXkpKXtpZihjYW5Pd24pe25vZGUuY29udGVudHM9YnVmZmVyLnN1YmFycmF5KG9mZnNldCxvZmZzZXQrbGVuZ3RoKTtub2RlLnVzZWRCeXRlcz1sZW5ndGg7cmV0dXJuIGxlbmd0aH1lbHNlIGlmKG5vZGUudXNlZEJ5dGVzPT09MCYmcG9zaXRpb249PT0wKXtub2RlLmNvbnRlbnRzPW5ldyBVaW50OEFycmF5KGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsb2Zmc2V0K2xlbmd0aCkpO25vZGUudXNlZEJ5dGVzPWxlbmd0aDtyZXR1cm4gbGVuZ3RofWVsc2UgaWYocG9zaXRpb24rbGVuZ3RoPD1ub2RlLnVzZWRCeXRlcyl7bm9kZS5jb250ZW50cy5zZXQoYnVmZmVyLnN1YmFycmF5KG9mZnNldCxvZmZzZXQrbGVuZ3RoKSxwb3NpdGlvbik7cmV0dXJuIGxlbmd0aH19TUVNRlMuZXhwYW5kRmlsZVN0b3JhZ2Uobm9kZSxwb3NpdGlvbitsZW5ndGgpO2lmKG5vZGUuY29udGVudHMuc3ViYXJyYXkmJmJ1ZmZlci5zdWJhcnJheSlub2RlLmNvbnRlbnRzLnNldChidWZmZXIuc3ViYXJyYXkob2Zmc2V0LG9mZnNldCtsZW5ndGgpLHBvc2l0aW9uKTtlbHNle2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7bm9kZS5jb250ZW50c1twb3NpdGlvbitpXT1idWZmZXJbb2Zmc2V0K2ldfX1ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChub2RlLnVzZWRCeXRlcyxwb3NpdGlvbitsZW5ndGgpO3JldHVybiBsZW5ndGh9KSxsbHNlZWs6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsd2hlbmNlKXt2YXIgcG9zaXRpb249b2Zmc2V0O2lmKHdoZW5jZT09PTEpe3Bvc2l0aW9uKz1zdHJlYW0ucG9zaXRpb259ZWxzZSBpZih3aGVuY2U9PT0yKXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3Bvc2l0aW9uKz1zdHJlYW0ubm9kZS51c2VkQnl0ZXN9fWlmKHBvc2l0aW9uPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9cmV0dXJuIHBvc2l0aW9ufSksYWxsb2NhdGU6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsbGVuZ3RoKXtNRU1GUy5leHBhbmRGaWxlU3RvcmFnZShzdHJlYW0ubm9kZSxvZmZzZXQrbGVuZ3RoKTtzdHJlYW0ubm9kZS51c2VkQnl0ZXM9TWF0aC5tYXgoc3RyZWFtLm5vZGUudXNlZEJ5dGVzLG9mZnNldCtsZW5ndGgpfSksbW1hcDooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLHByb3QsZmxhZ3Mpe2lmKCFGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9dmFyIHB0cjt2YXIgYWxsb2NhdGVkO3ZhciBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50cztpZighKGZsYWdzJjIpJiYoY29udGVudHMuYnVmZmVyPT09YnVmZmVyfHxjb250ZW50cy5idWZmZXI9PT1idWZmZXIuYnVmZmVyKSl7YWxsb2NhdGVkPWZhbHNlO3B0cj1jb250ZW50cy5ieXRlT2Zmc2V0fWVsc2V7aWYocG9zaXRpb24+MHx8cG9zaXRpb24rbGVuZ3RoPHN0cmVhbS5ub2RlLnVzZWRCeXRlcyl7aWYoY29udGVudHMuc3ViYXJyYXkpe2NvbnRlbnRzPWNvbnRlbnRzLnN1YmFycmF5KHBvc2l0aW9uLHBvc2l0aW9uK2xlbmd0aCl9ZWxzZXtjb250ZW50cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb250ZW50cyxwb3NpdGlvbixwb3NpdGlvbitsZW5ndGgpfX1hbGxvY2F0ZWQ9dHJ1ZTtwdHI9X21hbGxvYyhsZW5ndGgpO2lmKCFwdHIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT01FTSl9YnVmZmVyLnNldChjb250ZW50cyxwdHIpfXJldHVybntwdHI6cHRyLGFsbG9jYXRlZDphbGxvY2F0ZWR9fSksbXN5bmM6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxtbWFwRmxhZ3Mpe2lmKCFGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9aWYobW1hcEZsYWdzJjIpe3JldHVybiAwfXZhciBieXRlc1dyaXR0ZW49TUVNRlMuc3RyZWFtX29wcy53cml0ZShzdHJlYW0sYnVmZmVyLDAsbGVuZ3RoLG9mZnNldCxmYWxzZSk7cmV0dXJuIDB9KX19O3ZhciBJREJGUz17ZGJzOnt9LGluZGV4ZWREQjooZnVuY3Rpb24oKXtpZih0eXBlb2YgaW5kZXhlZERCIT09XCJ1bmRlZmluZWRcIilyZXR1cm4gaW5kZXhlZERCO3ZhciByZXQ9bnVsbDtpZih0eXBlb2Ygd2luZG93PT09XCJvYmplY3RcIilyZXQ9d2luZG93LmluZGV4ZWREQnx8d2luZG93Lm1vekluZGV4ZWREQnx8d2luZG93LndlYmtpdEluZGV4ZWREQnx8d2luZG93Lm1zSW5kZXhlZERCO2Fzc2VydChyZXQsXCJJREJGUyB1c2VkLCBidXQgaW5kZXhlZERCIG5vdCBzdXBwb3J0ZWRcIik7cmV0dXJuIHJldH0pLERCX1ZFUlNJT046MjEsREJfU1RPUkVfTkFNRTpcIkZJTEVfREFUQVwiLG1vdW50OihmdW5jdGlvbihtb3VudCl7cmV0dXJuIE1FTUZTLm1vdW50LmFwcGx5KG51bGwsYXJndW1lbnRzKX0pLHN5bmNmczooZnVuY3Rpb24obW91bnQscG9wdWxhdGUsY2FsbGJhY2spe0lEQkZTLmdldExvY2FsU2V0KG1vdW50LChmdW5jdGlvbihlcnIsbG9jYWwpe2lmKGVycilyZXR1cm4gY2FsbGJhY2soZXJyKTtJREJGUy5nZXRSZW1vdGVTZXQobW91bnQsKGZ1bmN0aW9uKGVycixyZW1vdGUpe2lmKGVycilyZXR1cm4gY2FsbGJhY2soZXJyKTt2YXIgc3JjPXBvcHVsYXRlP3JlbW90ZTpsb2NhbDt2YXIgZHN0PXBvcHVsYXRlP2xvY2FsOnJlbW90ZTtJREJGUy5yZWNvbmNpbGUoc3JjLGRzdCxjYWxsYmFjayl9KSl9KSl9KSxnZXREQjooZnVuY3Rpb24obmFtZSxjYWxsYmFjayl7dmFyIGRiPUlEQkZTLmRic1tuYW1lXTtpZihkYil7cmV0dXJuIGNhbGxiYWNrKG51bGwsZGIpfXZhciByZXE7dHJ5e3JlcT1JREJGUy5pbmRleGVkREIoKS5vcGVuKG5hbWUsSURCRlMuREJfVkVSU0lPTil9Y2F0Y2goZSl7cmV0dXJuIGNhbGxiYWNrKGUpfXJlcS5vbnVwZ3JhZGVuZWVkZWQ9KGZ1bmN0aW9uKGUpe3ZhciBkYj1lLnRhcmdldC5yZXN1bHQ7dmFyIHRyYW5zYWN0aW9uPWUudGFyZ2V0LnRyYW5zYWN0aW9uO3ZhciBmaWxlU3RvcmU7aWYoZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhJREJGUy5EQl9TVE9SRV9OQU1FKSl7ZmlsZVN0b3JlPXRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKElEQkZTLkRCX1NUT1JFX05BTUUpfWVsc2V7ZmlsZVN0b3JlPWRiLmNyZWF0ZU9iamVjdFN0b3JlKElEQkZTLkRCX1NUT1JFX05BTUUpfWlmKCFmaWxlU3RvcmUuaW5kZXhOYW1lcy5jb250YWlucyhcInRpbWVzdGFtcFwiKSl7ZmlsZVN0b3JlLmNyZWF0ZUluZGV4KFwidGltZXN0YW1wXCIsXCJ0aW1lc3RhbXBcIix7dW5pcXVlOmZhbHNlfSl9fSk7cmVxLm9uc3VjY2Vzcz0oZnVuY3Rpb24oKXtkYj1yZXEucmVzdWx0O0lEQkZTLmRic1tuYW1lXT1kYjtjYWxsYmFjayhudWxsLGRiKX0pO3JlcS5vbmVycm9yPShmdW5jdGlvbihlKXtjYWxsYmFjayh0aGlzLmVycm9yKTtlLnByZXZlbnREZWZhdWx0KCl9KX0pLGdldExvY2FsU2V0OihmdW5jdGlvbihtb3VudCxjYWxsYmFjayl7dmFyIGVudHJpZXM9e307ZnVuY3Rpb24gaXNSZWFsRGlyKHApe3JldHVybiBwIT09XCIuXCImJnAhPT1cIi4uXCJ9ZnVuY3Rpb24gdG9BYnNvbHV0ZShyb290KXtyZXR1cm4oZnVuY3Rpb24ocCl7cmV0dXJuIFBBVEguam9pbjIocm9vdCxwKX0pfXZhciBjaGVjaz1GUy5yZWFkZGlyKG1vdW50Lm1vdW50cG9pbnQpLmZpbHRlcihpc1JlYWxEaXIpLm1hcCh0b0Fic29sdXRlKG1vdW50Lm1vdW50cG9pbnQpKTt3aGlsZShjaGVjay5sZW5ndGgpe3ZhciBwYXRoPWNoZWNrLnBvcCgpO3ZhciBzdGF0O3RyeXtzdGF0PUZTLnN0YXQocGF0aCl9Y2F0Y2goZSl7cmV0dXJuIGNhbGxiYWNrKGUpfWlmKEZTLmlzRGlyKHN0YXQubW9kZSkpe2NoZWNrLnB1c2guYXBwbHkoY2hlY2ssRlMucmVhZGRpcihwYXRoKS5maWx0ZXIoaXNSZWFsRGlyKS5tYXAodG9BYnNvbHV0ZShwYXRoKSkpfWVudHJpZXNbcGF0aF09e3RpbWVzdGFtcDpzdGF0Lm10aW1lfX1yZXR1cm4gY2FsbGJhY2sobnVsbCx7dHlwZTpcImxvY2FsXCIsZW50cmllczplbnRyaWVzfSl9KSxnZXRSZW1vdGVTZXQ6KGZ1bmN0aW9uKG1vdW50LGNhbGxiYWNrKXt2YXIgZW50cmllcz17fTtJREJGUy5nZXREQihtb3VudC5tb3VudHBvaW50LChmdW5jdGlvbihlcnIsZGIpe2lmKGVycilyZXR1cm4gY2FsbGJhY2soZXJyKTt2YXIgdHJhbnNhY3Rpb249ZGIudHJhbnNhY3Rpb24oW0lEQkZTLkRCX1NUT1JFX05BTUVdLFwicmVhZG9ubHlcIik7dHJhbnNhY3Rpb24ub25lcnJvcj0oZnVuY3Rpb24oZSl7Y2FsbGJhY2sodGhpcy5lcnJvcik7ZS5wcmV2ZW50RGVmYXVsdCgpfSk7dmFyIHN0b3JlPXRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKElEQkZTLkRCX1NUT1JFX05BTUUpO3ZhciBpbmRleD1zdG9yZS5pbmRleChcInRpbWVzdGFtcFwiKTtpbmRleC5vcGVuS2V5Q3Vyc29yKCkub25zdWNjZXNzPShmdW5jdGlvbihldmVudCl7dmFyIGN1cnNvcj1ldmVudC50YXJnZXQucmVzdWx0O2lmKCFjdXJzb3Ipe3JldHVybiBjYWxsYmFjayhudWxsLHt0eXBlOlwicmVtb3RlXCIsZGI6ZGIsZW50cmllczplbnRyaWVzfSl9ZW50cmllc1tjdXJzb3IucHJpbWFyeUtleV09e3RpbWVzdGFtcDpjdXJzb3Iua2V5fTtjdXJzb3IuY29udGludWUoKX0pfSkpfSksbG9hZExvY2FsRW50cnk6KGZ1bmN0aW9uKHBhdGgsY2FsbGJhY2spe3ZhciBzdGF0LG5vZGU7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTtub2RlPWxvb2t1cC5ub2RlO3N0YXQ9RlMuc3RhdChwYXRoKX1jYXRjaChlKXtyZXR1cm4gY2FsbGJhY2soZSl9aWYoRlMuaXNEaXIoc3RhdC5tb2RlKSl7cmV0dXJuIGNhbGxiYWNrKG51bGwse3RpbWVzdGFtcDpzdGF0Lm10aW1lLG1vZGU6c3RhdC5tb2RlfSl9ZWxzZSBpZihGUy5pc0ZpbGUoc3RhdC5tb2RlKSl7bm9kZS5jb250ZW50cz1NRU1GUy5nZXRGaWxlRGF0YUFzVHlwZWRBcnJheShub2RlKTtyZXR1cm4gY2FsbGJhY2sobnVsbCx7dGltZXN0YW1wOnN0YXQubXRpbWUsbW9kZTpzdGF0Lm1vZGUsY29udGVudHM6bm9kZS5jb250ZW50c30pfWVsc2V7cmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkXCIpKX19KSxzdG9yZUxvY2FsRW50cnk6KGZ1bmN0aW9uKHBhdGgsZW50cnksY2FsbGJhY2spe3RyeXtpZihGUy5pc0RpcihlbnRyeS5tb2RlKSl7RlMubWtkaXIocGF0aCxlbnRyeS5tb2RlKX1lbHNlIGlmKEZTLmlzRmlsZShlbnRyeS5tb2RlKSl7RlMud3JpdGVGaWxlKHBhdGgsZW50cnkuY29udGVudHMse2VuY29kaW5nOlwiYmluYXJ5XCIsY2FuT3duOnRydWV9KX1lbHNle3JldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJub2RlIHR5cGUgbm90IHN1cHBvcnRlZFwiKSl9RlMuY2htb2QocGF0aCxlbnRyeS5tb2RlKTtGUy51dGltZShwYXRoLGVudHJ5LnRpbWVzdGFtcCxlbnRyeS50aW1lc3RhbXApfWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1jYWxsYmFjayhudWxsKX0pLHJlbW92ZUxvY2FsRW50cnk6KGZ1bmN0aW9uKHBhdGgsY2FsbGJhY2spe3RyeXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCk7dmFyIHN0YXQ9RlMuc3RhdChwYXRoKTtpZihGUy5pc0RpcihzdGF0Lm1vZGUpKXtGUy5ybWRpcihwYXRoKX1lbHNlIGlmKEZTLmlzRmlsZShzdGF0Lm1vZGUpKXtGUy51bmxpbmsocGF0aCl9fWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1jYWxsYmFjayhudWxsKX0pLGxvYWRSZW1vdGVFbnRyeTooZnVuY3Rpb24oc3RvcmUscGF0aCxjYWxsYmFjayl7dmFyIHJlcT1zdG9yZS5nZXQocGF0aCk7cmVxLm9uc3VjY2Vzcz0oZnVuY3Rpb24oZXZlbnQpe2NhbGxiYWNrKG51bGwsZXZlbnQudGFyZ2V0LnJlc3VsdCl9KTtyZXEub25lcnJvcj0oZnVuY3Rpb24oZSl7Y2FsbGJhY2sodGhpcy5lcnJvcik7ZS5wcmV2ZW50RGVmYXVsdCgpfSl9KSxzdG9yZVJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGVudHJ5LGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLnB1dChlbnRyeSxwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbigpe2NhbGxiYWNrKG51bGwpfSk7cmVxLm9uZXJyb3I9KGZ1bmN0aW9uKGUpe2NhbGxiYWNrKHRoaXMuZXJyb3IpO2UucHJldmVudERlZmF1bHQoKX0pfSkscmVtb3ZlUmVtb3RlRW50cnk6KGZ1bmN0aW9uKHN0b3JlLHBhdGgsY2FsbGJhY2spe3ZhciByZXE9c3RvcmUuZGVsZXRlKHBhdGgpO3JlcS5vbnN1Y2Nlc3M9KGZ1bmN0aW9uKCl7Y2FsbGJhY2sobnVsbCl9KTtyZXEub25lcnJvcj0oZnVuY3Rpb24oZSl7Y2FsbGJhY2sodGhpcy5lcnJvcik7ZS5wcmV2ZW50RGVmYXVsdCgpfSl9KSxyZWNvbmNpbGU6KGZ1bmN0aW9uKHNyYyxkc3QsY2FsbGJhY2spe3ZhciB0b3RhbD0wO3ZhciBjcmVhdGU9W107T2JqZWN0LmtleXMoc3JjLmVudHJpZXMpLmZvckVhY2goKGZ1bmN0aW9uKGtleSl7dmFyIGU9c3JjLmVudHJpZXNba2V5XTt2YXIgZTI9ZHN0LmVudHJpZXNba2V5XTtpZighZTJ8fGUudGltZXN0YW1wPmUyLnRpbWVzdGFtcCl7Y3JlYXRlLnB1c2goa2V5KTt0b3RhbCsrfX0pKTt2YXIgcmVtb3ZlPVtdO09iamVjdC5rZXlzKGRzdC5lbnRyaWVzKS5mb3JFYWNoKChmdW5jdGlvbihrZXkpe3ZhciBlPWRzdC5lbnRyaWVzW2tleV07dmFyIGUyPXNyYy5lbnRyaWVzW2tleV07aWYoIWUyKXtyZW1vdmUucHVzaChrZXkpO3RvdGFsKyt9fSkpO2lmKCF0b3RhbCl7cmV0dXJuIGNhbGxiYWNrKG51bGwpfXZhciBlcnJvcmVkPWZhbHNlO3ZhciBjb21wbGV0ZWQ9MDt2YXIgZGI9c3JjLnR5cGU9PT1cInJlbW90ZVwiP3NyYy5kYjpkc3QuZGI7dmFyIHRyYW5zYWN0aW9uPWRiLnRyYW5zYWN0aW9uKFtJREJGUy5EQl9TVE9SRV9OQU1FXSxcInJlYWR3cml0ZVwiKTt2YXIgc3RvcmU9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoSURCRlMuREJfU1RPUkVfTkFNRSk7ZnVuY3Rpb24gZG9uZShlcnIpe2lmKGVycil7aWYoIWRvbmUuZXJyb3JlZCl7ZG9uZS5lcnJvcmVkPXRydWU7cmV0dXJuIGNhbGxiYWNrKGVycil9cmV0dXJufWlmKCsrY29tcGxldGVkPj10b3RhbCl7cmV0dXJuIGNhbGxiYWNrKG51bGwpfX10cmFuc2FjdGlvbi5vbmVycm9yPShmdW5jdGlvbihlKXtkb25lKHRoaXMuZXJyb3IpO2UucHJldmVudERlZmF1bHQoKX0pO2NyZWF0ZS5zb3J0KCkuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7aWYoZHN0LnR5cGU9PT1cImxvY2FsXCIpe0lEQkZTLmxvYWRSZW1vdGVFbnRyeShzdG9yZSxwYXRoLChmdW5jdGlvbihlcnIsZW50cnkpe2lmKGVycilyZXR1cm4gZG9uZShlcnIpO0lEQkZTLnN0b3JlTG9jYWxFbnRyeShwYXRoLGVudHJ5LGRvbmUpfSkpfWVsc2V7SURCRlMubG9hZExvY2FsRW50cnkocGF0aCwoZnVuY3Rpb24oZXJyLGVudHJ5KXtpZihlcnIpcmV0dXJuIGRvbmUoZXJyKTtJREJGUy5zdG9yZVJlbW90ZUVudHJ5KHN0b3JlLHBhdGgsZW50cnksZG9uZSl9KSl9fSkpO3JlbW92ZS5zb3J0KCkucmV2ZXJzZSgpLmZvckVhY2goKGZ1bmN0aW9uKHBhdGgpe2lmKGRzdC50eXBlPT09XCJsb2NhbFwiKXtJREJGUy5yZW1vdmVMb2NhbEVudHJ5KHBhdGgsZG9uZSl9ZWxzZXtJREJGUy5yZW1vdmVSZW1vdGVFbnRyeShzdG9yZSxwYXRoLGRvbmUpfX0pKX0pfTt2YXIgTk9ERUZTPXtpc1dpbmRvd3M6ZmFsc2Usc3RhdGljSW5pdDooZnVuY3Rpb24oKXtOT0RFRlMuaXNXaW5kb3dzPSEhcHJvY2Vzcy5wbGF0Zm9ybS5tYXRjaCgvXndpbi8pfSksbW91bnQ6KGZ1bmN0aW9uKG1vdW50KXthc3NlcnQoRU5WSVJPTk1FTlRfSVNfTk9ERSk7cmV0dXJuIE5PREVGUy5jcmVhdGVOb2RlKG51bGwsXCIvXCIsTk9ERUZTLmdldE1vZGUobW91bnQub3B0cy5yb290KSwwKX0pLGNyZWF0ZU5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUsZGV2KXtpZighRlMuaXNEaXIobW9kZSkmJiFGUy5pc0ZpbGUobW9kZSkmJiFGUy5pc0xpbmsobW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIG5vZGU9RlMuY3JlYXRlTm9kZShwYXJlbnQsbmFtZSxtb2RlKTtub2RlLm5vZGVfb3BzPU5PREVGUy5ub2RlX29wcztub2RlLnN0cmVhbV9vcHM9Tk9ERUZTLnN0cmVhbV9vcHM7cmV0dXJuIG5vZGV9KSxnZXRNb2RlOihmdW5jdGlvbihwYXRoKXt2YXIgc3RhdDt0cnl7c3RhdD1mcy5sc3RhdFN5bmMocGF0aCk7aWYoTk9ERUZTLmlzV2luZG93cyl7c3RhdC5tb2RlPXN0YXQubW9kZXwoc3RhdC5tb2RlJjE0Nik+PjF9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm4gc3RhdC5tb2RlfSkscmVhbFBhdGg6KGZ1bmN0aW9uKG5vZGUpe3ZhciBwYXJ0cz1bXTt3aGlsZShub2RlLnBhcmVudCE9PW5vZGUpe3BhcnRzLnB1c2gobm9kZS5uYW1lKTtub2RlPW5vZGUucGFyZW50fXBhcnRzLnB1c2gobm9kZS5tb3VudC5vcHRzLnJvb3QpO3BhcnRzLnJldmVyc2UoKTtyZXR1cm4gUEFUSC5qb2luLmFwcGx5KG51bGwscGFydHMpfSksZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXA6ezA6XCJyXCIsMTpcInIrXCIsMjpcInIrXCIsNjQ6XCJyXCIsNjU6XCJyK1wiLDY2OlwicitcIiwxMjk6XCJyeCtcIiwxOTM6XCJyeCtcIiw1MTQ6XCJ3K1wiLDU3NzpcIndcIiw1Nzg6XCJ3K1wiLDcwNTpcInd4XCIsNzA2Olwid3grXCIsMTAyNDpcImFcIiwxMDI1OlwiYVwiLDEwMjY6XCJhK1wiLDEwODk6XCJhXCIsMTA5MDpcImErXCIsMTE1MzpcImF4XCIsMTE1NDpcImF4K1wiLDEyMTc6XCJheFwiLDEyMTg6XCJheCtcIiw0MDk2OlwicnNcIiw0MDk4OlwicnMrXCJ9LGZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nOihmdW5jdGlvbihmbGFncyl7ZmxhZ3MmPX4zMjc2ODtpZihmbGFncyBpbiBOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXApe3JldHVybiBOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXBbZmxhZ3NdfWVsc2V7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX19KSxub2RlX29wczp7Z2V0YXR0cjooZnVuY3Rpb24obm9kZSl7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3ZhciBzdGF0O3RyeXtzdGF0PWZzLmxzdGF0U3luYyhwYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9aWYoTk9ERUZTLmlzV2luZG93cyYmIXN0YXQuYmxrc2l6ZSl7c3RhdC5ibGtzaXplPTQwOTZ9aWYoTk9ERUZTLmlzV2luZG93cyYmIXN0YXQuYmxvY2tzKXtzdGF0LmJsb2Nrcz0oc3RhdC5zaXplK3N0YXQuYmxrc2l6ZS0xKS9zdGF0LmJsa3NpemV8MH1yZXR1cm57ZGV2OnN0YXQuZGV2LGlubzpzdGF0Lmlubyxtb2RlOnN0YXQubW9kZSxubGluazpzdGF0Lm5saW5rLHVpZDpzdGF0LnVpZCxnaWQ6c3RhdC5naWQscmRldjpzdGF0LnJkZXYsc2l6ZTpzdGF0LnNpemUsYXRpbWU6c3RhdC5hdGltZSxtdGltZTpzdGF0Lm10aW1lLGN0aW1lOnN0YXQuY3RpbWUsYmxrc2l6ZTpzdGF0LmJsa3NpemUsYmxvY2tzOnN0YXQuYmxvY2tzfX0pLHNldGF0dHI6KGZ1bmN0aW9uKG5vZGUsYXR0cil7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3RyeXtpZihhdHRyLm1vZGUhPT11bmRlZmluZWQpe2ZzLmNobW9kU3luYyhwYXRoLGF0dHIubW9kZSk7bm9kZS5tb2RlPWF0dHIubW9kZX1pZihhdHRyLnRpbWVzdGFtcCE9PXVuZGVmaW5lZCl7dmFyIGRhdGU9bmV3IERhdGUoYXR0ci50aW1lc3RhbXApO2ZzLnV0aW1lc1N5bmMocGF0aCxkYXRlLGRhdGUpfWlmKGF0dHIuc2l6ZSE9PXVuZGVmaW5lZCl7ZnMudHJ1bmNhdGVTeW5jKHBhdGgsYXR0ci5zaXplKX19Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvdyBlO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfX0pLGxvb2t1cDooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3ZhciBwYXRoPVBBVEguam9pbjIoTk9ERUZTLnJlYWxQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9Tk9ERUZTLmdldE1vZGUocGF0aCk7cmV0dXJuIE5PREVGUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUpfSksbWtub2Q6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUsZGV2KXt2YXIgbm9kZT1OT0RFRlMuY3JlYXRlTm9kZShwYXJlbnQsbmFtZSxtb2RlLGRldik7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3RyeXtpZihGUy5pc0Rpcihub2RlLm1vZGUpKXtmcy5ta2RpclN5bmMocGF0aCxub2RlLm1vZGUpfWVsc2V7ZnMud3JpdGVGaWxlU3luYyhwYXRoLFwiXCIse21vZGU6bm9kZS5tb2RlfSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm4gbm9kZX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkTm9kZSxuZXdEaXIsbmV3TmFtZSl7dmFyIG9sZFBhdGg9Tk9ERUZTLnJlYWxQYXRoKG9sZE5vZGUpO3ZhciBuZXdQYXRoPVBBVEguam9pbjIoTk9ERUZTLnJlYWxQYXRoKG5ld0RpciksbmV3TmFtZSk7dHJ5e2ZzLnJlbmFtZVN5bmMob2xkUGF0aCxuZXdQYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSksdW5saW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIHBhdGg9UEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgocGFyZW50KSxuYW1lKTt0cnl7ZnMudW5saW5rU3luYyhwYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXIgcGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5hbWUpO3RyeXtmcy5ybWRpclN5bmMocGF0aCl9Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvdyBlO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfX0pLHJlYWRkaXI6KGZ1bmN0aW9uKG5vZGUpe3ZhciBwYXRoPU5PREVGUy5yZWFsUGF0aChub2RlKTt0cnl7cmV0dXJuIGZzLnJlYWRkaXJTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxzeW1saW5rOihmdW5jdGlvbihwYXJlbnQsbmV3TmFtZSxvbGRQYXRoKXt2YXIgbmV3UGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5ld05hbWUpO3RyeXtmcy5zeW1saW5rU3luYyhvbGRQYXRoLG5ld1BhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkbGluazooZnVuY3Rpb24obm9kZSl7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3RyeXtwYXRoPWZzLnJlYWRsaW5rU3luYyhwYXRoKTtwYXRoPU5PREVKU19QQVRILnJlbGF0aXZlKE5PREVKU19QQVRILnJlc29sdmUobm9kZS5tb3VudC5vcHRzLnJvb3QpLHBhdGgpO3JldHVybiBwYXRofWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KX0sc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgoc3RyZWFtLm5vZGUpO3RyeXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3N0cmVhbS5uZmQ9ZnMub3BlblN5bmMocGF0aCxOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoc3RyZWFtLmZsYWdzKSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXt0cnl7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpJiZzdHJlYW0ubmZkKXtmcy5jbG9zZVN5bmMoc3RyZWFtLm5mZCl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe2lmKGxlbmd0aD09PTApcmV0dXJuIDA7dmFyIG5idWZmZXI9bmV3IEJ1ZmZlcihsZW5ndGgpO3ZhciByZXM7dHJ5e3Jlcz1mcy5yZWFkU3luYyhzdHJlYW0ubmZkLG5idWZmZXIsMCxsZW5ndGgscG9zaXRpb24pfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfWlmKHJlcz4wKXtmb3IodmFyIGk9MDtpPHJlcztpKyspe2J1ZmZlcltvZmZzZXQraV09bmJ1ZmZlcltpXX19cmV0dXJuIHJlc30pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBuYnVmZmVyPW5ldyBCdWZmZXIoYnVmZmVyLnN1YmFycmF5KG9mZnNldCxvZmZzZXQrbGVuZ3RoKSk7dmFyIHJlczt0cnl7cmVzPWZzLndyaXRlU3luYyhzdHJlYW0ubmZkLG5idWZmZXIsMCxsZW5ndGgscG9zaXRpb24pfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfXJldHVybiByZXN9KSxsbHNlZWs6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsd2hlbmNlKXt2YXIgcG9zaXRpb249b2Zmc2V0O2lmKHdoZW5jZT09PTEpe3Bvc2l0aW9uKz1zdHJlYW0ucG9zaXRpb259ZWxzZSBpZih3aGVuY2U9PT0yKXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3RyeXt2YXIgc3RhdD1mcy5mc3RhdFN5bmMoc3RyZWFtLm5mZCk7cG9zaXRpb24rPXN0YXQuc2l6ZX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19fWlmKHBvc2l0aW9uPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9cmV0dXJuIHBvc2l0aW9ufSl9fTt2YXIgV09SS0VSRlM9e0RJUl9NT0RFOjE2ODk1LEZJTEVfTU9ERTozMzI3OSxyZWFkZXI6bnVsbCxtb3VudDooZnVuY3Rpb24obW91bnQpe2Fzc2VydChFTlZJUk9OTUVOVF9JU19XT1JLRVIpO2lmKCFXT1JLRVJGUy5yZWFkZXIpV09SS0VSRlMucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYzt2YXIgcm9vdD1XT1JLRVJGUy5jcmVhdGVOb2RlKG51bGwsXCIvXCIsV09SS0VSRlMuRElSX01PREUsMCk7dmFyIGNyZWF0ZWRQYXJlbnRzPXt9O2Z1bmN0aW9uIGVuc3VyZVBhcmVudChwYXRoKXt2YXIgcGFydHM9cGF0aC5zcGxpdChcIi9cIik7dmFyIHBhcmVudD1yb290O2Zvcih2YXIgaT0wO2k8cGFydHMubGVuZ3RoLTE7aSsrKXt2YXIgY3Vycj1wYXJ0cy5zbGljZSgwLGkrMSkuam9pbihcIi9cIik7aWYoIWNyZWF0ZWRQYXJlbnRzW2N1cnJdKXtjcmVhdGVkUGFyZW50c1tjdXJyXT1XT1JLRVJGUy5jcmVhdGVOb2RlKHBhcmVudCxjdXJyLFdPUktFUkZTLkRJUl9NT0RFLDApfXBhcmVudD1jcmVhdGVkUGFyZW50c1tjdXJyXX1yZXR1cm4gcGFyZW50fWZ1bmN0aW9uIGJhc2UocGF0aCl7dmFyIHBhcnRzPXBhdGguc3BsaXQoXCIvXCIpO3JldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGgtMV19QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtb3VudC5vcHRzW1wiZmlsZXNcIl18fFtdLChmdW5jdGlvbihmaWxlKXtXT1JLRVJGUy5jcmVhdGVOb2RlKGVuc3VyZVBhcmVudChmaWxlLm5hbWUpLGJhc2UoZmlsZS5uYW1lKSxXT1JLRVJGUy5GSUxFX01PREUsMCxmaWxlLGZpbGUubGFzdE1vZGlmaWVkRGF0ZSl9KSk7KG1vdW50Lm9wdHNbXCJibG9ic1wiXXx8W10pLmZvckVhY2goKGZ1bmN0aW9uKG9iail7V09SS0VSRlMuY3JlYXRlTm9kZShlbnN1cmVQYXJlbnQob2JqW1wibmFtZVwiXSksYmFzZShvYmpbXCJuYW1lXCJdKSxXT1JLRVJGUy5GSUxFX01PREUsMCxvYmpbXCJkYXRhXCJdKX0pKTsobW91bnQub3B0c1tcInBhY2thZ2VzXCJdfHxbXSkuZm9yRWFjaCgoZnVuY3Rpb24ocGFjayl7cGFja1tcIm1ldGFkYXRhXCJdLmZpbGVzLmZvckVhY2goKGZ1bmN0aW9uKGZpbGUpe3ZhciBuYW1lPWZpbGUuZmlsZW5hbWUuc3Vic3RyKDEpO1dPUktFUkZTLmNyZWF0ZU5vZGUoZW5zdXJlUGFyZW50KG5hbWUpLGJhc2UobmFtZSksV09SS0VSRlMuRklMRV9NT0RFLDAscGFja1tcImJsb2JcIl0uc2xpY2UoZmlsZS5zdGFydCxmaWxlLmVuZCkpfSkpfSkpO3JldHVybiByb290fSksY3JlYXRlTm9kZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYsY29udGVudHMsbXRpbWUpe3ZhciBub2RlPUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSk7bm9kZS5tb2RlPW1vZGU7bm9kZS5ub2RlX29wcz1XT1JLRVJGUy5ub2RlX29wcztub2RlLnN0cmVhbV9vcHM9V09SS0VSRlMuc3RyZWFtX29wcztub2RlLnRpbWVzdGFtcD0obXRpbWV8fG5ldyBEYXRlKS5nZXRUaW1lKCk7YXNzZXJ0KFdPUktFUkZTLkZJTEVfTU9ERSE9PVdPUktFUkZTLkRJUl9NT0RFKTtpZihtb2RlPT09V09SS0VSRlMuRklMRV9NT0RFKXtub2RlLnNpemU9Y29udGVudHMuc2l6ZTtub2RlLmNvbnRlbnRzPWNvbnRlbnRzfWVsc2V7bm9kZS5zaXplPTQwOTY7bm9kZS5jb250ZW50cz17fX1pZihwYXJlbnQpe3BhcmVudC5jb250ZW50c1tuYW1lXT1ub2RlfXJldHVybiBub2RlfSksbm9kZV9vcHM6e2dldGF0dHI6KGZ1bmN0aW9uKG5vZGUpe3JldHVybntkZXY6MSxpbm86dW5kZWZpbmVkLG1vZGU6bm9kZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjp1bmRlZmluZWQsc2l6ZTpub2RlLnNpemUsYXRpbWU6bmV3IERhdGUobm9kZS50aW1lc3RhbXApLG10aW1lOm5ldyBEYXRlKG5vZGUudGltZXN0YW1wKSxjdGltZTpuZXcgRGF0ZShub2RlLnRpbWVzdGFtcCksYmxrc2l6ZTo0MDk2LGJsb2NrczpNYXRoLmNlaWwobm9kZS5zaXplLzQwOTYpfX0pLHNldGF0dHI6KGZ1bmN0aW9uKG5vZGUsYXR0cil7aWYoYXR0ci5tb2RlIT09dW5kZWZpbmVkKXtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXtub2RlLnRpbWVzdGFtcD1hdHRyLnRpbWVzdGFtcH19KSxsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfSksbWtub2Q6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUsZGV2KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9KSxyZW5hbWU6KGZ1bmN0aW9uKG9sZE5vZGUsbmV3RGlyLG5ld05hbWUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX0pLHVubGluazooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX0pLHJtZGlyOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfSkscmVhZGRpcjooZnVuY3Rpb24obm9kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfSksc3ltbGluazooZnVuY3Rpb24ocGFyZW50LG5ld05hbWUsb2xkUGF0aCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfSkscmVhZGxpbms6KGZ1bmN0aW9uKG5vZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX0pfSxzdHJlYW1fb3BzOntyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe2lmKHBvc2l0aW9uPj1zdHJlYW0ubm9kZS5zaXplKXJldHVybiAwO3ZhciBjaHVuaz1zdHJlYW0ubm9kZS5jb250ZW50cy5zbGljZShwb3NpdGlvbixwb3NpdGlvbitsZW5ndGgpO3ZhciBhYj1XT1JLRVJGUy5yZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoY2h1bmspO2J1ZmZlci5zZXQobmV3IFVpbnQ4QXJyYXkoYWIpLG9mZnNldCk7cmV0dXJuIGNodW5rLnNpemV9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfSksbGxzZWVrOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7dmFyIHBvc2l0aW9uPW9mZnNldDtpZih3aGVuY2U9PT0xKXtwb3NpdGlvbis9c3RyZWFtLnBvc2l0aW9ufWVsc2UgaWYod2hlbmNlPT09Mil7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXtwb3NpdGlvbis9c3RyZWFtLm5vZGUuc2l6ZX19aWYocG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZXR1cm4gcG9zaXRpb259KX19O3ZhciBfc3RkaW49YWxsb2NhdGUoMSxcImkzMipcIixBTExPQ19TVEFUSUMpO3ZhciBfc3Rkb3V0PWFsbG9jYXRlKDEsXCJpMzIqXCIsQUxMT0NfU1RBVElDKTt2YXIgX3N0ZGVycj1hbGxvY2F0ZSgxLFwiaTMyKlwiLEFMTE9DX1NUQVRJQyk7dmFyIEZTPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6W251bGxdLHN0cmVhbXM6W10sbmV4dElub2RlOjEsbmFtZVRhYmxlOm51bGwsY3VycmVudFBhdGg6XCIvXCIsaW5pdGlhbGl6ZWQ6ZmFsc2UsaWdub3JlUGVybWlzc2lvbnM6dHJ1ZSx0cmFja2luZ0RlbGVnYXRlOnt9LHRyYWNraW5nOntvcGVuRmxhZ3M6e1JFQUQ6MSxXUklURToyfX0sRXJybm9FcnJvcjpudWxsLGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxoYW5kbGVGU0Vycm9yOihmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSl0aHJvdyBlK1wiIDogXCIrc3RhY2tUcmFjZSgpO3JldHVybiBfX19zZXRFcnJObyhlLmVycm5vKX0pLGxvb2t1cFBhdGg6KGZ1bmN0aW9uKHBhdGgsb3B0cyl7cGF0aD1QQVRILnJlc29sdmUoRlMuY3dkKCkscGF0aCk7b3B0cz1vcHRzfHx7fTtpZighcGF0aClyZXR1cm57cGF0aDpcIlwiLG5vZGU6bnVsbH07dmFyIGRlZmF1bHRzPXtmb2xsb3dfbW91bnQ6dHJ1ZSxyZWN1cnNlX2NvdW50OjB9O2Zvcih2YXIga2V5IGluIGRlZmF1bHRzKXtpZihvcHRzW2tleV09PT11bmRlZmluZWQpe29wdHNba2V5XT1kZWZhdWx0c1trZXldfX1pZihvcHRzLnJlY3Vyc2VfY291bnQ+OCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUxPT1ApfXZhciBwYXJ0cz1QQVRILm5vcm1hbGl6ZUFycmF5KHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigoZnVuY3Rpb24ocCl7cmV0dXJuISFwfSkpLGZhbHNlKTt2YXIgY3VycmVudD1GUy5yb290O3ZhciBjdXJyZW50X3BhdGg9XCIvXCI7Zm9yKHZhciBpPTA7aTxwYXJ0cy5sZW5ndGg7aSsrKXt2YXIgaXNsYXN0PWk9PT1wYXJ0cy5sZW5ndGgtMTtpZihpc2xhc3QmJm9wdHMucGFyZW50KXticmVha31jdXJyZW50PUZTLmxvb2t1cE5vZGUoY3VycmVudCxwYXJ0c1tpXSk7Y3VycmVudF9wYXRoPVBBVEguam9pbjIoY3VycmVudF9wYXRoLHBhcnRzW2ldKTtpZihGUy5pc01vdW50cG9pbnQoY3VycmVudCkpe2lmKCFpc2xhc3R8fGlzbGFzdCYmb3B0cy5mb2xsb3dfbW91bnQpe2N1cnJlbnQ9Y3VycmVudC5tb3VudGVkLnJvb3R9fWlmKCFpc2xhc3R8fG9wdHMuZm9sbG93KXt2YXIgY291bnQ9MDt3aGlsZShGUy5pc0xpbmsoY3VycmVudC5tb2RlKSl7dmFyIGxpbms9RlMucmVhZGxpbmsoY3VycmVudF9wYXRoKTtjdXJyZW50X3BhdGg9UEFUSC5yZXNvbHZlKFBBVEguZGlybmFtZShjdXJyZW50X3BhdGgpLGxpbmspO3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChjdXJyZW50X3BhdGgse3JlY3Vyc2VfY291bnQ6b3B0cy5yZWN1cnNlX2NvdW50fSk7Y3VycmVudD1sb29rdXAubm9kZTtpZihjb3VudCsrPjQwKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTE9PUCl9fX19cmV0dXJue3BhdGg6Y3VycmVudF9wYXRoLG5vZGU6Y3VycmVudH19KSxnZXRQYXRoOihmdW5jdGlvbihub2RlKXt2YXIgcGF0aDt3aGlsZSh0cnVlKXtpZihGUy5pc1Jvb3Qobm9kZSkpe3ZhciBtb3VudD1ub2RlLm1vdW50Lm1vdW50cG9pbnQ7aWYoIXBhdGgpcmV0dXJuIG1vdW50O3JldHVybiBtb3VudFttb3VudC5sZW5ndGgtMV0hPT1cIi9cIj9tb3VudCtcIi9cIitwYXRoOm1vdW50K3BhdGh9cGF0aD1wYXRoP25vZGUubmFtZStcIi9cIitwYXRoOm5vZGUubmFtZTtub2RlPW5vZGUucGFyZW50fX0pLGhhc2hOYW1lOihmdW5jdGlvbihwYXJlbnRpZCxuYW1lKXt2YXIgaGFzaD0wO2Zvcih2YXIgaT0wO2k8bmFtZS5sZW5ndGg7aSsrKXtoYXNoPShoYXNoPDw1KS1oYXNoK25hbWUuY2hhckNvZGVBdChpKXwwfXJldHVybihwYXJlbnRpZCtoYXNoPj4+MCklRlMubmFtZVRhYmxlLmxlbmd0aH0pLGhhc2hBZGROb2RlOihmdW5jdGlvbihub2RlKXt2YXIgaGFzaD1GUy5oYXNoTmFtZShub2RlLnBhcmVudC5pZCxub2RlLm5hbWUpO25vZGUubmFtZV9uZXh0PUZTLm5hbWVUYWJsZVtoYXNoXTtGUy5uYW1lVGFibGVbaGFzaF09bm9kZX0pLGhhc2hSZW1vdmVOb2RlOihmdW5jdGlvbihub2RlKXt2YXIgaGFzaD1GUy5oYXNoTmFtZShub2RlLnBhcmVudC5pZCxub2RlLm5hbWUpO2lmKEZTLm5hbWVUYWJsZVtoYXNoXT09PW5vZGUpe0ZTLm5hbWVUYWJsZVtoYXNoXT1ub2RlLm5hbWVfbmV4dH1lbHNle3ZhciBjdXJyZW50PUZTLm5hbWVUYWJsZVtoYXNoXTt3aGlsZShjdXJyZW50KXtpZihjdXJyZW50Lm5hbWVfbmV4dD09PW5vZGUpe2N1cnJlbnQubmFtZV9uZXh0PW5vZGUubmFtZV9uZXh0O2JyZWFrfWN1cnJlbnQ9Y3VycmVudC5uYW1lX25leHR9fX0pLGxvb2t1cE5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXIgZXJyPUZTLm1heUxvb2t1cChwYXJlbnQpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyLHBhcmVudCl9dmFyIGhhc2g9RlMuaGFzaE5hbWUocGFyZW50LmlkLG5hbWUpO2Zvcih2YXIgbm9kZT1GUy5uYW1lVGFibGVbaGFzaF07bm9kZTtub2RlPW5vZGUubmFtZV9uZXh0KXt2YXIgbm9kZU5hbWU9bm9kZS5uYW1lO2lmKG5vZGUucGFyZW50LmlkPT09cGFyZW50LmlkJiZub2RlTmFtZT09PW5hbWUpe3JldHVybiBub2RlfX1yZXR1cm4gRlMubG9va3VwKHBhcmVudCxuYW1lKX0pLGNyZWF0ZU5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUscmRldil7aWYoIUZTLkZTTm9kZSl7RlMuRlNOb2RlPShmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLHJkZXYpe2lmKCFwYXJlbnQpe3BhcmVudD10aGlzfXRoaXMucGFyZW50PXBhcmVudDt0aGlzLm1vdW50PXBhcmVudC5tb3VudDt0aGlzLm1vdW50ZWQ9bnVsbDt0aGlzLmlkPUZTLm5leHRJbm9kZSsrO3RoaXMubmFtZT1uYW1lO3RoaXMubW9kZT1tb2RlO3RoaXMubm9kZV9vcHM9e307dGhpcy5zdHJlYW1fb3BzPXt9O3RoaXMucmRldj1yZGV2fSk7RlMuRlNOb2RlLnByb3RvdHlwZT17fTt2YXIgcmVhZE1vZGU9MjkyfDczO3ZhciB3cml0ZU1vZGU9MTQ2O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZTLkZTTm9kZS5wcm90b3R5cGUse3JlYWQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5tb2RlJnJlYWRNb2RlKT09PXJlYWRNb2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3ZhbD90aGlzLm1vZGV8PXJlYWRNb2RlOnRoaXMubW9kZSY9fnJlYWRNb2RlfSl9LHdyaXRlOntnZXQ6KGZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMubW9kZSZ3cml0ZU1vZGUpPT09d3JpdGVNb2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3ZhbD90aGlzLm1vZGV8PXdyaXRlTW9kZTp0aGlzLm1vZGUmPX53cml0ZU1vZGV9KX0saXNGb2xkZXI6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4gRlMuaXNEaXIodGhpcy5tb2RlKX0pfSxpc0RldmljZTp7Z2V0OihmdW5jdGlvbigpe3JldHVybiBGUy5pc0NocmRldih0aGlzLm1vZGUpfSl9fSl9dmFyIG5vZGU9bmV3IEZTLkZTTm9kZShwYXJlbnQsbmFtZSxtb2RlLHJkZXYpO0ZTLmhhc2hBZGROb2RlKG5vZGUpO3JldHVybiBub2RlfSksZGVzdHJveU5vZGU6KGZ1bmN0aW9uKG5vZGUpe0ZTLmhhc2hSZW1vdmVOb2RlKG5vZGUpfSksaXNSb290OihmdW5jdGlvbihub2RlKXtyZXR1cm4gbm9kZT09PW5vZGUucGFyZW50fSksaXNNb3VudHBvaW50OihmdW5jdGlvbihub2RlKXtyZXR1cm4hIW5vZGUubW91bnRlZH0pLGlzRmlsZTooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MzI3Njh9KSxpc0RpcjooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MTYzODR9KSxpc0xpbms6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTQwOTYwfSksaXNDaHJkZXY6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTgxOTJ9KSxpc0Jsa2RldjooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MjQ1NzZ9KSxpc0ZJRk86KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTQwOTZ9KSxpc1NvY2tldDooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNDkxNTIpPT09NDkxNTJ9KSxmbGFnTW9kZXM6e1wiclwiOjAsXCJyc1wiOjEwNTI2NzIsXCJyK1wiOjIsXCJ3XCI6NTc3LFwid3hcIjo3MDUsXCJ4d1wiOjcwNSxcIncrXCI6NTc4LFwid3grXCI6NzA2LFwieHcrXCI6NzA2LFwiYVwiOjEwODksXCJheFwiOjEyMTcsXCJ4YVwiOjEyMTcsXCJhK1wiOjEwOTAsXCJheCtcIjoxMjE4LFwieGErXCI6MTIxOH0sbW9kZVN0cmluZ1RvRmxhZ3M6KGZ1bmN0aW9uKHN0cil7dmFyIGZsYWdzPUZTLmZsYWdNb2Rlc1tzdHJdO2lmKHR5cGVvZiBmbGFncz09PVwidW5kZWZpbmVkXCIpe3Rocm93IG5ldyBFcnJvcihcIlVua25vd24gZmlsZSBvcGVuIG1vZGU6IFwiK3N0cil9cmV0dXJuIGZsYWdzfSksZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmc6KGZ1bmN0aW9uKGZsYWcpe3ZhciBwZXJtcz1bXCJyXCIsXCJ3XCIsXCJyd1wiXVtmbGFnJjNdO2lmKGZsYWcmNTEyKXtwZXJtcys9XCJ3XCJ9cmV0dXJuIHBlcm1zfSksbm9kZVBlcm1pc3Npb25zOihmdW5jdGlvbihub2RlLHBlcm1zKXtpZihGUy5pZ25vcmVQZXJtaXNzaW9ucyl7cmV0dXJuIDB9aWYocGVybXMuaW5kZXhPZihcInJcIikhPT0tMSYmIShub2RlLm1vZGUmMjkyKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVBQ0NFU31lbHNlIGlmKHBlcm1zLmluZGV4T2YoXCJ3XCIpIT09LTEmJiEobm9kZS5tb2RlJjE0Nikpe3JldHVybiBFUlJOT19DT0RFUy5FQUNDRVN9ZWxzZSBpZihwZXJtcy5pbmRleE9mKFwieFwiKSE9PS0xJiYhKG5vZGUubW9kZSY3Mykpe3JldHVybiBFUlJOT19DT0RFUy5FQUNDRVN9cmV0dXJuIDB9KSxtYXlMb29rdXA6KGZ1bmN0aW9uKGRpcil7dmFyIGVycj1GUy5ub2RlUGVybWlzc2lvbnMoZGlyLFwieFwiKTtpZihlcnIpcmV0dXJuIGVycjtpZighZGlyLm5vZGVfb3BzLmxvb2t1cClyZXR1cm4gRVJSTk9fQ09ERVMuRUFDQ0VTO3JldHVybiAwfSksbWF5Q3JlYXRlOihmdW5jdGlvbihkaXIsbmFtZSl7dHJ5e3ZhciBub2RlPUZTLmxvb2t1cE5vZGUoZGlyLG5hbWUpO3JldHVybiBFUlJOT19DT0RFUy5FRVhJU1R9Y2F0Y2goZSl7fXJldHVybiBGUy5ub2RlUGVybWlzc2lvbnMoZGlyLFwid3hcIil9KSxtYXlEZWxldGU6KGZ1bmN0aW9uKGRpcixuYW1lLGlzZGlyKXt2YXIgbm9kZTt0cnl7bm9kZT1GUy5sb29rdXBOb2RlKGRpcixuYW1lKX1jYXRjaChlKXtyZXR1cm4gZS5lcnJub312YXIgZXJyPUZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsXCJ3eFwiKTtpZihlcnIpe3JldHVybiBlcnJ9aWYoaXNkaXIpe2lmKCFGUy5pc0Rpcihub2RlLm1vZGUpKXtyZXR1cm4gRVJSTk9fQ09ERVMuRU5PVERJUn1pZihGUy5pc1Jvb3Qobm9kZSl8fEZTLmdldFBhdGgobm9kZSk9PT1GUy5jd2QoKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVCVVNZfX1lbHNle2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe3JldHVybiBFUlJOT19DT0RFUy5FSVNESVJ9fXJldHVybiAwfSksbWF5T3BlbjooZnVuY3Rpb24obm9kZSxmbGFncyl7aWYoIW5vZGUpe3JldHVybiBFUlJOT19DT0RFUy5FTk9FTlR9aWYoRlMuaXNMaW5rKG5vZGUubW9kZSkpe3JldHVybiBFUlJOT19DT0RFUy5FTE9PUH1lbHNlIGlmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2lmKChmbGFncyYyMDk3MTU1KSE9PTB8fGZsYWdzJjUxMil7cmV0dXJuIEVSUk5PX0NPREVTLkVJU0RJUn19cmV0dXJuIEZTLm5vZGVQZXJtaXNzaW9ucyhub2RlLEZTLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWdzKSl9KSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQ6KGZ1bmN0aW9uKGZkX3N0YXJ0LGZkX2VuZCl7ZmRfc3RhcnQ9ZmRfc3RhcnR8fDA7ZmRfZW5kPWZkX2VuZHx8RlMuTUFYX09QRU5fRkRTO2Zvcih2YXIgZmQ9ZmRfc3RhcnQ7ZmQ8PWZkX2VuZDtmZCsrKXtpZighRlMuc3RyZWFtc1tmZF0pe3JldHVybiBmZH19dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU1GSUxFKX0pLGdldFN0cmVhbTooZnVuY3Rpb24oZmQpe3JldHVybiBGUy5zdHJlYW1zW2ZkXX0pLGNyZWF0ZVN0cmVhbTooZnVuY3Rpb24oc3RyZWFtLGZkX3N0YXJ0LGZkX2VuZCl7aWYoIUZTLkZTU3RyZWFtKXtGUy5GU1N0cmVhbT0oZnVuY3Rpb24oKXt9KTtGUy5GU1N0cmVhbS5wcm90b3R5cGU9e307T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRlMuRlNTdHJlYW0ucHJvdG90eXBlLHtvYmplY3Q6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3RoaXMubm9kZT12YWx9KX0saXNSZWFkOntnZXQ6KGZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfSl9LGlzV3JpdGU6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5mbGFncyYyMDk3MTU1KSE9PTB9KX0saXNBcHBlbmQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mbGFncyYxMDI0fSl9fSl9dmFyIG5ld1N0cmVhbT1uZXcgRlMuRlNTdHJlYW07Zm9yKHZhciBwIGluIHN0cmVhbSl7bmV3U3RyZWFtW3BdPXN0cmVhbVtwXX1zdHJlYW09bmV3U3RyZWFtO3ZhciBmZD1GUy5uZXh0ZmQoZmRfc3RhcnQsZmRfZW5kKTtzdHJlYW0uZmQ9ZmQ7RlMuc3RyZWFtc1tmZF09c3RyZWFtO3JldHVybiBzdHJlYW19KSxjbG9zZVN0cmVhbTooZnVuY3Rpb24oZmQpe0ZTLnN0cmVhbXNbZmRdPW51bGx9KSxjaHJkZXZfc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXIgZGV2aWNlPUZTLmdldERldmljZShzdHJlYW0ubm9kZS5yZGV2KTtzdHJlYW0uc3RyZWFtX29wcz1kZXZpY2Uuc3RyZWFtX29wcztpZihzdHJlYW0uc3RyZWFtX29wcy5vcGVuKXtzdHJlYW0uc3RyZWFtX29wcy5vcGVuKHN0cmVhbSl9fSksbGxzZWVrOihmdW5jdGlvbigpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVTUElQRSl9KX0sbWFqb3I6KGZ1bmN0aW9uKGRldil7cmV0dXJuIGRldj4+OH0pLG1pbm9yOihmdW5jdGlvbihkZXYpe3JldHVybiBkZXYmMjU1fSksbWFrZWRldjooZnVuY3Rpb24obWEsbWkpe3JldHVybiBtYTw8OHxtaX0pLHJlZ2lzdGVyRGV2aWNlOihmdW5jdGlvbihkZXYsb3BzKXtGUy5kZXZpY2VzW2Rldl09e3N0cmVhbV9vcHM6b3BzfX0pLGdldERldmljZTooZnVuY3Rpb24oZGV2KXtyZXR1cm4gRlMuZGV2aWNlc1tkZXZdfSksZ2V0TW91bnRzOihmdW5jdGlvbihtb3VudCl7dmFyIG1vdW50cz1bXTt2YXIgY2hlY2s9W21vdW50XTt3aGlsZShjaGVjay5sZW5ndGgpe3ZhciBtPWNoZWNrLnBvcCgpO21vdW50cy5wdXNoKG0pO2NoZWNrLnB1c2guYXBwbHkoY2hlY2ssbS5tb3VudHMpfXJldHVybiBtb3VudHN9KSxzeW5jZnM6KGZ1bmN0aW9uKHBvcHVsYXRlLGNhbGxiYWNrKXtpZih0eXBlb2YgcG9wdWxhdGU9PT1cImZ1bmN0aW9uXCIpe2NhbGxiYWNrPXBvcHVsYXRlO3BvcHVsYXRlPWZhbHNlfXZhciBtb3VudHM9RlMuZ2V0TW91bnRzKEZTLnJvb3QubW91bnQpO3ZhciBjb21wbGV0ZWQ9MDtmdW5jdGlvbiBkb25lKGVycil7aWYoZXJyKXtpZighZG9uZS5lcnJvcmVkKXtkb25lLmVycm9yZWQ9dHJ1ZTtyZXR1cm4gY2FsbGJhY2soZXJyKX1yZXR1cm59aWYoKytjb21wbGV0ZWQ+PW1vdW50cy5sZW5ndGgpe2NhbGxiYWNrKG51bGwpfX1tb3VudHMuZm9yRWFjaCgoZnVuY3Rpb24obW91bnQpe2lmKCFtb3VudC50eXBlLnN5bmNmcyl7cmV0dXJuIGRvbmUobnVsbCl9bW91bnQudHlwZS5zeW5jZnMobW91bnQscG9wdWxhdGUsZG9uZSl9KSl9KSxtb3VudDooZnVuY3Rpb24odHlwZSxvcHRzLG1vdW50cG9pbnQpe3ZhciByb290PW1vdW50cG9pbnQ9PT1cIi9cIjt2YXIgcHNldWRvPSFtb3VudHBvaW50O3ZhciBub2RlO2lmKHJvb3QmJkZTLnJvb3Qpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1lbHNlIGlmKCFyb290JiYhcHNldWRvKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgobW91bnRwb2ludCx7Zm9sbG93X21vdW50OmZhbHNlfSk7bW91bnRwb2ludD1sb29rdXAucGF0aDtub2RlPWxvb2t1cC5ub2RlO2lmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfWlmKCFGUy5pc0Rpcihub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9URElSKX19dmFyIG1vdW50PXt0eXBlOnR5cGUsb3B0czpvcHRzLG1vdW50cG9pbnQ6bW91bnRwb2ludCxtb3VudHM6W119O3ZhciBtb3VudFJvb3Q9dHlwZS5tb3VudChtb3VudCk7bW91bnRSb290Lm1vdW50PW1vdW50O21vdW50LnJvb3Q9bW91bnRSb290O2lmKHJvb3Qpe0ZTLnJvb3Q9bW91bnRSb290fWVsc2UgaWYobm9kZSl7bm9kZS5tb3VudGVkPW1vdW50O2lmKG5vZGUubW91bnQpe25vZGUubW91bnQubW91bnRzLnB1c2gobW91bnQpfX1yZXR1cm4gbW91bnRSb290fSksdW5tb3VudDooZnVuY3Rpb24obW91bnRwb2ludCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKG1vdW50cG9pbnQse2ZvbGxvd19tb3VudDpmYWxzZX0pO2lmKCFGUy5pc01vdW50cG9pbnQobG9va3VwLm5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXZhciBub2RlPWxvb2t1cC5ub2RlO3ZhciBtb3VudD1ub2RlLm1vdW50ZWQ7dmFyIG1vdW50cz1GUy5nZXRNb3VudHMobW91bnQpO09iamVjdC5rZXlzKEZTLm5hbWVUYWJsZSkuZm9yRWFjaCgoZnVuY3Rpb24oaGFzaCl7dmFyIGN1cnJlbnQ9RlMubmFtZVRhYmxlW2hhc2hdO3doaWxlKGN1cnJlbnQpe3ZhciBuZXh0PWN1cnJlbnQubmFtZV9uZXh0O2lmKG1vdW50cy5pbmRleE9mKGN1cnJlbnQubW91bnQpIT09LTEpe0ZTLmRlc3Ryb3lOb2RlKGN1cnJlbnQpfWN1cnJlbnQ9bmV4dH19KSk7bm9kZS5tb3VudGVkPW51bGw7dmFyIGlkeD1ub2RlLm1vdW50Lm1vdW50cy5pbmRleE9mKG1vdW50KTthc3NlcnQoaWR4IT09LTEpO25vZGUubW91bnQubW91bnRzLnNwbGljZShpZHgsMSl9KSxsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXtyZXR1cm4gcGFyZW50Lm5vZGVfb3BzLmxvb2t1cChwYXJlbnQsbmFtZSl9KSxta25vZDooZnVuY3Rpb24ocGF0aCxtb2RlLGRldil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7dmFyIHBhcmVudD1sb29rdXAubm9kZTt2YXIgbmFtZT1QQVRILmJhc2VuYW1lKHBhdGgpO2lmKCFuYW1lfHxuYW1lPT09XCIuXCJ8fG5hbWU9PT1cIi4uXCIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIGVycj1GUy5tYXlDcmVhdGUocGFyZW50LG5hbWUpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1pZighcGFyZW50Lm5vZGVfb3BzLm1rbm9kKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9cmV0dXJuIHBhcmVudC5ub2RlX29wcy5ta25vZChwYXJlbnQsbmFtZSxtb2RlLGRldil9KSxjcmVhdGU6KGZ1bmN0aW9uKHBhdGgsbW9kZSl7bW9kZT1tb2RlIT09dW5kZWZpbmVkP21vZGU6NDM4O21vZGUmPTQwOTU7bW9kZXw9MzI3Njg7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSwwKX0pLG1rZGlyOihmdW5jdGlvbihwYXRoLG1vZGUpe21vZGU9bW9kZSE9PXVuZGVmaW5lZD9tb2RlOjUxMTttb2RlJj01MTF8NTEyO21vZGV8PTE2Mzg0O3JldHVybiBGUy5ta25vZChwYXRoLG1vZGUsMCl9KSxta2RldjooZnVuY3Rpb24ocGF0aCxtb2RlLGRldil7aWYodHlwZW9mIGRldj09PVwidW5kZWZpbmVkXCIpe2Rldj1tb2RlO21vZGU9NDM4fW1vZGV8PTgxOTI7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSxkZXYpfSksc3ltbGluazooZnVuY3Rpb24ob2xkcGF0aCxuZXdwYXRoKXtpZighUEFUSC5yZXNvbHZlKG9sZHBhdGgpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfXZhciBsb29rdXA9RlMubG9va3VwUGF0aChuZXdwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7aWYoIXBhcmVudCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKX12YXIgbmV3bmFtZT1QQVRILmJhc2VuYW1lKG5ld3BhdGgpO3ZhciBlcnI9RlMubWF5Q3JlYXRlKHBhcmVudCxuZXduYW1lKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIXBhcmVudC5ub2RlX29wcy5zeW1saW5rKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9cmV0dXJuIHBhcmVudC5ub2RlX29wcy5zeW1saW5rKHBhcmVudCxuZXduYW1lLG9sZHBhdGgpfSkscmVuYW1lOihmdW5jdGlvbihvbGRfcGF0aCxuZXdfcGF0aCl7dmFyIG9sZF9kaXJuYW1lPVBBVEguZGlybmFtZShvbGRfcGF0aCk7dmFyIG5ld19kaXJuYW1lPVBBVEguZGlybmFtZShuZXdfcGF0aCk7dmFyIG9sZF9uYW1lPVBBVEguYmFzZW5hbWUob2xkX3BhdGgpO3ZhciBuZXdfbmFtZT1QQVRILmJhc2VuYW1lKG5ld19wYXRoKTt2YXIgbG9va3VwLG9sZF9kaXIsbmV3X2Rpcjt0cnl7bG9va3VwPUZTLmxvb2t1cFBhdGgob2xkX3BhdGgse3BhcmVudDp0cnVlfSk7b2xkX2Rpcj1sb29rdXAubm9kZTtsb29rdXA9RlMubG9va3VwUGF0aChuZXdfcGF0aCx7cGFyZW50OnRydWV9KTtuZXdfZGlyPWxvb2t1cC5ub2RlfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1pZighb2xkX2Rpcnx8IW5ld19kaXIpdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKTtpZihvbGRfZGlyLm1vdW50IT09bmV3X2Rpci5tb3VudCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVhERVYpfXZhciBvbGRfbm9kZT1GUy5sb29rdXBOb2RlKG9sZF9kaXIsb2xkX25hbWUpO3ZhciByZWxhdGl2ZT1QQVRILnJlbGF0aXZlKG9sZF9wYXRoLG5ld19kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT1cIi5cIil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZWxhdGl2ZT1QQVRILnJlbGF0aXZlKG5ld19wYXRoLG9sZF9kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT1cIi5cIil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVEVNUFRZKX12YXIgbmV3X25vZGU7dHJ5e25ld19ub2RlPUZTLmxvb2t1cE5vZGUobmV3X2RpcixuZXdfbmFtZSl9Y2F0Y2goZSl7fWlmKG9sZF9ub2RlPT09bmV3X25vZGUpe3JldHVybn12YXIgaXNkaXI9RlMuaXNEaXIob2xkX25vZGUubW9kZSk7dmFyIGVycj1GUy5tYXlEZWxldGUob2xkX2RpcixvbGRfbmFtZSxpc2Rpcik7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfWVycj1uZXdfbm9kZT9GUy5tYXlEZWxldGUobmV3X2RpcixuZXdfbmFtZSxpc2Rpcik6RlMubWF5Q3JlYXRlKG5ld19kaXIsbmV3X25hbWUpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1pZighb2xkX2Rpci5ub2RlX29wcy5yZW5hbWUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1pZihGUy5pc01vdW50cG9pbnQob2xkX25vZGUpfHxuZXdfbm9kZSYmRlMuaXNNb3VudHBvaW50KG5ld19ub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfWlmKG5ld19kaXIhPT1vbGRfZGlyKXtlcnI9RlMubm9kZVBlcm1pc3Npb25zKG9sZF9kaXIsXCJ3XCIpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX19dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbXCJ3aWxsTW92ZVBhdGhcIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbXCJ3aWxsTW92ZVBhdGhcIl0ob2xkX3BhdGgsbmV3X3BhdGgpfX1jYXRjaChlKXtjb25zb2xlLmxvZyhcIkZTLnRyYWNraW5nRGVsZWdhdGVbJ3dpbGxNb3ZlUGF0aCddKCdcIitvbGRfcGF0aCtcIicsICdcIituZXdfcGF0aCtcIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogXCIrZS5tZXNzYWdlKX1GUy5oYXNoUmVtb3ZlTm9kZShvbGRfbm9kZSk7dHJ5e29sZF9kaXIubm9kZV9vcHMucmVuYW1lKG9sZF9ub2RlLG5ld19kaXIsbmV3X25hbWUpfWNhdGNoKGUpe3Rocm93IGV9ZmluYWxseXtGUy5oYXNoQWRkTm9kZShvbGRfbm9kZSl9dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbXCJvbk1vdmVQYXRoXCJdKUZTLnRyYWNraW5nRGVsZWdhdGVbXCJvbk1vdmVQYXRoXCJdKG9sZF9wYXRoLG5ld19wYXRoKX1jYXRjaChlKXtjb25zb2xlLmxvZyhcIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uTW92ZVBhdGgnXSgnXCIrb2xkX3BhdGgrXCInLCAnXCIrbmV3X3BhdGgrXCInKSB0aHJldyBhbiBleGNlcHRpb246IFwiK2UubWVzc2FnZSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKHBhcmVudCxuYW1lKTt2YXIgZXJyPUZTLm1heURlbGV0ZShwYXJlbnQsbmFtZSx0cnVlKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIXBhcmVudC5ub2RlX29wcy5ybWRpcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlW1wid2lsbERlbGV0ZVBhdGhcIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbXCJ3aWxsRGVsZXRlUGF0aFwiXShwYXRoKX19Y2F0Y2goZSl7Y29uc29sZS5sb2coXCJGUy50cmFja2luZ0RlbGVnYXRlWyd3aWxsRGVsZXRlUGF0aCddKCdcIitwYXRoK1wiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiBcIitlLm1lc3NhZ2UpfXBhcmVudC5ub2RlX29wcy5ybWRpcihwYXJlbnQsbmFtZSk7RlMuZGVzdHJveU5vZGUobm9kZSk7dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbXCJvbkRlbGV0ZVBhdGhcIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVtcIm9uRGVsZXRlUGF0aFwiXShwYXRoKX1jYXRjaChlKXtjb25zb2xlLmxvZyhcIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uRGVsZXRlUGF0aCddKCdcIitwYXRoK1wiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiBcIitlLm1lc3NhZ2UpfX0pLHJlYWRkaXI6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6dHJ1ZX0pO3ZhciBub2RlPWxvb2t1cC5ub2RlO2lmKCFub2RlLm5vZGVfb3BzLnJlYWRkaXIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RESVIpfXJldHVybiBub2RlLm5vZGVfb3BzLnJlYWRkaXIobm9kZSl9KSx1bmxpbms6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKHBhcmVudCxuYW1lKTt2YXIgZXJyPUZTLm1heURlbGV0ZShwYXJlbnQsbmFtZSxmYWxzZSk7aWYoZXJyKXtpZihlcnI9PT1FUlJOT19DT0RFUy5FSVNESVIpZXJyPUVSUk5PX0NPREVTLkVQRVJNO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIXBhcmVudC5ub2RlX29wcy51bmxpbmspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1pZihGUy5pc01vdW50cG9pbnQobm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX10cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVtcIndpbGxEZWxldGVQYXRoXCJdKXtGUy50cmFja2luZ0RlbGVnYXRlW1wid2lsbERlbGV0ZVBhdGhcIl0ocGF0aCl9fWNhdGNoKGUpe2NvbnNvbGUubG9nKFwiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnXCIrcGF0aCtcIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogXCIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMudW5saW5rKHBhcmVudCxuYW1lKTtGUy5kZXN0cm95Tm9kZShub2RlKTt0cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVtcIm9uRGVsZXRlUGF0aFwiXSlGUy50cmFja2luZ0RlbGVnYXRlW1wib25EZWxldGVQYXRoXCJdKHBhdGgpfWNhdGNoKGUpe2NvbnNvbGUubG9nKFwiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25EZWxldGVQYXRoJ10oJ1wiK3BhdGgrXCInKSB0aHJldyBhbiBleGNlcHRpb246IFwiK2UubWVzc2FnZSl9fSkscmVhZGxpbms6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTt2YXIgbGluaz1sb29rdXAubm9kZTtpZighbGluayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKX1pZighbGluay5ub2RlX29wcy5yZWFkbGluayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZXR1cm4gUEFUSC5yZXNvbHZlKEZTLmdldFBhdGgobGluay5wYXJlbnQpLGxpbmsubm9kZV9vcHMucmVhZGxpbmsobGluaykpfSksc3RhdDooZnVuY3Rpb24ocGF0aCxkb250Rm9sbG93KXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250Rm9sbG93fSk7dmFyIG5vZGU9bG9va3VwLm5vZGU7aWYoIW5vZGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0VOVCl9aWYoIW5vZGUubm9kZV9vcHMuZ2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfXJldHVybiBub2RlLm5vZGVfb3BzLmdldGF0dHIobm9kZSl9KSxsc3RhdDooZnVuY3Rpb24ocGF0aCl7cmV0dXJuIEZTLnN0YXQocGF0aCx0cnVlKX0pLGNobW9kOihmdW5jdGlvbihwYXRoLG1vZGUsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT1cInN0cmluZ1wiKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250Rm9sbG93fSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse21vZGU6bW9kZSY0MDk1fG5vZGUubW9kZSZ+NDA5NSx0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSksbGNobW9kOihmdW5jdGlvbihwYXRoLG1vZGUpe0ZTLmNobW9kKHBhdGgsbW9kZSx0cnVlKX0pLGZjaG1vZDooZnVuY3Rpb24oZmQsbW9kZSl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1GUy5jaG1vZChzdHJlYW0ubm9kZSxtb2RlKX0pLGNob3duOihmdW5jdGlvbihwYXRoLHVpZCxnaWQsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT1cInN0cmluZ1wiKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250Rm9sbG93fSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse3RpbWVzdGFtcDpEYXRlLm5vdygpfSl9KSxsY2hvd246KGZ1bmN0aW9uKHBhdGgsdWlkLGdpZCl7RlMuY2hvd24ocGF0aCx1aWQsZ2lkLHRydWUpfSksZmNob3duOihmdW5jdGlvbihmZCx1aWQsZ2lkKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfUZTLmNob3duKHN0cmVhbS5ub2RlLHVpZCxnaWQpfSksdHJ1bmNhdGU6KGZ1bmN0aW9uKHBhdGgsbGVuKXtpZihsZW48MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbm9kZTtpZih0eXBlb2YgcGF0aD09PVwic3RyaW5nXCIpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6dHJ1ZX0pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJU0RJUil9aWYoIUZTLmlzRmlsZShub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXZhciBlcnI9RlMubm9kZVBlcm1pc3Npb25zKG5vZGUsXCJ3XCIpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1ub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSx7c2l6ZTpsZW4sdGltZXN0YW1wOkRhdGUubm93KCl9KX0pLGZ0cnVuY2F0ZTooZnVuY3Rpb24oZmQsbGVuKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfUZTLnRydW5jYXRlKHN0cmVhbS5ub2RlLGxlbil9KSx1dGltZTooZnVuY3Rpb24ocGF0aCxhdGltZSxtdGltZSl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7dmFyIG5vZGU9bG9va3VwLm5vZGU7bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse3RpbWVzdGFtcDpNYXRoLm1heChhdGltZSxtdGltZSl9KX0pLG9wZW46KGZ1bmN0aW9uKHBhdGgsZmxhZ3MsbW9kZSxmZF9zdGFydCxmZF9lbmQpe2lmKHBhdGg9PT1cIlwiKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfWZsYWdzPXR5cGVvZiBmbGFncz09PVwic3RyaW5nXCI/RlMubW9kZVN0cmluZ1RvRmxhZ3MoZmxhZ3MpOmZsYWdzO21vZGU9dHlwZW9mIG1vZGU9PT1cInVuZGVmaW5lZFwiPzQzODptb2RlO2lmKGZsYWdzJjY0KXttb2RlPW1vZGUmNDA5NXwzMjc2OH1lbHNle21vZGU9MH12YXIgbm9kZTtpZih0eXBlb2YgcGF0aD09PVwib2JqZWN0XCIpe25vZGU9cGF0aH1lbHNle3BhdGg9UEFUSC5ub3JtYWxpemUocGF0aCk7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IShmbGFncyYxMzEwNzIpfSk7bm9kZT1sb29rdXAubm9kZX1jYXRjaChlKXt9fXZhciBjcmVhdGVkPWZhbHNlO2lmKGZsYWdzJjY0KXtpZihub2RlKXtpZihmbGFncyYxMjgpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVFWElTVCl9fWVsc2V7bm9kZT1GUy5ta25vZChwYXRoLG1vZGUsMCk7Y3JlYXRlZD10cnVlfX1pZighbm9kZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKX1pZihGUy5pc0NocmRldihub2RlLm1vZGUpKXtmbGFncyY9fjUxMn1pZihmbGFncyY2NTUzNiYmIUZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RESVIpfWlmKCFjcmVhdGVkKXt2YXIgZXJyPUZTLm1heU9wZW4obm9kZSxmbGFncyk7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfX1pZihmbGFncyY1MTIpe0ZTLnRydW5jYXRlKG5vZGUsMCl9ZmxhZ3MmPX4oMTI4fDUxMik7dmFyIHN0cmVhbT1GUy5jcmVhdGVTdHJlYW0oe25vZGU6bm9kZSxwYXRoOkZTLmdldFBhdGgobm9kZSksZmxhZ3M6ZmxhZ3Msc2Vla2FibGU6dHJ1ZSxwb3NpdGlvbjowLHN0cmVhbV9vcHM6bm9kZS5zdHJlYW1fb3BzLHVuZ290dGVuOltdLGVycm9yOmZhbHNlfSxmZF9zdGFydCxmZF9lbmQpO2lmKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pe3N0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKX1pZihNb2R1bGVbXCJsb2dSZWFkRmlsZXNcIl0mJiEoZmxhZ3MmMSkpe2lmKCFGUy5yZWFkRmlsZXMpRlMucmVhZEZpbGVzPXt9O2lmKCEocGF0aCBpbiBGUy5yZWFkRmlsZXMpKXtGUy5yZWFkRmlsZXNbcGF0aF09MTtNb2R1bGVbXCJwcmludEVyclwiXShcInJlYWQgZmlsZTogXCIrcGF0aCl9fXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlW1wib25PcGVuRmlsZVwiXSl7dmFyIHRyYWNraW5nRmxhZ3M9MDtpZigoZmxhZ3MmMjA5NzE1NSkhPT0xKXt0cmFja2luZ0ZsYWdzfD1GUy50cmFja2luZy5vcGVuRmxhZ3MuUkVBRH1pZigoZmxhZ3MmMjA5NzE1NSkhPT0wKXt0cmFja2luZ0ZsYWdzfD1GUy50cmFja2luZy5vcGVuRmxhZ3MuV1JJVEV9RlMudHJhY2tpbmdEZWxlZ2F0ZVtcIm9uT3BlbkZpbGVcIl0ocGF0aCx0cmFja2luZ0ZsYWdzKX19Y2F0Y2goZSl7Y29uc29sZS5sb2coXCJGUy50cmFja2luZ0RlbGVnYXRlWydvbk9wZW5GaWxlJ10oJ1wiK3BhdGgrXCInLCBmbGFncykgdGhyZXcgYW4gZXhjZXB0aW9uOiBcIitlLm1lc3NhZ2UpfXJldHVybiBzdHJlYW19KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXtpZihzdHJlYW0uZ2V0ZGVudHMpc3RyZWFtLmdldGRlbnRzPW51bGw7dHJ5e2lmKHN0cmVhbS5zdHJlYW1fb3BzLmNsb3NlKXtzdHJlYW0uc3RyZWFtX29wcy5jbG9zZShzdHJlYW0pfX1jYXRjaChlKXt0aHJvdyBlfWZpbmFsbHl7RlMuY2xvc2VTdHJlYW0oc3RyZWFtLmZkKX19KSxsbHNlZWs6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsd2hlbmNlKXtpZighc3RyZWFtLnNlZWthYmxlfHwhc3RyZWFtLnN0cmVhbV9vcHMubGxzZWVrKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FU1BJUEUpfXN0cmVhbS5wb3NpdGlvbj1zdHJlYW0uc3RyZWFtX29wcy5sbHNlZWsoc3RyZWFtLG9mZnNldCx3aGVuY2UpO3N0cmVhbS51bmdvdHRlbj1bXTtyZXR1cm4gc3RyZWFtLnBvc2l0aW9ufSkscmVhZDooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXtpZihsZW5ndGg8MHx8cG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1pZigoc3RyZWFtLmZsYWdzJjIwOTcxNTUpPT09MSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKEZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSVNESVIpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy5yZWFkKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXZhciBzZWVraW5nPXRydWU7aWYodHlwZW9mIHBvc2l0aW9uPT09XCJ1bmRlZmluZWRcIil7cG9zaXRpb249c3RyZWFtLnBvc2l0aW9uO3NlZWtpbmc9ZmFsc2V9ZWxzZSBpZighc3RyZWFtLnNlZWthYmxlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FU1BJUEUpfXZhciBieXRlc1JlYWQ9c3RyZWFtLnN0cmVhbV9vcHMucmVhZChzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pO2lmKCFzZWVraW5nKXN0cmVhbS5wb3NpdGlvbis9Ynl0ZXNSZWFkO3JldHVybiBieXRlc1JlYWR9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLGNhbk93bil7aWYobGVuZ3RoPDB8fHBvc2l0aW9uPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1pZihGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTRElSKX1pZighc3RyZWFtLnN0cmVhbV9vcHMud3JpdGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9aWYoc3RyZWFtLmZsYWdzJjEwMjQpe0ZTLmxsc2VlayhzdHJlYW0sMCwyKX12YXIgc2Vla2luZz10cnVlO2lmKHR5cGVvZiBwb3NpdGlvbj09PVwidW5kZWZpbmVkXCIpe3Bvc2l0aW9uPXN0cmVhbS5wb3NpdGlvbjtzZWVraW5nPWZhbHNlfWVsc2UgaWYoIXN0cmVhbS5zZWVrYWJsZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVNQSVBFKX12YXIgYnl0ZXNXcml0dGVuPXN0cmVhbS5zdHJlYW1fb3BzLndyaXRlKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixjYW5Pd24pO2lmKCFzZWVraW5nKXN0cmVhbS5wb3NpdGlvbis9Ynl0ZXNXcml0dGVuO3RyeXtpZihzdHJlYW0ucGF0aCYmRlMudHJhY2tpbmdEZWxlZ2F0ZVtcIm9uV3JpdGVUb0ZpbGVcIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVtcIm9uV3JpdGVUb0ZpbGVcIl0oc3RyZWFtLnBhdGgpfWNhdGNoKGUpe2NvbnNvbGUubG9nKFwiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25Xcml0ZVRvRmlsZSddKCdcIitwYXRoK1wiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiBcIitlLm1lc3NhZ2UpfXJldHVybiBieXRlc1dyaXR0ZW59KSxhbGxvY2F0ZTooZnVuY3Rpb24oc3RyZWFtLG9mZnNldCxsZW5ndGgpe2lmKG9mZnNldDwwfHxsZW5ndGg8PTApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1pZighRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpJiYhRlMuaXNEaXIobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PREVWKX1pZighc3RyZWFtLnN0cmVhbV9vcHMuYWxsb2NhdGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVPUE5PVFNVUFApfXN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKHN0cmVhbSxvZmZzZXQsbGVuZ3RoKX0pLG1tYXA6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixwcm90LGZsYWdzKXtpZigoc3RyZWFtLmZsYWdzJjIwOTcxNTUpPT09MSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFDQ0VTKX1pZighc3RyZWFtLnN0cmVhbV9vcHMubW1hcCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PREVWKX1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMubW1hcChzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24scHJvdCxmbGFncyl9KSxtc3luYzooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLG1tYXBGbGFncyl7aWYoIXN0cmVhbXx8IXN0cmVhbS5zdHJlYW1fb3BzLm1zeW5jKXtyZXR1cm4gMH1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMubXN5bmMoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLG1tYXBGbGFncyl9KSxtdW5tYXA6KGZ1bmN0aW9uKHN0cmVhbSl7cmV0dXJuIDB9KSxpb2N0bDooZnVuY3Rpb24oc3RyZWFtLGNtZCxhcmcpe2lmKCFzdHJlYW0uc3RyZWFtX29wcy5pb2N0bCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVFRZKX1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwoc3RyZWFtLGNtZCxhcmcpfSkscmVhZEZpbGU6KGZ1bmN0aW9uKHBhdGgsb3B0cyl7b3B0cz1vcHRzfHx7fTtvcHRzLmZsYWdzPW9wdHMuZmxhZ3N8fFwiclwiO29wdHMuZW5jb2Rpbmc9b3B0cy5lbmNvZGluZ3x8XCJiaW5hcnlcIjtpZihvcHRzLmVuY29kaW5nIT09XCJ1dGY4XCImJm9wdHMuZW5jb2RpbmchPT1cImJpbmFyeVwiKXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW5jb2RpbmcgdHlwZSBcIicrb3B0cy5lbmNvZGluZysnXCInKX12YXIgcmV0O3ZhciBzdHJlYW09RlMub3BlbihwYXRoLG9wdHMuZmxhZ3MpO3ZhciBzdGF0PUZTLnN0YXQocGF0aCk7dmFyIGxlbmd0aD1zdGF0LnNpemU7dmFyIGJ1Zj1uZXcgVWludDhBcnJheShsZW5ndGgpO0ZTLnJlYWQoc3RyZWFtLGJ1ZiwwLGxlbmd0aCwwKTtpZihvcHRzLmVuY29kaW5nPT09XCJ1dGY4XCIpe3JldD1VVEY4QXJyYXlUb1N0cmluZyhidWYsMCl9ZWxzZSBpZihvcHRzLmVuY29kaW5nPT09XCJiaW5hcnlcIil7cmV0PWJ1Zn1GUy5jbG9zZShzdHJlYW0pO3JldHVybiByZXR9KSx3cml0ZUZpbGU6KGZ1bmN0aW9uKHBhdGgsZGF0YSxvcHRzKXtvcHRzPW9wdHN8fHt9O29wdHMuZmxhZ3M9b3B0cy5mbGFnc3x8XCJ3XCI7b3B0cy5lbmNvZGluZz1vcHRzLmVuY29kaW5nfHxcInV0ZjhcIjtpZihvcHRzLmVuY29kaW5nIT09XCJ1dGY4XCImJm9wdHMuZW5jb2RpbmchPT1cImJpbmFyeVwiKXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW5jb2RpbmcgdHlwZSBcIicrb3B0cy5lbmNvZGluZysnXCInKX12YXIgc3RyZWFtPUZTLm9wZW4ocGF0aCxvcHRzLmZsYWdzLG9wdHMubW9kZSk7aWYob3B0cy5lbmNvZGluZz09PVwidXRmOFwiKXt2YXIgYnVmPW5ldyBVaW50OEFycmF5KGxlbmd0aEJ5dGVzVVRGOChkYXRhKSsxKTt2YXIgYWN0dWFsTnVtQnl0ZXM9c3RyaW5nVG9VVEY4QXJyYXkoZGF0YSxidWYsMCxidWYubGVuZ3RoKTtGUy53cml0ZShzdHJlYW0sYnVmLDAsYWN0dWFsTnVtQnl0ZXMsMCxvcHRzLmNhbk93bil9ZWxzZSBpZihvcHRzLmVuY29kaW5nPT09XCJiaW5hcnlcIil7RlMud3JpdGUoc3RyZWFtLGRhdGEsMCxkYXRhLmxlbmd0aCwwLG9wdHMuY2FuT3duKX1GUy5jbG9zZShzdHJlYW0pfSksY3dkOihmdW5jdGlvbigpe3JldHVybiBGUy5jdXJyZW50UGF0aH0pLGNoZGlyOihmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTtpZighRlMuaXNEaXIobG9va3VwLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RESVIpfXZhciBlcnI9RlMubm9kZVBlcm1pc3Npb25zKGxvb2t1cC5ub2RlLFwieFwiKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9RlMuY3VycmVudFBhdGg9bG9va3VwLnBhdGh9KSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXM6KGZ1bmN0aW9uKCl7RlMubWtkaXIoXCIvdG1wXCIpO0ZTLm1rZGlyKFwiL2hvbWVcIik7RlMubWtkaXIoXCIvaG9tZS93ZWJfdXNlclwiKX0pLGNyZWF0ZURlZmF1bHREZXZpY2VzOihmdW5jdGlvbigpe0ZTLm1rZGlyKFwiL2RldlwiKTtGUy5yZWdpc3RlckRldmljZShGUy5tYWtlZGV2KDEsMykse3JlYWQ6KGZ1bmN0aW9uKCl7cmV0dXJuIDB9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7cmV0dXJuIGxlbmd0aH0pfSk7RlMubWtkZXYoXCIvZGV2L251bGxcIixGUy5tYWtlZGV2KDEsMykpO1RUWS5yZWdpc3RlcihGUy5tYWtlZGV2KDUsMCksVFRZLmRlZmF1bHRfdHR5X29wcyk7VFRZLnJlZ2lzdGVyKEZTLm1ha2VkZXYoNiwwKSxUVFkuZGVmYXVsdF90dHkxX29wcyk7RlMubWtkZXYoXCIvZGV2L3R0eVwiLEZTLm1ha2VkZXYoNSwwKSk7RlMubWtkZXYoXCIvZGV2L3R0eTFcIixGUy5tYWtlZGV2KDYsMCkpO3ZhciByYW5kb21fZGV2aWNlO2lmKHR5cGVvZiBjcnlwdG8hPT1cInVuZGVmaW5lZFwiKXt2YXIgcmFuZG9tQnVmZmVyPW5ldyBVaW50OEFycmF5KDEpO3JhbmRvbV9kZXZpY2U9KGZ1bmN0aW9uKCl7Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21CdWZmZXIpO3JldHVybiByYW5kb21CdWZmZXJbMF19KX1lbHNlIGlmKEVOVklST05NRU5UX0lTX05PREUpe3JhbmRvbV9kZXZpY2U9KGZ1bmN0aW9uKCl7cmV0dXJuIHJlcXVpcmUoXCJjcnlwdG9cIikucmFuZG9tQnl0ZXMoMSlbMF19KX1lbHNle3JhbmRvbV9kZXZpY2U9KGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucmFuZG9tKCkqMjU2fDB9KX1GUy5jcmVhdGVEZXZpY2UoXCIvZGV2XCIsXCJyYW5kb21cIixyYW5kb21fZGV2aWNlKTtGUy5jcmVhdGVEZXZpY2UoXCIvZGV2XCIsXCJ1cmFuZG9tXCIscmFuZG9tX2RldmljZSk7RlMubWtkaXIoXCIvZGV2L3NobVwiKTtGUy5ta2RpcihcIi9kZXYvc2htL3RtcFwiKX0pLGNyZWF0ZVNwZWNpYWxEaXJlY3RvcmllczooZnVuY3Rpb24oKXtGUy5ta2RpcihcIi9wcm9jXCIpO0ZTLm1rZGlyKFwiL3Byb2Mvc2VsZlwiKTtGUy5ta2RpcihcIi9wcm9jL3NlbGYvZmRcIik7RlMubW91bnQoe21vdW50OihmdW5jdGlvbigpe3ZhciBub2RlPUZTLmNyZWF0ZU5vZGUoXCIvcHJvYy9zZWxmXCIsXCJmZFwiLDE2Mzg0fDUxMSw3Myk7bm9kZS5ub2RlX29wcz17bG9va3VwOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIGZkPStuYW1lO3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKGZkKTtpZighc3RyZWFtKXRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKTt2YXIgcmV0PXtwYXJlbnQ6bnVsbCxtb3VudDp7bW91bnRwb2ludDpcImZha2VcIn0sbm9kZV9vcHM6e3JlYWRsaW5rOihmdW5jdGlvbigpe3JldHVybiBzdHJlYW0ucGF0aH0pfX07cmV0LnBhcmVudD1yZXQ7cmV0dXJuIHJldH0pfTtyZXR1cm4gbm9kZX0pfSx7fSxcIi9wcm9jL3NlbGYvZmRcIil9KSxjcmVhdGVTdGFuZGFyZFN0cmVhbXM6KGZ1bmN0aW9uKCl7aWYoTW9kdWxlW1wic3RkaW5cIl0pe0ZTLmNyZWF0ZURldmljZShcIi9kZXZcIixcInN0ZGluXCIsTW9kdWxlW1wic3RkaW5cIl0pfWVsc2V7RlMuc3ltbGluayhcIi9kZXYvdHR5XCIsXCIvZGV2L3N0ZGluXCIpfWlmKE1vZHVsZVtcInN0ZG91dFwiXSl7RlMuY3JlYXRlRGV2aWNlKFwiL2RldlwiLFwic3Rkb3V0XCIsbnVsbCxNb2R1bGVbXCJzdGRvdXRcIl0pfWVsc2V7RlMuc3ltbGluayhcIi9kZXYvdHR5XCIsXCIvZGV2L3N0ZG91dFwiKX1pZihNb2R1bGVbXCJzdGRlcnJcIl0pe0ZTLmNyZWF0ZURldmljZShcIi9kZXZcIixcInN0ZGVyclwiLG51bGwsTW9kdWxlW1wic3RkZXJyXCJdKX1lbHNle0ZTLnN5bWxpbmsoXCIvZGV2L3R0eTFcIixcIi9kZXYvc3RkZXJyXCIpfXZhciBzdGRpbj1GUy5vcGVuKFwiL2Rldi9zdGRpblwiLFwiclwiKTthc3NlcnQoc3RkaW4uZmQ9PT0wLFwiaW52YWxpZCBoYW5kbGUgZm9yIHN0ZGluIChcIitzdGRpbi5mZCtcIilcIik7dmFyIHN0ZG91dD1GUy5vcGVuKFwiL2Rldi9zdGRvdXRcIixcIndcIik7YXNzZXJ0KHN0ZG91dC5mZD09PTEsXCJpbnZhbGlkIGhhbmRsZSBmb3Igc3Rkb3V0IChcIitzdGRvdXQuZmQrXCIpXCIpO3ZhciBzdGRlcnI9RlMub3BlbihcIi9kZXYvc3RkZXJyXCIsXCJ3XCIpO2Fzc2VydChzdGRlcnIuZmQ9PT0yLFwiaW52YWxpZCBoYW5kbGUgZm9yIHN0ZGVyciAoXCIrc3RkZXJyLmZkK1wiKVwiKX0pLGVuc3VyZUVycm5vRXJyb3I6KGZ1bmN0aW9uKCl7aWYoRlMuRXJybm9FcnJvcilyZXR1cm47RlMuRXJybm9FcnJvcj1mdW5jdGlvbiBFcnJub0Vycm9yKGVycm5vLG5vZGUpe3RoaXMubm9kZT1ub2RlO3RoaXMuc2V0RXJybm89KGZ1bmN0aW9uKGVycm5vKXt0aGlzLmVycm5vPWVycm5vO2Zvcih2YXIga2V5IGluIEVSUk5PX0NPREVTKXtpZihFUlJOT19DT0RFU1trZXldPT09ZXJybm8pe3RoaXMuY29kZT1rZXk7YnJlYWt9fX0pO3RoaXMuc2V0RXJybm8oZXJybm8pO3RoaXMubWVzc2FnZT1FUlJOT19NRVNTQUdFU1tlcnJub119O0ZTLkVycm5vRXJyb3IucHJvdG90eXBlPW5ldyBFcnJvcjtGUy5FcnJub0Vycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GUy5FcnJub0Vycm9yO1tFUlJOT19DT0RFUy5FTk9FTlRdLmZvckVhY2goKGZ1bmN0aW9uKGNvZGUpe0ZTLmdlbmVyaWNFcnJvcnNbY29kZV09bmV3IEZTLkVycm5vRXJyb3IoY29kZSk7RlMuZ2VuZXJpY0Vycm9yc1tjb2RlXS5zdGFjaz1cIjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz5cIn0pKX0pLHN0YXRpY0luaXQ6KGZ1bmN0aW9uKCl7RlMuZW5zdXJlRXJybm9FcnJvcigpO0ZTLm5hbWVUYWJsZT1uZXcgQXJyYXkoNDA5Nik7RlMubW91bnQoTUVNRlMse30sXCIvXCIpO0ZTLmNyZWF0ZURlZmF1bHREaXJlY3RvcmllcygpO0ZTLmNyZWF0ZURlZmF1bHREZXZpY2VzKCk7RlMuY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCk7RlMuZmlsZXN5c3RlbXM9e1wiTUVNRlNcIjpNRU1GUyxcIklEQkZTXCI6SURCRlMsXCJOT0RFRlNcIjpOT0RFRlMsXCJXT1JLRVJGU1wiOldPUktFUkZTfX0pLGluaXQ6KGZ1bmN0aW9uKGlucHV0LG91dHB1dCxlcnJvcil7YXNzZXJ0KCFGUy5pbml0LmluaXRpYWxpemVkLFwiRlMuaW5pdCB3YXMgcHJldmlvdXNseSBjYWxsZWQuIElmIHlvdSB3YW50IHRvIGluaXRpYWxpemUgbGF0ZXIgd2l0aCBjdXN0b20gcGFyYW1ldGVycywgcmVtb3ZlIGFueSBlYXJsaWVyIGNhbGxzIChub3RlIHRoYXQgb25lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBjb2RlKVwiKTtGUy5pbml0LmluaXRpYWxpemVkPXRydWU7RlMuZW5zdXJlRXJybm9FcnJvcigpO01vZHVsZVtcInN0ZGluXCJdPWlucHV0fHxNb2R1bGVbXCJzdGRpblwiXTtNb2R1bGVbXCJzdGRvdXRcIl09b3V0cHV0fHxNb2R1bGVbXCJzdGRvdXRcIl07TW9kdWxlW1wic3RkZXJyXCJdPWVycm9yfHxNb2R1bGVbXCJzdGRlcnJcIl07RlMuY3JlYXRlU3RhbmRhcmRTdHJlYW1zKCl9KSxxdWl0OihmdW5jdGlvbigpe0ZTLmluaXQuaW5pdGlhbGl6ZWQ9ZmFsc2U7dmFyIGZmbHVzaD1Nb2R1bGVbXCJfZmZsdXNoXCJdO2lmKGZmbHVzaClmZmx1c2goMCk7Zm9yKHZhciBpPTA7aTxGUy5zdHJlYW1zLmxlbmd0aDtpKyspe3ZhciBzdHJlYW09RlMuc3RyZWFtc1tpXTtpZighc3RyZWFtKXtjb250aW51ZX1GUy5jbG9zZShzdHJlYW0pfX0pLGdldE1vZGU6KGZ1bmN0aW9uKGNhblJlYWQsY2FuV3JpdGUpe3ZhciBtb2RlPTA7aWYoY2FuUmVhZCltb2RlfD0yOTJ8NzM7aWYoY2FuV3JpdGUpbW9kZXw9MTQ2O3JldHVybiBtb2RlfSksam9pblBhdGg6KGZ1bmN0aW9uKHBhcnRzLGZvcmNlUmVsYXRpdmUpe3ZhciBwYXRoPVBBVEguam9pbi5hcHBseShudWxsLHBhcnRzKTtpZihmb3JjZVJlbGF0aXZlJiZwYXRoWzBdPT1cIi9cIilwYXRoPXBhdGguc3Vic3RyKDEpO3JldHVybiBwYXRofSksYWJzb2x1dGVQYXRoOihmdW5jdGlvbihyZWxhdGl2ZSxiYXNlKXtyZXR1cm4gUEFUSC5yZXNvbHZlKGJhc2UscmVsYXRpdmUpfSksc3RhbmRhcmRpemVQYXRoOihmdW5jdGlvbihwYXRoKXtyZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aCl9KSxmaW5kT2JqZWN0OihmdW5jdGlvbihwYXRoLGRvbnRSZXNvbHZlTGFzdExpbmspe3ZhciByZXQ9RlMuYW5hbHl6ZVBhdGgocGF0aCxkb250UmVzb2x2ZUxhc3RMaW5rKTtpZihyZXQuZXhpc3RzKXtyZXR1cm4gcmV0Lm9iamVjdH1lbHNle19fX3NldEVyck5vKHJldC5lcnJvcik7cmV0dXJuIG51bGx9fSksYW5hbHl6ZVBhdGg6KGZ1bmN0aW9uKHBhdGgsZG9udFJlc29sdmVMYXN0TGluayl7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IWRvbnRSZXNvbHZlTGFzdExpbmt9KTtwYXRoPWxvb2t1cC5wYXRofWNhdGNoKGUpe312YXIgcmV0PXtpc1Jvb3Q6ZmFsc2UsZXhpc3RzOmZhbHNlLGVycm9yOjAsbmFtZTpudWxsLHBhdGg6bnVsbCxvYmplY3Q6bnVsbCxwYXJlbnRFeGlzdHM6ZmFsc2UscGFyZW50UGF0aDpudWxsLHBhcmVudE9iamVjdDpudWxsfTt0cnl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7cmV0LnBhcmVudEV4aXN0cz10cnVlO3JldC5wYXJlbnRQYXRoPWxvb2t1cC5wYXRoO3JldC5wYXJlbnRPYmplY3Q9bG9va3VwLm5vZGU7cmV0Lm5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTtsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IWRvbnRSZXNvbHZlTGFzdExpbmt9KTtyZXQuZXhpc3RzPXRydWU7cmV0LnBhdGg9bG9va3VwLnBhdGg7cmV0Lm9iamVjdD1sb29rdXAubm9kZTtyZXQubmFtZT1sb29rdXAubm9kZS5uYW1lO3JldC5pc1Jvb3Q9bG9va3VwLnBhdGg9PT1cIi9cIn1jYXRjaChlKXtyZXQuZXJyb3I9ZS5lcnJub31yZXR1cm4gcmV0fSksY3JlYXRlRm9sZGVyOihmdW5jdGlvbihwYXJlbnQsbmFtZSxjYW5SZWFkLGNhbldyaXRlKXt2YXIgcGF0aD1QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT1cInN0cmluZ1wiP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMubWtkaXIocGF0aCxtb2RlKX0pLGNyZWF0ZVBhdGg6KGZ1bmN0aW9uKHBhcmVudCxwYXRoLGNhblJlYWQsY2FuV3JpdGUpe3BhcmVudD10eXBlb2YgcGFyZW50PT09XCJzdHJpbmdcIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpO3ZhciBwYXJ0cz1wYXRoLnNwbGl0KFwiL1wiKS5yZXZlcnNlKCk7d2hpbGUocGFydHMubGVuZ3RoKXt2YXIgcGFydD1wYXJ0cy5wb3AoKTtpZighcGFydCljb250aW51ZTt2YXIgY3VycmVudD1QQVRILmpvaW4yKHBhcmVudCxwYXJ0KTt0cnl7RlMubWtkaXIoY3VycmVudCl9Y2F0Y2goZSl7fXBhcmVudD1jdXJyZW50fXJldHVybiBjdXJyZW50fSksY3JlYXRlRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUscHJvcGVydGllcyxjYW5SZWFkLGNhbldyaXRlKXt2YXIgcGF0aD1QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT1cInN0cmluZ1wiP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMuY3JlYXRlKHBhdGgsbW9kZSl9KSxjcmVhdGVEYXRhRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsZGF0YSxjYW5SZWFkLGNhbldyaXRlLGNhbk93bil7dmFyIHBhdGg9bmFtZT9QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT1cInN0cmluZ1wiP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk6cGFyZW50O3ZhciBtb2RlPUZTLmdldE1vZGUoY2FuUmVhZCxjYW5Xcml0ZSk7dmFyIG5vZGU9RlMuY3JlYXRlKHBhdGgsbW9kZSk7aWYoZGF0YSl7aWYodHlwZW9mIGRhdGE9PT1cInN0cmluZ1wiKXt2YXIgYXJyPW5ldyBBcnJheShkYXRhLmxlbmd0aCk7Zm9yKHZhciBpPTAsbGVuPWRhdGEubGVuZ3RoO2k8bGVuOysraSlhcnJbaV09ZGF0YS5jaGFyQ29kZUF0KGkpO2RhdGE9YXJyfUZTLmNobW9kKG5vZGUsbW9kZXwxNDYpO3ZhciBzdHJlYW09RlMub3Blbihub2RlLFwid1wiKTtGUy53cml0ZShzdHJlYW0sZGF0YSwwLGRhdGEubGVuZ3RoLDAsY2FuT3duKTtGUy5jbG9zZShzdHJlYW0pO0ZTLmNobW9kKG5vZGUsbW9kZSl9cmV0dXJuIG5vZGV9KSxjcmVhdGVEZXZpY2U6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLGlucHV0LG91dHB1dCl7dmFyIHBhdGg9UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09XCJzdHJpbmdcIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpLG5hbWUpO3ZhciBtb2RlPUZTLmdldE1vZGUoISFpbnB1dCwhIW91dHB1dCk7aWYoIUZTLmNyZWF0ZURldmljZS5tYWpvcilGUy5jcmVhdGVEZXZpY2UubWFqb3I9NjQ7dmFyIGRldj1GUy5tYWtlZGV2KEZTLmNyZWF0ZURldmljZS5tYWpvcisrLDApO0ZTLnJlZ2lzdGVyRGV2aWNlKGRldix7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXtzdHJlYW0uc2Vla2FibGU9ZmFsc2V9KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXtpZihvdXRwdXQmJm91dHB1dC5idWZmZXImJm91dHB1dC5idWZmZXIubGVuZ3RoKXtvdXRwdXQoMTApfX0pLHJlYWQ6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3Mpe3ZhciBieXRlc1JlYWQ9MDtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3ZhciByZXN1bHQ7dHJ5e3Jlc3VsdD1pbnB1dCgpfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9aWYocmVzdWx0PT09dW5kZWZpbmVkJiZieXRlc1JlYWQ9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQUdBSU4pfWlmKHJlc3VsdD09PW51bGx8fHJlc3VsdD09PXVuZGVmaW5lZClicmVhaztieXRlc1JlYWQrKztidWZmZXJbb2Zmc2V0K2ldPXJlc3VsdH1pZihieXRlc1JlYWQpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVybiBieXRlc1JlYWR9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXt0cnl7b3V0cHV0KGJ1ZmZlcltvZmZzZXQraV0pfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9fWlmKGxlbmd0aCl7c3RyZWFtLm5vZGUudGltZXN0YW1wPURhdGUubm93KCl9cmV0dXJuIGl9KX0pO3JldHVybiBGUy5ta2RldihwYXRoLG1vZGUsZGV2KX0pLGNyZWF0ZUxpbms6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLHRhcmdldCxjYW5SZWFkLGNhbldyaXRlKXt2YXIgcGF0aD1QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT1cInN0cmluZ1wiP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7cmV0dXJuIEZTLnN5bWxpbmsodGFyZ2V0LHBhdGgpfSksZm9yY2VMb2FkRmlsZTooZnVuY3Rpb24ob2JqKXtpZihvYmouaXNEZXZpY2V8fG9iai5pc0ZvbGRlcnx8b2JqLmxpbmt8fG9iai5jb250ZW50cylyZXR1cm4gdHJ1ZTt2YXIgc3VjY2Vzcz10cnVlO2lmKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9PVwidW5kZWZpbmVkXCIpe3Rocm93IG5ldyBFcnJvcihcIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLlwiKX1lbHNlIGlmKE1vZHVsZVtcInJlYWRcIl0pe3RyeXtvYmouY29udGVudHM9aW50QXJyYXlGcm9tU3RyaW5nKE1vZHVsZVtcInJlYWRcIl0ob2JqLnVybCksdHJ1ZSk7b2JqLnVzZWRCeXRlcz1vYmouY29udGVudHMubGVuZ3RofWNhdGNoKGUpe3N1Y2Nlc3M9ZmFsc2V9fWVsc2V7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGxvYWQgd2l0aG91dCByZWFkKCkgb3IgWE1MSHR0cFJlcXVlc3QuXCIpfWlmKCFzdWNjZXNzKV9fX3NldEVyck5vKEVSUk5PX0NPREVTLkVJTyk7cmV0dXJuIHN1Y2Nlc3N9KSxjcmVhdGVMYXp5RmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsdXJsLGNhblJlYWQsY2FuV3JpdGUpe2Z1bmN0aW9uIExhenlVaW50OEFycmF5KCl7dGhpcy5sZW5ndGhLbm93bj1mYWxzZTt0aGlzLmNodW5rcz1bXX1MYXp5VWludDhBcnJheS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIExhenlVaW50OEFycmF5X2dldChpZHgpe2lmKGlkeD50aGlzLmxlbmd0aC0xfHxpZHg8MCl7cmV0dXJuIHVuZGVmaW5lZH12YXIgY2h1bmtPZmZzZXQ9aWR4JXRoaXMuY2h1bmtTaXplO3ZhciBjaHVua051bT1pZHgvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoY2h1bmtOdW0pW2NodW5rT2Zmc2V0XX07TGF6eVVpbnQ4QXJyYXkucHJvdG90eXBlLnNldERhdGFHZXR0ZXI9ZnVuY3Rpb24gTGF6eVVpbnQ4QXJyYXlfc2V0RGF0YUdldHRlcihnZXR0ZXIpe3RoaXMuZ2V0dGVyPWdldHRlcn07TGF6eVVpbnQ4QXJyYXkucHJvdG90eXBlLmNhY2hlTGVuZ3RoPWZ1bmN0aW9uIExhenlVaW50OEFycmF5X2NhY2hlTGVuZ3RoKCl7dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXCJIRUFEXCIsdXJsLGZhbHNlKTt4aHIuc2VuZChudWxsKTtpZighKHhoci5zdGF0dXM+PTIwMCYmeGhyLnN0YXR1czwzMDB8fHhoci5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGxvYWQgXCIrdXJsK1wiLiBTdGF0dXM6IFwiK3hoci5zdGF0dXMpO3ZhciBkYXRhbGVuZ3RoPU51bWJlcih4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LWxlbmd0aFwiKSk7dmFyIGhlYWRlcjt2YXIgaGFzQnl0ZVNlcnZpbmc9KGhlYWRlcj14aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJBY2NlcHQtUmFuZ2VzXCIpKSYmaGVhZGVyPT09XCJieXRlc1wiO3ZhciBjaHVua1NpemU9MTAyNCoxMDI0O2lmKCFoYXNCeXRlU2VydmluZyljaHVua1NpemU9ZGF0YWxlbmd0aDt2YXIgZG9YSFI9KGZ1bmN0aW9uKGZyb20sdG8pe2lmKGZyb20+dG8pdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCByYW5nZSAoXCIrZnJvbStcIiwgXCIrdG8rXCIpIG9yIG5vIGJ5dGVzIHJlcXVlc3RlZCFcIik7aWYodG8+ZGF0YWxlbmd0aC0xKXRocm93IG5ldyBFcnJvcihcIm9ubHkgXCIrZGF0YWxlbmd0aCtcIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhXCIpO3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTtpZihkYXRhbGVuZ3RoIT09Y2h1bmtTaXplKXhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIixcImJ5dGVzPVwiK2Zyb20rXCItXCIrdG8pO2lmKHR5cGVvZiBVaW50OEFycmF5IT1cInVuZGVmaW5lZFwiKXhoci5yZXNwb25zZVR5cGU9XCJhcnJheWJ1ZmZlclwiO2lmKHhoci5vdmVycmlkZU1pbWVUeXBlKXt4aHIub3ZlcnJpZGVNaW1lVHlwZShcInRleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWRcIil9eGhyLnNlbmQobnVsbCk7aWYoISh4aHIuc3RhdHVzPj0yMDAmJnhoci5zdGF0dXM8MzAwfHx4aHIuc3RhdHVzPT09MzA0KSl0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBsb2FkIFwiK3VybCtcIi4gU3RhdHVzOiBcIit4aHIuc3RhdHVzKTtpZih4aHIucmVzcG9uc2UhPT11bmRlZmluZWQpe3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2V8fFtdKX1lbHNle3JldHVybiBpbnRBcnJheUZyb21TdHJpbmcoeGhyLnJlc3BvbnNlVGV4dHx8XCJcIix0cnVlKX19KTt2YXIgbGF6eUFycmF5PXRoaXM7bGF6eUFycmF5LnNldERhdGFHZXR0ZXIoKGZ1bmN0aW9uKGNodW5rTnVtKXt2YXIgc3RhcnQ9Y2h1bmtOdW0qY2h1bmtTaXplO3ZhciBlbmQ9KGNodW5rTnVtKzEpKmNodW5rU2l6ZS0xO2VuZD1NYXRoLm1pbihlbmQsZGF0YWxlbmd0aC0xKTtpZih0eXBlb2YgbGF6eUFycmF5LmNodW5rc1tjaHVua051bV09PT1cInVuZGVmaW5lZFwiKXtsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXT1kb1hIUihzdGFydCxlbmQpfWlmKHR5cGVvZiBsYXp5QXJyYXkuY2h1bmtzW2NodW5rTnVtXT09PVwidW5kZWZpbmVkXCIpdGhyb3cgbmV3IEVycm9yKFwiZG9YSFIgZmFpbGVkIVwiKTtyZXR1cm4gbGF6eUFycmF5LmNodW5rc1tjaHVua051bV19KSk7dGhpcy5fbGVuZ3RoPWRhdGFsZW5ndGg7dGhpcy5fY2h1bmtTaXplPWNodW5rU2l6ZTt0aGlzLmxlbmd0aEtub3duPXRydWV9O2lmKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9PVwidW5kZWZpbmVkXCIpe2lmKCFFTlZJUk9OTUVOVF9JU19XT1JLRVIpdGhyb3dcIkNhbm5vdCBkbyBzeW5jaHJvbm91cyBiaW5hcnkgWEhScyBvdXRzaWRlIHdlYndvcmtlcnMgaW4gbW9kZXJuIGJyb3dzZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2NcIjt2YXIgbGF6eUFycmF5PW5ldyBMYXp5VWludDhBcnJheTtPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eUFycmF5LFwibGVuZ3RoXCIse2dldDooZnVuY3Rpb24oKXtpZighdGhpcy5sZW5ndGhLbm93bil7dGhpcy5jYWNoZUxlbmd0aCgpfXJldHVybiB0aGlzLl9sZW5ndGh9KX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5QXJyYXksXCJjaHVua1NpemVcIix7Z2V0OihmdW5jdGlvbigpe2lmKCF0aGlzLmxlbmd0aEtub3duKXt0aGlzLmNhY2hlTGVuZ3RoKCl9cmV0dXJuIHRoaXMuX2NodW5rU2l6ZX0pfSk7dmFyIHByb3BlcnRpZXM9e2lzRGV2aWNlOmZhbHNlLGNvbnRlbnRzOmxhenlBcnJheX19ZWxzZXt2YXIgcHJvcGVydGllcz17aXNEZXZpY2U6ZmFsc2UsdXJsOnVybH19dmFyIG5vZGU9RlMuY3JlYXRlRmlsZShwYXJlbnQsbmFtZSxwcm9wZXJ0aWVzLGNhblJlYWQsY2FuV3JpdGUpO2lmKHByb3BlcnRpZXMuY29udGVudHMpe25vZGUuY29udGVudHM9cHJvcGVydGllcy5jb250ZW50c31lbHNlIGlmKHByb3BlcnRpZXMudXJsKXtub2RlLmNvbnRlbnRzPW51bGw7bm9kZS51cmw9cHJvcGVydGllcy51cmx9T2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsXCJ1c2VkQnl0ZXNcIix7Z2V0OihmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRlbnRzLmxlbmd0aH0pfSk7dmFyIHN0cmVhbV9vcHM9e307dmFyIGtleXM9T2JqZWN0LmtleXMobm9kZS5zdHJlYW1fb3BzKTtrZXlzLmZvckVhY2goKGZ1bmN0aW9uKGtleSl7dmFyIGZuPW5vZGUuc3RyZWFtX29wc1trZXldO3N0cmVhbV9vcHNba2V5XT1mdW5jdGlvbiBmb3JjZUxvYWRMYXp5RmlsZSgpe2lmKCFGUy5mb3JjZUxvYWRGaWxlKG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfXJldHVybiBmbi5hcHBseShudWxsLGFyZ3VtZW50cyl9fSkpO3N0cmVhbV9vcHMucmVhZD1mdW5jdGlvbiBzdHJlYW1fb3BzX3JlYWQoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXtpZighRlMuZm9yY2VMb2FkRmlsZShub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlPKX12YXIgY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYocG9zaXRpb24+PWNvbnRlbnRzLmxlbmd0aClyZXR1cm4gMDt2YXIgc2l6ZT1NYXRoLm1pbihjb250ZW50cy5sZW5ndGgtcG9zaXRpb24sbGVuZ3RoKTthc3NlcnQoc2l6ZT49MCk7aWYoY29udGVudHMuc2xpY2Upe2Zvcih2YXIgaT0wO2k8c2l6ZTtpKyspe2J1ZmZlcltvZmZzZXQraV09Y29udGVudHNbcG9zaXRpb24raV19fWVsc2V7Zm9yKHZhciBpPTA7aTxzaXplO2krKyl7YnVmZmVyW29mZnNldCtpXT1jb250ZW50cy5nZXQocG9zaXRpb24raSl9fXJldHVybiBzaXplfTtub2RlLnN0cmVhbV9vcHM9c3RyZWFtX29wcztyZXR1cm4gbm9kZX0pLGNyZWF0ZVByZWxvYWRlZEZpbGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLHVybCxjYW5SZWFkLGNhbldyaXRlLG9ubG9hZCxvbmVycm9yLGRvbnRDcmVhdGVGaWxlLGNhbk93bixwcmVGaW5pc2gpe0Jyb3dzZXIuaW5pdCgpO3ZhciBmdWxsbmFtZT1uYW1lP1BBVEgucmVzb2x2ZShQQVRILmpvaW4yKHBhcmVudCxuYW1lKSk6cGFyZW50O3ZhciBkZXA9Z2V0VW5pcXVlUnVuRGVwZW5kZW5jeShcImNwIFwiK2Z1bGxuYW1lKTtmdW5jdGlvbiBwcm9jZXNzRGF0YShieXRlQXJyYXkpe2Z1bmN0aW9uIGZpbmlzaChieXRlQXJyYXkpe2lmKHByZUZpbmlzaClwcmVGaW5pc2goKTtpZighZG9udENyZWF0ZUZpbGUpe0ZTLmNyZWF0ZURhdGFGaWxlKHBhcmVudCxuYW1lLGJ5dGVBcnJheSxjYW5SZWFkLGNhbldyaXRlLGNhbk93bil9aWYob25sb2FkKW9ubG9hZCgpO3JlbW92ZVJ1bkRlcGVuZGVuY3koZGVwKX12YXIgaGFuZGxlZD1mYWxzZTtNb2R1bGVbXCJwcmVsb2FkUGx1Z2luc1wiXS5mb3JFYWNoKChmdW5jdGlvbihwbHVnaW4pe2lmKGhhbmRsZWQpcmV0dXJuO2lmKHBsdWdpbltcImNhbkhhbmRsZVwiXShmdWxsbmFtZSkpe3BsdWdpbltcImhhbmRsZVwiXShieXRlQXJyYXksZnVsbG5hbWUsZmluaXNoLChmdW5jdGlvbigpe2lmKG9uZXJyb3Ipb25lcnJvcigpO3JlbW92ZVJ1bkRlcGVuZGVuY3koZGVwKX0pKTtoYW5kbGVkPXRydWV9fSkpO2lmKCFoYW5kbGVkKWZpbmlzaChieXRlQXJyYXkpfWFkZFJ1bkRlcGVuZGVuY3koZGVwKTtpZih0eXBlb2YgdXJsPT1cInN0cmluZ1wiKXtCcm93c2VyLmFzeW5jTG9hZCh1cmwsKGZ1bmN0aW9uKGJ5dGVBcnJheSl7cHJvY2Vzc0RhdGEoYnl0ZUFycmF5KX0pLG9uZXJyb3IpfWVsc2V7cHJvY2Vzc0RhdGEodXJsKX19KSxpbmRleGVkREI6KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbmRleGVkREJ8fHdpbmRvdy5tb3pJbmRleGVkREJ8fHdpbmRvdy53ZWJraXRJbmRleGVkREJ8fHdpbmRvdy5tc0luZGV4ZWREQn0pLERCX05BTUU6KGZ1bmN0aW9uKCl7cmV0dXJuXCJFTV9GU19cIit3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9KSxEQl9WRVJTSU9OOjIwLERCX1NUT1JFX05BTUU6XCJGSUxFX0RBVEFcIixzYXZlRmlsZXNUb0RCOihmdW5jdGlvbihwYXRocyxvbmxvYWQsb25lcnJvcil7b25sb2FkPW9ubG9hZHx8KGZ1bmN0aW9uKCl7fSk7b25lcnJvcj1vbmVycm9yfHwoZnVuY3Rpb24oKXt9KTt2YXIgaW5kZXhlZERCPUZTLmluZGV4ZWREQigpO3RyeXt2YXIgb3BlblJlcXVlc3Q9aW5kZXhlZERCLm9wZW4oRlMuREJfTkFNRSgpLEZTLkRCX1ZFUlNJT04pfWNhdGNoKGUpe3JldHVybiBvbmVycm9yKGUpfW9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZD1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnVwZ3JhZGVuZWVkZWQoKXtjb25zb2xlLmxvZyhcImNyZWF0aW5nIGRiXCIpO3ZhciBkYj1vcGVuUmVxdWVzdC5yZXN1bHQ7ZGIuY3JlYXRlT2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSl9O29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXIgZGI9b3BlblJlcXVlc3QucmVzdWx0O3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbRlMuREJfU1RPUkVfTkFNRV0sXCJyZWFkd3JpdGVcIik7dmFyIGZpbGVzPXRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKEZTLkRCX1NUT1JFX05BTUUpO3ZhciBvaz0wLGZhaWw9MCx0b3RhbD1wYXRocy5sZW5ndGg7ZnVuY3Rpb24gZmluaXNoKCl7aWYoZmFpbD09MClvbmxvYWQoKTtlbHNlIG9uZXJyb3IoKX1wYXRocy5mb3JFYWNoKChmdW5jdGlvbihwYXRoKXt2YXIgcHV0UmVxdWVzdD1maWxlcy5wdXQoRlMuYW5hbHl6ZVBhdGgocGF0aCkub2JqZWN0LmNvbnRlbnRzLHBhdGgpO3B1dFJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uIHB1dFJlcXVlc3Rfb25zdWNjZXNzKCl7b2srKztpZihvaytmYWlsPT10b3RhbClmaW5pc2goKX07cHV0UmVxdWVzdC5vbmVycm9yPWZ1bmN0aW9uIHB1dFJlcXVlc3Rfb25lcnJvcigpe2ZhaWwrKztpZihvaytmYWlsPT10b3RhbClmaW5pc2goKX19KSk7dHJhbnNhY3Rpb24ub25lcnJvcj1vbmVycm9yfTtvcGVuUmVxdWVzdC5vbmVycm9yPW9uZXJyb3J9KSxsb2FkRmlsZXNGcm9tREI6KGZ1bmN0aW9uKHBhdGhzLG9ubG9hZCxvbmVycm9yKXtvbmxvYWQ9b25sb2FkfHwoZnVuY3Rpb24oKXt9KTtvbmVycm9yPW9uZXJyb3J8fChmdW5jdGlvbigpe30pO3ZhciBpbmRleGVkREI9RlMuaW5kZXhlZERCKCk7dHJ5e3ZhciBvcGVuUmVxdWVzdD1pbmRleGVkREIub3BlbihGUy5EQl9OQU1FKCksRlMuREJfVkVSU0lPTil9Y2F0Y2goZSl7cmV0dXJuIG9uZXJyb3IoZSl9b3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkPW9uZXJyb3I7b3BlblJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uIG9wZW5SZXF1ZXN0X29uc3VjY2Vzcygpe3ZhciBkYj1vcGVuUmVxdWVzdC5yZXN1bHQ7dHJ5e3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbRlMuREJfU1RPUkVfTkFNRV0sXCJyZWFkb25seVwiKX1jYXRjaChlKXtvbmVycm9yKGUpO3JldHVybn12YXIgZmlsZXM9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSk7dmFyIG9rPTAsZmFpbD0wLHRvdGFsPXBhdGhzLmxlbmd0aDtmdW5jdGlvbiBmaW5pc2goKXtpZihmYWlsPT0wKW9ubG9hZCgpO2Vsc2Ugb25lcnJvcigpfXBhdGhzLmZvckVhY2goKGZ1bmN0aW9uKHBhdGgpe3ZhciBnZXRSZXF1ZXN0PWZpbGVzLmdldChwYXRoKTtnZXRSZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBnZXRSZXF1ZXN0X29uc3VjY2Vzcygpe2lmKEZTLmFuYWx5emVQYXRoKHBhdGgpLmV4aXN0cyl7RlMudW5saW5rKHBhdGgpfUZTLmNyZWF0ZURhdGFGaWxlKFBBVEguZGlybmFtZShwYXRoKSxQQVRILmJhc2VuYW1lKHBhdGgpLGdldFJlcXVlc3QucmVzdWx0LHRydWUsdHJ1ZSx0cnVlKTtvaysrO2lmKG9rK2ZhaWw9PXRvdGFsKWZpbmlzaCgpfTtnZXRSZXF1ZXN0Lm9uZXJyb3I9ZnVuY3Rpb24gZ2V0UmVxdWVzdF9vbmVycm9yKCl7ZmFpbCsrO2lmKG9rK2ZhaWw9PXRvdGFsKWZpbmlzaCgpfX0pKTt0cmFuc2FjdGlvbi5vbmVycm9yPW9uZXJyb3J9O29wZW5SZXF1ZXN0Lm9uZXJyb3I9b25lcnJvcn0pfTt2YXIgU1lTQ0FMTFM9e0RFRkFVTFRfUE9MTE1BU0s6NSxtYXBwaW5nczp7fSx1bWFzazo1MTEsY2FsY3VsYXRlQXQ6KGZ1bmN0aW9uKGRpcmZkLHBhdGgpe2lmKHBhdGhbMF0hPT1cIi9cIil7dmFyIGRpcjtpZihkaXJmZD09PS0xMDApe2Rpcj1GUy5jd2QoKX1lbHNle3ZhciBkaXJzdHJlYW09RlMuZ2V0U3RyZWFtKGRpcmZkKTtpZighZGlyc3RyZWFtKXRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKTtkaXI9ZGlyc3RyZWFtLnBhdGh9cGF0aD1QQVRILmpvaW4yKGRpcixwYXRoKX1yZXR1cm4gcGF0aH0pLGRvU3RhdDooZnVuY3Rpb24oZnVuYyxwYXRoLGJ1Zil7dHJ5e3ZhciBzdGF0PWZ1bmMocGF0aCl9Y2F0Y2goZSl7aWYoZSYmZS5ub2RlJiZQQVRILm5vcm1hbGl6ZShwYXRoKSE9PVBBVEgubm9ybWFsaXplKEZTLmdldFBhdGgoZS5ub2RlKSkpe3JldHVybi1FUlJOT19DT0RFUy5FTk9URElSfXRocm93IGV9SEVBUDMyW2J1Zj4+Ml09c3RhdC5kZXY7SEVBUDMyW2J1Zis0Pj4yXT0wO0hFQVAzMltidWYrOD4+Ml09c3RhdC5pbm87SEVBUDMyW2J1ZisxMj4+Ml09c3RhdC5tb2RlO0hFQVAzMltidWYrMTY+PjJdPXN0YXQubmxpbms7SEVBUDMyW2J1ZisyMD4+Ml09c3RhdC51aWQ7SEVBUDMyW2J1ZisyND4+Ml09c3RhdC5naWQ7SEVBUDMyW2J1ZisyOD4+Ml09c3RhdC5yZGV2O0hFQVAzMltidWYrMzI+PjJdPTA7SEVBUDMyW2J1ZiszNj4+Ml09c3RhdC5zaXplO0hFQVAzMltidWYrNDA+PjJdPTQwOTY7SEVBUDMyW2J1Zis0ND4+Ml09c3RhdC5ibG9ja3M7SEVBUDMyW2J1Zis0OD4+Ml09c3RhdC5hdGltZS5nZXRUaW1lKCkvMWUzfDA7SEVBUDMyW2J1Zis1Mj4+Ml09MDtIRUFQMzJbYnVmKzU2Pj4yXT1zdGF0Lm10aW1lLmdldFRpbWUoKS8xZTN8MDtIRUFQMzJbYnVmKzYwPj4yXT0wO0hFQVAzMltidWYrNjQ+PjJdPXN0YXQuY3RpbWUuZ2V0VGltZSgpLzFlM3wwO0hFQVAzMltidWYrNjg+PjJdPTA7SEVBUDMyW2J1Zis3Mj4+Ml09c3RhdC5pbm87cmV0dXJuIDB9KSxkb01zeW5jOihmdW5jdGlvbihhZGRyLHN0cmVhbSxsZW4sZmxhZ3Mpe3ZhciBidWZmZXI9bmV3IFVpbnQ4QXJyYXkoSEVBUFU4LnN1YmFycmF5KGFkZHIsYWRkcitsZW4pKTtGUy5tc3luYyhzdHJlYW0sYnVmZmVyLDAsbGVuLGZsYWdzKX0pLGRvTWtkaXI6KGZ1bmN0aW9uKHBhdGgsbW9kZSl7cGF0aD1QQVRILm5vcm1hbGl6ZShwYXRoKTtpZihwYXRoW3BhdGgubGVuZ3RoLTFdPT09XCIvXCIpcGF0aD1wYXRoLnN1YnN0cigwLHBhdGgubGVuZ3RoLTEpO0ZTLm1rZGlyKHBhdGgsbW9kZSwwKTtyZXR1cm4gMH0pLGRvTWtub2Q6KGZ1bmN0aW9uKHBhdGgsbW9kZSxkZXYpe3N3aXRjaChtb2RlJjYxNDQwKXtjYXNlIDMyNzY4OmNhc2UgODE5MjpjYXNlIDI0NTc2OmNhc2UgNDA5NjpjYXNlIDQ5MTUyOmJyZWFrO2RlZmF1bHQ6cmV0dXJuLUVSUk5PX0NPREVTLkVJTlZBTH1GUy5ta25vZChwYXRoLG1vZGUsZGV2KTtyZXR1cm4gMH0pLGRvUmVhZGxpbms6KGZ1bmN0aW9uKHBhdGgsYnVmLGJ1ZnNpemUpe2lmKGJ1ZnNpemU8PTApcmV0dXJuLUVSUk5PX0NPREVTLkVJTlZBTDt2YXIgcmV0PUZTLnJlYWRsaW5rKHBhdGgpO3JldD1yZXQuc2xpY2UoMCxNYXRoLm1heCgwLGJ1ZnNpemUpKTt3cml0ZVN0cmluZ1RvTWVtb3J5KHJldCxidWYsdHJ1ZSk7cmV0dXJuIHJldC5sZW5ndGh9KSxkb0FjY2VzczooZnVuY3Rpb24ocGF0aCxhbW9kZSl7aWYoYW1vZGUmfjcpe3JldHVybi1FUlJOT19DT0RFUy5FSU5WQUx9dmFyIG5vZGU7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7bm9kZT1sb29rdXAubm9kZTt2YXIgcGVybXM9XCJcIjtpZihhbW9kZSY0KXBlcm1zKz1cInJcIjtpZihhbW9kZSYyKXBlcm1zKz1cIndcIjtpZihhbW9kZSYxKXBlcm1zKz1cInhcIjtpZihwZXJtcyYmRlMubm9kZVBlcm1pc3Npb25zKG5vZGUscGVybXMpKXtyZXR1cm4tRVJSTk9fQ09ERVMuRUFDQ0VTfXJldHVybiAwfSksZG9EdXA6KGZ1bmN0aW9uKHBhdGgsZmxhZ3Msc3VnZ2VzdEZEKXt2YXIgc3VnZ2VzdD1GUy5nZXRTdHJlYW0oc3VnZ2VzdEZEKTtpZihzdWdnZXN0KUZTLmNsb3NlKHN1Z2dlc3QpO3JldHVybiBGUy5vcGVuKHBhdGgsZmxhZ3MsMCxzdWdnZXN0RkQsc3VnZ2VzdEZEKS5mZH0pLGRvUmVhZHY6KGZ1bmN0aW9uKHN0cmVhbSxpb3YsaW92Y250LG9mZnNldCl7dmFyIHJldD0wO2Zvcih2YXIgaT0wO2k8aW92Y250O2krKyl7dmFyIHB0cj1IRUFQMzJbaW92K2kqOD4+Ml07dmFyIGxlbj1IRUFQMzJbaW92KyhpKjgrNCk+PjJdO3ZhciBjdXJyPUZTLnJlYWQoc3RyZWFtLEhFQVA4LHB0cixsZW4sb2Zmc2V0KTtpZihjdXJyPDApcmV0dXJuLTE7cmV0Kz1jdXJyO2lmKGN1cnI8bGVuKWJyZWFrfXJldHVybiByZXR9KSxkb1dyaXRldjooZnVuY3Rpb24oc3RyZWFtLGlvdixpb3ZjbnQsb2Zmc2V0KXt2YXIgcmV0PTA7Zm9yKHZhciBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXIgcHRyPUhFQVAzMltpb3YraSo4Pj4yXTt2YXIgbGVuPUhFQVAzMltpb3YrKGkqOCs0KT4+Ml07dmFyIGN1cnI9RlMud3JpdGUoc3RyZWFtLEhFQVA4LHB0cixsZW4sb2Zmc2V0KTtpZihjdXJyPDApcmV0dXJuLTE7cmV0Kz1jdXJyfXJldHVybiByZXR9KSx2YXJhcmdzOjAsZ2V0OihmdW5jdGlvbih2YXJhcmdzKXtTWVNDQUxMUy52YXJhcmdzKz00O3ZhciByZXQ9SEVBUDMyW1NZU0NBTExTLnZhcmFyZ3MtND4+Ml07cmV0dXJuIHJldH0pLGdldFN0cjooZnVuY3Rpb24oKXt2YXIgcmV0PVBvaW50ZXJfc3RyaW5naWZ5KFNZU0NBTExTLmdldCgpKTtyZXR1cm4gcmV0fSksZ2V0U3RyZWFtRnJvbUZEOihmdW5jdGlvbigpe3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKFNZU0NBTExTLmdldCgpKTtpZighc3RyZWFtKXRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKTtyZXR1cm4gc3RyZWFtfSksZ2V0U29ja2V0RnJvbUZEOihmdW5jdGlvbigpe3ZhciBzb2NrZXQ9U09DS0ZTLmdldFNvY2tldChTWVNDQUxMUy5nZXQoKSk7aWYoIXNvY2tldCl0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuIHNvY2tldH0pLGdldFNvY2tldEFkZHJlc3M6KGZ1bmN0aW9uKGFsbG93TnVsbCl7dmFyIGFkZHJwPVNZU0NBTExTLmdldCgpLGFkZHJsZW49U1lTQ0FMTFMuZ2V0KCk7aWYoYWxsb3dOdWxsJiZhZGRycD09PTApcmV0dXJuIG51bGw7dmFyIGluZm89X19yZWFkX3NvY2thZGRyKGFkZHJwLGFkZHJsZW4pO2lmKGluZm8uZXJybm8pdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoaW5mby5lcnJubyk7aW5mby5hZGRyPUROUy5sb29rdXBfYWRkcihpbmZvLmFkZHIpfHxpbmZvLmFkZHI7cmV0dXJuIGluZm99KSxnZXQ2NDooZnVuY3Rpb24oKXt2YXIgbG93PVNZU0NBTExTLmdldCgpLGhpZ2g9U1lTQ0FMTFMuZ2V0KCk7aWYobG93Pj0wKWFzc2VydChoaWdoPT09MCk7ZWxzZSBhc3NlcnQoaGlnaD09PS0xKTtyZXR1cm4gbG93fSksZ2V0WmVybzooZnVuY3Rpb24oKXthc3NlcnQoU1lTQ0FMTFMuZ2V0KCk9PT0wKX0pfTtmdW5jdGlvbiBfX19zeXNjYWxsNih3aGljaCx2YXJhcmdzKXtTWVNDQUxMUy52YXJhcmdzPXZhcmFyZ3M7dHJ5e3ZhciBzdHJlYW09U1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKCk7RlMuY2xvc2Uoc3RyZWFtKTtyZXR1cm4gMH1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT1cInVuZGVmaW5lZFwifHwhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSlhYm9ydChlKTtyZXR1cm4tZS5lcnJub319dmFyIF9lbXNjcmlwdGVuX2FzbV9jb25zdD10cnVlO2Z1bmN0aW9uIF9fX2Fzc2VydF9mYWlsKGNvbmRpdGlvbixmaWxlbmFtZSxsaW5lLGZ1bmMpe0FCT1JUPXRydWU7dGhyb3dcIkFzc2VydGlvbiBmYWlsZWQ6IFwiK1BvaW50ZXJfc3RyaW5naWZ5KGNvbmRpdGlvbikrXCIsIGF0OiBcIitbZmlsZW5hbWU/UG9pbnRlcl9zdHJpbmdpZnkoZmlsZW5hbWUpOlwidW5rbm93biBmaWxlbmFtZVwiLGxpbmUsZnVuYz9Qb2ludGVyX3N0cmluZ2lmeShmdW5jKTpcInVua25vd24gZnVuY3Rpb25cIl0rXCIgYXQgXCIrc3RhY2tUcmFjZSgpfWZ1bmN0aW9uIF9zYnJrKGJ5dGVzKXt2YXIgc2VsZj1fc2JyaztpZighc2VsZi5jYWxsZWQpe0RZTkFNSUNUT1A9YWxpZ25NZW1vcnlQYWdlKERZTkFNSUNUT1ApO3NlbGYuY2FsbGVkPXRydWU7YXNzZXJ0KFJ1bnRpbWUuZHluYW1pY0FsbG9jKTtzZWxmLmFsbG9jPVJ1bnRpbWUuZHluYW1pY0FsbG9jO1J1bnRpbWUuZHluYW1pY0FsbG9jPShmdW5jdGlvbigpe2Fib3J0KFwiY2Fubm90IGR5bmFtaWNhbGx5IGFsbG9jYXRlLCBzYnJrIG5vdyBoYXMgY29udHJvbFwiKX0pfXZhciByZXQ9RFlOQU1JQ1RPUDtpZihieXRlcyE9MCl7dmFyIHN1Y2Nlc3M9c2VsZi5hbGxvYyhieXRlcyk7aWYoIXN1Y2Nlc3MpcmV0dXJuLTE+Pj4wfXJldHVybiByZXR9ZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LHNyYyxudW0pe0hFQVBVOC5zZXQoSEVBUFU4LnN1YmFycmF5KHNyYyxzcmMrbnVtKSxkZXN0KTtyZXR1cm4gZGVzdH1Nb2R1bGVbXCJfbWVtY3B5XCJdPV9tZW1jcHk7TW9kdWxlW1wiX21lbW1vdmVcIl09X21lbW1vdmU7dmFyIF9lbXNjcmlwdGVuX2FzbV9jb25zdF9pbnQ9dHJ1ZTtmdW5jdGlvbiBfdGltZShwdHIpe3ZhciByZXQ9RGF0ZS5ub3coKS8xZTN8MDtpZihwdHIpe0hFQVAzMltwdHI+PjJdPXJldH1yZXR1cm4gcmV0fWZ1bmN0aW9uIF9wdGhyZWFkX3NlbGYoKXtyZXR1cm4gMH1mdW5jdGlvbiBfX19zeXNjYWxsMTQwKHdoaWNoLHZhcmFyZ3Mpe1NZU0NBTExTLnZhcmFyZ3M9dmFyYXJnczt0cnl7dmFyIHN0cmVhbT1TWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoKSxvZmZzZXRfaGlnaD1TWVNDQUxMUy5nZXQoKSxvZmZzZXRfbG93PVNZU0NBTExTLmdldCgpLHJlc3VsdD1TWVNDQUxMUy5nZXQoKSx3aGVuY2U9U1lTQ0FMTFMuZ2V0KCk7dmFyIG9mZnNldD1vZmZzZXRfbG93O2Fzc2VydChvZmZzZXRfaGlnaD09PTApO0ZTLmxsc2VlayhzdHJlYW0sb2Zmc2V0LHdoZW5jZSk7SEVBUDMyW3Jlc3VsdD4+Ml09c3RyZWFtLnBvc2l0aW9uO2lmKHN0cmVhbS5nZXRkZW50cyYmb2Zmc2V0PT09MCYmd2hlbmNlPT09MClzdHJlYW0uZ2V0ZGVudHM9bnVsbDtyZXR1cm4gMH1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT1cInVuZGVmaW5lZFwifHwhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSlhYm9ydChlKTtyZXR1cm4tZS5lcnJub319ZnVuY3Rpb24gX19fc3lzY2FsbDE0Nih3aGljaCx2YXJhcmdzKXtTWVNDQUxMUy52YXJhcmdzPXZhcmFyZ3M7dHJ5e3ZhciBzdHJlYW09U1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKCksaW92PVNZU0NBTExTLmdldCgpLGlvdmNudD1TWVNDQUxMUy5nZXQoKTtyZXR1cm4gU1lTQ0FMTFMuZG9Xcml0ZXYoc3RyZWFtLGlvdixpb3ZjbnQpfWNhdGNoKGUpe2lmKHR5cGVvZiBGUz09PVwidW5kZWZpbmVkXCJ8fCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKWFib3J0KGUpO3JldHVybi1lLmVycm5vfX1mdW5jdGlvbiBfX19zeXNjYWxsNTQod2hpY2gsdmFyYXJncyl7U1lTQ0FMTFMudmFyYXJncz12YXJhcmdzO3RyeXt2YXIgc3RyZWFtPVNZU0NBTExTLmdldFN0cmVhbUZyb21GRCgpLG9wPVNZU0NBTExTLmdldCgpO3N3aXRjaChvcCl7Y2FzZSAyMTUwNTp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLUVSUk5PX0NPREVTLkVOT1RUWTtyZXR1cm4gMH07Y2FzZSAyMTUwNjp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLUVSUk5PX0NPREVTLkVOT1RUWTtyZXR1cm4gMH07Y2FzZSAyMTUxOTp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLUVSUk5PX0NPREVTLkVOT1RUWTt2YXIgYXJncD1TWVNDQUxMUy5nZXQoKTtIRUFQMzJbYXJncD4+Ml09MDtyZXR1cm4gMH07Y2FzZSAyMTUyMDp7aWYoIXN0cmVhbS50dHkpcmV0dXJuLUVSUk5PX0NPREVTLkVOT1RUWTtyZXR1cm4tRVJSTk9fQ09ERVMuRUlOVkFMfTtjYXNlIDIxNTMxOnt2YXIgYXJncD1TWVNDQUxMUy5nZXQoKTtyZXR1cm4gRlMuaW9jdGwoc3RyZWFtLG9wLGFyZ3ApfTtkZWZhdWx0OmFib3J0KFwiYmFkIGlvY3RsIHN5c2NhbGwgXCIrb3ApfX1jYXRjaChlKXtpZih0eXBlb2YgRlM9PT1cInVuZGVmaW5lZFwifHwhKGUgaW5zdGFuY2VvZiBGUy5FcnJub0Vycm9yKSlhYm9ydChlKTtyZXR1cm4tZS5lcnJub319RlMuc3RhdGljSW5pdCgpO19fQVRJTklUX18udW5zaGlmdCgoZnVuY3Rpb24oKXtpZighTW9kdWxlW1wibm9GU0luaXRcIl0mJiFGUy5pbml0LmluaXRpYWxpemVkKUZTLmluaXQoKX0pKTtfX0FUTUFJTl9fLnB1c2goKGZ1bmN0aW9uKCl7RlMuaWdub3JlUGVybWlzc2lvbnM9ZmFsc2V9KSk7X19BVEVYSVRfXy5wdXNoKChmdW5jdGlvbigpe0ZTLnF1aXQoKX0pKTtNb2R1bGVbXCJGU19jcmVhdGVGb2xkZXJcIl09RlMuY3JlYXRlRm9sZGVyO01vZHVsZVtcIkZTX2NyZWF0ZVBhdGhcIl09RlMuY3JlYXRlUGF0aDtNb2R1bGVbXCJGU19jcmVhdGVEYXRhRmlsZVwiXT1GUy5jcmVhdGVEYXRhRmlsZTtNb2R1bGVbXCJGU19jcmVhdGVQcmVsb2FkZWRGaWxlXCJdPUZTLmNyZWF0ZVByZWxvYWRlZEZpbGU7TW9kdWxlW1wiRlNfY3JlYXRlTGF6eUZpbGVcIl09RlMuY3JlYXRlTGF6eUZpbGU7TW9kdWxlW1wiRlNfY3JlYXRlTGlua1wiXT1GUy5jcmVhdGVMaW5rO01vZHVsZVtcIkZTX2NyZWF0ZURldmljZVwiXT1GUy5jcmVhdGVEZXZpY2U7TW9kdWxlW1wiRlNfdW5saW5rXCJdPUZTLnVubGluaztfX0FUSU5JVF9fLnVuc2hpZnQoKGZ1bmN0aW9uKCl7VFRZLmluaXQoKX0pKTtfX0FURVhJVF9fLnB1c2goKGZ1bmN0aW9uKCl7VFRZLnNodXRkb3duKCl9KSk7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7dmFyIGZzPXJlcXVpcmUoXCJmc1wiKTt2YXIgTk9ERUpTX1BBVEg9cmVxdWlyZShcInBhdGhcIik7Tk9ERUZTLnN0YXRpY0luaXQoKX1TVEFDS19CQVNFPVNUQUNLVE9QPVJ1bnRpbWUuYWxpZ25NZW1vcnkoU1RBVElDVE9QKTtzdGF0aWNTZWFsZWQ9dHJ1ZTtTVEFDS19NQVg9U1RBQ0tfQkFTRStUT1RBTF9TVEFDSztEWU5BTUlDX0JBU0U9RFlOQU1JQ1RPUD1SdW50aW1lLmFsaWduTWVtb3J5KFNUQUNLX01BWCk7YXNzZXJ0KERZTkFNSUNfQkFTRTxUT1RBTF9NRU1PUlksXCJUT1RBTF9NRU1PUlkgbm90IGJpZyBlbm91Z2ggZm9yIHN0YWNrXCIpO3ZhciBjdHR6X2k4PWFsbG9jYXRlKFs4LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNSwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDYsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNywwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw2LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNSwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwXSxcImk4XCIsQUxMT0NfRFlOQU1JQyk7ZnVuY3Rpb24gaW52b2tlX2koaW5kZXgpe3RyeXtyZXR1cm4gTW9kdWxlW1wiZHluQ2FsbF9pXCJdKGluZGV4KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PVwibnVtYmVyXCImJmUhPT1cImxvbmdqbXBcIil0aHJvdyBlO2FzbVtcInNldFRocmV3XCJdKDEsMCl9fWZ1bmN0aW9uIGpzQ2FsbF9pKGluZGV4KXtyZXR1cm4gUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2luZGV4XSgpfWZ1bmN0aW9uIGludm9rZV9paShpbmRleCxhMSl7dHJ5e3JldHVybiBNb2R1bGVbXCJkeW5DYWxsX2lpXCJdKGluZGV4LGExKX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PVwibnVtYmVyXCImJmUhPT1cImxvbmdqbXBcIil0aHJvdyBlO2FzbVtcInNldFRocmV3XCJdKDEsMCl9fWZ1bmN0aW9uIGpzQ2FsbF9paShpbmRleCxhMSl7cmV0dXJuIFJ1bnRpbWUuZnVuY3Rpb25Qb2ludGVyc1tpbmRleF0oYTEpfWZ1bmN0aW9uIGludm9rZV9paWlpKGluZGV4LGExLGEyLGEzKXt0cnl7cmV0dXJuIE1vZHVsZVtcImR5bkNhbGxfaWlpaVwiXShpbmRleCxhMSxhMixhMyl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT1cIm51bWJlclwiJiZlIT09XCJsb25nam1wXCIpdGhyb3cgZTthc21bXCJzZXRUaHJld1wiXSgxLDApfX1mdW5jdGlvbiBqc0NhbGxfaWlpaShpbmRleCxhMSxhMixhMyl7cmV0dXJuIFJ1bnRpbWUuZnVuY3Rpb25Qb2ludGVyc1tpbmRleF0oYTEsYTIsYTMpfWZ1bmN0aW9uIGludm9rZV92aShpbmRleCxhMSl7dHJ5e01vZHVsZVtcImR5bkNhbGxfdmlcIl0oaW5kZXgsYTEpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09XCJudW1iZXJcIiYmZSE9PVwibG9uZ2ptcFwiKXRocm93IGU7YXNtW1wic2V0VGhyZXdcIl0oMSwwKX19ZnVuY3Rpb24ganNDYWxsX3ZpKGluZGV4LGExKXtSdW50aW1lLmZ1bmN0aW9uUG9pbnRlcnNbaW5kZXhdKGExKX1Nb2R1bGUuYXNtR2xvYmFsQXJnPXtcIk1hdGhcIjpNYXRoLFwiSW50OEFycmF5XCI6SW50OEFycmF5LFwiSW50MTZBcnJheVwiOkludDE2QXJyYXksXCJJbnQzMkFycmF5XCI6SW50MzJBcnJheSxcIlVpbnQ4QXJyYXlcIjpVaW50OEFycmF5LFwiVWludDE2QXJyYXlcIjpVaW50MTZBcnJheSxcIlVpbnQzMkFycmF5XCI6VWludDMyQXJyYXksXCJGbG9hdDMyQXJyYXlcIjpGbG9hdDMyQXJyYXksXCJGbG9hdDY0QXJyYXlcIjpGbG9hdDY0QXJyYXksXCJOYU5cIjpOYU4sXCJJbmZpbml0eVwiOkluZmluaXR5fTtNb2R1bGUuYXNtTGlicmFyeUFyZz17XCJhYm9ydFwiOmFib3J0LFwiYXNzZXJ0XCI6YXNzZXJ0LFwiaW52b2tlX2lcIjppbnZva2VfaSxcImpzQ2FsbF9pXCI6anNDYWxsX2ksXCJpbnZva2VfaWlcIjppbnZva2VfaWksXCJqc0NhbGxfaWlcIjpqc0NhbGxfaWksXCJpbnZva2VfaWlpaVwiOmludm9rZV9paWlpLFwianNDYWxsX2lpaWlcIjpqc0NhbGxfaWlpaSxcImludm9rZV92aVwiOmludm9rZV92aSxcImpzQ2FsbF92aVwiOmpzQ2FsbF92aSxcIl9wdGhyZWFkX2NsZWFudXBfcG9wXCI6X3B0aHJlYWRfY2xlYW51cF9wb3AsXCJfX19sb2NrXCI6X19fbG9jayxcIl9zeXNjb25mXCI6X3N5c2NvbmYsXCJfcHRocmVhZF9zZWxmXCI6X3B0aHJlYWRfc2VsZixcIl9fX3N5c2NhbGw2XCI6X19fc3lzY2FsbDYsXCJfX19zZXRFcnJOb1wiOl9fX3NldEVyck5vLFwiX2Fib3J0XCI6X2Fib3J0LFwiX3NicmtcIjpfc2JyayxcIl90aW1lXCI6X3RpbWUsXCJfcHRocmVhZF9jbGVhbnVwX3B1c2hcIjpfcHRocmVhZF9jbGVhbnVwX3B1c2gsXCJfZW1zY3JpcHRlbl9tZW1jcHlfYmlnXCI6X2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyxcIl9fX3N5c2NhbGw1NFwiOl9fX3N5c2NhbGw1NCxcIl9fX3VubG9ja1wiOl9fX3VubG9jayxcIl9fX3N5c2NhbGwxNDBcIjpfX19zeXNjYWxsMTQwLFwiX19fYXNzZXJ0X2ZhaWxcIjpfX19hc3NlcnRfZmFpbCxcIl9fX3N5c2NhbGwxNDZcIjpfX19zeXNjYWxsMTQ2LFwiX2Vtc2NyaXB0ZW5fYXNtX2NvbnN0XzBcIjpfZW1zY3JpcHRlbl9hc21fY29uc3RfMCxcIlNUQUNLVE9QXCI6U1RBQ0tUT1AsXCJTVEFDS19NQVhcIjpTVEFDS19NQVgsXCJ0ZW1wRG91YmxlUHRyXCI6dGVtcERvdWJsZVB0cixcIkFCT1JUXCI6QUJPUlQsXCJjdHR6X2k4XCI6Y3R0el9pOH07Ly8gRU1TQ1JJUFRFTl9TVEFSVF9BU01cbnZhciBhc209KGZ1bmN0aW9uKGdsb2JhbCxlbnYsYnVmZmVyKSB7XG5cInVzZSBhc21cIjt2YXIgYT1uZXcgZ2xvYmFsLkludDhBcnJheShidWZmZXIpO3ZhciBiPW5ldyBnbG9iYWwuSW50MTZBcnJheShidWZmZXIpO3ZhciBjPW5ldyBnbG9iYWwuSW50MzJBcnJheShidWZmZXIpO3ZhciBkPW5ldyBnbG9iYWwuVWludDhBcnJheShidWZmZXIpO3ZhciBlPW5ldyBnbG9iYWwuVWludDE2QXJyYXkoYnVmZmVyKTt2YXIgZj1uZXcgZ2xvYmFsLlVpbnQzMkFycmF5KGJ1ZmZlcik7dmFyIGc9bmV3IGdsb2JhbC5GbG9hdDMyQXJyYXkoYnVmZmVyKTt2YXIgaD1uZXcgZ2xvYmFsLkZsb2F0NjRBcnJheShidWZmZXIpO3ZhciBpPWVudi5TVEFDS1RPUHwwO3ZhciBqPWVudi5TVEFDS19NQVh8MDt2YXIgaz1lbnYudGVtcERvdWJsZVB0cnwwO3ZhciBsPWVudi5BQk9SVHwwO3ZhciBtPWVudi5jdHR6X2k4fDA7dmFyIG49MDt2YXIgbz0wO3ZhciBwPTA7dmFyIHE9MDt2YXIgcj1nbG9iYWwuTmFOLHM9Z2xvYmFsLkluZmluaXR5O3ZhciB0PTAsdT0wLHY9MCx3PTAseD0wLjAseT0wLHo9MCxBPTAsQj0wLjA7dmFyIEM9MDt2YXIgRD0wO3ZhciBFPTA7dmFyIEY9MDt2YXIgRz0wO3ZhciBIPTA7dmFyIEk9MDt2YXIgSj0wO3ZhciBLPTA7dmFyIEw9MDt2YXIgTT1nbG9iYWwuTWF0aC5mbG9vcjt2YXIgTj1nbG9iYWwuTWF0aC5hYnM7dmFyIE89Z2xvYmFsLk1hdGguc3FydDt2YXIgUD1nbG9iYWwuTWF0aC5wb3c7dmFyIFE9Z2xvYmFsLk1hdGguY29zO3ZhciBSPWdsb2JhbC5NYXRoLnNpbjt2YXIgUz1nbG9iYWwuTWF0aC50YW47dmFyIFQ9Z2xvYmFsLk1hdGguYWNvczt2YXIgVT1nbG9iYWwuTWF0aC5hc2luO3ZhciBWPWdsb2JhbC5NYXRoLmF0YW47dmFyIFc9Z2xvYmFsLk1hdGguYXRhbjI7dmFyIFg9Z2xvYmFsLk1hdGguZXhwO3ZhciBZPWdsb2JhbC5NYXRoLmxvZzt2YXIgWj1nbG9iYWwuTWF0aC5jZWlsO3ZhciBfPWdsb2JhbC5NYXRoLmltdWw7dmFyICQ9Z2xvYmFsLk1hdGgubWluO3ZhciBhYT1nbG9iYWwuTWF0aC5jbHozMjt2YXIgYmE9ZW52LmFib3J0O3ZhciBjYT1lbnYuYXNzZXJ0O3ZhciBkYT1lbnYuaW52b2tlX2k7dmFyIGVhPWVudi5qc0NhbGxfaTt2YXIgZmE9ZW52Lmludm9rZV9paTt2YXIgZ2E9ZW52LmpzQ2FsbF9paTt2YXIgaGE9ZW52Lmludm9rZV9paWlpO3ZhciBpYT1lbnYuanNDYWxsX2lpaWk7dmFyIGphPWVudi5pbnZva2Vfdmk7dmFyIGthPWVudi5qc0NhbGxfdmk7dmFyIGxhPWVudi5fcHRocmVhZF9jbGVhbnVwX3BvcDt2YXIgbWE9ZW52Ll9fX2xvY2s7dmFyIG5hPWVudi5fc3lzY29uZjt2YXIgb2E9ZW52Ll9wdGhyZWFkX3NlbGY7dmFyIHBhPWVudi5fX19zeXNjYWxsNjt2YXIgcWE9ZW52Ll9fX3NldEVyck5vO3ZhciByYT1lbnYuX2Fib3J0O3ZhciBzYT1lbnYuX3Nicms7dmFyIHRhPWVudi5fdGltZTt2YXIgdWE9ZW52Ll9wdGhyZWFkX2NsZWFudXBfcHVzaDt2YXIgdmE9ZW52Ll9lbXNjcmlwdGVuX21lbWNweV9iaWc7dmFyIHdhPWVudi5fX19zeXNjYWxsNTQ7dmFyIHhhPWVudi5fX191bmxvY2s7dmFyIHlhPWVudi5fX19zeXNjYWxsMTQwO3ZhciB6YT1lbnYuX19fYXNzZXJ0X2ZhaWw7dmFyIEFhPWVudi5fX19zeXNjYWxsMTQ2O3ZhciBCYT1lbnYuX2Vtc2NyaXB0ZW5fYXNtX2NvbnN0XzA7dmFyIENhPTAuMDtcbi8vIEVNU0NSSVBURU5fU1RBUlRfRlVOQ1NcbmZ1bmN0aW9uIE5jKGIsZSl7Yj1ifDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MCxTPTAsVD0wO1I9aTtQPWk9aSs2MyYtNjQ7aT1pKzMyMHwwO1E9UCsyODB8MDtrPVArMjQwfDA7aj1QKzIwMHwwO3E9UCsxNjB8MDtsPVArMTIwfDA7bT1QKzgwfDA7bz1QKzQwfDA7Tz1iKzQwfDA7VD1kW2U+PjBdfDA7TT1IZChkW2UrMT4+MF18MHwwLDAsOCl8MDtKPUM7cj1IZChkW2UrMj4+MF18MHwwLDAsMTYpfDA7Sj1KfEM7cz1IZChkW2UrMz4+MF18MHwwLDAsMjQpfDA7Sj1KfEM7ST1hW2UrNj4+MF18MDtMPWRbZSs0Pj4wXXwwO3A9SGQoZFtlKzU+PjBdfDB8MCwwLDgpfDA7Sz1DO0k9SGQoSSYyNTV8MCwwLDE2KXwwO0s9SGQocHxMfEl8MCxLfEN8MCw2KXwwO0k9QztMPWFbZSs5Pj4wXXwwO3A9ZFtlKzc+PjBdfDA7Zj1IZChkW2UrOD4+MF18MHwwLDAsOCl8MDt3PUM7TD1IZChMJjI1NXwwLDAsMTYpfDA7dz1IZChmfHB8THwwLHd8Q3wwLDUpfDA7TD1DO3A9YVtlKzEyPj4wXXwwO2Y9ZFtlKzEwPj4wXXwwO3k9SGQoZFtlKzExPj4wXXwwfDAsMCw4KXwwO249QztwPUhkKHAmMjU1fDAsMCwxNil8MDtuPUhkKHl8ZnxwfDAsbnxDfDAsMyl8MDtwPUM7Zj1hW2UrMTU+PjBdfDA7eT1kW2UrMTM+PjBdfDA7Rj1IZChkW2UrMTQ+PjBdfDB8MCwwLDgpfDA7QT1DO2Y9SGQoZiYyNTV8MCwwLDE2KXwwO0E9SGQoRnx5fGZ8MCxBfEN8MCwyKXwwO2Y9Qzt5PWRbZSsxNj4+MF18MDtGPUhkKGRbZSsxNz4+MF18MHwwLDAsOCl8MDt1PUM7aD1IZChkW2UrMTg+PjBdfDB8MCwwLDE2KXwwO3U9dXxDO3Q9SGQoZFtlKzE5Pj4wXXwwfDAsMCwyNCl8MDt0PUZ8eXxofHQ7dT11fEM7aD1hW2UrMjI+PjBdfDA7eT1kW2UrMjA+PjBdfDA7Rj1IZChkW2UrMjE+PjBdfDB8MCwwLDgpfDA7RT1DO2g9SGQoaCYyNTV8MCwwLDE2KXwwO0U9SGQoRnx5fGh8MCxFfEN8MCw3KXwwO2g9Qzt5PWFbZSsyNT4+MF18MDtGPWRbZSsyMz4+MF18MDtOPUhkKGRbZSsyND4+MF18MHwwLDAsOCl8MDt4PUM7eT1IZCh5JjI1NXwwLDAsMTYpfDA7eD1IZChOfEZ8eXwwLHh8Q3wwLDUpfDA7eT1DO0Y9YVtlKzI4Pj4wXXwwO049ZFtlKzI2Pj4wXXwwO2c9SGQoZFtlKzI3Pj4wXXwwfDAsMCw4KXwwO0c9QztGPUhkKEYmMjU1fDAsMCwxNil8MDtHPUhkKGd8TnxGfDAsR3xDfDAsNCl8MDtGPUM7Tj1lKzMxfDA7Zz1hW04+PjBdfDA7RD1kW2UrMjk+PjBdfDA7dj1IZChkW2UrMzA+PjBdfDB8MCwwLDgpfDA7Qj1DO2c9SGQoZyYyNTV8MCwwLDE2KXwwO0I9SGQodnxEfGd8MCxCfEN8MCwyKXwwO0I9QiYzMzU1NDQyODtnPURkKEJ8MCwwLDE2Nzc3MjE2LDApfDA7Zz1HZChnfDAsQ3wwLDI1KXwwO0Q9Qzt2PUNkKDAsMCxnfDAsRHwwKXwwO0o9RGQodiYxOXwwLDAsTXxUfHJ8c3wwLEp8MCl8MDtzPUM7RD1IZChnfDAsRHwwLDI1KXwwO2c9QztyPURkKEt8MCxJfDAsMTY3NzcyMTYsMCl8MDtyPUdkKHJ8MCxDfDAsMjUpfDA7VD1DO0w9RGQod3wwLEx8MCxyfDAsVHwwKXwwO3c9QztUPUhkKHJ8MCxUfDAsMjUpfDA7VD1DZChLfDAsSXwwLFR8MCxDfDApfDA7ST1DO0s9RGQobnwwLHB8MCwxNjc3NzIxNiwwKXwwO0s9R2QoS3wwLEN8MCwyNSl8MDtyPUM7Zj1EZChBfDAsZnwwLEt8MCxyfDApfDA7QT1DO3I9SGQoS3wwLHJ8MCwyNSl8MDtLPUM7TT1EZCh0fDAsdXwwLDE2Nzc3MjE2LDApfDA7TT1HZChNfDAsQ3wwLDI1KXwwO3Y9QztoPURkKEV8MCxofDAsTXwwLHZ8MCl8MDtFPUM7dj1IZChNfDAsdnwwLDI1KXwwO009QztlPURkKHh8MCx5fDAsMTY3NzcyMTYsMCl8MDtlPUdkKGV8MCxDfDAsMjUpfDA7ej1DO0Y9RGQoR3wwLEZ8MCxlfDAsenwwKXwwO0c9Qzt6PUhkKGV8MCx6fDAsMjUpfDA7ZT1DO1M9RGQoSnwwLHN8MCwzMzU1NDQzMiwwKXwwO1M9RWQoU3wwLEN8MCwyNil8MDtIPUM7ST1EZChUfDAsSXwwLFN8MCxIfDApfDA7SD1IZChTfDAsSHwwLDI2KXwwO0g9Q2QoSnwwLHN8MCxIfDAsQ3wwKXwwO3M9RGQoTHwwLHd8MCwzMzU1NDQzMiwwKXwwO3M9RWQoc3wwLEN8MCwyNil8MDtKPUM7cD1EZChzfDAsSnwwLG58MCxwfDApfDA7Sz1DZChwfDAsQ3wwLHJ8MCxLfDApfDA7Sj1IZChzfDAsSnwwLDI2KXwwO0o9Q2QoTHwwLHd8MCxKfDAsQ3wwKXwwO3c9RGQoZnwwLEF8MCwzMzU1NDQzMiwwKXwwO3c9RWQod3wwLEN8MCwyNil8MDtMPUM7dT1EZCh3fDAsTHwwLHR8MCx1fDApfDA7TT1DZCh1fDAsQ3wwLHZ8MCxNfDApfDA7TD1IZCh3fDAsTHwwLDI2KXwwO0w9Q2QoZnwwLEF8MCxMfDAsQ3wwKXwwO0E9RGQoaHwwLEV8MCwzMzU1NDQzMiwwKXwwO0E9RWQoQXwwLEN8MCwyNil8MDtmPUM7eT1EZChBfDAsZnwwLHh8MCx5fDApfDA7ZT1DZCh5fDAsQ3wwLHp8MCxlfDApfDA7Zj1IZChBfDAsZnwwLDI2KXwwO2Y9Q2QoaHwwLEV8MCxmfDAsQ3wwKXwwO0U9RGQoRnwwLEd8MCwzMzU1NDQzMiwwKXwwO0U9RWQoRXwwLEN8MCwyNil8MDtoPUM7Qj1EZChCfDAsMCxFfDAsaHwwKXwwO2c9Q2QoQnwwLEN8MCxEfDAsZ3wwKXwwO2g9SGQoRXwwLGh8MCwyNil8MDtoPUNkKEZ8MCxHfDAsaHwwLEN8MCl8MDtjW08+PjJdPUg7Y1tiKzQ0Pj4yXT1JO2NbYis0OD4+Ml09SjtjW2IrNTI+PjJdPUs7Y1tiKzU2Pj4yXT1MO2NbYis2MD4+Ml09TTtjW2IrNjQ+PjJdPWY7Y1tiKzY4Pj4yXT1lO2NbYis3Mj4+Ml09aDtjW2IrNzY+PjJdPWc7Zz1iKzgwfDA7Y1tnPj4yXT0xO2g9Yis4NHwwO2U9aDtmPWUrMzZ8MDtkb3tjW2U+PjJdPTA7ZT1lKzR8MH13aGlsZSgoZXwwKTwoZnwwKSk7S2MocSxPKTtKYyhsLHEsMTA2NCk7Zj1xKzR8MDtuPXErOHwwO3A9cSsxMnwwO3I9cSsxNnwwO3M9cSsyMHwwO3Y9cSsyNHwwO3g9cSsyOHwwO3o9cSszMnwwO0I9cSszNnwwO2c9Y1tnPj4yXXwwO3Q9Y1toPj4yXXwwO3c9Y1tiKzg4Pj4yXXwwO0E9Y1tiKzkyPj4yXXwwO0U9Y1tiKzk2Pj4yXXwwO0c9Y1tiKzEwMD4+Ml18MDtJPWNbYisxMDQ+PjJdfDA7Sz1jW2IrMTA4Pj4yXXwwO009Y1tiKzExMj4+Ml18MDtUPWNbYisxMTY+PjJdfDA7ZT0oY1tmPj4yXXwwKS10fDA7Uz0oY1tuPj4yXXwwKS13fDA7TD0oY1twPj4yXXwwKS1BfDA7Sj0oY1tyPj4yXXwwKS1FfDA7SD0oY1tzPj4yXXwwKS1HfDA7Rj0oY1t2Pj4yXXwwKS1JfDA7RD0oY1t4Pj4yXXwwKS1LfDA7eT0oY1t6Pj4yXXwwKS1NfDA7dT0oY1tCPj4yXXwwKS1UfDA7Y1txPj4yXT0oY1txPj4yXXwwKS1nO2NbZj4+Ml09ZTtjW24+PjJdPVM7Y1twPj4yXT1MO2Nbcj4+Ml09SjtjW3M+PjJdPUg7Y1t2Pj4yXT1GO2NbeD4+Ml09RDtjW3o+PjJdPXk7Y1tCPj4yXT11O3U9bCs0fDA7eT1sKzh8MDtEPWwrMTJ8MDtGPWwrMTZ8MDtIPWwrMjB8MDtKPWwrMjR8MDtMPWwrMjh8MDtTPWwrMzJ8MDtlPWwrMzZ8MDt0PXQrKGNbdT4+Ml18MCl8MDt3PXcrKGNbeT4+Ml18MCl8MDtBPUErKGNbRD4+Ml18MCl8MDtFPUUrKGNbRj4+Ml18MCl8MDtHPUcrKGNbSD4+Ml18MCl8MDtJPUkrKGNbSj4+Ml18MCl8MDtLPUsrKGNbTD4+Ml18MCl8MDtNPU0rKGNbUz4+Ml18MCl8MDtUPVQrKGNbZT4+Ml18MCl8MDtjW2w+PjJdPWcrKGNbbD4+Ml18MCk7Y1t1Pj4yXT10O2NbeT4+Ml09dztjW0Q+PjJdPUE7Y1tGPj4yXT1FO2NbSD4+Ml09RztjW0o+PjJdPUk7Y1tMPj4yXT1LO2NbUz4+Ml09TTtjW2U+PjJdPVQ7S2MobSxsKTtKYyhtLG0sbCk7S2MoYixtKTtKYyhiLGIsbCk7SmMoYixiLHEpO0tjKFEsYik7S2MoayxRKTtLYyhrLGspO0pjKGssYixrKTtKYyhRLFEsayk7S2MoUSxRKTtKYyhRLGssUSk7S2MoayxRKTtLYyhrLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0pjKFEsayxRKTtLYyhrLFEpO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0pjKGssayxRKTtLYyhqLGspO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7S2MoaixqKTtLYyhqLGopO0tjKGosaik7SmMoayxqLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0tjKGssayk7S2MoayxrKTtLYyhrLGspO0tjKGssayk7SmMoUSxrLFEpO0tjKGssUSk7ZT0xO2Rve0tjKGssayk7ZT1lKzF8MH13aGlsZSgoZXwwKSE9NTApO0pjKGssayxRKTtLYyhqLGspO2U9MTtkb3tLYyhqLGopO2U9ZSsxfDB9d2hpbGUoKGV8MCkhPTEwMCk7SmMoayxqLGspO0tjKGssayk7ZT0xO2Rve0tjKGssayk7ZT1lKzF8MH13aGlsZSgoZXwwKSE9NTApO0pjKFEsayxRKTtLYyhRLFEpO0tjKFEsUSk7SmMoYixRLGIpO0pjKGIsYixtKTtKYyhiLGIscSk7S2MobyxiKTtKYyhvLG8sbCk7RT1jW28+PjJdfDA7Rj1jW28rND4+Ml18MDtHPWNbbys4Pj4yXXwwO0g9Y1tvKzEyPj4yXXwwO0k9Y1tvKzE2Pj4yXXwwO0o9Y1tvKzIwPj4yXXwwO0s9Y1tvKzI0Pj4yXXwwO0w9Y1tvKzI4Pj4yXXwwO009Y1tvKzMyPj4yXXwwO0Q9Y1tvKzM2Pj4yXXwwO0E9Y1txPj4yXXwwO3k9Y1tmPj4yXXwwO3c9Y1tuPj4yXXwwO3U9Y1twPj4yXXwwO3Q9Y1tyPj4yXXwwO3M9Y1tzPj4yXXwwO3I9Y1t2Pj4yXXwwO3E9Y1t4Pj4yXXwwO3A9Y1t6Pj4yXXwwO2U9Y1tCPj4yXXwwO2NbUD4+Ml09RS1BO2Y9UCs0fDA7Y1tmPj4yXT1GLXk7Zz1QKzh8MDtjW2c+PjJdPUctdztoPVArMTJ8MDtjW2g+PjJdPUgtdTtqPVArMTZ8MDtjW2o+PjJdPUktdDtrPVArMjB8MDtjW2s+PjJdPUotcztsPVArMjR8MDtjW2w+PjJdPUstcjttPVArMjh8MDtjW20+PjJdPUwtcTtuPVArMzJ8MDtjW24+PjJdPU0tcDtvPVArMzZ8MDtjW28+PjJdPUQtZTtMYyhRLFApO2RvIGlmKFljKFEsMzMwMDQpfDApe2NbUD4+Ml09QStFO2NbZj4+Ml09eStGO2NbZz4+Ml09dytHO2NbaD4+Ml09dStIO2Nbaj4+Ml09dCtJO2Nbaz4+Ml09cytKO2NbbD4+Ml09citLO2NbbT4+Ml09cStMO2Nbbj4+Ml09cCtNO2Nbbz4+Ml09ZStEO0xjKFEsUCk7aWYoIShZYyhRLDMzMDA0KXwwKSl7SmMoYixiLDExMDQpO2JyZWFrfWVsc2V7VD0tMTtpPVI7cmV0dXJuIFR8MH19d2hpbGUoMCk7TGMoUSxiKTtpZigoKGRbUT4+MF18MCkmMXwwKT09KChkW04+PjBdfDApPj4+N3wwKSl7QT1iKzR8MDtEPWIrOHwwO0Y9YisxMnwwO0g9YisxNnwwO0o9YisyMHwwO0w9YisyNHwwO049YisyOHwwO1E9YiszMnwwO1Q9YiszNnwwO3o9MC0oY1tBPj4yXXwwKXwwO0I9MC0oY1tEPj4yXXwwKXwwO0U9MC0oY1tGPj4yXXwwKXwwO0c9MC0oY1tIPj4yXXwwKXwwO0k9MC0oY1tKPj4yXXwwKXwwO0s9MC0oY1tMPj4yXXwwKXwwO009MC0oY1tOPj4yXXwwKXwwO1A9MC0oY1tRPj4yXXwwKXwwO1M9MC0oY1tUPj4yXXwwKXwwO2NbYj4+Ml09MC0oY1tiPj4yXXwwKTtjW0E+PjJdPXo7Y1tEPj4yXT1CO2NbRj4+Ml09RTtjW0g+PjJdPUc7Y1tKPj4yXT1JO2NbTD4+Ml09SztjW04+PjJdPU07Y1tRPj4yXT1QO2NbVD4+Ml09U31KYyhiKzEyMHwwLGIsTyk7VD0wO2k9UjtyZXR1cm4gVHwwfWZ1bmN0aW9uIE9jKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTA7Vj1iKzQwfDA7aj1iKzQ0fDA7bT1iKzQ4fDA7cD1iKzUyfDA7cz1iKzU2fDA7dj1iKzYwfDA7eT1iKzY0fDA7Qj1iKzY4fDA7RT1iKzcyfDA7Qz1iKzc2fDA7Uz1iKzR8MDtQPWIrOHwwO2U9YisxMnwwO2w9YisxNnwwO249YisyMHwwO3U9YisyNHwwO3c9YisyOHwwO0Q9YiszMnwwO089YiszNnwwO2dhPShjW1M+PjJdfDApKyhjW2o+PjJdfDApfDA7ZmE9KGNbUD4+Ml18MCkrKGNbbT4+Ml18MCl8MDtlYT0oY1tlPj4yXXwwKSsoY1twPj4yXXwwKXwwO2RhPShjW2w+PjJdfDApKyhjW3M+PjJdfDApfDA7Y2E9KGNbbj4+Ml18MCkrKGNbdj4+Ml18MCl8MDtiYT0oY1t1Pj4yXXwwKSsoY1t5Pj4yXXwwKXwwO2FhPShjW3c+PjJdfDApKyhjW0I+PjJdfDApfDA7JD0oY1tEPj4yXXwwKSsoY1tFPj4yXXwwKXwwO1k9KGNbTz4+Ml18MCkrKGNbQz4+Ml18MCl8MDtjW2E+PjJdPShjW2I+PjJdfDApKyhjW1Y+PjJdfDApO2hhPWErNHwwO2NbaGE+PjJdPWdhO2dhPWErOHwwO2NbZ2E+PjJdPWZhO2ZhPWErMTJ8MDtjW2ZhPj4yXT1lYTtlYT1hKzE2fDA7Y1tlYT4+Ml09ZGE7ZGE9YSsyMHwwO2NbZGE+PjJdPWNhO2NhPWErMjR8MDtjW2NhPj4yXT1iYTtiYT1hKzI4fDA7Y1tiYT4+Ml09YWE7YWE9YSszMnwwO2NbYWE+PjJdPSQ7JD1hKzM2fDA7Y1skPj4yXT1ZO1k9YSs0MHwwO1M9KGNbaj4+Ml18MCktKGNbUz4+Ml18MCl8MDtQPShjW20+PjJdfDApLShjW1A+PjJdfDApfDA7ZT0oY1twPj4yXXwwKS0oY1tlPj4yXXwwKXwwO2w9KGNbcz4+Ml18MCktKGNbbD4+Ml18MCl8MDtuPShjW3Y+PjJdfDApLShjW24+PjJdfDApfDA7dT0oY1t5Pj4yXXwwKS0oY1t1Pj4yXXwwKXwwO3c9KGNbQj4+Ml18MCktKGNbdz4+Ml18MCl8MDtEPShjW0U+PjJdfDApLShjW0Q+PjJdfDApfDA7Tz0oY1tDPj4yXXwwKS0oY1tPPj4yXXwwKXwwO2NbWT4+Ml09KGNbVj4+Ml18MCktKGNbYj4+Ml18MCk7Vj1hKzQ0fDA7Y1tWPj4yXT1TO1M9YSs0OHwwO2NbUz4+Ml09UDtQPWErNTJ8MDtjW1A+PjJdPWU7ZT1hKzU2fDA7Y1tlPj4yXT1sO2w9YSs2MHwwO2NbbD4+Ml09bjtuPWErNjR8MDtjW24+PjJdPXU7dT1hKzY4fDA7Y1t1Pj4yXT13O3c9YSs3MnwwO2Nbdz4+Ml09RDtEPWErNzZ8MDtjW0Q+PjJdPU87Tz1hKzgwfDA7SmMoTyxhLGQpO0pjKFksWSxkKzQwfDApO0M9YSsxMjB8MDtKYyhDLGQrODB8MCxiKzEyMHwwKTtFPWNbYis4MD4+Ml08PDE7Qj1jW2IrODQ+PjJdPDwxO3k9Y1tiKzg4Pj4yXTw8MTt2PWNbYis5Mj4+Ml08PDE7cz1jW2IrOTY+PjJdPDwxO3A9Y1tiKzEwMD4+Ml08PDE7bT1jW2IrMTA0Pj4yXTw8MTtqPWNbYisxMDg+PjJdPDwxO2c9Y1tiKzExMj4+Ml08PDE7Yj1jW2IrMTE2Pj4yXTw8MTtaPWNbTz4+Ml18MDtOPWErODR8MDtXPWNbTj4+Ml18MDtNPWErODh8MDtUPWNbTT4+Ml18MDtMPWErOTJ8MDtRPWNbTD4+Ml18MDtLPWErOTZ8MDtmPWNbSz4+Ml18MDtKPWErMTAwfDA7aD1jW0o+PjJdfDA7ST1hKzEwNHwwO289Y1tJPj4yXXwwO0g9YSsxMDh8MDtxPWNbSD4+Ml18MDtHPWErMTEyfDA7eD1jW0c+PjJdfDA7Rj1hKzExNnwwO3o9Y1tGPj4yXXwwO189Y1tZPj4yXXwwO1g9Y1tWPj4yXXwwO1U9Y1tTPj4yXXwwO1I9Y1tQPj4yXXwwO2Q9Y1tlPj4yXXwwO2k9Y1tsPj4yXXwwO2s9Y1tuPj4yXXwwO3I9Y1t1Pj4yXXwwO3Q9Y1t3Pj4yXXwwO0E9Y1tEPj4yXXwwO2NbYT4+Ml09Wi1fO2NbaGE+PjJdPVctWDtjW2dhPj4yXT1ULVU7Y1tmYT4+Ml09US1SO2NbZWE+PjJdPWYtZDtjW2RhPj4yXT1oLWk7Y1tjYT4+Ml09by1rO2NbYmE+PjJdPXEtcjtjW2FhPj4yXT14LXQ7Y1skPj4yXT16LUE7Y1tZPj4yXT1fK1o7Y1tWPj4yXT1YK1c7Y1tTPj4yXT1VK1Q7Y1tQPj4yXT1SK1E7Y1tlPj4yXT1kK2Y7Y1tsPj4yXT1pK2g7Y1tuPj4yXT1rK287Y1t1Pj4yXT1yK3E7Y1t3Pj4yXT10K3g7Y1tEPj4yXT1BK3o7RD1jW0M+PjJdfDA7ej1hKzEyNHwwO0E9Y1t6Pj4yXXwwO3c9YSsxMjh8MDt4PWNbdz4+Ml18MDt0PWErMTMyfDA7dT1jW3Q+PjJdfDA7cT1hKzEzNnwwO3I9Y1txPj4yXXwwO249YSsxNDB8MDtvPWNbbj4+Ml18MDtrPWErMTQ0fDA7bD1jW2s+PjJdfDA7aD1hKzE0OHwwO2k9Y1toPj4yXXwwO2U9YSsxNTJ8MDtmPWNbZT4+Ml18MDthPWErMTU2fDA7ZD1jW2E+PjJdfDA7Y1tPPj4yXT1EK0U7Y1tOPj4yXT1BK0I7Y1tNPj4yXT14K3k7Y1tMPj4yXT11K3Y7Y1tLPj4yXT1yK3M7Y1tKPj4yXT1vK3A7Y1tJPj4yXT1sK207Y1tIPj4yXT1pK2o7Y1tHPj4yXT1mK2c7Y1tGPj4yXT1kK2I7Y1tDPj4yXT1FLUQ7Y1t6Pj4yXT1CLUE7Y1t3Pj4yXT15LXg7Y1t0Pj4yXT12LXU7Y1txPj4yXT1zLXI7Y1tuPj4yXT1wLW87Y1trPj4yXT1tLWw7Y1toPj4yXT1qLWk7Y1tlPj4yXT1nLWY7Y1thPj4yXT1iLWQ7cmV0dXJufWZ1bmN0aW9uIFBjKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTAsaWE9MCxqYT0wLGthPTAsbGE9MCxtYT0wLG5hPTAsb2E9MCxwYT0wLHFhPTAscmE9MCxzYT0wLHRhPTAsdWE9MCx2YT0wLHdhPTAseGE9MCx5YT0wLHphPTAsQWE9MCxCYT0wLENhPTAsRGE9MCxFYT0wLEZhPTAsR2E9MCxIYT0wLElhPTAsSmE9MCxLYT0wLExhPTAsTWE9MCxOYT0wLE9hPTAsUGE9MCxRYT0wLFJhPTAsU2E9MCxUYT0wLFVhPTAsVmE9MCxXYT0wLFhhPTAsWWE9MCxaYT0wLF9hPTAsJGE9MCxhYj0wLGJiPTAsY2I9MCxkYj0wLGViPTAsZmI9MCxnYj0wLGhiPTAsaWI9MCxqYj0wLGtiPTAsbGI9MCxtYj0wLG5iPTA7ZD1pO1M9aT1pKzYzJi02NDtpPWkrNDh8MDtLYyhhLGIpO2FhPWErODB8MDt0YT1iKzQwfDA7S2MoYWEsdGEpO3Y9YSsxMjB8MDtpYj1jW2IrODA+PjJdfDA7U2E9Y1tiKzg0Pj4yXXwwO3A9Y1tiKzg4Pj4yXXwwO3g9Y1tiKzkyPj4yXXwwO2Y9Y1tiKzk2Pj4yXXwwO2tiPWNbYisxMDA+PjJdfDA7Xz1jW2IrMTA0Pj4yXXwwO3dhPWNbYisxMDg+PjJdfDA7bD1jW2IrMTEyPj4yXXwwO3VhPWNbYisxMTY+PjJdfDA7dD1pYjw8MTtyYT1TYTw8MTtjYj1wPDwxO2c9eDw8MTtNYT1mPDwxO2U9a2I8PDE7dmE9Xzw8MTtuPXdhPDwxO2JiPWtiKjM4fDA7UWE9XyoxOXwwO1E9d2EqMzh8MDtIPWwqMTl8MDtuYj11YSozOHwwO2piPSgoaWJ8MCk8MCk8PDMxPj4zMTtqYj1PZChpYnwwLGpifDAsaWJ8MCxqYnwwKXwwO2liPUM7cWE9KCh0fDApPDApPDwzMT4+MzE7VGE9KChTYXwwKTwwKTw8MzE+PjMxOyRhPU9kKHR8MCxxYXwwLFNhfDAsVGF8MCl8MDtfYT1DO3I9KChwfDApPDApPDwzMT4+MzE7VmE9T2QocHwwLHJ8MCx0fDAscWF8MCl8MDtVYT1DO1I9KCh4fDApPDApPDwzMT4+MzE7TGE9T2QoeHwwLFJ8MCx0fDAscWF8MCl8MDtLYT1DO2thPSgoZnwwKTwwKTw8MzE+PjMxO3phPU9kKGZ8MCxrYXwwLHR8MCxxYXwwKXwwO3lhPUM7bGI9KChrYnwwKTwwKTw8MzE+PjMxO0s9T2Qoa2J8MCxsYnwwLHR8MCxxYXwwKXwwO009QztqPSgoX3wwKTwwKTw8MzE+PjMxO2s9T2QoX3wwLGp8MCx0fDAscWF8MCl8MDtGPUM7eGE9KCh3YXwwKTwwKTw8MzE+PjMxO3U9T2Qod2F8MCx4YXwwLHR8MCxxYXwwKXwwO1A9QzttYT0oKGx8MCk8MCk8PDMxPj4zMTtXPU9kKGx8MCxtYXwwLHR8MCxxYXwwKXwwO2ZhPUM7b2E9KCh1YXwwKTwwKTw8MzE+PjMxO3FhPU9kKHVhfDAsb2F8MCx0fDAscWF8MCl8MDt0PUM7cGE9KChyYXwwKTwwKTw8MzE+PjMxO1RhPU9kKHJhfDAscGF8MCxTYXwwLFRhfDApfDA7U2E9QztKYT1PZChyYXwwLHBhfDAscHwwLHJ8MCl8MDtJYT1DO2phPSgoZ3wwKTwwKTw8MzE+PjMxO0RhPU9kKGd8MCxqYXwwLHJhfDAscGF8MCl8MDtDYT1DO0I9T2QoZnwwLGthfDAscmF8MCxwYXwwKXwwO0U9QztsYT0oKGV8MCk8MCk8PDMxPj4zMTtoPU9kKGV8MCxsYXwwLHJhfDAscGF8MCl8MDtEPUM7cz1PZChffDAsanwwLHJhfDAscGF8MCl8MDtOPUM7JD0oKG58MCk8MCk8PDMxPj4zMTtWPU9kKG58MCwkfDAscmF8MCxwYXwwKXwwO2VhPUM7c2E9T2QobHwwLG1hfDAscmF8MCxwYXwwKXwwO25hPUM7bWI9KChuYnwwKTwwKTw8MzE+PjMxO3BhPU9kKG5ifDAsbWJ8MCxyYXwwLHBhfDApfDA7cmE9QztCYT1PZChwfDAscnwwLHB8MCxyfDApfDA7QWE9QztkYj0oKGNifDApPDApPDwzMT4+MzE7Rz1PZChjYnwwLGRifDAseHwwLFJ8MCl8MDtJPUM7eT1PZChmfDAsa2F8MCxjYnwwLGRifDApfDA7QT1DO289T2Qoa2J8MCxsYnwwLGNifDAsZGJ8MCl8MDtKPUM7dz1PZChffDAsanwwLGNifDAsZGJ8MCl8MDtiYT1DO1o9T2Qod2F8MCx4YXwwLGNifDAsZGJ8MCl8MDtpYT1DO209KChIfDApPDApPDwzMT4+MzE7ZGI9T2QoSHwwLG18MCxjYnwwLGRifDApfDA7Y2I9QztyPU9kKG5ifDAsbWJ8MCxwfDAscnwwKXwwO3A9QztSPU9kKGd8MCxqYXwwLHh8MCxSfDApfDA7eD1DO3E9T2QoZ3wwLGphfDAsZnwwLGthfDApfDA7TD1DO1U9T2QoZXwwLGxhfDAsZ3wwLGphfDApfDA7ZGE9QztYPU9kKF98MCxqfDAsZ3wwLGphfDApfDA7Z2E9QztPPSgoUXwwKTwwKTw8MzE+PjMxO2ZiPU9kKFF8MCxPfDAsZ3wwLGphfDApfDA7ZWI9QztYYT1PZChIfDAsbXwwLGd8MCxqYXwwKXwwO1dhPUM7amE9T2QobmJ8MCxtYnwwLGd8MCxqYXwwKXwwO2c9QztUPU9kKGZ8MCxrYXwwLGZ8MCxrYXwwKXwwO2NhPUM7TmE9KChNYXwwKTwwKTw8MzE+PjMxO1k9T2QoTWF8MCxOYXwwLGtifDAsbGJ8MCl8MDtoYT1DO1JhPSgoUWF8MCk8MCk8PDMxPj4zMTtoYj1PZChRYXwwLFJhfDAsTWF8MCxOYXwwKXwwO2diPUM7WmE9T2QoUXwwLE98MCxmfDAsa2F8MCl8MDtZYT1DO05hPU9kKEh8MCxtfDAsTWF8MCxOYXwwKXwwO01hPUM7a2E9T2QobmJ8MCxtYnwwLGZ8MCxrYXwwKXwwO2Y9QztsYj1PZChiYnwwLCgoYmJ8MCk8MCk8PDMxPj4zMXwwLGtifDAsbGJ8MCl8MDtrYj1DO2JiPU9kKFFhfDAsUmF8MCxlfDAsbGF8MCl8MDthYj1DO1BhPU9kKFF8MCxPfDAsZXwwLGxhfDApfDA7T2E9QztGYT1PZChIfDAsbXwwLGV8MCxsYXwwKXwwO0VhPUM7bGE9T2QobmJ8MCxtYnwwLGV8MCxsYXwwKXwwO2U9QztSYT1PZChRYXwwLFJhfDAsX3wwLGp8MCl8MDtRYT1DO0hhPU9kKFF8MCxPfDAsX3wwLGp8MCl8MDtHYT1DO3ZhPU9kKEh8MCxtfDAsdmF8MCwoKHZhfDApPDApPDwzMT4+MzF8MCl8MDt6PUM7aj1PZChuYnwwLG1ifDAsX3wwLGp8MCl8MDtfPUM7eGE9T2QoUXwwLE98MCx3YXwwLHhhfDApfDA7d2E9QztPPU9kKEh8MCxtfDAsbnwwLCR8MCl8MDtRPUM7JD1PZChuYnwwLG1ifDAsbnwwLCR8MCl8MDtuPUM7bT1PZChIfDAsbXwwLGx8MCxtYXwwKXwwO0g9QzttYT1PZChuYnwwLG1ifDAsbHwwLG1hfDApfDA7bD1DO29hPU9kKG5ifDAsbWJ8MCx1YXwwLG9hfDApfDA7dWE9QztpYj1EZChsYnwwLGtifDAsamJ8MCxpYnwwKXwwO2diPURkKGlifDAsQ3wwLGhifDAsZ2J8MCl8MDtlYj1EZChnYnwwLEN8MCxmYnwwLGVifDApfDA7Y2I9RGQoZWJ8MCxDfDAsZGJ8MCxjYnwwKXwwO3JhPURkKGNifDAsQ3wwLHBhfDAscmF8MCl8MDtwYT1DO19hPURkKGJifDAsYWJ8MCwkYXwwLF9hfDApfDA7WWE9RGQoX2F8MCxDfDAsWmF8MCxZYXwwKXwwO1dhPURkKFlhfDAsQ3wwLFhhfDAsV2F8MCl8MDtwPURkKFdhfDAsQ3wwLHJ8MCxwfDApfDA7cj1DO1NhPURkKFZhfDAsVWF8MCxUYXwwLFNhfDApfDA7UWE9RGQoU2F8MCxDfDAsUmF8MCxRYXwwKXwwO09hPURkKFFhfDAsQ3wwLFBhfDAsT2F8MCl8MDtNYT1EZChPYXwwLEN8MCxOYXwwLE1hfDApfDA7Zz1EZChNYXwwLEN8MCxqYXwwLGd8MCl8MDtqYT1DO0lhPURkKExhfDAsS2F8MCxKYXwwLElhfDApfDA7R2E9RGQoSWF8MCxDfDAsSGF8MCxHYXwwKXwwO0VhPURkKEdhfDAsQ3wwLEZhfDAsRWF8MCl8MDtmPURkKEVhfDAsQ3wwLGthfDAsZnwwKXwwO2thPUM7QWE9RGQoRGF8MCxDYXwwLEJhfDAsQWF8MCl8MDt5YT1EZChBYXwwLEN8MCx6YXwwLHlhfDApfDA7d2E9RGQoeWF8MCxDfDAseGF8MCx3YXwwKXwwO3o9RGQod2F8MCxDfDAsdmF8MCx6fDApfDA7ZT1EZCh6fDAsQ3wwLGxhfDAsZXwwKXwwO2xhPUM7ST1EZChCfDAsRXwwLEd8MCxJfDApfDA7TT1EZChJfDAsQ3wwLEt8MCxNfDApfDA7UT1EZChNfDAsQ3wwLE98MCxRfDApfDA7Xz1EZChRfDAsQ3wwLGp8MCxffDApfDA7aj1DO0E9RGQoUnwwLHh8MCx5fDAsQXwwKXwwO0Q9RGQoQXwwLEN8MCxofDAsRHwwKXwwO0Y9RGQoRHwwLEN8MCxrfDAsRnwwKXwwO0g9RGQoRnwwLEN8MCxtfDAsSHwwKXwwO249RGQoSHwwLEN8MCwkfDAsbnwwKXwwOyQ9QztMPURkKG98MCxKfDAscXwwLEx8MCl8MDtOPURkKEx8MCxDfDAsc3wwLE58MCl8MDtQPURkKE58MCxDfDAsdXwwLFB8MCl8MDtsPURkKFB8MCxDfDAsbWF8MCxsfDApfDA7bWE9QztjYT1EZCh3fDAsYmF8MCxUfDAsY2F8MCl8MDtkYT1EZChjYXwwLEN8MCxVfDAsZGF8MCl8MDtlYT1EZChkYXwwLEN8MCxWfDAsZWF8MCl8MDtmYT1EZChlYXwwLEN8MCxXfDAsZmF8MCl8MDt1YT1EZChmYXwwLEN8MCxvYXwwLHVhfDApfDA7b2E9QztoYT1EZChYfDAsZ2F8MCxZfDAsaGF8MCl8MDtpYT1EZChoYXwwLEN8MCxafDAsaWF8MCl8MDtuYT1EZChpYXwwLEN8MCxzYXwwLG5hfDApfDA7dD1EZChuYXwwLEN8MCxxYXwwLHR8MCl8MDtxYT1DO3BhPUhkKHJhfDAscGF8MCwxKXwwO3JhPUM7cj1IZChwfDAscnwwLDEpfDA7cD1DO2phPUhkKGd8MCxqYXwwLDEpfDA7Zz1DO2thPUhkKGZ8MCxrYXwwLDEpfDA7Zj1DO2xhPUhkKGV8MCxsYXwwLDEpfDA7ZT1DO2o9SGQoX3wwLGp8MCwxKXwwO189QzskPUhkKG58MCwkfDAsMSl8MDtuPUM7bWE9SGQobHwwLG1hfDAsMSl8MDtsPUM7b2E9SGQodWF8MCxvYXwwLDEpfDA7dWE9QztxYT1IZCh0fDAscWF8MCwxKXwwO3Q9QztuYT1EZChwYXwwLHJhfDAsMzM1NTQ0MzIsMCl8MDtuYT1FZChuYXwwLEN8MCwyNil8MDtzYT1DO3A9RGQobmF8MCxzYXwwLHJ8MCxwfDApfDA7cj1DO3NhPUhkKG5hfDAsc2F8MCwyNil8MDtzYT1DZChwYXwwLHJhfDAsc2F8MCxDfDApfDA7cmE9QztwYT1EZChsYXwwLGV8MCwzMzU1NDQzMiwwKXwwO3BhPUVkKHBhfDAsQ3wwLDI2KXwwO25hPUM7Xz1EZChwYXwwLG5hfDAsanwwLF98MCl8MDtqPUM7bmE9SGQocGF8MCxuYXwwLDI2KXwwO25hPUNkKGxhfDAsZXwwLG5hfDAsQ3wwKXwwO2U9QztsYT1EZChwfDAscnwwLDE2Nzc3MjE2LDApfDA7bGE9RWQobGF8MCxDfDAsMjUpfDA7cGE9QztnPURkKGxhfDAscGF8MCxqYXwwLGd8MCl8MDtqYT1DO3BhPUhkKGxhfDAscGF8MCwyNSl8MDtwYT1DZChwfDAscnwwLHBhfDAsQ3wwKXwwO3I9QztwPURkKF98MCxqfDAsMTY3NzcyMTYsMCl8MDtwPUVkKHB8MCxDfDAsMjUpfDA7bGE9QztuPURkKHB8MCxsYXwwLCR8MCxufDApfDA7JD1DO2xhPUhkKHB8MCxsYXwwLDI1KXwwO2xhPUNkKF98MCxqfDAsbGF8MCxDfDApfDA7aj1DO189RGQoZ3wwLGphfDAsMzM1NTQ0MzIsMCl8MDtfPUVkKF98MCxDfDAsMjYpfDA7cD1DO2Y9RGQoX3wwLHB8MCxrYXwwLGZ8MCl8MDtrYT1DO3A9SGQoX3wwLHB8MCwyNil8MDtwPUNkKGd8MCxqYXwwLHB8MCxDfDApfDA7amE9RGQobnwwLCR8MCwzMzU1NDQzMiwwKXwwO2phPUVkKGphfDAsQ3wwLDI2KXwwO2c9QztsPURkKGphfDAsZ3wwLG1hfDAsbHwwKXwwO21hPUM7Zz1IZChqYXwwLGd8MCwyNil8MDtnPUNkKG58MCwkfDAsZ3wwLEN8MCl8MDskPURkKGZ8MCxrYXwwLDE2Nzc3MjE2LDApfDA7JD1FZCgkfDAsQ3wwLDI1KXwwO249QztlPURkKCR8MCxufDAsbmF8MCxlfDApfDA7bmE9QztuPUhkKCR8MCxufDAsMjUpfDA7bj1DZChmfDAsa2F8MCxufDAsQ3wwKXwwO2thPURkKGx8MCxtYXwwLDE2Nzc3MjE2LDApfDA7a2E9RWQoa2F8MCxDfDAsMjUpfDA7Zj1DO3VhPURkKGthfDAsZnwwLG9hfDAsdWF8MCl8MDtvYT1DO2Y9SGQoa2F8MCxmfDAsMjUpfDA7Zj1DZChsfDAsbWF8MCxmfDAsQ3wwKXwwO21hPURkKGV8MCxuYXwwLDMzNTU0NDMyLDApfDA7bWE9RWQobWF8MCxDfDAsMjYpfDA7bD1DO2o9RGQobGF8MCxqfDAsbWF8MCxsfDApfDA7bD1IZChtYXwwLGx8MCwyNil8MDtsPUNkKGV8MCxuYXwwLGx8MCxDfDApfDA7bmE9RGQodWF8MCxvYXwwLDMzNTU0NDMyLDApfDA7bmE9RWQobmF8MCxDfDAsMjYpfDA7ZT1DO3Q9RGQobmF8MCxlfDAscWF8MCx0fDApfDA7cWE9QztlPUhkKG5hfDAsZXwwLDI2KXwwO2U9Q2QodWF8MCxvYXwwLGV8MCxDfDApfDA7b2E9RGQodHwwLHFhfDAsMTY3NzcyMTYsMCl8MDtvYT1FZChvYXwwLEN8MCwyNSl8MDt1YT1DO25hPU9kKG9hfDAsdWF8MCwxOSwwKXwwO3JhPURkKG5hfDAsQ3wwLHNhfDAscmF8MCl8MDtzYT1DO3VhPUhkKG9hfDAsdWF8MCwyNSl8MDt1YT1DZCh0fDAscWF8MCx1YXwwLEN8MCl8MDtxYT1EZChyYXwwLHNhfDAsMzM1NTQ0MzIsMCl8MDtxYT1FZChxYXwwLEN8MCwyNil8MDt0PUM7cj1EZChwYXwwLHJ8MCxxYXwwLHR8MCl8MDt0PUhkKHFhfDAsdHwwLDI2KXwwO3Q9Q2QocmF8MCxzYXwwLHR8MCxDfDApfDA7Y1t2Pj4yXT10O3Q9YSsxMjR8MDtjW3Q+PjJdPXI7cj1hKzEyOHwwO2Nbcj4+Ml09cDtwPWErMTMyfDA7Y1twPj4yXT1uO249YSsxMzZ8MDtjW24+PjJdPWw7bD1hKzE0MHwwO2NbbD4+Ml09ajtqPWErMTQ0fDA7Y1tqPj4yXT1nO2c9YSsxNDh8MDtjW2c+PjJdPWY7Zj1hKzE1MnwwO2NbZj4+Ml09ZTtlPWErMTU2fDA7Y1tlPj4yXT11YTt1YT1hKzQwfDA7c2E9KGNbYis0ND4+Ml18MCkrKGNbYis0Pj4yXXwwKXwwO3JhPShjW2IrNDg+PjJdfDApKyhjW2IrOD4+Ml18MCl8MDtxYT0oY1tiKzUyPj4yXXwwKSsoY1tiKzEyPj4yXXwwKXwwO3BhPShjW2IrNTY+PjJdfDApKyhjW2IrMTY+PjJdfDApfDA7b2E9KGNbYis2MD4+Ml18MCkrKGNbYisyMD4+Ml18MCl8MDtuYT0oY1tiKzY0Pj4yXXwwKSsoY1tiKzI0Pj4yXXwwKXwwO21hPShjW2IrNjg+PjJdfDApKyhjW2IrMjg+PjJdfDApfDA7bGE9KGNbYis3Mj4+Ml18MCkrKGNbYiszMj4+Ml18MCl8MDtrYT0oY1tiKzc2Pj4yXXwwKSsoY1tiKzM2Pj4yXXwwKXwwO2NbdWE+PjJdPShjW3RhPj4yXXwwKSsoY1tiPj4yXXwwKTt0YT1hKzQ0fDA7Y1t0YT4+Ml09c2E7c2E9YSs0OHwwO2Nbc2E+PjJdPXJhO3JhPWErNTJ8MDtjW3JhPj4yXT1xYTtxYT1hKzU2fDA7Y1txYT4+Ml09cGE7cGE9YSs2MHwwO2NbcGE+PjJdPW9hO29hPWErNjR8MDtjW29hPj4yXT1uYTtuYT1hKzY4fDA7Y1tuYT4+Ml09bWE7bWE9YSs3MnwwO2NbbWE+PjJdPWxhO2xhPWErNzZ8MDtjW2xhPj4yXT1rYTtLYyhTLHVhKTtrYT1jW2FhPj4yXXwwOyQ9YSs4NHwwO2phPWNbJD4+Ml18MDtfPWErODh8MDtpYT1jW18+PjJdfDA7Wj1hKzkyfDA7aGE9Y1taPj4yXXwwO1k9YSs5NnwwO2dhPWNbWT4+Ml18MDtYPWErMTAwfDA7ZmE9Y1tYPj4yXXwwO1c9YSsxMDR8MDtlYT1jW1c+PjJdfDA7Vj1hKzEwOHwwO2RhPWNbVj4+Ml18MDtVPWErMTEyfDA7Y2E9Y1tVPj4yXXwwO1Q9YSsxMTZ8MDtiYT1jW1Q+PjJdfDA7dz1jW2E+PjJdfDA7UD1hKzR8MDt1PWNbUD4+Ml18MDtOPWErOHwwO3M9Y1tOPj4yXXwwO0w9YSsxMnwwO3E9Y1tMPj4yXXwwO0o9YSsxNnwwO289Y1tKPj4yXXwwO0g9YSsyMHwwO209Y1tIPj4yXXwwO0Y9YSsyNHwwO2s9Y1tGPj4yXXwwO0Q9YSsyOHwwO2g9Y1tEPj4yXXwwO0E9YSszMnwwO2I9Y1tBPj4yXXwwO3k9YSszNnwwO3g9Y1t5Pj4yXXwwO1I9dytrYXwwO1E9dStqYXwwO089cytpYXwwO009cStoYXwwO0s9bytnYXwwO0k9bStmYXwwO0c9aytlYXwwO0U9aCtkYXwwO0I9YitjYXwwO3o9eCtiYXwwO2NbdWE+PjJdPVI7Y1t0YT4+Ml09UTtjW3NhPj4yXT1PO2NbcmE+PjJdPU07Y1txYT4+Ml09SztjW3BhPj4yXT1JO2Nbb2E+PjJdPUc7Y1tuYT4+Ml09RTtjW21hPj4yXT1CO2NbbGE+PjJdPXo7dz1rYS13fDA7dT1qYS11fDA7cz1pYS1zfDA7cT1oYS1xfDA7bz1nYS1vfDA7bT1mYS1tfDA7az1lYS1rfDA7aD1kYS1ofDA7Yj1jYS1ifDA7eD1iYS14fDA7Y1thYT4+Ml09dztjWyQ+PjJdPXU7Y1tfPj4yXT1zO2NbWj4+Ml09cTtjW1k+PjJdPW87Y1tYPj4yXT1tO2NbVz4+Ml09aztjW1Y+PjJdPWg7Y1tVPj4yXT1iO2NbVD4+Ml09eDtRPShjW1MrND4+Ml18MCktUXwwO089KGNbUys4Pj4yXXwwKS1PfDA7TT0oY1tTKzEyPj4yXXwwKS1NfDA7Sz0oY1tTKzE2Pj4yXXwwKS1LfDA7ST0oY1tTKzIwPj4yXXwwKS1JfDA7Rz0oY1tTKzI0Pj4yXXwwKS1HfDA7RT0oY1tTKzI4Pj4yXXwwKS1FfDA7Qj0oY1tTKzMyPj4yXXwwKS1CfDA7ej0oY1tTKzM2Pj4yXXwwKS16fDA7Y1thPj4yXT0oY1tTPj4yXXwwKS1SO2NbUD4+Ml09UTtjW04+PjJdPU87Y1tMPj4yXT1NO2NbSj4+Ml09SztjW0g+PjJdPUk7Y1tGPj4yXT1HO2NbRD4+Ml09RTtjW0E+PjJdPUI7Y1t5Pj4yXT16O3U9KGNbdD4+Ml18MCktdXwwO3M9KGNbcj4+Ml18MCktc3wwO3E9KGNbcD4+Ml18MCktcXwwO289KGNbbj4+Ml18MCktb3wwO209KGNbbD4+Ml18MCktbXwwO2s9KGNbaj4+Ml18MCkta3wwO2g9KGNbZz4+Ml18MCktaHwwO2I9KGNbZj4+Ml18MCktYnwwO2E9KGNbZT4+Ml18MCkteHwwO2Nbdj4+Ml09KGNbdj4+Ml18MCktdztjW3Q+PjJdPXU7Y1tyPj4yXT1zO2NbcD4+Ml09cTtjW24+PjJdPW87Y1tsPj4yXT1tO2Nbaj4+Ml09aztjW2c+PjJdPWg7Y1tmPj4yXT1iO2NbZT4+Ml09YTtpPWQ7cmV0dXJufWZ1bmN0aW9uIFFjKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MDttPWIrNDB8MDt2PWIrNDR8MDt1PWIrNDh8MDt0PWIrNTJ8MDtzPWIrNTZ8MDtyPWIrNjB8MDtxPWIrNjR8MDtwPWIrNjh8MDtvPWIrNzJ8MDtuPWIrNzZ8MDtkPWIrNHwwO2U9Yis4fDA7Zj1iKzEyfDA7Zz1iKzE2fDA7aD1iKzIwfDA7aT1iKzI0fDA7aj1iKzI4fDA7az1iKzMyfDA7bD1iKzM2fDA7RT0oY1tkPj4yXXwwKSsoY1t2Pj4yXXwwKXwwO0Q9KGNbZT4+Ml18MCkrKGNbdT4+Ml18MCl8MDtDPShjW2Y+PjJdfDApKyhjW3Q+PjJdfDApfDA7Qj0oY1tnPj4yXXwwKSsoY1tzPj4yXXwwKXwwO0E9KGNbaD4+Ml18MCkrKGNbcj4+Ml18MCl8MDt6PShjW2k+PjJdfDApKyhjW3E+PjJdfDApfDA7eT0oY1tqPj4yXXwwKSsoY1twPj4yXXwwKXwwO3g9KGNbaz4+Ml18MCkrKGNbbz4+Ml18MCl8MDt3PShjW2w+PjJdfDApKyhjW24+PjJdfDApfDA7Y1thPj4yXT0oY1tiPj4yXXwwKSsoY1ttPj4yXXwwKTtjW2ErND4+Ml09RTtjW2ErOD4+Ml09RDtjW2ErMTI+PjJdPUM7Y1thKzE2Pj4yXT1CO2NbYSsyMD4+Ml09QTtjW2ErMjQ+PjJdPXo7Y1thKzI4Pj4yXT15O2NbYSszMj4+Ml09eDtjW2ErMzY+PjJdPXc7ZD0oY1t2Pj4yXXwwKS0oY1tkPj4yXXwwKXwwO2U9KGNbdT4+Ml18MCktKGNbZT4+Ml18MCl8MDtmPShjW3Q+PjJdfDApLShjW2Y+PjJdfDApfDA7Zz0oY1tzPj4yXXwwKS0oY1tnPj4yXXwwKXwwO2g9KGNbcj4+Ml18MCktKGNbaD4+Ml18MCl8MDtpPShjW3E+PjJdfDApLShjW2k+PjJdfDApfDA7aj0oY1twPj4yXXwwKS0oY1tqPj4yXXwwKXwwO2s9KGNbbz4+Ml18MCktKGNbaz4+Ml18MCl8MDtsPShjW24+PjJdfDApLShjW2w+PjJdfDApfDA7Y1thKzQwPj4yXT0oY1ttPj4yXXwwKS0oY1tiPj4yXXwwKTtjW2ErNDQ+PjJdPWQ7Y1thKzQ4Pj4yXT1lO2NbYSs1Mj4+Ml09ZjtjW2ErNTY+PjJdPWc7Y1thKzYwPj4yXT1oO2NbYSs2ND4+Ml09aTtjW2ErNjg+PjJdPWo7Y1thKzcyPj4yXT1rO2NbYSs3Nj4+Ml09bDtsPWNbYis4ND4+Ml18MDtrPWNbYis4OD4+Ml18MDtqPWNbYis5Mj4+Ml18MDtpPWNbYis5Nj4+Ml18MDtoPWNbYisxMDA+PjJdfDA7Zz1jW2IrMTA0Pj4yXXwwO2Y9Y1tiKzEwOD4+Ml18MDtlPWNbYisxMTI+PjJdfDA7ZD1jW2IrMTE2Pj4yXXwwO2NbYSs4MD4+Ml09Y1tiKzgwPj4yXTtjW2ErODQ+PjJdPWw7Y1thKzg4Pj4yXT1rO2NbYSs5Mj4+Ml09ajtjW2ErOTY+PjJdPWk7Y1thKzEwMD4+Ml09aDtjW2ErMTA0Pj4yXT1nO2NbYSsxMDg+PjJdPWY7Y1thKzExMj4+Ml09ZTtjW2ErMTE2Pj4yXT1kO0pjKGErMTIwfDAsYisxMjB8MCwxMTQ0KTtyZXR1cm59ZnVuY3Rpb24gUmMoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wO3U9aTt0PWk9aSs2MyYtNjQ7aT1pKzU5MnwwO3A9dCs0MDB8MDtyPXQrNTIwfDA7cz10KzI0MHwwO3E9dCsxMjB8MDtmPTA7ZG97bj1hW2UrZj4+MF18MDtvPWY8PDE7YVtyK28+PjBdPW4mMTU7YVtyKyhvfDEpPj4wXT0obiYyNTUpPj4+NDtmPWYrMXwwfXdoaWxlKChmfDApIT0zMik7ZT0wO2Y9MDtkb3tvPXIrZnwwO249KGRbbz4+MF18MCkrZXwwO2U9KG48PDI0KSsxMzQyMTc3Mjg+PjI4O2Fbbz4+MF09bi0oZTw8NCk7Zj1mKzF8MH13aGlsZSgoZnwwKSE9NjMpO2Y9cis2M3wwO2FbZj4+MF09KGRbZj4+MF18MCkrZTtlPWI7Zj1lKzQwfDA7ZG97Y1tlPj4yXT0wO2U9ZSs0fDB9d2hpbGUoKGV8MCk8KGZ8MCkpO2o9Yis0MHwwO2Nbaj4+Ml09MTtnPWIrNDR8MDtlPWc7Zj1lKzM2fDA7ZG97Y1tlPj4yXT0wO2U9ZSs0fDB9d2hpbGUoKGV8MCk8KGZ8MCkpO2s9Yis4MHwwO2Nbaz4+Ml09MTtoPWIrODR8MDtsPWIrMTIwfDA7bT1zKzEyMHwwO249cys0MHwwO289cys4MHwwO2U9aDtmPWUrNzZ8MDtkb3tjW2U+PjJdPTA7ZT1lKzR8MH13aGlsZSgoZXwwKTwoZnwwKSk7ZT0xO2Rve1NjKHQsKGV8MCkvMnwwLGFbcitlPj4wXXwwKTtPYyhzLGIsdCk7SmMoYixzLG0pO0pjKGosbixvKTtKYyhrLG8sbSk7SmMobCxzLG4pO2U9ZSsyfDB9d2hpbGUoKGV8MCk8NjQpO0I9Y1tiKzQ+PjJdfDA7ej1jW2IrOD4+Ml18MDt5PWNbYisxMj4+Ml18MDt4PWNbYisxNj4+Ml18MDt3PWNbYisyMD4+Ml18MDt2PWNbYisyND4+Ml18MDtmPWNbYisyOD4+Ml18MDtlPWNbYiszMj4+Ml18MDtBPWNbYiszNj4+Ml18MDtjW3A+PjJdPWNbYj4+Ml07Y1twKzQ+PjJdPUI7Y1twKzg+PjJdPXo7Y1twKzEyPj4yXT15O2NbcCsxNj4+Ml09eDtjW3ArMjA+PjJdPXc7Y1twKzI0Pj4yXT12O2NbcCsyOD4+Ml09ZjtjW3ArMzI+PjJdPWU7Y1twKzM2Pj4yXT1BO0E9Y1tnPj4yXXwwO2U9Y1tiKzQ4Pj4yXXwwO2c9Y1tiKzUyPj4yXXwwO2Y9Y1tiKzU2Pj4yXXwwO3Y9Y1tiKzYwPj4yXXwwO3c9Y1tiKzY0Pj4yXXwwO3g9Y1tiKzY4Pj4yXXwwO3k9Y1tiKzcyPj4yXXwwO3o9Y1tiKzc2Pj4yXXwwO2NbcCs0MD4+Ml09Y1tqPj4yXTtjW3ArNDQ+PjJdPUE7Y1twKzQ4Pj4yXT1lO2NbcCs1Mj4+Ml09ZztjW3ArNTY+PjJdPWY7Y1twKzYwPj4yXT12O2NbcCs2ND4+Ml09dztjW3ArNjg+PjJdPXg7Y1twKzcyPj4yXT15O2NbcCs3Nj4+Ml09ejt6PWNbaD4+Ml18MDt5PWNbYis4OD4+Ml18MDt4PWNbYis5Mj4+Ml18MDt3PWNbYis5Nj4+Ml18MDt2PWNbYisxMDA+PjJdfDA7Zj1jW2IrMTA0Pj4yXXwwO2c9Y1tiKzEwOD4+Ml18MDtoPWNbYisxMTI+PjJdfDA7ZT1jW2IrMTE2Pj4yXXwwO2NbcCs4MD4+Ml09Y1trPj4yXTtjW3ArODQ+PjJdPXo7Y1twKzg4Pj4yXT15O2NbcCs5Mj4+Ml09eDtjW3ArOTY+PjJdPXc7Y1twKzEwMD4+Ml09djtjW3ArMTA0Pj4yXT1mO2NbcCsxMDg+PjJdPWc7Y1twKzExMj4+Ml09aDtjW3ArMTE2Pj4yXT1lO1BjKHMscCk7SmMocSxzLG0pO3A9cSs0MHwwO0pjKHAsbixvKTtlPXErODB8MDtKYyhlLG8sbSk7UGMocyxxKTtKYyhxLHMsbSk7SmMocCxuLG8pO0pjKGUsbyxtKTtQYyhzLHEpO0pjKHEscyxtKTtKYyhwLG4sbyk7SmMoZSxvLG0pO1BjKHMscSk7SmMoYixzLG0pO0pjKGosbixvKTtKYyhrLG8sbSk7SmMobCxzLG4pO2U9MDtkb3tTYyh0LChlfDApLzJ8MCxhW3IrZT4+MF18MCk7T2MocyxiLHQpO0pjKGIscyxtKTtKYyhqLG4sbyk7SmMoayxvLG0pO0pjKGwscyxuKTtlPWUrMnwwfXdoaWxlKChlfDApPDY0KTtpPXU7cmV0dXJufWZ1bmN0aW9uIFNjKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTAsaWE9MDtzPWQ8PDI0Pj4yNDtzPUdkKHN8MCwoKHN8MCk8MCk8PDMxPj4zMXwwLDYzKXwwO2g9ZDw8MjQ+PjI0O3M9MC1zfDA7ZD1hKzR8MDtjW2Q+PjJdPTA7Y1tkKzQ+PjJdPTA7Y1tkKzg+PjJdPTA7Y1tkKzEyPj4yXT0wO2NbZCsxNj4+Ml09MDtjW2QrMjA+PjJdPTA7Y1tkKzI0Pj4yXT0wO2NbZCsyOD4+Ml09MDtlPWErNDB8MDtjW2U+PjJdPTE7Zj1hKzQ0fDA7Zz1hKzgwfDA7aD1oLSgoaCZzKTw8MSkmMjU1O2k9KGheMSkrLTF8MDtqPTExODQrKGIqOTYwfDApfDA7az1hKzh8MDtsPWErMTJ8MDttPWErMTZ8MDtuPWErMjB8MDtvPWErMjR8MDtwPWErMjh8MDtxPWErMzJ8MDtyPWErMzZ8MDt0PWY7dT10Kzc2fDA7ZG97Y1t0Pj4yXT0wO3Q9dCs0fDB9d2hpbGUoKHR8MCk8KHV8MCkpO0g9aT4+MzE7QT1jWzExODQrKGIqOTYwfDApKzQ+PjJdJkg7ST1jWzExODQrKGIqOTYwfDApKzg+PjJdJkg7Sz1jWzExODQrKGIqOTYwfDApKzEyPj4yXSZIO009Y1sxMTg0KyhiKjk2MHwwKSsxNj4+Ml0mSDtPPWNbMTE4NCsoYio5NjB8MCkrMjA+PjJdJkg7UT1jWzExODQrKGIqOTYwfDApKzI0Pj4yXSZIO1M9Y1sxMTg0KyhiKjk2MHwwKSsyOD4+Ml0mSDtVPWNbMTE4NCsoYio5NjB8MCkrMzI+PjJdJkg7Vz1jWzExODQrKGIqOTYwfDApKzM2Pj4yXSZIO2NbYT4+Ml09KGNbaj4+Ml1eMSkmSF4xO2NbZD4+Ml09QTtjW2s+PjJdPUk7Y1tsPj4yXT1LO2NbbT4+Ml09TTtjW24+PjJdPU87Y1tvPj4yXT1RO2NbcD4+Ml09UztjW3E+PjJdPVU7Y1tyPj4yXT1XO1c9YSs0OHwwO1U9YSs1MnwwO1M9YSs1NnwwO1E9YSs2MHwwO089YSs2NHwwO009YSs2OHwwO0s9YSs3MnwwO0k9YSs3NnwwO0E9Y1sxMTg0KyhiKjk2MHwwKSs0ND4+Ml0mSDt6PWNbMTE4NCsoYio5NjB8MCkrNDg+PjJdJkg7dz1jWzExODQrKGIqOTYwfDApKzUyPj4yXSZIO0I9Y1sxMTg0KyhiKjk2MHwwKSs1Nj4+Ml0mSDtpYT1jWzExODQrKGIqOTYwfDApKzYwPj4yXSZIO0Q9Y1sxMTg0KyhiKjk2MHwwKSs2ND4+Ml0mSDtlYT1jWzExODQrKGIqOTYwfDApKzY4Pj4yXSZIO0Y9Y1sxMTg0KyhiKjk2MHwwKSs3Mj4+Ml0mSDtnYT1jWzExODQrKGIqOTYwfDApKzc2Pj4yXSZIO2NbZT4+Ml09KGNbMTE4NCsoYio5NjB8MCkrNDA+PjJdXjEpJkheMTtjW2Y+PjJdPUE7Y1tXPj4yXT16O2NbVT4+Ml09dztjW1M+PjJdPUI7Y1tRPj4yXT1pYTtjW08+PjJdPUQ7Y1tNPj4yXT1lYTtjW0s+PjJdPUY7Y1tJPj4yXT1nYTtnYT1jW2c+PjJdfDA7Rj1hKzg0fDA7ZWE9Y1tGPj4yXXwwO0Q9YSs4OHwwO2lhPWNbRD4+Ml18MDtCPWErOTJ8MDt3PWNbQj4+Ml18MDt6PWErOTZ8MDtBPWNbej4+Ml18MDt4PWErMTAwfDA7ZmE9Y1t4Pj4yXXwwO3Y9YSsxMDR8MDtiYT1jW3Y+PjJdfDA7aT1hKzEwOHwwO0c9Y1tpPj4yXXwwO3Q9YSsxMTJ8MDtfPWNbdD4+Ml18MDt1PWErMTE2fDA7ZGE9Y1t1Pj4yXXwwOyQ9KGNbMTE4NCsoYio5NjB8MCkrODQ+PjJdXmVhKSZIO2FhPShjWzExODQrKGIqOTYwfDApKzg4Pj4yXV5pYSkmSDt5PShjWzExODQrKGIqOTYwfDApKzkyPj4yXV53KSZIO2o9KGNbMTE4NCsoYio5NjB8MCkrOTY+PjJdXkEpJkg7aGE9KGNbMTE4NCsoYio5NjB8MCkrMTAwPj4yXV5mYSkmSDtaPShjWzExODQrKGIqOTYwfDApKzEwND4+Ml1eYmEpJkg7Y2E9KGNbMTE4NCsoYio5NjB8MCkrMTA4Pj4yXV5HKSZIO0M9KGNbMTE4NCsoYio5NjB8MCkrMTEyPj4yXV5fKSZIO0U9KGNbMTE4NCsoYio5NjB8MCkrMTE2Pj4yXV5kYSkmSDtjW2c+PjJdPShjWzExODQrKGIqOTYwfDApKzgwPj4yXV5nYSkmSF5nYTtjW0Y+PjJdPSReZWE7Y1tEPj4yXT1hYV5pYTtjW0I+PjJdPXledztjW3o+PjJdPWpeQTtjW3g+PjJdPWhhXmZhO2Nbdj4+Ml09Wl5iYTtjW2k+PjJdPWNhXkc7Y1t0Pj4yXT1DXl87Y1t1Pj4yXT1FXmRhO2RhPWNbYT4+Ml18MDtFPWNbZD4+Ml18MDtfPWNbaz4+Ml18MDtDPWNbbD4+Ml18MDtHPWNbbT4+Ml18MDtjYT1jW24+PjJdfDA7YmE9Y1tvPj4yXXwwO1o9Y1twPj4yXXwwO2ZhPWNbcT4+Ml18MDtoYT1jW3I+PjJdfDA7QT0oaF4yKSstMT4+MzE7aj0oY1sxMTg0KyhiKjk2MHwwKSsxMjQ+PjJdXkUpJkE7dz0oY1sxMTg0KyhiKjk2MHwwKSsxMjg+PjJdXl8pJkE7eT0oY1sxMTg0KyhiKjk2MHwwKSsxMzI+PjJdXkMpJkE7aWE9KGNbMTE4NCsoYio5NjB8MCkrMTM2Pj4yXV5HKSZBO2FhPShjWzExODQrKGIqOTYwfDApKzE0MD4+Ml1eY2EpJkE7ZWE9KGNbMTE4NCsoYio5NjB8MCkrMTQ0Pj4yXV5iYSkmQTskPShjWzExODQrKGIqOTYwfDApKzE0OD4+Ml1eWikmQTtnYT0oY1sxMTg0KyhiKjk2MHwwKSsxNTI+PjJdXmZhKSZBO0g9KGNbMTE4NCsoYio5NjB8MCkrMTU2Pj4yXV5oYSkmQTtjW2E+PjJdPShjWzExODQrKGIqOTYwfDApKzEyMD4+Ml1eZGEpJkFeZGE7Y1tkPj4yXT1qXkU7Y1trPj4yXT13Xl87Y1tsPj4yXT15XkM7Y1ttPj4yXT1pYV5HO2Nbbj4+Ml09YWFeY2E7Y1tvPj4yXT1lYV5iYTtjW3A+PjJdPSReWjtjW3E+PjJdPWdhXmZhO2Nbcj4+Ml09SF5oYTtoYT1jW2U+PjJdfDA7SD1jW2Y+PjJdfDA7ZmE9Y1tXPj4yXXwwO2dhPWNbVT4+Ml18MDtaPWNbUz4+Ml18MDskPWNbUT4+Ml18MDtiYT1jW08+PjJdfDA7ZWE9Y1tNPj4yXXwwO2NhPWNbSz4+Ml18MDthYT1jW0k+PjJdfDA7Rz0oY1sxMTg0KyhiKjk2MHwwKSsxNjQ+PjJdXkgpJkE7aWE9KGNbMTE4NCsoYio5NjB8MCkrMTY4Pj4yXV5mYSkmQTtDPShjWzExODQrKGIqOTYwfDApKzE3Mj4+Ml1eZ2EpJkE7eT0oY1sxMTg0KyhiKjk2MHwwKSsxNzY+PjJdXlopJkE7Xz0oY1sxMTg0KyhiKjk2MHwwKSsxODA+PjJdXiQpJkE7dz0oY1sxMTg0KyhiKjk2MHwwKSsxODQ+PjJdXmJhKSZBO0U9KGNbMTE4NCsoYio5NjB8MCkrMTg4Pj4yXV5lYSkmQTtqPShjWzExODQrKGIqOTYwfDApKzE5Mj4+Ml1eY2EpJkE7ZGE9KGNbMTE4NCsoYio5NjB8MCkrMTk2Pj4yXV5hYSkmQTtjW2U+PjJdPShjWzExODQrKGIqOTYwfDApKzE2MD4+Ml1eaGEpJkFeaGE7Y1tmPj4yXT1HXkg7Y1tXPj4yXT1pYV5mYTtjW1U+PjJdPUNeZ2E7Y1tTPj4yXT15Xlo7Y1tRPj4yXT1fXiQ7Y1tPPj4yXT13XmJhO2NbTT4+Ml09RV5lYTtjW0s+PjJdPWpeY2E7Y1tJPj4yXT1kYV5hYTthYT1jW2c+PjJdfDA7ZGE9Y1tGPj4yXXwwO2NhPWNbRD4+Ml18MDtqPWNbQj4+Ml18MDtlYT1jW3o+PjJdfDA7RT1jW3g+PjJdfDA7YmE9Y1t2Pj4yXXwwO3c9Y1tpPj4yXXwwOyQ9Y1t0Pj4yXXwwO189Y1t1Pj4yXXwwO1o9KGNbMTE4NCsoYio5NjB8MCkrMjA0Pj4yXV5kYSkmQTt5PShjWzExODQrKGIqOTYwfDApKzIwOD4+Ml1eY2EpJkE7Z2E9KGNbMTE4NCsoYio5NjB8MCkrMjEyPj4yXV5qKSZBO0M9KGNbMTE4NCsoYio5NjB8MCkrMjE2Pj4yXV5lYSkmQTtmYT0oY1sxMTg0KyhiKjk2MHwwKSsyMjA+PjJdXkUpJkE7aWE9KGNbMTE4NCsoYio5NjB8MCkrMjI0Pj4yXV5iYSkmQTtIPShjWzExODQrKGIqOTYwfDApKzIyOD4+Ml1edykmQTtHPShjWzExODQrKGIqOTYwfDApKzIzMj4+Ml1eJCkmQTtoYT0oY1sxMTg0KyhiKjk2MHwwKSsyMzY+PjJdXl8pJkE7Y1tnPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSsyMDA+PjJdXmFhKSZBXmFhO2NbRj4+Ml09Wl5kYTtjW0Q+PjJdPXleY2E7Y1tCPj4yXT1nYV5qO2Nbej4+Ml09Q15lYTtjW3g+PjJdPWZhXkU7Y1t2Pj4yXT1pYV5iYTtjW2k+PjJdPUhedztjW3Q+PjJdPUdeJDtjW3U+PjJdPWhhXl87Xz1jW2E+PjJdfDA7aGE9Y1tkPj4yXXwwOyQ9Y1trPj4yXXwwO0c9Y1tsPj4yXXwwO3c9Y1ttPj4yXXwwO0g9Y1tuPj4yXXwwO2JhPWNbbz4+Ml18MDtpYT1jW3A+PjJdfDA7RT1jW3E+PjJdfDA7ZmE9Y1tyPj4yXXwwO2VhPShoXjMpKy0xPj4zMTtDPShjWzExODQrKGIqOTYwfDApKzI0ND4+Ml1eaGEpJmVhO2o9KGNbMTE4NCsoYio5NjB8MCkrMjQ4Pj4yXV4kKSZlYTtnYT0oY1sxMTg0KyhiKjk2MHwwKSsyNTI+PjJdXkcpJmVhO2NhPShjWzExODQrKGIqOTYwfDApKzI1Nj4+Ml1edykmZWE7eT0oY1sxMTg0KyhiKjk2MHwwKSsyNjA+PjJdXkgpJmVhO2RhPShjWzExODQrKGIqOTYwfDApKzI2ND4+Ml1eYmEpJmVhO1o9KGNbMTE4NCsoYio5NjB8MCkrMjY4Pj4yXV5pYSkmZWE7YWE9KGNbMTE4NCsoYio5NjB8MCkrMjcyPj4yXV5FKSZlYTtBPShjWzExODQrKGIqOTYwfDApKzI3Nj4+Ml1eZmEpJmVhO2NbYT4+Ml09KGNbMTE4NCsoYio5NjB8MCkrMjQwPj4yXV5fKSZlYV5fO2NbZD4+Ml09Q15oYTtjW2s+PjJdPWpeJDtjW2w+PjJdPWdhXkc7Y1ttPj4yXT1jYV53O2Nbbj4+Ml09eV5IO2Nbbz4+Ml09ZGFeYmE7Y1twPj4yXT1aXmlhO2NbcT4+Ml09YWFeRTtjW3I+PjJdPUFeZmE7ZmE9Y1tlPj4yXXwwO0E9Y1tmPj4yXXwwO0U9Y1tXPj4yXXwwO2FhPWNbVT4+Ml18MDtpYT1jW1M+PjJdfDA7Wj1jW1E+PjJdfDA7YmE9Y1tPPj4yXXwwO2RhPWNbTT4+Ml18MDtIPWNbSz4+Ml18MDt5PWNbST4+Ml18MDt3PShjWzExODQrKGIqOTYwfDApKzI4ND4+Ml1eQSkmZWE7Y2E9KGNbMTE4NCsoYio5NjB8MCkrMjg4Pj4yXV5FKSZlYTtHPShjWzExODQrKGIqOTYwfDApKzI5Mj4+Ml1eYWEpJmVhO2dhPShjWzExODQrKGIqOTYwfDApKzI5Nj4+Ml1eaWEpJmVhOyQ9KGNbMTE4NCsoYio5NjB8MCkrMzAwPj4yXV5aKSZlYTtqPShjWzExODQrKGIqOTYwfDApKzMwND4+Ml1eYmEpJmVhO2hhPShjWzExODQrKGIqOTYwfDApKzMwOD4+Ml1eZGEpJmVhO0M9KGNbMTE4NCsoYio5NjB8MCkrMzEyPj4yXV5IKSZlYTtfPShjWzExODQrKGIqOTYwfDApKzMxNj4+Ml1eeSkmZWE7Y1tlPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSsyODA+PjJdXmZhKSZlYV5mYTtjW2Y+PjJdPXdeQTtjW1c+PjJdPWNhXkU7Y1tVPj4yXT1HXmFhO2NbUz4+Ml09Z2FeaWE7Y1tRPj4yXT0kXlo7Y1tPPj4yXT1qXmJhO2NbTT4+Ml09aGFeZGE7Y1tLPj4yXT1DXkg7Y1tJPj4yXT1fXnk7eT1jW2c+PjJdfDA7Xz1jW0Y+PjJdfDA7SD1jW0Q+PjJdfDA7Qz1jW0I+PjJdfDA7ZGE9Y1t6Pj4yXXwwO2hhPWNbeD4+Ml18MDtiYT1jW3Y+PjJdfDA7aj1jW2k+PjJdfDA7Wj1jW3Q+PjJdfDA7JD1jW3U+PjJdfDA7aWE9KGNbMTE4NCsoYio5NjB8MCkrMzI0Pj4yXV5fKSZlYTtnYT0oY1sxMTg0KyhiKjk2MHwwKSszMjg+PjJdXkgpJmVhO2FhPShjWzExODQrKGIqOTYwfDApKzMzMj4+Ml1eQykmZWE7Rz0oY1sxMTg0KyhiKjk2MHwwKSszMzY+PjJdXmRhKSZlYTtFPShjWzExODQrKGIqOTYwfDApKzM0MD4+Ml1eaGEpJmVhO2NhPShjWzExODQrKGIqOTYwfDApKzM0ND4+Ml1eYmEpJmVhO0E9KGNbMTE4NCsoYio5NjB8MCkrMzQ4Pj4yXV5qKSZlYTt3PShjWzExODQrKGIqOTYwfDApKzM1Mj4+Ml1eWikmZWE7ZmE9KGNbMTE4NCsoYio5NjB8MCkrMzU2Pj4yXV4kKSZlYTtjW2c+PjJdPShjWzExODQrKGIqOTYwfDApKzMyMD4+Ml1eeSkmZWFeeTtjW0Y+PjJdPWlhXl87Y1tEPj4yXT1nYV5IO2NbQj4+Ml09YWFeQztjW3o+PjJdPUdeZGE7Y1t4Pj4yXT1FXmhhO2Nbdj4+Ml09Y2FeYmE7Y1tpPj4yXT1BXmo7Y1t0Pj4yXT13Xlo7Y1t1Pj4yXT1mYV4kOyQ9Y1thPj4yXXwwO2ZhPWNbZD4+Ml18MDtaPWNbaz4+Ml18MDt3PWNbbD4+Ml18MDtqPWNbbT4+Ml18MDtBPWNbbj4+Ml18MDtiYT1jW28+PjJdfDA7Y2E9Y1twPj4yXXwwO2hhPWNbcT4+Ml18MDtFPWNbcj4+Ml18MDtkYT0oaF40KSstMT4+MzE7Rz0oY1sxMTg0KyhiKjk2MHwwKSszNjQ+PjJdXmZhKSZkYTtDPShjWzExODQrKGIqOTYwfDApKzM2OD4+Ml1eWikmZGE7YWE9KGNbMTE4NCsoYio5NjB8MCkrMzcyPj4yXV53KSZkYTtIPShjWzExODQrKGIqOTYwfDApKzM3Nj4+Ml1eaikmZGE7Z2E9KGNbMTE4NCsoYio5NjB8MCkrMzgwPj4yXV5BKSZkYTtfPShjWzExODQrKGIqOTYwfDApKzM4ND4+Ml1eYmEpJmRhO2lhPShjWzExODQrKGIqOTYwfDApKzM4OD4+Ml1eY2EpJmRhO3k9KGNbMTE4NCsoYio5NjB8MCkrMzkyPj4yXV5oYSkmZGE7ZWE9KGNbMTE4NCsoYio5NjB8MCkrMzk2Pj4yXV5FKSZkYTtjW2E+PjJdPShjWzExODQrKGIqOTYwfDApKzM2MD4+Ml1eJCkmZGFeJDtjW2Q+PjJdPUdeZmE7Y1trPj4yXT1DXlo7Y1tsPj4yXT1hYV53O2NbbT4+Ml09SF5qO2Nbbj4+Ml09Z2FeQTtjW28+PjJdPV9eYmE7Y1twPj4yXT1pYV5jYTtjW3E+PjJdPXleaGE7Y1tyPj4yXT1lYV5FO0U9Y1tlPj4yXXwwO2VhPWNbZj4+Ml18MDtoYT1jW1c+PjJdfDA7eT1jW1U+PjJdfDA7Y2E9Y1tTPj4yXXwwO2lhPWNbUT4+Ml18MDtiYT1jW08+PjJdfDA7Xz1jW00+PjJdfDA7QT1jW0s+PjJdfDA7Z2E9Y1tJPj4yXXwwO2o9KGNbMTE4NCsoYio5NjB8MCkrNDA0Pj4yXV5lYSkmZGE7SD0oY1sxMTg0KyhiKjk2MHwwKSs0MDg+PjJdXmhhKSZkYTt3PShjWzExODQrKGIqOTYwfDApKzQxMj4+Ml1eeSkmZGE7YWE9KGNbMTE4NCsoYio5NjB8MCkrNDE2Pj4yXV5jYSkmZGE7Wj0oY1sxMTg0KyhiKjk2MHwwKSs0MjA+PjJdXmlhKSZkYTtDPShjWzExODQrKGIqOTYwfDApKzQyND4+Ml1eYmEpJmRhO2ZhPShjWzExODQrKGIqOTYwfDApKzQyOD4+Ml1eXykmZGE7Rz0oY1sxMTg0KyhiKjk2MHwwKSs0MzI+PjJdXkEpJmRhOyQ9KGNbMTE4NCsoYio5NjB8MCkrNDM2Pj4yXV5nYSkmZGE7Y1tlPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSs0MDA+PjJdXkUpJmRhXkU7Y1tmPj4yXT1qXmVhO2NbVz4+Ml09SF5oYTtjW1U+PjJdPXdeeTtjW1M+PjJdPWFhXmNhO2NbUT4+Ml09Wl5pYTtjW08+PjJdPUNeYmE7Y1tNPj4yXT1mYV5fO2NbSz4+Ml09R15BO2NbST4+Ml09JF5nYTtnYT1jW2c+PjJdfDA7JD1jW0Y+PjJdfDA7QT1jW0Q+PjJdfDA7Rz1jW0I+PjJdfDA7Xz1jW3o+PjJdfDA7ZmE9Y1t4Pj4yXXwwO2JhPWNbdj4+Ml18MDtDPWNbaT4+Ml18MDtpYT1jW3Q+PjJdfDA7Wj1jW3U+PjJdfDA7Y2E9KGNbMTE4NCsoYio5NjB8MCkrNDQ0Pj4yXV4kKSZkYTthYT0oY1sxMTg0KyhiKjk2MHwwKSs0NDg+PjJdXkEpJmRhO3k9KGNbMTE4NCsoYio5NjB8MCkrNDUyPj4yXV5HKSZkYTt3PShjWzExODQrKGIqOTYwfDApKzQ1Nj4+Ml1eXykmZGE7aGE9KGNbMTE4NCsoYio5NjB8MCkrNDYwPj4yXV5mYSkmZGE7SD0oY1sxMTg0KyhiKjk2MHwwKSs0NjQ+PjJdXmJhKSZkYTtlYT0oY1sxMTg0KyhiKjk2MHwwKSs0Njg+PjJdXkMpJmRhO2o9KGNbMTE4NCsoYio5NjB8MCkrNDcyPj4yXV5pYSkmZGE7RT0oY1sxMTg0KyhiKjk2MHwwKSs0NzY+PjJdXlopJmRhO2NbZz4+Ml09KGNbMTE4NCsoYio5NjB8MCkrNDQwPj4yXV5nYSkmZGFeZ2E7Y1tGPj4yXT1jYV4kO2NbRD4+Ml09YWFeQTtjW0I+PjJdPXleRztjW3o+PjJdPXdeXztjW3g+PjJdPWhhXmZhO2Nbdj4+Ml09SF5iYTtjW2k+PjJdPWVhXkM7Y1t0Pj4yXT1qXmlhO2NbdT4+Ml09RV5aO1o9Y1thPj4yXXwwO0U9Y1tkPj4yXXwwO2lhPWNbaz4+Ml18MDtqPWNbbD4+Ml18MDtDPWNbbT4+Ml18MDtlYT1jW24+PjJdfDA7YmE9Y1tvPj4yXXwwO0g9Y1twPj4yXXwwO2ZhPWNbcT4+Ml18MDtoYT1jW3I+PjJdfDA7Xz0oaF41KSstMT4+MzE7dz0oY1sxMTg0KyhiKjk2MHwwKSs0ODQ+PjJdXkUpJl87Rz0oY1sxMTg0KyhiKjk2MHwwKSs0ODg+PjJdXmlhKSZfO3k9KGNbMTE4NCsoYio5NjB8MCkrNDkyPj4yXV5qKSZfO0E9KGNbMTE4NCsoYio5NjB8MCkrNDk2Pj4yXV5DKSZfO2FhPShjWzExODQrKGIqOTYwfDApKzUwMD4+Ml1eZWEpJl87JD0oY1sxMTg0KyhiKjk2MHwwKSs1MDQ+PjJdXmJhKSZfO2NhPShjWzExODQrKGIqOTYwfDApKzUwOD4+Ml1eSCkmXztnYT0oY1sxMTg0KyhiKjk2MHwwKSs1MTI+PjJdXmZhKSZfO2RhPShjWzExODQrKGIqOTYwfDApKzUxNj4+Ml1eaGEpJl87Y1thPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSs0ODA+PjJdXlopJl9eWjtjW2Q+PjJdPXdeRTtjW2s+PjJdPUdeaWE7Y1tsPj4yXT15Xmo7Y1ttPj4yXT1BXkM7Y1tuPj4yXT1hYV5lYTtjW28+PjJdPSReYmE7Y1twPj4yXT1jYV5IO2NbcT4+Ml09Z2FeZmE7Y1tyPj4yXT1kYV5oYTtoYT1jW2U+PjJdfDA7ZGE9Y1tmPj4yXXwwO2ZhPWNbVz4+Ml18MDtnYT1jW1U+PjJdfDA7SD1jW1M+PjJdfDA7Y2E9Y1tRPj4yXXwwO2JhPWNbTz4+Ml18MDskPWNbTT4+Ml18MDtlYT1jW0s+PjJdfDA7YWE9Y1tJPj4yXXwwO0M9KGNbMTE4NCsoYio5NjB8MCkrNTI0Pj4yXV5kYSkmXztBPShjWzExODQrKGIqOTYwfDApKzUyOD4+Ml1eZmEpJl87aj0oY1sxMTg0KyhiKjk2MHwwKSs1MzI+PjJdXmdhKSZfO3k9KGNbMTE4NCsoYio5NjB8MCkrNTM2Pj4yXV5IKSZfO2lhPShjWzExODQrKGIqOTYwfDApKzU0MD4+Ml1eY2EpJl87Rz0oY1sxMTg0KyhiKjk2MHwwKSs1NDQ+PjJdXmJhKSZfO0U9KGNbMTE4NCsoYio5NjB8MCkrNTQ4Pj4yXV4kKSZfO3c9KGNbMTE4NCsoYio5NjB8MCkrNTUyPj4yXV5lYSkmXztaPShjWzExODQrKGIqOTYwfDApKzU1Nj4+Ml1eYWEpJl87Y1tlPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSs1MjA+PjJdXmhhKSZfXmhhO2NbZj4+Ml09Q15kYTtjW1c+PjJdPUFeZmE7Y1tVPj4yXT1qXmdhO2NbUz4+Ml09eV5IO2NbUT4+Ml09aWFeY2E7Y1tPPj4yXT1HXmJhO2NbTT4+Ml09RV4kO2NbSz4+Ml09d15lYTtjW0k+PjJdPVpeYWE7YWE9Y1tnPj4yXXwwO1o9Y1tGPj4yXXwwO2VhPWNbRD4+Ml18MDt3PWNbQj4+Ml18MDskPWNbej4+Ml18MDtFPWNbeD4+Ml18MDtiYT1jW3Y+PjJdfDA7Rz1jW2k+PjJdfDA7Y2E9Y1t0Pj4yXXwwO2lhPWNbdT4+Ml18MDtIPShjWzExODQrKGIqOTYwfDApKzU2ND4+Ml1eWikmXzt5PShjWzExODQrKGIqOTYwfDApKzU2OD4+Ml1eZWEpJl87Z2E9KGNbMTE4NCsoYio5NjB8MCkrNTcyPj4yXV53KSZfO2o9KGNbMTE4NCsoYio5NjB8MCkrNTc2Pj4yXV4kKSZfO2ZhPShjWzExODQrKGIqOTYwfDApKzU4MD4+Ml1eRSkmXztBPShjWzExODQrKGIqOTYwfDApKzU4ND4+Ml1eYmEpJl87ZGE9KGNbMTE4NCsoYio5NjB8MCkrNTg4Pj4yXV5HKSZfO0M9KGNbMTE4NCsoYio5NjB8MCkrNTkyPj4yXV5jYSkmXztoYT0oY1sxMTg0KyhiKjk2MHwwKSs1OTY+PjJdXmlhKSZfO2NbZz4+Ml09KGNbMTE4NCsoYio5NjB8MCkrNTYwPj4yXV5hYSkmX15hYTtjW0Y+PjJdPUheWjtjW0Q+PjJdPXleZWE7Y1tCPj4yXT1nYV53O2Nbej4+Ml09al4kO2NbeD4+Ml09ZmFeRTtjW3Y+PjJdPUFeYmE7Y1tpPj4yXT1kYV5HO2NbdD4+Ml09Q15jYTtjW3U+PjJdPWhhXmlhO2lhPWNbYT4+Ml18MDtoYT1jW2Q+PjJdfDA7Y2E9Y1trPj4yXXwwO0M9Y1tsPj4yXXwwO0c9Y1ttPj4yXXwwO2RhPWNbbj4+Ml18MDtiYT1jW28+PjJdfDA7QT1jW3A+PjJdfDA7RT1jW3E+PjJdfDA7ZmE9Y1tyPj4yXXwwOyQ9KGheNikrLTE+PjMxO2o9KGNbMTE4NCsoYio5NjB8MCkrNjA0Pj4yXV5oYSkmJDt3PShjWzExODQrKGIqOTYwfDApKzYwOD4+Ml1eY2EpJiQ7Z2E9KGNbMTE4NCsoYio5NjB8MCkrNjEyPj4yXV5DKSYkO2VhPShjWzExODQrKGIqOTYwfDApKzYxNj4+Ml1eRykmJDt5PShjWzExODQrKGIqOTYwfDApKzYyMD4+Ml1eZGEpJiQ7Wj0oY1sxMTg0KyhiKjk2MHwwKSs2MjQ+PjJdXmJhKSYkO0g9KGNbMTE4NCsoYio5NjB8MCkrNjI4Pj4yXV5BKSYkO2FhPShjWzExODQrKGIqOTYwfDApKzYzMj4+Ml1eRSkmJDtfPShjWzExODQrKGIqOTYwfDApKzYzNj4+Ml1eZmEpJiQ7Y1thPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSs2MDA+PjJdXmlhKSYkXmlhO2NbZD4+Ml09al5oYTtjW2s+PjJdPXdeY2E7Y1tsPj4yXT1nYV5DO2NbbT4+Ml09ZWFeRztjW24+PjJdPXleZGE7Y1tvPj4yXT1aXmJhO2NbcD4+Ml09SF5BO2NbcT4+Ml09YWFeRTtjW3I+PjJdPV9eZmE7ZmE9Y1tlPj4yXXwwO189Y1tmPj4yXXwwO0U9Y1tXPj4yXXwwO2FhPWNbVT4+Ml18MDtBPWNbUz4+Ml18MDtIPWNbUT4+Ml18MDtiYT1jW08+PjJdfDA7Wj1jW00+PjJdfDA7ZGE9Y1tLPj4yXXwwO3k9Y1tJPj4yXXwwO0c9KGNbMTE4NCsoYio5NjB8MCkrNjQ0Pj4yXV5fKSYkO2VhPShjWzExODQrKGIqOTYwfDApKzY0OD4+Ml1eRSkmJDtDPShjWzExODQrKGIqOTYwfDApKzY1Mj4+Ml1eYWEpJiQ7Z2E9KGNbMTE4NCsoYio5NjB8MCkrNjU2Pj4yXV5BKSYkO2NhPShjWzExODQrKGIqOTYwfDApKzY2MD4+Ml1eSCkmJDt3PShjWzExODQrKGIqOTYwfDApKzY2ND4+Ml1eYmEpJiQ7aGE9KGNbMTE4NCsoYio5NjB8MCkrNjY4Pj4yXV5aKSYkO2o9KGNbMTE4NCsoYio5NjB8MCkrNjcyPj4yXV5kYSkmJDtpYT0oY1sxMTg0KyhiKjk2MHwwKSs2NzY+PjJdXnkpJiQ7Y1tlPj4yXT0oY1sxMTg0KyhiKjk2MHwwKSs2NDA+PjJdXmZhKSYkXmZhO2NbZj4+Ml09R15fO2NbVz4+Ml09ZWFeRTtjW1U+PjJdPUNeYWE7Y1tTPj4yXT1nYV5BO2NbUT4+Ml09Y2FeSDtjW08+PjJdPXdeYmE7Y1tNPj4yXT1oYV5aO2NbSz4+Ml09al5kYTtjW0k+PjJdPWlhXnk7eT1jW2c+PjJdfDA7aWE9Y1tGPj4yXXwwO2RhPWNbRD4+Ml18MDtqPWNbQj4+Ml18MDtaPWNbej4+Ml18MDtoYT1jW3g+PjJdfDA7YmE9Y1t2Pj4yXXwwO3c9Y1tpPj4yXXwwO0g9Y1t0Pj4yXXwwO2NhPWNbdT4+Ml18MDtBPShjWzExODQrKGIqOTYwfDApKzY4ND4+Ml1eaWEpJiQ7Z2E9KGNbMTE4NCsoYio5NjB8MCkrNjg4Pj4yXV5kYSkmJDthYT0oY1sxMTg0KyhiKjk2MHwwKSs2OTI+PjJdXmopJiQ7Qz0oY1sxMTg0KyhiKjk2MHwwKSs2OTY+PjJdXlopJiQ7RT0oY1sxMTg0KyhiKjk2MHwwKSs3MDA+PjJdXmhhKSYkO2VhPShjWzExODQrKGIqOTYwfDApKzcwND4+Ml1eYmEpJiQ7Xz0oY1sxMTg0KyhiKjk2MHwwKSs3MDg+PjJdXncpJiQ7Rz0oY1sxMTg0KyhiKjk2MHwwKSs3MTI+PjJdXkgpJiQ7ZmE9KGNbMTE4NCsoYio5NjB8MCkrNzE2Pj4yXV5jYSkmJDtjW2c+PjJdPShjWzExODQrKGIqOTYwfDApKzY4MD4+Ml1eeSkmJF55O2NbRj4+Ml09QV5pYTtjW0Q+PjJdPWdhXmRhO2NbQj4+Ml09YWFeajtjW3o+PjJdPUNeWjtjW3g+PjJdPUVeaGE7Y1t2Pj4yXT1lYV5iYTtjW2k+PjJdPV9edztjW3Q+PjJdPUdeSDtjW3U+PjJdPWZhXmNhO2NhPWNbYT4+Ml18MDtmYT1jW2Q+PjJdfDA7SD1jW2s+PjJdfDA7Rz1jW2w+PjJdfDA7dz1jW20+PjJdfDA7Xz1jW24+PjJdfDA7YmE9Y1tvPj4yXXwwO2VhPWNbcD4+Ml18MDtoYT1jW3E+PjJdfDA7RT1jW3I+PjJdfDA7Wj0oaF43KSstMT4+MzE7Qz0oY1sxMTg0KyhiKjk2MHwwKSs3MjQ+PjJdXmZhKSZaO2o9KGNbMTE4NCsoYio5NjB8MCkrNzI4Pj4yXV5IKSZaO2FhPShjWzExODQrKGIqOTYwfDApKzczMj4+Ml1eRykmWjtkYT0oY1sxMTg0KyhiKjk2MHwwKSs3MzY+PjJdXncpJlo7Z2E9KGNbMTE4NCsoYio5NjB8MCkrNzQwPj4yXV5fKSZaO2lhPShjWzExODQrKGIqOTYwfDApKzc0ND4+Ml1eYmEpJlo7QT0oY1sxMTg0KyhiKjk2MHwwKSs3NDg+PjJdXmVhKSZaO3k9KGNbMTE4NCsoYio5NjB8MCkrNzUyPj4yXV5oYSkmWjskPShjWzExODQrKGIqOTYwfDApKzc1Nj4+Ml1eRSkmWjtjW2E+PjJdPShjWzExODQrKGIqOTYwfDApKzcyMD4+Ml1eY2EpJlpeY2E7Y1tkPj4yXT1DXmZhO2Nbaz4+Ml09al5IO2NbbD4+Ml09YWFeRztjW20+PjJdPWRhXnc7Y1tuPj4yXT1nYV5fO2Nbbz4+Ml09aWFeYmE7Y1twPj4yXT1BXmVhO2NbcT4+Ml09eV5oYTtjW3I+PjJdPSReRTtFPWNbZT4+Ml18MDskPWNbZj4+Ml18MDtoYT1jW1c+PjJdfDA7eT1jW1U+PjJdfDA7ZWE9Y1tTPj4yXXwwO0E9Y1tRPj4yXXwwO2JhPWNbTz4+Ml18MDtpYT1jW00+PjJdfDA7Xz1jW0s+PjJdfDA7Z2E9Y1tJPj4yXXwwO3c9KGNbMTE4NCsoYio5NjB8MCkrNzY0Pj4yXV4kKSZaO2RhPShjWzExODQrKGIqOTYwfDApKzc2OD4+Ml1eaGEpJlo7Rz0oY1sxMTg0KyhiKjk2MHwwKSs3NzI+PjJdXnkpJlo7YWE9KGNbMTE4NCsoYio5NjB8MCkrNzc2Pj4yXV5lYSkmWjtIPShjWzExODQrKGIqOTYwfDApKzc4MD4+Ml1eQSkmWjtqPShjWzExODQrKGIqOTYwfDApKzc4ND4+Ml1eYmEpJlo7ZmE9KGNbMTE4NCsoYio5NjB8MCkrNzg4Pj4yXV5pYSkmWjtDPShjWzExODQrKGIqOTYwfDApKzc5Mj4+Ml1eXykmWjtjYT0oY1sxMTg0KyhiKjk2MHwwKSs3OTY+PjJdXmdhKSZaO2NbZT4+Ml09KGNbMTE4NCsoYio5NjB8MCkrNzYwPj4yXV5FKSZaXkU7Y1tmPj4yXT13XiQ7Y1tXPj4yXT1kYV5oYTtjW1U+PjJdPUdeeTtjW1M+PjJdPWFhXmVhO2NbUT4+Ml09SF5BO2NbTz4+Ml09al5iYTtjW00+PjJdPWZhXmlhO2NbSz4+Ml09Q15fO2NbST4+Ml09Y2FeZ2E7Z2E9Y1tnPj4yXXwwO2NhPWNbRj4+Ml18MDtfPWNbRD4+Ml18MDtDPWNbQj4+Ml18MDtpYT1jW3o+PjJdfDA7ZmE9Y1t4Pj4yXXwwO2JhPWNbdj4+Ml18MDtqPWNbaT4+Ml18MDtBPWNbdD4+Ml18MDtIPWNbdT4+Ml18MDtlYT0oY1sxMTg0KyhiKjk2MHwwKSs4MDQ+PjJdXmNhKSZaO2FhPShjWzExODQrKGIqOTYwfDApKzgwOD4+Ml1eXykmWjt5PShjWzExODQrKGIqOTYwfDApKzgxMj4+Ml1eQykmWjtHPShjWzExODQrKGIqOTYwfDApKzgxNj4+Ml1eaWEpJlo7aGE9KGNbMTE4NCsoYio5NjB8MCkrODIwPj4yXV5mYSkmWjtkYT0oY1sxMTg0KyhiKjk2MHwwKSs4MjQ+PjJdXmJhKSZaOyQ9KGNbMTE4NCsoYio5NjB8MCkrODI4Pj4yXV5qKSZaO3c9KGNbMTE4NCsoYio5NjB8MCkrODMyPj4yXV5BKSZaO0U9KGNbMTE4NCsoYio5NjB8MCkrODM2Pj4yXV5IKSZaO2NbZz4+Ml09KGNbMTE4NCsoYio5NjB8MCkrODAwPj4yXV5nYSkmWl5nYTtjW0Y+PjJdPWVhXmNhO2NbRD4+Ml09YWFeXztjW0I+PjJdPXleQztjW3o+PjJdPUdeaWE7Y1t4Pj4yXT1oYV5mYTtjW3Y+PjJdPWRhXmJhO2NbaT4+Ml09JF5qO2NbdD4+Ml09d15BO2NbdT4+Ml09RV5IO0g9Y1thPj4yXXwwO0U9Y1tkPj4yXXwwO0E9Y1trPj4yXXwwO3c9Y1tsPj4yXXwwO2o9Y1ttPj4yXXwwOyQ9Y1tuPj4yXXwwO2JhPWNbbz4+Ml18MDtkYT1jW3A+PjJdfDA7ZmE9Y1txPj4yXXwwO2hhPWNbcj4+Ml18MDtpYT0oaF44KSstMT4+MzE7Rz0oY1sxMTg0KyhiKjk2MHwwKSs4NDQ+PjJdXkUpJmlhO0M9KGNbMTE4NCsoYio5NjB8MCkrODQ4Pj4yXV5BKSZpYTt5PShjWzExODQrKGIqOTYwfDApKzg1Mj4+Ml1edykmaWE7aD0oY1sxMTg0KyhiKjk2MHwwKSs4NTY+PjJdXmopJmlhO189KGNbMTE4NCsoYio5NjB8MCkrODYwPj4yXV4kKSZpYTthYT0oY1sxMTg0KyhiKjk2MHwwKSs4NjQ+PjJdXmJhKSZpYTtjYT0oY1sxMTg0KyhiKjk2MHwwKSs4Njg+PjJdXmRhKSZpYTtlYT0oY1sxMTg0KyhiKjk2MHwwKSs4NzI+PjJdXmZhKSZpYTtnYT0oY1sxMTg0KyhiKjk2MHwwKSs4NzY+PjJdXmhhKSZpYTtjW2E+PjJdPShjWzExODQrKGIqOTYwfDApKzg0MD4+Ml1eSCkmaWFeSDtjW2Q+PjJdPUdeRTtjW2s+PjJdPUNeQTtjW2w+PjJdPXledztjW20+PjJdPWheajtjW24+PjJdPV9eJDtjW28+PjJdPWFhXmJhO2NbcD4+Ml09Y2FeZGE7Y1txPj4yXT1lYV5mYTtjW3I+PjJdPWdhXmhhO2hhPWNbZT4+Ml18MDtnYT1jW2Y+PjJdfDA7ZmE9Y1tXPj4yXXwwO2VhPWNbVT4+Ml18MDtkYT1jW1M+PjJdfDA7Y2E9Y1tRPj4yXXwwO2JhPWNbTz4+Ml18MDthYT1jW00+PjJdfDA7JD1jW0s+PjJdfDA7Xz1jW0k+PjJdfDA7aj0oY1sxMTg0KyhiKjk2MHwwKSs4ODQ+PjJdXmdhKSZpYTtoPShjWzExODQrKGIqOTYwfDApKzg4OD4+Ml1eZmEpJmlhO3c9KGNbMTE4NCsoYio5NjB8MCkrODkyPj4yXV5lYSkmaWE7eT0oY1sxMTg0KyhiKjk2MHwwKSs4OTY+PjJdXmRhKSZpYTtBPShjWzExODQrKGIqOTYwfDApKzkwMD4+Ml1eY2EpJmlhO0M9KGNbMTE4NCsoYio5NjB8MCkrOTA0Pj4yXV5iYSkmaWE7RT0oY1sxMTg0KyhiKjk2MHwwKSs5MDg+PjJdXmFhKSZpYTtHPShjWzExODQrKGIqOTYwfDApKzkxMj4+Ml1eJCkmaWE7SD0oY1sxMTg0KyhiKjk2MHwwKSs5MTY+PjJdXl8pJmlhO2hhPShjWzExODQrKGIqOTYwfDApKzg4MD4+Ml1eaGEpJmlhXmhhO2NbZT4+Ml09aGE7Z2E9al5nYTtjW2Y+PjJdPWdhO2ZhPWheZmE7Y1tXPj4yXT1mYTtlYT13XmVhO2NbVT4+Ml09ZWE7ZGE9eV5kYTtjW1M+PjJdPWRhO2NhPUFeY2E7Y1tRPj4yXT1jYTtiYT1DXmJhO2NbTz4+Ml09YmE7YWE9RV5hYTtjW00+PjJdPWFhOyQ9R14kO2NbSz4+Ml09JDtfPUheXztjW0k+PjJdPV87SD1jW2c+PjJdfDA7Rz1jW0Y+PjJdfDA7RT1jW0Q+PjJdfDA7Qz1jW0I+PjJdfDA7QT1jW3o+PjJdfDA7eT1jW3g+PjJdfDA7dz1jW3Y+PjJdfDA7aD1jW2k+PjJdfDA7aj1jW3Q+PjJdfDA7Wj1jW3U+PjJdfDA7Sj0oY1sxMTg0KyhiKjk2MHwwKSs5MjQ+PjJdXkcpJmlhO0w9KGNbMTE4NCsoYio5NjB8MCkrOTI4Pj4yXV5FKSZpYTtOPShjWzExODQrKGIqOTYwfDApKzkzMj4+Ml1eQykmaWE7UD0oY1sxMTg0KyhiKjk2MHwwKSs5MzY+PjJdXkEpJmlhO1I9KGNbMTE4NCsoYio5NjB8MCkrOTQwPj4yXV55KSZpYTtUPShjWzExODQrKGIqOTYwfDApKzk0ND4+Ml1edykmaWE7Vj0oY1sxMTg0KyhiKjk2MHwwKSs5NDg+PjJdXmgpJmlhO1g9KGNbMTE4NCsoYio5NjB8MCkrOTUyPj4yXV5qKSZpYTtZPShjWzExODQrKGIqOTYwfDApKzk1Nj4+Ml1eWikmaWE7SD0oY1sxMTg0KyhiKjk2MHwwKSs5MjA+PjJdXkgpJmlhXkg7Y1tnPj4yXT1IO0c9Sl5HO2NbRj4+Ml09RztFPUxeRTtjW0Q+PjJdPUU7Qz1OXkM7Y1tCPj4yXT1DO0E9UF5BO2Nbej4+Ml09QTt5PVJeeTtjW3g+PjJdPXk7dz1UXnc7Y1t2Pj4yXT13O2g9Vl5oO2NbaT4+Ml09aDtqPVheajtjW3Q+PjJdPWo7Yj1ZXlo7Y1t1Pj4yXT1iO1o9Y1thPj4yXXwwO1k9Y1tkPj4yXXwwO1g9Y1trPj4yXXwwO1Y9Y1tsPj4yXXwwO1Q9Y1ttPj4yXXwwO1I9Y1tuPj4yXXwwO1A9Y1tvPj4yXXwwO049Y1twPj4yXXwwO0w9Y1txPj4yXXwwO0o9Y1tyPj4yXXwwO2NbYT4+Ml09KGhhXlopJnNeWjtjW2Q+PjJdPShnYV5ZKSZzXlk7Y1trPj4yXT0oZmFeWCkmc15YO2NbbD4+Ml09KGVhXlYpJnNeVjtjW20+PjJdPShkYV5UKSZzXlQ7Y1tuPj4yXT0oY2FeUikmc15SO2Nbbz4+Ml09KGJhXlApJnNeUDtjW3A+PjJdPShhYV5OKSZzXk47Y1txPj4yXT0oJF5MKSZzXkw7Y1tyPj4yXT0oX15KKSZzXko7ZD1jW2U+PjJdfDA7YT1jW2Y+PjJdfDA7cj1jW1c+PjJdfDA7cT1jW1U+PjJdfDA7cD1jW1M+PjJdfDA7bz1jW1E+PjJdfDA7bj1jW08+PjJdfDA7bT1jW00+PjJdfDA7bD1jW0s+PjJdfDA7az1jW0k+PjJdfDA7Y1tlPj4yXT0oWl5kKSZzXmQ7Y1tmPj4yXT0oWV5hKSZzXmE7Y1tXPj4yXT0oWF5yKSZzXnI7Y1tVPj4yXT0oVl5xKSZzXnE7Y1tTPj4yXT0oVF5wKSZzXnA7Y1tRPj4yXT0oUl5vKSZzXm87Y1tPPj4yXT0oUF5uKSZzXm47Y1tNPj4yXT0oTl5tKSZzXm07Y1tLPj4yXT0oTF5sKSZzXmw7Y1tJPj4yXT0oSl5rKSZzXms7Zj1jW2c+PjJdfDA7az1jW0Y+PjJdfDA7bD1jW0Q+PjJdfDA7bT1jW0I+PjJdfDA7bj1jW3o+PjJdfDA7bz1jW3g+PjJdfDA7cD1jW3Y+PjJdfDA7cT1jW2k+PjJdfDA7cj1jW3Q+PjJdfDA7YT1jW3U+PjJdfDA7Y1tnPj4yXT0oZl4wLUgpJnNeZjtjW0Y+PjJdPShrXjAtRykmc15rO2NbRD4+Ml09KGxeMC1FKSZzXmw7Y1tCPj4yXT0obV4wLUMpJnNebTtjW3o+PjJdPShuXjAtQSkmc15uO2NbeD4+Ml09KG9eMC15KSZzXm87Y1t2Pj4yXT0ocF4wLXcpJnNecDtjW2k+PjJdPShxXjAtaCkmc15xO2NbdD4+Ml09KHJeMC1qKSZzXnI7Y1t1Pj4yXT0oYV4wLWIpJnNeYTtyZXR1cm59ZnVuY3Rpb24gVGMoYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wO2c9aTtlPWk9aSs2MyYtNjQ7aT1pKzI0MHwwO2Q9ZSs4MHwwO2Y9ZSs0MHwwO2lmKE5jKGQsYil8MCl7Zj0tMTtpPWc7cmV0dXJuIGZ8MH15PWUrNHwwO2NbeT4+Ml09MDtjW3krND4+Ml09MDtjW3krOD4+Ml09MDtjW3krMTI+PjJdPTA7Y1t5KzE2Pj4yXT0wO2NbeSsyMD4+Ml09MDtjW3krMjQ+PjJdPTA7Y1t5KzI4Pj4yXT0wO3E9ZCs0MHwwO3A9ZCs0NHwwO249ZCs0OHwwO209ZCs1MnwwO2w9ZCs1NnwwO2s9ZCs2MHwwO2o9ZCs2NHwwO2g9ZCs2OHwwO3I9ZCs3MnwwO2I9ZCs3NnwwO3o9MC0oY1twPj4yXXwwKXwwO3g9MC0oY1tuPj4yXXwwKXwwO3c9MC0oY1ttPj4yXXwwKXwwO3Y9MC0oY1tsPj4yXXwwKXwwO3U9MC0oY1trPj4yXXwwKXwwO3Q9MC0oY1tqPj4yXXwwKXwwO3M9MC0oY1toPj4yXXwwKXwwO2Q9MC0oY1tyPj4yXXwwKXwwO289MC0oY1tiPj4yXXwwKXwwO2NbZT4+Ml09MS0oY1txPj4yXXwwKTtjW3k+PjJdPXo7Y1tlKzg+PjJdPXg7Y1tlKzEyPj4yXT13O2NbZSsxNj4+Ml09djtjW2UrMjA+PjJdPXU7Y1tlKzI0Pj4yXT10O2NbZSsyOD4+Ml09cztjW2UrMzI+PjJdPWQ7Y1tlKzM2Pj4yXT1vO0ljKGUsZSk7bz1mKzR8MDtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTA7Y1tvKzEyPj4yXT0wO2NbbysxNj4+Ml09MDtjW28rMjA+PjJdPTA7Y1tvKzI0Pj4yXT0wO2NbbysyOD4+Ml09MDtwPWNbcD4+Ml18MDtuPWNbbj4+Ml18MDttPWNbbT4+Ml18MDtsPWNbbD4+Ml18MDtrPWNbaz4+Ml18MDtqPWNbaj4+Ml18MDtoPWNbaD4+Ml18MDtkPWNbcj4+Ml18MDtiPWNbYj4+Ml18MDtjW2Y+PjJdPShjW3E+PjJdfDApKzE7Y1tvPj4yXT1wO2NbZis4Pj4yXT1uO2NbZisxMj4+Ml09bTtjW2YrMTY+PjJdPWw7Y1tmKzIwPj4yXT1rO2NbZisyND4+Ml09ajtjW2YrMjg+PjJdPWg7Y1tmKzMyPj4yXT1kO2NbZiszNj4+Ml09YjtKYyhmLGYsZSk7TGMoYSxmKTtmPTA7aT1nO3JldHVybiBmfDB9ZnVuY3Rpb24gVWMoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2s9aTtnPWk9aSs2MyYtNjQ7aT1pKzI3MnwwO2g9ZztnPWcrMjA4fDA7Zj1oKzY0fDA7aj1oO2w9ODttPWorNjR8MDtkb3tjW2o+PjJdPWNbbD4+Ml07aj1qKzR8MDtsPWwrNHwwfXdoaWxlKChqfDApPChtfDApKTtqPWgrNzJ8MDtjW2o+PjJdPTI1NjtjW2orND4+Ml09MDtqPWY7Y1tqPj4yXT0wO2Nbais0Pj4yXT0wO2o9aCs4MHwwO2w9ZTttPWorMzJ8MDtkb3thW2o+PjBdPWFbbD4+MF18MDtqPWorMXwwO2w9bCsxfDB9d2hpbGUoKGp8MCk8KG18MCkpO0diKGgsZyk7YVtnPj4wXT0oZFtnPj4wXXwwKSYyNDg7aj1nKzMxfDA7YVtqPj4wXT0oZFtqPj4wXXwwKSY2M3w2NDtqPWI7bD1nO209aiszMnwwO2Rve2Fbaj4+MF09YVtsPj4wXXwwO2o9aisxfDA7bD1sKzF8MH13aGlsZSgoanwwKTwobXwwKSk7aT1rO3JldHVybiAwfWZ1bmN0aW9uIFZjKGIsZSxmLGcsaCl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTAsYmE9MCxjYT0wLGRhPTAsZWE9MCxmYT0wLGdhPTAsaGE9MCxpYT0wLGphPTAsa2E9MCxsYT0wLG1hPTAsbmE9MCxvYT0wLHBhPTAscWE9MCxyYT0wLHNhPTAsdGE9MCx1YT0wLHZhPTAsd2E9MCx4YT0wLHlhPTAsemE9MCxBYT0wLEJhPTAsQ2E9MCxEYT0wLEVhPTAsRmE9MCxHYT0wLEhhPTAsSWE9MCxKYT0wLEthPTAsTGE9MCxNYT0wLE5hPTAsT2E9MCxQYT0wLFFhPTAsUmE9MCxTYT0wLFRhPTAsVWE9MCxWYT0wLFdhPTAsWGE9MCxZYT0wLFphPTAsX2E9MCwkYT0wLGFiPTAsYmI9MCxjYj0wLGRiPTAsZWI9MCxmYj0wLGdiPTAsaGI9MCxpYj0wLGpiPTAsa2I9MCxsYj0wLG1iPTAsbmI9MCxvYj0wLHBiPTAscWI9MCxyYj0wO1FhPWk7aj1pPWkrNjMmLTY0O2k9aSszMDI0fDA7TWE9aisyODAwfDA7TmE9aisyNTQ0fDA7T2E9aisyMjg4fDA7az1qKzIyNDh8MDtKYT1qKzk2OHwwO0thPWorODA4fDA7TGE9ais2NDh8MDt0PWorNDg4fDA7bj1qO3A9aisyOTUyfDA7UGE9aisyOTIwfDA7cz1qKzMyOHwwO2o9aisyMDh8MDtpZigoZFtiKzYzPj4wXXwwKT4zMSl7Yj0tMTtpPVFhO3JldHVybiBifDB9aWYoTmMocyxoKXwwKXtiPS0xO2k9UWE7cmV0dXJuIGJ8MH1pZighKChhW2grMzE+PjBdfChhW2grMzA+PjBdfChhW2grMjk+PjBdfChhW2grMjg+PjBdfChhW2grMjc+PjBdfChhW2grMjY+PjBdfChhW2grMjU+PjBdfChhW2grMjQ+PjBdfChhW2grMjM+PjBdfChhW2grMjI+PjBdfChhW2grMjE+PjBdfChhW2grMjA+PjBdfChhW2grMTk+PjBdfChhW2grMTg+PjBdfChhW2grMTc+PjBdfChhW2grMTY+PjBdfChhW2grMTU+PjBdfChhW2grMTQ+PjBdfChhW2grMTM+PjBdfChhW2grMTI+PjBdfChhW2grMTE+PjBdfChhW2grMTA+PjBdfChhW2grOT4+MF18KGFbaCs4Pj4wXXwoYVtoKzc+PjBdfChhW2grNj4+MF18KGFbaCs1Pj4wXXwoYVtoKzQ+PjBdfChhW2grMz4+MF18KGFbaCsyPj4wXXwoYVtoKzE+PjBdfGFbaD4+MF0pKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpPDwyND4+MjQpKXtiPS0xO2k9UWE7cmV0dXJuIGJ8MH1sPW4rNjR8MDtxPWw7Y1txPj4yXT0wO2NbcSs0Pj4yXT0wO3E9bjtvPTg7cj1xKzY0fDA7ZG97Y1txPj4yXT1jW28+PjJdO3E9cSs0fDA7bz1vKzR8MH13aGlsZSgocXwwKTwocnwwKSk7bT1uKzcyfDA7cT1tO2NbcT4+Ml09MjU2O2NbcSs0Pj4yXT0wO3E9bDtjW3E+PjJdPTA7Y1txKzQ+PjJdPTA7cT1uKzgwfDA7bz1iO3I9cSszMnwwO2Rve2FbcT4+MF09YVtvPj4wXXwwO3E9cSsxfDA7bz1vKzF8MH13aGlsZSgocXwwKTwocnwwKSk7cT1tO2NbcT4+Ml09NTEyO2NbcSs0Pj4yXT0wO3E9bDtjW3E+PjJdPTA7Y1txKzQ+PjJdPTA7cT1uKzExMnwwO289aDtyPXErMzJ8MDtkb3thW3E+PjBdPWFbbz4+MF18MDtxPXErMXwwO289bysxfDB9d2hpbGUoKHF8MCk8KHJ8MCkpO0ZiKG4sZSxmLGcpO0diKG4scCk7V2MocCk7Zj0wO2Rve2FbTmErZj4+MF09KGRbcCsoZj4+Myk+PjBdfDApPj4+KGYmNykmMTtmPWYrMXwwfXdoaWxlKChmfDApIT0yNTYpO3A9YiszMnwwO289MDt3aGlsZSgxKXtlPU5hK298MDthOmRvIGlmKGFbZT4+MF18MCl7aD0xO2Rve2c9aCtvfDA7aWYoKGd8MCk+PTI1NilicmVhayBhO209TmErZ3wwO2Y9YVttPj4wXXwwO2I6ZG8gaWYoZjw8MjQ+PjI0KXtuPWFbZT4+MF18MDtmPWY8PDI0Pj4yNDw8aDtsPW4rZnwwO2lmKChsfDApPDE2KXthW2U+PjBdPWw7YVttPj4wXT0wO2JyZWFrfWY9bi1mfDA7aWYoKGZ8MCk8PS0xNilicmVhayBhO2FbZT4+MF09Zjt3aGlsZSgxKXtmPU5hK2d8MDtpZighKGFbZj4+MF18MCkpYnJlYWs7YVtmPj4wXT0wO2c9ZysxfDA7aWYoKGd8MCk+PTI1NilicmVhayBifWFbZj4+MF09MX13aGlsZSgwKTtoPWgrMXwwfXdoaWxlKChofDApPDcpfXdoaWxlKDApO289bysxfDA7aWYoKG98MCk9PTI1Nil7Zj0wO2JyZWFrfX1kb3thW09hK2Y+PjBdPShkW3ArKGY+PjMpPj4wXXwwKT4+PihmJjcpJjE7Zj1mKzF8MH13aGlsZSgoZnwwKSE9MjU2KTtvPTA7ZG97ZT1PYStvfDA7YzpkbyBpZihhW2U+PjBdfDApe2g9MTtkb3tnPWgrb3wwO2lmKChnfDApPj0yNTYpYnJlYWsgYzttPU9hK2d8MDtmPWFbbT4+MF18MDtkOmRvIGlmKGY8PDI0Pj4yNCl7bj1hW2U+PjBdfDA7Zj1mPDwyND4+MjQ8PGg7bD1uK2Z8MDtpZigobHwwKTwxNil7YVtlPj4wXT1sO2FbbT4+MF09MDticmVha31mPW4tZnwwO2lmKChmfDApPD0tMTYpYnJlYWsgYzthW2U+PjBdPWY7d2hpbGUoMSl7Zj1PYStnfDA7aWYoIShhW2Y+PjBdfDApKWJyZWFrO2FbZj4+MF09MDtnPWcrMXwwO2lmKChnfDApPj0yNTYpYnJlYWsgZH1hW2Y+PjBdPTF9d2hpbGUoMCk7aD1oKzF8MH13aGlsZSgoaHwwKTw3KX13aGlsZSgwKTtvPW8rMXwwfXdoaWxlKChvfDApIT0yNTYpO1FjKEphLHMpO0lhPWNbcys0Pj4yXXwwO3I9Y1tzKzg+PjJdfDA7cT1jW3MrMTI+PjJdfDA7R2E9Y1tzKzE2Pj4yXXwwO0ZhPWNbcysyMD4+Ml18MDtFYT1jW3MrMjQ+PjJdfDA7RGE9Y1tzKzI4Pj4yXXwwO0NhPWNbcyszMj4+Ml18MDtCYT1jW3MrMzY+PjJdfDA7Y1tNYT4+Ml09Y1tzPj4yXTtjW01hKzQ+PjJdPUlhO2NbTWErOD4+Ml09cjtjW01hKzEyPj4yXT1xO2NbTWErMTY+PjJdPUdhO2NbTWErMjA+PjJdPUZhO2NbTWErMjQ+PjJdPUVhO2NbTWErMjg+PjJdPURhO2NbTWErMzI+PjJdPUNhO2NbTWErMzY+PjJdPUJhO0JhPWNbcys0ND4+Ml18MDtDYT1jW3MrNDg+PjJdfDA7RGE9Y1tzKzUyPj4yXXwwO0VhPWNbcys1Nj4+Ml18MDtGYT1jW3MrNjA+PjJdfDA7R2E9Y1tzKzY0Pj4yXXwwO3E9Y1tzKzY4Pj4yXXwwO3I9Y1tzKzcyPj4yXXwwO0lhPWNbcys3Nj4+Ml18MDtjW01hKzQwPj4yXT1jW3MrNDA+PjJdO2NbTWErNDQ+PjJdPUJhO2NbTWErNDg+PjJdPUNhO2NbTWErNTI+PjJdPURhO2NbTWErNTY+PjJdPUVhO2NbTWErNjA+PjJdPUZhO2NbTWErNjQ+PjJdPUdhO2NbTWErNjg+PjJdPXE7Y1tNYSs3Mj4+Ml09cjtjW01hKzc2Pj4yXT1JYTtJYT1jW3MrODQ+PjJdfDA7cj1jW3MrODg+PjJdfDA7cT1jW3MrOTI+PjJdfDA7R2E9Y1tzKzk2Pj4yXXwwO0ZhPWNbcysxMDA+PjJdfDA7RWE9Y1tzKzEwND4+Ml18MDtEYT1jW3MrMTA4Pj4yXXwwO0NhPWNbcysxMTI+PjJdfDA7QmE9Y1tzKzExNj4+Ml18MDtjW01hKzgwPj4yXT1jW3MrODA+PjJdO2NbTWErODQ+PjJdPUlhO2NbTWErODg+PjJdPXI7Y1tNYSs5Mj4+Ml09cTtjW01hKzk2Pj4yXT1HYTtjW01hKzEwMD4+Ml09RmE7Y1tNYSsxMDQ+PjJdPUVhO2NbTWErMTA4Pj4yXT1EYTtjW01hKzExMj4+Ml09Q2E7Y1tNYSsxMTY+PjJdPUJhO1BjKEthLE1hKTtCYT1LYSsxMjB8MDtKYyh0LEthLEJhKTtDYT1LYSs0MHwwO0RhPUthKzgwfDA7SmModCs0MHwwLENhLERhKTtKYyh0KzgwfDAsRGEsQmEpO0pjKHQrMTIwfDAsS2EsQ2EpO01jKEthLHQsSmEpO0pjKExhLEthLEJhKTtFYT1MYSs0MHwwO0pjKEVhLENhLERhKTtGYT1MYSs4MHwwO0pjKEZhLERhLEJhKTtHYT1MYSsxMjB8MDtKYyhHYSxLYSxDYSk7cT1KYSsxNjB8MDtRYyhxLExhKTtNYyhLYSx0LHEpO0pjKExhLEthLEJhKTtKYyhFYSxDYSxEYSk7SmMoRmEsRGEsQmEpO0pjKEdhLEthLENhKTtxPUphKzMyMHwwO1FjKHEsTGEpO01jKEthLHQscSk7SmMoTGEsS2EsQmEpO0pjKEVhLENhLERhKTtKYyhGYSxEYSxCYSk7SmMoR2EsS2EsQ2EpO3E9SmErNDgwfDA7UWMocSxMYSk7TWMoS2EsdCxxKTtKYyhMYSxLYSxCYSk7SmMoRWEsQ2EsRGEpO0pjKEZhLERhLEJhKTtKYyhHYSxLYSxDYSk7cT1KYSs2NDB8MDtRYyhxLExhKTtNYyhLYSx0LHEpO0pjKExhLEthLEJhKTtKYyhFYSxDYSxEYSk7SmMoRmEsRGEsQmEpO0pjKEdhLEthLENhKTtxPUphKzgwMHwwO1FjKHEsTGEpO01jKEthLHQscSk7SmMoTGEsS2EsQmEpO0pjKEVhLENhLERhKTtKYyhGYSxEYSxCYSk7SmMoR2EsS2EsQ2EpO3E9SmErOTYwfDA7UWMocSxMYSk7TWMoS2EsdCxxKTtKYyhMYSxLYSxCYSk7SmMoRWEsQ2EsRGEpO0pjKEZhLERhLEJhKTtKYyhHYSxLYSxDYSk7UWMoSmErMTEyMHwwLExhKTtxPWo7cj1xKzQwfDA7ZG97Y1txPj4yXT0wO3E9cSs0fDB9d2hpbGUoKHF8MCk8KHJ8MCkpO0hhPWorNDB8MDtjW0hhPj4yXT0xO3E9ais0NHwwO3I9cSszNnwwO2Rve2NbcT4+Ml09MDtxPXErNHwwfXdoaWxlKChxfDApPChyfDApKTtJYT1qKzgwfDA7Y1tJYT4+Ml09MTtxPWorODR8MDtyPXErMzZ8MDtkb3tjW3E+PjJdPTA7cT1xKzR8MH13aGlsZSgocXwwKTwocnwwKSk7Zz0yNTU7d2hpbGUoMSl7aWYoYVtOYStnPj4wXXwwKXtmPWc7YnJlYWt9aWYoYVtPYStnPj4wXXwwKXtmPWc7YnJlYWt9Zj1nKy0xfDA7aWYoKGd8MCk+MClnPWY7ZWxzZSBicmVha31pZigoZnwwKT4tMSl7bD1MYSs0NHwwO209TGErNDh8MDtuPUxhKzUyfDA7ZT1MYSs1NnwwO2g9TGErNjB8MDtvPUxhKzY0fDA7cD1MYSs2OHwwO3E9TGErNzJ8MDtyPUxhKzc2fDA7cz1MYSs0fDA7dD1MYSs4fDA7dT1MYSsxMnwwO3Y9TGErMTZ8MDt3PUxhKzIwfDA7eD1MYSsyNHwwO3k9TGErMjh8MDt6PUxhKzMyfDA7QT1MYSszNnwwO0I9S2ErNHwwO0M9S2ErOHwwO0Q9S2ErMTJ8MDtFPUthKzE2fDA7Rj1LYSsyMHwwO0c9S2ErMjR8MDtIPUthKzI4fDA7ST1LYSszMnwwO0o9S2ErMzZ8MDtLPUthKzQ0fDA7TD1LYSs0OHwwO009S2ErNTJ8MDtOPUthKzU2fDA7Tz1LYSs2MHwwO1A9S2ErNjR8MDtRPUthKzY4fDA7Uj1LYSs3MnwwO1M9S2ErNzZ8MDtUPUxhKzg0fDA7VT1MYSs4OHwwO1Y9TGErOTJ8MDtXPUxhKzk2fDA7WD1MYSsxMDB8MDtZPUxhKzEwNHwwO1o9TGErMTA4fDA7Xz1MYSsxMTJ8MDskPUxhKzExNnwwO2FhPWsrNHwwO2JhPWsrOHwwO2NhPWsrMTJ8MDtkYT1rKzE2fDA7ZWE9aysyMHwwO2ZhPWsrMjR8MDtnYT1rKzI4fDA7aGE9ayszMnwwO2lhPWsrMzZ8MDtqYT1LYSs4NHwwO2thPUthKzg4fDA7bGE9S2ErOTJ8MDttYT1LYSs5NnwwO25hPUthKzEwMHwwO29hPUthKzEwNHwwO3BhPUthKzEwOHwwO3FhPUthKzExMnwwO3JhPUthKzExNnwwO3NhPUthKzEyNHwwO3RhPUthKzEyOHwwO3VhPUthKzEzMnwwO3ZhPUthKzEzNnwwO3dhPUthKzE0MHwwO3hhPUthKzE0NHwwO3lhPUthKzE0OHwwO3phPUthKzE1MnwwO0FhPUthKzE1NnwwO3doaWxlKDEpe1BjKEthLGopO2c9YVtOYStmPj4wXXwwO2lmKGc8PDI0Pj4yNDw9MCl7aWYoZzw8MjQ+PjI0PDApe0pjKExhLEthLEJhKTtKYyhFYSxDYSxEYSk7SmMoRmEsRGEsQmEpO0pjKEdhLEthLENhKTtoYj0oZzw8MjQ+PjI0fDApLy0yfDA7cmI9Y1tFYT4+Ml18MDtYYT1jW2w+PjJdfDA7VGE9Y1ttPj4yXXwwO2liPWNbbj4+Ml18MDttYj1jW2U+PjJdfDA7cWI9Y1toPj4yXXwwOyRhPWNbbz4+Ml18MDtiYj1jW3A+PjJdfDA7ZGI9Y1txPj4yXXwwO2ZiPWNbcj4+Ml18MDtaYT1jW0xhPj4yXXwwO1ZhPWNbcz4+Ml18MDtSYT1jW3Q+PjJdfDA7a2I9Y1t1Pj4yXXwwO29iPWNbdj4+Ml18MDtfYT1jW3c+PjJdfDA7YWI9Y1t4Pj4yXXwwO2NiPWNbeT4+Ml18MDtlYj1jW3o+PjJdfDA7Z2I9Y1tBPj4yXXwwO2NbS2E+PjJdPVphK3JiO2NbQj4+Ml09VmErWGE7Y1tDPj4yXT1SYStUYTtjW0Q+PjJdPWtiK2liO2NbRT4+Ml09b2IrbWI7Y1tGPj4yXT1fYStxYjtjW0c+PjJdPWFiKyRhO2NbSD4+Ml09Y2IrYmI7Y1tJPj4yXT1lYitkYjtjW0o+PjJdPWdiK2ZiO2NbQ2E+PjJdPXJiLVphO2NbSz4+Ml09WGEtVmE7Y1tMPj4yXT1UYS1SYTtjW00+PjJdPWliLWtiO2NbTj4+Ml09bWItb2I7Y1tPPj4yXT1xYi1fYTtjW1A+PjJdPSRhLWFiO2NbUT4+Ml09YmItY2I7Y1tSPj4yXT1kYi1lYjtjW1M+PjJdPWZiLWdiO0pjKERhLEthLEphKyhoYioxNjB8MCkrNDB8MCk7SmMoQ2EsQ2EsSmErKGhiKjE2MHwwKXwwKTtKYyhCYSxKYSsoaGIqMTYwfDApKzEyMHwwLEdhKTtKYyhLYSxGYSxKYSsoaGIqMTYwfDApKzgwfDApO2hiPWNbS2E+PjJdPDwxO2diPWNbQj4+Ml08PDE7ZmI9Y1tDPj4yXTw8MTtlYj1jW0Q+PjJdPDwxO2RiPWNbRT4+Ml08PDE7Y2I9Y1tGPj4yXTw8MTtiYj1jW0c+PjJdPDwxO2FiPWNbSD4+Ml08PDE7JGE9Y1tJPj4yXTw8MTtfYT1jW0o+PjJdPDwxO2Nbaz4+Ml09aGI7Y1thYT4+Ml09Z2I7Y1tiYT4+Ml09ZmI7Y1tjYT4+Ml09ZWI7Y1tkYT4+Ml09ZGI7Y1tlYT4+Ml09Y2I7Y1tmYT4+Ml09YmI7Y1tnYT4+Ml09YWI7Y1toYT4+Ml09JGE7Y1tpYT4+Ml09X2E7cWI9Y1tEYT4+Ml18MDtvYj1jW2phPj4yXXwwO21iPWNba2E+PjJdfDA7a2I9Y1tsYT4+Ml18MDtpYj1jW21hPj4yXXwwO1JhPWNbbmE+PjJdfDA7VGE9Y1tvYT4+Ml18MDtWYT1jW3BhPj4yXXwwO1hhPWNbcWE+PjJdfDA7WmE9Y1tyYT4+Ml18MDtyYj1jW0NhPj4yXXwwO3BiPWNbSz4+Ml18MDtuYj1jW0w+PjJdfDA7bGI9Y1tNPj4yXXwwO2piPWNbTj4+Ml18MDtnPWNbTz4+Ml18MDtTYT1jW1A+PjJdfDA7VWE9Y1tRPj4yXXwwO1dhPWNbUj4+Ml18MDtZYT1jW1M+PjJdfDA7Y1tLYT4+Ml09cWItcmI7Y1tCPj4yXT1vYi1wYjtjW0M+PjJdPW1iLW5iO2NbRD4+Ml09a2ItbGI7Y1tFPj4yXT1pYi1qYjtjW0Y+PjJdPVJhLWc7Y1tHPj4yXT1UYS1TYTtjW0g+PjJdPVZhLVVhO2NbST4+Ml09WGEtV2E7Y1tKPj4yXT1aYS1ZYTtjW0NhPj4yXT1yYitxYjtjW0s+PjJdPXBiK29iO2NbTD4+Ml09bmIrbWI7Y1tNPj4yXT1sYitrYjtjW04+PjJdPWpiK2liO2NbTz4+Ml09ZytSYTtjW1A+PjJdPVNhK1RhO2NbUT4+Ml09VWErVmE7Y1tSPj4yXT1XYStYYTtjW1M+PjJdPVlhK1phO1phPWNbQmE+PjJdfDA7WWE9Y1tzYT4+Ml18MDtYYT1jW3RhPj4yXXwwO1dhPWNbdWE+PjJdfDA7VmE9Y1t2YT4+Ml18MDtVYT1jW3dhPj4yXXwwO1RhPWNbeGE+PjJdfDA7U2E9Y1t5YT4+Ml18MDtSYT1jW3phPj4yXXwwO2c9Y1tBYT4+Ml18MDtjW0RhPj4yXT1oYi1aYTtjW2phPj4yXT1nYi1ZYTtjW2thPj4yXT1mYi1YYTtjW2xhPj4yXT1lYi1XYTtjW21hPj4yXT1kYi1WYTtjW25hPj4yXT1jYi1VYTtjW29hPj4yXT1iYi1UYTtjW3BhPj4yXT1hYi1TYTtjW3FhPj4yXT0kYS1SYTtjW3JhPj4yXT1fYS1nO1lhPVlhKyhjW2FhPj4yXXwwKXwwO1hhPVhhKyhjW2JhPj4yXXwwKXwwO1dhPVdhKyhjW2NhPj4yXXwwKXwwO1ZhPVZhKyhjW2RhPj4yXXwwKXwwO1VhPVVhKyhjW2VhPj4yXXwwKXwwO1RhPVRhKyhjW2ZhPj4yXXwwKXwwO1NhPVNhKyhjW2dhPj4yXXwwKXwwO1JhPVJhKyhjW2hhPj4yXXwwKXwwO2c9ZysoY1tpYT4+Ml18MCl8MDtjW0JhPj4yXT1aYSsoY1trPj4yXXwwKTtjW3NhPj4yXT1ZYTtjW3RhPj4yXT1YYTtjW3VhPj4yXT1XYTtjW3ZhPj4yXT1WYTtjW3dhPj4yXT1VYTtjW3hhPj4yXT1UYTtjW3lhPj4yXT1TYTtjW3phPj4yXT1SYTtjW0FhPj4yXT1nfX1lbHNle0pjKExhLEthLEJhKTtKYyhFYSxDYSxEYSk7SmMoRmEsRGEsQmEpO0pjKEdhLEthLENhKTtNYyhLYSxMYSxKYSsoKChnPDwyND4+MjR8MCkvMnwwKSoxNjB8MCl8MCl9Zz1hW09hK2Y+PjBdfDA7aWYoZzw8MjQ+PjI0PD0wKXtpZihnPDwyND4+MjQ8MCl7SmMoTGEsS2EsQmEpO0pjKEVhLENhLERhKTtKYyhGYSxEYSxCYSk7SmMoR2EsS2EsQ2EpO19hPShnPDwyND4+MjR8MCkvLTJ8MDtnPWNbRWE+PjJdfDA7a2I9Y1tsPj4yXXwwO29iPWNbbT4+Ml18MDtaYT1jW24+PjJdfDA7VmE9Y1tlPj4yXXwwO1JhPWNbaD4+Ml18MDtnYj1jW28+PjJdfDA7ZWI9Y1twPj4yXXwwO2NiPWNbcT4+Ml18MDthYj1jW3I+PjJdfDA7aWI9Y1tMYT4+Ml18MDttYj1jW3M+PjJdfDA7cWI9Y1t0Pj4yXXwwO1hhPWNbdT4+Ml18MDtUYT1jW3Y+PjJdfDA7aGI9Y1t3Pj4yXXwwO2ZiPWNbeD4+Ml18MDtkYj1jW3k+PjJdfDA7YmI9Y1t6Pj4yXXwwOyRhPWNbQT4+Ml18MDtjW0thPj4yXT1pYitnO2NbQj4+Ml09bWIra2I7Y1tDPj4yXT1xYitvYjtjW0Q+PjJdPVhhK1phO2NbRT4+Ml09VGErVmE7Y1tGPj4yXT1oYitSYTtjW0c+PjJdPWZiK2diO2NbSD4+Ml09ZGIrZWI7Y1tJPj4yXT1iYitjYjtjW0o+PjJdPSRhK2FiO2NbQ2E+PjJdPWctaWI7Y1tLPj4yXT1rYi1tYjtjW0w+PjJdPW9iLXFiO2NbTT4+Ml09WmEtWGE7Y1tOPj4yXT1WYS1UYTtjW08+PjJdPVJhLWhiO2NbUD4+Ml09Z2ItZmI7Y1tRPj4yXT1lYi1kYjtjW1I+PjJdPWNiLWJiO2NbUz4+Ml09YWItJGE7SmMoRGEsS2EsMTA0KyhfYSoxMjB8MCkrNDB8MCk7SmMoQ2EsQ2EsMTA0KyhfYSoxMjB8MCl8MCk7SmMoQmEsMTA0KyhfYSoxMjB8MCkrODB8MCxHYSk7X2E9Y1tGYT4+Ml08PDE7JGE9Y1tUPj4yXTw8MTthYj1jW1U+PjJdPDwxO2JiPWNbVj4+Ml08PDE7Y2I9Y1tXPj4yXTw8MTtkYj1jW1g+PjJdPDwxO2ViPWNbWT4+Ml08PDE7ZmI9Y1taPj4yXTw8MTtnYj1jW18+PjJdPDwxO2hiPWNbJD4+Ml08PDE7Y1trPj4yXT1fYTtjW2FhPj4yXT0kYTtjW2JhPj4yXT1hYjtjW2NhPj4yXT1iYjtjW2RhPj4yXT1jYjtjW2VhPj4yXT1kYjtjW2ZhPj4yXT1lYjtjW2dhPj4yXT1mYjtjW2hhPj4yXT1nYjtjW2lhPj4yXT1oYjtSYT1jW0RhPj4yXXwwO1RhPWNbamE+PjJdfDA7VmE9Y1trYT4+Ml18MDtYYT1jW2xhPj4yXXwwO1phPWNbbWE+PjJdfDA7cWI9Y1tuYT4+Ml18MDtvYj1jW29hPj4yXXwwO21iPWNbcGE+PjJdfDA7a2I9Y1txYT4+Ml18MDtpYj1jW3JhPj4yXXwwO2c9Y1tDYT4+Ml18MDtTYT1jW0s+PjJdfDA7VWE9Y1tMPj4yXXwwO1dhPWNbTT4+Ml18MDtZYT1jW04+PjJdfDA7cmI9Y1tPPj4yXXwwO3BiPWNbUD4+Ml18MDtuYj1jW1E+PjJdfDA7bGI9Y1tSPj4yXXwwO2piPWNbUz4+Ml18MDtjW0thPj4yXT1SYS1nO2NbQj4+Ml09VGEtU2E7Y1tDPj4yXT1WYS1VYTtjW0Q+PjJdPVhhLVdhO2NbRT4+Ml09WmEtWWE7Y1tGPj4yXT1xYi1yYjtjW0c+PjJdPW9iLXBiO2NbSD4+Ml09bWItbmI7Y1tJPj4yXT1rYi1sYjtjW0o+PjJdPWliLWpiO2NbQ2E+PjJdPWcrUmE7Y1tLPj4yXT1TYStUYTtjW0w+PjJdPVVhK1ZhO2NbTT4+Ml09V2ErWGE7Y1tOPj4yXT1ZYStaYTtjW08+PjJdPXJiK3FiO2NbUD4+Ml09cGIrb2I7Y1tRPj4yXT1uYittYjtjW1I+PjJdPWxiK2tiO2NbUz4+Ml09amIraWI7aWI9Y1tCYT4+Ml18MDtqYj1jW3NhPj4yXXwwO2tiPWNbdGE+PjJdfDA7bGI9Y1t1YT4+Ml18MDttYj1jW3ZhPj4yXXwwO25iPWNbd2E+PjJdfDA7b2I9Y1t4YT4+Ml18MDtwYj1jW3lhPj4yXXwwO3FiPWNbemE+PjJdfDA7cmI9Y1tBYT4+Ml18MDtjW0RhPj4yXT1fYS1pYjtjW2phPj4yXT0kYS1qYjtjW2thPj4yXT1hYi1rYjtjW2xhPj4yXT1iYi1sYjtjW21hPj4yXT1jYi1tYjtjW25hPj4yXT1kYi1uYjtjW29hPj4yXT1lYi1vYjtjW3BhPj4yXT1mYi1wYjtjW3FhPj4yXT1nYi1xYjtjW3JhPj4yXT1oYi1yYjtqYj1qYisoY1thYT4+Ml18MCl8MDtrYj1rYisoY1tiYT4+Ml18MCl8MDtsYj1sYisoY1tjYT4+Ml18MCl8MDttYj1tYisoY1tkYT4+Ml18MCl8MDtuYj1uYisoY1tlYT4+Ml18MCl8MDtvYj1vYisoY1tmYT4+Ml18MCl8MDtwYj1wYisoY1tnYT4+Ml18MCl8MDtxYj1xYisoY1toYT4+Ml18MCl8MDtyYj1yYisoY1tpYT4+Ml18MCl8MDtjW0JhPj4yXT1pYisoY1trPj4yXXwwKTtjW3NhPj4yXT1qYjtjW3RhPj4yXT1rYjtjW3VhPj4yXT1sYjtjW3ZhPj4yXT1tYjtjW3dhPj4yXT1uYjtjW3hhPj4yXT1vYjtjW3lhPj4yXT1wYjtjW3phPj4yXT1xYjtjW0FhPj4yXT1yYn19ZWxzZXtKYyhMYSxLYSxCYSk7SmMoRWEsQ2EsRGEpO0pjKEZhLERhLEJhKTtKYyhHYSxLYSxDYSk7T2MoS2EsTGEsMTA0KygoKGc8PDI0Pj4yNHwwKS8yfDApKjEyMHwwKXwwKX1KYyhqLEthLEJhKTtKYyhIYSxDYSxEYSk7SmMoSWEsRGEsQmEpO2lmKChmfDApPjApZj1mKy0xfDA7ZWxzZSBicmVha319SWMoayxJYSk7SmMoTmEsaixrKTtKYyhPYSxIYSxrKTtMYyhQYSxPYSk7TGMoTWEsTmEpO2o9UGErMzF8MDthW2o+PjBdPWRbaj4+MF1eZFtNYT4+MF08PDc7aj1ZYyhQYSxiKXwwO2s9KFBhfDApPT0oYnwwKTtmPTA7Zz0wO2Rve2Y9YVtQYStnPj4wXV5hW2IrZz4+MF18ZjtnPWcrMXwwfXdoaWxlKChnfDApIT0zMik7cmI9KGs/LTE6ail8KCgoZiYyNTUpKzUxMXwwKT4+PjgmMSkrLTE7aT1RYTtyZXR1cm4gcmJ8MH1mdW5jdGlvbiBXYyhiKXtiPWJ8MDt2YXIgYz0wLGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTAsaWE9MCxqYT0wLGthPTAsbGE9MCxtYT0wLG5hPTAsb2E9MCxwYT0wLHFhPTAscmE9MCxzYT0wLHRhPTAsdWE9MCx2YT0wLHdhPTAseGE9MCx5YT0wLHphPTAsQWE9MCxCYT0wLENhPTAsRGE9MCxFYT0wLEZhPTAsR2E9MCxIYT0wLElhPTAsSmE9MCxLYT0wLExhPTAsTWE9MCxOYT0wLE9hPTAsUGE9MCxRYT0wLFJhPTAsU2E9MCxUYT0wLFVhPTAsVmE9MCxXYT0wLFhhPTAsWWE9MCxaYT0wLF9hPTAsJGE9MCxhYj0wLGJiPTAsY2I9MCxkYj0wLGViPTAsZmI9MCxnYj0wO2VhPWIrMXwwO2JhPWIrMnwwO0Q9YVtiYT4+MF18MDtmPWRbYj4+MF18MDtuPUhkKGRbZWE+PjBdfDB8MCwwLDgpfDA7dmE9QztEPUQmMjU1O1Y9SGQoRHwwLDAsMTYpfDA7YWE9YiszfDA7eT1IZChkW2FhPj4wXXwwfDAsMCw4KXwwO2dhPUM7JD1iKzR8MDtVPUhkKGRbJD4+MF18MHwwLDAsMTYpfDA7Z2E9Z2F8QztZPWIrNXwwO049ZFtZPj4wXXwwO1g9SGQoTnwwLDAsMjQpfDA7Z2E9R2QoeXxEfFV8WHwwLGdhfEN8MCw1KXwwO1g9Yis2fDA7VT1iKzd8MDtEPWFbVT4+MF18MDt5PUhkKGRbWD4+MF18MHwwLDAsOCl8MDtCYT1DO0Q9RCYyNTU7VD1IZChEfDAsMCwxNil8MDtCYT1HZCh5fE58VHwwLEJhfEN8MCwyKXwwO1Q9Yis4fDA7Tj1IZChkW1Q+PjBdfDB8MCwwLDgpfDA7eT1DO1M9Yis5fDA7Q2E9SGQoZFtTPj4wXXwwfDAsMCwxNil8MDt5PXl8QztQPWIrMTB8MDtTYT1kW1A+PjBdfDA7Tz1IZChTYXwwLDAsMjQpfDA7eT1HZChOfER8Q2F8T3wwLHl8Q3wwLDcpfDA7Tz1iKzExfDA7Q2E9SGQoZFtPPj4wXXwwfDAsMCw4KXwwO0Q9QztOPWIrMTJ8MDtHPUhkKGRbTj4+MF18MHwwLDAsMTYpfDA7RD1EfEM7Sz1iKzEzfDA7dT1kW0s+PjBdfDA7Sj1IZCh1fDAsMCwyNCl8MDtEPUdkKENhfFNhfEd8SnwwLER8Q3wwLDQpfDA7Sj1iKzE0fDA7Rz1iKzE1fDA7U2E9YVtHPj4wXXwwO0NhPUhkKGRbSj4+MF18MHwwLDAsOCl8MDtEYT1DO1NhPVNhJjI1NTtGPUhkKFNhfDAsMCwxNil8MDtEYT1HZChDYXx1fEZ8MCxEYXxDfDAsMSl8MDtGPWIrMTZ8MDt1PUhkKGRbRj4+MF18MHwwLDAsOCl8MDtDYT1DO0U9YisxN3wwO3c9SGQoZFtFPj4wXXwwfDAsMCwxNil8MDtDYT1DYXxDO0E9YisxOHwwO3Y9ZFtBPj4wXXwwO3o9SGQodnwwLDAsMjQpfDA7Q2E9R2QodXxTYXx3fHp8MCxDYXxDfDAsNil8MDt6PWIrMTl8MDt3PWIrMjB8MDtTYT1hW3c+PjBdfDA7dT1IZChkW3o+PjBdfDB8MCwwLDgpfDA7VGE9QztTYT1IZChTYSYyNTV8MCwwLDE2KXwwO1RhPUdkKHV8dnxTYXwwLFRhfEN8MCwzKXwwO1NhPUM7dj1iKzIxfDA7dT1iKzIyfDA7cj1iKzIzfDA7bmE9YVtyPj4wXXwwO2FiPWRbdj4+MF18MDtiYj1IZChkW3U+PjBdfDB8MCwwLDgpfDA7X2E9QztuYT1uYSYyNTU7JGE9SGQobmF8MCwwLDE2KXwwO3E9YisyNHwwO0thPUhkKGRbcT4+MF18MHwwLDAsOCl8MDtQYT1DO3A9YisyNXwwO2k9SGQoZFtwPj4wXXwwfDAsMCwxNil8MDtQYT1QYXxDO209YisyNnwwO3hhPWRbbT4+MF18MDtsPUhkKHhhfDAsMCwyNCl8MDtQYT1HZChLYXxuYXxpfGx8MCxQYXxDfDAsNSl8MDtsPWIrMjd8MDtpPWIrMjh8MDtuYT1hW2k+PjBdfDA7S2E9SGQoZFtsPj4wXXwwfDAsMCw4KXwwO1phPUM7bmE9bmEmMjU1O2g9SGQobmF8MCwwLDE2KXwwO1phPUdkKEthfHhhfGh8MCxaYXxDfDAsMil8MDtoPWIrMjl8MDt4YT1IZChkW2g+PjBdfDB8MCwwLDgpfDA7S2E9QztnPWIrMzB8MDtmYj1IZChkW2c+PjBdfDB8MCwwLDE2KXwwO0thPUthfEM7Yz1iKzMxfDA7cWE9ZFtjPj4wXXwwO29hPUhkKHFhfDAsMCwyNCl8MDtLYT1HZCh4YXxuYXxmYnxvYXwwLEthfEN8MCw3KXwwO29hPUhkKGRbYiszMj4+MF18MHwwLDAsOCl8MDtmYj1DO25hPUhkKGRbYiszMz4+MF18MHwwLDAsMTYpfDA7ZmI9ZmJ8Qzt4YT1kW2IrMzQ+PjBdfDA7bGE9SGQoeGF8MCwwLDI0KXwwO2ZiPUdkKG9hfHFhfG5hfGxhfDAsZmJ8Q3wwLDQpfDA7bGE9YVtiKzM2Pj4wXXwwO25hPUhkKGRbYiszNT4+MF18MHwwLDAsOCl8MDtxYT1DO2xhPWxhJjI1NTtvYT1IZChsYXwwLDAsMTYpfDA7cWE9R2QobmF8eGF8b2F8MCxxYXxDfDAsMSl8MDtvYT1IZChkW2IrMzc+PjBdfDB8MCwwLDgpfDA7eGE9QztuYT1IZChkW2IrMzg+PjBdfDB8MCwwLDE2KXwwO3hhPXhhfEM7TWE9ZFtiKzM5Pj4wXXwwO2ZhPUhkKE1hfDAsMCwyNCl8MDt4YT1HZChvYXxsYXxuYXxmYXwwLHhhfEN8MCw2KXwwO2ZhPWFbYis0MT4+MF18MDtuYT1IZChkW2IrNDA+PjBdfDB8MCwwLDgpfDA7bGE9QztmYT1IZChmYSYyNTV8MCwwLDE2KXwwO2xhPUdkKG5hfE1hfGZhfDAsbGF8Q3wwLDMpfDA7ZmE9QztNYT1hW2IrNDQ+PjBdfDA7bmE9ZFtiKzQyPj4wXXwwO29hPUhkKGRbYis0Mz4+MF18MHwwLDAsOCl8MDtqPUM7TWE9TWEmMjU1O3phPUhkKE1hfDAsMCwxNil8MDtqYT1IZChkW2IrNDU+PjBdfDB8MCwwLDgpfDA7TD1DO1c9SGQoZFtiKzQ2Pj4wXXwwfDAsMCwxNil8MDtMPUx8QztnYj1kW2IrNDc+PjBdfDA7bz1IZChnYnwwLDAsMjQpfDA7TD1HZChqYXxNYXxXfG98MCxMfEN8MCw1KXwwO289YVtiKzQ5Pj4wXXwwO1c9SGQoZFtiKzQ4Pj4wXXwwfDAsMCw4KXwwO01hPUM7bz1vJjI1NTtqYT1IZChvfDAsMCwxNil8MDtNYT1HZChXfGdifGphfDAsTWF8Q3wwLDIpfDA7TWE9TWEmMjA5NzE1MTtqYT1IZChkW2IrNTA+PjBdfDB8MCwwLDgpfDA7Z2I9QztXPUhkKGRbYis1MT4+MF18MHwwLDAsMTYpfDA7Z2I9Z2J8QztBYT1kW2IrNTI+PjBdfDA7TT1IZChBYXwwLDAsMjQpfDA7Z2I9R2QoamF8b3xXfE18MCxnYnxDfDAsNyl8MDtnYj1nYiYyMDk3MTUxO009SGQoZFtiKzUzPj4wXXwwfDAsMCw4KXwwO1c9QztvPUhkKGRbYis1ND4+MF18MHwwLDAsMTYpfDA7Vz1XfEM7amE9ZFtiKzU1Pj4wXXwwO1I9SGQoamF8MCwwLDI0KXwwO1c9R2QoTXxBYXxvfFJ8MCxXfEN8MCw0KXwwO1c9VyYyMDk3MTUxO1I9YVtiKzU3Pj4wXXwwO289SGQoZFtiKzU2Pj4wXXwwfDAsMCw4KXwwO0FhPUM7Uj1SJjI1NTtNPUhkKFJ8MCwwLDE2KXwwO0FhPUdkKG98amF8TXwwLEFhfEN8MCwxKXwwO0FhPUFhJjIwOTcxNTE7TT1IZChkW2IrNTg+PjBdfDB8MCwwLDgpfDA7amE9QztvPUhkKGRbYis1OT4+MF18MHwwLDAsMTYpfDA7amE9amF8QztoYT1kW2IrNjA+PjBdfDA7UT1IZChoYXwwLDAsMjQpfDA7amE9R2QoTXxSfG98UXwwLGphfEN8MCw2KXwwO2phPWphJjIwOTcxNTE7UT1IZChkW2IrNjE+PjBdfDB8MCwwLDgpfDA7bz1DO1I9SGQoZFtiKzYyPj4wXXwwfDAsMCwxNil8MDtvPW98QztNPUhkKGRbYis2Mz4+MF18MHwwLDAsMjQpfDA7bz1HZChRfGhhfFJ8TXwwLG98Q3wwLDMpfDA7TT1DO1I9T2Qob3wwLE18MCw2NjY2NDMsMCl8MDtoYT1DO1E9T2Qob3wwLE18MCw0NzAyOTYsMCl8MDtJPUM7Y2E9T2Qob3wwLE18MCw2NTQxODMsMCl8MDt0YT1DO0VhPU9kKG98MCxNfDAsLTk5NzgwNSwtMSl8MDt0PUM7az1PZChvfDAsTXwwLDEzNjY1NywwKXwwO0I9QztNPU9kKG98MCxNfDAsLTY4MzkwMSwtMSl8MDtqPURkKE18MCxDfDAsb2F8bmF8emEmMjAzMTYxNnwwLGp8MCl8MDt6YT1DO25hPU9kKGphfDAsMCw2NjY2NDMsMCl8MDtvYT1DO009T2QoamF8MCwwLDQ3MDI5NiwwKXwwO289QztWYT1PZChqYXwwLDAsNjU0MTgzLDApfDA7cz1DO21hPU9kKGphfDAsMCwtOTk3ODA1LC0xKXwwO189Qzt5YT1PZChqYXwwLDAsMTM2NjU3LDApfDA7c2E9QztqYT1PZChqYXwwLDAsLTY4MzkwMSwtMSl8MDtIPUM7ZT1PZChBYXwwLDAsNjY2NjQzLDApfDA7cmE9Qzt3YT1PZChBYXwwLDAsNDcwMjk2LDApfDA7TGE9QztGYT1PZChBYXwwLDAsNjU0MTgzLDApfDA7ZGE9QztjYj1PZChBYXwwLDAsLTk5NzgwNSwtMSl8MDtVYT1DO2thPU9kKEFhfDAsMCwxMzY2NTcsMCl8MDt4PUM7QWE9T2QoQWF8MCwwLC02ODM5MDEsLTEpfDA7eGE9RGQoQWF8MCxDfDAseGEmMjA5NzE1MXwwLDApfDA7c2E9RGQoeGF8MCxDfDAseWF8MCxzYXwwKXwwO3Q9RGQoc2F8MCxDfDAsRWF8MCx0fDApfDA7RWE9QztzYT1PZChXfDAsMCw2NjY2NDMsMCl8MDt5YT1DO3hhPU9kKFd8MCwwLDQ3MDI5NiwwKXwwO0FhPUM7V2E9T2QoV3wwLDAsNjU0MTgzLDApfDA7Wj1DO0hhPU9kKFd8MCwwLC05OTc4MDUsLTEpfDA7R2E9QztlYj1PZChXfDAsMCwxMzY2NTcsMCl8MDtkYj1DO1c9T2QoV3wwLDAsLTY4MzkwMSwtMSl8MDtwYT1DO2lhPU9kKGdifDAsMCw2NjY2NDMsMCl8MDt1YT1DO1FhPU9kKGdifDAsMCw0NzAyOTYsMCl8MDtSYT1DO09hPU9kKGdifDAsMCw2NTQxODMsMCl8MDtOYT1DO1lhPU9kKGdifDAsMCwtOTk3ODA1LC0xKXwwO1hhPUM7SmE9T2QoZ2J8MCwwLDEzNjY1NywwKXwwO0lhPUM7Z2I9T2QoZ2J8MCwwLC02ODM5MDEsLTEpfDA7ZmI9RGQoZ2J8MCxDfDAsZmImMjA5NzE1MXwwLDApfDA7ZGI9RGQoZmJ8MCxDfDAsZWJ8MCxkYnwwKXwwO1VhPURkKGRifDAsQ3wwLGNifDAsVWF8MCl8MDtzPURkKFVhfDAsQ3wwLFZhfDAsc3wwKXwwO0k9RGQoc3wwLEN8MCxRfDAsSXwwKXwwO1E9QztzPU9kKE1hfDAsMCw2NjY2NDMsMCl8MDtDYT1EZChzfDAsQ3wwLENhJjIwOTcxNTF8MCwwKXwwO3M9QztWYT1PZChNYXwwLDAsNDcwMjk2LDApfDA7VWE9QztjYj1PZChNYXwwLDAsNjU0MTgzLDApfDA7X2E9RGQoY2J8MCxDfDAsYmJ8YWJ8JGEmMjAzMTYxNnwwLF9hfDApfDA7UmE9RGQoX2F8MCxDfDAsUWF8MCxSYXwwKXwwO3lhPURkKFJhfDAsQ3wwLHNhfDAseWF8MCl8MDtzYT1DO1JhPU9kKE1hfDAsMCwtOTk3ODA1LC0xKXwwO1FhPUM7X2E9T2QoTWF8MCwwLDEzNjY1NywwKXwwO1phPURkKF9hfDAsQ3wwLFphJjIwOTcxNTF8MCwwKXwwO1hhPURkKFphfDAsQ3wwLFlhfDAsWGF8MCl8MDtaPURkKFhhfDAsQ3wwLFdhfDAsWnwwKXwwO0xhPURkKFp8MCxDfDAsd2F8MCxMYXwwKXwwO29hPURkKExhfDAsQ3wwLG5hfDAsb2F8MCl8MDtuYT1DO01hPU9kKE1hfDAsMCwtNjgzOTAxLC0xKXwwO0xhPUM7d2E9RGQoQ2F8MCxzfDAsMTA0ODU3NiwwKXwwO3dhPUdkKHdhfDAsQ3wwLDIxKXwwO1o9QztTYT1EZChWYXwwLFVhfDAsVGF8MCxTYXwwKXwwO1NhPURkKFNhfDAsQ3wwLHdhfDAsWnwwKXwwO3VhPURkKFNhfDAsQ3wwLGlhfDAsdWF8MCl8MDtpYT1DO1o9SGQod2F8MCxafDAsMjEpfDA7Wj1DZChDYXwwLHN8MCxafDAsQ3wwKXwwO3M9QztDYT1EZCh5YXwwLHNhfDAsMTA0ODU3NiwwKXwwO0NhPUdkKENhfDAsQ3wwLDIxKXwwO3dhPUM7UGE9RGQoUmF8MCxRYXwwLFBhJjIwOTcxNTF8MCwwKXwwO05hPURkKFBhfDAsQ3wwLE9hfDAsTmF8MCl8MDtBYT1EZChOYXwwLEN8MCx4YXwwLEFhfDApfDA7cmE9RGQoQWF8MCxDfDAsZXwwLHJhfDApfDA7cmE9RGQocmF8MCxDfDAsQ2F8MCx3YXwwKXwwO2U9Qzt3YT1IZChDYXwwLHdhfDAsMjEpfDA7Q2E9QztBYT1EZChvYXwwLG5hfDAsMTA0ODU3NiwwKXwwO0FhPUVkKEFhfDAsQ3wwLDIxKXwwO3hhPUM7S2E9RGQoTWF8MCxMYXwwLEthJjIwOTcxNTF8MCwwKXwwO0lhPURkKEthfDAsQ3wwLEphfDAsSWF8MCl8MDtHYT1EZChJYXwwLEN8MCxIYXwwLEdhfDApfDA7ZGE9RGQoR2F8MCxDfDAsRmF8MCxkYXwwKXwwO289RGQoZGF8MCxDfDAsTXwwLG98MCl8MDtoYT1EZChvfDAsQ3wwLFJ8MCxoYXwwKXwwO2hhPURkKGhhfDAsQ3wwLEFhfDAseGF8MCl8MDtSPUM7eGE9SGQoQWF8MCx4YXwwLDIxKXwwO0FhPUM7bz1EZChJfDAsUXwwLDEwNDg1NzYsMCl8MDtvPUVkKG98MCxDfDAsMjEpfDA7TT1DO3FhPURkKFd8MCxwYXwwLHFhJjIwOTcxNTF8MCwwKXwwO3g9RGQocWF8MCxDfDAsa2F8MCx4fDApfDA7Xz1EZCh4fDAsQ3wwLG1hfDAsX3wwKXwwO3RhPURkKF98MCxDfDAsY2F8MCx0YXwwKXwwO3RhPURkKHRhfDAsQ3wwLG98MCxNfDApfDA7Y2E9QztNPUhkKG98MCxNfDAsMjEpfDA7TT1DZChJfDAsUXwwLE18MCxDfDApfDA7UT1DO0k9RGQodHwwLEVhfDAsMTA0ODU3NiwwKXwwO0k9RWQoSXwwLEN8MCwyMSl8MDtvPUM7ZmE9RGQoamF8MCxIfDAsbGF8MCxmYXwwKXwwO0I9RGQoZmF8MCxDfDAsa3wwLEJ8MCl8MDtCPURkKEJ8MCxDfDAsSXwwLG98MCl8MDtrPUM7bz1IZChJfDAsb3wwLDIxKXwwO289Q2QodHwwLEVhfDAsb3wwLEN8MCl8MDtFYT1DO3Q9RGQoanwwLHphfDAsMTA0ODU3NiwwKXwwO3Q9RWQodHwwLEN8MCwyMSl8MDtJPUM7TD1EZCh0fDAsSXwwLEwmMjA5NzE1MXwwLDApfDA7ZmE9QztJPUhkKHR8MCxJfDAsMjEpfDA7ST1DZChqfDAsemF8MCxJfDAsQ3wwKXwwO3phPUM7aj1EZCh1YXwwLGlhfDAsMTA0ODU3NiwwKXwwO2o9R2QoanwwLEN8MCwyMSl8MDt0PUM7bGE9SGQoanwwLHR8MCwyMSl8MDtsYT1DZCh1YXwwLGlhfDAsbGF8MCxDfDApfDA7aWE9Qzt1YT1EZChyYXwwLGV8MCwxMDQ4NTc2LDApfDA7dWE9RWQodWF8MCxDfDAsMjEpfDA7SD1DO2phPUhkKHVhfDAsSHwwLDIxKXwwO2phPUNkKHJhfDAsZXwwLGphfDAsQ3wwKXwwO2U9QztyYT1EZChoYXwwLFJ8MCwxMDQ4NTc2LDApfDA7cmE9RWQocmF8MCxDfDAsMjEpfDA7Xz1DO1E9RGQoTXwwLFF8MCxyYXwwLF98MCl8MDtNPUM7Xz1IZChyYXwwLF98MCwyMSl8MDtfPUNkKGhhfDAsUnwwLF98MCxDfDApfDA7Uj1DO2hhPURkKHRhfDAsY2F8MCwxMDQ4NTc2LDApfDA7aGE9RWQoaGF8MCxDfDAsMjEpfDA7cmE9QztFYT1EZChoYXwwLHJhfDAsb3wwLEVhfDApfDA7bz1DO3JhPUhkKGhhfDAscmF8MCwyMSl8MDtyYT1DZCh0YXwwLGNhfDAscmF8MCxDfDApfDA7Y2E9Qzt0YT1EZChCfDAsa3wwLDEwNDg1NzYsMCl8MDt0YT1FZCh0YXwwLEN8MCwyMSl8MDtoYT1DO3phPURkKHRhfDAsaGF8MCxJfDAsemF8MCl8MDtJPUM7aGE9SGQodGF8MCxoYXwwLDIxKXwwO2hhPUNkKEJ8MCxrfDAsaGF8MCxDfDApfDA7az1DO0I9T2QoTHwwLGZhfDAsNjY2NjQzLDApfDA7RGE9RGQoQnwwLEN8MCxEYSYyMDk3MTUxfDAsMCl8MDtCPUM7dGE9T2QoTHwwLGZhfDAsNDcwMjk2LDApfDA7dGE9RGQoWnwwLHN8MCx0YXwwLEN8MCl8MDtzPUM7Wj1PZChMfDAsZmF8MCw2NTQxODMsMCl8MDtaPURkKGxhfDAsaWF8MCxafDAsQ3wwKXwwO2lhPUM7bGE9T2QoTHwwLGZhfDAsLTk5NzgwNSwtMSl8MDttYT1DO3g9T2QoTHwwLGZhfDAsMTM2NjU3LDApfDA7eD1EZChqYXwwLGV8MCx4fDAsQ3wwKXwwO2U9QztmYT1PZChMfDAsZmF8MCwtNjgzOTAxLC0xKXwwO0w9QztIPURkKG9hfDAsbmF8MCx1YXwwLEh8MCl8MDtBYT1DZChIfDAsQ3wwLHhhfDAsQWF8MCl8MDtMPURkKEFhfDAsQ3wwLGZhfDAsTHwwKXwwO2ZhPUM7QWE9T2QoemF8MCxJfDAsNjY2NjQzLDApfDA7RD1EZChBYXwwLEN8MCxEJjIwOTcxNTF8MCwwKXwwO0FhPUM7eGE9T2QoemF8MCxJfDAsNDcwMjk2LDApfDA7eGE9RGQoRGF8MCxCfDAseGF8MCxDfDApfDA7Qj1DO0RhPU9kKHphfDAsSXwwLDY1NDE4MywwKXwwO0RhPURkKHRhfDAsc3wwLERhfDAsQ3wwKXwwO3M9Qzt0YT1PZCh6YXwwLEl8MCwtOTk3ODA1LC0xKXwwO3RhPURkKFp8MCxpYXwwLHRhfDAsQ3wwKXwwO2lhPUM7Wj1PZCh6YXwwLEl8MCwxMzY2NTcsMCl8MDtIPUM7ST1PZCh6YXwwLEl8MCwtNjgzOTAxLC0xKXwwO0k9RGQoeHwwLGV8MCxJfDAsQ3wwKXwwO2U9Qzt4PU9kKGhhfDAsa3wwLDY2NjY0MywwKXwwO3k9RGQoeHwwLEN8MCx5JjIwOTcxNTF8MCwwKXwwO3g9Qzt6YT1PZChoYXwwLGt8MCw0NzAyOTYsMCl8MDt6YT1EZChEfDAsQWF8MCx6YXwwLEN8MCl8MDtBYT1DO0Q9T2QoaGF8MCxrfDAsNjU0MTgzLDApfDA7RD1EZCh4YXwwLEJ8MCxEfDAsQ3wwKXwwO0I9Qzt4YT1PZChoYXwwLGt8MCwtOTk3ODA1LC0xKXwwO3hhPURkKERhfDAsc3wwLHhhfDAsQ3wwKXwwO3M9QztEYT1PZChoYXwwLGt8MCwxMzY2NTcsMCl8MDtEYT1EZCh0YXwwLGlhfDAsRGF8MCxDfDApfDA7aWE9QztrPU9kKGhhfDAsa3wwLC02ODM5MDEsLTEpfDA7aGE9Qzt0PURkKHlhfDAsc2F8MCxqfDAsdHwwKXwwO0NhPUNkKHR8MCxDfDAsd2F8MCxDYXwwKXwwO21hPURkKENhfDAsQ3wwLGxhfDAsbWF8MCl8MDtIPURkKG1hfDAsQ3wwLFp8MCxIfDApfDA7aGE9RGQoSHwwLEN8MCxrfDAsaGF8MCl8MDtrPUM7SD1PZChFYXwwLG98MCw2NjY2NDMsMCl8MDtaPUM7bWE9T2QoRWF8MCxvfDAsNDcwMjk2LDApfDA7bGE9QztDYT1PZChFYXwwLG98MCw2NTQxODMsMCl8MDt3YT1DO3Q9T2QoRWF8MCxvfDAsLTk5NzgwNSwtMSl8MDtqPUM7c2E9T2QoRWF8MCxvfDAsMTM2NjU3LDApfDA7c2E9RGQoeGF8MCxzfDAsc2F8MCxDfDApfDA7cz1DO289T2QoRWF8MCxvfDAsLTY4MzkwMSwtMSl8MDtvPURkKERhfDAsaWF8MCxvfDAsQ3wwKXwwO2lhPUM7RGE9T2QocmF8MCxjYXwwLDY2NjY0MywwKXwwO0VhPUM7eGE9T2QocmF8MCxjYXwwLDQ3MDI5NiwwKXwwO3lhPUM7dGE9T2QocmF8MCxjYXwwLDY1NDE4MywwKXwwO3VhPUM7bmE9T2QocmF8MCxjYXwwLC05OTc4MDUsLTEpfDA7b2E9QztqYT1PZChyYXwwLGNhfDAsMTM2NjU3LDApfDA7a2E9QztjYT1PZChyYXwwLGNhfDAsLTY4MzkwMSwtMSl8MDtjYT1EZChzYXwwLHN8MCxjYXwwLEN8MCl8MDtzPUM7c2E9T2QoUXwwLE18MCw2NjY2NDMsMCl8MDt2YT1EZChzYXwwLEN8MCxufGZ8ViYyMDMxNjE2fDAsdmF8MCl8MDtWPUM7Zj1PZChRfDAsTXwwLDQ3MDI5NiwwKXwwO249QztzYT1PZChRfDAsTXwwLDY1NDE4MywwKXwwO0JhPURkKHNhfDAsQ3wwLEJhJjIwOTcxNTF8MCwwKXwwO1o9RGQoQmF8MCxDfDAsSHwwLFp8MCl8MDt5YT1EZChafDAsQ3wwLHhhfDAseWF8MCl8MDt4YT1DO1o9T2QoUXwwLE18MCwtOTk3ODA1LC0xKXwwO0g9QztCYT1PZChRfDAsTXwwLDEzNjY1NywwKXwwO0JhPURkKHphfDAsQWF8MCxCYXwwLEN8MCl8MDt3YT1EZChCYXwwLEN8MCxDYXwwLHdhfDApfDA7b2E9RGQod2F8MCxDfDAsbmF8MCxvYXwwKXwwO25hPUM7TT1PZChRfDAsTXwwLC02ODM5MDEsLTEpfDA7UT1DO3dhPURkKHZhfDAsVnwwLDEwNDg1NzYsMCl8MDt3YT1FZCh3YXwwLEN8MCwyMSl8MDtDYT1DO2dhPURkKGZ8MCxufDAsZ2EmMjA5NzE1MXwwLDApfDA7RWE9RGQoZ2F8MCxDfDAsRGF8MCxFYXwwKXwwO0VhPURkKEVhfDAsQ3wwLHdhfDAsQ2F8MCl8MDtEYT1DO0NhPUhkKHdhfDAsQ2F8MCwyMSl8MDtDYT1DZCh2YXwwLFZ8MCxDYXwwLEN8MCl8MDtWPUM7dmE9RGQoeWF8MCx4YXwwLDEwNDg1NzYsMCl8MDt2YT1FZCh2YXwwLEN8MCwyMSl8MDt3YT1DO0g9RGQoeXwwLHh8MCxafDAsSHwwKXwwO2xhPURkKEh8MCxDfDAsbWF8MCxsYXwwKXwwO3VhPURkKGxhfDAsQ3wwLHRhfDAsdWF8MCl8MDt1YT1EZCh1YXwwLEN8MCx2YXwwLHdhfDApfDA7dGE9Qzt3YT1IZCh2YXwwLHdhfDAsMjEpfDA7dmE9QztsYT1EZChvYXwwLG5hfDAsMTA0ODU3NiwwKXwwO2xhPUVkKGxhfDAsQ3wwLDIxKXwwO21hPUM7UT1EZChEfDAsQnwwLE18MCxRfDApfDA7aj1EZChRfDAsQ3wwLHR8MCxqfDApfDA7a2E9RGQoanwwLEN8MCxqYXwwLGthfDApfDA7a2E9RGQoa2F8MCxDfDAsbGF8MCxtYXwwKXwwO2phPUM7bWE9SGQobGF8MCxtYXwwLDIxKXwwO2xhPUM7aj1EZChjYXwwLHN8MCwxMDQ4NTc2LDApfDA7aj1FZChqfDAsQ3wwLDIxKXwwO3Q9QztpYT1EZChvfDAsaWF8MCxqfDAsdHwwKXwwO289Qzt0PUhkKGp8MCx0fDAsMjEpfDA7dD1DZChjYXwwLHN8MCx0fDAsQ3wwKXwwO3M9QztjYT1EZChoYXwwLGt8MCwxMDQ4NTc2LDApfDA7Y2E9RWQoY2F8MCxDfDAsMjEpfDA7aj1DO2U9RGQoSXwwLGV8MCxjYXwwLGp8MCl8MDtJPUM7aj1IZChjYXwwLGp8MCwyMSl8MDtqPUNkKGhhfDAsa3wwLGp8MCxDfDApfDA7az1DO2hhPURkKEx8MCxmYXwwLDEwNDg1NzYsMCl8MDtoYT1FZChoYXwwLEN8MCwyMSl8MDtjYT1DO1I9RGQoX3wwLFJ8MCxoYXwwLGNhfDApfDA7Xz1DO2NhPUhkKGhhfDAsY2F8MCwyMSl8MDtjYT1DZChMfDAsZmF8MCxjYXwwLEN8MCl8MDtmYT1DO0w9RGQoRWF8MCxEYXwwLDEwNDg1NzYsMCl8MDtMPUVkKEx8MCxDfDAsMjEpfDA7aGE9QztRPUhkKEx8MCxoYXwwLDIxKXwwO009QztCPURkKHVhfDAsdGF8MCwxMDQ4NTc2LDApfDA7Qj1FZChCfDAsQ3wwLDIxKXwwO0Q9QztIPUhkKEJ8MCxEfDAsMjEpfDA7Wj1DO3g9RGQoa2F8MCxqYXwwLDEwNDg1NzYsMCl8MDt4PUVkKHh8MCxDfDAsMjEpfDA7eT1DO3M9RGQodHwwLHN8MCx4fDAseXwwKXwwO3Q9Qzt5PUhkKHh8MCx5fDAsMjEpfDA7eD1DO2dhPURkKGlhfDAsb3wwLDEwNDg1NzYsMCl8MDtnYT1FZChnYXwwLEN8MCwyMSl8MDtuPUM7az1EZChqfDAsa3wwLGdhfDAsbnwwKXwwO2o9QztuPUhkKGdhfDAsbnwwLDIxKXwwO249Q2QoaWF8MCxvfDAsbnwwLEN8MCl8MDtvPUM7aWE9RGQoZXwwLEl8MCwxMDQ4NTc2LDApfDA7aWE9RWQoaWF8MCxDfDAsMjEpfDA7Z2E9QztmYT1EZChjYXwwLGZhfDAsaWF8MCxnYXwwKXwwO2NhPUM7Z2E9SGQoaWF8MCxnYXwwLDIxKXwwO2dhPUNkKGV8MCxJfDAsZ2F8MCxDfDApfDA7ST1DO2U9RGQoUnwwLF98MCwxMDQ4NTc2LDApfDA7ZT1FZChlfDAsQ3wwLDIxKXwwO2lhPUM7Zj1IZChlfDAsaWF8MCwyMSl8MDtmPUNkKFJ8MCxffDAsZnwwLEN8MCl8MDtfPUM7Uj1PZChlfDAsaWF8MCw2NjY2NDMsMCl8MDtSPURkKENhfDAsVnwwLFJ8MCxDfDApfDA7Vj1DO0NhPU9kKGV8MCxpYXwwLDQ3MDI5NiwwKXwwO0JhPUM7QWE9T2QoZXwwLGlhfDAsNjU0MTgzLDApfDA7emE9QztzYT1PZChlfDAsaWF8MCwtOTk3ODA1LC0xKXwwO3JhPUM7cWE9T2QoZXwwLGlhfDAsMTM2NjU3LDApfDA7cGE9QztpYT1PZChlfDAsaWF8MCwtNjgzOTAxLC0xKXwwO2U9QztXPUVkKFJ8MCxWfDAsMjEpfDA7ZGE9QztCYT1EZChFYXwwLERhfDAsQ2F8MCxCYXwwKXwwO0JhPURkKEJhfDAsQ3wwLFd8MCxkYXwwKXwwO009Q2QoQmF8MCxDfDAsUXwwLE18MCl8MDtRPUM7ZGE9SGQoV3wwLGRhfDAsMjEpfDA7ZGE9Q2QoUnwwLFZ8MCxkYXwwLEN8MCl8MDtWPUM7Uj1FZChNfDAsUXwwLDIxKXwwO1c9Qzt4YT1EZChBYXwwLHphfDAseWF8MCx4YXwwKXwwO3ZhPUNkKHhhfDAsQ3wwLHdhfDAsdmF8MCl8MDtoYT1EZCh2YXwwLEN8MCxMfDAsaGF8MCl8MDtoYT1EZChoYXwwLEN8MCxSfDAsV3wwKXwwO0w9QztXPUhkKFJ8MCxXfDAsMjEpfDA7Vz1DZChNfDAsUXwwLFd8MCxDfDApfDA7UT1DO009RWQoaGF8MCxMfDAsMjEpfDA7Uj1DO3JhPURkKHVhfDAsdGF8MCxzYXwwLHJhfDApfDA7Wj1DZChyYXwwLEN8MCxIfDAsWnwwKXwwO1o9RGQoWnwwLEN8MCxNfDAsUnwwKXwwO0g9QztSPUhkKE18MCxSfDAsMjEpfDA7Uj1DZChoYXwwLEx8MCxSfDAsQ3wwKXwwO0w9QztoYT1FZChafDAsSHwwLDIxKXwwO009QztuYT1EZChxYXwwLHBhfDAsb2F8MCxuYXwwKXwwO2xhPUNkKG5hfDAsQ3wwLG1hfDAsbGF8MCl8MDtEPURkKGxhfDAsQ3wwLEJ8MCxEfDApfDA7RD1EZChEfDAsQ3wwLGhhfDAsTXwwKXwwO0I9QztNPUhkKGhhfDAsTXwwLDIxKXwwO009Q2QoWnwwLEh8MCxNfDAsQ3wwKXwwO0g9QztaPUVkKER8MCxCfDAsMjEpfDA7aGE9QztlPURkKGthfDAsamF8MCxpYXwwLGV8MCl8MDt4PUNkKGV8MCxDfDAseXwwLHh8MCl8MDt4PURkKHh8MCxDfDAsWnwwLGhhfDApfDA7eT1DO2hhPUhkKFp8MCxoYXwwLDIxKXwwO2hhPUNkKER8MCxCfDAsaGF8MCxDfDApfDA7Qj1DO0Q9RWQoeHwwLHl8MCwyMSl8MDtaPUM7dD1EZChzfDAsdHwwLER8MCxafDApfDA7cz1DO1o9SGQoRHwwLFp8MCwyMSl8MDtaPUNkKHh8MCx5fDAsWnwwLEN8MCl8MDt5PUM7eD1FZCh0fDAsc3wwLDIxKXwwO0Q9QztvPURkKHh8MCxEfDAsbnwwLG98MCl8MDtuPUM7RD1IZCh4fDAsRHwwLDIxKXwwO0Q9Q2QodHwwLHN8MCxEfDAsQ3wwKXwwO3M9Qzt0PUVkKG98MCxufDAsMjEpfDA7eD1DO2o9RGQoa3wwLGp8MCx0fDAseHwwKXwwO2s9Qzt4PUhkKHR8MCx4fDAsMjEpfDA7eD1DZChvfDAsbnwwLHh8MCxDfDApfDA7bj1DO289RWQoanwwLGt8MCwyMSl8MDt0PUM7ST1EZChvfDAsdHwwLGdhfDAsSXwwKXwwO2dhPUM7dD1IZChvfDAsdHwwLDIxKXwwO3Q9Q2QoanwwLGt8MCx0fDAsQ3wwKXwwO2s9QztqPUVkKEl8MCxnYXwwLDIxKXwwO289QztjYT1EZChmYXwwLGNhfDAsanwwLG98MCl8MDtmYT1DO289SGQoanwwLG98MCwyMSl8MDtvPUNkKEl8MCxnYXwwLG98MCxDfDApfDA7Z2E9QztJPUVkKGNhfDAsZmF8MCwyMSl8MDtqPUM7Xz1EZChJfDAsanwwLGZ8MCxffDApfDA7Zj1DO2o9SGQoSXwwLGp8MCwyMSl8MDtqPUNkKGNhfDAsZmF8MCxqfDAsQ3wwKXwwO2ZhPUM7Y2E9RWQoX3wwLGZ8MCwyMSl8MDtJPUM7ZT1IZChjYXwwLEl8MCwyMSl8MDtlPUNkKF98MCxmfDAsZXwwLEN8MCl8MDtmPUM7Xz1PZChjYXwwLEl8MCw2NjY2NDMsMCl8MDtWPURkKF98MCxDfDAsZGF8MCxWfDApfDA7ZGE9QztfPU9kKGNhfDAsSXwwLDQ3MDI5NiwwKXwwO189RGQoV3wwLFF8MCxffDAsQ3wwKXwwO1E9QztXPU9kKGNhfDAsSXwwLDY1NDE4MywwKXwwO1c9RGQoUnwwLEx8MCxXfDAsQ3wwKXwwO0w9QztSPU9kKGNhfDAsSXwwLC05OTc4MDUsLTEpfDA7Uj1EZChNfDAsSHwwLFJ8MCxDfDApfDA7SD1DO009T2QoY2F8MCxJfDAsMTM2NjU3LDApfDA7TT1EZChoYXwwLEJ8MCxNfDAsQ3wwKXwwO0I9QztJPU9kKGNhfDAsSXwwLC02ODM5MDEsLTEpfDA7ST1EZChafDAseXwwLEl8MCxDfDApfDA7eT1DO1o9RWQoVnwwLGRhfDAsMjEpfDA7Y2E9QztRPURkKF98MCxRfDAsWnwwLGNhfDApfDA7Xz1DO2NhPUhkKFp8MCxjYXwwLDIxKXwwO2NhPUNkKFZ8MCxkYXwwLGNhfDAsQ3wwKXwwO2RhPUM7Vj1FZChRfDAsX3wwLDIxKXwwO1o9QztMPURkKFd8MCxMfDAsVnwwLFp8MCl8MDtXPUM7Wj1IZChWfDAsWnwwLDIxKXwwO1o9Q2QoUXwwLF98MCxafDAsQ3wwKXwwO189QztRPUVkKEx8MCxXfDAsMjEpfDA7Vj1DO0g9RGQoUnwwLEh8MCxRfDAsVnwwKXwwO1I9QztWPUhkKFF8MCxWfDAsMjEpfDA7Vj1DZChMfDAsV3wwLFZ8MCxDfDApfDA7Vz1DO0w9RWQoSHwwLFJ8MCwyMSl8MDtRPUM7Qj1EZChNfDAsQnwwLEx8MCxRfDApfDA7TT1DO1E9SGQoTHwwLFF8MCwyMSl8MDtRPUNkKEh8MCxSfDAsUXwwLEN8MCl8MDtSPUM7SD1FZChCfDAsTXwwLDIxKXwwO0w9Qzt5PURkKEl8MCx5fDAsSHwwLEx8MCl8MDtJPUM7TD1IZChIfDAsTHwwLDIxKXwwO0w9Q2QoQnwwLE18MCxMfDAsQ3wwKXwwO009QztCPUVkKHl8MCxJfDAsMjEpfDA7SD1DO3M9RGQoQnwwLEh8MCxEfDAsc3wwKXwwO0Q9QztIPUhkKEJ8MCxIfDAsMjEpfDA7SD1DZCh5fDAsSXwwLEh8MCxDfDApfDA7ST1DO3k9RWQoc3wwLER8MCwyMSl8MDtCPUM7bj1EZCh5fDAsQnwwLHh8MCxufDApfDA7eD1DO0I9SGQoeXwwLEJ8MCwyMSl8MDtCPUNkKHN8MCxEfDAsQnwwLEN8MCl8MDtEPUM7cz1FZChufDAseHwwLDIxKXwwO3k9QztrPURkKHN8MCx5fDAsdHwwLGt8MCl8MDt0PUM7eT1IZChzfDAseXwwLDIxKXwwO3k9Q2QobnwwLHh8MCx5fDAsQ3wwKXwwO3g9QztuPUVkKGt8MCx0fDAsMjEpfDA7cz1DO2dhPURkKG58MCxzfDAsb3wwLGdhfDApfDA7bz1DO3M9SGQobnwwLHN8MCwyMSl8MDtzPUNkKGt8MCx0fDAsc3wwLEN8MCl8MDt0PUM7az1FZChnYXwwLG98MCwyMSl8MDtuPUM7ZmE9RGQoa3wwLG58MCxqfDAsZmF8MCl8MDtqPUM7bj1IZChrfDAsbnwwLDIxKXwwO249Q2QoZ2F8MCxvfDAsbnwwLEN8MCl8MDtvPUM7Z2E9RWQoZmF8MCxqfDAsMjEpfDA7az1DO2Y9RGQoZ2F8MCxrfDAsZXwwLGZ8MCl8MDtlPUM7az1IZChnYXwwLGt8MCwyMSl8MDtrPUNkKGZhfDAsanwwLGt8MCxDfDApfDA7aj1DO2FbYj4+MF09Y2E7Yj1HZChjYXwwLGRhfDAsOCl8MDthW2VhPj4wXT1iO2I9R2QoY2F8MCxkYXwwLDE2KXwwO2RhPUM7Y2E9SGQoWnwwLF98MCw1KXwwO2FbYmE+PjBdPWNhfGI7Yj1HZChafDAsX3wwLDMpfDA7YVthYT4+MF09YjtiPUdkKFp8MCxffDAsMTEpfDA7YVskPj4wXT1iO2I9R2QoWnwwLF98MCwxOSl8MDtfPUM7Wj1IZChWfDAsV3wwLDIpfDA7YVtZPj4wXT1afGI7Yj1HZChWfDAsV3wwLDYpfDA7YVtYPj4wXT1iO2I9R2QoVnwwLFd8MCwxNCl8MDtXPUM7Vj1IZChRfDAsUnwwLDcpfDA7YVtVPj4wXT1WfGI7Yj1HZChRfDAsUnwwLDEpfDA7YVtUPj4wXT1iO2I9R2QoUXwwLFJ8MCw5KXwwO2FbUz4+MF09YjtiPUdkKFF8MCxSfDAsMTcpfDA7Uj1DO1E9SGQoTHwwLE18MCw0KXwwO2FbUD4+MF09UXxiO2I9R2QoTHwwLE18MCw0KXwwO2FbTz4+MF09YjtiPUdkKEx8MCxNfDAsMTIpfDA7YVtOPj4wXT1iO2I9R2QoTHwwLE18MCwyMCl8MDtNPUM7TD1IZChIfDAsSXwwLDEpfDA7YVtLPj4wXT1MfGI7Yj1HZChIfDAsSXwwLDcpfDA7YVtKPj4wXT1iO2I9R2QoSHwwLEl8MCwxNSl8MDtJPUM7SD1IZChCfDAsRHwwLDYpfDA7YVtHPj4wXT1IfGI7Yj1HZChCfDAsRHwwLDIpfDA7YVtGPj4wXT1iO2I9R2QoQnwwLER8MCwxMCl8MDthW0U+PjBdPWI7Yj1HZChCfDAsRHwwLDE4KXwwO0Q9QztCPUhkKHl8MCx4fDAsMyl8MDthW0E+PjBdPUJ8YjtiPUdkKHl8MCx4fDAsNSl8MDthW3o+PjBdPWI7Yj1HZCh5fDAseHwwLDEzKXwwO2Fbdz4+MF09YjthW3Y+PjBdPXM7Yj1HZChzfDAsdHwwLDgpfDA7YVt1Pj4wXT1iO2I9R2Qoc3wwLHR8MCwxNil8MDt0PUM7cz1IZChufDAsb3wwLDUpfDA7YVtyPj4wXT1zfGI7Yj1HZChufDAsb3wwLDMpfDA7YVtxPj4wXT1iO2I9R2QobnwwLG98MCwxMSl8MDthW3A+PjBdPWI7Yj1HZChufDAsb3wwLDE5KXwwO289QztuPUhkKGt8MCxqfDAsMil8MDthW20+PjBdPW58YjtiPUdkKGt8MCxqfDAsNil8MDthW2w+PjBdPWI7aj1HZChrfDAsanwwLDE0KXwwO2s9QztiPUhkKGZ8MCxlfDAsNyl8MDthW2k+PjBdPWp8YjtiPUdkKGZ8MCxlfDAsMSl8MDthW2g+PjBdPWI7Yj1HZChmfDAsZXwwLDkpfDA7YVtnPj4wXT1iO2I9R2QoZnwwLGV8MCwxNyl8MDthW2M+PjBdPWI7cmV0dXJufWZ1bmN0aW9uIFhjKGIsZSxmLGcsaCxqKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTAsYmE9MCxjYT0wLGRhPTAsZWE9MCxmYT0wLGdhPTAsaGE9MCxpYT0wLGphPTAsa2E9MCxsYT0wLG1hPTAsbmE9MCxvYT0wLHBhPTAscWE9MCxyYT0wLHNhPTAsdGE9MCx1YT0wLHZhPTAsd2E9MCx4YT0wLHlhPTAsemE9MCxBYT0wLEJhPTAsQ2E9MCxEYT0wLEVhPTAsRmE9MCxHYT0wLEhhPTAsSWE9MCxKYT0wLEthPTAsTGE9MCxNYT0wLE5hPTAsT2E9MCxQYT0wLFFhPTAsUmE9MCxTYT0wLFRhPTAsVWE9MCxWYT0wLFdhPTAsWGE9MCxZYT0wLFphPTAsX2E9MCwkYT0wLGFiPTAsYmI9MCxjYj0wLGRiPTAsZWI9MCxmYj0wLGdiPTAsaGI9MCxpYj0wLGpiPTAsa2I9MCxsYj0wLG1iPTAsbmI9MCxvYj0wLHBiPTAscWI9MCxyYj0wLHNiPTAsdGI9MCx1Yj0wLHZiPTAsd2I9MCx4Yj0wLHliPTAsemI9MCxBYj0wLEJiPTAsQ2I9MCxEYj0wLEViPTAsSGI9MCxJYj0wLEpiPTAsS2I9MCxMYj0wLE1iPTAsTmI9MCxPYj0wLFBiPTAsUWI9MCxSYj0wLFNiPTAsVGI9MCxVYj0wLFZiPTAsV2I9MCxYYj0wLFliPTAsWmI9MCxfYj0wLCRiPTAsYWM9MCxiYz0wLGNjPTAsZGM9MCxlYz0wLGZjPTAsZ2M9MCxoYz0wLGljPTAsamM9MCxrYz0wLGxjPTAsbWM9MCxuYz0wLG9jPTAscGM9MCxxYz0wLHJjPTAsc2M9MCx0Yz0wLHVjPTAsdmM9MCx3Yz0wLHhjPTAseWM9MCx6Yz0wLEFjPTAsQmM9MCxDYz0wLERjPTAsRWM9MDt6PWk7cD1pPWkrNjMmLTY0O2k9aSs4OTZ8MDt2PXArMjA4fDA7dT1wKzY1NnwwO3c9cCs2MTZ8MDt4PXArNTc2fDA7cz1wO3E9cCs4MjR8MDt0PXArNzYwfDA7cj1wKzY5NnwwO3A9cCs0MTZ8MDtrPXYrNjR8MDt5PXY7QT04O0I9eSs2NHwwO2Rve2NbeT4+Ml09Y1tBPj4yXTt5PXkrNHwwO0E9QSs0fDB9d2hpbGUoKHl8MCk8KEJ8MCkpO3k9dis3MnwwO2NbeT4+Ml09MjU2O2NbeSs0Pj4yXT0wO3k9aztjW3k+PjJdPTA7Y1t5KzQ+PjJdPTA7eT12KzgwfDA7QT1qO0I9eSszMnwwO2Rve2FbeT4+MF09YVtBPj4wXXwwO3k9eSsxfDA7QT1BKzF8MH13aGlsZSgoeXwwKTwoQnwwKSk7R2IodixxKTthW3E+PjBdPShkW3E+PjBdfDApJjI0ODtrPXErMzF8MDthW2s+PjBdPShkW2s+PjBdfDApJjYzfDY0O2w9cys2NHwwO3k9bDtjW3k+PjJdPTA7Y1t5KzQ+PjJdPTA7eT1zO0E9ODtCPXkrNjR8MDtkb3tjW3k+PjJdPWNbQT4+Ml07eT15KzR8MDtBPUErNHwwfXdoaWxlKCh5fDApPChCfDApKTttPXMrNzJ8MDtuPW07Y1tuPj4yXT0yNTY7Y1tuKzQ+PjJdPTA7bj1sO2Nbbj4+Ml09MDtjW24rND4+Ml09MDtuPXMrODB8MDt5PW47QT1xKzMyfDA7Qj15KzMyfDA7ZG97YVt5Pj4wXT1hW0E+PjBdfDA7eT15KzF8MDtBPUErMXwwfXdoaWxlKCh5fDApPChCfDApKTtGYihzLGYsZyxoKTtHYihzLHQpO289YiszMnwwO0pkKG98MCxqKzMyfDAsMzIpfDA7V2ModCk7UmMocCx0KTtJYyh1LHArODB8MCk7SmModyxwLHUpO0pjKHgscCs0MHwwLHUpO0xjKGIseCk7TGModix3KTt5PWIrMzF8MDthW3k+PjBdPShkW3k+PjBdfDApXihkW3Y+PjBdfDApPDw3O3k9bDtjW3k+PjJdPTA7Y1t5KzQ+PjJdPTA7eT1zO0E9ODtCPXkrNjR8MDtkb3tjW3k+PjJdPWNbQT4+Ml07eT15KzR8MDtBPUErNHwwfXdoaWxlKCh5fDApPChCfDApKTt5PW07Y1t5Pj4yXT01MTI7Y1t5KzQ+PjJdPTA7eT1sO2NbeT4+Ml09MDtjW3krND4+Ml09MDt5PW47QT1iO0I9eSs2NHwwO2Rve2FbeT4+MF09YVtBPj4wXXwwO3k9eSsxfDA7QT1BKzF8MH13aGlsZSgoeXwwKTwoQnwwKSk7RmIocyxmLGcsaCk7R2IocyxyKTtXYyhyKTtKPWFbcisyPj4wXXwwO1RhPWRbcj4+MF18MDt4Yj1IZChkW3IrMT4+MF18MHwwLDAsOCl8MDtxYj1DO0o9SiYyNTU7a2I9SGQoSnwwLDAsMTYpfDA7a2I9eGJ8VGF8a2ImMjAzMTYxNjtUYT1IZChkW3IrMz4+MF18MHwwLDAsOCl8MDt4Yj1DO0Y9SGQoZFtyKzQ+PjBdfDB8MCwwLDE2KXwwO3hiPXhifEM7dWI9ZFtyKzU+PjBdfDA7ZGI9SGQodWJ8MCwwLDI0KXwwO3hiPUdkKFRhfEp8RnxkYnwwLHhifEN8MCw1KXwwO3hiPXhiJjIwOTcxNTE7ZGI9YVtyKzc+PjBdfDA7Rj1IZChkW3IrNj4+MF18MHwwLDAsOCl8MDtKPUM7ZGI9ZGImMjU1O1RhPUhkKGRifDAsMCwxNil8MDtKPUdkKEZ8dWJ8VGF8MCxKfEN8MCwyKXwwO0o9SiYyMDk3MTUxO1RhPUhkKGRbcis4Pj4wXXwwfDAsMCw4KXwwO3ViPUM7Rj1IZChkW3IrOT4+MF18MHwwLDAsMTYpfDA7dWI9dWJ8Qzt2PWRbcisxMD4+MF18MDtTYT1IZCh2fDAsMCwyNCl8MDt1Yj1HZChUYXxkYnxGfFNhfDAsdWJ8Q3wwLDcpfDA7dWI9dWImMjA5NzE1MTtTYT1IZChkW3IrMTE+PjBdfDB8MCwwLDgpfDA7Rj1DO2RiPUhkKGRbcisxMj4+MF18MHwwLDAsMTYpfDA7Rj1GfEM7VGE9ZFtyKzEzPj4wXXwwO3k9SGQoVGF8MCwwLDI0KXwwO0Y9R2QoU2F8dnxkYnx5fDAsRnxDfDAsNCl8MDtGPUYmMjA5NzE1MTt5PWFbcisxNT4+MF18MDtkYj1IZChkW3IrMTQ+PjBdfDB8MCwwLDgpfDA7dj1DO3k9eSYyNTU7U2E9SGQoeXwwLDAsMTYpfDA7dj1HZChkYnxUYXxTYXwwLHZ8Q3wwLDEpfDA7dj12JjIwOTcxNTE7U2E9SGQoZFtyKzE2Pj4wXXwwfDAsMCw4KXwwO1RhPUM7ZGI9SGQoZFtyKzE3Pj4wXXwwfDAsMCwxNil8MDtUYT1UYXxDO0JjPWRbcisxOD4+MF18MDtqYT1IZChCY3wwLDAsMjQpfDA7VGE9R2QoU2F8eXxkYnxqYXwwLFRhfEN8MCw2KXwwO1RhPVRhJjIwOTcxNTE7amE9YVtyKzIwPj4wXXwwO2RiPUhkKGRbcisxOT4+MF18MHwwLDAsOCl8MDt5PUM7amE9SGQoamEmMjU1fDAsMCwxNil8MDt5PUdkKGRifEJjfGphfDAseXxDfDAsMyl8MDtqYT1DO0JjPWFbcisyMz4+MF18MDtkYj1kW3IrMjE+PjBdfDA7U2E9SGQoZFtyKzIyPj4wXXwwfDAsMCw4KXwwO3NiPUM7QmM9QmMmMjU1O1FhPUhkKEJjfDAsMCwxNil8MDtRYT1TYXxkYnxRYSYyMDMxNjE2O2RiPUhkKGRbcisyND4+MF18MHwwLDAsOCl8MDtTYT1DO209SGQoZFtyKzI1Pj4wXXwwfDAsMCwxNil8MDtTYT1TYXxDO3A9ZFtyKzI2Pj4wXXwwO3M9SGQocHwwLDAsMjQpfDA7U2E9R2QoZGJ8QmN8bXxzfDAsU2F8Q3wwLDUpfDA7U2E9U2EmMjA5NzE1MTtzPWFbcisyOD4+MF18MDttPUhkKGRbcisyNz4+MF18MHwwLDAsOCl8MDtCYz1DO3M9cyYyNTU7ZGI9SGQoc3wwLDAsMTYpfDA7QmM9R2QobXxwfGRifDAsQmN8Q3wwLDIpfDA7QmM9QmMmMjA5NzE1MTtkYj1IZChkW3IrMjk+PjBdfDB8MCwwLDgpfDA7cD1DO209SGQoZFtyKzMwPj4wXXwwfDAsMCwxNil8MDtwPXB8QztLYT1IZChkW3IrMzE+PjBdfDB8MCwwLDI0KXwwO3A9R2QoZGJ8c3xtfEthfDAscHxDfDAsNyl8MDtLYT1DO209YVtxKzI+PjBdfDA7cz1kW3E+PjBdfDA7ZGI9SGQoZFtxKzE+PjBdfDB8MCwwLDgpfDA7aWE9QzttPW0mMjU1O2hhPUhkKG18MCwwLDE2KXwwO2hhPWRifHN8aGEmMjAzMTYxNjtzPUhkKGRbcSszPj4wXXwwfDAsMCw4KXwwO2RiPUM7bGE9SGQoZFtxKzQ+PjBdfDB8MCwwLDE2KXwwO2RiPWRifEM7aD1kW3ErNT4+MF18MDt5Yz1IZChofDAsMCwyNCl8MDtkYj1HZChzfG18bGF8eWN8MCxkYnxDfDAsNSl8MDtkYj1kYiYyMDk3MTUxO3ljPWFbcSs3Pj4wXXwwO2xhPUhkKGRbcSs2Pj4wXXwwfDAsMCw4KXwwO209Qzt5Yz15YyYyNTU7cz1IZCh5Y3wwLDAsMTYpfDA7bT1HZChsYXxofHN8MCxtfEN8MCwyKXwwO209bSYyMDk3MTUxO3M9SGQoZFtxKzg+PjBdfDB8MCwwLDgpfDA7aD1DO2xhPUhkKGRbcSs5Pj4wXXwwfDAsMCwxNil8MDtoPWh8QztfYT1kW3ErMTA+PjBdfDA7UGE9SGQoX2F8MCwwLDI0KXwwO2g9R2Qoc3x5Y3xsYXxQYXwwLGh8Q3wwLDcpfDA7aD1oJjIwOTcxNTE7UGE9SGQoZFtxKzExPj4wXXwwfDAsMCw4KXwwO2xhPUM7eWM9SGQoZFtxKzEyPj4wXXwwfDAsMCwxNil8MDtsYT1sYXxDO3M9ZFtxKzEzPj4wXXwwO0VjPUhkKHN8MCwwLDI0KXwwO2xhPUdkKFBhfF9hfHljfEVjfDAsbGF8Q3wwLDQpfDA7bGE9bGEmMjA5NzE1MTtFYz1hW3ErMTU+PjBdfDA7eWM9SGQoZFtxKzE0Pj4wXXwwfDAsMCw4KXwwO19hPUM7RWM9RWMmMjU1O1BhPUhkKEVjfDAsMCwxNil8MDtfYT1HZCh5Y3xzfFBhfDAsX2F8Q3wwLDEpfDA7X2E9X2EmMjA5NzE1MTtQYT1IZChkW3ErMTY+PjBdfDB8MCwwLDgpfDA7cz1DO3ljPUhkKGRbcSsxNz4+MF18MHwwLDAsMTYpfDA7cz1zfEM7Uj1kW3ErMTg+PjBdfDA7QmI9SGQoUnwwLDAsMjQpfDA7cz1HZChQYXxFY3x5Y3xCYnwwLHN8Q3wwLDYpfDA7cz1zJjIwOTcxNTE7QmI9YVtxKzIwPj4wXXwwO3ljPUhkKGRbcSsxOT4+MF18MHwwLDAsOCl8MDtFYz1DO0JiPUhkKEJiJjI1NXwwLDAsMTYpfDA7RWM9R2QoeWN8UnxCYnwwLEVjfEN8MCwzKXwwO0JiPUM7Uj1hW3ErMjM+PjBdfDA7eWM9ZFtxKzIxPj4wXXwwO1BhPUhkKGRbcSsyMj4+MF18MHwwLDAsOCl8MDtEYT1DO1I9UiYyNTU7dWE9SGQoUnwwLDAsMTYpfDA7dWE9UGF8eWN8dWEmMjAzMTYxNjt5Yz1IZChkW3ErMjQ+PjBdfDB8MCwwLDgpfDA7UGE9QztNYT1IZChkW3ErMjU+PjBdfDB8MCwwLDE2KXwwO1BhPVBhfEM7RD1kW3ErMjY+PjBdfDA7emM9SGQoRHwwLDAsMjQpfDA7UGE9R2QoeWN8UnxNYXx6Y3wwLFBhfEN8MCw1KXwwO1BhPVBhJjIwOTcxNTE7emM9YVtxKzI4Pj4wXXwwO01hPUhkKGRbcSsyNz4+MF18MHwwLDAsOCl8MDtSPUM7emM9emMmMjU1O3ljPUhkKHpjfDAsMCwxNil8MDtSPUdkKE1hfER8eWN8MCxSfEN8MCwyKXwwO1I9UiYyMDk3MTUxO3ljPUhkKGRbcSsyOT4+MF18MHwwLDAsOCl8MDtEPUM7TWE9SGQoZFtxKzMwPj4wXXwwfDAsMCwxNil8MDtEPUR8QztJYT1IZChkW2s+PjBdfDB8MCwwLDI0KXwwO0Q9R2QoeWN8emN8TWF8SWF8MCxEfEN8MCw3KXwwO0lhPUM7TWE9YVt0KzI+PjBdfDA7emM9ZFt0Pj4wXXwwO3ljPUhkKGRbdCsxPj4wXXwwfDAsMCw4KXwwO2JhPUM7TWE9TWEmMjU1O0FjPUhkKE1hfDAsMCwxNil8MDtYYT1IZChkW3QrMz4+MF18MHwwLDAsOCl8MDtFYT1DO0dhPUhkKGRbdCs0Pj4wXXwwfDAsMCwxNil8MDtFYT1FYXxDO3BiPWRbdCs1Pj4wXXwwO3phPUhkKHBifDAsMCwyNCl8MDtFYT1HZChYYXxNYXxHYXx6YXwwLEVhfEN8MCw1KXwwO3phPWFbdCs3Pj4wXXwwO0dhPUhkKGRbdCs2Pj4wXXwwfDAsMCw4KXwwO01hPUM7emE9emEmMjU1O1hhPUhkKHphfDAsMCwxNil8MDtNYT1HZChHYXxwYnxYYXwwLE1hfEN8MCwyKXwwO1hhPUhkKGRbdCs4Pj4wXXwwfDAsMCw4KXwwO3BiPUM7R2E9SGQoZFt0Kzk+PjBdfDB8MCwwLDE2KXwwO3BiPXBifEM7WD1kW3QrMTA+PjBdfDA7Tz1IZChYfDAsMCwyNCl8MDtwYj1HZChYYXx6YXxHYXxPfDAscGJ8Q3wwLDcpfDA7Tz1IZChkW3QrMTE+PjBdfDB8MCwwLDgpfDA7R2E9Qzt6YT1IZChkW3QrMTI+PjBdfDB8MCwwLDE2KXwwO0dhPUdhfEM7WGE9ZFt0KzEzPj4wXXwwO0g9SGQoWGF8MCwwLDI0KXwwO0dhPUdkKE98WHx6YXxIfDAsR2F8Q3wwLDQpfDA7SD1hW3QrMTU+PjBdfDA7emE9SGQoZFt0KzE0Pj4wXXwwfDAsMCw4KXwwO1g9QztIPUgmMjU1O089SGQoSHwwLDAsMTYpfDA7WD1HZCh6YXxYYXxPfDAsWHxDfDAsMSl8MDtPPUhkKGRbdCsxNj4+MF18MHwwLDAsOCl8MDtYYT1DO3phPUhkKGRbdCsxNz4+MF18MHwwLDAsMTYpfDA7WGE9WGF8QztVPWRbdCsxOD4+MF18MDt3PUhkKFV8MCwwLDI0KXwwO1hhPUdkKE98SHx6YXx3fDAsWGF8Q3wwLDYpfDA7dz1hW3QrMjA+PjBdfDA7emE9SGQoZFt0KzE5Pj4wXXwwfDAsMCw4KXwwO0g9Qzt3PUhkKHcmMjU1fDAsMCwxNil8MDtIPUdkKHphfFV8d3wwLEh8Q3wwLDMpfDA7dz1DO1U9YVt0KzIzPj4wXXwwO3phPWRbdCsyMT4+MF18MDtPPUhkKGRbdCsyMj4+MF18MHwwLDAsOCl8MDtkYT1DO1U9VSYyNTU7ZWE9SGQoVXwwLDAsMTYpfDA7QmE9SGQoZFt0KzI0Pj4wXXwwfDAsMCw4KXwwO049QztIYT1IZChkW3QrMjU+PjBdfDB8MCwwLDE2KXwwO049TnxDO0E9ZFt0KzI2Pj4wXXwwO3RhPUhkKEF8MCwwLDI0KXwwO049R2QoQmF8VXxIYXx0YXwwLE58Q3wwLDUpfDA7dGE9YVt0KzI4Pj4wXXwwO0hhPUhkKGRbdCsyNz4+MF18MHwwLDAsOCl8MDtVPUM7dGE9dGEmMjU1O0JhPUhkKHRhfDAsMCwxNil8MDtVPUdkKEhhfEF8QmF8MCxVfEN8MCwyKXwwO0JhPUhkKGRbdCsyOT4+MF18MHwwLDAsOCl8MDtBPUM7SGE9SGQoZFt0KzMwPj4wXXwwfDAsMCwxNil8MDtBPUF8QztqPUhkKGRbdCszMT4+MF18MHwwLDAsMjQpfDA7QT1HZChCYXx0YXxIYXxqfDAsQXxDfDAsNyl8MDtqPUM7SGE9T2QoaGF8MCxpYXwwLGtifDAscWJ8MCl8MDtIYT1EZCh5Y3x6Y3xBYyYyMDMxNjE2fDAsYmF8MCxIYXwwLEN8MCl8MDtiYT1DO0FjPU9kKGRifDAsMCxrYnwwLHFifDApfDA7emM9Qzt5Yz1PZChoYXwwLGlhfDAseGJ8MCwwKXwwO3RhPUM7QmE9T2QobXwwLDAsa2J8MCxxYnwwKXwwO0xhPUM7Q2E9T2QoZGJ8MCwwLHhifDAsMCl8MDt0Yz1DO3BhPU9kKGhhfDAsaWF8MCxKfDAsMCl8MDtwYT1EZChDYXwwLHRjfDAscGF8MCxDfDApfDA7TGE9RGQocGF8MCxDfDAsQmF8MCxMYXwwKXwwO01hPURkKExhfDAsQ3wwLE1hJjIwOTcxNTF8MCwwKXwwO0xhPUM7QmE9T2QoaHwwLDAsa2J8MCxxYnwwKXwwO3BhPUM7dGM9T2QobXwwLDAseGJ8MCwwKXwwO0NhPUM7eGM9T2QoZGJ8MCwwLEp8MCwwKXwwO3djPUM7dmM9T2QoaGF8MCxpYXwwLHVifDAsMCl8MDt1Yz1DO09hPU9kKGxhfDAsMCxrYnwwLHFifDApfDA7RmE9QztrYz1PZChofDAsMCx4YnwwLDApfDA7WT1DO21jPU9kKG18MCwwLEp8MCwwKXwwO05hPUM7bmM9T2QoZGJ8MCwwLHVifDAsMCl8MDtvYz1DO2xjPU9kKGhhfDAsaWF8MCxGfDAsMCl8MDtsYz1EZChuY3wwLG9jfDAsbGN8MCxDfDApfDA7TmE9RGQobGN8MCxDfDAsbWN8MCxOYXwwKXwwO1k9RGQoTmF8MCxDfDAsa2N8MCxZfDApfDA7RmE9RGQoWXwwLEN8MCxPYXwwLEZhfDApfDA7R2E9RGQoRmF8MCxDfDAsR2EmMjA5NzE1MXwwLDApfDA7RmE9QztPYT1PZChfYXwwLDAsa2J8MCxxYnwwKXwwO1k9QztrYz1PZChsYXwwLDAseGJ8MCwwKXwwO05hPUM7bWM9T2QoaHwwLDAsSnwwLDApfDA7bGM9QztvYz1PZChtfDAsMCx1YnwwLDApfDA7bmM9QztzYz1PZChkYnwwLDAsRnwwLDApfDA7cmM9QztxYz1PZChoYXwwLGlhfDAsdnwwLDApfDA7cGM9QztjYT1PZChzfDAsMCxrYnwwLHFifDApfDA7WWE9QztaYj1PZChfYXwwLDAseGJ8MCwwKXwwO2thPUM7JGI9T2QobGF8MCwwLEp8MCwwKXwwO1liPUM7YmM9T2QoaHwwLDAsdWJ8MCwwKXwwO19iPUM7ZGM9T2QobXwwLDAsRnwwLDApfDA7YWM9QztlYz1PZChkYnwwLDAsdnwwLDApfDA7ZmM9QztjYz1PZChoYXwwLGlhfDAsVGF8MCwwKXwwO2NjPURkKGVjfDAsZmN8MCxjY3wwLEN8MCl8MDthYz1EZChjY3wwLEN8MCxkY3wwLGFjfDApfDA7X2I9RGQoYWN8MCxDfDAsYmN8MCxfYnwwKXwwO1liPURkKF9ifDAsQ3wwLCRifDAsWWJ8MCl8MDtrYT1EZChZYnwwLEN8MCxaYnwwLGthfDApfDA7WWE9RGQoa2F8MCxDfDAsY2F8MCxZYXwwKXwwO1hhPURkKFlhfDAsQ3wwLFhhJjIwOTcxNTF8MCwwKXwwO1lhPUM7Y2E9T2QoRWN8MCxCYnwwLGtifDAscWJ8MCl8MDtrYT1DO1piPU9kKHN8MCwwLHhifDAsMCl8MDtZYj1DOyRiPU9kKF9hfDAsMCxKfDAsMCl8MDtfYj1DO2JjPU9kKGxhfDAsMCx1YnwwLDApfDA7YWM9QztkYz1PZChofDAsMCxGfDAsMCl8MDtjYz1DO2ZjPU9kKG18MCwwLHZ8MCwwKXwwO2VjPUM7amM9T2QoZGJ8MCwwLFRhfDAsMCl8MDtpYz1DO2hjPU9kKGhhfDAsaWF8MCx5fDAsamF8MCl8MDtnYz1DO0FhPU9kKHVhfDAsRGF8MCxrYnwwLHFifDApfDA7SGI9QztJYj1PZChFY3wwLEJifDAseGJ8MCwwKXwwO0piPUM7S2I9T2Qoc3wwLDAsSnwwLDApfDA7TGI9QztNYj1PZChfYXwwLDAsdWJ8MCwwKXwwO05iPUM7T2I9T2QobGF8MCwwLEZ8MCwwKXwwO1BiPUM7UWI9T2QoaHwwLDAsdnwwLDApfDA7UmI9QztTYj1PZChtfDAsMCxUYXwwLDApfDA7VGI9QztWYj1PZChkYnwwLDAseXwwLGphfDApfDA7V2I9QztYYj1PZChoYXwwLGlhfDAsUWF8MCxzYnwwKXwwO1hiPURkKFZifDAsV2J8MCxYYnwwLEN8MCl8MDtUYj1EZChYYnwwLEN8MCxTYnwwLFRifDApfDA7UmI9RGQoVGJ8MCxDfDAsUWJ8MCxSYnwwKXwwO1BiPURkKFJifDAsQ3wwLE9ifDAsUGJ8MCl8MDtOYj1EZChQYnwwLEN8MCxNYnwwLE5ifDApfDA7TGI9RGQoTmJ8MCxDfDAsS2J8MCxMYnwwKXwwO0piPURkKExifDAsQ3wwLElifDAsSmJ8MCl8MDtIYj1EZChKYnwwLEN8MCxBYXwwLEhifDApfDA7ZGE9RGQoSGJ8MCxDfDAsT3x6YXxlYSYyMDMxNjE2fDAsZGF8MCl8MDtlYT1DO3phPU9kKFBhfDAsMCxrYnwwLHFifDApfDA7Tz1DO0hiPU9kKHVhfDAsRGF8MCx4YnwwLDApfDA7QWE9QztKYj1PZChFY3wwLEJifDAsSnwwLDApfDA7SWI9QztMYj1PZChzfDAsMCx1YnwwLDApfDA7S2I9QztOYj1PZChfYXwwLDAsRnwwLDApfDA7TWI9QztQYj1PZChsYXwwLDAsdnwwLDApfDA7T2I9QztSYj1PZChofDAsMCxUYXwwLDApfDA7UWI9QztUYj1PZChtfDAsMCx5fDAsamF8MCl8MDtTYj1DO1hiPU9kKGRifDAsMCxRYXwwLHNifDApfDA7V2I9QztWYj1PZChoYXwwLGlhfDAsU2F8MCwwKXwwO1ViPUM7Vj1PZChSfDAsMCxrYnwwLHFifDApfDA7VD1DO2hiPU9kKFBhfDAsMCx4YnwwLDApfDA7Vz1DO0k9T2QodWF8MCxEYXwwLEp8MCwwKXwwO2liPUM7dmI9T2QoRWN8MCxCYnwwLHVifDAsMCl8MDtFPUM7UT1PZChzfDAsMCxGfDAsMCl8MDt3Yj1DO1ZhPU9kKF9hfDAsMCx2fDAsMCl8MDtLPUM7bmI9T2QobGF8MCwwLFRhfDAsMCl8MDtXYT1DOyQ9T2QoaHwwLDAseXwwLGphfDApfDA7b2I9QztiYj1PZChtfDAsMCxRYXwwLHNifDApfDA7YWE9QztEYj1PZChkYnwwLDAsU2F8MCwwKXwwO0ViPUM7Y2I9T2QoaGF8MCxpYXwwLEJjfDAsMCl8MDtjYj1EZChEYnwwLEVifDAsY2J8MCxDfDApfDA7YWE9RGQoY2J8MCxDfDAsYmJ8MCxhYXwwKXwwO29iPURkKGFhfDAsQ3wwLCR8MCxvYnwwKXwwO1dhPURkKG9ifDAsQ3wwLG5ifDAsV2F8MCl8MDtLPURkKFdhfDAsQ3wwLFZhfDAsS3wwKXwwO3diPURkKEt8MCxDfDAsUXwwLHdifDApfDA7RT1EZCh3YnwwLEN8MCx2YnwwLEV8MCl8MDtpYj1EZChFfDAsQ3wwLEl8MCxpYnwwKXwwO1c9RGQoaWJ8MCxDfDAsaGJ8MCxXfDApfDA7VD1EZChXfDAsQ3wwLFZ8MCxUfDApfDA7VT1EZChUfDAsQ3wwLFUmMjA5NzE1MXwwLDApfDA7VD1DO3FiPU9kKER8MCxJYXwwLGtifDAscWJ8MCl8MDtrYj1DO1Y9T2QoUnwwLDAseGJ8MCwwKXwwO1c9QztoYj1PZChQYXwwLDAsSnwwLDApfDA7aWI9QztJPU9kKHVhfDAsRGF8MCx1YnwwLDApfDA7RT1DO3ZiPU9kKEVjfDAsQmJ8MCxGfDAsMCl8MDt3Yj1DO1E9T2Qoc3wwLDAsdnwwLDApfDA7Sz1DO1ZhPU9kKF9hfDAsMCxUYXwwLDApfDA7V2E9QztuYj1PZChsYXwwLDAseXwwLGphfDApfDA7b2I9QzskPU9kKGh8MCwwLFFhfDAsc2J8MCl8MDthYT1DO2JiPU9kKG18MCwwLFNhfDAsMCl8MDtjYj1DO0ViPU9kKGRifDAsMCxCY3wwLDApfDA7RGI9QztpYT1PZChoYXwwLGlhfDAscHwwLEthfDApfDA7aGE9Qzt4Yj1PZChEfDAsSWF8MCx4YnwwLDApfDA7eWI9QztsYj1PZChSfDAsMCxKfDAsMCl8MDtHPUM7bWE9T2QoUGF8MCwwLHVifDAsMCl8MDttYj1DO29hPU9kKHVhfDAsRGF8MCxGfDAsMCl8MDtnYT1DO3piPU9kKEVjfDAsQmJ8MCx2fDAsMCl8MDtyYj1DO3NhPU9kKHN8MCwwLFRhfDAsMCl8MDtBYj1DO3hhPU9kKF9hfDAsMCx5fDAsamF8MCl8MDtyYT1DO1VhPU9kKGxhfDAsMCxRYXwwLHNifDApfDA7d2E9QztlYj1PZChofDAsMCxTYXwwLDApfDA7bmE9Qzt0Yj1PZChtfDAsMCxCY3wwLDApfDA7bD1DO2RiPU9kKGRifDAsMCxwfDAsS2F8MCl8MDtkYj1EZCh0YnwwLGx8MCxkYnwwLEN8MCl8MDtuYT1EZChkYnwwLEN8MCxlYnwwLG5hfDApfDA7d2E9RGQobmF8MCxDfDAsVWF8MCx3YXwwKXwwO3JhPURkKHdhfDAsQ3wwLHhhfDAscmF8MCl8MDtBYj1EZChyYXwwLEN8MCxzYXwwLEFifDApfDA7cmI9RGQoQWJ8MCxDfDAsemJ8MCxyYnwwKXwwO2dhPURkKHJifDAsQ3wwLG9hfDAsZ2F8MCl8MDttYj1EZChnYXwwLEN8MCxtYXwwLG1ifDApfDA7Rz1EZChtYnwwLEN8MCxsYnwwLEd8MCl8MDt5Yj1EZChHfDAsQ3wwLHhifDAseWJ8MCl8MDt4Yj1DO0o9T2QoRHwwLElhfDAsSnwwLDApfDA7Rz1DO2xiPU9kKFJ8MCwwLHVifDAsMCl8MDttYj1DO21hPU9kKFBhfDAsMCxGfDAsMCl8MDtnYT1DO29hPU9kKHVhfDAsRGF8MCx2fDAsMCl8MDtyYj1DO3piPU9kKEVjfDAsQmJ8MCxUYXwwLDApfDA7QWI9QztzYT1PZChzfDAsMCx5fDAsamF8MCl8MDtyYT1DO3hhPU9kKF9hfDAsMCxRYXwwLHNifDApfDA7d2E9QztVYT1PZChsYXwwLDAsU2F8MCwwKXwwO25hPUM7ZWI9T2QoaHwwLDAsQmN8MCwwKXwwO2RiPUM7bT1PZChtfDAsMCxwfDAsS2F8MCl8MDtsPUM7dWI9T2QoRHwwLElhfDAsdWJ8MCwwKXwwO3RiPUM7ZmI9T2QoUnwwLDAsRnwwLDApfDA7Zz1DO0w9T2QoUGF8MCwwLHZ8MCwwKXwwO2diPUM7cj1PZCh1YXwwLERhfDAsVGF8MCwwKXwwO249QztmYT1PZChFY3wwLEJifDAseXwwLGphfDApfDA7eD1DO3FhPU9kKHN8MCwwLFFhfDAsc2J8MCl8MDtrPUM7dmE9T2QoX2F8MCwwLFNhfDAsMCl8MDtNPUM7Q2I9T2QobGF8MCwwLEJjfDAsMCl8MDtmPUM7aD1PZChofDAsMCxwfDAsS2F8MCl8MDtoPURkKENifDAsZnwwLGh8MCxDfDApfDA7TT1EZChofDAsQ3wwLHZhfDAsTXwwKXwwO2s9RGQoTXwwLEN8MCxxYXwwLGt8MCl8MDt4PURkKGt8MCxDfDAsZmF8MCx4fDApfDA7bj1EZCh4fDAsQ3wwLHJ8MCxufDApfDA7Z2I9RGQobnwwLEN8MCxMfDAsZ2J8MCl8MDtnPURkKGdifDAsQ3wwLGZifDAsZ3wwKXwwO3RiPURkKGd8MCxDfDAsdWJ8MCx0YnwwKXwwO3ViPUM7Rj1PZChEfDAsSWF8MCxGfDAsMCl8MDtnPUM7ZmI9T2QoUnwwLDAsdnwwLDApfDA7Z2I9QztMPU9kKFBhfDAsMCxUYXwwLDApfDA7bj1DO3I9T2QodWF8MCxEYXwwLHl8MCxqYXwwKXwwO3g9QztmYT1PZChFY3wwLEJifDAsUWF8MCxzYnwwKXwwO2s9QztxYT1PZChzfDAsMCxTYXwwLDApfDA7TT1DO3ZhPU9kKF9hfDAsMCxCY3wwLDApfDA7aD1DO2xhPU9kKGxhfDAsMCxwfDAsS2F8MCl8MDtmPUM7dj1PZChEfDAsSWF8MCx2fDAsMCl8MDtDYj1DO0I9T2QoUnwwLDAsVGF8MCwwKXwwO1M9QztfPU9kKFBhfDAsMCx5fDAsamF8MCl8MDtSYT1DO2FiPU9kKHVhfDAsRGF8MCxRYXwwLHNifDApfDA7Wj1DO1phPU9kKEVjfDAsQmJ8MCxTYXwwLDApfDA7JGE9QztQPU9kKHN8MCwwLEJjfDAsMCl8MDt1PUM7X2E9T2QoX2F8MCwwLHB8MCxLYXwwKXwwO19hPURkKFB8MCx1fDAsX2F8MCxDfDApfDA7JGE9RGQoX2F8MCxDfDAsWmF8MCwkYXwwKXwwO1o9RGQoJGF8MCxDfDAsYWJ8MCxafDApfDA7UmE9RGQoWnwwLEN8MCxffDAsUmF8MCl8MDtTPURkKFJhfDAsQ3wwLEJ8MCxTfDApfDA7Q2I9RGQoU3wwLEN8MCx2fDAsQ2J8MCl8MDt2PUM7VGE9T2QoRHwwLElhfDAsVGF8MCwwKXwwO1M9QztCPU9kKFJ8MCwwLHl8MCxqYXwwKXwwO1JhPUM7Xz1PZChQYXwwLDAsUWF8MCxzYnwwKXwwO1o9QzthYj1PZCh1YXwwLERhfDAsU2F8MCwwKXwwOyRhPUM7WmE9T2QoRWN8MCxCYnwwLEJjfDAsMCl8MDtfYT1DO3M9T2Qoc3wwLDAscHwwLEthfDApfDA7dT1DO2phPU9kKER8MCxJYXwwLHl8MCxqYXwwKXwwO3k9QztQPU9kKFJ8MCwwLFFhfDAsc2J8MCl8MDtKYT1DO3lhPU9kKFBhfDAsMCxTYXwwLDApfDA7amI9QztDYz1PZCh1YXwwLERhfDAsQmN8MCwwKXwwO0RjPUM7QmI9T2QoRWN8MCxCYnwwLHB8MCxLYXwwKXwwO0JiPURkKENjfDAsRGN8MCxCYnwwLEN8MCl8MDtqYj1EZChCYnwwLEN8MCx5YXwwLGpifDApfDA7SmE9RGQoamJ8MCxDfDAsUHwwLEphfDApfDA7eT1EZChKYXwwLEN8MCxqYXwwLHl8MCl8MDtqYT1DO3NiPU9kKER8MCxJYXwwLFFhfDAsc2J8MCl8MDtRYT1DO0phPU9kKFJ8MCwwLFNhfDAsMCl8MDtQPUM7amI9T2QoUGF8MCwwLEJjfDAsMCl8MDt5YT1DO0RhPU9kKHVhfDAsRGF8MCxwfDAsS2F8MCl8MDt1YT1DO1NhPU9kKER8MCxJYXwwLFNhfDAsMCl8MDtCYj1DO0RjPU9kKFJ8MCwwLEJjfDAsMCl8MDtDYz1DO1BhPU9kKFBhfDAsMCxwfDAsS2F8MCl8MDtQYT1EZChEY3wwLENjfDAsUGF8MCxDfDApfDA7QmI9RGQoUGF8MCxDfDAsU2F8MCxCYnwwKXwwO1NhPUM7QmM9T2QoRHwwLElhfDAsQmN8MCwwKXwwO1BhPUM7Uj1PZChSfDAsMCxwfDAsS2F8MCl8MDtSPURkKEJjfDAsUGF8MCxSfDAsQ3wwKXwwO1BhPUM7S2E9T2QoRHwwLElhfDAscHwwLEthfDApfDA7cD1DO0lhPURkKEhhfDAsYmF8MCwxMDQ4NTc2LDApfDA7SWE9R2QoSWF8MCxDfDAsMjEpfDA7RD1DO3RhPURkKEFjfDAsemN8MCx5Y3wwLHRhfDApfDA7dGE9RGQodGF8MCxDfDAsSWF8MCxEfDApfDA7RWE9RGQodGF8MCxDfDAsRWEmMjA5NzE1MXwwLDApfDA7dGE9QztEPUhkKElhfDAsRHwwLDIxKXwwO0Q9Q2QoSGF8MCxiYXwwLER8MCxDfDApfDA7YmE9QztIYT1EZChNYXwwLExhfDAsMTA0ODU3NiwwKXwwO0hhPUdkKEhhfDAsQ3wwLDIxKXwwO0lhPUM7dWM9RGQoeGN8MCx3Y3wwLHZjfDAsdWN8MCl8MDtDYT1EZCh1Y3wwLEN8MCx0Y3wwLENhfDApfDA7cGE9RGQoQ2F8MCxDfDAsQmF8MCxwYXwwKXwwO3BiPURkKHBhfDAsQ3wwLHBiJjIwOTcxNTF8MCwwKXwwO3BiPURkKHBifDAsQ3wwLEhhfDAsSWF8MCl8MDtwYT1DO0lhPUhkKEhhfDAsSWF8MCwyMSl8MDtIYT1DO0JhPURkKEdhfDAsRmF8MCwxMDQ4NTc2LDApfDA7QmE9RWQoQmF8MCxDfDAsMjEpfDA7Q2E9QztwYz1EZChzY3wwLHJjfDAscWN8MCxwY3wwKXwwO25jPURkKHBjfDAsQ3wwLG9jfDAsbmN8MCl8MDtsYz1EZChuY3wwLEN8MCxtY3wwLGxjfDApfDA7TmE9RGQobGN8MCxDfDAsa2N8MCxOYXwwKXwwO1k9RGQoTmF8MCxDfDAsT2F8MCxZfDApfDA7WD1EZChZfDAsQ3wwLFgmMjA5NzE1MXwwLDApfDA7WD1EZChYfDAsQ3wwLEJhfDAsQ2F8MCl8MDtZPUM7Q2E9SGQoQmF8MCxDYXwwLDIxKXwwO0JhPUM7T2E9RGQoWGF8MCxZYXwwLDEwNDg1NzYsMCl8MDtPYT1FZChPYXwwLEN8MCwyMSl8MDtOYT1DO2djPURkKGpjfDAsaWN8MCxoY3wwLGdjfDApfDA7ZWM9RGQoZ2N8MCxDfDAsZmN8MCxlY3wwKXwwO2NjPURkKGVjfDAsQ3wwLGRjfDAsY2N8MCl8MDthYz1EZChjY3wwLEN8MCxiY3wwLGFjfDApfDA7X2I9RGQoYWN8MCxDfDAsJGJ8MCxfYnwwKXwwO1liPURkKF9ifDAsQ3wwLFpifDAsWWJ8MCl8MDtrYT1EZChZYnwwLEN8MCxjYXwwLGthfDApfDA7dz1EZChrYXwwLEN8MCxIfDAsd3wwKXwwO3c9RGQod3wwLEN8MCxPYXwwLE5hfDApfDA7SD1DO05hPUhkKE9hfDAsTmF8MCwyMSl8MDtPYT1DO2thPURkKGRhfDAsZWF8MCwxMDQ4NTc2LDApfDA7a2E9RWQoa2F8MCxDfDAsMjEpfDA7Y2E9QztVYj1EZChYYnwwLFdifDAsVmJ8MCxVYnwwKXwwO1NiPURkKFVifDAsQ3wwLFRifDAsU2J8MCl8MDtRYj1EZChTYnwwLEN8MCxSYnwwLFFifDApfDA7T2I9RGQoUWJ8MCxDfDAsUGJ8MCxPYnwwKXwwO01iPURkKE9ifDAsQ3wwLE5ifDAsTWJ8MCl8MDtLYj1EZChNYnwwLEN8MCxMYnwwLEtifDApfDA7SWI9RGQoS2J8MCxDfDAsSmJ8MCxJYnwwKXwwO0FhPURkKElifDAsQ3wwLEhifDAsQWF8MCl8MDtPPURkKEFhfDAsQ3wwLHphfDAsT3wwKXwwO049RGQoT3wwLEN8MCxOJjIwOTcxNTF8MCwwKXwwO049RGQoTnwwLEN8MCxrYXwwLGNhfDApfDA7Tz1DO2NhPUhkKGthfDAsY2F8MCwyMSl8MDtrYT1DO3phPURkKFV8MCxUfDAsMTA0ODU3NiwwKXwwO3phPUVkKHphfDAsQ3wwLDIxKXwwO0FhPUM7aGE9RGQoRWJ8MCxEYnwwLGlhfDAsaGF8MCl8MDtjYj1EZChoYXwwLEN8MCxiYnwwLGNifDApfDA7YWE9RGQoY2J8MCxDfDAsJHwwLGFhfDApfDA7b2I9RGQoYWF8MCxDfDAsbmJ8MCxvYnwwKXwwO1dhPURkKG9ifDAsQ3wwLFZhfDAsV2F8MCl8MDtLPURkKFdhfDAsQ3wwLFF8MCxLfDApfDA7d2I9RGQoS3wwLEN8MCx2YnwwLHdifDApfDA7RT1EZCh3YnwwLEN8MCxJfDAsRXwwKXwwO2liPURkKEV8MCxDfDAsaGJ8MCxpYnwwKXwwO1c9RGQoaWJ8MCxDfDAsVnwwLFd8MCl8MDtrYj1EZChXfDAsQ3wwLHFifDAsa2J8MCl8MDtqPURkKGtifDAsQ3wwLEF8MCxqfDApfDA7aj1EZChqfDAsQ3wwLHphfDAsQWF8MCl8MDtBPUM7QWE9SGQoemF8MCxBYXwwLDIxKXwwO3phPUM7a2I9RGQoeWJ8MCx4YnwwLDEwNDg1NzYsMCl8MDtrYj1FZChrYnwwLEN8MCwyMSl8MDtxYj1DO2w9RGQoZWJ8MCxkYnwwLG18MCxsfDApfDA7bmE9RGQobHwwLEN8MCxVYXwwLG5hfDApfDA7d2E9RGQobmF8MCxDfDAseGF8MCx3YXwwKXwwO3JhPURkKHdhfDAsQ3wwLHNhfDAscmF8MCl8MDtBYj1EZChyYXwwLEN8MCx6YnwwLEFifDApfDA7cmI9RGQoQWJ8MCxDfDAsb2F8MCxyYnwwKXwwO2dhPURkKHJifDAsQ3wwLG1hfDAsZ2F8MCl8MDttYj1EZChnYXwwLEN8MCxsYnwwLG1ifDApfDA7Rz1EZChtYnwwLEN8MCxKfDAsR3wwKXwwO0c9RGQoR3wwLEN8MCxrYnwwLHFifDApfDA7Sj1DO3FiPUhkKGtifDAscWJ8MCwyMSl8MDtrYj1DO21iPURkKHRifDAsdWJ8MCwxMDQ4NTc2LDApfDA7bWI9RWQobWJ8MCxDfDAsMjEpfDA7bGI9QztmPURkKHZhfDAsaHwwLGxhfDAsZnwwKXwwO009RGQoZnwwLEN8MCxxYXwwLE18MCl8MDtrPURkKE18MCxDfDAsZmF8MCxrfDApfDA7eD1EZChrfDAsQ3wwLHJ8MCx4fDApfDA7bj1EZCh4fDAsQ3wwLEx8MCxufDApfDA7Z2I9RGQobnwwLEN8MCxmYnwwLGdifDApfDA7Zz1EZChnYnwwLEN8MCxGfDAsZ3wwKXwwO2c9RGQoZ3wwLEN8MCxtYnwwLGxifDApfDA7Rj1DO2xiPUhkKG1ifDAsbGJ8MCwyMSl8MDttYj1DO2diPURkKENifDAsdnwwLDEwNDg1NzYsMCl8MDtnYj1FZChnYnwwLEN8MCwyMSl8MDtmYj1DO3U9RGQoWmF8MCxfYXwwLHN8MCx1fDApfDA7JGE9RGQodXwwLEN8MCxhYnwwLCRhfDApfDA7Wj1EZCgkYXwwLEN8MCxffDAsWnwwKXwwO1JhPURkKFp8MCxDfDAsQnwwLFJhfDApfDA7Uz1EZChSYXwwLEN8MCxUYXwwLFN8MCl8MDtTPURkKFN8MCxDfDAsZ2J8MCxmYnwwKXwwO1RhPUM7ZmI9SGQoZ2J8MCxmYnwwLDIxKXwwO2diPUM7UmE9RGQoeXwwLGphfDAsMTA0ODU3NiwwKXwwO1JhPUVkKFJhfDAsQ3wwLDIxKXwwO0I9Qzt1YT1EZChqYnwwLHlhfDAsRGF8MCx1YXwwKXwwO1A9RGQodWF8MCxDfDAsSmF8MCxQfDApfDA7UWE9RGQoUHwwLEN8MCxzYnwwLFFhfDApfDA7UWE9RGQoUWF8MCxDfDAsUmF8MCxCfDApfDA7c2I9QztCPUhkKFJhfDAsQnwwLDIxKXwwO0I9Q2QoeXwwLGphfDAsQnwwLEN8MCl8MDtqYT1DO3k9RGQoQmJ8MCxTYXwwLDEwNDg1NzYsMCl8MDt5PUVkKHl8MCxDfDAsMjEpfDA7UmE9QztQYT1EZChSfDAsUGF8MCx5fDAsUmF8MCl8MDtSPUM7UmE9SGQoeXwwLFJhfDAsMjEpfDA7UmE9Q2QoQmJ8MCxTYXwwLFJhfDAsQ3wwKXwwO1NhPUM7QmI9RGQoS2F8MCxwfDAsMTA0ODU3NiwwKXwwO0JiPUVkKEJifDAsQ3wwLDIxKXwwO3k9QztQPUhkKEJifDAseXwwLDIxKXwwO1A9Q2QoS2F8MCxwfDAsUHwwLEN8MCl8MDtwPUM7S2E9RGQoRWF8MCx0YXwwLDEwNDg1NzYsMCl8MDtLYT1HZChLYXwwLEN8MCwyMSl8MDtKYT1DO3VhPUhkKEthfDAsSmF8MCwyMSl8MDt1YT1DZChFYXwwLHRhfDAsdWF8MCxDfDApfDA7dGE9QztFYT1EZChwYnwwLHBhfDAsMTA0ODU3NiwwKXwwO0VhPUVkKEVhfDAsQ3wwLDIxKXwwO0RhPUM7eWE9SGQoRWF8MCxEYXwwLDIxKXwwO3lhPUNkKHBifDAscGF8MCx5YXwwLEN8MCl8MDtwYT1DO3BiPURkKFh8MCxZfDAsMTA0ODU3NiwwKXwwO3BiPUVkKHBifDAsQ3wwLDIxKXwwO2piPUM7Wj1IZChwYnwwLGpifDAsMjEpfDA7Xz1DOyRhPURkKHd8MCxIfDAsMTA0ODU3NiwwKXwwOyRhPUVkKCRhfDAsQ3wwLDIxKXwwO2FiPUM7dT1IZCgkYXwwLGFifDAsMjEpfDA7cz1DO19hPURkKE58MCxPfDAsMTA0ODU3NiwwKXwwO19hPUVkKF9hfDAsQ3wwLDIxKXwwO1phPUM7bj1IZChfYXwwLFphfDAsMjEpfDA7TD1DO3g9RGQoanwwLEF8MCwxMDQ4NTc2LDApfDA7eD1FZCh4fDAsQ3wwLDIxKXwwO3I9QztrPUhkKHh8MCxyfDAsMjEpfDA7ZmE9QztNPURkKEd8MCxKfDAsMTA0ODU3NiwwKXwwO009RWQoTXwwLEN8MCwyMSl8MDtxYT1DO2Y9SGQoTXwwLHFhfDAsMjEpfDA7bGE9QztoPURkKGd8MCxGfDAsMTA0ODU3NiwwKXwwO2g9RWQoaHwwLEN8MCwyMSl8MDt2YT1DO2dhPUhkKGh8MCx2YXwwLDIxKXwwO21hPUM7cmI9RGQoU3wwLFRhfDAsMTA0ODU3NiwwKXwwO3JiPUVkKHJifDAsQ3wwLDIxKXwwO29hPUM7amE9RGQocmJ8MCxvYXwwLEJ8MCxqYXwwKXwwO0I9QztvYT1IZChyYnwwLG9hfDAsMjEpfDA7b2E9Q2QoU3wwLFRhfDAsb2F8MCxDfDApfDA7VGE9QztTPURkKFFhfDAsc2J8MCwxMDQ4NTc2LDApfDA7Uz1FZChTfDAsQ3wwLDIxKXwwO3JiPUM7U2E9RGQoU3wwLHJifDAsUmF8MCxTYXwwKXwwO1JhPUM7cmI9SGQoU3wwLHJifDAsMjEpfDA7cmI9Q2QoUWF8MCxzYnwwLHJifDAsQ3wwKXwwO3NiPUM7UWE9RGQoUGF8MCxSfDAsMTA0ODU3NiwwKXwwO1FhPUVkKFFhfDAsQ3wwLDIxKXwwO1M9QztwPURkKFFhfDAsU3wwLFB8MCxwfDApfDA7UD1DO1M9SGQoUWF8MCxTfDAsMjEpfDA7Uz1DZChQYXwwLFJ8MCxTfDAsQ3wwKXwwO1I9QztQYT1PZChCYnwwLHl8MCw2NjY2NDMsMCl8MDtRYT1DO0FiPU9kKEJifDAseXwwLDQ3MDI5NiwwKXwwO3piPUM7cmE9T2QoQmJ8MCx5fDAsNjU0MTgzLDApfDA7c2E9Qzt3YT1PZChCYnwwLHl8MCwtOTk3ODA1LC0xKXwwO3hhPUM7bmE9T2QoQmJ8MCx5fDAsMTM2NjU3LDApfDA7VWE9Qzt5PU9kKEJifDAseXwwLC02ODM5MDEsLTEpfDA7eT1EZChDYnwwLHZ8MCx5fDAsQ3wwKXwwO2diPUNkKHl8MCxDfDAsZmJ8MCxnYnwwKXwwO3ZhPURkKGdifDAsQ3wwLGh8MCx2YXwwKXwwO2g9QztnYj1PZChwfDAsUHwwLDY2NjY0MywwKXwwO2ZiPUM7eT1PZChwfDAsUHwwLDQ3MDI5NiwwKXwwO3Y9QztDYj1PZChwfDAsUHwwLDY1NDE4MywwKXwwO0JiPUM7bD1PZChwfDAsUHwwLC05OTc4MDUsLTEpfDA7bT1DO2RiPU9kKHB8MCxQfDAsMTM2NjU3LDApfDA7ZWI9QztQPU9kKHB8MCxQfDAsLTY4MzkwMSwtMSl8MDtwPUM7Vz1PZChTfDAsUnwwLDY2NjY0MywwKXwwO1Y9QztpYj1PZChTfDAsUnwwLDQ3MDI5NiwwKXwwO2hiPUM7RT1PZChTfDAsUnwwLDY1NDE4MywwKXwwO0k9Qzt3Yj1PZChTfDAsUnwwLC05OTc4MDUsLTEpfDA7dmI9QztLPU9kKFN8MCxSfDAsMTM2NjU3LDApfDA7UT1DO1I9T2QoU3wwLFJ8MCwtNjgzOTAxLC0xKXwwO1M9Qzt4YT1EZCh0YnwwLHVifDAsd2F8MCx4YXwwKXwwO2ViPURkKHhhfDAsQ3wwLGRifDAsZWJ8MCl8MDtTPURkKGVifDAsQ3wwLFJ8MCxTfDApfDA7bWI9Q2QoU3wwLEN8MCxsYnwwLG1ifDApfDA7cWE9RGQobWJ8MCxDfDAsTXwwLHFhfDApfDA7TT1DO21iPU9kKFNhfDAsUmF8MCw2NjY2NDMsMCl8MDtsYj1DO1M9T2QoU2F8MCxSYXwwLDQ3MDI5NiwwKXwwO1I9QztlYj1PZChTYXwwLFJhfDAsNjU0MTgzLDApfDA7ZGI9Qzt4YT1PZChTYXwwLFJhfDAsLTk5NzgwNSwtMSl8MDt3YT1DO3ViPU9kKFNhfDAsUmF8MCwxMzY2NTcsMCl8MDt0Yj1DO1JhPU9kKFNhfDAsUmF8MCwtNjgzOTAxLC0xKXwwO1NhPUM7V2E9T2QocmJ8MCxzYnwwLDY2NjY0MywwKXwwO1ZhPUM7b2I9T2QocmJ8MCxzYnwwLDQ3MDI5NiwwKXwwO25iPUM7YWE9T2QocmJ8MCxzYnwwLDY1NDE4MywwKXwwOyQ9QztjYj1PZChyYnwwLHNifDAsLTk5NzgwNSwtMSl8MDtiYj1DO2hhPU9kKHJifDAsc2J8MCwxMzY2NTcsMCl8MDtpYT1DO3NiPU9kKHJifDAsc2J8MCwtNjgzOTAxLC0xKXwwO3JiPUM7emI9RGQoQ2J8MCxCYnwwLEFifDAsemJ8MCl8MDt4Yj1EZCh6YnwwLEN8MCx5YnwwLHhifDApfDA7dmI9RGQoeGJ8MCxDfDAsd2J8MCx2YnwwKXwwO3RiPURkKHZifDAsQ3wwLHVifDAsdGJ8MCl8MDtyYj1EZCh0YnwwLEN8MCxzYnwwLHJifDApfDA7a2I9Q2QocmJ8MCxDfDAscWJ8MCxrYnwwKXwwO3I9RGQoa2J8MCxDfDAseHwwLHJ8MCl8MDt4PUM7a2I9T2QoamF8MCxCfDAsNjY2NjQzLDApfDA7a2I9RGQocGJ8MCxqYnwwLGtifDAsQ3wwKXwwO1lhPURkKGtifDAsQ3wwLFhhfDAsWWF8MCl8MDtPYT1DZChZYXwwLEN8MCxOYXwwLE9hfDApfDA7TmE9QztZYT1PZChqYXwwLEJ8MCw0NzAyOTYsMCl8MDtYYT1DO2tiPU9kKGphfDAsQnwwLDY1NDE4MywwKXwwO2piPUM7bGI9RGQob2J8MCxuYnwwLG1ifDAsbGJ8MCl8MDtqYj1EZChsYnwwLEN8MCxrYnwwLGpifDApfDA7YWI9RGQoamJ8MCxDfDAsJGF8MCxhYnwwKXwwO2VhPURkKGFifDAsQ3wwLGRhfDAsZWF8MCl8MDtrYT1DZChlYXwwLEN8MCxjYXwwLGthfDApfDA7Y2E9QztlYT1PZChqYXwwLEJ8MCwtOTk3ODA1LC0xKXwwO2RhPUM7YWI9T2QoamF8MCxCfDAsMTM2NjU3LDApfDA7JGE9QztmYj1EZChpYnwwLGhifDAsZ2J8MCxmYnwwKXwwO2RiPURkKGZifDAsQ3wwLGVifDAsZGJ8MCl8MDtiYj1EZChkYnwwLEN8MCxjYnwwLGJifDApfDA7JGE9RGQoYmJ8MCxDfDAsYWJ8MCwkYXwwKXwwO1phPURkKCRhfDAsQ3wwLF9hfDAsWmF8MCl8MDtUPURkKFphfDAsQ3wwLFV8MCxUfDApfDA7emE9Q2QoVHwwLEN8MCxBYXwwLHphfDApfDA7QWE9QztCPU9kKGphfDAsQnwwLC02ODM5MDEsLTEpfDA7amE9QztUPURkKE9hfDAsTmF8MCwxMDQ4NTc2LDApfDA7VD1FZChUfDAsQ3wwLDIxKXwwO1U9QztWYT1EZChZYXwwLFhhfDAsV2F8MCxWYXwwKXwwO0g9RGQoVmF8MCxDfDAsd3wwLEh8MCl8MDtzPUNkKEh8MCxDfDAsdXwwLHN8MCl8MDtzPURkKHN8MCxDfDAsVHwwLFV8MCl8MDt1PUM7VT1IZChUfDAsVXwwLDIxKXwwO1Q9QztIPURkKGthfDAsY2F8MCwxMDQ4NTc2LDApfDA7SD1FZChIfDAsQ3wwLDIxKXwwO3c9QztWPURkKFN8MCxSfDAsV3wwLFZ8MCl8MDskPURkKFZ8MCxDfDAsYWF8MCwkfDApfDA7ZGE9RGQoJHwwLEN8MCxlYXwwLGRhfDApfDA7Tz1EZChkYXwwLEN8MCxOfDAsT3wwKXwwO0w9Q2QoT3wwLEN8MCxufDAsTHwwKXwwO0w9RGQoTHwwLEN8MCxIfDAsd3wwKXwwO249Qzt3PUhkKEh8MCx3fDAsMjEpfDA7SD1DO089RGQoemF8MCxBYXwwLDEwNDg1NzYsMCl8MDtPPUVkKE98MCxDfDAsMjEpfDA7Tj1DO1FhPURkKHl8MCx2fDAsUGF8MCxRYXwwKXwwO0k9RGQoUWF8MCxDfDAsRXwwLEl8MCl8MDt3YT1EZChJfDAsQ3wwLHhhfDAsd2F8MCl8MDtpYT1EZCh3YXwwLEN8MCxoYXwwLGlhfDApfDA7amE9RGQoaWF8MCxDfDAsQnwwLGphfDApfDA7QT1EZChqYXwwLEN8MCxqfDAsQXwwKXwwO2ZhPUNkKEF8MCxDfDAsa3wwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsT3wwLE58MCl8MDtrPUM7Tj1IZChPfDAsTnwwLDIxKXwwO089QztBPURkKHJ8MCx4fDAsMTA0ODU3NiwwKXwwO0E9RWQoQXwwLEN8MCwyMSl8MDtqPUM7c2E9RGQobHwwLG18MCxyYXwwLHNhfDApfDA7UT1EZChzYXwwLEN8MCxLfDAsUXwwKXwwO1NhPURkKFF8MCxDfDAsUmF8MCxTYXwwKXwwO0o9RGQoU2F8MCxDfDAsR3wwLEp8MCl8MDtsYT1DZChKfDAsQ3wwLGZ8MCxsYXwwKXwwO2xhPURkKGxhfDAsQ3wwLEF8MCxqfDApfDA7Zj1DO2o9SGQoQXwwLGp8MCwyMSl8MDtqPUNkKHJ8MCx4fDAsanwwLEN8MCl8MDt4PUM7cj1EZChxYXwwLE18MCwxMDQ4NTc2LDApfDA7cj1FZChyfDAsQ3wwLDIxKXwwO0E9QztVYT1EZChQfDAscHwwLG5hfDAsVWF8MCl8MDtGPURkKFVhfDAsQ3wwLGd8MCxGfDApfDA7bWE9Q2QoRnwwLEN8MCxnYXwwLG1hfDApfDA7bWE9RGQobWF8MCxDfDAscnwwLEF8MCl8MDtnYT1DO0E9SGQocnwwLEF8MCwyMSl8MDtBPUNkKHFhfDAsTXwwLEF8MCxDfDApfDA7TT1DO3FhPURkKHZhfDAsaHwwLDEwNDg1NzYsMCl8MDtxYT1FZChxYXwwLEN8MCwyMSl8MDtyPUM7VGE9RGQocWF8MCxyfDAsb2F8MCxUYXwwKXwwO29hPUM7cj1IZChxYXwwLHJ8MCwyMSl8MDtyPUNkKHZhfDAsaHwwLHJ8MCxDfDApfDA7aD1DO3ZhPURkKHN8MCx1fDAsMTA0ODU3NiwwKXwwO3ZhPUVkKHZhfDAsQ3wwLDIxKXwwO3FhPUM7Rj1IZCh2YXwwLHFhfDAsMjEpfDA7Zz1DO1VhPURkKEx8MCxufDAsMTA0ODU3NiwwKXwwO1VhPUVkKFVhfDAsQ3wwLDIxKXwwO25hPUM7cD1IZChVYXwwLG5hfDAsMjEpfDA7UD1DO0o9RGQoZmF8MCxrfDAsMTA0ODU3NiwwKXwwO0o9RWQoSnwwLEN8MCwyMSl8MDtHPUM7eD1EZChKfDAsR3wwLGp8MCx4fDApfDA7aj1DO0c9SGQoSnwwLEd8MCwyMSl8MDtHPUNkKGZhfDAsa3wwLEd8MCxDfDApfDA7az1DO2ZhPURkKGxhfDAsZnwwLDEwNDg1NzYsMCl8MDtmYT1FZChmYXwwLEN8MCwyMSl8MDtKPUM7TT1EZChmYXwwLEp8MCxBfDAsTXwwKXwwO0E9QztKPUhkKGZhfDAsSnwwLDIxKXwwO0o9Q2QobGF8MCxmfDAsSnwwLEN8MCl8MDtmPUM7bGE9RGQobWF8MCxnYXwwLDEwNDg1NzYsMCl8MDtsYT1FZChsYXwwLEN8MCwyMSl8MDtmYT1DO2g9RGQobGF8MCxmYXwwLHJ8MCxofDApfDA7cj1DO2ZhPUhkKGxhfDAsZmF8MCwyMSl8MDtmYT1DZChtYXwwLGdhfDAsZmF8MCxDfDApfDA7Z2E9QzttYT1PZChUYXwwLG9hfDAsNjY2NjQzLDApfDA7bGE9QztTYT1PZChUYXwwLG9hfDAsNDcwMjk2LDApfDA7UmE9QztRPU9kKFRhfDAsb2F8MCw2NTQxODMsMCl8MDtLPUM7c2E9T2QoVGF8MCxvYXwwLC05OTc4MDUsLTEpfDA7cmE9QzttPU9kKFRhfDAsb2F8MCwxMzY2NTcsMCl8MDtsPUM7b2E9T2QoVGF8MCxvYXwwLC02ODM5MDEsLTEpfDA7b2E9RGQoVWF8MCxuYXwwLG9hfDAsQ3wwKXwwO0FhPURkKG9hfDAsQ3wwLHphfDAsQWF8MCl8MDtPPUNkKEFhfDAsQ3wwLE58MCxPfDApfDA7Tj1DO0FhPU9kKGh8MCxyfDAsNjY2NjQzLDApfDA7emE9QztvYT1PZChofDAscnwwLDQ3MDI5NiwwKXwwO25hPUM7VWE9T2QoaHwwLHJ8MCw2NTQxODMsMCl8MDtUYT1DO2phPU9kKGh8MCxyfDAsLTk5NzgwNSwtMSl8MDtCPUM7aWE9T2QoaHwwLHJ8MCwxMzY2NTcsMCl8MDtoYT1DO3I9T2QoaHwwLHJ8MCwtNjgzOTAxLC0xKXwwO2g9Qzt3YT1PZChmYXwwLGdhfDAsNjY2NjQzLDApfDA7d2E9RGQoeWF8MCxwYXwwLHdhfDAsQ3wwKXwwO3BhPUM7eWE9T2QoZmF8MCxnYXwwLDQ3MDI5NiwwKXwwO3hhPUM7ST1PZChmYXwwLGdhfDAsNjU0MTgzLDApfDA7RT1DO1FhPU9kKGZhfDAsZ2F8MCwtOTk3ODA1LC0xKXwwO1BhPUM7dj1PZChmYXwwLGdhfDAsMTM2NjU3LDApfDA7eT1DO2dhPU9kKGZhfDAsZ2F8MCwtNjgzOTAxLC0xKXwwO2ZhPUM7cmE9RGQoaWF8MCxoYXwwLHNhfDAscmF8MCl8MDtmYT1EZChyYXwwLEN8MCxnYXwwLGZhfDApfDA7cWE9RGQoZmF8MCxDfDAsdmF8MCxxYXwwKXwwO2NhPURkKHFhfDAsQ3wwLGthfDAsY2F8MCl8MDtIPUNkKGNhfDAsQ3wwLHd8MCxIfDApfDA7dz1DO2NhPU9kKE18MCxBfDAsNjY2NjQzLDApfDA7a2E9QztxYT1PZChNfDAsQXwwLDQ3MDI5NiwwKXwwO3FhPURkKHdhfDAscGF8MCxxYXwwLEN8MCl8MDtwYT1DO3dhPU9kKE18MCxBfDAsNjU0MTgzLDApfDA7dmE9QztmYT1PZChNfDAsQXwwLC05OTc4MDUsLTEpfDA7Z2E9QztyYT1PZChNfDAsQXwwLDEzNjY1NywwKXwwO3NhPUM7QT1PZChNfDAsQXwwLC02ODM5MDEsLTEpfDA7TT1DO2hhPU9kKEp8MCxmfDAsNjY2NjQzLDApfDA7aWE9QztkYT1PZChKfDAsZnwwLDQ3MDI5NiwwKXwwO2VhPUM7JD1PZChKfDAsZnwwLDY1NDE4MywwKXwwO2FhPUM7Vj1PZChKfDAsZnwwLC05OTc4MDUsLTEpfDA7Vz1DO1I9T2QoSnwwLGZ8MCwxMzY2NTcsMCl8MDtTPUM7Zj1PZChKfDAsZnwwLC02ODM5MDEsLTEpfDA7Sj1DO1JhPURkKFVhfDAsVGF8MCxTYXwwLFJhfDApfDA7UGE9RGQoUmF8MCxDfDAsUWF8MCxQYXwwKXwwO05hPURkKFBhfDAsQ3wwLE9hfDAsTmF8MCl8MDtUPUNkKE5hfDAsQ3wwLFV8MCxUfDApfDA7c2E9RGQoVHwwLEN8MCxyYXwwLHNhfDApfDA7Sj1EZChzYXwwLEN8MCxmfDAsSnwwKXwwO2Y9QztzYT1PZCh4fDAsanwwLDY2NjY0MywwKXwwO2JhPURkKHNhfDAsQ3wwLER8MCxiYXwwKXwwO0Q9QztzYT1PZCh4fDAsanwwLDQ3MDI5NiwwKXwwO3JhPUM7VD1PZCh4fDAsanwwLDY1NDE4MywwKXwwO1U9QztKYT1EZChNYXwwLExhfDAsS2F8MCxKYXwwKXwwO0hhPUNkKEphfDAsQ3wwLElhfDAsSGF8MCl8MDtrYT1EZChIYXwwLEN8MCxjYXwwLGthfDApfDA7VT1EZChrYXwwLEN8MCxUfDAsVXwwKXwwO2VhPURkKFV8MCxDfDAsZGF8MCxlYXwwKXwwO2RhPUM7VT1PZCh4fDAsanwwLC05OTc4MDUsLTEpfDA7VD1DO2thPU9kKHh8MCxqfDAsMTM2NjU3LDApfDA7Y2E9QztEYT1EZChHYXwwLEZhfDAsRWF8MCxEYXwwKXwwO0JhPUNkKERhfDAsQ3wwLENhfDAsQmF8MCl8MDt6YT1EZChCYXwwLEN8MCxBYXwwLHphfDApfDA7eGE9RGQoemF8MCxDfDAseWF8MCx4YXwwKXwwO3ZhPURkKHhhfDAsQ3wwLHdhfDAsdmF8MCl8MDtjYT1EZCh2YXwwLEN8MCxrYXwwLGNhfDApfDA7Vz1EZChjYXwwLEN8MCxWfDAsV3wwKXwwO1Y9QztqPU9kKHh8MCxqfDAsLTY4MzkwMSwtMSl8MDt4PUM7Y2E9RGQoYmF8MCxEfDAsMTA0ODU3NiwwKXwwO2NhPUVkKGNhfDAsQ3wwLDIxKXwwO2thPUM7cmE9RGQodWF8MCx0YXwwLHNhfDAscmF8MCl8MDtpYT1EZChyYXwwLEN8MCxoYXwwLGlhfDApfDA7aWE9RGQoaWF8MCxDfDAsY2F8MCxrYXwwKXwwO2hhPUM7a2E9SGQoY2F8MCxrYXwwLDIxKXwwO2thPUNkKGJhfDAsRHwwLGthfDAsQ3wwKXwwO0Q9QztiYT1EZChlYXwwLGRhfDAsMTA0ODU3NiwwKXwwO2JhPUVkKGJhfDAsQ3wwLDIxKXwwO2NhPUM7VD1EZChxYXwwLHBhfDAsVXwwLFR8MCl8MDthYT1EZChUfDAsQ3wwLCR8MCxhYXwwKXwwO2FhPURkKGFhfDAsQ3wwLGJhfDAsY2F8MCl8MDskPUM7Y2E9SGQoYmF8MCxjYXwwLDIxKXwwO2JhPUM7VD1EZChXfDAsVnwwLDEwNDg1NzYsMCl8MDtUPUVkKFR8MCxDfDAsMjEpfDA7VT1DO2xhPURkKG9hfDAsbmF8MCxtYXwwLGxhfDApfDA7RT1EZChsYXwwLEN8MCxJfDAsRXwwKXwwO1k9RGQoRXwwLEN8MCxYfDAsWXwwKXwwO189Q2QoWXwwLEN8MCxafDAsX3wwKXwwO2dhPURkKF98MCxDfDAsZmF8MCxnYXwwKXwwO3g9RGQoZ2F8MCxDfDAsanwwLHh8MCl8MDtTPURkKHh8MCxDfDAsUnwwLFN8MCl8MDtTPURkKFN8MCxDfDAsVHwwLFV8MCl8MDtSPUM7VT1IZChUfDAsVXwwLDIxKXwwO1Q9Qzt4PURkKEp8MCxmfDAsMTA0ODU3NiwwKXwwO3g9RWQoeHwwLEN8MCwyMSl8MDtqPUM7Sz1EZChqYXwwLEJ8MCxRfDAsS3wwKXwwO3k9RGQoS3wwLEN8MCx2fDAseXwwKXwwO3U9RGQoeXwwLEN8MCxzfDAsdXwwKXwwO2c9Q2QodXwwLEN8MCxGfDAsZ3wwKXwwO009RGQoZ3wwLEN8MCxBfDAsTXwwKXwwO009RGQoTXwwLEN8MCx4fDAsanwwKXwwO0E9QztqPUhkKHh8MCxqfDAsMjEpfDA7aj1DZChKfDAsZnwwLGp8MCxDfDApfDA7Zj1DO0o9RGQoSHwwLHd8MCwxMDQ4NTc2LDApfDA7Sj1FZChKfDAsQ3wwLDIxKXwwO3g9QztsPURkKHJ8MCxofDAsbXwwLGx8MCl8MDtuPURkKGx8MCxDfDAsTHwwLG58MCl8MDtuPURkKG58MCxDfDAsSnwwLHh8MCl8MDtQPUNkKG58MCxDfDAscHwwLFB8MCl8MDtwPUM7eD1IZChKfDAseHwwLDIxKXwwO3g9Q2QoSHwwLHd8MCx4fDAsQ3wwKXwwO3c9QztIPURkKE98MCxOfDAsMTA0ODU3NiwwKXwwO0g9RWQoSHwwLEN8MCwyMSl8MDtKPUM7az1EZChHfDAsa3wwLEh8MCxKfDApfDA7Rz1DO0o9SGQoSHwwLEp8MCwyMSl8MDtIPUM7bj1EZChpYXwwLGhhfDAsMTA0ODU3NiwwKXwwO249RWQobnwwLEN8MCwyMSl8MDtMPUM7bD1IZChufDAsTHwwLDIxKXwwO209QztoPURkKGFhfDAsJHwwLDEwNDg1NzYsMCl8MDtoPUVkKGh8MCxDfDAsMjEpfDA7cj1DO2c9SGQoaHwwLHJ8MCwyMSl8MDtGPUM7dT1EZChTfDAsUnwwLDEwNDg1NzYsMCl8MDt1PUVkKHV8MCxDfDAsMjEpfDA7cz1DO2Y9RGQoanwwLGZ8MCx1fDAsc3wwKXwwO2o9QztzPUhkKHV8MCxzfDAsMjEpfDA7dT1DO3k9RGQoTXwwLEF8MCwxMDQ4NTc2LDApfDA7eT1FZCh5fDAsQ3wwLDIxKXwwO3Y9Qzt3PURkKHh8MCx3fDAseXwwLHZ8MCl8MDt4PUM7dj1IZCh5fDAsdnwwLDIxKXwwO3Y9Q2QoTXwwLEF8MCx2fDAsQ3wwKXwwO0E9QztNPURkKFB8MCxwfDAsMTA0ODU3NiwwKXwwO009RWQoTXwwLEN8MCwyMSl8MDt5PUM7Sz1IZChNfDAseXwwLDIxKXwwO0s9Q2QoUHwwLHB8MCxLfDAsQ3wwKXwwO3A9QztQPURkKGt8MCxHfDAsMTA0ODU3NiwwKXwwO1A9RWQoUHwwLEN8MCwyMSl8MDtRPUM7Qj1IZChQfDAsUXwwLDIxKXwwO0I9Q2Qoa3wwLEd8MCxCfDAsQ3wwKXwwO0c9QztrPU9kKFB8MCxRfDAsNjY2NjQzLDApfDA7az1EZChrYXwwLER8MCxrfDAsQ3wwKXwwO0Q9QztrYT1PZChQfDAsUXwwLDQ3MDI5NiwwKXwwO2phPUM7Z2E9T2QoUHwwLFF8MCw2NTQxODMsMCl8MDtmYT1DO189T2QoUHwwLFF8MCwtOTk3ODA1LC0xKXwwO1o9QztZPU9kKFB8MCxRfDAsMTM2NjU3LDApfDA7WD1DO1E9T2QoUHwwLFF8MCwtNjgzOTAxLC0xKXwwO1A9QztFPUVkKGt8MCxEfDAsMjEpfDA7ST1DO2hhPURkKGthfDAsamF8MCxpYXwwLGhhfDApfDA7bT1DZChoYXwwLEN8MCxsfDAsbXwwKXwwO209RGQobXwwLEN8MCxFfDAsSXwwKXwwO2w9QztJPUhkKEV8MCxJfDAsMjEpfDA7ST1DZChrfDAsRHwwLEl8MCxDfDApfDA7RD1DO2s9RWQobXwwLGx8MCwyMSl8MDtFPUM7ZGE9RGQoZ2F8MCxmYXwwLGVhfDAsZGF8MCl8MDtiYT1DZChkYXwwLEN8MCxjYXwwLGJhfDApfDA7TD1EZChiYXwwLEN8MCxufDAsTHwwKXwwO0w9RGQoTHwwLEN8MCxrfDAsRXwwKXwwO249QztFPUhkKGt8MCxFfDAsMjEpfDA7RT1DZChtfDAsbHwwLEV8MCxDfDApfDA7bD1DO209RWQoTHwwLG58MCwyMSl8MDtrPUM7Wj1EZChhYXwwLCR8MCxffDAsWnwwKXwwO0Y9Q2QoWnwwLEN8MCxnfDAsRnwwKXwwO0Y9RGQoRnwwLEN8MCxtfDAsa3wwKXwwO2c9QztrPUhkKG18MCxrfDAsMjEpfDA7az1DZChMfDAsbnwwLGt8MCxDfDApfDA7bj1DO0w9RWQoRnwwLGd8MCwyMSl8MDttPUM7Vj1EZChZfDAsWHwwLFd8MCxWfDApfDA7VD1DZChWfDAsQ3wwLFV8MCxUfDApfDA7cj1EZChUfDAsQ3wwLGh8MCxyfDApfDA7cj1EZChyfDAsQ3wwLEx8MCxtfDApfDA7aD1DO209SGQoTHwwLG18MCwyMSl8MDttPUNkKEZ8MCxnfDAsbXwwLEN8MCl8MDtnPUM7Rj1FZChyfDAsaHwwLDIxKXwwO0w9QztQPURkKFN8MCxSfDAsUXwwLFB8MCl8MDt1PUNkKFB8MCxDfDAsc3wwLHV8MCl8MDt1PURkKHV8MCxDfDAsRnwwLEx8MCl8MDtzPUM7TD1IZChGfDAsTHwwLDIxKXwwO0w9Q2QocnwwLGh8MCxMfDAsQ3wwKXwwO2g9QztyPUVkKHV8MCxzfDAsMjEpfDA7Rj1DO2o9RGQoZnwwLGp8MCxyfDAsRnwwKXwwO2Y9QztGPUhkKHJ8MCxGfDAsMjEpfDA7Rj1DZCh1fDAsc3wwLEZ8MCxDfDApfDA7cz1DO3U9RWQoanwwLGZ8MCwyMSl8MDtyPUM7QT1EZCh1fDAscnwwLHZ8MCxBfDApfDA7dj1DO3I9SGQodXwwLHJ8MCwyMSl8MDtyPUNkKGp8MCxmfDAscnwwLEN8MCl8MDtmPUM7aj1FZChBfDAsdnwwLDIxKXwwO3U9Qzt4PURkKHd8MCx4fDAsanwwLHV8MCl8MDt3PUM7dT1IZChqfDAsdXwwLDIxKXwwO3U9Q2QoQXwwLHZ8MCx1fDAsQ3wwKXwwO3Y9QztBPUVkKHh8MCx3fDAsMjEpfDA7aj1DO3A9RGQoQXwwLGp8MCxLfDAscHwwKXwwO0s9QztqPUhkKEF8MCxqfDAsMjEpfDA7aj1DZCh4fDAsd3wwLGp8MCxDfDApfDA7dz1DO3g9RWQocHwwLEt8MCwyMSl8MDtBPUM7eT1EZChPfDAsTnwwLE18MCx5fDApfDA7SD1DZCh5fDAsQ3wwLEp8MCxIfDApfDA7SD1EZChIfDAsQ3wwLHh8MCxBfDApfDA7Sj1DO0E9SGQoeHwwLEF8MCwyMSl8MDtBPUNkKHB8MCxLfDAsQXwwLEN8MCl8MDtLPUM7cD1FZChIfDAsSnwwLDIxKXwwO3g9QztHPURkKHB8MCx4fDAsQnwwLEd8MCl8MDtCPUM7eD1IZChwfDAseHwwLDIxKXwwO3g9Q2QoSHwwLEp8MCx4fDAsQ3wwKXwwO0o9QztIPUVkKEd8MCxCfDAsMjEpfDA7cD1DO3k9SGQoSHwwLHB8MCwyMSl8MDt5PUNkKEd8MCxCfDAseXwwLEN8MCl8MDtCPUM7Rz1PZChIfDAscHwwLDY2NjY0MywwKXwwO0Q9RGQoR3wwLEN8MCxJfDAsRHwwKXwwO0k9QztHPU9kKEh8MCxwfDAsNDcwMjk2LDApfDA7Rz1EZChFfDAsbHwwLEd8MCxDfDApfDA7bD1DO0U9T2QoSHwwLHB8MCw2NTQxODMsMCl8MDtFPURkKGt8MCxufDAsRXwwLEN8MCl8MDtuPUM7az1PZChIfDAscHwwLC05OTc4MDUsLTEpfDA7az1EZChtfDAsZ3wwLGt8MCxDfDApfDA7Zz1DO209T2QoSHwwLHB8MCwxMzY2NTcsMCl8MDttPURkKEx8MCxofDAsbXwwLEN8MCl8MDtoPUM7cD1PZChIfDAscHwwLC02ODM5MDEsLTEpfDA7cD1EZChGfDAsc3wwLHB8MCxDfDApfDA7cz1DO0Y9RWQoRHwwLEl8MCwyMSl8MDtIPUM7bD1EZChHfDAsbHwwLEZ8MCxIfDApfDA7Rz1DO0g9SGQoRnwwLEh8MCwyMSl8MDtIPUNkKER8MCxJfDAsSHwwLEN8MCl8MDtJPUM7RD1FZChsfDAsR3wwLDIxKXwwO0Y9QztuPURkKEV8MCxufDAsRHwwLEZ8MCl8MDtFPUM7Rj1IZChEfDAsRnwwLDIxKXwwO0Y9Q2QobHwwLEd8MCxGfDAsQ3wwKXwwO0c9QztsPUVkKG58MCxFfDAsMjEpfDA7RD1DO2c9RGQoa3wwLGd8MCxsfDAsRHwwKXwwO2s9QztEPUhkKGx8MCxEfDAsMjEpfDA7RD1DZChufDAsRXwwLER8MCxDfDApfDA7RT1DO249RWQoZ3wwLGt8MCwyMSl8MDtsPUM7aD1EZChtfDAsaHwwLG58MCxsfDApfDA7bT1DO2w9SGQobnwwLGx8MCwyMSl8MDtsPUNkKGd8MCxrfDAsbHwwLEN8MCl8MDtrPUM7Zz1FZChofDAsbXwwLDIxKXwwO249QztzPURkKHB8MCxzfDAsZ3wwLG58MCl8MDtwPUM7bj1IZChnfDAsbnwwLDIxKXwwO249Q2QoaHwwLG18MCxufDAsQ3wwKXwwO209QztoPUVkKHN8MCxwfDAsMjEpfDA7Zz1DO2Y9RGQoaHwwLGd8MCxyfDAsZnwwKXwwO3I9QztnPUhkKGh8MCxnfDAsMjEpfDA7Zz1DZChzfDAscHwwLGd8MCxDfDApfDA7cD1DO3M9RWQoZnwwLHJ8MCwyMSl8MDtoPUM7dj1EZChzfDAsaHwwLHV8MCx2fDApfDA7dT1DO2g9SGQoc3wwLGh8MCwyMSl8MDtoPUNkKGZ8MCxyfDAsaHwwLEN8MCl8MDtyPUM7Zj1FZCh2fDAsdXwwLDIxKXwwO3M9Qzt3PURkKGZ8MCxzfDAsanwwLHd8MCl8MDtqPUM7cz1IZChmfDAsc3wwLDIxKXwwO3M9Q2QodnwwLHV8MCxzfDAsQ3wwKXwwO3U9Qzt2PUVkKHd8MCxqfDAsMjEpfDA7Zj1DO0s9RGQodnwwLGZ8MCxBfDAsS3wwKXwwO0E9QztmPUhkKHZ8MCxmfDAsMjEpfDA7Zj1DZCh3fDAsanwwLGZ8MCxDfDApfDA7aj1DO3c9RWQoS3wwLEF8MCwyMSl8MDt2PUM7Sj1EZCh3fDAsdnwwLHh8MCxKfDApfDA7eD1DO3Y9SGQod3wwLHZ8MCwyMSl8MDt2PUNkKEt8MCxBfDAsdnwwLEN8MCl8MDtBPUM7Sz1FZChKfDAseHwwLDIxKXwwO3c9QztCPURkKEt8MCx3fDAseXwwLEJ8MCl8MDt5PUM7dz1IZChLfDAsd3wwLDIxKXwwO3c9Q2QoSnwwLHh8MCx3fDAsQ3wwKXwwO3g9QzthW28+PjBdPUg7bz1HZChIfDAsSXwwLDgpfDA7YVtiKzMzPj4wXT1vO289R2QoSHwwLEl8MCwxNil8MDtJPUM7SD1IZChGfDAsR3wwLDUpfDA7YVtiKzM0Pj4wXT1IfG87bz1HZChGfDAsR3wwLDMpfDA7YVtiKzM1Pj4wXT1vO289R2QoRnwwLEd8MCwxMSl8MDthW2IrMzY+PjBdPW87bz1HZChGfDAsR3wwLDE5KXwwO0c9QztGPUhkKER8MCxFfDAsMil8MDthW2IrMzc+PjBdPUZ8bztvPUdkKER8MCxFfDAsNil8MDthW2IrMzg+PjBdPW87bz1HZChEfDAsRXwwLDE0KXwwO0U9QztEPUhkKGx8MCxrfDAsNyl8MDthW2IrMzk+PjBdPUR8bztvPUdkKGx8MCxrfDAsMSl8MDthW2IrNDA+PjBdPW87bz1HZChsfDAsa3wwLDkpfDA7YVtiKzQxPj4wXT1vO289R2QobHwwLGt8MCwxNyl8MDtrPUM7bD1IZChufDAsbXwwLDQpfDA7YVtiKzQyPj4wXT1sfG87bz1HZChufDAsbXwwLDQpfDA7YVtiKzQzPj4wXT1vO289R2QobnwwLG18MCwxMil8MDthW2IrNDQ+PjBdPW87bz1HZChufDAsbXwwLDIwKXwwO209QztuPUhkKGd8MCxwfDAsMSl8MDthW2IrNDU+PjBdPW58bztvPUdkKGd8MCxwfDAsNyl8MDthW2IrNDY+PjBdPW87cD1HZChnfDAscHwwLDE1KXwwO289QztnPUhkKGh8MCxyfDAsNil8MDthW2IrNDc+PjBdPWd8cDtwPUdkKGh8MCxyfDAsMil8MDthW2IrNDg+PjBdPXA7cD1HZChofDAscnwwLDEwKXwwO2FbYis0OT4+MF09cDtyPUdkKGh8MCxyfDAsMTgpfDA7aD1DO3A9SGQoc3wwLHV8MCwzKXwwO2FbYis1MD4+MF09cHxyO3I9R2Qoc3wwLHV8MCw1KXwwO2FbYis1MT4+MF09cjt1PUdkKHN8MCx1fDAsMTMpfDA7YVtiKzUyPj4wXT11O2FbYis1Mz4+MF09Zjt1PUdkKGZ8MCxqfDAsOCl8MDthW2IrNTQ+PjBdPXU7aj1HZChmfDAsanwwLDE2KXwwO2Y9Qzt1PUhkKHZ8MCxBfDAsNSl8MDthW2IrNTU+PjBdPXV8ajtqPUdkKHZ8MCxBfDAsMyl8MDthW2IrNTY+PjBdPWo7aj1HZCh2fDAsQXwwLDExKXwwO2FbYis1Nz4+MF09ajtBPUdkKHZ8MCxBfDAsMTkpfDA7dj1DO2o9SGQod3wwLHh8MCwyKXwwO2FbYis1OD4+MF09anxBO0E9R2Qod3wwLHh8MCw2KXwwO2FbYis1OT4+MF09QTt4PUdkKHd8MCx4fDAsMTQpfDA7dz1DO0E9SGQoQnwwLHl8MCw3KXwwO2FbYis2MD4+MF09eHxBO0E9R2QoQnwwLHl8MCwxKXwwO2FbYis2MT4+MF09QTtBPUdkKEJ8MCx5fDAsOSl8MDthW2IrNjI+PjBdPUE7eT1HZChCfDAseXwwLDE3KXwwO2FbYis2Mz4+MF09eTt5PXE7Qj15KzY0fDA7ZG97YVt5Pj4wXT0wO3k9eSsxfDB9d2hpbGUoKHl8MCk8KEJ8MCkpO3k9dDtCPXkrNjR8MDtkb3thW3k+PjBdPTA7eT15KzF8MH13aGlsZSgoeXwwKTwoQnwwKSk7aWYoIWUpe2k9ejtyZXR1cm59RWM9ZTtjW0VjPj4yXT02NDtjW0VjKzQ+PjJdPTA7aT16O3JldHVybn1mdW5jdGlvbiBZYyhiLGMpe2I9YnwwO2M9Y3wwO3JldHVybiAoKCgoYVtjKzE+PjBdXmFbYisxPj4wXXxhW2M+PjBdXmFbYj4+MF18YVtjKzI+PjBdXmFbYisyPj4wXXxhW2MrMz4+MF1eYVtiKzM+PjBdfGFbYys0Pj4wXV5hW2IrND4+MF18YVtjKzU+PjBdXmFbYis1Pj4wXXxhW2MrNj4+MF1eYVtiKzY+PjBdfGFbYys3Pj4wXV5hW2IrNz4+MF18YVtjKzg+PjBdXmFbYis4Pj4wXXxhW2MrOT4+MF1eYVtiKzk+PjBdfGFbYysxMD4+MF1eYVtiKzEwPj4wXXxhW2MrMTE+PjBdXmFbYisxMT4+MF18YVtjKzEyPj4wXV5hW2IrMTI+PjBdfGFbYysxMz4+MF1eYVtiKzEzPj4wXXxhW2MrMTQ+PjBdXmFbYisxND4+MF18YVtjKzE1Pj4wXV5hW2IrMTU+PjBdfGFbYysxNj4+MF1eYVtiKzE2Pj4wXXxhW2MrMTc+PjBdXmFbYisxNz4+MF18YVtjKzE4Pj4wXV5hW2IrMTg+PjBdfGFbYysxOT4+MF1eYVtiKzE5Pj4wXXxhW2MrMjA+PjBdXmFbYisyMD4+MF18YVtjKzIxPj4wXV5hW2IrMjE+PjBdfGFbYysyMj4+MF1eYVtiKzIyPj4wXXxhW2MrMjM+PjBdXmFbYisyMz4+MF18YVtjKzI0Pj4wXV5hW2IrMjQ+PjBdfGFbYysyNT4+MF1eYVtiKzI1Pj4wXXxhW2MrMjY+PjBdXmFbYisyNj4+MF18YVtjKzI3Pj4wXV5hW2IrMjc+PjBdfGFbYysyOD4+MF1eYVtiKzI4Pj4wXXxhW2MrMjk+PjBdXmFbYisyOT4+MF18YVtjKzMwPj4wXV5hW2IrMzA+PjBdfGFbYyszMT4+MF1eYVtiKzMxPj4wXSkmMjU1KSs1MTF8MCk+Pj44JjEpKy0xfDB9ZnVuY3Rpb24gWmMoYSl7YT1hfDA7Y1s3OTc2XT1hO3JldHVybiAwfWZ1bmN0aW9uIF9jKCl7cmV0dXJuIEJhKDApfDB9ZnVuY3Rpb24gJGMoKXtCYSgxKTtyZXR1cm59ZnVuY3Rpb24gYWQoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1jWzc5NzZdfDA7aWYoKGJ8MCkhPTA/KGQ9Y1tiKzEyPj4yXXwwLChkfDApIT0wKTowKXthPUVhW2QmMzFdKGEpfDA7cmV0dXJuIGF8MH1pZihhPj4+MDwyKXthPTA7cmV0dXJuIGF8MH1iPSgoMC1hfDApPj4+MCklKGE+Pj4wKXwwO2RvIGQ9QmEoMCl8MDt3aGlsZShkPj4+MDxiPj4+MCk7YT0oZD4+PjApJShhPj4+MCl8MDtyZXR1cm4gYXwwfWZ1bmN0aW9uIGJkKGIsYyl7Yj1ifDA7Yz1jfDA7dmFyIGQ9MDtpZighYylyZXR1cm47ZWxzZSBkPTA7ZG97YVtiK2Q+PjBdPUJhKDApfDA7ZD1kKzF8MH13aGlsZSgoZHwwKSE9KGN8MCkpO3JldHVybn1mdW5jdGlvbiBjZCgpe3ZhciBhPTA7YT1jWzc5NzZdfDA7aWYoIWEpe2E9MDtyZXR1cm4gYXwwfWE9Y1thKzIwPj4yXXwwO2lmKCFhKXthPTA7cmV0dXJuIGF8MH1hPURhW2EmMzFdKCl8MDtyZXR1cm4gYXwwfWZ1bmN0aW9uIGRkKCl7dmFyIGE9MCxiPTA7aWYoY1s3OTc3XXwwKXtiPTE7cmV0dXJuIGJ8MH1CYSgxKTthPW5hKDMwKXwwO2lmKChhfDApPjApY1s3OTc4XT1hO2Vsc2UgYT1jWzc5NzhdfDA7aWYoYT4+PjA8MTYpcmEoKTtlbHNlIGI9MDtkb3tCYSgwKXwwO2I9YisxfDB9d2hpbGUoKGJ8MCkhPTE2KTtjWzc5NzddPTE7Yj0wO3JldHVybiBifDB9ZnVuY3Rpb24gZWQoYSxiKXthPWF8MDtiPWJ8MDtGZChhfDAsMCxifDApfDA7cmV0dXJufWZ1bmN0aW9uIGZkKGIsYyxlLGYpe2I9YnwwO2M9Y3wwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGk9MCxqPTA7Zz1mPDwxO2lmKCEoZj4+PjA8MjE0NzQ4MzY0NyZnPj4+MDxjPj4+MCkpcmEoKTtpZighZil7Zj0wO2Y9YitmfDA7YVtmPj4wXT0wO3JldHVybiBifDB9ZWxzZSBjPTA7ZG97aj1kW2UrYz4+MF18MDtpPWomMTU7aj1qPj4+NDtoPWM8PDE7YVtiK2g+PjBdPWorODcrKChqKzY1NTI2fDApPj4+OCYyMTcpO2FbYisoaHwxKT4+MF09KChpPDw4KSsyMjI3MisoaSs2NTUyNiY1NTU1Mil8MCk+Pj44O2M9YysxfDB9d2hpbGUoKGN8MCkhPShmfDApKTtqPWIrZ3wwO2Fbaj4+MF09MDtyZXR1cm4gYnwwfWZ1bmN0aW9uIGdkKGIsZSxmLGcsaCxpLGope2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2E6ZG8gaWYoIWcpe249MDtsPTA7bz0wO2s9MH1lbHNle2I6ZG8gaWYoIWgpe249MDtyPTA7bD0wO2s9MDt3aGlsZSgxKXtwPWRbZitsPj4wXXwwO209cF40ODtvPShtKzY1NTI2fDApPj4+ODtwPShwJjIyMykrMjAxfDA7cT1wJjI1NTtxPShxKzY1NTI2XnErNjU1MjApPj4+ODtpZighKChxfG8pJjI1NSkpe289MDticmVhayBhfW09cSZwfG8mbTtpZihuPj4+MD49ZT4+PjApe209azticmVhayBifWlmKCEoazw8MjQ+PjI0KSltPW08PDQmMjU1O2Vsc2V7YVtiK24+PjBdPW18ciYyNTU7bj1uKzF8MDttPXJ9az0oayYyNTVeMjU1KSYyNTU7bD1sKzF8MDtpZihsPj4+MDxnPj4+MClyPW07ZWxzZXtvPTA7YnJlYWsgYX19fWVsc2V7bj0wO3U9MDtsPTA7az0wO3doaWxlKDEpe3Q9azw8MjQ+PjI0PT0wO2M6ZG8gaWYoIXQpe3E9ZFtmK2w+PjBdfDA7bT1xXjQ4O289KG0rNjU1MjZ8MCk+Pj44O3E9KHEmMjIzKSsyMDF8MDtwPXEmMjU1O3A9KHArNjU1MjZecCs2NTUyMCk+Pj44O2lmKCEoKHB8bykmMjU1KSl7bz0wO2JyZWFrIGF9fWVsc2Ugd2hpbGUoMSl7cT1hW2YrbD4+MF18MDtyPXEmMjU1O209cl40ODtvPShtKzY1NTI2fDApPj4+ODtzPShyJjIyMykrMjAxfDA7cD1zJjI1NTtwPShwKzY1NTI2XnArNjU1MjApPj4+ODtpZigocHxvKSYyNTUpe3E9czticmVhayBjfXM9dWQoaCxyKXwwO2lmKChzfDApPT0wPzE6KGFbcz4+MF18MCkhPXE8PDI0Pj4yNCl7bz0wO2s9MDticmVhayBhfWw9bCsxfDA7aWYobD4+PjA+PWc+Pj4wKXtvPTA7az0wO2JyZWFrIGF9fXdoaWxlKDApO209cCZxfG8mbTtpZihuPj4+MD49ZT4+PjApe209azticmVhayBifWlmKHQpbT1tPDw0JjI1NTtlbHNle2FbYituPj4wXT1tfHUmMjU1O249bisxfDA7bT11fWs9KGsmMjU1XjI1NSkmMjU1O2w9bCsxfDA7aWYobD4+PjA8Zz4+PjApdT1tO2Vsc2V7bz0wO2JyZWFrIGF9fX13aGlsZSgwKTtpZighKGNbNzk3OV18MCkpaz0zMTk2NDtlbHNlIGs9Y1sob2EoKXwwKSs2MD4+Ml18MDtjW2s+PjJdPTM0O289LTE7az1tfXdoaWxlKDApO2lmKGopY1tqPj4yXT1mKygoKGs8PDI0Pj4yNCE9MCk8PDMxPj4zMSkrbCk7aWYoIWkpcmV0dXJuIG98MDtjW2k+PjJdPW47cmV0dXJuIG98MH1mdW5jdGlvbiBoZCgpe3JldHVybiAzMzc3OX1mdW5jdGlvbiBpZCgpe3JldHVybiA4fWZ1bmN0aW9uIGpkKCl7cmV0dXJuIDB9ZnVuY3Rpb24ga2QoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MCxTPTAsVD0wLFU9MCxWPTAsVz0wLFg9MCxZPTAsWj0wLF89MCwkPTAsYWE9MCxiYT0wLGNhPTAsZGE9MCxlYT0wLGZhPTAsZ2E9MCxoYT0wLGlhPTAsamE9MCxrYT0wLGxhPTAsbWE9MCxuYT0wLG9hPTAscGE9MCxxYT0wLHJhPTAsc2E9MCx0YT0wLHVhPTAsdmE9MCx3YT0wLHhhPTAseWE9MCx6YT0wLEFhPTAsQmE9MCxDYT0wLERhPTAsRWE9MCxGYT0wLEdhPTAsSGE9MCxJYT0wLEphPTAsS2E9MCxMYT0wLE1hPTAsTmE9MCxPYT0wLFBhPTAsUWE9MCxSYT0wLFNhPTAsVGE9MCxVYT0wLFZhPTAsV2E9MCxYYT0wLFlhPTAsWmE9MCxfYT0wLCRhPTAsYWI9MCxiYj0wLGNiPTAsZGI9MCxlYj0wLGZiPTAsZ2I9MCxoYj0wLGliPTAsamI9MCxrYj0wLGxiPTAsbWI9MCxuYj0wLG9iPTAscGI9MCxxYj0wLHJiPTAsc2I9MCx0Yj0wLHViPTAsdmI9MCx3Yj0wLHhiPTAseWI9MCx6Yj0wLEFiPTAsQmI9MCxDYj0wLERiPTAsRWI9MCxGYj0wLEdiPTAsSGI9MCxJYj0wLEpiPTAsS2I9MCxMYj0wLE1iPTAsTmI9MCxPYj0wLFBiPTAsUWI9MCxSYj0wLFNiPTAsVGI9MCxVYj0wLFZiPTAsV2I9MCxYYj0wLFliPTAsWmI9MCxfYj0wLCRiPTAsYWM9MCxiYz0wLGNjPTAsZGM9MCxlYz0wLGZjPTAsZ2M9MCxoYz0wLGljPTAsamM9MCxrYz0wLGxjPTAsbWM9MCxuYz0wLG9jPTAscGM9MCxxYz0wLHJjPTAsc2M9MCx0Yz0wLHVjPTAsdmM9MCx3Yz0wLHhjPTAseWM9MCx6Yz0wLEFjPTAsQmM9MCxDYz0wLERjPTAsRWM9MCxGYz0wLEdjPTAsSGM9MCxJYz0wLEpjPTAsS2M9MCxMYz0wLE1jPTAsTmM9MCxPYz0wLFBjPTAsUWM9MCxSYz0wLFNjPTA7bD1jW2I+PjJdfDA7cz1jW2IrND4+Ml18MDtqPWNbYis4Pj4yXXwwO1JiPWNbYisxMj4+Ml18MDtlPWNbYisxNj4+Ml18MDt6YT1jW2IrMjA+PjJdfDA7eWE9Y1tiKzI0Pj4yXXwwO3piPWNbYisyOD4+Ml18MDtoPWNbYiszMj4+Ml18MDtnYT1jW2IrMzY+PjJdfDA7SD1jW2Q+PjJdfDA7Sj1jW2QrND4+Ml18MDtGPWNbZCs4Pj4yXXwwO0Q9Y1tkKzEyPj4yXXwwO0E9Y1tkKzE2Pj4yXXwwO3k9Y1tkKzIwPj4yXXwwO3c9Y1tkKzI0Pj4yXXwwO3U9Y1tkKzI4Pj4yXXwwO2s9Y1tkKzMyPj4yXXwwO3Q9Y1tkKzM2Pj4yXXwwO09jPUoqMTl8MDtiYz1GKjE5fDA7cmI9RCoxOXwwO0hhPUEqMTl8MDtqYz15KjE5fDA7RGI9dyoxOXwwO1RhPXUqMTl8MDtTYz1rKjE5fDA7UWM9dCoxOXwwO3A9czw8MTtmPVJiPDwxO009emE8PDE7aT16Yjw8MTtkPWdhPDwxO289KChsfDApPDApPDwzMT4+MzE7ST0oKEh8MCk8MCk8PDMxPj4zMTtNYz1PZChIfDAsSXwwLGx8MCxvfDApfDA7TGM9QztLPSgoSnwwKTwwKTw8MzE+PjMxO3djPU9kKEp8MCxLfDAsbHwwLG98MCl8MDt2Yz1DO0c9KChGfDApPDApPDwzMT4+MzE7dWI9T2QoRnwwLEd8MCxsfDAsb3wwKXwwO3RiPUM7RT0oKER8MCk8MCk8PDMxPj4zMTtLYT1PZChEfDAsRXwwLGx8MCxvfDApfDA7SmE9QztCPSgoQXwwKTwwKTw8MzE+PjMxO21jPU9kKEF8MCxCfDAsbHwwLG98MCl8MDtsYz1DO3o9KCh5fDApPDApPDwzMT4+MzE7R2I9T2QoeXwwLHp8MCxsfDAsb3wwKXwwO0ZiPUM7eD0oKHd8MCk8MCk8PDMxPj4zMTtXYT1PZCh3fDAseHwwLGx8MCxvfDApfDA7VmE9Qzt2PSgodXwwKTwwKTw8MzE+PjMxO2phPU9kKHV8MCx2fDAsbHwwLG98MCl8MDtpYT1DO1BjPSgoa3wwKTwwKTw8MzE+PjMxO1A9T2Qoa3wwLFBjfDAsbHwwLG98MCl8MDtPPUM7bz1PZCh0fDAsKCh0fDApPDApPDwzMT4+MzF8MCxsfDAsb3wwKXwwO2w9Qzt0PSgoc3wwKTwwKTw8MzE+PjMxO2RjPU9kKEh8MCxJfDAsc3wwLHR8MCl8MDtlYz1DO249KChwfDApPDApPDwzMT4+MzE7eWI9T2QoSnwwLEt8MCxwfDAsbnwwKXwwO3hiPUM7TWE9T2QoRnwwLEd8MCxzfDAsdHwwKXwwO0xhPUM7b2M9T2QoRHwwLEV8MCxwfDAsbnwwKXwwO25jPUM7SWI9T2QoQXwwLEJ8MCxzfDAsdHwwKXwwO0hiPUM7WWE9T2QoeXwwLHp8MCxwfDAsbnwwKXwwO1hhPUM7bGE9T2Qod3wwLHh8MCxzfDAsdHwwKXwwO2thPUM7Uj1PZCh1fDAsdnwwLHB8MCxufDApfDA7UT1DO3Q9T2Qoa3wwLFBjfDAsc3wwLHR8MCl8MDtzPUM7UGM9KChRY3wwKTwwKTw8MzE+PjMxO249T2QoUWN8MCxQY3wwLHB8MCxufDApfDA7cD1DO2s9KChqfDApPDApPDwzMT4+MzE7d2I9T2QoSHwwLEl8MCxqfDAsa3wwKXwwO3ZiPUM7UWE9T2QoSnwwLEt8MCxqfDAsa3wwKXwwO1BhPUM7cWM9T2QoRnwwLEd8MCxqfDAsa3wwKXwwO3BjPUM7S2I9T2QoRHwwLEV8MCxqfDAsa3wwKXwwO0piPUM7X2E9T2QoQXwwLEJ8MCxqfDAsa3wwKXwwO1phPUM7bmE9T2QoeXwwLHp8MCxqfDAsa3wwKXwwO21hPUM7VD1PZCh3fDAseHwwLGp8MCxrfDApfDA7Uz1DO3Y9T2QodXwwLHZ8MCxqfDAsa3wwKXwwO3U9QztSYz0oKFNjfDApPDApPDwzMT4+MzE7eWM9T2QoU2N8MCxSY3wwLGp8MCxrfDApfDA7eGM9QztrPU9kKFFjfDAsUGN8MCxqfDAsa3wwKXwwO2o9QztTYj0oKFJifDApPDApPDwzMT4+MzE7T2E9T2QoSHwwLEl8MCxSYnwwLFNifDApfDA7TmE9QztmYT0oKGZ8MCk8MCk8PDMxPj4zMTt1Yz1PZChKfDAsS3wwLGZ8MCxmYXwwKXwwO3RjPUM7TWI9T2QoRnwwLEd8MCxSYnwwLFNifDApfDA7TGI9QzthYj1PZChEfDAsRXwwLGZ8MCxmYXwwKXwwOyRhPUM7cGE9T2QoQXwwLEJ8MCxSYnwwLFNifDApfDA7b2E9QztWPU9kKHl8MCx6fDAsZnwwLGZhfDApfDA7VT1DO3g9T2Qod3wwLHh8MCxSYnwwLFNifDApfDA7dz1DO1VhPSgoVGF8MCk8MCk8PDMxPj4zMTtBYz1PZChUYXwwLFVhfDAsZnwwLGZhfDApfDA7emM9QztTYj1PZChTY3wwLFJjfDAsUmJ8MCxTYnwwKXwwO1JiPUM7ZmE9T2QoUWN8MCxQY3wwLGZ8MCxmYXwwKXwwO2Y9QztOPSgoZXwwKTwwKTw8MzE+PjMxO3NjPU9kKEh8MCxJfDAsZXwwLE58MCl8MDtyYz1DO1FiPU9kKEp8MCxLfDAsZXwwLE58MCl8MDtQYj1DO2NiPU9kKEZ8MCxHfDAsZXwwLE58MCl8MDtiYj1DO3JhPU9kKER8MCxFfDAsZXwwLE58MCl8MDtxYT1DO1g9T2QoQXwwLEJ8MCxlfDAsTnwwKXwwO1c9Qzt6PU9kKHl8MCx6fDAsZXwwLE58MCl8MDt5PUM7RWI9KChEYnwwKTwwKTw8MzE+PjMxO0NjPU9kKERifDAsRWJ8MCxlfDAsTnwwKXwwO0JjPUM7VWI9T2QoVGF8MCxVYXwwLGV8MCxOfDApfDA7VGI9QztpYj1PZChTY3wwLFJjfDAsZXwwLE58MCl8MDtoYj1DO049T2QoUWN8MCxQY3wwLGV8MCxOfDApfDA7ZT1DO0FhPSgoemF8MCk8MCk8PDMxPj4zMTtPYj1PZChIfDAsSXwwLHphfDAsQWF8MCl8MDtOYj1DO2I9KChNfDApPDApPDwzMT4+MzE7Z2I9T2QoSnwwLEt8MCxNfDAsYnwwKXwwO2ZiPUM7dGE9T2QoRnwwLEd8MCx6YXwwLEFhfDApfDA7c2E9QztaPU9kKER8MCxFfDAsTXwwLGJ8MCl8MDtZPUM7Qj1PZChBfDAsQnwwLHphfDAsQWF8MCl8MDtBPUM7a2M9KChqY3wwKTwwKTw8MzE+PjMxO0VjPU9kKGpjfDAsa2N8MCxNfDAsYnwwKXwwO0RjPUM7V2I9T2QoRGJ8MCxFYnwwLHphfDAsQWF8MCl8MDtWYj1DO2tiPU9kKFRhfDAsVWF8MCxNfDAsYnwwKXwwO2piPUM7QWE9T2QoU2N8MCxSY3wwLHphfDAsQWF8MCl8MDt6YT1DO2I9T2QoUWN8MCxQY3wwLE18MCxifDApfDA7TT1DO2c9KCh5YXwwKTwwKTw8MzE+PjMxO2ViPU9kKEh8MCxJfDAseWF8MCxnfDApfDA7ZGI9Qzt4YT1PZChKfDAsS3wwLHlhfDAsZ3wwKXwwO3dhPUM7JD1PZChGfDAsR3wwLHlhfDAsZ3wwKXwwO189QztFPU9kKER8MCxFfDAseWF8MCxnfDApfDA7RD1DO0lhPSgoSGF8MCk8MCk8PDMxPj4zMTtHYz1PZChIYXwwLElhfDAseWF8MCxnfDApfDA7RmM9QztZYj1PZChqY3wwLGtjfDAseWF8MCxnfDApfDA7WGI9QzttYj1PZChEYnwwLEVifDAseWF8MCxnfDApfDA7bGI9QztDYT1PZChUYXwwLFVhfDAseWF8MCxnfDApfDA7QmE9QzttPU9kKFNjfDAsUmN8MCx5YXwwLGd8MCl8MDtyPUM7Zz1PZChRY3wwLFBjfDAseWF8MCxnfDApfDA7eWE9QztBYj0oKHpifDApPDApPDwzMT4+MzE7dmE9T2QoSHwwLEl8MCx6YnwwLEFifDApfDA7dWE9QztlYT0oKGl8MCk8MCk8PDMxPj4zMTtkYT1PZChKfDAsS3wwLGl8MCxlYXwwKXwwO2NhPUM7Rz1PZChGfDAsR3wwLHpifDAsQWJ8MCl8MDtGPUM7c2I9KChyYnwwKTwwKTw8MzE+PjMxO0ljPU9kKHJifDAsc2J8MCxpfDAsZWF8MCl8MDtIYz1DO19iPU9kKEhhfDAsSWF8MCx6YnwwLEFifDApfDA7WmI9QztvYj1PZChqY3wwLGtjfDAsaXwwLGVhfDApfDA7bmI9QztFYT1PZChEYnwwLEVifDAsemJ8MCxBYnwwKXwwO0RhPUM7Z2M9T2QoVGF8MCxVYXwwLGl8MCxlYXwwKXwwO2ZjPUM7QWI9T2QoU2N8MCxSY3wwLHpifDAsQWJ8MCl8MDt6Yj1DO2VhPU9kKFFjfDAsUGN8MCxpfDAsZWF8MCl8MDtpPUM7TD0oKGh8MCk8MCk8PDMxPj4zMTtiYT1PZChIfDAsSXwwLGh8MCxMfDApfDA7YWE9QztLPU9kKEp8MCxLfDAsaHwwLEx8MCl8MDtKPUM7Y2M9KChiY3wwKTwwKTw8MzE+PjMxO0tjPU9kKGJjfDAsY2N8MCxofDAsTHwwKXwwO0pjPUM7YWM9T2QocmJ8MCxzYnwwLGh8MCxMfDApfDA7JGI9QztxYj1PZChIYXwwLElhfDAsaHwwLEx8MCl8MDtwYj1DO0dhPU9kKGpjfDAsa2N8MCxofDAsTHwwKXwwO0ZhPUM7aWM9T2QoRGJ8MCxFYnwwLGh8MCxMfDApfDA7aGM9QztDYj1PZChUYXwwLFVhfDAsaHwwLEx8MCl8MDtCYj1DO1NhPU9kKFNjfDAsUmN8MCxofDAsTHwwKXwwO1JhPUM7TD1PZChRY3wwLFBjfDAsaHwwLEx8MCl8MDtoPUM7aGE9KChnYXwwKTwwKTw8MzE+PjMxO0k9T2QoSHwwLEl8MCxnYXwwLGhhfDApfDA7SD1DO3E9KChkfDApPDApPDwzMT4+MzE7T2M9T2QoT2N8MCwoKE9jfDApPDApPDwzMT4+MzF8MCxkfDAscXwwKXwwO05jPUM7Y2M9T2QoYmN8MCxjY3wwLGdhfDAsaGF8MCl8MDtiYz1DO3NiPU9kKHJifDAsc2J8MCxkfDAscXwwKXwwO3JiPUM7SWE9T2QoSGF8MCxJYXwwLGdhfDAsaGF8MCl8MDtIYT1DO2tjPU9kKGpjfDAsa2N8MCxkfDAscXwwKXwwO2pjPUM7RWI9T2QoRGJ8MCxFYnwwLGdhfDAsaGF8MCl8MDtEYj1DO1VhPU9kKFRhfDAsVWF8MCxkfDAscXwwKXwwO1RhPUM7aGE9T2QoU2N8MCxSY3wwLGdhfDAsaGF8MCl8MDtnYT1DO3E9T2QoUWN8MCxQY3wwLGR8MCxxfDApfDA7ZD1DO0xjPURkKE9jfDAsTmN8MCxNY3wwLExjfDApfDA7SmM9RGQoTGN8MCxDfDAsS2N8MCxKY3wwKXwwO0hjPURkKEpjfDAsQ3wwLEljfDAsSGN8MCl8MDtGYz1EZChIY3wwLEN8MCxHY3wwLEZjfDApfDA7RGM9RGQoRmN8MCxDfDAsRWN8MCxEY3wwKXwwO0JjPURkKERjfDAsQ3wwLENjfDAsQmN8MCl8MDt6Yz1EZChCY3wwLEN8MCxBY3wwLHpjfDApfDA7eGM9RGQoemN8MCxDfDAseWN8MCx4Y3wwKXwwO3A9RGQoeGN8MCxDfDAsbnwwLHB8MCl8MDtuPUM7ZWM9RGQod2N8MCx2Y3wwLGRjfDAsZWN8MCl8MDtkYz1DO3JjPURkKHVjfDAsdGN8MCxzY3wwLHJjfDApfDA7cGM9RGQocmN8MCxDfDAscWN8MCxwY3wwKXwwO25jPURkKHBjfDAsQ3wwLG9jfDAsbmN8MCl8MDtsYz1EZChuY3wwLEN8MCxtY3wwLGxjfDApfDA7amM9RGQobGN8MCxDfDAsa2N8MCxqY3wwKXwwO2hjPURkKGpjfDAsQ3wwLGljfDAsaGN8MCl8MDtmYz1EZChoY3wwLEN8MCxnY3wwLGZjfDApfDA7cj1EZChmY3wwLEN8MCxtfDAscnwwKXwwO009RGQocnwwLEN8MCxifDAsTXwwKXwwO2I9QztyPURkKHB8MCxufDAsMzM1NTQ0MzIsMCl8MDtyPUVkKHJ8MCxDfDAsMjYpfDA7bT1DO2JjPURkKGVjfDAsZGN8MCxjY3wwLGJjfDApfDA7JGI9RGQoYmN8MCxDfDAsYWN8MCwkYnwwKXwwO1piPURkKCRifDAsQ3wwLF9ifDAsWmJ8MCl8MDtYYj1EZChaYnwwLEN8MCxZYnwwLFhifDApfDA7VmI9RGQoWGJ8MCxDfDAsV2J8MCxWYnwwKXwwO1RiPURkKFZifDAsQ3wwLFVifDAsVGJ8MCl8MDtSYj1EZChUYnwwLEN8MCxTYnwwLFJifDApfDA7aj1EZChSYnwwLEN8MCxrfDAsanwwKXwwO2o9RGQoanwwLEN8MCxyfDAsbXwwKXwwO2s9QzttPUhkKHJ8MCxtfDAsMjYpfDA7bT1DZChwfDAsbnwwLG18MCxDfDApfDA7bj1DO3A9RGQoTXwwLGJ8MCwzMzU1NDQzMiwwKXwwO3A9RWQocHwwLEN8MCwyNil8MDtyPUM7TmI9RGQoUWJ8MCxQYnwwLE9ifDAsTmJ8MCl8MDtMYj1EZChOYnwwLEN8MCxNYnwwLExifDApfDA7SmI9RGQoTGJ8MCxDfDAsS2J8MCxKYnwwKXwwO0hiPURkKEpifDAsQ3wwLElifDAsSGJ8MCl8MDtGYj1EZChIYnwwLEN8MCxHYnwwLEZifDApfDA7RGI9RGQoRmJ8MCxDfDAsRWJ8MCxEYnwwKXwwO0JiPURkKERifDAsQ3wwLENifDAsQmJ8MCl8MDt6Yj1EZChCYnwwLEN8MCxBYnwwLHpifDApfDA7eWE9RGQoemJ8MCxDfDAsZ3wwLHlhfDApfDA7eWE9RGQoeWF8MCxDfDAscHwwLHJ8MCl8MDtnPUM7cj1IZChwfDAscnwwLDI2KXwwO3I9Q2QoTXwwLGJ8MCxyfDAsQ3wwKXwwO2I9QztNPURkKGp8MCxrfDAsMTY3NzcyMTYsMCl8MDtNPUVkKE18MCxDfDAsMjUpfDA7cD1DO3ZiPURkKHlifDAseGJ8MCx3YnwwLHZifDApfDA7dGI9RGQodmJ8MCxDfDAsdWJ8MCx0YnwwKXwwO3JiPURkKHRifDAsQ3wwLHNifDAscmJ8MCl8MDtwYj1EZChyYnwwLEN8MCxxYnwwLHBifDApfDA7bmI9RGQocGJ8MCxDfDAsb2J8MCxuYnwwKXwwO2xiPURkKG5ifDAsQ3wwLG1ifDAsbGJ8MCl8MDtqYj1EZChsYnwwLEN8MCxrYnwwLGpifDApfDA7aGI9RGQoamJ8MCxDfDAsaWJ8MCxoYnwwKXwwO2Y9RGQoaGJ8MCxDfDAsZmF8MCxmfDApfDA7Zj1EZChmfDAsQ3wwLE18MCxwfDApfDA7ZmE9QztwPUhkKE18MCxwfDAsMjUpfDA7cD1DZChqfDAsa3wwLHB8MCxDfDApfDA7az1DO2o9RGQoeWF8MCxnfDAsMTY3NzcyMTYsMCl8MDtqPUVkKGp8MCxDfDAsMjUpfDA7TT1DO2RiPURkKGdifDAsZmJ8MCxlYnwwLGRifDApfDA7YmI9RGQoZGJ8MCxDfDAsY2J8MCxiYnwwKXwwOyRhPURkKGJifDAsQ3wwLGFifDAsJGF8MCl8MDtaYT1EZCgkYXwwLEN8MCxfYXwwLFphfDApfDA7WGE9RGQoWmF8MCxDfDAsWWF8MCxYYXwwKXwwO1ZhPURkKFhhfDAsQ3wwLFdhfDAsVmF8MCl8MDtUYT1EZChWYXwwLEN8MCxVYXwwLFRhfDApfDA7UmE9RGQoVGF8MCxDfDAsU2F8MCxSYXwwKXwwO2k9RGQoUmF8MCxDfDAsZWF8MCxpfDApfDA7aT1EZChpfDAsQ3wwLGp8MCxNfDApfDA7ZWE9QztNPUhkKGp8MCxNfDAsMjUpfDA7TT1DZCh5YXwwLGd8MCxNfDAsQ3wwKXwwO2c9Qzt5YT1EZChmfDAsZmF8MCwzMzU1NDQzMiwwKXwwO3lhPUVkKHlhfDAsQ3wwLDI2KXwwO2o9QztOYT1EZChRYXwwLFBhfDAsT2F8MCxOYXwwKXwwO0xhPURkKE5hfDAsQ3wwLE1hfDAsTGF8MCl8MDtKYT1EZChMYXwwLEN8MCxLYXwwLEphfDApfDA7SGE9RGQoSmF8MCxDfDAsSWF8MCxIYXwwKXwwO0ZhPURkKEhhfDAsQ3wwLEdhfDAsRmF8MCl8MDtEYT1EZChGYXwwLEN8MCxFYXwwLERhfDApfDA7QmE9RGQoRGF8MCxDfDAsQ2F8MCxCYXwwKXwwO3phPURkKEJhfDAsQ3wwLEFhfDAsemF8MCl8MDtlPURkKHphfDAsQ3wwLE58MCxlfDApfDA7ZT1EZChlfDAsQ3wwLHlhfDAsanwwKXwwO049QztqPUhkKHlhfDAsanwwLDI2KXwwO2o9Q2QoZnwwLGZhfDAsanwwLEN8MCl8MDtmYT1EZChpfDAsZWF8MCwzMzU1NDQzMiwwKXwwO2ZhPUVkKGZhfDAsQ3wwLDI2KXwwO2Y9Qzt1YT1EZCh4YXwwLHdhfDAsdmF8MCx1YXwwKXwwO3NhPURkKHVhfDAsQ3wwLHRhfDAsc2F8MCl8MDtxYT1EZChzYXwwLEN8MCxyYXwwLHFhfDApfDA7b2E9RGQocWF8MCxDfDAscGF8MCxvYXwwKXwwO21hPURkKG9hfDAsQ3wwLG5hfDAsbWF8MCl8MDtrYT1EZChtYXwwLEN8MCxsYXwwLGthfDApfDA7aWE9RGQoa2F8MCxDfDAsamF8MCxpYXwwKXwwO2dhPURkKGlhfDAsQ3wwLGhhfDAsZ2F8MCl8MDtoPURkKGdhfDAsQ3wwLEx8MCxofDApfDA7aD1EZChofDAsQ3wwLGZhfDAsZnwwKXwwO0w9QztmPUhkKGZhfDAsZnwwLDI2KXwwO2Y9Q2QoaXwwLGVhfDAsZnwwLEN8MCl8MDtlYT1EZChlfDAsTnwwLDE2Nzc3MjE2LDApfDA7ZWE9RWQoZWF8MCxDfDAsMjUpfDA7aT1DO2I9RGQoZWF8MCxpfDAscnwwLGJ8MCl8MDtyPUM7aT1IZChlYXwwLGl8MCwyNSl8MDtpPUNkKGV8MCxOfDAsaXwwLEN8MCl8MDtOPURkKGh8MCxMfDAsMTY3NzcyMTYsMCl8MDtOPUVkKE58MCxDfDAsMjUpfDA7ZT1DO2FhPURkKGRhfDAsY2F8MCxiYXwwLGFhfDApfDA7Xz1EZChhYXwwLEN8MCwkfDAsX3wwKXwwO1k9RGQoX3wwLEN8MCxafDAsWXwwKXwwO1c9RGQoWXwwLEN8MCxYfDAsV3wwKXwwO1U9RGQoV3wwLEN8MCxWfDAsVXwwKXwwO1M9RGQoVXwwLEN8MCxUfDAsU3wwKXwwO1E9RGQoU3wwLEN8MCxSfDAsUXwwKXwwO089RGQoUXwwLEN8MCxQfDAsT3wwKXwwO2Q9RGQoT3wwLEN8MCxxfDAsZHwwKXwwO2Q9RGQoZHwwLEN8MCxOfDAsZXwwKXwwO3E9QztlPUhkKE58MCxlfDAsMjUpfDA7ZT1DZChofDAsTHwwLGV8MCxDfDApfDA7TD1EZChifDAscnwwLDMzNTU0NDMyLDApfDA7TD1FZChMfDAsQ3wwLDI2KXwwO2g9QztnPURkKE18MCxnfDAsTHwwLGh8MCl8MDtoPUhkKEx8MCxofDAsMjYpfDA7aD1DZChifDAscnwwLGh8MCxDfDApfDA7cj1EZChkfDAscXwwLDMzNTU0NDMyLDApfDA7cj1FZChyfDAsQ3wwLDI2KXwwO2I9QztIPURkKEt8MCxKfDAsSXwwLEh8MCl8MDtGPURkKEh8MCxDfDAsR3wwLEZ8MCl8MDtEPURkKEZ8MCxDfDAsRXwwLER8MCl8MDtBPURkKER8MCxDfDAsQnwwLEF8MCl8MDt5PURkKEF8MCxDfDAsenwwLHl8MCl8MDt3PURkKHl8MCxDfDAseHwwLHd8MCl8MDt1PURkKHd8MCxDfDAsdnwwLHV8MCl8MDtzPURkKHV8MCxDfDAsdHwwLHN8MCl8MDtsPURkKHN8MCxDfDAsb3wwLGx8MCl8MDtsPURkKGx8MCxDfDAscnwwLGJ8MCl8MDtvPUM7Yj1IZChyfDAsYnwwLDI2KXwwO2I9Q2QoZHwwLHF8MCxifDAsQ3wwKXwwO3E9RGQobHwwLG98MCwxNjc3NzIxNiwwKXwwO3E9RWQocXwwLEN8MCwyNSl8MDtkPUM7cj1PZChxfDAsZHwwLDE5LDApfDA7bj1EZChyfDAsQ3wwLG18MCxufDApfDA7bT1DO2Q9SGQocXwwLGR8MCwyNSl8MDtkPUNkKGx8MCxvfDAsZHwwLEN8MCl8MDtvPURkKG58MCxtfDAsMzM1NTQ0MzIsMCl8MDtvPUVkKG98MCxDfDAsMjYpfDA7bD1DO2s9RGQocHwwLGt8MCxvfDAsbHwwKXwwO2w9SGQob3wwLGx8MCwyNil8MDtsPUNkKG58MCxtfDAsbHwwLEN8MCl8MDtjW2E+PjJdPWw7Y1thKzQ+PjJdPWs7Y1thKzg+PjJdPWo7Y1thKzEyPj4yXT1pO2NbYSsxNj4+Ml09aDtjW2ErMjA+PjJdPWc7Y1thKzI0Pj4yXT1mO2NbYSsyOD4+Ml09ZTtjW2ErMzI+PjJdPWI7Y1thKzM2Pj4yXT1kO3JldHVybn1mdW5jdGlvbiBsZChhLGIpe2E9YXwwO2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTAsYmE9MCxjYT0wLGRhPTAsZWE9MCxmYT0wLGdhPTAsaGE9MCxpYT0wLGphPTAsa2E9MCxsYT0wLG1hPTAsbmE9MCxvYT0wLHBhPTAscWE9MCxyYT0wLHNhPTAsdGE9MCx1YT0wLHZhPTAsd2E9MCx4YT0wLHlhPTAsemE9MCxBYT0wLEJhPTAsQ2E9MCxEYT0wLEVhPTAsRmE9MCxHYT0wLEhhPTAsSWE9MCxKYT0wLEthPTAsTGE9MCxNYT0wLE5hPTAsT2E9MCxQYT0wLFFhPTAsUmE9MCxTYT0wLFRhPTAsVWE9MCxWYT0wLFdhPTAsWGE9MCxZYT0wLFphPTAsX2E9MCwkYT0wLGFiPTAsYmI9MCxjYj0wLGRiPTAsZWI9MCxmYj0wLGdiPTA7YmI9Y1tiPj4yXXwwO3VhPWNbYis0Pj4yXXwwO2o9Y1tiKzg+PjJdfDA7bGE9Y1tiKzEyPj4yXXwwO2U9Y1tiKzE2Pj4yXXwwO2RiPWNbYisyMD4+Ml18MDtZPWNbYisyND4+Ml18MDtMYT1jW2IrMjg+PjJdfDA7aD1jW2IrMzI+PjJdfDA7Yj1jW2IrMzY+PjJdfDA7bD1iYjw8MTtwPXVhPDwxO1hhPWo8PDE7Zj1sYTw8MTtuYT1lPDwxO0I9ZGI8PDE7bT1ZPDwxO2k9TGE8PDE7S2E9ZGIqMzh8MDtyYT1ZKjE5fDA7dmE9TGEqMzh8MDtkYT1oKjE5fDA7Z2I9YiozOHwwO2NiPSgoYmJ8MCk8MCk8PDMxPj4zMTtjYj1PZChiYnwwLGNifDAsYmJ8MCxjYnwwKXwwO2JiPUM7bz0oKGx8MCk8MCk8PDMxPj4zMTt0YT0oKHVhfDApPDApPDwzMT4+MzE7SWE9T2QobHwwLG98MCx1YXwwLHRhfDApfDA7SGE9QztrPSgoanwwKTwwKTw8MzE+PjMxO1dhPU9kKGp8MCxrfDAsbHwwLG98MCl8MDtWYT1DO21hPSgobGF8MCk8MCk8PDMxPj4zMTtVYT1PZChsYXwwLG1hfDAsbHwwLG98MCl8MDtUYT1DO0Q9KChlfDApPDApPDwzMT4+MzE7T2E9T2QoZXwwLER8MCxsfDAsb3wwKXwwO05hPUM7ZWI9KChkYnwwKTwwKTw8MzE+PjMxO3lhPU9kKGRifDAsZWJ8MCxsfDAsb3wwKXwwO3hhPUM7Zz0oKFl8MCk8MCk8PDMxPj4zMTtnYT1PZChZfDAsZ3wwLGx8MCxvfDApfDA7ZmE9QztNYT0oKExhfDApPDApPDwzMT4+MzE7Uj1PZChMYXwwLE1hfDAsbHwwLG98MCl8MDtRPUM7QT0oKGh8MCk8MCk8PDMxPj4zMTtGPU9kKGh8MCxBfDAsbHwwLG98MCl8MDtFPUM7cT0oKGJ8MCk8MCk8PDMxPj4zMTtvPU9kKGJ8MCxxfDAsbHwwLG98MCl8MDtsPUM7bj0oKHB8MCk8MCk8PDMxPj4zMTt0YT1PZChwfDAsbnwwLHVhfDAsdGF8MCl8MDt1YT1DO2JhPU9kKHB8MCxufDAsanwwLGt8MCl8MDtjYT1DO1A9KChmfDApPDApPDwzMT4+MzE7U2E9T2QoZnwwLFB8MCxwfDAsbnwwKXwwO1JhPUM7Q2E9T2QoZXwwLER8MCxwfDAsbnwwKXwwO0JhPUM7ZD0oKEJ8MCk8MCk8PDMxPj4zMTtpYT1PZChCfDAsZHwwLHB8MCxufDApfDA7aGE9QztUPU9kKFl8MCxnfDAscHwwLG58MCl8MDtTPUM7Tz0oKGl8MCk8MCk8PDMxPj4zMTtIPU9kKGl8MCxPfDAscHwwLG58MCl8MDtHPUM7dD1PZChofDAsQXwwLHB8MCxufDApfDA7cz1DO2ZiPSgoZ2J8MCk8MCk8PDMxPj4zMTtuPU9kKGdifDAsZmJ8MCxwfDAsbnwwKXwwO3A9QztRYT1PZChqfDAsa3wwLGp8MCxrfDApfDA7UGE9QztZYT0oKFhhfDApPDApPDwzMT4+MzE7QWE9T2QoWGF8MCxZYXwwLGxhfDAsbWF8MCl8MDt6YT1DO2thPU9kKGV8MCxEfDAsWGF8MCxZYXwwKXwwO2phPUM7WD1PZChkYnwwLGVifDAsWGF8MCxZYXwwKXwwO1c9QztOPU9kKFl8MCxnfDAsWGF8MCxZYXwwKXwwO009Qzt2PU9kKExhfDAsTWF8MCxYYXwwLFlhfDApfDA7dT1DO2VhPSgoZGF8MCk8MCk8PDMxPj4zMTtZYT1PZChkYXwwLGVhfDAsWGF8MCxZYXwwKXwwO1hhPUM7az1PZChnYnwwLGZifDAsanwwLGt8MCl8MDtqPUM7bWE9T2QoZnwwLFB8MCxsYXwwLG1hfDApfDA7bGE9QztWPU9kKGZ8MCxQfDAsZXwwLER8MCl8MDtVPUM7Sj1PZChCfDAsZHwwLGZ8MCxQfDApfDA7ST1DO3o9T2QoWXwwLGd8MCxmfDAsUHwwKXwwO3k9Qzt3YT0oKHZhfDApPDApPDwzMT4+MzE7X2E9T2QodmF8MCx3YXwwLGZ8MCxQfDApfDA7WmE9QztFYT1PZChkYXwwLGVhfDAsZnwwLFB8MCl8MDtEYT1DO1A9T2QoZ2J8MCxmYnwwLGZ8MCxQfDApfDA7Zj1DO0w9T2QoZXwwLER8MCxlfDAsRHwwKXwwO0s9QztvYT0oKG5hfDApPDApPDwzMT4+MzE7eD1PZChuYXwwLG9hfDAsZGJ8MCxlYnwwKXwwO3c9QztzYT0oKHJhfDApPDApPDwzMT4+MzE7YWI9T2QocmF8MCxzYXwwLG5hfDAsb2F8MCl8MDskYT1DO0dhPU9kKHZhfDAsd2F8MCxlfDAsRHwwKXwwO0ZhPUM7b2E9T2QoZGF8MCxlYXwwLG5hfDAsb2F8MCl8MDtuYT1DO0Q9T2QoZ2J8MCxmYnwwLGV8MCxEfDApfDA7ZT1DO2ViPU9kKEthfDAsKChLYXwwKTwwKTw8MzE+PjMxfDAsZGJ8MCxlYnwwKXwwO2RiPUM7S2E9T2QocmF8MCxzYXwwLEJ8MCxkfDApfDA7SmE9QztxYT1PZCh2YXwwLHdhfDAsQnwwLGR8MCl8MDtwYT1DO189T2QoZGF8MCxlYXwwLEJ8MCxkfDApfDA7Wj1DO2Q9T2QoZ2J8MCxmYnwwLEJ8MCxkfDApfDA7Qj1DO3NhPU9kKHJhfDAsc2F8MCxZfDAsZ3wwKXwwO3JhPUM7YWE9T2QodmF8MCx3YXwwLFl8MCxnfDApfDA7JD1DO209T2QoZGF8MCxlYXwwLG18MCwoKG18MCk8MCk8PDMxPj4zMXwwKXwwO3I9QztnPU9kKGdifDAsZmJ8MCxZfDAsZ3wwKXwwO1k9QztNYT1PZCh2YXwwLHdhfDAsTGF8MCxNYXwwKXwwO0xhPUM7d2E9T2QoZGF8MCxlYXwwLGl8MCxPfDApfDA7dmE9QztPPU9kKGdifDAsZmJ8MCxpfDAsT3wwKXwwO2k9QztlYT1PZChkYXwwLGVhfDAsaHwwLEF8MCl8MDtkYT1DO0E9T2QoZ2J8MCxmYnwwLGh8MCxBfDApfDA7aD1DO3E9T2QoZ2J8MCxmYnwwLGJ8MCxxfDApfDA7Yj1DO2JiPURkKGVifDAsZGJ8MCxjYnwwLGJifDApfDA7JGE9RGQoYmJ8MCxDfDAsYWJ8MCwkYXwwKXwwO1phPURkKCRhfDAsQ3wwLF9hfDAsWmF8MCl8MDtYYT1EZChaYXwwLEN8MCxZYXwwLFhhfDApfDA7cD1EZChYYXwwLEN8MCxufDAscHwwKXwwO249Qzt1YT1EZChXYXwwLFZhfDAsdGF8MCx1YXwwKXwwO3RhPUM7Y2E9RGQoVWF8MCxUYXwwLGJhfDAsY2F8MCl8MDtiYT1DO1BhPURkKFNhfDAsUmF8MCxRYXwwLFBhfDApfDA7TmE9RGQoUGF8MCxDfDAsT2F8MCxOYXwwKXwwO0xhPURkKE5hfDAsQ3wwLE1hfDAsTGF8MCl8MDtyPURkKExhfDAsQ3wwLG18MCxyfDApfDA7Qj1EZChyfDAsQ3wwLGR8MCxCfDApfDA7ZD1DO3I9RGQocHwwLG58MCwzMzU1NDQzMiwwKXwwO3I9RWQocnwwLEN8MCwyNil8MDttPUM7SGE9RGQoS2F8MCxKYXwwLElhfDAsSGF8MCl8MDtGYT1EZChIYXwwLEN8MCxHYXwwLEZhfDApfDA7RGE9RGQoRmF8MCxDfDAsRWF8MCxEYXwwKXwwO2o9RGQoRGF8MCxDfDAsa3wwLGp8MCl8MDtqPURkKGp8MCxDfDAscnwwLG18MCl8MDtrPUM7bT1IZChyfDAsbXwwLDI2KXwwO209Q2QocHwwLG58MCxtfDAsQ3wwKXwwO249QztwPURkKEJ8MCxkfDAsMzM1NTQ0MzIsMCl8MDtwPUVkKHB8MCxDfDAsMjYpfDA7cj1DO3phPURkKENhfDAsQmF8MCxBYXwwLHphfDApfDA7eGE9RGQoemF8MCxDfDAseWF8MCx4YXwwKXwwO3ZhPURkKHhhfDAsQ3wwLHdhfDAsdmF8MCl8MDtZPURkKHZhfDAsQ3wwLGd8MCxZfDApfDA7WT1EZChZfDAsQ3wwLHB8MCxyfDApfDA7Zz1DO3I9SGQocHwwLHJ8MCwyNil8MDtyPUNkKEJ8MCxkfDAscnwwLEN8MCl8MDtkPUM7Qj1EZChqfDAsa3wwLDE2Nzc3MjE2LDApfDA7Qj1FZChCfDAsQ3wwLDI1KXwwO3A9QztyYT1EZCh1YXwwLHRhfDAsc2F8MCxyYXwwKXwwO3BhPURkKHJhfDAsQ3wwLHFhfDAscGF8MCl8MDtuYT1EZChwYXwwLEN8MCxvYXwwLG5hfDApfDA7Zj1EZChuYXwwLEN8MCxQfDAsZnwwKXwwO2Y9RGQoZnwwLEN8MCxCfDAscHwwKXwwO1A9QztwPUhkKEJ8MCxwfDAsMjUpfDA7cD1DZChqfDAsa3wwLHB8MCxDfDApfDA7az1DO2o9RGQoWXwwLGd8MCwxNjc3NzIxNiwwKXwwO2o9RWQoanwwLEN8MCwyNSl8MDtCPUM7amE9RGQobWF8MCxsYXwwLGthfDAsamF8MCl8MDtoYT1EZChqYXwwLEN8MCxpYXwwLGhhfDApfDA7ZmE9RGQoaGF8MCxDfDAsZ2F8MCxmYXwwKXwwO2RhPURkKGZhfDAsQ3wwLGVhfDAsZGF8MCl8MDtpPURkKGRhfDAsQ3wwLE98MCxpfDApfDA7aT1EZChpfDAsQ3wwLGp8MCxCfDApfDA7Tz1DO0I9SGQoanwwLEJ8MCwyNSl8MDtCPUNkKFl8MCxnfDAsQnwwLEN8MCl8MDtnPUM7WT1EZChmfDAsUHwwLDMzNTU0NDMyLDApfDA7WT1FZChZfDAsQ3wwLDI2KXwwO2o9QzskPURkKGNhfDAsYmF8MCxhYXwwLCR8MCl8MDtaPURkKCR8MCxDfDAsX3wwLFp8MCl8MDtlPURkKFp8MCxDfDAsRHwwLGV8MCl8MDtlPURkKGV8MCxDfDAsWXwwLGp8MCl8MDtEPUM7aj1IZChZfDAsanwwLDI2KXwwO2o9Q2QoZnwwLFB8MCxqfDAsQ3wwKXwwO1A9RGQoaXwwLE98MCwzMzU1NDQzMiwwKXwwO1A9RWQoUHwwLEN8MCwyNil8MDtmPUM7VT1EZChYfDAsV3wwLFZ8MCxVfDApfDA7Uz1EZChVfDAsQ3wwLFR8MCxTfDApfDA7UT1EZChTfDAsQ3wwLFJ8MCxRfDApfDA7aD1EZChRfDAsQ3wwLEF8MCxofDApfDA7aD1EZChofDAsQ3wwLFB8MCxmfDApfDA7QT1DO2Y9SGQoUHwwLGZ8MCwyNil8MDtmPUNkKGl8MCxPfDAsZnwwLEN8MCl8MDtPPURkKGV8MCxEfDAsMTY3NzcyMTYsMCl8MDtPPUVkKE98MCxDfDAsMjUpfDA7aT1DO2Q9RGQoT3wwLGl8MCxyfDAsZHwwKXwwO3I9QztpPUhkKE98MCxpfDAsMjUpfDA7aT1DZChlfDAsRHwwLGl8MCxDfDApfDA7RD1EZChofDAsQXwwLDE2Nzc3MjE2LDApfDA7RD1FZChEfDAsQ3wwLDI1KXwwO2U9QztLPURkKE58MCxNfDAsTHwwLEt8MCl8MDtJPURkKEt8MCxDfDAsSnwwLEl8MCl8MDtHPURkKEl8MCxDfDAsSHwwLEd8MCl8MDtFPURkKEd8MCxDfDAsRnwwLEV8MCl8MDtiPURkKEV8MCxDfDAscXwwLGJ8MCl8MDtiPURkKGJ8MCxDfDAsRHwwLGV8MCl8MDtxPUM7ZT1IZChEfDAsZXwwLDI1KXwwO2U9Q2QoaHwwLEF8MCxlfDAsQ3wwKXwwO0E9RGQoZHwwLHJ8MCwzMzU1NDQzMiwwKXwwO0E9RWQoQXwwLEN8MCwyNil8MDtoPUM7Zz1EZChCfDAsZ3wwLEF8MCxofDApfDA7aD1IZChBfDAsaHwwLDI2KXwwO2g9Q2QoZHwwLHJ8MCxofDAsQ3wwKXwwO3I9RGQoYnwwLHF8MCwzMzU1NDQzMiwwKXwwO3I9RWQocnwwLEN8MCwyNil8MDtkPUM7dz1EZCh6fDAseXwwLHh8MCx3fDApfDA7dT1EZCh3fDAsQ3wwLHZ8MCx1fDApfDA7cz1EZCh1fDAsQ3wwLHR8MCxzfDApfDA7bD1EZChzfDAsQ3wwLG98MCxsfDApfDA7bD1EZChsfDAsQ3wwLHJ8MCxkfDApfDA7bz1DO2Q9SGQocnwwLGR8MCwyNil8MDtkPUNkKGJ8MCxxfDAsZHwwLEN8MCl8MDtxPURkKGx8MCxvfDAsMTY3NzcyMTYsMCl8MDtxPUVkKHF8MCxDfDAsMjUpfDA7Yj1DO3I9T2QocXwwLGJ8MCwxOSwwKXwwO249RGQocnwwLEN8MCxtfDAsbnwwKXwwO209QztiPUhkKHF8MCxifDAsMjUpfDA7Yj1DZChsfDAsb3wwLGJ8MCxDfDApfDA7bz1EZChufDAsbXwwLDMzNTU0NDMyLDApfDA7bz1FZChvfDAsQ3wwLDI2KXwwO2w9QztrPURkKHB8MCxrfDAsb3wwLGx8MCl8MDtsPUhkKG98MCxsfDAsMjYpfDA7bD1DZChufDAsbXwwLGx8MCxDfDApfDA7Y1thPj4yXT1sO2NbYSs0Pj4yXT1rO2NbYSs4Pj4yXT1qO2NbYSsxMj4+Ml09aTtjW2ErMTY+PjJdPWg7Y1thKzIwPj4yXT1nO2NbYSsyND4+Ml09ZjtjW2ErMjg+PjJdPWU7Y1thKzMyPj4yXT1kO2NbYSszNj4+Ml09YjtyZXR1cm59ZnVuY3Rpb24gbWQoYixlLGYpe2I9YnwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MCxTPTAsVD0wLFU9MCxWPTAsVz0wLFg9MCxZPTAsWj0wLF89MCwkPTAsYWE9MCxiYT0wLGNhPTAsZGE9MCxlYT0wLGZhPTAsZ2E9MCxoYT0wLGlhPTAsamE9MCxrYT0wLGxhPTAsbWE9MCxuYT0wLG9hPTAscGE9MCxxYT0wLHJhPTAsc2E9MCx0YT0wLHVhPTAsdmE9MCx3YT0wLHhhPTAseWE9MCx6YT0wLEFhPTAsQmE9MCxDYT0wLERhPTAsRWE9MCxGYT0wLEdhPTAsSGE9MCxJYT0wLEphPTAsS2E9MCxMYT0wLE1hPTAsTmE9MCxPYT0wLFBhPTAsUWE9MCxSYT0wLFNhPTAsVGE9MCxVYT0wLFZhPTAsV2E9MCxYYT0wLFlhPTAsWmE9MCxfYT0wLCRhPTAsYWI9MCxiYj0wLGNiPTAsZGI9MCxlYj0wLGZiPTAsZ2I9MCxoYj0wLGliPTAsamI9MCxrYj0wLGxiPTAsbWI9MCxuYj0wO1lhPWk7T2E9aT1pKzYzJi02NDtpPWkrNDgwfDA7VGE9T2ErNDAwfDA7VWE9T2ErMzYwfDA7VmE9T2ErMzIwfDA7U2E9T2ErMjgwfDA7TWE9T2ErNDQwfDA7UGE9T2ErMjQwfDA7V2E9T2ErMjAwfDA7WGE9T2ErMTYwfDA7UWE9T2ErMTIwfDA7UmE9T2ErODB8MDtOYT1PYSs0MHwwO2g9TWE7Zz1oKzMyfDA7ZG97YVtoPj4wXT1hW2U+PjBdfDA7aD1oKzF8MDtlPWUrMXwwfXdoaWxlKChofDApPChnfDApKTthW01hPj4wXT0oZFtNYT4+MF18MCkmMjQ4O209TWErMzF8MDthW20+PjBdPShkW20+PjBdfDApJjYzfDY0O209ZFtmPj4wXXwwO0RhPUhkKGRbZisxPj4wXXwwfDAsMCw4KXwwO2o9Qzt2YT1IZChkW2YrMj4+MF18MHwwLDAsMTYpfDA7aj1qfEM7QWE9SGQoZFtmKzM+PjBdfDB8MCwwLDI0KXwwO2o9anxDO2s9YVtmKzY+PjBdfDA7bD1kW2YrND4+MF18MDt5YT1IZChkW2YrNT4+MF18MHwwLDAsOCl8MDt6YT1DO2s9SGQoayYyNTV8MCwwLDE2KXwwO3phPUhkKHlhfGx8a3wwLHphfEN8MCw2KXwwO2s9QztsPWFbZis5Pj4wXXwwO3lhPWRbZis3Pj4wXXwwO249SGQoZFtmKzg+PjBdfDB8MCwwLDgpfDA7RWE9QztsPUhkKGwmMjU1fDAsMCwxNil8MDtFYT1IZChufHlhfGx8MCxFYXxDfDAsNSl8MDtsPUM7eWE9YVtmKzEyPj4wXXwwO249ZFtmKzEwPj4wXXwwO0dhPUhkKGRbZisxMT4+MF18MHwwLDAsOCl8MDt4YT1DO3lhPUhkKHlhJjI1NXwwLDAsMTYpfDA7eGE9SGQoR2F8bnx5YXwwLHhhfEN8MCwzKXwwO3lhPUM7bj1hW2YrMTU+PjBdfDA7R2E9ZFtmKzEzPj4wXXwwO2g9SGQoZFtmKzE0Pj4wXXwwfDAsMCw4KXwwO0lhPUM7bj1IZChuJjI1NXwwLDAsMTYpfDA7SWE9SGQoaHxHYXxufDAsSWF8Q3wwLDIpfDA7bj1DO0dhPWRbZisxNj4+MF18MDtoPUhkKGRbZisxNz4+MF18MHwwLDAsOCl8MDtDYT1DO3A9SGQoZFtmKzE4Pj4wXXwwfDAsMCwxNil8MDtDYT1DYXxDO0JhPUhkKGRbZisxOT4+MF18MHwwLDAsMjQpfDA7QmE9aHxHYXxwfEJhO0NhPUNhfEM7cD1hW2YrMjI+PjBdfDA7R2E9ZFtmKzIwPj4wXXwwO2g9SGQoZFtmKzIxPj4wXXwwfDAsMCw4KXwwO2c9QztwPUhkKHAmMjU1fDAsMCwxNil8MDtnPUhkKGh8R2F8cHwwLGd8Q3wwLDcpfDA7cD1DO0dhPWFbZisyNT4+MF18MDtoPWRbZisyMz4+MF18MDtxPUhkKGRbZisyND4+MF18MHwwLDAsOCl8MDtGYT1DO0dhPUhkKEdhJjI1NXwwLDAsMTYpfDA7RmE9SGQocXxofEdhfDAsRmF8Q3wwLDUpfDA7R2E9QztoPWFbZisyOD4+MF18MDtxPWRbZisyNj4+MF18MDtLYT1IZChkW2YrMjc+PjBdfDB8MCwwLDgpfDA7TGE9QztoPUhkKGgmMjU1fDAsMCwxNil8MDtMYT1IZChLYXxxfGh8MCxMYXxDfDAsNCl8MDtoPUM7cT1hW2YrMzE+PjBdfDA7S2E9ZFtmKzI5Pj4wXXwwO2Y9SGQoZFtmKzMwPj4wXXwwfDAsMCw4KXwwO0phPUM7cT1IZChxJjI1NXwwLDAsMTYpfDA7SmE9SGQoZnxLYXxxfDAsSmF8Q3wwLDIpfDA7SmE9SmEmMzM1NTQ0Mjg7cT1EZChKYXwwLDAsMTY3NzcyMTYsMCl8MDtxPUdkKHF8MCxDfDAsMjUpfDA7S2E9QztmPUNkKDAsMCxxfDAsS2F8MCl8MDtqPURkKGYmMTl8MCwwLERhfG18dmF8QWF8MCxqfDApfDA7QWE9QztLYT1IZChxfDAsS2F8MCwyNSl8MDtxPUM7Zj1EZCh6YXwwLGt8MCwxNjc3NzIxNiwwKXwwO2Y9R2QoZnwwLEN8MCwyNSl8MDt2YT1DO2w9RGQoRWF8MCxsfDAsZnwwLHZhfDApfDA7RWE9Qzt2YT1IZChmfDAsdmF8MCwyNSl8MDt2YT1DZCh6YXwwLGt8MCx2YXwwLEN8MCl8MDtmPUM7az1EZCh4YXwwLHlhfDAsMTY3NzcyMTYsMCl8MDtrPUdkKGt8MCxDfDAsMjUpfDA7emE9QztuPURkKElhfDAsbnwwLGt8MCx6YXwwKXwwO0lhPUM7emE9SGQoa3wwLHphfDAsMjUpfDA7az1DO209RGQoQmF8MCxDYXwwLDE2Nzc3MjE2LDApfDA7bT1HZChtfDAsQ3wwLDI1KXwwO0RhPUM7cD1EZChnfDAscHwwLG18MCxEYXwwKXwwO2c9QztEYT1IZChtfDAsRGF8MCwyNSl8MDttPUM7bz1EZChGYXwwLEdhfDAsMTY3NzcyMTYsMCl8MDtvPUdkKG98MCxDfDAsMjUpfDA7SGE9QztoPURkKExhfDAsaHwwLG98MCxIYXwwKXwwO0xhPUM7SGE9SGQob3wwLEhhfDAsMjUpfDA7bz1DO3dhPURkKGp8MCxBYXwwLDMzNTU0NDMyLDApfDA7d2E9RWQod2F8MCxDfDAsMjYpfDA7ZT1DO2Y9RGQodmF8MCxmfDAsd2F8MCxlfDApfDA7ZT1IZCh3YXwwLGV8MCwyNil8MDtlPUNkKGp8MCxBYXwwLGV8MCxDfDApfDA7QWE9RGQobHwwLEVhfDAsMzM1NTQ0MzIsMCl8MDtBYT1FZChBYXwwLEN8MCwyNil8MDtqPUM7eWE9RGQoQWF8MCxqfDAseGF8MCx5YXwwKXwwO2s9Q2QoeWF8MCxDfDAsemF8MCxrfDApfDA7aj1IZChBYXwwLGp8MCwyNil8MDtqPUNkKGx8MCxFYXwwLGp8MCxDfDApfDA7RWE9RGQobnwwLElhfDAsMzM1NTQ0MzIsMCl8MDtFYT1FZChFYXwwLEN8MCwyNil8MDtsPUM7Q2E9RGQoRWF8MCxsfDAsQmF8MCxDYXwwKXwwO209Q2QoQ2F8MCxDfDAsRGF8MCxtfDApfDA7bD1IZChFYXwwLGx8MCwyNil8MDtsPUNkKG58MCxJYXwwLGx8MCxDfDApfDA7SWE9RGQocHwwLGd8MCwzMzU1NDQzMiwwKXwwO0lhPUVkKElhfDAsQ3wwLDI2KXwwO249QztHYT1EZChJYXwwLG58MCxGYXwwLEdhfDApfDA7bz1DZChHYXwwLEN8MCxIYXwwLG98MCl8MDtuPUhkKElhfDAsbnwwLDI2KXwwO249Q2QocHwwLGd8MCxufDAsQ3wwKXwwO2c9RGQoaHwwLExhfDAsMzM1NTQ0MzIsMCl8MDtnPUVkKGd8MCxDfDAsMjYpfDA7cD1DO0phPURkKEphfDAsMCxnfDAscHwwKXwwO3E9Q2QoSmF8MCxDfDAsS2F8MCxxfDApfDA7cD1IZChnfDAscHwwLDI2KXwwO3A9Q2QoaHwwLExhfDAscHwwLEN8MCl8MDtjW1BhPj4yXT1lO2NbUGErND4+Ml09ZjtjW1BhKzg+PjJdPWo7Y1tQYSsxMj4+Ml09aztjW1BhKzE2Pj4yXT1sO2NbUGErMjA+PjJdPW07Y1tQYSsyND4+Ml09bjtjW1BhKzI4Pj4yXT1vO2NbUGErMzI+PjJdPXA7Y1tQYSszNj4+Ml09cTtjW1dhPj4yXT0xO0xhPVdhKzR8MDtoPUxhO2c9aCszNnwwO2Rve2NbaD4+Ml09MDtoPWgrNHwwfXdoaWxlKChofDApPChnfDApKTtoPVhhO2c9aCs0MHwwO2Rve2NbaD4+Ml09MDtoPWgrNHwwfXdoaWxlKChofDApPChnfDApKTtjW1FhPj4yXT1lO3RhPVFhKzR8MDtjW3RhPj4yXT1mO3VhPVFhKzh8MDtjW3VhPj4yXT1qO3ZhPVFhKzEyfDA7Y1t2YT4+Ml09azt3YT1RYSsxNnwwO2Nbd2E+PjJdPWw7eGE9UWErMjB8MDtjW3hhPj4yXT1tO3lhPVFhKzI0fDA7Y1t5YT4+Ml09bjt6YT1RYSsyOHwwO2NbemE+PjJdPW87QWE9UWErMzJ8MDtjW0FhPj4yXT1wO0JhPVFhKzM2fDA7Y1tCYT4+Ml09cTtjW1JhPj4yXT0xO0NhPVJhKzR8MDtoPUNhO2c9aCszNnwwO2Rve2NbaD4+Ml09MDtoPWgrNHwwfXdoaWxlKChofDApPChnfDApKTtEYT1XYSs4fDA7RWE9V2ErMTJ8MDtGYT1XYSsxNnwwO0dhPVdhKzIwfDA7SGE9V2ErMjR8MDtJYT1XYSsyOHwwO0phPVdhKzMyfDA7S2E9V2ErMzZ8MDtNPVhhKzR8MDtOPVhhKzh8MDtPPVhhKzEyfDA7UD1YYSsxNnwwO1E9WGErMjB8MDtSPVhhKzI0fDA7Uz1YYSsyOHwwO1Q9WGErMzJ8MDtVPVhhKzM2fDA7Vj1SYSs4fDA7Vz1SYSsxMnwwO1g9UmErMTZ8MDtZPVJhKzIwfDA7Wj1SYSsyNHwwO189UmErMjh8MDskPVJhKzMyfDA7YWE9UmErMzZ8MDtiYT1OYSs0fDA7Y2E9TmErOHwwO2RhPU5hKzEyfDA7ZWE9TmErMTZ8MDtmYT1OYSsyMHwwO2dhPU5hKzI0fDA7aGE9TmErMjh8MDtpYT1OYSszMnwwO2phPU5hKzM2fDA7a2E9T2ErNHwwO2xhPU9hKzh8MDttYT1PYSsxMnwwO25hPU9hKzE2fDA7b2E9T2ErMjB8MDtwYT1PYSsyNHwwO3FhPU9hKzI4fDA7cmE9T2ErMzJ8MDtzYT1PYSszNnwwO0w9MTtLPTA7Sj0wO0k9MDtIPTA7Rz0wO0Y9MDtFPTA7RD0wO2g9MDtyPTA7cz0wO3Q9MDt1PTA7dj0wO3c9MDt4PTA7eT0wO3o9MDtBPTI1NDtCPTA7d2hpbGUoMSl7Zz0oZFtNYSsoKEF8MCkvOHwwKT4+MF18MCk+Pj4oQSY3KSYxO25iPTAtKGdeQil8MDtiYj0oZV5MKSZuYjthYj0oZl5LKSZuYjskYT0oal5KKSZuYjtfYT0oa15JKSZuYjtaYT0obF5IKSZuYjtrYj0obV5HKSZuYjttYj0obl5GKSZuYjtCPShvXkUpJm5iO2piPShwXkQpJm5iO2xiPShxXmgpJm5iO2NbV2E+PjJdPWJiXkw7Y1tMYT4+Ml09YWJeSztjW0RhPj4yXT0kYV5KO2NbRWE+PjJdPV9hXkk7Y1tGYT4+Ml09WmFeSDtjW0dhPj4yXT1rYl5HO2NbSGE+PjJdPW1iXkY7Y1tJYT4+Ml09Ql5FO2NbSmE+PjJdPWpiXkQ7Y1tLYT4+Ml09bGJeaDtiYj1iYl5lO2NbUWE+PjJdPWJiO2FiPWFiXmY7Y1t0YT4+Ml09YWI7JGE9JGFeajtjW3VhPj4yXT0kYTtfYT1fYV5rO2NbdmE+PjJdPV9hO1phPVphXmw7Y1t3YT4+Ml09WmE7ST1rYl5tO2NbeGE+PjJdPUk7RT1tYl5uO2NbeWE+PjJdPUU7bD1CXm87Y1t6YT4+Ml09bDtqPWpiXnA7Y1tBYT4+Ml09ajtmPWxiXnE7Y1tCYT4+Ml09ZjtLPWNbVT4+Ml18MDtsYj1jW1JhPj4yXXwwO2piPWNbQ2E+PjJdfDA7Qj1jW1Y+PjJdfDA7cD1jW1c+PjJdfDA7cT1jW1g+PjJdfDA7RD1jW1k+PjJdfDA7Rj1jW1o+PjJdfDA7SD1jW18+PjJdfDA7Sj1jWyQ+PjJdfDA7TD1jW2FhPj4yXXwwO21iPShsYl5yKSZuYjtrYj0oamJecykmbmI7aWI9KEJedCkmbmI7aGI9KHBedSkmbmI7Z2I9KHFedikmbmI7ZmI9KERedykmbmI7ZWI9KEZeeCkmbmI7ZGI9KEheeSkmbmI7Y2I9KEpeeikmbmI7bz0oTF5LKSZuYjtlPW1iXnI7Y1tYYT4+Ml09ZTtoPWtiXnM7Y1tNPj4yXT1oO2s9aWJedDtjW04+PjJdPWs7bT1oYl51O2NbTz4+Ml09bTtuPWdiXnY7Y1tQPj4yXT1uO3I9ZmJedztjW1E+PjJdPXI7dj1lYl54O2NbUj4+Ml09djt4PWRiXnk7Y1tTPj4yXT14O0c9Y2JeejtjW1Q+PjJdPUc7Sz1vXks7Y1tVPj4yXT1LO3M9bWJebGI7Y1tSYT4+Ml09czt1PWtiXmpiO2NbQ2E+PjJdPXU7Qj1pYl5CO2NbVj4+Ml09QjtwPWhiXnA7Y1tXPj4yXT1wO3E9Z2JecTtjW1g+PjJdPXE7RD1mYl5EO2NbWT4+Ml09RDtGPWViXkY7Y1taPj4yXT1GO0g9ZGJeSDtjW18+PjJdPUg7Sj1jYl5KO2NbJD4+Ml09SjtMPW9eTDtjW2FhPj4yXT1MO2NbTmE+PjJdPWJiLXM7Y1tiYT4+Ml09YWItdTtjW2NhPj4yXT0kYS1CO2NbZGE+PjJdPV9hLXA7Y1tlYT4+Ml09WmEtcTtjW2ZhPj4yXT1JLUQ7Y1tnYT4+Ml09RS1GO2NbaGE+PjJdPWwtSDtjW2lhPj4yXT1qLUo7Y1tqYT4+Ml09Zi1MO2Y9Y1tXYT4+Ml18MDtqPWNbTGE+PjJdfDA7bD1jW0RhPj4yXXwwO3c9Y1tFYT4+Ml18MDtvPWNbRmE+PjJdfDA7dD1jW0dhPj4yXXwwO3o9Y1tIYT4+Ml18MDtFPWNbSWE+PjJdfDA7ST1jW0phPj4yXXwwO3k9Y1tLYT4+Ml18MDtjW09hPj4yXT1mLWU7Y1trYT4+Ml09ai1oO2NbbGE+PjJdPWwtaztjW21hPj4yXT13LW07Y1tuYT4+Ml09by1uO2Nbb2E+PjJdPXQtcjtjW3BhPj4yXT16LXY7Y1txYT4+Ml09RS14O2NbcmE+PjJdPUktRztjW3NhPj4yXT15LUs7Y1tXYT4+Ml09ZStmO2NbTGE+PjJdPWgrajtjW0RhPj4yXT1rK2w7Y1tFYT4+Ml09bSt3O2NbRmE+PjJdPW4rbztjW0dhPj4yXT1yK3Q7Y1tIYT4+Ml09dit6O2NbSWE+PjJdPXgrRTtjW0phPj4yXT1HK0k7Y1tLYT4+Ml09Syt5O3U9dSsoY1t0YT4+Ml18MCl8MDtCPUIrKGNbdWE+PjJdfDApfDA7cD1wKyhjW3ZhPj4yXXwwKXwwO3E9cSsoY1t3YT4+Ml18MCl8MDtEPUQrKGNbeGE+PjJdfDApfDA7Rj1GKyhjW3lhPj4yXXwwKXwwO0g9SCsoY1t6YT4+Ml18MCl8MDtKPUorKGNbQWE+PjJdfDApfDA7TD1MKyhjW0JhPj4yXXwwKXwwO2NbWGE+PjJdPXMrKGNbUWE+PjJdfDApO2NbTT4+Ml09dTtjW04+PjJdPUI7Y1tPPj4yXT1wO2NbUD4+Ml09cTtjW1E+PjJdPUQ7Y1tSPj4yXT1GO2NbUz4+Ml09SDtjW1Q+PjJdPUo7Y1tVPj4yXT1MO2tkKFJhLE5hLFdhKTtrZChYYSxYYSxPYSk7bGQoTmEsT2EpO2xkKE9hLFdhKTtMPWNbUmE+PjJdfDA7Sj1jW0NhPj4yXXwwO0g9Y1tWPj4yXXwwO0Y9Y1tXPj4yXXwwO0Q9Y1tYPj4yXXwwO3E9Y1tZPj4yXXwwO3A9Y1taPj4yXXwwO0I9Y1tfPj4yXXwwO3U9Y1skPj4yXXwwO3M9Y1thYT4+Ml18MDt5PWNbWGE+PjJdfDA7Sz1jW00+PjJdfDA7ST1jW04+PjJdfDA7Rz1jW08+PjJdfDA7RT1jW1A+PjJdfDA7ej1jW1E+PjJdfDA7eD1jW1I+PjJdfDA7dj1jW1M+PjJdfDA7dD1jW1Q+PjJdfDA7cj1jW1U+PjJdfDA7Y1tRYT4+Ml09eStMO2NbdGE+PjJdPUsrSjtjW3VhPj4yXT1JK0g7Y1t2YT4+Ml09RytGO2Nbd2E+PjJdPUUrRDtjW3hhPj4yXT16K3E7Y1t5YT4+Ml09eCtwO2NbemE+PjJdPXYrQjtjW0FhPj4yXT10K3U7Y1tCYT4+Ml09citzO2NbWGE+PjJdPUwteTtjW00+PjJdPUotSztjW04+PjJdPUgtSTtjW08+PjJdPUYtRztjW1A+PjJdPUQtRTtjW1E+PjJdPXEtejtjW1I+PjJdPXAteDtjW1M+PjJdPUItdjtjW1Q+PjJdPXUtdDtjW1U+PjJdPXMtcjtrZChXYSxPYSxOYSk7cj0oY1tPYT4+Ml18MCktKGNbTmE+PjJdfDApfDA7cz0oY1trYT4+Ml18MCktKGNbYmE+PjJdfDApfDA7dD0oY1tsYT4+Ml18MCktKGNbY2E+PjJdfDApfDA7dT0oY1ttYT4+Ml18MCktKGNbZGE+PjJdfDApfDA7dj0oY1tuYT4+Ml18MCktKGNbZWE+PjJdfDApfDA7Qj0oY1tvYT4+Ml18MCktKGNbZmE+PjJdfDApfDA7eD0oY1twYT4+Ml18MCktKGNbZ2E+PjJdfDApfDA7cD0oY1txYT4+Ml18MCktKGNbaGE+PjJdfDApfDA7ej0oY1tyYT4+Ml18MCktKGNbaWE+PjJdfDApfDA7cT0oY1tzYT4+Ml18MCktKGNbamE+PjJdfDApfDA7Y1tPYT4+Ml09cjtjW2thPj4yXT1zO2NbbGE+PjJdPXQ7Y1ttYT4+Ml09dTtjW25hPj4yXT12O2Nbb2E+PjJdPUI7Y1twYT4+Ml09eDtjW3FhPj4yXT1wO2NbcmE+PjJdPXo7Y1tzYT4+Ml09cTtsZChYYSxYYSk7cj1PZChyfDAsKChyfDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtFPUM7cz1PZChzfDAsKChzfDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtEPUM7dD1PZCh0fDAsKCh0fDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtHPUM7dT1PZCh1fDAsKCh1fDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtGPUM7dj1PZCh2fDAsKCh2fDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtJPUM7Qj1PZChCfDAsKChCfDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtIPUM7eD1PZCh4fDAsKCh4fDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtLPUM7cD1PZChwfDAsKChwfDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtKPUM7ej1PZCh6fDAsKCh6fDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDt5PUM7cT1PZChxfDAsKChxfDApPDApPDwzMT4+MzF8MCwxMjE2NjYsMCl8MDtMPUM7bz1EZChxfDAsTHwwLDE2Nzc3MjE2LDApfDA7bz1FZChvfDAsQ3wwLDI1KXwwO3c9QztuPU9kKG98MCx3fDAsMTksMCl8MDtFPURkKG58MCxDfDAscnwwLEV8MCl8MDtyPUM7dz1IZChvfDAsd3wwLDI1KXwwO3c9Q2QocXwwLEx8MCx3fDAsQ3wwKXwwO0w9QztxPURkKHN8MCxEfDAsMTY3NzcyMTYsMCl8MDtxPUVkKHF8MCxDfDAsMjUpfDA7bz1DO0c9RGQocXwwLG98MCx0fDAsR3wwKXwwO3Q9QztvPUhkKHF8MCxvfDAsMjUpfDA7bz1DZChzfDAsRHwwLG98MCxDfDApfDA7RD1DO3M9RGQodXwwLEZ8MCwxNjc3NzIxNiwwKXwwO3M9RWQoc3wwLEN8MCwyNSl8MDtxPUM7ST1EZChzfDAscXwwLHZ8MCxJfDApfDA7dj1DO3E9SGQoc3wwLHF8MCwyNSl8MDtxPUNkKHV8MCxGfDAscXwwLEN8MCl8MDtGPUM7dT1EZChCfDAsSHwwLDE2Nzc3MjE2LDApfDA7dT1FZCh1fDAsQ3wwLDI1KXwwO3M9QztLPURkKHV8MCxzfDAseHwwLEt8MCl8MDt4PUM7cz1IZCh1fDAsc3wwLDI1KXwwO3M9Q2QoQnwwLEh8MCxzfDAsQ3wwKXwwO0g9QztCPURkKHB8MCxKfDAsMTY3NzcyMTYsMCl8MDtCPUVkKEJ8MCxDfDAsMjUpfDA7dT1DO3k9RGQoQnwwLHV8MCx6fDAseXwwKXwwO3o9Qzt1PUhkKEJ8MCx1fDAsMjUpfDA7dT1DZChwfDAsSnwwLHV8MCxDfDApfDA7Sj1DO3A9RGQoRXwwLHJ8MCwzMzU1NDQzMiwwKXwwO3A9RWQocHwwLEN8MCwyNil8MDtCPUM7RD1EZChvfDAsRHwwLHB8MCxCfDApfDA7Qj1IZChwfDAsQnwwLDI2KXwwO0I9Q2QoRXwwLHJ8MCxCfDAsQ3wwKXwwO3I9RGQoR3wwLHR8MCwzMzU1NDQzMiwwKXwwO3I9RWQocnwwLEN8MCwyNil8MDtFPUM7Rj1EZChxfDAsRnwwLHJ8MCxFfDApfDA7RT1IZChyfDAsRXwwLDI2KXwwO0U9Q2QoR3wwLHR8MCxFfDAsQ3wwKXwwO3Q9RGQoSXwwLHZ8MCwzMzU1NDQzMiwwKXwwO3Q9RWQodHwwLEN8MCwyNil8MDtHPUM7SD1EZChzfDAsSHwwLHR8MCxHfDApfDA7Rz1IZCh0fDAsR3wwLDI2KXwwO0c9Q2QoSXwwLHZ8MCxHfDAsQ3wwKXwwO3Y9RGQoS3wwLHh8MCwzMzU1NDQzMiwwKXwwO3Y9RWQodnwwLEN8MCwyNil8MDtJPUM7Sj1EZCh1fDAsSnwwLHZ8MCxJfDApfDA7ST1IZCh2fDAsSXwwLDI2KXwwO0k9Q2QoS3wwLHh8MCxJfDAsQ3wwKXwwO3g9RGQoeXwwLHp8MCwzMzU1NDQzMiwwKXwwO3g9RWQoeHwwLEN8MCwyNil8MDtLPUM7TD1EZCh3fDAsTHwwLHh8MCxLfDApfDA7Sz1IZCh4fDAsS3wwLDI2KXwwO0s9Q2QoeXwwLHp8MCxLfDAsQ3wwKXwwO2NbUmE+PjJdPUI7Y1tDYT4+Ml09RDtjW1Y+PjJdPUU7Y1tXPj4yXT1GO2NbWD4+Ml09RztjW1k+PjJdPUg7Y1taPj4yXT1JO2NbXz4+Ml09SjtjWyQ+PjJdPUs7Y1thYT4+Ml09TDtsZChRYSxRYSk7RD1EKyhjW2JhPj4yXXwwKXwwO0U9RSsoY1tjYT4+Ml18MCl8MDtGPUYrKGNbZGE+PjJdfDApfDA7Rz1HKyhjW2VhPj4yXXwwKXwwO0g9SCsoY1tmYT4+Ml18MCl8MDtJPUkrKGNbZ2E+PjJdfDApfDA7Sj1KKyhjW2hhPj4yXXwwKXwwO0s9SysoY1tpYT4+Ml18MCl8MDtMPUwrKGNbamE+PjJdfDApfDA7Y1tOYT4+Ml09QisoY1tOYT4+Ml18MCk7Y1tiYT4+Ml09RDtjW2NhPj4yXT1FO2NbZGE+PjJdPUY7Y1tlYT4+Ml09RztjW2ZhPj4yXT1IO2NbZ2E+PjJdPUk7Y1toYT4+Ml09SjtjW2lhPj4yXT1LO2NbamE+PjJdPUw7a2QoUmEsUGEsWGEpO2tkKFhhLE9hLE5hKTtpZigoQXwwKTw9MClicmVhaztlPWNbUWE+PjJdfDA7TD1jW1dhPj4yXXwwO2Y9Y1t0YT4+Ml18MDtLPWNbTGE+PjJdfDA7aj1jW3VhPj4yXXwwO0o9Y1tEYT4+Ml18MDtrPWNbdmE+PjJdfDA7ST1jW0VhPj4yXXwwO2w9Y1t3YT4+Ml18MDtIPWNbRmE+PjJdfDA7bT1jW3hhPj4yXXwwO0c9Y1tHYT4+Ml18MDtuPWNbeWE+PjJdfDA7Rj1jW0hhPj4yXXwwO289Y1t6YT4+Ml18MDtFPWNbSWE+PjJdfDA7cD1jW0FhPj4yXXwwO0Q9Y1tKYT4+Ml18MDtxPWNbQmE+PjJdfDA7aD1jW0thPj4yXXwwO3I9Y1tYYT4+Ml18MDtzPWNbTT4+Ml18MDt0PWNbTj4+Ml18MDt1PWNbTz4+Ml18MDt2PWNbUD4+Ml18MDt3PWNbUT4+Ml18MDt4PWNbUj4+Ml18MDt5PWNbUz4+Ml18MDt6PWNbVD4+Ml18MDtBPUErLTF8MDtCPWd9a2E9Y1tXYT4+Ml18MDtsYT1jW0xhPj4yXXwwO21hPWNbRGE+PjJdfDA7bmE9Y1tFYT4+Ml18MDtvYT1jW0ZhPj4yXXwwO3BhPWNbR2E+PjJdfDA7cWE9Y1tIYT4+Ml18MDtyYT1jW0lhPj4yXXwwO3NhPWNbSmE+PjJdfDA7bGI9Y1tLYT4+Ml18MDtoYj1jW1FhPj4yXXwwO2RiPWNbdGE+PjJdfDA7JGE9Y1t1YT4+Ml18MDtQYT1jW3ZhPj4yXXwwO21iPWNbd2E+PjJdfDA7aWI9Y1t4YT4+Ml18MDtlYj1jW3lhPj4yXXwwO2FiPWNbemE+PjJdfDA7T2E9Y1tBYT4+Ml18MDtNYT1jW0JhPj4yXXwwO25iPTAtZ3wwO2piPShoYl5rYSkmbmI7ZmI9KGRiXmxhKSZuYjtiYj0oJGFebWEpJm5iO1phPShQYV5uYSkmbmI7ZT0obWJeb2EpJm5iO2tiPShpYl5wYSkmbmI7Z2I9KGViXnFhKSZuYjtjYj0oYWJecmEpJm5iO19hPShPYV5zYSkmbmI7TmE9KE1hXmxiKSZuYjtjW1dhPj4yXT1qYl5rYTtjW0xhPj4yXT1mYl5sYTtjW0RhPj4yXT1iYl5tYTtjW0VhPj4yXT1aYV5uYTtjW0ZhPj4yXT1lXm9hO2NbR2E+PjJdPWtiXnBhO2NbSGE+PjJdPWdiXnFhO2NbSWE+PjJdPWNiXnJhO2NbSmE+PjJdPV9hXnNhO2NbS2E+PjJdPU5hXmxiO2NbUWE+PjJdPWpiXmhiO2NbdGE+PjJdPWZiXmRiO2NbdWE+PjJdPWJiXiRhO2NbdmE+PjJdPVphXlBhO2Nbd2E+PjJdPWVebWI7Y1t4YT4+Ml09a2JeaWI7Y1t5YT4+Ml09Z2JeZWI7Y1t6YT4+Ml09Y2JeYWI7Y1tBYT4+Ml09X2FeT2E7Y1tCYT4+Ml09TmFeTWE7dmE9Y1tYYT4+Ml18MDt3YT1jW00+PjJdfDA7eGE9Y1tOPj4yXXwwO3lhPWNbTz4+Ml18MDt6YT1jW1A+PjJdfDA7QWE9Y1tRPj4yXXwwO0JhPWNbUj4+Ml18MDtNYT1jW1M+PjJdfDA7TmE9Y1tUPj4yXXwwO09hPWNbVT4+Ml18MDtRYT1jW1JhPj4yXXwwO19hPWNbQ2E+PjJdfDA7YWI9Y1tWPj4yXXwwO2NiPWNbVz4+Ml18MDtlYj1jW1g+PjJdfDA7Z2I9Y1tZPj4yXXwwO2liPWNbWj4+Ml18MDtrYj1jW18+PjJdfDA7bWI9Y1skPj4yXXwwO2U9Y1thYT4+Ml18MDtQYT0oUWFedmEpJm5iO1phPShfYV53YSkmbmI7JGE9KGFiXnhhKSZuYjtiYj0oY2JeeWEpJm5iO2RiPShlYl56YSkmbmI7ZmI9KGdiXkFhKSZuYjtoYj0oaWJeQmEpJm5iO2piPShrYl5NYSkmbmI7bGI9KG1iXk5hKSZuYjtuYj0oZV5PYSkmbmI7Y1tYYT4+Ml09UGFedmE7Y1tNPj4yXT1aYV53YTtjW04+PjJdPSRhXnhhO2NbTz4+Ml09YmJeeWE7Y1tQPj4yXT1kYl56YTtjW1E+PjJdPWZiXkFhO2NbUj4+Ml09aGJeQmE7Y1tTPj4yXT1qYl5NYTtjW1Q+PjJdPWxiXk5hO2NbVT4+Ml09bmJeT2E7Y1tSYT4+Ml09UGFeUWE7Y1tDYT4+Ml09WmFeX2E7Y1tWPj4yXT0kYV5hYjtjW1c+PjJdPWJiXmNiO2NbWD4+Ml09ZGJeZWI7Y1tZPj4yXT1mYl5nYjtjW1o+PjJdPWhiXmliO2NbXz4+Ml09amJea2I7Y1skPj4yXT1sYl5tYjtjW2FhPj4yXT1uYl5lO2xkKFRhLFhhKTtsZChVYSxUYSk7bGQoVWEsVWEpO2tkKFVhLFhhLFVhKTtrZChUYSxUYSxVYSk7bGQoVmEsVGEpO2tkKFVhLFVhLFZhKTtsZChWYSxVYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2tkKFVhLFZhLFVhKTtsZChWYSxVYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7a2QoVmEsVmEsVWEpO2xkKFNhLFZhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7bGQoU2EsU2EpO2xkKFNhLFNhKTtsZChTYSxTYSk7a2QoVmEsU2EsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtsZChWYSxWYSk7bGQoVmEsVmEpO2xkKFZhLFZhKTtrZChVYSxWYSxVYSk7bGQoVmEsVWEpO2U9MTtkb3tsZChWYSxWYSk7ZT1lKzF8MH13aGlsZSgoZXwwKSE9NTApO2tkKFZhLFZhLFVhKTtsZChTYSxWYSk7ZT0xO2Rve2xkKFNhLFNhKTtlPWUrMXwwfXdoaWxlKChlfDApIT0xMDApO2tkKFZhLFNhLFZhKTtsZChWYSxWYSk7ZT0xO2Rve2xkKFZhLFZhKTtlPWUrMXwwfXdoaWxlKChlfDApIT01MCk7a2QoVWEsVmEsVWEpO2xkKFVhLFVhKTtsZChVYSxVYSk7bGQoVWEsVWEpO2xkKFVhLFVhKTtsZChVYSxVYSk7a2QoWGEsVWEsVGEpO2tkKFdhLFdhLFhhKTtlYj1jW1dhPj4yXXwwO2ZiPWNbTGE+PjJdfDA7Z2I9Y1tEYT4+Ml18MDtoYj1jW0VhPj4yXXwwO2liPWNbRmE+PjJdfDA7amI9Y1tHYT4+Ml18MDtrYj1jW0hhPj4yXXwwO2xiPWNbSWE+PjJdfDA7bmI9Y1tKYT4+Ml18MDttYj1jW0thPj4yXXwwO2ViPSgoKCgoKCgoKCgoKChtYioxOXwwKSsxNjc3NzIxNj4+MjUpK2ViPj4yNikrZmI+PjI1KStnYj4+MjYpK2hiPj4yNSkraWI+PjI2KStqYj4+MjUpK2tiPj4yNikrbGI+PjI1KStuYj4+MjYpK21iPj4yNSkqMTl8MCkrZWJ8MDtkYj1lYj4+MjY7ZmI9ZGIrZmJ8MDtkYj1lYi0oZGI8PDI2KXwwO2ViPWZiPj4yNTtnYj1lYitnYnwwO2ViPWZiLShlYjw8MjUpfDA7ZmI9Z2I+PjI2O2hiPWZiK2hifDA7ZmI9Z2ItKGZiPDwyNil8MDtnYj1oYj4+MjU7aWI9Z2IraWJ8MDtnYj1oYi0oZ2I8PDI1KXwwO2hiPWliPj4yNjtqYj1oYitqYnwwO2hiPWliLShoYjw8MjYpfDA7aWI9amI+PjI1O2tiPWliK2tifDA7aWI9amItKGliPDwyNSl8MDtqYj1rYj4+MjY7bGI9amIrbGJ8MDtqYj1rYi0oamI8PDI2KXwwO2tiPWxiPj4yNTtuYj1rYituYnwwO2tiPWxiLShrYjw8MjUpfDA7bGI9bmI+PjI2O21iPWxiK21ifDA7bGI9bmItKGxiPDwyNil8MDtuYj1tYiYzMzU1NDQzMTthW2I+PjBdPWRiO2FbYisxPj4wXT1kYj4+Pjg7YVtiKzI+PjBdPWRiPj4+MTY7YVtiKzM+PjBdPWViPDwyfGRiPj4+MjQ7YVtiKzQ+PjBdPWViPj4+NjthW2IrNT4+MF09ZWI+Pj4xNDthW2IrNj4+MF09ZmI8PDN8ZWI+Pj4yMjthW2IrNz4+MF09ZmI+Pj41O2FbYis4Pj4wXT1mYj4+PjEzO2FbYis5Pj4wXT1nYjw8NXxmYj4+PjIxO2FbYisxMD4+MF09Z2I+Pj4zO2FbYisxMT4+MF09Z2I+Pj4xMTthW2IrMTI+PjBdPWhiPDw2fGdiPj4+MTk7YVtiKzEzPj4wXT1oYj4+PjI7YVtiKzE0Pj4wXT1oYj4+PjEwO2FbYisxNT4+MF09aGI+Pj4xODthW2IrMTY+PjBdPWliO2FbYisxNz4+MF09aWI+Pj44O2FbYisxOD4+MF09aWI+Pj4xNjthW2IrMTk+PjBdPWpiPDwxfGliPj4+MjQ7YVtiKzIwPj4wXT1qYj4+Pjc7YVtiKzIxPj4wXT1qYj4+PjE1O2FbYisyMj4+MF09a2I8PDN8amI+Pj4yMzthW2IrMjM+PjBdPWtiPj4+NTthW2IrMjQ+PjBdPWtiPj4+MTM7YVtiKzI1Pj4wXT1sYjw8NHxrYj4+PjIxO2FbYisyNj4+MF09bGI+Pj40O2FbYisyNz4+MF09bGI+Pj4xMjthW2IrMjg+PjBdPWxiPj4+MjB8bmI8PDY7YVtiKzI5Pj4wXT1tYj4+PjI7YVtiKzMwPj4wXT1tYj4+PjEwO2FbYiszMT4+MF09bmI+Pj4xODtpPVlhO3JldHVybn1mdW5jdGlvbiBuZChiLGUsZixnLGgsaixrLGwpe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO2w9bHwwO3ZhciBtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wO0Q9aTtCPWk9aSs2MyYtNjQ7aT1pKzExMnwwO3Y9QjtBPUIrNDh8MDtCPUIrMTZ8MDtpZigoZnwwKT09MCYoZ3wwKT09MCl7aT1EO3JldHVybn1uPUI7bT1uKzMyfDA7ZG97YVtuPj4wXT1hW2w+PjBdfDA7bj1uKzF8MDtsPWwrMXwwfXdoaWxlKChufDApPChtfDApKTtzPWg7cD1zO3M9cys0fDA7cz1kW3M+PjBdfGRbcysxPj4wXTw8OHxkW3MrMj4+MF08PDE2fGRbcyszPj4wXTw8MjQ7bz12O2Nbbz4+Ml09ZFtwPj4wXXxkW3ArMT4+MF08PDh8ZFtwKzI+PjBdPDwxNnxkW3ArMz4+MF08PDI0O2Nbbys0Pj4yXT1zO289dis4fDA7YVtvPj4wXT1qO3M9R2QoanwwLGt8MCw4KXwwO3A9dis5fDA7YVtwPj4wXT1zO3M9R2QoanwwLGt8MCwxNil8MDtxPXYrMTB8MDthW3E+PjBdPXM7cz1HZChqfDAsa3wwLDI0KXwwO3I9disxMXwwO2Fbcj4+MF09cztzPXYrMTJ8MDthW3M+PjBdPWs7bj1HZChqfDAsa3wwLDQwKXwwO3Q9disxM3wwO2FbdD4+MF09bjtuPUdkKGp8MCxrfDAsNDgpfDA7dT12KzE0fDA7YVt1Pj4wXT1uO2s9R2QoanwwLGt8MCw1Nil8MDtqPXYrMTV8MDthW2o+PjBdPWs7aWYoZz4+PjA+MHwoZ3wwKT09MCZmPj4+MD42Myl7bj1lO2g9ZjtsPWc7ZG97b2IoQSx2LEIsMzM4MzMpO209MDtkb3thW2IrbT4+MF09YVtBK20+PjBdXmFbbittPj4wXTttPW0rMXwwfXdoaWxlKChtfDApIT02NCk7Zj1jW28+PjJdfDA7Zz0oZiYyNTUpKzF8MDthW28+PjBdPWc7Zz0oZj4+PjgmMjU1KSsoZz4+PjgpfDA7YVtwPj4wXT1nO2c9KGY+Pj4xNiYyNTUpKyhnPj4+OCl8MDthW3E+PjBdPWc7Zz0oZj4+PjI0KSsoZz4+PjgpfDA7YVtyPj4wXT1nO2Y9Y1tzPj4yXXwwO2c9KGYmMjU1KSsoZz4+PjgpfDA7YVtzPj4wXT1nO2c9KGY+Pj44JjI1NSkrKGc+Pj44KXwwO2FbdD4+MF09ZztnPShmPj4+MTYmMjU1KSsoZz4+PjgpfDA7YVt1Pj4wXT1nO2Fbaj4+MF09KGY+Pj4yNCkrKGc+Pj44KTtoPURkKGh8MCxsfDAsLTY0LC0xKXwwO2w9QztiPWIrNjR8MDtuPW4rNjR8MH13aGlsZShsPj4+MD4wfChsfDApPT0wJmg+Pj4wPjYzKTtpZighKChofDApPT0wJihsfDApPT0wKSl7eD1iO3k9aDt6PW47dz04fX1lbHNle3g9Yjt5PWY7ej1lO3c9OH1pZigod3wwKT09OD8ob2IoQSx2LEIsMzM4MzMpLCh5fDApIT0wKTowKXtsPTA7ZG97YVt4K2w+PjBdPWFbQStsPj4wXV5hW3orbD4+MF07bD1sKzF8MH13aGlsZSgobHwwKSE9KHl8MCkpfW49QTttPW4rNjR8MDtkb3thW24+PjBdPTA7bj1uKzF8MH13aGlsZSgobnwwKTwobXwwKSk7bj1CO209biszMnwwO2Rve2Fbbj4+MF09MDtuPW4rMXwwfXdoaWxlKChufDApPChtfDApKTtpPUQ7cmV0dXJufWZ1bmN0aW9uIG9kKCl7dmFyIGE9MDtpZighKGNbNzk3OV18MCkpYT0zMTk2NDtlbHNlIGE9Y1sob2EoKXwwKSs2MD4+Ml18MDtyZXR1cm4gYXwwfWZ1bmN0aW9uIHBkKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2Q9aTtiPWk9aSs2MyYtNjQ7aT1pKzE2fDA7Y1tiPj4yXT1jW2ErNjA+PjJdO2E9cGEoNixifDApfDA7aWYoYT4+PjA+NDI5NDk2MzIwMCl7aWYoIShjWzc5NzldfDApKWI9MzE5NjQ7ZWxzZSBiPWNbKG9hKCl8MCkrNjA+PjJdfDA7Y1tiPj4yXT0wLWE7YT0tMX1pPWQ7cmV0dXJuIGF8MH1mdW5jdGlvbiBxZChhLGIsZCl7YT1hfDA7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtnPWk7ZT1pPWkrNjMmLTY0O2k9aSszMnwwO2g9ZTtlPWUrMjB8MDtjW2g+PjJdPWNbYSs2MD4+Ml07Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPWI7Y1toKzEyPj4yXT1lO2NbaCsxNj4+Ml09ZDtiPXlhKDE0MCxofDApfDA7aWYoYj4+PjA8PTQyOTQ5NjMyMDApaWYoKGJ8MCk8MClmPTc7ZWxzZSBhPWNbZT4+Ml18MDtlbHNle2lmKCEoY1s3OTc5XXwwKSlhPTMxOTY0O2Vsc2UgYT1jWyhvYSgpfDApKzYwPj4yXXwwO2NbYT4+Ml09MC1iO2Y9N31pZigoZnwwKT09Nyl7Y1tlPj4yXT0tMTthPS0xfWk9ZztyZXR1cm4gYXwwfWZ1bmN0aW9uIHJkKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7cT1pO2s9aT1pKzYzJi02NDtpPWkrNDh8MDtuPWsrMTZ8MDttPWs7az1rKzMyfDA7bz1hKzI4fDA7Zz1jW28+PjJdfDA7Y1trPj4yXT1nO3A9YSsyMHwwO2c9KGNbcD4+Ml18MCktZ3wwO2Nbays0Pj4yXT1nO2Nbays4Pj4yXT1iO2NbaysxMj4+Ml09ZDtqPWErNjB8MDtsPWErNDR8MDtmPTI7Zz1nK2R8MDt3aGlsZSgxKXtpZighKGNbNzk3OV18MCkpe2Nbbj4+Ml09Y1tqPj4yXTtjW24rND4+Ml09aztjW24rOD4+Ml09ZjtiPUFhKDE0NixufDApfDA7aWYoYj4+PjA+NDI5NDk2MzIwMCl7aWYoIShjWzc5NzldfDApKWU9MzE5NjQ7ZWxzZSBlPWNbKG9hKCl8MCkrNjA+PjJdfDA7Y1tlPj4yXT0wLWI7Yj0tMX19ZWxzZXt1YSgxOCxhfDApO2NbbT4+Ml09Y1tqPj4yXTtjW20rND4+Ml09aztjW20rOD4+Ml09ZjtiPUFhKDE0NixtfDApfDA7aWYoYj4+PjA+NDI5NDk2MzIwMCl7aWYoIShjWzc5NzldfDApKWU9MzE5NjQ7ZWxzZSBlPWNbKG9hKCl8MCkrNjA+PjJdfDA7Y1tlPj4yXT0wLWI7Yj0tMX1sYSgwKX1pZigoZ3wwKT09KGJ8MCkpe2I9MTM7YnJlYWt9aWYoKGJ8MCk8MCl7Yj0xNTticmVha31nPWctYnwwO2U9Y1trKzQ+PjJdfDA7aWYoYj4+PjA8PWU+Pj4wKWlmKChmfDApPT0yKXtjW28+PjJdPShjW28+PjJdfDApK2I7aD1lO2U9aztmPTJ9ZWxzZXtoPWU7ZT1rfWVsc2V7aD1jW2w+PjJdfDA7Y1tvPj4yXT1oO2NbcD4+Ml09aDtoPWNbaysxMj4+Ml18MDtiPWItZXwwO2U9ays4fDA7Zj1mKy0xfDB9Y1tlPj4yXT0oY1tlPj4yXXwwKStiO2NbZSs0Pj4yXT1oLWI7az1lfWlmKChifDApPT0xMyl7bj1jW2w+PjJdfDA7Y1thKzE2Pj4yXT1uKyhjW2ErNDg+PjJdfDApO2E9bjtjW28+PjJdPWE7Y1twPj4yXT1hfWVsc2UgaWYoKGJ8MCk9PTE1KXtjW2ErMTY+PjJdPTA7Y1tvPj4yXT0wO2NbcD4+Ml09MDtjW2E+PjJdPWNbYT4+Ml18MzI7aWYoKGZ8MCk9PTIpZD0wO2Vsc2UgZD1kLShjW2srND4+Ml18MCl8MH1pPXE7cmV0dXJuIGR8MH1mdW5jdGlvbiBzZChiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wO2c9aTtoPWk9aSs2MyYtNjQ7aT1pKzgwfDA7Zj1oO2NbYiszNj4+Ml09MjA7aWYoKGNbYj4+Ml0mNjR8MCk9PTA/KGNbZj4+Ml09Y1tiKzYwPj4yXSxjW2YrND4+Ml09MjE1MDUsY1tmKzg+PjJdPWgrMTIsKHdhKDU0LGZ8MCl8MCkhPTApOjApYVtiKzc1Pj4wXT0tMTtoPXJkKGIsZCxlKXwwO2k9ZztyZXR1cm4gaHwwfWZ1bmN0aW9uIHRkKGEpe2E9YXwwO3ZhciBiPTA7aWYoIWEpe2lmKCEoY1s3OTkwXXwwKSlhPTA7ZWxzZSBhPXRkKGNbNzk5MF18MCl8MDttYSgzMTk0NCk7Yj1jWzc5ODVdfDA7aWYoYilkb3tpZigoY1tiKzIwPj4yXXwwKT4+PjA+KGNbYisyOD4+Ml18MCk+Pj4wKWE9eGQoYil8MHxhO2I9Y1tiKzU2Pj4yXXwwfXdoaWxlKChifDApIT0wKTt4YSgzMTk0NCl9ZWxzZSBhPXhkKGEpfDA7cmV0dXJuIGF8MH1mdW5jdGlvbiB1ZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MDtmPWQmMjU1O2E6ZG8gaWYoIWYpYj1iKyh2ZChiKXwwKXwwO2Vsc2V7aWYoYiYzKXtlPWQmMjU1O2Rve2c9YVtiPj4wXXwwO2lmKGc8PDI0Pj4yND09MD8xOmc8PDI0Pj4yND09ZTw8MjQ+PjI0KWJyZWFrIGE7Yj1iKzF8MH13aGlsZSgoYiYzfDApIT0wKX1mPV8oZiwxNjg0MzAwOSl8MDtlPWNbYj4+Ml18MDtiOmRvIGlmKCEoKGUmLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJmUrLTE2ODQzMDA5KSlkb3tnPWVeZjtpZigoZyYtMjEzOTA2MjE0NF4tMjEzOTA2MjE0NCkmZystMTY4NDMwMDkpYnJlYWsgYjtiPWIrNHwwO2U9Y1tiPj4yXXwwfXdoaWxlKCgoZSYtMjEzOTA2MjE0NF4tMjEzOTA2MjE0NCkmZSstMTY4NDMwMDl8MCk9PTApO3doaWxlKDApO2U9ZCYyNTU7d2hpbGUoMSl7Zz1hW2I+PjBdfDA7aWYoZzw8MjQ+PjI0PT0wPzE6Zzw8MjQ+PjI0PT1lPDwyND4+MjQpYnJlYWs7ZWxzZSBiPWIrMXwwfX13aGlsZSgwKTtyZXR1cm4gYnwwfWZ1bmN0aW9uIHZkKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MDtmPWI7YTpkbyBpZighKGYmMykpZT00O2Vsc2V7ZD1iO2I9Zjt3aGlsZSgxKXtpZighKGFbZD4+MF18MCkpYnJlYWsgYTtkPWQrMXwwO2I9ZDtpZighKGImMykpe2I9ZDtlPTQ7YnJlYWt9fX13aGlsZSgwKTtpZigoZXwwKT09NCl7d2hpbGUoMSl7ZD1jW2I+PjJdfDA7aWYoISgoZCYtMjEzOTA2MjE0NF4tMjEzOTA2MjE0NCkmZCstMTY4NDMwMDkpKWI9Yis0fDA7ZWxzZSBicmVha31pZigoZCYyNTUpPDwyND4+MjQpZG8gYj1iKzF8MDt3aGlsZSgoYVtiPj4wXXwwKSE9MCl9cmV0dXJuIGItZnwwfWZ1bmN0aW9uIHdkKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiB4ZChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1hKzIwfDA7Zz1hKzI4fDA7aWYoKGNbYj4+Ml18MCk+Pj4wPihjW2c+PjJdfDApPj4+MD8oRmFbY1thKzM2Pj4yXSYzMV0oYSwwLDApfDAsKGNbYj4+Ml18MCk9PTApOjApYj0tMTtlbHNle2g9YSs0fDA7ZD1jW2g+PjJdfDA7ZT1hKzh8MDtmPWNbZT4+Ml18MDtpZihkPj4+MDxmPj4+MClGYVtjW2ErNDA+PjJdJjMxXShhLGQtZnwwLDEpfDA7Y1thKzE2Pj4yXT0wO2NbZz4+Ml09MDtjW2I+PjJdPTA7Y1tlPj4yXT0wO2NbaD4+Ml09MDtiPTB9cmV0dXJuIGJ8MH1cbmZ1bmN0aW9uIEhiKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wO2g9aTtnPWk9aSs2MyYtNjQ7aT1pKzY0MHwwO2U9MDtkb3tqPWIrKGU8PDMpfDA7bz1kW2orNz4+MF18MDtwPUhkKGRbais2Pj4wXXwwfDAsMCw4KXwwO2Y9QztuPUhkKGRbais1Pj4wXXwwfDAsMCwxNil8MDtmPWZ8QzttPUhkKGRbais0Pj4wXXwwfDAsMCwyNCl8MDtmPWZ8Q3woZFtqKzM+PjBdfDApO2w9SGQoZFtqKzI+PjBdfDB8MCwwLDQwKXwwO2Y9ZnxDO2s9SGQoZFtqKzE+PjBdfDB8MCwwLDQ4KXwwO2s9RGQocHxvfG58bXxsfDAsZnwwLGt8MCxDfDApfDA7Zj1DO2o9SGQoZFtqPj4wXXwwfDAsMCw1Nil8MDtqPURkKGt8MCxmfDAsanwwLEN8MCl8MDtmPWcrKGU8PDMpfDA7Y1tmPj4yXT1qO2NbZis0Pj4yXT1DO2U9ZSsxfDB9d2hpbGUoKGV8MCkhPTE2KTtlPWc7Yj1jW2U+PjJdfDA7ZT1jW2UrND4+Ml18MDtmPTE2O2Rve3M9ZysoZistMjw8Myl8MDt3PWNbcz4+Ml18MDtzPWNbcys0Pj4yXXwwO3I9R2Qod3wwLHN8MCwxOSl8MDtqPUM7cT1IZCh3fDAsc3wwLDQ1KXwwO2o9anxDO3U9R2Qod3wwLHN8MCw2MSl8MDt2PUM7dD1IZCh3fDAsc3wwLDMpfDA7dj12fEM7cz1HZCh3fDAsc3wwLDYpfDA7aj12XkNeajt2PWcrKGYrLTc8PDMpfDA7dz1jW3Y+PjJdfDA7dj1jW3YrND4+Ml18MDtuPWcrKGYrLTE1PDwzKXwwO3k9YjtiPWNbbj4+Ml18MDt4PWU7ZT1jW24rND4+Ml18MDtuPUdkKGJ8MCxlfDAsMSl8MDtvPUM7cD1IZChifDAsZXwwLDYzKXwwO289b3xDO2s9R2QoYnwwLGV8MCw4KXwwO3o9QztsPUhkKGJ8MCxlfDAsNTYpfDA7ej16fEM7bT1HZChifDAsZXwwLDcpfDA7bz16XkNebzt2PURkKHl8MCx4fDAsd3wwLHZ8MCl8MDtqPURkKHZ8MCxDfDAsKHV8dClec14ocnxxKXwwLGp8MCl8MDtvPURkKGp8MCxDfDAsKGt8bClebV4obnxwKXwwLG98MCl8MDtwPWcrKGY8PDMpfDA7Y1twPj4yXT1vO2NbcCs0Pj4yXT1DO2Y9ZisxfDB9d2hpbGUoKGZ8MCkhPTgwKTtLPWE7ST1jW0s+PjJdfDA7Sz1jW0srND4+Ml18MDtlPWErOHwwO0E9ZTtCPWNbQT4+Ml18MDtBPWNbQSs0Pj4yXXwwO2s9YSsxNnwwO2Y9aztiPWNbZj4+Ml18MDtmPWNbZis0Pj4yXXwwO249YSsyNHwwO2w9bjtqPWNbbD4+Ml18MDtsPWNbbCs0Pj4yXXwwO3E9YSszMnwwO209cTtwPWNbbT4+Ml18MDttPWNbbSs0Pj4yXXwwO3Q9YSs0MHwwO289dDtzPWNbbz4+Ml18MDtvPWNbbys0Pj4yXXwwO3c9YSs0OHwwO3I9dzt2PWNbcj4+Ml18MDtyPWNbcis0Pj4yXXwwO3o9YSs1NnwwO3U9ejt5PWNbdT4+Ml18MDt1PWNbdSs0Pj4yXXwwO0g9R2QocHwwLG18MCwxNCl8MDtEPUM7eD1IZChwfDAsbXwwLDUwKXwwO0Q9RHxDO009R2QocHwwLG18MCwxOCl8MDtFPUM7TD1IZChwfDAsbXwwLDQ2KXwwO0U9RF4oRXxDKTtEPUdkKHB8MCxtfDAsNDEpfDA7Rz1DO0o9SGQocHwwLG18MCwyMyl8MDtHPUVeKEd8Qyk7RT1nO0Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7dT1EZCh5fDAsdXwwLC02ODUxOTk4MzgsMTExNjM1MjQwOCl8MDtFPURkKHV8MCxDfDAsRnwwLEV8MCl8MDtHPURkKEV8MCxDfDAsKEh8eCleKE18TCleKER8Sil8MCxHfDApfDA7Rz1EZChHfDAsQ3wwLCh2XnMpJnBednwwLChyXm8pJm1ecnwwKXwwO0o9QztEPUdkKEl8MCxLfDAsMjgpfDA7TD1DO009SGQoSXwwLEt8MCwzNil8MDtMPUx8Qzt4PUdkKEl8MCxLfDAsMzQpfDA7SD1DO0U9SGQoSXwwLEt8MCwzMCl8MDtIPUxeKEh8Qyk7TD1HZChJfDAsS3wwLDM5KXwwO0Y9Qzt1PUhkKEl8MCxLfDAsMjUpfDA7Rj1EZCgoYnxCKSZJfGImQnwwLChmfEEpJkt8ZiZBfDAsKER8TSleKHh8RSleKEx8dSl8MCxIXihGfEMpfDApfDA7SD1DO2w9RGQoanwwLGx8MCxHfDAsSnwwKXwwO2o9QztKPURkKEZ8MCxIfDAsR3wwLEp8MCl8MDtHPUM7SD1HZChsfDAsanwwLDE0KXwwO0Y9Qzt1PUhkKGx8MCxqfDAsNTApfDA7Rj1GfEM7TD1HZChsfDAsanwwLDE4KXwwO0U9Qzt4PUhkKGx8MCxqfDAsNDYpfDA7RT1GXihFfEMpO0Y9R2QobHwwLGp8MCw0MSl8MDtNPUM7RD1IZChsfDAsanwwLDIzKXwwO009RV4oTXxDKTtFPWcrOHwwO3k9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7cj1EZCh2fDAscnwwLDYwMjg5MTcyNSwxODk5NDQ3NDQxKXwwO0U9RGQocnwwLEN8MCx5fDAsRXwwKXwwO009RGQoRXwwLEN8MCwoSHx1KV4oTHx4KV4oRnxEKXwwLE18MCl8MDtNPURkKE18MCxDfDAsKHNecCkmbF5zfDAsKG9ebSkmal5vfDApfDA7RD1DO0Y9R2QoSnwwLEd8MCwyOCl8MDt4PUM7TD1IZChKfDAsR3wwLDM2KXwwO3g9eHxDO3U9R2QoSnwwLEd8MCwzNCl8MDtIPUM7RT1IZChKfDAsR3wwLDMwKXwwO0g9eF4oSHxDKTt4PUdkKEp8MCxHfDAsMzkpfDA7eT1DO3I9SGQoSnwwLEd8MCwyNSl8MDt5PURkKChCfEkpJkp8QiZJfDAsKEF8SykmR3xBJkt8MCwoRnxMKV4odXxFKV4oeHxyKXwwLEheKHl8Qyl8MCl8MDtIPUM7Zj1EZChifDAsZnwwLE18MCxEfDApfDA7Yj1DO0Q9RGQoeXwwLEh8MCxNfDAsRHwwKXwwO009QztIPUdkKGZ8MCxifDAsMTQpfDA7eT1DO3I9SGQoZnwwLGJ8MCw1MCl8MDt5PXl8Qzt4PUdkKGZ8MCxifDAsMTgpfDA7RT1DO3U9SGQoZnwwLGJ8MCw0Nil8MDtFPXleKEV8Qyk7eT1HZChmfDAsYnwwLDQxKXwwO0w9QztGPUhkKGZ8MCxifDAsMjMpfDA7TD1FXihMfEMpO0U9ZysxNnwwO3Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7bz1EZChzfDAsb3wwLC0zMzA0ODI4OTcsLTEyNDU2NDM4MjUpfDA7RT1EZChvfDAsQ3wwLHZ8MCxFfDApfDA7TD1EZChFfDAsQ3wwLChIfHIpXih4fHUpXih5fEYpfDAsTHwwKXwwO0w9RGQoTHwwLEN8MCwocF5sKSZmXnB8MCwobV5qKSZiXm18MCl8MDtGPUM7eT1HZChEfDAsTXwwLDI4KXwwO3U9Qzt4PUhkKER8MCxNfDAsMzYpfDA7dT11fEM7cj1HZChEfDAsTXwwLDM0KXwwO0g9QztFPUhkKER8MCxNfDAsMzApfDA7SD11XihIfEMpO3U9R2QoRHwwLE18MCwzOSl8MDt2PUM7bz1IZChEfDAsTXwwLDI1KXwwO3Y9RGQoKEl8SikmRHxJJkp8MCwoS3xHKSZNfEsmR3wwLCh5fHgpXihyfEUpXih1fG8pfDAsSF4odnxDKXwwKXwwO0g9QztBPURkKEJ8MCxBfDAsTHwwLEZ8MCl8MDtCPUM7Rj1EZCh2fDAsSHwwLEx8MCxGfDApfDA7TD1DO0g9R2QoQXwwLEJ8MCwxNCl8MDt2PUM7bz1IZChBfDAsQnwwLDUwKXwwO3Y9dnxDO3U9R2QoQXwwLEJ8MCwxOCl8MDtFPUM7cj1IZChBfDAsQnwwLDQ2KXwwO0U9dl4oRXxDKTt2PUdkKEF8MCxCfDAsNDEpfDA7eD1DO3k9SGQoQXwwLEJ8MCwyMyl8MDt4PUVeKHh8Qyk7RT1nKzI0fDA7cz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDttPURkKHB8MCxtfDAsLTIxMjE2NzE3NDgsLTM3Mzk1NzcyMyl8MDtFPURkKG18MCxDfDAsc3wwLEV8MCl8MDt4PURkKEV8MCxDfDAsKEh8byleKHV8cileKHZ8eSl8MCx4fDApfDA7eD1EZCh4fDAsQ3wwLChsXmYpJkFebHwwLChqXmIpJkJeanwwKXwwO3k9Qzt2PUdkKEZ8MCxMfDAsMjgpfDA7cj1DO3U9SGQoRnwwLEx8MCwzNil8MDtyPXJ8QztvPUdkKEZ8MCxMfDAsMzQpfDA7SD1DO0U9SGQoRnwwLEx8MCwzMCl8MDtIPXJeKEh8Qyk7cj1HZChGfDAsTHwwLDM5KXwwO3M9QzttPUhkKEZ8MCxMfDAsMjUpfDA7cz1EZCgoSnxEKSZGfEomRHwwLChHfE0pJkx8RyZNfDAsKHZ8dSleKG98RSleKHJ8bSl8MCxIXihzfEMpfDApfDA7SD1DO0s9RGQoSXwwLEt8MCx4fDAseXwwKXwwO0k9Qzt5PURkKHN8MCxIfDAseHwwLHl8MCl8MDt4PUM7SD1HZChLfDAsSXwwLDE0KXwwO3M9QzttPUhkKEt8MCxJfDAsNTApfDA7cz1zfEM7cj1HZChLfDAsSXwwLDE4KXwwO0U9QztvPUhkKEt8MCxJfDAsNDYpfDA7RT1zXihFfEMpO3M9R2QoS3wwLEl8MCw0MSl8MDt1PUM7dj1IZChLfDAsSXwwLDIzKXwwO3U9RV4odXxDKTtFPWcrMzJ8MDtwPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO2o9RGQobHwwLGp8MCwtMjEzMzM4ODI0LDk2MTk4NzE2Myl8MDtFPURkKGp8MCxDfDAscHwwLEV8MCl8MDt1PURkKEV8MCxDfDAsKEh8bSleKHJ8byleKHN8dil8MCx1fDApfDA7dT1EZCh1fDAsQ3wwLChmXkEpJkteZnwwLChiXkIpJkleYnwwKXwwO3Y9QztzPUdkKHl8MCx4fDAsMjgpfDA7bz1DO3I9SGQoeXwwLHh8MCwzNil8MDtvPW98QzttPUdkKHl8MCx4fDAsMzQpfDA7SD1DO0U9SGQoeXwwLHh8MCwzMCl8MDtIPW9eKEh8Qyk7bz1HZCh5fDAseHwwLDM5KXwwO3A9QztqPUhkKHl8MCx4fDAsMjUpfDA7cD1EZCgoRHxGKSZ5fEQmRnwwLChNfEwpJnh8TSZMfDAsKHN8cileKG18RSleKG98ail8MCxIXihwfEMpfDApfDA7SD1DO0c9RGQoSnwwLEd8MCx1fDAsdnwwKXwwO0o9Qzt2PURkKHB8MCxIfDAsdXwwLHZ8MCl8MDt1PUM7SD1HZChHfDAsSnwwLDE0KXwwO3A9QztqPUhkKEd8MCxKfDAsNTApfDA7cD1wfEM7bz1HZChHfDAsSnwwLDE4KXwwO0U9QzttPUhkKEd8MCxKfDAsNDYpfDA7RT1wXihFfEMpO3A9R2QoR3wwLEp8MCw0MSl8MDtyPUM7cz1IZChHfDAsSnwwLDIzKXwwO3I9RV4ocnxDKTtFPWcrNDB8MDtsPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO2I9RGQoZnwwLGJ8MCwtMTI0MTEzMzAzMSwxNTA4OTcwOTkzKXwwO0U9RGQoYnwwLEN8MCxsfDAsRXwwKXwwO3I9RGQoRXwwLEN8MCwoSHxqKV4ob3xtKV4ocHxzKXwwLHJ8MCl8MDtyPURkKHJ8MCxDfDAsKEFeSykmR15BfDAsKEJeSSkmSl5CfDApfDA7cz1DO3A9R2QodnwwLHV8MCwyOCl8MDttPUM7bz1IZCh2fDAsdXwwLDM2KXwwO209bXxDO2o9R2QodnwwLHV8MCwzNCl8MDtIPUM7RT1IZCh2fDAsdXwwLDMwKXwwO0g9bV4oSHxDKTttPUdkKHZ8MCx1fDAsMzkpfDA7bD1DO2I9SGQodnwwLHV8MCwyNSl8MDtsPURkKChGfHkpJnZ8RiZ5fDAsKEx8eCkmdXxMJnh8MCwocHxvKV4oanxFKV4obXxiKXwwLEheKGx8Qyl8MCl8MDtIPUM7TT1EZChEfDAsTXwwLHJ8MCxzfDApfDA7RD1DO3M9RGQobHwwLEh8MCxyfDAsc3wwKXwwO3I9QztIPUdkKE18MCxEfDAsMTQpfDA7bD1DO2I9SGQoTXwwLER8MCw1MCl8MDtsPWx8QzttPUdkKE18MCxEfDAsMTgpfDA7RT1DO2o9SGQoTXwwLER8MCw0Nil8MDtFPWxeKEV8Qyk7bD1HZChNfDAsRHwwLDQxKXwwO289QztwPUhkKE18MCxEfDAsMjMpfDA7bz1FXihvfEMpO0U9Zys0OHwwO2Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Qj1EZChBfDAsQnwwLC0xMzU3Mjk1NzE3LC0xODQxMzMxNTQ4KXwwO0U9RGQoQnwwLEN8MCxmfDAsRXwwKXwwO289RGQoRXwwLEN8MCwoSHxiKV4obXxqKV4obHxwKXwwLG98MCl8MDtvPURkKG98MCxDfDAsKEteRykmTV5LfDAsKEleSikmRF5JfDApfDA7cD1DO2w9R2Qoc3wwLHJ8MCwyOCl8MDtqPUM7bT1IZChzfDAscnwwLDM2KXwwO2o9anxDO2I9R2Qoc3wwLHJ8MCwzNCl8MDtIPUM7RT1IZChzfDAscnwwLDMwKXwwO0g9al4oSHxDKTtqPUdkKHN8MCxyfDAsMzkpfDA7Zj1DO0I9SGQoc3wwLHJ8MCwyNSl8MDtmPURkKCh5fHYpJnN8eSZ2fDAsKHh8dSkmcnx4JnV8MCwobHxtKV4oYnxFKV4oanxCKXwwLEheKGZ8Qyl8MCl8MDtIPUM7TD1EZChGfDAsTHwwLG98MCxwfDApfDA7Rj1DO3A9RGQoZnwwLEh8MCxvfDAscHwwKXwwO289QztIPUdkKEx8MCxGfDAsMTQpfDA7Zj1DO0I9SGQoTHwwLEZ8MCw1MCl8MDtmPWZ8QztqPUdkKEx8MCxGfDAsMTgpfDA7RT1DO2I9SGQoTHwwLEZ8MCw0Nil8MDtFPWZeKEV8Qyk7Zj1HZChMfDAsRnwwLDQxKXwwO209QztsPUhkKEx8MCxGfDAsMjMpfDA7bT1FXihtfEMpO0U9Zys1NnwwO0E9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7ST1EZChLfDAsSXwwLC02MzAzNTc3MzYsLTE0MjQyMDQwNzUpfDA7RT1EZChJfDAsQ3wwLEF8MCxFfDApfDA7bT1EZChFfDAsQ3wwLChIfEIpXihqfGIpXihmfGwpfDAsbXwwKXwwO209RGQobXwwLEN8MCwoR15NKSZMXkd8MCwoSl5EKSZGXkp8MCl8MDtsPUM7Zj1HZChwfDAsb3wwLDI4KXwwO2I9QztqPUhkKHB8MCxvfDAsMzYpfDA7Yj1ifEM7Qj1HZChwfDAsb3wwLDM0KXwwO0g9QztFPUhkKHB8MCxvfDAsMzApfDA7SD1iXihIfEMpO2I9R2QocHwwLG98MCwzOSl8MDtBPUM7ST1IZChwfDAsb3wwLDI1KXwwO0E9RGQoKHZ8cykmcHx2JnN8MCwodXxyKSZvfHUmcnwwLChmfGopXihCfEUpXihifEkpfDAsSF4oQXxDKXwwKXwwO0g9Qzt4PURkKHl8MCx4fDAsbXwwLGx8MCl8MDt5PUM7bD1EZChBfDAsSHwwLG18MCxsfDApfDA7bT1DO0g9R2QoeHwwLHl8MCwxNCl8MDtBPUM7ST1IZCh4fDAseXwwLDUwKXwwO0E9QXxDO2I9R2QoeHwwLHl8MCwxOCl8MDtFPUM7Qj1IZCh4fDAseXwwLDQ2KXwwO0U9QV4oRXxDKTtBPUdkKHh8MCx5fDAsNDEpfDA7aj1DO2Y9SGQoeHwwLHl8MCwyMyl8MDtqPUVeKGp8Qyk7RT1nKzY0fDA7Sz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtKPURkKEd8MCxKfDAsLTE1NjAwODM5MDIsLTY3MDU4NjIxNil8MDtFPURkKEp8MCxDfDAsS3wwLEV8MCl8MDtqPURkKEV8MCxDfDAsKEh8SSleKGJ8QileKEF8Zil8MCxqfDApfDA7aj1EZChqfDAsQ3wwLChNXkwpJnheTXwwLChEXkYpJnleRHwwKXwwO2Y9QztBPUdkKGx8MCxtfDAsMjgpfDA7Qj1DO2I9SGQobHwwLG18MCwzNil8MDtCPUJ8QztJPUdkKGx8MCxtfDAsMzQpfDA7SD1DO0U9SGQobHwwLG18MCwzMCl8MDtIPUJeKEh8Qyk7Qj1HZChsfDAsbXwwLDM5KXwwO0s9QztKPUhkKGx8MCxtfDAsMjUpfDA7Sz1EZCgoc3xwKSZsfHMmcHwwLChyfG8pJm18ciZvfDAsKEF8YileKEl8RSleKEJ8Sil8MCxIXihLfEMpfDApfDA7SD1DO3U9RGQodnwwLHV8MCxqfDAsZnwwKXwwO3Y9QztmPURkKEt8MCxIfDAsanwwLGZ8MCl8MDtqPUM7SD1HZCh1fDAsdnwwLDE0KXwwO0s9QztKPUhkKHV8MCx2fDAsNTApfDA7Sz1LfEM7Qj1HZCh1fDAsdnwwLDE4KXwwO0U9QztJPUhkKHV8MCx2fDAsNDYpfDA7RT1LXihFfEMpO0s9R2QodXwwLHZ8MCw0MSl8MDtiPUM7QT1IZCh1fDAsdnwwLDIzKXwwO2I9RV4oYnxDKTtFPWcrNzJ8MDtHPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0Q9RGQoTXwwLER8MCwxMTY0OTk2NTQyLDMxMDU5ODQwMSl8MDtFPURkKER8MCxDfDAsR3wwLEV8MCl8MDtiPURkKEV8MCxDfDAsKEh8SileKEJ8SSleKEt8QSl8MCxifDApfDA7Yj1EZChifDAsQ3wwLChMXngpJnVeTHwwLChGXnkpJnZeRnwwKXwwO0E9QztLPUdkKGZ8MCxqfDAsMjgpfDA7ST1DO0I9SGQoZnwwLGp8MCwzNil8MDtJPUl8QztKPUdkKGZ8MCxqfDAsMzQpfDA7SD1DO0U9SGQoZnwwLGp8MCwzMCl8MDtIPUleKEh8Qyk7ST1HZChmfDAsanwwLDM5KXwwO0c9QztEPUhkKGZ8MCxqfDAsMjUpfDA7Rz1EZCgocHxsKSZmfHAmbHwwLChvfG0pJmp8byZtfDAsKEt8QileKEp8RSleKEl8RCl8MCxIXihHfEMpfDApfDA7SD1DO3I9RGQoc3wwLHJ8MCxifDAsQXwwKXwwO3M9QztBPURkKEd8MCxIfDAsYnwwLEF8MCl8MDtiPUM7SD1HZChyfDAsc3wwLDE0KXwwO0c9QztEPUhkKHJ8MCxzfDAsNTApfDA7Rz1HfEM7ST1HZChyfDAsc3wwLDE4KXwwO0U9QztKPUhkKHJ8MCxzfDAsNDYpfDA7RT1HXihFfEMpO0c9R2QocnwwLHN8MCw0MSl8MDtCPUM7Sz1IZChyfDAsc3wwLDIzKXwwO0I9RV4oQnxDKTtFPWcrODB8MDtNPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0Y9RGQoTHwwLEZ8MCwxMzIzNjEwNzY0LDYwNzIyNTI3OCl8MDtFPURkKEZ8MCxDfDAsTXwwLEV8MCl8MDtCPURkKEV8MCxDfDAsKEh8RCleKEl8SileKEd8Syl8MCxCfDApfDA7Qj1EZChCfDAsQ3wwLCh4XnUpJnJeeHwwLCh5XnYpJnNeeXwwKXwwO0s9QztHPUdkKEF8MCxifDAsMjgpfDA7Sj1DO0k9SGQoQXwwLGJ8MCwzNil8MDtKPUp8QztEPUdkKEF8MCxifDAsMzQpfDA7SD1DO0U9SGQoQXwwLGJ8MCwzMCl8MDtIPUpeKEh8Qyk7Sj1HZChBfDAsYnwwLDM5KXwwO009QztGPUhkKEF8MCxifDAsMjUpfDA7TT1EZCgobHxmKSZBfGwmZnwwLChtfGopJmJ8bSZqfDAsKEd8SSleKER8RSleKEp8Ril8MCxIXihNfEMpfDApfDA7SD1DO289RGQocHwwLG98MCxCfDAsS3wwKXwwO3A9QztLPURkKE18MCxIfDAsQnwwLEt8MCl8MDtCPUM7SD1HZChvfDAscHwwLDE0KXwwO009QztGPUhkKG98MCxwfDAsNTApfDA7TT1NfEM7Sj1HZChvfDAscHwwLDE4KXwwO0U9QztEPUhkKG98MCxwfDAsNDYpfDA7RT1NXihFfEMpO009R2Qob3wwLHB8MCw0MSl8MDtJPUM7Rz1IZChvfDAscHwwLDIzKXwwO0k9RV4oSXxDKTtFPWcrODh8MDtMPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3k9RGQoeHwwLHl8MCwtNzA0NjYyMzAyLDE0MjY4ODE5ODcpfDA7RT1EZCh5fDAsQ3wwLEx8MCxFfDApfDA7ST1EZChFfDAsQ3wwLChIfEYpXihKfEQpXihNfEcpfDAsSXwwKXwwO0k9RGQoSXwwLEN8MCwodV5yKSZvXnV8MCwodl5zKSZwXnZ8MCl8MDtHPUM7TT1HZChLfDAsQnwwLDI4KXwwO0Q9QztKPUhkKEt8MCxCfDAsMzYpfDA7RD1EfEM7Rj1HZChLfDAsQnwwLDM0KXwwO0g9QztFPUhkKEt8MCxCfDAsMzApfDA7SD1EXihIfEMpO0Q9R2QoS3wwLEJ8MCwzOSl8MDtMPUM7eT1IZChLfDAsQnwwLDI1KXwwO0w9RGQoKGZ8QSkmS3xmJkF8MCwoanxiKSZCfGomYnwwLChNfEopXihGfEUpXihEfHkpfDAsSF4oTHxDKXwwKXwwO0g9QzttPURkKGx8MCxtfDAsSXwwLEd8MCl8MDtsPUM7Rz1EZChMfDAsSHwwLEl8MCxHfDApfDA7ST1DO0g9R2QobXwwLGx8MCwxNCl8MDtMPUM7eT1IZChtfDAsbHwwLDUwKXwwO0w9THxDO0Q9R2QobXwwLGx8MCwxOCl8MDtFPUM7Rj1IZChtfDAsbHwwLDQ2KXwwO0U9TF4oRXxDKTtMPUdkKG18MCxsfDAsNDEpfDA7Sj1DO009SGQobXwwLGx8MCwyMyl8MDtKPUVeKEp8Qyk7RT1nKzk2fDA7eD1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDt2PURkKHV8MCx2fDAsLTIyNjc4NDkxMywxOTI1MDc4Mzg4KXwwO0U9RGQodnwwLEN8MCx4fDAsRXwwKXwwO0o9RGQoRXwwLEN8MCwoSHx5KV4oRHxGKV4oTHxNKXwwLEp8MCl8MDtKPURkKEp8MCxDfDAsKHJebykmbV5yfDAsKHNecCkmbF5zfDApfDA7TT1DO0w9R2QoR3wwLEl8MCwyOCl8MDtGPUM7RD1IZChHfDAsSXwwLDM2KXwwO0Y9RnxDO3k9R2QoR3wwLEl8MCwzNCl8MDtIPUM7RT1IZChHfDAsSXwwLDMwKXwwO0g9Rl4oSHxDKTtGPUdkKEd8MCxJfDAsMzkpfDA7eD1DO3Y9SGQoR3wwLEl8MCwyNSl8MDt4PURkKChBfEspJkd8QSZLfDAsKGJ8QikmSXxiJkJ8MCwoTHxEKV4oeXxFKV4oRnx2KXwwLEheKHh8Qyl8MCl8MDtIPUM7aj1EZChmfDAsanwwLEp8MCxNfDApfDA7Zj1DO009RGQoeHwwLEh8MCxKfDAsTXwwKXwwO0o9QztIPUdkKGp8MCxmfDAsMTQpfDA7eD1DO3Y9SGQoanwwLGZ8MCw1MCl8MDt4PXh8QztGPUdkKGp8MCxmfDAsMTgpfDA7RT1DO3k9SGQoanwwLGZ8MCw0Nil8MDtFPXheKEV8Qyk7eD1HZChqfDAsZnwwLDQxKXwwO0Q9QztMPUhkKGp8MCxmfDAsMjMpfDA7RD1FXihEfEMpO0U9ZysxMDR8MDt1PWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3M9RGQocnwwLHN8MCw5OTEzMzYxMTMsLTIxMzI4ODkwOTApfDA7RT1EZChzfDAsQ3wwLHV8MCxFfDApfDA7RD1EZChFfDAsQ3wwLChIfHYpXihGfHkpXih4fEwpfDAsRHwwKXwwO0Q9RGQoRHwwLEN8MCwob15tKSZqXm98MCwocF5sKSZmXnB8MCl8MDtMPUM7eD1HZChNfDAsSnwwLDI4KXwwO3k9QztGPUhkKE18MCxKfDAsMzYpfDA7eT15fEM7dj1HZChNfDAsSnwwLDM0KXwwO0g9QztFPUhkKE18MCxKfDAsMzApfDA7SD15XihIfEMpO3k9R2QoTXwwLEp8MCwzOSl8MDt1PUM7cz1IZChNfDAsSnwwLDI1KXwwO3U9RGQoKEt8RykmTXxLJkd8MCwoQnxJKSZKfEImSXwwLCh4fEYpXih2fEUpXih5fHMpfDAsSF4odXxDKXwwKXwwO0g9QztiPURkKEF8MCxifDAsRHwwLEx8MCl8MDtBPUM7TD1EZCh1fDAsSHwwLER8MCxMfDApfDA7RD1DO0g9R2QoYnwwLEF8MCwxNCl8MDt1PUM7cz1IZChifDAsQXwwLDUwKXwwO3U9dXxDO3k9R2QoYnwwLEF8MCwxOCl8MDtFPUM7dj1IZChifDAsQXwwLDQ2KXwwO0U9dV4oRXxDKTt1PUdkKGJ8MCxBfDAsNDEpfDA7Rj1DO3g9SGQoYnwwLEF8MCwyMyl8MDtGPUVeKEZ8Qyk7RT1nKzExMnwwO3I9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7cD1EZChvfDAscHwwLDYzMzgwMzMxNywtMTY4MDA3OTE5Myl8MDtFPURkKHB8MCxDfDAscnwwLEV8MCl8MDtGPURkKEV8MCxDfDAsKEh8cyleKHl8dileKHV8eCl8MCxGfDApfDA7Rj1EZChGfDAsQ3wwLChtXmopJmJebXwwLChsXmYpJkFebHwwKXwwO3g9Qzt1PUdkKEx8MCxEfDAsMjgpfDA7dj1DO3k9SGQoTHwwLER8MCwzNil8MDt2PXZ8QztzPUdkKEx8MCxEfDAsMzQpfDA7SD1DO0U9SGQoTHwwLER8MCwzMCl8MDtIPXZeKEh8Qyk7dj1HZChMfDAsRHwwLDM5KXwwO3I9QztwPUhkKEx8MCxEfDAsMjUpfDA7cj1EZCgoR3xNKSZMfEcmTXwwLChJfEopJkR8SSZKfDAsKHV8eSleKHN8RSleKHZ8cCl8MCxIXihyfEMpfDApfDA7SD1DO0I9RGQoS3wwLEJ8MCxGfDAseHwwKXwwO0s9Qzt4PURkKHJ8MCxIfDAsRnwwLHh8MCl8MDtGPUM7SD1HZChCfDAsS3wwLDE0KXwwO3I9QztwPUhkKEJ8MCxLfDAsNTApfDA7cj1yfEM7dj1HZChCfDAsS3wwLDE4KXwwO0U9QztzPUhkKEJ8MCxLfDAsNDYpfDA7RT1yXihFfEMpO3I9R2QoQnwwLEt8MCw0MSl8MDt5PUM7dT1IZChCfDAsS3wwLDIzKXwwO3k9RV4oeXxDKTtFPWcrMTIwfDA7bz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtsPURkKG18MCxsfDAsLTgxNTE5MjQyOCwtMTA0Njc0NDcxNil8MDtFPURkKGx8MCxDfDAsb3wwLEV8MCl8MDt5PURkKEV8MCxDfDAsKEh8cCleKHZ8cyleKHJ8dSl8MCx5fDApfDA7eT1EZCh5fDAsQ3wwLChqXmIpJkJeanwwLChmXkEpJkteZnwwKXwwO3U9QztyPUdkKHh8MCxGfDAsMjgpfDA7cz1DO3Y9SGQoeHwwLEZ8MCwzNil8MDtzPXN8QztwPUdkKHh8MCxGfDAsMzQpfDA7SD1DO0U9SGQoeHwwLEZ8MCwzMCl8MDtIPXNeKEh8Qyk7cz1HZCh4fDAsRnwwLDM5KXwwO289QztsPUhkKHh8MCxGfDAsMjUpfDA7bz1EZCgoTXxMKSZ4fE0mTHwwLChKfEQpJkZ8SiZEfDAsKHJ8dileKHB8RSleKHN8bCl8MCxIXihvfEMpfDApfDA7SD1DO0k9RGQoR3wwLEl8MCx5fDAsdXwwKXwwO0c9Qzt1PURkKG98MCxIfDAseXwwLHV8MCl8MDt5PUM7SD1HZChJfDAsR3wwLDE0KXwwO289QztsPUhkKEl8MCxHfDAsNTApfDA7bz1vfEM7cz1HZChJfDAsR3wwLDE4KXwwO0U9QztwPUhkKEl8MCxHfDAsNDYpfDA7RT1vXihFfEMpO289R2QoSXwwLEd8MCw0MSl8MDt2PUM7cj1IZChJfDAsR3wwLDIzKXwwO3Y9RV4odnxDKTtFPWcrMTI4fDA7bT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtmPURkKGp8MCxmfDAsLTE2MjgzNTM4MzgsLTQ1OTU3Njg5NSl8MDtFPURkKGZ8MCxDfDAsbXwwLEV8MCl8MDt2PURkKEV8MCxDfDAsKEh8bCleKHN8cCleKG98cil8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLChiXkIpJkleYnwwLChBXkspJkdeQXwwKXwwO3I9QztvPUdkKHV8MCx5fDAsMjgpfDA7cD1DO3M9SGQodXwwLHl8MCwzNil8MDtwPXB8QztsPUdkKHV8MCx5fDAsMzQpfDA7SD1DO0U9SGQodXwwLHl8MCwzMCl8MDtIPXBeKEh8Qyk7cD1HZCh1fDAseXwwLDM5KXwwO209QztmPUhkKHV8MCx5fDAsMjUpfDA7bT1EZCgoTHx4KSZ1fEwmeHwwLChEfEYpJnl8RCZGfDAsKG98cyleKGx8RSleKHB8Zil8MCxIXihtfEMpfDApfDA7SD1DO0o9RGQoTXwwLEp8MCx2fDAscnwwKXwwO009QztyPURkKG18MCxIfDAsdnwwLHJ8MCl8MDt2PUM7SD1HZChKfDAsTXwwLDE0KXwwO209QztmPUhkKEp8MCxNfDAsNTApfDA7bT1tfEM7cD1HZChKfDAsTXwwLDE4KXwwO0U9QztsPUhkKEp8MCxNfDAsNDYpfDA7RT1tXihFfEMpO209R2QoSnwwLE18MCw0MSl8MDtzPUM7bz1IZChKfDAsTXwwLDIzKXwwO3M9RV4oc3xDKTtFPWcrMTM2fDA7aj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtBPURkKGJ8MCxBfDAsOTQ0NzExMTM5LC0yNzI3NDI1MjIpfDA7RT1EZChBfDAsQ3wwLGp8MCxFfDApfDA7cz1EZChFfDAsQ3wwLChIfGYpXihwfGwpXihtfG8pfDAsc3wwKXwwO3M9RGQoc3wwLEN8MCwoQl5JKSZKXkJ8MCwoS15HKSZNXkt8MCl8MDtvPUM7bT1HZChyfDAsdnwwLDI4KXwwO2w9QztwPUhkKHJ8MCx2fDAsMzYpfDA7bD1sfEM7Zj1HZChyfDAsdnwwLDM0KXwwO0g9QztFPUhkKHJ8MCx2fDAsMzApfDA7SD1sXihIfEMpO2w9R2QocnwwLHZ8MCwzOSl8MDtqPUM7QT1IZChyfDAsdnwwLDI1KXwwO2o9RGQoKHh8dSkmcnx4JnV8MCwoRnx5KSZ2fEYmeXwwLChtfHApXihmfEUpXihsfEEpfDAsSF4oanxDKXwwKXwwO0g9QztEPURkKEx8MCxEfDAsc3wwLG98MCl8MDtMPUM7bz1EZChqfDAsSHwwLHN8MCxvfDApfDA7cz1DO0g9R2QoRHwwLEx8MCwxNCl8MDtqPUM7QT1IZChEfDAsTHwwLDUwKXwwO2o9anxDO2w9R2QoRHwwLEx8MCwxOCl8MDtFPUM7Zj1IZChEfDAsTHwwLDQ2KXwwO0U9al4oRXxDKTtqPUdkKER8MCxMfDAsNDEpfDA7cD1DO209SGQoRHwwLEx8MCwyMyl8MDtwPUVeKHB8Qyk7RT1nKzE0NHwwO2I9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Sz1EZChCfDAsS3wwLC0xOTUzNzA0NTIzLDI2NDM0NzA3OCl8MDtFPURkKEt8MCxDfDAsYnwwLEV8MCl8MDtwPURkKEV8MCxDfDAsKEh8QSleKGx8ZileKGp8bSl8MCxwfDApfDA7cD1EZChwfDAsQ3wwLChJXkopJkReSXwwLChHXk0pJkxeR3wwKXwwO209QztqPUdkKG98MCxzfDAsMjgpfDA7Zj1DO2w9SGQob3wwLHN8MCwzNil8MDtmPWZ8QztBPUdkKG98MCxzfDAsMzQpfDA7SD1DO0U9SGQob3wwLHN8MCwzMCl8MDtIPWZeKEh8Qyk7Zj1HZChvfDAsc3wwLDM5KXwwO2I9QztLPUhkKG98MCxzfDAsMjUpfDA7Yj1EZCgodXxyKSZvfHUmcnwwLCh5fHYpJnN8eSZ2fDAsKGp8bCleKEF8RSleKGZ8Syl8MCxIXihifEMpfDApfDA7SD1DO0Y9RGQoeHwwLEZ8MCxwfDAsbXwwKXwwO3g9QzttPURkKGJ8MCxIfDAscHwwLG18MCl8MDtwPUM7SD1HZChGfDAseHwwLDE0KXwwO2I9QztLPUhkKEZ8MCx4fDAsNTApfDA7Yj1ifEM7Zj1HZChGfDAseHwwLDE4KXwwO0U9QztBPUhkKEZ8MCx4fDAsNDYpfDA7RT1iXihFfEMpO2I9R2QoRnwwLHh8MCw0MSl8MDtsPUM7aj1IZChGfDAseHwwLDIzKXwwO2w9RV4obHxDKTtFPWcrMTUyfDA7Qj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtHPURkKEl8MCxHfDAsMjAwNzgwMDkzMyw2MDQ4MDc2MjgpfDA7RT1EZChHfDAsQ3wwLEJ8MCxFfDApfDA7bD1EZChFfDAsQ3wwLChIfEspXihmfEEpXihifGopfDAsbHwwKXwwO2w9RGQobHwwLEN8MCwoSl5EKSZGXkp8MCwoTV5MKSZ4Xk18MCl8MDtqPUM7Yj1HZChtfDAscHwwLDI4KXwwO0E9QztmPUhkKG18MCxwfDAsMzYpfDA7QT1BfEM7Sz1HZChtfDAscHwwLDM0KXwwO0g9QztFPUhkKG18MCxwfDAsMzApfDA7SD1BXihIfEMpO0E9R2QobXwwLHB8MCwzOSl8MDtCPUM7Rz1IZChtfDAscHwwLDI1KXwwO0I9RGQoKHJ8bykmbXxyJm98MCwodnxzKSZwfHYmc3wwLChifGYpXihLfEUpXihBfEcpfDAsSF4oQnxDKXwwKXwwO0g9Qzt5PURkKHV8MCx5fDAsbHwwLGp8MCl8MDt1PUM7aj1EZChCfDAsSHwwLGx8MCxqfDApfDA7bD1DO0g9R2QoeXwwLHV8MCwxNCl8MDtCPUM7Rz1IZCh5fDAsdXwwLDUwKXwwO0I9QnxDO0E9R2QoeXwwLHV8MCwxOCl8MDtFPUM7Sz1IZCh5fDAsdXwwLDQ2KXwwO0U9Ql4oRXxDKTtCPUdkKHl8MCx1fDAsNDEpfDA7Zj1DO2I9SGQoeXwwLHV8MCwyMyl8MDtmPUVeKGZ8Qyk7RT1nKzE2MHwwO0k9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7TT1EZChKfDAsTXwwLDE0OTU5OTA5MDEsNzcwMjU1OTgzKXwwO0U9RGQoTXwwLEN8MCxJfDAsRXwwKXwwO2Y9RGQoRXwwLEN8MCwoSHxHKV4oQXxLKV4oQnxiKXwwLGZ8MCl8MDtmPURkKGZ8MCxDfDAsKEReRikmeV5EfDAsKExeeCkmdV5MfDApfDA7Yj1DO0I9R2QoanwwLGx8MCwyOCl8MDtLPUM7QT1IZChqfDAsbHwwLDM2KXwwO0s9S3xDO0c9R2QoanwwLGx8MCwzNCl8MDtIPUM7RT1IZChqfDAsbHwwLDMwKXwwO0g9S14oSHxDKTtLPUdkKGp8MCxsfDAsMzkpfDA7ST1DO009SGQoanwwLGx8MCwyNSl8MDtJPURkKChvfG0pJmp8byZtfDAsKHN8cCkmbHxzJnB8MCwoQnxBKV4oR3xFKV4oS3xNKXwwLEheKEl8Qyl8MCl8MDtIPUM7dj1EZChyfDAsdnwwLGZ8MCxifDApfDA7cj1DO2I9RGQoSXwwLEh8MCxmfDAsYnwwKXwwO2Y9QztIPUdkKHZ8MCxyfDAsMTQpfDA7ST1DO009SGQodnwwLHJ8MCw1MCl8MDtJPUl8QztLPUdkKHZ8MCxyfDAsMTgpfDA7RT1DO0c9SGQodnwwLHJ8MCw0Nil8MDtFPUleKEV8Qyk7ST1HZCh2fDAscnwwLDQxKXwwO0E9QztCPUhkKHZ8MCxyfDAsMjMpfDA7QT1FXihBfEMpO0U9ZysxNjh8MDtKPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0w9RGQoRHwwLEx8MCwxODU2NDMxMjM1LDEyNDkxNTAxMjIpfDA7RT1EZChMfDAsQ3wwLEp8MCxFfDApfDA7QT1EZChFfDAsQ3wwLChIfE0pXihLfEcpXihJfEIpfDAsQXwwKXwwO0E9RGQoQXwwLEN8MCwoRl55KSZ2XkZ8MCwoeF51KSZyXnh8MCl8MDtCPUM7ST1HZChifDAsZnwwLDI4KXwwO0c9QztLPUhkKGJ8MCxmfDAsMzYpfDA7Rz1HfEM7TT1HZChifDAsZnwwLDM0KXwwO0g9QztFPUhkKGJ8MCxmfDAsMzApfDA7SD1HXihIfEMpO0c9R2QoYnwwLGZ8MCwzOSl8MDtKPUM7TD1IZChifDAsZnwwLDI1KXwwO0o9RGQoKG18aikmYnxtJmp8MCwocHxsKSZmfHAmbHwwLChJfEspXihNfEUpXihHfEwpfDAsSF4oSnxDKXwwKXwwO0g9QztzPURkKG98MCxzfDAsQXwwLEJ8MCl8MDtvPUM7Qj1EZChKfDAsSHwwLEF8MCxCfDApfDA7QT1DO0g9R2Qoc3wwLG98MCwxNCl8MDtKPUM7TD1IZChzfDAsb3wwLDUwKXwwO0o9SnxDO0c9R2Qoc3wwLG98MCwxOCl8MDtFPUM7TT1IZChzfDAsb3wwLDQ2KXwwO0U9Sl4oRXxDKTtKPUdkKHN8MCxvfDAsNDEpfDA7Sz1DO0k9SGQoc3wwLG98MCwyMyl8MDtLPUVeKEt8Qyk7RT1nKzE3NnwwO0Q9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7eD1EZChGfDAseHwwLC0xMTE5NzQ5MTY0LDE1NTUwODE2OTIpfDA7RT1EZCh4fDAsQ3wwLER8MCxFfDApfDA7Sz1EZChFfDAsQ3wwLChIfEwpXihHfE0pXihKfEkpfDAsS3wwKXwwO0s9RGQoS3wwLEN8MCwoeV52KSZzXnl8MCwodV5yKSZvXnV8MCl8MDtJPUM7Sj1HZChCfDAsQXwwLDI4KXwwO009QztHPUhkKEJ8MCxBfDAsMzYpfDA7TT1NfEM7TD1HZChCfDAsQXwwLDM0KXwwO0g9QztFPUhkKEJ8MCxBfDAsMzApfDA7SD1NXihIfEMpO009R2QoQnwwLEF8MCwzOSl8MDtEPUM7eD1IZChCfDAsQXwwLDI1KXwwO0Q9RGQoKGp8YikmQnxqJmJ8MCwobHxmKSZBfGwmZnwwLChKfEcpXihMfEUpXihNfHgpfDAsSF4oRHxDKXwwKXwwO0g9QztwPURkKG18MCxwfDAsS3wwLEl8MCl8MDttPUM7ST1EZChEfDAsSHwwLEt8MCxJfDApfDA7Sz1DO0g9R2QocHwwLG18MCwxNCl8MDtEPUM7eD1IZChwfDAsbXwwLDUwKXwwO0Q9RHxDO009R2QocHwwLG18MCwxOCl8MDtFPUM7TD1IZChwfDAsbXwwLDQ2KXwwO0U9RF4oRXxDKTtEPUdkKHB8MCxtfDAsNDEpfDA7Rz1DO0o9SGQocHwwLG18MCwyMyl8MDtHPUVeKEd8Qyk7RT1nKzE4NHwwO0Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7dT1EZCh5fDAsdXwwLC0yMDk2MDE2NDU5LDE5OTYwNjQ5ODYpfDA7RT1EZCh1fDAsQ3wwLEZ8MCxFfDApfDA7Rz1EZChFfDAsQ3wwLChIfHgpXihNfEwpXihEfEopfDAsR3wwKXwwO0c9RGQoR3wwLEN8MCwodl5zKSZwXnZ8MCwocl5vKSZtXnJ8MCl8MDtKPUM7RD1HZChJfDAsS3wwLDI4KXwwO0w9QztNPUhkKEl8MCxLfDAsMzYpfDA7TD1MfEM7eD1HZChJfDAsS3wwLDM0KXwwO0g9QztFPUhkKEl8MCxLfDAsMzApfDA7SD1MXihIfEMpO0w9R2QoSXwwLEt8MCwzOSl8MDtGPUM7dT1IZChJfDAsS3wwLDI1KXwwO0Y9RGQoKGJ8QikmSXxiJkJ8MCwoZnxBKSZLfGYmQXwwLChEfE0pXih4fEUpXihMfHUpfDAsSF4oRnxDKXwwKXwwO0g9QztsPURkKGp8MCxsfDAsR3wwLEp8MCl8MDtqPUM7Sj1EZChGfDAsSHwwLEd8MCxKfDApfDA7Rz1DO0g9R2QobHwwLGp8MCwxNCl8MDtGPUM7dT1IZChsfDAsanwwLDUwKXwwO0Y9RnxDO0w9R2QobHwwLGp8MCwxOCl8MDtFPUM7eD1IZChsfDAsanwwLDQ2KXwwO0U9Rl4oRXxDKTtGPUdkKGx8MCxqfDAsNDEpfDA7TT1DO0Q9SGQobHwwLGp8MCwyMyl8MDtNPUVeKE18Qyk7RT1nKzE5MnwwO3k9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7cj1EZCh2fDAscnwwLC0yOTUyNDc5NTcsLTE3NDA3NDY0MTQpfDA7RT1EZChyfDAsQ3wwLHl8MCxFfDApfDA7TT1EZChFfDAsQ3wwLChIfHUpXihMfHgpXihGfEQpfDAsTXwwKXwwO009RGQoTXwwLEN8MCwoc15wKSZsXnN8MCwob15tKSZqXm98MCl8MDtEPUM7Rj1HZChKfDAsR3wwLDI4KXwwO3g9QztMPUhkKEp8MCxHfDAsMzYpfDA7eD14fEM7dT1HZChKfDAsR3wwLDM0KXwwO0g9QztFPUhkKEp8MCxHfDAsMzApfDA7SD14XihIfEMpO3g9R2QoSnwwLEd8MCwzOSl8MDt5PUM7cj1IZChKfDAsR3wwLDI1KXwwO3k9RGQoKEJ8SSkmSnxCJkl8MCwoQXxLKSZHfEEmS3wwLChGfEwpXih1fEUpXih4fHIpfDAsSF4oeXxDKXwwKXwwO0g9QztmPURkKGJ8MCxmfDAsTXwwLER8MCl8MDtiPUM7RD1EZCh5fDAsSHwwLE18MCxEfDApfDA7TT1DO0g9R2QoZnwwLGJ8MCwxNCl8MDt5PUM7cj1IZChmfDAsYnwwLDUwKXwwO3k9eXxDO3g9R2QoZnwwLGJ8MCwxOCl8MDtFPUM7dT1IZChmfDAsYnwwLDQ2KXwwO0U9eV4oRXxDKTt5PUdkKGZ8MCxifDAsNDEpfDA7TD1DO0Y9SGQoZnwwLGJ8MCwyMyl8MDtMPUVeKEx8Qyk7RT1nKzIwMHwwO3Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7bz1EZChzfDAsb3wwLDc2Njc4NDAxNiwtMTQ3MzEzMjk0Nyl8MDtFPURkKG98MCxDfDAsdnwwLEV8MCl8MDtMPURkKEV8MCxDfDAsKEh8cileKHh8dSleKHl8Ril8MCxMfDApfDA7TD1EZChMfDAsQ3wwLChwXmwpJmZecHwwLChtXmopJmJebXwwKXwwO0Y9Qzt5PUdkKER8MCxNfDAsMjgpfDA7dT1DO3g9SGQoRHwwLE18MCwzNil8MDt1PXV8QztyPUdkKER8MCxNfDAsMzQpfDA7SD1DO0U9SGQoRHwwLE18MCwzMCl8MDtIPXVeKEh8Qyk7dT1HZChEfDAsTXwwLDM5KXwwO3Y9QztvPUhkKER8MCxNfDAsMjUpfDA7dj1EZCgoSXxKKSZEfEkmSnwwLChLfEcpJk18SyZHfDAsKHl8eCleKHJ8RSleKHV8byl8MCxIXih2fEMpfDApfDA7SD1DO0E9RGQoQnwwLEF8MCxMfDAsRnwwKXwwO0I9QztGPURkKHZ8MCxIfDAsTHwwLEZ8MCl8MDtMPUM7SD1HZChBfDAsQnwwLDE0KXwwO3Y9QztvPUhkKEF8MCxCfDAsNTApfDA7dj12fEM7dT1HZChBfDAsQnwwLDE4KXwwO0U9QztyPUhkKEF8MCxCfDAsNDYpfDA7RT12XihFfEMpO3Y9R2QoQXwwLEJ8MCw0MSl8MDt4PUM7eT1IZChBfDAsQnwwLDIzKXwwO3g9RV4oeHxDKTtFPWcrMjA4fDA7cz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDttPURkKHB8MCxtfDAsLTE3MjgzNzI0MTcsLTEzNDE5NzA0ODgpfDA7RT1EZChtfDAsQ3wwLHN8MCxFfDApfDA7eD1EZChFfDAsQ3wwLChIfG8pXih1fHIpXih2fHkpfDAseHwwKXwwO3g9RGQoeHwwLEN8MCwobF5mKSZBXmx8MCwoal5iKSZCXmp8MCl8MDt5PUM7dj1HZChGfDAsTHwwLDI4KXwwO3I9Qzt1PUhkKEZ8MCxMfDAsMzYpfDA7cj1yfEM7bz1HZChGfDAsTHwwLDM0KXwwO0g9QztFPUhkKEZ8MCxMfDAsMzApfDA7SD1yXihIfEMpO3I9R2QoRnwwLEx8MCwzOSl8MDtzPUM7bT1IZChGfDAsTHwwLDI1KXwwO3M9RGQoKEp8RCkmRnxKJkR8MCwoR3xNKSZMfEcmTXwwLCh2fHUpXihvfEUpXihyfG0pfDAsSF4oc3xDKXwwKXwwO0g9QztLPURkKEl8MCxLfDAseHwwLHl8MCl8MDtJPUM7eT1EZChzfDAsSHwwLHh8MCx5fDApfDA7eD1DO0g9R2QoS3wwLEl8MCwxNCl8MDtzPUM7bT1IZChLfDAsSXwwLDUwKXwwO3M9c3xDO3I9R2QoS3wwLEl8MCwxOCl8MDtFPUM7bz1IZChLfDAsSXwwLDQ2KXwwO0U9c14oRXxDKTtzPUdkKEt8MCxJfDAsNDEpfDA7dT1DO3Y9SGQoS3wwLEl8MCwyMyl8MDt1PUVeKHV8Qyk7RT1nKzIxNnwwO3A9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7aj1EZChsfDAsanwwLC0xMDkxNjI5MzQwLC0xMDg0NjUzNjI1KXwwO0U9RGQoanwwLEN8MCxwfDAsRXwwKXwwO3U9RGQoRXwwLEN8MCwoSHxtKV4ocnxvKV4oc3x2KXwwLHV8MCl8MDt1PURkKHV8MCxDfDAsKGZeQSkmS15mfDAsKGJeQikmSV5ifDApfDA7dj1DO3M9R2QoeXwwLHh8MCwyOCl8MDtvPUM7cj1IZCh5fDAseHwwLDM2KXwwO289b3xDO209R2QoeXwwLHh8MCwzNCl8MDtIPUM7RT1IZCh5fDAseHwwLDMwKXwwO0g9b14oSHxDKTtvPUdkKHl8MCx4fDAsMzkpfDA7cD1DO2o9SGQoeXwwLHh8MCwyNSl8MDtwPURkKChEfEYpJnl8RCZGfDAsKE18TCkmeHxNJkx8MCwoc3xyKV4obXxFKV4ob3xqKXwwLEheKHB8Qyl8MCl8MDtIPUM7Rz1EZChKfDAsR3wwLHV8MCx2fDApfDA7Sj1DO3Y9RGQocHwwLEh8MCx1fDAsdnwwKXwwO3U9QztIPUdkKEd8MCxKfDAsMTQpfDA7cD1DO2o9SGQoR3wwLEp8MCw1MCl8MDtwPXB8QztvPUdkKEd8MCxKfDAsMTgpfDA7RT1DO209SGQoR3wwLEp8MCw0Nil8MDtFPXBeKEV8Qyk7cD1HZChHfDAsSnwwLDQxKXwwO3I9QztzPUhkKEd8MCxKfDAsMjMpfDA7cj1FXihyfEMpO0U9ZysyMjR8MDtsPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO2I9RGQoZnwwLGJ8MCwxMDM0NDU3MDI2LC05NTgzOTU0MDUpfDA7RT1EZChifDAsQ3wwLGx8MCxFfDApfDA7cj1EZChFfDAsQ3wwLChIfGopXihvfG0pXihwfHMpfDAscnwwKXwwO3I9RGQocnwwLEN8MCwoQV5LKSZHXkF8MCwoQl5JKSZKXkJ8MCl8MDtzPUM7cD1HZCh2fDAsdXwwLDI4KXwwO209QztvPUhkKHZ8MCx1fDAsMzYpfDA7bT1tfEM7aj1HZCh2fDAsdXwwLDM0KXwwO0g9QztFPUhkKHZ8MCx1fDAsMzApfDA7SD1tXihIfEMpO209R2QodnwwLHV8MCwzOSl8MDtsPUM7Yj1IZCh2fDAsdXwwLDI1KXwwO2w9RGQoKEZ8eSkmdnxGJnl8MCwoTHx4KSZ1fEwmeHwwLChwfG8pXihqfEUpXihtfGIpfDAsSF4obHxDKXwwKXwwO0g9QztNPURkKER8MCxNfDAscnwwLHN8MCl8MDtEPUM7cz1EZChsfDAsSHwwLHJ8MCxzfDApfDA7cj1DO0g9R2QoTXwwLER8MCwxNCl8MDtsPUM7Yj1IZChNfDAsRHwwLDUwKXwwO2w9bHxDO209R2QoTXwwLER8MCwxOCl8MDtFPUM7aj1IZChNfDAsRHwwLDQ2KXwwO0U9bF4oRXxDKTtsPUdkKE18MCxEfDAsNDEpfDA7bz1DO3A9SGQoTXwwLER8MCwyMyl8MDtvPUVeKG98Qyk7RT1nKzIzMnwwO2Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Qj1EZChBfDAsQnwwLC0xODI4MDE4Mzk1LC03MTA0Mzg1ODUpfDA7RT1EZChCfDAsQ3wwLGZ8MCxFfDApfDA7bz1EZChFfDAsQ3wwLChIfGIpXihtfGopXihsfHApfDAsb3wwKXwwO289RGQob3wwLEN8MCwoS15HKSZNXkt8MCwoSV5KKSZEXkl8MCl8MDtwPUM7bD1HZChzfDAscnwwLDI4KXwwO2o9QzttPUhkKHN8MCxyfDAsMzYpfDA7aj1qfEM7Yj1HZChzfDAscnwwLDM0KXwwO0g9QztFPUhkKHN8MCxyfDAsMzApfDA7SD1qXihIfEMpO2o9R2Qoc3wwLHJ8MCwzOSl8MDtmPUM7Qj1IZChzfDAscnwwLDI1KXwwO2Y9RGQoKHl8dikmc3x5JnZ8MCwoeHx1KSZyfHgmdXwwLChsfG0pXihifEUpXihqfEIpfDAsSF4oZnxDKXwwKXwwO0g9QztMPURkKEZ8MCxMfDAsb3wwLHB8MCl8MDtGPUM7cD1EZChmfDAsSHwwLG98MCxwfDApfDA7bz1DO0g9R2QoTHwwLEZ8MCwxNCl8MDtmPUM7Qj1IZChMfDAsRnwwLDUwKXwwO2Y9ZnxDO2o9R2QoTHwwLEZ8MCwxOCl8MDtFPUM7Yj1IZChMfDAsRnwwLDQ2KXwwO0U9Zl4oRXxDKTtmPUdkKEx8MCxGfDAsNDEpfDA7bT1DO2w9SGQoTHwwLEZ8MCwyMyl8MDttPUVeKG18Qyk7RT1nKzI0MHwwO0E9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7ST1EZChLfDAsSXwwLC01MzY2NDA5MTMsMTEzOTI2OTkzKXwwO0U9RGQoSXwwLEN8MCxBfDAsRXwwKXwwO209RGQoRXwwLEN8MCwoSHxCKV4oanxiKV4oZnxsKXwwLG18MCl8MDttPURkKG18MCxDfDAsKEdeTSkmTF5HfDAsKEpeRCkmRl5KfDApfDA7bD1DO2Y9R2QocHwwLG98MCwyOCl8MDtiPUM7aj1IZChwfDAsb3wwLDM2KXwwO2I9YnxDO0I9R2QocHwwLG98MCwzNCl8MDtIPUM7RT1IZChwfDAsb3wwLDMwKXwwO0g9Yl4oSHxDKTtiPUdkKHB8MCxvfDAsMzkpfDA7QT1DO0k9SGQocHwwLG98MCwyNSl8MDtBPURkKCh2fHMpJnB8diZzfDAsKHV8cikmb3x1JnJ8MCwoZnxqKV4oQnxFKV4oYnxJKXwwLEheKEF8Qyl8MCl8MDtIPUM7eD1EZCh5fDAseHwwLG18MCxsfDApfDA7eT1DO2w9RGQoQXwwLEh8MCxtfDAsbHwwKXwwO209QztIPUdkKHh8MCx5fDAsMTQpfDA7QT1DO0k9SGQoeHwwLHl8MCw1MCl8MDtBPUF8QztiPUdkKHh8MCx5fDAsMTgpfDA7RT1DO0I9SGQoeHwwLHl8MCw0Nil8MDtFPUFeKEV8Qyk7QT1HZCh4fDAseXwwLDQxKXwwO2o9QztmPUhkKHh8MCx5fDAsMjMpfDA7aj1FXihqfEMpO0U9ZysyNDh8MDtLPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0o9RGQoR3wwLEp8MCwxNjg3MTc5MzYsMzM4MjQxODk1KXwwO0U9RGQoSnwwLEN8MCxLfDAsRXwwKXwwO2o9RGQoRXwwLEN8MCwoSHxJKV4oYnxCKV4oQXxmKXwwLGp8MCl8MDtqPURkKGp8MCxDfDAsKE1eTCkmeF5NfDAsKEReRikmeV5EfDApfDA7Zj1DO0E9R2QobHwwLG18MCwyOCl8MDtCPUM7Yj1IZChsfDAsbXwwLDM2KXwwO0I9QnxDO0k9R2QobHwwLG18MCwzNCl8MDtIPUM7RT1IZChsfDAsbXwwLDMwKXwwO0g9Ql4oSHxDKTtCPUdkKGx8MCxtfDAsMzkpfDA7Sz1DO0o9SGQobHwwLG18MCwyNSl8MDtLPURkKChzfHApJmx8cyZwfDAsKHJ8bykmbXxyJm98MCwoQXxiKV4oSXxFKV4oQnxKKXwwLEheKEt8Qyl8MCl8MDtIPUM7dT1EZCh2fDAsdXwwLGp8MCxmfDApfDA7dj1DO2Y9RGQoS3wwLEh8MCxqfDAsZnwwKXwwO2o9QztIPUdkKHV8MCx2fDAsMTQpfDA7Sz1DO0o9SGQodXwwLHZ8MCw1MCl8MDtLPUt8QztCPUdkKHV8MCx2fDAsMTgpfDA7RT1DO0k9SGQodXwwLHZ8MCw0Nil8MDtFPUteKEV8Qyk7Sz1HZCh1fDAsdnwwLDQxKXwwO2I9QztBPUhkKHV8MCx2fDAsMjMpfDA7Yj1FXihifEMpO0U9ZysyNTZ8MDtHPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0Q9RGQoTXwwLER8MCwxMTg4MTc5OTY0LDY2NjMwNzIwNSl8MDtFPURkKER8MCxDfDAsR3wwLEV8MCl8MDtiPURkKEV8MCxDfDAsKEh8SileKEJ8SSleKEt8QSl8MCxifDApfDA7Yj1EZChifDAsQ3wwLChMXngpJnVeTHwwLChGXnkpJnZeRnwwKXwwO0E9QztLPUdkKGZ8MCxqfDAsMjgpfDA7ST1DO0I9SGQoZnwwLGp8MCwzNil8MDtJPUl8QztKPUdkKGZ8MCxqfDAsMzQpfDA7SD1DO0U9SGQoZnwwLGp8MCwzMCl8MDtIPUleKEh8Qyk7ST1HZChmfDAsanwwLDM5KXwwO0c9QztEPUhkKGZ8MCxqfDAsMjUpfDA7Rz1EZCgocHxsKSZmfHAmbHwwLChvfG0pJmp8byZtfDAsKEt8QileKEp8RSleKEl8RCl8MCxIXihHfEMpfDApfDA7SD1DO3I9RGQoc3wwLHJ8MCxifDAsQXwwKXwwO3M9QztBPURkKEd8MCxIfDAsYnwwLEF8MCl8MDtiPUM7SD1HZChyfDAsc3wwLDE0KXwwO0c9QztEPUhkKHJ8MCxzfDAsNTApfDA7Rz1HfEM7ST1HZChyfDAsc3wwLDE4KXwwO0U9QztKPUhkKHJ8MCxzfDAsNDYpfDA7RT1HXihFfEMpO0c9R2QocnwwLHN8MCw0MSl8MDtCPUM7Sz1IZChyfDAsc3wwLDIzKXwwO0I9RV4oQnxDKTtFPWcrMjY0fDA7TT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtGPURkKEx8MCxGfDAsMTU0NjA0NTczNCw3NzM1Mjk5MTIpfDA7RT1EZChGfDAsQ3wwLE18MCxFfDApfDA7Qj1EZChFfDAsQ3wwLChIfEQpXihJfEopXihHfEspfDAsQnwwKXwwO0I9RGQoQnwwLEN8MCwoeF51KSZyXnh8MCwoeV52KSZzXnl8MCl8MDtLPUM7Rz1HZChBfDAsYnwwLDI4KXwwO0o9QztJPUhkKEF8MCxifDAsMzYpfDA7Sj1KfEM7RD1HZChBfDAsYnwwLDM0KXwwO0g9QztFPUhkKEF8MCxifDAsMzApfDA7SD1KXihIfEMpO0o9R2QoQXwwLGJ8MCwzOSl8MDtNPUM7Rj1IZChBfDAsYnwwLDI1KXwwO009RGQoKGx8ZikmQXxsJmZ8MCwobXxqKSZifG0manwwLChHfEkpXihEfEUpXihKfEYpfDAsSF4oTXxDKXwwKXwwO0g9QztvPURkKHB8MCxvfDAsQnwwLEt8MCl8MDtwPUM7Sz1EZChNfDAsSHwwLEJ8MCxLfDApfDA7Qj1DO0g9R2Qob3wwLHB8MCwxNCl8MDtNPUM7Rj1IZChvfDAscHwwLDUwKXwwO009TXxDO0o9R2Qob3wwLHB8MCwxOCl8MDtFPUM7RD1IZChvfDAscHwwLDQ2KXwwO0U9TV4oRXxDKTtNPUdkKG98MCxwfDAsNDEpfDA7ST1DO0c9SGQob3wwLHB8MCwyMyl8MDtJPUVeKEl8Qyk7RT1nKzI3MnwwO0w9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7eT1EZCh4fDAseXwwLDE1MjI4MDU0ODUsMTI5NDc1NzM3Mil8MDtFPURkKHl8MCxDfDAsTHwwLEV8MCl8MDtJPURkKEV8MCxDfDAsKEh8RileKEp8RCleKE18Ryl8MCxJfDApfDA7ST1EZChJfDAsQ3wwLCh1XnIpJm9edXwwLCh2XnMpJnBednwwKXwwO0c9QztNPUdkKEt8MCxCfDAsMjgpfDA7RD1DO0o9SGQoS3wwLEJ8MCwzNil8MDtEPUR8QztGPUdkKEt8MCxCfDAsMzQpfDA7SD1DO0U9SGQoS3wwLEJ8MCwzMCl8MDtIPUReKEh8Qyk7RD1HZChLfDAsQnwwLDM5KXwwO0w9Qzt5PUhkKEt8MCxCfDAsMjUpfDA7TD1EZCgoZnxBKSZLfGYmQXwwLChqfGIpJkJ8aiZifDAsKE18SileKEZ8RSleKER8eSl8MCxIXihMfEMpfDApfDA7SD1DO209RGQobHwwLG18MCxJfDAsR3wwKXwwO2w9QztHPURkKEx8MCxIfDAsSXwwLEd8MCl8MDtJPUM7SD1HZChtfDAsbHwwLDE0KXwwO0w9Qzt5PUhkKG18MCxsfDAsNTApfDA7TD1MfEM7RD1HZChtfDAsbHwwLDE4KXwwO0U9QztGPUhkKG18MCxsfDAsNDYpfDA7RT1MXihFfEMpO0w9R2QobXwwLGx8MCw0MSl8MDtKPUM7TT1IZChtfDAsbHwwLDIzKXwwO0o9RV4oSnxDKTtFPWcrMjgwfDA7eD1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDt2PURkKHV8MCx2fDAsLTE2NTExMzM0NzMsMTM5NjE4MjI5MSl8MDtFPURkKHZ8MCxDfDAseHwwLEV8MCl8MDtKPURkKEV8MCxDfDAsKEh8eSleKER8RileKEx8TSl8MCxKfDApfDA7Sj1EZChKfDAsQ3wwLChyXm8pJm1ecnwwLChzXnApJmxec3wwKXwwO009QztMPUdkKEd8MCxJfDAsMjgpfDA7Rj1DO0Q9SGQoR3wwLEl8MCwzNil8MDtGPUZ8Qzt5PUdkKEd8MCxJfDAsMzQpfDA7SD1DO0U9SGQoR3wwLEl8MCwzMCl8MDtIPUZeKEh8Qyk7Rj1HZChHfDAsSXwwLDM5KXwwO3g9Qzt2PUhkKEd8MCxJfDAsMjUpfDA7eD1EZCgoQXxLKSZHfEEmS3wwLChifEIpJkl8YiZCfDAsKEx8RCleKHl8RSleKEZ8dil8MCxIXih4fEMpfDApfDA7SD1DO2o9RGQoZnwwLGp8MCxKfDAsTXwwKXwwO2Y9QztNPURkKHh8MCxIfDAsSnwwLE18MCl8MDtKPUM7SD1HZChqfDAsZnwwLDE0KXwwO3g9Qzt2PUhkKGp8MCxmfDAsNTApfDA7eD14fEM7Rj1HZChqfDAsZnwwLDE4KXwwO0U9Qzt5PUhkKGp8MCxmfDAsNDYpfDA7RT14XihFfEMpO3g9R2QoanwwLGZ8MCw0MSl8MDtEPUM7TD1IZChqfDAsZnwwLDIzKXwwO0Q9RV4oRHxDKTtFPWcrMjg4fDA7dT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtzPURkKHJ8MCxzfDAsLTE5NTE0Mzk5MDYsMTY5NTE4MzcwMCl8MDtFPURkKHN8MCxDfDAsdXwwLEV8MCl8MDtEPURkKEV8MCxDfDAsKEh8dileKEZ8eSleKHh8TCl8MCxEfDApfDA7RD1EZChEfDAsQ3wwLChvXm0pJmpeb3wwLChwXmwpJmZecHwwKXwwO0w9Qzt4PUdkKE18MCxKfDAsMjgpfDA7eT1DO0Y9SGQoTXwwLEp8MCwzNil8MDt5PXl8Qzt2PUdkKE18MCxKfDAsMzQpfDA7SD1DO0U9SGQoTXwwLEp8MCwzMCl8MDtIPXleKEh8Qyk7eT1HZChNfDAsSnwwLDM5KXwwO3U9QztzPUhkKE18MCxKfDAsMjUpfDA7dT1EZCgoS3xHKSZNfEsmR3wwLChCfEkpJkp8QiZJfDAsKHh8RileKHZ8RSleKHl8cyl8MCxIXih1fEMpfDApfDA7SD1DO2I9RGQoQXwwLGJ8MCxEfDAsTHwwKXwwO0E9QztMPURkKHV8MCxIfDAsRHwwLEx8MCl8MDtEPUM7SD1HZChifDAsQXwwLDE0KXwwO3U9QztzPUhkKGJ8MCxBfDAsNTApfDA7dT11fEM7eT1HZChifDAsQXwwLDE4KXwwO0U9Qzt2PUhkKGJ8MCxBfDAsNDYpfDA7RT11XihFfEMpO3U9R2QoYnwwLEF8MCw0MSl8MDtGPUM7eD1IZChifDAsQXwwLDIzKXwwO0Y9RV4oRnxDKTtFPWcrMjk2fDA7cj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtwPURkKG98MCxwfDAsMTAxNDQ3NzQ4MCwxOTg2NjYxMDUxKXwwO0U9RGQocHwwLEN8MCxyfDAsRXwwKXwwO0Y9RGQoRXwwLEN8MCwoSHxzKV4oeXx2KV4odXx4KXwwLEZ8MCl8MDtGPURkKEZ8MCxDfDAsKG1eaikmYl5tfDAsKGxeZikmQV5sfDApfDA7eD1DO3U9R2QoTHwwLER8MCwyOCl8MDt2PUM7eT1IZChMfDAsRHwwLDM2KXwwO3Y9dnxDO3M9R2QoTHwwLER8MCwzNCl8MDtIPUM7RT1IZChMfDAsRHwwLDMwKXwwO0g9dl4oSHxDKTt2PUdkKEx8MCxEfDAsMzkpfDA7cj1DO3A9SGQoTHwwLER8MCwyNSl8MDtyPURkKChHfE0pJkx8RyZNfDAsKEl8SikmRHxJJkp8MCwodXx5KV4oc3xFKV4odnxwKXwwLEheKHJ8Qyl8MCl8MDtIPUM7Qj1EZChLfDAsQnwwLEZ8MCx4fDApfDA7Sz1DO3g9RGQocnwwLEh8MCxGfDAseHwwKXwwO0Y9QztIPUdkKEJ8MCxLfDAsMTQpfDA7cj1DO3A9SGQoQnwwLEt8MCw1MCl8MDtyPXJ8Qzt2PUdkKEJ8MCxLfDAsMTgpfDA7RT1DO3M9SGQoQnwwLEt8MCw0Nil8MDtFPXJeKEV8Qyk7cj1HZChCfDAsS3wwLDQxKXwwO3k9Qzt1PUhkKEJ8MCxLfDAsMjMpfDA7eT1FXih5fEMpO0U9ZyszMDR8MDtvPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO2w9RGQobXwwLGx8MCwxMjA2NzU5MTQyLC0yMTE3OTQwOTQ2KXwwO0U9RGQobHwwLEN8MCxvfDAsRXwwKXwwO3k9RGQoRXwwLEN8MCwoSHxwKV4odnxzKV4ocnx1KXwwLHl8MCl8MDt5PURkKHl8MCxDfDAsKGpeYikmQl5qfDAsKGZeQSkmS15mfDApfDA7dT1DO3I9R2QoeHwwLEZ8MCwyOCl8MDtzPUM7dj1IZCh4fDAsRnwwLDM2KXwwO3M9c3xDO3A9R2QoeHwwLEZ8MCwzNCl8MDtIPUM7RT1IZCh4fDAsRnwwLDMwKXwwO0g9c14oSHxDKTtzPUdkKHh8MCxGfDAsMzkpfDA7bz1DO2w9SGQoeHwwLEZ8MCwyNSl8MDtvPURkKChNfEwpJnh8TSZMfDAsKEp8RCkmRnxKJkR8MCwocnx2KV4ocHxFKV4oc3xsKXwwLEheKG98Qyl8MCl8MDtIPUM7ST1EZChHfDAsSXwwLHl8MCx1fDApfDA7Rz1DO3U9RGQob3wwLEh8MCx5fDAsdXwwKXwwO3k9QztIPUdkKEl8MCxHfDAsMTQpfDA7bz1DO2w9SGQoSXwwLEd8MCw1MCl8MDtvPW98QztzPUdkKEl8MCxHfDAsMTgpfDA7RT1DO3A9SGQoSXwwLEd8MCw0Nil8MDtFPW9eKEV8Qyk7bz1HZChJfDAsR3wwLDQxKXwwO3Y9QztyPUhkKEl8MCxHfDAsMjMpfDA7dj1FXih2fEMpO0U9ZyszMTJ8MDttPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO2Y9RGQoanwwLGZ8MCwzNDQwNzc2MjcsLTE4MzgwMTEyNTkpfDA7RT1EZChmfDAsQ3wwLG18MCxFfDApfDA7dj1EZChFfDAsQ3wwLChIfGwpXihzfHApXihvfHIpfDAsdnwwKXwwO3Y9RGQodnwwLEN8MCwoYl5CKSZJXmJ8MCwoQV5LKSZHXkF8MCl8MDtyPUM7bz1HZCh1fDAseXwwLDI4KXwwO3A9QztzPUhkKHV8MCx5fDAsMzYpfDA7cD1wfEM7bD1HZCh1fDAseXwwLDM0KXwwO0g9QztFPUhkKHV8MCx5fDAsMzApfDA7SD1wXihIfEMpO3A9R2QodXwwLHl8MCwzOSl8MDttPUM7Zj1IZCh1fDAseXwwLDI1KXwwO209RGQoKEx8eCkmdXxMJnh8MCwoRHxGKSZ5fEQmRnwwLChvfHMpXihsfEUpXihwfGYpfDAsSF4obXxDKXwwKXwwO0g9QztKPURkKE18MCxKfDAsdnwwLHJ8MCl8MDtNPUM7cj1EZChtfDAsSHwwLHZ8MCxyfDApfDA7dj1DO0g9R2QoSnwwLE18MCwxNCl8MDttPUM7Zj1IZChKfDAsTXwwLDUwKXwwO209bXxDO3A9R2QoSnwwLE18MCwxOCl8MDtFPUM7bD1IZChKfDAsTXwwLDQ2KXwwO0U9bV4oRXxDKTttPUdkKEp8MCxNfDAsNDEpfDA7cz1DO289SGQoSnwwLE18MCwyMyl8MDtzPUVeKHN8Qyk7RT1nKzMyMHwwO2o9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7QT1EZChifDAsQXwwLDEyOTA4NjM0NjAsLTE1NjQ0ODEzNzUpfDA7RT1EZChBfDAsQ3wwLGp8MCxFfDApfDA7cz1EZChFfDAsQ3wwLChIfGYpXihwfGwpXihtfG8pfDAsc3wwKXwwO3M9RGQoc3wwLEN8MCwoQl5JKSZKXkJ8MCwoS15HKSZNXkt8MCl8MDtvPUM7bT1HZChyfDAsdnwwLDI4KXwwO2w9QztwPUhkKHJ8MCx2fDAsMzYpfDA7bD1sfEM7Zj1HZChyfDAsdnwwLDM0KXwwO0g9QztFPUhkKHJ8MCx2fDAsMzApfDA7SD1sXihIfEMpO2w9R2QocnwwLHZ8MCwzOSl8MDtqPUM7QT1IZChyfDAsdnwwLDI1KXwwO2o9RGQoKHh8dSkmcnx4JnV8MCwoRnx5KSZ2fEYmeXwwLChtfHApXihmfEUpXihsfEEpfDAsSF4oanxDKXwwKXwwO0g9QztEPURkKEx8MCxEfDAsc3wwLG98MCl8MDtMPUM7bz1EZChqfDAsSHwwLHN8MCxvfDApfDA7cz1DO0g9R2QoRHwwLEx8MCwxNCl8MDtqPUM7QT1IZChEfDAsTHwwLDUwKXwwO2o9anxDO2w9R2QoRHwwLEx8MCwxOCl8MDtFPUM7Zj1IZChEfDAsTHwwLDQ2KXwwO0U9al4oRXxDKTtqPUdkKER8MCxMfDAsNDEpfDA7cD1DO209SGQoRHwwLEx8MCwyMyl8MDtwPUVeKHB8Qyk7RT1nKzMyOHwwO2I9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Sz1EZChCfDAsS3wwLC0xMTM2NTEzMDIzLC0xNDc0NjY0ODg1KXwwO0U9RGQoS3wwLEN8MCxifDAsRXwwKXwwO3A9RGQoRXwwLEN8MCwoSHxBKV4obHxmKV4oanxtKXwwLHB8MCl8MDtwPURkKHB8MCxDfDAsKEleSikmRF5JfDAsKEdeTSkmTF5HfDApfDA7bT1DO2o9R2Qob3wwLHN8MCwyOCl8MDtmPUM7bD1IZChvfDAsc3wwLDM2KXwwO2Y9ZnxDO0E9R2Qob3wwLHN8MCwzNCl8MDtIPUM7RT1IZChvfDAsc3wwLDMwKXwwO0g9Zl4oSHxDKTtmPUdkKG98MCxzfDAsMzkpfDA7Yj1DO0s9SGQob3wwLHN8MCwyNSl8MDtiPURkKCh1fHIpJm98dSZyfDAsKHl8dikmc3x5JnZ8MCwoanxsKV4oQXxFKV4oZnxLKXwwLEheKGJ8Qyl8MCl8MDtIPUM7Rj1EZCh4fDAsRnwwLHB8MCxtfDApfDA7eD1DO209RGQoYnwwLEh8MCxwfDAsbXwwKXwwO3A9QztIPUdkKEZ8MCx4fDAsMTQpfDA7Yj1DO0s9SGQoRnwwLHh8MCw1MCl8MDtiPWJ8QztmPUdkKEZ8MCx4fDAsMTgpfDA7RT1DO0E9SGQoRnwwLHh8MCw0Nil8MDtFPWJeKEV8Qyk7Yj1HZChGfDAseHwwLDQxKXwwO2w9QztqPUhkKEZ8MCx4fDAsMjMpfDA7bD1FXihsfEMpO0U9ZyszMzZ8MDtCPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0c9RGQoSXwwLEd8MCwtNzg5MDE0NjM5LC0xMDM1MjM2NDk2KXwwO0U9RGQoR3wwLEN8MCxCfDAsRXwwKXwwO2w9RGQoRXwwLEN8MCwoSHxLKV4oZnxBKV4oYnxqKXwwLGx8MCl8MDtsPURkKGx8MCxDfDAsKEpeRCkmRl5KfDAsKE1eTCkmeF5NfDApfDA7aj1DO2I9R2QobXwwLHB8MCwyOCl8MDtBPUM7Zj1IZChtfDAscHwwLDM2KXwwO0E9QXxDO0s9R2QobXwwLHB8MCwzNCl8MDtIPUM7RT1IZChtfDAscHwwLDMwKXwwO0g9QV4oSHxDKTtBPUdkKG18MCxwfDAsMzkpfDA7Qj1DO0c9SGQobXwwLHB8MCwyNSl8MDtCPURkKChyfG8pJm18ciZvfDAsKHZ8cykmcHx2JnN8MCwoYnxmKV4oS3xFKV4oQXxHKXwwLEheKEJ8Qyl8MCl8MDtIPUM7eT1EZCh1fDAseXwwLGx8MCxqfDApfDA7dT1DO2o9RGQoQnwwLEh8MCxsfDAsanwwKXwwO2w9QztIPUdkKHl8MCx1fDAsMTQpfDA7Qj1DO0c9SGQoeXwwLHV8MCw1MCl8MDtCPUJ8QztBPUdkKHl8MCx1fDAsMTgpfDA7RT1DO0s9SGQoeXwwLHV8MCw0Nil8MDtFPUJeKEV8Qyk7Qj1HZCh5fDAsdXwwLDQxKXwwO2Y9QztiPUhkKHl8MCx1fDAsMjMpfDA7Zj1FXihmfEMpO0U9ZyszNDR8MDtJPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO009RGQoSnwwLE18MCwxMDYyMTcwMDgsLTk0OTIwMjUyNSl8MDtFPURkKE18MCxDfDAsSXwwLEV8MCl8MDtmPURkKEV8MCxDfDAsKEh8RyleKEF8SyleKEJ8Yil8MCxmfDApfDA7Zj1EZChmfDAsQ3wwLChEXkYpJnleRHwwLChMXngpJnVeTHwwKXwwO2I9QztCPUdkKGp8MCxsfDAsMjgpfDA7Sz1DO0E9SGQoanwwLGx8MCwzNil8MDtLPUt8QztHPUdkKGp8MCxsfDAsMzQpfDA7SD1DO0U9SGQoanwwLGx8MCwzMCl8MDtIPUteKEh8Qyk7Sz1HZChqfDAsbHwwLDM5KXwwO0k9QztNPUhkKGp8MCxsfDAsMjUpfDA7ST1EZCgob3xtKSZqfG8mbXwwLChzfHApJmx8cyZwfDAsKEJ8QSleKEd8RSleKEt8TSl8MCxIXihJfEMpfDApfDA7SD1DO3Y9RGQocnwwLHZ8MCxmfDAsYnwwKXwwO3I9QztiPURkKEl8MCxIfDAsZnwwLGJ8MCl8MDtmPUM7SD1HZCh2fDAscnwwLDE0KXwwO0k9QztNPUhkKHZ8MCxyfDAsNTApfDA7ST1JfEM7Sz1HZCh2fDAscnwwLDE4KXwwO0U9QztHPUhkKHZ8MCxyfDAsNDYpfDA7RT1JXihFfEMpO0k9R2QodnwwLHJ8MCw0MSl8MDtBPUM7Qj1IZCh2fDAscnwwLDIzKXwwO0E9RV4oQXxDKTtFPWcrMzUyfDA7Sj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtMPURkKER8MCxMfDAsLTY4ODk1ODk1MiwtNzc4OTAxNDc5KXwwO0U9RGQoTHwwLEN8MCxKfDAsRXwwKXwwO0E9RGQoRXwwLEN8MCwoSHxNKV4oS3xHKV4oSXxCKXwwLEF8MCl8MDtBPURkKEF8MCxDfDAsKEZeeSkmdl5GfDAsKHhedSkmcl54fDApfDA7Qj1DO0k9R2QoYnwwLGZ8MCwyOCl8MDtHPUM7Sz1IZChifDAsZnwwLDM2KXwwO0c9R3xDO009R2QoYnwwLGZ8MCwzNCl8MDtIPUM7RT1IZChifDAsZnwwLDMwKXwwO0g9R14oSHxDKTtHPUdkKGJ8MCxmfDAsMzkpfDA7Sj1DO0w9SGQoYnwwLGZ8MCwyNSl8MDtKPURkKChtfGopJmJ8bSZqfDAsKHB8bCkmZnxwJmx8MCwoSXxLKV4oTXxFKV4oR3xMKXwwLEheKEp8Qyl8MCl8MDtIPUM7cz1EZChvfDAsc3wwLEF8MCxCfDApfDA7bz1DO0I9RGQoSnwwLEh8MCxBfDAsQnwwKXwwO0E9QztIPUdkKHN8MCxvfDAsMTQpfDA7Sj1DO0w9SGQoc3wwLG98MCw1MCl8MDtKPUp8QztHPUdkKHN8MCxvfDAsMTgpfDA7RT1DO009SGQoc3wwLG98MCw0Nil8MDtFPUpeKEV8Qyk7Sj1HZChzfDAsb3wwLDQxKXwwO0s9QztJPUhkKHN8MCxvfDAsMjMpfDA7Sz1FXihLfEMpO0U9ZyszNjB8MDtEPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3g9RGQoRnwwLHh8MCwxNDMyNzI1Nzc2LC02OTQ2MTQ0OTIpfDA7RT1EZCh4fDAsQ3wwLER8MCxFfDApfDA7Sz1EZChFfDAsQ3wwLChIfEwpXihHfE0pXihKfEkpfDAsS3wwKXwwO0s9RGQoS3wwLEN8MCwoeV52KSZzXnl8MCwodV5yKSZvXnV8MCl8MDtJPUM7Sj1HZChCfDAsQXwwLDI4KXwwO009QztHPUhkKEJ8MCxBfDAsMzYpfDA7TT1NfEM7TD1HZChCfDAsQXwwLDM0KXwwO0g9QztFPUhkKEJ8MCxBfDAsMzApfDA7SD1NXihIfEMpO009R2QoQnwwLEF8MCwzOSl8MDtEPUM7eD1IZChCfDAsQXwwLDI1KXwwO0Q9RGQoKGp8YikmQnxqJmJ8MCwobHxmKSZBfGwmZnwwLChKfEcpXihMfEUpXihNfHgpfDAsSF4oRHxDKXwwKXwwO0g9QztwPURkKG18MCxwfDAsS3wwLEl8MCl8MDttPUM7ST1EZChEfDAsSHwwLEt8MCxJfDApfDA7Sz1DO0g9R2QocHwwLG18MCwxNCl8MDtEPUM7eD1IZChwfDAsbXwwLDUwKXwwO0Q9RHxDO009R2QocHwwLG18MCwxOCl8MDtFPUM7TD1IZChwfDAsbXwwLDQ2KXwwO0U9RF4oRXxDKTtEPUdkKHB8MCxtfDAsNDEpfDA7Rz1DO0o9SGQocHwwLG18MCwyMyl8MDtHPUVeKEd8Qyk7RT1nKzM2OHwwO0Y9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7dT1EZCh5fDAsdXwwLDE0NjcwMzE1OTQsLTIwMDM5NTM4Nyl8MDtFPURkKHV8MCxDfDAsRnwwLEV8MCl8MDtHPURkKEV8MCxDfDAsKEh8eCleKE18TCleKER8Sil8MCxHfDApfDA7Rz1EZChHfDAsQ3wwLCh2XnMpJnBednwwLChyXm8pJm1ecnwwKXwwO0o9QztEPUdkKEl8MCxLfDAsMjgpfDA7TD1DO009SGQoSXwwLEt8MCwzNil8MDtMPUx8Qzt4PUdkKEl8MCxLfDAsMzQpfDA7SD1DO0U9SGQoSXwwLEt8MCwzMCl8MDtIPUxeKEh8Qyk7TD1HZChJfDAsS3wwLDM5KXwwO0Y9Qzt1PUhkKEl8MCxLfDAsMjUpfDA7Rj1EZCgoYnxCKSZJfGImQnwwLChmfEEpJkt8ZiZBfDAsKER8TSleKHh8RSleKEx8dSl8MCxIXihGfEMpfDApfDA7SD1DO2w9RGQoanwwLGx8MCxHfDAsSnwwKXwwO2o9QztKPURkKEZ8MCxIfDAsR3wwLEp8MCl8MDtHPUM7SD1HZChsfDAsanwwLDE0KXwwO0Y9Qzt1PUhkKGx8MCxqfDAsNTApfDA7Rj1GfEM7TD1HZChsfDAsanwwLDE4KXwwO0U9Qzt4PUhkKGx8MCxqfDAsNDYpfDA7RT1GXihFfEMpO0Y9R2QobHwwLGp8MCw0MSl8MDtNPUM7RD1IZChsfDAsanwwLDIzKXwwO009RV4oTXxDKTtFPWcrMzc2fDA7eT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtyPURkKHZ8MCxyfDAsODUxMTY5NzIwLDI3NTQyMzM0NCl8MDtFPURkKHJ8MCxDfDAseXwwLEV8MCl8MDtNPURkKEV8MCxDfDAsKEh8dSleKEx8eCleKEZ8RCl8MCxNfDApfDA7TT1EZChNfDAsQ3wwLChzXnApJmxec3wwLChvXm0pJmpeb3wwKXwwO0Q9QztGPUdkKEp8MCxHfDAsMjgpfDA7eD1DO0w9SGQoSnwwLEd8MCwzNil8MDt4PXh8Qzt1PUdkKEp8MCxHfDAsMzQpfDA7SD1DO0U9SGQoSnwwLEd8MCwzMCl8MDtIPXheKEh8Qyk7eD1HZChKfDAsR3wwLDM5KXwwO3k9QztyPUhkKEp8MCxHfDAsMjUpfDA7eT1EZCgoQnxJKSZKfEImSXwwLChBfEspJkd8QSZLfDAsKEZ8TCleKHV8RSleKHh8cil8MCxIXih5fEMpfDApfDA7SD1DO2Y9RGQoYnwwLGZ8MCxNfDAsRHwwKXwwO2I9QztEPURkKHl8MCxIfDAsTXwwLER8MCl8MDtNPUM7SD1HZChmfDAsYnwwLDE0KXwwO3k9QztyPUhkKGZ8MCxifDAsNTApfDA7eT15fEM7eD1HZChmfDAsYnwwLDE4KXwwO0U9Qzt1PUhkKGZ8MCxifDAsNDYpfDA7RT15XihFfEMpO3k9R2QoZnwwLGJ8MCw0MSl8MDtMPUM7Rj1IZChmfDAsYnwwLDIzKXwwO0w9RV4oTHxDKTtFPWcrMzg0fDA7dj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtvPURkKHN8MCxvfDAsLTExOTQxNDM1NDQsNDMwMjI3NzM0KXwwO0U9RGQob3wwLEN8MCx2fDAsRXwwKXwwO0w9RGQoRXwwLEN8MCwoSHxyKV4oeHx1KV4oeXxGKXwwLEx8MCl8MDtMPURkKEx8MCxDfDAsKHBebCkmZl5wfDAsKG1eaikmYl5tfDApfDA7Rj1DO3k9R2QoRHwwLE18MCwyOCl8MDt1PUM7eD1IZChEfDAsTXwwLDM2KXwwO3U9dXxDO3I9R2QoRHwwLE18MCwzNCl8MDtIPUM7RT1IZChEfDAsTXwwLDMwKXwwO0g9dV4oSHxDKTt1PUdkKER8MCxNfDAsMzkpfDA7dj1DO289SGQoRHwwLE18MCwyNSl8MDt2PURkKChJfEopJkR8SSZKfDAsKEt8RykmTXxLJkd8MCwoeXx4KV4ocnxFKV4odXxvKXwwLEheKHZ8Qyl8MCl8MDtIPUM7QT1EZChCfDAsQXwwLEx8MCxGfDApfDA7Qj1DO0Y9RGQodnwwLEh8MCxMfDAsRnwwKXwwO0w9QztIPUdkKEF8MCxCfDAsMTQpfDA7dj1DO289SGQoQXwwLEJ8MCw1MCl8MDt2PXZ8Qzt1PUdkKEF8MCxCfDAsMTgpfDA7RT1DO3I9SGQoQXwwLEJ8MCw0Nil8MDtFPXZeKEV8Qyk7dj1HZChBfDAsQnwwLDQxKXwwO3g9Qzt5PUhkKEF8MCxCfDAsMjMpfDA7eD1FXih4fEMpO0U9ZyszOTJ8MDtzPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO209RGQocHwwLG18MCwxMzYzMjU4MTk1LDUwNjk0ODYxNil8MDtFPURkKG18MCxDfDAsc3wwLEV8MCl8MDt4PURkKEV8MCxDfDAsKEh8byleKHV8cileKHZ8eSl8MCx4fDApfDA7eD1EZCh4fDAsQ3wwLChsXmYpJkFebHwwLChqXmIpJkJeanwwKXwwO3k9Qzt2PUdkKEZ8MCxMfDAsMjgpfDA7cj1DO3U9SGQoRnwwLEx8MCwzNil8MDtyPXJ8QztvPUdkKEZ8MCxMfDAsMzQpfDA7SD1DO0U9SGQoRnwwLEx8MCwzMCl8MDtIPXJeKEh8Qyk7cj1HZChGfDAsTHwwLDM5KXwwO3M9QzttPUhkKEZ8MCxMfDAsMjUpfDA7cz1EZCgoSnxEKSZGfEomRHwwLChHfE0pJkx8RyZNfDAsKHZ8dSleKG98RSleKHJ8bSl8MCxIXihzfEMpfDApfDA7SD1DO0s9RGQoSXwwLEt8MCx4fDAseXwwKXwwO0k9Qzt5PURkKHN8MCxIfDAseHwwLHl8MCl8MDt4PUM7SD1HZChLfDAsSXwwLDE0KXwwO3M9QzttPUhkKEt8MCxJfDAsNTApfDA7cz1zfEM7cj1HZChLfDAsSXwwLDE4KXwwO0U9QztvPUhkKEt8MCxJfDAsNDYpfDA7RT1zXihFfEMpO3M9R2QoS3wwLEl8MCw0MSl8MDt1PUM7dj1IZChLfDAsSXwwLDIzKXwwO3U9RV4odXxDKTtFPWcrNDAwfDA7cD1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtqPURkKGx8MCxqfDAsLTU0NDI4MTcwMyw2NTkwNjA1NTYpfDA7RT1EZChqfDAsQ3wwLHB8MCxFfDApfDA7dT1EZChFfDAsQ3wwLChIfG0pXihyfG8pXihzfHYpfDAsdXwwKXwwO3U9RGQodXwwLEN8MCwoZl5BKSZLXmZ8MCwoYl5CKSZJXmJ8MCl8MDt2PUM7cz1HZCh5fDAseHwwLDI4KXwwO289QztyPUhkKHl8MCx4fDAsMzYpfDA7bz1vfEM7bT1HZCh5fDAseHwwLDM0KXwwO0g9QztFPUhkKHl8MCx4fDAsMzApfDA7SD1vXihIfEMpO289R2QoeXwwLHh8MCwzOSl8MDtwPUM7aj1IZCh5fDAseHwwLDI1KXwwO3A9RGQoKER8RikmeXxEJkZ8MCwoTXxMKSZ4fE0mTHwwLChzfHIpXihtfEUpXihvfGopfDAsSF4ocHxDKXwwKXwwO0g9QztHPURkKEp8MCxHfDAsdXwwLHZ8MCl8MDtKPUM7dj1EZChwfDAsSHwwLHV8MCx2fDApfDA7dT1DO0g9R2QoR3wwLEp8MCwxNCl8MDtwPUM7aj1IZChHfDAsSnwwLDUwKXwwO3A9cHxDO289R2QoR3wwLEp8MCwxOCl8MDtFPUM7bT1IZChHfDAsSnwwLDQ2KXwwO0U9cF4oRXxDKTtwPUdkKEd8MCxKfDAsNDEpfDA7cj1DO3M9SGQoR3wwLEp8MCwyMyl8MDtyPUVeKHJ8Qyk7RT1nKzQwOHwwO2w9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Yj1EZChmfDAsYnwwLC01MDk5MTcwMTYsODgzOTk3ODc3KXwwO0U9RGQoYnwwLEN8MCxsfDAsRXwwKXwwO3I9RGQoRXwwLEN8MCwoSHxqKV4ob3xtKV4ocHxzKXwwLHJ8MCl8MDtyPURkKHJ8MCxDfDAsKEFeSykmR15BfDAsKEJeSSkmSl5CfDApfDA7cz1DO3A9R2QodnwwLHV8MCwyOCl8MDttPUM7bz1IZCh2fDAsdXwwLDM2KXwwO209bXxDO2o9R2QodnwwLHV8MCwzNCl8MDtIPUM7RT1IZCh2fDAsdXwwLDMwKXwwO0g9bV4oSHxDKTttPUdkKHZ8MCx1fDAsMzkpfDA7bD1DO2I9SGQodnwwLHV8MCwyNSl8MDtsPURkKChGfHkpJnZ8RiZ5fDAsKEx8eCkmdXxMJnh8MCwocHxvKV4oanxFKV4obXxiKXwwLEheKGx8Qyl8MCl8MDtIPUM7TT1EZChEfDAsTXwwLHJ8MCxzfDApfDA7RD1DO3M9RGQobHwwLEh8MCxyfDAsc3wwKXwwO3I9QztIPUdkKE18MCxEfDAsMTQpfDA7bD1DO2I9SGQoTXwwLER8MCw1MCl8MDtsPWx8QzttPUdkKE18MCxEfDAsMTgpfDA7RT1DO2o9SGQoTXwwLER8MCw0Nil8MDtFPWxeKEV8Qyk7bD1HZChNfDAsRHwwLDQxKXwwO289QztwPUhkKE18MCxEfDAsMjMpfDA7bz1FXihvfEMpO0U9Zys0MTZ8MDtmPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0I9RGQoQXwwLEJ8MCwtOTc2NjU5ODY5LDk1ODEzOTU3MSl8MDtFPURkKEJ8MCxDfDAsZnwwLEV8MCl8MDtvPURkKEV8MCxDfDAsKEh8YileKG18aileKGx8cCl8MCxvfDApfDA7bz1EZChvfDAsQ3wwLChLXkcpJk1eS3wwLChJXkopJkReSXwwKXwwO3A9QztsPUdkKHN8MCxyfDAsMjgpfDA7aj1DO209SGQoc3wwLHJ8MCwzNil8MDtqPWp8QztiPUdkKHN8MCxyfDAsMzQpfDA7SD1DO0U9SGQoc3wwLHJ8MCwzMCl8MDtIPWpeKEh8Qyk7aj1HZChzfDAscnwwLDM5KXwwO2Y9QztCPUhkKHN8MCxyfDAsMjUpfDA7Zj1EZCgoeXx2KSZzfHkmdnwwLCh4fHUpJnJ8eCZ1fDAsKGx8bSleKGJ8RSleKGp8Qil8MCxIXihmfEMpfDApfDA7SD1DO0w9RGQoRnwwLEx8MCxvfDAscHwwKXwwO0Y9QztwPURkKGZ8MCxIfDAsb3wwLHB8MCl8MDtvPUM7SD1HZChMfDAsRnwwLDE0KXwwO2Y9QztCPUhkKEx8MCxGfDAsNTApfDA7Zj1mfEM7aj1HZChMfDAsRnwwLDE4KXwwO0U9QztiPUhkKEx8MCxGfDAsNDYpfDA7RT1mXihFfEMpO2Y9R2QoTHwwLEZ8MCw0MSl8MDttPUM7bD1IZChMfDAsRnwwLDIzKXwwO209RV4obXxDKTtFPWcrNDI0fDA7QT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtJPURkKEt8MCxJfDAsLTQ4MjI0Mzg5MywxMzIyODIyMjE4KXwwO0U9RGQoSXwwLEN8MCxBfDAsRXwwKXwwO209RGQoRXwwLEN8MCwoSHxCKV4oanxiKV4oZnxsKXwwLG18MCl8MDttPURkKG18MCxDfDAsKEdeTSkmTF5HfDAsKEpeRCkmRl5KfDApfDA7bD1DO2Y9R2QocHwwLG98MCwyOCl8MDtiPUM7aj1IZChwfDAsb3wwLDM2KXwwO2I9YnxDO0I9R2QocHwwLG98MCwzNCl8MDtIPUM7RT1IZChwfDAsb3wwLDMwKXwwO0g9Yl4oSHxDKTtiPUdkKHB8MCxvfDAsMzkpfDA7QT1DO0k9SGQocHwwLG98MCwyNSl8MDtBPURkKCh2fHMpJnB8diZzfDAsKHV8cikmb3x1JnJ8MCwoZnxqKV4oQnxFKV4oYnxJKXwwLEheKEF8Qyl8MCl8MDtIPUM7eD1EZCh5fDAseHwwLG18MCxsfDApfDA7eT1DO2w9RGQoQXwwLEh8MCxtfDAsbHwwKXwwO209QztIPUdkKHh8MCx5fDAsMTQpfDA7QT1DO0k9SGQoeHwwLHl8MCw1MCl8MDtBPUF8QztiPUdkKHh8MCx5fDAsMTgpfDA7RT1DO0I9SGQoeHwwLHl8MCw0Nil8MDtFPUFeKEV8Qyk7QT1HZCh4fDAseXwwLDQxKXwwO2o9QztmPUhkKHh8MCx5fDAsMjMpfDA7aj1FXihqfEMpO0U9Zys0MzJ8MDtLPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0o9RGQoR3wwLEp8MCwyMDAzMDM0OTk1LDE1MzcwMDIwNjMpfDA7RT1EZChKfDAsQ3wwLEt8MCxFfDApfDA7aj1EZChFfDAsQ3wwLChIfEkpXihifEIpXihBfGYpfDAsanwwKXwwO2o9RGQoanwwLEN8MCwoTV5MKSZ4Xk18MCwoRF5GKSZ5XkR8MCl8MDtmPUM7QT1HZChsfDAsbXwwLDI4KXwwO0I9QztiPUhkKGx8MCxtfDAsMzYpfDA7Qj1CfEM7ST1HZChsfDAsbXwwLDM0KXwwO0g9QztFPUhkKGx8MCxtfDAsMzApfDA7SD1CXihIfEMpO0I9R2QobHwwLG18MCwzOSl8MDtLPUM7Sj1IZChsfDAsbXwwLDI1KXwwO0s9RGQoKHN8cCkmbHxzJnB8MCwocnxvKSZtfHImb3wwLChBfGIpXihJfEUpXihCfEopfDAsSF4oS3xDKXwwKXwwO0g9Qzt1PURkKHZ8MCx1fDAsanwwLGZ8MCl8MDt2PUM7Zj1EZChLfDAsSHwwLGp8MCxmfDApfDA7aj1DO0g9R2QodXwwLHZ8MCwxNCl8MDtLPUM7Sj1IZCh1fDAsdnwwLDUwKXwwO0s9S3xDO0I9R2QodXwwLHZ8MCwxOCl8MDtFPUM7ST1IZCh1fDAsdnwwLDQ2KXwwO0U9S14oRXxDKTtLPUdkKHV8MCx2fDAsNDEpfDA7Yj1DO0E9SGQodXwwLHZ8MCwyMyl8MDtiPUVeKGJ8Qyk7RT1nKzQ0MHwwO0c9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7RD1EZChNfDAsRHwwLC02OTI5MzAzOTcsMTc0Nzg3Mzc3OSl8MDtFPURkKER8MCxDfDAsR3wwLEV8MCl8MDtiPURkKEV8MCxDfDAsKEh8SileKEJ8SSleKEt8QSl8MCxifDApfDA7Yj1EZChifDAsQ3wwLChMXngpJnVeTHwwLChGXnkpJnZeRnwwKXwwO0E9QztLPUdkKGZ8MCxqfDAsMjgpfDA7ST1DO0I9SGQoZnwwLGp8MCwzNil8MDtJPUl8QztKPUdkKGZ8MCxqfDAsMzQpfDA7SD1DO0U9SGQoZnwwLGp8MCwzMCl8MDtIPUleKEh8Qyk7ST1HZChmfDAsanwwLDM5KXwwO0c9QztEPUhkKGZ8MCxqfDAsMjUpfDA7Rz1EZCgocHxsKSZmfHAmbHwwLChvfG0pJmp8byZtfDAsKEt8QileKEp8RSleKEl8RCl8MCxIXihHfEMpfDApfDA7SD1DO3I9RGQoc3wwLHJ8MCxifDAsQXwwKXwwO3M9QztBPURkKEd8MCxIfDAsYnwwLEF8MCl8MDtiPUM7SD1HZChyfDAsc3wwLDE0KXwwO0c9QztEPUhkKHJ8MCxzfDAsNTApfDA7Rz1HfEM7ST1HZChyfDAsc3wwLDE4KXwwO0U9QztKPUhkKHJ8MCxzfDAsNDYpfDA7RT1HXihFfEMpO0c9R2QocnwwLHN8MCw0MSl8MDtCPUM7Sz1IZChyfDAsc3wwLDIzKXwwO0I9RV4oQnxDKTtFPWcrNDQ4fDA7TT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtGPURkKEx8MCxGfDAsMTU3NTk5MDAxMiwxOTU1NTYyMjIyKXwwO0U9RGQoRnwwLEN8MCxNfDAsRXwwKXwwO0I9RGQoRXwwLEN8MCwoSHxEKV4oSXxKKV4oR3xLKXwwLEJ8MCl8MDtCPURkKEJ8MCxDfDAsKHhedSkmcl54fDAsKHledikmc155fDApfDA7Sz1DO0c9R2QoQXwwLGJ8MCwyOCl8MDtKPUM7ST1IZChBfDAsYnwwLDM2KXwwO0o9SnxDO0Q9R2QoQXwwLGJ8MCwzNCl8MDtIPUM7RT1IZChBfDAsYnwwLDMwKXwwO0g9Sl4oSHxDKTtKPUdkKEF8MCxifDAsMzkpfDA7TT1DO0Y9SGQoQXwwLGJ8MCwyNSl8MDtNPURkKChsfGYpJkF8bCZmfDAsKG18aikmYnxtJmp8MCwoR3xJKV4oRHxFKV4oSnxGKXwwLEheKE18Qyl8MCl8MDtIPUM7bz1EZChwfDAsb3wwLEJ8MCxLfDApfDA7cD1DO0s9RGQoTXwwLEh8MCxCfDAsS3wwKXwwO0I9QztIPUdkKG98MCxwfDAsMTQpfDA7TT1DO0Y9SGQob3wwLHB8MCw1MCl8MDtNPU18QztKPUdkKG98MCxwfDAsMTgpfDA7RT1DO0Q9SGQob3wwLHB8MCw0Nil8MDtFPU1eKEV8Qyk7TT1HZChvfDAscHwwLDQxKXwwO0k9QztHPUhkKG98MCxwfDAsMjMpfDA7ST1FXihJfEMpO0U9Zys0NTZ8MDtMPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3k9RGQoeHwwLHl8MCwxMTI1NTkyOTI4LDIwMjQxMDQ4MTUpfDA7RT1EZCh5fDAsQ3wwLEx8MCxFfDApfDA7ST1EZChFfDAsQ3wwLChIfEYpXihKfEQpXihNfEcpfDAsSXwwKXwwO0k9RGQoSXwwLEN8MCwodV5yKSZvXnV8MCwodl5zKSZwXnZ8MCl8MDtHPUM7TT1HZChLfDAsQnwwLDI4KXwwO0Q9QztKPUhkKEt8MCxCfDAsMzYpfDA7RD1EfEM7Rj1HZChLfDAsQnwwLDM0KXwwO0g9QztFPUhkKEt8MCxCfDAsMzApfDA7SD1EXihIfEMpO0Q9R2QoS3wwLEJ8MCwzOSl8MDtMPUM7eT1IZChLfDAsQnwwLDI1KXwwO0w9RGQoKGZ8QSkmS3xmJkF8MCwoanxiKSZCfGomYnwwLChNfEopXihGfEUpXihEfHkpfDAsSF4oTHxDKXwwKXwwO0g9QzttPURkKGx8MCxtfDAsSXwwLEd8MCl8MDtsPUM7Rz1EZChMfDAsSHwwLEl8MCxHfDApfDA7ST1DO0g9R2QobXwwLGx8MCwxNCl8MDtMPUM7eT1IZChtfDAsbHwwLDUwKXwwO0w9THxDO0Q9R2QobXwwLGx8MCwxOCl8MDtFPUM7Rj1IZChtfDAsbHwwLDQ2KXwwO0U9TF4oRXxDKTtMPUdkKG18MCxsfDAsNDEpfDA7Sj1DO009SGQobXwwLGx8MCwyMyl8MDtKPUVeKEp8Qyk7RT1nKzQ2NHwwO3g9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7dj1EZCh1fDAsdnwwLC0xNTc4MDYyOTkwLC0yMDY3MjM2ODQ0KXwwO0U9RGQodnwwLEN8MCx4fDAsRXwwKXwwO0o9RGQoRXwwLEN8MCwoSHx5KV4oRHxGKV4oTHxNKXwwLEp8MCl8MDtKPURkKEp8MCxDfDAsKHJebykmbV5yfDAsKHNecCkmbF5zfDApfDA7TT1DO0w9R2QoR3wwLEl8MCwyOCl8MDtGPUM7RD1IZChHfDAsSXwwLDM2KXwwO0Y9RnxDO3k9R2QoR3wwLEl8MCwzNCl8MDtIPUM7RT1IZChHfDAsSXwwLDMwKXwwO0g9Rl4oSHxDKTtGPUdkKEd8MCxJfDAsMzkpfDA7eD1DO3Y9SGQoR3wwLEl8MCwyNSl8MDt4PURkKChBfEspJkd8QSZLfDAsKGJ8QikmSXxiJkJ8MCwoTHxEKV4oeXxFKV4oRnx2KXwwLEheKHh8Qyl8MCl8MDtIPUM7aj1EZChmfDAsanwwLEp8MCxNfDApfDA7Zj1DO009RGQoeHwwLEh8MCxKfDAsTXwwKXwwO0o9QztIPUdkKGp8MCxmfDAsMTQpfDA7eD1DO3Y9SGQoanwwLGZ8MCw1MCl8MDt4PXh8QztGPUdkKGp8MCxmfDAsMTgpfDA7RT1DO3k9SGQoanwwLGZ8MCw0Nil8MDtFPXheKEV8Qyk7eD1HZChqfDAsZnwwLDQxKXwwO0Q9QztMPUhkKGp8MCxmfDAsMjMpfDA7RD1FXihEfEMpO0U9Zys0NzJ8MDt1PWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3M9RGQocnwwLHN8MCw0NDI3NzYwNDQsLTE5MzMxMTQ4NzIpfDA7RT1EZChzfDAsQ3wwLHV8MCxFfDApfDA7RD1EZChFfDAsQ3wwLChIfHYpXihGfHkpXih4fEwpfDAsRHwwKXwwO0Q9RGQoRHwwLEN8MCwob15tKSZqXm98MCwocF5sKSZmXnB8MCl8MDtMPUM7eD1HZChNfDAsSnwwLDI4KXwwO3k9QztGPUhkKE18MCxKfDAsMzYpfDA7eT15fEM7dj1HZChNfDAsSnwwLDM0KXwwO0g9QztFPUhkKE18MCxKfDAsMzApfDA7SD15XihIfEMpO3k9R2QoTXwwLEp8MCwzOSl8MDt1PUM7cz1IZChNfDAsSnwwLDI1KXwwO3U9RGQoKEt8RykmTXxLJkd8MCwoQnxJKSZKfEImSXwwLCh4fEYpXih2fEUpXih5fHMpfDAsSF4odXxDKXwwKXwwO0g9QztiPURkKEF8MCxifDAsRHwwLEx8MCl8MDtBPUM7TD1EZCh1fDAsSHwwLER8MCxMfDApfDA7RD1DO0g9R2QoYnwwLEF8MCwxNCl8MDt1PUM7cz1IZChifDAsQXwwLDUwKXwwO3U9dXxDO3k9R2QoYnwwLEF8MCwxOCl8MDtFPUM7dj1IZChifDAsQXwwLDQ2KXwwO0U9dV4oRXxDKTt1PUdkKGJ8MCxBfDAsNDEpfDA7Rj1DO3g9SGQoYnwwLEF8MCwyMyl8MDtGPUVeKEZ8Qyk7RT1nKzQ4MHwwO3I9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7cD1EZChvfDAscHwwLDU5MzY5ODM0NCwtMTg2NjUzMDgyMil8MDtFPURkKHB8MCxDfDAscnwwLEV8MCl8MDtGPURkKEV8MCxDfDAsKEh8cyleKHl8dileKHV8eCl8MCxGfDApfDA7Rj1EZChGfDAsQ3wwLChtXmopJmJebXwwLChsXmYpJkFebHwwKXwwO3g9Qzt1PUdkKEx8MCxEfDAsMjgpfDA7dj1DO3k9SGQoTHwwLER8MCwzNil8MDt2PXZ8QztzPUdkKEx8MCxEfDAsMzQpfDA7SD1DO0U9SGQoTHwwLER8MCwzMCl8MDtIPXZeKEh8Qyk7dj1HZChMfDAsRHwwLDM5KXwwO3I9QztwPUhkKEx8MCxEfDAsMjUpfDA7cj1EZCgoR3xNKSZMfEcmTXwwLChJfEopJkR8SSZKfDAsKHV8eSleKHN8RSleKHZ8cCl8MCxIXihyfEMpfDApfDA7SD1DO0I9RGQoS3wwLEJ8MCxGfDAseHwwKXwwO0s9Qzt4PURkKHJ8MCxIfDAsRnwwLHh8MCl8MDtGPUM7SD1HZChCfDAsS3wwLDE0KXwwO3I9QztwPUhkKEJ8MCxLfDAsNTApfDA7cj1yfEM7dj1HZChCfDAsS3wwLDE4KXwwO0U9QztzPUhkKEJ8MCxLfDAsNDYpfDA7RT1yXihFfEMpO3I9R2QoQnwwLEt8MCw0MSl8MDt5PUM7dT1IZChCfDAsS3wwLDIzKXwwO3k9RV4oeXxDKTtFPWcrNDg4fDA7bz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtsPURkKG18MCxsfDAsLTU2MTg1NzA0NywtMTUzODIzMzEwOSl8MDtFPURkKGx8MCxDfDAsb3wwLEV8MCl8MDt5PURkKEV8MCxDfDAsKEh8cCleKHZ8cyleKHJ8dSl8MCx5fDApfDA7eT1EZCh5fDAsQ3wwLChqXmIpJkJeanwwLChmXkEpJkteZnwwKXwwO3U9QztyPUdkKHh8MCxGfDAsMjgpfDA7cz1DO3Y9SGQoeHwwLEZ8MCwzNil8MDtzPXN8QztwPUdkKHh8MCxGfDAsMzQpfDA7SD1DO0U9SGQoeHwwLEZ8MCwzMCl8MDtIPXNeKEh8Qyk7cz1HZCh4fDAsRnwwLDM5KXwwO289QztsPUhkKHh8MCxGfDAsMjUpfDA7bz1EZCgoTXxMKSZ4fE0mTHwwLChKfEQpJkZ8SiZEfDAsKHJ8dileKHB8RSleKHN8bCl8MCxIXihvfEMpfDApfDA7SD1DO0k9RGQoR3wwLEl8MCx5fDAsdXwwKXwwO0c9Qzt1PURkKG98MCxIfDAseXwwLHV8MCl8MDt5PUM7SD1HZChJfDAsR3wwLDE0KXwwO289QztsPUhkKEl8MCxHfDAsNTApfDA7bz1vfEM7cz1HZChJfDAsR3wwLDE4KXwwO0U9QztwPUhkKEl8MCxHfDAsNDYpfDA7RT1vXihFfEMpO289R2QoSXwwLEd8MCw0MSl8MDt2PUM7cj1IZChJfDAsR3wwLDIzKXwwO3Y9RV4odnxDKTtFPWcrNDk2fDA7bT1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtmPURkKGp8MCxmfDAsLTEyOTU2MTU3MjMsLTEwOTA5MzU4MTcpfDA7RT1EZChmfDAsQ3wwLG18MCxFfDApfDA7dj1EZChFfDAsQ3wwLChIfGwpXihzfHApXihvfHIpfDAsdnwwKXwwO3Y9RGQodnwwLEN8MCwoYl5CKSZJXmJ8MCwoQV5LKSZHXkF8MCl8MDtyPUM7bz1HZCh1fDAseXwwLDI4KXwwO3A9QztzPUhkKHV8MCx5fDAsMzYpfDA7cD1wfEM7bD1HZCh1fDAseXwwLDM0KXwwO0g9QztFPUhkKHV8MCx5fDAsMzApfDA7SD1wXihIfEMpO3A9R2QodXwwLHl8MCwzOSl8MDttPUM7Zj1IZCh1fDAseXwwLDI1KXwwO209RGQoKEx8eCkmdXxMJnh8MCwoRHxGKSZ5fEQmRnwwLChvfHMpXihsfEUpXihwfGYpfDAsSF4obXxDKXwwKXwwO0g9QztKPURkKE18MCxKfDAsdnwwLHJ8MCl8MDtNPUM7cj1EZChtfDAsSHwwLHZ8MCxyfDApfDA7dj1DO0g9R2QoSnwwLE18MCwxNCl8MDttPUM7Zj1IZChKfDAsTXwwLDUwKXwwO209bXxDO3A9R2QoSnwwLE18MCwxOCl8MDtFPUM7bD1IZChKfDAsTXwwLDQ2KXwwO0U9bV4oRXxDKTttPUdkKEp8MCxNfDAsNDEpfDA7cz1DO289SGQoSnwwLE18MCwyMyl8MDtzPUVeKHN8Qyk7RT1nKzUwNHwwO2o9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7QT1EZChifDAsQXwwLC00NzkwNDY4NjksLTk2NTY0MTk5OCl8MDtFPURkKEF8MCxDfDAsanwwLEV8MCl8MDtzPURkKEV8MCxDfDAsKEh8ZileKHB8bCleKG18byl8MCxzfDApfDA7cz1EZChzfDAsQ3wwLChCXkkpJkpeQnwwLChLXkcpJk1eS3wwKXwwO289QzttPUdkKHJ8MCx2fDAsMjgpfDA7bD1DO3A9SGQocnwwLHZ8MCwzNil8MDtsPWx8QztmPUdkKHJ8MCx2fDAsMzQpfDA7SD1DO0U9SGQocnwwLHZ8MCwzMCl8MDtIPWxeKEh8Qyk7bD1HZChyfDAsdnwwLDM5KXwwO2o9QztBPUhkKHJ8MCx2fDAsMjUpfDA7aj1EZCgoeHx1KSZyfHgmdXwwLChGfHkpJnZ8RiZ5fDAsKG18cCleKGZ8RSleKGx8QSl8MCxIXihqfEMpfDApfDA7SD1DO0Q9RGQoTHwwLER8MCxzfDAsb3wwKXwwO0w9QztvPURkKGp8MCxIfDAsc3wwLG98MCl8MDtzPUM7SD1HZChEfDAsTHwwLDE0KXwwO2o9QztBPUhkKER8MCxMfDAsNTApfDA7aj1qfEM7bD1HZChEfDAsTHwwLDE4KXwwO0U9QztmPUhkKER8MCxMfDAsNDYpfDA7RT1qXihFfEMpO2o9R2QoRHwwLEx8MCw0MSl8MDtwPUM7bT1IZChEfDAsTHwwLDIzKXwwO3A9RV4ocHxDKTtFPWcrNTEyfDA7Yj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtLPURkKEJ8MCxLfDAsLTM2NjU4MzM5NiwtOTAzMzk3NjgyKXwwO0U9RGQoS3wwLEN8MCxifDAsRXwwKXwwO3A9RGQoRXwwLEN8MCwoSHxBKV4obHxmKV4oanxtKXwwLHB8MCl8MDtwPURkKHB8MCxDfDAsKEleSikmRF5JfDAsKEdeTSkmTF5HfDApfDA7bT1DO2o9R2Qob3wwLHN8MCwyOCl8MDtmPUM7bD1IZChvfDAsc3wwLDM2KXwwO2Y9ZnxDO0E9R2Qob3wwLHN8MCwzNCl8MDtIPUM7RT1IZChvfDAsc3wwLDMwKXwwO0g9Zl4oSHxDKTtmPUdkKG98MCxzfDAsMzkpfDA7Yj1DO0s9SGQob3wwLHN8MCwyNSl8MDtiPURkKCh1fHIpJm98dSZyfDAsKHl8dikmc3x5JnZ8MCwoanxsKV4oQXxFKV4oZnxLKXwwLEheKGJ8Qyl8MCl8MDtIPUM7Rj1EZCh4fDAsRnwwLHB8MCxtfDApfDA7eD1DO209RGQoYnwwLEh8MCxwfDAsbXwwKXwwO3A9QztIPUdkKEZ8MCx4fDAsMTQpfDA7Yj1DO0s9SGQoRnwwLHh8MCw1MCl8MDtiPWJ8QztmPUdkKEZ8MCx4fDAsMTgpfDA7RT1DO0E9SGQoRnwwLHh8MCw0Nil8MDtFPWJeKEV8Qyk7Yj1HZChGfDAseHwwLDQxKXwwO2w9QztqPUhkKEZ8MCx4fDAsMjMpfDA7bD1FXihsfEMpO0U9Zys1MjB8MDtCPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0c9RGQoSXwwLEd8MCw1NjYyODA3MTEsLTc3OTcwMDAyNSl8MDtFPURkKEd8MCxDfDAsQnwwLEV8MCl8MDtsPURkKEV8MCxDfDAsKEh8SyleKGZ8QSleKGJ8ail8MCxsfDApfDA7bD1EZChsfDAsQ3wwLChKXkQpJkZeSnwwLChNXkwpJnheTXwwKXwwO2o9QztiPUdkKG18MCxwfDAsMjgpfDA7QT1DO2Y9SGQobXwwLHB8MCwzNil8MDtBPUF8QztLPUdkKG18MCxwfDAsMzQpfDA7SD1DO0U9SGQobXwwLHB8MCwzMCl8MDtIPUFeKEh8Qyk7QT1HZChtfDAscHwwLDM5KXwwO0I9QztHPUhkKG18MCxwfDAsMjUpfDA7Qj1EZCgocnxvKSZtfHImb3wwLCh2fHMpJnB8diZzfDAsKGJ8ZileKEt8RSleKEF8Ryl8MCxIXihCfEMpfDApfDA7SD1DO3k9RGQodXwwLHl8MCxsfDAsanwwKXwwO3U9QztqPURkKEJ8MCxIfDAsbHwwLGp8MCl8MDtsPUM7SD1HZCh5fDAsdXwwLDE0KXwwO0I9QztHPUhkKHl8MCx1fDAsNTApfDA7Qj1CfEM7QT1HZCh5fDAsdXwwLDE4KXwwO0U9QztLPUhkKHl8MCx1fDAsNDYpfDA7RT1CXihFfEMpO0I9R2QoeXwwLHV8MCw0MSl8MDtmPUM7Yj1IZCh5fDAsdXwwLDIzKXwwO2Y9RV4oZnxDKTtFPWcrNTI4fDA7ST1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtNPURkKEp8MCxNfDAsLTg0MDg5Nzc2MiwtMzU0Nzc5NjkwKXwwO0U9RGQoTXwwLEN8MCxJfDAsRXwwKXwwO2Y9RGQoRXwwLEN8MCwoSHxHKV4oQXxLKV4oQnxiKXwwLGZ8MCl8MDtmPURkKGZ8MCxDfDAsKEReRikmeV5EfDAsKExeeCkmdV5MfDApfDA7Yj1DO0I9R2QoanwwLGx8MCwyOCl8MDtLPUM7QT1IZChqfDAsbHwwLDM2KXwwO0s9S3xDO0c9R2QoanwwLGx8MCwzNCl8MDtIPUM7RT1IZChqfDAsbHwwLDMwKXwwO0g9S14oSHxDKTtLPUdkKGp8MCxsfDAsMzkpfDA7ST1DO009SGQoanwwLGx8MCwyNSl8MDtJPURkKChvfG0pJmp8byZtfDAsKHN8cCkmbHxzJnB8MCwoQnxBKV4oR3xFKV4oS3xNKXwwLEheKEl8Qyl8MCl8MDtIPUM7dj1EZChyfDAsdnwwLGZ8MCxifDApfDA7cj1DO2I9RGQoSXwwLEh8MCxmfDAsYnwwKXwwO2Y9QztIPUdkKHZ8MCxyfDAsMTQpfDA7ST1DO009SGQodnwwLHJ8MCw1MCl8MDtJPUl8QztLPUdkKHZ8MCxyfDAsMTgpfDA7RT1DO0c9SGQodnwwLHJ8MCw0Nil8MDtFPUleKEV8Qyk7ST1HZCh2fDAscnwwLDQxKXwwO0E9QztCPUhkKHZ8MCxyfDAsMjMpfDA7QT1FXihBfEMpO0U9Zys1MzZ8MDtKPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0w9RGQoRHwwLEx8MCwtMjk0NzI3MzA0LC0xNzYzMzcwMjUpfDA7RT1EZChMfDAsQ3wwLEp8MCxFfDApfDA7QT1EZChFfDAsQ3wwLChIfE0pXihLfEcpXihJfEIpfDAsQXwwKXwwO0E9RGQoQXwwLEN8MCwoRl55KSZ2XkZ8MCwoeF51KSZyXnh8MCl8MDtCPUM7ST1HZChifDAsZnwwLDI4KXwwO0c9QztLPUhkKGJ8MCxmfDAsMzYpfDA7Rz1HfEM7TT1HZChifDAsZnwwLDM0KXwwO0g9QztFPUhkKGJ8MCxmfDAsMzApfDA7SD1HXihIfEMpO0c9R2QoYnwwLGZ8MCwzOSl8MDtKPUM7TD1IZChifDAsZnwwLDI1KXwwO0o9RGQoKG18aikmYnxtJmp8MCwocHxsKSZmfHAmbHwwLChJfEspXihNfEUpXihHfEwpfDAsSF4oSnxDKXwwKXwwO0g9QztzPURkKG98MCxzfDAsQXwwLEJ8MCl8MDtvPUM7Qj1EZChKfDAsSHwwLEF8MCxCfDApfDA7QT1DO0g9R2Qoc3wwLG98MCwxNCl8MDtKPUM7TD1IZChzfDAsb3wwLDUwKXwwO0o9SnxDO0c9R2Qoc3wwLG98MCwxOCl8MDtFPUM7TT1IZChzfDAsb3wwLDQ2KXwwO0U9Sl4oRXxDKTtKPUdkKHN8MCxvfDAsNDEpfDA7Sz1DO0k9SGQoc3wwLG98MCwyMyl8MDtLPUVeKEt8Qyk7RT1nKzU0NHwwO0Q9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7eD1EZChGfDAseHwwLDE5MTQxMzg1NTQsMTE2NDE4NDc0KXwwO0U9RGQoeHwwLEN8MCxEfDAsRXwwKXwwO0s9RGQoRXwwLEN8MCwoSHxMKV4oR3xNKV4oSnxJKXwwLEt8MCl8MDtLPURkKEt8MCxDfDAsKHledikmc155fDAsKHVecikmb151fDApfDA7ST1DO0o9R2QoQnwwLEF8MCwyOCl8MDtNPUM7Rz1IZChCfDAsQXwwLDM2KXwwO009TXxDO0w9R2QoQnwwLEF8MCwzNCl8MDtIPUM7RT1IZChCfDAsQXwwLDMwKXwwO0g9TV4oSHxDKTtNPUdkKEJ8MCxBfDAsMzkpfDA7RD1DO3g9SGQoQnwwLEF8MCwyNSl8MDtEPURkKChqfGIpJkJ8aiZifDAsKGx8ZikmQXxsJmZ8MCwoSnxHKV4oTHxFKV4oTXx4KXwwLEheKER8Qyl8MCl8MDtIPUM7cD1EZChtfDAscHwwLEt8MCxJfDApfDA7bT1DO0k9RGQoRHwwLEh8MCxLfDAsSXwwKXwwO0s9QztIPUdkKHB8MCxtfDAsMTQpfDA7RD1DO3g9SGQocHwwLG18MCw1MCl8MDtEPUR8QztNPUdkKHB8MCxtfDAsMTgpfDA7RT1DO0w9SGQocHwwLG18MCw0Nil8MDtFPUReKEV8Qyk7RD1HZChwfDAsbXwwLDQxKXwwO0c9QztKPUhkKHB8MCxtfDAsMjMpfDA7Rz1FXihHfEMpO0U9Zys1NTJ8MDtGPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO3U9RGQoeXwwLHV8MCwtMTU2MzkxMjAyNiwxNzQyOTI0MjEpfDA7RT1EZCh1fDAsQ3wwLEZ8MCxFfDApfDA7Rz1EZChFfDAsQ3wwLChIfHgpXihNfEwpXihEfEopfDAsR3wwKXwwO0c9RGQoR3wwLEN8MCwodl5zKSZwXnZ8MCwocl5vKSZtXnJ8MCl8MDtKPUM7RD1HZChJfDAsS3wwLDI4KXwwO0w9QztNPUhkKEl8MCxLfDAsMzYpfDA7TD1MfEM7eD1HZChJfDAsS3wwLDM0KXwwO0g9QztFPUhkKEl8MCxLfDAsMzApfDA7SD1MXihIfEMpO0w9R2QoSXwwLEt8MCwzOSl8MDtGPUM7dT1IZChJfDAsS3wwLDI1KXwwO0Y9RGQoKGJ8QikmSXxiJkJ8MCwoZnxBKSZLfGYmQXwwLChEfE0pXih4fEUpXihMfHUpfDAsSF4oRnxDKXwwKXwwO0g9QztsPURkKGp8MCxsfDAsR3wwLEp8MCl8MDtqPUM7Sj1EZChGfDAsSHwwLEd8MCxKfDApfDA7Rz1DO0g9R2QobHwwLGp8MCwxNCl8MDtGPUM7dT1IZChsfDAsanwwLDUwKXwwO0Y9RnxDO0w9R2QobHwwLGp8MCwxOCl8MDtFPUM7eD1IZChsfDAsanwwLDQ2KXwwO0U9Rl4oRXxDKTtGPUdkKGx8MCxqfDAsNDEpfDA7TT1DO0Q9SGQobHwwLGp8MCwyMyl8MDtNPUVeKE18Qyk7RT1nKzU2MHwwO3k9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7cj1EZCh2fDAscnwwLC0xMDkwOTc0MjkwLDI4OTM4MDM1Nil8MDtFPURkKHJ8MCxDfDAseXwwLEV8MCl8MDtNPURkKEV8MCxDfDAsKEh8dSleKEx8eCleKEZ8RCl8MCxNfDApfDA7TT1EZChNfDAsQ3wwLChzXnApJmxec3wwLChvXm0pJmpeb3wwKXwwO0Q9QztGPUdkKEp8MCxHfDAsMjgpfDA7eD1DO0w9SGQoSnwwLEd8MCwzNil8MDt4PXh8Qzt1PUdkKEp8MCxHfDAsMzQpfDA7SD1DO0U9SGQoSnwwLEd8MCwzMCl8MDtIPXheKEh8Qyk7eD1HZChKfDAsR3wwLDM5KXwwO3k9QztyPUhkKEp8MCxHfDAsMjUpfDA7eT1EZCgoQnxJKSZKfEImSXwwLChBfEspJkd8QSZLfDAsKEZ8TCleKHV8RSleKHh8cil8MCxIXih5fEMpfDApfDA7SD1DO2Y9RGQoYnwwLGZ8MCxNfDAsRHwwKXwwO2I9QztEPURkKHl8MCxIfDAsTXwwLER8MCl8MDtNPUM7SD1HZChmfDAsYnwwLDE0KXwwO3k9QztyPUhkKGZ8MCxifDAsNTApfDA7eT15fEM7eD1HZChmfDAsYnwwLDE4KXwwO0U9Qzt1PUhkKGZ8MCxifDAsNDYpfDA7RT15XihFfEMpO3k9R2QoZnwwLGJ8MCw0MSl8MDtMPUM7Rj1IZChmfDAsYnwwLDIzKXwwO0w9RV4oTHxDKTtFPWcrNTY4fDA7dj1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtvPURkKHN8MCxvfDAsMzIwNjIwMzE1LDQ2MDM5MzI2OSl8MDtFPURkKG98MCxDfDAsdnwwLEV8MCl8MDtMPURkKEV8MCxDfDAsKEh8cileKHh8dSleKHl8Ril8MCxMfDApfDA7TD1EZChMfDAsQ3wwLChwXmwpJmZecHwwLChtXmopJmJebXwwKXwwO0Y9Qzt5PUdkKER8MCxNfDAsMjgpfDA7dT1DO3g9SGQoRHwwLE18MCwzNil8MDt1PXV8QztyPUdkKER8MCxNfDAsMzQpfDA7SD1DO0U9SGQoRHwwLE18MCwzMCl8MDtIPXVeKEh8Qyk7dT1HZChEfDAsTXwwLDM5KXwwO3Y9QztvPUhkKER8MCxNfDAsMjUpfDA7dj1EZCgoSXxKKSZEfEkmSnwwLChLfEcpJk18SyZHfDAsKHl8eCleKHJ8RSleKHV8byl8MCxIXih2fEMpfDApfDA7SD1DO0E9RGQoQnwwLEF8MCxMfDAsRnwwKXwwO0I9QztGPURkKHZ8MCxIfDAsTHwwLEZ8MCl8MDtMPUM7SD1HZChBfDAsQnwwLDE0KXwwO3Y9QztvPUhkKEF8MCxCfDAsNTApfDA7dj12fEM7dT1HZChBfDAsQnwwLDE4KXwwO0U9QztyPUhkKEF8MCxCfDAsNDYpfDA7RT12XihFfEMpO3Y9R2QoQXwwLEJ8MCw0MSl8MDt4PUM7eT1IZChBfDAsQnwwLDIzKXwwO3g9RV4oeHxDKTtFPWcrNTc2fDA7cz1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDttPURkKHB8MCxtfDAsNTg3NDk2ODM2LDY4NTQ3MTczMyl8MDtFPURkKG18MCxDfDAsc3wwLEV8MCl8MDt4PURkKEV8MCxDfDAsKEh8byleKHV8cileKHZ8eSl8MCx4fDApfDA7eD1EZCh4fDAsQ3wwLChsXmYpJkFebHwwLChqXmIpJkJeanwwKXwwO3k9Qzt2PUdkKEZ8MCxMfDAsMjgpfDA7cj1DO3U9SGQoRnwwLEx8MCwzNil8MDtyPXJ8QztvPUdkKEZ8MCxMfDAsMzQpfDA7SD1DO0U9SGQoRnwwLEx8MCwzMCl8MDtIPXJeKEh8Qyk7cj1HZChGfDAsTHwwLDM5KXwwO3M9QzttPUhkKEZ8MCxMfDAsMjUpfDA7cz1EZCgoSnxEKSZGfEomRHwwLChHfE0pJkx8RyZNfDAsKHZ8dSleKG98RSleKHJ8bSl8MCxIXihzfEMpfDApfDA7SD1DO0s9RGQoSXwwLEt8MCx4fDAseXwwKXwwO0k9Qzt5PURkKHN8MCxIfDAseHwwLHl8MCl8MDt4PUM7SD1HZChLfDAsSXwwLDE0KXwwO3M9QzttPUhkKEt8MCxJfDAsNTApfDA7cz1zfEM7cj1HZChLfDAsSXwwLDE4KXwwO0U9QztvPUhkKEt8MCxJfDAsNDYpfDA7RT1zXihFfEMpO3M9R2QoS3wwLEl8MCw0MSl8MDt1PUM7dj1IZChLfDAsSXwwLDIzKXwwO3U9RV4odXxDKTtFPWcrNTg0fDA7cD1jW0U+PjJdfDA7RT1jW0UrND4+Ml18MDtqPURkKGx8MCxqfDAsMTA4Njc5Mjg1MSw4NTIxNDI5NzEpfDA7RT1EZChqfDAsQ3wwLHB8MCxFfDApfDA7dT1EZChFfDAsQ3wwLChIfG0pXihyfG8pXihzfHYpfDAsdXwwKXwwO3U9RGQodXwwLEN8MCwoZl5BKSZLXmZ8MCwoYl5CKSZJXmJ8MCl8MDt2PUM7cz1HZCh5fDAseHwwLDI4KXwwO289QztyPUhkKHl8MCx4fDAsMzYpfDA7bz1vfEM7bT1HZCh5fDAseHwwLDM0KXwwO0g9QztFPUhkKHl8MCx4fDAsMzApfDA7SD1vXihIfEMpO289R2QoeXwwLHh8MCwzOSl8MDtwPUM7aj1IZCh5fDAseHwwLDI1KXwwO3A9RGQoKER8RikmeXxEJkZ8MCwoTXxMKSZ4fE0mTHwwLChzfHIpXihtfEUpXihvfGopfDAsSF4ocHxDKXwwKXwwO0g9QztHPURkKEp8MCxHfDAsdXwwLHZ8MCl8MDtKPUM7dj1EZChwfDAsSHwwLHV8MCx2fDApfDA7dT1DO0g9R2QoR3wwLEp8MCwxNCl8MDtwPUM7aj1IZChHfDAsSnwwLDUwKXwwO3A9cHxDO289R2QoR3wwLEp8MCwxOCl8MDtFPUM7bT1IZChHfDAsSnwwLDQ2KXwwO0U9cF4oRXxDKTtwPUdkKEd8MCxKfDAsNDEpfDA7cj1DO3M9SGQoR3wwLEp8MCwyMyl8MDtyPUVeKHJ8Qyk7RT1nKzU5MnwwO2w9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Yj1EZChmfDAsYnwwLDM2NTU0MzEwMCwxMDE3MDM2Mjk4KXwwO0U9RGQoYnwwLEN8MCxsfDAsRXwwKXwwO3I9RGQoRXwwLEN8MCwoSHxqKV4ob3xtKV4ocHxzKXwwLHJ8MCl8MDtyPURkKHJ8MCxDfDAsKEFeSykmR15BfDAsKEJeSSkmSl5CfDApfDA7cz1DO3A9R2QodnwwLHV8MCwyOCl8MDttPUM7bz1IZCh2fDAsdXwwLDM2KXwwO209bXxDO2o9R2QodnwwLHV8MCwzNCl8MDtIPUM7RT1IZCh2fDAsdXwwLDMwKXwwO0g9bV4oSHxDKTttPUdkKHZ8MCx1fDAsMzkpfDA7bD1DO2I9SGQodnwwLHV8MCwyNSl8MDtsPURkKChGfHkpJnZ8RiZ5fDAsKEx8eCkmdXxMJnh8MCwocHxvKV4oanxFKV4obXxiKXwwLEheKGx8Qyl8MCl8MDtIPUM7TT1EZChEfDAsTXwwLHJ8MCxzfDApfDA7RD1DO3M9RGQobHwwLEh8MCxyfDAsc3wwKXwwO3I9QztIPUdkKE18MCxEfDAsMTQpfDA7bD1DO2I9SGQoTXwwLER8MCw1MCl8MDtsPWx8QzttPUdkKE18MCxEfDAsMTgpfDA7RT1DO2o9SGQoTXwwLER8MCw0Nil8MDtFPWxeKEV8Qyk7bD1HZChNfDAsRHwwLDQxKXwwO289QztwPUhkKE18MCxEfDAsMjMpfDA7bz1FXihvfEMpO0U9Zys2MDB8MDtmPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0I9RGQoQXwwLEJ8MCwtMTY3NjY2OTYyMCwxMTI2MDAwNTgwKXwwO0U9RGQoQnwwLEN8MCxmfDAsRXwwKXwwO289RGQoRXwwLEN8MCwoSHxiKV4obXxqKV4obHxwKXwwLG98MCl8MDtvPURkKG98MCxDfDAsKEteRykmTV5LfDAsKEleSikmRF5JfDApfDA7cD1DO2w9R2Qoc3wwLHJ8MCwyOCl8MDtqPUM7bT1IZChzfDAscnwwLDM2KXwwO2o9anxDO2I9R2Qoc3wwLHJ8MCwzNCl8MDtIPUM7RT1IZChzfDAscnwwLDMwKXwwO0g9al4oSHxDKTtqPUdkKHN8MCxyfDAsMzkpfDA7Zj1DO0I9SGQoc3wwLHJ8MCwyNSl8MDtmPURkKCh5fHYpJnN8eSZ2fDAsKHh8dSkmcnx4JnV8MCwobHxtKV4oYnxFKV4oanxCKXwwLEheKGZ8Qyl8MCl8MDtIPUM7TD1EZChGfDAsTHwwLG98MCxwfDApfDA7Rj1DO3A9RGQoZnwwLEh8MCxvfDAscHwwKXwwO289QztIPUdkKEx8MCxGfDAsMTQpfDA7Zj1DO0I9SGQoTHwwLEZ8MCw1MCl8MDtmPWZ8QztqPUdkKEx8MCxGfDAsMTgpfDA7RT1DO2I9SGQoTHwwLEZ8MCw0Nil8MDtFPWZeKEV8Qyk7Zj1HZChMfDAsRnwwLDQxKXwwO209QztsPUhkKEx8MCxGfDAsMjMpfDA7bT1FXihtfEMpO0U9Zys2MDh8MDtBPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0k9RGQoS3wwLEl8MCwtODg1MTEyMTM4LDEyODgwMzM0NzApfDA7RT1EZChJfDAsQ3wwLEF8MCxFfDApfDA7bT1EZChFfDAsQ3wwLChIfEIpXihqfGIpXihmfGwpfDAsbXwwKXwwO209RGQobXwwLEN8MCwoR15NKSZMXkd8MCwoSl5EKSZGXkp8MCl8MDtsPUM7Zj1HZChwfDAsb3wwLDI4KXwwO2I9QztqPUhkKHB8MCxvfDAsMzYpfDA7Yj1ifEM7Qj1HZChwfDAsb3wwLDM0KXwwO0g9QztFPUhkKHB8MCxvfDAsMzApfDA7SD1iXihIfEMpO2I9R2QocHwwLG98MCwzOSl8MDtBPUM7ST1IZChwfDAsb3wwLDI1KXwwO0E9RGQoKHZ8cykmcHx2JnN8MCwodXxyKSZvfHUmcnwwLChmfGopXihCfEUpXihifEkpfDAsSF4oQXxDKXwwKXwwO0g9Qzt4PURkKHl8MCx4fDAsbXwwLGx8MCl8MDt5PUM7bD1EZChBfDAsSHwwLG18MCxsfDApfDA7bT1DO0g9R2QoeHwwLHl8MCwxNCl8MDtBPUM7ST1IZCh4fDAseXwwLDUwKXwwO0E9QXxDO2I9R2QoeHwwLHl8MCwxOCl8MDtFPUM7Qj1IZCh4fDAseXwwLDQ2KXwwO0U9QV4oRXxDKTtBPUdkKHh8MCx5fDAsNDEpfDA7aj1DO2Y9SGQoeHwwLHl8MCwyMyl8MDtqPUVeKGp8Qyk7RT1nKzYxNnwwO0s9Y1tFPj4yXXwwO0U9Y1tFKzQ+PjJdfDA7Sj1EZChHfDAsSnwwLC02MDQ1NzQzMCwxNTAxNTA1OTQ4KXwwO0U9RGQoSnwwLEN8MCxLfDAsRXwwKXwwO2o9RGQoRXwwLEN8MCwoSHxJKV4oYnxCKV4oQXxmKXwwLGp8MCl8MDtqPURkKGp8MCxDfDAsKE1eTCkmeF5NfDAsKEReRikmeV5EfDApfDA7Zj1DO0E9R2QobHwwLG18MCwyOCl8MDtCPUM7Yj1IZChsfDAsbXwwLDM2KXwwO0I9QnxDO0k9R2QobHwwLG18MCwzNCl8MDtIPUM7RT1IZChsfDAsbXwwLDMwKXwwO0g9Ql4oSHxDKTtCPUdkKGx8MCxtfDAsMzkpfDA7Sz1DO0o9SGQobHwwLG18MCwyNSl8MDtLPURkKChzfHApJmx8cyZwfDAsKHJ8bykmbXxyJm98MCwoQXxiKV4oSXxFKV4oQnxKKXwwLEheKEt8Qyl8MCl8MDtIPUM7dT1EZCh2fDAsdXwwLGp8MCxmfDApfDA7dj1DO2Y9RGQoS3wwLEh8MCxqfDAsZnwwKXwwO2o9QztIPUdkKHV8MCx2fDAsMTQpfDA7Sz1DO0o9SGQodXwwLHZ8MCw1MCl8MDtLPUt8QztCPUdkKHV8MCx2fDAsMTgpfDA7RT1DO0k9SGQodXwwLHZ8MCw0Nil8MDtFPUteKEV8Qyk7Sz1HZCh1fDAsdnwwLDQxKXwwO2I9QztBPUhkKHV8MCx2fDAsMjMpfDA7Yj1FXihifEMpO0U9Zys2MjR8MDtHPWNbRT4+Ml18MDtFPWNbRSs0Pj4yXXwwO0Q9RGQoTXwwLER8MCw5ODcxNjc0NjgsMTYwNzE2NzkxNSl8MDtFPURkKER8MCxDfDAsR3wwLEV8MCl8MDtiPURkKEV8MCxDfDAsKEh8SileKEJ8SSleKEt8QSl8MCxifDApfDA7Yj1EZChifDAsQ3wwLChMXngpJnVeTHwwLChGXnkpJnZeRnwwKXwwO0E9QztLPUdkKGZ8MCxqfDAsMjgpfDA7ST1DO0I9SGQoZnwwLGp8MCwzNil8MDtJPUl8QztKPUdkKGZ8MCxqfDAsMzQpfDA7SD1DO0U9SGQoZnwwLGp8MCwzMCl8MDtIPUleKEh8Qyk7ST1HZChmfDAsanwwLDM5KXwwO0c9QztEPUhkKGZ8MCxqfDAsMjUpfDA7Rz1EZCgocHxsKSZmfHAmbHwwLChvfG0pJmp8byZtfDAsKEt8QileKEp8RSleKEl8RCl8MCxIXihHfEMpfDApfDA7SD1DO3I9RGQoc3wwLHJ8MCxifDAsQXwwKXwwO3M9QztBPURkKEd8MCxIfDAsYnwwLEF8MCl8MDtiPUM7SD1HZChyfDAsc3wwLDE0KXwwO0c9QztEPUhkKHJ8MCxzfDAsNTApfDA7Rz1HfEM7ST1HZChyfDAsc3wwLDE4KXwwO0U9QztKPUhkKHJ8MCxzfDAsNDYpfDA7RT1HXihFfEMpO0c9R2QocnwwLHN8MCw0MSl8MDtCPUM7Sz1IZChyfDAsc3wwLDIzKXwwO0I9RV4oQnxDKTtnPWcrNjMyfDA7RT1jW2c+PjJdfDA7Zz1jW2crND4+Ml18MDtGPURkKEx8MCxGfDAsMTI0NjE4OTU5MSwxODE2NDAyMzE2KXwwO2c9RGQoRnwwLEN8MCxFfDAsZ3wwKXwwO2c9RGQoZ3wwLEN8MCwoSHxEKV4oSXxKKV4oR3xLKXwwLEJ8MCl8MDtnPURkKGd8MCxDfDAsKHhedSkmcl54fDAsKHledikmc155fDApfDA7Qj1DO0s9R2QoQXwwLGJ8MCwyOCl8MDtHPUM7Sj1IZChBfDAsYnwwLDM2KXwwO0c9R3xDO0k9R2QoQXwwLGJ8MCwzNCl8MDtEPUM7SD1IZChBfDAsYnwwLDMwKXwwO0Q9R14oRHxDKTtHPUdkKEF8MCxifDAsMzkpfDA7RT1DO0Y9SGQoQXwwLGJ8MCwyNSl8MDtFPURkKChsfGYpJkF8bCZmfDAsKG18aikmYnxtJmp8MCwoS3xKKV4oSXxIKV4oR3xGKXwwLEReKEV8Qyl8MCl8MDtEPUM7bz1EZChwfDAsb3wwLGd8MCxCfDApfDA7cD1DO0I9RGQoRXwwLER8MCxnfDAsQnwwKXwwO2c9YTtCPURkKGNbZz4+Ml18MCxjW2crND4+Ml18MCxCfDAsQ3wwKXwwO2c9YTtjW2c+PjJdPUI7Y1tnKzQ+PjJdPUM7Zz1lO2c9RGQoY1tnPj4yXXwwLGNbZys0Pj4yXXwwLEF8MCxifDApfDA7YT1lO2NbYT4+Ml09ZztjW2ErND4+Ml09QzthPWs7aj1EZChjW2E+PjJdfDAsY1thKzQ+PjJdfDAsZnwwLGp8MCl8MDtjW2s+PjJdPWo7Y1trKzQ+PjJdPUM7az1uO209RGQoY1trPj4yXXwwLGNbays0Pj4yXXwwLGx8MCxtfDApfDA7Y1tuPj4yXT1tO2Nbbis0Pj4yXT1DO249cTtwPURkKGNbbj4+Ml18MCxjW24rND4+Ml18MCxvfDAscHwwKXwwO2NbcT4+Ml09cDtjW3ErND4+Ml09QztxPXQ7cz1EZChjW3E+PjJdfDAsY1txKzQ+PjJdfDAscnwwLHN8MCl8MDtjW3Q+PjJdPXM7Y1t0KzQ+PjJdPUM7dD13O3Y9RGQoY1t0Pj4yXXwwLGNbdCs0Pj4yXXwwLHV8MCx2fDApfDA7Y1t3Pj4yXT12O2Nbdys0Pj4yXT1DO3c9ejt5PURkKGNbdz4+Ml18MCxjW3crND4+Ml18MCx4fDAseXwwKXwwO2Nbej4+Ml09eTtjW3orND4+Ml09QztpPWg7cmV0dXJufWZ1bmN0aW9uIEliKCl7cmV0dXJuIDE0NH1mdW5jdGlvbiBKYigpe3JldHVybiAxNn1mdW5jdGlvbiBLYigpe3JldHVybiAzMn1mdW5jdGlvbiBMYihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wO2Y9aTtnPWk9aSs2MyYtNjQ7aT1pKzE0NHwwO1ViKGcsZSk7VGIoZyxiLGMsZCk7UmIoZyxhKTtpPWY7cmV0dXJuIDB9ZnVuY3Rpb24gTWIoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4gUWIoYSxiLGMsZCxlKXwwfWZ1bmN0aW9uIE5iKGEsYil7YT1hfDA7Yj1ifDA7VWIoYSxiKTtyZXR1cm4gMH1mdW5jdGlvbiBPYihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtUYihhLGIsYyxkKTtyZXR1cm4gMH1mdW5jdGlvbiBQYihhLGIpe2E9YXwwO2I9YnwwO1JiKGEsYik7cmV0dXJuIDB9ZnVuY3Rpb24gUWIoYixjLGQsZSxmKXtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTA7aD1pO2c9aT1pKzYzJi02NDtpPWkrMTYwfDA7aj1nO2c9ZysxNDR8MDtVYihqLGYpO1RiKGosYyxkLGUpO1JiKGosZyk7aT1oO3JldHVybiAoKCgoYVtnKzE+PjBdXmFbYisxPj4wXXxhW2c+PjBdXmFbYj4+MF18YVtnKzI+PjBdXmFbYisyPj4wXXxhW2crMz4+MF1eYVtiKzM+PjBdfGFbZys0Pj4wXV5hW2IrND4+MF18YVtnKzU+PjBdXmFbYis1Pj4wXXxhW2crNj4+MF1eYVtiKzY+PjBdfGFbZys3Pj4wXV5hW2IrNz4+MF18YVtnKzg+PjBdXmFbYis4Pj4wXXxhW2crOT4+MF1eYVtiKzk+PjBdfGFbZysxMD4+MF1eYVtiKzEwPj4wXXxhW2crMTE+PjBdXmFbYisxMT4+MF18YVtnKzEyPj4wXV5hW2IrMTI+PjBdfGFbZysxMz4+MF1eYVtiKzEzPj4wXXxhW2crMTQ+PjBdXmFbYisxND4+MF18YVtnKzE1Pj4wXV5hW2IrMTU+PjBdKSYyNTUpKzUxMXwwKT4+PjgmMSkrLTF8MH1mdW5jdGlvbiBSYihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wO2g9Yis1NnwwO2c9Y1toPj4yXXwwO2g9Y1toKzQ+PjJdfDA7aWYoISgoZ3wwKT09MCYoaHwwKT09MCkpe2U9Yis2NHwwO2FbZStnPj4wXT0xO2Y9RGQoZ3wwLGh8MCwxLDApfDA7aT1DO2lmKGk+Pj4wPDB8KGl8MCk9PTAmZj4+PjA8MTYpe2k9Q2QoMTQsMCxnfDAsaHwwKXwwO0ZkKGIrKGYrNjQpfDAsMCxpKzF8MCl8MH1hW2IrODA+PjBdPTE7U2IoYixlLDE2LDApfWk9Y1tiKzI0Pj4yXXwwO3A9KGNbYisyOD4+Ml18MCkrKGk+Pj4yNil8MDtlPXAmNjcxMDg4NjM7bj0ocD4+PjI2KSsoY1tiKzMyPj4yXXwwKXwwO209biY2NzEwODg2MztmPShuPj4+MjYpKyhjW2IrMzY+PjJdfDApfDA7aD0oKGY+Pj4yNikqNXwwKSsoY1tiKzIwPj4yXXwwKXwwO2c9aCY2NzEwODg2MztpPShoPj4+MjYpKyhpJjY3MTA4ODYzKXwwO3I9KChnKzV8MCk+Pj4yNikraXwwO3E9cj4+PjI2O289KHErZXwwKT4+PjI2O2s9KGZ8LTY3MTA4ODY0KSsoKG8rbXwwKT4+PjI2KXwwO2w9KGs+Pj4zMSkrLTF8MDtqPWs+PjMxO2k9ciY2NzEwODg2MyZsfGomaTtlPXErcCY2NzEwODg2MyZsfGomZTttPW8rbiY2NzEwODg2MyZsfGombTtnPURkKGgrNSY2NzEwODg2MyZsfGomZ3xpPDwyNnwwLDAsY1tiKzQwPj4yXXwwLDApfDA7aD1DO2k9RGQoaT4+PjZ8ZTw8MjB8MCwwLGNbYis0ND4+Ml18MCwwKXwwO2g9RGQoaXwwLEN8MCxofDAsMCl8MDtpPUM7ZT1EZChlPj4+MTJ8bTw8MTR8MCwwLGNbYis0OD4+Ml18MCwwKXwwO2k9RGQoZXwwLEN8MCxpfDAsMCl8MDtlPUM7Zj1EZChtPj4+MTh8KGwma3xqJmYpPDw4fDAsMCxjW2IrNTI+PjJdfDAsMCl8MDtlPURkKGZ8MCxDfDAsZXwwLDApfDA7YVtkPj4wXT1nO2FbZCsxPj4wXT1nPj4+ODthW2QrMj4+MF09Zz4+PjE2O2FbZCszPj4wXT1nPj4+MjQ7YVtkKzQ+PjBdPWg7YVtkKzU+PjBdPWg+Pj44O2FbZCs2Pj4wXT1oPj4+MTY7YVtkKzc+PjBdPWg+Pj4yNDthW2QrOD4+MF09aTthW2QrOT4+MF09aT4+Pjg7YVtkKzEwPj4wXT1pPj4+MTY7YVtkKzExPj4wXT1pPj4+MjQ7YVtkKzEyPj4wXT1lO2FbZCsxMz4+MF09ZT4+Pjg7YVtkKzE0Pj4wXT1lPj4+MTY7YVtkKzE1Pj4wXT1lPj4+MjQ7ZT1iKzg4fDA7ZG97YVtiPj4wXT0wO2I9YisxfDB9d2hpbGUoKGJ8MCk8KGV8MCkpO3JldHVybn1mdW5jdGlvbiBTYihiLGUsZixnKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDt2YXIgaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wO3M9KGFbYis4MD4+MF18MCkhPTA/MDoxNjc3NzIxNjt0PWNbYis0Pj4yXXwwO3U9Y1tiKzg+PjJdfDA7bT1jW2IrMTI+PjJdfDA7bj1jW2IrMTY+PjJdfDA7dj1iKzIwfDA7bD1jW3Y+PjJdfDA7dz1iKzI0fDA7az1jW3c+PjJdfDA7eD1iKzI4fDA7aj1jW3g+PjJdfDA7eT1iKzMyfDA7aT1jW3k+PjJdfDA7ej1iKzM2fDA7aD1jW3o+PjJdfDA7aWYoIShnPj4+MD4wfChnfDApPT0wJmY+Pj4wPjE1KSl7cT1sO3I9aztzPWo7dD1pO3U9aDtjW3Y+PjJdPXE7Y1t3Pj4yXT1yO2NbeD4+Ml09cztjW3k+PjJdPXQ7Y1t6Pj4yXT11O3JldHVybn1vPW4qNXwwO3A9bSo1fDA7cT11KjV8MDtyPXQqNXwwO2I9Y1tiPj4yXXwwO3doaWxlKDEpe0o9ZFtlKzM+PjBdfDA7Qj0oZFtlKzE+PjBdPDw4fGRbZT4+MF18ZFtlKzI+PjBdPDwxNnxKPDwyNCY1MDMzMTY0OCkrbHwwO0g9ZFtlKzY+PjBdfDA7Sj0oKGRbZSs0Pj4wXTw8OHxKfGRbZSs1Pj4wXTw8MTZ8SDw8MjQpPj4+MiY2NzEwODg2Mykra3wwO0c9ZFtlKzk+PjBdfDA7SD0oKGRbZSs3Pj4wXTw8OHxIfGRbZSs4Pj4wXTw8MTZ8Rzw8MjQpPj4+NCY2NzEwODg2MykranwwO0c9KChkW2UrMTA+PjBdPDw4fEd8ZFtlKzExPj4wXTw8MTZ8ZFtlKzEyPj4wXTw8MjQpPj4+NikraXwwO2w9KGRbZSsxMz4+MF18c3xkW2UrMTQ+PjBdPDw4fGRbZSsxNT4+MF08PDE2KStofDA7az1PZChCfDAsMCxifDAsMCl8MDtqPUM7QT1PZChKfDAsMCxvfDAsMCl8MDtqPURkKEF8MCxDfDAsa3wwLGp8MCl8MDtrPUM7QT1PZChIfDAsMCxwfDAsMCl8MDtBPURkKGp8MCxrfDAsQXwwLEN8MCl8MDtrPUM7aj1PZChHfDAsMCxxfDAsMCl8MDtqPURkKEF8MCxrfDAsanwwLEN8MCl8MDtrPUM7QT1PZChsfDAsMCxyfDAsMCl8MDtBPURkKGp8MCxrfDAsQXwwLEN8MCl8MDtrPUM7aj1PZChCfDAsMCx0fDAsMCl8MDtpPUM7Rj1PZChKfDAsMCxifDAsMCl8MDtpPURkKEZ8MCxDfDAsanwwLGl8MCl8MDtqPUM7Rj1PZChIfDAsMCxvfDAsMCl8MDtGPURkKGl8MCxqfDAsRnwwLEN8MCl8MDtqPUM7aT1PZChHfDAsMCxwfDAsMCl8MDtpPURkKEZ8MCxqfDAsaXwwLEN8MCl8MDtqPUM7Rj1PZChsfDAsMCxxfDAsMCl8MDtGPURkKGl8MCxqfDAsRnwwLEN8MCl8MDtqPUM7aT1PZChCfDAsMCx1fDAsMCl8MDtoPUM7RT1PZChKfDAsMCx0fDAsMCl8MDtoPURkKEV8MCxDfDAsaXwwLGh8MCl8MDtpPUM7RT1PZChIfDAsMCxifDAsMCl8MDtFPURkKGh8MCxpfDAsRXwwLEN8MCl8MDtpPUM7aD1PZChHfDAsMCxvfDAsMCl8MDtoPURkKEV8MCxpfDAsaHwwLEN8MCl8MDtpPUM7RT1PZChsfDAsMCxwfDAsMCl8MDtFPURkKGh8MCxpfDAsRXwwLEN8MCl8MDtpPUM7aD1PZChCfDAsMCxtfDAsMCl8MDtJPUM7RD1PZChKfDAsMCx1fDAsMCl8MDtJPURkKER8MCxDfDAsaHwwLEl8MCl8MDtoPUM7RD1PZChIfDAsMCx0fDAsMCl8MDtEPURkKEl8MCxofDAsRHwwLEN8MCl8MDtoPUM7ST1PZChHfDAsMCxifDAsMCl8MDtJPURkKER8MCxofDAsSXwwLEN8MCl8MDtoPUM7RD1PZChsfDAsMCxvfDAsMCl8MDtEPURkKEl8MCxofDAsRHwwLEN8MCl8MDtoPUM7Qj1PZChCfDAsMCxufDAsMCl8MDtJPUM7Sj1PZChKfDAsMCxtfDAsMCl8MDtJPURkKEp8MCxDfDAsQnwwLEl8MCl8MDtCPUM7SD1PZChIfDAsMCx1fDAsMCl8MDtIPURkKEl8MCxCfDAsSHwwLEN8MCl8MDtCPUM7Rz1PZChHfDAsMCx0fDAsMCl8MDtHPURkKEh8MCxCfDAsR3wwLEN8MCl8MDtCPUM7bD1PZChsfDAsMCxifDAsMCl8MDtsPURkKEd8MCxCfDAsbHwwLEN8MCl8MDtCPUM7az1HZChBfDAsa3wwLDI2KXwwO2s9RGQoRnwwLGp8MCxrfDAsMCl8MDtqPUdkKGt8MCxDfDAsMjYpfDA7aj1EZChFfDAsaXwwLGp8MCwwKXwwO2k9R2QoanwwLEN8MCwyNil8MDtqPWomNjcxMDg4NjM7aT1EZChEfDAsaHwwLGl8MCwwKXwwO2g9R2QoaXwwLEN8MCwyNil8MDtpPWkmNjcxMDg4NjM7aD1EZChsfDAsQnwwLGh8MCwwKXwwO0I9R2QoaHwwLEN8MCwyNil8MDtoPWgmNjcxMDg4NjM7Qj1CKjV8MDtsPUIrQSY2NzEwODg2MztrPSgoQisoQSY2NzEwODg2Myl8MCk+Pj4yNikrKGsmNjcxMDg4NjMpfDA7Zj1EZChmfDAsZ3wwLC0xNiwtMSl8MDtnPUM7aWYoIShnPj4+MD4wfChnfDApPT0wJmY+Pj4wPjE1KSlicmVhaztlbHNlIGU9ZSsxNnwwfWNbdj4+Ml09bDtjW3c+PjJdPWs7Y1t4Pj4yXT1qO2NbeT4+Ml09aTtjW3o+PjJdPWg7cmV0dXJufWZ1bmN0aW9uIFRiKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MDtuPWIrNTZ8MDtnPW47aD1jW2c+PjJdfDA7Zz1jW2crND4+Ml18MDtkbyBpZighKChofDApPT0wJihnfDApPT0wKSl7bD1DZCgxNiwwLGh8MCxnfDApfDA7bT1DO2s9bT4+PjA+Zj4+PjB8KG18MCk9PShmfDApJmw+Pj4wPmU+Pj4wO2w9az9lOmw7bT1rP2Y6bTtpZighKChsfDApPT0wJihtfDApPT0wKSl7aj1iKzY0fDA7az0wO2k9MDtkb3tvPWFbZCtrPj4wXXwwO2c9RGQoaHwwLGd8MCxrfDAsaXwwKXwwO2FbaitnPj4wXT1vO2s9RGQoa3wwLGl8MCwxLDApfDA7aT1DO2c9bjtoPWNbZz4+Ml18MDtnPWNbZys0Pj4yXXwwfXdoaWxlKGk+Pj4wPG0+Pj4wfChpfDApPT0obXwwKSZrPj4+MDxsPj4+MCl9bz1EZChofDAsZ3wwLGx8MCxtfDApfDA7az1DO2o9bjtjW2o+PjJdPW87Y1tqKzQ+PjJdPWs7aWYoaz4+PjA8MHwoa3wwKT09MCZvPj4+MDwxNilyZXR1cm47ZWxzZXtlPUNkKGV8MCxmfDAsbHwwLG18MCl8MDtmPUM7U2IoYixiKzY0fDAsMTYsMCk7bz1uO2Nbbz4+Ml09MDtjW28rND4+Ml09MDtkPWQrbHwwO2JyZWFrfX13aGlsZSgwKTtpZihmPj4+MD4wfChmfDApPT0wJmU+Pj4wPjE1KXtpPWUmLTE2O1NiKGIsZCxpLGYpO2U9Q2QoZXwwLGZ8MCxpfDAsZnwwKXwwO2Q9ZCtpfDA7aT1DfWVsc2UgaT1mO2lmKChlfDApPT0wJihpfDApPT0wKXJldHVybjtmPWIrNjR8MDtnPTA7aD0wO2Rve2I9YVtkK2c+PjBdfDA7bz1uO289RGQoY1tvPj4yXXwwLGNbbys0Pj4yXXwwLGd8MCxofDApfDA7YVtmK28+PjBdPWI7Zz1EZChnfDAsaHwwLDEsMCl8MDtoPUN9d2hpbGUoaD4+PjA8aT4+PjB8KGh8MCk9PShpfDApJmc+Pj4wPGU+Pj4wKTtiPW47Yj1EZChjW2I+PjJdfDAsY1tiKzQ+PjJdfDAsZXwwLGl8MCl8MDtvPW47Y1tvPj4yXT1iO2Nbbys0Pj4yXT1DO3JldHVybn1mdW5jdGlvbiBVYihiLGUpe2I9YnwwO2U9ZXwwO3ZhciBmPTAsZz0wO2Y9ZSszfDA7Y1tiPj4yXT0oZFtlKzE+PjBdfDApPDw4fChkW2U+PjBdfDApfChkW2UrMj4+MF18MCk8PDE2fChkW2Y+PjBdfDApPDwyNCY1MDMzMTY0ODtnPWUrNnwwO2NbYis0Pj4yXT0oKGRbZSs0Pj4wXXwwKTw8OHwoZFtmPj4wXXwwKXwoZFtlKzU+PjBdfDApPDwxNnwoZFtnPj4wXXwwKTw8MjQpPj4+MiY2NzEwODYxMTtmPWUrOXwwO2NbYis4Pj4yXT0oKGRbZSs3Pj4wXXwwKTw8OHwoZFtnPj4wXXwwKXwoZFtlKzg+PjBdfDApPDwxNnwoZFtmPj4wXXwwKTw8MjQpPj4+NCY2NzA5MjczNTtjW2IrMTI+PjJdPSgoZFtlKzEwPj4wXXwwKTw8OHwoZFtmPj4wXXwwKXwoZFtlKzExPj4wXXwwKTw8MTZ8KGRbZSsxMj4+MF18MCk8PDI0KT4+PjYmNjYwNzY2NzE7Y1tiKzE2Pj4yXT0oZFtlKzE0Pj4wXXwwKTw8OHwoZFtlKzEzPj4wXXwwKXwoZFtlKzE1Pj4wXXwwKTw8MTYmOTgzMDQwO2Y9YisyMHwwO2NbZj4+Ml09MDtjW2YrND4+Ml09MDtjW2YrOD4+Ml09MDtjW2YrMTI+PjJdPTA7Y1tmKzE2Pj4yXT0wO2NbYis0MD4+Ml09KGRbZSsxNz4+MF18MCk8PDh8KGRbZSsxNj4+MF18MCl8KGRbZSsxOD4+MF18MCk8PDE2fChkW2UrMTk+PjBdfDApPDwyNDtjW2IrNDQ+PjJdPShkW2UrMjE+PjBdfDApPDw4fChkW2UrMjA+PjBdfDApfChkW2UrMjI+PjBdfDApPDwxNnwoZFtlKzIzPj4wXXwwKTw8MjQ7Y1tiKzQ4Pj4yXT0oZFtlKzI1Pj4wXXwwKTw8OHwoZFtlKzI0Pj4wXXwwKXwoZFtlKzI2Pj4wXXwwKTw8MTZ8KGRbZSsyNz4+MF18MCk8PDI0O2NbYis1Mj4+Ml09KGRbZSsyOT4+MF18MCk8PDh8KGRbZSsyOD4+MF18MCl8KGRbZSszMD4+MF18MCk8PDE2fChkW2UrMzE+PjBdfDApPDwyNDtlPWIrNTZ8MDtjW2U+PjJdPTA7Y1tlKzQ+PjJdPTA7YVtiKzgwPj4wXT0wO3JldHVybn1mdW5jdGlvbiBWYihiLGUsZixnLGgpe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wO3c9aTt0PWk9aSs2MyYtNjQ7aT1pKzQ4fDA7aj10Kzh8MDt1PXQrNHwwO2lmKChhW2c+PjBdfDApIT0zNil7aD0wO2k9dztyZXR1cm4gaHwwfWlmKChhW2crMT4+MF18MCkhPTU1KXtoPTA7aT13O3JldHVybiBofDB9aWYoKGFbZysyPj4wXXwwKSE9MzYpe2g9MDtpPXc7cmV0dXJuIGh8MH1vPWFbZyszPj4wXXwwO249byYyNTU7YTpkbyBpZigxKXtsPTY1O2s9MzQ4ODE7ZG97aWYoKGFbaz4+MF18MCk9PW88PDI0Pj4yNClicmVhayBhO2s9aysxfDA7bD1sKy0xfDA7bT0obHwwKSE9MH13aGlsZShtJihrJjN8MCkhPTApO2lmKCFtKXtoPTA7aT13O3JldHVybiBofDB9fWVsc2V7bD02NTtrPTM0ODgxfXdoaWxlKDApO2I6ZG8gaWYoKGFbaz4+MF18MCkhPW88PDI0Pj4yNCl7bT1fKG4sMTY4NDMwMDkpfDA7YzpkbyBpZihsPj4+MD4zKXdoaWxlKDEpe3M9Y1trPj4yXV5tO2lmKChzJi0yMTM5MDYyMTQ0Xi0yMTM5MDYyMTQ0KSZzKy0xNjg0MzAwOSlicmVhayBjO2s9ays0fDA7bD1sKy00fDA7aWYobD4+PjA8PTMpe3Y9MTI7YnJlYWt9fWVsc2Ugdj0xMjt3aGlsZSgwKTtpZigodnwwKT09MTIpaWYoIWwpe2g9MDtpPXc7cmV0dXJuIGh8MH13aGlsZSgxKXtpZigoYVtrPj4wXXwwKT09bzw8MjQ+PjI0KWJyZWFrIGI7bD1sKy0xfDA7aWYoIWwpe2o9MDticmVha31lbHNlIGs9aysxfDB9aT13O3JldHVybiBqfDB9d2hpbGUoMCk7aWYoKGt8MCk9PTB8KGx8MCk9PTApe2g9MDtpPXc7cmV0dXJuIGh8MH1yPUhkKDEsMCxrLTM0ODgxfDApfDA7cz1DO2s9WGIodSxnKzR8MCl8MDtpZighayl7aD0wO2k9dztyZXR1cm4gaHwwfXE9WGIodCxrKXwwO2lmKCFxKXtoPTA7aT13O3JldHVybiBofDB9bz1xO3A9by1nfDA7bj0obyYzfDApPT0wO2Q6ZG8gaWYobil7az1xO3Y9MjJ9ZWxzZXtsPXE7az1vO3doaWxlKDEpe2lmKCEoYVtsPj4wXXwwKSlicmVhayBkO2w9bCsxfDA7az1sO2lmKCEoayYzKSl7az1sO3Y9MjI7YnJlYWt9fX13aGlsZSgwKTtpZigodnwwKT09MjIpe3doaWxlKDEpe2w9Y1trPj4yXXwwO2lmKCEoKGwmLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJmwrLTE2ODQzMDA5KSlrPWsrNHwwO2Vsc2UgYnJlYWt9aWYoKGwmMjU1KTw8MjQ+PjI0KWRvIGs9aysxfDA7d2hpbGUoKGFbaz4+MF18MCkhPTApfWw9ay1vKzF8MDt3aGlsZSgxKXtrPWwrLTF8MDtpZighbCl7dj0zMjticmVha31tPXEra3wwO2lmKChhW20+PjBdfDApPT0zNil7dj0zMDticmVha31lbHNlIGw9a31pZigodnwwKT09MzApaWYoIW0pdj0zMjtlbHNlIGw9bCstMXwwO2lmKCh2fDApPT0zMil7ZTpkbyBpZihuKXtrPXE7dj0zNX1lbHNle2s9cTtsPW87d2hpbGUoMSl7aWYoIShhW2s+PjBdfDApKXtrPWw7YnJlYWsgZX1rPWsrMXwwO2w9aztpZighKGwmMykpe3Y9MzU7YnJlYWt9fX13aGlsZSgwKTtpZigodnwwKT09MzUpe3doaWxlKDEpe2w9Y1trPj4yXXwwO2lmKCEoKGwmLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJmwrLTE2ODQzMDA5KSlrPWsrNHwwO2Vsc2UgYnJlYWt9aWYoKGwmMjU1KTw8MjQ+PjI0KWRvIGs9aysxfDA7d2hpbGUoKGFbaz4+MF18MCkhPTApfWw9ay1vfDB9az1sK3B8MDtwPWsrNDV8MDtpZihwPj4+MD4xMDJ8cD4+PjA8bD4+PjApe2g9MDtpPXc7cmV0dXJuIGh8MH1pZihoYyhiLGUsZixxLGwscixzLGNbdT4+Ml18MCxjW3Q+PjJdfDAsaiwzMil8MCl7aD0wO2k9dztyZXR1cm4gaHwwfUlkKGh8MCxnfDAsa3wwKXwwO3M9aCtrfDA7cj1zKzF8MDthW3M+PjBdPTM2O3M9cjtyPWgrMTAyLXJ8MDtrPTA7Zjp3aGlsZSgxKXtpZihrPj4+MDwzMil7cD0wO3E9aztrPTB9ZWxzZSBicmVhaztkb3tnPXE7cT1xKzF8MDtrPWRbaitnPj4wXTw8cHxrO3A9cCs4fDB9d2hpbGUocT4+PjA8MzImcD4+PjA8MjQpO2lmKCFwKWs9cztlbHNle2w9azttPXI7bj1zO289MDt3aGlsZSgxKXtpZighbSl7dj01MDticmVhayBmfWs9bisxfDA7YVtuPj4wXT1hWzM0ODgxKyhsJjYzKT4+MF18MDtvPW8rNnwwO2lmKG8+Pj4wPj1wPj4+MClicmVhaztlbHNle2w9bD4+PjY7bT1tKy0xfDA7bj1rfX19Zz0oa3wwKT09MDtyPShnPzA6cy1rfDApK3J8MDtpZihnKXt2PTUwO2JyZWFrfWVsc2V7cz1rO2s9cX19aWYoKHZ8MCk9PTUwKXtrPWorMzJ8MDtkb3thW2o+PjBdPTA7aj1qKzF8MH13aGlsZSgoanwwKTwoa3wwKSk7aD0wO2k9dztyZXR1cm4gaHwwfWs9aiszMnwwO2Rve2Fbaj4+MF09MDtqPWorMXwwfXdoaWxlKChqfDApPChrfDApKTtpZighKChzfDApIT0wJnM+Pj4wPChoKzEwMnwwKT4+PjApKXtoPTA7aT13O3JldHVybiBofDB9YVtzPj4wXT0wO2k9dztyZXR1cm4gaHwwfWZ1bmN0aW9uIFdiKGEsYixkLGUsZixnLGgsaixrLGwpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO2w9bHwwO3ZhciBtPTAsbj0wO209aTtuPWk9aSs2MyYtNjQ7aT1pKzE2fDA7Y1tuKzQ+PjJdPTA7Y1tuPj4yXT0wO2Nbbis4Pj4yXT0wO2Y9aGMobixhLGIsZCxlLGYsZyxoLGosayxsKXwwO2c9Y1tuPj4yXXwwO2lmKCFnKXtpPW07cmV0dXJuIGZ8MH16ZChnKTtpPW07cmV0dXJuIGZ8MH1mdW5jdGlvbiBYYihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTA7aT1hW2Q+PjBdfDA7aD1pJjI1NTthOmRvIGlmKDEpe2U9NjU7Zj0zNDg4MTtkb3tpZigoYVtmPj4wXXwwKT09aTw8MjQ+PjI0KWJyZWFrIGE7Zj1mKzF8MDtlPWUrLTF8MDtnPShlfDApIT0wfXdoaWxlKGcmKGYmM3wwKSE9MCk7aWYoIWcpe2Q9MDtuPTA7Y1tiPj4yXT1uO3JldHVybiBkfDB9fWVsc2V7ZT02NTtmPTM0ODgxfXdoaWxlKDApO2I6ZG8gaWYoKGFbZj4+MF18MCkhPWk8PDI0Pj4yNCl7Zz1fKGgsMTY4NDMwMDkpfDA7YzpkbyBpZihlPj4+MD4zKXdoaWxlKDEpe209Y1tmPj4yXV5nO2lmKChtJi0yMTM5MDYyMTQ0Xi0yMTM5MDYyMTQ0KSZtKy0xNjg0MzAwOSlicmVhayBjO2Y9Zis0fDA7ZT1lKy00fDA7aWYoZT4+PjA8PTMpe249OTticmVha319ZWxzZSBuPTk7d2hpbGUoMCk7aWYoKG58MCk9PTkpaWYoIWUpe2Q9MDtuPTA7Y1tiPj4yXT1uO3JldHVybiBkfDB9d2hpbGUoMSl7aWYoKGFbZj4+MF18MCk9PWk8PDI0Pj4yNClicmVhayBiO2U9ZSstMXwwO2lmKCFlKXtlPTA7Zj0wO2JyZWFrfWVsc2UgZj1mKzF8MH1jW2I+PjJdPWY7cmV0dXJuIGV8MH13aGlsZSgwKTtpZigoZnwwKT09MHwoZXwwKT09MCl7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH1qPWFbZCsxPj4wXXwwO2k9aiYyNTU7ZDpkbyBpZigxKXtlPTY1O2c9MzQ4ODE7ZG97aWYoKGFbZz4+MF18MCk9PWo8PDI0Pj4yNClicmVhayBkO2c9ZysxfDA7ZT1lKy0xfDA7aD0oZXwwKSE9MH13aGlsZShoJihnJjN8MCkhPTApO2lmKCFoKXtkPTA7bj0wO2NbYj4+Ml09bjtyZXR1cm4gZHwwfX1lbHNle2U9NjU7Zz0zNDg4MX13aGlsZSgwKTtlOmRvIGlmKChhW2c+PjBdfDApIT1qPDwyND4+MjQpe2g9XyhpLDE2ODQzMDA5KXwwO2Y6ZG8gaWYoZT4+PjA+Myl3aGlsZSgxKXttPWNbZz4+Ml1eaDtpZigobSYtMjEzOTA2MjE0NF4tMjEzOTA2MjE0NCkmbSstMTY4NDMwMDkpYnJlYWsgZjtnPWcrNHwwO2U9ZSstNHwwO2lmKGU+Pj4wPD0zKXtuPTIyO2JyZWFrfX1lbHNlIG49MjI7d2hpbGUoMCk7aWYoKG58MCk9PTIyKWlmKCFlKXtkPTA7bj0wO2NbYj4+Ml09bjtyZXR1cm4gZHwwfXdoaWxlKDEpe2lmKChhW2c+PjBdfDApPT1qPDwyND4+MjQpYnJlYWsgZTtlPWUrLTF8MDtpZighZSl7ZT0wO2Y9MDticmVha31lbHNlIGc9ZysxfDB9Y1tiPj4yXT1mO3JldHVybiBlfDB9d2hpbGUoMCk7aWYoKGd8MCk9PTB8KGV8MCk9PTApe2Q9MDtuPTA7Y1tiPj4yXT1uO3JldHVybiBkfDB9az1hW2QrMj4+MF18MDtqPWsmMjU1O2c6ZG8gaWYoMSl7ZT02NTtoPTM0ODgxO2Rve2lmKChhW2g+PjBdfDApPT1rPDwyND4+MjQpYnJlYWsgZztoPWgrMXwwO2U9ZSstMXwwO2k9KGV8MCkhPTB9d2hpbGUoaSYoaCYzfDApIT0wKTtpZighaSl7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH19ZWxzZXtlPTY1O2g9MzQ4ODF9d2hpbGUoMCk7aDpkbyBpZigoYVtoPj4wXXwwKSE9azw8MjQ+PjI0KXtpPV8oaiwxNjg0MzAwOSl8MDtpOmRvIGlmKGU+Pj4wPjMpd2hpbGUoMSl7bT1jW2g+PjJdXmk7aWYoKG0mLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJm0rLTE2ODQzMDA5KWJyZWFrIGk7aD1oKzR8MDtlPWUrLTR8MDtpZihlPj4+MDw9Myl7bj0zNjticmVha319ZWxzZSBuPTM2O3doaWxlKDApO2lmKChufDApPT0zNilpZighZSl7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH13aGlsZSgxKXtpZigoYVtoPj4wXXwwKT09azw8MjQ+PjI0KWJyZWFrIGg7ZT1lKy0xfDA7aWYoIWUpe2U9MDtmPTA7YnJlYWt9ZWxzZSBoPWgrMXwwfWNbYj4+Ml09ZjtyZXR1cm4gZXwwfXdoaWxlKDApO2lmKChofDApPT0wfChlfDApPT0wKXtkPTA7bj0wO2NbYj4+Ml09bjtyZXR1cm4gZHwwfWw9YVtkKzM+PjBdfDA7az1sJjI1NTtqOmRvIGlmKDEpe2U9NjU7aT0zNDg4MTtkb3tpZigoYVtpPj4wXXwwKT09bDw8MjQ+PjI0KWJyZWFrIGo7aT1pKzF8MDtlPWUrLTF8MDtqPShlfDApIT0wfXdoaWxlKGomKGkmM3wwKSE9MCk7aWYoIWope2Q9MDtuPTA7Y1tiPj4yXT1uO3JldHVybiBkfDB9fWVsc2V7ZT02NTtpPTM0ODgxfXdoaWxlKDApO2s6ZG8gaWYoKGFbaT4+MF18MCk9PWw8PDI0Pj4yNCltPWk7ZWxzZXtqPV8oaywxNjg0MzAwOSl8MDtsOmRvIGlmKGU+Pj4wPjMpd2hpbGUoMSl7bT1jW2k+PjJdXmo7aWYoKG0mLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJm0rLTE2ODQzMDA5KWJyZWFrIGw7aT1pKzR8MDtlPWUrLTR8MDtpZihlPj4+MDw9Myl7bj00OTticmVha319ZWxzZSBuPTQ5O3doaWxlKDApO2lmKChufDApPT00OSlpZighZSl7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH13aGlsZSgxKXtpZigoYVtpPj4wXXwwKT09bDw8MjQ+PjI0KXttPWk7YnJlYWsga31lPWUrLTF8MDtpZighZSl7ZT0wO2Y9MDticmVha31lbHNlIGk9aSsxfDB9Y1tiPj4yXT1mO3JldHVybiBlfDB9d2hpbGUoMCk7aWYoKG18MCk9PTB8KGV8MCk9PTApe2Q9MDtuPTA7Y1tiPj4yXT1uO3JldHVybiBkfDB9bD1hW2QrND4+MF18MDtrPWwmMjU1O206ZG8gaWYoMSl7aT02NTtlPTM0ODgxO2Rve2lmKChhW2U+PjBdfDApPT1sPDwyND4+MjQpYnJlYWsgbTtlPWUrMXwwO2k9aSstMXwwO2o9KGl8MCkhPTB9d2hpbGUoaiYoZSYzfDApIT0wKTtpZighail7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH19ZWxzZXtpPTY1O2U9MzQ4ODF9d2hpbGUoMCk7bjpkbyBpZigoYVtlPj4wXXwwKSE9bDw8MjQ+PjI0KXtqPV8oaywxNjg0MzAwOSl8MDtvOmRvIGlmKGk+Pj4wPjMpd2hpbGUoMSl7az1jW2U+PjJdXmo7aWYoKGsmLTIxMzkwNjIxNDReLTIxMzkwNjIxNDQpJmsrLTE2ODQzMDA5KWJyZWFrIG87ZT1lKzR8MDtpPWkrLTR8MDtpZihpPj4+MDw9Myl7bj02MjticmVha319ZWxzZSBuPTYyO3doaWxlKDApO2lmKChufDApPT02MilpZighaSl7ZD0wO249MDtjW2I+PjJdPW47cmV0dXJuIGR8MH13aGlsZSgxKXtpZigoYVtlPj4wXXwwKT09bDw8MjQ+PjI0KWJyZWFrIG47aT1pKy0xfDA7aWYoIWkpe2U9MDtmPTA7YnJlYWt9ZWxzZSBlPWUrMXwwfWNbYj4+Ml09ZjtyZXR1cm4gZXwwfXdoaWxlKDApO2lmKChlfDApPT0wfChpfDApPT0wKXtkPTA7bj0wO2NbYj4+Ml09bjtyZXR1cm4gZHwwfWQ9ZCs1fDA7bj1lLTM0ODgxPDwyNHwobS0zNDg4MTw8MTh8KGgtMzQ4ODE8PDEyfChnLTM0ODgxPDw2fGYtMzQ4ODEpKSk7Y1tiPj4yXT1uO3JldHVybiBkfDB9ZnVuY3Rpb24gWWIoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MDtBPWk7dz1pPWkrNjMmLTY0O2k9aSs1NjB8MDtyPXcrNDg4fDA7ej13KzQ1NnwwO3Y9dysyMDh8MDt4PXc7eT13KzQxNnwwO3c9dys0MjR8MDtuPXYrMzJ8MDtpZihkPj4+MDw9NjQpe3A9bjtjW3A+PjJdPTA7Y1twKzQ+PjJdPTA7Y1t2Pj4yXT1jWzE4XTtjW3YrND4+Ml09Y1sxOV07Y1t2Kzg+PjJdPWNbMjBdO2NbdisxMj4+Ml09Y1syMV07Y1t2KzE2Pj4yXT1jWzIyXTtjW3YrMjA+PjJdPWNbMjNdO2NbdisyND4+Ml09Y1syNF07Y1t2KzI4Pj4yXT1jWzI1XTtwPXI7cT1wKzY0fDA7ZG97YVtwPj4wXT01NDtwPXArMXwwfXdoaWxlKChwfDApPChxfDApKTtsPShkfDApPT0wO2lmKCFsKXtqPWQ7az1uO2Fbcj4+MF09YVtiPj4wXV41NDtpZigoanwwKT09MSlkPWo7ZWxzZXtkPWo7bT04fX1lbHNlIGs9bn1lbHNle2Nbdj4+Ml09Y1sxOF07Y1t2KzQ+PjJdPWNbMTldO2Nbdis4Pj4yXT1jWzIwXTtjW3YrMTI+PjJdPWNbMjFdO2NbdisxNj4+Ml09Y1syMl07Y1t2KzIwPj4yXT1jWzIzXTtjW3YrMjQ+PjJdPWNbMjRdO2NbdisyOD4+Ml09Y1syNV07cD1IZChkfDAsMCwzKXwwO2w9bjtjW2w+PjJdPXA7Y1tsKzQ+PjJdPUM7bD12KzQwfDA7cD1sO209YjtxPXArNjR8MDtkb3thW3A+PjBdPWFbbT4+MF18MDtwPXArMXwwO209bSsxfDB9d2hpbGUoKHB8MCk8KHF8MCkpO0ViKHYsbCk7aj1iKzY0fDA7az1EZChkfDAsMCwtNjQsLTEpfDA7Yj1DO2lmKGI+Pj4wPjB8KGJ8MCk9PTAmaz4+PjA+NjMpe2Rve0ViKHYsaik7aj1qKzY0fDA7az1EZChrfDAsYnwwLC02NCwtMSl8MDtiPUN9d2hpbGUoYj4+PjA+MHwoYnwwKT09MCZrPj4+MD42Myk7Yj1rfWVsc2UgYj1rO0lkKGx8MCxqfDAsYnwwKXwwO0RiKHYseik7cD1uO2NbcD4+Ml09MDtjW3ArND4+Ml09MDtjW3Y+PjJdPWNbMThdO2Nbdis0Pj4yXT1jWzE5XTtjW3YrOD4+Ml09Y1syMF07Y1t2KzEyPj4yXT1jWzIxXTtjW3YrMTY+PjJdPWNbMjJdO2NbdisyMD4+Ml09Y1syM107Y1t2KzI0Pj4yXT1jWzI0XTtjW3YrMjg+PjJdPWNbMjVdO3A9cjtxPXArNjR8MDtkb3thW3A+PjBdPTU0O3A9cCsxfDB9d2hpbGUoKHB8MCk8KHF8MCkpO2Fbcj4+MF09YVt6Pj4wXV41NDtkPTMyO2I9ejtrPW47bD0wO209OH1pZigobXwwKT09OCl7aj0xO2Rve3U9citqfDA7YVt1Pj4wXT1hW3U+PjBdXmFbYitqPj4wXTtqPWorMXwwfXdoaWxlKChqfDApIT0oZHwwKSl9bz1rO2Nbbz4+Ml09NTEyO2Nbbys0Pj4yXT0wO289dis0MHwwO3A9bzttPXI7cT1wKzY0fDA7ZG97YVtwPj4wXT1hW20+PjBdfDA7cD1wKzF8MDttPW0rMXwwfXdoaWxlKChwfDApPChxfDApKTtFYih2LG8pO249disxMDR8MDttPXYrMTM2fDA7cD1tO2NbcD4+Ml09MDtjW3ArND4+Ml09MDtjW24+PjJdPWNbMThdO2Nbbis0Pj4yXT1jWzE5XTtjW24rOD4+Ml09Y1syMF07Y1tuKzEyPj4yXT1jWzIxXTtjW24rMTY+PjJdPWNbMjJdO2NbbisyMD4+Ml09Y1syM107Y1tuKzI0Pj4yXT1jWzI0XTtjW24rMjg+PjJdPWNbMjVdO3A9cjtxPXArNjR8MDtkb3thW3A+PjBdPTkyO3A9cCsxfDB9d2hpbGUoKHB8MCk8KHF8MCkpO2lmKCFsPyhhW3I+PjBdPWFbYj4+MF1eOTIsKGR8MCkhPTEpOjApe2o9MTtkb3t1PXIranwwO2FbdT4+MF09YVt1Pj4wXV5hW2Iraj4+MF07aj1qKzF8MH13aGlsZSgoanwwKSE9KGR8MCkpfWo9bTtjW2o+PjJdPTUxMjtjW2orND4+Ml09MDtqPXYrMTQ0fDA7cD1qO209cjtxPXArNjR8MDtkb3thW3A+PjBdPWFbbT4+MF18MDtwPXArMXwwO209bSsxfDB9d2hpbGUoKHB8MCk8KHF8MCkpO0ViKG4saik7ZG8gaWYoZil7Yj1rO3Q9Y1tiPj4yXXwwO2I9Y1tiKzQ+PjJdfDA7aj1HZCh0fDAsYnwwLDMpfDA7aj1qJjYzO3U9SGQoZnwwLDAsMyl8MDt1PURkKHR8MCxifDAsdXwwLEN8MCl8MDtiPWs7Y1tiPj4yXT11O2NbYis0Pj4yXT1DO2I9NjQtanwwO2o9dis0MCtqfDA7aWYoYj4+PjA+Zj4+PjApe0lkKGp8MCxlfDAsZnwwKXwwO2JyZWFrfUlkKGp8MCxlfDAsYnwwKXwwO0ViKHYsbyk7aj1lK2J8MDtrPUNkKGZ8MCwwLGJ8MCwwKXwwO2I9QztpZihiPj4+MD4wfChifDApPT0wJms+Pj4wPjYzKXtkb3tFYih2LGopO2o9ais2NHwwO2s9RGQoa3wwLGJ8MCwtNjQsLTEpfDA7Yj1DfXdoaWxlKGI+Pj4wPjB8KGJ8MCk9PTAmaz4+PjA+NjMpO2I9a31lbHNlIGI9aztJZChvfDAsanwwLGJ8MCl8MH13aGlsZSgwKTtpZighaCl7aT1BO3JldHVybn1sPXkrM3wwO2Q9eSsyfDA7bj15KzF8MDtvPXgrMzJ8MDtyPXgrMTA0fDA7ZT14KzEzNnwwO2Y9eCsxNDR8MDtzPXgrNDB8MDt0PTA7dT0wO2Rve3U9dSsxfDA7YVtsPj4wXT11O2FbZD4+MF09dT4+Pjg7YVtuPj4wXT11Pj4+MTY7YVt5Pj4wXT11Pj4+MjQ7SWQoeHwwLHZ8MCwyMDgpfDA7cT1vO2I9Y1txPj4yXXwwO3E9Y1txKzQ+PjJdfDA7aj1HZChifDAscXwwLDMpfDA7aj1qJjYzO3E9RGQoYnwwLHF8MCwzMiwwKXwwO2I9bztjW2I+PjJdPXE7Y1tiKzQ+PjJdPUM7Yj02NC1qfDA7aj14KzQwK2p8MDtpZihiPj4+MD40KXtxPWNbeT4+Ml18MDthW2o+PjBdPXE7YVtqKzE+PjBdPXE+Pjg7YVtqKzI+PjBdPXE+PjE2O2FbaiszPj4wXT1xPj4yNH1lbHNle0lkKGp8MCx5fDAsYnwwKXwwO0ViKHgscyk7aj15K2J8MDtrPUNkKDQsMCxifDAsMCl8MDtiPUM7aWYoYj4+PjA+MHwoYnwwKT09MCZrPj4+MD42Myl7ZG97RWIoeCxqKTtqPWorNjR8MDtrPURkKGt8MCxifDAsLTY0LC0xKXwwO2I9Q313aGlsZShiPj4+MD4wfChifDApPT0wJms+Pj4wPjYzKTtiPWt9ZWxzZSBiPWs7SWQoc3wwLGp8MCxifDApfDB9RGIoeCx6KTtxPWU7Yj1jW3E+PjJdfDA7cT1jW3ErND4+Ml18MDtqPUdkKGJ8MCxxfDAsMyl8MDtqPWomNjM7cT1EZChifDAscXwwLDI1NiwwKXwwO2I9ZTtjW2I+PjJdPXE7Y1tiKzQ+PjJdPUM7Yj02NC1qfDA7aj14KzE0NCtqfDA7aWYoYj4+PjA+MzIpe3A9ajttPXo7cT1wKzMyfDA7ZG97YVtwPj4wXT1hW20+PjBdfDA7cD1wKzF8MDttPW0rMXwwfXdoaWxlKChwfDApPChxfDApKX1lbHNle0lkKGp8MCx6fDAsYnwwKXwwO0ViKHIsZik7aj16K2J8MDtrPUNkKDMyLDAsYnwwLDApfDA7Yj1DO2lmKGI+Pj4wPjB8KGJ8MCk9PTAmaz4+PjA+NjMpe2Rve0ViKHIsaik7aj1qKzY0fDA7az1EZChrfDAsYnwwLC02NCwtMSl8MDtiPUN9d2hpbGUoYj4+PjA+MHwoYnwwKT09MCZrPj4+MD42Myk7Yj1rfWVsc2UgYj1rO0lkKGZ8MCxqfDAsYnwwKXwwfURiKHIsdyk7cT1oLXR8MDtJZChnK3R8MCx3fDAsKHE+Pj4wPjMyPzMyOnEpfDApfDA7dD11PDw1fXdoaWxlKHQ+Pj4wPGg+Pj4wKTtpPUE7cmV0dXJufWZ1bmN0aW9uIFpiKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIF9iKCl7cmV0dXJuIDEwMn1mdW5jdGlvbiAkYigpe3JldHVybiAzMjk4NH1mdW5jdGlvbiBhYygpe3JldHVybiA1MjQyODh9ZnVuY3Rpb24gYmMoKXtyZXR1cm4gMTY3NzcyMTZ9ZnVuY3Rpb24gY2MoKXtyZXR1cm4gMzM1NTQ0MzJ9ZnVuY3Rpb24gZGMoKXtyZXR1cm4gMTA3Mzc0MTgyNH1mdW5jdGlvbiBlYyhhLGIsZCxlLGYsZyxoLGosayxsKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wO289aTtuPWk9aSs2MyYtNjQ7aT1pKzE2fDA7RmQoYXwwLDAsYnwwKXwwO209Z3xkO2lmKG0+Pj4wPjB8KG18MCk9PTAmKGZ8Yik+Pj4wPjQyOTQ5NjcyOTUpe2lmKCEoY1s3OTc5XXwwKSlkPTMxOTY0O2Vsc2UgZD1jWyhvYSgpfDApKzYwPj4yXXwwO2NbZD4+Ml09Mjc7bj0tMTtpPW87cmV0dXJuIG58MH1nPWs+Pj4wPDB8KGt8MCk9PTAmaj4+PjA8MzI3Njg7bT1nPzMyNzY4Omo7az1nPzA6azthOmRvIGlmKGs+Pj4wPDB8KGt8MCk9PTAmbT4+PjA8bD4+PjU+Pj4wKXtnPUdkKG18MCxrfDAsNil8MDtqPUM7az0xO3doaWxlKDEpe209SGQoMSwwLGt8MCl8MDtsPUM7ZD1rKzF8MDtpZihsPj4+MD5qPj4+MHwobHwwKT09KGp8MCkmbT4+PjA+Zz4+PjApe2Q9aztnPTE7YnJlYWsgYX1pZihkPj4+MDw2MylrPWQ7ZWxzZXtnPTE7YnJlYWt9fX1lbHNle2c9bD4+PjExO2o9MTt3aGlsZSgxKXtsPUhkKDEsMCxqfDApfDA7cD1DO2Q9aisxfDA7aWYocD4+PjA+MHwocHwwKT09MCZsPj4+MD5nPj4+MCl7ZD1qO2JyZWFrfWlmKGQ+Pj4wPDYzKWo9ZDtlbHNlIGJyZWFrfWc9R2QobXwwLGt8MCwyKXwwO2c9R2QoZ3wwLEN8MCxkfDApfDA7cD1DO209cD4+PjA+MHwocHwwKT09MCZnPj4+MD4xMDczNzQxODIzO2c9bT8xMDczNzQxODIzOmc7Zz1nPj4+M313aGlsZSgwKTtkPUhkKDEsMCxkfDApfDA7Y1tuKzQ+PjJdPTA7Y1tuPj4yXT0wO2Nbbis4Pj4yXT0wO2c9aGMobixlLGYsaCwzMixkLEMsOCxnLGEsYil8MDtkPWNbbj4+Ml18MDtpZihkKXpkKGQpO3A9ZztpPW87cmV0dXJuIHB8MH1mdW5jdGlvbiBmYyhiLGUsZixnLGgsaixrKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTA7dz1pO3Y9aT1pKzYzJi02NDtpPWkrMTEyfDA7dD12KzcyfDA7dT12KzEyfDA7bD1iO209bCsxMDJ8MDtkb3thW2w+PjBdPTA7bD1sKzF8MH13aGlsZSgobHwwKTwobXwwKSk7aWYoZz4+PjA+MHwoZ3wwKT09MCZmPj4+MD40Mjk0OTY3Mjk1KXtpZighKGNbNzk3OV18MCkpZz0zMTk2NDtlbHNlIGc9Y1sob2EoKXwwKSs2MD4+Ml18MDtjW2c+PjJdPTI3O3Y9LTE7aT13O3JldHVybiB2fDB9bT1qPj4+MDwwfChqfDApPT0wJmg+Pj4wPDMyNzY4O249bT8zMjc2ODpoO209bT8wOmo7YTpkbyBpZihtPj4+MDwwfChtfDApPT0wJm4+Pj4wPGs+Pj41Pj4+MCl7aD1HZChufDAsbXwwLDYpfDA7bD1DO209MTt3aGlsZSgxKXtrPUhkKDEsMCxtfDApfDA7bj1DO2c9bSsxfDA7aWYobj4+PjA+bD4+PjB8KG58MCk9PShsfDApJms+Pj4wPmg+Pj4wKXtnPW07aD0xO2JyZWFrIGF9aWYoZz4+PjA8NjMpbT1nO2Vsc2V7aD0xO2JyZWFrfX19ZWxzZXtoPWs+Pj4xMTtsPTE7d2hpbGUoMSl7az1IZCgxLDAsbHwwKXwwO2o9QztnPWwrMXwwO2lmKGo+Pj4wPjB8KGp8MCk9PTAmaz4+PjA+aD4+PjApe2c9bDticmVha31pZihnPj4+MDw2MylsPWc7ZWxzZSBicmVha31oPUdkKG58MCxtfDAsMil8MDtoPUdkKGh8MCxDfDAsZ3wwKXwwO2s9QztuPWs+Pj4wPjB8KGt8MCk9PTAmaD4+PjA+MTA3Mzc0MTgyMztoPW4/MTA3Mzc0MTgyMzpoO2g9aD4+PjN9d2hpbGUoMCk7bD0wO2Rve2FbdCtsPj4wXT1CYSgwKXwwO2w9bCsxfDB9d2hpbGUoKGx8MCkhPTMyKTtiOmRvIGlmKCgoKCgoKChnPj4+MDw9NjM/KGs9SGQoaHwwLDAsMyl8MCxuPUMsIShuPj4+MD4wfChufDApPT0wJms+Pj4wPjEwNzM3NDE4MjMpKTowKT8oYVt1Pj4wXT0zNixhW3UrMT4+MF09NTUsYVt1KzI+PjBdPTM2LGFbdSszPj4wXT1hWzM0ODgxK2c+PjBdfDAsYVt1KzQ+PjBdPTU0LGs9dSs1fDAsbz11Kzl8MCxhW2s+PjBdPTQ2LGFbaysxPj4wXT00NixhW2srMj4+MF09NDYsYVtrKzM+PjBdPTQ2LChvfDApIT0wKTowKT8ocD1vLHI9dSs1OHwwLChyfDApIT0ocHwwKSk6MCk/KHE9ci1wfDAsYVtvPj4wXT1hWzM0ODgxKyhoJjYzKT4+MF18MCwocXwwKSE9MSk6MCk/KGFbdSsxMD4+MF09YVszNDg4MSsoaD4+PjYmNjMpPj4wXXwwLChxfDApIT0yKTowKT8oYVt1KzExPj4wXT1hWzM0ODgxKyhoPj4+MTImNjMpPj4wXXwwLChxfDApIT0zKTowKT8oYVt1KzEyPj4wXT1hWzM0ODgxKyhoPj4+MTgmNjMpPj4wXXwwLChxfDApIT00KTowKT8ocz11KzE0fDAsYVt1KzEzPj4wXT1hWzM0ODgxKyhoPj4+MjQpPj4wXXwwLChzfDApIT0wKTowKXtwPXM7bz1yLXN8MDtnPTA7d2hpbGUoMSl7aWYoZz4+PjA8MzIpe249MDtrPWc7Zz0wfWVsc2UgYnJlYWs7ZG97cz1rO2s9aysxfDA7Zz0oZFt0K3M+PjBdfDApPDxufGc7bj1uKzh8MH13aGlsZShrPj4+MDwzMiZuPj4+MDwyNCk7aWYoIW4pZz1wO2Vsc2V7aD1nO2w9bzttPXA7aj0wO3doaWxlKDEpe2lmKCFsKWJyZWFrIGI7Zz1tKzF8MDthW20+PjBdPWFbMzQ4ODErKGgmNjMpPj4wXXwwO2o9ais2fDA7aWYoaj4+PjA+PW4+Pj4wKWJyZWFrO2Vsc2V7aD1oPj4+NjtsPWwrLTF8MDttPWd9fX1zPShnfDApPT0wO289KHM/MDpwLWd8MCkrb3wwO2lmKHMpYnJlYWsgYjtlbHNle3A9ZztnPWt9fWlmKHA+Pj4wPCh1KzU4fDApPj4+MCl7YVtwPj4wXT0wO2w9dis0fDA7Y1tsPj4yXT0wO2Nbdj4+Ml09MDttPXYrOHwwO2NbbT4+Ml09MDtnPShWYih2LGUsZix1LGIpfDApPT0wO2g9Y1t2Pj4yXXwwO2lmKGgpemQoaCk7Y1tsPj4yXT0wO2Nbdj4+Ml09MDtjW20+PjJdPTA7aWYoIWcpe3Y9MDtpPXc7cmV0dXJuIHZ8MH1pZighKGNbNzk3OV18MCkpZz0zMTk2NDtlbHNlIGc9Y1sob2EoKXwwKSs2MD4+Ml18MDtjW2c+PjJdPTIyO3Y9LTE7aT13O3JldHVybiB2fDB9fXdoaWxlKDApO2lmKCEoY1s3OTc5XXwwKSlnPTMxOTY0O2Vsc2UgZz1jWyhvYSgpfDApKzYwPj4yXXwwO2NbZz4+Ml09MjI7dj0tMTtpPXc7cmV0dXJuIHZ8MH1mdW5jdGlvbiBnYyhiLGQsZSxmKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7bT1pO2w9aT1pKzYzJi02NDtpPWkrMTI4fDA7Zj1sKzEyfDA7YTpkbyBpZihiJjMpe2c9MTAyO2g9Yjtkb3tpZighKGFbaD4+MF18MCkpe2s9NTticmVhayBhfWg9aCsxfDA7Zz1nKy0xfDA7aj0oZ3wwKSE9MH13aGlsZShqJihoJjN8MCkhPTApO2lmKGopaz01O2Vsc2UgZz0wfWVsc2V7Zz0xMDI7aD1iO2s9NX13aGlsZSgwKTtiOmRvIGlmKChrfDApPT01KWlmKGFbaD4+MF18MCl7YzpkbyBpZihnPj4+MD4zKXdoaWxlKDEpe2o9Y1toPj4yXXwwO2lmKChqJi0yMTM5MDYyMTQ0Xi0yMTM5MDYyMTQ0KSZqKy0xNjg0MzAwOSlicmVhaztoPWgrNHwwO2c9ZystNHwwO2lmKGc+Pj4wPD0zKXtrPTEwO2JyZWFrIGN9fWVsc2Ugaz0xMDt3aGlsZSgwKTtpZigoa3wwKT09MTApaWYoIWcpe2c9MDticmVha313aGlsZSgxKXtpZighKGFbaD4+MF18MCkpYnJlYWsgYjtoPWgrMXwwO2c9ZystMXwwO2lmKCFnKXtnPTA7YnJlYWt9fX13aGlsZSgwKTtpZigoKChnfDApIT0wP2g6MCl8MCkhPShiKzEwMXwwKSl7Yj0tMTtpPW07cmV0dXJuIGJ8MH1qPWwrNHwwO2Nbaj4+Ml09MDtjW2w+PjJdPTA7az1sKzh8MDtjW2s+PjJdPTA7Zz0oVmIobCxkLGUsYixmKXwwKT09MDtoPWNbbD4+Ml18MDtpZihoKXpkKGgpO2Nbaj4+Ml09MDtjW2w+PjJdPTA7Y1trPj4yXT0wO2lmKGcpe2I9LTE7aT1tO3JldHVybiBifDB9ZWxzZXtnPTA7aD0wfWRve2c9YVtiK2g+PjBdXmFbZitoPj4wXXxnO2g9aCsxfDB9d2hpbGUoKGh8MCkhPTEwMik7aD0oKChnJjI1NSkrNTExfDApPj4+OCYxKSstMXwwO2c9ZisxMDJ8MDtkb3thW2Y+PjBdPTA7Zj1mKzF8MH13aGlsZSgoZnwwKTwoZ3wwKSk7Yj1oO2k9bTtyZXR1cm4gYnwwfWZ1bmN0aW9uIGhjKGIsZSxmLGcsaCxpLGosayxsLG0sbil7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7dmFyIG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MDtKPU9kKGx8MCwwLGt8MCwwKXwwO0k9QztpZihJPj4+MD4wfChJfDApPT0wJko+Pj4wPjEwNzM3NDE4MjMpe2lmKCEoY1s3OTc5XXwwKSlvPTMxOTY0O2Vsc2Ugbz1jWyhvYSgpfDApKzYwPj4yXXwwO2Nbbz4+Ml09Mjc7Zj0tMTtyZXR1cm4gZnwwfWlmKGo+Pj4wPjB8KGp8MCk9PTAmaT4+PjA+NDI5NDk2NzI5NSl7aWYoIShjWzc5NzldfDApKW89MzE5NjQ7ZWxzZSBvPWNbKG9hKCl8MCkrNjA+PjJdfDA7Y1tvPj4yXT0yNztmPS0xO3JldHVybiBmfDB9Rz1EZChpfDAsanwwLC0xLC0xKXwwO0g9QztpZihqPj4+MDwwfChqfDApPT0wJmk+Pj4wPDJ8KChHJml8MCkhPTB8KEgmanwwKSE9MCkpe2lmKCEoY1s3OTc5XXwwKSlvPTMxOTY0O2Vsc2Ugbz1jWyhvYSgpfDApKzYwPj4yXXwwO2Nbbz4+Ml09MjI7Zj0tMTtyZXR1cm4gZnwwfWlmKChrfDApPT0wfChsfDApPT0wKXtpZighKGNbNzk3OV18MCkpbz0zMTk2NDtlbHNlIG89Y1sob2EoKXwwKSs2MD4+Ml18MDtjW28+PjJdPTIyO2Y9LTE7cmV0dXJuIGZ8MH1pZighKGs+Pj4wPjE2Nzc3MjE1PzE6KDMzNTU0NDMxLyhsPj4+MCl8MCk+Pj4wPGs+Pj4wKT8hKDA8aj4+PjB8KDA9PShqfDApPygzMzU1NDQzMS8oaz4+PjApfDApPj4+MDxpPj4+MDowKSk6MCl7ST1rPDw3O0o9XyhJLGwpfDA7eT1PZChJfDAsMCxpfDAsanwwKXwwO289eStKfDA7aWYobz4+PjA8eT4+PjApe2lmKCEoY1s3OTc5XXwwKSlvPTMxOTY0O2Vsc2Ugbz1jWyhvYSgpfDApKzYwPj4yXXwwO2Nbbz4+Ml09MTI7Zj0tMTtyZXR1cm4gZnwwfUY9azw8OHw2NDt3PW8rRnwwO2lmKHc+Pj4wPEY+Pj4wKXtpZighKGNbNzk3OV18MCkpbz0zMTk2NDtlbHNlIG89Y1sob2EoKXwwKSs2MD4+Ml18MDtjW28+PjJdPTEyO2Y9LTE7cmV0dXJuIGZ8MH14PWIrOHwwO2RvIGlmKChjW3g+PjJdfDApPj4+MDx3Pj4+MCl7bz1jW2I+PjJdfDA7aWYobyl6ZChvKTt2PWIrNHwwO2Nbdj4+Ml09MDtjW2I+PjJdPTA7Y1t4Pj4yXT0wO2RvIGlmKHc+Pj4wPD00Mjk0OTY3MTY4KXtpZih3Pj4+MD49NDI5NDk2NzE2OCl7aWYoIShjWzc5NzldfDApKW89MzE5NjQ7ZWxzZSBvPWNbKG9hKCl8MCkrNjA+PjJdfDA7Y1tvPj4yXT0xMjtxPTEyO289MDticmVha310PXd8ODtvPXlkKHQrNzZ8MCl8MDtpZihvKXtzPW8rLTh8MDtkbyBpZihvJjYzKXtyPW8rNjMmLTY0O0Y9cistOHwwO3E9cztyPShGLXF8MCk+Pj4wPjE1P0Y6cis1NnwwO3E9ci1xfDA7bz1vKy00fDA7Rj1jW28+PjJdfDA7cD0oRiYtOCktcXwwO2lmKCEoRiYzKSl7Y1tyPj4yXT0oY1tzPj4yXXwwKStxO2Nbcis0Pj4yXT1wO2JyZWFrfWVsc2V7Rj1yKzR8MDtjW0Y+PjJdPXB8Y1tGPj4yXSYxfDI7RT1yK3ArNHwwO2NbRT4+Ml09Y1tFPj4yXXwxO2Nbbz4+Ml09cXxjW28+PjJdJjF8MjtjW0Y+PjJdPWNbRj4+Ml18MTtBZChzLHEpO2JyZWFrfX1lbHNlIHI9czt3aGlsZSgwKTtvPXIrNHwwO3A9Y1tvPj4yXXwwO2lmKChwJjN8MCkhPTA/KHU9cCYtOCx1Pj4+MD4odCsxNnwwKT4+PjApOjApe0Y9dS10fDA7RT1yK3R8MDtjW28+PjJdPXR8cCYxfDI7Y1tFKzQ+PjJdPUZ8MztEPUUrRis0fDA7Y1tEPj4yXT1jW0Q+PjJdfDE7QWQoRSxGKX1xPTA7bz1yKzh8MH1lbHNle3E9MTI7bz0wfX1lbHNle3E9MTI7bz0wfXdoaWxlKDApO2lmKCEoY1s3OTc5XXwwKSlwPTMxOTY0O2Vsc2UgcD1jWyhvYSgpfDApKzYwPj4yXXwwO2NbcD4+Ml09cTtpZighcSl7Y1tiPj4yXT1vO2Nbdj4+Ml09bztjW3g+PjJdPShvfDApIT0wP3c6MDtpZighbylvPS0xO2Vsc2UgYnJlYWs7cmV0dXJuIG98MH1lbHNle2NbYj4+Ml09MDtjW3Y+PjJdPTA7Y1t4Pj4yXT0wO2Y9LTE7cmV0dXJuIGZ8MH19ZWxzZSBvPWNbYis0Pj4yXXwwO3doaWxlKDApO0Y9bytKfDA7RT1GK3l8MDtZYihlLGYsZyxoLG8sSik7dD1rPDw1O3U9RSsodDw8Mil8MDt2PUUrKGs8PDY8PDIpfDA7dz0odHwwKT09MDt4PShpfDApPT0wJihqfDApPT0wO2I9dCYxMDczNzQxNzkyO3k9KGJ8MCk9PTA7aD1JKy02NHwwO2c9RStofDA7aD11K2h8MDt6PWgrNHwwO0E9Zys0fDA7RD0wO2Rve0I9bysoXyhJLEQpfDApfDA7aWYoIXcpe3A9MDtkb3tzPUIrKHA8PDIpfDA7Y1tFKyhwPDwyKT4+Ml09KGRbcysxPj4wXXwwKTw8OHwoZFtzPj4wXXwwKXwoZFtzKzI+PjBdfDApPDwxNnwoZFtzKzM+PjBdfDApPDwyNDtwPXArMXwwfXdoaWxlKChwfDApIT0odHwwKSl9YTpkbyBpZigheCl7aWYoeSl7cD0wO3E9MDtkb3tpYyhFLHUsdixrKTtpYyh1LEUsdixrKTtwPURkKHB8MCxxfDAsMiwwKXwwO3E9Q313aGlsZShxPj4+MDxqPj4+MHwocXwwKT09KGp8MCkmcD4+PjA8aT4+PjApfWVsc2V7cj0wO3M9MDtkb3twPU9kKHJ8MCxzfDAsdHwwLDApfDA7cD1GKyhwPDwyKXwwO3E9MDtkb3tjW3ArKHE8PDIpPj4yXT1jW0UrKHE8PDIpPj4yXTtxPXErMXwwfXdoaWxlKChxfDApIT0oYnwwKSk7aWMoRSx1LHYsayk7cD1PZChyfDF8MCxzfDAsdHwwLDApfDA7cD1GKyhwPDwyKXwwO3E9MDtkb3tjW3ArKHE8PDIpPj4yXT1jW3UrKHE8PDIpPj4yXTtxPXErMXwwfXdoaWxlKChxfDApIT0oYnwwKSk7aWModSxFLHYsayk7cj1EZChyfDAsc3wwLDIsMCl8MDtzPUN9d2hpbGUocz4+PjA8aj4+PjB8KHN8MCk9PShqfDApJnI+Pj4wPGk+Pj4wKX1pZih5KXtwPTA7cT0wO3doaWxlKDEpe2ljKEUsdSx2LGspO2ljKHUsRSx2LGspO3A9RGQocHwwLHF8MCwyLDApfDA7cT1DO2lmKCEocT4+PjA8aj4+PjB8KHF8MCk9PShqfDApJnA+Pj4wPGk+Pj4wKSlicmVhayBhfX1lbHNle3I9MDtzPTB9ZG97cD1PZChjW2c+PjJdJkd8MCxjW0E+PjJdJkh8MCx0fDAsMCl8MDtwPUYrKHA8PDIpfDA7cT0wO2Rve0s9RSsocTw8Mil8MDtjW0s+PjJdPWNbSz4+Ml1eY1twKyhxPDwyKT4+Ml07cT1xKzF8MH13aGlsZSgocXwwKSE9KGJ8MCkpO2ljKEUsdSx2LGspO3A9T2QoY1toPj4yXSZHfDAsY1t6Pj4yXSZIfDAsdHwwLDApfDA7cD1GKyhwPDwyKXwwO3E9MDtkb3tLPXUrKHE8PDIpfDA7Y1tLPj4yXT1jW0s+PjJdXmNbcCsocTw8Mik+PjJdO3E9cSsxfDB9d2hpbGUoKHF8MCkhPShifDApKTtpYyh1LEUsdixrKTtyPURkKHJ8MCxzfDAsMiwwKXwwO3M9Q313aGlsZShzPj4+MDxqPj4+MHwoc3wwKT09KGp8MCkmcj4+PjA8aT4+PjApfXdoaWxlKDApO2lmKCF3KXtwPTA7ZG97Sz1CKyhwPDwyKXwwO3M9Y1tFKyhwPDwyKT4+Ml18MDthW0s+PjBdPXM7YVtLKzE+PjBdPXM+Pj44O2FbSysyPj4wXT1zPj4+MTY7YVtLKzM+PjBdPXM+Pj4yNDtwPXArMXwwfXdoaWxlKChwfDApIT0odHwwKSl9RD1EKzF8MH13aGlsZSgoRHwwKSE9KGx8MCkpO1liKGUsZixvLEosbSxuKTtLPTA7cmV0dXJuIEt8MH1pZighKGNbNzk3OV18MCkpbz0zMTk2NDtlbHNlIG89Y1sob2EoKXwwKSs2MD4+Ml18MDtjW28+PjJdPTEyO0s9LTE7cmV0dXJuIEt8MH1mdW5jdGlvbiBpYyhhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MDt3PWU8PDE7bT1hKygoZTw8NSkrLTE2PDwyKXwwO289Y1ttPj4yXXwwO2NbZD4+Ml09bztxPWNbbSs0Pj4yXXwwO0w9ZCs0fDA7Y1tMPj4yXT1xO3Q9Y1ttKzg+PjJdfDA7eD1kKzh8MDtjW3g+PjJdPXQ7dT1jW20rMTI+PjJdfDA7eT1kKzEyfDA7Y1t5Pj4yXT11O3M9Y1ttKzE2Pj4yXXwwO3o9ZCsxNnwwO2Nbej4+Ml09cztyPWNbbSsyMD4+Ml18MDtBPWQrMjB8MDtjW0E+PjJdPXI7cD1jW20rMjQ+PjJdfDA7Qj1kKzI0fDA7Y1tCPj4yXT1wO249Y1ttKzI4Pj4yXXwwO0M9ZCsyOHwwO2NbQz4+Ml09bjtsPWNbbSszMj4+Ml18MDtEPWQrMzJ8MDtjW0Q+PjJdPWw7aj1jW20rMzY+PjJdfDA7RT1kKzM2fDA7Y1tFPj4yXT1qO2g9Y1ttKzQwPj4yXXwwO0Y9ZCs0MHwwO2NbRj4+Ml09aDtmPWNbbSs0ND4+Ml18MDtHPWQrNDR8MDtjW0c+PjJdPWY7Zz1jW20rNDg+PjJdfDA7SD1kKzQ4fDA7Y1tIPj4yXT1nO2k9Y1ttKzUyPj4yXXwwO0k9ZCs1MnwwO2NbST4+Ml09aTtrPWNbbSs1Nj4+Ml18MDtKPWQrNTZ8MDtjW0o+PjJdPWs7bT1jW20rNjA+PjJdfDA7Sz1kKzYwfDA7Y1tLPj4yXT1tO2lmKCF3KXJldHVybjt2PWU8PDQ7ZT0wO3doaWxlKDEpe009ZTw8NDtOPWErKE08PDIpfDA7Y1tkPj4yXT1vXmNbTj4+Ml07Y1tMPj4yXT1xXmNbTis0Pj4yXTtjW3g+PjJdPXReY1tOKzg+PjJdO2NbeT4+Ml09dV5jW04rMTI+PjJdO2Nbej4+Ml09c15jW04rMTY+PjJdO2NbQT4+Ml09cl5jW04rMjA+PjJdO2NbQj4+Ml09cF5jW04rMjQ+PjJdO2NbQz4+Ml09bl5jW04rMjg+PjJdO2NbRD4+Ml09bF5jW04rMzI+PjJdO2NbRT4+Ml09al5jW04rMzY+PjJdO2NbRj4+Ml09aF5jW04rNDA+PjJdO2NbRz4+Ml09Zl5jW04rNDQ+PjJdO2NbSD4+Ml09Z15jW04rNDg+PjJdO2NbST4+Ml09aV5jW04rNTI+PjJdO2NbSj4+Ml09a15jW04rNTY+PjJdO2NbSz4+Ml09bV5jW04rNjA+PjJdO2pjKGQpO3U9ZTw8Mzt0PWIrKHU8PDIpfDA7Y1t0Pj4yXT1jW2Q+PjJdO2NbdCs0Pj4yXT1jW0w+PjJdO2NbdCs4Pj4yXT1jW3g+PjJdO2NbdCsxMj4+Ml09Y1t5Pj4yXTtjW3QrMTY+PjJdPWNbej4+Ml07Y1t0KzIwPj4yXT1jW0E+PjJdO2NbdCsyND4+Ml09Y1tCPj4yXTtjW3QrMjg+PjJdPWNbQz4+Ml07Y1t0KzMyPj4yXT1jW0Q+PjJdO2NbdCszNj4+Ml09Y1tFPj4yXTtjW3QrNDA+PjJdPWNbRj4+Ml07Y1t0KzQ0Pj4yXT1jW0c+PjJdO2NbdCs0OD4+Ml09Y1tIPj4yXTtjW3QrNTI+PjJdPWNbST4+Ml07Y1t0KzU2Pj4yXT1jW0o+PjJdO2NbdCs2MD4+Ml09Y1tLPj4yXTt0PWErKChNfDE2KTw8Mil8MDtjW2Q+PjJdPWNbZD4+Ml1eY1t0Pj4yXTtjW0w+PjJdPWNbTD4+Ml1eY1t0KzQ+PjJdO2NbeD4+Ml09Y1t4Pj4yXV5jW3QrOD4+Ml07Y1t5Pj4yXT1jW3k+PjJdXmNbdCsxMj4+Ml07Y1t6Pj4yXT1jW3o+PjJdXmNbdCsxNj4+Ml07Y1tBPj4yXT1jW0E+PjJdXmNbdCsyMD4+Ml07Y1tCPj4yXT1jW0I+PjJdXmNbdCsyND4+Ml07Y1tDPj4yXT1jW0M+PjJdXmNbdCsyOD4+Ml07Y1tEPj4yXT1jW0Q+PjJdXmNbdCszMj4+Ml07Y1tFPj4yXT1jW0U+PjJdXmNbdCszNj4+Ml07Y1tGPj4yXT1jW0Y+PjJdXmNbdCs0MD4+Ml07Y1tHPj4yXT1jW0c+PjJdXmNbdCs0ND4+Ml07Y1tIPj4yXT1jW0g+PjJdXmNbdCs0OD4+Ml07Y1tJPj4yXT1jW0k+PjJdXmNbdCs1Mj4+Ml07Y1tKPj4yXT1jW0o+PjJdXmNbdCs1Nj4+Ml07Y1tLPj4yXT1jW0s+PjJdXmNbdCs2MD4+Ml07amMoZCk7dT1iKyh1K3Y8PDIpfDA7Y1t1Pj4yXT1jW2Q+PjJdO2NbdSs0Pj4yXT1jW0w+PjJdO2NbdSs4Pj4yXT1jW3g+PjJdO2NbdSsxMj4+Ml09Y1t5Pj4yXTtjW3UrMTY+PjJdPWNbej4+Ml07Y1t1KzIwPj4yXT1jW0E+PjJdO2NbdSsyND4+Ml09Y1tCPj4yXTtjW3UrMjg+PjJdPWNbQz4+Ml07Y1t1KzMyPj4yXT1jW0Q+PjJdO2NbdSszNj4+Ml09Y1tFPj4yXTtjW3UrNDA+PjJdPWNbRj4+Ml07Y1t1KzQ0Pj4yXT1jW0c+PjJdO2NbdSs0OD4+Ml09Y1tIPj4yXTtjW3UrNTI+PjJdPWNbST4+Ml07Y1t1KzU2Pj4yXT1jW0o+PjJdO2NbdSs2MD4+Ml09Y1tLPj4yXTtlPWUrMnwwO2lmKGU+Pj4wPj13Pj4+MClicmVhaztmPWNbRz4+Ml18MDtnPWNbSD4+Ml18MDtpPWNbST4+Ml18MDtrPWNbSj4+Ml18MDttPWNbSz4+Ml18MDtvPWNbZD4+Ml18MDtxPWNbTD4+Ml18MDt0PWNbeD4+Ml18MDt1PWNbeT4+Ml18MDtzPWNbej4+Ml18MDtyPWNbQT4+Ml18MDtwPWNbQj4+Ml18MDtuPWNbQz4+Ml18MDtsPWNbRD4+Ml18MDtqPWNbRT4+Ml18MDtoPWNbRj4+Ml18MH1yZXR1cm59ZnVuY3Rpb24gamMoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MDtiPWErNHwwO3o9YSs4fDA7QT1hKzEyfDA7Qj1hKzE2fDA7Rj1hKzIwfDA7Zj1hKzI0fDA7az1hKzI4fDA7bj1hKzMyfDA7cz1hKzM2fDA7dD1hKzQwfDA7dT1hKzQ0fDA7dj1hKzQ4fDA7dz1hKzUyfDA7eD1hKzU2fDA7eT1hKzYwfDA7ZD1jW2I+PjJdfDA7ZT1jW0Y+PjJdfDA7Zz1jW3M+PjJdfDA7aD1jW3c+PjJdfDA7aT1jW2Y+PjJdfDA7aj1jW3Q+PjJdfDA7bD1jW3g+PjJdfDA7bT1jW3o+PjJdfDA7bz1jW3U+PjJdfDA7cD1jW3k+PjJdfDA7cT1jW0E+PjJdfDA7cj1jW2s+PjJdfDA7Qz1jW3Y+PjJdfDA7RD1jW2E+PjJdfDA7RT1jW0I+PjJdfDA7Rz1jW24+PjJdfDA7SD0wO2Rve1I9QytEfDA7Uj0oUjw8N3xSPj4+MjUpXkU7Tz1SK0R8MDtPPShPPDw5fE8+Pj4yMyleRztMPU8rUnwwO0w9KEw8PDEzfEw+Pj4xOSleQztVPUwrT3wwO1U9KFU8PDE4fFU+Pj4xNCleRDtOPWQrZXwwO049KE48PDd8Tj4+PjI1KV5nO0s9TitlfDA7Sz0oSzw8OXxLPj4+MjMpXmg7WD1LK058MDtYPShYPDwxM3xYPj4+MTkpXmQ7UT1YK0t8MDtRPShRPDwxOHxRPj4+MTQpXmU7Sj1pK2p8MDtKPShKPDw3fEo+Pj4yNSlebDtXPUoranwwO1c9KFc8PDl8Vz4+PjIzKV5tO1Q9VytKfDA7VD0oVDw8MTN8VD4+PjE5KV5pO009VCtXfDA7TT0oTTw8MTh8TT4+PjE0KV5qO1Y9bytwfDA7Vj0oVjw8N3xWPj4+MjUpXnE7Uz1WK3B8MDtTPShTPDw5fFM+Pj4yMylecjtQPVMrVnwwO1A9KFA8PDEzfFA+Pj4xOSlebztJPVArU3wwO0k9KEk8PDE4fEk+Pj4xNClecDtZPVYrVXwwO2Q9KFk8PDd8WT4+PjI1KV5YO1g9ZCtVfDA7bT0oWDw8OXxYPj4+MjMpXlc7Vz1tK2R8MDtxPShXPDwxM3xXPj4+MTkpXlY7Vj1xK218MDtEPShWPDwxOHxWPj4+MTQpXlU7VT1SK1F8MDtpPShVPDw3fFU+Pj4yNSleVDtUPWkrUXwwO3I9KFQ8PDl8VD4+PjIzKV5TO1M9citpfDA7RT0oUzw8MTN8Uz4+PjE5KV5SO1I9RStyfDA7ZT0oUjw8MTh8Uj4+PjE0KV5RO1E9TitNfDA7bz0oUTw8N3xRPj4+MjUpXlA7UD1vK018MDtHPShQPDw5fFA+Pj4yMyleTztPPUcrb3wwO2c9KE88PDEzfE8+Pj4xOSleTjtOPWcrR3wwO2o9KE48PDE4fE4+Pj4xNCleTTtNPUorSXwwO0M9KE08PDd8TT4+PjI1KV5MO0w9QytJfDA7aD0oTDw8OXxMPj4+MjMpXks7Sz1oK0N8MDtsPShLPDwxM3xLPj4+MTkpXko7Sj1sK2h8MDtwPShKPDwxOHxKPj4+MTQpXkk7SD1IKzJ8MH13aGlsZShIPj4+MDw4KTtjW2E+PjJdPShjW2E+PjJdfDApK0Q7Y1tiPj4yXT0oY1tiPj4yXXwwKStkO2Nbej4+Ml09KGNbej4+Ml18MCkrbTtjW0E+PjJdPShjW0E+PjJdfDApK3E7Y1tCPj4yXT0oY1tCPj4yXXwwKStFO2NbRj4+Ml09KGNbRj4+Ml18MCkrZTtjW2Y+PjJdPShjW2Y+PjJdfDApK2k7Y1trPj4yXT0oY1trPj4yXXwwKStyO2Nbbj4+Ml09KGNbbj4+Ml18MCkrRztjW3M+PjJdPShjW3M+PjJdfDApK2c7Y1t0Pj4yXT0oY1t0Pj4yXXwwKStqO2NbdT4+Ml09KGNbdT4+Ml18MCkrbztjW3Y+PjJdPShjW3Y+PjJdfDApK0M7Y1t3Pj4yXT0oY1t3Pj4yXXwwKStoO2NbeD4+Ml09KGNbeD4+Ml18MCkrbDtjW3k+PjJdPShjW3k+PjJdfDApK3A7cmV0dXJufWZ1bmN0aW9uIGtjKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIGxjKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIG1jKGEsYil7YT1hfDA7Yj1ifDA7bWQoYSxiLDMzNzg1KTtyZXR1cm4gMH1mdW5jdGlvbiBuYyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7bWQoYSxiLGMpO3JldHVybiAwfWZ1bmN0aW9uIG9jKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIHBjKCl7cmV0dXJuIDI0fWZ1bmN0aW9uIHFjKCl7cmV0dXJuIDE2fWZ1bmN0aW9uIHJjKGIsYyxkLGUsZixnLGgpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtyPWk7cT1pPWkrNjMmLTY0O2k9aSsyNDB8MDtwPXE7bz1xKzE3NnwwO3E9cSsxNDR8MDtuYihxLGcsaCwzMjk4OCk7aD1iO2o9ZDtpZihiPj4+MD49ZD4+PjA/MDxmPj4+MHwwPT0oZnwwKSYoaC1qfDApPj4+MDxlPj4+MDowKWs9NTtlbHNlIGlmKGQ+Pj4wPj1iPj4+MD8wPGY+Pj4wfDA9PShmfDApJihqLWh8MCk+Pj4wPGU+Pj4wOjApaz01O2lmKChrfDApPT01KXtKZChifDAsZHwwLGV8MCl8MDtkPWJ9aD1vO2s9aCszMnwwO2Rve2FbaD4+MF09MDtoPWgrMXwwfXdoaWxlKChofDApPChrfDApKTtsPWY+Pj4wPjB8KGZ8MCk9PTAmZT4+PjA+MzI7bT1sPzMyOmU7bj1sPzA6ZjtoPShtfDApPT0wJihufDApPT0wO2lmKCFoKXtrPWY+Pj4wPDB8KGZ8MCk9PTAmZT4+PjA8MzI7az1EZCgoaz9lOjMyKXwwLChrP2Y6MCl8MCwtMSwwKXwwO0lkKG8rMzJ8MCxkfDAsaysxfDApfDB9az1EZChtfDAsbnwwLDMyLDApfDA7aj1nKzE2fDA7bmQobyxvLGssQyxqLDAsMCxxKTtVYihwLG8pO2lmKCFoKXtnPWY+Pj4wPDB8KGZ8MCk9PTAmZT4+PjA8MzI7Zz1EZCgoZz9lOjMyKXwwLChnP2Y6MCl8MCwtMSwwKXwwO0lkKGJ8MCxvKzMyfDAsZysxfDApfDB9aD1vO2s9aCs2NHwwO2Rve2FbaD4+MF09MDtoPWgrMXwwfXdoaWxlKChofDApPChrfDApKTtpZighbCl7VGIocCxiLGUsZik7UmIocCxjKTtpPXI7cmV0dXJuIDB9bz1DZChlfDAsZnwwLG18MCxufDApfDA7bmQoYittfDAsZCttfDAsbyxDLGosMSwwLHEpO1RiKHAsYixlLGYpO1JiKHAsYyk7aT1yO3JldHVybiAwfWZ1bmN0aW9uIHNjKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtpZihkPj4+MD4wfChkfDApPT0wJmM+Pj4wPjQyOTQ5NjcyNzkpe2U9LTE7cmV0dXJuIGV8MH1yYyhhKzE2fDAsYSxiLGMsZCxlLGYpfDA7ZT0wO3JldHVybiBlfDB9ZnVuY3Rpb24gdGMoYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wO3Q9aTtzPWk9aSs2MyYtNjQ7aT1pKzIwOHwwO209cztvPXMrMTQ0fDA7bj1zKzExMnwwO3I9cys0OHwwO3M9cysxNnwwO25iKHMsaixrLDMyOTg4KTtxPWorMTZ8MDtrPW47aj1zO2w9ayszMnwwO2Rve2Fbaz4+MF09YVtqPj4wXXwwO2s9aysxfDA7aj1qKzF8MH13aGlsZSgoa3wwKTwobHwwKSk7bD1xO2o9bDtsPWwrNHwwO2w9ZFtsPj4wXXxkW2wrMT4+MF08PDh8ZFtsKzI+PjBdPDwxNnxkW2wrMz4+MF08PDI0O2s9bTtjW2s+PjJdPWRbaj4+MF18ZFtqKzE+PjBdPDw4fGRbaisyPj4wXTw8MTZ8ZFtqKzM+PjBdPDwyNDtjW2srND4+Ml09bDtrPW0rOHwwO2Nbaz4+Ml09MDtjW2srND4+Ml09MDtvYihvLG0sbiwzMzgxNyk7az0wO2Rve2FbcitrPj4wXT1hW28raz4+MF18MDtrPWsrMXwwfXdoaWxlKChrfDApIT0zMik7aWYoUWIoZixlLGcsaCxyKXwwKXtrPXM7bD1rKzMyfDA7ZG97YVtrPj4wXT0wO2s9aysxfDB9d2hpbGUoKGt8MCk8KGx8MCkpO3M9LTE7aT10O3JldHVybiBzfDB9az1lO2o9YjtpZihlPj4+MD49Yj4+PjA/MDxoPj4+MHwwPT0oaHwwKSYoay1qfDApPj4+MDxnPj4+MDowKXA9OTtlbHNlIGlmKGI+Pj4wPj1lPj4+MD8wPGg+Pj4wfDA9PShofDApJihqLWt8MCk+Pj4wPGc+Pj4wOjApcD05O2lmKChwfDApPT05KXtKZChifDAsZXwwLGd8MCl8MDtlPWJ9az1oPj4+MD4wfChofDApPT0wJmc+Pj4wPjMyO2o9az8zMjpnO2w9az8wOmg7aWYoKGp8MCk9PTAmKGx8MCk9PTApbmQocixyLDMyLDAscSwwLDAscyk7ZWxzZXtmPXIrMzJ8MDtwPWg+Pj4wPDB8KGh8MCk9PTAmZz4+PjA8MzI7cD1EZCgocD9nOjMyKXwwLChwP2g6MCl8MCwtMSwwKXwwO3A9cCsxfDA7SWQoZnwwLGV8MCxwfDApfDA7bz1EZChqfDAsbHwwLDMyLDApfDA7bmQocixyLG8sQyxxLDAsMCxzKTtJZChifDAsZnwwLHB8MCl8MH1pZihrKXtyPUNkKGd8MCxofDAsanwwLGx8MCl8MDtuZChiK2p8MCxlK2p8MCxyLEMscSwxLDAscyl9az1zO2w9ayszMnwwO2Rve2Fbaz4+MF09MDtrPWsrMXwwfXdoaWxlKChrfDApPChsfDApKTtzPTA7aT10O3JldHVybiBzfDB9ZnVuY3Rpb24gdWMoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2lmKGQ+Pj4wPDB8KGR8MCk9PTAmYz4+PjA8MTYpe2U9LTE7cmV0dXJuIGV8MH1kPURkKGN8MCxkfDAsLTE2LC0xKXwwO2U9dGMoYSxiKzE2fDAsYixkLEMsZSxmKXwwO3JldHVybiBlfDB9ZnVuY3Rpb24gdmMoKXtyZXR1cm4gOH1mdW5jdGlvbiB3Yygpe3JldHVybiAxNn1mdW5jdGlvbiB4YyhiLGMsZSxmLGcpe2I9YnwwO2M9Y3wwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MDtoPWRbZz4+MF18MDtvPUhkKGRbZysxPj4wXXwwfDAsMCw4KXwwO249QztqPUhkKGRbZysyPj4wXXwwfDAsMCwxNil8MDtuPW58QztrPUhkKGRbZyszPj4wXXwwfDAsMCwyNCl8MDtuPW58Q3woZFtnKzQ+PjBdfDApO3I9SGQoZFtnKzU+PjBdfDB8MCwwLDQwKXwwO249bnxDO2k9SGQoZFtnKzY+PjBdfDB8MCwwLDQ4KXwwO249bnxDO2w9SGQoZFtnKzc+PjBdfDB8MCwwLDU2KXwwO2w9b3xofGp8a3xyfGl8bDtuPW58QztpPWRbZys4Pj4wXXwwO3I9SGQoZFtnKzk+PjBdfDB8MCwwLDgpfDA7az1DO2o9SGQoZFtnKzEwPj4wXXwwfDAsMCwxNil8MDtrPWt8QztoPUhkKGRbZysxMT4+MF18MHwwLDAsMjQpfDA7az1rfEN8KGRbZysxMj4+MF18MCk7bz1IZChkW2crMTM+PjBdfDB8MCwwLDQwKXwwO2s9a3xDO3A9SGQoZFtnKzE0Pj4wXXwwfDAsMCw0OCl8MDtrPWt8QzttPUhkKGRbZysxNT4+MF18MHwwLDAsNTYpfDA7bT1yfGl8anxofG98cHxtO2s9a3xDO3A9ZSY3O289YytlKygwLXApfDA7ZT1IZChlfDAsZnwwLDU2KXwwO2c9QztoPW1eMjAzNzY3MTI4MztqPWteMTk1MjgwMTg5MDtpPWxeMTg1MjE0MjE3NztmPW5eMTgxOTg5NTY1MzttPW1eMTg1MjA3NTg4NTtrPWteMTY4NTAyNTM3NztsPWxeMTg4NjYxMDgwNTtuPW5eMTkzNjY4MjM0MTtpZigob3wwKSE9KGN8MCkpe2Rve3g9ZFtjPj4wXXwwO3k9SGQoZFtjKzE+PjBdfDB8MCwwLDgpfDA7cj1DO3c9SGQoZFtjKzI+PjBdfDB8MCwwLDE2KXwwO3I9cnxDO3Q9SGQoZFtjKzM+PjBdfDB8MCwwLDI0KXwwO3I9cnxDfChkW2MrND4+MF18MCk7dT1IZChkW2MrNT4+MF18MHwwLDAsNDApfDA7cj1yfEM7dj1IZChkW2MrNj4+MF18MHwwLDAsNDgpfDA7cj1yfEM7cz1IZChkW2MrNz4+MF18MHwwLDAsNTYpfDA7cz15fHh8d3x0fHV8dnxzO3I9cnxDO3Y9c15oO3U9cl5qO249RGQobHwwLG58MCxtfDAsa3wwKXwwO2w9Qzt0PUhkKG18MCxrfDAsMTMpfDA7aD1DO209R2QobXwwLGt8MCw1MSl8MDttPSh0fG0pXm47aD0oaHxDKV5sO2Y9RGQodnwwLHV8MCxpfDAsZnwwKXwwO2k9Qzt0PUhkKHZ8MCx1fDAsMTYpfDA7aj1DO3U9R2QodnwwLHV8MCw0OCl8MDt1PSh0fHUpXmY7aj0oanxDKV5pO249RGQodXwwLGp8MCxsfDAsbnwwKXwwO2w9Qzt0PUhkKHV8MCxqfDAsMjEpfDA7az1DO2o9R2QodXwwLGp8MCw0Myl8MDtqPSh0fGopXm47az0oa3xDKV5sO2k9RGQoZnwwLGl8MCxtfDAsaHwwKXwwO2Y9Qzt0PUhkKG18MCxofDAsMTcpfDA7dT1DO2g9R2QobXwwLGh8MCw0Nyl8MDtoPWleKHR8aCk7dT1mXih1fEMpO2w9RGQobnwwLGx8MCxofDAsdXwwKXwwO249Qzt0PUhkKGh8MCx1fDAsMTMpfDA7bT1DO3U9R2QoaHwwLHV8MCw1MSl8MDt1PSh0fHUpXmw7bT0obXxDKV5uO2k9RGQoanwwLGt8MCxmfDAsaXwwKXwwO2Y9Qzt0PUhkKGp8MCxrfDAsMTYpfDA7aD1DO2s9R2QoanwwLGt8MCw0OCl8MDtrPSh0fGspXmk7aD0oaHxDKV5mO2w9RGQoa3wwLGh8MCxufDAsbHwwKXwwO249Qzt0PUhkKGt8MCxofDAsMjEpfDA7aj1DO2g9R2Qoa3wwLGh8MCw0Myl8MDtoPSh0fGgpXmw7aj0oanxDKV5uO2Y9RGQoaXwwLGZ8MCx1fDAsbXwwKXwwO2k9Qzt0PUhkKHV8MCxtfDAsMTcpfDA7az1DO209R2QodXwwLG18MCw0Nyl8MDttPSh0fG0pXmY7az0oa3xDKV5pO2w9bF5zO249bl5yO2M9Yys4fDB9d2hpbGUoKGN8MCkhPShvfDApKTtjPW99c3dpdGNoKHB8MCl7Y2FzZSA3OntlPUhkKGRbYys2Pj4wXXwwfDAsMCw0OCl8MHxlO2c9Q3xnO3E9NTticmVha31jYXNlIDY6e3E9NTticmVha31jYXNlIDU6e3E9NjticmVha31jYXNlIDQ6e3E9NzticmVha31jYXNlIDM6e3E9ODticmVha31jYXNlIDI6e3E9OTticmVha31jYXNlIDE6e3E9MTA7YnJlYWt9ZGVmYXVsdDp7fX1pZigocXwwKT09NSl7eT1IZChkW2MrNT4+MF18MHwwLDAsNDApfDA7Zz1DfGc7ZT15fGU7cT02fWlmKChxfDApPT02KXtnPWRbYys0Pj4wXXwwfGc7cT03fWlmKChxfDApPT03KXt5PUhkKGRbYyszPj4wXXwwfDAsMCwyNCl8MDtlPXl8ZTtnPUN8ZztxPTh9aWYoKHF8MCk9PTgpe3k9SGQoZFtjKzI+PjBdfDB8MCwwLDE2KXwwO2U9eXxlO2c9Q3xnO3E9OX1pZigocXwwKT09OSl7eT1IZChkW2MrMT4+MF18MHwwLDAsOCl8MDtlPXl8ZTtnPUN8ZztxPTEwfWlmKChxfDApPT0xMCllPWRbYz4+MF18MHxlO3k9ZV5oO3I9Z15qO3M9RGQobHwwLG58MCxtfDAsa3wwKXwwO3E9Qzt3PUhkKG18MCxrfDAsMTMpfDA7dD1DO3g9R2QobXwwLGt8MCw1MSl8MDt4PSh3fHgpXnM7dD0odHxDKV5xO3c9RGQoeXwwLHJ8MCxpfDAsZnwwKXwwO3Y9Qzt1PUhkKHl8MCxyfDAsMTYpfDA7cD1DO3I9R2QoeXwwLHJ8MCw0OCl8MDtyPSh1fHIpXnc7cD0ocHxDKV52O3M9RGQocnwwLHB8MCxxfDAsc3wwKXwwO3E9Qzt1PUhkKHJ8MCxwfDAsMjEpfDA7eT1DO3A9R2QocnwwLHB8MCw0Myl8MDtwPSh1fHApXnM7eT0oeXxDKV5xO3Y9RGQod3wwLHZ8MCx4fDAsdHwwKXwwO3c9Qzt1PUhkKHh8MCx0fDAsMTcpfDA7cj1DO3Q9R2QoeHwwLHR8MCw0Nyl8MDt0PXZeKHV8dCk7cj13XihyfEMpO3E9RGQoc3wwLHF8MCx0fDAscnwwKXwwO3M9Qzt1PUhkKHR8MCxyfDAsMTMpfDA7eD1DO3I9R2QodHwwLHJ8MCw1MSl8MDtyPSh1fHIpXnE7eD0oeHxDKV5zO3Y9RGQocHwwLHl8MCx3fDAsdnwwKXwwO3c9Qzt1PUhkKHB8MCx5fDAsMTYpfDA7dD1DO3k9R2QocHwwLHl8MCw0OCl8MDt5PSh1fHkpXnY7dD0odHxDKV53O3E9RGQoeXwwLHR8MCxzfDAscXwwKXwwO3M9Qzt1PUhkKHl8MCx0fDAsMjEpfDA7cD1DO3Q9R2QoeXwwLHR8MCw0Myl8MDt0PSh1fHQpXnE7cD0ocHxDKV5zO3c9RGQodnwwLHd8MCxyfDAseHwwKXwwO3Y9Qzt1PUhkKHJ8MCx4fDAsMTcpfDA7eT1DO3g9R2QocnwwLHh8MCw0Nyl8MDt4PSh1fHgpXnc7eT0oeXxDKV52O3M9RGQocV5lfDAsc15nfDAseHwwLHl8MCl8MDtxPUM7dT1IZCh4fDAseXwwLDEzKXwwO3I9Qzt5PUdkKHh8MCx5fDAsNTEpfDA7eT1zXih1fHkpO3I9cV4ocnxDKTt3PURkKHR8MCxwfDAsdl4yNTV8MCx3fDApfDA7dj1DO3U9SGQodHwwLHB8MCwxNil8MDt4PUM7cD1HZCh0fDAscHwwLDQ4KXwwO3A9KHV8cCledzt4PSh4fEMpXnY7cz1EZChwfDAseHwwLHF8MCxzfDApfDA7cT1DO3U9SGQocHwwLHh8MCwyMSl8MDt0PUM7eD1HZChwfDAseHwwLDQzKXwwO3g9KHV8eCleczt0PSh0fEMpXnE7dj1EZCh3fDAsdnwwLHl8MCxyfDApfDA7dz1DO3U9SGQoeXwwLHJ8MCwxNyl8MDtwPUM7cj1HZCh5fDAscnwwLDQ3KXwwO3I9KHV8ciledjtwPShwfEMpXnc7cT1EZChzfDAscXwwLHJ8MCxwfDApfDA7cz1DO3U9SGQocnwwLHB8MCwxMyl8MDt5PUM7cD1HZChyfDAscHwwLDUxKXwwO3A9KHV8cClecTt5PSh5fEMpXnM7dj1EZCh4fDAsdHwwLHd8MCx2fDApfDA7dz1DO3U9SGQoeHwwLHR8MCwxNil8MDtyPUM7dD1HZCh4fDAsdHwwLDQ4KXwwO3Q9KHV8dCledjtyPShyfEMpXnc7cT1EZCh0fDAscnwwLHN8MCxxfDApfDA7cz1DO3U9SGQodHwwLHJ8MCwyMSl8MDt4PUM7cj1HZCh0fDAscnwwLDQzKXwwO3I9KHV8cilecTt4PSh4fEMpXnM7dz1EZCh2fDAsd3wwLHB8MCx5fDApfDA7dj1DO3U9SGQocHwwLHl8MCwxNyl8MDt0PUM7eT1HZChwfDAseXwwLDQ3KXwwO3k9KHV8eSledzt0PSh0fEMpXnY7cz1EZChxfDAsc3wwLHl8MCx0fDApfDA7cT1DO3U9SGQoeXwwLHR8MCwxMyl8MDtwPUM7dD1HZCh5fDAsdHwwLDUxKXwwO3Q9KHV8dClecztwPShwfEMpXnE7dz1EZChyfDAseHwwLHZ8MCx3fDApfDA7dj1DO3U9SGQocnwwLHh8MCwxNil8MDt5PUM7eD1HZChyfDAseHwwLDQ4KXwwO3g9KHV8eCledzt5PSh5fEMpXnY7cz1EZCh4fDAseXwwLHF8MCxzfDApfDA7cT1DO3U9SGQoeHwwLHl8MCwyMSl8MDtyPUM7eT1HZCh4fDAseXwwLDQzKXwwO3k9KHV8eSlecztyPShyfEMpXnE7dj1EZCh3fDAsdnwwLHR8MCxwfDApfDA7dz1DO3U9SGQodHwwLHB8MCwxNyl8MDt4PUM7cD1HZCh0fDAscHwwLDQ3KXwwO3A9KHV8cCledjt4PSh4fEMpXnc7cT1EZChzfDAscXwwLHB8MCx4fDApfDA7cz1DO3U9SGQocHwwLHh8MCwxMyl8MDt0PUM7eD1HZChwfDAseHwwLDUxKXwwO3E9KHV8eClecTtzPSh0fEMpXnM7dj1EZCh5fDAscnwwLHd8MCx2fDApfDA7dz1DO3Q9SGQoeXwwLHJ8MCwxNil8MDt4PUM7cj1HZCh5fDAscnwwLDQ4KXwwO3I9KHR8ciledjt4PSh4fEMpXnc7dD1IZChyfDAseHwwLDIxKXwwO3k9Qzt4PUdkKHJ8MCx4fDAsNDMpfDA7eT15fEM7dz1EZCh2fDAsd3wwLHF8MCxzfDApfDA7dj1DO3I9SGQocXwwLHN8MCwxNyl8MDt1PUM7cz1HZChxfDAsc3wwLDQ3KXwwO3g9KHJ8cyled152Xih0fHgpO3k9KHV8Qyledl53Xnk7YVtiPj4wXT14O2FbYisxPj4wXT14Pj4+ODthW2IrMj4+MF09eD4+PjE2O2FbYiszPj4wXT14Pj4+MjQ7YVtiKzQ+PjBdPXk7dz1HZCh4fDAseXwwLDQwKXwwO2FbYis1Pj4wXT13O3c9R2QoeHwwLHl8MCw0OCl8MDthW2IrNj4+MF09dzt5PUdkKHh8MCx5fDAsNTYpfDA7YVtiKzc+PjBdPXk7cmV0dXJuIDB9ZnVuY3Rpb24geWMoKXtyZXR1cm4gNjR9ZnVuY3Rpb24gemMoKXtyZXR1cm4gMzJ9ZnVuY3Rpb24gQWMoKXtyZXR1cm4gMzJ9ZnVuY3Rpb24gQmMoKXtyZXR1cm4gNjR9ZnVuY3Rpb24gQ2MoYixlLGYpe2I9YnwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7bz1pO2g9aT1pKzYzJi02NDtpPWkrNDk2fDA7az1oO2o9aCs0NDh8MDtsPWgrNDA4fDA7bT1oKzM2OHwwO2g9aCsyMDh8MDtnPWsrNjR8MDtuPWs7cD04O3E9bis2NHwwO2Rve2Nbbj4+Ml09Y1twPj4yXTtuPW4rNHwwO3A9cCs0fDB9d2hpbGUoKG58MCk8KHF8MCkpO249ays3MnwwO2Nbbj4+Ml09MjU2O2Nbbis0Pj4yXT0wO249ZztjW24+PjJdPTA7Y1tuKzQ+PjJdPTA7bj1rKzgwfDA7cD1mO3E9biszMnwwO2Rve2Fbbj4+MF09YVtwPj4wXXwwO249bisxfDA7cD1wKzF8MH13aGlsZSgobnwwKTwocXwwKSk7R2IoayxlKTthW2U+PjBdPShkW2U+PjBdfDApJjI0ODtxPWUrMzF8MDthW3E+PjBdPShkW3E+PjBdfDApJjYzfDY0O1JjKGgsZSk7SWMoaixoKzgwfDApO0pjKGwsaCxqKTtKYyhtLGgrNDB8MCxqKTtMYyhiLG0pO0xjKGssbCk7cT1iKzMxfDA7YVtxPj4wXT0oZFtxPj4wXXwwKV4oZFtrPj4wXXwwKTw8NztKZChlfDAsZnwwLDMyKXwwO0pkKGUrMzJ8MCxifDAsMzIpfDA7aT1vO3JldHVybiAwfWZ1bmN0aW9uIERjKGIsZSl7Yj1ifDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7cT1pO249aT1pKzYzJi02NDtpPWkrNTI4fDA7bT1uO2w9bis0NDh8MDtvPW4rNDA4fDA7cD1uKzM2OHwwO2s9bisyMDh8MDtuPW4rNDg4fDA7Zj0wO2Rve2FbbitmPj4wXT1CYSgwKXwwO2Y9ZisxfDB9d2hpbGUoKGZ8MCkhPTMyKTtmPW0rNjR8MDtnPW07aD04O2o9Zys2NHwwO2Rve2NbZz4+Ml09Y1toPj4yXTtnPWcrNHwwO2g9aCs0fDB9d2hpbGUoKGd8MCk8KGp8MCkpO2c9bSs3MnwwO2NbZz4+Ml09MjU2O2NbZys0Pj4yXT0wO2c9ZjtjW2c+PjJdPTA7Y1tnKzQ+PjJdPTA7Zz1tKzgwfDA7aD1uO2o9ZyszMnwwO2Rve2FbZz4+MF09YVtoPj4wXXwwO2c9ZysxfDA7aD1oKzF8MH13aGlsZSgoZ3wwKTwoanwwKSk7R2IobSxlKTthW2U+PjBdPShkW2U+PjBdfDApJjI0ODtnPWUrMzF8MDthW2c+PjBdPShkW2c+PjBdfDApJjYzfDY0O1JjKGssZSk7SWMobCxrKzgwfDApO0pjKG8sayxsKTtKYyhwLGsrNDB8MCxsKTtMYyhiLHApO0xjKG0sbyk7Zz1iKzMxfDA7YVtnPj4wXT0oZFtnPj4wXXwwKV4oZFttPj4wXXwwKTw8NztnPWU7aD1uO2o9ZyszMnwwO2Rve2FbZz4+MF09YVtoPj4wXXwwO2c9ZysxfDA7aD1oKzF8MH13aGlsZSgoZ3wwKTwoanwwKSk7SmQoZSszMnwwLGJ8MCwzMil8MDtpPXE7cmV0dXJuIDB9ZnVuY3Rpb24gRWMoYSxiLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MDtoPWk7aj1pPWkrNjMmLTY0O2k9aSsxNnwwO2s9YSs2NHwwO0pkKGt8MCxkfDAsZXwwKXwwO1hjKGEsaixrLGUsZixnKTtnPWo7ZD0oYnwwKSE9MDtpZigoY1tnPj4yXXwwKT09NjQmKGNbZys0Pj4yXXwwKT09MCl7aWYoIWQpe2s9MDtpPWg7cmV0dXJuIGt8MH1qPURkKGV8MCxmfDAsNjQsMCl8MDtrPWI7Y1trPj4yXT1qO2Nbays0Pj4yXT1DO2s9MDtpPWg7cmV0dXJuIGt8MH1lbHNle2lmKGQpe2s9YjtjW2s+PjJdPTA7Y1trKzQ+PjJdPTB9az1EZChlfDAsZnwwLDY0LDApfDA7RmQoYXwwLDAsa3wwKXwwO2s9LTE7aT1oO3JldHVybiBrfDB9cmV0dXJuIDB9ZnVuY3Rpb24gRmMoYSxiLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTA7ZT1EZChlfDAsZnwwLC02NCwtMSl8MDtmPUM7ZG8gaWYoIShmPj4+MD4wfChmfDApPT0wJmU+Pj4wPjQyOTQ5NjcyMzEpKXtoPWQrNjR8MDtpZihWYyhkLGgsZSxmLGcpfDApe0ZkKGF8MCwwLGV8MCl8MDticmVha31pZihiKXtkPWI7Y1tkPj4yXT1lO2NbZCs0Pj4yXT1mfUpkKGF8MCxofDAsZXwwKXwwO2Q9MDtyZXR1cm4gZHwwfXdoaWxlKDApO2lmKCFiKXtkPS0xO3JldHVybiBkfDB9ZD1iO2NbZD4+Ml09MDtjW2QrND4+Ml09MDtkPS0xO3JldHVybiBkfDB9ZnVuY3Rpb24gR2MoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO1hjKGEsYixjLGQsZSxmKTtyZXR1cm4gMH1mdW5jdGlvbiBIYyhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBWYyhhLGIsYyxkLGUpfDB9ZnVuY3Rpb24gSWMoYSxiKXthPWF8MDtiPWJ8MDt2YXIgYz0wLGQ9MCxlPTAsZj0wLGc9MDtnPWk7Yz1pPWkrNjMmLTY0O2k9aSsxNjB8MDtkPWMrMTIwfDA7ZT1jKzgwfDA7Zj1jKzQwfDA7S2MoZCxiKTtLYyhlLGQpO0tjKGUsZSk7SmMoZSxiLGUpO0pjKGQsZCxlKTtLYyhmLGQpO0pjKGUsZSxmKTtLYyhmLGUpO0tjKGYsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7SmMoZSxmLGUpO0tjKGYsZSk7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7SmMoZixmLGUpO0tjKGMsZik7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtLYyhjLGMpO0tjKGMsYyk7S2MoYyxjKTtKYyhmLGMsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7S2MoZixmKTtLYyhmLGYpO0tjKGYsZik7S2MoZixmKTtKYyhlLGYsZSk7S2MoZixlKTtiPTE7ZG97S2MoZixmKTtiPWIrMXwwfXdoaWxlKChifDApIT01MCk7SmMoZixmLGUpO0tjKGMsZik7Yj0xO2Rve0tjKGMsYyk7Yj1iKzF8MH13aGlsZSgoYnwwKSE9MTAwKTtKYyhmLGMsZik7S2MoZixmKTtiPTE7ZG97S2MoZixmKTtiPWIrMXwwfXdoaWxlKChifDApIT01MCk7SmMoZSxmLGUpO0tjKGUsZSk7S2MoZSxlKTtLYyhlLGUpO0tjKGUsZSk7S2MoZSxlKTtKYyhhLGUsZCk7aT1nO3JldHVybn1mdW5jdGlvbiBKYyhhLGIsZCl7YT1hfDA7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTAsaWE9MCxqYT0wLGthPTAsbGE9MCxtYT0wLG5hPTAsb2E9MCxwYT0wLHFhPTAscmE9MCxzYT0wLHRhPTAsdWE9MCx2YT0wLHdhPTAseGE9MCx5YT0wLHphPTAsQWE9MCxCYT0wLENhPTAsRGE9MCxFYT0wLEZhPTAsR2E9MCxIYT0wLElhPTAsSmE9MCxLYT0wLExhPTAsTWE9MCxOYT0wLE9hPTAsUGE9MCxRYT0wLFJhPTAsU2E9MCxUYT0wLFVhPTAsVmE9MCxXYT0wLFhhPTAsWWE9MCxaYT0wLF9hPTAsJGE9MCxhYj0wLGJiPTAsY2I9MCxkYj0wLGViPTAsZmI9MCxnYj0wLGhiPTAsaWI9MCxqYj0wLGtiPTAsbGI9MCxtYj0wLG5iPTAsb2I9MCxwYj0wLHFiPTAscmI9MCxzYj0wLHRiPTAsdWI9MCx2Yj0wLHdiPTAseGI9MCx5Yj0wLHpiPTAsQWI9MCxCYj0wLENiPTAsRGI9MCxFYj0wLEZiPTAsR2I9MCxIYj0wLEliPTAsSmI9MCxLYj0wLExiPTAsTWI9MCxOYj0wLE9iPTAsUGI9MCxRYj0wLFJiPTAsU2I9MCxUYj0wLFViPTAsVmI9MCxXYj0wLFhiPTAsWWI9MCxaYj0wLF9iPTAsJGI9MCxhYz0wLGJjPTAsY2M9MCxkYz0wLGVjPTAsZmM9MCxnYz0wLGhjPTAsaWM9MCxqYz0wLGtjPTAsbGM9MCxtYz0wLG5jPTAsb2M9MCxwYz0wLHFjPTAscmM9MCxzYz0wLHRjPTAsdWM9MCx2Yz0wLHdjPTAseGM9MCx5Yz0wLHpjPTAsQWM9MCxCYz0wLENjPTAsRGM9MCxFYz0wLEZjPTAsR2M9MCxIYz0wLEljPTAsSmM9MCxLYz0wLExjPTAsTWM9MCxOYz0wLE9jPTAsUGM9MCxRYz0wLFJjPTAsU2M9MDtsPWNbYj4+Ml18MDtzPWNbYis0Pj4yXXwwO2o9Y1tiKzg+PjJdfDA7UmI9Y1tiKzEyPj4yXXwwO2U9Y1tiKzE2Pj4yXXwwO3phPWNbYisyMD4+Ml18MDt5YT1jW2IrMjQ+PjJdfDA7emI9Y1tiKzI4Pj4yXXwwO2g9Y1tiKzMyPj4yXXwwO2dhPWNbYiszNj4+Ml18MDtIPWNbZD4+Ml18MDtKPWNbZCs0Pj4yXXwwO0Y9Y1tkKzg+PjJdfDA7RD1jW2QrMTI+PjJdfDA7QT1jW2QrMTY+PjJdfDA7eT1jW2QrMjA+PjJdfDA7dz1jW2QrMjQ+PjJdfDA7dT1jW2QrMjg+PjJdfDA7az1jW2QrMzI+PjJdfDA7dD1jW2QrMzY+PjJdfDA7T2M9SioxOXwwO2JjPUYqMTl8MDtyYj1EKjE5fDA7SGE9QSoxOXwwO2pjPXkqMTl8MDtEYj13KjE5fDA7VGE9dSoxOXwwO1NjPWsqMTl8MDtRYz10KjE5fDA7cD1zPDwxO2Y9UmI8PDE7TT16YTw8MTtpPXpiPDwxO2Q9Z2E8PDE7bz0oKGx8MCk8MCk8PDMxPj4zMTtJPSgoSHwwKTwwKTw8MzE+PjMxO01jPU9kKEh8MCxJfDAsbHwwLG98MCl8MDtMYz1DO0s9KChKfDApPDApPDwzMT4+MzE7d2M9T2QoSnwwLEt8MCxsfDAsb3wwKXwwO3ZjPUM7Rz0oKEZ8MCk8MCk8PDMxPj4zMTt1Yj1PZChGfDAsR3wwLGx8MCxvfDApfDA7dGI9QztFPSgoRHwwKTwwKTw8MzE+PjMxO0thPU9kKER8MCxFfDAsbHwwLG98MCl8MDtKYT1DO0I9KChBfDApPDApPDwzMT4+MzE7bWM9T2QoQXwwLEJ8MCxsfDAsb3wwKXwwO2xjPUM7ej0oKHl8MCk8MCk8PDMxPj4zMTtHYj1PZCh5fDAsenwwLGx8MCxvfDApfDA7RmI9Qzt4PSgod3wwKTwwKTw8MzE+PjMxO1dhPU9kKHd8MCx4fDAsbHwwLG98MCl8MDtWYT1DO3Y9KCh1fDApPDApPDwzMT4+MzE7amE9T2QodXwwLHZ8MCxsfDAsb3wwKXwwO2lhPUM7UGM9KChrfDApPDApPDwzMT4+MzE7UD1PZChrfDAsUGN8MCxsfDAsb3wwKXwwO089QztvPU9kKHR8MCwoKHR8MCk8MCk8PDMxPj4zMXwwLGx8MCxvfDApfDA7bD1DO3Q9KChzfDApPDApPDwzMT4+MzE7ZGM9T2QoSHwwLEl8MCxzfDAsdHwwKXwwO2VjPUM7bj0oKHB8MCk8MCk8PDMxPj4zMTt5Yj1PZChKfDAsS3wwLHB8MCxufDApfDA7eGI9QztNYT1PZChGfDAsR3wwLHN8MCx0fDApfDA7TGE9QztvYz1PZChEfDAsRXwwLHB8MCxufDApfDA7bmM9QztJYj1PZChBfDAsQnwwLHN8MCx0fDApfDA7SGI9QztZYT1PZCh5fDAsenwwLHB8MCxufDApfDA7WGE9QztsYT1PZCh3fDAseHwwLHN8MCx0fDApfDA7a2E9QztSPU9kKHV8MCx2fDAscHwwLG58MCl8MDtRPUM7dD1PZChrfDAsUGN8MCxzfDAsdHwwKXwwO3M9QztQYz0oKFFjfDApPDApPDwzMT4+MzE7bj1PZChRY3wwLFBjfDAscHwwLG58MCl8MDtwPUM7az0oKGp8MCk8MCk8PDMxPj4zMTt3Yj1PZChIfDAsSXwwLGp8MCxrfDApfDA7dmI9QztRYT1PZChKfDAsS3wwLGp8MCxrfDApfDA7UGE9QztxYz1PZChGfDAsR3wwLGp8MCxrfDApfDA7cGM9QztLYj1PZChEfDAsRXwwLGp8MCxrfDApfDA7SmI9QztfYT1PZChBfDAsQnwwLGp8MCxrfDApfDA7WmE9QztuYT1PZCh5fDAsenwwLGp8MCxrfDApfDA7bWE9QztUPU9kKHd8MCx4fDAsanwwLGt8MCl8MDtTPUM7dj1PZCh1fDAsdnwwLGp8MCxrfDApfDA7dT1DO1JjPSgoU2N8MCk8MCk8PDMxPj4zMTt5Yz1PZChTY3wwLFJjfDAsanwwLGt8MCl8MDt4Yz1DO2s9T2QoUWN8MCxQY3wwLGp8MCxrfDApfDA7aj1DO1NiPSgoUmJ8MCk8MCk8PDMxPj4zMTtPYT1PZChIfDAsSXwwLFJifDAsU2J8MCl8MDtOYT1DO2ZhPSgoZnwwKTwwKTw8MzE+PjMxO3VjPU9kKEp8MCxLfDAsZnwwLGZhfDApfDA7dGM9QztNYj1PZChGfDAsR3wwLFJifDAsU2J8MCl8MDtMYj1DO2FiPU9kKER8MCxFfDAsZnwwLGZhfDApfDA7JGE9QztwYT1PZChBfDAsQnwwLFJifDAsU2J8MCl8MDtvYT1DO1Y9T2QoeXwwLHp8MCxmfDAsZmF8MCl8MDtVPUM7eD1PZCh3fDAseHwwLFJifDAsU2J8MCl8MDt3PUM7VWE9KChUYXwwKTwwKTw8MzE+PjMxO0FjPU9kKFRhfDAsVWF8MCxmfDAsZmF8MCl8MDt6Yz1DO1NiPU9kKFNjfDAsUmN8MCxSYnwwLFNifDApfDA7UmI9QztmYT1PZChRY3wwLFBjfDAsZnwwLGZhfDApfDA7Zj1DO049KChlfDApPDApPDwzMT4+MzE7c2M9T2QoSHwwLEl8MCxlfDAsTnwwKXwwO3JjPUM7UWI9T2QoSnwwLEt8MCxlfDAsTnwwKXwwO1BiPUM7Y2I9T2QoRnwwLEd8MCxlfDAsTnwwKXwwO2JiPUM7cmE9T2QoRHwwLEV8MCxlfDAsTnwwKXwwO3FhPUM7WD1PZChBfDAsQnwwLGV8MCxOfDApfDA7Vz1DO3o9T2QoeXwwLHp8MCxlfDAsTnwwKXwwO3k9QztFYj0oKERifDApPDApPDwzMT4+MzE7Q2M9T2QoRGJ8MCxFYnwwLGV8MCxOfDApfDA7QmM9QztVYj1PZChUYXwwLFVhfDAsZXwwLE58MCl8MDtUYj1DO2liPU9kKFNjfDAsUmN8MCxlfDAsTnwwKXwwO2hiPUM7Tj1PZChRY3wwLFBjfDAsZXwwLE58MCl8MDtlPUM7QWE9KCh6YXwwKTwwKTw8MzE+PjMxO09iPU9kKEh8MCxJfDAsemF8MCxBYXwwKXwwO05iPUM7Yj0oKE18MCk8MCk8PDMxPj4zMTtnYj1PZChKfDAsS3wwLE18MCxifDApfDA7ZmI9Qzt0YT1PZChGfDAsR3wwLHphfDAsQWF8MCl8MDtzYT1DO1o9T2QoRHwwLEV8MCxNfDAsYnwwKXwwO1k9QztCPU9kKEF8MCxCfDAsemF8MCxBYXwwKXwwO0E9QztrYz0oKGpjfDApPDApPDwzMT4+MzE7RWM9T2QoamN8MCxrY3wwLE18MCxifDApfDA7RGM9QztXYj1PZChEYnwwLEVifDAsemF8MCxBYXwwKXwwO1ZiPUM7a2I9T2QoVGF8MCxVYXwwLE18MCxifDApfDA7amI9QztBYT1PZChTY3wwLFJjfDAsemF8MCxBYXwwKXwwO3phPUM7Yj1PZChRY3wwLFBjfDAsTXwwLGJ8MCl8MDtNPUM7Zz0oKHlhfDApPDApPDwzMT4+MzE7ZWI9T2QoSHwwLEl8MCx5YXwwLGd8MCl8MDtkYj1DO3hhPU9kKEp8MCxLfDAseWF8MCxnfDApfDA7d2E9QzskPU9kKEZ8MCxHfDAseWF8MCxnfDApfDA7Xz1DO0U9T2QoRHwwLEV8MCx5YXwwLGd8MCl8MDtEPUM7SWE9KChIYXwwKTwwKTw8MzE+PjMxO0djPU9kKEhhfDAsSWF8MCx5YXwwLGd8MCl8MDtGYz1DO1liPU9kKGpjfDAsa2N8MCx5YXwwLGd8MCl8MDtYYj1DO21iPU9kKERifDAsRWJ8MCx5YXwwLGd8MCl8MDtsYj1DO0NhPU9kKFRhfDAsVWF8MCx5YXwwLGd8MCl8MDtCYT1DO209T2QoU2N8MCxSY3wwLHlhfDAsZ3wwKXwwO3I9QztnPU9kKFFjfDAsUGN8MCx5YXwwLGd8MCl8MDt5YT1DO0FiPSgoemJ8MCk8MCk8PDMxPj4zMTt2YT1PZChIfDAsSXwwLHpifDAsQWJ8MCl8MDt1YT1DO2VhPSgoaXwwKTwwKTw8MzE+PjMxO2RhPU9kKEp8MCxLfDAsaXwwLGVhfDApfDA7Y2E9QztHPU9kKEZ8MCxHfDAsemJ8MCxBYnwwKXwwO0Y9QztzYj0oKHJifDApPDApPDwzMT4+MzE7SWM9T2QocmJ8MCxzYnwwLGl8MCxlYXwwKXwwO0hjPUM7X2I9T2QoSGF8MCxJYXwwLHpifDAsQWJ8MCl8MDtaYj1DO29iPU9kKGpjfDAsa2N8MCxpfDAsZWF8MCl8MDtuYj1DO0VhPU9kKERifDAsRWJ8MCx6YnwwLEFifDApfDA7RGE9QztnYz1PZChUYXwwLFVhfDAsaXwwLGVhfDApfDA7ZmM9QztBYj1PZChTY3wwLFJjfDAsemJ8MCxBYnwwKXwwO3piPUM7ZWE9T2QoUWN8MCxQY3wwLGl8MCxlYXwwKXwwO2k9QztMPSgoaHwwKTwwKTw8MzE+PjMxO2JhPU9kKEh8MCxJfDAsaHwwLEx8MCl8MDthYT1DO0s9T2QoSnwwLEt8MCxofDAsTHwwKXwwO0o9QztjYz0oKGJjfDApPDApPDwzMT4+MzE7S2M9T2QoYmN8MCxjY3wwLGh8MCxMfDApfDA7SmM9QzthYz1PZChyYnwwLHNifDAsaHwwLEx8MCl8MDskYj1DO3FiPU9kKEhhfDAsSWF8MCxofDAsTHwwKXwwO3BiPUM7R2E9T2QoamN8MCxrY3wwLGh8MCxMfDApfDA7RmE9QztpYz1PZChEYnwwLEVifDAsaHwwLEx8MCl8MDtoYz1DO0NiPU9kKFRhfDAsVWF8MCxofDAsTHwwKXwwO0JiPUM7U2E9T2QoU2N8MCxSY3wwLGh8MCxMfDApfDA7UmE9QztMPU9kKFFjfDAsUGN8MCxofDAsTHwwKXwwO2g9QztoYT0oKGdhfDApPDApPDwzMT4+MzE7ST1PZChIfDAsSXwwLGdhfDAsaGF8MCl8MDtIPUM7cT0oKGR8MCk8MCk8PDMxPj4zMTtPYz1PZChPY3wwLCgoT2N8MCk8MCk8PDMxPj4zMXwwLGR8MCxxfDApfDA7TmM9QztjYz1PZChiY3wwLGNjfDAsZ2F8MCxoYXwwKXwwO2JjPUM7c2I9T2QocmJ8MCxzYnwwLGR8MCxxfDApfDA7cmI9QztJYT1PZChIYXwwLElhfDAsZ2F8MCxoYXwwKXwwO0hhPUM7a2M9T2QoamN8MCxrY3wwLGR8MCxxfDApfDA7amM9QztFYj1PZChEYnwwLEVifDAsZ2F8MCxoYXwwKXwwO0RiPUM7VWE9T2QoVGF8MCxVYXwwLGR8MCxxfDApfDA7VGE9QztoYT1PZChTY3wwLFJjfDAsZ2F8MCxoYXwwKXwwO2dhPUM7cT1PZChRY3wwLFBjfDAsZHwwLHF8MCl8MDtkPUM7TGM9RGQoT2N8MCxOY3wwLE1jfDAsTGN8MCl8MDtKYz1EZChMY3wwLEN8MCxLY3wwLEpjfDApfDA7SGM9RGQoSmN8MCxDfDAsSWN8MCxIY3wwKXwwO0ZjPURkKEhjfDAsQ3wwLEdjfDAsRmN8MCl8MDtEYz1EZChGY3wwLEN8MCxFY3wwLERjfDApfDA7QmM9RGQoRGN8MCxDfDAsQ2N8MCxCY3wwKXwwO3pjPURkKEJjfDAsQ3wwLEFjfDAsemN8MCl8MDt4Yz1EZCh6Y3wwLEN8MCx5Y3wwLHhjfDApfDA7cD1EZCh4Y3wwLEN8MCxufDAscHwwKXwwO249QztlYz1EZCh3Y3wwLHZjfDAsZGN8MCxlY3wwKXwwO2RjPUM7cmM9RGQodWN8MCx0Y3wwLHNjfDAscmN8MCl8MDtwYz1EZChyY3wwLEN8MCxxY3wwLHBjfDApfDA7bmM9RGQocGN8MCxDfDAsb2N8MCxuY3wwKXwwO2xjPURkKG5jfDAsQ3wwLG1jfDAsbGN8MCl8MDtqYz1EZChsY3wwLEN8MCxrY3wwLGpjfDApfDA7aGM9RGQoamN8MCxDfDAsaWN8MCxoY3wwKXwwO2ZjPURkKGhjfDAsQ3wwLGdjfDAsZmN8MCl8MDtyPURkKGZjfDAsQ3wwLG18MCxyfDApfDA7TT1EZChyfDAsQ3wwLGJ8MCxNfDApfDA7Yj1DO3I9RGQocHwwLG58MCwzMzU1NDQzMiwwKXwwO3I9RWQocnwwLEN8MCwyNil8MDttPUM7YmM9RGQoZWN8MCxkY3wwLGNjfDAsYmN8MCl8MDskYj1EZChiY3wwLEN8MCxhY3wwLCRifDApfDA7WmI9RGQoJGJ8MCxDfDAsX2J8MCxaYnwwKXwwO1hiPURkKFpifDAsQ3wwLFlifDAsWGJ8MCl8MDtWYj1EZChYYnwwLEN8MCxXYnwwLFZifDApfDA7VGI9RGQoVmJ8MCxDfDAsVWJ8MCxUYnwwKXwwO1JiPURkKFRifDAsQ3wwLFNifDAsUmJ8MCl8MDtqPURkKFJifDAsQ3wwLGt8MCxqfDApfDA7aj1EZChqfDAsQ3wwLHJ8MCxtfDApfDA7az1DO209SGQocnwwLG18MCwyNil8MDttPUNkKHB8MCxufDAsbXwwLEN8MCl8MDtuPUM7cD1EZChNfDAsYnwwLDMzNTU0NDMyLDApfDA7cD1FZChwfDAsQ3wwLDI2KXwwO3I9QztOYj1EZChRYnwwLFBifDAsT2J8MCxOYnwwKXwwO0xiPURkKE5ifDAsQ3wwLE1ifDAsTGJ8MCl8MDtKYj1EZChMYnwwLEN8MCxLYnwwLEpifDApfDA7SGI9RGQoSmJ8MCxDfDAsSWJ8MCxIYnwwKXwwO0ZiPURkKEhifDAsQ3wwLEdifDAsRmJ8MCl8MDtEYj1EZChGYnwwLEN8MCxFYnwwLERifDApfDA7QmI9RGQoRGJ8MCxDfDAsQ2J8MCxCYnwwKXwwO3piPURkKEJifDAsQ3wwLEFifDAsemJ8MCl8MDt5YT1EZCh6YnwwLEN8MCxnfDAseWF8MCl8MDt5YT1EZCh5YXwwLEN8MCxwfDAscnwwKXwwO2c9QztyPUhkKHB8MCxyfDAsMjYpfDA7cj1DZChNfDAsYnwwLHJ8MCxDfDApfDA7Yj1DO009RGQoanwwLGt8MCwxNjc3NzIxNiwwKXwwO009RWQoTXwwLEN8MCwyNSl8MDtwPUM7dmI9RGQoeWJ8MCx4YnwwLHdifDAsdmJ8MCl8MDt0Yj1EZCh2YnwwLEN8MCx1YnwwLHRifDApfDA7cmI9RGQodGJ8MCxDfDAsc2J8MCxyYnwwKXwwO3BiPURkKHJifDAsQ3wwLHFifDAscGJ8MCl8MDtuYj1EZChwYnwwLEN8MCxvYnwwLG5ifDApfDA7bGI9RGQobmJ8MCxDfDAsbWJ8MCxsYnwwKXwwO2piPURkKGxifDAsQ3wwLGtifDAsamJ8MCl8MDtoYj1EZChqYnwwLEN8MCxpYnwwLGhifDApfDA7Zj1EZChoYnwwLEN8MCxmYXwwLGZ8MCl8MDtmPURkKGZ8MCxDfDAsTXwwLHB8MCl8MDtmYT1DO3A9SGQoTXwwLHB8MCwyNSl8MDtwPUNkKGp8MCxrfDAscHwwLEN8MCl8MDtrPUM7aj1EZCh5YXwwLGd8MCwxNjc3NzIxNiwwKXwwO2o9RWQoanwwLEN8MCwyNSl8MDtNPUM7ZGI9RGQoZ2J8MCxmYnwwLGVifDAsZGJ8MCl8MDtiYj1EZChkYnwwLEN8MCxjYnwwLGJifDApfDA7JGE9RGQoYmJ8MCxDfDAsYWJ8MCwkYXwwKXwwO1phPURkKCRhfDAsQ3wwLF9hfDAsWmF8MCl8MDtYYT1EZChaYXwwLEN8MCxZYXwwLFhhfDApfDA7VmE9RGQoWGF8MCxDfDAsV2F8MCxWYXwwKXwwO1RhPURkKFZhfDAsQ3wwLFVhfDAsVGF8MCl8MDtSYT1EZChUYXwwLEN8MCxTYXwwLFJhfDApfDA7aT1EZChSYXwwLEN8MCxlYXwwLGl8MCl8MDtpPURkKGl8MCxDfDAsanwwLE18MCl8MDtlYT1DO009SGQoanwwLE18MCwyNSl8MDtNPUNkKHlhfDAsZ3wwLE18MCxDfDApfDA7Zz1DO3lhPURkKGZ8MCxmYXwwLDMzNTU0NDMyLDApfDA7eWE9RWQoeWF8MCxDfDAsMjYpfDA7aj1DO05hPURkKFFhfDAsUGF8MCxPYXwwLE5hfDApfDA7TGE9RGQoTmF8MCxDfDAsTWF8MCxMYXwwKXwwO0phPURkKExhfDAsQ3wwLEthfDAsSmF8MCl8MDtIYT1EZChKYXwwLEN8MCxJYXwwLEhhfDApfDA7RmE9RGQoSGF8MCxDfDAsR2F8MCxGYXwwKXwwO0RhPURkKEZhfDAsQ3wwLEVhfDAsRGF8MCl8MDtCYT1EZChEYXwwLEN8MCxDYXwwLEJhfDApfDA7emE9RGQoQmF8MCxDfDAsQWF8MCx6YXwwKXwwO2U9RGQoemF8MCxDfDAsTnwwLGV8MCl8MDtlPURkKGV8MCxDfDAseWF8MCxqfDApfDA7Tj1DO2o9SGQoeWF8MCxqfDAsMjYpfDA7aj1DZChmfDAsZmF8MCxqfDAsQ3wwKXwwO2ZhPURkKGl8MCxlYXwwLDMzNTU0NDMyLDApfDA7ZmE9RWQoZmF8MCxDfDAsMjYpfDA7Zj1DO3VhPURkKHhhfDAsd2F8MCx2YXwwLHVhfDApfDA7c2E9RGQodWF8MCxDfDAsdGF8MCxzYXwwKXwwO3FhPURkKHNhfDAsQ3wwLHJhfDAscWF8MCl8MDtvYT1EZChxYXwwLEN8MCxwYXwwLG9hfDApfDA7bWE9RGQob2F8MCxDfDAsbmF8MCxtYXwwKXwwO2thPURkKG1hfDAsQ3wwLGxhfDAsa2F8MCl8MDtpYT1EZChrYXwwLEN8MCxqYXwwLGlhfDApfDA7Z2E9RGQoaWF8MCxDfDAsaGF8MCxnYXwwKXwwO2g9RGQoZ2F8MCxDfDAsTHwwLGh8MCl8MDtoPURkKGh8MCxDfDAsZmF8MCxmfDApfDA7TD1DO2Y9SGQoZmF8MCxmfDAsMjYpfDA7Zj1DZChpfDAsZWF8MCxmfDAsQ3wwKXwwO2VhPURkKGV8MCxOfDAsMTY3NzcyMTYsMCl8MDtlYT1FZChlYXwwLEN8MCwyNSl8MDtpPUM7Yj1EZChlYXwwLGl8MCxyfDAsYnwwKXwwO3I9QztpPUhkKGVhfDAsaXwwLDI1KXwwO2k9Q2QoZXwwLE58MCxpfDAsQ3wwKXwwO049RGQoaHwwLEx8MCwxNjc3NzIxNiwwKXwwO049RWQoTnwwLEN8MCwyNSl8MDtlPUM7YWE9RGQoZGF8MCxjYXwwLGJhfDAsYWF8MCl8MDtfPURkKGFhfDAsQ3wwLCR8MCxffDApfDA7WT1EZChffDAsQ3wwLFp8MCxZfDApfDA7Vz1EZChZfDAsQ3wwLFh8MCxXfDApfDA7VT1EZChXfDAsQ3wwLFZ8MCxVfDApfDA7Uz1EZChVfDAsQ3wwLFR8MCxTfDApfDA7UT1EZChTfDAsQ3wwLFJ8MCxRfDApfDA7Tz1EZChRfDAsQ3wwLFB8MCxPfDApfDA7ZD1EZChPfDAsQ3wwLHF8MCxkfDApfDA7ZD1EZChkfDAsQ3wwLE58MCxlfDApfDA7cT1DO2U9SGQoTnwwLGV8MCwyNSl8MDtlPUNkKGh8MCxMfDAsZXwwLEN8MCl8MDtMPURkKGJ8MCxyfDAsMzM1NTQ0MzIsMCl8MDtMPUVkKEx8MCxDfDAsMjYpfDA7aD1DO2c9RGQoTXwwLGd8MCxMfDAsaHwwKXwwO2g9SGQoTHwwLGh8MCwyNil8MDtoPUNkKGJ8MCxyfDAsaHwwLEN8MCl8MDtyPURkKGR8MCxxfDAsMzM1NTQ0MzIsMCl8MDtyPUVkKHJ8MCxDfDAsMjYpfDA7Yj1DO0g9RGQoS3wwLEp8MCxJfDAsSHwwKXwwO0Y9RGQoSHwwLEN8MCxHfDAsRnwwKXwwO0Q9RGQoRnwwLEN8MCxFfDAsRHwwKXwwO0E9RGQoRHwwLEN8MCxCfDAsQXwwKXwwO3k9RGQoQXwwLEN8MCx6fDAseXwwKXwwO3c9RGQoeXwwLEN8MCx4fDAsd3wwKXwwO3U9RGQod3wwLEN8MCx2fDAsdXwwKXwwO3M9RGQodXwwLEN8MCx0fDAsc3wwKXwwO2w9RGQoc3wwLEN8MCxvfDAsbHwwKXwwO2w9RGQobHwwLEN8MCxyfDAsYnwwKXwwO289QztiPUhkKHJ8MCxifDAsMjYpfDA7Yj1DZChkfDAscXwwLGJ8MCxDfDApfDA7cT1EZChsfDAsb3wwLDE2Nzc3MjE2LDApfDA7cT1FZChxfDAsQ3wwLDI1KXwwO2Q9QztyPU9kKHF8MCxkfDAsMTksMCl8MDtuPURkKHJ8MCxDfDAsbXwwLG58MCl8MDttPUM7ZD1IZChxfDAsZHwwLDI1KXwwO2Q9Q2QobHwwLG98MCxkfDAsQ3wwKXwwO289RGQobnwwLG18MCwzMzU1NDQzMiwwKXwwO289RWQob3wwLEN8MCwyNil8MDtsPUM7az1EZChwfDAsa3wwLG98MCxsfDApfDA7bD1IZChvfDAsbHwwLDI2KXwwO2w9Q2QobnwwLG18MCxsfDAsQ3wwKXwwO2NbYT4+Ml09bDtjW2ErND4+Ml09aztjW2ErOD4+Ml09ajtjW2ErMTI+PjJdPWk7Y1thKzE2Pj4yXT1oO2NbYSsyMD4+Ml09ZztjW2ErMjQ+PjJdPWY7Y1thKzI4Pj4yXT1lO2NbYSszMj4+Ml09YjtjW2ErMzY+PjJdPWQ7cmV0dXJufWZ1bmN0aW9uIEtjKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MCxTPTAsVD0wLFU9MCxWPTAsVz0wLFg9MCxZPTAsWj0wLF89MCwkPTAsYWE9MCxiYT0wLGNhPTAsZGE9MCxlYT0wLGZhPTAsZ2E9MCxoYT0wLGlhPTAsamE9MCxrYT0wLGxhPTAsbWE9MCxuYT0wLG9hPTAscGE9MCxxYT0wLHJhPTAsc2E9MCx0YT0wLHVhPTAsdmE9MCx3YT0wLHhhPTAseWE9MCx6YT0wLEFhPTAsQmE9MCxDYT0wLERhPTAsRWE9MCxGYT0wLEdhPTAsSGE9MCxJYT0wLEphPTAsS2E9MCxMYT0wLE1hPTAsTmE9MCxPYT0wLFBhPTAsUWE9MCxSYT0wLFNhPTAsVGE9MCxVYT0wLFZhPTAsV2E9MCxYYT0wLFlhPTAsWmE9MCxfYT0wLCRhPTAsYWI9MCxiYj0wLGNiPTAsZGI9MCxlYj0wLGZiPTAsZ2I9MDtiYj1jW2I+PjJdfDA7dWE9Y1tiKzQ+PjJdfDA7aj1jW2IrOD4+Ml18MDtsYT1jW2IrMTI+PjJdfDA7ZT1jW2IrMTY+PjJdfDA7ZGI9Y1tiKzIwPj4yXXwwO1k9Y1tiKzI0Pj4yXXwwO0xhPWNbYisyOD4+Ml18MDtoPWNbYiszMj4+Ml18MDtiPWNbYiszNj4+Ml18MDtsPWJiPDwxO3A9dWE8PDE7WGE9ajw8MTtmPWxhPDwxO25hPWU8PDE7Qj1kYjw8MTttPVk8PDE7aT1MYTw8MTtLYT1kYiozOHwwO3JhPVkqMTl8MDt2YT1MYSozOHwwO2RhPWgqMTl8MDtnYj1iKjM4fDA7Y2I9KChiYnwwKTwwKTw8MzE+PjMxO2NiPU9kKGJifDAsY2J8MCxiYnwwLGNifDApfDA7YmI9QztvPSgobHwwKTwwKTw8MzE+PjMxO3RhPSgodWF8MCk8MCk8PDMxPj4zMTtJYT1PZChsfDAsb3wwLHVhfDAsdGF8MCl8MDtIYT1DO2s9KChqfDApPDApPDwzMT4+MzE7V2E9T2QoanwwLGt8MCxsfDAsb3wwKXwwO1ZhPUM7bWE9KChsYXwwKTwwKTw8MzE+PjMxO1VhPU9kKGxhfDAsbWF8MCxsfDAsb3wwKXwwO1RhPUM7RD0oKGV8MCk8MCk8PDMxPj4zMTtPYT1PZChlfDAsRHwwLGx8MCxvfDApfDA7TmE9QztlYj0oKGRifDApPDApPDwzMT4+MzE7eWE9T2QoZGJ8MCxlYnwwLGx8MCxvfDApfDA7eGE9QztnPSgoWXwwKTwwKTw8MzE+PjMxO2dhPU9kKFl8MCxnfDAsbHwwLG98MCl8MDtmYT1DO01hPSgoTGF8MCk8MCk8PDMxPj4zMTtSPU9kKExhfDAsTWF8MCxsfDAsb3wwKXwwO1E9QztBPSgoaHwwKTwwKTw8MzE+PjMxO0Y9T2QoaHwwLEF8MCxsfDAsb3wwKXwwO0U9QztxPSgoYnwwKTwwKTw8MzE+PjMxO289T2QoYnwwLHF8MCxsfDAsb3wwKXwwO2w9QztuPSgocHwwKTwwKTw8MzE+PjMxO3RhPU9kKHB8MCxufDAsdWF8MCx0YXwwKXwwO3VhPUM7YmE9T2QocHwwLG58MCxqfDAsa3wwKXwwO2NhPUM7UD0oKGZ8MCk8MCk8PDMxPj4zMTtTYT1PZChmfDAsUHwwLHB8MCxufDApfDA7UmE9QztDYT1PZChlfDAsRHwwLHB8MCxufDApfDA7QmE9QztkPSgoQnwwKTwwKTw8MzE+PjMxO2lhPU9kKEJ8MCxkfDAscHwwLG58MCl8MDtoYT1DO1Q9T2QoWXwwLGd8MCxwfDAsbnwwKXwwO1M9QztPPSgoaXwwKTwwKTw8MzE+PjMxO0g9T2QoaXwwLE98MCxwfDAsbnwwKXwwO0c9Qzt0PU9kKGh8MCxBfDAscHwwLG58MCl8MDtzPUM7ZmI9KChnYnwwKTwwKTw8MzE+PjMxO249T2QoZ2J8MCxmYnwwLHB8MCxufDApfDA7cD1DO1FhPU9kKGp8MCxrfDAsanwwLGt8MCl8MDtQYT1DO1lhPSgoWGF8MCk8MCk8PDMxPj4zMTtBYT1PZChYYXwwLFlhfDAsbGF8MCxtYXwwKXwwO3phPUM7a2E9T2QoZXwwLER8MCxYYXwwLFlhfDApfDA7amE9QztYPU9kKGRifDAsZWJ8MCxYYXwwLFlhfDApfDA7Vz1DO049T2QoWXwwLGd8MCxYYXwwLFlhfDApfDA7TT1DO3Y9T2QoTGF8MCxNYXwwLFhhfDAsWWF8MCl8MDt1PUM7ZWE9KChkYXwwKTwwKTw8MzE+PjMxO1lhPU9kKGRhfDAsZWF8MCxYYXwwLFlhfDApfDA7WGE9QztrPU9kKGdifDAsZmJ8MCxqfDAsa3wwKXwwO2o9QzttYT1PZChmfDAsUHwwLGxhfDAsbWF8MCl8MDtsYT1DO1Y9T2QoZnwwLFB8MCxlfDAsRHwwKXwwO1U9QztKPU9kKEJ8MCxkfDAsZnwwLFB8MCl8MDtJPUM7ej1PZChZfDAsZ3wwLGZ8MCxQfDApfDA7eT1DO3dhPSgodmF8MCk8MCk8PDMxPj4zMTtfYT1PZCh2YXwwLHdhfDAsZnwwLFB8MCl8MDtaYT1DO0VhPU9kKGRhfDAsZWF8MCxmfDAsUHwwKXwwO0RhPUM7UD1PZChnYnwwLGZifDAsZnwwLFB8MCl8MDtmPUM7TD1PZChlfDAsRHwwLGV8MCxEfDApfDA7Sz1DO29hPSgobmF8MCk8MCk8PDMxPj4zMTt4PU9kKG5hfDAsb2F8MCxkYnwwLGVifDApfDA7dz1DO3NhPSgocmF8MCk8MCk8PDMxPj4zMTthYj1PZChyYXwwLHNhfDAsbmF8MCxvYXwwKXwwOyRhPUM7R2E9T2QodmF8MCx3YXwwLGV8MCxEfDApfDA7RmE9QztvYT1PZChkYXwwLGVhfDAsbmF8MCxvYXwwKXwwO25hPUM7RD1PZChnYnwwLGZifDAsZXwwLER8MCl8MDtlPUM7ZWI9T2QoS2F8MCwoKEthfDApPDApPDwzMT4+MzF8MCxkYnwwLGVifDApfDA7ZGI9QztLYT1PZChyYXwwLHNhfDAsQnwwLGR8MCl8MDtKYT1DO3FhPU9kKHZhfDAsd2F8MCxCfDAsZHwwKXwwO3BhPUM7Xz1PZChkYXwwLGVhfDAsQnwwLGR8MCl8MDtaPUM7ZD1PZChnYnwwLGZifDAsQnwwLGR8MCl8MDtCPUM7c2E9T2QocmF8MCxzYXwwLFl8MCxnfDApfDA7cmE9QzthYT1PZCh2YXwwLHdhfDAsWXwwLGd8MCl8MDskPUM7bT1PZChkYXwwLGVhfDAsbXwwLCgobXwwKTwwKTw8MzE+PjMxfDApfDA7cj1DO2c9T2QoZ2J8MCxmYnwwLFl8MCxnfDApfDA7WT1DO01hPU9kKHZhfDAsd2F8MCxMYXwwLE1hfDApfDA7TGE9Qzt3YT1PZChkYXwwLGVhfDAsaXwwLE98MCl8MDt2YT1DO089T2QoZ2J8MCxmYnwwLGl8MCxPfDApfDA7aT1DO2VhPU9kKGRhfDAsZWF8MCxofDAsQXwwKXwwO2RhPUM7QT1PZChnYnwwLGZifDAsaHwwLEF8MCl8MDtoPUM7cT1PZChnYnwwLGZifDAsYnwwLHF8MCl8MDtiPUM7YmI9RGQoZWJ8MCxkYnwwLGNifDAsYmJ8MCl8MDskYT1EZChiYnwwLEN8MCxhYnwwLCRhfDApfDA7WmE9RGQoJGF8MCxDfDAsX2F8MCxaYXwwKXwwO1hhPURkKFphfDAsQ3wwLFlhfDAsWGF8MCl8MDtwPURkKFhhfDAsQ3wwLG58MCxwfDApfDA7bj1DO3VhPURkKFdhfDAsVmF8MCx0YXwwLHVhfDApfDA7dGE9QztjYT1EZChVYXwwLFRhfDAsYmF8MCxjYXwwKXwwO2JhPUM7UGE9RGQoU2F8MCxSYXwwLFFhfDAsUGF8MCl8MDtOYT1EZChQYXwwLEN8MCxPYXwwLE5hfDApfDA7TGE9RGQoTmF8MCxDfDAsTWF8MCxMYXwwKXwwO3I9RGQoTGF8MCxDfDAsbXwwLHJ8MCl8MDtCPURkKHJ8MCxDfDAsZHwwLEJ8MCl8MDtkPUM7cj1EZChwfDAsbnwwLDMzNTU0NDMyLDApfDA7cj1FZChyfDAsQ3wwLDI2KXwwO209QztIYT1EZChLYXwwLEphfDAsSWF8MCxIYXwwKXwwO0ZhPURkKEhhfDAsQ3wwLEdhfDAsRmF8MCl8MDtEYT1EZChGYXwwLEN8MCxFYXwwLERhfDApfDA7aj1EZChEYXwwLEN8MCxrfDAsanwwKXwwO2o9RGQoanwwLEN8MCxyfDAsbXwwKXwwO2s9QzttPUhkKHJ8MCxtfDAsMjYpfDA7bT1DZChwfDAsbnwwLG18MCxDfDApfDA7bj1DO3A9RGQoQnwwLGR8MCwzMzU1NDQzMiwwKXwwO3A9RWQocHwwLEN8MCwyNil8MDtyPUM7emE9RGQoQ2F8MCxCYXwwLEFhfDAsemF8MCl8MDt4YT1EZCh6YXwwLEN8MCx5YXwwLHhhfDApfDA7dmE9RGQoeGF8MCxDfDAsd2F8MCx2YXwwKXwwO1k9RGQodmF8MCxDfDAsZ3wwLFl8MCl8MDtZPURkKFl8MCxDfDAscHwwLHJ8MCl8MDtnPUM7cj1IZChwfDAscnwwLDI2KXwwO3I9Q2QoQnwwLGR8MCxyfDAsQ3wwKXwwO2Q9QztCPURkKGp8MCxrfDAsMTY3NzcyMTYsMCl8MDtCPUVkKEJ8MCxDfDAsMjUpfDA7cD1DO3JhPURkKHVhfDAsdGF8MCxzYXwwLHJhfDApfDA7cGE9RGQocmF8MCxDfDAscWF8MCxwYXwwKXwwO25hPURkKHBhfDAsQ3wwLG9hfDAsbmF8MCl8MDtmPURkKG5hfDAsQ3wwLFB8MCxmfDApfDA7Zj1EZChmfDAsQ3wwLEJ8MCxwfDApfDA7UD1DO3A9SGQoQnwwLHB8MCwyNSl8MDtwPUNkKGp8MCxrfDAscHwwLEN8MCl8MDtrPUM7aj1EZChZfDAsZ3wwLDE2Nzc3MjE2LDApfDA7aj1FZChqfDAsQ3wwLDI1KXwwO0I9QztqYT1EZChtYXwwLGxhfDAsa2F8MCxqYXwwKXwwO2hhPURkKGphfDAsQ3wwLGlhfDAsaGF8MCl8MDtmYT1EZChoYXwwLEN8MCxnYXwwLGZhfDApfDA7ZGE9RGQoZmF8MCxDfDAsZWF8MCxkYXwwKXwwO2k9RGQoZGF8MCxDfDAsT3wwLGl8MCl8MDtpPURkKGl8MCxDfDAsanwwLEJ8MCl8MDtPPUM7Qj1IZChqfDAsQnwwLDI1KXwwO0I9Q2QoWXwwLGd8MCxCfDAsQ3wwKXwwO2c9QztZPURkKGZ8MCxQfDAsMzM1NTQ0MzIsMCl8MDtZPUVkKFl8MCxDfDAsMjYpfDA7aj1DOyQ9RGQoY2F8MCxiYXwwLGFhfDAsJHwwKXwwO1o9RGQoJHwwLEN8MCxffDAsWnwwKXwwO2U9RGQoWnwwLEN8MCxEfDAsZXwwKXwwO2U9RGQoZXwwLEN8MCxZfDAsanwwKXwwO0Q9QztqPUhkKFl8MCxqfDAsMjYpfDA7aj1DZChmfDAsUHwwLGp8MCxDfDApfDA7UD1EZChpfDAsT3wwLDMzNTU0NDMyLDApfDA7UD1FZChQfDAsQ3wwLDI2KXwwO2Y9QztVPURkKFh8MCxXfDAsVnwwLFV8MCl8MDtTPURkKFV8MCxDfDAsVHwwLFN8MCl8MDtRPURkKFN8MCxDfDAsUnwwLFF8MCl8MDtoPURkKFF8MCxDfDAsQXwwLGh8MCl8MDtoPURkKGh8MCxDfDAsUHwwLGZ8MCl8MDtBPUM7Zj1IZChQfDAsZnwwLDI2KXwwO2Y9Q2QoaXwwLE98MCxmfDAsQ3wwKXwwO089RGQoZXwwLER8MCwxNjc3NzIxNiwwKXwwO089RWQoT3wwLEN8MCwyNSl8MDtpPUM7ZD1EZChPfDAsaXwwLHJ8MCxkfDApfDA7cj1DO2k9SGQoT3wwLGl8MCwyNSl8MDtpPUNkKGV8MCxEfDAsaXwwLEN8MCl8MDtEPURkKGh8MCxBfDAsMTY3NzcyMTYsMCl8MDtEPUVkKER8MCxDfDAsMjUpfDA7ZT1DO0s9RGQoTnwwLE18MCxMfDAsS3wwKXwwO0k9RGQoS3wwLEN8MCxKfDAsSXwwKXwwO0c9RGQoSXwwLEN8MCxIfDAsR3wwKXwwO0U9RGQoR3wwLEN8MCxGfDAsRXwwKXwwO2I9RGQoRXwwLEN8MCxxfDAsYnwwKXwwO2I9RGQoYnwwLEN8MCxEfDAsZXwwKXwwO3E9QztlPUhkKER8MCxlfDAsMjUpfDA7ZT1DZChofDAsQXwwLGV8MCxDfDApfDA7QT1EZChkfDAscnwwLDMzNTU0NDMyLDApfDA7QT1FZChBfDAsQ3wwLDI2KXwwO2g9QztnPURkKEJ8MCxnfDAsQXwwLGh8MCl8MDtoPUhkKEF8MCxofDAsMjYpfDA7aD1DZChkfDAscnwwLGh8MCxDfDApfDA7cj1EZChifDAscXwwLDMzNTU0NDMyLDApfDA7cj1FZChyfDAsQ3wwLDI2KXwwO2Q9Qzt3PURkKHp8MCx5fDAseHwwLHd8MCl8MDt1PURkKHd8MCxDfDAsdnwwLHV8MCl8MDtzPURkKHV8MCxDfDAsdHwwLHN8MCl8MDtsPURkKHN8MCxDfDAsb3wwLGx8MCl8MDtsPURkKGx8MCxDfDAscnwwLGR8MCl8MDtvPUM7ZD1IZChyfDAsZHwwLDI2KXwwO2Q9Q2QoYnwwLHF8MCxkfDAsQ3wwKXwwO3E9RGQobHwwLG98MCwxNjc3NzIxNiwwKXwwO3E9RWQocXwwLEN8MCwyNSl8MDtiPUM7cj1PZChxfDAsYnwwLDE5LDApfDA7bj1EZChyfDAsQ3wwLG18MCxufDApfDA7bT1DO2I9SGQocXwwLGJ8MCwyNSl8MDtiPUNkKGx8MCxvfDAsYnwwLEN8MCl8MDtvPURkKG58MCxtfDAsMzM1NTQ0MzIsMCl8MDtvPUVkKG98MCxDfDAsMjYpfDA7bD1DO2s9RGQocHwwLGt8MCxvfDAsbHwwKXwwO2w9SGQob3wwLGx8MCwyNil8MDtsPUNkKG58MCxtfDAsbHwwLEN8MCl8MDtjW2E+PjJdPWw7Y1thKzQ+PjJdPWs7Y1thKzg+PjJdPWo7Y1thKzEyPj4yXT1pO2NbYSsxNj4+Ml09aDtjW2ErMjA+PjJdPWc7Y1thKzI0Pj4yXT1mO2NbYSsyOD4+Ml09ZTtjW2ErMzI+PjJdPWQ7Y1thKzM2Pj4yXT1iO3JldHVybn1mdW5jdGlvbiBMYyhiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wO209Y1tkPj4yXXwwO2w9Y1tkKzQ+PjJdfDA7az1jW2QrOD4+Ml18MDtqPWNbZCsxMj4+Ml18MDtpPWNbZCsxNj4+Ml18MDtoPWNbZCsyMD4+Ml18MDtnPWNbZCsyND4+Ml18MDtmPWNbZCsyOD4+Ml18MDtvPWNbZCszMj4+Ml18MDtlPWNbZCszNj4+Ml18MDttPSgoKCgoKCgoKCgoKChlKjE5fDApKzE2Nzc3MjE2Pj4yNSkrbT4+MjYpK2w+PjI1KStrPj4yNikraj4+MjUpK2k+PjI2KStoPj4yNSkrZz4+MjYpK2Y+PjI1KStvPj4yNikrZT4+MjUpKjE5fDApK218MDtuPW0+PjI2O2w9bitsfDA7bj1tLShuPDwyNil8MDttPWw+PjI1O2s9bStrfDA7bT1sLShtPDwyNSl8MDtsPWs+PjI2O2o9bCtqfDA7bD1rLShsPDwyNil8MDtrPWo+PjI1O2k9aytpfDA7az1qLShrPDwyNSl8MDtqPWk+PjI2O2g9aitofDA7aj1pLShqPDwyNil8MDtpPWg+PjI1O2c9aStnfDA7aT1oLShpPDwyNSl8MDtoPWc+PjI2O2Y9aCtmfDA7aD1nLShoPDwyNil8MDtnPWY+PjI1O2Q9ZytvfDA7Zz1mLShnPDwyNSl8MDtmPWQ+PjI2O2U9ZitlfDA7Zj1kLShmPDwyNil8MDtkPWUmMzM1NTQ0MzE7YVtiPj4wXT1uO2FbYisxPj4wXT1uPj4+ODthW2IrMj4+MF09bj4+PjE2O2FbYiszPj4wXT1tPDwyfG4+Pj4yNDthW2IrND4+MF09bT4+PjY7YVtiKzU+PjBdPW0+Pj4xNDthW2IrNj4+MF09bDw8M3xtPj4+MjI7YVtiKzc+PjBdPWw+Pj41O2FbYis4Pj4wXT1sPj4+MTM7YVtiKzk+PjBdPWs8PDV8bD4+PjIxO2FbYisxMD4+MF09az4+PjM7YVtiKzExPj4wXT1rPj4+MTE7YVtiKzEyPj4wXT1qPDw2fGs+Pj4xOTthW2IrMTM+PjBdPWo+Pj4yO2FbYisxND4+MF09aj4+PjEwO2FbYisxNT4+MF09aj4+PjE4O2FbYisxNj4+MF09aTthW2IrMTc+PjBdPWk+Pj44O2FbYisxOD4+MF09aT4+PjE2O2FbYisxOT4+MF09aDw8MXxpPj4+MjQ7YVtiKzIwPj4wXT1oPj4+NzthW2IrMjE+PjBdPWg+Pj4xNTthW2IrMjI+PjBdPWc8PDN8aD4+PjIzO2FbYisyMz4+MF09Zz4+PjU7YVtiKzI0Pj4wXT1nPj4+MTM7YVtiKzI1Pj4wXT1mPDw0fGc+Pj4yMTthW2IrMjY+PjBdPWY+Pj40O2FbYisyNz4+MF09Zj4+PjEyO2FbYisyOD4+MF09Zj4+PjIwfGQ8PDY7YVtiKzI5Pj4wXT1lPj4+MjthW2IrMzA+PjBdPWU+Pj4xMDthW2IrMzE+PjBdPWQ+Pj4xODtyZXR1cm59ZnVuY3Rpb24gTWMoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTAsYmE9MCxjYT0wLGRhPTAsZWE9MCxmYT0wLGdhPTAsaGE9MDtWPWIrNDB8MDtqPWIrNDR8MDttPWIrNDh8MDtwPWIrNTJ8MDtzPWIrNTZ8MDt2PWIrNjB8MDt5PWIrNjR8MDtCPWIrNjh8MDtFPWIrNzJ8MDtDPWIrNzZ8MDtTPWIrNHwwO1A9Yis4fDA7ZT1iKzEyfDA7bD1iKzE2fDA7bj1iKzIwfDA7dT1iKzI0fDA7dz1iKzI4fDA7RD1iKzMyfDA7Tz1iKzM2fDA7Z2E9KGNbUz4+Ml18MCkrKGNbaj4+Ml18MCl8MDtmYT0oY1tQPj4yXXwwKSsoY1ttPj4yXXwwKXwwO2VhPShjW2U+PjJdfDApKyhjW3A+PjJdfDApfDA7ZGE9KGNbbD4+Ml18MCkrKGNbcz4+Ml18MCl8MDtjYT0oY1tuPj4yXXwwKSsoY1t2Pj4yXXwwKXwwO2JhPShjW3U+PjJdfDApKyhjW3k+PjJdfDApfDA7YWE9KGNbdz4+Ml18MCkrKGNbQj4+Ml18MCl8MDskPShjW0Q+PjJdfDApKyhjW0U+PjJdfDApfDA7WT0oY1tPPj4yXXwwKSsoY1tDPj4yXXwwKXwwO2NbYT4+Ml09KGNbYj4+Ml18MCkrKGNbVj4+Ml18MCk7aGE9YSs0fDA7Y1toYT4+Ml09Z2E7Z2E9YSs4fDA7Y1tnYT4+Ml09ZmE7ZmE9YSsxMnwwO2NbZmE+PjJdPWVhO2VhPWErMTZ8MDtjW2VhPj4yXT1kYTtkYT1hKzIwfDA7Y1tkYT4+Ml09Y2E7Y2E9YSsyNHwwO2NbY2E+PjJdPWJhO2JhPWErMjh8MDtjW2JhPj4yXT1hYTthYT1hKzMyfDA7Y1thYT4+Ml09JDskPWErMzZ8MDtjWyQ+PjJdPVk7WT1hKzQwfDA7Uz0oY1tqPj4yXXwwKS0oY1tTPj4yXXwwKXwwO1A9KGNbbT4+Ml18MCktKGNbUD4+Ml18MCl8MDtlPShjW3A+PjJdfDApLShjW2U+PjJdfDApfDA7bD0oY1tzPj4yXXwwKS0oY1tsPj4yXXwwKXwwO249KGNbdj4+Ml18MCktKGNbbj4+Ml18MCl8MDt1PShjW3k+PjJdfDApLShjW3U+PjJdfDApfDA7dz0oY1tCPj4yXXwwKS0oY1t3Pj4yXXwwKXwwO0Q9KGNbRT4+Ml18MCktKGNbRD4+Ml18MCl8MDtPPShjW0M+PjJdfDApLShjW08+PjJdfDApfDA7Y1tZPj4yXT0oY1tWPj4yXXwwKS0oY1tiPj4yXXwwKTtWPWErNDR8MDtjW1Y+PjJdPVM7Uz1hKzQ4fDA7Y1tTPj4yXT1QO1A9YSs1MnwwO2NbUD4+Ml09ZTtlPWErNTZ8MDtjW2U+PjJdPWw7bD1hKzYwfDA7Y1tsPj4yXT1uO249YSs2NHwwO2Nbbj4+Ml09dTt1PWErNjh8MDtjW3U+PjJdPXc7dz1hKzcyfDA7Y1t3Pj4yXT1EO0Q9YSs3NnwwO2NbRD4+Ml09TztPPWErODB8MDtKYyhPLGEsZCk7SmMoWSxZLGQrNDB8MCk7Qz1hKzEyMHwwO0pjKEMsZCsxMjB8MCxiKzEyMHwwKTtKYyhhLGIrODB8MCxkKzgwfDApO0U9Y1thPj4yXTw8MTtCPWNbaGE+PjJdPDwxO3k9Y1tnYT4+Ml08PDE7dj1jW2ZhPj4yXTw8MTtzPWNbZWE+PjJdPDwxO3A9Y1tkYT4+Ml08PDE7bT1jW2NhPj4yXTw8MTtqPWNbYmE+PjJdPDwxO2c9Y1thYT4+Ml08PDE7Yj1jWyQ+PjJdPDwxO1o9Y1tPPj4yXXwwO049YSs4NHwwO1c9Y1tOPj4yXXwwO009YSs4OHwwO1Q9Y1tNPj4yXXwwO0w9YSs5MnwwO1E9Y1tMPj4yXXwwO0s9YSs5NnwwO2Y9Y1tLPj4yXXwwO0o9YSsxMDB8MDtoPWNbSj4+Ml18MDtJPWErMTA0fDA7bz1jW0k+PjJdfDA7SD1hKzEwOHwwO3E9Y1tIPj4yXXwwO0c9YSsxMTJ8MDt4PWNbRz4+Ml18MDtGPWErMTE2fDA7ej1jW0Y+PjJdfDA7Xz1jW1k+PjJdfDA7WD1jW1Y+PjJdfDA7VT1jW1M+PjJdfDA7Uj1jW1A+PjJdfDA7ZD1jW2U+PjJdfDA7aT1jW2w+PjJdfDA7az1jW24+PjJdfDA7cj1jW3U+PjJdfDA7dD1jW3c+PjJdfDA7QT1jW0Q+PjJdfDA7Y1thPj4yXT1aLV87Y1toYT4+Ml09Vy1YO2NbZ2E+PjJdPVQtVTtjW2ZhPj4yXT1RLVI7Y1tlYT4+Ml09Zi1kO2NbZGE+PjJdPWgtaTtjW2NhPj4yXT1vLWs7Y1tiYT4+Ml09cS1yO2NbYWE+PjJdPXgtdDtjWyQ+PjJdPXotQTtjW1k+PjJdPV8rWjtjW1Y+PjJdPVgrVztjW1M+PjJdPVUrVDtjW1A+PjJdPVIrUTtjW2U+PjJdPWQrZjtjW2w+PjJdPWkraDtjW24+PjJdPWsrbztjW3U+PjJdPXIrcTtjW3c+PjJdPXQreDtjW0Q+PjJdPUErejtEPWNbQz4+Ml18MDt6PWErMTI0fDA7QT1jW3o+PjJdfDA7dz1hKzEyOHwwO3g9Y1t3Pj4yXXwwO3Q9YSsxMzJ8MDt1PWNbdD4+Ml18MDtxPWErMTM2fDA7cj1jW3E+PjJdfDA7bj1hKzE0MHwwO289Y1tuPj4yXXwwO2s9YSsxNDR8MDtsPWNbaz4+Ml18MDtoPWErMTQ4fDA7aT1jW2g+PjJdfDA7ZT1hKzE1MnwwO2Y9Y1tlPj4yXXwwO2E9YSsxNTZ8MDtkPWNbYT4+Ml18MDtjW08+PjJdPUQrRTtjW04+PjJdPUErQjtjW00+PjJdPXgreTtjW0w+PjJdPXUrdjtjW0s+PjJdPXIrcztjW0o+PjJdPW8rcDtjW0k+PjJdPWwrbTtjW0g+PjJdPWkrajtjW0c+PjJdPWYrZztjW0Y+PjJdPWQrYjtjW0M+PjJdPUUtRDtjW3o+PjJdPUItQTtjW3c+PjJdPXkteDtjW3Q+PjJdPXYtdTtjW3E+PjJdPXMtcjtjW24+PjJdPXAtbztjW2s+PjJdPW0tbDtjW2g+PjJdPWotaTtjW2U+PjJdPWctZjtjW2E+PjJdPWItZDtyZXR1cm59XG5mdW5jdGlvbiBIYShhKXthPWF8MDt2YXIgYj0wO2I9aTtpPWkrYXwwO2k9aSsxNSYtMTY7cmV0dXJuIGJ8MH1mdW5jdGlvbiBJYSgpe3JldHVybiBpfDB9ZnVuY3Rpb24gSmEoYSl7YT1hfDA7aT1hfWZ1bmN0aW9uIEthKGEsYil7YT1hfDA7Yj1ifDA7aT1hO2o9Yn1mdW5jdGlvbiBMYShhLGIpe2E9YXwwO2I9YnwwO2lmKCFuKXtuPWE7bz1ifX1mdW5jdGlvbiBNYShiKXtiPWJ8MDthW2s+PjBdPWFbYj4+MF07YVtrKzE+PjBdPWFbYisxPj4wXTthW2srMj4+MF09YVtiKzI+PjBdO2FbayszPj4wXT1hW2IrMz4+MF19ZnVuY3Rpb24gTmEoYil7Yj1ifDA7YVtrPj4wXT1hW2I+PjBdO2FbaysxPj4wXT1hW2IrMT4+MF07YVtrKzI+PjBdPWFbYisyPj4wXTthW2srMz4+MF09YVtiKzM+PjBdO2Fbays0Pj4wXT1hW2IrND4+MF07YVtrKzU+PjBdPWFbYis1Pj4wXTthW2srNj4+MF09YVtiKzY+PjBdO2Fbays3Pj4wXT1hW2IrNz4+MF19ZnVuY3Rpb24gT2EoYSl7YT1hfDA7Qz1hfWZ1bmN0aW9uIFBhKCl7cmV0dXJuIEN8MH1mdW5jdGlvbiBRYSgpe3JldHVybiAzMn1mdW5jdGlvbiBSYSgpe3JldHVybiAzMn1mdW5jdGlvbiBTYShhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO1VhKGEsYixjLGQsZSk7cmV0dXJuIDB9ZnVuY3Rpb24gVGEoYixjLGQsZSxmKXtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MDtoPWk7aT1pKzMyfDA7Zz1oO1VhKGcsYyxkLGUsZik7ZD1ZYyhiLGcpfDA7ZT0oZ3wwKT09KGJ8MCk7Yz0wO2Y9MDtkb3tjPWFbYitmPj4wXV5hW2crZj4+MF18YztmPWYrMXwwfXdoaWxlKChmfDApIT0zMik7aT1oO3JldHVybiAoZT8tMTpkKXwoKChjJjI1NSkrNTExfDApPj4+OCYxKSstMXwwfWZ1bmN0aW9uIFVhKGIsZCxlLGYsZyl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7cz1pO2k9aSs2MDh8MDtyPXMrNDgwfDA7bz1zKzQxNnwwO249cztqPW4rNjR8MDtjW2o+PjJdPTA7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7Y1tqKzEyPj4yXT0wO2g9bjtrPTg7bD1oKzY0fDA7ZG97Y1toPj4yXT1jW2s+PjJdO2g9aCs0fDA7az1rKzR8MH13aGlsZSgoaHwwKTwobHwwKSk7aD1yO2w9aCsxMjh8MDtkb3thW2g+PjBdPTU0O2g9aCsxfDB9d2hpbGUoKGh8MCk8KGx8MCkpO2Fbcj4+MF09YVtnPj4wXV41NDtoPTE7ZG97cT1yK2h8MDthW3E+PjBdPWFbcT4+MF1eYVtnK2g+PjBdO2g9aCsxfDB9d2hpbGUoKGh8MCkhPTMyKTtoPW4rNzJ8MDtjW2g+PjJdPTEwMjQ7Y1toKzQ+PjJdPTA7Y1tqPj4yXT0wO2Nbais0Pj4yXT0wO2o9bis4MHwwO2g9ajtrPXI7bD1oKzEyOHwwO2Rve2FbaD4+MF09YVtrPj4wXXwwO2g9aCsxfDA7az1rKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7SGIobixqKTtqPWFbZz4+MF18MDtxPW4rMjA4fDA7bT1uKzI3MnwwO2NbbT4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtjW20rMTI+PjJdPTA7aD1xO2s9ODtsPWgrNjR8MDtkb3tjW2g+PjJdPWNbaz4+Ml07aD1oKzR8MDtrPWsrNHwwfXdoaWxlKChofDApPChsfDApKTtoPXI7bD1oKzEyOHwwO2Rve2FbaD4+MF09OTI7aD1oKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7YVtyPj4wXT1qXjkyO2g9MTtkb3twPXIraHwwO2FbcD4+MF09YVtwPj4wXV5hW2craD4+MF07aD1oKzF8MH13aGlsZSgoaHwwKSE9MzIpO2o9bisyODB8MDtwPWo7Y1twPj4yXT0xMDI0O2NbcCs0Pj4yXT0wO3A9bTtjW3A+PjJdPTA7Y1twKzQ+PjJdPTA7cD1uKzI4OHwwO2g9cDtrPXI7bD1oKzEyOHwwO2Rve2FbaD4+MF09YVtrPj4wXXwwO2g9aCsxfDA7az1rKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7SGIocSxwKTtGYihuLGQsZSxmKTtHYihuLG8pO2Y9ajtkPWNbZj4+Ml18MDtmPWNbZis0Pj4yXXwwO2s9R2QoZHwwLGZ8MCwzKXwwO2s9ayYxMjc7aD1EZChkfDAsZnwwLDUxMiwwKXwwO2Nbaj4+Ml09aDtjW2orND4+Ml09QztqPW07aD1jW2o+PjJdfDA7aj1jW2orND4+Ml18MDtpZihmPj4+MD40Mjk0OTY3Mjk1fChmfDApPT0tMSZkPj4+MD40Mjk0OTY2NzgzKXtoPURkKGh8MCxqfDAsMSwwKXwwO2o9QztkPW07Y1tkPj4yXT1oO2NbZCs0Pj4yXT1qfWc9bTtjW2c+PjJdPWg7Y1tnKzQ+PjJdPWo7aj1DZCgxMjgsMCxrfDAsMCl8MDtnPUM7aD1uKzI4OCtrfDA7aWYoZz4+PjA+MHwoZ3wwKT09MCZqPj4+MD42NCl7az1vO2w9aCs2NHwwO2Rve2FbaD4+MF09YVtrPj4wXXwwO2g9aCsxfDA7az1rKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7R2IocSxyKTtoPWI7az1yO2w9aCszMnwwO2Rve2FbaD4+MF09YVtrPj4wXXwwO2g9aCsxfDA7az1rKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7aT1zO3JldHVybn1JZChofDAsb3wwLGp8MCl8MDtIYihxLHApO2g9bytqfDA7aj1DZCg2NCwwLGp8MCxnfDApfDA7Zz1DO2lmKGc+Pj4wPjB8KGd8MCk9PTAmaj4+PjA+MTI3KWRve0hiKHEsaCk7aD1oKzEyOHwwO2o9RGQoanwwLGd8MCwtMTI4LC0xKXwwO2c9Q313aGlsZShnPj4+MD4wfChnfDApPT0wJmo+Pj4wPjEyNyk7SWQocHwwLGh8MCxqfDApfDA7R2IocSxyKTtoPWI7az1yO2w9aCszMnwwO2Rve2FbaD4+MF09YVtrPj4wXXwwO2g9aCsxfDA7az1rKzF8MH13aGlsZSgoaHwwKTwobHwwKSk7aT1zO3JldHVybn1mdW5jdGlvbiBWYSgpe3JldHVybiAzMn1mdW5jdGlvbiBXYSgpe3JldHVybiAzMn1mdW5jdGlvbiBYYSgpe3JldHVybiAzMn1mdW5jdGlvbiBZYSgpe3JldHVybiAzMn1mdW5jdGlvbiBaYSgpe3JldHVybiAyNH1mdW5jdGlvbiBfYSgpe3JldHVybiAxNn1mdW5jdGlvbiAkYShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtrPWk7aT1pKzI3MnwwO2g9aztnPWsrMjA4fDA7Zj1oKzY0fDA7aj1oO2w9ODttPWorNjR8MDtkb3tjW2o+PjJdPWNbbD4+Ml07aj1qKzR8MDtsPWwrNHwwfXdoaWxlKChqfDApPChtfDApKTtqPWgrNzJ8MDtjW2o+PjJdPTI1NjtjW2orND4+Ml09MDtqPWY7Y1tqPj4yXT0wO2Nbais0Pj4yXT0wO2o9aCs4MHwwO2w9ZTttPWorMzJ8MDtkb3thW2o+PjBdPWFbbD4+MF18MDtqPWorMXwwO2w9bCsxfDB9d2hpbGUoKGp8MCk8KG18MCkpO0diKGgsZyk7aj1kO2w9ZzttPWorMzJ8MDtkb3thW2o+PjBdPWFbbD4+MF18MDtqPWorMXwwO2w9bCsxfDB9d2hpbGUoKGp8MCk8KG18MCkpO21kKGIsZCwzMzc4NSk7aT1rO3JldHVybiAwfWZ1bmN0aW9uIGFiKGIsYyl7Yj1ifDA7Yz1jfDA7dmFyIGQ9MDtkPTA7ZG97YVtjK2Q+PjBdPUJhKDApfDA7ZD1kKzF8MH13aGlsZSgoZHwwKSE9MzIpO21kKGIsYywzMzc4NSk7cmV0dXJuIDB9ZnVuY3Rpb24gYmIoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3ZhciBkPTAsZT0wO2Q9aTtpPWkrMzJ8MDtlPWQ7bWQoZSxjLGIpO25iKGEsMzI1NzYsZSwzMjU5Mik7aT1kO3JldHVybiAwfWZ1bmN0aW9uIGNiKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3JjKGEsYixjLGQsZSxmLGcpfDA7cmV0dXJuIDB9ZnVuY3Rpb24gZGIoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTA7aj1pO2k9aSs2NHwwO2w9aiszMnwwO2s9ajttZChsLGgsZyk7bmIoaywzMjU3NixsLDMyNTkyKTtyYyhhLGIsYyxkLGUsZixrKXwwO2k9ajtyZXR1cm4gMH1mdW5jdGlvbiBlYihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7aWYoZD4+PjA+MHwoZHwwKT09MCZjPj4+MD40Mjk0OTY3Mjc5KXtlPS0xO3JldHVybiBlfDB9cmMoYSsxNnwwLGEsYixjLGQsZSxmKXwwO2U9MDtyZXR1cm4gZXwwfWZ1bmN0aW9uIGZiKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MDtrPWk7aT1pKzY0fDA7aj1rKzMyfDA7aD1rO2lmKGQ+Pj4wPjB8KGR8MCk9PTAmYz4+PjA+NDI5NDk2NzI3OSl7Zz0tMTtpPWs7cmV0dXJuIGd8MH1tZChqLGcsZik7bmIoaCwzMjU3NixqLDMyNTkyKTtyYyhhKzE2fDAsYSxiLGMsZCxlLGgpfDA7Zz0wO2k9aztyZXR1cm4gZ3wwfWZ1bmN0aW9uIGdiKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3JldHVybiB0YyhhLGIsYyxkLGUsZixnKXwwfWZ1bmN0aW9uIGhiKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wO2o9aTtpPWkrNjR8MDtsPWorMzJ8MDtrPWo7bWQobCxoLGcpO25iKGssMzI1NzYsbCwzMjU5Mik7aD10YyhhLGIsYyxkLGUsZixrKXwwO2k9ajtyZXR1cm4gaHwwfWZ1bmN0aW9uIGliKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtpZihkPj4+MDwwfChkfDApPT0wJmM+Pj4wPDE2KXtlPS0xO3JldHVybiBlfDB9ZD1EZChjfDAsZHwwLC0xNiwtMSl8MDtlPXRjKGEsYisxNnwwLGIsZCxDLGUsZil8MDtyZXR1cm4gZXwwfWZ1bmN0aW9uIGpiKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MDtrPWk7aT1pKzY0fDA7aj1rKzMyfDA7aD1rO2lmKGQ+Pj4wPDB8KGR8MCk9PTAmYz4+PjA8MTYpe2c9LTE7aT1rO3JldHVybiBnfDB9Yz1EZChjfDAsZHwwLC0xNiwtMSl8MDtkPUM7bWQoaixnLGYpO25iKGgsMzI1NzYsaiwzMjU5Mik7Zz10YyhhLGIrMTZ8MCxiLGMsZCxlLGgpfDA7aT1rO3JldHVybiBnfDB9ZnVuY3Rpb24ga2IoYixkLGUsZixnKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt2YXIgaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wO0E9aTt2PWk9aSs2MyYtNjQ7aT1pKzQ4MHwwO3k9djt3PXYrNDQ4fDA7eD12KzQyNHwwO2o9diszOTJ8MDt2PXYrMzYwfDA7aD0wO2Rve2FbditoPj4wXT1CYSgwKXwwO2g9aCsxfDB9d2hpbGUoKGh8MCkhPTMyKTttZChqLHYsMzM3ODUpO2g9YjtvPWo7cD1oKzMyfDA7ZG97YVtoPj4wXT1hW28+PjBdfDA7aD1oKzF8MDtvPW8rMXwwfXdoaWxlKChofDApPChwfDApKTtGZCh5fDAsMCwzNTcpfDA7cT15O2NbcT4+Ml09LTIyMjQ0MzI0ODtjW3ErND4+Ml09MTc3OTAzMzcwMztxPXkrOHwwO2NbcT4+Ml09LTIwNjcwOTM3MDE7Y1txKzQ+PjJdPS0xMTUwODMzMDE5O3E9eSsxNnwwO2NbcT4+Ml09LTIzNzkxNTczO2NbcSs0Pj4yXT0xMDEzOTA0MjQyO3E9eSsyNHwwO2NbcT4+Ml09MTU5NTc1MDEyOTtjW3ErND4+Ml09LTE1MjE0ODY1MzQ7cT15KzMyfDA7Y1txPj4yXT0tMTM3NzQwMjE1OTtjW3ErND4+Ml09MTM1OTg5MzExOTtxPXkrNDB8MDtjW3E+PjJdPTcyNTUxMTE5OTtjW3ErND4+Ml09LTE2OTQxNDQzNzI7cT15KzQ4fDA7Y1txPj4yXT0tNzk1Nzc3NDk7Y1txKzQ+PjJdPTUyODczNDYzNTtxPXkrNTZ8MDtjW3E+PjJdPTMyNzAzMzIwOTtjW3ErND4+Ml09MTU0MTQ1OTIyNTtxPXkrMzUyfDA7cj15Kzk2fDA7cz15KzY0fDA7dD15KzcyfDA7dT15KzIyNHwwO2g9MDttPTA7bj0zMjt3aGlsZSgxKXtsPTI1Ni1ofDA7aD15Kzk2K2h8MDtpZighKG0+Pj4wPjB8KG18MCk9PTAmbj4+PjA+bD4+PjApKXt6PTU7YnJlYWt9SWQoaHwwLGp8MCxsfDApfDA7Y1txPj4yXT0oY1txPj4yXXwwKStsO3A9cztoPWNbcD4+Ml18MDtwPWNbcCs0Pj4yXXwwO2s9RGQoaHwwLHB8MCwxMjgsMCl8MDtvPXM7Y1tvPj4yXT1rO2Nbbys0Pj4yXT1DO289dDtvPURkKChwPj4+MD40Mjk0OTY3Mjk1fChwfDApPT0tMSZoPj4+MD40Mjk0OTY3MTY3KSYxfDAsMCxjW28+PjJdfDAsY1tvKzQ+PjJdfDApfDA7aD10O2NbaD4+Ml09bztjW2grND4+Ml09QztBYih5LHIpO2g9cjtvPXU7cD1oKzEyOHwwO2Rve2NbaD4+Ml09Y1tvPj4yXTtoPWgrNHwwO289bys0fDB9d2hpbGUoKGh8MCk8KHB8MCkpO2g9KGNbcT4+Ml18MCkrLTEyOHwwO2NbcT4+Ml09aDtrPUNkKG58MCxtfDAsbHwwLDApfDA7aWYoKG58MCk9PShsfDApJihtfDApPT0wKXtuPWc7bD0wO209MzI7YnJlYWt9ZWxzZXtqPWorbHwwO209QztuPWt9fWlmKCh6fDApPT01KXtJZChofDAsanwwLG58MCl8MDtoPURkKGNbcT4+Ml18MCwwLG58MCxtfDApfDA7Y1txPj4yXT1oO249ZztsPTA7bT0zMn13aGlsZSgxKXtrPTI1Ni1ofDA7aD15Kzk2K2h8MDtpZighKGw+Pj4wPjB8KGx8MCk9PTAmbT4+PjA+az4+PjApKXt6PTg7YnJlYWt9SWQoaHwwLG58MCxrfDApfDA7Y1txPj4yXT0oY1txPj4yXXwwKStrO3A9cztoPWNbcD4+Ml18MDtwPWNbcCs0Pj4yXXwwO2o9RGQoaHwwLHB8MCwxMjgsMCl8MDtvPXM7Y1tvPj4yXT1qO2Nbbys0Pj4yXT1DO289dDtvPURkKChwPj4+MD40Mjk0OTY3Mjk1fChwfDApPT0tMSZoPj4+MD40Mjk0OTY3MTY3KSYxfDAsMCxjW28+PjJdfDAsY1tvKzQ+PjJdfDApfDA7aD10O2NbaD4+Ml09bztjW2grND4+Ml09QztBYih5LHIpO2g9cjtvPXU7cD1oKzEyOHwwO2Rve2NbaD4+Ml09Y1tvPj4yXTtoPWgrNHwwO289bys0fDB9d2hpbGUoKGh8MCk8KHB8MCkpO2g9KGNbcT4+Ml18MCkrLTEyOHwwO2NbcT4+Ml09aDtqPUNkKG18MCxsfDAsa3wwLDApfDA7aWYoKG18MCk9PShrfDApJihsfDApPT0wKWJyZWFrO2Vsc2V7bj1uK2t8MDtsPUM7bT1qfX1pZigoenwwKT09OCl7SWQoaHwwLG58MCxtfDApfDA7ej1EZChjW3E+PjJdfDAsMCxtfDAsbHwwKXwwO2NbcT4+Ml09en16Yih5LHgsMjQpfDA7aWYoZj4+PjA+MHwoZnwwKT09MCZlPj4+MD40Mjk0OTY3Mjc5KXt6PS0xO2k9QTtyZXR1cm4genwwfW1kKHksdixnKTtuYih3LDMyNTc2LHksMzI1OTIpO3JjKGIrNDh8MCxiKzMyfDAsZCxlLGYseCx3KXwwO3o9MDtpPUE7cmV0dXJuIHp8MH1mdW5jdGlvbiBsYihhLGIsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wO3k9aTt2PWk9aSs2MyYtNjQ7aT1pKzQxNnwwO3c9djt1PXYrMzg0fDA7dj12KzM2MHwwO2lmKGU+Pj4wPDB8KGV8MCk9PTAmZD4+PjA8NDgpe3g9LTE7aT15O3JldHVybiB4fDB9RmQod3wwLDAsMzU3KXwwO3A9dztjW3A+PjJdPS0yMjI0NDMyNDg7Y1twKzQ+PjJdPTE3NzkwMzM3MDM7cD13Kzh8MDtjW3A+PjJdPS0yMDY3MDkzNzAxO2NbcCs0Pj4yXT0tMTE1MDgzMzAxOTtwPXcrMTZ8MDtjW3A+PjJdPS0yMzc5MTU3MztjW3ArND4+Ml09MTAxMzkwNDI0MjtwPXcrMjR8MDtjW3A+PjJdPTE1OTU3NTAxMjk7Y1twKzQ+PjJdPS0xNTIxNDg2NTM0O3A9dyszMnwwO2NbcD4+Ml09LTEzNzc0MDIxNTk7Y1twKzQ+PjJdPTEzNTk4OTMxMTk7cD13KzQwfDA7Y1twPj4yXT03MjU1MTExOTk7Y1twKzQ+PjJdPS0xNjk0MTQ0MzcyO3A9dys0OHwwO2NbcD4+Ml09LTc5NTc3NzQ5O2NbcCs0Pj4yXT01Mjg3MzQ2MzU7cD13KzU2fDA7Y1twPj4yXT0zMjcwMzMyMDk7Y1twKzQ+PjJdPTE1NDE0NTkyMjU7cD13KzM1MnwwO3E9dys5NnwwO3I9dys2NHwwO3M9dys3MnwwO3Q9dysyMjR8MDtrPWI7aD0wO209MDtuPTMyO3doaWxlKDEpe2w9MjU2LWh8MDtoPXcrOTYraHwwO2lmKCEobT4+PjA+MHwobXwwKT09MCZuPj4+MD5sPj4+MCkpe3g9NDticmVha31JZChofDAsa3wwLGx8MCl8MDtjW3A+PjJdPShjW3A+PjJdfDApK2w7bz1yO2g9Y1tvPj4yXXwwO289Y1tvKzQ+PjJdfDA7ej1EZChofDAsb3wwLDEyOCwwKXwwO2o9cjtjW2o+PjJdPXo7Y1tqKzQ+PjJdPUM7aj1zO2o9RGQoKG8+Pj4wPjQyOTQ5NjcyOTV8KG98MCk9PS0xJmg+Pj4wPjQyOTQ5NjcxNjcpJjF8MCwwLGNbaj4+Ml18MCxjW2orND4+Ml18MCl8MDtoPXM7Y1toPj4yXT1qO2NbaCs0Pj4yXT1DO0FiKHcscSk7aD1xO2o9dDtvPWgrMTI4fDA7ZG97Y1toPj4yXT1jW2o+PjJdO2g9aCs0fDA7aj1qKzR8MH13aGlsZSgoaHwwKTwob3wwKSk7aD0oY1twPj4yXXwwKSstMTI4fDA7Y1twPj4yXT1oO2o9Q2QobnwwLG18MCxsfDAsMCl8MDtpZigobnwwKT09KGx8MCkmKG18MCk9PTApe2w9MDttPTMyO2JyZWFrfWVsc2V7az1rK2x8MDttPUM7bj1qfX1pZigoeHwwKT09NCl7SWQoaHwwLGt8MCxufDApfDA7aD1EZChjW3A+PjJdfDAsMCxufDAsbXwwKXwwO2NbcD4+Ml09aDtsPTA7bT0zMn13aGlsZSgxKXtrPTI1Ni1ofDA7aD13Kzk2K2h8MDtpZighKGw+Pj4wPjB8KGx8MCk9PTAmbT4+PjA+az4+PjApKXt4PTc7YnJlYWt9SWQoaHwwLGZ8MCxrfDApfDA7Y1twPj4yXT0oY1twPj4yXXwwKStrO289cjtoPWNbbz4+Ml18MDtvPWNbbys0Pj4yXXwwO3o9RGQoaHwwLG98MCwxMjgsMCl8MDtqPXI7Y1tqPj4yXT16O2Nbais0Pj4yXT1DO2o9cztqPURkKChvPj4+MD40Mjk0OTY3Mjk1fChvfDApPT0tMSZoPj4+MD40Mjk0OTY3MTY3KSYxfDAsMCxjW2o+PjJdfDAsY1tqKzQ+PjJdfDApfDA7aD1zO2NbaD4+Ml09ajtjW2grND4+Ml09QztBYih3LHEpO2g9cTtqPXQ7bz1oKzEyOHwwO2Rve2NbaD4+Ml09Y1tqPj4yXTtoPWgrNHwwO2o9ais0fDB9d2hpbGUoKGh8MCk8KG98MCkpO2g9KGNbcD4+Ml18MCkrLTEyOHwwO2NbcD4+Ml09aDtqPUNkKG18MCxsfDAsa3wwLDApfDA7aWYoKG18MCk9PShrfDApJihsfDApPT0wKWJyZWFrO2Vsc2V7Zj1mK2t8MDtsPUM7bT1qfX1pZigoeHwwKT09Nyl7SWQoaHwwLGZ8MCxtfDApfDA7ej1EZChjW3A+PjJdfDAsMCxtfDAsbHwwKXwwO2NbcD4+Ml09en16Yih3LHYsMjQpfDA7aWYoKGQmLTE2fDApPT0zMiYoZXwwKT09MCl7ej0tMTtpPXk7cmV0dXJuIHp8MH14PURkKGR8MCxlfDAsLTQ4LC0xKXwwO3o9QzttZCh3LGcsYik7bmIodSwzMjU3Nix3LDMyNTkyKTt6PXRjKGEsYis0OHwwLGIrMzJ8MCx4LHosdix1KXwwO2k9eTtyZXR1cm4genwwfWZ1bmN0aW9uIG1iKCl7cmV0dXJuIDQ4fWZ1bmN0aW9uIG5iKGIsYyxlLGYpe2I9YnwwO2M9Y3wwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTA7az0yMDtsPShkW2YrMT4+MF18MCk8PDh8KGRbZj4+MF18MCl8KGRbZisyPj4wXXwwKTw8MTZ8KGRbZiszPj4wXXwwKTw8MjQ7bT0oZFtlKzE+PjBdfDApPDw4fChkW2U+PjBdfDApfChkW2UrMj4+MF18MCk8PDE2fChkW2UrMz4+MF18MCk8PDI0O249KGRbZis5Pj4wXXwwKTw8OHwoZFtmKzg+PjBdfDApfChkW2YrMTA+PjBdfDApPDwxNnwoZFtmKzExPj4wXXwwKTw8MjQ7bz0oZFtlKzE3Pj4wXXwwKTw8OHwoZFtlKzE2Pj4wXXwwKXwoZFtlKzE4Pj4wXXwwKTw8MTZ8KGRbZSsxOT4+MF18MCk8PDI0O3A9KGRbZSsyMT4+MF18MCk8PDh8KGRbZSsyMD4+MF18MCl8KGRbZSsyMj4+MF18MCk8PDE2fChkW2UrMjM+PjBdfDApPDwyNDtxPShkW2UrMjU+PjBdfDApPDw4fChkW2UrMjQ+PjBdfDApfChkW2UrMjY+PjBdfDApPDwxNnwoZFtlKzI3Pj4wXXwwKTw8MjQ7cj0oZFtlKzI5Pj4wXXwwKTw8OHwoZFtlKzI4Pj4wXXwwKXwoZFtlKzMwPj4wXXwwKTw8MTZ8KGRbZSszMT4+MF18MCk8PDI0O3M9KGRbZisxMz4+MF18MCk8PDh8KGRbZisxMj4+MF18MCl8KGRbZisxND4+MF18MCk8PDE2fChkW2YrMTU+PjBdfDApPDwyNDt0PShkW2UrNT4+MF18MCk8PDh8KGRbZSs0Pj4wXXwwKXwoZFtlKzY+PjBdfDApPDwxNnwoZFtlKzc+PjBdfDApPDwyNDt1PShkW2UrOT4+MF18MCk8PDh8KGRbZSs4Pj4wXXwwKXwoZFtlKzEwPj4wXXwwKTw8MTZ8KGRbZSsxMT4+MF18MCk8PDI0O2o9KGRbZSsxMz4+MF18MCk8PDh8KGRbZSsxMj4+MF18MCl8KGRbZSsxND4+MF18MCk8PDE2fChkW2UrMTU+PjBdfDApPDwyNDtmPShkW2YrNT4+MF18MCk8PDh8KGRbZis0Pj4wXXwwKXwoZFtmKzY+PjBdfDApPDwxNnwoZFtmKzc+PjBdfDApPDwyNDtnPShkW2MrMT4+MF18MCk8PDh8KGRbYz4+MF18MCl8KGRbYysyPj4wXXwwKTw8MTZ8KGRbYyszPj4wXXwwKTw8MjQ7aD0oZFtjKzU+PjBdfDApPDw4fChkW2MrND4+MF18MCl8KGRbYys2Pj4wXXwwKTw8MTZ8KGRbYys3Pj4wXXwwKTw8MjQ7aT0oZFtjKzk+PjBdfDApPDw4fChkW2MrOD4+MF18MCl8KGRbYysxMD4+MF18MCk8PDE2fChkW2MrMTE+PjBdfDApPDwyNDtlPShkW2MrMTM+PjBdfDApPDw4fChkW2MrMTI+PjBdfDApfChkW2MrMTQ+PjBdfDApPDwxNnwoZFtjKzE1Pj4wXXwwKTw8MjQ7d2hpbGUoMSl7RD1wK2x8MDtEPShEPj4+MjV8RDw8NyleajtBPUQrbHwwO0E9KEE+Pj4yM3xBPDw5KV5pO3g9QStEfDA7eD0oeD4+PjE5fHg8PDEzKV5wO0c9eCtBfDA7Rz0oRz4+PjE0fEc8PDE4KV5sO3o9ZittfDA7ej1lXih6Pj4+MjV8ejw8Nyk7dz16K2Z8MDt3PXFeKHc+Pj4yM3x3PDw5KTtKPXcrenwwO0o9KEo+Pj4xOXxKPDwxMylebTtDPUord3wwO0M9KEM+Pj4xNHxDPDwxOCleZjt2PW4rZ3wwO3Y9cl4odj4+PjI1fHY8PDcpO0k9ditufDA7ST0oST4+PjIzfEk8PDkpXnQ7Rj1JK3Z8MDtGPShGPj4+MTl8Rjw8MTMpXmc7eT1GK0l8MDt5PSh5Pj4+MTR8eTw8MTgpXm47SD1zK298MDtIPShIPj4+MjV8SDw8NyledTtFPUgrc3wwO0U9KEU+Pj4yM3xFPDw5KV5oO0I9RStIfDA7Qj0oQj4+PjE5fEI8PDEzKV5vO2M9QitFfDA7Yz0oYz4+PjE0fGM8PDE4KV5zO0s9RytIfDA7bT0oSz4+PjI1fEs8PDcpXko7Sj1tK0d8MDt0PShKPj4+MjN8Sjw8OSleSTtJPXQrbXwwO3U9KEk+Pj4xOXxJPDwxMyleSDtIPXUrdHwwO2w9KEg+Pj4xNHxIPDwxOCleRztHPUMrRHwwO2c9KEc+Pj4yNXxHPDw3KV5GO0Y9ZytDfDA7aD0oRj4+PjIzfEY8PDkpXkU7RT1oK2d8MDtqPShFPj4+MTl8RTw8MTMpXkQ7RD1qK2h8MDtmPShEPj4+MTR8RDw8MTgpXkM7Qz15K3p8MDtvPShDPj4+MjV8Qzw8NyleQjtCPW8reXwwO2k9KEI+Pj4yM3xCPDw5KV5BO0E9aStvfDA7ZT0oQT4+PjE5fEE8PDEzKV56O3o9ZStpfDA7bj0oej4+PjE0fHo8PDE4KV55O3k9Yyt2fDA7cD0oeT4+PjI1fHk8PDcpXng7eD1wK2N8MDtxPSh4Pj4+MjN8eDw8OSledzt3PXErcHwwO3I9KHc+Pj4xOXx3PDwxMyledjt2PXIrcXwwO3M9KHY+Pj4xNHx2PDwxOCleYztpZigoa3wwKTw9MilicmVhaztlbHNlIGs9aystMnwwfWFbYj4+MF09bDthW2IrMT4+MF09bD4+Pjg7YVtiKzI+PjBdPWw+Pj4xNjthW2IrMz4+MF09bD4+PjI0O2FbYis0Pj4wXT1mO2FbYis1Pj4wXT1mPj4+ODthW2IrNj4+MF09Zj4+PjE2O2FbYis3Pj4wXT1mPj4+MjQ7YVtiKzg+PjBdPW47YVtiKzk+PjBdPW4+Pj44O2FbYisxMD4+MF09bj4+PjE2O2FbYisxMT4+MF09bj4+PjI0O2FbYisxMj4+MF09czthW2IrMTM+PjBdPXM+Pj44O2FbYisxND4+MF09cz4+PjE2O2FbYisxNT4+MF09cz4+PjI0O2FbYisxNj4+MF09ZzthW2IrMTc+PjBdPWc+Pj44O2FbYisxOD4+MF09Zz4+PjE2O2FbYisxOT4+MF09Zz4+PjI0O2FbYisyMD4+MF09aDthW2IrMjE+PjBdPWg+Pj44O2FbYisyMj4+MF09aD4+PjE2O2FbYisyMz4+MF09aD4+PjI0O2FbYisyND4+MF09aTthW2IrMjU+PjBdPWk+Pj44O2FbYisyNj4+MF09aT4+PjE2O2FbYisyNz4+MF09aT4+PjI0O2FbYisyOD4+MF09ZTthW2IrMjk+PjBdPWU+Pj44O2FbYiszMD4+MF09ZT4+PjE2O2FbYiszMT4+MF09ZT4+PjI0O3JldHVybn1mdW5jdGlvbiBvYihiLGMsZSxmKXtiPWJ8MDtjPWN8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MCxTPTAsVD0wLFU9MCxWPTAsVz0wLFg9MCxZPTAsWj0wLF89MDtGPShkW2YrMT4+MF18MCk8PDh8KGRbZj4+MF18MCl8KGRbZisyPj4wXXwwKTw8MTZ8KGRbZiszPj4wXXwwKTw8MjQ7Rz0oZFtlKzE+PjBdfDApPDw4fChkW2U+PjBdfDApfChkW2UrMj4+MF18MCk8PDE2fChkW2UrMz4+MF18MCk8PDI0O0g9KGRbZSs1Pj4wXXwwKTw8OHwoZFtlKzQ+PjBdfDApfChkW2UrNj4+MF18MCk8PDE2fChkW2UrNz4+MF18MCk8PDI0O0k9KGRbZSs5Pj4wXXwwKTw8OHwoZFtlKzg+PjBdfDApfChkW2UrMTA+PjBdfDApPDwxNnwoZFtlKzExPj4wXXwwKTw8MjQ7Sj0oZFtlKzEzPj4wXXwwKTw8OHwoZFtlKzEyPj4wXXwwKXwoZFtlKzE0Pj4wXXwwKTw8MTZ8KGRbZSsxNT4+MF18MCk8PDI0O0I9KGRbZis1Pj4wXXwwKTw8OHwoZFtmKzQ+PjBdfDApfChkW2YrNj4+MF18MCk8PDE2fChkW2YrNz4+MF18MCk8PDI0O0M9KGRbYysxPj4wXXwwKTw8OHwoZFtjPj4wXXwwKXwoZFtjKzI+PjBdfDApPDwxNnwoZFtjKzM+PjBdfDApPDwyNDtEPShkW2MrNT4+MF18MCk8PDh8KGRbYys0Pj4wXXwwKXwoZFtjKzY+PjBdfDApPDwxNnwoZFtjKzc+PjBdfDApPDwyNDtFPShkW2MrOT4+MF18MCk8PDh8KGRbYys4Pj4wXXwwKXwoZFtjKzEwPj4wXXwwKTw8MTZ8KGRbYysxMT4+MF18MCk8PDI0O3c9KGRbYysxMz4+MF18MCk8PDh8KGRbYysxMj4+MF18MCl8KGRbYysxND4+MF18MCk8PDE2fChkW2MrMTU+PjBdfDApPDwyNDt4PShkW2YrOT4+MF18MCk8PDh8KGRbZis4Pj4wXXwwKXwoZFtmKzEwPj4wXXwwKTw8MTZ8KGRbZisxMT4+MF18MCk8PDI0O3k9KGRbZSsxNz4+MF18MCk8PDh8KGRbZSsxNj4+MF18MCl8KGRbZSsxOD4+MF18MCk8PDE2fChkW2UrMTk+PjBdfDApPDwyNDt6PShkW2UrMjE+PjBdfDApPDw4fChkW2UrMjA+PjBdfDApfChkW2UrMjI+PjBdfDApPDwxNnwoZFtlKzIzPj4wXXwwKTw8MjQ7QT0oZFtlKzI1Pj4wXXwwKTw8OHwoZFtlKzI0Pj4wXXwwKXwoZFtlKzI2Pj4wXXwwKTw8MTZ8KGRbZSsyNz4+MF18MCk8PDI0O3Y9KGRbZSsyOT4+MF18MCk8PDh8KGRbZSsyOD4+MF18MCl8KGRbZSszMD4+MF18MCk8PDE2fChkW2UrMzE+PjBdfDApPDwyNDtjPShkW2YrMTM+PjBdfDApPDw4fChkW2YrMTI+PjBdfDApfChkW2YrMTQ+PjBdfDApPDwxNnwoZFtmKzE1Pj4wXXwwKTw8MjQ7ZT0yMDtmPUY7Zz1HO2g9eDtpPXk7aj16O2s9QTtsPXY7bT1jO249SDtvPUk7cD1KO3E9QjtyPUM7cz1EO3Q9RTt1PXc7d2hpbGUoMSl7VD1mK2p8MDtUPShUPj4+MjV8VDw8NylecDtRPVQrZnwwO1E9KFE+Pj4yM3xRPDw5KV50O049UStUfDA7Tj0oTj4+PjE5fE48PDEzKV5qO1c9TitRfDA7Vz0oVz4+PjE0fFc8PDE4KV5mO1A9ZytxfDA7UD0oUD4+PjI1fFA8PDcpXnU7TT1QK3F8MDtNPShNPj4+MjN8TTw8OSleaztaPU0rUHwwO1o9KFo+Pj4xOXxaPDwxMyleZztTPVorTXwwO1M9KFM+Pj4xNHxTPDwxOClecTtMPXIraHwwO0w9KEw+Pj4yNXxMPDw3KV5sO1k9TCtofDA7WT0oWT4+PjIzfFk8PDkpXm47Vj1ZK0x8MDtWPShWPj4+MTl8Vjw8MTMpXnI7Tz1WK1l8MDtPPShPPj4+MTR8Tzw8MTgpXmg7WD1pK218MDtYPW9eKFg+Pj4yNXxYPDw3KTtVPVgrbXwwO1U9KFU+Pj4yM3xVPDw5KV5zO1I9VStYfDA7Uj0oUj4+PjE5fFI8PDEzKV5pO0s9UitVfDA7Sz0oSz4+PjE0fEs8PDE4KV5tO189VytYfDA7Zz0oXz4+PjI1fF88PDcpXlo7Wj1nK1d8MDtuPShaPj4+MjN8Wjw8OSleWTtZPW4rZ3wwO289KFk+Pj4xOXxZPDwxMyleWDtYPW8rbnwwO2Y9KFg+Pj4xNHxYPDwxOCleVztXPVMrVHwwO3I9KFc+Pj4yNXxXPDw3KV5WO1Y9citTfDA7cz0oVj4+PjIzfFY8PDkpXlU7VT1zK3J8MDtwPShVPj4+MTl8VTw8MTMpXlQ7VD1wK3N8MDtxPShUPj4+MTR8VDw8MTgpXlM7Uz1PK1B8MDtpPShTPj4+MjV8Uzw8NyleUjtSPWkrT3wwO3Q9KFI+Pj4yM3xSPDw5KV5RO1E9dCtpfDA7dT0oUT4+PjE5fFE8PDEzKV5QO1A9dSt0fDA7aD0oUD4+PjE0fFA8PDE4KV5PO089SytMfDA7aj0oTz4+PjI1fE88PDcpXk47Tj1qK0t8MDtrPShOPj4+MjN8Tjw8OSleTTtNPWsranwwO2w9KE0+Pj4xOXxNPDwxMyleTDtMPWwra3wwO209KEw+Pj4xNHxMPDwxOCleSztpZigoZXwwKTw9MilicmVhaztlbHNlIGU9ZSstMnwwfUw9ZitGfDA7TT1nK0d8MDtOPW4rSHwwO089bytJfDA7UD1wK0p8MDtRPXErQnwwO1I9citDfDA7Uz1zK0R8MDtUPXQrRXwwO1U9dSt3fDA7Vj1oK3h8MDtXPWkreXwwO1g9ait6fDA7WT1rK0F8MDtaPWwrdnwwO189bStjfDA7YVtiPj4wXT1MO2FbYisxPj4wXT1MPj4+ODthW2IrMj4+MF09TD4+PjE2O2FbYiszPj4wXT1MPj4+MjQ7YVtiKzQ+PjBdPU07YVtiKzU+PjBdPU0+Pj44O2FbYis2Pj4wXT1NPj4+MTY7YVtiKzc+PjBdPU0+Pj4yNDthW2IrOD4+MF09TjthW2IrOT4+MF09Tj4+Pjg7YVtiKzEwPj4wXT1OPj4+MTY7YVtiKzExPj4wXT1OPj4+MjQ7YVtiKzEyPj4wXT1PO2FbYisxMz4+MF09Tz4+Pjg7YVtiKzE0Pj4wXT1PPj4+MTY7YVtiKzE1Pj4wXT1PPj4+MjQ7YVtiKzE2Pj4wXT1QO2FbYisxNz4+MF09UD4+Pjg7YVtiKzE4Pj4wXT1QPj4+MTY7YVtiKzE5Pj4wXT1QPj4+MjQ7YVtiKzIwPj4wXT1RO2FbYisyMT4+MF09UT4+Pjg7YVtiKzIyPj4wXT1RPj4+MTY7YVtiKzIzPj4wXT1RPj4+MjQ7YVtiKzI0Pj4wXT1SO2FbYisyNT4+MF09Uj4+Pjg7YVtiKzI2Pj4wXT1SPj4+MTY7YVtiKzI3Pj4wXT1SPj4+MjQ7YVtiKzI4Pj4wXT1TO2FbYisyOT4+MF09Uz4+Pjg7YVtiKzMwPj4wXT1TPj4+MTY7YVtiKzMxPj4wXT1TPj4+MjQ7YVtiKzMyPj4wXT1UO2FbYiszMz4+MF09VD4+Pjg7YVtiKzM0Pj4wXT1UPj4+MTY7YVtiKzM1Pj4wXT1UPj4+MjQ7YVtiKzM2Pj4wXT1VO2FbYiszNz4+MF09VT4+Pjg7YVtiKzM4Pj4wXT1VPj4+MTY7YVtiKzM5Pj4wXT1VPj4+MjQ7YVtiKzQwPj4wXT1WO2FbYis0MT4+MF09Vj4+Pjg7YVtiKzQyPj4wXT1WPj4+MTY7YVtiKzQzPj4wXT1WPj4+MjQ7YVtiKzQ0Pj4wXT1XO2FbYis0NT4+MF09Vz4+Pjg7YVtiKzQ2Pj4wXT1XPj4+MTY7YVtiKzQ3Pj4wXT1XPj4+MjQ7YVtiKzQ4Pj4wXT1YO2FbYis0OT4+MF09WD4+Pjg7YVtiKzUwPj4wXT1YPj4+MTY7YVtiKzUxPj4wXT1YPj4+MjQ7YVtiKzUyPj4wXT1ZO2FbYis1Mz4+MF09WT4+Pjg7YVtiKzU0Pj4wXT1ZPj4+MTY7YVtiKzU1Pj4wXT1ZPj4+MjQ7YVtiKzU2Pj4wXT1aO2FbYis1Nz4+MF09Wj4+Pjg7YVtiKzU4Pj4wXT1aPj4+MTY7YVtiKzU5Pj4wXT1aPj4+MjQ7YVtiKzYwPj4wXT1fO2FbYis2MT4+MF09Xz4+Pjg7YVtiKzYyPj4wXT1fPj4+MTY7YVtiKzYzPj4wXT1fPj4+MjQ7cmV0dXJufWZ1bmN0aW9uIHBiKCl7cmV0dXJuIDE2fWZ1bmN0aW9uIHFiKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIHJiKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIHNiKCl7cmV0dXJuIDE2fWZ1bmN0aW9uIHRiKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIHViKCl7cmV0dXJuIDMyfWZ1bmN0aW9uIHZiKCl7cmV0dXJuIDM4NH1mdW5jdGlvbiB3YihiLGUsZixnLGgsaixrKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MDt2PWk7dD1pPWkrNjMmLTY0O2k9aSs0OTZ8MDtuPXQrMzYwfDA7aWYoKGUrLTF8MCk+Pj4wPjYzfGs+Pj4wPjY0KXt1PS0xO2k9djtyZXR1cm4gdXwwfWlmKGU+Pj4wPj0yNTYpemEoMzI2MDgsMzI2MjgsMTgsMzI2ODApO2lmKGs+Pj4wPj0yNTYpemEoMzI3MDcsMzI2MjgsMTksMzI2ODApO209ayYyNTU7ZG8gaWYoISgoYnwwKT09MHwoZnwwKT09MCYoKGd8MCkhPTB8KGh8MCkhPTApfCgoZSYyNTUpKy0xJjI1NSk+NjMpPyhsPW08PDI0Pj4yND09MCwhKChtJjI1NSk+NjR8KChqfDApIT0wfGwpXjEpKTowKXtpZihsKXtGZCh0fDAsMCwzNTcpfDA7bT10O2NbbT4+Ml09ZSYyNTVeLTIyMjQ0MzI1NjtjW20rND4+Ml09MTc3OTAzMzcwMzttPXQrOHwwO2NbbT4+Ml09LTIwNjcwOTM3MDE7Y1ttKzQ+PjJdPS0xMTUwODMzMDE5O209dCsxNnwwO2NbbT4+Ml09LTIzNzkxNTczO2NbbSs0Pj4yXT0xMDEzOTA0MjQyO209dCsyNHwwO2NbbT4+Ml09MTU5NTc1MDEyOTtjW20rND4+Ml09LTE1MjE0ODY1MzQ7bT10KzMyfDA7Y1ttPj4yXT0tMTM3NzQwMjE1OTtjW20rND4+Ml09MTM1OTg5MzExOTttPXQrNDB8MDtjW20+PjJdPTcyNTUxMTE5OTtjW20rND4+Ml09LTE2OTQxNDQzNzI7bT10KzQ4fDA7Y1ttPj4yXT0tNzk1Nzc3NDk7Y1ttKzQ+PjJdPTUyODczNDYzNTttPXQrNTZ8MDtjW20+PjJdPTMyNzAzMzIwOTtjW20rND4+Ml09MTU0MTQ1OTIyNTttPTB9ZWxzZXtpZigoanwwKT09MHwobSstMSYyNTUpPjYzKXtsPS0xO2JyZWFrfWw9ayYyNTU7RmQodHwwLDAsMzU3KXwwO3M9SGQobHwwLDAsOCl8MDtvPXQ7Y1tvPj4yXT0oc3xlJjI1NSleLTIyMjQ0MzI1NjtjW28rND4+Ml09Q14xNzc5MDMzNzAzO289dCs4fDA7Y1tvPj4yXT0tMjA2NzA5MzcwMTtjW28rND4+Ml09LTExNTA4MzMwMTk7bz10KzE2fDA7Y1tvPj4yXT0tMjM3OTE1NzM7Y1tvKzQ+PjJdPTEwMTM5MDQyNDI7bz10KzI0fDA7Y1tvPj4yXT0xNTk1NzUwMTI5O2Nbbys0Pj4yXT0tMTUyMTQ4NjUzNDtvPXQrMzJ8MDtjW28+PjJdPS0xMzc3NDAyMTU5O2Nbbys0Pj4yXT0xMzU5ODkzMTE5O289dCs0MHwwO2Nbbz4+Ml09NzI1NTExMTk5O2Nbbys0Pj4yXT0tMTY5NDE0NDM3MjtvPXQrNDh8MDtjW28+PjJdPS03OTU3Nzc0OTtjW28rND4+Ml09NTI4NzM0NjM1O289dCs1NnwwO2Nbbz4+Ml09MzI3MDMzMjA5O2Nbbys0Pj4yXT0xNTQxNDU5MjI1O0ZkKG4rbHwwLDAsKG08PDI0Pj4yNDwwPzA6MTI4LWx8MCl8MCl8MDtJZChufDAsanwwLGx8MCl8MDtsPXQrMzUyfDA7bz10Kzk2fDA7bT1vKzEyOHwwO2Rve2Fbbz4+MF09YVtuPj4wXXwwO289bysxfDA7bj1uKzF8MH13aGlsZSgob3wwKTwobXwwKSk7Y1tsPj4yXT0xMjg7bT0xMjh9az10KzM1MnwwO2lmKCEoKGd8MCk9PTAmKGh8MCk9PTApKXtxPXQrOTZ8MDtqPXQrNjR8MDtyPXQrNzJ8MDtzPXQrMjI0fDA7cD1mO3doaWxlKDEpe2Y9MjU2LW18MDtsPXQrOTYrbXwwO2lmKCEoaD4+PjA+MHwoaHwwKT09MCZnPj4+MD5mPj4+MCkpe3U9MTY7YnJlYWt9SWQobHwwLHB8MCxmfDApfDA7Y1trPj4yXT0oY1trPj4yXXwwKStmO209ajtvPWNbbT4+Ml18MDttPWNbbSs0Pj4yXXwwO2w9RGQob3wwLG18MCwxMjgsMCl8MDtuPWo7Y1tuPj4yXT1sO2Nbbis0Pj4yXT1DO249cjtuPURkKChtPj4+MD40Mjk0OTY3Mjk1fChtfDApPT0tMSZvPj4+MD40Mjk0OTY3MTY3KSYxfDAsMCxjW24+PjJdfDAsY1tuKzQ+PjJdfDApfDA7bz1yO2Nbbz4+Ml09bjtjW28rND4+Ml09QztBYih0LHEpO289cTtuPXM7bT1vKzEyOHwwO2Rve2Nbbz4+Ml09Y1tuPj4yXTtvPW8rNHwwO249bis0fDB9d2hpbGUoKG98MCk8KG18MCkpO209KGNbaz4+Ml18MCkrLTEyOHwwO2Nbaz4+Ml09bTtsPUNkKGd8MCxofDAsZnwwLDApfDA7aWYoKGd8MCk9PShmfDApJihofDApPT0wKWJyZWFrO2Vsc2V7cD1wK2Z8MDtoPUM7Zz1sfX1pZigodXwwKT09MTYpe0lkKGx8MCxwfDAsZ3wwKXwwO209RGQoY1trPj4yXXwwLDAsZ3wwLGh8MCl8MDtjW2s+PjJdPW19bD1lJjI1NTtpZihtPj4+MD4xMjgpe3M9ajtlPWNbcz4+Ml18MDtzPWNbcys0Pj4yXXwwO209RGQoZXwwLHN8MCwxMjgsMCl8MDtuPWo7Y1tuPj4yXT1tO2Nbbis0Pj4yXT1DO249dCs3MnwwO209bjttPURkKChzPj4+MD40Mjk0OTY3Mjk1fChzfDApPT0tMSZlPj4+MD40Mjk0OTY3MTY3KSYxfDAsMCxjW20+PjJdfDAsY1ttKzQ+PjJdfDApfDA7ZT1uO2NbZT4+Ml09bTtjW2UrND4+Ml09QztlPXQrOTZ8MDtBYih0LGUpO209KGNbaz4+Ml18MCkrLTEyOHwwO2Nbaz4+Ml09bTtKZChlfDAsdCsyMjR8MCxtfDApfDA7bT1jW2s+PjJdfDB9ZWxzZSB1PTE5fWVsc2V7aj10KzY0fDA7bD1lJjI1NTt1PTE5fWlmKCh1fDApPT0xOSluPXQrNzJ8MDt1PWo7dT1EZChjW3U+PjJdfDAsY1t1KzQ+PjJdfDAsbXwwLDApfDA7cz1DO3I9ajtjW3I+PjJdPXU7Y1tyKzQ+PjJdPXM7cj1uO2U9cjtyPXIrNHwwO3I9RGQoKHM+Pj4wPDB8KHN8MCk9PTAmdT4+PjA8bT4+PjApJjF8MCwwLGRbZT4+MF18ZFtlKzE+PjBdPDw4fGRbZSsyPj4wXTw8MTZ8ZFtlKzM+PjBdPDwyNHwwLGRbcj4+MF18ZFtyKzE+PjBdPDw4fGRbcisyPj4wXTw8MTZ8ZFtyKzM+PjBdPDwyNHwwKXwwO2U9Qzt1PW47cz11O2Fbcz4+MF09cjthW3MrMT4+MF09cj4+ODthW3MrMj4+MF09cj4+MTY7YVtzKzM+PjBdPXI+PjI0O3U9dSs0fDA7YVt1Pj4wXT1lO2FbdSsxPj4wXT1lPj44O2FbdSsyPj4wXT1lPj4xNjthW3UrMz4+MF09ZT4+MjQ7aWYoYVt0KzM1Nj4+MF18MCl7dT10Kzg4fDA7Y1t1Pj4yXT0tMTtjW3UrND4+Ml09LTF9dT10KzgwfDA7Y1t1Pj4yXT0tMTtjW3UrND4+Ml09LTE7RmQodCs5NittfDAsMCwyNTYtbXwwKXwwO0FiKHQsdCs5NnwwKTtJZChifDAsdHwwLGx8MCl8MDtsPTB9ZWxzZSBsPS0xO3doaWxlKDApO3U9bDtpPXY7cmV0dXJuIHV8MH1mdW5jdGlvbiB4YihiLGMsZCxlKXtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7aj1pO2Y9aT1pKzYzJi02NDtpPWkrMTI4fDA7aWYoZD4+PjA+NjR8KGUrLTF8MCk+Pj4wPjYzKXtiPS0xO2k9ajtyZXR1cm4gYnwwfWlmKGU+Pj4wPj0yNTYpemEoMzI2MDgsMzI2MjgsNTMsMzI3MjcpO2lmKGQ+Pj4wPj0yNTYpemEoMzI3MDcsMzI2MjgsNTQsMzI3MjcpO2g9ZSYyNTU7aWYoKGN8MCk9PTB8KGR8MCk9PTApe2lmKChoKy0xJjI1NSk+NjMpe2I9LTE7aT1qO3JldHVybiBifDB9RmQoYnwwLDAsMzU3KXwwO2M9ZSYyNTVeLTIyMjQ0MzI1NjtlPWI7ZD1lO2FbZD4+MF09YzthW2QrMT4+MF09Yz4+ODthW2QrMj4+MF09Yz4+MTY7YVtkKzM+PjBdPWM+PjI0O2U9ZSs0fDA7YVtlPj4wXT0xMDM7YVtlKzE+PjBdPTIzMDthW2UrMj4+MF09OTthW2UrMz4+MF09MTA2O2U9Yis4fDA7ZD1lO2FbZD4+MF09LTIwNjcwOTM3MDE7YVtkKzE+PjBdPS0yMDY3MDkzNzAxPj44O2FbZCsyPj4wXT0tMjA2NzA5MzcwMT4+MTY7YVtkKzM+PjBdPS0yMDY3MDkzNzAxPj4yNDtlPWUrNHwwO2FbZT4+MF09LTExNTA4MzMwMTk7YVtlKzE+PjBdPS0xMTUwODMzMDE5Pj44O2FbZSsyPj4wXT0tMTE1MDgzMzAxOT4+MTY7YVtlKzM+PjBdPS0xMTUwODMzMDE5Pj4yNDtlPWIrMTZ8MDtkPWU7YVtkPj4wXT0tMjM3OTE1NzM7YVtkKzE+PjBdPS0yMzc5MTU3Mz4+ODthW2QrMj4+MF09LTIzNzkxNTczPj4xNjthW2QrMz4+MF09LTIzNzkxNTczPj4yNDtlPWUrNHwwO2FbZT4+MF09MTE0O2FbZSsxPj4wXT0yNDM7YVtlKzI+PjBdPTExMDthW2UrMz4+MF09NjA7ZT1iKzI0fDA7ZD1lO2FbZD4+MF09MjQxO2FbZCsxPj4wXT01NDthW2QrMj4+MF09Mjk7YVtkKzM+PjBdPTk1O2U9ZSs0fDA7YVtlPj4wXT0tMTUyMTQ4NjUzNDthW2UrMT4+MF09LTE1MjE0ODY1MzQ+Pjg7YVtlKzI+PjBdPS0xNTIxNDg2NTM0Pj4xNjthW2UrMz4+MF09LTE1MjE0ODY1MzQ+PjI0O2U9YiszMnwwO2Q9ZTthW2Q+PjBdPS0xMzc3NDAyMTU5O2FbZCsxPj4wXT0tMTM3NzQwMjE1OT4+ODthW2QrMj4+MF09LTEzNzc0MDIxNTk+PjE2O2FbZCszPj4wXT0tMTM3NzQwMjE1OT4+MjQ7ZT1lKzR8MDthW2U+PjBdPTEyNzthW2UrMT4+MF09ODI7YVtlKzI+PjBdPTE0O2FbZSszPj4wXT04MTtlPWIrNDB8MDtkPWU7YVtkPj4wXT0zMTthW2QrMT4+MF09MTA4O2FbZCsyPj4wXT02MjthW2QrMz4+MF09NDM7ZT1lKzR8MDthW2U+PjBdPS0xNjk0MTQ0MzcyO2FbZSsxPj4wXT0tMTY5NDE0NDM3Mj4+ODthW2UrMj4+MF09LTE2OTQxNDQzNzI+PjE2O2FbZSszPj4wXT0tMTY5NDE0NDM3Mj4+MjQ7ZT1iKzQ4fDA7ZD1lO2FbZD4+MF09LTc5NTc3NzQ5O2FbZCsxPj4wXT0tNzk1Nzc3NDk+Pjg7YVtkKzI+PjBdPS03OTU3Nzc0OT4+MTY7YVtkKzM+PjBdPS03OTU3Nzc0OT4+MjQ7ZT1lKzR8MDthW2U+PjBdPTE3MTthW2UrMT4+MF09MjE3O2FbZSsyPj4wXT0xMzE7YVtlKzM+PjBdPTMxO2I9Yis1NnwwO2U9YjthW2U+PjBdPTEyMTthW2UrMT4+MF09MzM7YVtlKzI+PjBdPTEyNjthW2UrMz4+MF09MTk7Yj1iKzR8MDthW2I+PjBdPTI1O2FbYisxPj4wXT0yMDU7YVtiKzI+PjBdPTIyNDthW2IrMz4+MF09OTE7Yj0wO2k9ajtyZXR1cm4gYnwwfWVsc2V7Zz1kJjI1NTtpZigoaCstMSYyNTUpPjYzfChnKy0xJjI1NSk+NjMpe2I9LTE7aT1qO3JldHVybiBifDB9aD1kJjI1NTtGZChifDAsMCwzNTcpfDA7bD1IZChofDAsMCw4KXwwO2w9KGx8ZSYyNTUpXi0yMjI0NDMyNTY7ZD1DXjE3NzkwMzM3MDM7ZT1iO2s9ZTthW2s+PjBdPWw7YVtrKzE+PjBdPWw+Pjg7YVtrKzI+PjBdPWw+PjE2O2FbayszPj4wXT1sPj4yNDtlPWUrNHwwO2FbZT4+MF09ZDthW2UrMT4+MF09ZD4+ODthW2UrMj4+MF09ZD4+MTY7YVtlKzM+PjBdPWQ+PjI0O2U9Yis4fDA7ZD1lO2FbZD4+MF09LTIwNjcwOTM3MDE7YVtkKzE+PjBdPS0yMDY3MDkzNzAxPj44O2FbZCsyPj4wXT0tMjA2NzA5MzcwMT4+MTY7YVtkKzM+PjBdPS0yMDY3MDkzNzAxPj4yNDtlPWUrNHwwO2FbZT4+MF09LTExNTA4MzMwMTk7YVtlKzE+PjBdPS0xMTUwODMzMDE5Pj44O2FbZSsyPj4wXT0tMTE1MDgzMzAxOT4+MTY7YVtlKzM+PjBdPS0xMTUwODMzMDE5Pj4yNDtlPWIrMTZ8MDtkPWU7YVtkPj4wXT0tMjM3OTE1NzM7YVtkKzE+PjBdPS0yMzc5MTU3Mz4+ODthW2QrMj4+MF09LTIzNzkxNTczPj4xNjthW2QrMz4+MF09LTIzNzkxNTczPj4yNDtlPWUrNHwwO2FbZT4+MF09MTE0O2FbZSsxPj4wXT0yNDM7YVtlKzI+PjBdPTExMDthW2UrMz4+MF09NjA7ZT1iKzI0fDA7ZD1lO2FbZD4+MF09MjQxO2FbZCsxPj4wXT01NDthW2QrMj4+MF09Mjk7YVtkKzM+PjBdPTk1O2U9ZSs0fDA7YVtlPj4wXT0tMTUyMTQ4NjUzNDthW2UrMT4+MF09LTE1MjE0ODY1MzQ+Pjg7YVtlKzI+PjBdPS0xNTIxNDg2NTM0Pj4xNjthW2UrMz4+MF09LTE1MjE0ODY1MzQ+PjI0O2U9YiszMnwwO2Q9ZTthW2Q+PjBdPS0xMzc3NDAyMTU5O2FbZCsxPj4wXT0tMTM3NzQwMjE1OT4+ODthW2QrMj4+MF09LTEzNzc0MDIxNTk+PjE2O2FbZCszPj4wXT0tMTM3NzQwMjE1OT4+MjQ7ZT1lKzR8MDthW2U+PjBdPTEyNzthW2UrMT4+MF09ODI7YVtlKzI+PjBdPTE0O2FbZSszPj4wXT04MTtlPWIrNDB8MDtkPWU7YVtkPj4wXT0zMTthW2QrMT4+MF09MTA4O2FbZCsyPj4wXT02MjthW2QrMz4+MF09NDM7ZT1lKzR8MDthW2U+PjBdPS0xNjk0MTQ0MzcyO2FbZSsxPj4wXT0tMTY5NDE0NDM3Mj4+ODthW2UrMj4+MF09LTE2OTQxNDQzNzI+PjE2O2FbZSszPj4wXT0tMTY5NDE0NDM3Mj4+MjQ7ZT1iKzQ4fDA7ZD1lO2FbZD4+MF09LTc5NTc3NzQ5O2FbZCsxPj4wXT0tNzk1Nzc3NDk+Pjg7YVtkKzI+PjBdPS03OTU3Nzc0OT4+MTY7YVtkKzM+PjBdPS03OTU3Nzc0OT4+MjQ7ZT1lKzR8MDthW2U+PjBdPTE3MTthW2UrMT4+MF09MjE3O2FbZSsyPj4wXT0xMzE7YVtlKzM+PjBdPTMxO2U9Yis1NnwwO2Q9ZTthW2Q+PjBdPTEyMTthW2QrMT4+MF09MzM7YVtkKzI+PjBdPTEyNjthW2QrMz4+MF09MTk7ZT1lKzR8MDthW2U+PjBdPTI1O2FbZSsxPj4wXT0yMDU7YVtlKzI+PjBdPTIyNDthW2UrMz4+MF09OTE7RmQoZitofDAsMCwoZzw8MjQ+PjI0PDA/MDoxMjgtaHwwKXwwKXwwO0lkKGZ8MCxjfDAsaHwwKXwwO2M9YiszNTJ8MDtoPWIrOTZ8MDtnPWgrMTI4fDA7ZG97YVtoPj4wXT1hW2Y+PjBdfDA7aD1oKzF8MDtmPWYrMXwwfXdoaWxlKChofDApPChnfDApKTthW2M+PjBdPTEyODthW2MrMT4+MF09MDthW2MrMj4+MF09MDthW2MrMz4+MF09MDtsPTA7aT1qO3JldHVybiBsfDB9cmV0dXJuIDB9ZnVuY3Rpb24geWIoYixjLGUsZil7Yj1ifDA7Yz1jfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MDtpZigoZXwwKT09MCYoZnwwKT09MClyZXR1cm4gMDtrPWIrMzUyfDA7bD1iKzk2fDA7bT1iKzY0fDA7bj1iKzcyfDA7bz1iKzIyNHwwO2c9ZFtrPj4wXXxkW2srMT4+MF08PDh8ZFtrKzI+PjBdPDwxNnxkW2srMz4+MF08PDI0O2o9ZTt3aGlsZSgxKXtpPTI1Ni1nfDA7ZT1iKzk2K2d8MDtpZighKGY+Pj4wPjB8KGZ8MCk9PTAmaj4+PjA+aT4+PjApKWJyZWFrO0lkKGV8MCxjfDAsaXwwKXwwO2g9KGRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNCkraXwwO2Fbaz4+MF09aDthW2srMT4+MF09aD4+ODthW2srMj4+MF09aD4+MTY7YVtrKzM+PjBdPWg+PjI0O2g9bTtlPWg7ZT1kW2U+PjBdfGRbZSsxPj4wXTw8OHxkW2UrMj4+MF08PDE2fGRbZSszPj4wXTw8MjQ7aD1oKzR8MDtoPWRbaD4+MF18ZFtoKzE+PjBdPDw4fGRbaCsyPj4wXTw8MTZ8ZFtoKzM+PjBdPDwyNDtzPURkKGV8MCxofDAsMTI4LDApfDA7Zz1DO3E9bTtyPXE7YVtyPj4wXT1zO2FbcisxPj4wXT1zPj44O2FbcisyPj4wXT1zPj4xNjthW3IrMz4+MF09cz4+MjQ7cT1xKzR8MDthW3E+PjBdPWc7YVtxKzE+PjBdPWc+Pjg7YVtxKzI+PjBdPWc+PjE2O2FbcSszPj4wXT1nPj4yNDtxPW47Zz1xO3E9cSs0fDA7cT1EZCgoaD4+PjA+NDI5NDk2NzI5NXwoaHwwKT09LTEmZT4+PjA+NDI5NDk2NzE2NykmMXwwLDAsZFtnPj4wXXxkW2crMT4+MF08PDh8ZFtnKzI+PjBdPDwxNnxkW2crMz4+MF08PDI0fDAsZFtxPj4wXXxkW3ErMT4+MF08PDh8ZFtxKzI+PjBdPDwxNnxkW3ErMz4+MF08PDI0fDApfDA7Zz1DO2U9bjtoPWU7YVtoPj4wXT1xO2FbaCsxPj4wXT1xPj44O2FbaCsyPj4wXT1xPj4xNjthW2grMz4+MF09cT4+MjQ7ZT1lKzR8MDthW2U+PjBdPWc7YVtlKzE+PjBdPWc+Pjg7YVtlKzI+PjBdPWc+PjE2O2FbZSszPj4wXT1nPj4yNDtBYihiLGwpO2U9bDtnPW87aD1lKzEyOHwwO2Rve2FbZT4+MF09YVtnPj4wXXwwO2U9ZSsxfDA7Zz1nKzF8MH13aGlsZSgoZXwwKTwoaHwwKSk7Zz0oZFtrPj4wXXxkW2srMT4+MF08PDh8ZFtrKzI+PjBdPDwxNnxkW2srMz4+MF08PDI0KSstMTI4fDA7YVtrPj4wXT1nO2FbaysxPj4wXT1nPj44O2FbaysyPj4wXT1nPj4xNjthW2srMz4+MF09Zz4+MjQ7ZT1DZChqfDAsZnwwLGl8MCwwKXwwO2lmKChqfDApPT0oaXwwKSYoZnwwKT09MCl7cD02O2JyZWFrfWVsc2V7Yz1jK2l8MDtmPUM7aj1lfX1pZigocHwwKT09NilyZXR1cm4gMDtJZChlfDAsY3wwLGp8MCl8MDtzPURkKGRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNHwwLDAsanwwLGZ8MCl8MDthW2s+PjBdPXM7YVtrKzE+PjBdPXM+Pjg7YVtrKzI+PjBdPXM+PjE2O2FbayszPj4wXT1zPj4yNDtyZXR1cm4gMH1mdW5jdGlvbiB6YihiLGMsZSl7Yj1ifDA7Yz1jfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTA7aWYoZT4+PjA+PTI1Nil6YSgzMjYwOCwzMjYyOCwxMDYsMzI3NTkpO2Y9ZSYyNTU7aWYoIShmPDwyND4+MjQpKXtiPS0xO3JldHVybiBifDB9aWYoKGYmMjU1KT42NCl7Yj0tMTtyZXR1cm4gYnwwfWc9YiszNTJ8MDtmPWRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNDtpPWIrNjR8MDtpZihmPj4+MD4xMjgpe2s9aTtqPWs7aj1kW2o+PjBdfGRbaisxPj4wXTw8OHxkW2orMj4+MF08PDE2fGRbaiszPj4wXTw8MjQ7az1rKzR8MDtrPWRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNDttPURkKGp8MCxrfDAsMTI4LDApfDA7bD1DO2g9aTtmPWg7YVtmPj4wXT1tO2FbZisxPj4wXT1tPj44O2FbZisyPj4wXT1tPj4xNjthW2YrMz4+MF09bT4+MjQ7aD1oKzR8MDthW2g+PjBdPWw7YVtoKzE+PjBdPWw+Pjg7YVtoKzI+PjBdPWw+PjE2O2FbaCszPj4wXT1sPj4yNDtoPWIrNzJ8MDtsPWg7Zj1sO2w9bCs0fDA7bD1EZCgoaz4+PjA+NDI5NDk2NzI5NXwoa3wwKT09LTEmaj4+PjA+NDI5NDk2NzE2NykmMXwwLDAsZFtmPj4wXXxkW2YrMT4+MF08PDh8ZFtmKzI+PjBdPDwxNnxkW2YrMz4+MF08PDI0fDAsZFtsPj4wXXxkW2wrMT4+MF08PDh8ZFtsKzI+PjBdPDwxNnxkW2wrMz4+MF08PDI0fDApfDA7Zj1DO2o9aDtrPWo7YVtrPj4wXT1sO2FbaysxPj4wXT1sPj44O2FbaysyPj4wXT1sPj4xNjthW2srMz4+MF09bD4+MjQ7aj1qKzR8MDthW2o+PjBdPWY7YVtqKzE+PjBdPWY+Pjg7YVtqKzI+PjBdPWY+PjE2O2FbaiszPj4wXT1mPj4yNDtqPWIrOTZ8MDtBYihiLGopO2Y9KGRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNCkrLTEyOHwwO2FbZz4+MF09ZjthW2crMT4+MF09Zj4+ODthW2crMj4+MF09Zj4+MTY7YVtnKzM+PjBdPWY+PjI0O0pkKGp8MCxiKzIyNHwwLGZ8MCl8MDtmPWRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNH1lbHNlIGg9Yis3MnwwO209aTtrPW07bT1tKzR8MDttPURkKGRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNHwwLGRbbT4+MF18ZFttKzE+PjBdPDw4fGRbbSsyPj4wXTw8MTZ8ZFttKzM+PjBdPDwyNHwwLGZ8MCwwKXwwO2s9QztqPWk7bD1qO2FbbD4+MF09bTthW2wrMT4+MF09bT4+ODthW2wrMj4+MF09bT4+MTY7YVtsKzM+PjBdPW0+PjI0O2o9ais0fDA7YVtqPj4wXT1rO2FbaisxPj4wXT1rPj44O2FbaisyPj4wXT1rPj4xNjthW2orMz4+MF09az4+MjQ7aj1oO2w9ajtqPWorNHwwO2o9RGQoKGs+Pj4wPDB8KGt8MCk9PTAmbT4+PjA8Zj4+PjApJjF8MCwwLGRbbD4+MF18ZFtsKzE+PjBdPDw4fGRbbCsyPj4wXTw8MTZ8ZFtsKzM+PjBdPDwyNHwwLGRbaj4+MF18ZFtqKzE+PjBdPDw4fGRbaisyPj4wXTw8MTZ8ZFtqKzM+PjBdPDwyNHwwKXwwO2w9QzttPWg7az1tO2Fbaz4+MF09ajthW2srMT4+MF09aj4+ODthW2srMj4+MF09aj4+MTY7YVtrKzM+PjBdPWo+PjI0O209bSs0fDA7YVttPj4wXT1sO2FbbSsxPj4wXT1sPj44O2FbbSsyPj4wXT1sPj4xNjthW20rMz4+MF09bD4+MjQ7aWYoYVtiKzM1Nj4+MF18MCl7bT1iKzg4fDA7bD1tO2FbbD4+MF09LTE7YVtsKzE+PjBdPS0xPj44O2FbbCsyPj4wXT0tMT4+MTY7YVtsKzM+PjBdPS0xPj4yNDttPW0rNHwwO2FbbT4+MF09LTE7YVttKzE+PjBdPS0xPj44O2FbbSsyPj4wXT0tMT4+MTY7YVttKzM+PjBdPS0xPj4yNH1tPWIrODB8MDtsPW07YVtsPj4wXT0tMTthW2wrMT4+MF09LTE+Pjg7YVtsKzI+PjBdPS0xPj4xNjthW2wrMz4+MF09LTE+PjI0O209bSs0fDA7YVttPj4wXT0tMTthW20rMT4+MF09LTE+Pjg7YVttKzI+PjBdPS0xPj4xNjthW20rMz4+MF09LTE+PjI0O0ZkKGIrOTYrZnwwLDAsMjU2LWZ8MCl8MDtBYihiLGIrOTZ8MCk7SWQoY3wwLGJ8MCxlJjI1NXwwKXwwO209MDtyZXR1cm4gbXwwfWZ1bmN0aW9uIEFiKGIsYyl7Yj1ifDA7Yz1jfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MCxnYT0wLGhhPTAsaWE9MCxqYT0wLGthPTAsbGE9MCxtYT0wLG5hPTAsb2E9MCxwYT0wLHFhPTAscmE9MCxzYT0wLHRhPTAsdWE9MCx2YT0wLHdhPTA7UD1jO1I9UDtSPWRbUj4+MF18ZFtSKzE+PjBdPDw4fGRbUisyPj4wXTw8MTZ8ZFtSKzM+PjBdPDwyNDtQPVArNHwwO1A9ZFtQPj4wXXxkW1ArMT4+MF08PDh8ZFtQKzI+PjBdPDwxNnxkW1ArMz4+MF08PDI0O1U9Yys4fDA7Vz1VO1c9ZFtXPj4wXXxkW1crMT4+MF08PDh8ZFtXKzI+PjBdPDwxNnxkW1crMz4+MF08PDI0O1U9VSs0fDA7VT1kW1U+PjBdfGRbVSsxPj4wXTw8OHxkW1UrMj4+MF08PDE2fGRbVSszPj4wXTw8MjQ7eD1jKzE2fDA7dD14O3Q9ZFt0Pj4wXXxkW3QrMT4+MF08PDh8ZFt0KzI+PjBdPDwxNnxkW3QrMz4+MF08PDI0O3g9eCs0fDA7eD1kW3g+PjBdfGRbeCsxPj4wXTw8OHxkW3grMj4+MF08PDE2fGRbeCszPj4wXTw8MjQ7bD1jKzI0fDA7aD1sO2g9ZFtoPj4wXXxkW2grMT4+MF08PDh8ZFtoKzI+PjBdPDwxNnxkW2grMz4+MF08PDI0O2w9bCs0fDA7bD1kW2w+PjBdfGRbbCsxPj4wXTw8OHxkW2wrMj4+MF08PDE2fGRbbCszPj4wXTw8MjQ7JD1jKzMyfDA7cD0kO3A9ZFtwPj4wXXxkW3ArMT4+MF08PDh8ZFtwKzI+PjBdPDwxNnxkW3ArMz4+MF08PDI0OyQ9JCs0fDA7JD1kWyQ+PjBdfGRbJCsxPj4wXTw8OHxkWyQrMj4+MF08PDE2fGRbJCszPj4wXTw8MjQ7Rj1jKzQwfDA7SD1GO0g9ZFtIPj4wXXxkW0grMT4+MF08PDh8ZFtIKzI+PjBdPDwxNnxkW0grMz4+MF08PDI0O0Y9Ris0fDA7Rj1kW0Y+PjBdfGRbRisxPj4wXTw8OHxkW0YrMj4+MF08PDE2fGRbRiszPj4wXTw8MjQ7dT1jKzQ4fDA7cz11O3M9ZFtzPj4wXXxkW3MrMT4+MF08PDh8ZFtzKzI+PjBdPDwxNnxkW3MrMz4+MF08PDI0O3U9dSs0fDA7dT1kW3U+PjBdfGRbdSsxPj4wXTw8OHxkW3UrMj4+MF08PDE2fGRbdSszPj4wXTw8MjQ7cj1jKzU2fDA7bj1yO249ZFtuPj4wXXxkW24rMT4+MF08PDh8ZFtuKzI+PjBdPDwxNnxkW24rMz4+MF08PDI0O3I9cis0fDA7cj1kW3I+PjBdfGRbcisxPj4wXTw8OHxkW3IrMj4+MF08PDE2fGRbciszPj4wXTw8MjQ7aT1jKzY0fDA7Zz1pO2c9ZFtnPj4wXXxkW2crMT4+MF08PDh8ZFtnKzI+PjBdPDwxNnxkW2crMz4+MF08PDI0O2k9aSs0fDA7aT1kW2k+PjBdfGRbaSsxPj4wXTw8OHxkW2krMj4+MF08PDE2fGRbaSszPj4wXTw8MjQ7WT1jKzcyfDA7aj1ZO2o9ZFtqPj4wXXxkW2orMT4+MF08PDh8ZFtqKzI+PjBdPDwxNnxkW2orMz4+MF08PDI0O1k9WSs0fDA7WT1kW1k+PjBdfGRbWSsxPj4wXTw8OHxkW1krMj4+MF08PDE2fGRbWSszPj4wXTw8MjQ7bz1jKzgwfDA7bT1vO209ZFttPj4wXXxkW20rMT4+MF08PDh8ZFttKzI+PjBdPDwxNnxkW20rMz4+MF08PDI0O289bys0fDA7bz1kW28+PjBdfGRbbysxPj4wXTw8OHxkW28rMj4+MF08PDE2fGRbbyszPj4wXTw8MjQ7Sz1jKzg4fDA7TT1LO009ZFtNPj4wXXxkW00rMT4+MF08PDh8ZFtNKzI+PjBdPDwxNnxkW00rMz4+MF08PDI0O0s9Sys0fDA7Sz1kW0s+PjBdfGRbSysxPj4wXTw8OHxkW0srMj4+MF08PDE2fGRbSyszPj4wXTw8MjQ7Zj1jKzk2fDA7ZT1mO2U9ZFtlPj4wXXxkW2UrMT4+MF08PDh8ZFtlKzI+PjBdPDwxNnxkW2UrMz4+MF08PDI0O2Y9Zis0fDA7Zj1kW2Y+PjBdfGRbZisxPj4wXTw8OHxkW2YrMj4+MF08PDE2fGRbZiszPj4wXTw8MjQ7Uz1jKzEwNHwwO0I9UztCPWRbQj4+MF18ZFtCKzE+PjBdPDw4fGRbQisyPj4wXTw8MTZ8ZFtCKzM+PjBdPDwyNDtTPVMrNHwwO1M9ZFtTPj4wXXxkW1MrMT4+MF08PDh8ZFtTKzI+PjBdPDwxNnxkW1MrMz4+MF08PDI0O3NhPWMrMTEyfDA7cmE9c2E7cmE9ZFtyYT4+MF18ZFtyYSsxPj4wXTw8OHxkW3JhKzI+PjBdPDwxNnxkW3JhKzM+PjBdPDwyNDtzYT1zYSs0fDA7c2E9ZFtzYT4+MF18ZFtzYSsxPj4wXTw8OHxkW3NhKzI+PjBdPDwxNnxkW3NhKzM+PjBdPDwyNDtBPWMrMTIwfDA7eT1BO3k9ZFt5Pj4wXXxkW3krMT4+MF08PDh8ZFt5KzI+PjBdPDwxNnxkW3krMz4+MF08PDI0O0E9QSs0fDA7QT1kW0E+PjBdfGRbQSsxPj4wXTw8OHxkW0ErMj4+MF08PDE2fGRbQSszPj4wXTw8MjQ7Y2E9Yjt2PWNhO2NhPWNhKzR8MDtOPWIrOHwwO29hPU47bmE9b2E7bmE9ZFtuYT4+MF18ZFtuYSsxPj4wXTw8OHxkW25hKzI+PjBdPDwxNnxkW25hKzM+PjBdPDwyNDtvYT1vYSs0fDA7b2E9ZFtvYT4+MF18ZFtvYSsxPj4wXTw8OHxkW29hKzI+PjBdPDwxNnxkW29hKzM+PjBdPDwyNDtJPWIrMTZ8MDtrYT1JO2phPWthO2phPWRbamE+PjBdfGRbamErMT4+MF08PDh8ZFtqYSsyPj4wXTw8MTZ8ZFtqYSszPj4wXTw8MjQ7a2E9a2ErNHwwO2thPWRba2E+PjBdfGRba2ErMT4+MF08PDh8ZFtrYSsyPj4wXTw8MTZ8ZFtrYSszPj4wXTw8MjQ7RD1iKzI0fDA7Z2E9RDtmYT1nYTtmYT1kW2ZhPj4wXXxkW2ZhKzE+PjBdPDw4fGRbZmErMj4+MF08PDE2fGRbZmErMz4+MF08PDI0O2dhPWdhKzR8MDtnYT1kW2dhPj4wXXxkW2dhKzE+PjBdPDw4fGRbZ2ErMj4+MF08PDE2fGRbZ2ErMz4+MF08PDI0O3c9YiszMnwwO21hPXc7bGE9bWE7bGE9ZFtsYT4+MF18ZFtsYSsxPj4wXTw8OHxkW2xhKzI+PjBdPDwxNnxkW2xhKzM+PjBdPDwyNDttYT1tYSs0fDA7bWE9ZFttYT4+MF18ZFttYSsxPj4wXTw8OHxkW21hKzI+PjBdPDwxNnxkW21hKzM+PjBdPDwyNDtxPWIrNDB8MDtpYT1xO2hhPWlhO2hhPWRbaGE+PjBdfGRbaGErMT4+MF08PDh8ZFtoYSsyPj4wXTw8MTZ8ZFtoYSszPj4wXTw8MjQ7aWE9aWErNHwwO2lhPWRbaWE+PjBdfGRbaWErMT4+MF08PDh8ZFtpYSsyPj4wXTw8MTZ8ZFtpYSszPj4wXTw8MjQ7az1iKzQ4fDA7dWE9azt0YT11YTt0YT1kW3RhPj4wXXxkW3RhKzE+PjBdPDw4fGRbdGErMj4+MF08PDE2fGRbdGErMz4+MF08PDI0O3VhPXVhKzR8MDt1YT1kW3VhPj4wXXxkW3VhKzE+PjBdPDw4fGRbdWErMj4+MF08PDE2fGRbdWErMz4+MF08PDI0O2M9Yis1NnwwO3FhPWM7cGE9cWE7cGE9ZFtwYT4+MF18ZFtwYSsxPj4wXTw8OHxkW3BhKzI+PjBdPDwxNnxkW3BhKzM+PjBdPDwyNDtxYT1xYSs0fDA7cWE9ZFtxYT4+MF18ZFtxYSsxPj4wXTw8OHxkW3FhKzI+PjBdPDwxNnxkW3FhKzM+PjBdPDwyNDtiYT1iKzY0fDA7YWE9YmE7YmE9YmErNHwwO2FhPShkW2FhPj4wXXxkW2FhKzE+PjBdPDw4fGRbYWErMj4+MF08PDE2fGRbYWErMz4+MF08PDI0KV4tMTM3NzQwMjE1OTtiYT0oZFtiYT4+MF18ZFtiYSsxPj4wXTw8OHxkW2JhKzI+PjBdPDwxNnxkW2JhKzM+PjBdPDwyNCleMTM1OTg5MzExOTtfPWIrNzJ8MDtaPV87Xz1fKzR8MDtaPShkW1o+PjBdfGRbWisxPj4wXTw8OHxkW1orMj4+MF08PDE2fGRbWiszPj4wXTw8MjQpXjcyNTUxMTE5OTtfPShkW18+PjBdfGRbXysxPj4wXTw8OHxkW18rMj4+MF08PDE2fGRbXyszPj4wXTw8MjQpXi0xNjk0MTQ0MzcyO1g9Yis4MHwwO1Y9WDtYPVgrNHwwO1Y9KGRbVj4+MF18ZFtWKzE+PjBdPDw4fGRbVisyPj4wXTw8MTZ8ZFtWKzM+PjBdPDwyNCleLTc5NTc3NzQ5O1g9KGRbWD4+MF18ZFtYKzE+PjBdPDw4fGRbWCsyPj4wXTw8MTZ8ZFtYKzM+PjBdPDwyNCleNTI4NzM0NjM1O2VhPWIrODh8MDtkYT1lYTtlYT1lYSs0fDA7ZGE9KGRbZGE+PjBdfGRbZGErMT4+MF08PDh8ZFtkYSsyPj4wXTw8MTZ8ZFtkYSszPj4wXTw8MjQpXjMyNzAzMzIwOTtlYT0oZFtlYT4+MF18ZFtlYSsxPj4wXTw8OHxkW2VhKzI+PjBdPDwxNnxkW2VhKzM+PjBdPDwyNCleMTU0MTQ1OTIyNTtjYT1EZChsYXwwLG1hfDAsZFt2Pj4wXXxkW3YrMT4+MF08PDh8ZFt2KzI+PjBdPDwxNnxkW3YrMz4+MF08PDI0fDAsZFtjYT4+MF18ZFtjYSsxPj4wXTw8OHxkW2NhKzI+PjBdPDwxNnxkW2NhKzM+PjBdPDwyNHwwKXwwO2NhPURkKGNhfDAsQ3wwLFJ8MCxQfDApfDA7dj1DO2FhPWFhXmNhO2JhPWJhXnY7UT1EZChiYXwwLGFhfDAsLTIwNTczMTU3NiwxNzc5MDMzNzAzKXwwO1Q9QztsYT1RXmxhO21hPVRebWE7Tz1HZChsYXwwLG1hfDAsMjQpfDA7TD1DO21hPUhkKGxhfDAsbWF8MCw0MCl8MDtPPW1hfE87TD1DfEw7dj1EZChXfDAsVXwwLGNhfDAsdnwwKXwwO3Y9RGQodnwwLEN8MCxPfDAsTHwwKXwwO2NhPUM7YmE9dl5iYTthYT1jYV5hYTttYT1HZChiYXwwLGFhfDAsMTYpfDA7bGE9QzthYT1IZChiYXwwLGFhfDAsNDgpfDA7bWE9YWF8bWE7bGE9Q3xsYTtUPURkKG1hfDAsbGF8MCxRfDAsVHwwKXwwO1E9QztPPVReTztMPVFeTDthYT1HZChPfDAsTHwwLDYzKXwwO2JhPUM7TD1IZChPfDAsTHwwLDEpfDA7YWE9THxhYTtiYT1DfGJhO29hPURkKGhhfDAsaWF8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAsdHwwLHh8MCl8MDtuYT1DO1o9Wl5vYTtfPV9ebmE7TD1EZChffDAsWnwwLC0yMDY3MDkzNzAxLC0xMTUwODMzMDE5KXwwO089QztoYT1MXmhhO2lhPU9eaWE7Sj1HZChoYXwwLGlhfDAsMjQpfDA7Rz1DO2lhPUhkKGhhfDAsaWF8MCw0MCl8MDtKPWlhfEo7Rz1DfEc7bmE9RGQoaHwwLGx8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsSnwwLEd8MCl8MDtvYT1DO189bmFeXztaPW9hXlo7aWE9R2QoX3wwLFp8MCwxNil8MDtoYT1DO1o9SGQoX3wwLFp8MCw0OCl8MDtpYT1afGlhO2hhPUN8aGE7Tz1EZChpYXwwLGhhfDAsTHwwLE98MCl8MDtMPUM7Sj1PXko7Rz1MXkc7Wj1HZChKfDAsR3wwLDYzKXwwO189QztHPUhkKEp8MCxHfDAsMSl8MDtaPUd8WjtfPUN8XztrYT1EZCh0YXwwLHVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLHB8MCwkfDApfDA7amE9QztWPVZea2E7WD1YXmphO0c9RGQoWHwwLFZ8MCwtMjM3OTE1NzMsMTAxMzkwNDI0Mil8MDtKPUM7dGE9R150YTt1YT1KXnVhO0U9R2QodGF8MCx1YXwwLDI0KXwwO3o9Qzt1YT1IZCh0YXwwLHVhfDAsNDApfDA7RT11YXxFO3o9Q3x6O2phPURkKEh8MCxGfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLEV8MCx6fDApfDA7a2E9QztYPWphXlg7Vj1rYV5WO3VhPUdkKFh8MCxWfDAsMTYpfDA7dGE9QztWPUhkKFh8MCxWfDAsNDgpfDA7dWE9Vnx1YTt0YT1DfHRhO0o9RGQodWF8MCx0YXwwLEd8MCxKfDApfDA7Rz1DO0U9Sl5FO3o9R156O1Y9R2QoRXwwLHp8MCw2Myl8MDtYPUM7ej1IZChFfDAsenwwLDEpfDA7Vj16fFY7WD1DfFg7Z2E9RGQocGF8MCxxYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxzfDAsdXwwKXwwO2ZhPUM7ZGE9ZGFeZ2E7ZWE9ZWFeZmE7ej1EZChlYXwwLGRhfDAsMTU5NTc1MDEyOSwtMTUyMTQ4NjUzNCl8MDtFPUM7cGE9el5wYTtxYT1FXnFhO3dhPUdkKHBhfDAscWF8MCwyNCl8MDt2YT1DO3FhPUhkKHBhfDAscWF8MCw0MCl8MDt3YT1xYXx3YTt2YT1DfHZhO2ZhPURkKG58MCxyfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO2VhPWZhXmVhO2RhPWdhXmRhO3FhPUdkKGVhfDAsZGF8MCwxNil8MDtwYT1DO2RhPUhkKGVhfDAsZGF8MCw0OCl8MDtxYT1kYXxxYTtwYT1DfHBhO0U9RGQocWF8MCxwYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtkYT1HZCh3YXwwLHZhfDAsNjMpfDA7ZWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtkYT12YXxkYTtlYT1DfGVhO2NhPURkKFp8MCxffDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsZ3wwLGl8MCl8MDt2PUM7cWE9cWFeY2E7cGE9cGFedjtHPURkKHBhfDAscWF8MCxKfDAsR3wwKXwwO0o9QztaPUdeWjtfPUpeXzt2YT1HZChafDAsX3wwLDI0KXwwO3dhPUM7Xz1IZChafDAsX3wwLDQwKXwwO3ZhPV98dmE7d2E9Q3x3YTt2PURkKGp8MCxZfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO3BhPXZecGE7cWE9Y2FecWE7Xz1HZChwYXwwLHFhfDAsMTYpfDA7Wj1DO3FhPUhkKHBhfDAscWF8MCw0OCl8MDtfPXFhfF87Wj1DfFo7Sj1EZChffDAsWnwwLEd8MCxKfDApfDA7Rz1DO3ZhPUpedmE7d2E9R153YTtxYT1HZCh2YXwwLHdhfDAsNjMpfDA7cGE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtxYT13YXxxYTtwYT1DfHBhO29hPURkKFZ8MCxYfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLG18MCxvfDApfDA7bmE9QzttYT1tYV5vYTtsYT1sYV5uYTt6PURkKGxhfDAsbWF8MCxFfDAsenwwKXwwO0U9QztWPXpeVjtYPUVeWDt3YT1HZChWfDAsWHwwLDI0KXwwO3ZhPUM7WD1IZChWfDAsWHwwLDQwKXwwO3dhPVh8d2E7dmE9Q3x2YTtuYT1EZChNfDAsS3wwLG9hfDAsbmF8MCl8MDtuYT1EZChuYXwwLEN8MCx3YXwwLHZhfDApfDA7b2E9QztsYT1uYV5sYTttYT1vYV5tYTtYPUdkKGxhfDAsbWF8MCwxNil8MDtWPUM7bWE9SGQobGF8MCxtYXwwLDQ4KXwwO1g9bWF8WDtWPUN8VjtFPURkKFh8MCxWfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO21hPUdkKHdhfDAsdmF8MCw2Myl8MDtsYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO21hPXZhfG1hO2xhPUN8bGE7a2E9RGQoZGF8MCxlYXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxlfDAsZnwwKXwwO2phPUM7aWE9aWFea2E7aGE9aGFeamE7UT1EZChoYXwwLGlhfDAsVHwwLFF8MCl8MDtUPUM7ZGE9UV5kYTtlYT1UXmVhO3ZhPUdkKGRhfDAsZWF8MCwyNCl8MDt3YT1DO2VhPUhkKGRhfDAsZWF8MCw0MCl8MDt2YT1lYXx2YTt3YT1DfHdhO2phPURkKEJ8MCxTfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO2hhPWphXmhhO2lhPWthXmlhO2VhPUdkKGhhfDAsaWF8MCwxNil8MDtkYT1DO2lhPUhkKGhhfDAsaWF8MCw0OCl8MDtlYT1pYXxlYTtkYT1DfGRhO1Q9RGQoZWF8MCxkYXwwLFF8MCxUfDApfDA7UT1DO3ZhPVRedmE7d2E9UV53YTtpYT1HZCh2YXwwLHdhfDAsNjMpfDA7aGE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtpYT13YXxpYTtoYT1DfGhhO2dhPURkKGFhfDAsYmF8MCxmYXwwLGdhfDApfDA7Z2E9RGQoZ2F8MCxDfDAscmF8MCxzYXwwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKHl8MCxBfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKHJhfDAsc2F8MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCx1YXwwLHRhfDApfDA7dj1DO1g9Y2FeWDtWPXZeVjtRPURkKFZ8MCxYfDAsVHwwLFF8MCl8MDtUPUM7dWE9UV51YTt0YT1UXnRhO3ZhPUdkKHVhfDAsdGF8MCwyNCl8MDt3YT1DO3RhPUhkKHVhfDAsdGF8MCw0MCl8MDt2YT10YXx2YTt3YT1DfHdhO3Y9RGQobXwwLG98MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7Vj12XlY7WD1jYV5YO3RhPUdkKFZ8MCxYfDAsMTYpfDA7dWE9QztYPUhkKFZ8MCxYfDAsNDgpfDA7dGE9WHx0YTt1YT1DfHVhO1Q9RGQodGF8MCx1YXwwLFF8MCxUfDApfDA7UT1DO3ZhPVRedmE7d2E9UV53YTtYPUdkKHZhfDAsd2F8MCw2Myl8MDtWPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7WD13YXxYO1Y9Q3xWO29hPURkKHFhfDAscGF8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAscHwwLCR8MCl8MDtuYT1DO2VhPWVhXm9hO2RhPWRhXm5hO0w9RGQoZGF8MCxlYXwwLE98MCxMfDApfDA7Tz1DO3FhPUxecWE7cGE9T15wYTt3YT1HZChxYXwwLHBhfDAsMjQpfDA7dmE9QztwYT1IZChxYXwwLHBhfDAsNDApfDA7d2E9cGF8d2E7dmE9Q3x2YTtuYT1EZChnfDAsaXwwLG9hfDAsbmF8MCl8MDtuYT1EZChuYXwwLEN8MCx3YXwwLHZhfDApfDA7b2E9QztkYT1uYV5kYTtlYT1vYV5lYTtwYT1HZChkYXwwLGVhfDAsMTYpfDA7cWE9QztlYT1IZChkYXwwLGVhfDAsNDgpfDA7cGE9ZWF8cGE7cWE9Q3xxYTtPPURkKHBhfDAscWF8MCxMfDAsT3wwKXwwO0w9Qzt3YT1PXndhO3ZhPUxedmE7ZWE9R2Qod2F8MCx2YXwwLDYzKXwwO2RhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7ZWE9dmF8ZWE7ZGE9Q3xkYTtrYT1EZChtYXwwLGxhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLGp8MCxZfDApfDA7amE9QztiYT1iYV5rYTthYT1hYV5qYTtHPURkKGFhfDAsYmF8MCxKfDAsR3wwKXwwO0o9QzttYT1HXm1hO2xhPUpebGE7dmE9R2QobWF8MCxsYXwwLDI0KXwwO3dhPUM7bGE9SGQobWF8MCxsYXwwLDQwKXwwO3ZhPWxhfHZhO3dhPUN8d2E7amE9RGQoeXwwLEF8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7YWE9amFeYWE7YmE9a2FeYmE7bGE9R2QoYWF8MCxiYXwwLDE2KXwwO21hPUM7YmE9SGQoYWF8MCxiYXwwLDQ4KXwwO2xhPWJhfGxhO21hPUN8bWE7Sj1EZChsYXwwLG1hfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO2JhPUdkKHZhfDAsd2F8MCw2Myl8MDthYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2JhPXdhfGJhO2FhPUN8YWE7Z2E9RGQoaWF8MCxoYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxCfDAsU3wwKXwwO2ZhPUM7Xz1fXmdhO1o9Wl5mYTt6PURkKFp8MCxffDAsRXwwLHp8MCl8MDtFPUM7aWE9el5pYTtoYT1FXmhhO3dhPUdkKGlhfDAsaGF8MCwyNCl8MDt2YT1DO2hhPUhkKGlhfDAsaGF8MCw0MCl8MDt3YT1oYXx3YTt2YT1DfHZhO2ZhPURkKHN8MCx1fDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO1o9ZmFeWjtfPWdhXl87aGE9R2QoWnwwLF98MCwxNil8MDtpYT1DO189SGQoWnwwLF98MCw0OCl8MDtoYT1ffGhhO2lhPUN8aWE7RT1EZChoYXwwLGlhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO189R2Qod2F8MCx2YXwwLDYzKXwwO1o9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtfPXZhfF87Wj1DfFo7Y2E9RGQoZWF8MCxkYXwwLHZ8MCxjYXwwKXwwO2NhPURkKGNhfDAsQ3wwLFd8MCxVfDApfDA7dj1DO2hhPWhhXmNhO2lhPWlhXnY7Rz1EZChpYXwwLGhhfDAsSnwwLEd8MCl8MDtKPUM7ZWE9R15lYTtkYT1KXmRhO3ZhPUdkKGVhfDAsZGF8MCwyNCl8MDt3YT1DO2RhPUhkKGVhfDAsZGF8MCw0MCl8MDt2YT1kYXx2YTt3YT1DfHdhO3Y9RGQoZXwwLGZ8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7aWE9dl5pYTtoYT1jYV5oYTtkYT1HZChpYXwwLGhhfDAsMTYpfDA7ZWE9QztoYT1IZChpYXwwLGhhfDAsNDgpfDA7ZGE9aGF8ZGE7ZWE9Q3xlYTtKPURkKGRhfDAsZWF8MCxHfDAsSnwwKXwwO0c9Qzt2YT1KXnZhO3dhPUded2E7aGE9R2QodmF8MCx3YXwwLDYzKXwwO2lhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7aGE9d2F8aGE7aWE9Q3xpYTtvYT1EZChiYXwwLGFhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLFJ8MCxQfDApfDA7bmE9Qzt0YT10YV5vYTt1YT11YV5uYTt6PURkKHVhfDAsdGF8MCxFfDAsenwwKXwwO0U9QztiYT16XmJhO2FhPUVeYWE7d2E9R2QoYmF8MCxhYXwwLDI0KXwwO3ZhPUM7YWE9SGQoYmF8MCxhYXwwLDQwKXwwO3dhPWFhfHdhO3ZhPUN8dmE7bmE9RGQodHwwLHh8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7dWE9bmFedWE7dGE9b2FedGE7YWE9R2QodWF8MCx0YXwwLDE2KXwwO2JhPUM7dGE9SGQodWF8MCx0YXwwLDQ4KXwwO2FhPXRhfGFhO2JhPUN8YmE7RT1EZChhYXwwLGJhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO3RhPUdkKHdhfDAsdmF8MCw2Myl8MDt1YT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO3RhPXZhfHRhO3VhPUN8dWE7a2E9RGQoX3wwLFp8MCxqYXwwLGthfDApfDA7a2E9RGQoa2F8MCxDfDAsTXwwLEt8MCl8MDtqYT1DO3BhPXBhXmthO3FhPXFhXmphO1E9RGQocWF8MCxwYXwwLFR8MCxRfDApfDA7VD1DO189UV5fO1o9VF5aO3ZhPUdkKF98MCxafDAsMjQpfDA7d2E9QztaPUhkKF98MCxafDAsNDApfDA7dmE9Wnx2YTt3YT1DfHdhO2phPURkKG58MCxyfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO3FhPWphXnFhO3BhPWthXnBhO1o9R2QocWF8MCxwYXwwLDE2KXwwO189QztwYT1IZChxYXwwLHBhfDAsNDgpfDA7Wj1wYXxaO189Q3xfO1Q9RGQoWnwwLF98MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7cGE9R2QodmF8MCx3YXwwLDYzKXwwO3FhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7cGE9d2F8cGE7cWE9Q3xxYTtnYT1EZChYfDAsVnwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxIfDAsRnwwKXwwO2ZhPUM7bGE9bGFeZ2E7bWE9bWFeZmE7TD1EZChtYXwwLGxhfDAsT3wwLEx8MCl8MDtPPUM7WD1MXlg7Vj1PXlY7d2E9R2QoWHwwLFZ8MCwyNCl8MDt2YT1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDt3YT1WfHdhO3ZhPUN8dmE7ZmE9RGQoaHwwLGx8MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7bWE9ZmFebWE7bGE9Z2FebGE7Vj1HZChtYXwwLGxhfDAsMTYpfDA7WD1DO2xhPUhkKG1hfDAsbGF8MCw0OCl8MDtWPWxhfFY7WD1DfFg7Tz1EZChWfDAsWHwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTtsYT1HZCh3YXwwLHZhfDAsNjMpfDA7bWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtsYT12YXxsYTttYT1DfG1hO2NhPURkKE18MCxLfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbGF8MCxtYXwwKXwwO3Y9QzthYT1jYV5hYTtiYT12XmJhO1E9RGQoYmF8MCxhYXwwLFR8MCxRfDApfDA7VD1DO2xhPVFebGE7bWE9VF5tYTt2YT1HZChsYXwwLG1hfDAsMjQpfDA7d2E9QzttYT1IZChsYXwwLG1hfDAsNDApfDA7dmE9bWF8dmE7d2E9Q3x3YTt2PURkKGd8MCxpfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2JhPXZeYmE7YWE9Y2FeYWE7bWE9R2QoYmF8MCxhYXwwLDE2KXwwO2xhPUM7YWE9SGQoYmF8MCxhYXwwLDQ4KXwwO21hPWFhfG1hO2xhPUN8bGE7VD1EZChtYXwwLGxhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2FhPUdkKHZhfDAsd2F8MCw2Myl8MDtiYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2FhPXdhfGFhO2JhPUN8YmE7b2E9RGQoaGF8MCxpYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxlfDAsZnwwKXwwO25hPUM7Wj1aXm9hO189X15uYTtMPURkKF98MCxafDAsT3wwLEx8MCl8MDtPPUM7aGE9TF5oYTtpYT1PXmlhO3dhPUdkKGhhfDAsaWF8MCwyNCl8MDt2YT1DO2lhPUhkKGhhfDAsaWF8MCw0MCl8MDt3YT1pYXx3YTt2YT1DfHZhO25hPURkKFJ8MCxQfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO189bmFeXztaPW9hXlo7aWE9R2QoX3wwLFp8MCwxNil8MDtoYT1DO1o9SGQoX3wwLFp8MCw0OCl8MDtpYT1afGlhO2hhPUN8aGE7Tz1EZChpYXwwLGhhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO1o9R2Qod2F8MCx2YXwwLDYzKXwwO189Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtaPXZhfFo7Xz1DfF87a2E9RGQodGF8MCx1YXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxIfDAsRnwwKXwwO2phPUM7Vj1WXmthO1g9WF5qYTtHPURkKFh8MCxWfDAsSnwwLEd8MCl8MDtKPUM7dGE9R150YTt1YT1KXnVhO3ZhPUdkKHRhfDAsdWF8MCwyNCl8MDt3YT1DO3VhPUhkKHRhfDAsdWF8MCw0MCl8MDt2YT11YXx2YTt3YT1DfHdhO2phPURkKHR8MCx4fDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO1g9amFeWDtWPWthXlY7dWE9R2QoWHwwLFZ8MCwxNil8MDt0YT1DO1Y9SGQoWHwwLFZ8MCw0OCl8MDt1YT1WfHVhO3RhPUN8dGE7Sj1EZCh1YXwwLHRhfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO1Y9R2QodmF8MCx3YXwwLDYzKXwwO1g9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtWPXdhfFY7WD1DfFg7Z2E9RGQocGF8MCxxYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCx5fDAsQXwwKXwwO2ZhPUM7ZGE9ZGFeZ2E7ZWE9ZWFeZmE7ej1EZChlYXwwLGRhfDAsRXwwLHp8MCl8MDtFPUM7cGE9el5wYTtxYT1FXnFhO3dhPUdkKHBhfDAscWF8MCwyNCl8MDt2YT1DO3FhPUhkKHBhfDAscWF8MCw0MCl8MDt3YT1xYXx3YTt2YT1DfHZhO2ZhPURkKEJ8MCxTfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO2VhPWZhXmVhO2RhPWdhXmRhO3FhPUdkKGVhfDAsZGF8MCwxNil8MDtwYT1DO2RhPUhkKGVhfDAsZGF8MCw0OCl8MDtxYT1kYXxxYTtwYT1DfHBhO0U9RGQocWF8MCxwYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtkYT1HZCh3YXwwLHZhfDAsNjMpfDA7ZWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtkYT12YXxkYTtlYT1DfGVhO2NhPURkKFp8MCxffDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbXwwLG98MCl8MDt2PUM7cWE9cWFeY2E7cGE9cGFedjtHPURkKHBhfDAscWF8MCxKfDAsR3wwKXwwO0o9QztaPUdeWjtfPUpeXzt2YT1HZChafDAsX3wwLDI0KXwwO3dhPUM7Xz1IZChafDAsX3wwLDQwKXwwO3ZhPV98dmE7d2E9Q3x3YTt2PURkKHJhfDAsc2F8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7cGE9dl5wYTtxYT1jYV5xYTtfPUdkKHBhfDAscWF8MCwxNil8MDtaPUM7cWE9SGQocGF8MCxxYXwwLDQ4KXwwO189cWF8XztaPUN8WjtKPURkKF98MCxafDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO3FhPUdkKHZhfDAsd2F8MCw2Myl8MDtwYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO3FhPXdhfHFhO3BhPUN8cGE7b2E9RGQoVnwwLFh8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAsaHwwLGx8MCl8MDtuYT1DO21hPW1hXm9hO2xhPWxhXm5hO3o9RGQobGF8MCxtYXwwLEV8MCx6fDApfDA7RT1DO1Y9el5WO1g9RV5YO3dhPUdkKFZ8MCxYfDAsMjQpfDA7dmE9QztYPUhkKFZ8MCxYfDAsNDApfDA7d2E9WHx3YTt2YT1DfHZhO25hPURkKHN8MCx1fDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO2xhPW5hXmxhO21hPW9hXm1hO1g9R2QobGF8MCxtYXwwLDE2KXwwO1Y9QzttYT1IZChsYXwwLG1hfDAsNDgpfDA7WD1tYXxYO1Y9Q3xWO0U9RGQoWHwwLFZ8MCx6fDAsRXwwKXwwO3o9Qzt3YT1FXndhO3ZhPXpedmE7bWE9R2Qod2F8MCx2YXwwLDYzKXwwO2xhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7bWE9dmF8bWE7bGE9Q3xsYTtrYT1EZChkYXwwLGVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLG58MCxyfDApfDA7amE9QztpYT1pYV5rYTtoYT1oYV5qYTtRPURkKGhhfDAsaWF8MCxUfDAsUXwwKXwwO1Q9QztkYT1RXmRhO2VhPVReZWE7dmE9R2QoZGF8MCxlYXwwLDI0KXwwO3dhPUM7ZWE9SGQoZGF8MCxlYXwwLDQwKXwwO3ZhPWVhfHZhO3dhPUN8d2E7amE9RGQoV3wwLFV8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7aGE9amFeaGE7aWE9a2FeaWE7ZWE9R2QoaGF8MCxpYXwwLDE2KXwwO2RhPUM7aWE9SGQoaGF8MCxpYXwwLDQ4KXwwO2VhPWlhfGVhO2RhPUN8ZGE7VD1EZChlYXwwLGRhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2lhPUdkKHZhfDAsd2F8MCw2Myl8MDtoYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2lhPXdhfGlhO2hhPUN8aGE7Z2E9RGQoYWF8MCxiYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxqfDAsWXwwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKHB8MCwkfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKG58MCxyfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsdWF8MCx0YXwwKXwwO3Y9QztYPWNhXlg7Vj12XlY7UT1EZChWfDAsWHwwLFR8MCxRfDApfDA7VD1DO3VhPVFedWE7dGE9VF50YTt2YT1HZCh1YXwwLHRhfDAsMjQpfDA7d2E9Qzt0YT1IZCh1YXwwLHRhfDAsNDApfDA7dmE9dGF8dmE7d2E9Q3x3YTt2PURkKGp8MCxZfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO1Y9dl5WO1g9Y2FeWDt0YT1HZChWfDAsWHwwLDE2KXwwO3VhPUM7WD1IZChWfDAsWHwwLDQ4KXwwO3RhPVh8dGE7dWE9Q3x1YTtUPURkKHRhfDAsdWF8MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7WD1HZCh2YXwwLHdhfDAsNjMpfDA7Vj1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1g9d2F8WDtWPUN8VjtvYT1EZChxYXwwLHBhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLGh8MCxsfDApfDA7bmE9QztlYT1lYV5vYTtkYT1kYV5uYTtMPURkKGRhfDAsZWF8MCxPfDAsTHwwKXwwO089QztxYT1MXnFhO3BhPU9ecGE7d2E9R2QocWF8MCxwYXwwLDI0KXwwO3ZhPUM7cGE9SGQocWF8MCxwYXwwLDQwKXwwO3dhPXBhfHdhO3ZhPUN8dmE7bmE9RGQoV3wwLFV8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7ZGE9bmFeZGE7ZWE9b2FeZWE7cGE9R2QoZGF8MCxlYXwwLDE2KXwwO3FhPUM7ZWE9SGQoZGF8MCxlYXwwLDQ4KXwwO3BhPWVhfHBhO3FhPUN8cWE7Tz1EZChwYXwwLHFhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO2VhPUdkKHdhfDAsdmF8MCw2Myl8MDtkYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO2VhPXZhfGVhO2RhPUN8ZGE7a2E9RGQobWF8MCxsYXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxCfDAsU3wwKXwwO2phPUM7YmE9YmFea2E7YWE9YWFeamE7Rz1EZChhYXwwLGJhfDAsSnwwLEd8MCl8MDtKPUM7bWE9R15tYTtsYT1KXmxhO3ZhPUdkKG1hfDAsbGF8MCwyNCl8MDt3YT1DO2xhPUhkKG1hfDAsbGF8MCw0MCl8MDt2YT1sYXx2YTt3YT1DfHdhO2phPURkKGV8MCxmfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO2FhPWphXmFhO2JhPWthXmJhO2xhPUdkKGFhfDAsYmF8MCwxNil8MDttYT1DO2JhPUhkKGFhfDAsYmF8MCw0OCl8MDtsYT1iYXxsYTttYT1DfG1hO0o9RGQobGF8MCxtYXwwLEd8MCxKfDApfDA7Rz1DO3ZhPUpedmE7d2E9R153YTtiYT1HZCh2YXwwLHdhfDAsNjMpfDA7YWE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtiYT13YXxiYTthYT1DfGFhO2dhPURkKGlhfDAsaGF8MCxmYXwwLGdhfDApfDA7Z2E9RGQoZ2F8MCxDfDAsTXwwLEt8MCl8MDtmYT1DO189X15nYTtaPVpeZmE7ej1EZChafDAsX3wwLEV8MCx6fDApfDA7RT1DO2lhPXpeaWE7aGE9RV5oYTt3YT1HZChpYXwwLGhhfDAsMjQpfDA7dmE9QztoYT1IZChpYXwwLGhhfDAsNDApfDA7d2E9aGF8d2E7dmE9Q3x2YTtmYT1EZChyYXwwLHNhfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO1o9ZmFeWjtfPWdhXl87aGE9R2QoWnwwLF98MCwxNil8MDtpYT1DO189SGQoWnwwLF98MCw0OCl8MDtoYT1ffGhhO2lhPUN8aWE7RT1EZChoYXwwLGlhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO189R2Qod2F8MCx2YXwwLDYzKXwwO1o9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtfPXZhfF87Wj1DfFo7Y2E9RGQoZWF8MCxkYXwwLHZ8MCxjYXwwKXwwO2NhPURkKGNhfDAsQ3wwLHR8MCx4fDApfDA7dj1DO2hhPWhhXmNhO2lhPWlhXnY7Rz1EZChpYXwwLGhhfDAsSnwwLEd8MCl8MDtKPUM7ZWE9R15lYTtkYT1KXmRhO3ZhPUdkKGVhfDAsZGF8MCwyNCl8MDt3YT1DO2RhPUhkKGVhfDAsZGF8MCw0MCl8MDt2YT1kYXx2YTt3YT1DfHdhO3Y9RGQoc3wwLHV8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7aWE9dl5pYTtoYT1jYV5oYTtkYT1HZChpYXwwLGhhfDAsMTYpfDA7ZWE9QztoYT1IZChpYXwwLGhhfDAsNDgpfDA7ZGE9aGF8ZGE7ZWE9Q3xlYTtKPURkKGRhfDAsZWF8MCxHfDAsSnwwKXwwO0c9Qzt2YT1KXnZhO3dhPUded2E7aGE9R2QodmF8MCx3YXwwLDYzKXwwO2lhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7aGE9d2F8aGE7aWE9Q3xpYTtvYT1EZChiYXwwLGFhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLEh8MCxGfDApfDA7bmE9Qzt0YT10YV5vYTt1YT11YV5uYTt6PURkKHVhfDAsdGF8MCxFfDAsenwwKXwwO0U9QztiYT16XmJhO2FhPUVeYWE7d2E9R2QoYmF8MCxhYXwwLDI0KXwwO3ZhPUM7YWE9SGQoYmF8MCxhYXwwLDQwKXwwO3dhPWFhfHdhO3ZhPUN8dmE7bmE9RGQobXwwLG98MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7dWE9bmFedWE7dGE9b2FedGE7YWE9R2QodWF8MCx0YXwwLDE2KXwwO2JhPUM7dGE9SGQodWF8MCx0YXwwLDQ4KXwwO2FhPXRhfGFhO2JhPUN8YmE7RT1EZChhYXwwLGJhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO3RhPUdkKHdhfDAsdmF8MCw2Myl8MDt1YT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO3RhPXZhfHRhO3VhPUN8dWE7a2E9RGQoX3wwLFp8MCxqYXwwLGthfDApfDA7a2E9RGQoa2F8MCxDfDAscHwwLCR8MCl8MDtqYT1DO3BhPXBhXmthO3FhPXFhXmphO1E9RGQocWF8MCxwYXwwLFR8MCxRfDApfDA7VD1DO189UV5fO1o9VF5aO3ZhPUdkKF98MCxafDAsMjQpfDA7d2E9QztaPUhkKF98MCxafDAsNDApfDA7dmE9Wnx2YTt3YT1DfHdhO2phPURkKFJ8MCxQfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO3FhPWphXnFhO3BhPWthXnBhO1o9R2QocWF8MCxwYXwwLDE2KXwwO189QztwYT1IZChxYXwwLHBhfDAsNDgpfDA7Wj1wYXxaO189Q3xfO1Q9RGQoWnwwLF98MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7cGE9R2QodmF8MCx3YXwwLDYzKXwwO3FhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7cGE9d2F8cGE7cWE9Q3xxYTtnYT1EZChYfDAsVnwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCx5fDAsQXwwKXwwO2ZhPUM7bGE9bGFeZ2E7bWE9bWFeZmE7TD1EZChtYXwwLGxhfDAsT3wwLEx8MCl8MDtPPUM7WD1MXlg7Vj1PXlY7d2E9R2QoWHwwLFZ8MCwyNCl8MDt2YT1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDt3YT1WfHdhO3ZhPUN8dmE7ZmE9RGQoZ3wwLGl8MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7bWE9ZmFebWE7bGE9Z2FebGE7Vj1HZChtYXwwLGxhfDAsMTYpfDA7WD1DO2xhPUhkKG1hfDAsbGF8MCw0OCl8MDtWPWxhfFY7WD1DfFg7Tz1EZChWfDAsWHwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTtsYT1HZCh3YXwwLHZhfDAsNjMpfDA7bWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtsYT12YXxsYTttYT1DfG1hO2NhPURkKGp8MCxZfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbGF8MCxtYXwwKXwwO3Y9QzthYT1jYV5hYTtiYT12XmJhO1E9RGQoYmF8MCxhYXwwLFR8MCxRfDApfDA7VD1DO2xhPVFebGE7bWE9VF5tYTt2YT1HZChsYXwwLG1hfDAsMjQpfDA7d2E9QzttYT1IZChsYXwwLG1hfDAsNDApfDA7dmE9bWF8dmE7d2E9Q3x3YTt2PURkKFJ8MCxQfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2JhPXZeYmE7YWE9Y2FeYWE7bWE9R2QoYmF8MCxhYXwwLDE2KXwwO2xhPUM7YWE9SGQoYmF8MCxhYXwwLDQ4KXwwO21hPWFhfG1hO2xhPUN8bGE7VD1EZChtYXwwLGxhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2FhPUdkKHZhfDAsd2F8MCw2Myl8MDtiYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2FhPXdhfGFhO2JhPUN8YmE7b2E9RGQoaGF8MCxpYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxIfDAsRnwwKXwwO25hPUM7Wj1aXm9hO189X15uYTtMPURkKF98MCxafDAsT3wwLEx8MCl8MDtPPUM7aGE9TF5oYTtpYT1PXmlhO3dhPUdkKGhhfDAsaWF8MCwyNCl8MDt2YT1DO2lhPUhkKGhhfDAsaWF8MCw0MCl8MDt3YT1pYXx3YTt2YT1DfHZhO25hPURkKG58MCxyfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO189bmFeXztaPW9hXlo7aWE9R2QoX3wwLFp8MCwxNil8MDtoYT1DO1o9SGQoX3wwLFp8MCw0OCl8MDtpYT1afGlhO2hhPUN8aGE7Tz1EZChpYXwwLGhhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO1o9R2Qod2F8MCx2YXwwLDYzKXwwO189Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtaPXZhfFo7Xz1DfF87a2E9RGQodGF8MCx1YXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCx0fDAseHwwKXwwO2phPUM7Vj1WXmthO1g9WF5qYTtHPURkKFh8MCxWfDAsSnwwLEd8MCl8MDtKPUM7dGE9R150YTt1YT1KXnVhO3ZhPUdkKHRhfDAsdWF8MCwyNCl8MDt3YT1DO3VhPUhkKHRhfDAsdWF8MCw0MCl8MDt2YT11YXx2YTt3YT1DfHdhO2phPURkKHB8MCwkfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO1g9amFeWDtWPWthXlY7dWE9R2QoWHwwLFZ8MCwxNil8MDt0YT1DO1Y9SGQoWHwwLFZ8MCw0OCl8MDt1YT1WfHVhO3RhPUN8dGE7Sj1EZCh1YXwwLHRhfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO1Y9R2QodmF8MCx3YXwwLDYzKXwwO1g9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtWPXdhfFY7WD1DfFg7Z2E9RGQocGF8MCxxYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxtfDAsb3wwKXwwO2ZhPUM7ZGE9ZGFeZ2E7ZWE9ZWFeZmE7ej1EZChlYXwwLGRhfDAsRXwwLHp8MCl8MDtFPUM7cGE9el5wYTtxYT1FXnFhO3dhPUdkKHBhfDAscWF8MCwyNCl8MDt2YT1DO3FhPUhkKHBhfDAscWF8MCw0MCl8MDt3YT1xYXx3YTt2YT1DfHZhO2ZhPURkKHl8MCxBfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO2VhPWZhXmVhO2RhPWdhXmRhO3FhPUdkKGVhfDAsZGF8MCwxNil8MDtwYT1DO2RhPUhkKGVhfDAsZGF8MCw0OCl8MDtxYT1kYXxxYTtwYT1DfHBhO0U9RGQocWF8MCxwYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtkYT1HZCh3YXwwLHZhfDAsNjMpfDA7ZWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtkYT12YXxkYTtlYT1DfGVhO2NhPURkKFp8MCxffDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAscmF8MCxzYXwwKXwwO3Y9QztxYT1xYV5jYTtwYT1wYV52O0c9RGQocGF8MCxxYXwwLEp8MCxHfDApfDA7Sj1DO1o9R15aO189Sl5fO3ZhPUdkKFp8MCxffDAsMjQpfDA7d2E9QztfPUhkKFp8MCxffDAsNDApfDA7dmE9X3x2YTt3YT1DfHdhO3Y9RGQoV3wwLFV8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7cGE9dl5wYTtxYT1jYV5xYTtfPUdkKHBhfDAscWF8MCwxNil8MDtaPUM7cWE9SGQocGF8MCxxYXwwLDQ4KXwwO189cWF8XztaPUN8WjtKPURkKF98MCxafDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO3FhPUdkKHZhfDAsd2F8MCw2Myl8MDtwYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO3FhPXdhfHFhO3BhPUN8cGE7b2E9RGQoVnwwLFh8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAsTXwwLEt8MCl8MDtuYT1DO21hPW1hXm9hO2xhPWxhXm5hO3o9RGQobGF8MCxtYXwwLEV8MCx6fDApfDA7RT1DO1Y9el5WO1g9RV5YO3dhPUdkKFZ8MCxYfDAsMjQpfDA7dmE9QztYPUhkKFZ8MCxYfDAsNDApfDA7d2E9WHx3YTt2YT1DfHZhO25hPURkKGV8MCxmfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO2xhPW5hXmxhO21hPW9hXm1hO1g9R2QobGF8MCxtYXwwLDE2KXwwO1Y9QzttYT1IZChsYXwwLG1hfDAsNDgpfDA7WD1tYXxYO1Y9Q3xWO0U9RGQoWHwwLFZ8MCx6fDAsRXwwKXwwO3o9Qzt3YT1FXndhO3ZhPXpedmE7bWE9R2Qod2F8MCx2YXwwLDYzKXwwO2xhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7bWE9dmF8bWE7bGE9Q3xsYTtrYT1EZChkYXwwLGVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLHN8MCx1fDApfDA7amE9QztpYT1pYV5rYTtoYT1oYV5qYTtRPURkKGhhfDAsaWF8MCxUfDAsUXwwKXwwO1Q9QztkYT1RXmRhO2VhPVReZWE7dmE9R2QoZGF8MCxlYXwwLDI0KXwwO3dhPUM7ZWE9SGQoZGF8MCxlYXwwLDQwKXwwO3ZhPWVhfHZhO3dhPUN8d2E7amE9RGQoZ3wwLGl8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7aGE9amFeaGE7aWE9a2FeaWE7ZWE9R2QoaGF8MCxpYXwwLDE2KXwwO2RhPUM7aWE9SGQoaGF8MCxpYXwwLDQ4KXwwO2VhPWlhfGVhO2RhPUN8ZGE7VD1EZChlYXwwLGRhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2lhPUdkKHZhfDAsd2F8MCw2Myl8MDtoYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2lhPXdhfGlhO2hhPUN8aGE7Z2E9RGQoYWF8MCxiYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxofDAsbHwwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKEJ8MCxTfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKHR8MCx4fDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsdWF8MCx0YXwwKXwwO3Y9QztYPWNhXlg7Vj12XlY7UT1EZChWfDAsWHwwLFR8MCxRfDApfDA7VD1DO3VhPVFedWE7dGE9VF50YTt2YT1HZCh1YXwwLHRhfDAsMjQpfDA7d2E9Qzt0YT1IZCh1YXwwLHRhfDAsNDApfDA7dmE9dGF8dmE7d2E9Q3x3YTt2PURkKGV8MCxmfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO1Y9dl5WO1g9Y2FeWDt0YT1HZChWfDAsWHwwLDE2KXwwO3VhPUM7WD1IZChWfDAsWHwwLDQ4KXwwO3RhPVh8dGE7dWE9Q3x1YTtUPURkKHRhfDAsdWF8MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7WD1HZCh2YXwwLHdhfDAsNjMpfDA7Vj1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1g9d2F8WDtWPUN8VjtvYT1EZChxYXwwLHBhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLHN8MCx1fDApfDA7bmE9QztlYT1lYV5vYTtkYT1kYV5uYTtMPURkKGRhfDAsZWF8MCxPfDAsTHwwKXwwO089QztxYT1MXnFhO3BhPU9ecGE7d2E9R2QocWF8MCxwYXwwLDI0KXwwO3ZhPUM7cGE9SGQocWF8MCxwYXwwLDQwKXwwO3dhPXBhfHdhO3ZhPUN8dmE7bmE9RGQobXwwLG98MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7ZGE9bmFeZGE7ZWE9b2FeZWE7cGE9R2QoZGF8MCxlYXwwLDE2KXwwO3FhPUM7ZWE9SGQoZGF8MCxlYXwwLDQ4KXwwO3BhPWVhfHBhO3FhPUN8cWE7Tz1EZChwYXwwLHFhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO2VhPUdkKHdhfDAsdmF8MCw2Myl8MDtkYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO2VhPXZhfGVhO2RhPUN8ZGE7a2E9RGQobWF8MCxsYXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxSfDAsUHwwKXwwO2phPUM7YmE9YmFea2E7YWE9YWFeamE7Rz1EZChhYXwwLGJhfDAsSnwwLEd8MCl8MDtKPUM7bWE9R15tYTtsYT1KXmxhO3ZhPUdkKG1hfDAsbGF8MCwyNCl8MDt3YT1DO2xhPUhkKG1hfDAsbGF8MCw0MCl8MDt2YT1sYXx2YTt3YT1DfHdhO2phPURkKE18MCxLfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO2FhPWphXmFhO2JhPWthXmJhO2xhPUdkKGFhfDAsYmF8MCwxNil8MDttYT1DO2JhPUhkKGFhfDAsYmF8MCw0OCl8MDtsYT1iYXxsYTttYT1DfG1hO0o9RGQobGF8MCxtYXwwLEd8MCxKfDApfDA7Rz1DO3ZhPUpedmE7d2E9R153YTtiYT1HZCh2YXwwLHdhfDAsNjMpfDA7YWE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtiYT13YXxiYTthYT1DfGFhO2dhPURkKGlhfDAsaGF8MCxmYXwwLGdhfDApfDA7Z2E9RGQoZ2F8MCxDfDAsZ3wwLGl8MCl8MDtmYT1DO189X15nYTtaPVpeZmE7ej1EZChafDAsX3wwLEV8MCx6fDApfDA7RT1DO2lhPXpeaWE7aGE9RV5oYTt3YT1HZChpYXwwLGhhfDAsMjQpfDA7dmE9QztoYT1IZChpYXwwLGhhfDAsNDApfDA7d2E9aGF8d2E7dmE9Q3x2YTtmYT1EZChofDAsbHwwLGdhfDAsZmF8MCl8MDtmYT1EZChmYXwwLEN8MCx3YXwwLHZhfDApfDA7Z2E9QztaPWZhXlo7Xz1nYV5fO2hhPUdkKFp8MCxffDAsMTYpfDA7aWE9QztfPUhkKFp8MCxffDAsNDgpfDA7aGE9X3xoYTtpYT1DfGlhO0U9RGQoaGF8MCxpYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtfPUdkKHdhfDAsdmF8MCw2Myl8MDtaPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7Xz12YXxfO1o9Q3xaO2NhPURkKGVhfDAsZGF8MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCxwfDAsJHwwKXwwO3Y9QztoYT1oYV5jYTtpYT1pYV52O0c9RGQoaWF8MCxoYXwwLEp8MCxHfDApfDA7Sj1DO2VhPUdeZWE7ZGE9Sl5kYTt2YT1HZChlYXwwLGRhfDAsMjQpfDA7d2E9QztkYT1IZChlYXwwLGRhfDAsNDApfDA7dmE9ZGF8dmE7d2E9Q3x3YTt2PURkKEJ8MCxTfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2lhPXZeaWE7aGE9Y2FeaGE7ZGE9R2QoaWF8MCxoYXwwLDE2KXwwO2VhPUM7aGE9SGQoaWF8MCxoYXwwLDQ4KXwwO2RhPWhhfGRhO2VhPUN8ZWE7Sj1EZChkYXwwLGVhfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO2hhPUdkKHZhfDAsd2F8MCw2Myl8MDtpYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2hhPXdhfGhhO2lhPUN8aWE7b2E9RGQoYmF8MCxhYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxufDAscnwwKXwwO25hPUM7dGE9dGFeb2E7dWE9dWFebmE7ej1EZCh1YXwwLHRhfDAsRXwwLHp8MCl8MDtFPUM7YmE9el5iYTthYT1FXmFhO3dhPUdkKGJhfDAsYWF8MCwyNCl8MDt2YT1DO2FhPUhkKGJhfDAsYWF8MCw0MCl8MDt3YT1hYXx3YTt2YT1DfHZhO25hPURkKEh8MCxGfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO3VhPW5hXnVhO3RhPW9hXnRhO2FhPUdkKHVhfDAsdGF8MCwxNil8MDtiYT1DO3RhPUhkKHVhfDAsdGF8MCw0OCl8MDthYT10YXxhYTtiYT1DfGJhO0U9RGQoYWF8MCxiYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTt0YT1HZCh3YXwwLHZhfDAsNjMpfDA7dWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt0YT12YXx0YTt1YT1DfHVhO2thPURkKF98MCxafDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLHl8MCxBfDApfDA7amE9QztwYT1wYV5rYTtxYT1xYV5qYTtRPURkKHFhfDAscGF8MCxUfDAsUXwwKXwwO1Q9QztfPVFeXztaPVReWjt2YT1HZChffDAsWnwwLDI0KXwwO3dhPUM7Wj1IZChffDAsWnwwLDQwKXwwO3ZhPVp8dmE7d2E9Q3x3YTtqYT1EZChyYXwwLHNhfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO3FhPWphXnFhO3BhPWthXnBhO1o9R2QocWF8MCxwYXwwLDE2KXwwO189QztwYT1IZChxYXwwLHBhfDAsNDgpfDA7Wj1wYXxaO189Q3xfO1Q9RGQoWnwwLF98MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7cGE9R2QodmF8MCx3YXwwLDYzKXwwO3FhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7cGE9d2F8cGE7cWE9Q3xxYTtnYT1EZChYfDAsVnwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxXfDAsVXwwKXwwO2ZhPUM7bGE9bGFeZ2E7bWE9bWFeZmE7TD1EZChtYXwwLGxhfDAsT3wwLEx8MCl8MDtPPUM7WD1MXlg7Vj1PXlY7d2E9R2QoWHwwLFZ8MCwyNCl8MDt2YT1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDt3YT1WfHdhO3ZhPUN8dmE7ZmE9RGQoanwwLFl8MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7bWE9ZmFebWE7bGE9Z2FebGE7Vj1HZChtYXwwLGxhfDAsMTYpfDA7WD1DO2xhPUhkKG1hfDAsbGF8MCw0OCl8MDtWPWxhfFY7WD1DfFg7Tz1EZChWfDAsWHwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTtsYT1HZCh3YXwwLHZhfDAsNjMpfDA7bWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtsYT12YXxsYTttYT1DfG1hO2NhPURkKGV8MCxmfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbGF8MCxtYXwwKXwwO3Y9QzthYT1jYV5hYTtiYT12XmJhO1E9RGQoYmF8MCxhYXwwLFR8MCxRfDApfDA7VD1DO2xhPVFebGE7bWE9VF5tYTt2YT1HZChsYXwwLG1hfDAsMjQpfDA7d2E9QzttYT1IZChsYXwwLG1hfDAsNDApfDA7dmE9bWF8dmE7d2E9Q3x3YTt2PURkKEh8MCxGfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2JhPXZeYmE7YWE9Y2FeYWE7bWE9R2QoYmF8MCxhYXwwLDE2KXwwO2xhPUM7YWE9SGQoYmF8MCxhYXwwLDQ4KXwwO21hPWFhfG1hO2xhPUN8bGE7VD1EZChtYXwwLGxhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2FhPUdkKHZhfDAsd2F8MCw2Myl8MDtiYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2FhPXdhfGFhO2JhPUN8YmE7b2E9RGQoaGF8MCxpYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxXfDAsVXwwKXwwO25hPUM7Wj1aXm9hO189X15uYTtMPURkKF98MCxafDAsT3wwLEx8MCl8MDtPPUM7aGE9TF5oYTtpYT1PXmlhO3dhPUdkKGhhfDAsaWF8MCwyNCl8MDt2YT1DO2lhPUhkKGhhfDAsaWF8MCw0MCl8MDt3YT1pYXx3YTt2YT1DfHZhO25hPURkKHl8MCxBfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO189bmFeXztaPW9hXlo7aWE9R2QoX3wwLFp8MCwxNil8MDtoYT1DO1o9SGQoX3wwLFp8MCw0OCl8MDtpYT1afGlhO2hhPUN8aGE7Tz1EZChpYXwwLGhhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO1o9R2Qod2F8MCx2YXwwLDYzKXwwO189Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtaPXZhfFo7Xz1DfF87a2E9RGQodGF8MCx1YXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxyYXwwLHNhfDApfDA7amE9QztWPVZea2E7WD1YXmphO0c9RGQoWHwwLFZ8MCxKfDAsR3wwKXwwO0o9Qzt0YT1HXnRhO3VhPUpedWE7dmE9R2QodGF8MCx1YXwwLDI0KXwwO3dhPUM7dWE9SGQodGF8MCx1YXwwLDQwKXwwO3ZhPXVhfHZhO3dhPUN8d2E7amE9RGQoQnwwLFN8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7WD1qYV5YO1Y9a2FeVjt1YT1HZChYfDAsVnwwLDE2KXwwO3RhPUM7Vj1IZChYfDAsVnwwLDQ4KXwwO3VhPVZ8dWE7dGE9Q3x0YTtKPURkKHVhfDAsdGF8MCxHfDAsSnwwKXwwO0c9Qzt2YT1KXnZhO3dhPUded2E7Vj1HZCh2YXwwLHdhfDAsNjMpfDA7WD1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1Y9d2F8VjtYPUN8WDtnYT1EZChwYXwwLHFhfDAsZmF8MCxnYXwwKXwwO2dhPURkKGdhfDAsQ3wwLHB8MCwkfDApfDA7ZmE9QztkYT1kYV5nYTtlYT1lYV5mYTt6PURkKGVhfDAsZGF8MCxFfDAsenwwKXwwO0U9QztwYT16XnBhO3FhPUVecWE7d2E9R2QocGF8MCxxYXwwLDI0KXwwO3ZhPUM7cWE9SGQocGF8MCxxYXwwLDQwKXwwO3dhPXFhfHdhO3ZhPUN8dmE7ZmE9RGQobXwwLG98MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7ZWE9ZmFeZWE7ZGE9Z2FeZGE7cWE9R2QoZWF8MCxkYXwwLDE2KXwwO3BhPUM7ZGE9SGQoZWF8MCxkYXwwLDQ4KXwwO3FhPWRhfHFhO3BhPUN8cGE7RT1EZChxYXwwLHBhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO2RhPUdkKHdhfDAsdmF8MCw2Myl8MDtlYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO2RhPXZhfGRhO2VhPUN8ZWE7Y2E9RGQoWnwwLF98MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCxSfDAsUHwwKXwwO3Y9QztxYT1xYV5jYTtwYT1wYV52O0c9RGQocGF8MCxxYXwwLEp8MCxHfDApfDA7Sj1DO1o9R15aO189Sl5fO3ZhPUdkKFp8MCxffDAsMjQpfDA7d2E9QztfPUhkKFp8MCxffDAsNDApfDA7dmE9X3x2YTt3YT1DfHdhO3Y9RGQobnwwLHJ8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7cGE9dl5wYTtxYT1jYV5xYTtfPUdkKHBhfDAscWF8MCwxNil8MDtaPUM7cWE9SGQocGF8MCxxYXwwLDQ4KXwwO189cWF8XztaPUN8WjtKPURkKF98MCxafDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO3FhPUdkKHZhfDAsd2F8MCw2Myl8MDtwYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO3FhPXdhfHFhO3BhPUN8cGE7b2E9RGQoVnwwLFh8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAsc3wwLHV8MCl8MDtuYT1DO21hPW1hXm9hO2xhPWxhXm5hO3o9RGQobGF8MCxtYXwwLEV8MCx6fDApfDA7RT1DO1Y9el5WO1g9RV5YO3dhPUdkKFZ8MCxYfDAsMjQpfDA7dmE9QztYPUhkKFZ8MCxYfDAsNDApfDA7d2E9WHx3YTt2YT1DfHZhO25hPURkKGh8MCxsfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO2xhPW5hXmxhO21hPW9hXm1hO1g9R2QobGF8MCxtYXwwLDE2KXwwO1Y9QzttYT1IZChsYXwwLG1hfDAsNDgpfDA7WD1tYXxYO1Y9Q3xWO0U9RGQoWHwwLFZ8MCx6fDAsRXwwKXwwO3o9Qzt3YT1FXndhO3ZhPXpedmE7bWE9R2Qod2F8MCx2YXwwLDYzKXwwO2xhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7bWE9dmF8bWE7bGE9Q3xsYTtrYT1EZChkYXwwLGVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLGp8MCxZfDApfDA7amE9QztpYT1pYV5rYTtoYT1oYV5qYTtRPURkKGhhfDAsaWF8MCxUfDAsUXwwKXwwO1Q9QztkYT1RXmRhO2VhPVReZWE7dmE9R2QoZGF8MCxlYXwwLDI0KXwwO3dhPUM7ZWE9SGQoZGF8MCxlYXwwLDQwKXwwO3ZhPWVhfHZhO3dhPUN8d2E7amE9RGQodHwwLHh8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7aGE9amFeaGE7aWE9a2FeaWE7ZWE9R2QoaGF8MCxpYXwwLDE2KXwwO2RhPUM7aWE9SGQoaGF8MCxpYXwwLDQ4KXwwO2VhPWlhfGVhO2RhPUN8ZGE7VD1EZChlYXwwLGRhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2lhPUdkKHZhfDAsd2F8MCw2Myl8MDtoYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2lhPXdhfGlhO2hhPUN8aGE7Z2E9RGQoYWF8MCxiYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxnfDAsaXwwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKE18MCxLfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKEJ8MCxTfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsdWF8MCx0YXwwKXwwO3Y9QztYPWNhXlg7Vj12XlY7UT1EZChWfDAsWHwwLFR8MCxRfDApfDA7VD1DO3VhPVFedWE7dGE9VF50YTt2YT1HZCh1YXwwLHRhfDAsMjQpfDA7d2E9Qzt0YT1IZCh1YXwwLHRhfDAsNDApfDA7dmE9dGF8dmE7d2E9Q3x3YTt2PURkKE18MCxLfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO1Y9dl5WO1g9Y2FeWDt0YT1HZChWfDAsWHwwLDE2KXwwO3VhPUM7WD1IZChWfDAsWHwwLDQ4KXwwO3RhPVh8dGE7dWE9Q3x1YTtUPURkKHRhfDAsdWF8MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7WD1HZCh2YXwwLHdhfDAsNjMpfDA7Vj1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1g9d2F8WDtWPUN8VjtvYT1EZChxYXwwLHBhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLG58MCxyfDApfDA7bmE9QztlYT1lYV5vYTtkYT1kYV5uYTtMPURkKGRhfDAsZWF8MCxPfDAsTHwwKXwwO089QztxYT1MXnFhO3BhPU9ecGE7d2E9R2QocWF8MCxwYXwwLDI0KXwwO3ZhPUM7cGE9SGQocWF8MCxwYXwwLDQwKXwwO3dhPXBhfHdhO3ZhPUN8dmE7bmE9RGQocmF8MCxzYXwwLG9hfDAsbmF8MCl8MDtuYT1EZChuYXwwLEN8MCx3YXwwLHZhfDApfDA7b2E9QztkYT1uYV5kYTtlYT1vYV5lYTtwYT1HZChkYXwwLGVhfDAsMTYpfDA7cWE9QztlYT1IZChkYXwwLGVhfDAsNDgpfDA7cGE9ZWF8cGE7cWE9Q3xxYTtPPURkKHBhfDAscWF8MCxMfDAsT3wwKXwwO0w9Qzt3YT1PXndhO3ZhPUxedmE7ZWE9R2Qod2F8MCx2YXwwLDYzKXwwO2RhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7ZWE9dmF8ZWE7ZGE9Q3xkYTtrYT1EZChtYXwwLGxhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLGV8MCxmfDApfDA7amE9QztiYT1iYV5rYTthYT1hYV5qYTtHPURkKGFhfDAsYmF8MCxKfDAsR3wwKXwwO0o9QzttYT1HXm1hO2xhPUpebGE7dmE9R2QobWF8MCxsYXwwLDI0KXwwO3dhPUM7bGE9SGQobWF8MCxsYXwwLDQwKXwwO3ZhPWxhfHZhO3dhPUN8d2E7amE9RGQoV3wwLFV8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7YWE9amFeYWE7YmE9a2FeYmE7bGE9R2QoYWF8MCxiYXwwLDE2KXwwO21hPUM7YmE9SGQoYWF8MCxiYXwwLDQ4KXwwO2xhPWJhfGxhO21hPUN8bWE7Sj1EZChsYXwwLG1hfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO2JhPUdkKHZhfDAsd2F8MCw2Myl8MDthYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2JhPXdhfGJhO2FhPUN8YWE7Z2E9RGQoaWF8MCxoYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxofDAsbHwwKXwwO2ZhPUM7Xz1fXmdhO1o9Wl5mYTt6PURkKFp8MCxffDAsRXwwLHp8MCl8MDtFPUM7aWE9el5pYTtoYT1FXmhhO3dhPUdkKGlhfDAsaGF8MCwyNCl8MDt2YT1DO2hhPUhkKGlhfDAsaGF8MCw0MCl8MDt3YT1oYXx3YTt2YT1DfHZhO2ZhPURkKGp8MCxZfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO1o9ZmFeWjtfPWdhXl87aGE9R2QoWnwwLF98MCwxNil8MDtpYT1DO189SGQoWnwwLF98MCw0OCl8MDtoYT1ffGhhO2lhPUN8aWE7RT1EZChoYXwwLGlhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO189R2Qod2F8MCx2YXwwLDYzKXwwO1o9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtfPXZhfF87Wj1DfFo7Y2E9RGQoZWF8MCxkYXwwLHZ8MCxjYXwwKXwwO2NhPURkKGNhfDAsQ3wwLEh8MCxGfDApfDA7dj1DO2hhPWhhXmNhO2lhPWlhXnY7Rz1EZChpYXwwLGhhfDAsSnwwLEd8MCl8MDtKPUM7ZWE9R15lYTtkYT1KXmRhO3ZhPUdkKGVhfDAsZGF8MCwyNCl8MDt3YT1DO2RhPUhkKGVhfDAsZGF8MCw0MCl8MDt2YT1kYXx2YTt3YT1DfHdhO3Y9RGQoUnwwLFB8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7aWE9dl5pYTtoYT1jYV5oYTtkYT1HZChpYXwwLGhhfDAsMTYpfDA7ZWE9QztoYT1IZChpYXwwLGhhfDAsNDgpfDA7ZGE9aGF8ZGE7ZWE9Q3xlYTtKPURkKGRhfDAsZWF8MCxHfDAsSnwwKXwwO0c9Qzt2YT1KXnZhO3dhPUded2E7aGE9R2QodmF8MCx3YXwwLDYzKXwwO2lhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7aGE9d2F8aGE7aWE9Q3xpYTtvYT1EZChiYXwwLGFhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLHl8MCxBfDApfDA7bmE9Qzt0YT10YV5vYTt1YT11YV5uYTt6PURkKHVhfDAsdGF8MCxFfDAsenwwKXwwO0U9QztiYT16XmJhO2FhPUVeYWE7d2E9R2QoYmF8MCxhYXwwLDI0KXwwO3ZhPUM7YWE9SGQoYmF8MCxhYXwwLDQwKXwwO3dhPWFhfHdhO3ZhPUN8dmE7bmE9RGQocHwwLCR8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7dWE9bmFedWE7dGE9b2FedGE7YWE9R2QodWF8MCx0YXwwLDE2KXwwO2JhPUM7dGE9SGQodWF8MCx0YXwwLDQ4KXwwO2FhPXRhfGFhO2JhPUN8YmE7RT1EZChhYXwwLGJhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO3RhPUdkKHdhfDAsdmF8MCw2Myl8MDt1YT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO3RhPXZhfHRhO3VhPUN8dWE7a2E9RGQoX3wwLFp8MCxqYXwwLGthfDApfDA7a2E9RGQoa2F8MCxDfDAsZ3wwLGl8MCl8MDtqYT1DO3BhPXBhXmthO3FhPXFhXmphO1E9RGQocWF8MCxwYXwwLFR8MCxRfDApfDA7VD1DO189UV5fO1o9VF5aO3ZhPUdkKF98MCxafDAsMjQpfDA7d2E9QztaPUhkKF98MCxafDAsNDApfDA7dmE9Wnx2YTt3YT1DfHdhO2phPURkKHN8MCx1fDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO3FhPWphXnFhO3BhPWthXnBhO1o9R2QocWF8MCxwYXwwLDE2KXwwO189QztwYT1IZChxYXwwLHBhfDAsNDgpfDA7Wj1wYXxaO189Q3xfO1Q9RGQoWnwwLF98MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7cGE9R2QodmF8MCx3YXwwLDYzKXwwO3FhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7cGE9d2F8cGE7cWE9Q3xxYTtnYT1EZChYfDAsVnwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCx0fDAseHwwKXwwO2ZhPUM7bGE9bGFeZ2E7bWE9bWFeZmE7TD1EZChtYXwwLGxhfDAsT3wwLEx8MCl8MDtPPUM7WD1MXlg7Vj1PXlY7d2E9R2QoWHwwLFZ8MCwyNCl8MDt2YT1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDt3YT1WfHdhO3ZhPUN8dmE7ZmE9RGQobXwwLG98MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7bWE9ZmFebWE7bGE9Z2FebGE7Vj1HZChtYXwwLGxhfDAsMTYpfDA7WD1DO2xhPUhkKG1hfDAsbGF8MCw0OCl8MDtWPWxhfFY7WD1DfFg7Tz1EZChWfDAsWHwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTtsYT1HZCh3YXwwLHZhfDAsNjMpfDA7bWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtsYT12YXxsYTttYT1DfG1hO2NhPURkKHN8MCx1fDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbGF8MCxtYXwwKXwwO3Y9QzthYT1jYV5hYTtiYT12XmJhO1E9RGQoYmF8MCxhYXwwLFR8MCxRfDApfDA7VD1DO2xhPVFebGE7bWE9VF5tYTt2YT1HZChsYXwwLG1hfDAsMjQpfDA7d2E9QzttYT1IZChsYXwwLG1hfDAsNDApfDA7dmE9bWF8dmE7d2E9Q3x3YTt2PURkKHl8MCxBfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2JhPXZeYmE7YWE9Y2FeYWE7bWE9R2QoYmF8MCxhYXwwLDE2KXwwO2xhPUM7YWE9SGQoYmF8MCxhYXwwLDQ4KXwwO21hPWFhfG1hO2xhPUN8bGE7VD1EZChtYXwwLGxhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2FhPUdkKHZhfDAsd2F8MCw2Myl8MDtiYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2FhPXdhfGFhO2JhPUN8YmE7b2E9RGQoaGF8MCxpYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxyYXwwLHNhfDApfDA7bmE9QztaPVpeb2E7Xz1fXm5hO0w9RGQoX3wwLFp8MCxPfDAsTHwwKXwwO089QztoYT1MXmhhO2lhPU9eaWE7d2E9R2QoaGF8MCxpYXwwLDI0KXwwO3ZhPUM7aWE9SGQoaGF8MCxpYXwwLDQwKXwwO3dhPWlhfHdhO3ZhPUN8dmE7bmE9RGQoanwwLFl8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7Xz1uYV5fO1o9b2FeWjtpYT1HZChffDAsWnwwLDE2KXwwO2hhPUM7Wj1IZChffDAsWnwwLDQ4KXwwO2lhPVp8aWE7aGE9Q3xoYTtPPURkKGlhfDAsaGF8MCxMfDAsT3wwKXwwO0w9Qzt3YT1PXndhO3ZhPUxedmE7Wj1HZCh3YXwwLHZhfDAsNjMpfDA7Xz1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO1o9dmF8WjtfPUN8XztrYT1EZCh0YXwwLHVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLE18MCxLfDApfDA7amE9QztWPVZea2E7WD1YXmphO0c9RGQoWHwwLFZ8MCxKfDAsR3wwKXwwO0o9Qzt0YT1HXnRhO3VhPUpedWE7dmE9R2QodGF8MCx1YXwwLDI0KXwwO3dhPUM7dWE9SGQodGF8MCx1YXwwLDQwKXwwO3ZhPXVhfHZhO3dhPUN8d2E7amE9RGQoaHwwLGx8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7WD1qYV5YO1Y9a2FeVjt1YT1HZChYfDAsVnwwLDE2KXwwO3RhPUM7Vj1IZChYfDAsVnwwLDQ4KXwwO3VhPVZ8dWE7dGE9Q3x0YTtKPURkKHVhfDAsdGF8MCxHfDAsSnwwKXwwO0c9Qzt2YT1KXnZhO3dhPUded2E7Vj1HZCh2YXwwLHdhfDAsNjMpfDA7WD1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1Y9d2F8VjtYPUN8WDtnYT1EZChwYXwwLHFhfDAsZmF8MCxnYXwwKXwwO2dhPURkKGdhfDAsQ3wwLFJ8MCxQfDApfDA7ZmE9QztkYT1kYV5nYTtlYT1lYV5mYTt6PURkKGVhfDAsZGF8MCxFfDAsenwwKXwwO0U9QztwYT16XnBhO3FhPUVecWE7d2E9R2QocGF8MCxxYXwwLDI0KXwwO3ZhPUM7cWE9SGQocGF8MCxxYXwwLDQwKXwwO3dhPXFhfHdhO3ZhPUN8dmE7ZmE9RGQoZ3wwLGl8MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7ZWE9ZmFeZWE7ZGE9Z2FeZGE7cWE9R2QoZWF8MCxkYXwwLDE2KXwwO3BhPUM7ZGE9SGQoZWF8MCxkYXwwLDQ4KXwwO3FhPWRhfHFhO3BhPUN8cGE7RT1EZChxYXwwLHBhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO2RhPUdkKHdhfDAsdmF8MCw2Myl8MDtlYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO2RhPXZhfGRhO2VhPUN8ZWE7Y2E9RGQoWnwwLF98MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCxlfDAsZnwwKXwwO3Y9QztxYT1xYV5jYTtwYT1wYV52O0c9RGQocGF8MCxxYXwwLEp8MCxHfDApfDA7Sj1DO1o9R15aO189Sl5fO3ZhPUdkKFp8MCxffDAsMjQpfDA7d2E9QztfPUhkKFp8MCxffDAsNDApfDA7dmE9X3x2YTt3YT1DfHdhO3Y9RGQodHwwLHh8MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsdmF8MCx3YXwwKXwwO2NhPUM7cGE9dl5wYTtxYT1jYV5xYTtfPUdkKHBhfDAscWF8MCwxNil8MDtaPUM7cWE9SGQocGF8MCxxYXwwLDQ4KXwwO189cWF8XztaPUN8WjtKPURkKF98MCxafDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO3FhPUdkKHZhfDAsd2F8MCw2Myl8MDtwYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO3FhPXdhfHFhO3BhPUN8cGE7b2E9RGQoVnwwLFh8MCxuYXwwLG9hfDApfDA7b2E9RGQob2F8MCxDfDAsQnwwLFN8MCl8MDtuYT1DO21hPW1hXm9hO2xhPWxhXm5hO3o9RGQobGF8MCxtYXwwLEV8MCx6fDApfDA7RT1DO1Y9el5WO1g9RV5YO3dhPUdkKFZ8MCxYfDAsMjQpfDA7dmE9QztYPUhkKFZ8MCxYfDAsNDApfDA7d2E9WHx3YTt2YT1DfHZhO25hPURkKG58MCxyfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO2xhPW5hXmxhO21hPW9hXm1hO1g9R2QobGF8MCxtYXwwLDE2KXwwO1Y9QzttYT1IZChsYXwwLG1hfDAsNDgpfDA7WD1tYXxYO1Y9Q3xWO0U9RGQoWHwwLFZ8MCx6fDAsRXwwKXwwO3o9Qzt3YT1FXndhO3ZhPXpedmE7bWE9R2Qod2F8MCx2YXwwLDYzKXwwO2xhPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7bWE9dmF8bWE7bGE9Q3xsYTtrYT1EZChkYXwwLGVhfDAsamF8MCxrYXwwKXwwO2thPURkKGthfDAsQ3wwLFd8MCxVfDApfDA7amE9QztpYT1pYV5rYTtoYT1oYV5qYTtRPURkKGhhfDAsaWF8MCxUfDAsUXwwKXwwO1Q9QztkYT1RXmRhO2VhPVReZWE7dmE9R2QoZGF8MCxlYXwwLDI0KXwwO3dhPUM7ZWE9SGQoZGF8MCxlYXwwLDQwKXwwO3ZhPWVhfHZhO3dhPUN8d2E7amE9RGQocHwwLCR8MCxrYXwwLGphfDApfDA7amE9RGQoamF8MCxDfDAsdmF8MCx3YXwwKXwwO2thPUM7aGE9amFeaGE7aWE9a2FeaWE7ZWE9R2QoaGF8MCxpYXwwLDE2KXwwO2RhPUM7aWE9SGQoaGF8MCxpYXwwLDQ4KXwwO2VhPWlhfGVhO2RhPUN8ZGE7VD1EZChlYXwwLGRhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2lhPUdkKHZhfDAsd2F8MCw2Myl8MDtoYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2lhPXdhfGlhO2hhPUN8aGE7Z2E9RGQoYWF8MCxiYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxtfDAsb3wwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKEh8MCxGfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKG18MCxvfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsdWF8MCx0YXwwKXwwO3Y9QztYPWNhXlg7Vj12XlY7UT1EZChWfDAsWHwwLFR8MCxRfDApfDA7VD1DO3VhPVFedWE7dGE9VF50YTt2YT1HZCh1YXwwLHRhfDAsMjQpfDA7d2E9Qzt0YT1IZCh1YXwwLHRhfDAsNDApfDA7dmE9dGF8dmE7d2E9Q3x3YTt2PURkKHR8MCx4fDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO1Y9dl5WO1g9Y2FeWDt0YT1HZChWfDAsWHwwLDE2KXwwO3VhPUM7WD1IZChWfDAsWHwwLDQ4KXwwO3RhPVh8dGE7dWE9Q3x1YTtUPURkKHRhfDAsdWF8MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7WD1HZCh2YXwwLHdhfDAsNjMpfDA7Vj1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO1g9d2F8WDtWPUN8VjtvYT1EZChxYXwwLHBhfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLGd8MCxpfDApfDA7bmE9QztlYT1lYV5vYTtkYT1kYV5uYTtMPURkKGRhfDAsZWF8MCxPfDAsTHwwKXwwO089QztxYT1MXnFhO3BhPU9ecGE7d2E9R2QocWF8MCxwYXwwLDI0KXwwO3ZhPUM7cGE9SGQocWF8MCxwYXwwLDQwKXwwO3dhPXBhfHdhO3ZhPUN8dmE7bmE9RGQocHwwLCR8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7ZGE9bmFeZGE7ZWE9b2FeZWE7cGE9R2QoZGF8MCxlYXwwLDE2KXwwO3FhPUM7ZWE9SGQoZGF8MCxlYXwwLDQ4KXwwO3BhPWVhfHBhO3FhPUN8cWE7Tz1EZChwYXwwLHFhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO2VhPUdkKHdhfDAsdmF8MCw2Myl8MDtkYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO2VhPXZhfGVhO2RhPUN8ZGE7a2E9RGQobWF8MCxsYXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxufDAscnwwKXwwO2phPUM7YmE9YmFea2E7YWE9YWFeamE7Rz1EZChhYXwwLGJhfDAsSnwwLEd8MCl8MDtKPUM7bWE9R15tYTtsYT1KXmxhO3ZhPUdkKG1hfDAsbGF8MCwyNCl8MDt3YT1DO2xhPUhkKG1hfDAsbGF8MCw0MCl8MDt2YT1sYXx2YTt3YT1DfHdhO2phPURkKHN8MCx1fDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO2FhPWphXmFhO2JhPWthXmJhO2xhPUdkKGFhfDAsYmF8MCwxNil8MDttYT1DO2JhPUhkKGFhfDAsYmF8MCw0OCl8MDtsYT1iYXxsYTttYT1DfG1hO0o9RGQobGF8MCxtYXwwLEd8MCxKfDApfDA7Rz1DO3ZhPUpedmE7d2E9R153YTtiYT1HZCh2YXwwLHdhfDAsNjMpfDA7YWE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtiYT13YXxiYTthYT1DfGFhO2dhPURkKGlhfDAsaGF8MCxmYXwwLGdhfDApfDA7Z2E9RGQoZ2F8MCxDfDAsV3wwLFV8MCl8MDtmYT1DO189X15nYTtaPVpeZmE7ej1EZChafDAsX3wwLEV8MCx6fDApfDA7RT1DO2lhPXpeaWE7aGE9RV5oYTt3YT1HZChpYXwwLGhhfDAsMjQpfDA7dmE9QztoYT1IZChpYXwwLGhhfDAsNDApfDA7d2E9aGF8d2E7dmE9Q3x2YTtmYT1EZChIfDAsRnwwLGdhfDAsZmF8MCl8MDtmYT1EZChmYXwwLEN8MCx3YXwwLHZhfDApfDA7Z2E9QztaPWZhXlo7Xz1nYV5fO2hhPUdkKFp8MCxffDAsMTYpfDA7aWE9QztfPUhkKFp8MCxffDAsNDgpfDA7aGE9X3xoYTtpYT1DfGlhO0U9RGQoaGF8MCxpYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtfPUdkKHdhfDAsdmF8MCw2Myl8MDtaPUM7dmE9SGQod2F8MCx2YXwwLDEpfDA7Xz12YXxfO1o9Q3xaO2NhPURkKGVhfDAsZGF8MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCx5fDAsQXwwKXwwO3Y9QztoYT1oYV5jYTtpYT1pYV52O0c9RGQoaWF8MCxoYXwwLEp8MCxHfDApfDA7Sj1DO2VhPUdeZWE7ZGE9Sl5kYTt2YT1HZChlYXwwLGRhfDAsMjQpfDA7d2E9QztkYT1IZChlYXwwLGRhfDAsNDApfDA7dmE9ZGF8dmE7d2E9Q3x3YTt2PURkKE18MCxLfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2lhPXZeaWE7aGE9Y2FeaGE7ZGE9R2QoaWF8MCxoYXwwLDE2KXwwO2VhPUM7aGE9SGQoaWF8MCxoYXwwLDQ4KXwwO2RhPWhhfGRhO2VhPUN8ZWE7Sj1EZChkYXwwLGVhfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO2hhPUdkKHZhfDAsd2F8MCw2Myl8MDtpYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2hhPXdhfGhhO2lhPUN8aWE7b2E9RGQoYmF8MCxhYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCxqfDAsWXwwKXwwO25hPUM7dGE9dGFeb2E7dWE9dWFebmE7ej1EZCh1YXwwLHRhfDAsRXwwLHp8MCl8MDtFPUM7YmE9el5iYTthYT1FXmFhO3dhPUdkKGJhfDAsYWF8MCwyNCl8MDt2YT1DO2FhPUhkKGJhfDAsYWF8MCw0MCl8MDt3YT1hYXx3YTt2YT1DfHZhO25hPURkKHJhfDAsc2F8MCxvYXwwLG5hfDApfDA7bmE9RGQobmF8MCxDfDAsd2F8MCx2YXwwKXwwO29hPUM7dWE9bmFedWE7dGE9b2FedGE7YWE9R2QodWF8MCx0YXwwLDE2KXwwO2JhPUM7dGE9SGQodWF8MCx0YXwwLDQ4KXwwO2FhPXRhfGFhO2JhPUN8YmE7RT1EZChhYXwwLGJhfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO3RhPUdkKHdhfDAsdmF8MCw2Myl8MDt1YT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO3RhPXZhfHRhO3VhPUN8dWE7a2E9RGQoX3wwLFp8MCxqYXwwLGthfDApfDA7a2E9RGQoa2F8MCxDfDAsaHwwLGx8MCl8MDtqYT1DO3BhPXBhXmthO3FhPXFhXmphO1E9RGQocWF8MCxwYXwwLFR8MCxRfDApfDA7VD1DO189UV5fO1o9VF5aO3ZhPUdkKF98MCxafDAsMjQpfDA7d2E9QztaPUhkKF98MCxafDAsNDApfDA7dmE9Wnx2YTt3YT1DfHdhO2phPURkKGV8MCxmfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO3FhPWphXnFhO3BhPWthXnBhO1o9R2QocWF8MCxwYXwwLDE2KXwwO189QztwYT1IZChxYXwwLHBhfDAsNDgpfDA7Wj1wYXxaO189Q3xfO1Q9RGQoWnwwLF98MCxRfDAsVHwwKXwwO1E9Qzt2YT1UXnZhO3dhPVFed2E7cGE9R2QodmF8MCx3YXwwLDYzKXwwO3FhPUM7d2E9SGQodmF8MCx3YXwwLDEpfDA7cGE9d2F8cGE7cWE9Q3xxYTtnYT1EZChYfDAsVnwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxCfDAsU3wwKXwwO2ZhPUM7bGE9bGFeZ2E7bWE9bWFeZmE7TD1EZChtYXwwLGxhfDAsT3wwLEx8MCl8MDtPPUM7WD1MXlg7Vj1PXlY7d2E9R2QoWHwwLFZ8MCwyNCl8MDt2YT1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDt3YT1WfHdhO3ZhPUN8dmE7ZmE9RGQoUnwwLFB8MCxnYXwwLGZhfDApfDA7ZmE9RGQoZmF8MCxDfDAsd2F8MCx2YXwwKXwwO2dhPUM7bWE9ZmFebWE7bGE9Z2FebGE7Vj1HZChtYXwwLGxhfDAsMTYpfDA7WD1DO2xhPUhkKG1hfDAsbGF8MCw0OCl8MDtWPWxhfFY7WD1DfFg7Tz1EZChWfDAsWHwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTtsYT1HZCh3YXwwLHZhfDAsNjMpfDA7bWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtsYT12YXxsYTttYT1DfG1hO2NhPURkKFJ8MCxQfDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsbGF8MCxtYXwwKXwwO3Y9QzthYT1jYV5hYTtiYT12XmJhO1E9RGQoYmF8MCxhYXwwLFR8MCxRfDApfDA7VD1DO2xhPVFebGE7bWE9VF5tYTt2YT1HZChsYXwwLG1hfDAsMjQpfDA7d2E9QzttYT1IZChsYXwwLG1hfDAsNDApfDA7dmE9bWF8dmE7d2E9Q3x3YTt2PURkKFd8MCxVfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO2JhPXZeYmE7YWE9Y2FeYWE7bWE9R2QoYmF8MCxhYXwwLDE2KXwwO2xhPUM7YWE9SGQoYmF8MCxhYXwwLDQ4KXwwO21hPWFhfG1hO2xhPUN8bGE7VD1EZChtYXwwLGxhfDAsUXwwLFR8MCl8MDtRPUM7dmE9VF52YTt3YT1RXndhO2FhPUdkKHZhfDAsd2F8MCw2Myl8MDtiYT1DO3dhPUhkKHZhfDAsd2F8MCwxKXwwO2FhPXdhfGFhO2JhPUN8YmE7b2E9RGQoaGF8MCxpYXwwLG5hfDAsb2F8MCl8MDtvYT1EZChvYXwwLEN8MCx0fDAseHwwKXwwO25hPUM7Wj1aXm9hO189X15uYTtMPURkKF98MCxafDAsT3wwLEx8MCl8MDtPPUM7aGE9TF5oYTtpYT1PXmlhO3dhPUdkKGhhfDAsaWF8MCwyNCl8MDt2YT1DO2lhPUhkKGhhfDAsaWF8MCw0MCl8MDt3YT1pYXx3YTt2YT1DfHZhO25hPURkKGh8MCxsfDAsb2F8MCxuYXwwKXwwO25hPURkKG5hfDAsQ3wwLHdhfDAsdmF8MCl8MDtvYT1DO189bmFeXztaPW9hXlo7aWE9R2QoX3wwLFp8MCwxNil8MDtoYT1DO1o9SGQoX3wwLFp8MCw0OCl8MDtpYT1afGlhO2hhPUN8aGE7Tz1EZChpYXwwLGhhfDAsTHwwLE98MCl8MDtMPUM7d2E9T153YTt2YT1MXnZhO1o9R2Qod2F8MCx2YXwwLDYzKXwwO189Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtaPXZhfFo7Xz1DfF87a2E9RGQodGF8MCx1YXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxwfDAsJHwwKXwwO2phPUM7Vj1WXmthO1g9WF5qYTtHPURkKFh8MCxWfDAsSnwwLEd8MCl8MDtKPUM7dGE9R150YTt1YT1KXnVhO3ZhPUdkKHRhfDAsdWF8MCwyNCl8MDt3YT1DO3VhPUhkKHRhfDAsdWF8MCw0MCl8MDt2YT11YXx2YTt3YT1DfHdhO2phPURkKEh8MCxGfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO1g9amFeWDtWPWthXlY7dWE9R2QoWHwwLFZ8MCwxNil8MDt0YT1DO1Y9SGQoWHwwLFZ8MCw0OCl8MDt1YT1WfHVhO3RhPUN8dGE7Sj1EZCh1YXwwLHRhfDAsR3wwLEp8MCl8MDtHPUM7dmE9Sl52YTt3YT1HXndhO1Y9R2QodmF8MCx3YXwwLDYzKXwwO1g9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtWPXdhfFY7WD1DfFg7Z2E9RGQocGF8MCxxYXwwLGZhfDAsZ2F8MCl8MDtnYT1EZChnYXwwLEN8MCxzfDAsdXwwKXwwO2ZhPUM7ZGE9ZGFeZ2E7ZWE9ZWFeZmE7ej1EZChlYXwwLGRhfDAsRXwwLHp8MCl8MDtFPUM7cGE9el5wYTtxYT1FXnFhO3dhPUdkKHBhfDAscWF8MCwyNCl8MDt2YT1DO3FhPUhkKHBhfDAscWF8MCw0MCl8MDt3YT1xYXx3YTt2YT1DfHZhO2ZhPURkKG58MCxyfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO2VhPWZhXmVhO2RhPWdhXmRhO3FhPUdkKGVhfDAsZGF8MCwxNil8MDtwYT1DO2RhPUhkKGVhfDAsZGF8MCw0OCl8MDtxYT1kYXxxYTtwYT1DfHBhO0U9RGQocWF8MCxwYXwwLHp8MCxFfDApfDA7ej1DO3dhPUVed2E7dmE9el52YTtkYT1HZCh3YXwwLHZhfDAsNjMpfDA7ZWE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDtkYT12YXxkYTtlYT1DfGVhO2NhPURkKFp8MCxffDAsdnwwLGNhfDApfDA7Y2E9RGQoY2F8MCxDfDAsZ3wwLGl8MCl8MDt2PUM7cWE9cWFeY2E7cGE9cGFedjtHPURkKHBhfDAscWF8MCxKfDAsR3wwKXwwO0o9QztaPUdeWjtfPUpeXzt2YT1HZChafDAsX3wwLDI0KXwwO3dhPUM7Xz1IZChafDAsX3wwLDQwKXwwO3ZhPV98dmE7d2E9Q3x3YTt2PURkKGp8MCxZfDAsY2F8MCx2fDApfDA7dj1EZCh2fDAsQ3wwLHZhfDAsd2F8MCl8MDtjYT1DO3BhPXZecGE7cWE9Y2FecWE7Xz1HZChwYXwwLHFhfDAsMTYpfDA7Wj1DO3FhPUhkKHBhfDAscWF8MCw0OCl8MDtfPXFhfF87Wj1DfFo7Sj1EZChffDAsWnwwLEd8MCxKfDApfDA7Rz1DO3ZhPUpedmE7d2E9R153YTtxYT1HZCh2YXwwLHdhfDAsNjMpfDA7cGE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtxYT13YXxxYTtwYT1DfHBhO29hPURkKFZ8MCxYfDAsbmF8MCxvYXwwKXwwO29hPURkKG9hfDAsQ3wwLG18MCxvfDApfDA7bmE9QzttYT1tYV5vYTtsYT1sYV5uYTt6PURkKGxhfDAsbWF8MCxFfDAsenwwKXwwO0U9QztWPXpeVjtYPUVeWDt3YT1HZChWfDAsWHwwLDI0KXwwO3ZhPUM7WD1IZChWfDAsWHwwLDQwKXwwO3dhPVh8d2E7dmE9Q3x2YTtuYT1EZChNfDAsS3wwLG9hfDAsbmF8MCl8MDtuYT1EZChuYXwwLEN8MCx3YXwwLHZhfDApfDA7b2E9QztsYT1uYV5sYTttYT1vYV5tYTtYPUdkKGxhfDAsbWF8MCwxNil8MDtWPUM7bWE9SGQobGF8MCxtYXwwLDQ4KXwwO1g9bWF8WDtWPUN8VjtFPURkKFh8MCxWfDAsenwwLEV8MCl8MDt6PUM7d2E9RV53YTt2YT16XnZhO21hPUdkKHdhfDAsdmF8MCw2Myl8MDtsYT1DO3ZhPUhkKHdhfDAsdmF8MCwxKXwwO21hPXZhfG1hO2xhPUN8bGE7a2E9RGQoZGF8MCxlYXwwLGphfDAsa2F8MCl8MDtrYT1EZChrYXwwLEN8MCxlfDAsZnwwKXwwO2phPUM7aWE9aWFea2E7aGE9aGFeamE7UT1EZChoYXwwLGlhfDAsVHwwLFF8MCl8MDtUPUM7ZGE9UV5kYTtlYT1UXmVhO3ZhPUdkKGRhfDAsZWF8MCwyNCl8MDt3YT1DO2VhPUhkKGRhfDAsZWF8MCw0MCl8MDt2YT1lYXx2YTt3YT1DfHdhO2phPURkKEJ8MCxTfDAsa2F8MCxqYXwwKXwwO2phPURkKGphfDAsQ3wwLHZhfDAsd2F8MCl8MDtrYT1DO2hhPWphXmhhO2lhPWthXmlhO2VhPUdkKGhhfDAsaWF8MCwxNil8MDtkYT1DO2lhPUhkKGhhfDAsaWF8MCw0OCl8MDtlYT1pYXxlYTtkYT1DfGRhO1Q9RGQoZWF8MCxkYXwwLFF8MCxUfDApfDA7UT1DO3ZhPVRedmE7d2E9UV53YTtpYT1HZCh2YXwwLHdhfDAsNjMpfDA7aGE9Qzt3YT1IZCh2YXwwLHdhfDAsMSl8MDtpYT13YXxpYTtoYT1DfGhhO2dhPURkKGFhfDAsYmF8MCxmYXwwLGdhfDApfDA7Z2E9RGQoZ2F8MCxDfDAscmF8MCxzYXwwKXwwO2ZhPUM7dWE9dWFeZ2E7dGE9dGFeZmE7TD1EZCh0YXwwLHVhfDAsT3wwLEx8MCl8MDtPPUM7YWE9TF5hYTtiYT1PXmJhO3dhPUdkKGFhfDAsYmF8MCwyNCl8MDt2YT1DO2JhPUhkKGFhfDAsYmF8MCw0MCl8MDt3YT1iYXx3YTt2YT1DfHZhO2ZhPURkKHl8MCxBfDAsZ2F8MCxmYXwwKXwwO2ZhPURkKGZhfDAsQ3wwLHdhfDAsdmF8MCl8MDtnYT1DO3RhPWZhXnRhO3VhPWdhXnVhO2JhPUdkKHRhfDAsdWF8MCwxNil8MDthYT1DO3VhPUhkKHRhfDAsdWF8MCw0OCl8MDtiYT11YXxiYTthYT1DfGFhO089RGQoYmF8MCxhYXwwLEx8MCxPfDApfDA7TD1DO3dhPU9ed2E7dmE9TF52YTt1YT1HZCh3YXwwLHZhfDAsNjMpfDA7dGE9Qzt2YT1IZCh3YXwwLHZhfDAsMSl8MDt1YT12YXx1YTt0YT1DfHRhO2NhPURkKHJhfDAsc2F8MCx2fDAsY2F8MCl8MDtjYT1EZChjYXwwLEN8MCx1YXwwLHRhfDApfDA7dj1DO1g9Y2FeWDtWPXZeVjtRPURkKFZ8MCxYfDAsVHwwLFF8MCl8MDtUPUM7dWE9UV51YTt0YT1UXnRhO3NhPUdkKHVhfDAsdGF8MCwyNCl8MDtyYT1DO3RhPUhkKHVhfDAsdGF8MCw0MCl8MDtzYT10YXxzYTtyYT1DfHJhO3Y9RGQobXwwLG98MCxjYXwwLHZ8MCl8MDt2PURkKHZ8MCxDfDAsc2F8MCxyYXwwKXwwO2NhPUM7Vj12XlY7WD1jYV5YO289R2QoVnwwLFh8MCwxNil8MDttPUM7WD1IZChWfDAsWHwwLDQ4KXwwO289WHxvO209Q3xtO1Q9RGQob3wwLG18MCxRfDAsVHwwKXwwO1E9QztzYT1UXnNhO3JhPVFecmE7WD1HZChzYXwwLHJhfDAsNjMpfDA7Vj1DO3JhPUhkKHNhfDAscmF8MCwxKXwwO1g9cmF8WDtWPUN8VjtvYT1EZChxYXwwLHBhfDAsbmF8MCxvYXwwKXwwOyQ9RGQob2F8MCxDfDAscHwwLCR8MCl8MDtwPUM7ZWE9ZWFeJDtkYT1kYV5wO0w9RGQoZGF8MCxlYXwwLE98MCxMfDApfDA7Tz1DO3FhPUxecWE7cGE9T15wYTtvYT1HZChxYXwwLHBhfDAsMjQpfDA7bmE9QztwYT1IZChxYXwwLHBhfDAsNDApfDA7b2E9cGF8b2E7bmE9Q3xuYTtwPURkKGd8MCxpfDAsJHwwLHB8MCl8MDtwPURkKHB8MCxDfDAsb2F8MCxuYXwwKXwwOyQ9QztkYT1wXmRhO2VhPSReZWE7aT1HZChkYXwwLGVhfDAsMTYpfDA7Zz1DO2VhPUhkKGRhfDAsZWF8MCw0OCl8MDtpPWVhfGk7Zz1DfGc7Tz1EZChpfDAsZ3wwLEx8MCxPfDApfDA7TD1DO29hPU9eb2E7bmE9TF5uYTtlYT1HZChvYXwwLG5hfDAsNjMpfDA7ZGE9QztuYT1IZChvYXwwLG5hfDAsMSl8MDtlYT1uYXxlYTtkYT1DfGRhO2thPURkKG1hfDAsbGF8MCxqYXwwLGthfDApfDA7WT1EZChrYXwwLEN8MCxqfDAsWXwwKXwwO2o9QztiYT1iYV5ZO2FhPWFhXmo7Rz1EZChhYXwwLGJhfDAsSnwwLEd8MCl8MDtKPUM7bWE9R15tYTtsYT1KXmxhO2thPUdkKG1hfDAsbGF8MCwyNCl8MDtqYT1DO2xhPUhkKG1hfDAsbGF8MCw0MCl8MDtrYT1sYXxrYTtqYT1DfGphO2o9RGQoeXwwLEF8MCxZfDAsanwwKXwwO2o9RGQoanwwLEN8MCxrYXwwLGphfDApfDA7WT1DO2FhPWpeYWE7YmE9WV5iYTtBPUdkKGFhfDAsYmF8MCwxNil8MDt5PUM7YmE9SGQoYWF8MCxiYXwwLDQ4KXwwO0E9YmF8QTt5PUN8eTtKPURkKEF8MCx5fDAsR3wwLEp8MCl8MDtHPUM7a2E9Sl5rYTtqYT1HXmphO2JhPUdkKGthfDAsamF8MCw2Myl8MDthYT1DO2phPUhkKGthfDAsamF8MCwxKXwwO2JhPWphfGJhO2FhPUN8YWE7Z2E9RGQoaWF8MCxoYXwwLGZhfDAsZ2F8MCl8MDtTPURkKGdhfDAsQ3wwLEJ8MCxTfDApfDA7Qj1DO189X15TO1o9Wl5CO3o9RGQoWnwwLF98MCxFfDAsenwwKXwwO0U9QztpYT16XmlhO2hhPUVeaGE7Z2E9R2QoaWF8MCxoYXwwLDI0KXwwO2ZhPUM7aGE9SGQoaWF8MCxoYXwwLDQwKXwwO2dhPWhhfGdhO2ZhPUN8ZmE7Qj1EZChzfDAsdXwwLFN8MCxCfDApfDA7Qj1EZChCfDAsQ3wwLGdhfDAsZmF8MCl8MDtTPUM7Wj1CXlo7Xz1TXl87dT1HZChafDAsX3wwLDE2KXwwO3M9QztfPUhkKFp8MCxffDAsNDgpfDA7dT1ffHU7cz1DfHM7RT1EZCh1fDAsc3wwLHp8MCxFfDApfDA7ej1DO2dhPUVeZ2E7ZmE9el5mYTtfPUdkKGdhfDAsZmF8MCw2Myl8MDtaPUM7ZmE9SGQoZ2F8MCxmYXwwLDEpfDA7Xz1mYXxfO1o9Q3xaO2NhPURkKGVhfDAsZGF8MCx2fDAsY2F8MCl8MDtVPURkKGNhfDAsQ3wwLFd8MCxVfDApfDA7Vz1DO3U9dV5VO3M9c15XO0c9RGQoc3wwLHV8MCxKfDAsR3wwKXwwO0o9QztlYT1HXmVhO2RhPUpeZGE7Y2E9R2QoZWF8MCxkYXwwLDI0KXwwO3Y9QztkYT1IZChlYXwwLGRhfDAsNDApfDA7Y2E9ZGF8Y2E7dj1DfHY7Vz1EZChlfDAsZnwwLFV8MCxXfDApfDA7Vz1EZChXfDAsQ3wwLGNhfDAsdnwwKXwwO1U9QztzPVdeczt1PVVedTtmPUdkKHN8MCx1fDAsMTYpfDA7ZT1DO3U9SGQoc3wwLHV8MCw0OCl8MDtmPXV8ZjtlPUN8ZTtKPURkKGZ8MCxlfDAsR3wwLEp8MCl8MDtHPUM7Y2E9Sl5jYTt2PUdedjt1PUdkKGNhfDAsdnwwLDYzKXwwO3M9Qzt2PUhkKGNhfDAsdnwwLDEpfDA7cz1DfHM7JD1EZChiYXwwLGFhfDAscHwwLCR8MCl8MDtQPURkKCR8MCxDfDAsUnwwLFB8MCl8MDtSPUM7bz1vXlA7bT1tXlI7ej1EZChtfDAsb3wwLEV8MCx6fDApfDA7RT1DO2JhPXpeYmE7YWE9RV5hYTskPUdkKGJhfDAsYWF8MCwyNCl8MDtwPUM7YWE9SGQoYmF8MCxhYXwwLDQwKXwwOyQ9YWF8JDtwPUN8cDtSPURkKHR8MCx4fDAsUHwwLFJ8MCl8MDtSPURkKFJ8MCxDfDAsJHwwLHB8MCl8MDtQPUM7bT1SXm07bz1QXm87eD1HZChtfDAsb3wwLDE2KXwwO3Q9QztvPUhkKG18MCxvfDAsNDgpfDA7eD1vfHg7dD1DfHQ7RT1EZCh4fDAsdHwwLHp8MCxFfDApfDA7ej1DOyQ9RV4kO3A9el5wO289R2QoJHwwLHB8MCw2Myl8MDttPUM7cD1IZCgkfDAscHwwLDEpfDA7bT1DfG07WT1EZChffDAsWnwwLGp8MCxZfDApfDA7Sz1EZChZfDAsQ3wwLE18MCxLfDApfDA7TT1DO2k9aV5LO2c9Z15NO1E9RGQoZ3wwLGl8MCxUfDAsUXwwKXwwO1Q9QztfPVFeXztaPVReWjtZPUdkKF98MCxafDAsMjQpfDA7aj1DO1o9SGQoX3wwLFp8MCw0MCl8MDtZPVp8WTtqPUN8ajtNPURkKG58MCxyfDAsS3wwLE18MCl8MDtNPURkKE18MCxDfDAsWXwwLGp8MCl8MDtLPUM7Zz1NXmc7aT1LXmk7cj1HZChnfDAsaXwwLDE2KXwwO249QztpPUhkKGd8MCxpfDAsNDgpfDA7cj1pfHI7bj1DfG47VD1EZChyfDAsbnwwLFF8MCxUfDApfDA7UT1DO1k9VF5ZO2o9UV5qO2k9R2QoWXwwLGp8MCw2Myl8MDtnPUM7aj1IZChZfDAsanwwLDEpfDA7Zz1DfGc7Uz1EZChYfDAsVnwwLEJ8MCxTfDApfDA7Rj1EZChTfDAsQ3wwLEh8MCxGfDApfDA7SD1DO0E9QV5GO3k9eV5IO0w9RGQoeXwwLEF8MCxPfDAsTHwwKXwwO089QztYPUxeWDtWPU9eVjtTPUdkKFh8MCxWfDAsMjQpfDA7Qj1DO1Y9SGQoWHwwLFZ8MCw0MCl8MDtTPVZ8UztCPUN8QjtIPURkKGh8MCxsfDAsRnwwLEh8MCl8MDtIPURkKEh8MCxDfDAsU3wwLEJ8MCl8MDtGPUM7eT1IXnk7QT1GXkE7bD1HZCh5fDAsQXwwLDE2KXwwO2g9QztBPUhkKHl8MCxBfDAsNDgpfDA7bD1BfGw7aD1DfGg7Tz1EZChsfDAsaHwwLEx8MCxPfDApfDA7TD1DO1M9T15TO0I9TF5CO0E9R2QoU3wwLEJ8MCw2Myl8MDt5PUM7Qj1IZChTfDAsQnwwLDEpfDA7Uz1iO1Y9UztTPVMrNHwwO1Q9V14oZFtWPj4wXXxkW1YrMT4+MF08PDh8ZFtWKzI+PjBdPDwxNnxkW1YrMz4+MF08PDI0KV5UO1E9VV4oZFtTPj4wXXxkW1MrMT4+MF08PDh8ZFtTKzI+PjBdPDwxNnxkW1MrMz4+MF08PDI0KV5RO1M9YjthW1M+PjBdPVQ7YVtTKzE+PjBdPVQ+Pjg7YVtTKzI+PjBdPVQ+PjE2O2FbUyszPj4wXT1UPj4yNDtiPWIrNHwwO2FbYj4+MF09UTthW2IrMT4+MF09UT4+ODthW2IrMj4+MF09UT4+MTY7YVtiKzM+PjBdPVE+PjI0O2I9TjtRPWI7Yj1iKzR8MDtPPVJeKGRbUT4+MF18ZFtRKzE+PjBdPDw4fGRbUSsyPj4wXTw8MTZ8ZFtRKzM+PjBdPDwyNCleTztMPVBeKGRbYj4+MF18ZFtiKzE+PjBdPDw4fGRbYisyPj4wXTw8MTZ8ZFtiKzM+PjBdPDwyNCleTDtiPU47Tj1iO2FbTj4+MF09TzthW04rMT4+MF09Tz4+ODthW04rMj4+MF09Tz4+MTY7YVtOKzM+PjBdPU8+PjI0O2I9Yis0fDA7YVtiPj4wXT1MO2FbYisxPj4wXT1MPj44O2FbYisyPj4wXT1MPj4xNjthW2IrMz4+MF09TD4+MjQ7Yj1JO0w9YjtiPWIrNHwwO0o9TV4oZFtMPj4wXXxkW0wrMT4+MF08PDh8ZFtMKzI+PjBdPDwxNnxkW0wrMz4+MF08PDI0KV5KO0c9S14oZFtiPj4wXXxkW2IrMT4+MF08PDh8ZFtiKzI+PjBdPDwxNnxkW2IrMz4+MF08PDI0KV5HO2I9STtJPWI7YVtJPj4wXT1KO2FbSSsxPj4wXT1KPj44O2FbSSsyPj4wXT1KPj4xNjthW0krMz4+MF09Sj4+MjQ7Yj1iKzR8MDthW2I+PjBdPUc7YVtiKzE+PjBdPUc+Pjg7YVtiKzI+PjBdPUc+PjE2O2FbYiszPj4wXT1HPj4yNDtiPUQ7Rz1iO2I9Yis0fDA7RT1IXihkW0c+PjBdfGRbRysxPj4wXTw8OHxkW0crMj4+MF08PDE2fGRbRyszPj4wXTw8MjQpXkU7ej1GXihkW2I+PjBdfGRbYisxPj4wXTw8OHxkW2IrMj4+MF08PDE2fGRbYiszPj4wXTw8MjQpXno7Yj1EO0Q9YjthW0Q+PjBdPUU7YVtEKzE+PjBdPUU+Pjg7YVtEKzI+PjBdPUU+PjE2O2FbRCszPj4wXT1FPj4yNDtiPWIrNHwwO2FbYj4+MF09ejthW2IrMT4+MF09ej4+ODthW2IrMj4+MF09ej4+MTY7YVtiKzM+PjBdPXo+PjI0O2I9dzt6PWI7Yj1iKzR8MDt4PShCfEEpXihkW3o+PjBdfGRbeisxPj4wXTw8OHxkW3orMj4+MF08PDE2fGRbeiszPj4wXTw8MjQpXng7dD0oQ3x5KV4oZFtiPj4wXXxkW2IrMT4+MF08PDh8ZFtiKzI+PjBdPDwxNnxkW2IrMz4+MF08PDI0KV50O2I9dzt3PWI7YVt3Pj4wXT14O2FbdysxPj4wXT14Pj44O2FbdysyPj4wXT14Pj4xNjthW3crMz4+MF09eD4+MjQ7Yj1iKzR8MDthW2I+PjBdPXQ7YVtiKzE+PjBdPXQ+Pjg7YVtiKzI+PjBdPXQ+PjE2O2FbYiszPj4wXT10Pj4yNDtiPXE7dD1iO2I9Yis0fDA7cj0odnx1KV4oZFt0Pj4wXXxkW3QrMT4+MF08PDh8ZFt0KzI+PjBdPDwxNnxkW3QrMz4+MF08PDI0KV5yO249c14oZFtiPj4wXXxkW2IrMT4+MF08PDh8ZFtiKzI+PjBdPDwxNnxkW2IrMz4+MF08PDI0KV5uO2I9cTtxPWI7YVtxPj4wXT1yO2FbcSsxPj4wXT1yPj44O2FbcSsyPj4wXT1yPj4xNjthW3ErMz4+MF09cj4+MjQ7Yj1iKzR8MDthW2I+PjBdPW47YVtiKzE+PjBdPW4+Pjg7YVtiKzI+PjBdPW4+PjE2O2FbYiszPj4wXT1uPj4yNDtiPWs7bj1iO2I9Yis0fDA7bD0ocHxvKV4oZFtuPj4wXXxkW24rMT4+MF08PDh8ZFtuKzI+PjBdPDwxNnxkW24rMz4+MF08PDI0KV5sO2g9bV4oZFtiPj4wXXxkW2IrMT4+MF08PDh8ZFtiKzI+PjBdPDwxNnxkW2IrMz4+MF08PDI0KV5oO2I9aztrPWI7YVtrPj4wXT1sO2FbaysxPj4wXT1sPj44O2FbaysyPj4wXT1sPj4xNjthW2srMz4+MF09bD4+MjQ7Yj1iKzR8MDthW2I+PjBdPWg7YVtiKzE+PjBdPWg+Pjg7YVtiKzI+PjBdPWg+PjE2O2FbYiszPj4wXT1oPj4yNDtiPWM7aD1iO2I9Yis0fDA7Zj0oanxpKV4oZFtoPj4wXXxkW2grMT4+MF08PDh8ZFtoKzI+PjBdPDwxNnxkW2grMz4+MF08PDI0KV5mO2I9Z14oZFtiPj4wXXxkW2IrMT4+MF08PDh8ZFtiKzI+PjBdPDwxNnxkW2IrMz4+MF08PDI0KV5lO2U9YzthW2U+PjBdPWY7YVtlKzE+PjBdPWY+Pjg7YVtlKzI+PjBdPWY+PjE2O2FbZSszPj4wXT1mPj4yNDtjPWMrNHwwO2FbYz4+MF09YjthW2MrMT4+MF09Yj4+ODthW2MrMj4+MF09Yj4+MTY7YVtjKzM+PjBdPWI+PjI0O3JldHVybn1mdW5jdGlvbiBCYigpe3JldHVybiA2NH1mdW5jdGlvbiBDYihiLGQsZSxmKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO249aTttPWk9aSs2MyYtNjQ7aT1pKzIwOHwwO2c9bSs2NHwwO2g9bTtqPTg7az1oKzY0fDA7ZG97Y1toPj4yXT1jW2o+PjJdO2g9aCs0fDA7aj1qKzR8MH13aGlsZSgoaHwwKTwoa3wwKSk7aD1IZChlfDAsZnwwLDMpfDA7aj1DO2s9R2QoZXwwLGZ8MCw2MSl8MDtsPW0rNzJ8MDtjW2w+PjJdPWg7Y1tsKzQ+PjJdPWo7bD1nO2NbbD4+Ml09aztjW2wrND4+Ml09QztsPW0rODB8MDtpZihmPj4+MDwwfChmfDApPT0wJmU+Pj4wPDEyOCl7SWQobHwwLGR8MCxlfDApfDA7R2IobSxiKTtpPW47cmV0dXJuIDB9aD1sO2o9ZDtrPWgrMTI4fDA7ZG97YVtoPj4wXT1hW2o+PjBdfDA7aD1oKzF8MDtqPWorMXwwfXdoaWxlKChofDApPChrfDApKTtIYihtLGwpO2c9ZCsxMjh8MDtkPURkKGV8MCxmfDAsLTEyOCwtMSl8MDtoPUM7aWYoaD4+PjA+MHwoaHwwKT09MCZkPj4+MD4xMjcpZG97SGIobSxnKTtnPWcrMTI4fDA7ZD1EZChkfDAsaHwwLC0xMjgsLTEpfDA7aD1DfXdoaWxlKGg+Pj4wPjB8KGh8MCk9PTAmZD4+PjA+MTI3KTtJZChsfDAsZ3wwLGR8MCl8MDtHYihtLGIpO2k9bjtyZXR1cm4gMH1mdW5jdGlvbiBEYihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtuPWk7bT1pPWkrNjMmLTY0O2k9aSsxNnwwO2w9YiszMnwwO2U9bDtmPWNbZT4+Ml18MDtlPWNbZSs0Pj4yXXwwO2FbbSs3Pj4wXT1mO2c9R2QoZnwwLGV8MCw4KXwwO2FbbSs2Pj4wXT1nO2c9R2QoZnwwLGV8MCwxNil8MDthW20rNT4+MF09ZztnPUdkKGZ8MCxlfDAsMjQpfDA7YVttKzQ+PjBdPWc7YVttKzM+PjBdPWU7Zz1HZChmfDAsZXwwLDQwKXwwO2FbbSsyPj4wXT1nO2c9R2QoZnwwLGV8MCw0OCl8MDthW20rMT4+MF09ZztnPUdkKGZ8MCxlfDAsNTYpfDA7YVttPj4wXT1nO2c9R2QoZnwwLGV8MCwzKXwwO2c9ZyY2MztrPWc+Pj4wPDU2PzU2OjEyMDtqPWstZ3wwO2RvIGlmKChrfDApIT0oZ3wwKSl7aD1IZChqfDAsMCwzKXwwO2Y9RGQoaHwwLEN8MCxmfDAsZXwwKXwwO2U9QztoPWw7Y1toPj4yXT1mO2NbaCs0Pj4yXT1lO2g9NjQtZ3wwO2c9Yis0MCtnfDA7aWYoaj4+PjA8aD4+PjApe0lkKGd8MCwzMjc5MixqfDApfDA7YnJlYWt9SWQoZ3wwLDMyNzkyLGh8MCl8MDtrPWIrNDB8MDtFYihiLGspO2U9MzI3OTIraHwwO2c9Q2QoanwwLDAsaHwwLDApfDA7Zj1DO2lmKGY+Pj4wPjB8KGZ8MCk9PTAmZz4+PjA+NjMpe2Rve0ViKGIsZSk7ZT1lKzY0fDA7Zz1EZChnfDAsZnwwLC02NCwtMSl8MDtmPUN9d2hpbGUoZj4+PjA+MHwoZnwwKT09MCZnPj4+MD42Myk7Zj1nfWVsc2UgZj1nO0lkKGt8MCxlfDAsZnwwKXwwO2U9bDtmPWNbZT4+Ml18MDtlPWNbZSs0Pj4yXXwwfXdoaWxlKDApO2s9R2QoZnwwLGV8MCwzKXwwO2s9ayY2MztlPURkKGZ8MCxlfDAsNjQsMCl8MDtmPWw7Y1tmPj4yXT1lO2NbZis0Pj4yXT1DO2Y9NjQta3wwO2U9Yis0MCtrfDA7aWYoZj4+PjA+OCl7az1jW20+PjJdfDA7bT1jW20rND4+Ml18MDtsPWU7YVtsPj4wXT1rO2FbbCsxPj4wXT1rPj44O2FbbCsyPj4wXT1rPj4xNjthW2wrMz4+MF09az4+MjQ7ZT1lKzR8MDthW2U+PjBdPW07YVtlKzE+PjBdPW0+Pjg7YVtlKzI+PjBdPW0+PjE2O2FbZSszPj4wXT1tPj4yNDtlPWJ9ZWxzZXtJZChlfDAsbXwwLGZ8MCl8MDtoPWIrNDB8MDtFYihiLGgpO2U9bStmfDA7Zz1DZCg4LDAsZnwwLDApfDA7Zj1DO2lmKGY+Pj4wPjB8KGZ8MCk9PTAmZz4+PjA+NjMpe2Rve0ViKGIsZSk7ZT1lKzY0fDA7Zz1EZChnfDAsZnwwLC02NCwtMSl8MDtmPUN9d2hpbGUoZj4+PjA+MHwoZnwwKT09MCZnPj4+MD42Myk7Zj1nfWVsc2UgZj1nO0lkKGh8MCxlfDAsZnwwKXwwO2U9Yn1lPWNbZT4+Ml18MDthW2QrMz4+MF09ZTthW2QrMj4+MF09ZT4+Pjg7YVtkKzE+PjBdPWU+Pj4xNjthW2Q+PjBdPWU+Pj4yNDtlPWNbYis0Pj4yXXwwO2FbZCs3Pj4wXT1lO2FbZCs2Pj4wXT1lPj4+ODthW2QrNT4+MF09ZT4+PjE2O2FbZCs0Pj4wXT1lPj4+MjQ7ZT1jW2IrOD4+Ml18MDthW2QrMTE+PjBdPWU7YVtkKzEwPj4wXT1lPj4+ODthW2QrOT4+MF09ZT4+PjE2O2FbZCs4Pj4wXT1lPj4+MjQ7ZT1jW2IrMTI+PjJdfDA7YVtkKzE1Pj4wXT1lO2FbZCsxND4+MF09ZT4+Pjg7YVtkKzEzPj4wXT1lPj4+MTY7YVtkKzEyPj4wXT1lPj4+MjQ7ZT1jW2IrMTY+PjJdfDA7YVtkKzE5Pj4wXT1lO2FbZCsxOD4+MF09ZT4+Pjg7YVtkKzE3Pj4wXT1lPj4+MTY7YVtkKzE2Pj4wXT1lPj4+MjQ7ZT1jW2IrMjA+PjJdfDA7YVtkKzIzPj4wXT1lO2FbZCsyMj4+MF09ZT4+Pjg7YVtkKzIxPj4wXT1lPj4+MTY7YVtkKzIwPj4wXT1lPj4+MjQ7ZT1jW2IrMjQ+PjJdfDA7YVtkKzI3Pj4wXT1lO2FbZCsyNj4+MF09ZT4+Pjg7YVtkKzI1Pj4wXT1lPj4+MTY7YVtkKzI0Pj4wXT1lPj4+MjQ7ZT1jW2IrMjg+PjJdfDA7YVtkKzMxPj4wXT1lO2FbZCszMD4+MF09ZT4+Pjg7YVtkKzI5Pj4wXT1lPj4+MTY7YVtkKzI4Pj4wXT1lPj4+MjQ7ZT1iKzEwNHwwO2Rve2FbYj4+MF09MDtiPWIrMXwwfXdoaWxlKChifDApPChlfDApKTtpPW47cmV0dXJufWZ1bmN0aW9uIEViKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtnPWk7Zj1pPWkrNjMmLTY0O2k9aSsyNTZ8MDtlPTA7ZG97aD1iKyhlPDwyKXwwO2NbZisoZTw8Mik+PjJdPShkW2grMj4+MF18MCk8PDh8KGRbaCszPj4wXXwwKXwoZFtoKzE+PjBdfDApPDwxNnwoZFtoPj4wXXwwKTw8MjQ7ZT1lKzF8MH13aGlsZSgoZXwwKSE9MTYpO2I9Y1tmPj4yXXwwO2U9MTY7ZG97aD1jW2YrKGUrLTI8PDIpPj4yXXwwO2o9YjtiPWNbZisoZSstMTU8PDIpPj4yXXwwO2NbZisoZTw8Mik+PjJdPWorKGNbZisoZSstNzw8Mik+PjJdfDApKygoaD4+PjE5fGg8PDEzKV5oPj4+MTBeKGg+Pj4xN3xoPDwxNSkpKygoYj4+PjE4fGI8PDE0KV5iPj4+M14oYj4+Pjd8Yjw8MjUpKTtlPWUrMXwwfXdoaWxlKChlfDApIT02NCk7dT1jW2E+PjJdfDA7cz1hKzR8MDt0PWNbcz4+Ml18MDtxPWErOHwwO3I9Y1txPj4yXXwwO289YSsxMnwwO209YSsxNnwwO249Y1ttPj4yXXwwO2s9YSsyMHwwO2w9Y1trPj4yXXwwO2U9YSsyNHwwO2I9Y1tlPj4yXXwwO2o9YSsyOHwwO2g9KGNbaj4+Ml18MCkrMTExNjM1MjQwOCsoY1tmPj4yXXwwKSsoKG4+Pj42fG48PDI2KV4obj4+PjExfG48PDIxKV4obj4+PjI1fG48PDcpKSsoKGJebCkmbl5iKXwwO3A9KGNbbz4+Ml18MCkraHwwO2g9KChyfHQpJnV8ciZ0KSsoKHU+Pj4yfHU8PDMwKV4odT4+PjEzfHU8PDE5KV4odT4+PjIyfHU8PDEwKSkraHwwO2I9YisxODk5NDQ3NDQxKyhjW2YrND4+Ml18MCkrKChwPj4+NnxwPDwyNileKHA+Pj4xMXxwPDwyMSleKHA+Pj4yNXxwPDw3KSkrKChsXm4pJnBebCl8MDtyPXIrYnwwO2I9KCh0fHUpJmh8dCZ1KSsoKGg+Pj4yfGg8PDMwKV4oaD4+PjEzfGg8PDE5KV4oaD4+PjIyfGg8PDEwKSkrYnwwO2w9bCstMTI0NTY0MzgyNSsoY1tmKzg+PjJdfDApKygocj4+PjZ8cjw8MjYpXihyPj4+MTF8cjw8MjEpXihyPj4+MjV8cjw8NykpKygobl5wKSZyXm4pfDA7dD10K2x8MDtsPSgodXxoKSZifHUmaCkrKChiPj4+MnxiPDwzMCleKGI+Pj4xM3xiPDwxOSleKGI+Pj4yMnxiPDwxMCkpK2x8MDtuPW4rLTM3Mzk1NzcyMysoY1tmKzEyPj4yXXwwKSsoKHQ+Pj42fHQ8PDI2KV4odD4+PjExfHQ8PDIxKV4odD4+PjI1fHQ8PDcpKSsoKHBecikmdF5wKXwwO3U9dStufDA7bj0oKGh8YikmbHxoJmIpKygobD4+PjJ8bDw8MzApXihsPj4+MTN8bDw8MTkpXihsPj4+MjJ8bDw8MTApKStufDA7cD1wKzk2MTk4NzE2MysoY1tmKzE2Pj4yXXwwKSsoKHU+Pj42fHU8PDI2KV4odT4+PjExfHU8PDIxKV4odT4+PjI1fHU8PDcpKSsoKHJedCkmdV5yKXwwO2g9aCtwfDA7cD0oKGJ8bCkmbnxiJmwpKygobj4+PjJ8bjw8MzApXihuPj4+MTN8bjw8MTkpXihuPj4+MjJ8bjw8MTApKStwfDA7cj1yKzE1MDg5NzA5OTMrKGNbZisyMD4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCstMTg0MTMzMTU0OCsoY1tmKzI0Pj4yXXwwKSsoKGI+Pj42fGI8PDI2KV4oYj4+PjExfGI8PDIxKV4oYj4+PjI1fGI8PDcpKSsoKHVeaCkmYl51KXwwO2w9bCt0fDA7dD0oKG58cCkmcnxuJnApKygocj4+PjJ8cjw8MzApXihyPj4+MTN8cjw8MTkpXihyPj4+MjJ8cjw8MTApKSt0fDA7dT11Ky0xNDI0MjA0MDc1KyhjW2YrMjg+PjJdfDApKygobD4+PjZ8bDw8MjYpXihsPj4+MTF8bDw8MjEpXihsPj4+MjV8bDw8NykpKygoaF5iKSZsXmgpfDA7bj1uK3V8MDt1PSgocHxyKSZ0fHAmcikrKCh0Pj4+Mnx0PDwzMCleKHQ+Pj4xM3x0PDwxOSleKHQ+Pj4yMnx0PDwxMCkpK3V8MDtoPWgrLTY3MDU4NjIxNisoY1tmKzMyPj4yXXwwKSsoKG4+Pj42fG48PDI2KV4obj4+PjExfG48PDIxKV4obj4+PjI1fG48PDcpKSsoKGJebCkmbl5iKXwwO3A9cCtofDA7aD0oKHJ8dCkmdXxyJnQpKygodT4+PjJ8dTw8MzApXih1Pj4+MTN8dTw8MTkpXih1Pj4+MjJ8dTw8MTApKStofDA7Yj1iKzMxMDU5ODQwMSsoY1tmKzM2Pj4yXXwwKSsoKHA+Pj42fHA8PDI2KV4ocD4+PjExfHA8PDIxKV4ocD4+PjI1fHA8PDcpKSsoKGxebikmcF5sKXwwO3I9citifDA7Yj0oKHR8dSkmaHx0JnUpKygoaD4+PjJ8aDw8MzApXihoPj4+MTN8aDw8MTkpXihoPj4+MjJ8aDw8MTApKStifDA7bD1sKzYwNzIyNTI3OCsoY1tmKzQwPj4yXXwwKSsoKHI+Pj42fHI8PDI2KV4ocj4+PjExfHI8PDIxKV4ocj4+PjI1fHI8PDcpKSsoKG5ecCkmcl5uKXwwO3Q9dCtsfDA7bD0oKHV8aCkmYnx1JmgpKygoYj4+PjJ8Yjw8MzApXihiPj4+MTN8Yjw8MTkpXihiPj4+MjJ8Yjw8MTApKStsfDA7bj1uKzE0MjY4ODE5ODcrKGNbZis0ND4+Ml18MCkrKCh0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KSkrKChwXnIpJnRecCl8MDt1PXUrbnwwO249KChofGIpJmx8aCZiKSsoKGw+Pj4yfGw8PDMwKV4obD4+PjEzfGw8PDE5KV4obD4+PjIyfGw8PDEwKSkrbnwwO3A9cCsxOTI1MDc4Mzg4KyhjW2YrNDg+PjJdfDApKygodT4+PjZ8dTw8MjYpXih1Pj4+MTF8dTw8MjEpXih1Pj4+MjV8dTw8NykpKygocl50KSZ1XnIpfDA7aD1oK3B8MDtwPSgoYnxsKSZufGImbCkrKChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpK3B8MDtyPXIrLTIxMzI4ODkwOTArKGNbZis1Mj4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCstMTY4MDA3OTE5MysoY1tmKzU2Pj4yXXwwKSsoKGI+Pj42fGI8PDI2KV4oYj4+PjExfGI8PDIxKV4oYj4+PjI1fGI8PDcpKSsoKHVeaCkmYl51KXwwO2w9bCt0fDA7dD0oKG58cCkmcnxuJnApKygocj4+PjJ8cjw8MzApXihyPj4+MTN8cjw8MTkpXihyPj4+MjJ8cjw8MTApKSt0fDA7dT11Ky0xMDQ2NzQ0NzE2KyhjW2YrNjA+PjJdfDApKygobD4+PjZ8bDw8MjYpXihsPj4+MTF8bDw8MjEpXihsPj4+MjV8bDw8NykpKygoaF5iKSZsXmgpfDA7bj1uK3V8MDt1PSgocHxyKSZ0fHAmcikrKCh0Pj4+Mnx0PDwzMCleKHQ+Pj4xM3x0PDwxOSleKHQ+Pj4yMnx0PDwxMCkpK3V8MDtoPWgrLTQ1OTU3Njg5NSsoY1tmKzY0Pj4yXXwwKSsoKG4+Pj42fG48PDI2KV4obj4+PjExfG48PDIxKV4obj4+PjI1fG48PDcpKSsoKGJebCkmbl5iKXwwO3A9cCtofDA7aD0oKHJ8dCkmdXxyJnQpKygodT4+PjJ8dTw8MzApXih1Pj4+MTN8dTw8MTkpXih1Pj4+MjJ8dTw8MTApKStofDA7Yj1iKy0yNzI3NDI1MjIrKGNbZis2OD4+Ml18MCkrKChwPj4+NnxwPDwyNileKHA+Pj4xMXxwPDwyMSleKHA+Pj4yNXxwPDw3KSkrKChsXm4pJnBebCl8MDtyPXIrYnwwO2I9KCh0fHUpJmh8dCZ1KSsoKGg+Pj4yfGg8PDMwKV4oaD4+PjEzfGg8PDE5KV4oaD4+PjIyfGg8PDEwKSkrYnwwO2w9bCsyNjQzNDcwNzgrKGNbZis3Mj4+Ml18MCkrKChyPj4+NnxyPDwyNileKHI+Pj4xMXxyPDwyMSleKHI+Pj4yNXxyPDw3KSkrKChuXnApJnJebil8MDt0PXQrbHwwO2w9KCh1fGgpJmJ8dSZoKSsoKGI+Pj4yfGI8PDMwKV4oYj4+PjEzfGI8PDE5KV4oYj4+PjIyfGI8PDEwKSkrbHwwO249bis2MDQ4MDc2MjgrKGNbZis3Nj4+Ml18MCkrKCh0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KSkrKChwXnIpJnRecCl8MDt1PXUrbnwwO249KChofGIpJmx8aCZiKSsoKGw+Pj4yfGw8PDMwKV4obD4+PjEzfGw8PDE5KV4obD4+PjIyfGw8PDEwKSkrbnwwO3A9cCs3NzAyNTU5ODMrKGNbZis4MD4+Ml18MCkrKCh1Pj4+Nnx1PDwyNileKHU+Pj4xMXx1PDwyMSleKHU+Pj4yNXx1PDw3KSkrKChyXnQpJnVecil8MDtoPWgrcHwwO3A9KChifGwpJm58YiZsKSsoKG4+Pj4yfG48PDMwKV4obj4+PjEzfG48PDE5KV4obj4+PjIyfG48PDEwKSkrcHwwO3I9cisxMjQ5MTUwMTIyKyhjW2YrODQ+PjJdfDApKygoaD4+PjZ8aDw8MjYpXihoPj4+MTF8aDw8MjEpXihoPj4+MjV8aDw8NykpKygodF51KSZoXnQpfDA7Yj1iK3J8MDtyPSgobHxuKSZwfGwmbikrKChwPj4+MnxwPDwzMCleKHA+Pj4xM3xwPDwxOSleKHA+Pj4yMnxwPDwxMCkpK3J8MDt0PXQrMTU1NTA4MTY5MisoY1tmKzg4Pj4yXXwwKSsoKGI+Pj42fGI8PDI2KV4oYj4+PjExfGI8PDIxKV4oYj4+PjI1fGI8PDcpKSsoKHVeaCkmYl51KXwwO2w9bCt0fDA7dD0oKG58cCkmcnxuJnApKygocj4+PjJ8cjw8MzApXihyPj4+MTN8cjw8MTkpXihyPj4+MjJ8cjw8MTApKSt0fDA7dT11KzE5OTYwNjQ5ODYrKGNbZis5Mj4+Ml18MCkrKChsPj4+NnxsPDwyNileKGw+Pj4xMXxsPDwyMSleKGw+Pj4yNXxsPDw3KSkrKChoXmIpJmxeaCl8MDtuPW4rdXwwO3U9KChwfHIpJnR8cCZyKSsoKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKSkrdXwwO2g9aCstMTc0MDc0NjQxNCsoY1tmKzk2Pj4yXXwwKSsoKG4+Pj42fG48PDI2KV4obj4+PjExfG48PDIxKV4obj4+PjI1fG48PDcpKSsoKGJebCkmbl5iKXwwO3A9cCtofDA7aD0oKHJ8dCkmdXxyJnQpKygodT4+PjJ8dTw8MzApXih1Pj4+MTN8dTw8MTkpXih1Pj4+MjJ8dTw8MTApKStofDA7Yj1iKy0xNDczMTMyOTQ3KyhjW2YrMTAwPj4yXXwwKSsoKHA+Pj42fHA8PDI2KV4ocD4+PjExfHA8PDIxKV4ocD4+PjI1fHA8PDcpKSsoKGxebikmcF5sKXwwO3I9citifDA7Yj0oKHR8dSkmaHx0JnUpKygoaD4+PjJ8aDw8MzApXihoPj4+MTN8aDw8MTkpXihoPj4+MjJ8aDw8MTApKStifDA7bD1sKy0xMzQxOTcwNDg4KyhjW2YrMTA0Pj4yXXwwKSsoKHI+Pj42fHI8PDI2KV4ocj4+PjExfHI8PDIxKV4ocj4+PjI1fHI8PDcpKSsoKG5ecCkmcl5uKXwwO3Q9dCtsfDA7bD0oKHV8aCkmYnx1JmgpKygoYj4+PjJ8Yjw8MzApXihiPj4+MTN8Yjw8MTkpXihiPj4+MjJ8Yjw8MTApKStsfDA7bj1uKy0xMDg0NjUzNjI1KyhjW2YrMTA4Pj4yXXwwKSsoKHQ+Pj42fHQ8PDI2KV4odD4+PjExfHQ8PDIxKV4odD4+PjI1fHQ8PDcpKSsoKHBecikmdF5wKXwwO3U9dStufDA7bj0oKGh8YikmbHxoJmIpKygobD4+PjJ8bDw8MzApXihsPj4+MTN8bDw8MTkpXihsPj4+MjJ8bDw8MTApKStufDA7cD1wKy05NTgzOTU0MDUrKGNbZisxMTI+PjJdfDApKygodT4+PjZ8dTw8MjYpXih1Pj4+MTF8dTw8MjEpXih1Pj4+MjV8dTw8NykpKygocl50KSZ1XnIpfDA7aD1oK3B8MDtwPSgoYnxsKSZufGImbCkrKChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpK3B8MDtyPXIrLTcxMDQzODU4NSsoY1tmKzExNj4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCsxMTM5MjY5OTMrKGNbZisxMjA+PjJdfDApKygoYj4+PjZ8Yjw8MjYpXihiPj4+MTF8Yjw8MjEpXihiPj4+MjV8Yjw8NykpKygodV5oKSZiXnUpfDA7bD1sK3R8MDt0PSgobnxwKSZyfG4mcCkrKChyPj4+MnxyPDwzMCleKHI+Pj4xM3xyPDwxOSleKHI+Pj4yMnxyPDwxMCkpK3R8MDt1PXUrMzM4MjQxODk1KyhjW2YrMTI0Pj4yXXwwKSsoKGw+Pj42fGw8PDI2KV4obD4+PjExfGw8PDIxKV4obD4+PjI1fGw8PDcpKSsoKGheYikmbF5oKXwwO249bit1fDA7dT0oKHB8cikmdHxwJnIpKygodD4+PjJ8dDw8MzApXih0Pj4+MTN8dDw8MTkpXih0Pj4+MjJ8dDw8MTApKSt1fDA7aD1oKzY2NjMwNzIwNSsoY1tmKzEyOD4+Ml18MCkrKChuPj4+NnxuPDwyNileKG4+Pj4xMXxuPDwyMSleKG4+Pj4yNXxuPDw3KSkrKChiXmwpJm5eYil8MDtwPXAraHwwO2g9KChyfHQpJnV8ciZ0KSsoKHU+Pj4yfHU8PDMwKV4odT4+PjEzfHU8PDE5KV4odT4+PjIyfHU8PDEwKSkraHwwO2I9Yis3NzM1Mjk5MTIrKGNbZisxMzI+PjJdfDApKygocD4+PjZ8cDw8MjYpXihwPj4+MTF8cDw8MjEpXihwPj4+MjV8cDw8NykpKygobF5uKSZwXmwpfDA7cj1yK2J8MDtiPSgodHx1KSZofHQmdSkrKChoPj4+MnxoPDwzMCleKGg+Pj4xM3xoPDwxOSleKGg+Pj4yMnxoPDwxMCkpK2J8MDtsPWwrMTI5NDc1NzM3MisoY1tmKzEzNj4+Ml18MCkrKChyPj4+NnxyPDwyNileKHI+Pj4xMXxyPDwyMSleKHI+Pj4yNXxyPDw3KSkrKChuXnApJnJebil8MDt0PXQrbHwwO2w9KCh1fGgpJmJ8dSZoKSsoKGI+Pj4yfGI8PDMwKV4oYj4+PjEzfGI8PDE5KV4oYj4+PjIyfGI8PDEwKSkrbHwwO249bisxMzk2MTgyMjkxKyhjW2YrMTQwPj4yXXwwKSsoKHQ+Pj42fHQ8PDI2KV4odD4+PjExfHQ8PDIxKV4odD4+PjI1fHQ8PDcpKSsoKHBecikmdF5wKXwwO3U9dStufDA7bj0oKGh8YikmbHxoJmIpKygobD4+PjJ8bDw8MzApXihsPj4+MTN8bDw8MTkpXihsPj4+MjJ8bDw8MTApKStufDA7cD1wKzE2OTUxODM3MDArKGNbZisxNDQ+PjJdfDApKygodT4+PjZ8dTw8MjYpXih1Pj4+MTF8dTw8MjEpXih1Pj4+MjV8dTw8NykpKygocl50KSZ1XnIpfDA7aD1oK3B8MDtwPSgoYnxsKSZufGImbCkrKChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpK3B8MDtyPXIrMTk4NjY2MTA1MSsoY1tmKzE0OD4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCstMjExNzk0MDk0NisoY1tmKzE1Mj4+Ml18MCkrKChiPj4+NnxiPDwyNileKGI+Pj4xMXxiPDwyMSleKGI+Pj4yNXxiPDw3KSkrKCh1XmgpJmJedSl8MDtsPWwrdHwwO3Q9KChufHApJnJ8biZwKSsoKHI+Pj4yfHI8PDMwKV4ocj4+PjEzfHI8PDE5KV4ocj4+PjIyfHI8PDEwKSkrdHwwO3U9dSstMTgzODAxMTI1OSsoY1tmKzE1Nj4+Ml18MCkrKChsPj4+NnxsPDwyNileKGw+Pj4xMXxsPDwyMSleKGw+Pj4yNXxsPDw3KSkrKChoXmIpJmxeaCl8MDtuPW4rdXwwO3U9KChwfHIpJnR8cCZyKSsoKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKSkrdXwwO2g9aCstMTU2NDQ4MTM3NSsoY1tmKzE2MD4+Ml18MCkrKChuPj4+NnxuPDwyNileKG4+Pj4xMXxuPDwyMSleKG4+Pj4yNXxuPDw3KSkrKChiXmwpJm5eYil8MDtwPXAraHwwO2g9KChyfHQpJnV8ciZ0KSsoKHU+Pj4yfHU8PDMwKV4odT4+PjEzfHU8PDE5KV4odT4+PjIyfHU8PDEwKSkraHwwO2I9YistMTQ3NDY2NDg4NSsoY1tmKzE2ND4+Ml18MCkrKChwPj4+NnxwPDwyNileKHA+Pj4xMXxwPDwyMSleKHA+Pj4yNXxwPDw3KSkrKChsXm4pJnBebCl8MDtyPXIrYnwwO2I9KCh0fHUpJmh8dCZ1KSsoKGg+Pj4yfGg8PDMwKV4oaD4+PjEzfGg8PDE5KV4oaD4+PjIyfGg8PDEwKSkrYnwwO2w9bCstMTAzNTIzNjQ5NisoY1tmKzE2OD4+Ml18MCkrKChyPj4+NnxyPDwyNileKHI+Pj4xMXxyPDwyMSleKHI+Pj4yNXxyPDw3KSkrKChuXnApJnJebil8MDt0PXQrbHwwO2w9KCh1fGgpJmJ8dSZoKSsoKGI+Pj4yfGI8PDMwKV4oYj4+PjEzfGI8PDE5KV4oYj4+PjIyfGI8PDEwKSkrbHwwO249bistOTQ5MjAyNTI1KyhjW2YrMTcyPj4yXXwwKSsoKHQ+Pj42fHQ8PDI2KV4odD4+PjExfHQ8PDIxKV4odD4+PjI1fHQ8PDcpKSsoKHBecikmdF5wKXwwO3U9dStufDA7bj0oKGh8YikmbHxoJmIpKygobD4+PjJ8bDw8MzApXihsPj4+MTN8bDw8MTkpXihsPj4+MjJ8bDw8MTApKStufDA7cD1wKy03Nzg5MDE0NzkrKGNbZisxNzY+PjJdfDApKygodT4+PjZ8dTw8MjYpXih1Pj4+MTF8dTw8MjEpXih1Pj4+MjV8dTw8NykpKygocl50KSZ1XnIpfDA7aD1oK3B8MDtwPSgoYnxsKSZufGImbCkrKChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpK3B8MDtyPXIrLTY5NDYxNDQ5MisoY1tmKzE4MD4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCstMjAwMzk1Mzg3KyhjW2YrMTg0Pj4yXXwwKSsoKGI+Pj42fGI8PDI2KV4oYj4+PjExfGI8PDIxKV4oYj4+PjI1fGI8PDcpKSsoKHVeaCkmYl51KXwwO2w9bCt0fDA7dD0oKG58cCkmcnxuJnApKygocj4+PjJ8cjw8MzApXihyPj4+MTN8cjw8MTkpXihyPj4+MjJ8cjw8MTApKSt0fDA7dT11KzI3NTQyMzM0NCsoY1tmKzE4OD4+Ml18MCkrKChsPj4+NnxsPDwyNileKGw+Pj4xMXxsPDwyMSleKGw+Pj4yNXxsPDw3KSkrKChoXmIpJmxeaCl8MDtuPW4rdXwwO3U9KChwfHIpJnR8cCZyKSsoKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKSkrdXwwO2g9aCs0MzAyMjc3MzQrKGNbZisxOTI+PjJdfDApKygobj4+PjZ8bjw8MjYpXihuPj4+MTF8bjw8MjEpXihuPj4+MjV8bjw8NykpKygoYl5sKSZuXmIpfDA7cD1wK2h8MDtoPSgocnx0KSZ1fHImdCkrKCh1Pj4+Mnx1PDwzMCleKHU+Pj4xM3x1PDwxOSleKHU+Pj4yMnx1PDwxMCkpK2h8MDtiPWIrNTA2OTQ4NjE2KyhjW2YrMTk2Pj4yXXwwKSsoKHA+Pj42fHA8PDI2KV4ocD4+PjExfHA8PDIxKV4ocD4+PjI1fHA8PDcpKSsoKGxebikmcF5sKXwwO3I9citifDA7Yj0oKHR8dSkmaHx0JnUpKygoaD4+PjJ8aDw8MzApXihoPj4+MTN8aDw8MTkpXihoPj4+MjJ8aDw8MTApKStifDA7bD1sKzY1OTA2MDU1NisoY1tmKzIwMD4+Ml18MCkrKChyPj4+NnxyPDwyNileKHI+Pj4xMXxyPDwyMSleKHI+Pj4yNXxyPDw3KSkrKChuXnApJnJebil8MDt0PXQrbHwwO2w9KCh1fGgpJmJ8dSZoKSsoKGI+Pj4yfGI8PDMwKV4oYj4+PjEzfGI8PDE5KV4oYj4+PjIyfGI8PDEwKSkrbHwwO249bis4ODM5OTc4NzcrKGNbZisyMDQ+PjJdfDApKygodD4+PjZ8dDw8MjYpXih0Pj4+MTF8dDw8MjEpXih0Pj4+MjV8dDw8NykpKygocF5yKSZ0XnApfDA7dT11K258MDtuPSgoaHxiKSZsfGgmYikrKChsPj4+MnxsPDwzMCleKGw+Pj4xM3xsPDwxOSleKGw+Pj4yMnxsPDwxMCkpK258MDtwPXArOTU4MTM5NTcxKyhjW2YrMjA4Pj4yXXwwKSsoKHU+Pj42fHU8PDI2KV4odT4+PjExfHU8PDIxKV4odT4+PjI1fHU8PDcpKSsoKHJedCkmdV5yKXwwO2g9aCtwfDA7cD0oKGJ8bCkmbnxiJmwpKygobj4+PjJ8bjw8MzApXihuPj4+MTN8bjw8MTkpXihuPj4+MjJ8bjw8MTApKStwfDA7cj1yKzEzMjI4MjIyMTgrKGNbZisyMTI+PjJdfDApKygoaD4+PjZ8aDw8MjYpXihoPj4+MTF8aDw8MjEpXihoPj4+MjV8aDw8NykpKygodF51KSZoXnQpfDA7Yj1iK3J8MDtyPSgobHxuKSZwfGwmbikrKChwPj4+MnxwPDwzMCleKHA+Pj4xM3xwPDwxOSleKHA+Pj4yMnxwPDwxMCkpK3J8MDt0PXQrMTUzNzAwMjA2MysoY1tmKzIxNj4+Ml18MCkrKChiPj4+NnxiPDwyNileKGI+Pj4xMXxiPDwyMSleKGI+Pj4yNXxiPDw3KSkrKCh1XmgpJmJedSl8MDtsPWwrdHwwO3Q9KChufHApJnJ8biZwKSsoKHI+Pj4yfHI8PDMwKV4ocj4+PjEzfHI8PDE5KV4ocj4+PjIyfHI8PDEwKSkrdHwwO3U9dSsxNzQ3ODczNzc5KyhjW2YrMjIwPj4yXXwwKSsoKGw+Pj42fGw8PDI2KV4obD4+PjExfGw8PDIxKV4obD4+PjI1fGw8PDcpKSsoKGheYikmbF5oKXwwO249bit1fDA7dT0oKHB8cikmdHxwJnIpKygodD4+PjJ8dDw8MzApXih0Pj4+MTN8dDw8MTkpXih0Pj4+MjJ8dDw8MTApKSt1fDA7aD1oKzE5NTU1NjIyMjIrKGNbZisyMjQ+PjJdfDApKygobj4+PjZ8bjw8MjYpXihuPj4+MTF8bjw8MjEpXihuPj4+MjV8bjw8NykpKygoYl5sKSZuXmIpfDA7cD1wK2h8MDtoPSgocnx0KSZ1fHImdCkrKCh1Pj4+Mnx1PDwzMCleKHU+Pj4xM3x1PDwxOSleKHU+Pj4yMnx1PDwxMCkpK2h8MDtiPWIrMjAyNDEwNDgxNSsoY1tmKzIyOD4+Ml18MCkrKChwPj4+NnxwPDwyNileKHA+Pj4xMXxwPDwyMSleKHA+Pj4yNXxwPDw3KSkrKChsXm4pJnBebCl8MDtyPXIrYnwwO2I9KCh0fHUpJmh8dCZ1KSsoKGg+Pj4yfGg8PDMwKV4oaD4+PjEzfGg8PDE5KV4oaD4+PjIyfGg8PDEwKSkrYnwwO2w9bCstMjA2NzIzNjg0NCsoY1tmKzIzMj4+Ml18MCkrKChyPj4+NnxyPDwyNileKHI+Pj4xMXxyPDwyMSleKHI+Pj4yNXxyPDw3KSkrKChuXnApJnJebil8MDt0PXQrbHwwO2w9KCh1fGgpJmJ8dSZoKSsoKGI+Pj4yfGI8PDMwKV4oYj4+PjEzfGI8PDE5KV4oYj4+PjIyfGI8PDEwKSkrbHwwO249bistMTkzMzExNDg3MisoY1tmKzIzNj4+Ml18MCkrKCh0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KSkrKChwXnIpJnRecCl8MDt1PXUrbnwwO249KChofGIpJmx8aCZiKSsoKGw+Pj4yfGw8PDMwKV4obD4+PjEzfGw8PDE5KV4obD4+PjIyfGw8PDEwKSkrbnwwO3A9cCstMTg2NjUzMDgyMisoY1tmKzI0MD4+Ml18MCkrKCh1Pj4+Nnx1PDwyNileKHU+Pj4xMXx1PDwyMSleKHU+Pj4yNXx1PDw3KSkrKChyXnQpJnVecil8MDtoPWgrcHwwO3A9KChifGwpJm58YiZsKSsoKG4+Pj4yfG48PDMwKV4obj4+PjEzfG48PDE5KV4obj4+PjIyfG48PDEwKSkrcHwwO3I9cistMTUzODIzMzEwOSsoY1tmKzI0ND4+Ml18MCkrKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKCh0XnUpJmhedCl8MDtiPWIrcnwwO3I9KChsfG4pJnB8bCZuKSsoKHA+Pj4yfHA8PDMwKV4ocD4+PjEzfHA8PDE5KV4ocD4+PjIyfHA8PDEwKSkrcnwwO3Q9dCstMTA5MDkzNTgxNysoY1tmKzI0OD4+Ml18MCkrKChiPj4+NnxiPDwyNileKGI+Pj4xMXxiPDwyMSleKGI+Pj4yNXxiPDw3KSkrKCh1XmgpJmJedSl8MDtsPWwrdHwwO3Q9KChufHApJnJ8biZwKSsoKHI+Pj4yfHI8PDMwKV4ocj4+PjEzfHI8PDE5KV4ocj4+PjIyfHI8PDEwKSkrdHwwO2Y9dSstOTY1NjQxOTk4KyhjW2YrMjUyPj4yXXwwKSsoKGw+Pj42fGw8PDI2KV4obD4+PjExfGw8PDIxKV4obD4+PjI1fGw8PDcpKSsoKGheYikmbF5oKXwwO2NbYT4+Ml09KGNbYT4+Ml18MCkrKCgocHxyKSZ0fHAmcikrKCh0Pj4+Mnx0PDwzMCleKHQ+Pj4xM3x0PDwxOSleKHQ+Pj4yMnx0PDwxMCkpK2YpO2Nbcz4+Ml09KGNbcz4+Ml18MCkrdDtjW3E+PjJdPShjW3E+PjJdfDApK3I7Y1tvPj4yXT0oY1tvPj4yXXwwKStwO2NbbT4+Ml09KGNbbT4+Ml18MCkrKG4rZik7Y1trPj4yXT0oY1trPj4yXXwwKStsO2NbZT4+Ml09KGNbZT4+Ml18MCkrYjtjW2o+PjJdPShjW2o+PjJdfDApK2g7aT1nO3JldHVybn1mdW5jdGlvbiBGYihhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaT0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wO2o9YSs3MnwwO209ajtvPWNbbT4+Ml18MDttPWNbbSs0Pj4yXXwwO2s9R2Qob3wwLG18MCwzKXwwO2s9ayYxMjc7bD1IZChkfDAsZXwwLDMpfDA7bj1DO2g9R2QoZHwwLGV8MCw2MSl8MDtpPUM7bT1EZChvfDAsbXwwLGx8MCxufDApfDA7bz1DO2Nbaj4+Ml09bTtjW2orND4+Ml09bztqPWErNjR8MDtnPWo7Zj1jW2c+PjJdfDA7Zz1jW2crND4+Ml18MDtpZihvPj4+MDxuPj4+MHwob3wwKT09KG58MCkmbT4+PjA8bD4+PjApe2Y9RGQoZnwwLGd8MCwxLDApfDA7Zz1DO289ajtjW28+PjJdPWY7Y1tvKzQ+PjJdPWd9aD1EZChmfDAsZ3wwLGh8MCxpfDApfDA7Zz1qO2NbZz4+Ml09aDtjW2crND4+Ml09QztnPUNkKDEyOCwwLGt8MCwwKXwwO2g9QztmPWErODAra3wwO2lmKGg+Pj4wPmU+Pj4wfChofDApPT0oZXwwKSZnPj4+MD5kPj4+MCl7SWQoZnwwLGJ8MCxkfDApfDA7cmV0dXJufUlkKGZ8MCxifDAsZ3wwKXwwO2k9YSs4MHwwO0hiKGEsaSk7Zj1iK2d8MDtnPUNkKGR8MCxlfDAsZ3wwLGh8MCl8MDtoPUM7aWYoaD4+PjA+MHwoaHwwKT09MCZnPj4+MD4xMjcpZG97SGIoYSxmKTtmPWYrMTI4fDA7Zz1EZChnfDAsaHwwLC0xMjgsLTEpfDA7aD1DfXdoaWxlKGg+Pj4wPjB8KGh8MCk9PTAmZz4+PjA+MTI3KTtJZChpfDAsZnwwLGd8MCl8MDtyZXR1cm59ZnVuY3Rpb24gR2IoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO3M9aTtlPWk9aSs2MyYtNjQ7aT1pKzE2fDA7cj1iKzY0fDA7Zj1yO2c9Y1tmPj4yXXwwO2Y9Y1tmKzQ+PjJdfDA7YVtlKzc+PjBdPWc7cT1HZChnfDAsZnwwLDgpfDA7YVtlKzY+PjBdPXE7cT1HZChnfDAsZnwwLDE2KXwwO2FbZSs1Pj4wXT1xO3E9R2QoZ3wwLGZ8MCwyNCl8MDthW2UrND4+MF09cTthW2UrMz4+MF09ZjtxPUdkKGd8MCxmfDAsNDApfDA7YVtlKzI+PjBdPXE7cT1HZChnfDAsZnwwLDQ4KXwwO2FbZSsxPj4wXT1xO3E9R2QoZ3wwLGZ8MCw1Nil8MDthW2U+PjBdPXE7cT1iKzcyfDA7aj1xO2g9Y1tqPj4yXXwwO2o9Y1tqKzQ+PjJdfDA7YVtlKzE1Pj4wXT1oO249R2QoaHwwLGp8MCw4KXwwO2FbZSsxND4+MF09bjtuPUdkKGh8MCxqfDAsMTYpfDA7YVtlKzEzPj4wXT1uO249R2QoaHwwLGp8MCwyNCl8MDthW2UrMTI+PjBdPW47YVtlKzExPj4wXT1qO249R2QoaHwwLGp8MCw0MCl8MDthW2UrMTA+PjBdPW47bj1HZChofDAsanwwLDQ4KXwwO2FbZSs5Pj4wXT1uO249R2QoaHwwLGp8MCw1Nil8MDthW2UrOD4+MF09bjtuPUdkKGh8MCxqfDAsMyl8MDtuPW4mMTI3O289MDwwfDA9PTAmbj4+PjA8MTEyO289Q2QoKG8/MTEyOjI0MCl8MCwobz8wOjApfDAsbnwwLDApfDA7cD1DO209SGQob3wwLHB8MCwzKXwwO3Q9QztrPUdkKG98MCxwfDAsNjEpfDA7bD1DO2o9RGQobXwwLHR8MCxofDAsanwwKXwwO2g9Qzt1PXE7Y1t1Pj4yXT1qO2NbdSs0Pj4yXT1oO2lmKGg+Pj4wPHQ+Pj4wfChofDApPT0odHwwKSZqPj4+MDxtPj4+MCl7Zz1EZChnfDAsZnwwLDEsMCl8MDtmPUM7dT1yO2NbdT4+Ml09ZztjW3UrND4+Ml09Zn1nPURkKGd8MCxmfDAsa3wwLGx8MCl8MDtmPUM7bD1yO2NbbD4+Ml09ZztjW2wrND4+Ml09ZjtsPUNkKDEyOCwwLG58MCwwKXwwO209QztrPWIrODArbnwwO2lmKHA+Pj4wPG0+Pj4wfChwfDApPT0obXwwKSZvPj4+MDxsPj4+MClJZChrfDAsMzI4NTYsb3wwKXwwO2Vsc2V7SWQoa3wwLDMyODU2LGx8MCl8MDtqPWIrODB8MDtIYihiLGopO2Y9MzI4NTYrbHwwO2c9Q2Qob3wwLHB8MCxsfDAsbXwwKXwwO2g9QztpZihoPj4+MD4wfChofDApPT0wJmc+Pj4wPjEyNylkb3tIYihiLGYpO2Y9ZisxMjh8MDtnPURkKGd8MCxofDAsLTEyOCwtMSl8MDtoPUN9d2hpbGUoaD4+PjA+MHwoaHwwKT09MCZnPj4+MD4xMjcpO0lkKGp8MCxmfDAsZ3wwKXwwO2g9cTtmPXI7aj1jW2g+PjJdfDA7aD1jW2grND4+Ml18MDtnPWNbZj4+Ml18MDtmPWNbZis0Pj4yXXwwfWs9R2QoanwwLGh8MCwzKXwwO2s9ayYxMjc7dD1EZChqfDAsaHwwLDEyOCwwKXwwO3U9cTtjW3U+PjJdPXQ7Y1t1KzQ+PjJdPUM7aWYoaD4+PjA+NDI5NDk2NzI5NXwoaHwwKT09LTEmaj4+PjA+NDI5NDk2NzE2Nyl7Zz1EZChnfDAsZnwwLDEsMCl8MDtmPUM7dT1yO2NbdT4+Ml09ZztjW3UrND4+Ml09Zn1oPXI7Y1toPj4yXT1nO2NbaCs0Pj4yXT1mO2c9Q2QoMTI4LDAsa3wwLDApfDA7aD1DO2Y9Yis4MCtrfDA7aWYoaD4+PjA+MHwoaHwwKT09MCZnPj4+MD4xNil7Zz1mO2Y9ZysxNnwwO2Rve2FbZz4+MF09YVtlPj4wXXwwO2c9ZysxfDA7ZT1lKzF8MH13aGlsZSgoZ3wwKTwoZnwwKSl9ZWxzZXtJZChmfDAsZXwwLGd8MCl8MDtqPWIrODB8MDtIYihiLGopO2U9ZStnfDA7Zj1DZCgxNiwwLGd8MCxofDApfDA7Zz1DO2lmKGc+Pj4wPjB8KGd8MCk9PTAmZj4+PjA+MTI3KWRve0hiKGIsZSk7ZT1lKzEyOHwwO2Y9RGQoZnwwLGd8MCwtMTI4LC0xKXwwO2c9Q313aGlsZShnPj4+MD4wfChnfDApPT0wJmY+Pj4wPjEyNyk7SWQoanwwLGV8MCxmfDApfDB9ZT0wO2Rve3U9ZCsoZTw8Myl8MDt0PWIrKGU8PDMpfDA7cj1jW3Q+PjJdfDA7dD1jW3QrND4+Ml18MDthW3UrNz4+MF09cjtxPUdkKHJ8MCx0fDAsOCl8MDthW3UrNj4+MF09cTtxPUdkKHJ8MCx0fDAsMTYpfDA7YVt1KzU+PjBdPXE7cT1HZChyfDAsdHwwLDI0KXwwO2FbdSs0Pj4wXT1xO2FbdSszPj4wXT10O3E9R2QocnwwLHR8MCw0MCl8MDthW3UrMj4+MF09cTtxPUdkKHJ8MCx0fDAsNDgpfDA7YVt1KzE+PjBdPXE7dD1HZChyfDAsdHwwLDU2KXwwO2FbdT4+MF09dDtlPWUrMXwwfXdoaWxlKChlfDApIT04KTtGZChifDAsMCwyMDgpfDA7aT1zO3JldHVybn1cbmZ1bmN0aW9uIHlkKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTA7ZG8gaWYoYT4+PjA8MjQ1KXtvPWE+Pj4wPDExPzE2OmErMTEmLTg7YT1vPj4+MztqPWNbODAyMF18MDtiPWo+Pj5hO2lmKGImMyl7Yj0oYiYxXjEpK2F8MDtkPTMyMTIwKyhiPDwxPDwyKXwwO2U9ZCs4fDA7Zj1jW2U+PjJdfDA7Zz1mKzh8MDtoPWNbZz4+Ml18MDtkbyBpZigoZHwwKSE9KGh8MCkpe2lmKGg+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2E9aCsxMnwwO2lmKChjW2E+PjJdfDApPT0oZnwwKSl7Y1thPj4yXT1kO2NbZT4+Ml09aDticmVha31lbHNlIHJhKCl9ZWxzZSBjWzgwMjBdPWomfigxPDxiKTt3aGlsZSgwKTtHPWI8PDM7Y1tmKzQ+PjJdPUd8MztHPWYrRys0fDA7Y1tHPj4yXT1jW0c+PjJdfDE7Rz1nO3JldHVybiBHfDB9aD1jWzgwMjJdfDA7aWYobz4+PjA+aD4+PjApe2lmKGIpe2Q9Mjw8YTtkPWI8PGEmKGR8MC1kKTtkPShkJjAtZCkrLTF8MDtpPWQ+Pj4xMiYxNjtkPWQ+Pj5pO2Y9ZD4+PjUmODtkPWQ+Pj5mO2c9ZD4+PjImNDtkPWQ+Pj5nO2U9ZD4+PjEmMjtkPWQ+Pj5lO2I9ZD4+PjEmMTtiPShmfGl8Z3xlfGIpKyhkPj4+Yil8MDtkPTMyMTIwKyhiPDwxPDwyKXwwO2U9ZCs4fDA7Zz1jW2U+PjJdfDA7aT1nKzh8MDtmPWNbaT4+Ml18MDtkbyBpZigoZHwwKSE9KGZ8MCkpe2lmKGY+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2E9ZisxMnwwO2lmKChjW2E+PjJdfDApPT0oZ3wwKSl7Y1thPj4yXT1kO2NbZT4+Ml09ZjtrPWNbODAyMl18MDticmVha31lbHNlIHJhKCl9ZWxzZXtjWzgwMjBdPWomfigxPDxiKTtrPWh9d2hpbGUoMCk7aD0oYjw8Myktb3wwO2NbZys0Pj4yXT1vfDM7ZT1nK298MDtjW2UrND4+Ml09aHwxO2NbZStoPj4yXT1oO2lmKGspe2Y9Y1s4MDI1XXwwO2I9az4+PjM7ZD0zMjEyMCsoYjw8MTw8Mil8MDthPWNbODAyMF18MDtiPTE8PGI7aWYoYSZiKXthPWQrOHwwO2I9Y1thPj4yXXwwO2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7bD1hO209Yn19ZWxzZXtjWzgwMjBdPWF8YjtsPWQrOHwwO209ZH1jW2w+PjJdPWY7Y1ttKzEyPj4yXT1mO2NbZis4Pj4yXT1tO2NbZisxMj4+Ml09ZH1jWzgwMjJdPWg7Y1s4MDI1XT1lO0c9aTtyZXR1cm4gR3wwfWE9Y1s4MDIxXXwwO2lmKGEpe2k9KGEmMC1hKSstMXwwO0Y9aT4+PjEyJjE2O2k9aT4+PkY7RT1pPj4+NSY4O2k9aT4+PkU7Rz1pPj4+MiY0O2k9aT4+Pkc7Yj1pPj4+MSYyO2k9aT4+PmI7aj1pPj4+MSYxO2o9Y1szMjM4NCsoKEV8RnxHfGJ8aikrKGk+Pj5qKTw8Mik+PjJdfDA7aT0oY1tqKzQ+PjJdJi04KS1vfDA7Yj1qO3doaWxlKDEpe2E9Y1tiKzE2Pj4yXXwwO2lmKCFhKXthPWNbYisyMD4+Ml18MDtpZighYSlicmVha31iPShjW2ErND4+Ml0mLTgpLW98MDtHPWI+Pj4wPGk+Pj4wO2k9Rz9iOmk7Yj1hO2o9Rz9hOmp9Zj1jWzgwMjRdfDA7aWYoaj4+PjA8Zj4+PjApcmEoKTtoPWorb3wwO2lmKGo+Pj4wPj1oPj4+MClyYSgpO2c9Y1tqKzI0Pj4yXXwwO2Q9Y1tqKzEyPj4yXXwwO2RvIGlmKChkfDApPT0oanwwKSl7Yj1qKzIwfDA7YT1jW2I+PjJdfDA7aWYoIWEpe2I9aisxNnwwO2E9Y1tiPj4yXXwwO2lmKCFhKXtuPTA7YnJlYWt9fXdoaWxlKDEpe2Q9YSsyMHwwO2U9Y1tkPj4yXXwwO2lmKGUpe2E9ZTtiPWQ7Y29udGludWV9ZD1hKzE2fDA7ZT1jW2Q+PjJdfDA7aWYoIWUpYnJlYWs7ZWxzZXthPWU7Yj1kfX1pZihiPj4+MDxmPj4+MClyYSgpO2Vsc2V7Y1tiPj4yXT0wO249YTticmVha319ZWxzZXtlPWNbais4Pj4yXXwwO2lmKGU+Pj4wPGY+Pj4wKXJhKCk7YT1lKzEyfDA7aWYoKGNbYT4+Ml18MCkhPShqfDApKXJhKCk7Yj1kKzh8MDtpZigoY1tiPj4yXXwwKT09KGp8MCkpe2NbYT4+Ml09ZDtjW2I+PjJdPWU7bj1kO2JyZWFrfWVsc2UgcmEoKX13aGlsZSgwKTtkbyBpZihnKXthPWNbaisyOD4+Ml18MDtiPTMyMzg0KyhhPDwyKXwwO2lmKChqfDApPT0oY1tiPj4yXXwwKSl7Y1tiPj4yXT1uO2lmKCFuKXtjWzgwMjFdPWNbODAyMV0mfigxPDxhKTticmVha319ZWxzZXtpZihnPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTthPWcrMTZ8MDtpZigoY1thPj4yXXwwKT09KGp8MCkpY1thPj4yXT1uO2Vsc2UgY1tnKzIwPj4yXT1uO2lmKCFuKWJyZWFrfWI9Y1s4MDI0XXwwO2lmKG4+Pj4wPGI+Pj4wKXJhKCk7Y1tuKzI0Pj4yXT1nO2E9Y1tqKzE2Pj4yXXwwO2RvIGlmKGEpaWYoYT4+PjA8Yj4+PjApcmEoKTtlbHNle2NbbisxNj4+Ml09YTtjW2ErMjQ+PjJdPW47YnJlYWt9d2hpbGUoMCk7YT1jW2orMjA+PjJdfDA7aWYoYSlpZihhPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle2NbbisyMD4+Ml09YTtjW2ErMjQ+PjJdPW47YnJlYWt9fXdoaWxlKDApO2lmKGk+Pj4wPDE2KXtHPWkrb3wwO2Nbais0Pj4yXT1HfDM7Rz1qK0crNHwwO2NbRz4+Ml09Y1tHPj4yXXwxfWVsc2V7Y1tqKzQ+PjJdPW98MztjW2grND4+Ml09aXwxO2NbaCtpPj4yXT1pO2E9Y1s4MDIyXXwwO2lmKGEpe2U9Y1s4MDI1XXwwO2I9YT4+PjM7ZD0zMjEyMCsoYjw8MTw8Mil8MDthPWNbODAyMF18MDtiPTE8PGI7aWYoYSZiKXthPWQrOHwwO2I9Y1thPj4yXXwwO2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7cD1hO3E9Yn19ZWxzZXtjWzgwMjBdPWF8YjtwPWQrOHwwO3E9ZH1jW3A+PjJdPWU7Y1txKzEyPj4yXT1lO2NbZSs4Pj4yXT1xO2NbZSsxMj4+Ml09ZH1jWzgwMjJdPWk7Y1s4MDI1XT1ofUc9ais4fDA7cmV0dXJuIEd8MH19fWVsc2UgaWYoYT4+PjA8PTQyOTQ5NjcyMzEpe2E9YSsxMXwwO289YSYtODtrPWNbODAyMV18MDtpZihrKXtkPTAtb3wwO2E9YT4+Pjg7aWYoYSlpZihvPj4+MD4xNjc3NzIxNSlqPTMxO2Vsc2V7cT0oYSsxMDQ4MzIwfDApPj4+MTYmODt6PWE8PHE7cD0oeis1MjAxOTJ8MCk+Pj4xNiY0O3o9ejw8cDtqPSh6KzI0NTc2MHwwKT4+PjE2JjI7aj0xNC0ocHxxfGopKyh6PDxqPj4+MTUpfDA7aj1vPj4+KGorN3wwKSYxfGo8PDF9ZWxzZSBqPTA7Yj1jWzMyMzg0KyhqPDwyKT4+Ml18MDthOmRvIGlmKCFiKXthPTA7Yj0wO3o9ODZ9ZWxzZXtmPWQ7YT0wO2g9bzw8KChqfDApPT0zMT8wOjI1LShqPj4+MSl8MCk7aT1iO2I9MDt3aGlsZSgxKXtlPWNbaSs0Pj4yXSYtODtkPWUtb3wwO2lmKGQ+Pj4wPGY+Pj4wKWlmKChlfDApPT0ob3wwKSl7YT1pO2I9aTt6PTkwO2JyZWFrIGF9ZWxzZSBiPWk7ZWxzZSBkPWY7ZT1jW2krMjA+PjJdfDA7aT1jW2krMTYrKGg+Pj4zMTw8Mik+PjJdfDA7YT0oZXwwKT09MHwoZXwwKT09KGl8MCk/YTplO2U9KGl8MCk9PTA7aWYoZSl7ej04NjticmVha31lbHNle2Y9ZDtoPWg8PChlJjFeMSl9fX13aGlsZSgwKTtpZigoenwwKT09ODYpe2lmKChhfDApPT0wJihifDApPT0wKXthPTI8PGo7YT1rJihhfDAtYSk7aWYoIWEpYnJlYWs7cT0oYSYwLWEpKy0xfDA7bT1xPj4+MTImMTY7cT1xPj4+bTtsPXE+Pj41Jjg7cT1xPj4+bDtuPXE+Pj4yJjQ7cT1xPj4+bjtwPXE+Pj4xJjI7cT1xPj4+cDthPXE+Pj4xJjE7YT1jWzMyMzg0KygobHxtfG58cHxhKSsocT4+PmEpPDwyKT4+Ml18MH1pZighYSl7aT1kO2o9Yn1lbHNlIHo9OTB9aWYoKHp8MCk9PTkwKXdoaWxlKDEpe3o9MDtxPShjW2ErND4+Ml0mLTgpLW98MDtlPXE+Pj4wPGQ+Pj4wO2Q9ZT9xOmQ7Yj1lP2E6YjtlPWNbYSsxNj4+Ml18MDtpZihlKXthPWU7ej05MDtjb250aW51ZX1hPWNbYSsyMD4+Ml18MDtpZighYSl7aT1kO2o9YjticmVha31lbHNlIHo9OTB9aWYoKGp8MCkhPTA/aT4+PjA8KChjWzgwMjJdfDApLW98MCk+Pj4wOjApe2Y9Y1s4MDI0XXwwO2lmKGo+Pj4wPGY+Pj4wKXJhKCk7aD1qK298MDtpZihqPj4+MD49aD4+PjApcmEoKTtnPWNbaisyND4+Ml18MDtkPWNbaisxMj4+Ml18MDtkbyBpZigoZHwwKT09KGp8MCkpe2I9aisyMHwwO2E9Y1tiPj4yXXwwO2lmKCFhKXtiPWorMTZ8MDthPWNbYj4+Ml18MDtpZighYSl7cz0wO2JyZWFrfX13aGlsZSgxKXtkPWErMjB8MDtlPWNbZD4+Ml18MDtpZihlKXthPWU7Yj1kO2NvbnRpbnVlfWQ9YSsxNnwwO2U9Y1tkPj4yXXwwO2lmKCFlKWJyZWFrO2Vsc2V7YT1lO2I9ZH19aWYoYj4+PjA8Zj4+PjApcmEoKTtlbHNle2NbYj4+Ml09MDtzPWE7YnJlYWt9fWVsc2V7ZT1jW2orOD4+Ml18MDtpZihlPj4+MDxmPj4+MClyYSgpO2E9ZSsxMnwwO2lmKChjW2E+PjJdfDApIT0oanwwKSlyYSgpO2I9ZCs4fDA7aWYoKGNbYj4+Ml18MCk9PShqfDApKXtjW2E+PjJdPWQ7Y1tiPj4yXT1lO3M9ZDticmVha31lbHNlIHJhKCl9d2hpbGUoMCk7ZG8gaWYoZyl7YT1jW2orMjg+PjJdfDA7Yj0zMjM4NCsoYTw8Mil8MDtpZigoanwwKT09KGNbYj4+Ml18MCkpe2NbYj4+Ml09cztpZighcyl7Y1s4MDIxXT1jWzgwMjFdJn4oMTw8YSk7YnJlYWt9fWVsc2V7aWYoZz4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7YT1nKzE2fDA7aWYoKGNbYT4+Ml18MCk9PShqfDApKWNbYT4+Ml09cztlbHNlIGNbZysyMD4+Ml09cztpZighcylicmVha31iPWNbODAyNF18MDtpZihzPj4+MDxiPj4+MClyYSgpO2NbcysyND4+Ml09ZzthPWNbaisxNj4+Ml18MDtkbyBpZihhKWlmKGE+Pj4wPGI+Pj4wKXJhKCk7ZWxzZXtjW3MrMTY+PjJdPWE7Y1thKzI0Pj4yXT1zO2JyZWFrfXdoaWxlKDApO2E9Y1tqKzIwPj4yXXwwO2lmKGEpaWYoYT4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZWxzZXtjW3MrMjA+PjJdPWE7Y1thKzI0Pj4yXT1zO2JyZWFrfX13aGlsZSgwKTtkbyBpZihpPj4+MD49MTYpe2Nbais0Pj4yXT1vfDM7Y1toKzQ+PjJdPWl8MTtjW2graT4+Ml09aTthPWk+Pj4zO2lmKGk+Pj4wPDI1Nil7ZD0zMjEyMCsoYTw8MTw8Mil8MDtiPWNbODAyMF18MDthPTE8PGE7aWYoYiZhKXthPWQrOHwwO2I9Y1thPj4yXXwwO2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7dD1hO3Y9Yn19ZWxzZXtjWzgwMjBdPWJ8YTt0PWQrOHwwO3Y9ZH1jW3Q+PjJdPWg7Y1t2KzEyPj4yXT1oO2NbaCs4Pj4yXT12O2NbaCsxMj4+Ml09ZDticmVha31hPWk+Pj44O2lmKGEpaWYoaT4+PjA+MTY3NzcyMTUpZD0zMTtlbHNle0Y9KGErMTA0ODMyMHwwKT4+PjE2Jjg7Rz1hPDxGO0U9KEcrNTIwMTkyfDApPj4+MTYmNDtHPUc8PEU7ZD0oRysyNDU3NjB8MCk+Pj4xNiYyO2Q9MTQtKEV8RnxkKSsoRzw8ZD4+PjE1KXwwO2Q9aT4+PihkKzd8MCkmMXxkPDwxfWVsc2UgZD0wO2U9MzIzODQrKGQ8PDIpfDA7Y1toKzI4Pj4yXT1kO2E9aCsxNnwwO2NbYSs0Pj4yXT0wO2NbYT4+Ml09MDthPWNbODAyMV18MDtiPTE8PGQ7aWYoIShhJmIpKXtjWzgwMjFdPWF8YjtjW2U+PjJdPWg7Y1toKzI0Pj4yXT1lO2NbaCsxMj4+Ml09aDtjW2grOD4+Ml09aDticmVha31kPWk8PCgoZHwwKT09MzE/MDoyNS0oZD4+PjEpfDApO2U9Y1tlPj4yXXwwO3doaWxlKDEpe2lmKChjW2UrND4+Ml0mLTh8MCk9PShpfDApKXt6PTE0ODticmVha31iPWUrMTYrKGQ+Pj4zMTw8Mil8MDthPWNbYj4+Ml18MDtpZighYSl7ej0xNDU7YnJlYWt9ZWxzZXtkPWQ8PDE7ZT1hfX1pZigoenwwKT09MTQ1KWlmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7Y1tiPj4yXT1oO2NbaCsyND4+Ml09ZTtjW2grMTI+PjJdPWg7Y1toKzg+PjJdPWg7YnJlYWt9ZWxzZSBpZigoenwwKT09MTQ4KXthPWUrOHwwO2I9Y1thPj4yXXwwO0c9Y1s4MDI0XXwwO2lmKGI+Pj4wPj1HPj4+MCZlPj4+MD49Rz4+PjApe2NbYisxMj4+Ml09aDtjW2E+PjJdPWg7Y1toKzg+PjJdPWI7Y1toKzEyPj4yXT1lO2NbaCsyND4+Ml09MDticmVha31lbHNlIHJhKCl9fWVsc2V7Rz1pK298MDtjW2orND4+Ml09R3wzO0c9aitHKzR8MDtjW0c+PjJdPWNbRz4+Ml18MX13aGlsZSgwKTtHPWorOHwwO3JldHVybiBHfDB9fX1lbHNlIG89LTE7d2hpbGUoMCk7ZD1jWzgwMjJdfDA7aWYoZD4+PjA+PW8+Pj4wKXthPWQtb3wwO2I9Y1s4MDI1XXwwO2lmKGE+Pj4wPjE1KXtHPWIrb3wwO2NbODAyNV09RztjWzgwMjJdPWE7Y1tHKzQ+PjJdPWF8MTtjW0crYT4+Ml09YTtjW2IrND4+Ml09b3wzfWVsc2V7Y1s4MDIyXT0wO2NbODAyNV09MDtjW2IrND4+Ml09ZHwzO0c9YitkKzR8MDtjW0c+PjJdPWNbRz4+Ml18MX1HPWIrOHwwO3JldHVybiBHfDB9YT1jWzgwMjNdfDA7aWYoYT4+PjA+bz4+PjApe0U9YS1vfDA7Y1s4MDIzXT1FO0c9Y1s4MDI2XXwwO0Y9RytvfDA7Y1s4MDI2XT1GO2NbRis0Pj4yXT1FfDE7Y1tHKzQ+PjJdPW98MztHPUcrOHwwO3JldHVybiBHfDB9ZG8gaWYoIShjWzgxMzhdfDApKXthPW5hKDMwKXwwO2lmKCEoYSstMSZhKSl7Y1s4MTQwXT1hO2NbODEzOV09YTtjWzgxNDFdPS0xO2NbODE0Ml09LTE7Y1s4MTQzXT0wO2NbODEzMV09MDtjWzgxMzhdPSh0YSgwKXwwKSYtMTZeMTQzMTY1NTc2ODticmVha31lbHNlIHJhKCl9d2hpbGUoMCk7aD1vKzQ4fDA7ZT1jWzgxNDBdfDA7aT1vKzQ3fDA7ZD1lK2l8MDtlPTAtZXwwO2o9ZCZlO2lmKGo+Pj4wPD1vPj4+MCl7Rz0wO3JldHVybiBHfDB9YT1jWzgxMzBdfDA7aWYoKGF8MCkhPTA/KHQ9Y1s4MTI4XXwwLHY9dCtqfDAsdj4+PjA8PXQ+Pj4wfHY+Pj4wPmE+Pj4wKTowKXtHPTA7cmV0dXJuIEd8MH1iOmRvIGlmKCEoY1s4MTMxXSY0KSl7Yj1jWzgwMjZdfDA7YzpkbyBpZihiKXtmPTMyNTI4O3doaWxlKDEpe2E9Y1tmPj4yXXwwO2lmKGE+Pj4wPD1iPj4+MD8ocj1mKzR8MCwoYSsoY1tyPj4yXXwwKXwwKT4+PjA+Yj4+PjApOjApYnJlYWs7YT1jW2YrOD4+Ml18MDtpZighYSl7ej0xNzM7YnJlYWsgY31lbHNlIGY9YX1hPWQtKGNbODAyM118MCkmZTtpZihhPj4+MDwyMTQ3NDgzNjQ3KXtiPXNhKGF8MCl8MDtpZigoYnwwKT09KChjW2Y+PjJdfDApKyhjW3I+PjJdfDApfDApKXtpZigoYnwwKSE9KC0xfDApKXtoPWI7Zz1hO3o9MTkzO2JyZWFrIGJ9fWVsc2Ugej0xODN9fWVsc2Ugej0xNzM7d2hpbGUoMCk7ZG8gaWYoKHp8MCk9PTE3Mz8odT1zYSgwKXwwLCh1fDApIT0oLTF8MCkpOjApe2E9dTtiPWNbODEzOV18MDtkPWIrLTF8MDtpZighKGQmYSkpYT1qO2Vsc2UgYT1qLWErKGQrYSYwLWIpfDA7Yj1jWzgxMjhdfDA7ZD1iK2F8MDtpZihhPj4+MD5vPj4+MCZhPj4+MDwyMTQ3NDgzNjQ3KXt2PWNbODEzMF18MDtpZigodnwwKSE9MD9kPj4+MDw9Yj4+PjB8ZD4+PjA+dj4+PjA6MClicmVhaztiPXNhKGF8MCl8MDtpZigoYnwwKT09KHV8MCkpe2g9dTtnPWE7ej0xOTM7YnJlYWsgYn1lbHNlIHo9MTgzfX13aGlsZSgwKTtkOmRvIGlmKCh6fDApPT0xODMpe2Q9MC1hfDA7ZG8gaWYoaD4+PjA+YT4+PjAmKGE+Pj4wPDIxNDc0ODM2NDcmKGJ8MCkhPSgtMXwwKSk/KHc9Y1s4MTQwXXwwLHc9aS1hK3cmMC13LHc+Pj4wPDIxNDc0ODM2NDcpOjApaWYoKHNhKHd8MCl8MCk9PSgtMXwwKSl7c2EoZHwwKXwwO2JyZWFrIGR9ZWxzZXthPXcrYXwwO2JyZWFrfXdoaWxlKDApO2lmKChifDApIT0oLTF8MCkpe2g9YjtnPWE7ej0xOTM7YnJlYWsgYn19d2hpbGUoMCk7Y1s4MTMxXT1jWzgxMzFdfDQ7ej0xOTB9ZWxzZSB6PTE5MDt3aGlsZSgwKTtpZigoKCh6fDApPT0xOTA/aj4+PjA8MjE0NzQ4MzY0NzowKT8oeD1zYShqfDApfDAseT1zYSgwKXwwLHg+Pj4wPHk+Pj4wJigoeHwwKSE9KC0xfDApJih5fDApIT0oLTF8MCkpKTowKT8oZz15LXh8MCxnPj4+MD4obys0MHwwKT4+PjApOjApe2g9eDt6PTE5M31pZigoenwwKT09MTkzKXthPShjWzgxMjhdfDApK2d8MDtjWzgxMjhdPWE7aWYoYT4+PjA+KGNbODEyOV18MCk+Pj4wKWNbODEyOV09YTtrPWNbODAyNl18MDtkbyBpZihrKXtmPTMyNTI4O3doaWxlKDEpe2E9Y1tmPj4yXXwwO2I9Zis0fDA7ZD1jW2I+PjJdfDA7aWYoKGh8MCk9PShhK2R8MCkpe3o9MjAzO2JyZWFrfWU9Y1tmKzg+PjJdfDA7aWYoIWUpYnJlYWs7ZWxzZSBmPWV9aWYoKCh6fDApPT0yMDM/KGNbZisxMj4+Ml0mOHwwKT09MDowKT9rPj4+MDxoPj4+MCZrPj4+MD49YT4+PjA6MCl7Y1tiPj4yXT1kK2c7Rz1rKzh8MDtHPShHJjd8MCk9PTA/MDowLUcmNztGPWsrR3wwO0c9Zy1HKyhjWzgwMjNdfDApfDA7Y1s4MDI2XT1GO2NbODAyM109RztjW0YrND4+Ml09R3wxO2NbRitHKzQ+PjJdPTQwO2NbODAyN109Y1s4MTQyXTticmVha31hPWNbODAyNF18MDtpZihoPj4+MDxhPj4+MCl7Y1s4MDI0XT1oO2k9aH1lbHNlIGk9YTtiPWgrZ3wwO2E9MzI1Mjg7d2hpbGUoMSl7aWYoKGNbYT4+Ml18MCk9PShifDApKXt6PTIxMTticmVha31hPWNbYSs4Pj4yXXwwO2lmKCFhKXtiPTMyNTI4O2JyZWFrfX1pZigoenwwKT09MjExKWlmKCEoY1thKzEyPj4yXSY4KSl7Y1thPj4yXT1oO209YSs0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKStnO209aCs4fDA7bT1oKygobSY3fDApPT0wPzA6MC1tJjcpfDA7YT1iKzh8MDthPWIrKChhJjd8MCk9PTA/MDowLWEmNyl8MDtsPW0rb3wwO2o9YS1tLW98MDtjW20rND4+Ml09b3wzO2RvIGlmKChhfDApIT0oa3wwKSl7aWYoKGF8MCk9PShjWzgwMjVdfDApKXtHPShjWzgwMjJdfDApK2p8MDtjWzgwMjJdPUc7Y1s4MDI1XT1sO2NbbCs0Pj4yXT1HfDE7Y1tsK0c+PjJdPUc7YnJlYWt9Yj1jW2ErND4+Ml18MDtpZigoYiYzfDApPT0xKXtoPWImLTg7Zj1iPj4+MztlOmRvIGlmKGI+Pj4wPj0yNTYpe2c9Y1thKzI0Pj4yXXwwO2U9Y1thKzEyPj4yXXwwO2RvIGlmKChlfDApPT0oYXwwKSl7ZT1hKzE2fDA7ZD1lKzR8MDtiPWNbZD4+Ml18MDtpZighYil7Yj1jW2U+PjJdfDA7aWYoIWIpe0U9MDticmVha31lbHNlIGQ9ZX13aGlsZSgxKXtlPWIrMjB8MDtmPWNbZT4+Ml18MDtpZihmKXtiPWY7ZD1lO2NvbnRpbnVlfWU9YisxNnwwO2Y9Y1tlPj4yXXwwO2lmKCFmKWJyZWFrO2Vsc2V7Yj1mO2Q9ZX19aWYoZD4+PjA8aT4+PjApcmEoKTtlbHNle2NbZD4+Ml09MDtFPWI7YnJlYWt9fWVsc2V7Zj1jW2ErOD4+Ml18MDtpZihmPj4+MDxpPj4+MClyYSgpO2I9ZisxMnwwO2lmKChjW2I+PjJdfDApIT0oYXwwKSlyYSgpO2Q9ZSs4fDA7aWYoKGNbZD4+Ml18MCk9PShhfDApKXtjW2I+PjJdPWU7Y1tkPj4yXT1mO0U9ZTticmVha31lbHNlIHJhKCl9d2hpbGUoMCk7aWYoIWcpYnJlYWs7Yj1jW2ErMjg+PjJdfDA7ZD0zMjM4NCsoYjw8Mil8MDtkbyBpZigoYXwwKSE9KGNbZD4+Ml18MCkpe2lmKGc+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2I9ZysxNnwwO2lmKChjW2I+PjJdfDApPT0oYXwwKSljW2I+PjJdPUU7ZWxzZSBjW2crMjA+PjJdPUU7aWYoIUUpYnJlYWsgZX1lbHNle2NbZD4+Ml09RTtpZihFKWJyZWFrO2NbODAyMV09Y1s4MDIxXSZ+KDE8PGIpO2JyZWFrIGV9d2hpbGUoMCk7ZT1jWzgwMjRdfDA7aWYoRT4+PjA8ZT4+PjApcmEoKTtjW0UrMjQ+PjJdPWc7Yj1hKzE2fDA7ZD1jW2I+PjJdfDA7ZG8gaWYoZClpZihkPj4+MDxlPj4+MClyYSgpO2Vsc2V7Y1tFKzE2Pj4yXT1kO2NbZCsyND4+Ml09RTticmVha313aGlsZSgwKTtiPWNbYis0Pj4yXXwwO2lmKCFiKWJyZWFrO2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7Y1tFKzIwPj4yXT1iO2NbYisyND4+Ml09RTticmVha319ZWxzZXtkPWNbYSs4Pj4yXXwwO2U9Y1thKzEyPj4yXXwwO2I9MzIxMjArKGY8PDE8PDIpfDA7ZG8gaWYoKGR8MCkhPShifDApKXtpZihkPj4+MDxpPj4+MClyYSgpO2lmKChjW2QrMTI+PjJdfDApPT0oYXwwKSlicmVhaztyYSgpfXdoaWxlKDApO2lmKChlfDApPT0oZHwwKSl7Y1s4MDIwXT1jWzgwMjBdJn4oMTw8Zik7YnJlYWt9ZG8gaWYoKGV8MCk9PShifDApKUI9ZSs4fDA7ZWxzZXtpZihlPj4+MDxpPj4+MClyYSgpO2I9ZSs4fDA7aWYoKGNbYj4+Ml18MCk9PShhfDApKXtCPWI7YnJlYWt9cmEoKX13aGlsZSgwKTtjW2QrMTI+PjJdPWU7Y1tCPj4yXT1kfXdoaWxlKDApO2E9YStofDA7Zj1oK2p8MH1lbHNlIGY9ajthPWErNHwwO2NbYT4+Ml09Y1thPj4yXSYtMjtjW2wrND4+Ml09ZnwxO2NbbCtmPj4yXT1mO2E9Zj4+PjM7aWYoZj4+PjA8MjU2KXtkPTMyMTIwKyhhPDwxPDwyKXwwO2I9Y1s4MDIwXXwwO2E9MTw8YTtkbyBpZighKGImYSkpe2NbODAyMF09YnxhO0Y9ZCs4fDA7Rz1kfWVsc2V7YT1kKzh8MDtiPWNbYT4+Ml18MDtpZihiPj4+MD49KGNbODAyNF18MCk+Pj4wKXtGPWE7Rz1iO2JyZWFrfXJhKCl9d2hpbGUoMCk7Y1tGPj4yXT1sO2NbRysxMj4+Ml09bDtjW2wrOD4+Ml09RztjW2wrMTI+PjJdPWQ7YnJlYWt9YT1mPj4+ODtkbyBpZighYSlkPTA7ZWxzZXtpZihmPj4+MD4xNjc3NzIxNSl7ZD0zMTticmVha31GPShhKzEwNDgzMjB8MCk+Pj4xNiY4O0c9YTw8RjtFPShHKzUyMDE5MnwwKT4+PjE2JjQ7Rz1HPDxFO2Q9KEcrMjQ1NzYwfDApPj4+MTYmMjtkPTE0LShFfEZ8ZCkrKEc8PGQ+Pj4xNSl8MDtkPWY+Pj4oZCs3fDApJjF8ZDw8MX13aGlsZSgwKTtlPTMyMzg0KyhkPDwyKXwwO2NbbCsyOD4+Ml09ZDthPWwrMTZ8MDtjW2ErND4+Ml09MDtjW2E+PjJdPTA7YT1jWzgwMjFdfDA7Yj0xPDxkO2lmKCEoYSZiKSl7Y1s4MDIxXT1hfGI7Y1tlPj4yXT1sO2NbbCsyND4+Ml09ZTtjW2wrMTI+PjJdPWw7Y1tsKzg+PjJdPWw7YnJlYWt9ZD1mPDwoKGR8MCk9PTMxPzA6MjUtKGQ+Pj4xKXwwKTtlPWNbZT4+Ml18MDt3aGlsZSgxKXtpZigoY1tlKzQ+PjJdJi04fDApPT0oZnwwKSl7ej0yODE7YnJlYWt9Yj1lKzE2KyhkPj4+MzE8PDIpfDA7YT1jW2I+PjJdfDA7aWYoIWEpe3o9Mjc4O2JyZWFrfWVsc2V7ZD1kPDwxO2U9YX19aWYoKHp8MCk9PTI3OClpZihiPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle2NbYj4+Ml09bDtjW2wrMjQ+PjJdPWU7Y1tsKzEyPj4yXT1sO2NbbCs4Pj4yXT1sO2JyZWFrfWVsc2UgaWYoKHp8MCk9PTI4MSl7YT1lKzh8MDtiPWNbYT4+Ml18MDtHPWNbODAyNF18MDtpZihiPj4+MD49Rz4+PjAmZT4+PjA+PUc+Pj4wKXtjW2IrMTI+PjJdPWw7Y1thPj4yXT1sO2NbbCs4Pj4yXT1iO2NbbCsxMj4+Ml09ZTtjW2wrMjQ+PjJdPTA7YnJlYWt9ZWxzZSByYSgpfX1lbHNle0c9KGNbODAyM118MCkranwwO2NbODAyM109RztjWzgwMjZdPWw7Y1tsKzQ+PjJdPUd8MX13aGlsZSgwKTtHPW0rOHwwO3JldHVybiBHfDB9ZWxzZSBiPTMyNTI4O3doaWxlKDEpe2E9Y1tiPj4yXXwwO2lmKGE+Pj4wPD1rPj4+MD8oQT1hKyhjW2IrND4+Ml18MCl8MCxBPj4+MD5rPj4+MCk6MClicmVhaztiPWNbYis4Pj4yXXwwfWY9QSstNDd8MDtiPWYrOHwwO2I9ZisoKGImN3wwKT09MD8wOjAtYiY3KXwwO2Y9aysxNnwwO2I9Yj4+PjA8Zj4+PjA/azpiO2E9Yis4fDA7ZD1oKzh8MDtkPShkJjd8MCk9PTA/MDowLWQmNztHPWgrZHwwO2Q9ZystNDAtZHwwO2NbODAyNl09RztjWzgwMjNdPWQ7Y1tHKzQ+PjJdPWR8MTtjW0crZCs0Pj4yXT00MDtjWzgwMjddPWNbODE0Ml07ZD1iKzR8MDtjW2Q+PjJdPTI3O2NbYT4+Ml09Y1s4MTMyXTtjW2ErND4+Ml09Y1s4MTMzXTtjW2ErOD4+Ml09Y1s4MTM0XTtjW2ErMTI+PjJdPWNbODEzNV07Y1s4MTMyXT1oO2NbODEzM109ZztjWzgxMzVdPTA7Y1s4MTM0XT1hO2E9YisyNHwwO2Rve2E9YSs0fDA7Y1thPj4yXT03fXdoaWxlKChhKzR8MCk+Pj4wPEE+Pj4wKTtpZigoYnwwKSE9KGt8MCkpe2c9Yi1rfDA7Y1tkPj4yXT1jW2Q+PjJdJi0yO2Nbays0Pj4yXT1nfDE7Y1tiPj4yXT1nO2E9Zz4+PjM7aWYoZz4+PjA8MjU2KXtkPTMyMTIwKyhhPDwxPDwyKXwwO2I9Y1s4MDIwXXwwO2E9MTw8YTtpZihiJmEpe2E9ZCs4fDA7Yj1jW2E+PjJdfDA7aWYoYj4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZWxzZXtDPWE7RD1ifX1lbHNle2NbODAyMF09YnxhO0M9ZCs4fDA7RD1kfWNbQz4+Ml09aztjW0QrMTI+PjJdPWs7Y1trKzg+PjJdPUQ7Y1trKzEyPj4yXT1kO2JyZWFrfWE9Zz4+Pjg7aWYoYSlpZihnPj4+MD4xNjc3NzIxNSlkPTMxO2Vsc2V7Rj0oYSsxMDQ4MzIwfDApPj4+MTYmODtHPWE8PEY7RT0oRys1MjAxOTJ8MCk+Pj4xNiY0O0c9Rzw8RTtkPShHKzI0NTc2MHwwKT4+PjE2JjI7ZD0xNC0oRXxGfGQpKyhHPDxkPj4+MTUpfDA7ZD1nPj4+KGQrN3wwKSYxfGQ8PDF9ZWxzZSBkPTA7ZT0zMjM4NCsoZDw8Mil8MDtjW2srMjg+PjJdPWQ7Y1trKzIwPj4yXT0wO2NbZj4+Ml09MDthPWNbODAyMV18MDtiPTE8PGQ7aWYoIShhJmIpKXtjWzgwMjFdPWF8YjtjW2U+PjJdPWs7Y1trKzI0Pj4yXT1lO2NbaysxMj4+Ml09aztjW2srOD4+Ml09azticmVha31kPWc8PCgoZHwwKT09MzE/MDoyNS0oZD4+PjEpfDApO2U9Y1tlPj4yXXwwO3doaWxlKDEpe2lmKChjW2UrND4+Ml0mLTh8MCk9PShnfDApKXt6PTMwNzticmVha31iPWUrMTYrKGQ+Pj4zMTw8Mil8MDthPWNbYj4+Ml18MDtpZighYSl7ej0zMDQ7YnJlYWt9ZWxzZXtkPWQ8PDE7ZT1hfX1pZigoenwwKT09MzA0KWlmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7Y1tiPj4yXT1rO2NbaysyND4+Ml09ZTtjW2srMTI+PjJdPWs7Y1trKzg+PjJdPWs7YnJlYWt9ZWxzZSBpZigoenwwKT09MzA3KXthPWUrOHwwO2I9Y1thPj4yXXwwO0c9Y1s4MDI0XXwwO2lmKGI+Pj4wPj1HPj4+MCZlPj4+MD49Rz4+PjApe2NbYisxMj4+Ml09aztjW2E+PjJdPWs7Y1trKzg+PjJdPWI7Y1trKzEyPj4yXT1lO2NbaysyND4+Ml09MDticmVha31lbHNlIHJhKCl9fX1lbHNle0c9Y1s4MDI0XXwwO2lmKChHfDApPT0wfGg+Pj4wPEc+Pj4wKWNbODAyNF09aDtjWzgxMzJdPWg7Y1s4MTMzXT1nO2NbODEzNV09MDtjWzgwMjldPWNbODEzOF07Y1s4MDI4XT0tMTthPTA7ZG97Rz0zMjEyMCsoYTw8MTw8Mil8MDtjW0crMTI+PjJdPUc7Y1tHKzg+PjJdPUc7YT1hKzF8MH13aGlsZSgoYXwwKSE9MzIpO0c9aCs4fDA7Rz0oRyY3fDApPT0wPzA6MC1HJjc7Rj1oK0d8MDtHPWcrLTQwLUd8MDtjWzgwMjZdPUY7Y1s4MDIzXT1HO2NbRis0Pj4yXT1HfDE7Y1tGK0crND4+Ml09NDA7Y1s4MDI3XT1jWzgxNDJdfXdoaWxlKDApO2E9Y1s4MDIzXXwwO2lmKGE+Pj4wPm8+Pj4wKXtFPWEtb3wwO2NbODAyM109RTtHPWNbODAyNl18MDtGPUcrb3wwO2NbODAyNl09RjtjW0YrND4+Ml09RXwxO2NbRys0Pj4yXT1vfDM7Rz1HKzh8MDtyZXR1cm4gR3wwfX1pZighKGNbNzk3OV18MCkpYT0zMTk2NDtlbHNlIGE9Y1sob2EoKXwwKSs2MD4+Ml18MDtjW2E+PjJdPTEyO0c9MDtyZXR1cm4gR3wwfWZ1bmN0aW9uIHpkKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MDtpZighYSlyZXR1cm47ZD1hKy04fDA7aD1jWzgwMjRdfDA7aWYoZD4+PjA8aD4+PjApcmEoKTthPWNbYSstND4+Ml18MDtiPWEmMztpZigoYnwwKT09MSlyYSgpO2U9YSYtODttPWQrZXwwO2RvIGlmKCEoYSYxKSl7YT1jW2Q+PjJdfDA7aWYoIWIpcmV0dXJuO2s9ZCsoMC1hKXwwO2o9YStlfDA7aWYoaz4+PjA8aD4+PjApcmEoKTtpZigoa3wwKT09KGNbODAyNV18MCkpe2E9bSs0fDA7Yj1jW2E+PjJdfDA7aWYoKGImM3wwKSE9Myl7cT1rO2Y9ajticmVha31jWzgwMjJdPWo7Y1thPj4yXT1iJi0yO2Nbays0Pj4yXT1qfDE7Y1trK2o+PjJdPWo7cmV0dXJufWU9YT4+PjM7aWYoYT4+PjA8MjU2KXtiPWNbays4Pj4yXXwwO2Q9Y1trKzEyPj4yXXwwO2E9MzIxMjArKGU8PDE8PDIpfDA7aWYoKGJ8MCkhPShhfDApKXtpZihiPj4+MDxoPj4+MClyYSgpO2lmKChjW2IrMTI+PjJdfDApIT0oa3wwKSlyYSgpfWlmKChkfDApPT0oYnwwKSl7Y1s4MDIwXT1jWzgwMjBdJn4oMTw8ZSk7cT1rO2Y9ajticmVha31pZigoZHwwKSE9KGF8MCkpe2lmKGQ+Pj4wPGg+Pj4wKXJhKCk7YT1kKzh8MDtpZigoY1thPj4yXXwwKT09KGt8MCkpZz1hO2Vsc2UgcmEoKX1lbHNlIGc9ZCs4fDA7Y1tiKzEyPj4yXT1kO2NbZz4+Ml09YjtxPWs7Zj1qO2JyZWFrfWc9Y1trKzI0Pj4yXXwwO2Q9Y1trKzEyPj4yXXwwO2RvIGlmKChkfDApPT0oa3wwKSl7ZD1rKzE2fDA7Yj1kKzR8MDthPWNbYj4+Ml18MDtpZighYSl7YT1jW2Q+PjJdfDA7aWYoIWEpe2k9MDticmVha31lbHNlIGI9ZH13aGlsZSgxKXtkPWErMjB8MDtlPWNbZD4+Ml18MDtpZihlKXthPWU7Yj1kO2NvbnRpbnVlfWQ9YSsxNnwwO2U9Y1tkPj4yXXwwO2lmKCFlKWJyZWFrO2Vsc2V7YT1lO2I9ZH19aWYoYj4+PjA8aD4+PjApcmEoKTtlbHNle2NbYj4+Ml09MDtpPWE7YnJlYWt9fWVsc2V7ZT1jW2srOD4+Ml18MDtpZihlPj4+MDxoPj4+MClyYSgpO2E9ZSsxMnwwO2lmKChjW2E+PjJdfDApIT0oa3wwKSlyYSgpO2I9ZCs4fDA7aWYoKGNbYj4+Ml18MCk9PShrfDApKXtjW2E+PjJdPWQ7Y1tiPj4yXT1lO2k9ZDticmVha31lbHNlIHJhKCl9d2hpbGUoMCk7aWYoZyl7YT1jW2srMjg+PjJdfDA7Yj0zMjM4NCsoYTw8Mil8MDtpZigoa3wwKT09KGNbYj4+Ml18MCkpe2NbYj4+Ml09aTtpZighaSl7Y1s4MDIxXT1jWzgwMjFdJn4oMTw8YSk7cT1rO2Y9ajticmVha319ZWxzZXtpZihnPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTthPWcrMTZ8MDtpZigoY1thPj4yXXwwKT09KGt8MCkpY1thPj4yXT1pO2Vsc2UgY1tnKzIwPj4yXT1pO2lmKCFpKXtxPWs7Zj1qO2JyZWFrfX1kPWNbODAyNF18MDtpZihpPj4+MDxkPj4+MClyYSgpO2NbaSsyND4+Ml09ZzthPWsrMTZ8MDtiPWNbYT4+Ml18MDtkbyBpZihiKWlmKGI+Pj4wPGQ+Pj4wKXJhKCk7ZWxzZXtjW2krMTY+PjJdPWI7Y1tiKzI0Pj4yXT1pO2JyZWFrfXdoaWxlKDApO2E9Y1thKzQ+PjJdfDA7aWYoYSlpZihhPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle2NbaSsyMD4+Ml09YTtjW2ErMjQ+PjJdPWk7cT1rO2Y9ajticmVha31lbHNle3E9aztmPWp9fWVsc2V7cT1rO2Y9an19ZWxzZXtxPWQ7Zj1lfXdoaWxlKDApO2lmKHE+Pj4wPj1tPj4+MClyYSgpO2E9bSs0fDA7Yj1jW2E+PjJdfDA7aWYoIShiJjEpKXJhKCk7aWYoIShiJjIpKXtpZigobXwwKT09KGNbODAyNl18MCkpe3A9KGNbODAyM118MCkrZnwwO2NbODAyM109cDtjWzgwMjZdPXE7Y1txKzQ+PjJdPXB8MTtpZigocXwwKSE9KGNbODAyNV18MCkpcmV0dXJuO2NbODAyNV09MDtjWzgwMjJdPTA7cmV0dXJufWlmKChtfDApPT0oY1s4MDI1XXwwKSl7cD0oY1s4MDIyXXwwKStmfDA7Y1s4MDIyXT1wO2NbODAyNV09cTtjW3ErND4+Ml09cHwxO2NbcStwPj4yXT1wO3JldHVybn1mPShiJi04KStmfDA7ZT1iPj4+MztkbyBpZihiPj4+MD49MjU2KXtnPWNbbSsyND4+Ml18MDthPWNbbSsxMj4+Ml18MDtkbyBpZigoYXwwKT09KG18MCkpe2Q9bSsxNnwwO2I9ZCs0fDA7YT1jW2I+PjJdfDA7aWYoIWEpe2E9Y1tkPj4yXXwwO2lmKCFhKXtuPTA7YnJlYWt9ZWxzZSBiPWR9d2hpbGUoMSl7ZD1hKzIwfDA7ZT1jW2Q+PjJdfDA7aWYoZSl7YT1lO2I9ZDtjb250aW51ZX1kPWErMTZ8MDtlPWNbZD4+Ml18MDtpZighZSlicmVhaztlbHNle2E9ZTtiPWR9fWlmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Vsc2V7Y1tiPj4yXT0wO249YTticmVha319ZWxzZXtiPWNbbSs4Pj4yXXwwO2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Q9YisxMnwwO2lmKChjW2Q+PjJdfDApIT0obXwwKSlyYSgpO2U9YSs4fDA7aWYoKGNbZT4+Ml18MCk9PShtfDApKXtjW2Q+PjJdPWE7Y1tlPj4yXT1iO249YTticmVha31lbHNlIHJhKCl9d2hpbGUoMCk7aWYoZyl7YT1jW20rMjg+PjJdfDA7Yj0zMjM4NCsoYTw8Mil8MDtpZigobXwwKT09KGNbYj4+Ml18MCkpe2NbYj4+Ml09bjtpZighbil7Y1s4MDIxXT1jWzgwMjFdJn4oMTw8YSk7YnJlYWt9fWVsc2V7aWYoZz4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7YT1nKzE2fDA7aWYoKGNbYT4+Ml18MCk9PShtfDApKWNbYT4+Ml09bjtlbHNlIGNbZysyMD4+Ml09bjtpZighbilicmVha31kPWNbODAyNF18MDtpZihuPj4+MDxkPj4+MClyYSgpO2NbbisyND4+Ml09ZzthPW0rMTZ8MDtiPWNbYT4+Ml18MDtkbyBpZihiKWlmKGI+Pj4wPGQ+Pj4wKXJhKCk7ZWxzZXtjW24rMTY+PjJdPWI7Y1tiKzI0Pj4yXT1uO2JyZWFrfXdoaWxlKDApO2E9Y1thKzQ+PjJdfDA7aWYoYSlpZihhPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle2NbbisyMD4+Ml09YTtjW2ErMjQ+PjJdPW47YnJlYWt9fX1lbHNle2I9Y1ttKzg+PjJdfDA7ZD1jW20rMTI+PjJdfDA7YT0zMjEyMCsoZTw8MTw8Mil8MDtpZigoYnwwKSE9KGF8MCkpe2lmKGI+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2lmKChjW2IrMTI+PjJdfDApIT0obXwwKSlyYSgpfWlmKChkfDApPT0oYnwwKSl7Y1s4MDIwXT1jWzgwMjBdJn4oMTw8ZSk7YnJlYWt9aWYoKGR8MCkhPShhfDApKXtpZihkPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTthPWQrOHwwO2lmKChjW2E+PjJdfDApPT0obXwwKSlsPWE7ZWxzZSByYSgpfWVsc2UgbD1kKzh8MDtjW2IrMTI+PjJdPWQ7Y1tsPj4yXT1ifXdoaWxlKDApO2NbcSs0Pj4yXT1mfDE7Y1txK2Y+PjJdPWY7aWYoKHF8MCk9PShjWzgwMjVdfDApKXtjWzgwMjJdPWY7cmV0dXJufX1lbHNle2NbYT4+Ml09YiYtMjtjW3ErND4+Ml09ZnwxO2NbcStmPj4yXT1mfWE9Zj4+PjM7aWYoZj4+PjA8MjU2KXtkPTMyMTIwKyhhPDwxPDwyKXwwO2I9Y1s4MDIwXXwwO2E9MTw8YTtpZihiJmEpe2E9ZCs4fDA7Yj1jW2E+PjJdfDA7aWYoYj4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZWxzZXtvPWE7cD1ifX1lbHNle2NbODAyMF09YnxhO289ZCs4fDA7cD1kfWNbbz4+Ml09cTtjW3ArMTI+PjJdPXE7Y1txKzg+PjJdPXA7Y1txKzEyPj4yXT1kO3JldHVybn1hPWY+Pj44O2lmKGEpaWYoZj4+PjA+MTY3NzcyMTUpZD0zMTtlbHNle289KGErMTA0ODMyMHwwKT4+PjE2Jjg7cD1hPDxvO249KHArNTIwMTkyfDApPj4+MTYmNDtwPXA8PG47ZD0ocCsyNDU3NjB8MCk+Pj4xNiYyO2Q9MTQtKG58b3xkKSsocDw8ZD4+PjE1KXwwO2Q9Zj4+PihkKzd8MCkmMXxkPDwxfWVsc2UgZD0wO2U9MzIzODQrKGQ8PDIpfDA7Y1txKzI4Pj4yXT1kO2NbcSsyMD4+Ml09MDtjW3ErMTY+PjJdPTA7YT1jWzgwMjFdfDA7Yj0xPDxkO2RvIGlmKGEmYil7ZD1mPDwoKGR8MCk9PTMxPzA6MjUtKGQ+Pj4xKXwwKTtlPWNbZT4+Ml18MDt3aGlsZSgxKXtpZigoY1tlKzQ+PjJdJi04fDApPT0oZnwwKSl7YT0xMzA7YnJlYWt9Yj1lKzE2KyhkPj4+MzE8PDIpfDA7YT1jW2I+PjJdfDA7aWYoIWEpe2E9MTI3O2JyZWFrfWVsc2V7ZD1kPDwxO2U9YX19aWYoKGF8MCk9PTEyNylpZihiPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle2NbYj4+Ml09cTtjW3ErMjQ+PjJdPWU7Y1txKzEyPj4yXT1xO2NbcSs4Pj4yXT1xO2JyZWFrfWVsc2UgaWYoKGF8MCk9PTEzMCl7YT1lKzh8MDtiPWNbYT4+Ml18MDtwPWNbODAyNF18MDtpZihiPj4+MD49cD4+PjAmZT4+PjA+PXA+Pj4wKXtjW2IrMTI+PjJdPXE7Y1thPj4yXT1xO2NbcSs4Pj4yXT1iO2NbcSsxMj4+Ml09ZTtjW3ErMjQ+PjJdPTA7YnJlYWt9ZWxzZSByYSgpfX1lbHNle2NbODAyMV09YXxiO2NbZT4+Ml09cTtjW3ErMjQ+PjJdPWU7Y1txKzEyPj4yXT1xO2NbcSs4Pj4yXT1xfXdoaWxlKDApO3E9KGNbODAyOF18MCkrLTF8MDtjWzgwMjhdPXE7aWYoIXEpYT0zMjUzNjtlbHNlIHJldHVybjt3aGlsZSgxKXthPWNbYT4+Ml18MDtpZighYSlicmVhaztlbHNlIGE9YSs4fDB9Y1s4MDI4XT0tMTtyZXR1cm59ZnVuY3Rpb24gQWQoYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTA7bz1hK2J8MDtkPWNbYSs0Pj4yXXwwO2RvIGlmKCEoZCYxKSl7Zz1jW2E+PjJdfDA7aWYoIShkJjMpKXJldHVybjtsPWErKDAtZyl8MDtrPWcrYnwwO2k9Y1s4MDI0XXwwO2lmKGw+Pj4wPGk+Pj4wKXJhKCk7aWYoKGx8MCk9PShjWzgwMjVdfDApKXthPW8rNHwwO2Q9Y1thPj4yXXwwO2lmKChkJjN8MCkhPTMpe3I9bDtmPWs7YnJlYWt9Y1s4MDIyXT1rO2NbYT4+Ml09ZCYtMjtjW2wrND4+Ml09a3wxO2NbbCtrPj4yXT1rO3JldHVybn1lPWc+Pj4zO2lmKGc+Pj4wPDI1Nil7YT1jW2wrOD4+Ml18MDtiPWNbbCsxMj4+Ml18MDtkPTMyMTIwKyhlPDwxPDwyKXwwO2lmKChhfDApIT0oZHwwKSl7aWYoYT4+PjA8aT4+PjApcmEoKTtpZigoY1thKzEyPj4yXXwwKSE9KGx8MCkpcmEoKX1pZigoYnwwKT09KGF8MCkpe2NbODAyMF09Y1s4MDIwXSZ+KDE8PGUpO3I9bDtmPWs7YnJlYWt9aWYoKGJ8MCkhPShkfDApKXtpZihiPj4+MDxpPj4+MClyYSgpO2Q9Yis4fDA7aWYoKGNbZD4+Ml18MCk9PShsfDApKWg9ZDtlbHNlIHJhKCl9ZWxzZSBoPWIrOHwwO2NbYSsxMj4+Ml09YjtjW2g+PjJdPWE7cj1sO2Y9azticmVha31nPWNbbCsyND4+Ml18MDtiPWNbbCsxMj4+Ml18MDtkbyBpZigoYnwwKT09KGx8MCkpe2I9bCsxNnwwO2E9Yis0fDA7ZD1jW2E+PjJdfDA7aWYoIWQpe2Q9Y1tiPj4yXXwwO2lmKCFkKXtqPTA7YnJlYWt9ZWxzZSBhPWJ9d2hpbGUoMSl7Yj1kKzIwfDA7ZT1jW2I+PjJdfDA7aWYoZSl7ZD1lO2E9Yjtjb250aW51ZX1iPWQrMTZ8MDtlPWNbYj4+Ml18MDtpZighZSlicmVhaztlbHNle2Q9ZTthPWJ9fWlmKGE+Pj4wPGk+Pj4wKXJhKCk7ZWxzZXtjW2E+PjJdPTA7aj1kO2JyZWFrfX1lbHNle2U9Y1tsKzg+PjJdfDA7aWYoZT4+PjA8aT4+PjApcmEoKTtkPWUrMTJ8MDtpZigoY1tkPj4yXXwwKSE9KGx8MCkpcmEoKTthPWIrOHwwO2lmKChjW2E+PjJdfDApPT0obHwwKSl7Y1tkPj4yXT1iO2NbYT4+Ml09ZTtqPWI7YnJlYWt9ZWxzZSByYSgpfXdoaWxlKDApO2lmKGcpe2Q9Y1tsKzI4Pj4yXXwwO2E9MzIzODQrKGQ8PDIpfDA7aWYoKGx8MCk9PShjW2E+PjJdfDApKXtjW2E+PjJdPWo7aWYoIWope2NbODAyMV09Y1s4MDIxXSZ+KDE8PGQpO3I9bDtmPWs7YnJlYWt9fWVsc2V7aWYoZz4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZD1nKzE2fDA7aWYoKGNbZD4+Ml18MCk9PShsfDApKWNbZD4+Ml09ajtlbHNlIGNbZysyMD4+Ml09ajtpZighail7cj1sO2Y9azticmVha319Yj1jWzgwMjRdfDA7aWYoaj4+PjA8Yj4+PjApcmEoKTtjW2orMjQ+PjJdPWc7ZD1sKzE2fDA7YT1jW2Q+PjJdfDA7ZG8gaWYoYSlpZihhPj4+MDxiPj4+MClyYSgpO2Vsc2V7Y1tqKzE2Pj4yXT1hO2NbYSsyND4+Ml09ajticmVha313aGlsZSgwKTtkPWNbZCs0Pj4yXXwwO2lmKGQpaWYoZD4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZWxzZXtjW2orMjA+PjJdPWQ7Y1tkKzI0Pj4yXT1qO3I9bDtmPWs7YnJlYWt9ZWxzZXtyPWw7Zj1rfX1lbHNle3I9bDtmPWt9fWVsc2V7cj1hO2Y9Yn13aGlsZSgwKTtoPWNbODAyNF18MDtpZihvPj4+MDxoPj4+MClyYSgpO2Q9bys0fDA7YT1jW2Q+PjJdfDA7aWYoIShhJjIpKXtpZigob3wwKT09KGNbODAyNl18MCkpe3E9KGNbODAyM118MCkrZnwwO2NbODAyM109cTtjWzgwMjZdPXI7Y1tyKzQ+PjJdPXF8MTtpZigocnwwKSE9KGNbODAyNV18MCkpcmV0dXJuO2NbODAyNV09MDtjWzgwMjJdPTA7cmV0dXJufWlmKChvfDApPT0oY1s4MDI1XXwwKSl7cT0oY1s4MDIyXXwwKStmfDA7Y1s4MDIyXT1xO2NbODAyNV09cjtjW3IrND4+Ml09cXwxO2NbcitxPj4yXT1xO3JldHVybn1mPShhJi04KStmfDA7ZT1hPj4+MztkbyBpZihhPj4+MD49MjU2KXtnPWNbbysyND4+Ml18MDtiPWNbbysxMj4+Ml18MDtkbyBpZigoYnwwKT09KG98MCkpe2I9bysxNnwwO2E9Yis0fDA7ZD1jW2E+PjJdfDA7aWYoIWQpe2Q9Y1tiPj4yXXwwO2lmKCFkKXtuPTA7YnJlYWt9ZWxzZSBhPWJ9d2hpbGUoMSl7Yj1kKzIwfDA7ZT1jW2I+PjJdfDA7aWYoZSl7ZD1lO2E9Yjtjb250aW51ZX1iPWQrMTZ8MDtlPWNbYj4+Ml18MDtpZighZSlicmVhaztlbHNle2Q9ZTthPWJ9fWlmKGE+Pj4wPGg+Pj4wKXJhKCk7ZWxzZXtjW2E+PjJdPTA7bj1kO2JyZWFrfX1lbHNle2U9Y1tvKzg+PjJdfDA7aWYoZT4+PjA8aD4+PjApcmEoKTtkPWUrMTJ8MDtpZigoY1tkPj4yXXwwKSE9KG98MCkpcmEoKTthPWIrOHwwO2lmKChjW2E+PjJdfDApPT0ob3wwKSl7Y1tkPj4yXT1iO2NbYT4+Ml09ZTtuPWI7YnJlYWt9ZWxzZSByYSgpfXdoaWxlKDApO2lmKGcpe2Q9Y1tvKzI4Pj4yXXwwO2E9MzIzODQrKGQ8PDIpfDA7aWYoKG98MCk9PShjW2E+PjJdfDApKXtjW2E+PjJdPW47aWYoIW4pe2NbODAyMV09Y1s4MDIxXSZ+KDE8PGQpO2JyZWFrfX1lbHNle2lmKGc+Pj4wPChjWzgwMjRdfDApPj4+MClyYSgpO2Q9ZysxNnwwO2lmKChjW2Q+PjJdfDApPT0ob3wwKSljW2Q+PjJdPW47ZWxzZSBjW2crMjA+PjJdPW47aWYoIW4pYnJlYWt9Yj1jWzgwMjRdfDA7aWYobj4+PjA8Yj4+PjApcmEoKTtjW24rMjQ+PjJdPWc7ZD1vKzE2fDA7YT1jW2Q+PjJdfDA7ZG8gaWYoYSlpZihhPj4+MDxiPj4+MClyYSgpO2Vsc2V7Y1tuKzE2Pj4yXT1hO2NbYSsyND4+Ml09bjticmVha313aGlsZSgwKTtkPWNbZCs0Pj4yXXwwO2lmKGQpaWYoZD4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7ZWxzZXtjW24rMjA+PjJdPWQ7Y1tkKzI0Pj4yXT1uO2JyZWFrfX19ZWxzZXthPWNbbys4Pj4yXXwwO2I9Y1tvKzEyPj4yXXwwO2Q9MzIxMjArKGU8PDE8PDIpfDA7aWYoKGF8MCkhPShkfDApKXtpZihhPj4+MDxoPj4+MClyYSgpO2lmKChjW2ErMTI+PjJdfDApIT0ob3wwKSlyYSgpfWlmKChifDApPT0oYXwwKSl7Y1s4MDIwXT1jWzgwMjBdJn4oMTw8ZSk7YnJlYWt9aWYoKGJ8MCkhPShkfDApKXtpZihiPj4+MDxoPj4+MClyYSgpO2Q9Yis4fDA7aWYoKGNbZD4+Ml18MCk9PShvfDApKW09ZDtlbHNlIHJhKCl9ZWxzZSBtPWIrOHwwO2NbYSsxMj4+Ml09YjtjW20+PjJdPWF9d2hpbGUoMCk7Y1tyKzQ+PjJdPWZ8MTtjW3IrZj4+Ml09ZjtpZigocnwwKT09KGNbODAyNV18MCkpe2NbODAyMl09ZjtyZXR1cm59fWVsc2V7Y1tkPj4yXT1hJi0yO2Nbcis0Pj4yXT1mfDE7Y1tyK2Y+PjJdPWZ9ZD1mPj4+MztpZihmPj4+MDwyNTYpe2I9MzIxMjArKGQ8PDE8PDIpfDA7YT1jWzgwMjBdfDA7ZD0xPDxkO2lmKGEmZCl7ZD1iKzh8MDthPWNbZD4+Ml18MDtpZihhPj4+MDwoY1s4MDI0XXwwKT4+PjApcmEoKTtlbHNle3A9ZDtxPWF9fWVsc2V7Y1s4MDIwXT1hfGQ7cD1iKzh8MDtxPWJ9Y1twPj4yXT1yO2NbcSsxMj4+Ml09cjtjW3IrOD4+Ml09cTtjW3IrMTI+PjJdPWI7cmV0dXJufWQ9Zj4+Pjg7aWYoZClpZihmPj4+MD4xNjc3NzIxNSliPTMxO2Vsc2V7cD0oZCsxMDQ4MzIwfDApPj4+MTYmODtxPWQ8PHA7bz0ocSs1MjAxOTJ8MCk+Pj4xNiY0O3E9cTw8bztiPShxKzI0NTc2MHwwKT4+PjE2JjI7Yj0xNC0ob3xwfGIpKyhxPDxiPj4+MTUpfDA7Yj1mPj4+KGIrN3wwKSYxfGI8PDF9ZWxzZSBiPTA7ZT0zMjM4NCsoYjw8Mil8MDtjW3IrMjg+PjJdPWI7Y1tyKzIwPj4yXT0wO2NbcisxNj4+Ml09MDtkPWNbODAyMV18MDthPTE8PGI7aWYoIShkJmEpKXtjWzgwMjFdPWR8YTtjW2U+PjJdPXI7Y1tyKzI0Pj4yXT1lO2NbcisxMj4+Ml09cjtjW3IrOD4+Ml09cjtyZXR1cm59Yj1mPDwoKGJ8MCk9PTMxPzA6MjUtKGI+Pj4xKXwwKTtlPWNbZT4+Ml18MDt3aGlsZSgxKXtpZigoY1tlKzQ+PjJdJi04fDApPT0oZnwwKSl7ZD0xMjc7YnJlYWt9YT1lKzE2KyhiPj4+MzE8PDIpfDA7ZD1jW2E+PjJdfDA7aWYoIWQpe2Q9MTI0O2JyZWFrfWVsc2V7Yj1iPDwxO2U9ZH19aWYoKGR8MCk9PTEyNCl7aWYoYT4+PjA8KGNbODAyNF18MCk+Pj4wKXJhKCk7Y1thPj4yXT1yO2NbcisyND4+Ml09ZTtjW3IrMTI+PjJdPXI7Y1tyKzg+PjJdPXI7cmV0dXJufWVsc2UgaWYoKGR8MCk9PTEyNyl7ZD1lKzh8MDthPWNbZD4+Ml18MDtxPWNbODAyNF18MDtpZighKGE+Pj4wPj1xPj4+MCZlPj4+MD49cT4+PjApKXJhKCk7Y1thKzEyPj4yXT1yO2NbZD4+Ml09cjtjW3IrOD4+Ml09YTtjW3IrMTI+PjJdPWU7Y1tyKzI0Pj4yXT0wO3JldHVybn19ZnVuY3Rpb24gQmQoKXt9ZnVuY3Rpb24gQ2QoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZD1iLWQtKGM+Pj4wPmE+Pj4wfDApPj4+MDtyZXR1cm4gKEM9ZCxhLWM+Pj4wfDApfDB9ZnVuY3Rpb24gRGQoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7Yz1hK2M+Pj4wO3JldHVybiAoQz1iK2QrKGM+Pj4wPGE+Pj4wfDApPj4+MCxjfDApfDB9ZnVuY3Rpb24gRWQoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2lmKChjfDApPDMyKXtDPWI+PmM7cmV0dXJuIGE+Pj5jfChiJigxPDxjKS0xKTw8MzItY31DPShifDApPDA/LTE6MDtyZXR1cm4gYj4+Yy0zMnwwfWZ1bmN0aW9uIEZkKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaT0wO2Y9YitlfDA7aWYoKGV8MCk+PTIwKXtkPWQmMjU1O2g9YiYzO2k9ZHxkPDw4fGQ8PDE2fGQ8PDI0O2c9ZiZ+MztpZihoKXtoPWIrNC1ofDA7d2hpbGUoKGJ8MCk8KGh8MCkpe2FbYj4+MF09ZDtiPWIrMXwwfX13aGlsZSgoYnwwKTwoZ3wwKSl7Y1tiPj4yXT1pO2I9Yis0fDB9fXdoaWxlKChifDApPChmfDApKXthW2I+PjBdPWQ7Yj1iKzF8MH1yZXR1cm4gYi1lfDB9ZnVuY3Rpb24gR2QoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2lmKChjfDApPDMyKXtDPWI+Pj5jO3JldHVybiBhPj4+Y3woYiYoMTw8YyktMSk8PDMyLWN9Qz0wO3JldHVybiBiPj4+Yy0zMnwwfWZ1bmN0aW9uIEhkKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtpZigoY3wwKTwzMil7Qz1iPDxjfChhJigxPDxjKS0xPDwzMi1jKT4+PjMyLWM7cmV0dXJuIGE8PGN9Qz1hPDxjLTMyO3JldHVybiAwfWZ1bmN0aW9uIElkKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wO2lmKChlfDApPj00MDk2KXJldHVybiB2YShifDAsZHwwLGV8MCl8MDtmPWJ8MDtpZigoYiYzKT09KGQmMykpe3doaWxlKGImMyl7aWYoIWUpcmV0dXJuIGZ8MDthW2I+PjBdPWFbZD4+MF18MDtiPWIrMXwwO2Q9ZCsxfDA7ZT1lLTF8MH13aGlsZSgoZXwwKT49NCl7Y1tiPj4yXT1jW2Q+PjJdO2I9Yis0fDA7ZD1kKzR8MDtlPWUtNHwwfX13aGlsZSgoZXwwKT4wKXthW2I+PjBdPWFbZD4+MF18MDtiPWIrMXwwO2Q9ZCsxfDA7ZT1lLTF8MH1yZXR1cm4gZnwwfWZ1bmN0aW9uIEpkKGIsYyxkKXtiPWJ8MDtjPWN8MDtkPWR8MDt2YXIgZT0wO2lmKChjfDApPChifDApJihifDApPChjK2R8MCkpe2U9YjtjPWMrZHwwO2I9YitkfDA7d2hpbGUoKGR8MCk+MCl7Yj1iLTF8MDtjPWMtMXwwO2Q9ZC0xfDA7YVtiPj4wXT1hW2M+PjBdfDB9Yj1lfWVsc2UgSWQoYixjLGQpfDA7cmV0dXJuIGJ8MH1mdW5jdGlvbiBLZChiKXtiPWJ8MDt2YXIgYz0wO2M9YVttKyhiJjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gY3wwO2M9YVttKyhiPj44JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYys4fDA7Yz1hW20rKGI+PjE2JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYysxNnwwO3JldHVybiAoYVttKyhiPj4+MjQpPj4wXXwwKSsyNHwwfWZ1bmN0aW9uIExkKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGM9MCxkPTAsZT0wLGY9MDtmPWEmNjU1MzU7ZT1iJjY1NTM1O2M9XyhlLGYpfDA7ZD1hPj4+MTY7YT0oYz4+PjE2KSsoXyhlLGQpfDApfDA7ZT1iPj4+MTY7Yj1fKGUsZil8MDtyZXR1cm4gKEM9KGE+Pj4xNikrKF8oZSxkKXwwKSsoKChhJjY1NTM1KStifDApPj4+MTYpfDAsYStiPDwxNnxjJjY1NTM1fDApfDB9ZnVuY3Rpb24gTWQoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxpPTAsaj0wO2o9Yj4+MzF8KChifDApPDA/LTE6MCk8PDE7aT0oKGJ8MCk8MD8tMTowKT4+MzF8KChifDApPDA/LTE6MCk8PDE7Zj1kPj4zMXwoKGR8MCk8MD8tMTowKTw8MTtlPSgoZHwwKTwwPy0xOjApPj4zMXwoKGR8MCk8MD8tMTowKTw8MTtoPUNkKGpeYSxpXmIsaixpKXwwO2c9QzthPWZeajtiPWVeaTtyZXR1cm4gQ2QoKFJkKGgsZyxDZChmXmMsZV5kLGYsZSl8MCxDLDApfDApXmEsQ15iLGEsYil8MH1mdW5jdGlvbiBOZChhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7Zj1pO2k9aSsxNnwwO2o9ZnwwO2g9Yj4+MzF8KChifDApPDA/LTE6MCk8PDE7Zz0oKGJ8MCk8MD8tMTowKT4+MzF8KChifDApPDA/LTE6MCk8PDE7bD1lPj4zMXwoKGV8MCk8MD8tMTowKTw8MTtrPSgoZXwwKTwwPy0xOjApPj4zMXwoKGV8MCk8MD8tMTowKTw8MTthPUNkKGheYSxnXmIsaCxnKXwwO2I9QztSZChhLGIsQ2QobF5kLGteZSxsLGspfDAsQyxqKXwwO2U9Q2QoY1tqPj4yXV5oLGNbais0Pj4yXV5nLGgsZyl8MDtkPUM7aT1mO3JldHVybiAoQz1kLGUpfDB9ZnVuY3Rpb24gT2QoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7dmFyIGU9MCxmPTA7ZT1hO2Y9YztjPUxkKGUsZil8MDthPUM7cmV0dXJuIChDPShfKGIsZil8MCkrKF8oZCxlKXwwKSthfGEmMCxjfDB8MCl8MH1mdW5jdGlvbiBQZChhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4gUmQoYSxiLGMsZCwwKXwwfWZ1bmN0aW9uIFFkKGEsYixkLGUpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wO2c9aTtpPWkrMTZ8MDtmPWd8MDtSZChhLGIsZCxlLGYpfDA7aT1nO3JldHVybiAoQz1jW2YrND4+Ml18MCxjW2Y+PjJdfDApfDB9ZnVuY3Rpb24gUmQoYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxpPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2w9YTtqPWI7az1qO2g9ZDtuPWU7aT1uO2lmKCFrKXtnPShmfDApIT0wO2lmKCFpKXtpZihnKXtjW2Y+PjJdPShsPj4+MCklKGg+Pj4wKTtjW2YrND4+Ml09MH1uPTA7Zj0obD4+PjApLyhoPj4+MCk+Pj4wO3JldHVybiAoQz1uLGYpfDB9ZWxzZXtpZighZyl7bj0wO2Y9MDtyZXR1cm4gKEM9bixmKXwwfWNbZj4+Ml09YXwwO2NbZis0Pj4yXT1iJjA7bj0wO2Y9MDtyZXR1cm4gKEM9bixmKXwwfX1nPShpfDApPT0wO2RvIGlmKGgpe2lmKCFnKXtnPShhYShpfDApfDApLShhYShrfDApfDApfDA7aWYoZz4+PjA8PTMxKXttPWcrMXwwO2k9MzEtZ3wwO2I9Zy0zMT4+MzE7aD1tO2E9bD4+PihtPj4+MCkmYnxrPDxpO2I9az4+PihtPj4+MCkmYjtnPTA7aT1sPDxpO2JyZWFrfWlmKCFmKXtuPTA7Zj0wO3JldHVybiAoQz1uLGYpfDB9Y1tmPj4yXT1hfDA7Y1tmKzQ+PjJdPWp8YiYwO249MDtmPTA7cmV0dXJuIChDPW4sZil8MH1nPWgtMXwwO2lmKGcmaCl7aT0oYWEoaHwwKXwwKSszMy0oYWEoa3wwKXwwKXwwO3A9NjQtaXwwO209MzItaXwwO2o9bT4+MzE7bz1pLTMyfDA7Yj1vPj4zMTtoPWk7YT1tLTE+PjMxJms+Pj4obz4+PjApfChrPDxtfGw+Pj4oaT4+PjApKSZiO2I9YiZrPj4+KGk+Pj4wKTtnPWw8PHAmajtpPShrPDxwfGw+Pj4obz4+PjApKSZqfGw8PG0maS0zMz4+MzE7YnJlYWt9aWYoZil7Y1tmPj4yXT1nJmw7Y1tmKzQ+PjJdPTB9aWYoKGh8MCk9PTEpe289anxiJjA7cD1hfDB8MDtyZXR1cm4gKEM9byxwKXwwfWVsc2V7cD1LZChofDApfDA7bz1rPj4+KHA+Pj4wKXwwO3A9azw8MzItcHxsPj4+KHA+Pj4wKXwwO3JldHVybiAoQz1vLHApfDB9fWVsc2V7aWYoZyl7aWYoZil7Y1tmPj4yXT0oaz4+PjApJShoPj4+MCk7Y1tmKzQ+PjJdPTB9bz0wO3A9KGs+Pj4wKS8oaD4+PjApPj4+MDtyZXR1cm4gKEM9byxwKXwwfWlmKCFsKXtpZihmKXtjW2Y+PjJdPTA7Y1tmKzQ+PjJdPShrPj4+MCklKGk+Pj4wKX1vPTA7cD0oaz4+PjApLyhpPj4+MCk+Pj4wO3JldHVybiAoQz1vLHApfDB9Zz1pLTF8MDtpZighKGcmaSkpe2lmKGYpe2NbZj4+Ml09YXwwO2NbZis0Pj4yXT1nJmt8YiYwfW89MDtwPWs+Pj4oKEtkKGl8MCl8MCk+Pj4wKTtyZXR1cm4gKEM9byxwKXwwfWc9KGFhKGl8MCl8MCktKGFhKGt8MCl8MCl8MDtpZihnPj4+MDw9MzApe2I9ZysxfDA7aT0zMS1nfDA7aD1iO2E9azw8aXxsPj4+KGI+Pj4wKTtiPWs+Pj4oYj4+PjApO2c9MDtpPWw8PGk7YnJlYWt9aWYoIWYpe289MDtwPTA7cmV0dXJuIChDPW8scCl8MH1jW2Y+PjJdPWF8MDtjW2YrND4+Ml09anxiJjA7bz0wO3A9MDtyZXR1cm4gKEM9byxwKXwwfXdoaWxlKDApO2lmKCFoKXtrPWk7aj0wO2k9MH1lbHNle209ZHwwfDA7bD1ufGUmMDtrPURkKG18MCxsfDAsLTEsLTEpfDA7ZD1DO2o9aTtpPTA7ZG97ZT1qO2o9Zz4+PjMxfGo8PDE7Zz1pfGc8PDE7ZT1hPDwxfGU+Pj4zMXwwO249YT4+PjMxfGI8PDF8MDtDZChrLGQsZSxuKXwwO3A9QztvPXA+PjMxfCgocHwwKTwwPy0xOjApPDwxO2k9byYxO2E9Q2QoZSxuLG8mbSwoKChwfDApPDA/LTE6MCk+PjMxfCgocHwwKTwwPy0xOjApPDwxKSZsKXwwO2I9QztoPWgtMXwwfXdoaWxlKChofDApIT0wKTtrPWo7aj0wfWg9MDtpZihmKXtjW2Y+PjJdPWE7Y1tmKzQ+PjJdPWJ9bz0oZ3wwKT4+PjMxfChrfGgpPDwxfChoPDwxfGc+Pj4zMSkmMHxqO3A9KGc8PDF8MD4+PjMxKSYtMnxpO3JldHVybiAoQz1vLHApfDB9ZnVuY3Rpb24gU2QoYSl7YT1hfDA7cmV0dXJuIERhW2EmMzFdKCl8MH1mdW5jdGlvbiBUZCgpe3JldHVybiBlYSgwKXwwfWZ1bmN0aW9uIFVkKCl7cmV0dXJuIGVhKDEpfDB9ZnVuY3Rpb24gVmQoKXtyZXR1cm4gZWEoMil8MH1mdW5jdGlvbiBXZCgpe3JldHVybiBlYSgzKXwwfWZ1bmN0aW9uIFhkKCl7cmV0dXJuIGVhKDQpfDB9ZnVuY3Rpb24gWWQoKXtyZXR1cm4gZWEoNSl8MH1mdW5jdGlvbiBaZCgpe3JldHVybiBlYSg2KXwwfWZ1bmN0aW9uIF9kKCl7cmV0dXJuIGVhKDcpfDB9ZnVuY3Rpb24gJGQoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4gRWFbYSYzMV0oYnwwKXwwfWZ1bmN0aW9uIGFlKGEpe2E9YXwwO3JldHVybiBnYSgwLGF8MCl8MH1mdW5jdGlvbiBiZShhKXthPWF8MDtyZXR1cm4gZ2EoMSxhfDApfDB9ZnVuY3Rpb24gY2UoYSl7YT1hfDA7cmV0dXJuIGdhKDIsYXwwKXwwfWZ1bmN0aW9uIGRlKGEpe2E9YXwwO3JldHVybiBnYSgzLGF8MCl8MH1mdW5jdGlvbiBlZShhKXthPWF8MDtyZXR1cm4gZ2EoNCxhfDApfDB9ZnVuY3Rpb24gZmUoYSl7YT1hfDA7cmV0dXJuIGdhKDUsYXwwKXwwfWZ1bmN0aW9uIGdlKGEpe2E9YXwwO3JldHVybiBnYSg2LGF8MCl8MH1mdW5jdGlvbiBoZShhKXthPWF8MDtyZXR1cm4gZ2EoNyxhfDApfDB9ZnVuY3Rpb24gaWUoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIEZhW2EmMzFdKGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIGplKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4gaWEoMCxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBrZShhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGlhKDEsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gbGUoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBpYSgyLGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIG1lKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4gaWEoMyxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBuZShhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGlhKDQsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gb2UoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBpYSg1LGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIHBlKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4gaWEoNixhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBxZShhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGlhKDcsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gcmUoYSxiKXthPWF8MDtiPWJ8MDtHYVthJjMxXShifDApfWZ1bmN0aW9uIHNlKGEpe2E9YXwwO2thKDAsYXwwKX1mdW5jdGlvbiB0ZShhKXthPWF8MDtrYSgxLGF8MCl9ZnVuY3Rpb24gdWUoYSl7YT1hfDA7a2EoMixhfDApfWZ1bmN0aW9uIHZlKGEpe2E9YXwwO2thKDMsYXwwKX1mdW5jdGlvbiB3ZShhKXthPWF8MDtrYSg0LGF8MCl9ZnVuY3Rpb24geGUoYSl7YT1hfDA7a2EoNSxhfDApfWZ1bmN0aW9uIHllKGEpe2E9YXwwO2thKDYsYXwwKX1mdW5jdGlvbiB6ZShhKXthPWF8MDtrYSg3LGF8MCl9ZnVuY3Rpb24gQWUoKXtiYSgwKTtyZXR1cm4gMH1mdW5jdGlvbiBCZShhKXthPWF8MDtiYSgxKTtyZXR1cm4gMH1mdW5jdGlvbiBDZShhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7YmEoMik7cmV0dXJuIDB9ZnVuY3Rpb24gRGUoYSl7YT1hfDA7YmEoMyl9XG5cbi8vIEVNU0NSSVBURU5fRU5EX0ZVTkNTXG52YXIgRGE9W0FlLEFlLFRkLEFlLFVkLEFlLFZkLEFlLFdkLEFlLFhkLEFlLFlkLEFlLFpkLEFlLF9kLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlLEFlXTt2YXIgRWE9W0JlLEJlLGFlLEJlLGJlLEJlLGNlLEJlLGRlLEJlLGVlLEJlLGZlLEJlLGdlLEJlLGhlLEJlLHBkLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlLEJlXTt2YXIgRmE9W0NlLENlLGplLENlLGtlLENlLGxlLENlLG1lLENlLG5lLENlLG9lLENlLHBlLENlLHFlLENlLHNkLHFkLHJkLENlLENlLENlLENlLENlLENlLENlLENlLENlLENlLENlXTt2YXIgR2E9W0RlLERlLHNlLERlLHRlLERlLHVlLERlLHZlLERlLHdlLERlLHhlLERlLHllLERlLHplLERlLHdkLERlLERlLERlLERlLERlLERlLERlLERlLERlLERlLERlLERlLERlXTtyZXR1cm57X3NvZGl1bV9saWJyYXJ5X3ZlcnNpb25fbWlub3I6amQsX2NyeXB0b19vbmV0aW1lYXV0aF9ieXRlczpKYixfc29kaXVtX3ZlcnNpb25fc3RyaW5nOmhkLF9zb2RpdW1faGV4MmJpbjpnZCxfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9tZW1saW1pdF9zZW5zaXRpdmU6ZGMsX2JpdHNoaWZ0NjRMc2hyOkdkLF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2OmVjLF9jcnlwdG9fYm94X25vbmNlYnl0ZXM6WmEsX2NyeXB0b19ib3hfYmVmb3Jlbm06YmIsX2NyeXB0b19zY2FsYXJtdWx0X2Jhc2U6bWMsX2NyeXB0b19hdXRoX2J5dGVzOlFhLF9jcnlwdG9fc2lnbl9vcGVuOkZjLF9tZW1jcHk6SWQsX2NyeXB0b19ib3hfc2VlZF9rZXlwYWlyOiRhLF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X21lbWxpbWl0X2ludGVyYWN0aXZlOmJjLF9jcnlwdG9fYm94X29wZW5fZWFzeV9hZnRlcm5tOmliLF9jcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX2N1cnZlMjU1MTk6VWMsX3NvZGl1bV9tZW16ZXJvOmVkLF9jcnlwdG9fYm94X3NlYWw6a2IsX2ZyZWU6emQsX2NyeXB0b19zaG9ydGhhc2g6eGMsX2NyeXB0b19hdXRoX2tleWJ5dGVzOlJhLF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3NhbHRieXRlczpaYixfY3J5cHRvX3NpZ25fc2VlZGJ5dGVzOnpjLF9jcnlwdG9fYm94X2RldGFjaGVkX2FmdGVybm06Y2IsX2NyeXB0b19hdXRoOlNhLF9yYW5kb21ieXRlc19yYW5kb206X2MsX2NyeXB0b19zaWduX2tleXBhaXI6RGMsX2NyeXB0b19zaG9ydGhhc2hfa2V5Ynl0ZXM6d2MsX2NyeXB0b19nZW5lcmljaGFzaF9zdGF0ZWJ5dGVzOnZiLF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cl92ZXJpZnk6Z2MsX2NyeXB0b19nZW5lcmljaGFzaF9pbml0OnhiLF9jcnlwdG9fZ2VuZXJpY2hhc2hfa2V5Ynl0ZXNfbWF4OnRiLF9jcnlwdG9fc2lnbl9lZDI1NTE5X3BrX3RvX2N1cnZlMjU1MTk6VGMsX2NyeXB0b19ib3hfYmVmb3Jlbm1ieXRlczpZYSxfY3J5cHRvX2dlbmVyaWNoYXNoOndiLF9zb2RpdW1fbGlicmFyeV92ZXJzaW9uX21ham9yOmlkLF9yYW5kb21ieXRlc19zdGlyOiRjLF9yYW5kb21ieXRlc19jbG9zZTpjZCxfY3J5cHRvX29uZXRpbWVhdXRoX2tleWJ5dGVzOktiLF9jcnlwdG9fb25ldGltZWF1dGg6TGIsX2NyeXB0b19zaG9ydGhhc2hfYnl0ZXM6dmMsX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXM6WGEsX2NyeXB0b19vbmV0aW1lYXV0aF91cGRhdGU6T2IsX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfbGw6V2IsX2NyeXB0b19ib3hfZGV0YWNoZWQ6ZGIsX3JhbmRvbWJ5dGVzX2J1ZjpiZCxfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHI6ZmMsX2JpdHNoaWZ0NjRBc2hyOkVkLF9jcnlwdG9fYm94X29wZW5fZGV0YWNoZWQ6aGIsX2NyeXB0b19zY2FsYXJtdWx0X2J5dGVzOmtjLF9jcnlwdG9fYXV0aF92ZXJpZnk6VGEsX2NyeXB0b19ib3hfc2VhbF9vcGVuOmxiLF9jcnlwdG9fc2VjcmV0Ym94X2RldGFjaGVkOnJjLF9jcnlwdG9fc2VjcmV0Ym94X2Vhc3k6c2MsX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyYnl0ZXM6X2IsX21lbXNldDpGZCxfY3J5cHRvX2JveF9vcGVuX2RldGFjaGVkX2FmdGVybm06Z2IsX2NyeXB0b19ib3hfc2VhbGJ5dGVzOm1iLF9pNjRTdWJ0cmFjdDpDZCxfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJwcmVmaXg6JGIsX2NyeXB0b19ib3hfc2VlZGJ5dGVzOlZhLF9jcnlwdG9faGFzaDpDYixfY3J5cHRvX2JveF9lYXN5X2FmdGVybm06ZWIsX2NyeXB0b19ib3hfbWFjYnl0ZXM6X2EsX2NyeXB0b19ib3hfcHVibGlja2V5Ynl0ZXM6V2EsX3NvZGl1bV9iaW4yaGV4OmZkLF9jcnlwdG9fc2lnbl9zZWNyZXRrZXlieXRlczpCYyxfY3J5cHRvX3NjYWxhcm11bHRfc2NhbGFyYnl0ZXM6bGMsX2NyeXB0b19vbmV0aW1lYXV0aF9zdGF0ZWJ5dGVzOkliLF9jcnlwdG9fZ2VuZXJpY2hhc2hfa2V5Ynl0ZXNfbWluOnNiLF9tYWxsb2M6eWQsX21lbW1vdmU6SmQsX2NyeXB0b19zaWduOkVjLF9jcnlwdG9fc2VjcmV0Ym94X25vbmNlYnl0ZXM6cGMsX3JhbmRvbWJ5dGVzX3NldF9pbXBsZW1lbnRhdGlvbjpaYyxfY3J5cHRvX2JveF9rZXlwYWlyOmFiLF9jcnlwdG9fZ2VuZXJpY2hhc2hfa2V5Ynl0ZXM6dWIsX2NyeXB0b19nZW5lcmljaGFzaF9ieXRlc19taW46cGIsX3NvZGl1bV9pbml0OmRkLF9jcnlwdG9fc2VjcmV0Ym94X21hY2J5dGVzOnFjLF9jcnlwdG9fc2VjcmV0Ym94X2tleWJ5dGVzOm9jLF9iaXRzaGlmdDY0U2hsOkhkLF9jcnlwdG9faGFzaF9ieXRlczpCYixfZmZsdXNoOnRkLF9jcnlwdG9fZ2VuZXJpY2hhc2hfYnl0ZXM6cmIsX2NyeXB0b19nZW5lcmljaGFzaF9ieXRlc19tYXg6cWIsX2NyeXB0b19zZWNyZXRib3hfb3Blbl9kZXRhY2hlZDp0YyxfY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkOkhjLF9jcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5Ok1iLF9jcnlwdG9fYm94X29wZW5fZWFzeTpqYixfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9vcHNsaW1pdF9zZW5zaXRpdmU6Y2MsX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzOkFjLF9pNjRBZGQ6RGQsX2NyeXB0b19zaWduX2J5dGVzOnljLF9jcnlwdG9fZ2VuZXJpY2hhc2hfdXBkYXRlOnliLF9jcnlwdG9fc2NhbGFybXVsdDpuYyxfY3J5cHRvX3NpZ25fZGV0YWNoZWQ6R2MsX2NyeXB0b19ib3hfZWFzeTpmYixfX19lcnJub19sb2NhdGlvbjpvZCxfY3J5cHRvX29uZXRpbWVhdXRoX2ZpbmFsOlBiLF9jcnlwdG9fc2VjcmV0Ym94X29wZW5fZWFzeTp1YyxfY3J5cHRvX2dlbmVyaWNoYXNoX2ZpbmFsOnpiLF9yYW5kb21ieXRlc191bmlmb3JtOmFkLF9jcnlwdG9fc2lnbl9zZWVkX2tleXBhaXI6Q2MsX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfb3BzbGltaXRfaW50ZXJhY3RpdmU6YWMsX2NyeXB0b19vbmV0aW1lYXV0aF9pbml0Ok5iLHJ1blBvc3RTZXRzOkJkLHN0YWNrQWxsb2M6SGEsc3RhY2tTYXZlOklhLHN0YWNrUmVzdG9yZTpKYSxlc3RhYmxpc2hTdGFja1NwYWNlOkthLHNldFRocmV3OkxhLHNldFRlbXBSZXQwOk9hLGdldFRlbXBSZXQwOlBhLGR5bkNhbGxfaTpTZCxkeW5DYWxsX2lpOiRkLGR5bkNhbGxfaWlpaTppZSxkeW5DYWxsX3ZpOnJlfX0pXG5cblxuLy8gRU1TQ1JJUFRFTl9FTkRfQVNNXG4oTW9kdWxlLmFzbUdsb2JhbEFyZyxNb2R1bGUuYXNtTGlicmFyeUFyZyxidWZmZXIpO3ZhciBfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9taW5vcj1Nb2R1bGVbXCJfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9taW5vclwiXT1hc21bXCJfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9taW5vclwiXTt2YXIgX2NyeXB0b19vbmV0aW1lYXV0aF9ieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX29uZXRpbWVhdXRoX2J5dGVzXCJdPWFzbVtcIl9jcnlwdG9fb25ldGltZWF1dGhfYnl0ZXNcIl07dmFyIF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X21lbWxpbWl0X3NlbnNpdGl2ZT1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9tZW1saW1pdF9zZW5zaXRpdmVcIl09YXNtW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfbWVtbGltaXRfc2Vuc2l0aXZlXCJdO3ZhciBfYml0c2hpZnQ2NExzaHI9TW9kdWxlW1wiX2JpdHNoaWZ0NjRMc2hyXCJdPWFzbVtcIl9iaXRzaGlmdDY0THNoclwiXTt2YXIgX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTY9TW9kdWxlW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZcIl09YXNtW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZcIl07dmFyIF9jcnlwdG9fYm94X25vbmNlYnl0ZXM9TW9kdWxlW1wiX2NyeXB0b19ib3hfbm9uY2VieXRlc1wiXT1hc21bXCJfY3J5cHRvX2JveF9ub25jZWJ5dGVzXCJdO3ZhciBfY3J5cHRvX2JveF9iZWZvcmVubT1Nb2R1bGVbXCJfY3J5cHRvX2JveF9iZWZvcmVubVwiXT1hc21bXCJfY3J5cHRvX2JveF9iZWZvcmVubVwiXTt2YXIgX2NyeXB0b19zY2FsYXJtdWx0X2Jhc2U9TW9kdWxlW1wiX2NyeXB0b19zY2FsYXJtdWx0X2Jhc2VcIl09YXNtW1wiX2NyeXB0b19zY2FsYXJtdWx0X2Jhc2VcIl07dmFyIF9jcnlwdG9fYXV0aF9ieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2F1dGhfYnl0ZXNcIl09YXNtW1wiX2NyeXB0b19hdXRoX2J5dGVzXCJdO3ZhciBfY3J5cHRvX3NpZ25fb3Blbj1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25fb3BlblwiXT1hc21bXCJfY3J5cHRvX3NpZ25fb3BlblwiXTt2YXIgX21lbWNweT1Nb2R1bGVbXCJfbWVtY3B5XCJdPWFzbVtcIl9tZW1jcHlcIl07dmFyIF9jcnlwdG9fYm94X3NlZWRfa2V5cGFpcj1Nb2R1bGVbXCJfY3J5cHRvX2JveF9zZWVkX2tleXBhaXJcIl09YXNtW1wiX2NyeXB0b19ib3hfc2VlZF9rZXlwYWlyXCJdO3ZhciBfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9tZW1saW1pdF9pbnRlcmFjdGl2ZT1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9tZW1saW1pdF9pbnRlcmFjdGl2ZVwiXT1hc21bXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9tZW1saW1pdF9pbnRlcmFjdGl2ZVwiXTt2YXIgX2NyeXB0b19ib3hfb3Blbl9lYXN5X2FmdGVybm09TW9kdWxlW1wiX2NyeXB0b19ib3hfb3Blbl9lYXN5X2FmdGVybm1cIl09YXNtW1wiX2NyeXB0b19ib3hfb3Blbl9lYXN5X2FmdGVybm1cIl07dmFyIF9jcnlwdG9fc2lnbl9lZDI1NTE5X3NrX3RvX2N1cnZlMjU1MTk9TW9kdWxlW1wiX2NyeXB0b19zaWduX2VkMjU1MTlfc2tfdG9fY3VydmUyNTUxOVwiXT1hc21bXCJfY3J5cHRvX3NpZ25fZWQyNTUxOV9za190b19jdXJ2ZTI1NTE5XCJdO3ZhciBfc29kaXVtX21lbXplcm89TW9kdWxlW1wiX3NvZGl1bV9tZW16ZXJvXCJdPWFzbVtcIl9zb2RpdW1fbWVtemVyb1wiXTt2YXIgX2NyeXB0b19ib3hfc2VhbD1Nb2R1bGVbXCJfY3J5cHRvX2JveF9zZWFsXCJdPWFzbVtcIl9jcnlwdG9fYm94X3NlYWxcIl07dmFyIF9mcmVlPU1vZHVsZVtcIl9mcmVlXCJdPWFzbVtcIl9mcmVlXCJdO3ZhciBydW5Qb3N0U2V0cz1Nb2R1bGVbXCJydW5Qb3N0U2V0c1wiXT1hc21bXCJydW5Qb3N0U2V0c1wiXTt2YXIgX2NyeXB0b19zaG9ydGhhc2g9TW9kdWxlW1wiX2NyeXB0b19zaG9ydGhhc2hcIl09YXNtW1wiX2NyeXB0b19zaG9ydGhhc2hcIl07dmFyIF9jcnlwdG9fYXV0aF9rZXlieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2F1dGhfa2V5Ynl0ZXNcIl09YXNtW1wiX2NyeXB0b19hdXRoX2tleWJ5dGVzXCJdO3ZhciBfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zYWx0Ynl0ZXM9TW9kdWxlW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc2FsdGJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3NhbHRieXRlc1wiXTt2YXIgX2NyeXB0b19zaWduX3NlZWRieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25fc2VlZGJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fc2lnbl9zZWVkYnl0ZXNcIl07dmFyIF9jcnlwdG9fYm94X2RldGFjaGVkX2FmdGVybm09TW9kdWxlW1wiX2NyeXB0b19ib3hfZGV0YWNoZWRfYWZ0ZXJubVwiXT1hc21bXCJfY3J5cHRvX2JveF9kZXRhY2hlZF9hZnRlcm5tXCJdO3ZhciBfY3J5cHRvX2F1dGg9TW9kdWxlW1wiX2NyeXB0b19hdXRoXCJdPWFzbVtcIl9jcnlwdG9fYXV0aFwiXTt2YXIgX3JhbmRvbWJ5dGVzX3JhbmRvbT1Nb2R1bGVbXCJfcmFuZG9tYnl0ZXNfcmFuZG9tXCJdPWFzbVtcIl9yYW5kb21ieXRlc19yYW5kb21cIl07dmFyIF9jcnlwdG9fc2lnbl9rZXlwYWlyPU1vZHVsZVtcIl9jcnlwdG9fc2lnbl9rZXlwYWlyXCJdPWFzbVtcIl9jcnlwdG9fc2lnbl9rZXlwYWlyXCJdO3ZhciBfY3J5cHRvX2dlbmVyaWNoYXNoX2tleWJ5dGVzX21pbj1Nb2R1bGVbXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2tleWJ5dGVzX21pblwiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2tleWJ5dGVzX21pblwiXTt2YXIgX2NyeXB0b19nZW5lcmljaGFzaF9zdGF0ZWJ5dGVzPU1vZHVsZVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfc3RhdGVieXRlc1wiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoX3N0YXRlYnl0ZXNcIl07dmFyIF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cl92ZXJpZnk9TW9kdWxlW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyX3ZlcmlmeVwiXT1hc21bXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJfdmVyaWZ5XCJdO3ZhciBfc29kaXVtX3ZlcnNpb25fc3RyaW5nPU1vZHVsZVtcIl9zb2RpdW1fdmVyc2lvbl9zdHJpbmdcIl09YXNtW1wiX3NvZGl1bV92ZXJzaW9uX3N0cmluZ1wiXTt2YXIgX2NyeXB0b19nZW5lcmljaGFzaF9rZXlieXRlc19tYXg9TW9kdWxlW1wiX2NyeXB0b19nZW5lcmljaGFzaF9rZXlieXRlc19tYXhcIl09YXNtW1wiX2NyeXB0b19nZW5lcmljaGFzaF9rZXlieXRlc19tYXhcIl07dmFyIF9jcnlwdG9fc2lnbl9lZDI1NTE5X3BrX3RvX2N1cnZlMjU1MTk9TW9kdWxlW1wiX2NyeXB0b19zaWduX2VkMjU1MTlfcGtfdG9fY3VydmUyNTUxOVwiXT1hc21bXCJfY3J5cHRvX3NpZ25fZWQyNTUxOV9wa190b19jdXJ2ZTI1NTE5XCJdO3ZhciBfY3J5cHRvX3NpZ25fcHVibGlja2V5Ynl0ZXM9TW9kdWxlW1wiX2NyeXB0b19zaWduX3B1YmxpY2tleWJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fc2lnbl9wdWJsaWNrZXlieXRlc1wiXTt2YXIgX2NyeXB0b19ib3hfYmVmb3Jlbm1ieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2JveF9iZWZvcmVubWJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fYm94X2JlZm9yZW5tYnl0ZXNcIl07dmFyIF9jcnlwdG9fZ2VuZXJpY2hhc2g9TW9kdWxlW1wiX2NyeXB0b19nZW5lcmljaGFzaFwiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoXCJdO3ZhciBfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9tYWpvcj1Nb2R1bGVbXCJfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9tYWpvclwiXT1hc21bXCJfc29kaXVtX2xpYnJhcnlfdmVyc2lvbl9tYWpvclwiXTt2YXIgX3JhbmRvbWJ5dGVzX3N0aXI9TW9kdWxlW1wiX3JhbmRvbWJ5dGVzX3N0aXJcIl09YXNtW1wiX3JhbmRvbWJ5dGVzX3N0aXJcIl07dmFyIF9jcnlwdG9fc2hvcnRoYXNoX2tleWJ5dGVzPU1vZHVsZVtcIl9jcnlwdG9fc2hvcnRoYXNoX2tleWJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fc2hvcnRoYXNoX2tleWJ5dGVzXCJdO3ZhciBfcmFuZG9tYnl0ZXNfY2xvc2U9TW9kdWxlW1wiX3JhbmRvbWJ5dGVzX2Nsb3NlXCJdPWFzbVtcIl9yYW5kb21ieXRlc19jbG9zZVwiXTt2YXIgX2NyeXB0b19vbmV0aW1lYXV0aF9rZXlieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX29uZXRpbWVhdXRoX2tleWJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fb25ldGltZWF1dGhfa2V5Ynl0ZXNcIl07dmFyIF9jcnlwdG9fb25ldGltZWF1dGg9TW9kdWxlW1wiX2NyeXB0b19vbmV0aW1lYXV0aFwiXT1hc21bXCJfY3J5cHRvX29uZXRpbWVhdXRoXCJdO3ZhciBfY3J5cHRvX3Nob3J0aGFzaF9ieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3Nob3J0aGFzaF9ieXRlc1wiXT1hc21bXCJfY3J5cHRvX3Nob3J0aGFzaF9ieXRlc1wiXTt2YXIgX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXM9TW9kdWxlW1wiX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXNcIl09YXNtW1wiX2NyeXB0b19ib3hfc2VjcmV0a2V5Ynl0ZXNcIl07dmFyIF9jcnlwdG9fb25ldGltZWF1dGhfdXBkYXRlPU1vZHVsZVtcIl9jcnlwdG9fb25ldGltZWF1dGhfdXBkYXRlXCJdPWFzbVtcIl9jcnlwdG9fb25ldGltZWF1dGhfdXBkYXRlXCJdO3ZhciBfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9sbD1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9sbFwiXT1hc21bXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9sbFwiXTt2YXIgX2NyeXB0b19ib3hfZGV0YWNoZWQ9TW9kdWxlW1wiX2NyeXB0b19ib3hfZGV0YWNoZWRcIl09YXNtW1wiX2NyeXB0b19ib3hfZGV0YWNoZWRcIl07dmFyIF9yYW5kb21ieXRlc19idWY9TW9kdWxlW1wiX3JhbmRvbWJ5dGVzX2J1ZlwiXT1hc21bXCJfcmFuZG9tYnl0ZXNfYnVmXCJdO3ZhciBfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJieXRlc1wiXT1hc21bXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJieXRlc1wiXTt2YXIgX2JpdHNoaWZ0NjRBc2hyPU1vZHVsZVtcIl9iaXRzaGlmdDY0QXNoclwiXT1hc21bXCJfYml0c2hpZnQ2NEFzaHJcIl07dmFyIF9jcnlwdG9fYm94X29wZW5fZGV0YWNoZWQ9TW9kdWxlW1wiX2NyeXB0b19ib3hfb3Blbl9kZXRhY2hlZFwiXT1hc21bXCJfY3J5cHRvX2JveF9vcGVuX2RldGFjaGVkXCJdO3ZhciBfY3J5cHRvX3NjYWxhcm11bHRfYnl0ZXM9TW9kdWxlW1wiX2NyeXB0b19zY2FsYXJtdWx0X2J5dGVzXCJdPWFzbVtcIl9jcnlwdG9fc2NhbGFybXVsdF9ieXRlc1wiXTt2YXIgX2NyeXB0b19hdXRoX3ZlcmlmeT1Nb2R1bGVbXCJfY3J5cHRvX2F1dGhfdmVyaWZ5XCJdPWFzbVtcIl9jcnlwdG9fYXV0aF92ZXJpZnlcIl07dmFyIF9jcnlwdG9fc2lnbl9kZXRhY2hlZD1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25fZGV0YWNoZWRcIl09YXNtW1wiX2NyeXB0b19zaWduX2RldGFjaGVkXCJdO3ZhciBfY3J5cHRvX3NlY3JldGJveF9kZXRhY2hlZD1Nb2R1bGVbXCJfY3J5cHRvX3NlY3JldGJveF9kZXRhY2hlZFwiXT1hc21bXCJfY3J5cHRvX3NlY3JldGJveF9kZXRhY2hlZFwiXTt2YXIgX2NyeXB0b19zZWNyZXRib3hfZWFzeT1Nb2R1bGVbXCJfY3J5cHRvX3NlY3JldGJveF9lYXN5XCJdPWFzbVtcIl9jcnlwdG9fc2VjcmV0Ym94X2Vhc3lcIl07dmFyIF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cj1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJcIl09YXNtW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RyXCJdO3ZhciBfbWVtc2V0PU1vZHVsZVtcIl9tZW1zZXRcIl09YXNtW1wiX21lbXNldFwiXTt2YXIgX2NyeXB0b19ib3hfb3Blbl9kZXRhY2hlZF9hZnRlcm5tPU1vZHVsZVtcIl9jcnlwdG9fYm94X29wZW5fZGV0YWNoZWRfYWZ0ZXJubVwiXT1hc21bXCJfY3J5cHRvX2JveF9vcGVuX2RldGFjaGVkX2FmdGVybm1cIl07dmFyIF9jcnlwdG9fYm94X3NlYWxieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2JveF9zZWFsYnl0ZXNcIl09YXNtW1wiX2NyeXB0b19ib3hfc2VhbGJ5dGVzXCJdO3ZhciBfaTY0U3VidHJhY3Q9TW9kdWxlW1wiX2k2NFN1YnRyYWN0XCJdPWFzbVtcIl9pNjRTdWJ0cmFjdFwiXTt2YXIgX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfc3RycHJlZml4PU1vZHVsZVtcIl9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X3N0cnByZWZpeFwiXT1hc21bXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9zdHJwcmVmaXhcIl07dmFyIF9jcnlwdG9fYm94X3NlZWRieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2JveF9zZWVkYnl0ZXNcIl09YXNtW1wiX2NyeXB0b19ib3hfc2VlZGJ5dGVzXCJdO3ZhciBfY3J5cHRvX2hhc2g9TW9kdWxlW1wiX2NyeXB0b19oYXNoXCJdPWFzbVtcIl9jcnlwdG9faGFzaFwiXTt2YXIgX2NyeXB0b19ib3hfZWFzeV9hZnRlcm5tPU1vZHVsZVtcIl9jcnlwdG9fYm94X2Vhc3lfYWZ0ZXJubVwiXT1hc21bXCJfY3J5cHRvX2JveF9lYXN5X2FmdGVybm1cIl07dmFyIF9jcnlwdG9fYm94X21hY2J5dGVzPU1vZHVsZVtcIl9jcnlwdG9fYm94X21hY2J5dGVzXCJdPWFzbVtcIl9jcnlwdG9fYm94X21hY2J5dGVzXCJdO3ZhciBfY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlc1wiXT1hc21bXCJfY3J5cHRvX2JveF9wdWJsaWNrZXlieXRlc1wiXTt2YXIgX3NvZGl1bV9iaW4yaGV4PU1vZHVsZVtcIl9zb2RpdW1fYmluMmhleFwiXT1hc21bXCJfc29kaXVtX2JpbjJoZXhcIl07dmFyIF9jcnlwdG9fc2lnbl9zZWNyZXRrZXlieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25fc2VjcmV0a2V5Ynl0ZXNcIl09YXNtW1wiX2NyeXB0b19zaWduX3NlY3JldGtleWJ5dGVzXCJdO3ZhciBfY3J5cHRvX3NjYWxhcm11bHRfc2NhbGFyYnl0ZXM9TW9kdWxlW1wiX2NyeXB0b19zY2FsYXJtdWx0X3NjYWxhcmJ5dGVzXCJdPWFzbVtcIl9jcnlwdG9fc2NhbGFybXVsdF9zY2FsYXJieXRlc1wiXTt2YXIgX2NyeXB0b19vbmV0aW1lYXV0aF9zdGF0ZWJ5dGVzPU1vZHVsZVtcIl9jcnlwdG9fb25ldGltZWF1dGhfc3RhdGVieXRlc1wiXT1hc21bXCJfY3J5cHRvX29uZXRpbWVhdXRoX3N0YXRlYnl0ZXNcIl07dmFyIF9jcnlwdG9fZ2VuZXJpY2hhc2hfYnl0ZXNfbWluPU1vZHVsZVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfYnl0ZXNfbWluXCJdPWFzbVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfYnl0ZXNfbWluXCJdO3ZhciBfbWFsbG9jPU1vZHVsZVtcIl9tYWxsb2NcIl09YXNtW1wiX21hbGxvY1wiXTt2YXIgX2NyeXB0b19zZWNyZXRib3hfb3Blbl9lYXN5PU1vZHVsZVtcIl9jcnlwdG9fc2VjcmV0Ym94X29wZW5fZWFzeVwiXT1hc21bXCJfY3J5cHRvX3NlY3JldGJveF9vcGVuX2Vhc3lcIl07dmFyIF9jcnlwdG9fc2lnbj1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25cIl09YXNtW1wiX2NyeXB0b19zaWduXCJdO3ZhciBfY3J5cHRvX3NlY3JldGJveF9ub25jZWJ5dGVzPU1vZHVsZVtcIl9jcnlwdG9fc2VjcmV0Ym94X25vbmNlYnl0ZXNcIl09YXNtW1wiX2NyeXB0b19zZWNyZXRib3hfbm9uY2VieXRlc1wiXTt2YXIgX3JhbmRvbWJ5dGVzX3NldF9pbXBsZW1lbnRhdGlvbj1Nb2R1bGVbXCJfcmFuZG9tYnl0ZXNfc2V0X2ltcGxlbWVudGF0aW9uXCJdPWFzbVtcIl9yYW5kb21ieXRlc19zZXRfaW1wbGVtZW50YXRpb25cIl07dmFyIF9jcnlwdG9fYm94X2tleXBhaXI9TW9kdWxlW1wiX2NyeXB0b19ib3hfa2V5cGFpclwiXT1hc21bXCJfY3J5cHRvX2JveF9rZXlwYWlyXCJdO3ZhciBfY3J5cHRvX2dlbmVyaWNoYXNoX2tleWJ5dGVzPU1vZHVsZVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfa2V5Ynl0ZXNcIl09YXNtW1wiX2NyeXB0b19nZW5lcmljaGFzaF9rZXlieXRlc1wiXTt2YXIgX3NvZGl1bV9oZXgyYmluPU1vZHVsZVtcIl9zb2RpdW1faGV4MmJpblwiXT1hc21bXCJfc29kaXVtX2hleDJiaW5cIl07dmFyIF9zb2RpdW1faW5pdD1Nb2R1bGVbXCJfc29kaXVtX2luaXRcIl09YXNtW1wiX3NvZGl1bV9pbml0XCJdO3ZhciBfY3J5cHRvX3NlY3JldGJveF9tYWNieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3NlY3JldGJveF9tYWNieXRlc1wiXT1hc21bXCJfY3J5cHRvX3NlY3JldGJveF9tYWNieXRlc1wiXTt2YXIgX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXM9TW9kdWxlW1wiX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXNcIl09YXNtW1wiX2NyeXB0b19zZWNyZXRib3hfa2V5Ynl0ZXNcIl07dmFyIF9iaXRzaGlmdDY0U2hsPU1vZHVsZVtcIl9iaXRzaGlmdDY0U2hsXCJdPWFzbVtcIl9iaXRzaGlmdDY0U2hsXCJdO3ZhciBfY3J5cHRvX2hhc2hfYnl0ZXM9TW9kdWxlW1wiX2NyeXB0b19oYXNoX2J5dGVzXCJdPWFzbVtcIl9jcnlwdG9faGFzaF9ieXRlc1wiXTt2YXIgX2ZmbHVzaD1Nb2R1bGVbXCJfZmZsdXNoXCJdPWFzbVtcIl9mZmx1c2hcIl07dmFyIF9jcnlwdG9fZ2VuZXJpY2hhc2hfYnl0ZXM9TW9kdWxlW1wiX2NyeXB0b19nZW5lcmljaGFzaF9ieXRlc1wiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2J5dGVzXCJdO3ZhciBfY3J5cHRvX2dlbmVyaWNoYXNoX2J5dGVzX21heD1Nb2R1bGVbXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2J5dGVzX21heFwiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2J5dGVzX21heFwiXTt2YXIgX2NyeXB0b19zZWNyZXRib3hfb3Blbl9kZXRhY2hlZD1Nb2R1bGVbXCJfY3J5cHRvX3NlY3JldGJveF9vcGVuX2RldGFjaGVkXCJdPWFzbVtcIl9jcnlwdG9fc2VjcmV0Ym94X29wZW5fZGV0YWNoZWRcIl07dmFyIF9jcnlwdG9fc2lnbl92ZXJpZnlfZGV0YWNoZWQ9TW9kdWxlW1wiX2NyeXB0b19zaWduX3ZlcmlmeV9kZXRhY2hlZFwiXT1hc21bXCJfY3J5cHRvX3NpZ25fdmVyaWZ5X2RldGFjaGVkXCJdO3ZhciBfY3J5cHRvX29uZXRpbWVhdXRoX3ZlcmlmeT1Nb2R1bGVbXCJfY3J5cHRvX29uZXRpbWVhdXRoX3ZlcmlmeVwiXT1hc21bXCJfY3J5cHRvX29uZXRpbWVhdXRoX3ZlcmlmeVwiXTt2YXIgX2NyeXB0b19ib3hfb3Blbl9lYXN5PU1vZHVsZVtcIl9jcnlwdG9fYm94X29wZW5fZWFzeVwiXT1hc21bXCJfY3J5cHRvX2JveF9vcGVuX2Vhc3lcIl07dmFyIF9jcnlwdG9fcHdoYXNoX3NjcnlwdHNhbHNhMjA4c2hhMjU2X29wc2xpbWl0X3NlbnNpdGl2ZT1Nb2R1bGVbXCJfY3J5cHRvX3B3aGFzaF9zY3J5cHRzYWxzYTIwOHNoYTI1Nl9vcHNsaW1pdF9zZW5zaXRpdmVcIl09YXNtW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfb3BzbGltaXRfc2Vuc2l0aXZlXCJdO3ZhciBfY3J5cHRvX2dlbmVyaWNoYXNoX2luaXQ9TW9kdWxlW1wiX2NyeXB0b19nZW5lcmljaGFzaF9pbml0XCJdPWFzbVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfaW5pdFwiXTt2YXIgX2k2NEFkZD1Nb2R1bGVbXCJfaTY0QWRkXCJdPWFzbVtcIl9pNjRBZGRcIl07dmFyIF9jcnlwdG9fc2lnbl9ieXRlcz1Nb2R1bGVbXCJfY3J5cHRvX3NpZ25fYnl0ZXNcIl09YXNtW1wiX2NyeXB0b19zaWduX2J5dGVzXCJdO3ZhciBfY3J5cHRvX2dlbmVyaWNoYXNoX3VwZGF0ZT1Nb2R1bGVbXCJfY3J5cHRvX2dlbmVyaWNoYXNoX3VwZGF0ZVwiXT1hc21bXCJfY3J5cHRvX2dlbmVyaWNoYXNoX3VwZGF0ZVwiXTt2YXIgX2NyeXB0b19zY2FsYXJtdWx0PU1vZHVsZVtcIl9jcnlwdG9fc2NhbGFybXVsdFwiXT1hc21bXCJfY3J5cHRvX3NjYWxhcm11bHRcIl07dmFyIF9jcnlwdG9fYm94X3NlYWxfb3Blbj1Nb2R1bGVbXCJfY3J5cHRvX2JveF9zZWFsX29wZW5cIl09YXNtW1wiX2NyeXB0b19ib3hfc2VhbF9vcGVuXCJdO3ZhciBfY3J5cHRvX2JveF9lYXN5PU1vZHVsZVtcIl9jcnlwdG9fYm94X2Vhc3lcIl09YXNtW1wiX2NyeXB0b19ib3hfZWFzeVwiXTt2YXIgX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1wiX19fZXJybm9fbG9jYXRpb25cIl09YXNtW1wiX19fZXJybm9fbG9jYXRpb25cIl07dmFyIF9jcnlwdG9fb25ldGltZWF1dGhfZmluYWw9TW9kdWxlW1wiX2NyeXB0b19vbmV0aW1lYXV0aF9maW5hbFwiXT1hc21bXCJfY3J5cHRvX29uZXRpbWVhdXRoX2ZpbmFsXCJdO3ZhciBfbWVtbW92ZT1Nb2R1bGVbXCJfbWVtbW92ZVwiXT1hc21bXCJfbWVtbW92ZVwiXTt2YXIgX2NyeXB0b19nZW5lcmljaGFzaF9maW5hbD1Nb2R1bGVbXCJfY3J5cHRvX2dlbmVyaWNoYXNoX2ZpbmFsXCJdPWFzbVtcIl9jcnlwdG9fZ2VuZXJpY2hhc2hfZmluYWxcIl07dmFyIF9yYW5kb21ieXRlc191bmlmb3JtPU1vZHVsZVtcIl9yYW5kb21ieXRlc191bmlmb3JtXCJdPWFzbVtcIl9yYW5kb21ieXRlc191bmlmb3JtXCJdO3ZhciBfY3J5cHRvX3NpZ25fc2VlZF9rZXlwYWlyPU1vZHVsZVtcIl9jcnlwdG9fc2lnbl9zZWVkX2tleXBhaXJcIl09YXNtW1wiX2NyeXB0b19zaWduX3NlZWRfa2V5cGFpclwiXTt2YXIgX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfb3BzbGltaXRfaW50ZXJhY3RpdmU9TW9kdWxlW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfb3BzbGltaXRfaW50ZXJhY3RpdmVcIl09YXNtW1wiX2NyeXB0b19wd2hhc2hfc2NyeXB0c2Fsc2EyMDhzaGEyNTZfb3BzbGltaXRfaW50ZXJhY3RpdmVcIl07dmFyIF9jcnlwdG9fb25ldGltZWF1dGhfaW5pdD1Nb2R1bGVbXCJfY3J5cHRvX29uZXRpbWVhdXRoX2luaXRcIl09YXNtW1wiX2NyeXB0b19vbmV0aW1lYXV0aF9pbml0XCJdO3ZhciBkeW5DYWxsX2k9TW9kdWxlW1wiZHluQ2FsbF9pXCJdPWFzbVtcImR5bkNhbGxfaVwiXTt2YXIgZHluQ2FsbF9paT1Nb2R1bGVbXCJkeW5DYWxsX2lpXCJdPWFzbVtcImR5bkNhbGxfaWlcIl07dmFyIGR5bkNhbGxfaWlpaT1Nb2R1bGVbXCJkeW5DYWxsX2lpaWlcIl09YXNtW1wiZHluQ2FsbF9paWlpXCJdO3ZhciBkeW5DYWxsX3ZpPU1vZHVsZVtcImR5bkNhbGxfdmlcIl09YXNtW1wiZHluQ2FsbF92aVwiXTtSdW50aW1lLnN0YWNrQWxsb2M9YXNtW1wic3RhY2tBbGxvY1wiXTtSdW50aW1lLnN0YWNrU2F2ZT1hc21bXCJzdGFja1NhdmVcIl07UnVudGltZS5zdGFja1Jlc3RvcmU9YXNtW1wic3RhY2tSZXN0b3JlXCJdO1J1bnRpbWUuZXN0YWJsaXNoU3RhY2tTcGFjZT1hc21bXCJlc3RhYmxpc2hTdGFja1NwYWNlXCJdO1J1bnRpbWUuc2V0VGVtcFJldDA9YXNtW1wic2V0VGVtcFJldDBcIl07UnVudGltZS5nZXRUZW1wUmV0MD1hc21bXCJnZXRUZW1wUmV0MFwiXTtmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cyl7dGhpcy5uYW1lPVwiRXhpdFN0YXR1c1wiO3RoaXMubWVzc2FnZT1cIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoXCIrc3RhdHVzK1wiKVwiO3RoaXMuc3RhdHVzPXN0YXR1c31FeGl0U3RhdHVzLnByb3RvdHlwZT1uZXcgRXJyb3I7RXhpdFN0YXR1cy5wcm90b3R5cGUuY29uc3RydWN0b3I9RXhpdFN0YXR1czt2YXIgaW5pdGlhbFN0YWNrVG9wO3ZhciBwcmVsb2FkU3RhcnRUaW1lPW51bGw7dmFyIGNhbGxlZE1haW49ZmFsc2U7ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPWZ1bmN0aW9uIHJ1bkNhbGxlcigpe2lmKCFNb2R1bGVbXCJjYWxsZWRSdW5cIl0pcnVuKCk7aWYoIU1vZHVsZVtcImNhbGxlZFJ1blwiXSlkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtNb2R1bGVbXCJjYWxsTWFpblwiXT1Nb2R1bGUuY2FsbE1haW49ZnVuY3Rpb24gY2FsbE1haW4oYXJncyl7YXNzZXJ0KHJ1bkRlcGVuZGVuY2llcz09MCxcImNhbm5vdCBjYWxsIG1haW4gd2hlbiBhc3luYyBkZXBlbmRlbmNpZXMgcmVtYWluISAobGlzdGVuIG9uIF9fQVRNQUlOX18pXCIpO2Fzc2VydChfX0FUUFJFUlVOX18ubGVuZ3RoPT0wLFwiY2Fubm90IGNhbGwgbWFpbiB3aGVuIHByZVJ1biBmdW5jdGlvbnMgcmVtYWluIHRvIGJlIGNhbGxlZFwiKTthcmdzPWFyZ3N8fFtdO2Vuc3VyZUluaXRSdW50aW1lKCk7dmFyIGFyZ2M9YXJncy5sZW5ndGgrMTtmdW5jdGlvbiBwYWQoKXtmb3IodmFyIGk9MDtpPDQtMTtpKyspe2FyZ3YucHVzaCgwKX19dmFyIGFyZ3Y9W2FsbG9jYXRlKGludEFycmF5RnJvbVN0cmluZyhNb2R1bGVbXCJ0aGlzUHJvZ3JhbVwiXSksXCJpOFwiLEFMTE9DX05PUk1BTCldO3BhZCgpO2Zvcih2YXIgaT0wO2k8YXJnYy0xO2k9aSsxKXthcmd2LnB1c2goYWxsb2NhdGUoaW50QXJyYXlGcm9tU3RyaW5nKGFyZ3NbaV0pLFwiaThcIixBTExPQ19OT1JNQUwpKTtwYWQoKX1hcmd2LnB1c2goMCk7YXJndj1hbGxvY2F0ZShhcmd2LFwiaTMyXCIsQUxMT0NfTk9STUFMKTt0cnl7dmFyIHJldD1Nb2R1bGVbXCJfbWFpblwiXShhcmdjLGFyZ3YsMCk7ZXhpdChyZXQsdHJ1ZSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXMpe3JldHVybn1lbHNlIGlmKGU9PVwiU2ltdWxhdGVJbmZpbml0ZUxvb3BcIil7TW9kdWxlW1wibm9FeGl0UnVudGltZVwiXT10cnVlO3JldHVybn1lbHNle2lmKGUmJnR5cGVvZiBlPT09XCJvYmplY3RcIiYmZS5zdGFjaylNb2R1bGUucHJpbnRFcnIoXCJleGNlcHRpb24gdGhyb3duOiBcIitbZSxlLnN0YWNrXSk7dGhyb3cgZX19ZmluYWxseXtjYWxsZWRNYWluPXRydWV9fTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxNb2R1bGVbXCJhcmd1bWVudHNcIl07aWYocHJlbG9hZFN0YXJ0VGltZT09PW51bGwpcHJlbG9hZFN0YXJ0VGltZT1EYXRlLm5vdygpO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59cHJlUnVuKCk7aWYocnVuRGVwZW5kZW5jaWVzPjApcmV0dXJuO2lmKE1vZHVsZVtcImNhbGxlZFJ1blwiXSlyZXR1cm47ZnVuY3Rpb24gZG9SdW4oKXtpZihNb2R1bGVbXCJjYWxsZWRSdW5cIl0pcmV0dXJuO01vZHVsZVtcImNhbGxlZFJ1blwiXT10cnVlO2lmKEFCT1JUKXJldHVybjtlbnN1cmVJbml0UnVudGltZSgpO3ByZU1haW4oKTtpZihNb2R1bGVbXCJvblJ1bnRpbWVJbml0aWFsaXplZFwiXSlNb2R1bGVbXCJvblJ1bnRpbWVJbml0aWFsaXplZFwiXSgpO2lmKE1vZHVsZVtcIl9tYWluXCJdJiZzaG91bGRSdW5Ob3cpTW9kdWxlW1wiY2FsbE1haW5cIl0oYXJncyk7cG9zdFJ1bigpfWlmKE1vZHVsZVtcInNldFN0YXR1c1wiXSl7TW9kdWxlW1wic2V0U3RhdHVzXCJdKFwiUnVubmluZy4uLlwiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7TW9kdWxlW1wic2V0U3RhdHVzXCJdKFwiXCIpfSksMSk7ZG9SdW4oKX0pLDEpfWVsc2V7ZG9SdW4oKX19TW9kdWxlW1wicnVuXCJdPU1vZHVsZS5ydW49cnVuO2Z1bmN0aW9uIGV4aXQoc3RhdHVzLGltcGxpY2l0KXtpZihpbXBsaWNpdCYmTW9kdWxlW1wibm9FeGl0UnVudGltZVwiXSl7cmV0dXJufWlmKE1vZHVsZVtcIm5vRXhpdFJ1bnRpbWVcIl0pe31lbHNle0FCT1JUPXRydWU7RVhJVFNUQVRVUz1zdGF0dXM7U1RBQ0tUT1A9aW5pdGlhbFN0YWNrVG9wO2V4aXRSdW50aW1lKCk7aWYoTW9kdWxlW1wib25FeGl0XCJdKU1vZHVsZVtcIm9uRXhpdFwiXShzdGF0dXMpfWlmKEVOVklST05NRU5UX0lTX05PREUpe3Byb2Nlc3NbXCJzdGRvdXRcIl1bXCJvbmNlXCJdKFwiZHJhaW5cIiwoZnVuY3Rpb24oKXtwcm9jZXNzW1wiZXhpdFwiXShzdGF0dXMpfSkpO2NvbnNvbGUubG9nKFwiIFwiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Byb2Nlc3NbXCJleGl0XCJdKHN0YXR1cyl9KSw1MDApfWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwmJnR5cGVvZiBxdWl0PT09XCJmdW5jdGlvblwiKXtxdWl0KHN0YXR1cyl9dGhyb3cgbmV3IEV4aXRTdGF0dXMoc3RhdHVzKX1Nb2R1bGVbXCJleGl0XCJdPU1vZHVsZS5leGl0PWV4aXQ7dmFyIGFib3J0RGVjb3JhdG9ycz1bXTtmdW5jdGlvbiBhYm9ydCh3aGF0KXtpZih3aGF0IT09dW5kZWZpbmVkKXtNb2R1bGUucHJpbnQod2hhdCk7TW9kdWxlLnByaW50RXJyKHdoYXQpO3doYXQ9SlNPTi5zdHJpbmdpZnkod2hhdCl9ZWxzZXt3aGF0PVwiXCJ9QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPTE7dmFyIGV4dHJhPVwiXFxuSWYgdGhpcyBhYm9ydCgpIGlzIHVuZXhwZWN0ZWQsIGJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIHdoaWNoIGNhbiBnaXZlIG1vcmUgaW5mb3JtYXRpb24uXCI7dmFyIG91dHB1dD1cImFib3J0KFwiK3doYXQrXCIpIGF0IFwiK3N0YWNrVHJhY2UoKStleHRyYTtpZihhYm9ydERlY29yYXRvcnMpe2Fib3J0RGVjb3JhdG9ycy5mb3JFYWNoKChmdW5jdGlvbihkZWNvcmF0b3Ipe291dHB1dD1kZWNvcmF0b3Iob3V0cHV0LHdoYXQpfSkpfXRocm93IG91dHB1dH1Nb2R1bGVbXCJhYm9ydFwiXT1Nb2R1bGUuYWJvcnQ9YWJvcnQ7aWYoTW9kdWxlW1wicHJlSW5pdFwiXSl7aWYodHlwZW9mIE1vZHVsZVtcInByZUluaXRcIl09PVwiZnVuY3Rpb25cIilNb2R1bGVbXCJwcmVJbml0XCJdPVtNb2R1bGVbXCJwcmVJbml0XCJdXTt3aGlsZShNb2R1bGVbXCJwcmVJbml0XCJdLmxlbmd0aD4wKXtNb2R1bGVbXCJwcmVJbml0XCJdLnBvcCgpKCl9fXZhciBzaG91bGRSdW5Ob3c9dHJ1ZTtpZihNb2R1bGVbXCJub0luaXRpYWxSdW5cIl0pe3Nob3VsZFJ1bk5vdz1mYWxzZX1ydW4oKVxuXG5cblxuXG4gICAgcmV0dXJuIE1vZHVsZTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEdldCB0aGUgY291bnQgb2YgdGhlIGxvbmdlc3QgcmVwZWF0aW5nIHN0cmVhayBvZlxuICogYGNoYXJhY3RlcmAgaW4gYHZhbHVlYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBsb25nZXN0U3RyZWFrKCdgIGZvbyBgYCBiYXIgYCcsICdgJykgLy8gMlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIENvbnRlbnQsIGNvZXJjZWQgdG8gc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJhY3RlciAtIFNpbmdsZSBjaGFyYWN0ZXIgdG8gbG9va1xuICogICBmb3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IC0gTnVtYmVyIG9mIGNoYXJhY3RlcnMgYXQgdGhlIHBsYWNlXG4gKiAgIHdoZXJlIGBjaGFyYWN0ZXJgIG9jY3VycyBpbiBpdHMgbG9uZ2VzdCBzdHJlYWsgaW5cbiAqICAgYHZhbHVlYC5cbiAqIEB0aHJvd3Mge0Vycm9yfSAtIHdoZW4gYGNoYXJhY3RlcmAgaXMgbm90IGEgc2luZ2xlXG4gKiAgIGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gbG9uZ2VzdFN0cmVhayh2YWx1ZSwgY2hhcmFjdGVyKSB7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgbWF4aW11bSA9IDA7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIGxlbmd0aDtcblxuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG5cbiAgICBpZiAodHlwZW9mIGNoYXJhY3RlciAhPT0gJ3N0cmluZycgfHwgY2hhcmFjdGVyLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGNoYXJhY3RlcicpO1xuICAgIH1cblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBjaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG5cbiAgICAgICAgICAgIGlmIChjb3VudCA+IG1heGltdW0pIHtcbiAgICAgICAgICAgICAgICBtYXhpbXVtID0gY291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF4aW11bTtcbn1cblxuLypcbiAqIEV4cG9zZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvbmdlc3RTdHJlYWs7XG4iLCJcbnZhciBsb29wZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG5leHQgKGEsIGIsIGMpIHtcbiAgICB2YXIgbG9vcCA9IHRydWUsIHJldHVybmVkID0gZmFsc2UsIHN5bmMgPSBmYWxzZVxuICAgIGRvIHtcbiAgICAgIHN5bmMgPSB0cnVlOyBsb29wID0gZmFsc2VcbiAgICAgIGZ1bi5jYWxsKGZ1bmN0aW9uICh4LCB5LCB6KSB7XG4gICAgICAgIGlmKHN5bmMpIHtcbiAgICAgICAgICBhID0geDsgYiA9IHk7IGMgPSB6XG4gICAgICAgICAgbG9vcCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgbmV4dCh4LCB5LCB6KVxuICAgICAgfSwgYSwgYiwgYylcbiAgICAgIHN5bmMgPSBmYWxzZVxuICAgIH0gd2hpbGUobG9vcClcbiAgfVxufVxuIiwiXG5leHBvcnRzLmNvbXBhcmUgPSBmdW5jdGlvbiAoYSwgYikge1xuXG4gIGlmKEJ1ZmZlci5pc0J1ZmZlcihhKSkge1xuICAgIHZhciBsID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBjbXAgPSBhW2ldIC0gYltpXVxuICAgICAgaWYoY21wKSByZXR1cm4gY21wXG4gICAgfVxuICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDBcbn1cblxuZnVuY3Rpb24gaGFzKG9iaiwga2V5KSB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcbn1cblxuLy8gdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IGFic3RyYWN0LWxldmVsZG93biB0ZXN0c1xuLy8gbnVsbGlzaCBvciBlbXB0eSBzdHJpbmdzLlxuLy8gSSBjb3VsZCB1c2UgISF2YWwgYnV0IEkgd2FudCB0byBwZXJtaXQgbnVtYmVycyBhbmQgYm9vbGVhbnMsXG4vLyBpZiBwb3NzaWJsZS5cblxuZnVuY3Rpb24gaXNEZWYgKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSAnJ1xufVxuXG5mdW5jdGlvbiBoYXMgKHJhbmdlLCBuYW1lKSB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyYW5nZSwgbmFtZSlcbn1cblxuZnVuY3Rpb24gaGFzS2V5KHJhbmdlLCBuYW1lKSB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyYW5nZSwgbmFtZSkgJiYgbmFtZVxufVxuXG52YXIgbG93ZXJCb3VuZEtleSA9IGV4cG9ydHMubG93ZXJCb3VuZEtleSA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHJldHVybiAoXG4gICAgICAgaGFzS2V5KHJhbmdlLCAnZ3QnKVxuICAgIHx8IGhhc0tleShyYW5nZSwgJ2d0ZScpXG4gICAgfHwgaGFzS2V5KHJhbmdlLCAnbWluJylcbiAgICB8fCAocmFuZ2UucmV2ZXJzZSA/IGhhc0tleShyYW5nZSwgJ2VuZCcpIDogaGFzS2V5KHJhbmdlLCAnc3RhcnQnKSlcbiAgICB8fCB1bmRlZmluZWRcbiAgICApXG59XG5cbnZhciBsb3dlckJvdW5kID0gZXhwb3J0cy5sb3dlckJvdW5kID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gIHZhciBrID0gbG93ZXJCb3VuZEtleShyYW5nZSlcbiAgcmV0dXJuIGsgJiYgcmFuZ2Vba11cbiAgcmV0dXJuIChcbiAgICAgIGhhcyhyYW5nZSwgJ2d0JykgICAgICAgICAgICAgICAgICAgICAgPyByYW5nZS5ndFxuICAgIDogaGFzKHJhbmdlLCAnZ3RlJykgICAgICAgICAgICAgICAgICAgICA/IHJhbmdlLmd0ZVxuICAgIDogaGFzKHJhbmdlLCAnbWluJykgICAgICAgICAgICAgICAgICAgICA/IHJhbmdlLm1pblxuICAgIDogaGFzKHJhbmdlLCAnc3RhcnQnKSAmJiAhcmFuZ2UucmV2ZXJzZSA/IHJhbmdlLnN0YXJ0XG4gICAgOiBoYXMocmFuZ2UsICdlbmQnKSAgICYmIHJhbmdlLnJldmVyc2UgID8gcmFuZ2UuZW5kXG4gICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gIClcbn1cblxuZXhwb3J0cy5sb3dlckJvdW5kSW5jbHVzaXZlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gIHJldHVybiBoYXMocmFuZ2UsICdndCcpID8gZmFsc2UgOiB0cnVlXG59XG5cbmV4cG9ydHMudXBwZXJCb3VuZEluY2x1c2l2ZSA9XG4gIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHJldHVybiBoYXMocmFuZ2UsICdsdCcpIHx8ICFyYW5nZS5taW5FeCA/IGZhbHNlIDogdHJ1ZVxuICB9XG5cbnZhciBsb3dlckJvdW5kRXhjbHVzaXZlID0gZXhwb3J0cy5sb3dlckJvdW5kRXhjbHVzaXZlID1cbiAgZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgcmV0dXJuIGhhcyhyYW5nZSwgJ2d0JykgfHwgcmFuZ2UubWluRXggPyB0cnVlIDogZmFsc2VcbiAgfVxuXG52YXIgdXBwZXJCb3VuZEV4Y2x1c2l2ZSA9IGV4cG9ydHMudXBwZXJCb3VuZEV4Y2x1c2l2ZSA9XG4gIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHJldHVybiBoYXMocmFuZ2UsICdsdCcpID8gdHJ1ZSA6IGZhbHNlXG4gIH1cblxudmFyIHVwcGVyQm91bmRLZXkgPSBleHBvcnRzLnVwcGVyQm91bmRLZXkgPSBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICByZXR1cm4gKFxuICAgICAgIGhhc0tleShyYW5nZSwgJ2x0JylcbiAgICB8fCBoYXNLZXkocmFuZ2UsICdsdGUnKVxuICAgIHx8IGhhc0tleShyYW5nZSwgJ21heCcpXG4gICAgfHwgKHJhbmdlLnJldmVyc2UgPyBoYXNLZXkocmFuZ2UsICdzdGFydCcpIDogaGFzS2V5KHJhbmdlLCAnZW5kJykpXG4gICAgfHwgdW5kZWZpbmVkXG4gICAgKVxufVxuXG52YXIgdXBwZXJCb3VuZCA9IGV4cG9ydHMudXBwZXJCb3VuZCA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICB2YXIgayA9IHVwcGVyQm91bmRLZXkocmFuZ2UpXG4gIHJldHVybiBrICYmIHJhbmdlW2tdXG59XG5cbmZ1bmN0aW9uIGlkIChlKSB7IHJldHVybiBlIH1cblxuZXhwb3J0cy50b0x0Z3QgPSBmdW5jdGlvbiAocmFuZ2UsIF9yYW5nZSwgbWFwLCBsb3dlciwgdXBwZXIpIHtcbiAgX3JhbmdlID0gX3JhbmdlIHx8IHt9XG4gIG1hcCA9IG1hcCB8fCBpZFxuICB2YXIgZGVmYXVsdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gM1xuICB2YXIgbGIgPSBleHBvcnRzLmxvd2VyQm91bmRLZXkocmFuZ2UpXG4gIHZhciB1YiA9IGV4cG9ydHMudXBwZXJCb3VuZEtleShyYW5nZSlcbiAgaWYobGIpIHtcbiAgICBpZihsYiA9PT0gJ2d0JykgX3JhbmdlLmd0ID0gbWFwKHJhbmdlLmd0KVxuICAgIGVsc2UgICAgICAgICAgICBfcmFuZ2UuZ3RlID0gbWFwKHJhbmdlW2xiXSlcbiAgfVxuICBlbHNlIGlmKGRlZmF1bHRzKVxuICAgIF9yYW5nZS5ndGUgPSBtYXAobG93ZXIpXG5cbiAgaWYodWIpIHtcbiAgICBpZih1YiA9PT0gJ2x0JykgX3JhbmdlLmx0ID0gbWFwKHJhbmdlLmx0KVxuICAgIGVsc2UgICAgICAgICAgICBfcmFuZ2UubHRlID0gbWFwKHJhbmdlW3ViXSlcbiAgfVxuICBlbHNlIGlmKGRlZmF1bHRzKVxuICAgIF9yYW5nZS5sdGUgPSBtYXAodXBwZXIpXG5cbiAgaWYocmFuZ2UucmV2ZXJzZSAhPSBudWxsKVxuICAgIF9yYW5nZS5yZXZlcnNlID0gISFyYW5nZS5yZXZlcnNlXG5cbiAgcmV0dXJuIF9yYW5nZVxufVxuXG5leHBvcnRzLmNvbnRhaW5zID0gZnVuY3Rpb24gKHJhbmdlLCBrZXksIGNvbXBhcmUpIHtcbiAgY29tcGFyZSA9IGNvbXBhcmUgfHwgZXhwb3J0cy5jb21wYXJlXG5cbiAgdmFyIGxiID0gbG93ZXJCb3VuZChyYW5nZSlcbiAgaWYoaXNEZWYobGIpKSB7XG4gICAgdmFyIGNtcCA9IGNvbXBhcmUoa2V5LCBsYilcbiAgICBpZihjbXAgPCAwIHx8IChjbXAgPT09IDAgJiYgbG93ZXJCb3VuZEV4Y2x1c2l2ZShyYW5nZSkpKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB2YXIgdWIgPSB1cHBlckJvdW5kKHJhbmdlKVxuICBpZihpc0RlZih1YikpIHtcbiAgICB2YXIgY21wID0gY29tcGFyZShrZXksIHViKVxuICAgIGlmKGNtcCA+IDAgfHwgKGNtcCA9PT0gMCkgJiYgdXBwZXJCb3VuZEV4Y2x1c2l2ZShyYW5nZSkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydHMuZmlsdGVyID0gZnVuY3Rpb24gKHJhbmdlLCBjb21wYXJlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY29udGFpbnMocmFuZ2UsIGtleSwgY29tcGFyZSlcbiAgfVxufVxuIiwiXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgJGNvdW50OlxuICAgIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICBpZihiID09PSB1bmRlZmluZWQpIHJldHVybiAoYXx8MClcbiAgICAgIHJldHVybiAoYXx8MCkrMVxuICAgIH0sXG4gICRzdW06XG4gICAgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIGlmKGIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIChhfHwwKVxuICAgICAgcmV0dXJuIChhfHwwKSsoYnx8MClcbiAgICB9LFxuICAkbWF4OlxuICAgIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICBpZihiID09PSB1bmRlZmluZWQpIGFcbiAgICAgIGlmKGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGJcbiAgICAgIHJldHVybiBNYXRoLm1heChhLCBiKVxuICAgIH0sXG4gICRtaW46XG4gICAgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIGlmKGIgPT09IHVuZGVmaW5lZCkgYVxuICAgICAgaWYoYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYlxuICAgICAgcmV0dXJuIE1hdGgubWluKGEsIGIpXG4gICAgfSxcbiAgJGNvbGxlY3Q6XG4gICAgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIGlmKCFhKSBhID0gYSB8fCBbXVxuICAgICAgaWYoIUFycmF5LmlzQXJyYXkoYSkpIGEgPSBbYV1cbiAgICAgIGlmKGIgPT0gdW5kZWZpbmVkKSByZXR1cm4gYVxuICAgICAgYS5wdXNoKGIpXG4gICAgICByZXR1cm4gYVxuICAgIH1cbn1cbiIsInZhciB1ID0gcmVxdWlyZSgnLi91dGlsJylcbnZhciBpc0Jhc2ljID0gdS5pc0Jhc2ljXG52YXIgaXNSYW5nZSA9IHUuaXNSYW5nZVxudmFyIGlzU3RyaW5nID0gdS5pc1N0cmluZ1xudmFyIGlzTHRndCA9IHUuaXNMdGd0XG52YXIgaXNPYmplY3QgPSB1LmlzT2JqZWN0XG52YXIgaXNBcnJheSA9IHUuaXNBcnJheVxudmFyIGhhcyA9IHUuaGFzXG52YXIgbWFwID0gdS5tYXBcblxuZnVuY3Rpb24gZXhhY3QocSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gcSA9PT0gdlxuICB9XG59XG5mdW5jdGlvbiBwcmVmaXgocCkge1xuICBpZihpc1N0cmluZyhwKSlcbiAgICByZXR1cm4gZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiBpc1N0cmluZyh2KSAmJiB2LnN1YnN0cmluZygwLCBwLmxlbmd0aCkgPT09IHBcbiAgICB9XG4gIGlmKGlzQXJyYXkocCkpIHtcbiAgICBpZighcC5ldmVyeShpc0Jhc2ljKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcigneyRwcmVmaXg6IGFycmF5fSBtdXN0IGhhdmUgZXhhY3QgZWxlbWVudHMgaW4gdGhlIGFycmF5JylcbiAgICByZXR1cm4gZnVuY3Rpb24gKHYpIHtcbiAgICAgIGlmKCFpc0FycmF5KHYpIHx8IHYubGVuZ3RoIDwgcC5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmKHZbaV0gIT09IHBbaV0pIHJldHVybiBmYWxzZVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbHQgKHEpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiB2IDwgcSB9XG59XG5mdW5jdGlvbiBndCAocSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgPiBxIH1cbn1cbmZ1bmN0aW9uIGx0ZSAocSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgPD0gcSB9XG59XG5mdW5jdGlvbiBndGUgKHEpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ID49IHEgfVxufVxuXG5mdW5jdGlvbiBjb21iaW5lKGYsIGcpIHtcbiAgaWYoIWcpIHJldHVybiBmXG4gIHJldHVybiBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiBmKHYpICYmIGcodilcbiAgfVxufVxuXG5mdW5jdGlvbiBsdGd0IChxKSB7XG4gIHZhciBmaWx0ZXIgPSBudWxsXG4gIGlmKGhhcyhxLCAnJGx0JykpICBmaWx0ZXIgPSBsdChxLiRsdClcbiAgaWYoaGFzKHEsICckbHRlJykpIGZpbHRlciA9IGNvbWJpbmUobHRlKHEuJGx0ZSksIGZpbHRlcilcbiAgaWYoaGFzKHEsICckZ3QnKSkgIGZpbHRlciA9IGNvbWJpbmUoZ3QocS4kZ3QpLCBmaWx0ZXIpXG4gIGlmKGhhcyhxLCAnJGd0ZScpKSBmaWx0ZXIgPSBjb21iaW5lKGd0ZShxLiRndGUpLCBmaWx0ZXIpXG4gIHJldHVybiBmaWx0ZXJcbn1cblxuZnVuY3Rpb24gYWxsIChxKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodikge1xuICAgIGlmKHYgPT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gICAgZm9yKHZhciBrIGluIHEpIGlmKCFxW2tdKHZba10pKSByZXR1cm4gZmFsc2VcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIGFic2VudCAodikge1xuICByZXR1cm4gdiA9PSBudWxsXG59XG5cbmZ1bmN0aW9uIG5ldmVyICgpIHsgcmV0dXJuIGZhbHNlIH1cblxuZnVuY3Rpb24gbWFrZSAocSkge1xuICByZXR1cm4gKFxuICAgIGlzQmFzaWMocSkgICAgICAgID8gZXhhY3QocSlcbiAgOiBoYXMocSwgJyRwcmVmaXgnKSA/IHByZWZpeChxLiRwcmVmaXgpXG4gIDogaXNMdGd0KHEpICAgICAgICAgPyBsdGd0KHEpXG4gIDogdS5pc09iamVjdChxKVxuICAgIHx8IHUuaXNBcnJheShxKSAgID8gYWxsKG1hcChxLCBtYWtlKSlcbiAgOiBpc051bGxpc2gocSkgICAgICA/IGFic2VudFxuICA6ICAgICAgICAgICAgICAgICAgICAgbmV2ZXJcbiAgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1ha2VcblxuIiwidmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG5cbnZhciBmaWx0ZXIgPSByZXF1aXJlKCcuL2ZpbHRlcicpXG52YXIgbWFwID0gcmVxdWlyZSgnLi9tYXAnKVxudmFyIHJlZHVjZSA9IHJlcXVpcmUoJy4vcmVkdWNlJylcbnZhciBTaW5rVGhyb3VnaCA9IHJlcXVpcmUoJ3B1bGwtc2luay10aHJvdWdoJylcblxuZnVuY3Rpb24gZmlyc3QgKHEpIHtcbiAgZm9yKHZhciBrIGluIHEpIHJldHVybiBrXG59XG5cbmZ1bmN0aW9uIGdldCAocSkge1xuICB2YXIgayA9IGZpcnN0KHEpXG4gIHZhciBzID0gay5zdWJzdHJpbmcoMSlcbiAgaWYoa1swXSA9PSAnJCcgJiYgZXhwb3J0c1tzXSkgcmV0dXJuIGV4cG9ydHNbc10ocVtrXSlcbiAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGZ1bmN0aW9uOicrIGspXG59XG5cbmZ1bmN0aW9uIGxhc3QgKGwpIHtcbiAgcmV0dXJuIGxbbC5sZW5ndGggLSAxXVxufVxuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocSwgY2IpIHtcbiAgcSA9IHEuZmlsdGVyKEJvb2xlYW4pXG4gIGlmKGxhc3QocSkuJHJlZHVjZSAmJiBjYikge1xuICAgIHJldHVybiBwdWxsLmFwcGx5KG51bGwsXG4gICAgICBxLnNsaWNlKDAsIHEubGVuZ3RoIC0gMSkubWFwKGdldClcbiAgICAgICAgLmNvbmNhdChleHBvcnRzLnJlZHVjZShsYXN0KHEpLiRyZWR1Y2UsIGNiKSlcbiAgICApXG4gIH1cbiAgZWxzZSBpZihBcnJheS5pc0FycmF5KHEpKVxuICAgIHJldHVybiBwdWxsLmFwcGx5KG51bGwsIHEubWFwKGdldCkpXG4gIGVsc2VcbiAgcmV0dXJuIGdldChxKVxufVxuXG5leHBvcnRzLmZpbHRlciA9IGZ1bmN0aW9uIChxKSB7XG4gIHJldHVybiBwdWxsLmZpbHRlcihmaWx0ZXIocSkpXG59XG5cbmV4cG9ydHMubWFwID0gZnVuY3Rpb24gKHEpIHtcbiAgcmV0dXJuIHB1bGwocHVsbC5tYXAobWFwKHEpKSxwdWxsLmZpbHRlcigpKVxufVxuXG5leHBvcnRzLnJlZHVjZSA9IGZ1bmN0aW9uIChxLCBjYikge1xuICBpZihjYilcbiAgICByZXR1cm4gcHVsbC5yZWR1Y2UocmVkdWNlKHEpLCBudWxsLCBjYilcbiAgcmV0dXJuIFNpbmtUaHJvdWdoKGZ1bmN0aW9uIChjYikge1xuICAgIHJldHVybiBwdWxsLnJlZHVjZShyZWR1Y2UocSksIG51bGwsIGNiKVxuICB9KVxufVxuXG4iLCJ2YXIgdSA9IHJlcXVpcmUoJy4vdXRpbCcpXG52YXIgaXNBcnJheSA9IHUuaXNBcnJheVxudmFyIGlzU3RyaW5nID0gdS5pc1N0cmluZ1xuXG52YXIgZXh0cmFjdG9ycyA9IHtcbiAgJGZpbHRlcjogZnVuY3Rpb24gKHF1ZXJ5KSB7XG4gICAgdmFyIG8gPSB7fVxuICAgIGZvcih2YXIgayBpbiBxdWVyeSlcbiAgICAgIG9ba10gPSB0cnVlXG4gICAgcmV0dXJuIG9cbiAgfSxcbiAgJHJlZHVjZTogZnVuY3Rpb24gKHF1ZXJ5KSB7XG4gICAgdmFyIG8gPSB7fVxuICAgIGlmKGlzQXJyYXkocXVlcnkuJGdyb3VwKSlcbiAgICAgIHF1ZXJ5LiRncm91cC5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIG9baXNBcnJheShwYXRoKSA/IHBhdGhbMF06IHBhdGhdID0gdHJ1ZVxuICAgICAgfSlcbiAgICAvL1RPRE86IGNoZWNrIHdoYXQgcGF0aHMgdGhlIG90aGVyIHJlZHVjZXMgdG91Y2guXG5cbiAgICByZXR1cm4gb1xuICB9LFxuICAkbWFwOiBmdW5jdGlvbiAocXVlcnkpIHtcbiAgICB2YXIgbyA9IHt9XG4gICAgZm9yKHZhciBrIGluIHF1ZXJ5KVxuICAgICAgaWYoaXNBcnJheShxdWVyeVtrXSkpIG9bcXVlcnlba11bMF1dID0gdHJ1ZVxuICAgICAgZWxzZSBpZihpc1N0cmluZyhxdWVyeVtrXSkpIG9bcXVlcnlba11dID0gdHJ1ZVxuICAgIHJldHVybiBvXG4gIH1cbn1cblxuZnVuY3Rpb24gbWVyZ2UgKGEsIGIpIHtcbiAgdmFyIG8gPSB7fVxuICBmb3IodmFyIGsgaW4gYSlcbiAgICBvW2tdID0gdHJ1ZVxuICBmb3IodmFyIGsgaW4gYilcbiAgICBvW2tdID0gdHJ1ZVxuICByZXR1cm4gb1xufVxuXG5mdW5jdGlvbiBmaXJzdChxKSB7XG4gIGZvcih2YXIgayBpbiBxKSByZXR1cm4ga1xufVxuXG5mdW5jdGlvbiBrZXlzIChxdWVyeSkge1xuICB2YXIga2V5cyA9IHt9XG4gIGZvcih2YXIgaSA9IHF1ZXJ5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGsgPSBmaXJzdChxdWVyeVtpXSlcbiAgICBrZXlzID0gbWVyZ2UoZXh0cmFjdG9yc1trXShxdWVyeVtpXVtrXSksIGtleXMpXG4gIH1cbiAgcmV0dXJuIGtleXNcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzXG4iLCJ2YXIgdSA9IHJlcXVpcmUoJy4vdXRpbCcpXG52YXIgbWFwID0gdS5tYXBcblxuZnVuY3Rpb24gaWQgKHYsIGspIHtcbiAgcmV0dXJuIGsgPyB2W2tdIDogdlxufVxuXG5mdW5jdGlvbiBpc051bGwgKG4pIHtcbiAgcmV0dXJuIG4gPT0gbnVsbFxufVxuXG5mdW5jdGlvbiBrZXkocSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHYpIHtcbiAgICBpZihpc051bGwodikpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdltxXVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhdGggKHEpIHtcbiAgcmV0dXJuIHEucmVkdWNlKGZ1bmN0aW9uIChtYXAxLCBtYXAyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBtYXAyKG1hcDEodikpIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gbm90RW1wdHkgKG8pIHtcbiAgZm9yKHZhciBrIGluIG8pIHJldHVybiBvXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gb2JqIChxKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodikge1xuICAgIGlmKGlzTnVsbCh2KSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiBub3RFbXB0eShtYXAocSwgZnVuY3Rpb24gKGZuLCBrLCBvKSB7XG4gICAgICByZXR1cm4gZm4odiwgaylcbiAgICB9KSlcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlKHEpIHtcbiAgaWYodHJ1ZSA9PT0gcSkgcmV0dXJuIGlkXG4gIGlmKGlzTnVsbChxKSkgcmV0dXJuIGlzTnVsbFxuICBpZih1LmlzU3RyaW5nKHEpIHx8IHUuaXNOdW1iZXIocSkpIHJldHVybiBrZXkocSlcbiAgaWYodS5pc0FycmF5KHEpKSByZXR1cm4gcGF0aChxLm1hcChtYWtlKSlcbiAgaWYodS5pc09iamVjdChxKSkgcmV0dXJuIG9iaihtYXAocSwgbWFrZSkpXG4gIHRocm93IG5ldyBFcnJvcignbm8gbWF0Y2ggLSBzaG91bGQgbmV2ZXIgbWFwcGVuJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYWtlXG5cbiIsInZhciBzb3VyY2VzICA9IHJlcXVpcmUoJy4vc291cmNlcycpXG52YXIgc2lua3MgICAgPSByZXF1aXJlKCcuL3NpbmtzJylcbnZhciB0aHJvdWdocyA9IHJlcXVpcmUoJy4vdGhyb3VnaHMnKVxuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3B1bGwnKVxuXG5mb3IodmFyIGsgaW4gc291cmNlcylcbiAgZXhwb3J0c1trXSA9IHNvdXJjZXNba11cblxuZm9yKHZhciBrIGluIHRocm91Z2hzKVxuICBleHBvcnRzW2tdID0gdGhyb3VnaHNba11cblxuZm9yKHZhciBrIGluIHNpbmtzKVxuICBleHBvcnRzW2tdID0gc2lua3Nba11cblxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwdWxsIChhKSB7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoXG4gIGlmICh0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyAmJiBhLmxlbmd0aCA9PT0gMSkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGxlbmd0aClcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgICBhcmdzLnVuc2hpZnQocmVhZClcbiAgICAgIHJldHVybiBwdWxsLmFwcGx5KG51bGwsIGFyZ3MpXG4gICAgfVxuICB9XG5cbiAgdmFyIHJlYWQgPSBhXG5cbiAgaWYgKHJlYWQgJiYgdHlwZW9mIHJlYWQuc291cmNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVhZCA9IHJlYWQuc291cmNlXG4gIH1cblxuICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHMgPSBhcmd1bWVudHNbaV1cbiAgICBpZiAodHlwZW9mIHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlYWQgPSBzKHJlYWQpXG4gICAgfSBlbHNlIGlmIChzICYmIHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuICAgICAgcy5zaW5rKHJlYWQpXG4gICAgICByZWFkID0gcy5zb3VyY2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZFxufVxuXG5cblxuXG5cbiIsIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBpZCAoaXRlbSkgeyByZXR1cm4gaXRlbSB9XG5cbmZ1bmN0aW9uIHByb3AgKGtleSkge1xuICByZXR1cm4gKFxuICAgICdzdHJpbmcnID09IHR5cGVvZiBrZXlcbiAgICA/IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhW2tleV0gfVxuICAgIDoga2V5ICYmICdvYmplY3QnID09PSB0eXBlb2Yga2V5ICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBrZXkuZXhlYyAvL3JlZ2V4cFxuICAgID8gZnVuY3Rpb24gKGRhdGEpIHsgdmFyIHYgPSBtYXAuZXhlYyhkYXRhKTsgcmV0dXJuIHYgJiYgdlswXSB9XG4gICAgOiBrZXkgfHwgaWRcbiAgKVxufVxuXG5cbnZhciBkcmFpbiA9IGV4cG9ydHMuZHJhaW4gPSBmdW5jdGlvbiAob3AsIGRvbmUpIHtcbiAgdmFyIHJlYWQsIGFib3J0XG5cbiAgZnVuY3Rpb24gc2luayAoX3JlYWQpIHtcbiAgICByZWFkID0gX3JlYWRcbiAgICBpZihhYm9ydCkgcmV0dXJuIHNpbmsuYWJvcnQoKVxuICAgIC8vdGhpcyBmdW5jdGlvbiBpcyBtdWNoIHNpbXBsZXIgdG8gd3JpdGUgaWYgeW91XG4gICAgLy9qdXN0IHVzZSByZWN1cnNpb24sIGJ1dCBieSB1c2luZyBhIHdoaWxlIGxvb3BcbiAgICAvL3dlIGRvIG5vdCBibG93IHRoZSBzdGFjayBpZiB0aGUgc3RyZWFtIGhhcHBlbnMgdG8gYmUgc3luYy5cbiAgICA7KGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIHZhciBsb29wID0gdHJ1ZSwgY2JlZCA9IGZhbHNlXG4gICAgICAgIHdoaWxlKGxvb3ApIHtcbiAgICAgICAgICBjYmVkID0gZmFsc2VcbiAgICAgICAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgICAgIGNiZWQgPSB0cnVlXG4gICAgICAgICAgICBpZihlbmQgPSBlbmQgfHwgYWJvcnQpIHtcbiAgICAgICAgICAgICAgbG9vcCA9IGZhbHNlXG4gICAgICAgICAgICAgIGlmKGRvbmUpIGRvbmUoZW5kID09PSB0cnVlID8gbnVsbCA6IGVuZClcbiAgICAgICAgICAgICAgZWxzZSBpZihlbmQgJiYgZW5kICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgIHRocm93IGVuZFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZihvcCAmJiBmYWxzZSA9PT0gb3AoZGF0YSkgfHwgYWJvcnQpIHtcbiAgICAgICAgICAgICAgbG9vcCA9IGZhbHNlXG4gICAgICAgICAgICAgIHJlYWQoYWJvcnQgfHwgdHJ1ZSwgZG9uZSB8fCBmdW5jdGlvbiAoKSB7fSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoIWxvb3Ape1xuICAgICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmKCFjYmVkKSB7XG4gICAgICAgICAgICBsb29wID0gZmFsc2VcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKVxuICB9XG5cbiAgc2luay5hYm9ydCA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gICAgaWYoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZXJyKVxuICAgICAgY2IgPSBlcnIsIGVyciA9IHRydWVcbiAgICBhYm9ydCA9IGVyciB8fCB0cnVlXG4gICAgaWYocmVhZCkgcmV0dXJuIHJlYWQoYWJvcnQsIGNiIHx8IGZ1bmN0aW9uICgpIHt9KVxuICB9XG5cbiAgcmV0dXJuIHNpbmtcbn1cblxudmFyIG9uRW5kID0gZXhwb3J0cy5vbkVuZCA9IGZ1bmN0aW9uIChkb25lKSB7XG4gIHJldHVybiBkcmFpbihudWxsLCBkb25lKVxufVxuXG52YXIgbG9nID0gZXhwb3J0cy5sb2cgPSBmdW5jdGlvbiAoZG9uZSkge1xuICByZXR1cm4gZHJhaW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBjb25zb2xlLmxvZyhkYXRhKVxuICB9LCBkb25lKVxufVxuXG52YXIgZmluZCA9XG5leHBvcnRzLmZpbmQgPSBmdW5jdGlvbiAodGVzdCwgY2IpIHtcbiAgdmFyIGVuZGVkID0gZmFsc2VcbiAgaWYoIWNiKVxuICAgIGNiID0gdGVzdCwgdGVzdCA9IGlkXG4gIGVsc2VcbiAgICB0ZXN0ID0gcHJvcCh0ZXN0KSB8fCBpZFxuXG4gIHJldHVybiBkcmFpbihmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmKHRlc3QoZGF0YSkpIHtcbiAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgY2IobnVsbCwgZGF0YSlcbiAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZihlbmRlZCkgcmV0dXJuIC8vYWxyZWFkeSBjYWxsZWQgYmFja1xuICAgIGNiKGVyciA9PT0gdHJ1ZSA/IG51bGwgOiBlcnIsIG51bGwpXG4gIH0pXG59XG5cbnZhciByZWR1Y2UgPSBleHBvcnRzLnJlZHVjZSA9IGZ1bmN0aW9uIChyZWR1Y2UsIGFjYywgY2IpIHtcblxuICByZXR1cm4gZHJhaW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBhY2MgPSByZWR1Y2UoYWNjLCBkYXRhKVxuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgY2IoZXJyLCBhY2MpXG4gIH0pXG5cbn1cblxudmFyIGNvbGxlY3QgPSBleHBvcnRzLmNvbGxlY3QgPVxuZnVuY3Rpb24gKGNiKSB7XG4gIHJldHVybiByZWR1Y2UoZnVuY3Rpb24gKGFyciwgaXRlbSkge1xuICAgIGFyci5wdXNoKGl0ZW0pXG4gICAgcmV0dXJuIGFyclxuICB9LCBbXSwgY2IpXG59XG5cbnZhciBjb25jYXQgPSBleHBvcnRzLmNvbmNhdCA9XG5mdW5jdGlvbiAoY2IpIHtcbiAgcmV0dXJuIHJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhICsgYlxuICB9LCAnJywgY2IpXG59XG5cblxuXG5cblxuIiwiXG52YXIga2V5cyA9IGV4cG9ydHMua2V5cyA9XG5mdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB2YWx1ZXMoT2JqZWN0LmtleXMob2JqZWN0KSlcbn1cblxuZnVuY3Rpb24gYWJvcnRDYihjYiwgYWJvcnQsIG9uQWJvcnQpIHtcbiAgY2IoYWJvcnQpXG4gIG9uQWJvcnQgJiYgb25BYm9ydChhYm9ydCA9PT0gdHJ1ZSA/IG51bGw6IGFib3J0KVxuICByZXR1cm5cbn1cblxudmFyIG9uY2UgPSBleHBvcnRzLm9uY2UgPVxuZnVuY3Rpb24gKHZhbHVlLCBvbkFib3J0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoYWJvcnQpXG4gICAgICByZXR1cm4gYWJvcnRDYihjYiwgYWJvcnQsIG9uQWJvcnQpXG4gICAgaWYodmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFyIF92YWx1ZSA9IHZhbHVlOyB2YWx1ZSA9IG51bGxcbiAgICAgIGNiKG51bGwsIF92YWx1ZSlcbiAgICB9IGVsc2VcbiAgICAgIGNiKHRydWUpXG4gIH1cbn1cblxudmFyIHZhbHVlcyA9IGV4cG9ydHMudmFsdWVzID0gZXhwb3J0cy5yZWFkQXJyYXkgPVxuZnVuY3Rpb24gKGFycmF5LCBvbkFib3J0KSB7XG4gIGlmKCFhcnJheSlcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgICAgaWYoYWJvcnQpIHJldHVybiBhYm9ydENiKGNiLCBhYm9ydCwgb25BYm9ydClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIH1cbiAgaWYoIUFycmF5LmlzQXJyYXkoYXJyYXkpKVxuICAgIGFycmF5ID0gT2JqZWN0LmtleXMoYXJyYXkpLm1hcChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIGFycmF5W2tdXG4gICAgfSlcbiAgdmFyIGkgPSAwXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoYWJvcnQpXG4gICAgICByZXR1cm4gYWJvcnRDYihjYiwgYWJvcnQsIG9uQWJvcnQpXG4gICAgY2IoaSA+PSBhcnJheS5sZW5ndGggfHwgbnVsbCwgYXJyYXlbaSsrXSlcbiAgfVxufVxuXG5cbnZhciBjb3VudCA9IGV4cG9ydHMuY291bnQgPVxuZnVuY3Rpb24gKG1heCkge1xuICB2YXIgaSA9IDA7IG1heCA9IG1heCB8fCBJbmZpbml0eVxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiBjYiAmJiBjYihlbmQpXG4gICAgaWYoaSA+IG1heClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIGNiKG51bGwsIGkrKylcbiAgfVxufVxuXG52YXIgaW5maW5pdGUgPSBleHBvcnRzLmluZmluaXRlID1cbmZ1bmN0aW9uIChnZW5lcmF0ZSkge1xuICBnZW5lcmF0ZSA9IGdlbmVyYXRlIHx8IE1hdGgucmFuZG9tXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIGNiICYmIGNiKGVuZClcbiAgICByZXR1cm4gY2IobnVsbCwgZ2VuZXJhdGUoKSlcbiAgfVxufVxuXG4vL2Egc3RyZWFtIHRoYXQgZW5kcyBpbW1lZGlhdGVseS5cbnZhciBlbXB0eSA9IGV4cG9ydHMuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgY2IodHJ1ZSlcbiAgfVxufVxuXG4vL2Egc3RyZWFtIHRoYXQgZXJyb3JzIGltbWVkaWF0ZWx5LlxudmFyIGVycm9yID0gZXhwb3J0cy5lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBjYihlcnIpXG4gIH1cbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBpZCAoaXRlbSkgeyByZXR1cm4gaXRlbSB9XG5cbmZ1bmN0aW9uIHByb3AgKGtleSkge1xuICByZXR1cm4gKFxuICAgICdzdHJpbmcnID09IHR5cGVvZiBrZXlcbiAgICA/IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhW2tleV0gfVxuICAgIDogJ29iamVjdCcgPT09IHR5cGVvZiBrZXkgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGtleS5leGVjIC8vcmVnZXhwXG4gICAgPyBmdW5jdGlvbiAoZGF0YSkgeyB2YXIgdiA9IG1hcC5leGVjKGRhdGEpOyByZXR1cm4gdiAmJiB2WzBdIH1cbiAgICA6IGtleVxuICApXG59XG5cbmZ1bmN0aW9uIHRlc3RlciAodGVzdCkge1xuICByZXR1cm4gKFxuICAgICdvYmplY3QnID09PSB0eXBlb2YgdGVzdCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgdGVzdC50ZXN0IC8vcmVnZXhwXG4gICAgPyBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gdGVzdC50ZXN0KGRhdGEpIH1cbiAgICA6IHByb3AgKHRlc3QpIHx8IGlkXG4gIClcbn1cblxudmFyIHNvdXJjZXMgPSByZXF1aXJlKCcuL3NvdXJjZXMnKVxudmFyIHNpbmtzID0gcmVxdWlyZSgnLi9zaW5rcycpXG5cbnZhciBtYXAgPSBleHBvcnRzLm1hcCA9XG5cbmZ1bmN0aW9uIChtYXApIHtcbiAgaWYoIW1hcCkgcmV0dXJuIGlkXG4gIG1hcCA9IHByb3AobWFwKVxuICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgICAgcmVhZChhYm9ydCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICBkYXRhID0gIWVuZCA/IG1hcChkYXRhKSA6IG51bGxcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWQoZXJyLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgY2IoZW5kLCBkYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxudmFyIGFzeW5jTWFwID0gZXhwb3J0cy5hc3luY01hcCA9XG5mdW5jdGlvbiBhc3luYyAobWFwKSB7XG4gIGlmKCFtYXApIHJldHVybiBpZFxuICBtYXAgPSBwcm9wKG1hcClcbiAgdmFyIGJ1c3kgPSBmYWxzZSwgYWJvcnRDYiwgYWJvcnRlZFxuICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoYWJvcnQsIGNiKSB7XG4gICAgICBpZihhYm9ydGVkKSByZXR1cm4gY2IoYWJvcnRlZClcbiAgICAgIGlmKGFib3J0KSB7XG4gICAgICAgIGFib3J0ZWQgPSBhYm9ydFxuICAgICAgICBpZighYnVzeSkgcmVhZChhYm9ydCwgY2IpXG4gICAgICAgIGVsc2UgcmVhZChhYm9ydCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vaWYgd2UgYXJlIHN0aWxsIGJ1c3ksIHdhaXQgZm9yIHRoZSBtYXBwZXIgdG8gY29tcGxldGUuXG4gICAgICAgICAgaWYoYnVzeSkgYWJvcnRDYiA9IGNiXG4gICAgICAgICAgZWxzZSBjYihhYm9ydClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgICAgaWYoZW5kKSB7XG4gICAgICAgICAgICBjYihlbmQpXG4gICAgICAgICAgICBpZihhYm9ydENiKSBjYihlbmQsIGRhdGEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVzeSA9IHRydWVcbiAgICAgICAgICAgIG1hcChkYXRhLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICAgIGJ1c3kgPSBmYWxzZVxuICAgICAgICAgICAgICBpZihhYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgY2IoYWJvcnRlZClcbiAgICAgICAgICAgICAgICBhYm9ydENiKGFib3J0ZWQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZihlcnIpIG5leHQgKGVyciwgY2IpXG4gICAgICAgICAgICAgIGVsc2UgY2IobnVsbCwgZGF0YSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGFzeW5jTWFwIChtYXApIHtcbiAgaWYoIW1hcCkgcmV0dXJuIGlkIC8vd2hlbiByZWFkIGlzIHBhc3NlZCwgcGFzcyBpdCBvbi5cbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgICBpZihlbmQpIHJldHVybiByZWFkKGVuZCwgY2IpIC8vYWJvcnRcbiAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZihlbmQpIHJldHVybiBjYihlbmQsIGRhdGEpXG4gICAgICAgIG1hcChkYXRhLCBjYilcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbnZhciBmaWx0ZXIgPSBleHBvcnRzLmZpbHRlciA9XG5mdW5jdGlvbiAodGVzdCkge1xuICAvL3JlZ2V4cFxuICB0ZXN0ID0gdGVzdGVyKHRlc3QpXG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgICB2YXIgc3luYywgbG9vcCA9IHRydWVcbiAgICAgIHdoaWxlKGxvb3ApIHtcbiAgICAgICAgbG9vcCA9IGZhbHNlXG4gICAgICAgIHN5bmMgPSB0cnVlXG4gICAgICAgIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgICAgaWYoIWVuZCAmJiAhdGVzdChkYXRhKSlcbiAgICAgICAgICAgIHJldHVybiBzeW5jID8gbG9vcCA9IHRydWUgOiBuZXh0KGVuZCwgY2IpXG4gICAgICAgICAgY2IoZW5kLCBkYXRhKVxuICAgICAgICB9KVxuICAgICAgICBzeW5jID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGZpbHRlck5vdCA9IGV4cG9ydHMuZmlsdGVyTm90ID1cbmZ1bmN0aW9uICh0ZXN0KSB7XG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZpbHRlcihmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gIXRlc3QoZGF0YSkgfSlcbn1cblxuLy9hIHBhc3MgdGhyb3VnaCBzdHJlYW0gdGhhdCBkb2Vzbid0IGNoYW5nZSB0aGUgdmFsdWUuXG52YXIgdGhyb3VnaCA9IGV4cG9ydHMudGhyb3VnaCA9XG5mdW5jdGlvbiAob3AsIG9uRW5kKSB7XG4gIHZhciBhID0gZmFsc2VcblxuICBmdW5jdGlvbiBvbmNlIChhYm9ydCkge1xuICAgIGlmKGEgfHwgIW9uRW5kKSByZXR1cm5cbiAgICBhID0gdHJ1ZVxuICAgIG9uRW5kKGFib3J0ID09PSB0cnVlID8gbnVsbCA6IGFib3J0KVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgICBpZihlbmQpIG9uY2UoZW5kKVxuICAgICAgcmV0dXJuIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgIGlmKCFlbmQpIG9wICYmIG9wKGRhdGEpXG4gICAgICAgIGVsc2Ugb25jZShlbmQpXG4gICAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbi8vcmVhZCBhIG51bWJlciBvZiBpdGVtcyBhbmQgdGhlbiBzdG9wLlxudmFyIHRha2UgPSBleHBvcnRzLnRha2UgPVxuZnVuY3Rpb24gKHRlc3QsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgdmFyIGxhc3QgPSBvcHRzLmxhc3QgfHwgZmFsc2UgLy8gd2hldGhlciB0aGUgZmlyc3QgaXRlbSBmb3Igd2hpY2ggIXRlc3QoaXRlbSkgc2hvdWxkIHN0aWxsIHBhc3NcbiAgdmFyIGVuZGVkID0gZmFsc2VcbiAgaWYoJ251bWJlcicgPT09IHR5cGVvZiB0ZXN0KSB7XG4gICAgbGFzdCA9IHRydWVcbiAgICB2YXIgbiA9IHRlc3Q7IHRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gLS1uXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG5cbiAgICBmdW5jdGlvbiB0ZXJtaW5hdGUgKGNiKSB7XG4gICAgICByZWFkKHRydWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgbGFzdCA9IGZhbHNlOyBjYihlcnIgfHwgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgICBpZihlbmRlZCkgICAgICAgICAgICBsYXN0ID8gdGVybWluYXRlKGNiKSA6IGNiKGVuZGVkKVxuICAgICAgZWxzZSBpZihlbmRlZCA9IGVuZCkgcmVhZChlbmRlZCwgY2IpXG4gICAgICBlbHNlXG4gICAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGlmKGVuZGVkID0gZW5kZWQgfHwgZW5kKSB7XG4gICAgICAgICAgICAvL2xhc3QgPyB0ZXJtaW5hdGUoY2IpIDpcbiAgICAgICAgICAgIGNiKGVuZGVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmKCF0ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgICAgIGxhc3QgPyBjYihudWxsLCBkYXRhKSA6IHRlcm1pbmF0ZShjYilcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgY2IobnVsbCwgZGF0YSlcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuLy9kcm9wIGl0ZW1zIHlvdSBoYXZlIGFscmVhZHkgc2Vlbi5cbnZhciB1bmlxdWUgPSBleHBvcnRzLnVuaXF1ZSA9IGZ1bmN0aW9uIChmaWVsZCwgaW52ZXJ0KSB7XG4gIGZpZWxkID0gcHJvcChmaWVsZCkgfHwgaWRcbiAgdmFyIHNlZW4gPSB7fVxuICByZXR1cm4gZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGtleSA9IGZpZWxkKGRhdGEpXG4gICAgaWYoc2VlbltrZXldKSByZXR1cm4gISFpbnZlcnQgLy9mYWxzZSwgYnkgZGVmYXVsdFxuICAgIGVsc2Ugc2VlbltrZXldID0gdHJ1ZVxuICAgIHJldHVybiAhaW52ZXJ0IC8vdHJ1ZSBieSBkZWZhdWx0XG4gIH0pXG59XG5cbi8vcGFzc2VzIGFuIGl0ZW0gdGhyb3VnaCB3aGVuIHlvdSBzZWUgaXQgZm9yIHRoZSBzZWNvbmQgdGltZS5cbnZhciBub25VbmlxdWUgPSBleHBvcnRzLm5vblVuaXF1ZSA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICByZXR1cm4gdW5pcXVlKGZpZWxkLCB0cnVlKVxufVxuXG4vL2NvbnZlcnQgYSBzdHJlYW0gb2YgYXJyYXlzIG9yIHN0cmVhbXMgaW50byBqdXN0IGEgc3RyZWFtLlxudmFyIGZsYXR0ZW4gPSBleHBvcnRzLmZsYXR0ZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIHZhciBfcmVhZFxuICAgIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgICBpZiAoYWJvcnQpIHsgLy9hYm9ydCB0aGUgY3VycmVudCBzdHJlYW0sIGFuZCB0aGVuIHN0cmVhbSBvZiBzdHJlYW1zLlxuICAgICAgICBfcmVhZCA/IF9yZWFkKGFib3J0LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICByZWFkKGVyciB8fCBhYm9ydCwgY2IpXG4gICAgICAgIH0pIDogcmVhZChhYm9ydCwgY2IpXG4gICAgICB9XG4gICAgICBlbHNlIGlmKF9yZWFkKSBuZXh0Q2h1bmsoKVxuICAgICAgZWxzZSBuZXh0U3RyZWFtKClcblxuICAgICAgZnVuY3Rpb24gbmV4dENodW5rICgpIHtcbiAgICAgICAgX3JlYWQobnVsbCwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICAgIGlmIChlcnIgPT09IHRydWUpIG5leHRTdHJlYW0oKVxuICAgICAgICAgIGVsc2UgaWYgKGVycikge1xuICAgICAgICAgICAgcmVhZCh0cnVlLCBmdW5jdGlvbihhYm9ydEVycikge1xuICAgICAgICAgICAgICAvLyBUT0RPOiB3aGF0IGRvIHdlIGRvIHdpdGggdGhlIGFib3J0RXJyP1xuICAgICAgICAgICAgICBjYihlcnIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGNiKG51bGwsIGRhdGEpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBuZXh0U3RyZWFtICgpIHtcbiAgICAgICAgX3JlYWQgPSBudWxsXG4gICAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgc3RyZWFtKSB7XG4gICAgICAgICAgaWYoZW5kKVxuICAgICAgICAgICAgcmV0dXJuIGNiKGVuZClcbiAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHN0cmVhbSkgfHwgc3RyZWFtICYmICdvYmplY3QnID09PSB0eXBlb2Ygc3RyZWFtKVxuICAgICAgICAgICAgc3RyZWFtID0gc291cmNlcy52YWx1ZXMoc3RyZWFtKVxuICAgICAgICAgIGVsc2UgaWYoJ2Z1bmN0aW9uJyAhPSB0eXBlb2Ygc3RyZWFtKVxuICAgICAgICAgICAgc3RyZWFtID0gc291cmNlcy5vbmNlKHN0cmVhbSlcbiAgICAgICAgICBfcmVhZCA9IHN0cmVhbVxuICAgICAgICAgIG5leHRDaHVuaygpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbiIsInZhciB1ID0gcmVxdWlyZSgnLi91dGlsJylcbnZhciBtYXAgPSB1Lm1hcFxudmFyIHNpbXBsZSA9IHJlcXVpcmUoJy4vYmFzaWMnKVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7IHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZiB9XG5cbmZ1bmN0aW9uIGlzU2ltcGxlKHF1ZXJ5KSB7XG4gIGZvcih2YXIgayBpbiBzaW1wbGUpIGlmKHUuaGFzKHF1ZXJ5LCBrKSkgcmV0dXJuIGtcbn1cblxuZnVuY3Rpb24gbG9va3VwKHJlZHVjZSwgcGF0aCkge1xuICBpZihwYXRoID09PSB0cnVlKSByZXR1cm4gcmVkdWNlXG4gIHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiByZWR1Y2UoYSwgdS5nZXQoYiwgcGF0aCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gbXVsdGkob2JqKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBtYXAob2JqLCBmdW5jdGlvbiAocmVkdWNlLCBrKSB7XG4gICAgICByZXR1cm4gcmVkdWNlKGFba10sIGIpXG4gICAgfSwgYSA9IGEgfHwge30pXG4gIH1cbn1cblxuZnVuY3Rpb24gZWFjaChsaXN0LCBpdGVyKSB7XG4gIGlmKHUuaXNTdHJpbmcobGlzdCkpIHJldHVybiBpdGVyKGxpc3QpXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKVxuICAgIGl0ZXIobGlzdFtpXSwgKGxpc3QubGVuZ3RoIC0gaSAtIDEpKVxufVxuXG4vL2luc3RlYWQgb2YgdGFraW5nIHRoZSBxdWVyeSxcbi8vdGhpcyBzaG91bGQgdGFrZSBhIHBhdGgsIGFuZCBhIHJlZHVjZSBmdW5jdGlvbi5cbmZ1bmN0aW9uIGdyb3VwIChnLCByZWR1Y2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIEEgPSBhID0gYSB8fCB7fVxuICAgIGVhY2goZywgZnVuY3Rpb24gKGssIG5vdExhc3QpIHtcbiAgICAgIHZhciB2ID0gdS5nZXQoYiwgaylcbiAgICAgIEFbdl0gPSAhbm90TGFzdCA/IHJlZHVjZShBW3ZdLCBiKSA6IEFbdl0gfHwge31cbiAgICAgIEEgPSBBW3ZdXG4gICAgfSlcbiAgICByZXR1cm4gYVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2UgKHF1ZXJ5KSB7XG4gIHZhciBrID0gaXNTaW1wbGUocXVlcnkpXG4gIGlmKGspIHJldHVybiBsb29rdXAoc2ltcGxlW2tdLCBxdWVyeVtrXSlcbiAgZWxzZSBpZih1LmlzT2JqZWN0KHF1ZXJ5KSlcbiAgICByZXR1cm4gbXVsdGkobWFwKHF1ZXJ5LCBmdW5jdGlvbiAocSwgaykge1xuICAgICAgaWYoayA9PSAnJGdyb3VwJykgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIGdtYWtlKHF1ZXJ5W2tdKVxuICAgIH0pKVxufVxuXG5mdW5jdGlvbiBnbWFrZSAocXVlcnkpIHtcbiByZXR1cm4gcXVlcnkuJGdyb3VwID8gZ3JvdXAocXVlcnkuJGdyb3VwLCBtYWtlKHF1ZXJ5KSkgOiBtYWtlKHF1ZXJ5KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdtYWtlXG5cblxuXG4iLCIndXNlIHN0cmljdCdcbmZ1bmN0aW9uIGlzU3RyaW5nKHMpIHsgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2YgcyB9XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKG4pIHsgcmV0dXJuICFpc05hTigrbikgfVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4gKGIpIHsgcmV0dXJuICdib29sZWFuJyA9PT0gdHlwZW9mIGIgfVxuXG5mdW5jdGlvbiBpc0Jhc2ljIChwKSB7IHJldHVybiBpc1N0cmluZyhwKSB8fCBpc051bWJlcihwKSB8fCBpc0Jvb2xlYW4ocCkgfVxuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXlcblxuZnVuY3Rpb24gaXNPYmplY3QgKG8pIHsgcmV0dXJuIG8gJiYgJ29iamVjdCcgPT09IHR5cGVvZiBvIH1cblxuZnVuY3Rpb24gaGFzKG8sIGspIHtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspXG59XG5cbmZ1bmN0aW9uIGlzRXhhY3QgKHYpIHtcbiAgaWYoaXNCYXNpYyh2KSkgcmV0dXJuIHRydWVcbiAgaWYoaXNBcnJheSh2KSlcbiAgICByZXR1cm4gdi5ldmVyeShpc0V4YWN0KVxuICByZXR1cm4gaXNPYmplY3QodikgJiYgaGFzKHYsICckZXEnKVxufVxuXG5mdW5jdGlvbiBpc0x0Z3QgKHYpIHtcbiAgcmV0dXJuIGhhcyh2LCAnJGx0JykgfHwgaGFzKHYsICckZ3QnKSB8fCBoYXModiwgJyRsdGUnKSB8fCBoYXModiwgJyRndGUnKVxufVxuXG5mdW5jdGlvbiBpc1JhbmdlICh2KSB7XG4gIGlmKCFpc09iamVjdCh2KSkgcmV0dXJuIGZhbHNlXG4gIGlmKGlzU3RyaW5nKHYuJHByZWZpeCkpIHJldHVybiB0cnVlXG4gIGlmKGlzQXJyYXkodikpIHJldHVybiBmaW5kKHYsIGlzUmFuZ2UpXG4gIHJldHVybiBpc0x0Z3Qodilcbn1cblxuZnVuY3Rpb24gZmluZCAoYXJ5LCB0ZXN0KSB7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpKyspXG4gICAgaWYodGVzdChhcnlbaV0sIGksIGFyeSkpIHJldHVybiB0cnVlXG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBsb3dlciAodikge1xuICBpZihpc0Jhc2ljKHYpKSByZXR1cm4gdlxuICBpZihpc09iamVjdCh2KSkge1xuICAgIGlmKGlzQXJyYXkodi4kcHJlZml4KSkgcmV0dXJuIHYuJHByZWZpeC5jb25jYXQoZXhwb3J0cy5ISSlcbiAgICBpZihpc1N0cmluZyh2LiRwcmVmaXgpKSByZXR1cm4gdi4kcHJlZml4XG4gICAgaWYoaGFzKHYsICckbHQnKSkgcmV0dXJuIHYuJGx0XG4gICAgaWYoaGFzKHYsICckbHRlJykpIHJldHVybiB2LiRsdGVcbiAgfVxuICBpZihpc0FycmF5KHYpKSByZXR1cm4gdi5tYXAobG93ZXIpXG59XG5cbmZ1bmN0aW9uIHVwcGVyICh2KSB7XG4gIGlmKGlzQmFzaWModikpIHJldHVybiB2XG4gIGlmKGlzT2JqZWN0KHYpKSB7XG4gICAgaWYoaXNBcnJheSh2LiRwcmVmaXgpKSByZXR1cm4gdi4kcHJlZml4LmNvbmNhdChleHBvcnRzLkxPKVxuICAgIGlmKGlzU3RyaW5nKHYuJHByZWZpeCkpIHJldHVybiB2LiRwcmVmaXgrJ1xcdWZmZmYnXG4gICAgaWYoaGFzKHYsICckZ3QnKSkgcmV0dXJuIHYuJGd0XG4gICAgaWYoaGFzKHYsICckZ3RlJykpIHJldHVybiB2LiRndGVcbiAgfVxuICBpZihpc0FycmF5KHYpKSByZXR1cm4gdi5tYXAodXBwZXIpXG59XG5cbmZ1bmN0aW9uIGdldChvYmosIHBhdGgpIHtcbiAgaWYoaXNTdHJpbmcocGF0aCkpIHJldHVybiBvYmpbcGF0aF1cbiAgaWYoaXNBcnJheShwYXRoKSkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZihvYmogPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgb2JqID0gb2JqW3BhdGhbaV1dXG4gICAgfVxuICAgIHJldHVybiBvYmpcbiAgfVxuICBpZihwYXRoID09PSB0cnVlKSByZXR1cm4gb2JqXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gbWFwKG9iaiwgaXRlciwgbykge1xuICBpZihBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubWFwKGl0ZXIpXG4gIG8gPSBvIHx8IHt9XG4gIGZvcih2YXIgayBpbiBvYmopIHtcbiAgICB2YXIgdiA9IGl0ZXIob2JqW2tdLCBrLCBvYmopXG4gICAgaWYodiAhPT0gdW5kZWZpbmVkKSBvW2tdID0gdlxuICB9XG4gIHJldHVybiBvXG59XG5cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZ1xuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyXG5leHBvcnRzLmlzQmFzaWMgPSBpc0Jhc2ljXG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3RcbmV4cG9ydHMuaXNSYW5nZSA9IGlzUmFuZ2VcbmV4cG9ydHMuaXNFeGFjdCA9IGlzRXhhY3RcbmV4cG9ydHMuaXNMdGd0ID0gaXNMdGd0XG5cbmV4cG9ydHMuaGFzID0gaGFzXG5leHBvcnRzLmdldCA9IGdldFxuZXhwb3J0cy5tYXAgPSBtYXBcblxuZXhwb3J0cy51cHBlciA9IHVwcGVyXG5leHBvcnRzLmxvd2VyID0gbG93ZXJcblxuZXhwb3J0cy5ISSA9IHVuZGVmaW5lZFxuZXhwb3J0cy5MTyA9IG51bGxcbiIsIlxuZnVuY3Rpb24gaXNPYmplY3Qobykge1xuICByZXR1cm4gbyAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG9cbn1cblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkICh1KSB7XG4gIHJldHVybiAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIHVcbn1cblxudmFyIGZpbmQgPSBleHBvcnRzLmZpbmQgPSBmdW5jdGlvbiBmaW5kKGFyeSwgdGVzdCkge1xuICBmb3IodmFyIGkgaW4gYXJ5KVxuICAgIGlmKHRlc3QoYXJ5W2ldLCBpLCBhcnkpKSByZXR1cm4gYXJ5W2ldXG59XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IG1lcmdlXG5leHBvcnRzLm1lcmdlID0gZXhwb3J0c1xuXG52YXIgY2xvbmUgPSBleHBvcnRzLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKG9iaiwgbWFwcGVyKSB7XG4gIGZ1bmN0aW9uIG1hcCh2LCBrKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHYpID8gY2xvbmUodiwgbWFwcGVyKSA6IG1hcHBlcih2LCBrKVxuICB9XG4gIGlmKGlzQXJyYXkob2JqKSlcbiAgICByZXR1cm4gb2JqLm1hcChtYXApXG4gIGVsc2UgaWYoaXNPYmplY3Qob2JqKSkge1xuICAgIHZhciBvID0ge31cbiAgICBmb3IodmFyIGsgaW4gb2JqKVxuICAgICAgb1trXSA9IG1hcChvYmpba10sIGspXG4gICAgcmV0dXJuIG9cbiAgfVxuICBlbHNlXG4gICAgcmV0dXJuIG1hcChvYmopXG59XG5cbnZhciBtZXJnZUtleXMgPSBleHBvcnRzLm1lcmdlS2V5cyA9IGZ1bmN0aW9uIChhLCBiLCBpdGVyKSB7XG4gIHZhciBvID0ge31cbiAgZm9yKHZhciBrIGluIGEpIHtcbiAgICBpZighaXNVbmRlZmluZWQoYVtrXSkpXG4gICAgICBvW2tdID0gaXRlcihhW2tdLCBiW2tdLCBrKVxuICB9XG4gIGZvcih2YXIgayBpbiBiKSB7XG4gICAgaWYoaXNVbmRlZmluZWQoYVtrXSkpXG4gICAgICBvW2tdID0gaXRlcih1bmRlZmluZWQsIGJba10sIGspXG4gIH1cbiAgcmV0dXJuIG9cbn1cblxudmFyIG1lcmdlQXJyYXlzID0gZXhwb3J0cy5tZXJnZUFycmF5cyA9IGZ1bmN0aW9uIChhLCBiLCBpdGVyKSB7XG4gIHZhciBvID0gW11cbiAgYS5mb3JFYWNoKGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgdmFyIGogPSBiLmluZGV4T2YodilcbiAgICBvLnB1c2goaXRlcih2LCBiW2pdLCBvLmxlbmd0aCkpXG4gIH0pXG4gIGIuZm9yRWFjaChmdW5jdGlvbiAodiwgaSkge1xuICAgIHZhciBqID0gYS5pbmRleE9mKHYpXG4gICAgaWYoIX5qKVxuICAgICAgby5wdXNoKGl0ZXIodW5kZWZpbmVkLCBiW2ldLCBvLmxlbmd0aCkpXG4gIH0pXG4gIHJldHVybiBvXG59XG5cbmZ1bmN0aW9uIG1lcmdlIChhLCBiLCBtZXJnZSkge1xuXG4gIC8vbWVyZ2UgYSBhbmQgYiBvYmplY3RzXG5cbiAgbWVyZ2UgPSBtZXJnZSB8fCBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHJldHVybiB5ID09IG51bGwgPyB4IDogeVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VyKGEsIGIsIGspIHtcblxuICAgIGlmKGlzQXJyYXkoYSkgJiYgaXNBcnJheShiKSlcbiAgICAgIHJldHVybiBtZXJnZUFycmF5cyhhLCBiLCBtZXJnZXIpXG4gICAgZWxzZSBpZihpc09iamVjdChhKSAmJiBpc09iamVjdChiKSkge1xuICAgICAgcmV0dXJuIG1lcmdlS2V5cyhhLCBiLCBtZXJnZXIpXG4gICAgfVxuICAgIGVsc2VcbiAgICAgIHJldHVybiBtZXJnZShhLCBiLCBrKVxuXG4gIH1cblxuICByZXR1cm4gbWVyZ2VyKGEsIGIsIHVuZGVmaW5lZClcblxuXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qXG4gKiBVc2VmdWwgZXhwcmVzc2lvbnMuXG4gKi9cblxudmFyIEVYUFJFU1NJT05fRE9UID0gL1xcLi87XG52YXIgRVhQUkVTU0lPTl9MQVNUX0RPVCA9IC9cXC5bXi5dKiQvO1xuXG4vKlxuICogQWxsb3dlZCBhbGlnbm1lbnQgdmFsdWVzLlxuICovXG5cbnZhciBMRUZUID0gJ2wnO1xudmFyIFJJR0hUID0gJ3InO1xudmFyIENFTlRFUiA9ICdjJztcbnZhciBET1QgPSAnLic7XG52YXIgTlVMTCA9ICcnO1xuXG52YXIgQUxMSUdOTUVOVCA9IFtMRUZULCBSSUdIVCwgQ0VOVEVSLCBET1QsIE5VTExdO1xuXG4vKlxuICogQ2hhcmFjdGVycy5cbiAqL1xuXG52YXIgQ09MT04gPSAnOic7XG52YXIgREFTSCA9ICctJztcbnZhciBQSVBFID0gJ3wnO1xudmFyIFNQQUNFID0gJyAnO1xudmFyIE5FV19MSU5FID0gJ1xcbic7XG5cbi8qKlxuICogR2V0IHRoZSBsZW5ndGggb2YgYHZhbHVlYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gbGVuZ3RoTm9vcCh2YWx1ZSkge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBHZXQgYSBzdHJpbmcgY29uc2lzdGluZyBvZiBgbGVuZ3RoYCBgY2hhcmFjdGVyYHMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGFyYWN0ZXI9JyAnXVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBwYWQobGVuZ3RoLCBjaGFyYWN0ZXIpIHtcbiAgICByZXR1cm4gQXJyYXkobGVuZ3RoICsgMSkuam9pbihjaGFyYWN0ZXIgfHwgU1BBQ0UpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgZG90IGluIGB2YWx1ZWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGRvdGluZGV4KHZhbHVlKSB7XG4gICAgdmFyIG1hdGNoID0gRVhQUkVTU0lPTl9MQVNUX0RPVC5leGVjKHZhbHVlKTtcblxuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoLmluZGV4ICsgMSA6IHZhbHVlLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSB0YWJsZSBmcm9tIGEgbWF0cml4IG9mIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtBcnJheS48QXJyYXkuPHN0cmluZz4+fSB0YWJsZVxuICogQHBhcmFtIHtPYmplY3Q/fSBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbb3B0aW9ucy5ydWxlPXRydWVdXG4gKiBAcGFyYW0ge3N0cmluZz99IFtvcHRpb25zLmRlbGltaXRlcj1cIiB8IFwiXVxuICogQHBhcmFtIHtzdHJpbmc/fSBbb3B0aW9ucy5zdGFydD1cInwgXCJdXG4gKiBAcGFyYW0ge3N0cmluZz99IFtvcHRpb25zLmVuZD1cIiB8XCJdXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+P30gb3B0aW9ucy5hbGlnblxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpP30gb3B0aW9ucy5zdHJpbmdMZW5ndGhcbiAqIEByZXR1cm4ge3N0cmluZ30gUHJldHR5IHRhYmxlXG4gKi9cbmZ1bmN0aW9uIG1hcmtkb3duVGFibGUodGFibGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9O1xuICAgIHZhciBkZWxpbWl0ZXIgPSBzZXR0aW5ncy5kZWxpbWl0ZXI7XG4gICAgdmFyIHN0YXJ0ID0gc2V0dGluZ3Muc3RhcnQ7XG4gICAgdmFyIGVuZCA9IHNldHRpbmdzLmVuZDtcbiAgICB2YXIgYWxpZ25tZW50ID0gc2V0dGluZ3MuYWxpZ247XG4gICAgdmFyIGNhbGN1bGF0ZVN0cmluZ0xlbmd0aCA9IHNldHRpbmdzLnN0cmluZ0xlbmd0aCB8fCBsZW5ndGhOb29wO1xuICAgIHZhciBjZWxsQ291bnQgPSAwO1xuICAgIHZhciByb3dJbmRleCA9IC0xO1xuICAgIHZhciByb3dMZW5ndGggPSB0YWJsZS5sZW5ndGg7XG4gICAgdmFyIHNpemVzID0gW107XG4gICAgdmFyIGFsaWduO1xuICAgIHZhciBydWxlO1xuICAgIHZhciByb3dzO1xuICAgIHZhciByb3c7XG4gICAgdmFyIGNlbGxzO1xuICAgIHZhciBpbmRleDtcbiAgICB2YXIgcG9zaXRpb247XG4gICAgdmFyIHNpemU7XG4gICAgdmFyIHZhbHVlO1xuICAgIHZhciBzcGFjaW5nO1xuICAgIHZhciBiZWZvcmU7XG4gICAgdmFyIGFmdGVyO1xuXG4gICAgYWxpZ25tZW50ID0gYWxpZ25tZW50ID8gYWxpZ25tZW50LmNvbmNhdCgpIDogW107XG5cbiAgICBpZiAoZGVsaW1pdGVyID09PSBudWxsIHx8IGRlbGltaXRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGltaXRlciA9IFNQQUNFICsgUElQRSArIFNQQUNFO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA9PT0gbnVsbCB8fCBzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0ID0gUElQRSArIFNQQUNFO1xuICAgIH1cblxuICAgIGlmIChlbmQgPT09IG51bGwgfHwgZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gU1BBQ0UgKyBQSVBFO1xuICAgIH1cblxuICAgIHdoaWxlICgrK3Jvd0luZGV4IDwgcm93TGVuZ3RoKSB7XG4gICAgICAgIHJvdyA9IHRhYmxlW3Jvd0luZGV4XTtcblxuICAgICAgICBpbmRleCA9IC0xO1xuXG4gICAgICAgIGlmIChyb3cubGVuZ3RoID4gY2VsbENvdW50KSB7XG4gICAgICAgICAgICBjZWxsQ291bnQgPSByb3cubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBjZWxsQ291bnQpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gcm93W2luZGV4XSA/IGRvdGluZGV4KHJvd1tpbmRleF0pIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKCFzaXplc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICBzaXplc1tpbmRleF0gPSAzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPiBzaXplc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICBzaXplc1tpbmRleF0gPSBwb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYWxpZ25tZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICBhbGlnbm1lbnQgPSBwYWQoY2VsbENvdW50LCBhbGlnbm1lbnQpLnNwbGl0KCcnKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIE1ha2Ugc3VyZSBvbmx5IHZhbGlkIGFsaWdubWVudHMgYXJlIHVzZWQuXG4gICAgICovXG5cbiAgICBpbmRleCA9IC0xO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBjZWxsQ291bnQpIHtcbiAgICAgICAgYWxpZ24gPSBhbGlnbm1lbnRbaW5kZXhdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgYWxpZ24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhbGlnbiA9IGFsaWduLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFMTElHTk1FTlQuaW5kZXhPZihhbGlnbikgPT09IC0xKSB7XG4gICAgICAgICAgICBhbGlnbiA9IE5VTEw7XG4gICAgICAgIH1cblxuICAgICAgICBhbGlnbm1lbnRbaW5kZXhdID0gYWxpZ247XG4gICAgfVxuXG4gICAgcm93SW5kZXggPSAtMTtcbiAgICByb3dzID0gW107XG5cbiAgICB3aGlsZSAoKytyb3dJbmRleCA8IHJvd0xlbmd0aCkge1xuICAgICAgICByb3cgPSB0YWJsZVtyb3dJbmRleF07XG5cbiAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgY2VsbHMgPSBbXTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGNlbGxDb3VudCkge1xuICAgICAgICAgICAgdmFsdWUgPSByb3dbaW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFsaWdubWVudFtpbmRleF0gIT09IERPVCkge1xuICAgICAgICAgICAgICAgIGNlbGxzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGRvdGluZGV4KHZhbHVlKTtcblxuICAgICAgICAgICAgICAgIHNpemUgPSBzaXplc1tpbmRleF0gK1xuICAgICAgICAgICAgICAgICAgICAoRVhQUkVTU0lPTl9ET1QudGVzdCh2YWx1ZSkgPyAwIDogMSkgLVxuICAgICAgICAgICAgICAgICAgICAoY2FsY3VsYXRlU3RyaW5nTGVuZ3RoKHZhbHVlKSAtIHBvc2l0aW9uKTtcblxuICAgICAgICAgICAgICAgIGNlbGxzW2luZGV4XSA9IHZhbHVlICsgcGFkKHNpemUgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3Nbcm93SW5kZXhdID0gY2VsbHM7XG4gICAgfVxuXG4gICAgc2l6ZXMgPSBbXTtcbiAgICByb3dJbmRleCA9IC0xO1xuXG4gICAgd2hpbGUgKCsrcm93SW5kZXggPCByb3dMZW5ndGgpIHtcbiAgICAgICAgY2VsbHMgPSByb3dzW3Jvd0luZGV4XTtcblxuICAgICAgICBpbmRleCA9IC0xO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgY2VsbENvdW50KSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGNlbGxzW2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKCFzaXplc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICBzaXplc1tpbmRleF0gPSAzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaXplID0gY2FsY3VsYXRlU3RyaW5nTGVuZ3RoKHZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKHNpemUgPiBzaXplc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICBzaXplc1tpbmRleF0gPSBzaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcm93SW5kZXggPSAtMTtcblxuICAgIHdoaWxlICgrK3Jvd0luZGV4IDwgcm93TGVuZ3RoKSB7XG4gICAgICAgIGNlbGxzID0gcm93c1tyb3dJbmRleF07XG5cbiAgICAgICAgaW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGNlbGxDb3VudCkge1xuICAgICAgICAgICAgdmFsdWUgPSBjZWxsc1tpbmRleF07XG5cbiAgICAgICAgICAgIHBvc2l0aW9uID0gc2l6ZXNbaW5kZXhdIC0gKGNhbGN1bGF0ZVN0cmluZ0xlbmd0aCh2YWx1ZSkgfHwgMCk7XG4gICAgICAgICAgICBzcGFjaW5nID0gcGFkKHBvc2l0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGFsaWdubWVudFtpbmRleF0gPT09IFJJR0hUIHx8IGFsaWdubWVudFtpbmRleF0gPT09IERPVCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gc3BhY2luZyArIHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhbGlnbm1lbnRbaW5kZXhdICE9PSBDRU5URVIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgc3BhY2luZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAvIDI7XG5cbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gJSAxID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZSA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBhZnRlciA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZSA9IHBvc2l0aW9uICsgMC41O1xuICAgICAgICAgICAgICAgICAgICBhZnRlciA9IHBvc2l0aW9uIC0gMC41O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhbHVlID0gcGFkKGJlZm9yZSkgKyB2YWx1ZSArIHBhZChhZnRlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNlbGxzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93c1tyb3dJbmRleF0gPSBjZWxscy5qb2luKGRlbGltaXRlcik7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLnJ1bGUgIT09IGZhbHNlKSB7XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIHJ1bGUgPSBbXTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGNlbGxDb3VudCkge1xuICAgICAgICAgICAgYWxpZ24gPSBhbGlnbm1lbnRbaW5kZXhdO1xuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogV2hlbiBgYWxpZ25gIGlzIGxlZnQsIGRvbid0IGFkZCBjb2xvbnMuXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgdmFsdWUgPSBhbGlnbiA9PT0gUklHSFQgfHwgYWxpZ24gPT09IE5VTEwgPyBEQVNIIDogQ09MT047XG4gICAgICAgICAgICB2YWx1ZSArPSBwYWQoc2l6ZXNbaW5kZXhdIC0gMiwgREFTSCk7XG4gICAgICAgICAgICB2YWx1ZSArPSBhbGlnbiAhPT0gTEVGVCAmJiBhbGlnbiAhPT0gTlVMTCA/IENPTE9OIDogREFTSDtcblxuICAgICAgICAgICAgcnVsZVtpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3Muc3BsaWNlKDEsIDAsIHJ1bGUuam9pbihkZWxpbWl0ZXIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhcnQgKyByb3dzLmpvaW4oZW5kICsgTkVXX0xJTkUgKyBzdGFydCkgKyBlbmQ7XG59XG5cbi8qXG4gKiBFeHBvc2UgYG1hcmtkb3duVGFibGVgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gbWFya2Rvd25UYWJsZTtcbiIsInZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxudmFyIHJlbWFyayA9IHJlcXVpcmUoJ3JlbWFyaycpXG52YXIgaHRtbCA9IHJlcXVpcmUoJ3JlbWFyay1odG1sJylcblxuLy8gLSBvYmo6IG9iamVjdFxuLy8gLSBwYXRoOiBhcnJheSwgYSBsaXN0IG9mIGtleXNcbi8vIC0gdmFsdWU6IGFueVxuLy8gd2lsbCBjcmVhdGUgYW55IHN1Ym9iamVjdCBuZWVkZWRcbi8vIGVnIHZhciB4ID0ge307IHNldCh4LCBbJ2ZvbycsICdiYXInXSwgNSk7IHguZm9vLmJhciA9PSA1XG5mdW5jdGlvbiBzZXQgKG9iaiwgcGF0aCwgdmFsdWUpIHtcbiAgd2hpbGUgKHBhdGgubGVuZ3RoID4gMSkge1xuICAgIHZhciBrID0gcGF0aC5zaGlmdCgpXG4gICAgaWYgKCFvYmpba10pXG4gICAgICBvYmpba10gPSB7fVxuICAgIG9iaiA9IG9ialtrXVxuICB9XG4gIG9ialtwYXRoWzBdXSA9IHZhbHVlXG59XG5cbmZ1bmN0aW9uIGZpbGwgKHN0ciwgbikge1xuICBpZiAobiA+IHN0ci5sZW5ndGgpXG4gICAgcmV0dXJuIHN0ciArICcgJy5yZXBlYXQobiAtIHN0ci5sZW5ndGgpXG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gbWV0aG9kVGFibGUgKG1ldGhvZHMsIG5hbWVXaWR0aCkge1xuICAvLyBmaWd1cmUgb3V0IGhvdyBsb25nIHRoZSBuYW1lcyBjb2x1bW4gbmVlZHMgdG8gYmVcbiAgaWYgKCFuYW1lV2lkdGgpIHtcbiAgICBuYW1lV2lkdGggPSAxXG4gICAgbWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG4gICAgICBpZiAobS5uYW1lLmxlbmd0aCA+IG5hbWVXaWR0aClcbiAgICAgICAgbmFtZVdpZHRoID0gbS5uYW1lLmxlbmd0aFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gbWV0aG9kcy5tYXAoZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gJyAgJyArIGZpbGwobS5uYW1lLCBuYW1lV2lkdGgpICsgJyAnICsgbS5kZXNjXG4gIH0pLmpvaW4oJycpLnRyaW0oKVxufVxuXG5mdW5jdGlvbiBwYXJzZU1ldGhvZEhlYWRpbmcgKHRva2VuLCBwcmVmaXgpIHtcbiAgdmFyIHRleHRUb2tlbiA9IHRva2VuLmNoaWxkcmVuWzBdXG4gIGFzc2VydC5lcXVhbCh0ZXh0VG9rZW4udHlwZSwgJ3RleHQnLCAnSGVhZGluZ3Mgc2hvdWxkIG5vdCBoYXZlIGFueSBtYXJrdXAnKVxuXG4gIHZhciBwYXJ0cyA9IHRleHRUb2tlbi52YWx1ZS5zcGxpdCgnOiAnKVxuICBhc3NlcnQuZXF1YWwocGFydHMubGVuZ3RoLCAyLCAnSGVhZGluZyBcIicrdGV4dFRva2VuLnZhbHVlKydcIiBzaG91bGQgYmUgb2YgZm9ybSBgbWV0aG9kOiB0eXBlYCcpXG4gIFxuICB2YXIgbmFtZSA9IHBhcnRzWzBdLCB0eXBlID0gcGFydHNbMV1cbiAgYXNzZXJ0KG5hbWVSZWdleC50ZXN0KG5hbWUpLCAnRnVuY3Rpb24gbmFtZSBcIicrbmFtZSsnXCIgZG9lcyBub3RzIG1hdGNoICcrbmFtZVJlZ2V4KVxuICBhc3NlcnQobmFtZVJlZ2V4LnRlc3QodHlwZSksICdGdW5jdGlvbiB0eXBlIFwiJyt0eXBlKydcIiBkb2VzIG5vdCBtYXRjaCAnK3R5cGVSZWdleClcblxuICBpZiAocHJlZml4KVxuICAgIHBhcnRzWzBdID0gcHJlZml4ICsgJy4nICsgcGFydHNbMF1cblxuICByZXR1cm4gcGFydHNcbn1cblxudmFyIG5hbWVSZWdleCA9IC9eW2Etel1bYS16MC05XFwuXFwtX10qJC9pXG52YXIgdHlwZVJlZ2V4ID0gL15bYS16XSskL2lcbm1vZHVsZS5leHBvcnRzLm1hbmlmZXN0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgYXNzZXJ0LmVxdWFsKHR5cGVvZiB0ZXh0LCAnc3RyaW5nJywgJ0lucHV0IHNob3VsZCBiZSBhIG1hcmtkb3duIHN0cmluZycpXG5cbiAgdmFyIG1hbmlmZXN0ID0ge31cbiAgcmVtYXJrKCkucGFyc2UodGV4dCkuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAodG9rZW4sIGkpIHtcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2hlYWRpbmcnICYmIHRva2VuLmRlcHRoID09PSAyKSB7XG4gICAgICB2YXIgcGFydHMgPSBwYXJzZU1ldGhvZEhlYWRpbmcodG9rZW4pXG4gICAgICBzZXQobWFuaWZlc3QsIHBhcnRzWzBdLnNwbGl0KCcuJyksIHBhcnRzWzFdKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gbWFuaWZlc3Rcbn1cblxubW9kdWxlLmV4cG9ydHMudXNhZ2UgPSBmdW5jdGlvbiAodGV4dCwgY21kLCBvcHRzKSB7XG4gIGFzc2VydC5lcXVhbCh0eXBlb2YgdGV4dCwgJ3N0cmluZycsICdJbnB1dCBzaG91bGQgYmUgYSBtYXJrZG93biBzdHJpbmcnKVxuICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gIHZhciBsZXhlciA9IHJlbWFyaygpXG4gIHZhciB0b2tlbnMgPSBsZXhlci5wYXJzZSh0ZXh0KS5jaGlsZHJlblxuICBpZiAoIWNtZCkge1xuICAgIC8vIHRvcGxldmVsIHVzYWdlXG4gICAgdmFyIGluU3VtbWFyeSA9IHRydWUgLy8gaW4gdGhlIGFwaSBzdW1tYXJ5P1xuICAgIHZhciB0b3BsZXZlbFBhcmFzID0gW11cbiAgICB2YXIgbWV0aG9kcyA9IFtdXG4gICAgdmFyIGN1cnJlbnRNZXRob2RcbiAgICB0b2tlbnMuZm9yRWFjaChmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgIGlmICh0b2tlbi50eXBlID09ICdwYXJhZ3JhcGgnICYmIGluU3VtbWFyeSkge1xuICAgICAgICAvLyBhIHBhcmEgaW4gdGhlIGFwaSdzIHRvcGxldmVsIHN1bW1hcnlcbiAgICAgICAgdG9wbGV2ZWxQYXJhcy5wdXNoKGxleGVyLnN0cmluZ2lmeSh7IHR5cGU6ICdyb290JywgY2hpbGRyZW46IHRva2VuLmNoaWxkcmVuIH0pKVxuICAgICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09ICdoZWFkaW5nJyAmJiB0b2tlbi5kZXB0aCA9PSAyKSB7XG4gICAgICAgIC8vIGEgbWV0aG9kIGhlYWRpbmdcbiAgICAgICAgaW5TdW1tYXJ5ID0gZmFsc2UgLy8gbm8gbG9uZ2VyIGluIHRoZSBhcGkgc3VtbWFyeVxuICAgICAgICB2YXIgcGFydHMgPSBwYXJzZU1ldGhvZEhlYWRpbmcodG9rZW4sIG9wdHMucHJlZml4KVxuICAgICAgICBjdXJyZW50TWV0aG9kID0gcGFydHNbMF1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT0gJ3BhcmFncmFwaCcgJiYgY3VycmVudE1ldGhvZCkge1xuICAgICAgICAvLyB0aGUgZmlyc3QgcGFyYSBpbiBhIG1ldGhvZFxuICAgICAgICBtZXRob2RzLnB1c2goeyBuYW1lOiBjdXJyZW50TWV0aG9kLCBkZXNjOiBsZXhlci5zdHJpbmdpZnkoeyB0eXBlOiAncm9vdCcsIGNoaWxkcmVuOiB0b2tlbi5jaGlsZHJlbiB9KX0pXG4gICAgICAgIGN1cnJlbnRNZXRob2QgPSBudWxsXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoY3VycmVudE1ldGhvZClcbiAgICAgIG1ldGhvZHMucHVzaCh7IG5hbWU6IGN1cnJlbnRNZXRob2QgfSlcbiAgICByZXR1cm4gdG9wbGV2ZWxQYXJhcy5qb2luKCdcXG4nKSArICdcXG5Db21tYW5kczpcXG4gICcgKyBtZXRob2RUYWJsZShtZXRob2RzLCBvcHRzLm5hbWVXaWR0aClcbiAgfVxuXG4gIC8vIG1ldGhvZCB1c2FnZVxuICB2YXIgaW5NZXRob2QgPSBmYWxzZSAvLyBpbiB0aGUgbWV0aG9kP1xuICB2YXIgZWxlbXMgPSBbXVxuICBmb3IgKHZhciBpPTA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV1cbiAgICBpZiAodG9rZW4udHlwZSA9PSAnaGVhZGluZycpIHtcbiAgICAgIC8vIGEgaGVhZGluZ1xuICAgICAgaWYgKGluTWV0aG9kKVxuICAgICAgICBicmVhayAvLyBkb25lIHB1bGxpbmcgZnJvbSB0aGUgbWV0aG9kJ3Mgc3VtbWFyeVxuICAgICAgaWYgKHRva2VuLmRlcHRoID09IDIgJiYgcGFyc2VNZXRob2RIZWFkaW5nKHRva2VuKVswXSA9PSBjbWQpXG4gICAgICAgIGluTWV0aG9kID0gdHJ1ZSAvLyB3ZSdyZSBpbiB0aGUgdGFyZ2V0IG1ldGhvZCdzIHN1bW1hcnlcbiAgICB9XG4gICAgZWxzZSBpZiAoaW5NZXRob2QpIHtcbiAgICAgIGlmICh0b2tlbi50eXBlID09ICdjb2RlJykge1xuICAgICAgICAvLyBvbmx5IGluY2x1ZGUgY29kZSBleGFtcGxlcyBmb3IgdGhlIENMSVxuICAgICAgICBpZiAodG9rZW4ubGFuZyA9PSAnYmFzaCcgfHwgdG9rZW4ubGFuZyA9PSAnc2gnIHx8IHRva2VuLmxhbmcgPT0gJ3NoZWxsJyB8fCAhdG9rZW4ubGFuZykge1xuICAgICAgICAgIHRva2VuLnR5cGUgPSAndGV4dCdcbiAgICAgICAgICBlbGVtcy5wdXNoKHRva2VuKVxuICAgICAgICB9XG4gICAgICB9IGVsc2VcbiAgICAgICAgZWxlbXMucHVzaCh0b2tlbilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxleGVyXG4gICAgLnN0cmluZ2lmeSh7IHR5cGU6ICdyb290JywgY2hpbGRyZW46IGVsZW1zIH0pXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKC9cXFxcXFxbL2csICdbJykgLy8gZG9udCBlc2NhcGUgJ1snXG59XG5cbm1vZHVsZS5leHBvcnRzLmh0bWwgPSBmdW5jdGlvbiAodGV4dCkge1xuICBhc3NlcnQuZXF1YWwodHlwZW9mIHRleHQsICdzdHJpbmcnLCAnSW5wdXQgc2hvdWxkIGJlIGEgbWFya2Rvd24gc3RyaW5nJylcbiAgcmV0dXJuIHJlbWFyaygpLnVzZShodG1sKS5wcm9jZXNzKHRleHQpXG59IiwidmFyIGJuID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBicm9yYW5kID0gcmVxdWlyZSgnYnJvcmFuZCcpO1xuXG5mdW5jdGlvbiBNaWxsZXJSYWJpbihyYW5kKSB7XG4gIHRoaXMucmFuZCA9IHJhbmQgfHwgbmV3IGJyb3JhbmQuUmFuZCgpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBNaWxsZXJSYWJpbjtcblxuTWlsbGVyUmFiaW4uY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHJhbmQpIHtcbiAgcmV0dXJuIG5ldyBNaWxsZXJSYWJpbihyYW5kKTtcbn07XG5cbk1pbGxlclJhYmluLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgdmFyIGxlbiA9IG4uYml0TGVuZ3RoKCk7XG4gIHZhciBidWYgPSB0aGlzLnJhbmQuZ2VuZXJhdGUoTWF0aC5jZWlsKGxlbiAvIDgpKTtcblxuICAvLyBTZXQgbG93IGJpdHNcbiAgYnVmWzBdIHw9IDM7XG5cbiAgLy8gTWFzayBoaWdoIGJpdHNcbiAgdmFyIG1hc2sgPSBsZW4gJiAweDc7XG4gIGlmIChtYXNrICE9PSAwKVxuICAgIGJ1ZltidWYubGVuZ3RoIC0gMV0gPj49IDcgLSBtYXNrO1xuXG4gIHJldHVybiBuZXcgYm4oYnVmKTtcbn1cblxuTWlsbGVyUmFiaW4ucHJvdG90eXBlLnRlc3QgPSBmdW5jdGlvbiB0ZXN0KG4sIGssIGNiKSB7XG4gIHZhciBsZW4gPSBuLmJpdExlbmd0aCgpO1xuICB2YXIgcmVkID0gYm4ubW9udChuKTtcbiAgdmFyIHJvbmUgPSBuZXcgYm4oMSkudG9SZWQocmVkKTtcblxuICBpZiAoIWspXG4gICAgayA9IE1hdGgubWF4KDEsIChsZW4gLyA0OCkgfCAwKTtcblxuICAvLyBGaW5kIGQgYW5kIHMsIChuIC0gMSkgPSAoMiBeIHMpICogZDtcbiAgdmFyIG4xID0gbi5zdWJuKDEpO1xuICB2YXIgbjIgPSBuMS5zdWJuKDEpO1xuICBmb3IgKHZhciBzID0gMDsgIW4xLnRlc3RuKHMpOyBzKyspIHt9XG4gIHZhciBkID0gbi5zaHJuKHMpO1xuXG4gIHZhciBybjEgPSBuMS50b1JlZChyZWQpO1xuXG4gIHZhciBwcmltZSA9IHRydWU7XG4gIGZvciAoOyBrID4gMDsgay0tKSB7XG4gICAgdmFyIGEgPSB0aGlzLl9yYW5kKG4yKTtcbiAgICBpZiAoY2IpXG4gICAgICBjYihhKTtcblxuICAgIHZhciB4ID0gYS50b1JlZChyZWQpLnJlZFBvdyhkKTtcbiAgICBpZiAoeC5jbXAocm9uZSkgPT09IDAgfHwgeC5jbXAocm4xKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBzOyBpKyspIHtcbiAgICAgIHggPSB4LnJlZFNxcigpO1xuXG4gICAgICBpZiAoeC5jbXAocm9uZSkgPT09IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh4LmNtcChybjEpID09PSAwKVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gcylcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBwcmltZTtcbn07XG5cbk1pbGxlclJhYmluLnByb3RvdHlwZS5nZXREaXZpc29yID0gZnVuY3Rpb24gZ2V0RGl2aXNvcihuLCBrKSB7XG4gIHZhciBsZW4gPSBuLmJpdExlbmd0aCgpO1xuICB2YXIgcmVkID0gYm4ubW9udChuKTtcbiAgdmFyIHJvbmUgPSBuZXcgYm4oMSkudG9SZWQocmVkKTtcblxuICBpZiAoIWspXG4gICAgayA9IE1hdGgubWF4KDEsIChsZW4gLyA0OCkgfCAwKTtcblxuICAvLyBGaW5kIGQgYW5kIHMsIChuIC0gMSkgPSAoMiBeIHMpICogZDtcbiAgdmFyIG4xID0gbi5zdWJuKDEpO1xuICB2YXIgbjIgPSBuMS5zdWJuKDEpO1xuICBmb3IgKHZhciBzID0gMDsgIW4xLnRlc3RuKHMpOyBzKyspIHt9XG4gIHZhciBkID0gbi5zaHJuKHMpO1xuXG4gIHZhciBybjEgPSBuMS50b1JlZChyZWQpO1xuXG4gIGZvciAoOyBrID4gMDsgay0tKSB7XG4gICAgdmFyIGEgPSB0aGlzLl9yYW5kKG4yKTtcblxuICAgIHZhciBnID0gbi5nY2QoYSk7XG4gICAgaWYgKGcuY21wbigxKSAhPT0gMClcbiAgICAgIHJldHVybiBnO1xuXG4gICAgdmFyIHggPSBhLnRvUmVkKHJlZCkucmVkUG93KGQpO1xuICAgIGlmICh4LmNtcChyb25lKSA9PT0gMCB8fCB4LmNtcChybjEpID09PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHM7IGkrKykge1xuICAgICAgeCA9IHgucmVkU3FyKCk7XG5cbiAgICAgIGlmICh4LmNtcChyb25lKSA9PT0gMClcbiAgICAgICAgcmV0dXJuIHguZnJvbVJlZCgpLnN1Ym4oMSkuZ2NkKG4pO1xuICAgICAgaWYgKHguY21wKHJuMSkgPT09IDApXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChpID09PSBzKSB7XG4gICAgICB4ID0geC5yZWRTcXIoKTtcbiAgICAgIHJldHVybiB4LmZyb21SZWQoKS5zdWJuKDEpLmdjZChuKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcImFwcGxpY2F0aW9uLzFkLWludGVybGVhdmVkLXBhcml0eWZlY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi8zZ3BkYXNoLXFvZS1yZXBvcnQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uLzNncHAtaW1zK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9hMmxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vYWN0aXZlbWVzc2FnZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9hbHRvLWNvc3RtYXAranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2FsdG8tY29zdG1hcGZpbHRlcitqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vYWx0by1kaXJlY3RvcnkranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2FsdG8tZW5kcG9pbnRjb3N0K2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9hbHRvLWVuZHBvaW50Y29zdHBhcmFtcytqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vYWx0by1lbmRwb2ludHByb3AranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2FsdG8tZW5kcG9pbnRwcm9wcGFyYW1zK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9hbHRvLWVycm9yK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9hbHRvLW5ldHdvcmttYXAranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2FsdG8tbmV0d29ya21hcGZpbHRlcitqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vYW1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2FuZHJldy1pbnNldFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImV6XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vYXBwbGVmaWxlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2FwcGxpeHdhcmVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImF3XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vYXRmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2F0ZnhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vYXRvbSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImF0b21cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9hdG9tY2F0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImF0b21jYXRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9hdG9tZGVsZXRlZCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vYXRvbWljbWFpbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9hdG9tc3ZjK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImF0b21zdmNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9hdHhtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9hdXRoLXBvbGljeSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vYmFjbmV0LXhkZCt6aXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vYmF0Y2gtc210cFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9iZG9jXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYmRvY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2JlZXAreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2NhbGVuZGFyK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9jYWxlbmRhcit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vY2FsbC1jb21wbGV0aW9uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2NhbHMtMTg0MFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9jYm9yXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2NjbXAreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2NjeG1sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNjeG1sXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vY2RmeCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vY2RtaS1jYXBhYmlsaXR5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2RtaWFcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9jZG1pLWNvbnRhaW5lclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNkbWljXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vY2RtaS1kb21haW5cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjZG1pZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2NkbWktb2JqZWN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2RtaW9cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9jZG1pLXF1ZXVlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2RtaXFcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9jZG5pXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2NlYVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9jZWEtMjAxOCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vY2VsbG1sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9jZndcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vY21zXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2NucnAreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2NvYXAtZ3JvdXAranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2NvbW1vbmdyb3VuZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9jb25mZXJlbmNlLWluZm8reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2NwbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vY3NyYXR0cnNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vY3N0YSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vY3N0YWRhdGEreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2Nzdm0ranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2N1LXNlZW1lXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjdVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2N5YmVyY2FzaFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9kYXJ0XCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZGFzaCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtcGRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9kYXNoZGVsdGFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZGF2bW91bnQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZGF2bW91bnRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9kY2EtcmZ0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2RjZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9kZWMtZHhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZGlhbG9nLWluZm8reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2RpY29tXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2RpaVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9kaXRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZG5zXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2RvY2Jvb2sreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkYmtcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9kc2twcCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZHNzYytkZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkc3NjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZHNzYyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4ZHNzY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2R2Y3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZWNtYVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2VkaS1jb25zZW50XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2VkaS14MTJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZWRpZmFjdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2VcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9lbWVyZ2VuY3ljYWxsZGF0YS5jb21tZW50K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9lbWVyZ2VuY3ljYWxsZGF0YS5kZXZpY2VpbmZvK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9lbWVyZ2VuY3ljYWxsZGF0YS5wcm92aWRlcmluZm8reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2VtZXJnZW5jeWNhbGxkYXRhLnNlcnZpY2VpbmZvK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9lbWVyZ2VuY3ljYWxsZGF0YS5zdWJzY3JpYmVyaW5mbyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZW1tYSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJlbW1hXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZW1vdGlvbm1sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9lbmNhcHJ0cFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9lcHAreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2VwdWIremlwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZXB1YlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2VzaG9wXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2V4aVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImV4aVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2Zhc3Rzb2FwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2ZkdCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZml0c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9mb250LXNmbnRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZm9udC10ZHBmclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBmclwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2ZvbnQtd29mZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndvZmZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9mb250LXdvZmYyXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid29mZjJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9mcmFtZXdvcmstYXR0cmlidXRlcyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZ21sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZ21sXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZ3B4K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZ3B4XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vZ3hmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJneGZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9nemlwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2gyMjRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vaGVsZCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vaHR0cFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9oeXBlcnN0dWRpb1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN0a1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2liZS1rZXktcmVxdWVzdCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vaWJlLXBrZy1yZXBseSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vaWJlLXBwLWRhdGFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vaWdlc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9pbS1pc2NvbXBvc2luZyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vaW5kZXhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vaW5kZXguY21kXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2luZGV4Lm9ialwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9pbmRleC5yZXNwb25zZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9pbmRleC52bmRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vaW5rbWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaW5rXCIsXCJpbmttbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2lvdHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vaXBmaXhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJpcGZpeFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2lwcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9pc3VwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2l0cyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vamF2YS1hcmNoaXZlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJqYXJcIixcIndhclwiLFwiZWFyXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vamF2YS1zZXJpYWxpemVkLW9iamVjdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2VyXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vamF2YS12bVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2xhc3NcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNoYXJzZXRcIjogXCJVVEYtOFwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImpzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vam9zZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9qb3NlK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9qcmQranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY2hhcnNldFwiOiBcIlVURi04XCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wianNvblwiLFwibWFwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vanNvbi1zZXFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vanNvbjVcIjoge1xuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJqc29uNVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2pzb25tbCtqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImpzb25tbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL2p3aytqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vandrLXNldCtqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vand0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL2twbWwtcmVxdWVzdCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24va3BtbC1yZXNwb25zZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbGQranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wianNvbmxkXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbGluay1mb3JtYXRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbG9hZC1jb250cm9sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9sb3N0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImxvc3R4bWxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9sb3N0c3luYyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbHhmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImhxeFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjcHRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tYWN3cml0ZWlpXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21hZHMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWFkc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL21hbmlmZXN0K2pzb25cIjoge1xuICAgIFwiY2hhcnNldFwiOiBcIlVURi04XCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid2VibWFuaWZlc3RcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tYXJjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibXJjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbWFyY3htbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtcmN4XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbWF0aGVtYXRpY2FcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtYVwiLFwibmJcIixcIm1iXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbWF0aG1sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1hdGhtbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL21hdGhtbC1jb250ZW50K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tYXRobWwtcHJlc2VudGF0aW9uK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tYm1zLWFzc29jaWF0ZWQtcHJvY2VkdXJlLWRlc2NyaXB0aW9uK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tYm1zLWRlcmVnaXN0ZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21ibXMtZW52ZWxvcGUreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21ibXMtbXNrK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tYm1zLW1zay1yZXNwb25zZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbWJtcy1wcm90ZWN0aW9uLWRlc2NyaXB0aW9uK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tYm1zLXJlY2VwdGlvbi1yZXBvcnQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21ibXMtcmVnaXN0ZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21ibXMtcmVnaXN0ZXItcmVzcG9uc2UreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21ibXMtc2NoZWR1bGUreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21ibXMtdXNlci1zZXJ2aWNlLWRlc2NyaXB0aW9uK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tYm94XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWJveFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL21lZGlhLXBvbGljeS1kYXRhc2V0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tZWRpYV9jb250cm9sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tZWRpYXNlcnZlcmNvbnRyb2wreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibXNjbWxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tZXJnZS1wYXRjaCtqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbWV0YWxpbmsreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtZXRhbGlua1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL21ldGFsaW5rNCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtZXRhNFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL21ldHMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWV0c1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL21mNFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9taWtleVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tb2RzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1vZHNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tb3NzLWtleXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbW9zcy1zaWduYXR1cmVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbW9zc2tleS1kYXRhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21vc3NrZXktcmVxdWVzdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tcDIxXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibTIxXCIsXCJtcDIxXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbXA0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibXA0c1wiLFwibTRwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbXBlZzQtZ2VuZXJpY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tcGVnNC1pb2RcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbXBlZzQtaW9kLXhtdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tcmItY29uc3VtZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21yYi1wdWJsaXNoK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tc2MtaXZyK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9tc2MtbWl4ZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL21zd29yZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImRvY1wiLFwiZG90XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbXhmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibXhmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vbmFzZGF0YVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9uZXdzLWNoZWNrZ3JvdXBzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL25ld3MtZ3JvdXBpbmZvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL25ld3MtdHJhbnNtaXNzaW9uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL25sc21sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9uc3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vb2NzcC1yZXF1ZXN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL29jc3AtcmVzcG9uc2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYmluXCIsXCJkbXNcIixcImxyZlwiLFwibWFyXCIsXCJzb1wiLFwiZGlzdFwiLFwiZGlzdHpcIixcInBrZ1wiLFwiYnBrXCIsXCJkdW1wXCIsXCJlbGNcIixcImRlcGxveVwiLFwiZXhlXCIsXCJkbGxcIixcImRlYlwiLFwiZG1nXCIsXCJpc29cIixcImltZ1wiLFwibXNpXCIsXCJtc3BcIixcIm1zbVwiLFwiYnVmZmVyXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vb2RhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib2RhXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vb2R4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL29lYnBzLXBhY2thZ2UreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib3BmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vb2dnXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib2d4XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vb21kb2MreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJvbWRvY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL29uZW5vdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm9uZXRvY1wiLFwib25ldG9jMlwiLFwib25ldG1wXCIsXCJvbmVwa2dcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9veHBzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib3hwc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3AycC1vdmVybGF5K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9wYXJpdHlmZWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcGF0Y2gtb3BzLWVycm9yK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhlclwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3BkZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBkZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3BkeFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9wZ3AtZW5jcnlwdGVkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicGdwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcGdwLWtleXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFzY1wiLFwic2lnXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcGljcy1ydWxlc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicHJmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcGlkZit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcGlkZi1kaWZmK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9wa2NzMTBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwMTBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9wa2NzMTJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcGtjczctbWltZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInA3bVwiLFwicDdjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcGtjczctc2lnbmF0dXJlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicDdzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcGtjczhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwOFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3BraXgtYXR0ci1jZXJ0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYWNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9wa2l4LWNlcnRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjZXJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9wa2l4LWNybFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNybFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3BraXgtcGtpcGF0aFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBraXBhdGhcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9wa2l4Y21wXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicGtpXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcGxzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBsc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3BvYy1zZXR0aW5ncyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcG9zdHNjcmlwdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYWlcIixcImVwc1wiLFwicHNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9wcHNwLXRyYWNrZXIranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3Byb2JsZW0ranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3Byb2JsZW0reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3Byb3ZlbmFuY2UreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3Bycy5hbHZlc3RyYW5kLnRpdHJheC1zaGVldFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9wcnMuY3d3XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY3d3XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcHJzLmhwdWIremlwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3Bycy5ucHJlbmRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcHJzLnBsdWNrZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcHJzLnJkZi14bWwtY3J5cHRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcHJzLnhzZit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcHNrYyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwc2tjeG1sXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcXNpZ1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9yYXB0b3JmZWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcmRhcCtqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcmRmK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicmRmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcmVnaW5mbyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJyaWZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9yZWxheC1uZy1jb21wYWN0LXN5bnRheFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJuY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3JlbW90ZS1wcmludGluZ1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9yZXB1dG9uK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJybFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3Jlc291cmNlLWxpc3RzLWRpZmYreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicmxkXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcmZjK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9yaXNjb3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcmxtaSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcmxzLXNlcnZpY2VzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcnBraS1naG9zdGJ1c3RlcnNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJnYnJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9ycGtpLW1hbmlmZXN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWZ0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcnBraS1yb2FcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJyb2FcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9ycGtpLXVwZG93blwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9yc2QreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJyc2RcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9yc3MreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJzc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3J0ZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicnRmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcnRwbG9vcGJhY2tcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vcnR4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NhbWxhc3NlcnRpb24reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NhbWxtZXRhZGF0YSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vc2JtbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzYm1sXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vc2NhaXAreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NjaW0ranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NjdnAtY3YtcmVxdWVzdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNjcVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NjdnAtY3YtcmVzcG9uc2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzY3NcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zY3ZwLXZwLXJlcXVlc3RcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzcHFcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zY3ZwLXZwLXJlc3BvbnNlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3BwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vc2RwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2RwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vc2VwK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zZXAtZXhpXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3Nlc3Npb24taW5mb1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zZXQtcGF5bWVudFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zZXQtcGF5bWVudC1pbml0aWF0aW9uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2V0cGF5XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vc2V0LXJlZ2lzdHJhdGlvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uLWluaXRpYXRpb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzZXRyZWdcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zZ21sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NnbWwtb3Blbi1jYXRhbG9nXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NoZit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzaGZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zaWV2ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zaW1wbGUtZmlsdGVyK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zaW1wbGUtbWVzc2FnZS1zdW1tYXJ5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NpbXBsZXN5bWJvbGNvbnRhaW5lclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zbGF0ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zbWlsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NtaWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic21pXCIsXCJzbWlsXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vc21wdGUzMzZtXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NvYXArZmFzdGluZm9zZXRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vc29hcCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zcGFycWwtcXVlcnlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJycVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NwYXJxbC1yZXN1bHRzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNyeFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NwaXJpdHMtZXZlbnQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NxbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zcmdzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZ3JhbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3NyZ3MreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZ3J4bWxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zcnUreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3J1XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vc3NkbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNzZGxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi9zc21sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNzbWxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi90YW1wLWFwZXgtdXBkYXRlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3RhbXAtYXBleC11cGRhdGUtY29uZmlybVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi90YW1wLWNvbW11bml0eS11cGRhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdGFtcC1jb21tdW5pdHktdXBkYXRlLWNvbmZpcm1cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdGFtcC1lcnJvclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi90YW1wLXNlcXVlbmNlLWFkanVzdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi90YW1wLXNlcXVlbmNlLWFkanVzdC1jb25maXJtXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3RhbXAtc3RhdHVzLXF1ZXJ5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3RhbXAtc3RhdHVzLXJlc3BvbnNlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3RhbXAtdXBkYXRlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3RhbXAtdXBkYXRlLWNvbmZpcm1cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdGFyXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdGVpK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInRlaVwiLFwidGVpY29ycHVzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdGhyYXVkK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInRmaVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3RpbWVzdGFtcC1xdWVyeVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi90aW1lc3RhbXAtcmVwbHlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdGltZXN0YW1wZWQtZGF0YVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInRzZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3R0bWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3R2ZS10cmlnZ2VyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3VscGZlY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi91cmMtZ3Jwc2hlZXQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3VyYy1yZXNzaGVldCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdXJjLXRhcmdldGRlc2MreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3VyYy11aXNvY2tldGRlc2MreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZjYXJkK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92Y2FyZCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdmVtbWlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdml2aWRlbmNlLnNjcmlwdGZpbGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuM2dwcC1wcm9zZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLjNncHAtcHJvc2UtcGMzY2greG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLmFjY2Vzcy10cmFuc2Zlci1ldmVudHMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLmJzZit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLjNncHAubWlkLWNhbGwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1sYXJnZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBsYlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1zbWFsbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBzYlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy12YXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwdmJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuM2dwcC5zbXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLjNncHAuc3J2Y2MtZXh0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuM2dwcC5zcnZjYy1pbmZvK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuM2dwcC5zdGF0ZS1hbmQtZXZlbnQtaW5mbyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLjNncHAudXNzZCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLjNncHAyLmJjbWNzaW5mbyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLjNncHAyLnNtc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuM2dwcDIudGNhcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInRjYXBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuM20ucG9zdC1pdC1ub3Rlc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInB3blwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hY2NwYWMuc2ltcGx5LmFzb1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFzb1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hY2NwYWMuc2ltcGx5LmltcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImltcFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFjdVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hY3Vjb3JwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYXRjXCIsXCJhY3V0Y1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5haXItYXBwbGljYXRpb24taW5zdGFsbGVyLXBhY2thZ2UremlwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJhaXJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYWRvYmUuZmxhc2gubW92aWVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmFkb2JlLmZvcm1zY2VudHJhbC5mY2R0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZmNkdFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5meHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJmeHBcIixcImZ4cGxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYWRvYmUucGFydGlhbC11cGxvYWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmFkb2JlLnhkcCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4ZHBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYWRvYmUueGZkZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhmZGZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYWV0aGVyLmltcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYWgtYmFyY29kZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYWhlYWQuc3BhY2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJhaGVhZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5haXJ6aXAuZmlsZXNlY3VyZS5hemZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJhemZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYWlyemlwLmZpbGVzZWN1cmUuYXpzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYXpzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmFtYXpvbi5lYm9va1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYXp3XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmFtZXJpY2FuZHluYW1pY3MuYWNjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYWNjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmFtaWdhLmFtaVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFtaVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hbXVuZHNlbi5tYXplK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYW5kcm9pZC5wYWNrYWdlLWFyY2hpdmVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFwa1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hbmtpXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hbnNlci13ZWItY2VydGlmaWNhdGUtaXNzdWUtaW5pdGlhdGlvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNpaVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hbnNlci13ZWItZnVuZHMtdHJhbnNmZXItaW5pdGlhdGlvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZnRpXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmFudGl4LmdhbWUtY29tcG9uZW50XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYXR4XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuYmluYXJ5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0LmNvbXBhY3RcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYXBpK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYXBwbGUuaW5zdGFsbGVyK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1wa2dcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYXBwbGUubXBlZ3VybFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm0zdThcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYXBwbGUucGtwYXNzXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicGtwYXNzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmFyYXN0cmEuc3dpXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hcmlzdGFuZXR3b3Jrcy5zd2lcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzd2lcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYXJ0c3F1YXJlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5hc3RyYWVhLXNvZnR3YXJlLmlvdGFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJpb3RhXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmF1ZGlvZ3JhcGhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJhZXBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYXV0b3BhY2thZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmF2aXN0YXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5iYWxzYW1pcS5ibW1sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYmFsc2FtaXEuYm1wclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYmVraXR6dXItc3RlY2granNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5iaW9wYXgucmRmK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYmx1ZWljZS5tdWx0aXBhc3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtcG1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYmx1ZXRvb3RoLmVwLm9vYlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYmx1ZXRvb3RoLmxlLm9vYlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuYm1pXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYm1pXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmJ1c2luZXNzb2JqZWN0c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJlcFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jYWItanNjcmlwdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY2Fub24tY3BkbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY2Fub24tbGlwc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY2VuZGlvLnRoaW5saW5jLmNsaWVudGNvbmZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmNlbnR1cnktc3lzdGVtcy50Y3Bfc3RyZWFtXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jaGVtZHJhdyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjZHhtbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jaGlwbnV0cy5rYXJhb2tlLW1tZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1tZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jaW5kZXJlbGxhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2R5XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmNpcnBhY2suaXNkbi1leHRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmNpdGF0aW9uc3R5bGVzLnN0eWxlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY2xheW1vcmVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjbGFcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY2xvYW50by5ycDlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJycDlcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY2xvbmsuYzRncm91cFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImM0Z1wiLFwiYzRkXCIsXCJjNGZcIixcImM0cFwiLFwiYzR1XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmNsdWV0cnVzdC5jYXJ0b21vYmlsZS1jb25maWdcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjMTFhbWNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY2x1ZXRydXN0LmNhcnRvbW9iaWxlLWNvbmZpZy1wa2dcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjMTFhbXpcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY29mZmVlc2NyaXB0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jb2xsZWN0aW9uK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY29sbGVjdGlvbi5kb2MranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jb2xsZWN0aW9uLm5leHQranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jb21tZXJjZS1iYXR0ZWxsZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY29tbW9uc3BhY2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjc3BcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY29udGFjdC5jbXNnXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2RiY21zZ1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jb3Ntb2NhbGxlclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNtY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2xreFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLmtleWJvYXJkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2xra1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLnBhbGV0dGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjbGtwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIudGVtcGxhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjbGt0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIud29yZGJhbmtcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjbGt3XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmNyaXRpY2FsdG9vbHMud2JzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndic1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jdGMtcG9zbWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwbWxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY3RjdC53cyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmN1cHMtcGRmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXBvc3RzY3JpcHRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmN1cHMtcHBkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicHBkXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmN1cHMtcmFzdGVyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXJhd1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY3VybFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuY3VybC5jYXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNhclwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jdXJsLnBjdXJsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwY3VybFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5jeWFuLmRlYW4ucm9vdCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmN5YmFua1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZGFydFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZGFydFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kYXRhLXZpc2lvbi5yZHpcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJyZHpcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZGViaWFuLmJpbmFyeS1wYWNrYWdlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kZWNlLmRhdGFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ1dmZcIixcInV2dmZcIixcInV2ZFwiLFwidXZ2ZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kZWNlLnR0bWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widXZ0XCIsXCJ1dnZ0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmRlY2UudW5zcGVjaWZpZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ1dnhcIixcInV2dnhcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZGVjZS56aXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ1dnpcIixcInV2dnpcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZGVub3ZvLmZjc2VsYXlvdXQtbGlua1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZlX2xhdW5jaFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kZXNtdW1lLW1vdmllXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kaXItYmkucGxhdGUtZGwtbm9zdWZmaXhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmRtLmRlbGVnYXRpb24reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kbmFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkbmFcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZG9jdW1lbnQranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tbHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1scFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tb2JpbGUuMVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZG9sYnkubW9iaWxlLjJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmRvcmVtaXIuc2NvcmVjbG91ZC1iaW5hcnktZG9jdW1lbnRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmRwZ3JhcGhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkcGdcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHJlYW1mYWN0b3J5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZGZhY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kcml2ZStqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmRzLWtleXBvaW50XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJrcHh4XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmR0Zy5sb2NhbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHRnLmxvY2FsLmZsYXNoXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kdGcubG9jYWwuaHRtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLmFpdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFpdFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kdmIuZHZialwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLmVzZ2NvbnRhaW5lclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLmlwZGNkZnRub3RpZmFjY2Vzc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLmlwZGNlc2dhY2Nlc3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmR2Yi5pcGRjZXNnYWNjZXNzMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLmlwZGNlc2dwZGRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmR2Yi5pcGRjcm9hbWluZ1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLmlwdHYuYWxmZWMtYmFzZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLmlwdHYuYWxmZWMtZW5oYW5jZW1lbnRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1hZ2dyZWdhdGUtcm9vdCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1jb250YWluZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtZ2VuZXJpYyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1pYS1tc2dsaXN0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLm5vdGlmLWlhLXJlZ2lzdHJhdGlvbi1yZXF1ZXN0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLm5vdGlmLWlhLXJlZ2lzdHJhdGlvbi1yZXNwb25zZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1pbml0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLnBmclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHZiLnNlcnZpY2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzdmNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZHhyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5keW5hZ2VvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZ2VvXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmR6clwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZWFzeWthcmFva2UuY2RnZG93bmxvYWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmVjZGlzLXVwZGF0ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmNoYXJ0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWFnXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmVjb3dpbi5maWxlcmVxdWVzdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmZpbGV1cGRhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmVjb3dpbi5zZXJpZXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmVjb3dpbi5zZXJpZXNyZXF1ZXN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uc2VyaWVzdXBkYXRlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5lbWNsaWVudC5hY2Nlc3NyZXF1ZXN0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZW5saXZlblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm5tbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5lbnBoYXNlLmVudm95XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5lcHJpbnRzLmRhdGEreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5lc2ZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJlc2ZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZXBzb24ubXNmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibXNmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmVwc29uLnF1aWNrYW5pbWVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJxYW1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZXBzb24uc2FsdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNsdFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5zc2ZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzc2ZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZXJpY3Nzb24ucXVpY2tjYWxsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5lc3ppZ25vMyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJlczNcIixcImV0M1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmFvYyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmV0c2kuYXNpYy1lK3ppcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZXRzaS5hc2ljLXMremlwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmN1Zyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dmNvbW1hbmQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZkaXNjb3ZlcnkreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZwcm9maWxlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2c2FkLWJjK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2c2FkLWNvZCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnNhZC1ucHZyK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2c2VydmljZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnN5bmMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZ1ZXByb2ZpbGUreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLm1jaWQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLm1oZWc1XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLm92ZXJsb2FkLWNvbnRyb2wtcG9saWN5LWRhdGFzZXQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLnBzdG4reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLnNjaSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmV0c2kuc2ltc2VydnMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLnRpbWVzdGFtcC10b2tlblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZXRzaS50c2wreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLnRzbC5kZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmV1ZG9yYS5kYXRhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5lenBpeC1hbGJ1bVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImV6MlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5lenBpeC1wYWNrYWdlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZXozXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmYtc2VjdXJlLm1vYmlsZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZmFzdGNvcHktZGlzay1pbWFnZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZmRmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZmRmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmZkc24ubXNlZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtc2VlZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5mZHNuLnNlZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzZWVkXCIsXCJkYXRhbGVzc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5mZnNuc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZmlsbWl0LnpmY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZmludHNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmZpcmVtb25rZXlzLmNsb3VkY2VsbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZmxvZ3JhcGhpdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdwaFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5mbHV4dGltZS5jbGlwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZnRjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmZvbnQtZm9udGZvcmdlLXNmZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZnJhbWVtYWtlclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZtXCIsXCJmcmFtZVwiLFwibWFrZXJcIixcImJvb2tcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZnJvZ2Fucy5mbmNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJmbmNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZnJvZ2Fucy5sdGZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJsdGZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZnNjLndlYmxhdW5jaFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZzY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib2FzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib2EyXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib2EzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXNncFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZnNVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzcHJzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYmgyXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5hcnQtZXhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5hcnQ0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZGRkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZGRkXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4ZHdcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3Jrcy5iaW5kZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4YmRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3Jrcy5jb250YWluZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5oYnBsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5mdXQtbWlzbmV0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5mdXp6eXNoZWV0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZnpzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdlbm9tYXRpeC50dXhlZG9cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ0eGRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ2VvK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ2VvY3ViZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLmZpbGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJnZ2JcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ2VvZ2VicmEudG9vbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdndFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5nZW9tZXRyeS1leHBsb3JlclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdleFwiLFwiZ3JlXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdlb25leHRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJneHRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ2VvcGxhblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImcyd1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5nZW9zcGFjZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImczd1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5nZXJiZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdsb2JhbHBsYXRmb3JtLmNhcmQtY29udGVudC1tZ3RcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdsb2JhbHBsYXRmb3JtLmNhcmQtY29udGVudC1tZ3QtcmVzcG9uc2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdteFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdteFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtYXBwcy5kb2N1bWVudFwiOiB7XG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdkb2NcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWFwcHMucHJlc2VudGF0aW9uXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZ3NsaWRlc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtYXBwcy5zcHJlYWRzaGVldFwiOiB7XG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdzaGVldFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtZWFydGgua21sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wia21sXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbXpcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJrbXpcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ292LnNrLmUtZm9ybSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdvdi5zay5lLWZvcm0remlwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5nb3Yuc2sueG1sZGF0YWNvbnRhaW5lcit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdyYWZlcVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdxZlwiLFwiZ3FzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdyaWRtcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWFjY291bnRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJnYWNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWhlbHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJnaGZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWlkZW50aXR5LW1lc3NhZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJnaW1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWluamVjdG9yXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZ3J2XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmdyb292ZS10b29sLW1lc3NhZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJndG1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXRvb2wtdGVtcGxhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ0cGxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXZjYXJkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widmNnXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmhhbCtqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmhhbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJoYWxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaGFuZGhlbGQtZW50ZXJ0YWlubWVudCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ6bW1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaGJjaVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImhiY2lcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaGNsLWJpcmVwb3J0c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaGR0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5oZXJva3UranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5oaGUubGVzc29uLXBsYXllclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImxlc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ocC1ocGdsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaHBnbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ocC1ocGlkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaHBpZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ocC1ocHNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJocHNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaHAtamx5dFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImpsdFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ocC1wY2xcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwY2xcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaHAtcGNseGxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwY2x4bFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5odHRwaG9uZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaHlkcm9zdGF0aXguc29mLWRhdGFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzZmQtaGRzdHhcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaHlwZXJkcml2ZStqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmh6bi0zZC1jcm9zc3dvcmRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmlibS5hZnBsaW5lZGF0YVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaWJtLmVsZWN0cm9uaWMtbWVkaWFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmlibS5taW5pcGF5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibXB5XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmlibS5tb2RjYXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJhZnBcIixcImxpc3RhZnBcIixcImxpc3QzODIwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmlibS5yaWdodHMtbWFuYWdlbWVudFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImlybVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pYm0uc2VjdXJlLWNvbnRhaW5lclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmljY3Byb2ZpbGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJpY2NcIixcImljbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pZWVlLjE5MDVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmlnbG9hZGVyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaWdsXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmltbWVydmlzaW9uLWl2cFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIml2cFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pbW1lcnZpc2lvbi1pdnVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJpdnVcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaW1zLmltc2NjdjFwMVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaW1zLmltc2NjdjFwMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaW1zLmltc2NjdjFwM1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaW1zLmxpcy52Mi5yZXN1bHQranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pbXMubHRpLnYyLnRvb2xjb25zdW1lcnByb2ZpbGUranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pbXMubHRpLnYyLnRvb2xwcm94eStqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmltcy5sdGkudjIudG9vbHByb3h5LmlkK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaW1zLmx0aS52Mi50b29sc2V0dGluZ3MranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pbXMubHRpLnYyLnRvb2xzZXR0aW5ncy5zaW1wbGUranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pbmZvcm1lZGNvbnRyb2wucm1zK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaW5mb3JtaXgtdmlzaW9uYXJ5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pbmZvdGVjaC5wcm9qZWN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pbmZvdGVjaC5wcm9qZWN0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaW5ub3BhdGgud2FtcC5ub3RpZmljYXRpb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmluc29ycy5pZ21cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJpZ21cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaW50ZXJjb24uZm9ybW5ldFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhwd1wiLFwieHB4XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmludGVyZ2VvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaTJnXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmludGVydHJ1c3QuZGlnaWJveFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaW50ZXJ0cnVzdC5ubmNwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pbnR1LnFib1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInFib1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pbnR1LnFmeFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInFmeFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLmNhdGFsb2dpdGVtK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaXB0Yy5nMi5jb25jZXB0aXRlbSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmlwdGMuZzIua25vd2xlZGdlaXRlbSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmlwdGMuZzIubmV3c2l0ZW0reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLm5ld3NtZXNzYWdlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaXB0Yy5nMi5wYWNrYWdlaXRlbSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmlwdGMuZzIucGxhbm5pbmdpdGVtK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuaXB1bnBsdWdnZWQucmNwcm9maWxlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicmNwcm9maWxlXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmlyZXBvc2l0b3J5LnBhY2thZ2UreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaXJwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmlzLXhwclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhwclwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5pc2FjLmZjc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZjc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5qYW1cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJqYW1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtZGlyZWN0b3J5LXNlcnZpY2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWpwbnN0b3JlLXdha2V1cFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtcGF5bWVudC13YWtldXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXJlZ2lzdHJhdGlvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtcmVnaXN0cmF0aW9uLXdha2V1cFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtc2V0c3RvcmUtd2FrZXVwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC12ZXJpZmljYXRpb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXZlcmlmaWNhdGlvbi13YWtldXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmpjcC5qYXZhbWUubWlkbGV0LXJtc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJtc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5qaXNwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiamlzcFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5qb29zdC5qb2RhLWFyY2hpdmVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJqb2RhXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmpzay5pc2RuLW5nblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQua2Fob290elwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImt0elwiLFwia3RyXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmtkZS5rYXJib25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJrYXJib25cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQua2RlLmtjaGFydFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNocnRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQua2RlLmtmb3JtdWxhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wia2ZvXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmtkZS5raXZpb1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZsd1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5rZGUua29udG91clwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImtvblwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5rZGUua3ByZXNlbnRlclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImtwclwiLFwia3B0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmtkZS5rc3ByZWFkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wia3NwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmtkZS5rd29yZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImt3ZFwiLFwia3d0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmtlbmFtZWFhcHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJodGtlXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmtpZHNwaXJhdGlvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImtpYVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5raW5hclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImtuZVwiLFwia25wXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmtvYW5cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJza3BcIixcInNrZFwiLFwic2t0XCIsXCJza21cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQua29kYWstZGVzY3JpcHRvclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNzZVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5sYXMubGFzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImxhc3htbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5saWJlcnR5LXJlcXVlc3QreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5sbGFtYWdyYXBoaWNzLmxpZmUtYmFsYW5jZS5kZXNrdG9wXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibGJkXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmxsYW1hZ3JhcGhpY3MubGlmZS1iYWxhbmNlLmV4Y2hhbmdlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImxiZVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy0xLTItM1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIjEyM1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1hcHByb2FjaFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFwclwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1mcmVlbGFuY2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwcmVcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubG90dXMtbm90ZXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJuc2ZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubG90dXMtb3JnYW5pemVyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib3JnXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLmxvdHVzLXNjcmVlbmNhbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNjbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy13b3JkcHJvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibHdwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1hY3BvcnRzLnBvcnRwa2dcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwb3J0cGtnXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1hcGJveC12ZWN0b3ItdGlsZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubWFybGluLmRybS5hY3Rpb250b2tlbit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1hcmxpbi5kcm0uY29uZnRva2VuK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubWFybGluLmRybS5saWNlbnNlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubWFybGluLmRybS5tZGNmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tYXNvbitqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1heG1pbmQubWF4bWluZC1kYlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubWNkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWNkXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1lZGNhbGNkYXRhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWMxXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1lZGlhc3RhdGlvbi5jZGtleVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNka2V5XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1lcmlkaWFuLXNsaW5nc2hvdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubWZlclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm13ZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tZm1wXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWZtXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1pY3JvK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubWljcm9ncmFmeC5mbG9cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJmbG9cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubWljcm9ncmFmeC5pZ3hcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJpZ3hcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubWljcm9zb2Z0LnBvcnRhYmxlLWV4ZWN1dGFibGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1pZWxlK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubWlmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWlmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1pbmlzb2Z0LWhwMzAwMC1zYXZlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5taXRzdWJpc2hpLm1pc3R5LWd1YXJkLnRydXN0d2ViXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMuZGFmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZGFmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5kaXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkaXNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1ia1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1ia1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubXF5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibXF5XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5tc2xcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtc2xcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubW9iaXVzLnBsY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBsY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMudHhmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widHhmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1vcGh1bi5hcHBsaWNhdGlvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1wblwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tb3BodW4uY2VydGlmaWNhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtcGNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUuYWRzaVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmZpc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmdvdGFwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUua21yXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUudHRjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUud2VtXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5pcHJtXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tb3ppbGxhLnh1bCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInh1bFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy0zbWZkb2N1bWVudFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtYXJ0Z2FscnlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjaWxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtYXNmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1jYWItY29tcHJlc3NlZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNhYlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1jb2xvci5pY2Nwcm9maWxlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieGxzXCIsXCJ4bG1cIixcInhsYVwiLFwieGxjXCIsXCJ4bHRcIixcInhsd1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5hZGRpbi5tYWNyb2VuYWJsZWQuMTJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4bGFtXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0LmJpbmFyeS5tYWNyb2VuYWJsZWQuMTJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4bHNiXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvZW5hYmxlZC4xMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhsc21cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieGx0bVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJlb3RcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtaHRtbGhlbHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjaG1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtaW1zXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaW1zXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLWxybVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImxybVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2UuYWN0aXZleCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZXRoZW1lXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widGhteFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1vcGVudHlwZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLXBhY2thZ2Uub2JmdXNjYXRlZC1vcGVudHlwZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc2VjY2F0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjYXRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnN0bFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3RsXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLXBsYXlyZWFkeS5pbml0aWF0b3IreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicHB0XCIsXCJwcHNcIixcInBvdFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LmFkZGluLm1hY3JvZW5hYmxlZC4xMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBwYW1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5wcmVzZW50YXRpb24ubWFjcm9lbmFibGVkLjEyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicHB0bVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlLm1hY3JvZW5hYmxlZC4xMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNsZG1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5zbGlkZXNob3cubWFjcm9lbmFibGVkLjEyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicHBzbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBvdG1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtcHJpbnRkZXZpY2VjYXBhYmlsaXRpZXMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1wcmludGluZy5wcmludHRpY2tldCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtcHJpbnRzY2hlbWF0aWNrZXQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1wcm9qZWN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibXBwXCIsXCJtcHRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtdG5lZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtd2luZG93cy5kZXZpY2VwYWlyaW5nXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy13aW5kb3dzLm53cHJpbnRpbmcub29iXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy13aW5kb3dzLnByaW50ZXJwYWlyaW5nXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy13aW5kb3dzLndzZC5vb2JcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLXdtZHJtLmxpYy1jaGxnLXJlcVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubGljLXJlc3BcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLXdtZHJtLm1ldGVyLWNobGctcmVxXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy13bWRybS5tZXRlci1yZXNwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy13b3JkLmRvY3VtZW50Lm1hY3JvZW5hYmxlZC4xMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImRvY21cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXMtd29yZC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkb3RtXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLXdvcmtzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid3BzXCIsXCJ3a3NcIixcIndjbVwiLFwid2RiXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm1zLXdwbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndwbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tcy14cHNkb2N1bWVudFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhwc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5tc2EtZGlzay1pbWFnZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXNlcVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1zZXFcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXNpZ25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm11bHRpYWQuY3JlYXRvclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXVsdGlhZC5jcmVhdG9yLmNpZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXVzaWMtbmlmZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXVzaWNpYW5cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtdXNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubXV2ZWUuc3R5bGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtc3R5XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm15bmZjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widGFnbGV0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5jZC5jb250cm9sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5uY2QucmVmZXJlbmNlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5uZXJ2YW5hXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5uZXRmcHhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5ldXJvbGFuZ3VhZ2Uubmx1XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibmx1XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5pbnRlbmRvLm5pdHJvLnJvbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubmludGVuZG8uc25lcy5yb21cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5pdGZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJudGZcIixcIm5pdGZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtZGlyZWN0b3J5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibm5kXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXNlYWxlclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm5uc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC13ZWJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJubndcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubm9raWEuY2F0YWxvZ3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5va2lhLmNvbm1sK3dieG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5jb25tbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5va2lhLmlwdHYuY29uZmlnK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubm9raWEuaXNkcy1yYWRpby1wcmVzZXRzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5sYW5kbWFyayt3YnhtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubm9raWEubGFuZG1hcmsreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5sYW5kbWFya2NvbGxlY3Rpb24reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uLWdhZ2UuYWMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uLWdhZ2UuZGF0YVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm5nZGF0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5zeW1iaWFuLmluc3RhbGxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJuLWdhZ2VcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubm9raWEubmNkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5wY2Qrd2J4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5va2lhLnBjZCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5va2lhLnJhZGlvLXByZXNldFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJwc3RcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubm9raWEucmFkaW8tcHJlc2V0c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJwc3NcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZWRtXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZWRtXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLmVkeFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImVkeFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5leHRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJleHRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQubnR0LWxvY2FsLmNvbnRlbnQtc2hhcmVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm50dC1sb2NhbC5maWxlLXRyYW5zZmVyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5udHQtbG9jYWwub2d3X3JlbW90ZS1hY2Nlc3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm50dC1sb2NhbC5zaXAtdGFfcmVtb3RlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5udHQtbG9jYWwuc2lwLXRhX3RjcF9zdHJlYW1cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm9kY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQtdGVtcGxhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJvdGNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib2RiXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib2RmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhLXRlbXBsYXRlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib2RmdFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJvZGdcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib3RnXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm9kaVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UtdGVtcGxhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJvdGlcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm9kcFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib3RwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm9kc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQtdGVtcGxhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJvdHNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJvZHRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtbWFzdGVyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib2RtXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib3R0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm90aFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vYm5cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9mdG4ubDEwbitqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9pcGYuY29udGVudGFjY2Vzc2Rvd25sb2FkK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub2lwZi5jb250ZW50YWNjZXNzc3RyZWFtaW5nK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub2lwZi5jc3BnLWhleGJpbmFyeVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub2lwZi5kYWUuc3ZnK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub2lwZi5kYWUueGh0bWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vaXBmLm1pcHB2Y29udHJvbG1lc3NhZ2UreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vaXBmLnBhZS5nZW1cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9pcGYuc3BkaXNjb3ZlcnkreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vaXBmLnNwZGxpc3QreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vaXBmLnVlcHJvZmlsZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9pcGYudXNlcnByb2ZpbGUreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbHBjLXN1Z2FyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieG9cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub21hLXNjd3MtY29uZmlnXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEtc2N3cy1odHRwLXJlcXVlc3RcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS1zY3dzLWh0dHAtcmVzcG9uc2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5hc3NvY2lhdGVkLXByb2NlZHVyZS1wYXJhbWV0ZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QuZHJtLXRyaWdnZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QuaW1kK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0Lmx0a21cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5ub3RpZmljYXRpb24reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QucHJvdmlzaW9uaW5ndHJpZ2dlclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNnYm9vdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNnZGQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc2dkdVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNpbXBsZS1zeW1ib2wtY29udGFpbmVyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc21hcnRjYXJkLXRyaWdnZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc3Byb3YreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc3RrbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub21hLmNhYi1hZGRyZXNzLWJvb2sreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuY2FiLWZlYXR1cmUtaGFuZGxlcit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS5jYWItcGNjK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub21hLmNhYi1zdWJzLWludml0ZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS5jYWItdXNlci1wcmVmcyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS5kY2RcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS5kY2RjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGQyK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImRkMlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpc2QreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuZ3JvdXAtdXNhZ2UtbGlzdCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS5wYWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEucG9jLmRldGFpbGVkLXByb2dyZXNzLXJlcG9ydCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS5wb2MuZmluYWwtcmVwb3J0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5ncm91cHMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEucG9jLmludm9jYXRpb24tZGVzY3JpcHRvcit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS5wb2Mub3B0aW1pemVkLXByb2dyZXNzLXJlcG9ydCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYS5wdXNoXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEuc2NpZG0ubWVzc2FnZXMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWEueGNhcC1kaXJlY3RvcnkreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1lbWFpbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9tYWRzLWZpbGUreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWFkcy1mb2xkZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vbWFsb2Mtc3VwbC1pbml0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVuYmxveC5nYW1lK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbmJsb3guZ2FtZS1iaW5hcnlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW5leWUub2ViXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVub2ZmaWNlb3JnLmV4dGVuc2lvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib3h0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmN1c3RvbS1wcm9wZXJ0aWVzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuY3VzdG9teG1scHJvcGVydGllcyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmcreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuY2hhcnQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuY2hhcnRzaGFwZXMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuZGlhZ3JhbWNvbG9ycyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5kaWFncmFtZGF0YSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5kaWFncmFtbGF5b3V0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmRpYWdyYW1zdHlsZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmV4dGVuZGVkLXByb3BlcnRpZXMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC10ZW1wbGF0ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuY29tbWVudGF1dGhvcnMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5jb21tZW50cyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLmhhbmRvdXRtYXN0ZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5ub3Rlc21hc3Rlcit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLm5vdGVzc2xpZGUreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwcHR4XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbi5tYWluK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc3Byb3BzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzbGR4XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVsYXlvdXQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZW1hc3Rlcit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvd1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBwc3hcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93Lm1haW4reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXVwZGF0ZWluZm8reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50YWJsZXN0eWxlcyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRhZ3MreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicG90eFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZS5tYWluK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwudmlld3Byb3BzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC10ZW1wbGF0ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jYWxjY2hhaW4reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNoYXJ0c2hlZXQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNvbW1lbnRzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jb25uZWN0aW9ucyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuZGlhbG9nc2hlZXQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmV4dGVybmFsbGluayt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwucGl2b3RjYWNoZWRlZmluaXRpb24reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnBpdm90Y2FjaGVyZWNvcmRzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5waXZvdHRhYmxlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5xdWVyeXRhYmxlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5yZXZpc2lvbmhlYWRlcnMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnJldmlzaW9ubG9nK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGFyZWRzdHJpbmdzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhsc3hcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldC5tYWluK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldG1ldGFkYXRhK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zdHlsZXMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRhYmxlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50YWJsZXNpbmdsZWNlbGxzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieGx0eFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlLm1haW4reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnVzZXJuYW1lcyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudm9sYXRpbGVkZXBlbmRlbmNpZXMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLndvcmtzaGVldCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnRoZW1lK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQudGhlbWVvdmVycmlkZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnZtbGRyYXdpbmdcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwtdGVtcGxhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuY29tbWVudHMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZG9jeFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50Lmdsb3NzYXJ5K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudC5tYWluK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5lbmRub3Rlcyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZm9udHRhYmxlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5mb290ZXIreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmZvb3Rub3Rlcyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwubnVtYmVyaW5nK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5zZXR0aW5ncyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuc3R5bGVzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZG90eFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlLm1haW4reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLndlYnNldHRpbmdzK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5jb3JlLXByb3BlcnRpZXMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLmRpZ2l0YWwtc2lnbmF0dXJlLXhtbHNpZ25hdHVyZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UucmVsYXRpb25zaGlwcyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9yYWNsZS5yZXNvdXJjZStqc29uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9yYW5nZS5pbmRhdGFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9zYS5uZXRkZXBsb3lcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9zZ2VvLm1hcGd1aWRlLnBhY2thZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtZ3BcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQub3NnaS5idW5kbGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm9zZ2kuZHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkcFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vc2dpLnN1YnN5c3RlbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImVzYVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5vdHBzLmN0LWtpcCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLm94bGkuY291bnRncmFwaFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucGFnZXJkdXR5K2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucGFsbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBkYlwiLFwicHFhXCIsXCJvcHJjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnBhbm9wbHlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnBhb3MreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5wYW9zLnhtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5wYXdhYWZpbGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwYXdcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucGNvc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucGcuZm9ybWF0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3RyXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnBnLm9zYXNsaVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImVpNlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5waWFjY2Vzcy5hcHBsaWNhdGlvbi1saWNlbmNlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5waWNzZWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJlZmlmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnBtaS53aWRnZXRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3Z1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5wb2MuZ3JvdXAtYWR2ZXJ0aXNlbWVudCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnBvY2tldGxlYXJuXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicGxmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwYmRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNi1zXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3LXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjc1XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3NS1zXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5wcmVtaW5ldFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucHJldmlld3N5c3RlbXMuYm94XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYm94XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnByb3RldXMubWFnYXppbmVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtZ3pcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucHVibGlzaGFyZS1kZWx0YS10cmVlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicXBzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnB2aS5wdGlkMVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInB0aWRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucHdnLW11bHRpcGxleGVkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5wd2cteGh0bWwtcHJpbnQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5xdWFsY29tbS5icmV3LWFwcC1yZXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnF1YXJrLnF1YXJreHByZXNzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicXhkXCIsXCJxeHRcIixcInF3ZFwiLFwicXd0XCIsXCJxeGxcIixcInF4YlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5xdW9iamVjdC1xdW94ZG9jdW1lbnRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubW9tbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1hdWRpdCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1hdWRpdC1jb25mK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucmFkaXN5cy5tc21sLWF1ZGl0LWNvbm4reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5yYWRpc3lzLm1zbWwtYXVkaXQtZGlhbG9nK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucmFkaXN5cy5tc21sLWF1ZGl0LXN0cmVhbSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1jb25mK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucmFkaXN5cy5tc21sLWRpYWxvZyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1kaWFsb2ctYmFzZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1kaWFsb2ctZmF4LWRldGVjdCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1kaWFsb2ctZmF4LXNlbmRyZWN2K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucmFkaXN5cy5tc21sLWRpYWxvZy1ncm91cCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1kaWFsb2ctc3BlZWNoK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucmFkaXN5cy5tc21sLWRpYWxvZy10cmFuc2Zvcm0reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5yYWluc3Rvci5kYXRhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5yYXBpZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucmVhbHZuYy5iZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJiZWRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucmVjb3JkYXJlLm11c2ljeG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibXhsXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJlY29yZGFyZS5tdXNpY3htbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtdXNpY3htbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5yZW5sZWFybi5ybHByaW50XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5yaWcuY3J5cHRvbm90ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNyeXB0b25vdGVcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucmltLmNvZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY29kXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnJuLXJlYWxtZWRpYVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicm1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucm4tcmVhbG1lZGlhLXZiclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicm12YlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5yb3V0ZTY2Lmxpbms2Nit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJsaW5rNjZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucnMtMjc0eFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQucnVja3VzLmRvd25sb2FkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zM3Ntc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2FpbGluZ3RyYWNrZXIudHJhY2tcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzdFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zYm0uY2lkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zYm0ubWlkMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2NyaWJ1c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLjNkZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLmNzZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLmRvY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLmVtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLm1odFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLm5ldFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnBwdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnRpZmZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnNlYWxlZC54bHNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLmh0bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLnBkZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2VlbWFpbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNlZVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zZW1hXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2VtYVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zZW1kXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2VtZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zZW1mXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2VtZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtZGF0YVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImlmbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtdGVtcGxhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJpdHBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuaW50ZXJjaGFuZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJpaWZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQucGFja2FnZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImlwa1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zaW10ZWNoLW1pbmRtYXBwZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ0d2RcIixcInR3ZHNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc2lyZW4ranNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zbWFmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibW1mXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnNtYXJ0Lm5vdGVib29rXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zbWFydC50ZWFjaGVyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widGVhY2hlclwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zb2Z0d2FyZTYwMi5maWxsZXIuZm9ybSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnNvZnR3YXJlNjAyLmZpbGxlci5mb3JtLXhtbC16aXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnNvbGVudC5zZGttK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNka21cIixcInNka2RcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc3BvdGZpcmUuZHhwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZHhwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnNwb3RmaXJlLnNmc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNmc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zc3MtY29kXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zc3MtZHRmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zc3MtbnRmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uY2FsY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2RjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5kcmF3XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzZGFcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmltcHJlc3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNkZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ubWF0aFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic21mXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNkd1wiLFwidm9yXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzZ2xcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc3RlcG1hbmlhLnBhY2thZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzbXppcFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdGVwbWFuaWEuc3RlcGNoYXJ0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic21cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc3RyZWV0LXN0cmVhbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc3VuLndhZGwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN4Y1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMudGVtcGxhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN0Y1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXdcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN4ZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXcudGVtcGxhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN0ZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN4aVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MudGVtcGxhdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN0aVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLm1hdGhcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN4bVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3h3XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLmdsb2JhbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3hnXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLnRlbXBsYXRlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzdHdcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc3VzLWNhbGVuZGFyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3VzXCIsXCJzdXNwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnN2ZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN2ZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zd2lmdHZpZXctaWNzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zeW1iaWFuLmluc3RhbGxcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNpc1wiLFwic2lzeFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieHNtXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt3YnhtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImJkbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieGRtXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbS5ub3RpZmljYXRpb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbWRkZit3YnhtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtZGRmK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtdG5kcyt3YnhtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtdG5kcyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kcy5ub3RpZmljYXRpb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnRhby5pbnRlbnQtbW9kdWxlLWFyY2hpdmVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ0YW9cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudGNwZHVtcC5wY2FwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicGNhcFwiLFwiY2FwXCIsXCJkbXBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudG1kLm1lZGlhZmxleC5hcGkreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC50bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnRtb2JpbGUtbGl2ZXR2XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widG1vXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnRyaWQudHB0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widHB0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnRyaXNjYXBlLm14c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm14c1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC50cnVlYXBwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widHJhXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnRydWVkb2NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnViaXNvZnQud2VicGxheWVyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC51ZmRsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widWZkXCIsXCJ1ZmRsXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnVpcS50aGVtZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInV0elwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC51bWFqaW5cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ1bWpcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudW5pdHlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ1bml0eXdlYlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC51b21sK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInVvbWxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5hbGVydFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5hbGVydC13YnhtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5iZWFyZXItY2hvaWNlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmJlYXJlci1jaG9pY2Utd2J4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2FjaGVvcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jYWNoZW9wLXdieG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNoYW5uZWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2hhbm5lbC13YnhtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3Qtd2J4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQubGlzdGNtZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0Y21kLXdieG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LnNpZ25hbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudXJpLW1hcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudmFsdmUuc291cmNlLm1hdGVyaWFsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC52Y3hcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ2Y3hcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudmQtc3R1ZHlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnZlY3RvcndvcmtzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC52ZXJpbWF0cml4LnZjYXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnZpZHNvZnQudmlkY29uZmVyZW5jZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudmlzaW9cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ2c2RcIixcInZzdFwiLFwidnNzXCIsXCJ2c3dcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQudmlzaW9uYXJ5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widmlzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnZpdmlkZW5jZS5zY3JpcHRmaWxlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC52c2ZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ2c2ZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud2FwLnNpY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud2FwLnNsY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud2FwLndieG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid2J4bWxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud2FwLndtbGNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3bWxjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLndhcC53bWxzY3JpcHRjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid21sc2NcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud2VidHVyYm9cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3dGJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud2ZhLnAycFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud2ZhLndzY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud2luZG93cy5kZXZpY2VwYWlyaW5nXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC53bWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLndtZi5ib290c3RyYXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLndvbGZyYW0ubWF0aGVtYXRpY2FcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLndvbGZyYW0ubWF0aGVtYXRpY2EucGFja2FnZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud29sZnJhbS5wbGF5ZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJuYnBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud29yZHBlcmZlY3RcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3cGRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQud3FkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid3FkXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLndycS1ocDMwMDAtbGFiZWxsZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnd0LnN0ZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN0ZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC53di5jc3Ard2J4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnd2LmNzcCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnd2LnNzcCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnhhY21sK2pzb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQueGFyYVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhhclwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC54ZmRsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieGZkbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC54ZmRsLndlYmZvcm1cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnhtaSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnhtcGllLmNwa2dcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnhtcGllLmRwa2dcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnhtcGllLnBsYW5cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnhtcGllLnBwa2dcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnhtcGllLnhsaW1cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1kaWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJodmRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLmh2LXNjcmlwdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImh2c1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtdm9pY2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJodnBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm9zZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZuZC55YW1haGEub3BlbnNjb3JlZm9ybWF0Lm9zZnB2Zyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJvc2ZwdmdcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnJlbW90ZS1zZXR1cFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtYXVkaW9cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzYWZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtcGhyYXNlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3BmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnlhbWFoYS50aHJvdWdoLW5nblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnR1bm5lbC11ZHBlbmNhcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQueWFvd2VtZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQueWVsbG93cml2ZXItY3VzdG9tLW1lbnVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjbXBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi92bmQuenVsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiemlyXCIsXCJ6aXJ6XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm5kLnp6YXp6LmRlY2sreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiemF6XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vdm9pY2V4bWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widnhtbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3ZxLXJ0Y3B4clwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi93YXRjaGVyaW5mbyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vd2hvaXNwcC1xdWVyeVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi93aG9pc3BwLXJlc3BvbnNlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3dpZGdldFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndndFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3dpbmhscFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaGxwXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24vd2l0YVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi93b3JkcGVyZmVjdDUuMVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi93c2RsK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndzZGxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi93c3BvbGljeSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3c3BvbGljeVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtN3otY29tcHJlc3NlZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiN3pcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWFiaXdvcmRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFid1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtYWNlLWNvbXByZXNzZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFjZVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtYW1mXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1hcHBsZS1kaXNraW1hZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImRtZ1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1iaW5cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFhYlwiLFwieDMyXCIsXCJ1MzJcIixcInZveFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1tYXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFhbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1zZWdcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFhc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtYmNwaW9cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImJjcGlvXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1iZG9jXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYmRvY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtYml0dG9ycmVudFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widG9ycmVudFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtYmxvcmJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImJsYlwiLFwiYmxvcmJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWJ6aXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImJ6XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1iemlwMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYnoyXCIsXCJib3pcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWNiclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2JyXCIsXCJjYmFcIixcImNidFwiLFwiY2J6XCIsXCJjYjdcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWNkbGlua1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widmNkXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1jZnMtY29tcHJlc3NlZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2ZzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1jaGF0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjaGF0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1jaGVzcy1wZ25cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBnblwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtY2hyb21lLWV4dGVuc2lvblwiOiB7XG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNyeFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtY29jb2FcIjoge1xuICAgIFwic291cmNlXCI6IFwibmdpbnhcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY2NvXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1jb21wcmVzc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtY29uZmVyZW5jZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibnNjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1jcGlvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjcGlvXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1jc2hcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNzaFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZGViXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImRlYlwiLFwidWRlYlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZGdjLWNvbXByZXNzZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImRnY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZGlyZWN0b3JcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImRpclwiLFwiZGNyXCIsXCJkeHJcIixcImNzdFwiLFwiY2N0XCIsXCJjeHRcIixcInczZFwiLFwiZmdkXCIsXCJzd2FcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWRvb21cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndhZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZHRibmN4K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibmN4XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1kdGJvb2sreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkdGJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWR0YnJlc291cmNlK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicmVzXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1kdmlcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImR2aVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZW52b3lcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImV2eVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZXZhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJldmFcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWZvbnQtYmRmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJiZGZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWZvbnQtZG9zXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1mb250LWZyYW1lbWFrZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWZvbnQtZ2hvc3RzY3JpcHRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdzZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZm9udC1saWJncnhcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWZvbnQtbGludXgtcHNmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwc2ZcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWZvbnQtb3RmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm90ZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZm9udC1wY2ZcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBjZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZm9udC1zbmZcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNuZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZm9udC1zcGVlZG9cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWZvbnQtc3Vub3MtbmV3c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZm9udC10dGZcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1widHRmXCIsXCJ0dGNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWZvbnQtdHlwZTFcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBmYVwiLFwicGZiXCIsXCJwZm1cIixcImFmbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZm9udC12Zm9udFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZnJlZWFyY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYXJjXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2hcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNwbFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZ2NhLWNvbXByZXNzZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdjYVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZ2x1bHhcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInVseFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtZ251bWVyaWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdudW1lcmljXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1ncmFtcHMteG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJncmFtcHNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWd0YXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImd0YXJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWd6aXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWhkZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaGRmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1odHRwZC1waHBcIjoge1xuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBocFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtaW5zdGFsbC1pbnN0cnVjdGlvbnNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImluc3RhbGxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWlzbzk2NjAtaW1hZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImlzb1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtamF2YS1hcmNoaXZlLWRpZmZcIjoge1xuICAgIFwic291cmNlXCI6IFwibmdpbnhcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiamFyZGlmZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtamF2YS1qbmxwLWZpbGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImpubHBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIjoge1xuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LWxhdGV4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJsYXRleFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbHVhLWJ5dGVjb2RlXCI6IHtcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibHVhY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbHpoLWNvbXByZXNzZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImx6aFwiLFwibGhhXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1tYWtlc2VsZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJuZ2lueFwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJydW5cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LW1pZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWllXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1tb2JpcG9ja2V0LWVib29rXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwcmNcIixcIm1vYmlcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LW1wZWd1cmxcIjoge1xuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1tcy1hcHBsaWNhdGlvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYXBwbGljYXRpb25cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LW1zLXNob3J0Y3V0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJsbmtcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LW1zLXdtZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid21kXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1tcy13bXpcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndtelwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbXMteGJhcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieGJhcFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbXNhY2Nlc3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1kYlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbXNiaW5kZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm9iZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbXNjYXJkZmlsZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY3JkXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1tc2NsaXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNscFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbXNkb3MtcHJvZ3JhbVwiOiB7XG4gICAgXCJleHRlbnNpb25zXCI6IFtcImV4ZVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZXhlXCIsXCJkbGxcIixcImNvbVwiLFwiYmF0XCIsXCJtc2lcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LW1zbWVkaWF2aWV3XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtdmJcIixcIm0xM1wiLFwibTE0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1tc21ldGFmaWxlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3bWZcIixcIndtelwiLFwiZW1mXCIsXCJlbXpcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LW1zbW9uZXlcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1ueVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbXNwdWJsaXNoZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInB1YlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbXNzY2hlZHVsZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2NkXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1tc3Rlcm1pbmFsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ0cm1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LW1zd3JpdGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndyaVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtbmV0Y2RmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJuY1wiLFwiY2RmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1ucy1wcm94eS1hdXRvY29uZmlnXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwYWNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LW56YlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibnpiXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1wZXJsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcIm5naW54XCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBsXCIsXCJwbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtcGlsb3RcIjoge1xuICAgIFwic291cmNlXCI6IFwibmdpbnhcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicHJjXCIsXCJwZGJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXBrY3MxMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicDEyXCIsXCJwZnhcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRpZmljYXRlc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicDdiXCIsXCJzcGNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRyZXFyZXNwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwN3JcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJyYXJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXJlZGhhdC1wYWNrYWdlLW1hbmFnZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwibmdpbnhcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicnBtXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1yZXNlYXJjaC1pbmZvLXN5c3RlbXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJpc1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtc2VhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcIm5naW54XCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNlYVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtc2hcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2hcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXNoYXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNoYXJcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3dmXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1zaWx2ZXJsaWdodC1hcHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhhcFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtc3FsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzcWxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXN0dWZmaXRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNpdFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtc3R1ZmZpdHhcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNpdHhcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXN1YnJpcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3J0XCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1zdjRjcGlvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzdjRjcGlvXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC1zdjRjcmNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN2NGNyY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtdDN2bS1pbWFnZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widDNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXRhZHNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdhbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtdGFyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInRhclwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtdGNsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ0Y2xcIixcInRrXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC10ZXhcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInRleFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtdGV4LXRmbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widGZtXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC10ZXhpbmZvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ0ZXhpbmZvXCIsXCJ0ZXhpXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC10Z2lmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJvYmpcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXVzdGFyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ1c3RhclwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtd2Fpcy1zb3VyY2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNyY1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtd2ViLWFwcC1tYW5pZmVzdCtqc29uXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3ZWJhcHBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZGVyXCIsXCJjcnRcIixcInBlbVwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gteGZpZ1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZmlnXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veC14bGlmZit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhsZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gteHBpbnN0YWxsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4cGlcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94LXh6XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4elwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3gtem1hY2hpbmVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInoxXCIsXCJ6MlwiLFwiejNcIixcIno0XCIsXCJ6NVwiLFwiejZcIixcIno3XCIsXCJ6OFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3g0MDAtYnBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veGFjbWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3hhbWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4YW1sXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veGNhcC1hdHQreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3hjYXAtY2Fwcyt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veGNhcC1kaWZmK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhkZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3hjYXAtZWwreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3hjYXAtZXJyb3IreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3hjYXAtbnMreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3hjb24tY29uZmVyZW5jZS1pbmZvK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94Y29uLWNvbmZlcmVuY2UtaW5mby1kaWZmK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94ZW5jK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhlbmNcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94aHRtbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhodG1sXCIsXCJ4aHRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94aHRtbC12b2ljZSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhtbFwiLFwieHNsXCIsXCJ4c2RcIixcInJuZ1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3htbC1kdGRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImR0ZFwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3htbC1leHRlcm5hbC1wYXJzZWQtZW50aXR5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImFwcGxpY2F0aW9uL3htbC1wYXRjaCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veG1wcCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veG9wK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieG9wXCJdXG4gIH0sXG4gIFwiYXBwbGljYXRpb24veHByb2MreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4cGxcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94c2x0K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhzbHRcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi94c3BmK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieHNwZlwiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3h2K3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm14bWxcIixcInhodm1sXCIsXCJ4dm1sXCIsXCJ4dm1cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi95YW5nXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieWFuZ1wiXVxuICB9LFxuICBcImFwcGxpY2F0aW9uL3lpbit4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ5aW5cIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi96aXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ6aXBcIl1cbiAgfSxcbiAgXCJhcHBsaWNhdGlvbi96bGliXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvLzFkLWludGVybGVhdmVkLXBhcml0eWZlY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby8zMmthZHBjbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby8zZ3BwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvLzNncHAyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2FjM1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9hZHBjbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYWRwXCJdXG4gIH0sXG4gIFwiYXVkaW8vYW1yXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2Ftci13YlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9hbXItd2IrXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2FwdHhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vYXNjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2F0cmFjLWFkdmFuY2VkLWxvc3NsZXNzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2F0cmFjLXhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vYXRyYWMzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2Jhc2ljXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYXVcIixcInNuZFwiXVxuICB9LFxuICBcImF1ZGlvL2J2MTZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vYnYzMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9jbGVhcm1vZGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vY25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZGF0MTJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZGxzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2Rzci1lczIwMTEwOFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9kc3ItZXMyMDIwNTBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZHNyLWVzMjAyMjExXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2Rzci1lczIwMjIxMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9kdlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9kdmk0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2VhYzNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZW5jYXBydHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZXZyY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9ldnJjLXFjcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9ldnJjMFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9ldnJjMVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9ldnJjYlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9ldnJjYjBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZXZyY2IxXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2V2cmNud1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9ldnJjbncwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2V2cmNudzFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZXZyY3diXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2V2cmN3YjBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZXZyY3diMVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9ldnNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZndkcmVkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2c3MTEtMFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9nNzE5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2c3MjJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZzcyMjFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZzcyM1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9nNzI2LTE2XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2c3MjYtMjRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZzcyNi0zMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9nNzI2LTQwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2c3MjhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZzcyOVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9nNzI5MVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9nNzI5ZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9nNzI5ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9nc21cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vZ3NtLWVmclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9nc20taHItMDhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vaWxiY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9pcC1tcl92Mi41XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2lzYWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJhdWRpby9sMTZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vbDIwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL2wyNFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2VcbiAgfSxcbiAgXCJhdWRpby9sOFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9scGNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vbWlkaVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWlkXCIsXCJtaWRpXCIsXCJrYXJcIixcInJtaVwiXVxuICB9LFxuICBcImF1ZGlvL21vYmlsZS14bWZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vbXA0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibTRhXCIsXCJtcDRhXCJdXG4gIH0sXG4gIFwiYXVkaW8vbXA0YS1sYXRtXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL21wYVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9tcGEtcm9idXN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL21wZWdcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtcGdhXCIsXCJtcDJcIixcIm1wMmFcIixcIm1wM1wiLFwibTJhXCIsXCJtM2FcIl1cbiAgfSxcbiAgXCJhdWRpby9tcGVnNC1nZW5lcmljXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL211c2VwYWNrXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwiYXVkaW8vb2dnXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib2dhXCIsXCJvZ2dcIixcInNweFwiXVxuICB9LFxuICBcImF1ZGlvL29wdXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vcGFyaXR5ZmVjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3BjbWFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vcGNtYS13YlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9wY211XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3BjbXUtd2JcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vcHJzLnNpZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9xY2VscFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9yYXB0b3JmZWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vcmVkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3J0cC1lbmMtYWVzY20xMjhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vcnRwLW1pZGlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vcnRwbG9vcGJhY2tcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vcnR4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3MzbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiczNtXCJdXG4gIH0sXG4gIFwiYXVkaW8vc2lsa1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2lsXCJdXG4gIH0sXG4gIFwiYXVkaW8vc212XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3Ntdi1xY3BcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vc212MFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby9zcC1taWRpXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3NwZWV4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3QxNDBjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3QzOFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby90ZWxlcGhvbmUtZXZlbnRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vdG9uZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby91ZW1jbGlwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3VscGZlY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby92ZHZpXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3Ztci13YlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby92bmQuM2dwcC5pdWZwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC40c2JcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vdm5kLmF1ZGlva296XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5jZWxwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5jaXNjby5uc2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vdm5kLmNtbGVzLnJhZGlvLWV2ZW50c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby92bmQuY25zLmFucDFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vdm5kLmNucy5pbmYxXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5kZWNlLmF1ZGlvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widXZhXCIsXCJ1dnZhXCJdXG4gIH0sXG4gIFwiYXVkaW8vdm5kLmRpZ2l0YWwtd2luZHNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJlb2xcIl1cbiAgfSxcbiAgXCJhdWRpby92bmQuZGxuYS5hZHRzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5kb2xieS5oZWFhYy4xXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5kb2xieS5oZWFhYy4yXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5kb2xieS5tbHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vdm5kLmRvbGJ5Lm1wc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby92bmQuZG9sYnkucGwyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5kb2xieS5wbDJ4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5kb2xieS5wbDJ6XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5kb2xieS5wdWxzZS4xXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5kcmFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkcmFcIl1cbiAgfSxcbiAgXCJhdWRpby92bmQuZHRzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZHRzXCJdXG4gIH0sXG4gIFwiYXVkaW8vdm5kLmR0cy5oZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImR0c2hkXCJdXG4gIH0sXG4gIFwiYXVkaW8vdm5kLmR2Yi5maWxlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5ldmVyYWQucGxqXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5obnMuYXVkaW9cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vdm5kLmx1Y2VudC52b2ljZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImx2cFwiXVxuICB9LFxuICBcImF1ZGlvL3ZuZC5tcy1wbGF5cmVhZHkubWVkaWEucHlhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicHlhXCJdXG4gIH0sXG4gIFwiYXVkaW8vdm5kLm5va2lhLm1vYmlsZS14bWZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vdm5kLm5vcnRlbC52YmtcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vdm5kLm51ZXJhLmVjZWxwNDgwMFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImVjZWxwNDgwMFwiXVxuICB9LFxuICBcImF1ZGlvL3ZuZC5udWVyYS5lY2VscDc0NzBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJlY2VscDc0NzBcIl1cbiAgfSxcbiAgXCJhdWRpby92bmQubnVlcmEuZWNlbHA5NjAwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZWNlbHA5NjAwXCJdXG4gIH0sXG4gIFwiYXVkaW8vdm5kLm9jdGVsLnNiY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby92bmQucWNlbHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiYXVkaW8vdm5kLnJoZXRvcmV4LjMya2FkcGNtXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC5yaXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJyaXBcIl1cbiAgfSxcbiAgXCJhdWRpby92bmQucm4tcmVhbGF1ZGlvXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZVxuICB9LFxuICBcImF1ZGlvL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5tcGVnXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImF1ZGlvL3ZuZC52bXguY3ZzZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby92bmQud2F2ZVwiOiB7XG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2VcbiAgfSxcbiAgXCJhdWRpby92b3JiaXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlXG4gIH0sXG4gIFwiYXVkaW8vdm9yYmlzLWNvbmZpZ1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJhdWRpby93YXZcIjoge1xuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3YXZcIl1cbiAgfSxcbiAgXCJhdWRpby93YXZlXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid2F2XCJdXG4gIH0sXG4gIFwiYXVkaW8vd2VibVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid2ViYVwiXVxuICB9LFxuICBcImF1ZGlvL3gtYWFjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJhYWNcIl1cbiAgfSxcbiAgXCJhdWRpby94LWFpZmZcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImFpZlwiLFwiYWlmZlwiLFwiYWlmY1wiXVxuICB9LFxuICBcImF1ZGlvL3gtY2FmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjYWZcIl1cbiAgfSxcbiAgXCJhdWRpby94LWZsYWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZsYWNcIl1cbiAgfSxcbiAgXCJhdWRpby94LW00YVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJuZ2lueFwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtNGFcIl1cbiAgfSxcbiAgXCJhdWRpby94LW1hdHJvc2thXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJta2FcIl1cbiAgfSxcbiAgXCJhdWRpby94LW1wZWd1cmxcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm0zdVwiXVxuICB9LFxuICBcImF1ZGlvL3gtbXMtd2F4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3YXhcIl1cbiAgfSxcbiAgXCJhdWRpby94LW1zLXdtYVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid21hXCJdXG4gIH0sXG4gIFwiYXVkaW8veC1wbi1yZWFsYXVkaW9cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJhbVwiLFwicmFcIl1cbiAgfSxcbiAgXCJhdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW5cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJtcFwiXVxuICB9LFxuICBcImF1ZGlvL3gtcmVhbGF1ZGlvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcIm5naW54XCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJhXCJdXG4gIH0sXG4gIFwiYXVkaW8veC10dGFcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJhdWRpby94LXdhdlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid2F2XCJdXG4gIH0sXG4gIFwiYXVkaW8veG1cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhtXCJdXG4gIH0sXG4gIFwiY2hlbWljYWwveC1jZHhcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNkeFwiXVxuICB9LFxuICBcImNoZW1pY2FsL3gtY2lmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjaWZcIl1cbiAgfSxcbiAgXCJjaGVtaWNhbC94LWNtZGZcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNtZGZcIl1cbiAgfSxcbiAgXCJjaGVtaWNhbC94LWNtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY21sXCJdXG4gIH0sXG4gIFwiY2hlbWljYWwveC1jc21sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjc21sXCJdXG4gIH0sXG4gIFwiY2hlbWljYWwveC1wZGJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJjaGVtaWNhbC94LXh5elwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieHl6XCJdXG4gIH0sXG4gIFwiZm9udC9vcGVudHlwZVwiOiB7XG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wib3RmXCJdXG4gIH0sXG4gIFwiaW1hZ2UvYm1wXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImJtcFwiXVxuICB9LFxuICBcImltYWdlL2NnbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNnbVwiXVxuICB9LFxuICBcImltYWdlL2ZpdHNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiaW1hZ2UvZzNmYXhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJnM1wiXVxuICB9LFxuICBcImltYWdlL2dpZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdpZlwiXVxuICB9LFxuICBcImltYWdlL2llZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImllZlwiXVxuICB9LFxuICBcImltYWdlL2pwMlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJpbWFnZS9qcGVnXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wianBlZ1wiLFwianBnXCIsXCJqcGVcIl1cbiAgfSxcbiAgXCJpbWFnZS9qcG1cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiaW1hZ2UvanB4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImltYWdlL2t0eFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImt0eFwiXVxuICB9LFxuICBcImltYWdlL25hcGxwc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJpbWFnZS9wanBlZ1wiOiB7XG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2VcbiAgfSxcbiAgXCJpbWFnZS9wbmdcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwbmdcIl1cbiAgfSxcbiAgXCJpbWFnZS9wcnMuYnRpZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImJ0aWZcIl1cbiAgfSxcbiAgXCJpbWFnZS9wcnMucHRpXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImltYWdlL3B3Zy1yYXN0ZXJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiaW1hZ2Uvc2dpXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzZ2lcIl1cbiAgfSxcbiAgXCJpbWFnZS9zdmcreG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzdmdcIixcInN2Z3pcIl1cbiAgfSxcbiAgXCJpbWFnZS90MzhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiaW1hZ2UvdGlmZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInRpZmZcIixcInRpZlwiXVxuICB9LFxuICBcImltYWdlL3RpZmYtZnhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLmFkb2JlLnBob3Rvc2hvcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicHNkXCJdXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLmFpcnppcC5hY2NlbGVyYXRvci5henZcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLmNucy5pbmYyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImltYWdlL3ZuZC5kZWNlLmdyYXBoaWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ1dmlcIixcInV2dmlcIixcInV2Z1wiLFwidXZ2Z1wiXVxuICB9LFxuICBcImltYWdlL3ZuZC5kanZ1XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZGp2dVwiLFwiZGp2XCJdXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLmR2Yi5zdWJ0aXRsZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN1YlwiXVxuICB9LFxuICBcImltYWdlL3ZuZC5kd2dcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkd2dcIl1cbiAgfSxcbiAgXCJpbWFnZS92bmQuZHhmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZHhmXCJdXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLmZhc3RiaWRzaGVldFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZic1wiXVxuICB9LFxuICBcImltYWdlL3ZuZC5mcHhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJmcHhcIl1cbiAgfSxcbiAgXCJpbWFnZS92bmQuZnN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZnN0XCJdXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtbW1yXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibW1yXCJdXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtcmxjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicmxjXCJdXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLmdsb2JhbGdyYXBoaWNzLnBnYlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJpbWFnZS92bmQubWljcm9zb2Z0Lmljb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLm1peFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJpbWFnZS92bmQubW96aWxsYS5hcG5nXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImltYWdlL3ZuZC5tcy1tb2RpXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibWRpXCJdXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLm1zLXBob3RvXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3ZHBcIl1cbiAgfSxcbiAgXCJpbWFnZS92bmQubmV0LWZweFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm5weFwiXVxuICB9LFxuICBcImltYWdlL3ZuZC5yYWRpYW5jZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJpbWFnZS92bmQuc2VhbGVkLnBuZ1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJpbWFnZS92bmQuc2VhbGVkbWVkaWEuc29mdHNlYWwuZ2lmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImltYWdlL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5qcGdcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLnN2ZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJpbWFnZS92bmQudGVuY2VudC50YXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwiaW1hZ2Uvdm5kLnZhbHZlLnNvdXJjZS50ZXh0dXJlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImltYWdlL3ZuZC53YXAud2JtcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndibXBcIl1cbiAgfSxcbiAgXCJpbWFnZS92bmQueGlmZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInhpZlwiXVxuICB9LFxuICBcImltYWdlL3ZuZC56YnJ1c2gucGN4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcImltYWdlL3dlYnBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndlYnBcIl1cbiAgfSxcbiAgXCJpbWFnZS94LTNkc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiM2RzXCJdXG4gIH0sXG4gIFwiaW1hZ2UveC1jbXUtcmFzdGVyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJyYXNcIl1cbiAgfSxcbiAgXCJpbWFnZS94LWNteFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiY214XCJdXG4gIH0sXG4gIFwiaW1hZ2UveC1mcmVlaGFuZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZmhcIixcImZoY1wiLFwiZmg0XCIsXCJmaDVcIixcImZoN1wiXVxuICB9LFxuICBcImltYWdlL3gtaWNvblwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJpY29cIl1cbiAgfSxcbiAgXCJpbWFnZS94LWpuZ1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJuZ2lueFwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJqbmdcIl1cbiAgfSxcbiAgXCJpbWFnZS94LW1yc2lkLWltYWdlXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzaWRcIl1cbiAgfSxcbiAgXCJpbWFnZS94LW1zLWJtcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJuZ2lueFwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImJtcFwiXVxuICB9LFxuICBcImltYWdlL3gtcGN4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwY3hcIl1cbiAgfSxcbiAgXCJpbWFnZS94LXBpY3RcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBpY1wiLFwicGN0XCJdXG4gIH0sXG4gIFwiaW1hZ2UveC1wb3J0YWJsZS1hbnltYXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBubVwiXVxuICB9LFxuICBcImltYWdlL3gtcG9ydGFibGUtYml0bWFwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwYm1cIl1cbiAgfSxcbiAgXCJpbWFnZS94LXBvcnRhYmxlLWdyYXltYXBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInBnbVwiXVxuICB9LFxuICBcImltYWdlL3gtcG9ydGFibGUtcGl4bWFwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwcG1cIl1cbiAgfSxcbiAgXCJpbWFnZS94LXJnYlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicmdiXCJdXG4gIH0sXG4gIFwiaW1hZ2UveC10Z2FcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInRnYVwiXVxuICB9LFxuICBcImltYWdlL3gteGJpdG1hcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieGJtXCJdXG4gIH0sXG4gIFwiaW1hZ2UveC14Y2ZcIjoge1xuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlXG4gIH0sXG4gIFwiaW1hZ2UveC14cGl4bWFwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4cG1cIl1cbiAgfSxcbiAgXCJpbWFnZS94LXh3aW5kb3dkdW1wXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4d2RcIl1cbiAgfSxcbiAgXCJtZXNzYWdlL2NwaW1cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibWVzc2FnZS9kZWxpdmVyeS1zdGF0dXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibWVzc2FnZS9kaXNwb3NpdGlvbi1ub3RpZmljYXRpb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibWVzc2FnZS9leHRlcm5hbC1ib2R5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm1lc3NhZ2UvZmVlZGJhY2stcmVwb3J0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm1lc3NhZ2UvZ2xvYmFsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm1lc3NhZ2UvZ2xvYmFsLWRlbGl2ZXJ5LXN0YXR1c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJtZXNzYWdlL2dsb2JhbC1kaXNwb3NpdGlvbi1ub3RpZmljYXRpb25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibWVzc2FnZS9nbG9iYWwtaGVhZGVyc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJtZXNzYWdlL2h0dHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlXG4gIH0sXG4gIFwibWVzc2FnZS9pbWRuK3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcIm1lc3NhZ2UvbmV3c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJtZXNzYWdlL3BhcnRpYWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlXG4gIH0sXG4gIFwibWVzc2FnZS9yZmM4MjJcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImVtbFwiLFwibWltZVwiXVxuICB9LFxuICBcIm1lc3NhZ2Uvcy1odHRwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm1lc3NhZ2Uvc2lwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm1lc3NhZ2Uvc2lwZnJhZ1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJtZXNzYWdlL3RyYWNraW5nLXN0YXR1c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJtZXNzYWdlL3ZuZC5zaS5zaW1wXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm1lc3NhZ2Uvdm5kLndmYS53c2NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibW9kZWwvaWdlc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImlnc1wiLFwiaWdlc1wiXVxuICB9LFxuICBcIm1vZGVsL21lc2hcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtc2hcIixcIm1lc2hcIixcInNpbG9cIl1cbiAgfSxcbiAgXCJtb2RlbC92bmQuY29sbGFkYSt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkYWVcIl1cbiAgfSxcbiAgXCJtb2RlbC92bmQuZHdmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZHdmXCJdXG4gIH0sXG4gIFwibW9kZWwvdm5kLmZsYXRsYW5kLjNkbWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibW9kZWwvdm5kLmdkbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImdkbFwiXVxuICB9LFxuICBcIm1vZGVsL3ZuZC5ncy1nZGxcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJtb2RlbC92bmQuZ3MuZ2RsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm1vZGVsL3ZuZC5ndHdcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJndHdcIl1cbiAgfSxcbiAgXCJtb2RlbC92bmQubW9tbCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibW9kZWwvdm5kLm10c1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm10c1wiXVxuICB9LFxuICBcIm1vZGVsL3ZuZC5vcGVuZ2V4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm1vZGVsL3ZuZC5wYXJhc29saWQudHJhbnNtaXQuYmluYXJ5XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm1vZGVsL3ZuZC5wYXJhc29saWQudHJhbnNtaXQudGV4dFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJtb2RlbC92bmQucm9zZXR0ZS5hbm5vdGF0ZWQtZGF0YS1tb2RlbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJtb2RlbC92bmQudmFsdmUuc291cmNlLmNvbXBpbGVkLW1hcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJtb2RlbC92bmQudnR1XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widnR1XCJdXG4gIH0sXG4gIFwibW9kZWwvdnJtbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndybFwiLFwidnJtbFwiXVxuICB9LFxuICBcIm1vZGVsL3gzZCtiaW5hcnlcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIngzZGJcIixcIngzZGJ6XCJdXG4gIH0sXG4gIFwibW9kZWwveDNkK2Zhc3RpbmZvc2V0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm1vZGVsL3gzZCt2cm1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ4M2R2XCIsXCJ4M2R2elwiXVxuICB9LFxuICBcIm1vZGVsL3gzZCt4bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIngzZFwiLFwieDNkelwiXVxuICB9LFxuICBcIm1vZGVsL3gzZC12cm1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm11bHRpcGFydC9hbHRlcm5hdGl2ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2VcbiAgfSxcbiAgXCJtdWx0aXBhcnQvYXBwbGVkb3VibGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibXVsdGlwYXJ0L2J5dGVyYW5nZXNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibXVsdGlwYXJ0L2RpZ2VzdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJtdWx0aXBhcnQvZW5jcnlwdGVkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZVxuICB9LFxuICBcIm11bHRpcGFydC9mb3JtLWRhdGFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlXG4gIH0sXG4gIFwibXVsdGlwYXJ0L2hlYWRlci1zZXRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibXVsdGlwYXJ0L21peGVkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZVxuICB9LFxuICBcIm11bHRpcGFydC9wYXJhbGxlbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJtdWx0aXBhcnQvcmVsYXRlZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2VcbiAgfSxcbiAgXCJtdWx0aXBhcnQvcmVwb3J0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcIm11bHRpcGFydC9zaWduZWRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlXG4gIH0sXG4gIFwibXVsdGlwYXJ0L3ZvaWNlLW1lc3NhZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwibXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0LzFkLWludGVybGVhdmVkLXBhcml0eWZlY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L2NhY2hlLW1hbmlmZXN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJhcHBjYWNoZVwiLFwibWFuaWZlc3RcIl1cbiAgfSxcbiAgXCJ0ZXh0L2NhbGVuZGFyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaWNzXCIsXCJpZmJcIl1cbiAgfSxcbiAgXCJ0ZXh0L2NhbGVuZGVyXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH0sXG4gIFwidGV4dC9jbWRcIjoge1xuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJ0ZXh0L2NvZmZlZXNjcmlwdFwiOiB7XG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNvZmZlZVwiLFwibGl0Y29mZmVlXCJdXG4gIH0sXG4gIFwidGV4dC9jc3NcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImNzc1wiXVxuICB9LFxuICBcInRleHQvY3N2XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjc3ZcIl1cbiAgfSxcbiAgXCJ0ZXh0L2Nzdi1zY2hlbWFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwidGV4dC9kaXJlY3RvcnlcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwidGV4dC9kbnNcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwidGV4dC9lY21hc2NyaXB0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcInRleHQvZW5jYXBydHBcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwidGV4dC9lbnJpY2hlZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L2Z3ZHJlZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L2dyYW1tYXItcmVmLWxpc3RcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwidGV4dC9oanNvblwiOiB7XG4gICAgXCJleHRlbnNpb25zXCI6IFtcImhqc29uXCJdXG4gIH0sXG4gIFwidGV4dC9odG1sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJodG1sXCIsXCJodG1cIixcInNodG1sXCJdXG4gIH0sXG4gIFwidGV4dC9qYWRlXCI6IHtcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiamFkZVwiXVxuICB9LFxuICBcInRleHQvamF2YXNjcmlwdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcInRleHQvamNyLWNuZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L2pzeFwiOiB7XG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wianN4XCJdXG4gIH0sXG4gIFwidGV4dC9sZXNzXCI6IHtcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibGVzc1wiXVxuICB9LFxuICBcInRleHQvbWFya2Rvd25cIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwidGV4dC9tYXRobWxcIjoge1xuICAgIFwic291cmNlXCI6IFwibmdpbnhcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibW1sXCJdXG4gIH0sXG4gIFwidGV4dC9taXphclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L24zXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJuM1wiXVxuICB9LFxuICBcInRleHQvcGFyYW1ldGVyc1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3Bhcml0eWZlY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3BsYWluXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ0eHRcIixcInRleHRcIixcImNvbmZcIixcImRlZlwiLFwibGlzdFwiLFwibG9nXCIsXCJpblwiLFwiaW5pXCJdXG4gIH0sXG4gIFwidGV4dC9wcm92ZW5hbmNlLW5vdGF0aW9uXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcInRleHQvcHJzLmZhbGxlbnN0ZWluLnJzdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3Bycy5saW5lcy50YWdcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJkc2NcIl1cbiAgfSxcbiAgXCJ0ZXh0L3JhcHRvcmZlY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3JlZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3JmYzgyMi1oZWFkZXJzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcInRleHQvcmljaHRleHRcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInJ0eFwiXVxuICB9LFxuICBcInRleHQvcnRmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJydGZcIl1cbiAgfSxcbiAgXCJ0ZXh0L3J0cC1lbmMtYWVzY20xMjhcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwidGV4dC9ydHBsb29wYmFja1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3J0eFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3NnbWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzZ21sXCIsXCJzZ21cIl1cbiAgfSxcbiAgXCJ0ZXh0L3NsaW1cIjoge1xuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzbGltXCIsXCJzbG1cIl1cbiAgfSxcbiAgXCJ0ZXh0L3N0eWx1c1wiOiB7XG4gICAgXCJleHRlbnNpb25zXCI6IFtcInN0eWx1c1wiLFwic3R5bFwiXVxuICB9LFxuICBcInRleHQvdDE0MFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ0c3ZcIl1cbiAgfSxcbiAgXCJ0ZXh0L3Ryb2ZmXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widFwiLFwidHJcIixcInJvZmZcIixcIm1hblwiLFwibWVcIixcIm1zXCJdXG4gIH0sXG4gIFwidGV4dC90dXJ0bGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ0dGxcIl1cbiAgfSxcbiAgXCJ0ZXh0L3VscGZlY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3VyaS1saXN0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ1cmlcIixcInVyaXNcIixcInVybHNcIl1cbiAgfSxcbiAgXCJ0ZXh0L3ZjYXJkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ2Y2FyZFwiXVxuICB9LFxuICBcInRleHQvdm5kLmFcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwidGV4dC92bmQuYWJjXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcInRleHQvdm5kLmN1cmxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjdXJsXCJdXG4gIH0sXG4gIFwidGV4dC92bmQuY3VybC5kY3VybFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZGN1cmxcIl1cbiAgfSxcbiAgXCJ0ZXh0L3ZuZC5jdXJsLm1jdXJsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtY3VybFwiXVxuICB9LFxuICBcInRleHQvdm5kLmN1cmwuc2N1cmxcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNjdXJsXCJdXG4gIH0sXG4gIFwidGV4dC92bmQuZGViaWFuLmNvcHlyaWdodFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3ZuZC5kbWNsaWVudHNjcmlwdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3ZuZC5kdmIuc3VidGl0bGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzdWJcIl1cbiAgfSxcbiAgXCJ0ZXh0L3ZuZC5lc21lcnRlYy50aGVtZS1kZXNjcmlwdG9yXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcInRleHQvdm5kLmZseVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZseVwiXVxuICB9LFxuICBcInRleHQvdm5kLmZtaS5mbGV4c3RvclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZseFwiXVxuICB9LFxuICBcInRleHQvdm5kLmdyYXBodml6XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZ3ZcIl1cbiAgfSxcbiAgXCJ0ZXh0L3ZuZC5pbjNkLjNkbWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCIzZG1sXCJdXG4gIH0sXG4gIFwidGV4dC92bmQuaW4zZC5zcG90XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic3BvdFwiXVxuICB9LFxuICBcInRleHQvdm5kLmlwdGMubmV3c21sXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcInRleHQvdm5kLmlwdGMubml0ZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3ZuZC5sYXRleC16XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcInRleHQvdm5kLm1vdG9yb2xhLnJlZmxleFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3ZuZC5tcy1tZWRpYXBhY2thZ2VcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwidGV4dC92bmQubmV0MnBob25lLmNvbW1jZW50ZXIuY29tbWFuZFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3ZuZC5yYWRpc3lzLm1zbWwtYmFzaWMtbGF5b3V0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcInRleHQvdm5kLnNpLnVyaWNhdGFsb2d1ZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3ZuZC5zdW4uajJtZS5hcHAtZGVzY3JpcHRvclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImphZFwiXVxuICB9LFxuICBcInRleHQvdm5kLnRyb2xsdGVjaC5saW5ndWlzdFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3ZuZC53YXAuc2lcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiXG4gIH0sXG4gIFwidGV4dC92bmQud2FwLnNsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIlxuICB9LFxuICBcInRleHQvdm5kLndhcC53bWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiaWFuYVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3bWxcIl1cbiAgfSxcbiAgXCJ0ZXh0L3ZuZC53YXAud21sc2NyaXB0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImlhbmFcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid21sc1wiXVxuICB9LFxuICBcInRleHQvdnR0XCI6IHtcbiAgICBcImNoYXJzZXRcIjogXCJVVEYtOFwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInZ0dFwiXVxuICB9LFxuICBcInRleHQveC1hc21cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInNcIixcImFzbVwiXVxuICB9LFxuICBcInRleHQveC1jXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJjXCIsXCJjY1wiLFwiY3h4XCIsXCJjcHBcIixcImhcIixcImhoXCIsXCJkaWNcIl1cbiAgfSxcbiAgXCJ0ZXh0L3gtY29tcG9uZW50XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcIm5naW54XCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImh0Y1wiXVxuICB9LFxuICBcInRleHQveC1mb3J0cmFuXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJmXCIsXCJmb3JcIixcImY3N1wiLFwiZjkwXCJdXG4gIH0sXG4gIFwidGV4dC94LWd3dC1ycGNcIjoge1xuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWVcbiAgfSxcbiAgXCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiOiB7XG4gICAgXCJleHRlbnNpb25zXCI6IFtcImhic1wiXVxuICB9LFxuICBcInRleHQveC1qYXZhLXNvdXJjZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiamF2YVwiXVxuICB9LFxuICBcInRleHQveC1qcXVlcnktdG1wbFwiOiB7XG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcInRleHQveC1sdWFcIjoge1xuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJsdWFcIl1cbiAgfSxcbiAgXCJ0ZXh0L3gtbWFya2Rvd25cIjoge1xuICAgIFwiY29tcHJlc3NpYmxlXCI6IHRydWUsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm1hcmtkb3duXCIsXCJtZFwiLFwibWtkXCJdXG4gIH0sXG4gIFwidGV4dC94LW5mb1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibmZvXCJdXG4gIH0sXG4gIFwidGV4dC94LW9wbWxcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm9wbWxcIl1cbiAgfSxcbiAgXCJ0ZXh0L3gtcGFzY2FsXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJwXCIsXCJwYXNcIl1cbiAgfSxcbiAgXCJ0ZXh0L3gtcHJvY2Vzc2luZ1wiOiB7XG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wicGRlXCJdXG4gIH0sXG4gIFwidGV4dC94LXNhc3NcIjoge1xuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzYXNzXCJdXG4gIH0sXG4gIFwidGV4dC94LXNjc3NcIjoge1xuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzY3NzXCJdXG4gIH0sXG4gIFwidGV4dC94LXNldGV4dFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZXR4XCJdXG4gIH0sXG4gIFwidGV4dC94LXNmdlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wic2Z2XCJdXG4gIH0sXG4gIFwidGV4dC94LXN1c2UteW1wXCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ5bXBcIl1cbiAgfSxcbiAgXCJ0ZXh0L3gtdXVlbmNvZGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInV1XCJdXG4gIH0sXG4gIFwidGV4dC94LXZjYWxlbmRhclwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widmNzXCJdXG4gIH0sXG4gIFwidGV4dC94LXZjYXJkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ2Y2ZcIl1cbiAgfSxcbiAgXCJ0ZXh0L3htbFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wieG1sXCJdXG4gIH0sXG4gIFwidGV4dC94bWwtZXh0ZXJuYWwtcGFyc2VkLWVudGl0eVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJpYW5hXCJcbiAgfSxcbiAgXCJ0ZXh0L3lhbWxcIjoge1xuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ5YW1sXCIsXCJ5bWxcIl1cbiAgfSxcbiAgXCJ2aWRlby8xZC1pbnRlcmxlYXZlZC1wYXJpdHlmZWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby8zZ3BwXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCIzZ3BcIixcIjNncHBcIl1cbiAgfSxcbiAgXCJ2aWRlby8zZ3BwLXR0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vM2dwcDJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIjNnMlwiXVxuICB9LFxuICBcInZpZGVvL2JtcGVnXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vYnQ2NTZcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby9jZWxiXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vZHZcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby9oMjYxXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJoMjYxXCJdXG4gIH0sXG4gIFwidmlkZW8vaDI2M1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaDI2M1wiXVxuICB9LFxuICBcInZpZGVvL2gyNjMtMTk5OFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL2gyNjMtMjAwMFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL2gyNjRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImgyNjRcIl1cbiAgfSxcbiAgXCJ2aWRlby9oMjY0LXJjZG9cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby9oMjY0LXN2Y1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL2pwZWdcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImpwZ3ZcIl1cbiAgfSxcbiAgXCJ2aWRlby9qcGVnMjAwMFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL2pwbVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wianBtXCIsXCJqcGdtXCJdXG4gIH0sXG4gIFwidmlkZW8vbWoyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtajJcIixcIm1qcDJcIl1cbiAgfSxcbiAgXCJ2aWRlby9tcDFzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vbXAycFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL21wMnRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInRzXCJdXG4gIH0sXG4gIFwidmlkZW8vbXA0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtcDRcIixcIm1wNHZcIixcIm1wZzRcIl1cbiAgfSxcbiAgXCJ2aWRlby9tcDR2LWVzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vbXBlZ1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wibXBlZ1wiLFwibXBnXCIsXCJtcGVcIixcIm0xdlwiLFwibTJ2XCJdXG4gIH0sXG4gIFwidmlkZW8vbXBlZzQtZ2VuZXJpY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL21wdlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL252XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vb2dnXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJvZ3ZcIl1cbiAgfSxcbiAgXCJ2aWRlby9wYXJpdHlmZWNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby9wb2ludGVyXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vcXVpY2t0aW1lXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJxdFwiLFwibW92XCJdXG4gIH0sXG4gIFwidmlkZW8vcmF3XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vcnRwLWVuYy1hZXNjbTEyOFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL3J0eFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL3NtcHRlMjkybVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL3VscGZlY1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL3ZjMVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL3ZuZC5jY3R2XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vdm5kLmRlY2UuaGRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInV2aFwiLFwidXZ2aFwiXVxuICB9LFxuICBcInZpZGVvL3ZuZC5kZWNlLm1vYmlsZVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widXZtXCIsXCJ1dnZtXCJdXG4gIH0sXG4gIFwidmlkZW8vdm5kLmRlY2UubXA0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vdm5kLmRlY2UucGRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInV2cFwiLFwidXZ2cFwiXVxuICB9LFxuICBcInZpZGVvL3ZuZC5kZWNlLnNkXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ1dnNcIixcInV2dnNcIl1cbiAgfSxcbiAgXCJ2aWRlby92bmQuZGVjZS52aWRlb1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widXZ2XCIsXCJ1dnZ2XCJdXG4gIH0sXG4gIFwidmlkZW8vdm5kLmRpcmVjdHYubXBlZ1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL3ZuZC5kaXJlY3R2Lm1wZWctdHRzXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vdm5kLmRsbmEubXBlZy10dHNcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby92bmQuZHZiLmZpbGVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImR2YlwiXVxuICB9LFxuICBcInZpZGVvL3ZuZC5mdnRcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZ2dFwiXVxuICB9LFxuICBcInZpZGVvL3ZuZC5obnMudmlkZW9cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby92bmQuaXB0dmZvcnVtLjFkcGFyaXR5ZmVjLTEwMTBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby92bmQuaXB0dmZvcnVtLjFkcGFyaXR5ZmVjLTIwMDVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby92bmQuaXB0dmZvcnVtLjJkcGFyaXR5ZmVjLTEwMTBcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby92bmQuaXB0dmZvcnVtLjJkcGFyaXR5ZmVjLTIwMDVcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby92bmQuaXB0dmZvcnVtLnR0c2F2Y1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL3ZuZC5pcHR2Zm9ydW0udHRzbXBlZzJcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby92bmQubW90b3JvbGEudmlkZW9cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby92bmQubW90b3JvbGEudmlkZW9wXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vdm5kLm1wZWd1cmxcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIm14dVwiLFwibTR1XCJdXG4gIH0sXG4gIFwidmlkZW8vdm5kLm1zLXBsYXlyZWFkeS5tZWRpYS5weXZcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcInB5dlwiXVxuICB9LFxuICBcInZpZGVvL3ZuZC5ub2tpYS5pbnRlcmxlYXZlZC1tdWx0aW1lZGlhXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vdm5kLm5va2lhLnZpZGVvdm9pcFwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL3ZuZC5vYmplY3R2aWRlb1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIlxuICB9LFxuICBcInZpZGVvL3ZuZC5zZWFsZWQubXBlZzFcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby92bmQuc2VhbGVkLm1wZWc0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vdm5kLnNlYWxlZC5zd2ZcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCJcbiAgfSxcbiAgXCJ2aWRlby92bmQuc2VhbGVkbWVkaWEuc29mdHNlYWwubW92XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiXG4gIH0sXG4gIFwidmlkZW8vdm5kLnV2dnUubXA0XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ1dnVcIixcInV2dnVcIl1cbiAgfSxcbiAgXCJ2aWRlby92bmQudml2b1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widml2XCJdXG4gIH0sXG4gIFwidmlkZW8vd2VibVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid2VibVwiXVxuICB9LFxuICBcInZpZGVvL3gtZjR2XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJmNHZcIl1cbiAgfSxcbiAgXCJ2aWRlby94LWZsaVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiZmxpXCJdXG4gIH0sXG4gIFwidmlkZW8veC1mbHZcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJjb21wcmVzc2libGVcIjogZmFsc2UsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImZsdlwiXVxuICB9LFxuICBcInZpZGVvL3gtbTR2XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtNHZcIl1cbiAgfSxcbiAgXCJ2aWRlby94LW1hdHJvc2thXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiY29tcHJlc3NpYmxlXCI6IGZhbHNlLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJta3ZcIixcIm1rM2RcIixcIm1rc1wiXVxuICB9LFxuICBcInZpZGVvL3gtbW5nXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtbmdcIl1cbiAgfSxcbiAgXCJ2aWRlby94LW1zLWFzZlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiYXNmXCIsXCJhc3hcIl1cbiAgfSxcbiAgXCJ2aWRlby94LW1zLXZvYlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1widm9iXCJdXG4gIH0sXG4gIFwidmlkZW8veC1tcy13bVwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid21cIl1cbiAgfSxcbiAgXCJ2aWRlby94LW1zLXdtdlwiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImNvbXByZXNzaWJsZVwiOiBmYWxzZSxcbiAgICBcImV4dGVuc2lvbnNcIjogW1wid212XCJdXG4gIH0sXG4gIFwidmlkZW8veC1tcy13bXhcIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcIndteFwiXVxuICB9LFxuICBcInZpZGVvL3gtbXMtd3Z4XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJ3dnhcIl1cbiAgfSxcbiAgXCJ2aWRlby94LW1zdmlkZW9cIjoge1xuICAgIFwic291cmNlXCI6IFwiYXBhY2hlXCIsXG4gICAgXCJleHRlbnNpb25zXCI6IFtcImF2aVwiXVxuICB9LFxuICBcInZpZGVvL3gtc2dpLW1vdmllXCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJtb3ZpZVwiXVxuICB9LFxuICBcInZpZGVvL3gtc212XCI6IHtcbiAgICBcInNvdXJjZVwiOiBcImFwYWNoZVwiLFxuICAgIFwiZXh0ZW5zaW9uc1wiOiBbXCJzbXZcIl1cbiAgfSxcbiAgXCJ4LWNvbmZlcmVuY2UveC1jb29sdGFsa1wiOiB7XG4gICAgXCJzb3VyY2VcIjogXCJhcGFjaGVcIixcbiAgICBcImV4dGVuc2lvbnNcIjogW1wiaWNlXCJdXG4gIH0sXG4gIFwieC1zaGFkZXIveC1mcmFnbWVudFwiOiB7XG4gICAgXCJjb21wcmVzc2libGVcIjogdHJ1ZVxuICB9LFxuICBcIngtc2hhZGVyL3gtdmVydGV4XCI6IHtcbiAgICBcImNvbXByZXNzaWJsZVwiOiB0cnVlXG4gIH1cbn1cbiIsIi8qIVxuICogbWltZS1kYlxuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kYi5qc29uJylcbiIsIi8qIVxuICogbWltZS10eXBlc1xuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGRiID0gcmVxdWlyZSgnbWltZS1kYicpXG52YXIgZXh0bmFtZSA9IHJlcXVpcmUoJ3BhdGgnKS5leHRuYW1lXG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGV4dHJhY3RUeXBlUmVnRXhwID0gL15cXHMqKFteO1xcc10qKSg/Ojt8XFxzfCQpL1xudmFyIHRleHRUeXBlUmVnRXhwID0gL150ZXh0XFwvL2lcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmNoYXJzZXQgPSBjaGFyc2V0XG5leHBvcnRzLmNoYXJzZXRzID0geyBsb29rdXA6IGNoYXJzZXQgfVxuZXhwb3J0cy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlXG5leHBvcnRzLmV4dGVuc2lvbiA9IGV4dGVuc2lvblxuZXhwb3J0cy5leHRlbnNpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuZXhwb3J0cy5sb29rdXAgPSBsb29rdXBcbmV4cG9ydHMudHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbi8vIFBvcHVsYXRlIHRoZSBleHRlbnNpb25zL3R5cGVzIG1hcHNcbnBvcHVsYXRlTWFwcyhleHBvcnRzLmV4dGVuc2lvbnMsIGV4cG9ydHMudHlwZXMpXG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGNoYXJzZXQgZm9yIGEgTUlNRSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufHN0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBjaGFyc2V0KHR5cGUpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gVE9ETzogdXNlIG1lZGlhLXR5cGVyXG4gIHZhciBtYXRjaCA9IGV4dHJhY3RUeXBlUmVnRXhwLmV4ZWModHlwZSlcbiAgdmFyIG1pbWUgPSBtYXRjaCAmJiBkYlttYXRjaFsxXS50b0xvd2VyQ2FzZSgpXVxuXG4gIGlmIChtaW1lICYmIG1pbWUuY2hhcnNldCkge1xuICAgIHJldHVybiBtaW1lLmNoYXJzZXRcbiAgfVxuXG4gIC8vIGRlZmF1bHQgdGV4dC8qIHRvIHV0Zi04XG4gIGlmIChtYXRjaCAmJiB0ZXh0VHlwZVJlZ0V4cC50ZXN0KG1hdGNoWzFdKSkge1xuICAgIHJldHVybiAnVVRGLTgnXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmdWxsIENvbnRlbnQtVHlwZSBoZWFkZXIgZ2l2ZW4gYSBNSU1FIHR5cGUgb3IgZXh0ZW5zaW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGNvbnRlbnRUeXBlKHN0cikge1xuICAvLyBUT0RPOiBzaG91bGQgdGhpcyBldmVuIGJlIGluIHRoaXMgbW9kdWxlP1xuICBpZiAoIXN0ciB8fCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdmFyIG1pbWUgPSBzdHIuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gZXhwb3J0cy5sb29rdXAoc3RyKVxuICAgIDogc3RyXG5cbiAgaWYgKCFtaW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgY29udGVudC10eXBlIG9yIG90aGVyIG1vZHVsZVxuICBpZiAobWltZS5pbmRleE9mKCdjaGFyc2V0JykgPT09IC0xKSB7XG4gICAgdmFyIGNoYXJzZXQgPSBleHBvcnRzLmNoYXJzZXQobWltZSlcbiAgICBpZiAoY2hhcnNldCkgbWltZSArPSAnOyBjaGFyc2V0PScgKyBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIHJldHVybiBtaW1lXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgYSBNSU1FIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGV4dGVuc2lvbih0eXBlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBtZWRpYS10eXBlclxuICB2YXIgbWF0Y2ggPSBleHRyYWN0VHlwZVJlZ0V4cC5leGVjKHR5cGUpXG5cbiAgLy8gZ2V0IGV4dGVuc2lvbnNcbiAgdmFyIGV4dHMgPSBtYXRjaCAmJiBleHBvcnRzLmV4dGVuc2lvbnNbbWF0Y2hbMV0udG9Mb3dlckNhc2UoKV1cblxuICBpZiAoIWV4dHMgfHwgIWV4dHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXh0c1swXVxufVxuXG4vKipcbiAqIExvb2t1cCB0aGUgTUlNRSB0eXBlIGZvciBhIGZpbGUgcGF0aC9leHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGxvb2t1cChwYXRoKSB7XG4gIGlmICghcGF0aCB8fCB0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIGdldCB0aGUgZXh0ZW5zaW9uIChcImV4dFwiIG9yIFwiLmV4dFwiIG9yIGZ1bGwgcGF0aClcbiAgdmFyIGV4dGVuc2lvbiA9IGV4dG5hbWUoJ3guJyArIHBhdGgpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAuc3Vic3RyKDEpXG5cbiAgaWYgKCFleHRlbnNpb24pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLnR5cGVzW2V4dGVuc2lvbl0gfHwgZmFsc2Vcbn1cblxuLyoqXG4gKiBQb3B1bGF0ZSB0aGUgZXh0ZW5zaW9ucyBhbmQgdHlwZXMgbWFwcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcG9wdWxhdGVNYXBzKGV4dGVuc2lvbnMsIHR5cGVzKSB7XG4gIC8vIHNvdXJjZSBwcmVmZXJlbmNlIChsZWFzdCAtPiBtb3N0KVxuICB2YXIgcHJlZmVyZW5jZSA9IFsnbmdpbngnLCAnYXBhY2hlJywgdW5kZWZpbmVkLCAnaWFuYSddXG5cbiAgT2JqZWN0LmtleXMoZGIpLmZvckVhY2goZnVuY3Rpb24gZm9yRWFjaE1pbWVUeXBlKHR5cGUpIHtcbiAgICB2YXIgbWltZSA9IGRiW3R5cGVdXG4gICAgdmFyIGV4dHMgPSBtaW1lLmV4dGVuc2lvbnNcblxuICAgIGlmICghZXh0cyB8fCAhZXh0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIG1pbWUgLT4gZXh0ZW5zaW9uc1xuICAgIGV4dGVuc2lvbnNbdHlwZV0gPSBleHRzXG5cbiAgICAvLyBleHRlbnNpb24gLT4gbWltZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV4dGVuc2lvbiA9IGV4dHNbaV1cblxuICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0pIHtcbiAgICAgICAgdmFyIGZyb20gPSBwcmVmZXJlbmNlLmluZGV4T2YoZGJbdHlwZXNbZXh0ZW5zaW9uXV0uc291cmNlKVxuICAgICAgICB2YXIgdG8gPSBwcmVmZXJlbmNlLmluZGV4T2YobWltZS5zb3VyY2UpXG5cbiAgICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0gIT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgICAgICAgJiYgZnJvbSA+IHRvIHx8IChmcm9tID09PSB0byAmJiB0eXBlc1tleHRlbnNpb25dLnN1YnN0cigwLCAxMikgPT09ICdhcHBsaWNhdGlvbi8nKSkge1xuICAgICAgICAgIC8vIHNraXAgdGhlIHJlbWFwcGluZ1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc2V0IHRoZSBleHRlbnNpb24gLT4gbWltZVxuICAgICAgdHlwZXNbZXh0ZW5zaW9uXSA9IHR5cGVcbiAgICB9XG4gIH0pXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGFzc2VydDtcblxuZnVuY3Rpb24gYXNzZXJ0KHZhbCwgbXNnKSB7XG4gIGlmICghdmFsKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbn1cblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gYXNzZXJ0RXF1YWwobCwgciwgbXNnKSB7XG4gIGlmIChsICE9IHIpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAoJ0Fzc2VydGlvbiBmYWlsZWQ6ICcgKyBsICsgJyAhPSAnICsgcikpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gbWluaW1hdGNoXG5taW5pbWF0Y2guTWluaW1hdGNoID0gTWluaW1hdGNoXG5cbnZhciBwYXRoID0geyBzZXA6ICcvJyB9XG50cnkge1xuICBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG59IGNhdGNoIChlcikge31cblxudmFyIEdMT0JTVEFSID0gbWluaW1hdGNoLkdMT0JTVEFSID0gTWluaW1hdGNoLkdMT0JTVEFSID0ge31cbnZhciBleHBhbmQgPSByZXF1aXJlKCdicmFjZS1leHBhbnNpb24nKVxuXG4vLyBhbnkgc2luZ2xlIHRoaW5nIG90aGVyIHRoYW4gL1xuLy8gZG9uJ3QgbmVlZCB0byBlc2NhcGUgLyB3aGVuIHVzaW5nIG5ldyBSZWdFeHAoKVxudmFyIHFtYXJrID0gJ1teL10nXG5cbi8vICogPT4gYW55IG51bWJlciBvZiBjaGFyYWN0ZXJzXG52YXIgc3RhciA9IHFtYXJrICsgJyo/J1xuXG4vLyAqKiB3aGVuIGRvdHMgYXJlIGFsbG93ZWQuICBBbnl0aGluZyBnb2VzLCBleGNlcHQgLi4gYW5kIC5cbi8vIG5vdCAoXiBvciAvIGZvbGxvd2VkIGJ5IG9uZSBvciB0d28gZG90cyBmb2xsb3dlZCBieSAkIG9yIC8pLFxuLy8gZm9sbG93ZWQgYnkgYW55dGhpbmcsIGFueSBudW1iZXIgb2YgdGltZXMuXG52YXIgdHdvU3RhckRvdCA9ICcoPzooPyEoPzpcXFxcXFwvfF4pKD86XFxcXC57MSwyfSkoJHxcXFxcXFwvKSkuKSo/J1xuXG4vLyBub3QgYSBeIG9yIC8gZm9sbG93ZWQgYnkgYSBkb3QsXG4vLyBmb2xsb3dlZCBieSBhbnl0aGluZywgYW55IG51bWJlciBvZiB0aW1lcy5cbnZhciB0d29TdGFyTm9Eb3QgPSAnKD86KD8hKD86XFxcXFxcL3xeKVxcXFwuKS4pKj8nXG5cbi8vIGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIGVzY2FwZWQgaW4gUmVnRXhwLlxudmFyIHJlU3BlY2lhbHMgPSBjaGFyU2V0KCcoKS4qe30rP1tdXiRcXFxcIScpXG5cbi8vIFwiYWJjXCIgLT4geyBhOnRydWUsIGI6dHJ1ZSwgYzp0cnVlIH1cbmZ1bmN0aW9uIGNoYXJTZXQgKHMpIHtcbiAgcmV0dXJuIHMuc3BsaXQoJycpLnJlZHVjZShmdW5jdGlvbiAoc2V0LCBjKSB7XG4gICAgc2V0W2NdID0gdHJ1ZVxuICAgIHJldHVybiBzZXRcbiAgfSwge30pXG59XG5cbi8vIG5vcm1hbGl6ZXMgc2xhc2hlcy5cbnZhciBzbGFzaFNwbGl0ID0gL1xcLysvXG5cbm1pbmltYXRjaC5maWx0ZXIgPSBmaWx0ZXJcbmZ1bmN0aW9uIGZpbHRlciAocGF0dGVybiwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICByZXR1cm4gZnVuY3Rpb24gKHAsIGksIGxpc3QpIHtcbiAgICByZXR1cm4gbWluaW1hdGNoKHAsIHBhdHRlcm4sIG9wdGlvbnMpXG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0IChhLCBiKSB7XG4gIGEgPSBhIHx8IHt9XG4gIGIgPSBiIHx8IHt9XG4gIHZhciB0ID0ge31cbiAgT2JqZWN0LmtleXMoYikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgIHRba10gPSBiW2tdXG4gIH0pXG4gIE9iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICB0W2tdID0gYVtrXVxuICB9KVxuICByZXR1cm4gdFxufVxuXG5taW5pbWF0Y2guZGVmYXVsdHMgPSBmdW5jdGlvbiAoZGVmKSB7XG4gIGlmICghZGVmIHx8ICFPYmplY3Qua2V5cyhkZWYpLmxlbmd0aCkgcmV0dXJuIG1pbmltYXRjaFxuXG4gIHZhciBvcmlnID0gbWluaW1hdGNoXG5cbiAgdmFyIG0gPSBmdW5jdGlvbiBtaW5pbWF0Y2ggKHAsIHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3JpZy5taW5pbWF0Y2gocCwgcGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpXG4gIH1cblxuICBtLk1pbmltYXRjaCA9IGZ1bmN0aW9uIE1pbmltYXRjaCAocGF0dGVybiwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgb3JpZy5NaW5pbWF0Y2gocGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpXG4gIH1cblxuICByZXR1cm4gbVxufVxuXG5NaW5pbWF0Y2guZGVmYXVsdHMgPSBmdW5jdGlvbiAoZGVmKSB7XG4gIGlmICghZGVmIHx8ICFPYmplY3Qua2V5cyhkZWYpLmxlbmd0aCkgcmV0dXJuIE1pbmltYXRjaFxuICByZXR1cm4gbWluaW1hdGNoLmRlZmF1bHRzKGRlZikuTWluaW1hdGNoXG59XG5cbmZ1bmN0aW9uIG1pbmltYXRjaCAocCwgcGF0dGVybiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZ2xvYiBwYXR0ZXJuIHN0cmluZyByZXF1aXJlZCcpXG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fVxuXG4gIC8vIHNob3J0Y3V0OiBjb21tZW50cyBtYXRjaCBub3RoaW5nLlxuICBpZiAoIW9wdGlvbnMubm9jb21tZW50ICYmIHBhdHRlcm4uY2hhckF0KDApID09PSAnIycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFwiXCIgb25seSBtYXRjaGVzIFwiXCJcbiAgaWYgKHBhdHRlcm4udHJpbSgpID09PSAnJykgcmV0dXJuIHAgPT09ICcnXG5cbiAgcmV0dXJuIG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucykubWF0Y2gocClcbn1cblxuZnVuY3Rpb24gTWluaW1hdGNoIChwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBNaW5pbWF0Y2gpKSB7XG4gICAgcmV0dXJuIG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucylcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdnbG9iIHBhdHRlcm4gc3RyaW5nIHJlcXVpcmVkJylcbiAgfVxuXG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9XG4gIHBhdHRlcm4gPSBwYXR0ZXJuLnRyaW0oKVxuXG4gIC8vIHdpbmRvd3Mgc3VwcG9ydDogbmVlZCB0byB1c2UgLywgbm90IFxcXG4gIGlmIChwYXRoLnNlcCAhPT0gJy8nKSB7XG4gICAgcGF0dGVybiA9IHBhdHRlcm4uc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKVxuICB9XG5cbiAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICB0aGlzLnNldCA9IFtdXG4gIHRoaXMucGF0dGVybiA9IHBhdHRlcm5cbiAgdGhpcy5yZWdleHAgPSBudWxsXG4gIHRoaXMubmVnYXRlID0gZmFsc2VcbiAgdGhpcy5jb21tZW50ID0gZmFsc2VcbiAgdGhpcy5lbXB0eSA9IGZhbHNlXG5cbiAgLy8gbWFrZSB0aGUgc2V0IG9mIHJlZ2V4cHMgZXRjLlxuICB0aGlzLm1ha2UoKVxufVxuXG5NaW5pbWF0Y2gucHJvdG90eXBlLmRlYnVnID0gZnVuY3Rpb24gKCkge31cblxuTWluaW1hdGNoLnByb3RvdHlwZS5tYWtlID0gbWFrZVxuZnVuY3Rpb24gbWFrZSAoKSB7XG4gIC8vIGRvbid0IGRvIGl0IG1vcmUgdGhhbiBvbmNlLlxuICBpZiAodGhpcy5fbWFkZSkgcmV0dXJuXG5cbiAgdmFyIHBhdHRlcm4gPSB0aGlzLnBhdHRlcm5cbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcblxuICAvLyBlbXB0eSBwYXR0ZXJucyBhbmQgY29tbWVudHMgbWF0Y2ggbm90aGluZy5cbiAgaWYgKCFvcHRpb25zLm5vY29tbWVudCAmJiBwYXR0ZXJuLmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgdGhpcy5jb21tZW50ID0gdHJ1ZVxuICAgIHJldHVyblxuICB9XG4gIGlmICghcGF0dGVybikge1xuICAgIHRoaXMuZW1wdHkgPSB0cnVlXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBzdGVwIDE6IGZpZ3VyZSBvdXQgbmVnYXRpb24sIGV0Yy5cbiAgdGhpcy5wYXJzZU5lZ2F0ZSgpXG5cbiAgLy8gc3RlcCAyOiBleHBhbmQgYnJhY2VzXG4gIHZhciBzZXQgPSB0aGlzLmdsb2JTZXQgPSB0aGlzLmJyYWNlRXhwYW5kKClcblxuICBpZiAob3B0aW9ucy5kZWJ1ZykgdGhpcy5kZWJ1ZyA9IGNvbnNvbGUuZXJyb3JcblxuICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgc2V0KVxuXG4gIC8vIHN0ZXAgMzogbm93IHdlIGhhdmUgYSBzZXQsIHNvIHR1cm4gZWFjaCBvbmUgaW50byBhIHNlcmllcyBvZiBwYXRoLXBvcnRpb25cbiAgLy8gbWF0Y2hpbmcgcGF0dGVybnMuXG4gIC8vIFRoZXNlIHdpbGwgYmUgcmVnZXhwcywgZXhjZXB0IGluIHRoZSBjYXNlIG9mIFwiKipcIiwgd2hpY2ggaXNcbiAgLy8gc2V0IHRvIHRoZSBHTE9CU1RBUiBvYmplY3QgZm9yIGdsb2JzdGFyIGJlaGF2aW9yLFxuICAvLyBhbmQgd2lsbCBub3QgY29udGFpbiBhbnkgLyBjaGFyYWN0ZXJzXG4gIHNldCA9IHRoaXMuZ2xvYlBhcnRzID0gc2V0Lm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzLnNwbGl0KHNsYXNoU3BsaXQpXG4gIH0pXG5cbiAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHNldClcblxuICAvLyBnbG9iIC0tPiByZWdleHBzXG4gIHNldCA9IHNldC5tYXAoZnVuY3Rpb24gKHMsIHNpLCBzZXQpIHtcbiAgICByZXR1cm4gcy5tYXAodGhpcy5wYXJzZSwgdGhpcylcbiAgfSwgdGhpcylcblxuICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgc2V0KVxuXG4gIC8vIGZpbHRlciBvdXQgZXZlcnl0aGluZyB0aGF0IGRpZG4ndCBjb21waWxlIHByb3Blcmx5LlxuICBzZXQgPSBzZXQuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMuaW5kZXhPZihmYWxzZSkgPT09IC0xXG4gIH0pXG5cbiAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHNldClcblxuICB0aGlzLnNldCA9IHNldFxufVxuXG5NaW5pbWF0Y2gucHJvdG90eXBlLnBhcnNlTmVnYXRlID0gcGFyc2VOZWdhdGVcbmZ1bmN0aW9uIHBhcnNlTmVnYXRlICgpIHtcbiAgdmFyIHBhdHRlcm4gPSB0aGlzLnBhdHRlcm5cbiAgdmFyIG5lZ2F0ZSA9IGZhbHNlXG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zXG4gIHZhciBuZWdhdGVPZmZzZXQgPSAwXG5cbiAgaWYgKG9wdGlvbnMubm9uZWdhdGUpIHJldHVyblxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcGF0dGVybi5sZW5ndGhcbiAgICA7IGkgPCBsICYmIHBhdHRlcm4uY2hhckF0KGkpID09PSAnISdcbiAgICA7IGkrKykge1xuICAgIG5lZ2F0ZSA9ICFuZWdhdGVcbiAgICBuZWdhdGVPZmZzZXQrK1xuICB9XG5cbiAgaWYgKG5lZ2F0ZU9mZnNldCkgdGhpcy5wYXR0ZXJuID0gcGF0dGVybi5zdWJzdHIobmVnYXRlT2Zmc2V0KVxuICB0aGlzLm5lZ2F0ZSA9IG5lZ2F0ZVxufVxuXG4vLyBCcmFjZSBleHBhbnNpb246XG4vLyBhe2IsY31kIC0+IGFiZCBhY2Rcbi8vIGF7Yix9YyAtPiBhYmMgYWNcbi8vIGF7MC4uM31kIC0+IGEwZCBhMWQgYTJkIGEzZFxuLy8gYXtiLGN7ZCxlfWZ9ZyAtPiBhYmcgYWNkZmcgYWNlZmdcbi8vIGF7YixjfWR7ZSxmfWcgLT4gYWJkZWcgYWNkZWcgYWJkZWcgYWJkZmdcbi8vXG4vLyBJbnZhbGlkIHNldHMgYXJlIG5vdCBleHBhbmRlZC5cbi8vIGF7Mi4ufWIgLT4gYXsyLi59YlxuLy8gYXtifWMgLT4gYXtifWNcbm1pbmltYXRjaC5icmFjZUV4cGFuZCA9IGZ1bmN0aW9uIChwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIHJldHVybiBicmFjZUV4cGFuZChwYXR0ZXJuLCBvcHRpb25zKVxufVxuXG5NaW5pbWF0Y2gucHJvdG90eXBlLmJyYWNlRXhwYW5kID0gYnJhY2VFeHBhbmRcblxuZnVuY3Rpb24gYnJhY2VFeHBhbmQgKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNaW5pbWF0Y2gpIHtcbiAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IHt9XG4gICAgfVxuICB9XG5cbiAgcGF0dGVybiA9IHR5cGVvZiBwYXR0ZXJuID09PSAndW5kZWZpbmVkJ1xuICAgID8gdGhpcy5wYXR0ZXJuIDogcGF0dGVyblxuXG4gIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZGVmaW5lZCBwYXR0ZXJuJylcbiAgfVxuXG4gIGlmIChvcHRpb25zLm5vYnJhY2UgfHxcbiAgICAhcGF0dGVybi5tYXRjaCgvXFx7LipcXH0vKSkge1xuICAgIC8vIHNob3J0Y3V0LiBubyBuZWVkIHRvIGV4cGFuZC5cbiAgICByZXR1cm4gW3BhdHRlcm5dXG4gIH1cblxuICByZXR1cm4gZXhwYW5kKHBhdHRlcm4pXG59XG5cbi8vIHBhcnNlIGEgY29tcG9uZW50IG9mIHRoZSBleHBhbmRlZCBzZXQuXG4vLyBBdCB0aGlzIHBvaW50LCBubyBwYXR0ZXJuIG1heSBjb250YWluIFwiL1wiIGluIGl0XG4vLyBzbyB3ZSdyZSBnb2luZyB0byByZXR1cm4gYSAyZCBhcnJheSwgd2hlcmUgZWFjaCBlbnRyeSBpcyB0aGUgZnVsbFxuLy8gcGF0dGVybiwgc3BsaXQgb24gJy8nLCBhbmQgdGhlbiB0dXJuZWQgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbi8vIEEgcmVnZXhwIGlzIG1hZGUgYXQgdGhlIGVuZCB3aGljaCBqb2lucyBlYWNoIGFycmF5IHdpdGggYW5cbi8vIGVzY2FwZWQgLywgYW5kIGFub3RoZXIgZnVsbCBvbmUgd2hpY2ggam9pbnMgZWFjaCByZWdleHAgd2l0aCB8LlxuLy9cbi8vIEZvbGxvd2luZyB0aGUgbGVhZCBvZiBCYXNoIDQuMSwgbm90ZSB0aGF0IFwiKipcIiBvbmx5IGhhcyBzcGVjaWFsIG1lYW5pbmdcbi8vIHdoZW4gaXQgaXMgdGhlICpvbmx5KiB0aGluZyBpbiBhIHBhdGggcG9ydGlvbi4gIE90aGVyd2lzZSwgYW55IHNlcmllc1xuLy8gb2YgKiBpcyBlcXVpdmFsZW50IHRvIGEgc2luZ2xlICouICBHbG9ic3RhciBiZWhhdmlvciBpcyBlbmFibGVkIGJ5XG4vLyBkZWZhdWx0LCBhbmQgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgb3B0aW9ucy5ub2dsb2JzdGFyLlxuTWluaW1hdGNoLnByb3RvdHlwZS5wYXJzZSA9IHBhcnNlXG52YXIgU1VCUEFSU0UgPSB7fVxuZnVuY3Rpb24gcGFyc2UgKHBhdHRlcm4sIGlzU3ViKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgLy8gc2hvcnRjdXRzXG4gIGlmICghb3B0aW9ucy5ub2dsb2JzdGFyICYmIHBhdHRlcm4gPT09ICcqKicpIHJldHVybiBHTE9CU1RBUlxuICBpZiAocGF0dGVybiA9PT0gJycpIHJldHVybiAnJ1xuXG4gIHZhciByZSA9ICcnXG4gIHZhciBoYXNNYWdpYyA9ICEhb3B0aW9ucy5ub2Nhc2VcbiAgdmFyIGVzY2FwaW5nID0gZmFsc2VcbiAgLy8gPyA9PiBvbmUgc2luZ2xlIGNoYXJhY3RlclxuICB2YXIgcGF0dGVybkxpc3RTdGFjayA9IFtdXG4gIHZhciBuZWdhdGl2ZUxpc3RzID0gW11cbiAgdmFyIHBsVHlwZVxuICB2YXIgc3RhdGVDaGFyXG4gIHZhciBpbkNsYXNzID0gZmFsc2VcbiAgdmFyIHJlQ2xhc3NTdGFydCA9IC0xXG4gIHZhciBjbGFzc1N0YXJ0ID0gLTFcbiAgLy8gLiBhbmQgLi4gbmV2ZXIgbWF0Y2ggYW55dGhpbmcgdGhhdCBkb2Vzbid0IHN0YXJ0IHdpdGggLixcbiAgLy8gZXZlbiB3aGVuIG9wdGlvbnMuZG90IGlzIHNldC5cbiAgdmFyIHBhdHRlcm5TdGFydCA9IHBhdHRlcm4uY2hhckF0KDApID09PSAnLicgPyAnJyAvLyBhbnl0aGluZ1xuICAvLyBub3QgKHN0YXJ0IG9yIC8gZm9sbG93ZWQgYnkgLiBvciAuLiBmb2xsb3dlZCBieSAvIG9yIGVuZClcbiAgOiBvcHRpb25zLmRvdCA/ICcoPyEoPzpefFxcXFxcXC8pXFxcXC57MSwyfSg/OiR8XFxcXFxcLykpJ1xuICA6ICcoPyFcXFxcLiknXG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGZ1bmN0aW9uIGNsZWFyU3RhdGVDaGFyICgpIHtcbiAgICBpZiAoc3RhdGVDaGFyKSB7XG4gICAgICAvLyB3ZSBoYWQgc29tZSBzdGF0ZS10cmFja2luZyBjaGFyYWN0ZXJcbiAgICAgIC8vIHRoYXQgd2Fzbid0IGNvbnN1bWVkIGJ5IHRoaXMgcGFzcy5cbiAgICAgIHN3aXRjaCAoc3RhdGVDaGFyKSB7XG4gICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgIHJlICs9IHN0YXJcbiAgICAgICAgICBoYXNNYWdpYyA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnPyc6XG4gICAgICAgICAgcmUgKz0gcW1hcmtcbiAgICAgICAgICBoYXNNYWdpYyA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZSArPSAnXFxcXCcgKyBzdGF0ZUNoYXJcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHNlbGYuZGVidWcoJ2NsZWFyU3RhdGVDaGFyICVqICVqJywgc3RhdGVDaGFyLCByZSlcbiAgICAgIHN0YXRlQ2hhciA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhdHRlcm4ubGVuZ3RoLCBjXG4gICAgOyAoaSA8IGxlbikgJiYgKGMgPSBwYXR0ZXJuLmNoYXJBdChpKSlcbiAgICA7IGkrKykge1xuICAgIHRoaXMuZGVidWcoJyVzXFx0JXMgJXMgJWonLCBwYXR0ZXJuLCBpLCByZSwgYylcblxuICAgIC8vIHNraXAgb3ZlciBhbnkgdGhhdCBhcmUgZXNjYXBlZC5cbiAgICBpZiAoZXNjYXBpbmcgJiYgcmVTcGVjaWFsc1tjXSkge1xuICAgICAgcmUgKz0gJ1xcXFwnICsgY1xuICAgICAgZXNjYXBpbmcgPSBmYWxzZVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGMpIHtcbiAgICAgIGNhc2UgJy8nOlxuICAgICAgICAvLyBjb21wbGV0ZWx5IG5vdCBhbGxvd2VkLCBldmVuIGVzY2FwZWQuXG4gICAgICAgIC8vIFNob3VsZCBhbHJlYWR5IGJlIHBhdGgtc3BsaXQgYnkgbm93LlxuICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgY2FzZSAnXFxcXCc6XG4gICAgICAgIGNsZWFyU3RhdGVDaGFyKClcbiAgICAgICAgZXNjYXBpbmcgPSB0cnVlXG4gICAgICBjb250aW51ZVxuXG4gICAgICAvLyB0aGUgdmFyaW91cyBzdGF0ZUNoYXIgdmFsdWVzXG4gICAgICAvLyBmb3IgdGhlIFwiZXh0Z2xvYlwiIHN0dWZmLlxuICAgICAgY2FzZSAnPyc6XG4gICAgICBjYXNlICcqJzpcbiAgICAgIGNhc2UgJysnOlxuICAgICAgY2FzZSAnQCc6XG4gICAgICBjYXNlICchJzpcbiAgICAgICAgdGhpcy5kZWJ1ZygnJXNcXHQlcyAlcyAlaiA8LS0gc3RhdGVDaGFyJywgcGF0dGVybiwgaSwgcmUsIGMpXG5cbiAgICAgICAgLy8gYWxsIG9mIHRob3NlIGFyZSBsaXRlcmFscyBpbnNpZGUgYSBjbGFzcywgZXhjZXB0IHRoYXRcbiAgICAgICAgLy8gdGhlIGdsb2IgWyFhXSBtZWFucyBbXmFdIGluIHJlZ2V4cFxuICAgICAgICBpZiAoaW5DbGFzcykge1xuICAgICAgICAgIHRoaXMuZGVidWcoJyAgaW4gY2xhc3MnKVxuICAgICAgICAgIGlmIChjID09PSAnIScgJiYgaSA9PT0gY2xhc3NTdGFydCArIDEpIGMgPSAnXidcbiAgICAgICAgICByZSArPSBjXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHN0YXRlQ2hhciwgdGhlbiBpdCBtZWFuc1xuICAgICAgICAvLyB0aGF0IHRoZXJlIHdhcyBzb21ldGhpbmcgbGlrZSAqKiBvciArPyBpbiB0aGVyZS5cbiAgICAgICAgLy8gSGFuZGxlIHRoZSBzdGF0ZUNoYXIsIHRoZW4gcHJvY2VlZCB3aXRoIHRoaXMgb25lLlxuICAgICAgICBzZWxmLmRlYnVnKCdjYWxsIGNsZWFyU3RhdGVDaGFyICVqJywgc3RhdGVDaGFyKVxuICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG4gICAgICAgIHN0YXRlQ2hhciA9IGNcbiAgICAgICAgLy8gaWYgZXh0Z2xvYiBpcyBkaXNhYmxlZCwgdGhlbiArKGFzZGZ8Zm9vKSBpc24ndCBhIHRoaW5nLlxuICAgICAgICAvLyBqdXN0IGNsZWFyIHRoZSBzdGF0ZWNoYXIgKm5vdyosIHJhdGhlciB0aGFuIGV2ZW4gZGl2aW5nIGludG9cbiAgICAgICAgLy8gdGhlIHBhdHRlcm5MaXN0IHN0dWZmLlxuICAgICAgICBpZiAob3B0aW9ucy5ub2V4dCkgY2xlYXJTdGF0ZUNoYXIoKVxuICAgICAgY29udGludWVcblxuICAgICAgY2FzZSAnKCc6XG4gICAgICAgIGlmIChpbkNsYXNzKSB7XG4gICAgICAgICAgcmUgKz0gJygnXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3RhdGVDaGFyKSB7XG4gICAgICAgICAgcmUgKz0gJ1xcXFwoJ1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBwbFR5cGUgPSBzdGF0ZUNoYXJcbiAgICAgICAgcGF0dGVybkxpc3RTdGFjay5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBwbFR5cGUsXG4gICAgICAgICAgc3RhcnQ6IGkgLSAxLFxuICAgICAgICAgIHJlU3RhcnQ6IHJlLmxlbmd0aFxuICAgICAgICB9KVxuICAgICAgICAvLyBuZWdhdGlvbiBpcyAoPzooPyFqcylbXi9dKilcbiAgICAgICAgcmUgKz0gc3RhdGVDaGFyID09PSAnIScgPyAnKD86KD8hKD86JyA6ICcoPzonXG4gICAgICAgIHRoaXMuZGVidWcoJ3BsVHlwZSAlaiAlaicsIHN0YXRlQ2hhciwgcmUpXG4gICAgICAgIHN0YXRlQ2hhciA9IGZhbHNlXG4gICAgICBjb250aW51ZVxuXG4gICAgICBjYXNlICcpJzpcbiAgICAgICAgaWYgKGluQ2xhc3MgfHwgIXBhdHRlcm5MaXN0U3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgcmUgKz0gJ1xcXFwpJ1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG4gICAgICAgIGhhc01hZ2ljID0gdHJ1ZVxuICAgICAgICByZSArPSAnKSdcbiAgICAgICAgdmFyIHBsID0gcGF0dGVybkxpc3RTdGFjay5wb3AoKVxuICAgICAgICBwbFR5cGUgPSBwbC50eXBlXG4gICAgICAgIC8vIG5lZ2F0aW9uIGlzICg/Oig/IWpzKVteL10qKVxuICAgICAgICAvLyBUaGUgb3RoZXJzIGFyZSAoPzo8cGF0dGVybj4pPHR5cGU+XG4gICAgICAgIHN3aXRjaCAocGxUeXBlKSB7XG4gICAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICBuZWdhdGl2ZUxpc3RzLnB1c2gocGwpXG4gICAgICAgICAgICByZSArPSAnKVteL10qPyknXG4gICAgICAgICAgICBwbC5yZUVuZCA9IHJlLmxlbmd0aFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICc/JzpcbiAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgIHJlICs9IHBsVHlwZVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdAJzogYnJlYWsgLy8gdGhlIGRlZmF1bHQgYW55d2F5XG4gICAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG5cbiAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBpZiAoaW5DbGFzcyB8fCAhcGF0dGVybkxpc3RTdGFjay5sZW5ndGggfHwgZXNjYXBpbmcpIHtcbiAgICAgICAgICByZSArPSAnXFxcXHwnXG4gICAgICAgICAgZXNjYXBpbmcgPSBmYWxzZVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG4gICAgICAgIHJlICs9ICd8J1xuICAgICAgY29udGludWVcblxuICAgICAgLy8gdGhlc2UgYXJlIG1vc3RseSB0aGUgc2FtZSBpbiByZWdleHAgYW5kIGdsb2JcbiAgICAgIGNhc2UgJ1snOlxuICAgICAgICAvLyBzd2FsbG93IGFueSBzdGF0ZS10cmFja2luZyBjaGFyIGJlZm9yZSB0aGUgW1xuICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG5cbiAgICAgICAgaWYgKGluQ2xhc3MpIHtcbiAgICAgICAgICByZSArPSAnXFxcXCcgKyBjXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGluQ2xhc3MgPSB0cnVlXG4gICAgICAgIGNsYXNzU3RhcnQgPSBpXG4gICAgICAgIHJlQ2xhc3NTdGFydCA9IHJlLmxlbmd0aFxuICAgICAgICByZSArPSBjXG4gICAgICBjb250aW51ZVxuXG4gICAgICBjYXNlICddJzpcbiAgICAgICAgLy8gIGEgcmlnaHQgYnJhY2tldCBzaGFsbCBsb3NlIGl0cyBzcGVjaWFsXG4gICAgICAgIC8vICBtZWFuaW5nIGFuZCByZXByZXNlbnQgaXRzZWxmIGluXG4gICAgICAgIC8vICBhIGJyYWNrZXQgZXhwcmVzc2lvbiBpZiBpdCBvY2N1cnNcbiAgICAgICAgLy8gIGZpcnN0IGluIHRoZSBsaXN0LiAgLS0gUE9TSVguMiAyLjguMy4yXG4gICAgICAgIGlmIChpID09PSBjbGFzc1N0YXJ0ICsgMSB8fCAhaW5DbGFzcykge1xuICAgICAgICAgIHJlICs9ICdcXFxcJyArIGNcbiAgICAgICAgICBlc2NhcGluZyA9IGZhbHNlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBsZWZ0IGEgY2xhc3Mgb3Blbi5cbiAgICAgICAgLy8gXCJbei1hXVwiIGlzIHZhbGlkLCBlcXVpdmFsZW50IHRvIFwiXFxbei1hXFxdXCJcbiAgICAgICAgaWYgKGluQ2xhc3MpIHtcbiAgICAgICAgICAvLyBzcGxpdCB3aGVyZSB0aGUgbGFzdCBbIHdhcywgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmVcbiAgICAgICAgICAvLyBhbiBpbnZhbGlkIHJlLiBpZiBzbywgcmUtd2FsayB0aGUgY29udGVudHMgb2YgdGhlXG4gICAgICAgICAgLy8gd291bGQtYmUgY2xhc3MgdG8gcmUtdHJhbnNsYXRlIGFueSBjaGFyYWN0ZXJzIHRoYXRcbiAgICAgICAgICAvLyB3ZXJlIHBhc3NlZCB0aHJvdWdoIGFzLWlzXG4gICAgICAgICAgLy8gVE9ETzogSXQgd291bGQgcHJvYmFibHkgYmUgZmFzdGVyIHRvIGRldGVybWluZSB0aGlzXG4gICAgICAgICAgLy8gd2l0aG91dCBhIHRyeS9jYXRjaCBhbmQgYSBuZXcgUmVnRXhwLCBidXQgaXQncyB0cmlja3lcbiAgICAgICAgICAvLyB0byBkbyBzYWZlbHkuICBGb3Igbm93LCB0aGlzIGlzIHNhZmUgYW5kIHdvcmtzLlxuICAgICAgICAgIHZhciBjcyA9IHBhdHRlcm4uc3Vic3RyaW5nKGNsYXNzU3RhcnQgKyAxLCBpKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBSZWdFeHAoJ1snICsgY3MgKyAnXScpXG4gICAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIC8vIG5vdCBhIHZhbGlkIGNsYXNzIVxuICAgICAgICAgICAgdmFyIHNwID0gdGhpcy5wYXJzZShjcywgU1VCUEFSU0UpXG4gICAgICAgICAgICByZSA9IHJlLnN1YnN0cigwLCByZUNsYXNzU3RhcnQpICsgJ1xcXFxbJyArIHNwWzBdICsgJ1xcXFxdJ1xuICAgICAgICAgICAgaGFzTWFnaWMgPSBoYXNNYWdpYyB8fCBzcFsxXVxuICAgICAgICAgICAgaW5DbGFzcyA9IGZhbHNlXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmlzaCB1cCB0aGUgY2xhc3MuXG4gICAgICAgIGhhc01hZ2ljID0gdHJ1ZVxuICAgICAgICBpbkNsYXNzID0gZmFsc2VcbiAgICAgICAgcmUgKz0gY1xuICAgICAgY29udGludWVcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gc3dhbGxvdyBhbnkgc3RhdGUgY2hhciB0aGF0IHdhc24ndCBjb25zdW1lZFxuICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG5cbiAgICAgICAgaWYgKGVzY2FwaW5nKSB7XG4gICAgICAgICAgLy8gbm8gbmVlZFxuICAgICAgICAgIGVzY2FwaW5nID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIGlmIChyZVNwZWNpYWxzW2NdXG4gICAgICAgICAgJiYgIShjID09PSAnXicgJiYgaW5DbGFzcykpIHtcbiAgICAgICAgICByZSArPSAnXFxcXCdcbiAgICAgICAgfVxuXG4gICAgICAgIHJlICs9IGNcblxuICAgIH0gLy8gc3dpdGNoXG4gIH0gLy8gZm9yXG5cbiAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGxlZnQgYSBjbGFzcyBvcGVuLlxuICAvLyBcIlthYmNcIiBpcyB2YWxpZCwgZXF1aXZhbGVudCB0byBcIlxcW2FiY1wiXG4gIGlmIChpbkNsYXNzKSB7XG4gICAgLy8gc3BsaXQgd2hlcmUgdGhlIGxhc3QgWyB3YXMsIGFuZCBlc2NhcGUgaXRcbiAgICAvLyB0aGlzIGlzIGEgaHVnZSBwaXRhLiAgV2Ugbm93IGhhdmUgdG8gcmUtd2Fsa1xuICAgIC8vIHRoZSBjb250ZW50cyBvZiB0aGUgd291bGQtYmUgY2xhc3MgdG8gcmUtdHJhbnNsYXRlXG4gICAgLy8gYW55IGNoYXJhY3RlcnMgdGhhdCB3ZXJlIHBhc3NlZCB0aHJvdWdoIGFzLWlzXG4gICAgY3MgPSBwYXR0ZXJuLnN1YnN0cihjbGFzc1N0YXJ0ICsgMSlcbiAgICBzcCA9IHRoaXMucGFyc2UoY3MsIFNVQlBBUlNFKVxuICAgIHJlID0gcmUuc3Vic3RyKDAsIHJlQ2xhc3NTdGFydCkgKyAnXFxcXFsnICsgc3BbMF1cbiAgICBoYXNNYWdpYyA9IGhhc01hZ2ljIHx8IHNwWzFdXG4gIH1cblxuICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgaGFkIGEgKyggdGhpbmcgYXQgdGhlICplbmQqXG4gIC8vIG9mIHRoZSBwYXR0ZXJuLlxuICAvLyBlYWNoIHBhdHRlcm4gbGlzdCBzdGFjayBhZGRzIDMgY2hhcnMsIGFuZCB3ZSBuZWVkIHRvIGdvIHRocm91Z2hcbiAgLy8gYW5kIGVzY2FwZSBhbnkgfCBjaGFycyB0aGF0IHdlcmUgcGFzc2VkIHRocm91Z2ggYXMtaXMgZm9yIHRoZSByZWdleHAuXG4gIC8vIEdvIHRocm91Z2ggYW5kIGVzY2FwZSB0aGVtLCB0YWtpbmcgY2FyZSBub3QgdG8gZG91YmxlLWVzY2FwZSBhbnlcbiAgLy8gfCBjaGFycyB0aGF0IHdlcmUgYWxyZWFkeSBlc2NhcGVkLlxuICBmb3IgKHBsID0gcGF0dGVybkxpc3RTdGFjay5wb3AoKTsgcGw7IHBsID0gcGF0dGVybkxpc3RTdGFjay5wb3AoKSkge1xuICAgIHZhciB0YWlsID0gcmUuc2xpY2UocGwucmVTdGFydCArIDMpXG4gICAgLy8gbWF5YmUgc29tZSBldmVuIG51bWJlciBvZiBcXCwgdGhlbiBtYXliZSAxIFxcLCBmb2xsb3dlZCBieSBhIHxcbiAgICB0YWlsID0gdGFpbC5yZXBsYWNlKC8oKD86XFxcXHsyfSkqKShcXFxcPylcXHwvZywgZnVuY3Rpb24gKF8sICQxLCAkMikge1xuICAgICAgaWYgKCEkMikge1xuICAgICAgICAvLyB0aGUgfCBpc24ndCBhbHJlYWR5IGVzY2FwZWQsIHNvIGVzY2FwZSBpdC5cbiAgICAgICAgJDIgPSAnXFxcXCdcbiAgICAgIH1cblxuICAgICAgLy8gbmVlZCB0byBlc2NhcGUgYWxsIHRob3NlIHNsYXNoZXMgKmFnYWluKiwgd2l0aG91dCBlc2NhcGluZyB0aGVcbiAgICAgIC8vIG9uZSB0aGF0IHdlIG5lZWQgZm9yIGVzY2FwaW5nIHRoZSB8IGNoYXJhY3Rlci4gIEFzIGl0IHdvcmtzIG91dCxcbiAgICAgIC8vIGVzY2FwaW5nIGFuIGV2ZW4gbnVtYmVyIG9mIHNsYXNoZXMgY2FuIGJlIGRvbmUgYnkgc2ltcGx5IHJlcGVhdGluZ1xuICAgICAgLy8gaXQgZXhhY3RseSBhZnRlciBpdHNlbGYuICBUaGF0J3Mgd2h5IHRoaXMgdHJpY2sgd29ya3MuXG4gICAgICAvL1xuICAgICAgLy8gSSBhbSBzb3JyeSB0aGF0IHlvdSBoYXZlIHRvIHNlZSB0aGlzLlxuICAgICAgcmV0dXJuICQxICsgJDEgKyAkMiArICd8J1xuICAgIH0pXG5cbiAgICB0aGlzLmRlYnVnKCd0YWlsPSVqXFxuICAgJXMnLCB0YWlsLCB0YWlsKVxuICAgIHZhciB0ID0gcGwudHlwZSA9PT0gJyonID8gc3RhclxuICAgICAgOiBwbC50eXBlID09PSAnPycgPyBxbWFya1xuICAgICAgOiAnXFxcXCcgKyBwbC50eXBlXG5cbiAgICBoYXNNYWdpYyA9IHRydWVcbiAgICByZSA9IHJlLnNsaWNlKDAsIHBsLnJlU3RhcnQpICsgdCArICdcXFxcKCcgKyB0YWlsXG4gIH1cblxuICAvLyBoYW5kbGUgdHJhaWxpbmcgdGhpbmdzIHRoYXQgb25seSBtYXR0ZXIgYXQgdGhlIHZlcnkgZW5kLlxuICBjbGVhclN0YXRlQ2hhcigpXG4gIGlmIChlc2NhcGluZykge1xuICAgIC8vIHRyYWlsaW5nIFxcXFxcbiAgICByZSArPSAnXFxcXFxcXFwnXG4gIH1cblxuICAvLyBvbmx5IG5lZWQgdG8gYXBwbHkgdGhlIG5vZG90IHN0YXJ0IGlmIHRoZSByZSBzdGFydHMgd2l0aFxuICAvLyBzb21ldGhpbmcgdGhhdCBjb3VsZCBjb25jZWl2YWJseSBjYXB0dXJlIGEgZG90XG4gIHZhciBhZGRQYXR0ZXJuU3RhcnQgPSBmYWxzZVxuICBzd2l0Y2ggKHJlLmNoYXJBdCgwKSkge1xuICAgIGNhc2UgJy4nOlxuICAgIGNhc2UgJ1snOlxuICAgIGNhc2UgJygnOiBhZGRQYXR0ZXJuU3RhcnQgPSB0cnVlXG4gIH1cblxuICAvLyBIYWNrIHRvIHdvcmsgYXJvdW5kIGxhY2sgb2YgbmVnYXRpdmUgbG9va2JlaGluZCBpbiBKU1xuICAvLyBBIHBhdHRlcm4gbGlrZTogKi4hKHgpLiEoeXx6KSBuZWVkcyB0byBlbnN1cmUgdGhhdCBhIG5hbWVcbiAgLy8gbGlrZSAnYS54eXoueXonIGRvZXNuJ3QgbWF0Y2guICBTbywgdGhlIGZpcnN0IG5lZ2F0aXZlXG4gIC8vIGxvb2thaGVhZCwgaGFzIHRvIGxvb2sgQUxMIHRoZSB3YXkgYWhlYWQsIHRvIHRoZSBlbmQgb2ZcbiAgLy8gdGhlIHBhdHRlcm4uXG4gIGZvciAodmFyIG4gPSBuZWdhdGl2ZUxpc3RzLmxlbmd0aCAtIDE7IG4gPiAtMTsgbi0tKSB7XG4gICAgdmFyIG5sID0gbmVnYXRpdmVMaXN0c1tuXVxuXG4gICAgdmFyIG5sQmVmb3JlID0gcmUuc2xpY2UoMCwgbmwucmVTdGFydClcbiAgICB2YXIgbmxGaXJzdCA9IHJlLnNsaWNlKG5sLnJlU3RhcnQsIG5sLnJlRW5kIC0gOClcbiAgICB2YXIgbmxMYXN0ID0gcmUuc2xpY2UobmwucmVFbmQgLSA4LCBubC5yZUVuZClcbiAgICB2YXIgbmxBZnRlciA9IHJlLnNsaWNlKG5sLnJlRW5kKVxuXG4gICAgbmxMYXN0ICs9IG5sQWZ0ZXJcblxuICAgIC8vIEhhbmRsZSBuZXN0ZWQgc3R1ZmYgbGlrZSAqKCouanN8ISgqLmpzb24pKSwgd2hlcmUgb3BlbiBwYXJlbnNcbiAgICAvLyBtZWFuIHRoYXQgd2Ugc2hvdWxkICpub3QqIGluY2x1ZGUgdGhlICkgaW4gdGhlIGJpdCB0aGF0IGlzIGNvbnNpZGVyZWRcbiAgICAvLyBcImFmdGVyXCIgdGhlIG5lZ2F0ZWQgc2VjdGlvbi5cbiAgICB2YXIgb3BlblBhcmVuc0JlZm9yZSA9IG5sQmVmb3JlLnNwbGl0KCcoJykubGVuZ3RoIC0gMVxuICAgIHZhciBjbGVhbkFmdGVyID0gbmxBZnRlclxuICAgIGZvciAoaSA9IDA7IGkgPCBvcGVuUGFyZW5zQmVmb3JlOyBpKyspIHtcbiAgICAgIGNsZWFuQWZ0ZXIgPSBjbGVhbkFmdGVyLnJlcGxhY2UoL1xcKVsrKj9dPy8sICcnKVxuICAgIH1cbiAgICBubEFmdGVyID0gY2xlYW5BZnRlclxuXG4gICAgdmFyIGRvbGxhciA9ICcnXG4gICAgaWYgKG5sQWZ0ZXIgPT09ICcnICYmIGlzU3ViICE9PSBTVUJQQVJTRSkge1xuICAgICAgZG9sbGFyID0gJyQnXG4gICAgfVxuICAgIHZhciBuZXdSZSA9IG5sQmVmb3JlICsgbmxGaXJzdCArIG5sQWZ0ZXIgKyBkb2xsYXIgKyBubExhc3RcbiAgICByZSA9IG5ld1JlXG4gIH1cblxuICAvLyBpZiB0aGUgcmUgaXMgbm90IFwiXCIgYXQgdGhpcyBwb2ludCwgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZVxuICAvLyBpdCBkb2Vzbid0IG1hdGNoIGFnYWluc3QgYW4gZW1wdHkgcGF0aCBwYXJ0LlxuICAvLyBPdGhlcndpc2UgYS8qIHdpbGwgbWF0Y2ggYS8sIHdoaWNoIGl0IHNob3VsZCBub3QuXG4gIGlmIChyZSAhPT0gJycgJiYgaGFzTWFnaWMpIHtcbiAgICByZSA9ICcoPz0uKScgKyByZVxuICB9XG5cbiAgaWYgKGFkZFBhdHRlcm5TdGFydCkge1xuICAgIHJlID0gcGF0dGVyblN0YXJ0ICsgcmVcbiAgfVxuXG4gIC8vIHBhcnNpbmcganVzdCBhIHBpZWNlIG9mIGEgbGFyZ2VyIHBhdHRlcm4uXG4gIGlmIChpc1N1YiA9PT0gU1VCUEFSU0UpIHtcbiAgICByZXR1cm4gW3JlLCBoYXNNYWdpY11cbiAgfVxuXG4gIC8vIHNraXAgdGhlIHJlZ2V4cCBmb3Igbm9uLW1hZ2ljYWwgcGF0dGVybnNcbiAgLy8gdW5lc2NhcGUgYW55dGhpbmcgaW4gaXQsIHRob3VnaCwgc28gdGhhdCBpdCdsbCBiZVxuICAvLyBhbiBleGFjdCBtYXRjaCBhZ2FpbnN0IGEgZmlsZSBldGMuXG4gIGlmICghaGFzTWFnaWMpIHtcbiAgICByZXR1cm4gZ2xvYlVuZXNjYXBlKHBhdHRlcm4pXG4gIH1cblxuICB2YXIgZmxhZ3MgPSBvcHRpb25zLm5vY2FzZSA/ICdpJyA6ICcnXG4gIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKCdeJyArIHJlICsgJyQnLCBmbGFncylcblxuICByZWdFeHAuX2dsb2IgPSBwYXR0ZXJuXG4gIHJlZ0V4cC5fc3JjID0gcmVcblxuICByZXR1cm4gcmVnRXhwXG59XG5cbm1pbmltYXRjaC5tYWtlUmUgPSBmdW5jdGlvbiAocGF0dGVybiwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IE1pbmltYXRjaChwYXR0ZXJuLCBvcHRpb25zIHx8IHt9KS5tYWtlUmUoKVxufVxuXG5NaW5pbWF0Y2gucHJvdG90eXBlLm1ha2VSZSA9IG1ha2VSZVxuZnVuY3Rpb24gbWFrZVJlICgpIHtcbiAgaWYgKHRoaXMucmVnZXhwIHx8IHRoaXMucmVnZXhwID09PSBmYWxzZSkgcmV0dXJuIHRoaXMucmVnZXhwXG5cbiAgLy8gYXQgdGhpcyBwb2ludCwgdGhpcy5zZXQgaXMgYSAyZCBhcnJheSBvZiBwYXJ0aWFsXG4gIC8vIHBhdHRlcm4gc3RyaW5ncywgb3IgXCIqKlwiLlxuICAvL1xuICAvLyBJdCdzIGJldHRlciB0byB1c2UgLm1hdGNoKCkuICBUaGlzIGZ1bmN0aW9uIHNob3VsZG4ndFxuICAvLyBiZSB1c2VkLCByZWFsbHksIGJ1dCBpdCdzIHByZXR0eSBjb252ZW5pZW50IHNvbWV0aW1lcyxcbiAgLy8gd2hlbiB5b3UganVzdCB3YW50IHRvIHdvcmsgd2l0aCBhIHJlZ2V4LlxuICB2YXIgc2V0ID0gdGhpcy5zZXRcblxuICBpZiAoIXNldC5sZW5ndGgpIHtcbiAgICB0aGlzLnJlZ2V4cCA9IGZhbHNlXG4gICAgcmV0dXJuIHRoaXMucmVnZXhwXG4gIH1cbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcblxuICB2YXIgdHdvU3RhciA9IG9wdGlvbnMubm9nbG9ic3RhciA/IHN0YXJcbiAgICA6IG9wdGlvbnMuZG90ID8gdHdvU3RhckRvdFxuICAgIDogdHdvU3Rhck5vRG90XG4gIHZhciBmbGFncyA9IG9wdGlvbnMubm9jYXNlID8gJ2knIDogJydcblxuICB2YXIgcmUgPSBzZXQubWFwKGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4ubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICByZXR1cm4gKHAgPT09IEdMT0JTVEFSKSA/IHR3b1N0YXJcbiAgICAgIDogKHR5cGVvZiBwID09PSAnc3RyaW5nJykgPyByZWdFeHBFc2NhcGUocClcbiAgICAgIDogcC5fc3JjXG4gICAgfSkuam9pbignXFxcXFxcLycpXG4gIH0pLmpvaW4oJ3wnKVxuXG4gIC8vIG11c3QgbWF0Y2ggZW50aXJlIHBhdHRlcm5cbiAgLy8gZW5kaW5nIGluIGEgKiBvciAqKiB3aWxsIG1ha2UgaXQgbGVzcyBzdHJpY3QuXG4gIHJlID0gJ14oPzonICsgcmUgKyAnKSQnXG5cbiAgLy8gY2FuIG1hdGNoIGFueXRoaW5nLCBhcyBsb25nIGFzIGl0J3Mgbm90IHRoaXMuXG4gIGlmICh0aGlzLm5lZ2F0ZSkgcmUgPSAnXig/IScgKyByZSArICcpLiokJ1xuXG4gIHRyeSB7XG4gICAgdGhpcy5yZWdleHAgPSBuZXcgUmVnRXhwKHJlLCBmbGFncylcbiAgfSBjYXRjaCAoZXgpIHtcbiAgICB0aGlzLnJlZ2V4cCA9IGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRoaXMucmVnZXhwXG59XG5cbm1pbmltYXRjaC5tYXRjaCA9IGZ1bmN0aW9uIChsaXN0LCBwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBtbSA9IG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucylcbiAgbGlzdCA9IGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChmKSB7XG4gICAgcmV0dXJuIG1tLm1hdGNoKGYpXG4gIH0pXG4gIGlmIChtbS5vcHRpb25zLm5vbnVsbCAmJiAhbGlzdC5sZW5ndGgpIHtcbiAgICBsaXN0LnB1c2gocGF0dGVybilcbiAgfVxuICByZXR1cm4gbGlzdFxufVxuXG5NaW5pbWF0Y2gucHJvdG90eXBlLm1hdGNoID0gbWF0Y2hcbmZ1bmN0aW9uIG1hdGNoIChmLCBwYXJ0aWFsKSB7XG4gIHRoaXMuZGVidWcoJ21hdGNoJywgZiwgdGhpcy5wYXR0ZXJuKVxuICAvLyBzaG9ydC1jaXJjdWl0IGluIHRoZSBjYXNlIG9mIGJ1c3RlZCB0aGluZ3MuXG4gIC8vIGNvbW1lbnRzLCBldGMuXG4gIGlmICh0aGlzLmNvbW1lbnQpIHJldHVybiBmYWxzZVxuICBpZiAodGhpcy5lbXB0eSkgcmV0dXJuIGYgPT09ICcnXG5cbiAgaWYgKGYgPT09ICcvJyAmJiBwYXJ0aWFsKSByZXR1cm4gdHJ1ZVxuXG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zXG5cbiAgLy8gd2luZG93czogbmVlZCB0byB1c2UgLywgbm90IFxcXG4gIGlmIChwYXRoLnNlcCAhPT0gJy8nKSB7XG4gICAgZiA9IGYuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKVxuICB9XG5cbiAgLy8gdHJlYXQgdGhlIHRlc3QgcGF0aCBhcyBhIHNldCBvZiBwYXRocGFydHMuXG4gIGYgPSBmLnNwbGl0KHNsYXNoU3BsaXQpXG4gIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCAnc3BsaXQnLCBmKVxuXG4gIC8vIGp1c3QgT05FIG9mIHRoZSBwYXR0ZXJuIHNldHMgaW4gdGhpcy5zZXQgbmVlZHMgdG8gbWF0Y2hcbiAgLy8gaW4gb3JkZXIgZm9yIGl0IHRvIGJlIHZhbGlkLiAgSWYgbmVnYXRpbmcsIHRoZW4ganVzdCBvbmVcbiAgLy8gbWF0Y2ggbWVhbnMgdGhhdCB3ZSBoYXZlIGZhaWxlZC5cbiAgLy8gRWl0aGVyIHdheSwgcmV0dXJuIG9uIHRoZSBmaXJzdCBoaXQuXG5cbiAgdmFyIHNldCA9IHRoaXMuc2V0XG4gIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCAnc2V0Jywgc2V0KVxuXG4gIC8vIEZpbmQgdGhlIGJhc2VuYW1lIG9mIHRoZSBwYXRoIGJ5IGxvb2tpbmcgZm9yIHRoZSBsYXN0IG5vbi1lbXB0eSBzZWdtZW50XG4gIHZhciBmaWxlbmFtZVxuICB2YXIgaVxuICBmb3IgKGkgPSBmLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgZmlsZW5hbWUgPSBmW2ldXG4gICAgaWYgKGZpbGVuYW1lKSBicmVha1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXR0ZXJuID0gc2V0W2ldXG4gICAgdmFyIGZpbGUgPSBmXG4gICAgaWYgKG9wdGlvbnMubWF0Y2hCYXNlICYmIHBhdHRlcm4ubGVuZ3RoID09PSAxKSB7XG4gICAgICBmaWxlID0gW2ZpbGVuYW1lXVxuICAgIH1cbiAgICB2YXIgaGl0ID0gdGhpcy5tYXRjaE9uZShmaWxlLCBwYXR0ZXJuLCBwYXJ0aWFsKVxuICAgIGlmIChoaXQpIHtcbiAgICAgIGlmIChvcHRpb25zLmZsaXBOZWdhdGUpIHJldHVybiB0cnVlXG4gICAgICByZXR1cm4gIXRoaXMubmVnYXRlXG4gICAgfVxuICB9XG5cbiAgLy8gZGlkbid0IGdldCBhbnkgaGl0cy4gIHRoaXMgaXMgc3VjY2VzcyBpZiBpdCdzIGEgbmVnYXRpdmVcbiAgLy8gcGF0dGVybiwgZmFpbHVyZSBvdGhlcndpc2UuXG4gIGlmIChvcHRpb25zLmZsaXBOZWdhdGUpIHJldHVybiBmYWxzZVxuICByZXR1cm4gdGhpcy5uZWdhdGVcbn1cblxuLy8gc2V0IHBhcnRpYWwgdG8gdHJ1ZSB0byB0ZXN0IGlmLCBmb3IgZXhhbXBsZSxcbi8vIFwiL2EvYlwiIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIFwiLyovYi8qL2RcIlxuLy8gUGFydGlhbCBtZWFucywgaWYgeW91IHJ1biBvdXQgb2YgZmlsZSBiZWZvcmUgeW91IHJ1blxuLy8gb3V0IG9mIHBhdHRlcm4sIHRoZW4gdGhhdCdzIGZpbmUsIGFzIGxvbmcgYXMgYWxsXG4vLyB0aGUgcGFydHMgbWF0Y2guXG5NaW5pbWF0Y2gucHJvdG90eXBlLm1hdGNoT25lID0gZnVuY3Rpb24gKGZpbGUsIHBhdHRlcm4sIHBhcnRpYWwpIHtcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcblxuICB0aGlzLmRlYnVnKCdtYXRjaE9uZScsXG4gICAgeyAndGhpcyc6IHRoaXMsIGZpbGU6IGZpbGUsIHBhdHRlcm46IHBhdHRlcm4gfSlcblxuICB0aGlzLmRlYnVnKCdtYXRjaE9uZScsIGZpbGUubGVuZ3RoLCBwYXR0ZXJuLmxlbmd0aClcblxuICBmb3IgKHZhciBmaSA9IDAsXG4gICAgICBwaSA9IDAsXG4gICAgICBmbCA9IGZpbGUubGVuZ3RoLFxuICAgICAgcGwgPSBwYXR0ZXJuLmxlbmd0aFxuICAgICAgOyAoZmkgPCBmbCkgJiYgKHBpIDwgcGwpXG4gICAgICA7IGZpKyssIHBpKyspIHtcbiAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZSBsb29wJylcbiAgICB2YXIgcCA9IHBhdHRlcm5bcGldXG4gICAgdmFyIGYgPSBmaWxlW2ZpXVxuXG4gICAgdGhpcy5kZWJ1ZyhwYXR0ZXJuLCBwLCBmKVxuXG4gICAgLy8gc2hvdWxkIGJlIGltcG9zc2libGUuXG4gICAgLy8gc29tZSBpbnZhbGlkIHJlZ2V4cCBzdHVmZiBpbiB0aGUgc2V0LlxuICAgIGlmIChwID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAocCA9PT0gR0xPQlNUQVIpIHtcbiAgICAgIHRoaXMuZGVidWcoJ0dMT0JTVEFSJywgW3BhdHRlcm4sIHAsIGZdKVxuXG4gICAgICAvLyBcIioqXCJcbiAgICAgIC8vIGEvKiovYi8qKi9jIHdvdWxkIG1hdGNoIHRoZSBmb2xsb3dpbmc6XG4gICAgICAvLyBhL2IveC95L3ovY1xuICAgICAgLy8gYS94L3kvei9iL2NcbiAgICAgIC8vIGEvYi94L2IveC9jXG4gICAgICAvLyBhL2IvY1xuICAgICAgLy8gVG8gZG8gdGhpcywgdGFrZSB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybiBhZnRlclxuICAgICAgLy8gdGhlICoqLCBhbmQgc2VlIGlmIGl0IHdvdWxkIG1hdGNoIHRoZSBmaWxlIHJlbWFpbmRlci5cbiAgICAgIC8vIElmIHNvLCByZXR1cm4gc3VjY2Vzcy5cbiAgICAgIC8vIElmIG5vdCwgdGhlICoqIFwic3dhbGxvd3NcIiBhIHNlZ21lbnQsIGFuZCB0cnkgYWdhaW4uXG4gICAgICAvLyBUaGlzIGlzIHJlY3Vyc2l2ZWx5IGF3ZnVsLlxuICAgICAgLy9cbiAgICAgIC8vIGEvKiovYi8qKi9jIG1hdGNoaW5nIGEvYi94L3kvei9jXG4gICAgICAvLyAtIGEgbWF0Y2hlcyBhXG4gICAgICAvLyAtIGRvdWJsZXN0YXJcbiAgICAgIC8vICAgLSBtYXRjaE9uZShiL3gveS96L2MsIGIvKiovYylcbiAgICAgIC8vICAgICAtIGIgbWF0Y2hlcyBiXG4gICAgICAvLyAgICAgLSBkb3VibGVzdGFyXG4gICAgICAvLyAgICAgICAtIG1hdGNoT25lKHgveS96L2MsIGMpIC0+IG5vXG4gICAgICAvLyAgICAgICAtIG1hdGNoT25lKHkvei9jLCBjKSAtPiBub1xuICAgICAgLy8gICAgICAgLSBtYXRjaE9uZSh6L2MsIGMpIC0+IG5vXG4gICAgICAvLyAgICAgICAtIG1hdGNoT25lKGMsIGMpIHllcywgaGl0XG4gICAgICB2YXIgZnIgPSBmaVxuICAgICAgdmFyIHByID0gcGkgKyAxXG4gICAgICBpZiAocHIgPT09IHBsKSB7XG4gICAgICAgIHRoaXMuZGVidWcoJyoqIGF0IHRoZSBlbmQnKVxuICAgICAgICAvLyBhICoqIGF0IHRoZSBlbmQgd2lsbCBqdXN0IHN3YWxsb3cgdGhlIHJlc3QuXG4gICAgICAgIC8vIFdlIGhhdmUgZm91bmQgYSBtYXRjaC5cbiAgICAgICAgLy8gaG93ZXZlciwgaXQgd2lsbCBub3Qgc3dhbGxvdyAvLngsIHVubGVzc1xuICAgICAgICAvLyBvcHRpb25zLmRvdCBpcyBzZXQuXG4gICAgICAgIC8vIC4gYW5kIC4uIGFyZSAqbmV2ZXIqIG1hdGNoZWQgYnkgKiosIGZvciBleHBsb3NpdmVseVxuICAgICAgICAvLyBleHBvbmVudGlhbCByZWFzb25zLlxuICAgICAgICBmb3IgKDsgZmkgPCBmbDsgZmkrKykge1xuICAgICAgICAgIGlmIChmaWxlW2ZpXSA9PT0gJy4nIHx8IGZpbGVbZmldID09PSAnLi4nIHx8XG4gICAgICAgICAgICAoIW9wdGlvbnMuZG90ICYmIGZpbGVbZmldLmNoYXJBdCgwKSA9PT0gJy4nKSkgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cblxuICAgICAgLy8gb2ssIGxldCdzIHNlZSBpZiB3ZSBjYW4gc3dhbGxvdyB3aGF0ZXZlciB3ZSBjYW4uXG4gICAgICB3aGlsZSAoZnIgPCBmbCkge1xuICAgICAgICB2YXIgc3dhbGxvd2VlID0gZmlsZVtmcl1cblxuICAgICAgICB0aGlzLmRlYnVnKCdcXG5nbG9ic3RhciB3aGlsZScsIGZpbGUsIGZyLCBwYXR0ZXJuLCBwciwgc3dhbGxvd2VlKVxuXG4gICAgICAgIC8vIFhYWCByZW1vdmUgdGhpcyBzbGljZS4gIEp1c3QgcGFzcyB0aGUgc3RhcnQgaW5kZXguXG4gICAgICAgIGlmICh0aGlzLm1hdGNoT25lKGZpbGUuc2xpY2UoZnIpLCBwYXR0ZXJuLnNsaWNlKHByKSwgcGFydGlhbCkpIHtcbiAgICAgICAgICB0aGlzLmRlYnVnKCdnbG9ic3RhciBmb3VuZCBtYXRjaCEnLCBmciwgZmwsIHN3YWxsb3dlZSlcbiAgICAgICAgICAvLyBmb3VuZCBhIG1hdGNoLlxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY2FuJ3Qgc3dhbGxvdyBcIi5cIiBvciBcIi4uXCIgZXZlci5cbiAgICAgICAgICAvLyBjYW4gb25seSBzd2FsbG93IFwiLmZvb1wiIHdoZW4gZXhwbGljaXRseSBhc2tlZC5cbiAgICAgICAgICBpZiAoc3dhbGxvd2VlID09PSAnLicgfHwgc3dhbGxvd2VlID09PSAnLi4nIHx8XG4gICAgICAgICAgICAoIW9wdGlvbnMuZG90ICYmIHN3YWxsb3dlZS5jaGFyQXQoMCkgPT09ICcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ2RvdCBkZXRlY3RlZCEnLCBmaWxlLCBmciwgcGF0dGVybiwgcHIpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vICoqIHN3YWxsb3dzIGEgc2VnbWVudCwgYW5kIGNvbnRpbnVlLlxuICAgICAgICAgIHRoaXMuZGVidWcoJ2dsb2JzdGFyIHN3YWxsb3cgYSBzZWdtZW50LCBhbmQgY29udGludWUnKVxuICAgICAgICAgIGZyKytcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBubyBtYXRjaCB3YXMgZm91bmQuXG4gICAgICAvLyBIb3dldmVyLCBpbiBwYXJ0aWFsIG1vZGUsIHdlIGNhbid0IHNheSB0aGlzIGlzIG5lY2Vzc2FyaWx5IG92ZXIuXG4gICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgKnBhdHRlcm4qIGxlZnQsIHRoZW5cbiAgICAgIGlmIChwYXJ0aWFsKSB7XG4gICAgICAgIC8vIHJhbiBvdXQgb2YgZmlsZVxuICAgICAgICB0aGlzLmRlYnVnKCdcXG4+Pj4gbm8gbWF0Y2gsIHBhcnRpYWw/JywgZmlsZSwgZnIsIHBhdHRlcm4sIHByKVxuICAgICAgICBpZiAoZnIgPT09IGZsKSByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gKipcbiAgICAvLyBub24tbWFnaWMgcGF0dGVybnMganVzdCBoYXZlIHRvIG1hdGNoIGV4YWN0bHlcbiAgICAvLyBwYXR0ZXJucyB3aXRoIG1hZ2ljIGhhdmUgYmVlbiB0dXJuZWQgaW50byByZWdleHBzLlxuICAgIHZhciBoaXRcbiAgICBpZiAodHlwZW9mIHAgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAob3B0aW9ucy5ub2Nhc2UpIHtcbiAgICAgICAgaGl0ID0gZi50b0xvd2VyQ2FzZSgpID09PSBwLnRvTG93ZXJDYXNlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpdCA9IGYgPT09IHBcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVidWcoJ3N0cmluZyBtYXRjaCcsIHAsIGYsIGhpdClcbiAgICB9IGVsc2Uge1xuICAgICAgaGl0ID0gZi5tYXRjaChwKVxuICAgICAgdGhpcy5kZWJ1ZygncGF0dGVybiBtYXRjaCcsIHAsIGYsIGhpdClcbiAgICB9XG5cbiAgICBpZiAoIWhpdCkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBOb3RlOiBlbmRpbmcgaW4gLyBtZWFucyB0aGF0IHdlJ2xsIGdldCBhIGZpbmFsIFwiXCJcbiAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4gIFRoaXMgY2FuIG9ubHkgbWF0Y2ggYVxuICAvLyBjb3JyZXNwb25kaW5nIFwiXCIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS5cbiAgLy8gSWYgdGhlIGZpbGUgZW5kcyBpbiAvLCB0aGVuIGl0IGNhbiBvbmx5IG1hdGNoIGFcbiAgLy8gYSBwYXR0ZXJuIHRoYXQgZW5kcyBpbiAvLCB1bmxlc3MgdGhlIHBhdHRlcm4ganVzdFxuICAvLyBkb2Vzbid0IGhhdmUgYW55IG1vcmUgZm9yIGl0LiBCdXQsIGEvYi8gc2hvdWxkICpub3QqXG4gIC8vIG1hdGNoIFwiYS9iLypcIiwgZXZlbiB0aG91Z2ggXCJcIiBtYXRjaGVzIGFnYWluc3QgdGhlXG4gIC8vIFteL10qPyBwYXR0ZXJuLCBleGNlcHQgaW4gcGFydGlhbCBtb2RlLCB3aGVyZSBpdCBtaWdodFxuICAvLyBzaW1wbHkgbm90IGJlIHJlYWNoZWQgeWV0LlxuICAvLyBIb3dldmVyLCBhL2IvIHNob3VsZCBzdGlsbCBzYXRpc2Z5IGEvKlxuXG4gIC8vIG5vdyBlaXRoZXIgd2UgZmVsbCBvZmYgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiwgb3Igd2UncmUgZG9uZS5cbiAgaWYgKGZpID09PSBmbCAmJiBwaSA9PT0gcGwpIHtcbiAgICAvLyByYW4gb3V0IG9mIHBhdHRlcm4gYW5kIGZpbGVuYW1lIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgLy8gYW4gZXhhY3QgaGl0IVxuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSBpZiAoZmkgPT09IGZsKSB7XG4gICAgLy8gcmFuIG91dCBvZiBmaWxlLCBidXQgc3RpbGwgaGFkIHBhdHRlcm4gbGVmdC5cbiAgICAvLyB0aGlzIGlzIG9rIGlmIHdlJ3JlIGRvaW5nIHRoZSBtYXRjaCBhcyBwYXJ0IG9mXG4gICAgLy8gYSBnbG9iIGZzIHRyYXZlcnNhbC5cbiAgICByZXR1cm4gcGFydGlhbFxuICB9IGVsc2UgaWYgKHBpID09PSBwbCkge1xuICAgIC8vIHJhbiBvdXQgb2YgcGF0dGVybiwgc3RpbGwgaGF2ZSBmaWxlIGxlZnQuXG4gICAgLy8gdGhpcyBpcyBvbmx5IGFjY2VwdGFibGUgaWYgd2UncmUgb24gdGhlIHZlcnkgbGFzdFxuICAgIC8vIGVtcHR5IHNlZ21lbnQgb2YgYSBmaWxlIHdpdGggYSB0cmFpbGluZyBzbGFzaC5cbiAgICAvLyBhLyogc2hvdWxkIG1hdGNoIGEvYi9cbiAgICB2YXIgZW1wdHlGaWxlRW5kID0gKGZpID09PSBmbCAtIDEpICYmIChmaWxlW2ZpXSA9PT0gJycpXG4gICAgcmV0dXJuIGVtcHR5RmlsZUVuZFxuICB9XG5cbiAgLy8gc2hvdWxkIGJlIHVucmVhY2hhYmxlLlxuICB0aHJvdyBuZXcgRXJyb3IoJ3d0Zj8nKVxufVxuXG4vLyByZXBsYWNlIHN0dWZmIGxpa2UgXFwqIHdpdGggKlxuZnVuY3Rpb24gZ2xvYlVuZXNjYXBlIChzKSB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1xcXFwoLikvZywgJyQxJylcbn1cblxuZnVuY3Rpb24gcmVnRXhwRXNjYXBlIChzKSB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJylcbn1cbiIsInZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBfMDc3NyA9IHBhcnNlSW50KCcwNzc3JywgOCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWtkaXJQLm1rZGlycCA9IG1rZGlyUC5ta2RpclAgPSBta2RpclA7XG5cbmZ1bmN0aW9uIG1rZGlyUCAocCwgb3B0cywgZiwgbWFkZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmID0gb3B0cztcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBlbHNlIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0cyA9IHsgbW9kZTogb3B0cyB9O1xuICAgIH1cbiAgICBcbiAgICB2YXIgbW9kZSA9IG9wdHMubW9kZTtcbiAgICB2YXIgeGZzID0gb3B0cy5mcyB8fCBmcztcbiAgICBcbiAgICBpZiAobW9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1vZGUgPSBfMDc3NyAmICh+cHJvY2Vzcy51bWFzaygpKTtcbiAgICB9XG4gICAgaWYgKCFtYWRlKSBtYWRlID0gbnVsbDtcbiAgICBcbiAgICB2YXIgY2IgPSBmIHx8IGZ1bmN0aW9uICgpIHt9O1xuICAgIHAgPSBwYXRoLnJlc29sdmUocCk7XG4gICAgXG4gICAgeGZzLm1rZGlyKHAsIG1vZGUsIGZ1bmN0aW9uIChlcikge1xuICAgICAgICBpZiAoIWVyKSB7XG4gICAgICAgICAgICBtYWRlID0gbWFkZSB8fCBwO1xuICAgICAgICAgICAgcmV0dXJuIGNiKG51bGwsIG1hZGUpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoZXIuY29kZSkge1xuICAgICAgICAgICAgY2FzZSAnRU5PRU5UJzpcbiAgICAgICAgICAgICAgICBta2RpclAocGF0aC5kaXJuYW1lKHApLCBvcHRzLCBmdW5jdGlvbiAoZXIsIG1hZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyKSBjYihlciwgbWFkZSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgbWtkaXJQKHAsIG9wdHMsIGNiLCBtYWRlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYW55IG90aGVyIGVycm9yLCBqdXN0IHNlZSBpZiB0aGVyZSdzIGEgZGlyXG4gICAgICAgICAgICAvLyB0aGVyZSBhbHJlYWR5LiAgSWYgc28sIHRoZW4gaG9vcmF5ISAgSWYgbm90LCB0aGVuIHNvbWV0aGluZ1xuICAgICAgICAgICAgLy8gaXMgYm9ya2VkLlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB4ZnMuc3RhdChwLCBmdW5jdGlvbiAoZXIyLCBzdGF0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzdGF0IGZhaWxzLCB0aGVuIHRoYXQncyBzdXBlciB3ZWlyZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSBvcmlnaW5hbCBlcnJvciBiZSB0aGUgZmFpbHVyZSByZWFzb24uXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcjIgfHwgIXN0YXQuaXNEaXJlY3RvcnkoKSkgY2IoZXIsIG1hZGUpXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgY2IobnVsbCwgbWFkZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxubWtkaXJQLnN5bmMgPSBmdW5jdGlvbiBzeW5jIChwLCBvcHRzLCBtYWRlKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRzID0geyBtb2RlOiBvcHRzIH07XG4gICAgfVxuICAgIFxuICAgIHZhciBtb2RlID0gb3B0cy5tb2RlO1xuICAgIHZhciB4ZnMgPSBvcHRzLmZzIHx8IGZzO1xuICAgIFxuICAgIGlmIChtb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbW9kZSA9IF8wNzc3ICYgKH5wcm9jZXNzLnVtYXNrKCkpO1xuICAgIH1cbiAgICBpZiAoIW1hZGUpIG1hZGUgPSBudWxsO1xuXG4gICAgcCA9IHBhdGgucmVzb2x2ZShwKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHhmcy5ta2RpclN5bmMocCwgbW9kZSk7XG4gICAgICAgIG1hZGUgPSBtYWRlIHx8IHA7XG4gICAgfVxuICAgIGNhdGNoIChlcnIwKSB7XG4gICAgICAgIHN3aXRjaCAoZXJyMC5jb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdFTk9FTlQnIDpcbiAgICAgICAgICAgICAgICBtYWRlID0gc3luYyhwYXRoLmRpcm5hbWUocCksIG9wdHMsIG1hZGUpO1xuICAgICAgICAgICAgICAgIHN5bmMocCwgb3B0cywgbWFkZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGFueSBvdGhlciBlcnJvciwganVzdCBzZWUgaWYgdGhlcmUncyBhIGRpclxuICAgICAgICAgICAgLy8gdGhlcmUgYWxyZWFkeS4gIElmIHNvLCB0aGVuIGhvb3JheSEgIElmIG5vdCwgdGhlbiBzb21ldGhpbmdcbiAgICAgICAgICAgIC8vIGlzIGJvcmtlZC5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdmFyIHN0YXQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdCA9IHhmcy5zdGF0U3luYyhwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycjEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzdGF0LmlzRGlyZWN0b3J5KCkpIHRocm93IGVycjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFkZTtcbn07XG4iLCIvLyBJZiBgRGF0ZS5ub3coKWAgaXMgaW52b2tlZCB0d2ljZSBxdWlja2x5LCBpdCdzIHBvc3NpYmxlIHRvIGdldCB0d29cbi8vIGlkZW50aWNhbCB0aW1lIHN0YW1wcy4gVG8gYXZvaWQgZ2VuZXJhdGlvbiBkdXBsaWNhdGlvbnMsIHN1YnNlcXVlbnRcbi8vIGNhbGxzIGFyZSBtYW51YWxseSBvcmRlcmVkIHRvIGZvcmNlIHVuaXF1ZW5lc3MuXG5cbnZhciBfbGFzdCA9IDBcbnZhciBfY291bnQgPSAxXG52YXIgYWRqdXN0ZWQgPSAwXG52YXIgX2FkanVzdGVkID0gMFxuXG5tb2R1bGUuZXhwb3J0cyA9XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIC8qKlxuICBSZXR1cm5zIE5PVCBhbiBhY2N1cmF0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCB0aW1lLlxuICBTaW5jZSBqcyBvbmx5IG1lYXN1cmVzIHRpbWUgYXMgbXMsIGlmIHlvdSBjYWxsIGBEYXRlLm5vdygpYFxuICB0d2ljZSBxdWlja2x5LCBpdCdzIHBvc3NpYmxlIHRvIGdldCB0d28gaWRlbnRpY2FsIHRpbWUgc3RhbXBzLlxuICBUaGlzIGZ1bmN0aW9uIGd1YXJhbnRlZXMgdW5pcXVlIGJ1dCBtYXliZSBpbmFjY3VyYXRlIHJlc3VsdHNcbiAgb24gZWFjaCBjYWxsLlxuICAqKi9cbiAgLy91bmNvbW1lbnQgdGhpcyB3ZW5cbiAgdmFyIHRpbWUgPSBEYXRlLm5vdygpXG4gIC8vdGltZSA9IH5+ICh0aW1lIC8gMTAwMCkgXG4gIC8vXl5edW5jb21tZW50IHdoZW4gdGVzdGluZy4uLlxuXG4gIC8qKlxuICBJZiB0aW1lIHJldHVybmVkIGlzIHNhbWUgYXMgaW4gbGFzdCBjYWxsLCBhZGp1c3QgaXQgYnlcbiAgYWRkaW5nIGEgbnVtYmVyIGJhc2VkIG9uIHRoZSBjb3VudGVyLiBcbiAgQ291bnRlciBpcyBpbmNyZW1lbnRlZCBzbyB0aGF0IG5leHQgY2FsbCBnZXQncyBhZGp1c3RlZCBwcm9wZXJseS5cbiAgQmVjYXVzZSBmbG9hdHMgaGF2ZSByZXN0cmljdGVkIHByZWNpc2lvbiwgXG4gIG1heSBuZWVkIHRvIHN0ZXAgcGFzdCBzb21lIHZhbHVlcy4uLlxuICAqKi9cbiAgaWYgKF9sYXN0ID09PSB0aW1lKSAge1xuICAgIGRvIHtcbiAgICAgIGFkanVzdGVkID0gdGltZSArICgoX2NvdW50KyspIC8gKF9jb3VudCArIDk5OSkpXG4gICAgfSB3aGlsZSAoYWRqdXN0ZWQgPT09IF9hZGp1c3RlZClcbiAgICBfYWRqdXN0ZWQgPSBhZGp1c3RlZFxuICB9XG4gIC8vIElmIGxhc3QgdGltZSB3YXMgZGlmZmVyZW50IHJlc2V0IHRpbWVyIGJhY2sgdG8gYDFgLlxuICBlbHNlIHtcbiAgICBfY291bnQgPSAxXG4gICAgYWRqdXN0ZWQgPSB0aW1lXG4gIH1cbiAgX2FkanVzdGVkID0gYWRqdXN0ZWRcbiAgX2xhc3QgPSB0aW1lXG4gIHJldHVybiBhZGp1c3RlZFxufVxuIiwidmFyIGNvbnQgICAgID0gcmVxdWlyZSgnY29udCcpXG52YXIgcHVsbCAgICAgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgZGVmZXIgICAgPSByZXF1aXJlKCdwdWxsLWRlZmVyJylcbnZhciBwYXRoICAgICA9IHJlcXVpcmUoJ3BhdGgnKVxudmFyIGV4cGxhaW4gID0gcmVxdWlyZSgnZXhwbGFpbi1lcnJvcicpXG52YXIgbWtkaXJwICAgPSByZXF1aXJlKCdta2RpcnAnKVxudmFyIHJpbXJhZiAgID0gcmVxdWlyZSgncmltcmFmJylcbnZhciBmcyAgICAgICA9IHJlcXVpcmUoJ2ZzJylcbnZhciBnbG9iICAgICA9IHJlcXVpcmUoJ3B1bGwtZ2xvYicpXG52YXIgcGFyYW1hcCAgPSByZXF1aXJlKCdwdWxsLXBhcmFtYXAnKVxudmFyIGNhdCAgICAgID0gcmVxdWlyZSgncHVsbC1jYXQnKVxudmFyIE5vdGlmeSAgID0gcmVxdWlyZSgncHVsbC1ub3RpZnknKVxuXG52YXIgV3JpdGUgICAgPSByZXF1aXJlKCdwdWxsLXdyaXRlLWZpbGUnKVxudmFyIFJlYWQgICAgID0gcmVxdWlyZSgncHVsbC1maWxlJylcblxudmFyIHUgPSByZXF1aXJlKCcuL3V0aWwnKVxudmFyIGNyZWF0ZUhhc2ggPSB1LmNyZWF0ZUhhc2hcblxuZnVuY3Rpb24gd3JpdGUgKGZpbGVuYW1lLCBjYikge1xuICByZXR1cm4gV3JpdGVGaWxlKGZpbGVuYW1lLCBjYilcbiAgcmV0dXJuIHRvUHVsbC5zaW5rKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZpbGVuYW1lKSwgY2IpXG59XG5cbmZ1bmN0aW9uIHJlYWQgKGZpbGVuYW1lKSB7XG4gIHJldHVybiBSZWFkRmlsZShmaWxlbmFtZSlcbi8vICByZXR1cm4gdG9QdWxsLnNvdXJjZShmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGVuYW1lKSlcbn1cblxuZnVuY3Rpb24gdG9BcnJheSAoaCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShoKSA/IGggOiBbaF1cbn1cblxudmFyIEJsb2JzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gIHZhciBkaXJcbiAgaWYoJ3N0cmluZycgPT09IHR5cGVvZiBjb25maWcpXG4gICAgZGlyID0gY29uZmlnLCBjb25maWcgPSB7ZGlyOiBkaXJ9XG5cbiAgdmFyIGVuY29kZSA9IGNvbmZpZy5lbmNvZGUgfHwgdS5lbmNvZGVcbiAgdmFyIGRlY29kZSA9IGNvbmZpZy5kZWNvZGUgfHwgdS5kZWNvZGVcbiAgdmFyIGlzSGFzaCA9IGNvbmZpZy5pc0hhc2ggfHwgdS5pc0hhc2hcblxuICBmdW5jdGlvbiB0b1BhdGggKGRpciwgc3RyaW5nKSB7XG4gICAgdmFyIGQgPSBkZWNvZGUoc3RyaW5nKVxuICAgIHZhciBoID0gZC5oYXNoLnRvU3RyaW5nKCdoZXgnKVxuICAgIHJldHVybiBwYXRoLmpvaW4oZGlyLCBkLmFsZywgaC5zdWJzdHJpbmcoMCwyKSwgaC5zdWJzdHJpbmcoMikpXG4gIH1cblxuICBmdW5jdGlvbiB0b0hhc2goZmlsZW5hbWUpIHtcbiAgICB2YXIgcGFydHMgPSBwYXRoLnJlbGF0aXZlKGRpciwgZmlsZW5hbWUpLnNwbGl0KHBhdGguc2VwKVxuICAgIHZhciBhbGcgPSBwYXJ0cy5zaGlmdCgpXG4gICAgcmV0dXJuIGVuY29kZShuZXcgQnVmZmVyKHBhcnRzLmpvaW4oJycpLCAnaGV4JyksIGFsZylcbiAgfVxuXG4gIHZhciBuZXdCbG9iID0gTm90aWZ5KClcblxuICBjb25maWcgPSBjb25maWcgfHwge31cbiAgdmFyIGFsZyA9IGNvbmZpZy5oYXNoID0gY29uZmlnLmhhc2ggfHwgY29uZmlnLmFsZyB8fCAnYmxha2UycydcblxuICBkaXIgPSBjb25maWcuZGlyXG5cbiAgdmFyIG4gPSAwXG4gIHZhciB3YWl0aW5nID0gW10sIHRtcCA9IGZhbHNlLCBjbGVhbiA9IGZhbHNlXG5cbiAgZnVuY3Rpb24gaW5pdCAoY2IpIHtcbiAgICBpZih0bXApIHJldHVybiBjYigpXG4gICAgZWxzZSB3YWl0aW5nLnB1c2goY2IpXG4gIH1cblxuICB2YXIgdG1wZGlyID0gcGF0aC5qb2luKGRpciwgJ3RtcCcpXG5cbiAgcmltcmFmKHRtcGRpciwgZnVuY3Rpb24gKCkge1xuICAgIG1rZGlycCh0bXBkaXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRtcCA9IHRydWU7IHdoaWxlKHdhaXRpbmcubGVuZ3RoKSB3YWl0aW5nLnNoaWZ0KCkoKVxuICAgIH0pXG4gIH0pXG5cbiAgZnVuY3Rpb24gaGFzIChoYXNoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjYikge1xuICAgICAgZnMuc3RhdCh0b1BhdGgoZGlyLCBoYXNoKSwgZnVuY3Rpb24gKGVyciwgc3RhdCkge1xuICAgICAgICBjYihudWxsLCAhIXN0YXQpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNpemUgKGhhc2gpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNiKSB7XG4gICAgICBmcy5zdGF0KHRvUGF0aChkaXIsIGhhc2gpLCBmdW5jdGlvbiAoZXJyLCBzdGF0KSB7XG4gICAgICAgIGNiKG51bGwsIHN0YXQgPyBzdGF0LnNpemUgOiBudWxsKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVUZXN0ZXIgKHRlc3QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGhhc2hlcywgY2IpIHtcbiAgICAgIHZhciBuID0gIUFycmF5LmlzQXJyYXkoaGFzaGVzKVxuICAgICAgY29udC5wYXJhKHRvQXJyYXkoaGFzaGVzKS5tYXAodGVzdCkpIChmdW5jdGlvbiAoXywgYXJ5KSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IGVycm9yIGlmIHRoZSBoYXNoIGlzIG5vdCBwcmVzZW50LFxuICAgICAgICAvLyBzbyBuZXZlciBjYWxsYmFjayBhbiBlcnJvci5cbiAgICAgICAgLy8gUFMuIGlmIHlvdSBoYXZlIGEgc2l0dWF0aW9uIHdoZXJlIHlvdSBuZXZlciBlcnJvclxuICAgICAgICAvLyBhZGQgYSBjb21tZW50IGxpa2UgdGhpcyBvbmUgdG8gZXhwbGFpbiB3aHkuXG4gICAgICAgIGlmKG4pIGNiKG51bGwsIGFyeVswXSlcbiAgICAgICAgZWxzZSAgY2IobnVsbCwgYXJ5KVxuICAgICAgfSlcbiAgICAgIHJldHVybiBjYlxuICAgIH1cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBbXVxuXG5cbiAgcmV0dXJuIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICBpZihpc0hhc2gob3B0cykpXG4gICAgICAgIHJldHVybiBSZWFkKHRvUGF0aChkaXIsIG9wdHMpKVxuXG4gICAgICB2YXIgaGFzaCA9IG9wdHMua2V5IHx8IG9wdHMuaGFzaFxuICAgICAgaWYoIWlzSGFzaChoYXNoKSlcbiAgICAgICAgcmV0dXJuIHB1bGwuZXJyb3IobmV3IEVycm9yKFxuICAgICAgICAgICdtdWx0aWJsb2IuZ2V0OiB7aGFzaH0gaXMgbWFuZGF0b3J5J1xuICAgICAgICApKVxuXG4gICAgICB2YXIgc3RyZWFtID0gZGVmZXIuc291cmNlKClcbiAgICAgIGZzLnN0YXQodG9QYXRoKGRpciwgaGFzaCksIGZ1bmN0aW9uIChlcnIsIHN0YXQpIHtcbiAgICAgICAgaWYob3B0cy5zaXplICE9IG51bGwgJiYgb3B0cy5zaXplICE9PSBzdGF0LnNpemUpXG4gICAgICAgICAgc3RyZWFtLmFib3J0KG5ldyBFcnJvcignaW5jb3JyZWN0IGZpbGUgbGVuZ3RoLCdcbiAgICAgICAgICAgICsgJyByZXF1ZXN0ZWQ6JyArIG9wdHMuc2l6ZSArICcgZmlsZSB3YXM6JyArIHN0YXQuc2l6ZVxuICAgICAgICAgICAgKyAnIGZvciBmaWxlOicgKyBoYXNoXG4gICAgICAgICAgKSlcblxuICAgICAgICBlbHNlIGlmKG9wdHMubWF4ICE9IG51bGwgJiYgb3B0cy5tYXggPCBzdGF0LnNpemUpXG4gICAgICAgICAgc3RyZWFtLmFib3J0KG5ldyBFcnJvcignaW5jb3JyZWN0IGZpbGUgbGVuZ3RoLCdcbiAgICAgICAgICAgICsgJyByZXF1ZXN0ZWQ6JyArIG9wdHMuc2l6ZSArICcgZmlsZSB3YXM6JyArIHN0YXQuc2l6ZVxuICAgICAgICAgICAgKyAnIGZvciBmaWxlOicgKyBoYXNoXG4gICAgICAgICAgKSlcblxuICAgICAgICBlbHNlXG4gICAgICAgICAgc3RyZWFtLnJlc29sdmUoUmVhZCh0b1BhdGgoZGlyLCBoYXNoKSkpXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gc3RyZWFtXG4gICAgfSxcblxuICAgIHNpemU6IGNyZWF0ZVRlc3RlcihzaXplKSxcblxuICAgIGhhczogY3JlYXRlVGVzdGVyKGhhcyksXG5cbiAgICBhZGQ6IGZ1bmN0aW9uIChoYXNoLCBjYikge1xuICAgICAgaWYoIWNiKSBjYiA9IGhhc2gsIGhhc2ggPSBudWxsXG5cbiAgICAgIGlmKCFjYikgY2IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmKGVycikgZXhwbGFpbihlcnIsICdubyBjYWxsYmFjayBwcm92aWRlZCcpXG4gICAgICB9XG5cbiAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyLnNpbmsoKVxuICAgICAgaW5pdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0bXBmaWxlID0gcGF0aC5qb2luKGRpciwgJ3RtcCcsIERhdGUubm93KCkgKyAnLScgKyBuKyspXG4gICAgICAgIHZhciBoYXNoZXIgPSBjcmVhdGVIYXNoKGFsZywgdHJ1ZSlcbiAgICAgICAgdmFyIHNpemUgPSAwXG5cbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwdWxsKFxuICAgICAgICAgIGhhc2hlcixcbiAgICAgICAgICBwdWxsLnRocm91Z2goZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHNpemUgKz0gZGF0YS5sZW5ndGhcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBXcml0ZSh0bXBmaWxlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBpZihlcnIpIHJldHVybiBjYihleHBsYWluKGVyciwgJ2NvdWxkIG5vdCB3cml0ZSB0byB0bXBmaWxlJykpXG5cbiAgICAgICAgICAgIHZhciBfaGFzaCA9IGVuY29kZShoYXNoZXIuZGlnZXN0LCBhbGcpXG5cbiAgICAgICAgICAgIGlmKGhhc2ggJiYgaGFzaCAhPT0gX2hhc2gpXG4gICAgICAgICAgICAgIHJldHVybiBjYihuZXcgRXJyb3IoJ2FjdHVhbCBoYXNoOicrIF9oYXNoXG4gICAgICAgICAgICAgICAgKyAnIGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgaGFzaDonK2hhc2gpLCBfaGFzaClcblxuICAgICAgICAgICAgdmFyIHAgPSB0b1BhdGgoZGlyLCBoYXNoIHx8IF9oYXNoKVxuXG4gICAgICAgICAgICBta2RpcnAocGF0aC5kaXJuYW1lKHApLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGZzLnJlbmFtZSh0bXBmaWxlLCBwLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYoZXJyKSBjYihleHBsYWluKGVyciwgJ2NvdWxkIG5vdCBtb3ZlIGZpbGUnKSlcbiAgICAgICAgICAgICAgICBlbHNlICAgIG5ld0Jsb2Ioe2lkOnRvSGFzaChwKSwgc2l6ZTogc2l6ZSwgdHM6IERhdGUubm93KCl9KSwgY2IobnVsbCwgX2hhc2gpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgICkpXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gZGVmZXJyZWRcbiAgICB9LFxuICAgIGxzOiBmdW5jdGlvbiAob3B0cykge1xuICAgICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICAgIHZhciBsb25nID0gKG9wdHMuc2l6ZSB8fCBvcHRzLmxvbmcpXG4gICAgICB2YXIgc291cmNlID0gcHVsbChcbiAgICAgICAgZ2xvYihwYXRoLmpvaW4oZGlyLCAnKicsICcqJywgJyonKSksXG4gICAgICAgIGxvbmdcbiAgICAgICAgPyBwYXJhbWFwKGZ1bmN0aW9uIChmaWxlbmFtZSwgY2IpIHtcbiAgICAgICAgICAgIGZzLnN0YXQoZmlsZW5hbWUsIGZ1bmN0aW9uIChlcnIsIHN0YXQpIHtcbiAgICAgICAgICAgICAgY2IoZXJyLCB7aWQ6IHRvSGFzaChmaWxlbmFtZSksIHNpemU6IHN0YXQuc2l6ZSwgdHM6ICtzdGF0LmN0aW1lfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSwgMzIpXG4gICAgICAgIDogcHVsbC5tYXAodG9IYXNoKVxuICAgICAgKVxuXG4gICAgICBpZighb3B0cy5saXZlKSByZXR1cm4gc291cmNlXG5cbiAgICAgIHJldHVybiBjYXQoW1xuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHB1bGwub25jZSh7c3luYzogdHJ1ZX0pLFxuICAgICAgICAgIGxvbmdcbiAgICAgICAgICA/IG5ld0Jsb2IubGlzdGVuKClcbiAgICAgICAgICA6IHB1bGwobmV3QmxvYi5saXN0ZW4oKSwgcHVsbC5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaWQgfSkpXG4gICAgICBdKVxuICAgICAgXG4gICAgfSxcbiAgICBybTogZnVuY3Rpb24gKGhhc2gsIGNiKSB7XG4gICAgICBmcy51bmxpbmsodG9QYXRoKGRpciwgaGFzaCksIGNiKVxuICAgIH0sXG4gICAgcmVzb2x2ZTogZnVuY3Rpb24gKGhhc2gpIHtcbiAgICAgIHJldHVybiB0b1BhdGgoZGlyLCBoYXNoKVxuICAgIH1cbiAgfVxufVxuXG5cbiIsIlxudmFyIHB1c2hhYmxlID0gcmVxdWlyZSgncHVsbC1wdXNoYWJsZScpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB7fSwgbiA9IDBcblxuICBmdW5jdGlvbiBub3RpZnkgKG1zZykge1xuICAgIGZvcih2YXIgayBpbiBsaXN0ZW5lcnMpIGxpc3RlbmVyc1trXS5wdXNoKG1zZylcbiAgfVxuXG4gIG5vdGlmeS5saXN0ZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGsgPSArK25cbiAgICByZXR1cm4gbGlzdGVuZXJzW2tdID0gcHVzaGFibGUoZnVuY3Rpb24gKCkge1xuICAgICAgZGVsZXRlIGxpc3RlbmVyc1trXVxuICAgIH0pXG4gIH1cblxuICBub3RpZnkuYWJvcnQgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgZm9yKHZhciBrIGluIGxpc3RlbmVycykgbGlzdGVuZXJzW2tdLmVuZChlcnIpXG4gIH1cblxuICBub3RpZnkuZW5kID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBub3RpZnkuYWJvcnQodHJ1ZSlcbiAgfVxuXG4gIHJldHVybiBub3RpZnlcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmltcmFmXG5yaW1yYWYuc3luYyA9IHJpbXJhZlN5bmNcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoXCJhc3NlcnRcIilcbnZhciBwYXRoID0gcmVxdWlyZShcInBhdGhcIilcbnZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKVxuXG4vLyBmb3IgRU1GSUxFIGhhbmRsaW5nXG52YXIgdGltZW91dCA9IDBcbmV4cG9ydHMuRU1GSUxFX01BWCA9IDEwMDBcbmV4cG9ydHMuQlVTWVRSSUVTX01BWCA9IDNcblxudmFyIGlzV2luZG93cyA9IChwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIpXG5cbmZ1bmN0aW9uIGRlZmF1bHRzIChvcHRpb25zKSB7XG4gIHZhciBtZXRob2RzID0gW1xuICAgICd1bmxpbmsnLFxuICAgICdjaG1vZCcsXG4gICAgJ3N0YXQnLFxuICAgICdybWRpcicsXG4gICAgJ3JlYWRkaXInXG4gIF1cbiAgbWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG0pIHtcbiAgICBvcHRpb25zW21dID0gb3B0aW9uc1ttXSB8fCBmc1ttXVxuICAgIG0gPSBtICsgJ1N5bmMnXG4gICAgb3B0aW9uc1ttXSA9IG9wdGlvbnNbbV0gfHwgZnNbbV1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcmltcmFmIChwLCBvcHRpb25zLCBjYikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdGlvbnNcbiAgICBvcHRpb25zID0ge31cbiAgfVxuICBhc3NlcnQocClcbiAgYXNzZXJ0KG9wdGlvbnMpXG4gIGFzc2VydCh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG5cbiAgZGVmYXVsdHMob3B0aW9ucylcblxuICBpZiAoIWNiKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjYWxsYmFjayBwYXNzZWQgdG8gcmltcmFmKClcIilcblxuICB2YXIgYnVzeVRyaWVzID0gMFxuICByaW1yYWZfKHAsIG9wdGlvbnMsIGZ1bmN0aW9uIENCIChlcikge1xuICAgIGlmIChlcikge1xuICAgICAgaWYgKGlzV2luZG93cyAmJiAoZXIuY29kZSA9PT0gXCJFQlVTWVwiIHx8IGVyLmNvZGUgPT09IFwiRU5PVEVNUFRZXCIpICYmXG4gICAgICAgICAgYnVzeVRyaWVzIDwgZXhwb3J0cy5CVVNZVFJJRVNfTUFYKSB7XG4gICAgICAgIGJ1c3lUcmllcyArK1xuICAgICAgICB2YXIgdGltZSA9IGJ1c3lUcmllcyAqIDEwMFxuICAgICAgICAvLyB0cnkgYWdhaW4sIHdpdGggdGhlIHNhbWUgZXhhY3QgY2FsbGJhY2sgYXMgdGhpcyBvbmUuXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByaW1yYWZfKHAsIG9wdGlvbnMsIENCKVxuICAgICAgICB9LCB0aW1lKVxuICAgICAgfVxuXG4gICAgICAvLyB0aGlzIG9uZSB3b24ndCBoYXBwZW4gaWYgZ3JhY2VmdWwtZnMgaXMgdXNlZC5cbiAgICAgIGlmIChlci5jb2RlID09PSBcIkVNRklMRVwiICYmIHRpbWVvdXQgPCBleHBvcnRzLkVNRklMRV9NQVgpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJpbXJhZl8ocCwgb3B0aW9ucywgQ0IpXG4gICAgICAgIH0sIHRpbWVvdXQgKyspXG4gICAgICB9XG5cbiAgICAgIC8vIGFscmVhZHkgZ29uZVxuICAgICAgaWYgKGVyLmNvZGUgPT09IFwiRU5PRU5UXCIpIGVyID0gbnVsbFxuICAgIH1cblxuICAgIHRpbWVvdXQgPSAwXG4gICAgY2IoZXIpXG4gIH0pXG59XG5cbi8vIFR3byBwb3NzaWJsZSBzdHJhdGVnaWVzLlxuLy8gMS4gQXNzdW1lIGl0J3MgYSBmaWxlLiAgdW5saW5rIGl0LCB0aGVuIGRvIHRoZSBkaXIgc3R1ZmYgb24gRVBFUk0gb3IgRUlTRElSXG4vLyAyLiBBc3N1bWUgaXQncyBhIGRpcmVjdG9yeS4gIHJlYWRkaXIsIHRoZW4gZG8gdGhlIGZpbGUgc3R1ZmYgb24gRU5PVERJUlxuLy9cbi8vIEJvdGggcmVzdWx0IGluIGFuIGV4dHJhIHN5c2NhbGwgd2hlbiB5b3UgZ3Vlc3Mgd3JvbmcuICBIb3dldmVyLCB0aGVyZVxuLy8gYXJlIGxpa2VseSBmYXIgbW9yZSBub3JtYWwgZmlsZXMgaW4gdGhlIHdvcmxkIHRoYW4gZGlyZWN0b3JpZXMuICBUaGlzXG4vLyBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGEgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGZpbGVzIHBlclxuLy8gZGlyZWN0b3J5IGlzID49IDEuXG4vL1xuLy8gSWYgYW55b25lIGV2ZXIgY29tcGxhaW5zIGFib3V0IHRoaXMsIHRoZW4gSSBndWVzcyB0aGUgc3RyYXRlZ3kgY291bGRcbi8vIGJlIG1hZGUgY29uZmlndXJhYmxlIHNvbWVob3cuICBCdXQgdW50aWwgdGhlbiwgWUFHTkkuXG5mdW5jdGlvbiByaW1yYWZfIChwLCBvcHRpb25zLCBjYikge1xuICBhc3NlcnQocClcbiAgYXNzZXJ0KG9wdGlvbnMpXG4gIGFzc2VydCh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG5cbiAgb3B0aW9ucy51bmxpbmsocCwgZnVuY3Rpb24gKGVyKSB7XG4gICAgaWYgKGVyKSB7XG4gICAgICBpZiAoZXIuY29kZSA9PT0gXCJFTk9FTlRcIilcbiAgICAgICAgcmV0dXJuIGNiKG51bGwpXG4gICAgICBpZiAoZXIuY29kZSA9PT0gXCJFUEVSTVwiKVxuICAgICAgICByZXR1cm4gKGlzV2luZG93cylcbiAgICAgICAgICA/IGZpeFdpbkVQRVJNKHAsIG9wdGlvbnMsIGVyLCBjYilcbiAgICAgICAgICA6IHJtZGlyKHAsIG9wdGlvbnMsIGVyLCBjYilcbiAgICAgIGlmIChlci5jb2RlID09PSBcIkVJU0RJUlwiKVxuICAgICAgICByZXR1cm4gcm1kaXIocCwgb3B0aW9ucywgZXIsIGNiKVxuICAgIH1cbiAgICByZXR1cm4gY2IoZXIpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGZpeFdpbkVQRVJNIChwLCBvcHRpb25zLCBlciwgY2IpIHtcbiAgYXNzZXJ0KHApXG4gIGFzc2VydChvcHRpb25zKVxuICBhc3NlcnQodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICBpZiAoZXIpXG4gICAgYXNzZXJ0KGVyIGluc3RhbmNlb2YgRXJyb3IpXG5cbiAgb3B0aW9ucy5jaG1vZChwLCA2NjYsIGZ1bmN0aW9uIChlcjIpIHtcbiAgICBpZiAoZXIyKVxuICAgICAgY2IoZXIyLmNvZGUgPT09IFwiRU5PRU5UXCIgPyBudWxsIDogZXIpXG4gICAgZWxzZVxuICAgICAgb3B0aW9ucy5zdGF0KHAsIGZ1bmN0aW9uKGVyMywgc3RhdHMpIHtcbiAgICAgICAgaWYgKGVyMylcbiAgICAgICAgICBjYihlcjMuY29kZSA9PT0gXCJFTk9FTlRcIiA/IG51bGwgOiBlcilcbiAgICAgICAgZWxzZSBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICBybWRpcihwLCBvcHRpb25zLCBlciwgY2IpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBvcHRpb25zLnVubGluayhwLCBjYilcbiAgICAgIH0pXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGZpeFdpbkVQRVJNU3luYyAocCwgb3B0aW9ucywgZXIpIHtcbiAgYXNzZXJ0KHApXG4gIGFzc2VydChvcHRpb25zKVxuICBpZiAoZXIpXG4gICAgYXNzZXJ0KGVyIGluc3RhbmNlb2YgRXJyb3IpXG5cbiAgdHJ5IHtcbiAgICBvcHRpb25zLmNobW9kU3luYyhwLCA2NjYpXG4gIH0gY2F0Y2ggKGVyMikge1xuICAgIGlmIChlcjIuY29kZSA9PT0gXCJFTk9FTlRcIilcbiAgICAgIHJldHVyblxuICAgIGVsc2VcbiAgICAgIHRocm93IGVyXG4gIH1cblxuICB0cnkge1xuICAgIHZhciBzdGF0cyA9IG9wdGlvbnMuc3RhdFN5bmMocClcbiAgfSBjYXRjaCAoZXIzKSB7XG4gICAgaWYgKGVyMy5jb2RlID09PSBcIkVOT0VOVFwiKVxuICAgICAgcmV0dXJuXG4gICAgZWxzZVxuICAgICAgdGhyb3cgZXJcbiAgfVxuXG4gIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKVxuICAgIHJtZGlyU3luYyhwLCBvcHRpb25zLCBlcilcbiAgZWxzZVxuICAgIG9wdGlvbnMudW5saW5rU3luYyhwKVxufVxuXG5mdW5jdGlvbiBybWRpciAocCwgb3B0aW9ucywgb3JpZ2luYWxFciwgY2IpIHtcbiAgYXNzZXJ0KHApXG4gIGFzc2VydChvcHRpb25zKVxuICBpZiAob3JpZ2luYWxFcilcbiAgICBhc3NlcnQob3JpZ2luYWxFciBpbnN0YW5jZW9mIEVycm9yKVxuICBhc3NlcnQodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuXG4gIC8vIHRyeSB0byBybWRpciBmaXJzdCwgYW5kIG9ubHkgcmVhZGRpciBvbiBFTk9URU1QVFkgb3IgRUVYSVNUIChTdW5PUylcbiAgLy8gaWYgd2UgZ3Vlc3NlZCB3cm9uZywgYW5kIGl0J3Mgbm90IGEgZGlyZWN0b3J5LCB0aGVuXG4gIC8vIHJhaXNlIHRoZSBvcmlnaW5hbCBlcnJvci5cbiAgb3B0aW9ucy5ybWRpcihwLCBmdW5jdGlvbiAoZXIpIHtcbiAgICBpZiAoZXIgJiYgKGVyLmNvZGUgPT09IFwiRU5PVEVNUFRZXCIgfHwgZXIuY29kZSA9PT0gXCJFRVhJU1RcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIpKVxuICAgICAgcm1raWRzKHAsIG9wdGlvbnMsIGNiKVxuICAgIGVsc2UgaWYgKGVyICYmIGVyLmNvZGUgPT09IFwiRU5PVERJUlwiKVxuICAgICAgY2Iob3JpZ2luYWxFcilcbiAgICBlbHNlXG4gICAgICBjYihlcilcbiAgfSlcbn1cblxuZnVuY3Rpb24gcm1raWRzKHAsIG9wdGlvbnMsIGNiKSB7XG4gIGFzc2VydChwKVxuICBhc3NlcnQob3B0aW9ucylcbiAgYXNzZXJ0KHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcblxuICBvcHRpb25zLnJlYWRkaXIocCwgZnVuY3Rpb24gKGVyLCBmaWxlcykge1xuICAgIGlmIChlcilcbiAgICAgIHJldHVybiBjYihlcilcbiAgICB2YXIgbiA9IGZpbGVzLmxlbmd0aFxuICAgIGlmIChuID09PSAwKVxuICAgICAgcmV0dXJuIG9wdGlvbnMucm1kaXIocCwgY2IpXG4gICAgdmFyIGVyclN0YXRlXG4gICAgZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgcmltcmFmKHBhdGguam9pbihwLCBmKSwgb3B0aW9ucywgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgIGlmIChlcnJTdGF0ZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgaWYgKGVyKVxuICAgICAgICAgIHJldHVybiBjYihlcnJTdGF0ZSA9IGVyKVxuICAgICAgICBpZiAoLS1uID09PSAwKVxuICAgICAgICAgIG9wdGlvbnMucm1kaXIocCwgY2IpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIHRoaXMgbG9va3Mgc2ltcGxlciwgYW5kIGlzIHN0cmljdGx5ICpmYXN0ZXIqLCBidXQgd2lsbFxuLy8gdGllIHVwIHRoZSBKYXZhU2NyaXB0IHRocmVhZCBhbmQgZmFpbCBvbiBleGNlc3NpdmVseVxuLy8gZGVlcCBkaXJlY3RvcnkgdHJlZXMuXG5mdW5jdGlvbiByaW1yYWZTeW5jIChwLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIGRlZmF1bHRzKG9wdGlvbnMpXG5cbiAgYXNzZXJ0KHApXG4gIGFzc2VydChvcHRpb25zKVxuXG4gIHRyeSB7XG4gICAgb3B0aW9ucy51bmxpbmtTeW5jKHApXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgaWYgKGVyLmNvZGUgPT09IFwiRU5PRU5UXCIpXG4gICAgICByZXR1cm5cbiAgICBpZiAoZXIuY29kZSA9PT0gXCJFUEVSTVwiKVxuICAgICAgcmV0dXJuIGlzV2luZG93cyA/IGZpeFdpbkVQRVJNU3luYyhwLCBvcHRpb25zLCBlcikgOiBybWRpclN5bmMocCwgb3B0aW9ucywgZXIpXG4gICAgaWYgKGVyLmNvZGUgIT09IFwiRUlTRElSXCIpXG4gICAgICB0aHJvdyBlclxuICAgIHJtZGlyU3luYyhwLCBvcHRpb25zLCBlcilcbiAgfVxufVxuXG5mdW5jdGlvbiBybWRpclN5bmMgKHAsIG9wdGlvbnMsIG9yaWdpbmFsRXIpIHtcbiAgYXNzZXJ0KHApXG4gIGFzc2VydChvcHRpb25zKVxuICBpZiAob3JpZ2luYWxFcilcbiAgICBhc3NlcnQob3JpZ2luYWxFciBpbnN0YW5jZW9mIEVycm9yKVxuXG4gIHRyeSB7XG4gICAgb3B0aW9ucy5ybWRpclN5bmMocClcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICBpZiAoZXIuY29kZSA9PT0gXCJFTk9FTlRcIilcbiAgICAgIHJldHVyblxuICAgIGlmIChlci5jb2RlID09PSBcIkVOT1RESVJcIilcbiAgICAgIHRocm93IG9yaWdpbmFsRXJcbiAgICBpZiAoZXIuY29kZSA9PT0gXCJFTk9URU1QVFlcIiB8fCBlci5jb2RlID09PSBcIkVFWElTVFwiIHx8IGVyLmNvZGUgPT09IFwiRVBFUk1cIilcbiAgICAgIHJta2lkc1N5bmMocCwgb3B0aW9ucylcbiAgfVxufVxuXG5mdW5jdGlvbiBybWtpZHNTeW5jIChwLCBvcHRpb25zKSB7XG4gIGFzc2VydChwKVxuICBhc3NlcnQob3B0aW9ucylcbiAgb3B0aW9ucy5yZWFkZGlyU3luYyhwKS5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4gICAgcmltcmFmU3luYyhwYXRoLmpvaW4ocCwgZiksIG9wdGlvbnMpXG4gIH0pXG4gIG9wdGlvbnMucm1kaXJTeW5jKHAsIG9wdGlvbnMpXG59XG4iLCJ2YXIgQmxha2UycyA9IHJlcXVpcmUoJ2JsYWtlMnMnKVxudmFyIGNyZWF0ZUhhc2ggPSByZXF1aXJlKCdjcnlwdG8nKS5jcmVhdGVIYXNoXG52YXIgaGFzaCAgICA9IHJlcXVpcmUoJ2NyeXB0bycpXG52YXIgcGF0aCAgICA9IHJlcXVpcmUoJ3BhdGgnKVxudmFyIHB1bGwgICAgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG5cbnZhciBpc0J1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlclxuXG52YXIgYWxncyA9IHtcbiAgYmxha2UyczogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEJsYWtlMnMoKSB9LFxuICBzaGEyNTY6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpIH1cbn1cblxuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiAoYnVmLCBhbGcpIHtcbiAgaWYoIWlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBFcnJvcignaGFzaCBzaG91bGQgYmUgYSBidWZmZXIsIHdhczonK2J1ZilcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JykrJy4nK2FsZ1xufVxuXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGkgPSBzdHIuaW5kZXhPZignLicpXG4gIHZhciBhbGcgPSBzdHIuc3Vic3RyaW5nKGkrMSlcbiAgcmV0dXJuIHtoYXNoOiBuZXcgQnVmZmVyKHN0ci5zdWJzdHJpbmcoMCwgaSksICdiYXNlNjQnKSwgYWxnOiBhbGd9XG59XG5cbmV4cG9ydHMuY3JlYXRlSGFzaCA9IGZ1bmN0aW9uIChhbGcsIG5vQ29tcGF0KSB7XG4gIGFsZyA9IGFsZyB8fCAnYmxha2UycydcbiAgdmFyIGhhc2ggPSBhbGdzW2FsZ10oKVxuXG4gIHZhciBoYXNoZXIgPSBwdWxsLnRocm91Z2goZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBkYXRhID0gaXNCdWZmZXIoZGF0YSkgPyBkYXRhIDogbmV3IEJ1ZmZlcihkYXRhKVxuICAgIGhhc2hlci5zaXplICs9IGRhdGEubGVuZ3RoXG4gICAgaGFzaC51cGRhdGUoZGF0YSlcbiAgfSwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBoYXNoZXIuZGlnZXN0ID0gbm9Db21wYXQgPT09IHRydWUgPyBoYXNoLmRpZ2VzdCgpIDogaGFzaC5kaWdlc3QoJ2Jhc2U2NCcpICsgJy4nICsgYWxnXG4vLyAgICBoYXNoZXIuZGlnZXN0ID0gZGlnZXN0XG4gIH0pXG5cbiAgaGFzaGVyLnNpemUgPSAwXG4gIHJldHVybiBoYXNoZXJcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcgKHMpIHtcbiAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2Ygc1xufVxuXG5leHBvcnRzLmlzSGFzaCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiBpc1N0cmluZyhkYXRhKSAmJiAvXltBLVphLXowLTlcXC8rXXs0M309XFwuKD86Ymxha2Uyc3xzaGEyNTYpJC8udGVzdChkYXRhKVxufVxuXG5cbiIsInZhciB6ZXJyID0gcmVxdWlyZSgnemVycicpXG52YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYWRkZWRWYWxpZGF0b3JzKSB7XG4gIHZhciBhcGkgPSB7fVxuICB2YXIgdmFsaWRhdG9ycyA9IHt9XG5cbiAgLy8gdmFsaWRhdG9yIGNvbnRyb2xcbiAgYXBpLmdldCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvcnNbbmFtZV1cbiAgfVxuICBhcGkuc2V0ID0gZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT0gJ29iamVjdCcpXG4gICAgICBmb3IgKHZhciBrIGluIG5hbWUpIFxuICAgICAgICBhcGkuc2V0KGssIG5hbWVba10uYmluZChhcGkpKVxuICAgIGVsc2VcbiAgICAgIHZhbGlkYXRvcnNbbmFtZV0gPSBmblxuICB9XG5cbiAgLy8gc2V0IHZhbGlkYXRvciByZWdpc3RyeVxuICBhcGkuc2V0KHtcbiAgICBudW1iZXI6IGZ1bmN0aW9uIChwYXJhbSwgbikge1xuICAgICAgdmFyIGFzTnVtID0gK3BhcmFtXG4gICAgICBpZiAoaXNOYU4oYXNOdW0pIHx8IGFzTnVtICE9IHBhcmFtKVxuICAgICAgICByZXR1cm4gJ3R5cGUnXG4gICAgfSxcbiAgICBzdHJpbmc6IGZ1bmN0aW9uIChwYXJhbSwgbikge1xuICAgICAgdmFyIGFzU3RyaW5nID0gJycrcGFyYW1cbiAgICAgIGlmIChhc1N0cmluZyAhPSBwYXJhbSlcbiAgICAgICAgcmV0dXJuICd0eXBlJ1xuICAgIH0sXG4gICAgYm9vbGVhbjogZnVuY3Rpb24gKHBhcmFtLCBuKSB7XG4gICAgICBpZiAodHlwZW9mIHBhcmFtICE9ICdib29sZWFuJylcbiAgICAgICAgcmV0dXJuICd0eXBlJ1xuICAgIH0sXG4gICAgb2JqZWN0OiBmdW5jdGlvbiAocGFyYW0sIG4pIHtcbiAgICAgIGlmICh0eXBlb2YgcGFyYW0gIT0gJ29iamVjdCcgfHwgIXBhcmFtKVxuICAgICAgICByZXR1cm4gJ3R5cGUnXG4gICAgfSxcbiAgICBhcnJheTogZnVuY3Rpb24gKHBhcmFtLCBuKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW0pKVxuICAgICAgICByZXR1cm4gJ3R5cGUnXG4gICAgfSxcbiAgICBmdW5jdGlvbjogZnVuY3Rpb24gKHBhcmFtLCBuKSB7XG4gICAgICBpZiAodHlwZW9mIHBhcmFtICE9ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiAndHlwZSdcbiAgICB9XG4gIH0pXG4gIGFwaS5zZXQoYWRkZWRWYWxpZGF0b3JzKVxuXG4gIC8vIHJwYyBtZXRob2Qgd3JhcHBlcnNcbiAgYXBpLnN5bmMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgc3BlYyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpXG5cbiAgICAgIC8vIHJ1biB2YWxpZGF0aW9uXG4gICAgICB2YXIgZXJyID0gdmFsaWRhdGUoYXJncywgc3BlYylcbiAgICAgIGlmIChlcnIpIHRocm93IGVyclxuXG4gICAgICAvLyBydW4gc3luYyBmblxuICAgICAgcmV0dXJuIGFwcGx5KHRoaXMsIGZuLCBhcmdzKVxuICAgIH1cbiAgfVxuICBhcGkuc2luayA9IFxuICBhcGkuYXN5bmMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgc3BlYyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICB2YXIgaGFzQ2IgPSAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PSAnZnVuY3Rpb24nKVxuXG4gICAgICAvLyBnZXQgY2JcbiAgICAgIHZhciBjYiA9IChoYXNDYilcbiAgICAgICAgPyBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cbiAgICAgICAgOiBmdW5jdGlvbiAoZXJyKSB7IGlmIChlcnIpIHsgdGhyb3cgZXJyOyB9IH1cblxuICAgICAgLy8gcnVuIHZhbGlkYXRpb25cbiAgICAgIHZhciBlcnIgPSB2YWxpZGF0ZSgoaGFzQ2IpID8gYXJncy5zbGljZSgwLGFyZ3MubGVuZ3RoLTEpIDogYXJncywgc3BlYylcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG5cbiAgICAgIC8vIHJ1biBhc3luYyBmblxuICAgICAgcmV0dXJuIGFwcGx5KHRoaXMsIGZuLCBhcmdzKVxuICAgIH1cbiAgfVxuICBhcGkuc291cmNlID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHNwZWMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuXG4gICAgICAvLyBydW4gdmFsaWRhdGlvblxuICAgICAgdmFyIGVyciA9IHZhbGlkYXRlKGFyZ3MsIHNwZWMpXG4gICAgICBpZiAoZXJyKSByZXR1cm4gcHVsbC5lcnJvcihlcnIpXG5cbiAgICAgIC8vIHJ1biBzdHJlYW0gZm5cbiAgICAgIHJldHVybiBhcHBseSh0aGlzLCBmbiwgYXJncylcbiAgICB9XG4gIH1cblxuICAvLyBydW4gdmFsaWRhdGlvbiBhZ2FpbnN0IGEgc3BlY1xuICBmdW5jdGlvbiB2YWxpZGF0ZSAoYXJncywgc3BlYykge1xuICAgIHZhciBlcnJcblxuICAgIC8vIG11bHRpcGxlIHNwZWNzP1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNwZWNbMF0pKSB7XG4gICAgICBmb3IgKHZhciBpPTA7IGkgPCBzcGVjLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVyciA9IHZhbGlkYXRlKGFyZ3MsIHNwZWNbaV0pXG4gICAgICAgIGlmICghZXJyKVxuICAgICAgICAgIHJldHVybiBmYWxzZSAvLyBzcGVjIHBhc3NlZFxuICAgICAgfVxuICAgICAgcmV0dXJuIGVyciAvLyBnaXZlIHRoZSBsYXN0IGVycm9yXG4gICAgfVxuXG4gICAgLy8gaXRlcmF0ZSB0aGUgc3BlY1xuICAgIGZvciAodmFyIGk9MDsgaSA8IHNwZWMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0eXBlcyA9IHBhcnNlKHNwZWNbaV0pXG5cbiAgICAgIGZvciAodmFyIGo9MDsgaiA8IHR5cGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciB0eXBlID0gdHlwZXNbal1cblxuICAgICAgICAvLyBmYWxzZXk/XG4gICAgICAgIGlmICghYXJnc1tpXSkge1xuICAgICAgICAgIGVyciA9ICh0eXBlLm9wdGlvbmFsKSA/IGZhbHNlIDogZXJycy5NaXNzaW5nUGFyYW0oJycraSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2V0ICYgcnVuIHZhbGlkYXRvclxuICAgICAgICB2YXIgdmFsaWRhdG9yID0gdmFsaWRhdG9yc1t0eXBlLm5hbWVdXG4gICAgICAgIGlmICghdmFsaWRhdG9yKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsaWRhdG9yIG5vdCBmb3VuZDogJyArIHR5cGUubmFtZSlcbiAgICAgICAgZXJyID0gdmFsaWRhdG9yKGFyZ3NbaV0sICcnK2kpXG5cbiAgICAgICAgLy8gZGlkIHRoZSB2YWxpZGF0b3IgcGFzcz8gYnJlYWsgb3V0IG9mIHRoaXMgdHlwZVxuICAgICAgICBpZiAoIWVycilcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIC8vIGVycm9yIGFsaWFzZXNcbiAgICAgICAgaWYgKGVyciA9PSAndHlwZScpXG4gICAgICAgICAgZXJyID0gZXJycy5UeXBlKCcnK2ksIHR5cGUubmFtZSlcbiAgICAgIH1cblxuICAgICAgLy8gbm9uZSBvZiB0aGUgdHlwZXMgcGFzc2VkPyByZXR1cm4gdGhlIGVycm9yXG4gICAgICBpZiAoZXJyKVxuICAgICAgICByZXR1cm4gZXJyXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIGFwaVxufVxuXG52YXIgZXJycyA9XG5tb2R1bGUuZXhwb3J0cy5lcnJvcnMgPSB7XG4gIE1pc3NpbmdQYXJhbTogemVycignVXNhZ2UnLCAnUGFyYW0gJSBpcyByZXF1aXJlZCcpLFxuICBUeXBlOiB6ZXJyKCdUeXBlJywgJ1BhcmFtICUgbXVzdCBieSBvZiB0eXBlICUnKVxufVxuXG4vLyBwYXJzZSBzcGVjIHRva2VuXG5mdW5jdGlvbiBwYXJzZSAodG9rZW4pIHtcbiAgcmV0dXJuIHRva2VuLnNwbGl0KCd8JykubWFwKGZ1bmN0aW9uICh0b2tlbikge1xuICAgIGlmICh0b2tlbi5jaGFyQXQodG9rZW4ubGVuZ3RoIC0gMSkgPT0gJz8nKVxuICAgICAgcmV0dXJuIHsgbmFtZTogdG9rZW4uc2xpY2UoMCwgdG9rZW4ubGVuZ3RoIC0gMSksIG9wdGlvbmFsOiB0cnVlIH1cbiAgICByZXR1cm4geyBuYW1lOiB0b2tlbiwgb3B0aW9uYWw6IGZhbHNlIH1cbiAgfSlcbn1cblxuLy8gaGVscGVyIHRvIGF2b2lkIGFwcGx5LCBmb3IgcGVyZm9ybWFuY2VcbmZ1bmN0aW9uIGFwcGx5IChzZWxmLCBmbiwgYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPT0gMClcbiAgICByZXR1cm4gZm4uY2FsbChzZWxmKVxuICBpZiAoYXJncy5sZW5ndGggPT0gMSlcbiAgICByZXR1cm4gZm4uY2FsbChzZWxmLCBhcmdzWzBdKVxuICBpZiAoYXJncy5sZW5ndGggPT0gMilcbiAgICByZXR1cm4gZm4uY2FsbChzZWxmLCBhcmdzWzBdLCBhcmdzWzFdKVxuICBpZiAoYXJncy5sZW5ndGggPT0gMylcbiAgICByZXR1cm4gZm4uY2FsbChzZWxmLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICBpZiAoYXJncy5sZW5ndGggPT0gNClcbiAgICByZXR1cm4gZm4uY2FsbChzZWxmLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICByZXR1cm4gZm4uYXBwbHkoc2VsZiwgYXJncylcbn0iLCIndXNlIHN0cmljdCc7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyXG52YXIgdSA9IHJlcXVpcmUoJy4vdXRpbCcpXG52YXIgZXhwbGFpbiA9IHJlcXVpcmUoJ2V4cGxhaW4tZXJyb3InKVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7XG4gIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZlxufVxuXG5mdW5jdGlvbiBpc09iamVjdCAobykge1xuICByZXR1cm4gbyAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG9cbn1cblxuZnVuY3Rpb24gbm9vcCAoZXJyKSB7XG4gIGlmIChlcnIpIHRocm93IGV4cGxhaW4oZXJyLCAnY2FsbGJhY2sgbm90IHByb3ZpZGVkJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocGF0aCwgcmVtb3RlQXBpLCBfcmVtb3RlQ2FsbCkge1xuXG4gIHZhciBlbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgZnVuY3Rpb24gcmVtb3RlQ2FsbCh0eXBlLCBuYW1lLCBhcmdzKSB7XG4gICAgdmFyIGNiID0gaXNGdW5jdGlvbiAoYXJnc1thcmdzLmxlbmd0aCAtIDFdKSA/IGFyZ3MucG9wKCkgOiBub29wXG4gICAgdmFyIHZhbHVlXG5cbiAgICB0cnkgeyB2YWx1ZSA9IF9yZW1vdGVDYWxsKHR5cGUsIG5hbWUsIGFyZ3MsIGNiKSB9XG4gICAgY2F0Y2goZXJyKSB7IHJldHVybiB1LmVycm9yQXNTdHJlYW1PckNiKHR5cGUsIGVyciwgY2IpfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvL2FkZCBhbGwgdGhlIGFwaSBtZXRob2RzIHRvIGVtaXR0ZXIgcmVjdXJzaXZlbHlcbiAgOyhmdW5jdGlvbiByZWN1cnNlIChvYmosIGFwaSwgcGF0aCkge1xuICAgIGZvcih2YXIgbmFtZSBpbiBhcGkpIChmdW5jdGlvbiAobmFtZSwgdHlwZSkge1xuICAgICAgdmFyIF9wYXRoID0gcGF0aCA/IHBhdGguY29uY2F0KG5hbWUpIDogW25hbWVdXG4gICAgICBvYmpbbmFtZV0gPVxuICAgICAgICAgIGlzT2JqZWN0KHR5cGUpXG4gICAgICAgID8gcmVjdXJzZSh7fSwgdHlwZSwgX3BhdGgpXG4gICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbW90ZUNhbGwodHlwZSwgX3BhdGgsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICAgICAgICB9XG4gICAgfSkobmFtZSwgYXBpW25hbWVdKVxuICAgIHJldHVybiBvYmpcbiAgfSkoZW1pdHRlciwgcmVtb3RlQXBpLCBwYXRoKVxuXG4gIC8vbGVnYWN5IGxvY2FsIGVtaXQsIGZyb20gd2hlbiByZW1vdGUgZW1pdCB3YXMgc3VwcG9ydGVkLlxuICBlbWl0dGVyLl9lbWl0ID0gZW1pdHRlci5lbWl0XG5cbiAgcmV0dXJuIGVtaXR0ZXJcbn1cblxuIiwiJ3VzZSBzdHJpY3QnXG52YXIgUFNDICAgICAgICAgID0gcmVxdWlyZSgncGFja2V0LXN0cmVhbS1jb2RlYycpXG52YXIgdSAgICAgICAgICAgID0gcmVxdWlyZSgnLi91dGlsJylcbnZhciBpbml0U3RyZWFtICAgPSByZXF1aXJlKCcuL3N0cmVhbScpXG52YXIgY3JlYXRlQXBpICAgID0gcmVxdWlyZSgnLi9hcGknKVxudmFyIGNyZWF0ZUxvY2FsQ2FsbCA9IHJlcXVpcmUoJy4vbG9jYWwtYXBpJylcblxuZnVuY3Rpb24gY3JlYXRlTXV4cnBjIChyZW1vdGVBcGksIGxvY2FsQXBpLCBsb2NhbCwgaWQsIHBlcm1zLCBjb2RlYywgbGVnYWN5KSB7XG4gIGxvY2FsQXBpID0gbG9jYWxBcGkgfHwge31cbiAgcmVtb3RlQXBpID0gcmVtb3RlQXBpIHx8IHt9XG4gIHZhciBlbWl0dGVyXG4gIGlmKCFjb2RlYykgY29kZWMgPSBQU0NcblxuICAvL3Bhc3MgdGhlIG1hbmlmZXN0IHRvIHRoZSBwZXJtaXNzaW9ucyBzbyB0aGF0IGl0IGNhbiBrbm93XG4gIC8vd2hhdCBzb21ldGhpbmcgc2hvdWxkIGJlLlxuXG4gIHZhciBfY2IsIHdzXG4gIHZhciBjb250ZXh0ID0ge1xuICAgICAgX2VtaXQ6IGZ1bmN0aW9uIChldmVudCwgdmFsdWUpIHtcbiAgICAgICAgZW1pdHRlciAmJiBlbWl0dGVyLl9lbWl0KGV2ZW50LCB2YWx1ZSlcbiAgICAgICAgcmV0dXJuIGNvbnRleHRcbiAgICAgIH0sXG4gICAgICBpZDogaWRcbiAgICB9XG5cbiAgdmFyIHdzID0gaW5pdFN0cmVhbShcbiAgICBjcmVhdGVMb2NhbENhbGwobG9jYWwsIGxvY2FsQXBpLCBwZXJtcykuYmluZChjb250ZXh0KSxcbiAgICBjb2RlYywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYoZW1pdHRlci5jbG9zZWQpIHJldHVyblxuICAgICAgZW1pdHRlci5jbG9zZWQgPSB0cnVlXG4gICAgICBlbWl0dGVyLmVtaXQoJ2Nsb3NlZCcpXG4gICAgICBpZihfY2IpIHtcbiAgICAgICAgdmFyIGNiID0gX2NiOyBfY2IgPSBudWxsOyBjYihlcnIpXG4gICAgICB9XG4gICAgfVxuICApXG5cbiAgZW1pdHRlciA9IGNyZWF0ZUFwaShbXSwgcmVtb3RlQXBpLCBmdW5jdGlvbiAodHlwZSwgbmFtZSwgYXJncywgY2IpIHtcbiAgICBpZih3cy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcignc3RyZWFtIGlzIGNsb3NlZCcpXG4gICAgcmV0dXJuIHdzLnJlbW90ZUNhbGwodHlwZSwgbmFtZSwgYXJncywgY2IpXG4gIH0pXG5cbiAgaWYobGVnYWN5KSB7XG4gICAgT2JqZWN0Ll9fZGVmaW5lR2V0dGVyX18uY2FsbChlbWl0dGVyLCAnaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY29udGV4dC5pZFxuICAgIH0pXG5cbiAgICBPYmplY3QuX19kZWZpbmVTZXR0ZXJfXy5jYWxsKGVtaXR0ZXIsICdpZCcsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY29udGV4dC5pZCA9ICB2YWx1ZVxuICAgIH0pXG5cbiAgICB2YXIgZmlyc3QgPSB0cnVlXG5cbiAgICBlbWl0dGVyLmNyZWF0ZVN0cmVhbSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgX2NiID0gY2JcbiAgICAgIGlmKGZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gZmFsc2U7IHJldHVybiB3c1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uZSBzdHJlYW0gcGVyIHJwYycpXG4gICAgfVxuICB9XG4gIGVsc2VcbiAgICBlbWl0dGVyLnN0cmVhbSA9IHdzXG5cbiAgZW1pdHRlci5jbG9zZWQgPSBmYWxzZVxuXG4gIGVtaXR0ZXIuY2xvc2UgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICAgIHdzLmNsb3NlKGVyciwgY2IpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJldHVybiBlbWl0dGVyXG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVtb3RlQXBpLCBsb2NhbEFwaSwgY29kZWMpIHtcbiAgaWYoYXJndW1lbnRzLmxlbmd0aCA+IDMpXG4gICAgcmV0dXJuIGNyZWF0ZU11eHJwYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIHJldHVybiBmdW5jdGlvbiAobG9jYWwsIHBlcm1zLCBpZCkge1xuICAgIHJldHVybiBjcmVhdGVNdXhycGMocmVtb3RlQXBpLCBsb2NhbEFwaSwgbG9jYWwsIGlkLCBwZXJtcywgY29kZWMsIHRydWUpXG4gIH1cbn1cblxuIiwiXG52YXIgUGVybWlzc2lvbnMgID0gcmVxdWlyZSgnLi9wZXJtaXNzaW9ucycpXG52YXIgdSAgICAgICAgICAgID0gcmVxdWlyZSgnLi91dGlsJylcblxubW9kdWxlLmV4cG9ydHMgPSBcblxuZnVuY3Rpb24gY3JlYXRlTG9jYWxDYWxsKGxvY2FsLCBsb2NhbEFwaSwgcGVybXMpIHtcbiAgcGVybXMgPSBQZXJtaXNzaW9ucyhwZXJtcylcblxuICBmdW5jdGlvbiBoYXModHlwZSwgbmFtZSkge1xuICAgIHJldHVybiB0eXBlID09PSB1LmdldChsb2NhbEFwaSwgbmFtZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvY2FsQ2FsbCh0eXBlLCBuYW1lLCBhcmdzKSB7XG5cbiAgICBpZihuYW1lID09PSAnZW1pdCcpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VtaXQgaGFzIGJlZW4gcmVtb3ZlZCcpXG5cbiAgICAvL2lzIHRoZXJlIGEgd2F5IHRvIGtub3cgd2hldGhlciBpdCdzIHN5bmMgb3IgYXN5bmM/XG4gICAgaWYodHlwZSA9PT0gJ2FzeW5jJylcbiAgICAgIGlmKGhhcygnc3luYycsIG5hbWUpKSB7XG4gICAgICAgIHZhciBjYiA9IGFyZ3MucG9wKCksIHZhbHVlXG4gICAgICAgIHRyeSB7IHZhbHVlID0gdS5nZXQobG9jYWwsIG5hbWUpLmFwcGx5KHRoaXMsIGFyZ3MpIH1cbiAgICAgICAgY2F0Y2ggKGVycikgeyByZXR1cm4gY2IoZXJyKSB9XG4gICAgICAgIHJldHVybiBjYihudWxsLCB2YWx1ZSlcbiAgICAgIH1cblxuICAgIGlmICghaGFzKHR5cGUsIG5hbWUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyAnK3R5cGUrJzonK25hbWUpXG5cbiAgICByZXR1cm4gdS5nZXQobG9jYWwsIG5hbWUpLmFwcGx5KHRoaXMsIGFyZ3MpXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIGFyZ3MpIHtcbiAgICB2YXIgZXJyID0gcGVybXMucHJlKG5hbWUsIGFyZ3MpXG4gICAgaWYoZXJyKSB0aHJvdyBlcnJcbiAgICByZXR1cm4gbG9jYWxDYWxsLmNhbGwodGhpcywgdHlwZSwgbmFtZSwgYXJncylcbiAgfVxufVxuXG5cbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1ID0gcmVxdWlyZSgnLi91dGlsJylcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuICdmdW5jdGlvbicgPT09IHR5cGVvZiBmXG59XG5cbmZ1bmN0aW9uIGpvaW4gKHN0cikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzdHIpID8gc3RyLmpvaW4oJy4nKSA6IHN0clxufVxuXG5mdW5jdGlvbiB0b0FycmF5KHN0cikge1xuICByZXR1cm4gaXNBcnJheShzdHIpID8gc3RyIDogc3RyLnNwbGl0KCcuJylcbn1cblxuZnVuY3Rpb24gaXNQZXJtcyAocCkge1xuICByZXR1cm4gKFxuICAgIHAgJiZcbiAgICBpc0Z1bmN0aW9uKHAucHJlKSAmJlxuICAgIGlzRnVuY3Rpb24ocC50ZXN0KSAmJlxuICAgIGlzRnVuY3Rpb24ocC5wb3N0KVxuICApXG59XG5cbi8qXG5cbnBlcm1zOlxuXG5hIGdpdmVuIGNhcGFiaWxpdHkgbWF5IGJlIHBlcm1pdHRlZCB0byBjYWxsIGEgcGFydGljdWxhciBhcGkuXG5idXQgb25seSBpZiBhIHBlcm1zIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgdGhlIGFyZ3VtZW50c1xuaXQgcGFzc2VzLlxuXG5zdXBwb3NlLCBhbiBhcHAgbWF5IGJlIGdpdmVuIGFjY2VzcywgYnV0IG1heSBvbmx5IGNyZWF0ZSBmdW5jdGlvbnNcbndpdGggaXQncyBvd24gcHJvcGVydGllcy5cblxuY3JlYXRlIHBlcm1zOlxuICB7XG4gICAgYWxsb3c6IFsnYWRkJywgJ3F1ZXJ5J10sIGRlbnk6IFsuLi5dLFxuICAgIHJ1bGVzOiB7XG4gICAgICBhZGQ6IHtcbiAgICAgICAgY2FsbDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuICh2YWx1ZS50eXBlID09PSAndGFzaycgfHwgdmFsdWUudHlwZSA9PT0gJ190YXNrJylcbiAgICAgICAgfSxcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIGNhbGw6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHNhZmUuY29udGFpbnModmFsdWUsIHtwYXRoOiBbJ2NvbnRlbnQnLCAndHlwZSddLCBlcTogJ3Rhc2snfSkgfHxcbiAgICAgICAgICBzYWZlLmNvbnRhaW5zKHZhbHVlLCB7cGF0aDogWydjb250ZW50JywgJ3R5cGUnXSwgZXE6ICdfdGFzayd9KVxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiAodmFsdWUudHlwZSA9PT0gJ3Rhc2snIHx8IHZhbHVlLnR5cGUgPT09ICdfdGFzaycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgaWYoaXNQZXJtcyhvcHRzKSkgcmV0dXJuIG9wdHNcbiAgaWYoaXNGdW5jdGlvbihvcHRzKSkgcmV0dXJuIHtwcmU6IG9wdHN9XG4gIHZhciBhbGxvdyA9IG51bGxcbiAgdmFyIGRlbnkgPSB7fVxuXG4gIGZ1bmN0aW9uIHBlcm1zIChvcHRzKSB7XG4gICAgaWYob3B0cy5hbGxvdykge1xuICAgICAgYWxsb3cgPSB7fVxuICAgICAgb3B0cy5hbGxvdy5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIHUuc2V0KGFsbG93LCB0b0FycmF5KHBhdGgpLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWxzZSBhbGxvdyA9IG51bGxcblxuICAgIGlmKG9wdHMuZGVueSlcbiAgICAgIG9wdHMuZGVueS5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIHUuc2V0KGRlbnksIHRvQXJyYXkocGF0aCksIHRydWUpXG4gICAgICB9KVxuICAgIGVsc2UgZGVueSA9IHt9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgaWYob3B0cykgcGVybXMob3B0cylcblxuICBwZXJtcy5wcmUgPSBmdW5jdGlvbiAobmFtZSwgYXJncykge1xuICAgIG5hbWUgPSBpc0FycmF5KG5hbWUpID8gbmFtZSA6IFtuYW1lXVxuICAgIGlmKGFsbG93ICYmICF1LnByZWZpeChhbGxvdywgbmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdtZXRob2Q6JytuYW1lICsgJyBpcyBub3Qgb24gd2hpdGVsaXN0JylcblxuICAgIGlmKGRlbnkgJiYgdS5wcmVmaXgoZGVueSwgbmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdtZXRob2Q6JytuYW1lICsgJyBpcyBvbiBibGFja2xpc3QnKVxuICB9XG5cbiAgcGVybXMucG9zdCA9IGZ1bmN0aW9uIChlcnIsIHZhbHVlKSB7XG4gICAgLy9UT0RPXG4gIH1cblxuICAvL2FsaWFzIGZvciBwcmUsIHVzZWQgaW4gdGVzdHMuXG4gIHBlcm1zLnRlc3QgPSBmdW5jdGlvbiAobmFtZSwgYXJncykge1xuICAgIHJldHVybiBwZXJtcy5wcmUobmFtZSwgYXJncylcbiAgfVxuXG4gIHBlcm1zLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge2FsbG93OiBhbGxvdywgZGVueTogZGVueX1cbiAgfVxuXG4gIHJldHVybiBwZXJtc1xufVxuXG5cbiIsIid1c2Ugc3RyaWN0J1xudmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG4vLyB3cmFwIHB1bGwgc3RyZWFtcyBhcm91bmQgcGFja2V0LXN0cmVhbSdzIHdlaXJkIHN0cmVhbXMuXG5cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBkb25lID0gZmFsc2VcbiAgcmV0dXJuIGZ1bmN0aW9uIChlcnIsIHZhbCkge1xuICAgIGlmKGRvbmUpIHJldHVyblxuICAgIGRvbmUgPSB0cnVlXG4gICAgZm4oZXJyLCB2YWwpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAod2VpcmQsIF9kb25lKSB7XG4gIHZhciBidWZmZXIgPSBbXSwgZW5kZWQgPSBmYWxzZSwgd2FpdGluZywgYWJvcnRcblxuICB2YXIgZG9uZSA9IG9uY2UoZnVuY3Rpb24gKGVyciwgdikge1xuICAgIF9kb25lICYmIF9kb25lKGVyciwgdilcbiAgICAvLyBkZWFsbG9jYXRlXG4gICAgd2VpcmQgPSBudWxsXG4gICAgX2RvbmUgPSBudWxsICAgIFxuICAgIHdhaXRpbmcgPSBudWxsXG5cbiAgICBpZihhYm9ydCkgYWJvcnQoZXJyIHx8IHRydWUsIGZ1bmN0aW9uICgpIHt9KVxuICB9KVxuXG4gIHdlaXJkLnJlYWQgPSBmdW5jdGlvbiAoZGF0YSwgZW5kKSB7XG4gICAgZW5kZWQgPSBlbmRlZCB8fCBlbmRcblxuICAgIGlmKHdhaXRpbmcpIHtcbiAgICAgIHZhciBjYiA9IHdhaXRpbmdcbiAgICAgIHdhaXRpbmcgPSBudWxsXG4gICAgICBjYihlbmRlZCwgZGF0YSlcbiAgICB9XG4gICAgZWxzZSBpZighZW5kZWQpIGJ1ZmZlci5wdXNoKGRhdGEpXG5cbiAgICBpZihlbmRlZCkgZG9uZShlbmRlZCAhPT0gdHJ1ZSA/IGVuZGVkIDogbnVsbClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc291cmNlOiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgICBpZihhYm9ydCkge1xuICAgICAgICB3ZWlyZCAmJiB3ZWlyZC53cml0ZShudWxsLCBhYm9ydClcbiAgICAgICAgY2IoYWJvcnQpOyBkb25lKGFib3J0ICE9PSB0cnVlID8gYWJvcnQgOiBudWxsKVxuICAgICAgfVxuICAgICAgZWxzZSBpZihidWZmZXIubGVuZ3RoKSBjYihudWxsLCBidWZmZXIuc2hpZnQoKSlcbiAgICAgIGVsc2UgaWYoZW5kZWQpIGNiKGVuZGVkKVxuICAgICAgZWxzZSB3YWl0aW5nID0gY2JcbiAgICB9LFxuICAgIHNpbmsgIDogZnVuY3Rpb24gKHJlYWQpIHtcbiAgICAgIGlmKGVuZGVkKSByZXR1cm4gcmVhZChlbmRlZCwgZnVuY3Rpb24gKCkge30pLCBhYm9ydCA9IG51bGxcbiAgICAgIGFib3J0ID0gcmVhZFxuICAgICAgcHVsbC5kcmFpbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAvL1RPRE86IG1ha2UgdGhpcyBzaG91bGQgb25seSBoYXBwZW4gb24gYSBVTklQTEVYIHN0cmVhbS5cbiAgICAgICAgaWYoZW5kZWQpIHJldHVybiBmYWxzZVxuICAgICAgICB3ZWlyZC53cml0ZShkYXRhKVxuICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZih3ZWlyZCAmJiAhd2VpcmQud3JpdGVFbmQpIHdlaXJkLndyaXRlKG51bGwsIGVyciB8fCB0cnVlKVxuICAgICAgICBkb25lICYmIGRvbmUoZXJyKVxuICAgICAgfSlcbiAgICAgIChyZWFkKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1bmlwbGV4IChzLCBkb25lKSB7XG4gIHJldHVybiBtb2R1bGUuZXhwb3J0cyhzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYoIXMud3JpdGVFbmQpIHMud3JpdGUobnVsbCwgZXJyIHx8IHRydWUpXG4gICAgaWYoZG9uZSkgZG9uZShlcnIpXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzLnNvdXJjZSA9IGZ1bmN0aW9uIChzKSB7XG4gIHJldHVybiB1bmlwbGV4KHMpLnNvdXJjZVxufVxubW9kdWxlLmV4cG9ydHMuc2luayA9IGZ1bmN0aW9uIChzLCBkb25lKSB7XG4gIHJldHVybiB1bmlwbGV4KHMsIGRvbmUpLnNpbmtcbn1cblxubW9kdWxlLmV4cG9ydHMuZHVwbGV4ID0gbW9kdWxlLmV4cG9ydHNcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBQYWNrZXRTdHJlYW0gPSByZXF1aXJlKCdwYWNrZXQtc3RyZWFtJylcbnZhciBwdWxsICAgICAgICAgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgcHVsbFdlaXJkICAgID0gcmVxdWlyZSgnLi9wdWxsLXdlaXJkJylcbnZhciBnb29kYnllICAgICAgPSByZXF1aXJlKCdwdWxsLWdvb2RieWUnKVxudmFyIHUgICAgICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbCcpXG52YXIgZXhwbGFpbiAgICAgID0gcmVxdWlyZSgnZXhwbGFpbi1lcnJvcicpXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuICdmdW5jdGlvbicgPT09IHR5cGVvZiBmXG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nIChzKSB7XG4gIHJldHVybiAnc3RyaW5nJyA9PT0gdHlwZW9mIHNcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QgKG8pIHtcbiAgcmV0dXJuIG8gJiYgJ29iamVjdCcgPT09IHR5cGVvZiBvXG59XG5cbmZ1bmN0aW9uIGlzU291cmNlICAgICh0KSB7IHJldHVybiAnc291cmNlJyA9PT0gdCB9XG5mdW5jdGlvbiBpc1NpbmsgICAgICAodCkgeyByZXR1cm4gJ3NpbmsnICAgPT09IHQgfVxuZnVuY3Rpb24gaXNEdXBsZXggICAgKHQpIHsgcmV0dXJuICdkdXBsZXgnID09PSB0IH1cbmZ1bmN0aW9uIGlzU3luYyAgICAgICh0KSB7IHJldHVybiAnc3luYycgID09PSB0IH1cbmZ1bmN0aW9uIGlzQXN5bmMgICAgICh0KSB7IHJldHVybiAnYXN5bmMnICA9PT0gdCB9XG5mdW5jdGlvbiBpc1JlcXVlc3QgICAodCkgeyByZXR1cm4gaXNTeW5jKHQpIHx8IGlzQXN5bmModCkgfVxuZnVuY3Rpb24gaXNTdHJlYW0gICAgKHQpIHsgcmV0dXJuIGlzU291cmNlKHQpIHx8IGlzU2luayh0KSB8fCBpc0R1cGxleCh0KSB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5pdFN0cmVhbSAobG9jYWxDYWxsLCBjb2RlYywgb25DbG9zZSkge1xuXG4gIHZhciBwcyA9IFBhY2tldFN0cmVhbSh7XG4gICAgbWVzc2FnZTogZnVuY3Rpb24gKG1zZykge1xuLy8gICAgICBpZihpc1N0cmluZyhtc2cpKSByZXR1cm5cbi8vICAgICAgaWYobXNnLmxlbmd0aCA+IDAgJiYgaXNTdHJpbmcobXNnWzBdKSlcbi8vICAgICAgICBsb2NhbENhbGwoJ21zZycsICdlbWl0JywgbXNnKVxuICAgIH0sXG4gICAgcmVxdWVzdDogZnVuY3Rpb24gKG9wdHMsIGNiKSB7XG4gICAgICB2YXIgbmFtZSA9IG9wdHMubmFtZSwgYXJncyA9IG9wdHMuYXJnc1xuICAgICAgdmFyIGluQ0IgPSBmYWxzZSwgY2FsbGVkID0gZmFsc2UsIGFzeW5jID0gZmFsc2UsIHZhbHVlXG5cbiAgICAgIGFyZ3MucHVzaChmdW5jdGlvbiAoZXJyLCB2YWx1ZSkge1xuICAgICAgICBjYWxsZWQgPSB0cnVlXG4gICAgICAgIGluQ0IgPSB0cnVlOyBjYihlcnIsIHZhbHVlKVxuICAgICAgfSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlID0gbG9jYWxDYWxsKCdhc3luYycsIG5hbWUsIGFyZ3MpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYoaW5DQiB8fCBjYWxsZWQpIHRocm93IGV4cGxhaW4oZXJyLCAnbm8gY2FsbGJhY2sgcHJvdmlkZWQgdG8gbXV4cnBjIGFzeW5jIGZ1bnRpb24nKVxuICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgfVxuXG4gICAgfSxcbiAgICBzdHJlYW06IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgIHN0cmVhbS5yZWFkID0gZnVuY3Rpb24gKGRhdGEsIGVuZCkge1xuICAgICAgICB2YXIgbmFtZSA9IGRhdGEubmFtZVxuICAgICAgICB2YXIgdHlwZSA9IGRhdGEudHlwZVxuICAgICAgICB2YXIgZXJyLCB2YWx1ZVxuXG4gICAgICAgIHN0cmVhbS5yZWFkID0gbnVsbFxuXG4gICAgICAgIGlmKCFpc1N0cmVhbSh0eXBlKSlcbiAgICAgICAgICByZXR1cm4gc3RyZWFtLndyaXRlKG51bGwsIG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGU6Jyt0eXBlKSlcblxuICAgICAgICAvL2hvdyB3b3VsZCB0aGlzIGFjdHVhbGx5IGhhcHBlbj9cbiAgICAgICAgaWYoZW5kKSByZXR1cm4gc3RyZWFtLndyaXRlKG51bGwsIGVuZClcblxuICAgICAgICB0cnkgeyB2YWx1ZSA9IGxvY2FsQ2FsbCh0eXBlLCBuYW1lLCBkYXRhLmFyZ3MpIH1cbiAgICAgICAgY2F0Y2ggKF9lcnIpIHsgZXJyID0gX2VyciB9XG5cbiAgICAgICAgdmFyIF9zdHJlYW0gPSBwdWxsV2VpcmRbXG4gICAgICAgICAge3NvdXJjZTogJ3NpbmsnLCBzaW5rOiAnc291cmNlJ31bdHlwZV0gfHwgJ2R1cGxleCdcbiAgICAgICAgXShzdHJlYW0pXG5cbiAgICAgICAgcmV0dXJuIHUucGlwZVRvU3RyZWFtKFxuICAgICAgICAgIHR5cGUsIF9zdHJlYW0sXG4gICAgICAgICAgZXJyID8gdS5lcnJvckFzU3RyZWFtKHR5cGUsIGVycikgOiB2YWx1ZVxuICAgICAgICApXG5cbi8vICAgICAgICBpZihpc1NvdXJjZSh0eXBlKSlcbi8vICAgICAgICAgIF9zdHJlYW0oZXJyID8gcHVsbC5lcnJvcihlcnIpIDogdmFsdWUpXG4vLyAgICAgICAgZWxzZSBpZiAoaXNTaW5rKHR5cGUpKVxuLy8gICAgICAgICAgKGVyciA/IGFib3J0U2luayhlcnIpIDogdmFsdWUpKF9zdHJlYW0pXG4vLyAgICAgICAgZWxzZSBpZiAoaXNEdXBsZXgodHlwZSkpXG4vLyAgICAgICAgICBwdWxsKF9zdHJlYW0sIGVyciA/IGFib3J0RHVwbGV4KGVycikgOiB2YWx1ZSwgX3N0cmVhbSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xvc2U6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgcHMgPSBudWxsIC8vIGRlYWxsb2NhdGVcbiAgICAgICAgd3MuZW5kZWQgPSB0cnVlXG4gICAgICAgIGlmKHdzLmNsb3NlZCkgcmV0dXJuXG4gICAgICAgIHdzLmNsb3NlZCA9IHRydWVcbiAgICAgICAgaWYob25DbG9zZSkge1xuICAgICAgICAgIHZhciBjbG9zZSA9IG9uQ2xvc2U7IG9uQ2xvc2UgPSBudWxsOyBjbG9zZShlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgfSlcblxuICB2YXIgd3MgPSBnb29kYnllKHB1bGxXZWlyZChwcywgZnVuY3Rpb24gKF8pIHtcbiAgICAvL3RoaXMgZXJyb3Igd2lsbCBiZSBoYW5kbGVkIGluIFBhY2tldFN0cmVhbS5jbG9zZVxuICB9KSlcblxuICB3cyA9IGNvZGVjID8gY29kZWMod3MpIDogd3NcblxuICB3cy5yZW1vdGVDYWxsID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIGFyZ3MsIGNiKSB7XG4gICAgaWYobmFtZSA9PT0gJ2VtaXQnKSByZXR1cm4gcHMubWVzc2FnZShhcmdzKVxuXG4gICAgaWYoIShpc1JlcXVlc3QodHlwZSkgfHwgaXNTdHJlYW0odHlwZSkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCB0eXBlOicgKyBKU09OLnN0cmluZ2lmeSh0eXBlKSlcblxuICAgIGlmKGlzUmVxdWVzdCh0eXBlKSlcbiAgICAgIHJldHVybiBwcy5yZXF1ZXN0KHtuYW1lOiBuYW1lLCBhcmdzOiBhcmdzfSwgY2IpXG5cbiAgICB2YXIgd3MgPSBwcy5zdHJlYW0oKSwgcyA9IHB1bGxXZWlyZFt0eXBlXSh3cywgY2IpXG4gICAgd3Mud3JpdGUoe25hbWU6IG5hbWUsIGFyZ3M6IGFyZ3MsIHR5cGU6IHR5cGV9KVxuICAgIHJldHVybiBzXG4gIH1cblxuXG4gIC8vaGFjayB0byB3b3JrIGFyb3VuZCBvcmRlcmluZyBpbiBzZXR0aW5nIHBzLmVuZGVkLlxuICAvL1F1ZXN0aW9uOiBpZiBhbiBvYmplY3QgaGFzIHN1Ym9iamVjdHMsIHdoaWNoXG4gIC8vYWxsIGhhdmUgY2xvc2UgZXZlbnRzLCBzaG91bGQgdGhlIHN1Ym9iamVjdHMgZmlyZSBjbG9zZVxuICAvL2JlZm9yZSB0aGUgcGFyZW50PyBvciBzaG91bGQgcGFyZW50cyBjbG9zZSBhZnRlcj9cbiAgLy9zaG91bGQgdGhlcmUgYmUgYSBwcmVjbG9zZSBldmVudCBvbiB0aGUgcGFyZW50XG4gIC8vdGhhdCBmaXJlcyB3aGVuIGl0J3MgYWJvdXQgdG8gY2xvc2UgYWxsIHRoZSBjaGlsZHJlbj9cbiAgd3MuaXNPcGVuID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhcHMuZW5kZWRcbiAgfVxuXG4gIHdzLmNsb3NlID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgICBpZihpc0Z1bmN0aW9uKGVycikpXG4gICAgICBjYiA9IGVyciwgZXJyID0gZmFsc2VcbiAgICBpZighcHMpIHJldHVybiAoY2IgJiYgY2IoKSlcbiAgICBpZihlcnIpIHJldHVybiBwcy5kZXN0cm95KGVyciksIChjYiAmJiBjYigpKVxuXG4gICAgcHMuY2xvc2UoZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYoY2IpIGNiKGVycilcbiAgICAgIGVsc2UgaWYoZXJyKSB0aHJvdyBleHBsYWluKGVyciwgJ25vIGNhbGxiYWNrIHByb3ZpZGVkIGZvciBtdXhycGMgY2xvc2UnKVxuICAgIH0pXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIHdzLmNsb3NlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHdzXG59XG5cblxuXG4iLCIndXNlIHN0cmljdCc7XG52YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcblxuZnVuY3Rpb24gaXNTdHJpbmcgKHMpIHtcbiAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2Ygc1xufVxuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXlcblxuZnVuY3Rpb24gaXNPYmplY3QgKG8pIHtcbiAgcmV0dXJuIG8gJiYgJ29iamVjdCcgPT09IHR5cGVvZiBvICYmICFpc0FycmF5KG8pXG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkgKG9iaikge1xuICBmb3IodmFyIGsgaW4gb2JqKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlXG59XG5cbi8vSSB3cm90ZSBzZXQgYXMgcGFydCBvZiBwZXJtaXNzaW9ucy5qc1xuLy9hbmQgdGhlbiBsYXRlciBtb3VudCwgdGhleSBkbyBuZWFybHkgdGhlIHNhbWUgdGhpbmdcbi8vYnV0IG5vdCBxdWl0ZS4gdGhpcyBzaG91bGQgYmUgcmVmYWN0b3JlZCBzb21ldGltZS5cbi8vd2hhdCBkaWZmZXJzIGlzIHRoYXQgc2V0IHVwZGF0ZXMgdGhlIGxhc3Qga2V5IGluIHRoZSBwYXRoXG4vL3RvIHRoZSBuZXcgdmFsdWUsIGJ1dCBtb3VudCBtZXJnZXMgdGhlIGxhc3QgdmFsdWVcbi8vd2hpY2ggbWFrZXMgc2Vuc2UgaWYgaXQncyBhbiBvYmplY3QsIGFuZCBzZXQgbWFrZXMgc2Vuc2UgaWYgaXQnc1xuLy9hIHN0cmluZy9udW1iZXIvYm9vbGVhbi5cblxuZXhwb3J0cy5zZXQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkge1xuICB2YXIgX29iaiwgX2tcbiAgZm9yKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgayA9IHBhdGhbaV1cbiAgICBvYmpba10gPSBvYmpba10gfHwge31cbiAgICBfb2JqID0gb2JqOyBfayA9IGtcbiAgICBvYmogPSBvYmpba11cbiAgfVxuICBfb2JqW19rXSA9IHZhbHVlXG59XG5cbmV4cG9ydHMuZ2V0ID0gZnVuY3Rpb24gKG9iaiwgcGF0aCkge1xuICBpZihpc1N0cmluZyhwYXRoKSkgcmV0dXJuIG9ialtwYXRoXVxuICB2YXIgdmFsdWVcbiAgZm9yKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgayA9IHBhdGhbaV1cbiAgICB2YWx1ZSA9IG9iaiA9IG9ialtrXVxuICAgIGlmKG51bGwgPT0gb2JqKSByZXR1cm4gb2JqXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmV4cG9ydHMucHJlZml4ID0gZnVuY3Rpb24gKG9iaiwgcGF0aCkge1xuICB2YXIgdmFsdWUsIHBhcmVudCA9IG9ialxuXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGsgPSBwYXRoW2ldXG4gICAgdmFsdWUgPSBvYmogPSBvYmpba11cbiAgICBpZignb2JqZWN0JyAhPT0gdHlwZW9mIG9iaikge1xuICAgICAgcmV0dXJuIG9ialxuICAgIH1cbiAgICBwYXJlbnQgPSBvYmpcbiAgfVxuICByZXR1cm4gJ29iamVjdCcgIT09IHR5cGVvZiB2YWx1ZSA/ICEhdmFsdWUgOiBmYWxzZVxufVxuXG5cbmZ1bmN0aW9uIG1rUGF0aChvYmosIHBhdGgpIHtcbiAgZm9yKHZhciBpIGluIHBhdGgpIHtcbiAgICB2YXIga2V5ID0gcGF0aFtpXVxuICAgIGlmKCFvYmpba2V5XSkgb2JqW2tleV09e31cbiAgICBvYmogPSBvYmpba2V5XVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5mdW5jdGlvbiBybVBhdGggKG9iaiwgcGF0aCkge1xuICAoZnVuY3Rpb24gciAob2JqLCBpKSB7XG4gICAgdmFyIGtleSA9IHBhdGhbaV1cbiAgICBpZighb2JqKSByZXR1cm5cbiAgICBlbHNlIGlmKHBhdGgubGVuZ3RoIC0gMSA9PT0gaSlcbiAgICAgIGRlbGV0ZSBvYmpba2V5XVxuICAgIGVsc2UgaWYoaSA8IHBhdGgubGVuZ3RoKSByKG9ialtrZXldLCBpKzEpXG4gICAgaWYoaXNFbXB0eShvYmpba2V5XSkpIGRlbGV0ZSBvYmpba2V5XVxuICB9KShvYmosIDApXG59XG5cbmZ1bmN0aW9uIG1lcmdlIChvYmosIF9vYmopIHtcbiAgZm9yKHZhciBrIGluIF9vYmopXG4gICAgb2JqW2tdID0gX29ialtrXVxuICByZXR1cm4gb2JqXG59XG5cbnZhciBtb3VudCA9IGV4cG9ydHMubW91bnQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBfb2JqKSB7XG4gIGlmKCFBcnJheS5pc0FycmF5KHBhdGgpKVxuICAgIHRocm93IG5ldyBFcnJvcigncGF0aCBtdXN0IGJlIGFycmF5IG9mIHN0cmluZ3MnKVxuICByZXR1cm4gbWVyZ2UobWtQYXRoKG9iaiwgcGF0aCksIF9vYmopXG59XG52YXIgdW5tb3VudCA9IGV4cG9ydHMudW5tb3VudCA9IGZ1bmN0aW9uIChvYmosIHBhdGgpIHtcbiAgcmV0dXJuIHJtUGF0aChvYmosIHBhdGgpXG59XG5cbmZ1bmN0aW9uIGlzU291cmNlICAgICh0KSB7IHJldHVybiAnc291cmNlJyA9PT0gdCB9XG5mdW5jdGlvbiBpc1NpbmsgICAgICAodCkgeyByZXR1cm4gJ3NpbmsnICAgPT09IHQgfVxuZnVuY3Rpb24gaXNEdXBsZXggICAgKHQpIHsgcmV0dXJuICdkdXBsZXgnID09PSB0IH1cbmZ1bmN0aW9uIGlzU3luYyAgICAgICh0KSB7IHJldHVybiAnc3luYycgID09PSB0IH1cbmZ1bmN0aW9uIGlzQXN5bmMgICAgICh0KSB7IHJldHVybiAnYXN5bmMnICA9PT0gdCB9XG5mdW5jdGlvbiBpc1JlcXVlc3QgICAodCkgeyByZXR1cm4gaXNTeW5jKHQpIHx8IGlzQXN5bmModCkgfVxuZnVuY3Rpb24gaXNTdHJlYW0gICAgKHQpIHsgcmV0dXJuIGlzU291cmNlKHQpIHx8IGlzU2luayh0KSB8fCBpc0R1cGxleCh0KSB9XG5cbmZ1bmN0aW9uIGFib3J0U2luayAoZXJyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIHJlYWQoZXJyIHx8IHRydWUsIGZ1bmN0aW9uICgpIHt9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFib3J0RHVwbGV4IChlcnIpIHtcbiAgcmV0dXJuIHtzb3VyY2U6IHB1bGwuZXJyb3IoZXJyKSwgc2luazogYWJvcnRTaW5rKGVycil9XG59XG5cbmV4cG9ydHMuZXJyb3JBc1N0cmVhbSA9IGZ1bmN0aW9uICh0eXBlLCBlcnIpIHtcbiAgcmV0dXJuIChcbiAgICAgIGlzU291cmNlKHR5cGUpICA/IHB1bGwuZXJyb3IoZXJyKVxuICAgIDogaXNTaW5rKHR5cGUpICAgID8gYWJvcnRTaW5rKGVycilcbiAgICA6ICAgICAgICAgICAgICAgICAgIGFib3J0RHVwbGV4KGVycilcbiAgKVxufVxuXG5cbmV4cG9ydHMuZXJyb3JBc1N0cmVhbU9yQ2IgPSBmdW5jdGlvbiAodHlwZSwgZXJyLCBjYikge1xuICByZXR1cm4gKFxuICAgICAgaXNSZXF1ZXN0KHR5cGUpID8gY2IoZXJyKVxuICAgIDogaXNTb3VyY2UodHlwZSkgID8gcHVsbC5lcnJvcihlcnIpXG4gICAgOiBpc1NpbmsodHlwZSkgICAgPyBhYm9ydFNpbmsoZXJyKVxuICAgIDogICAgICAgICAgICAgICAgICAgY2IoZXJyKSwgYWJvcnREdXBsZXgoZXJyKVxuICApXG59XG5cbmV4cG9ydHMucGlwZVRvU3RyZWFtID0gZnVuY3Rpb24gKHR5cGUsIF9zdHJlYW0sIHN0cmVhbSkge1xuICBpZihpc1NvdXJjZSh0eXBlKSlcbiAgICBfc3RyZWFtKHN0cmVhbSlcbiAgZWxzZSBpZiAoaXNTaW5rKHR5cGUpKVxuICAgIHN0cmVhbShfc3RyZWFtKVxuICBlbHNlIGlmIChpc0R1cGxleCh0eXBlKSlcbiAgICBwdWxsKF9zdHJlYW0sIHN0cmVhbSwgX3N0cmVhbSlcbn1cblxuIiwidmFyIG9zID0gcmVxdWlyZSgnb3MnKVxudmFyIGlwID0gcmVxdWlyZSgnaXAnKVxuLy9waWNrIHRoZSBmaXJzdCByZWFzb25hYmxlIGxvb2tpbmcgaG9zdC5cbi8vdGhpcyBzaG91bGQgKmp1c3Qgd29yayogd2hlbiBydW5uaW5nIG9uIGEgdnBzLlxuXG52YXIgaXNQcml2YXRlID0gaXAuaXNQcml2YXRlXG5cbmZ1bmN0aW9uIGlzTm9uUHJpdmF0ZSAoZSkge1xuICByZXR1cm4gIWlzUHJpdmF0ZShlKVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGludGVyLCBmaWx0ZXIpIHtcbiAgaW50ZXIgPSBpbnRlciB8fCBvcy5uZXR3b3JrSW50ZXJmYWNlcygpXG4gIGZpbHRlciA9IGZpbHRlciB8fCBpc05vblByaXZhdGVcbiAgZm9yKHZhciBrIGluIGludGVyKSB7XG4gICAgZm9yKHZhciBpIGluIGludGVyW2tdKSB7XG4gICAgICB2YXIgZSA9IGludGVyW2tdW2ldXG4gICAgICAvLyBmaW5kIGEgcmVhc29uYWJsZSBsb29raW5nIGFkZHJlc3NcbiAgICAgIGlmKCFlLmludGVybmFsICYmIGZpbHRlcihlLmFkZHJlc3MpKVxuICAgICAgICAgIHJldHVybiBlLmFkZHJlc3NcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMucHJpdmF0ZSA9IGZ1bmN0aW9uIChpbnRlcikge1xuICByZXR1cm4gbW9kdWxlLmV4cG9ydHMoaW50ZXIsIGlzUHJpdmF0ZSlcbn1cblxuaWYoIW1vZHVsZS5wYXJlbnQpIHtcbiAgdmFyIGggPSBtb2R1bGUuZXhwb3J0cygpXG4gIGlmKCFoKSB7XG4gICAgY29uc29sZS5lcnJvcignbm8gbm9uLXByaXZhdGUgYWRkcmVzcycpXG4gICAgY29uc29sZS5lcnJvcigncHJpdmF0ZTonLCBtb2R1bGUuZXhwb3J0cy5wcml2YXRlKCkpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgY29uc29sZS5sb2coaClcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBOb3JtYWxpemUgYHVyaWAuIFRoaXMgb25seSB3b3JrcyB3aGVuIGJvdGggYGVuY29kZVVSSWBcbiAqIGFuZCBgZGVjb2RlVVJJYCBhcmUgYXZhaWxhYmxlLCBhbmQgd2hlblxuICogZGVjb2RpbmcvZW5jb2RpbmcgZmFpbHMsIGp1c3QgcmV0dXJucyBgdXJpYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBub3JtYWxpemVVUkkoJ2ZvbyBiYXInKTsgLy8gJ2ZvbyUyMGJhcidcbiAqICAgbm9ybWFsaXplVVJJKCdmb28lMjBiYXInKTsgLy8gJ2ZvbyUyMGJhcidcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJpIC0gVmFsdWUgd2l0aCBhbmQvb3Igd2l0aG91dFxuICogICBlbmNvZGVkLCBlbnRpdGllcy5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBFbmNvZGVkIFVSSSAod2hlbiBlbmNvZGluZyBzdWNjZWVkcyxcbiAqIG9yIGB1cmlgKS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVVJJKHVyaSkge1xuICAgIHRyeSB7XG4gICAgICAgIHVyaSA9IGVuY29kZVVSSShkZWNvZGVVUkkodXJpKSk7XG4gICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7IC8qIGVtcHR5ICovIH1cblxuICAgIHJldHVybiB1cmk7XG59XG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBub3JtYWxpemVVUkk7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuJ3VzZSBzdHJpY3QnO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwiXG52YXIgT2JzZXJ2ID0gcmVxdWlyZSgnb2JzZXJ2JylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVsYXkpIHtcblxuICBkZWxheSA9IGRlbGF5IHx8IDIwMFxuICB2YXIgbyA9IE9ic2VydigpLCAgc2V0ID0gby5zZXQsIHRzID0gMCwgdGltZXIsIHZcblxuICBvLnNldCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFsdWUgPSB2XG4gICAgdmFyIG5leHQgPSAodHMgKyBkZWxheSkgLSBEYXRlLm5vdygpXG4gICAgaWYobmV4dCA+PSAwKSB7XG4gICAgICBpZighdGltZXIpXG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGltZXIgPSBudWxsXG4gICAgICAgICAgdHMgPSBEYXRlLm5vdygpXG4gICAgICAgICAgc2V0KHZhbHVlKVxuICAgICAgICB9LCBuZXh0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHMgPSBEYXRlLm5vdygpXG4gICAgc2V0KHYpXG4gIH1cblxuICBvLmltbWVkaWF0ZSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdHMgPSAwXG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgIHJldHVybiBvLnNldCh2KVxuICB9XG5cbiAgcmV0dXJuIG9cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gT2JzZXJ2YWJsZVxuXG5mdW5jdGlvbiBPYnNlcnZhYmxlKHZhbHVlKSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IFtdXG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHZhbHVlXG5cbiAgICBvYnNlcnZhYmxlLnNldCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHZhbHVlID0gdlxuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgICAgICAgZih2KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBvYnNlcnZhYmxlXG5cbiAgICBmdW5jdGlvbiBvYnNlcnZhYmxlKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpXG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpLCAxKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIHNsZWVwQ2hlY2tJbnRlcnZhbFxudmFyIGxhc3RTbGVlcENoZWNrID0gZmFsc2VcbnZhciBTTEVFUF9DSEVDS19JTlRFUlZBTCA9IDEwZTNcbnZhciBOVU1fTUlTU0FCTEVfSU5URVJWQUxTID0gM1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJylcbnZhciBlbWl0dGVyID0gbmV3IEVFKClcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2IpIHtcbiAgZW1pdHRlci5vbignd2FrZXVwJywgY2IpXG5cbiAgaWYgKCFzbGVlcENoZWNrSW50ZXJ2YWwpIHtcbiAgICAvLyBzZXR1cCBpbnRlcnZhbFxuICAgIHNsZWVwQ2hlY2tJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0ID0gRGF0ZS5ub3coKVxuICAgICAgaWYgKGxhc3RTbGVlcENoZWNrICYmICh0IC0gbGFzdFNsZWVwQ2hlY2spID4gU0xFRVBfQ0hFQ0tfSU5URVJWQUwqTlVNX01JU1NBQkxFX0lOVEVSVkFMUylcbiAgICAgICAgZW1pdHRlci5lbWl0KCd3YWtldXAnKSAvLyBtaXNzZWQgTlVNX01JU1NBQkxFX0lOVEVSVkFMUyBjaGVja3MsIGxldCdzIHJ1biB0aGUgY2FsbGJhY2tzIFxuICAgICAgbGFzdFNsZWVwQ2hlY2sgPSB0XG4gICAgfSwgU0xFRVBfQ0hFQ0tfSU5URVJWQUwpXG4gIH1cbiAgXG4gIC8vIHVucmVmZXJlbmNlIHRoZSB0aW1lciBzbyB0aGF0IHRoZSBwcm9ncmFtIGNhbiBjbG9zZVxuICBpZiAoc2xlZXBDaGVja0ludGVydmFsLnVucmVmKVxuICAgIHNsZWVwQ2hlY2tJbnRlcnZhbC51bnJlZigpXG5cbiAgcmV0dXJuIHNsZWVwQ2hlY2tJbnRlcnZhbFxufVxuIiwidmFyIHdyYXBweSA9IHJlcXVpcmUoJ3dyYXBweScpXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXBweShvbmNlKVxuXG5vbmNlLnByb3RvID0gb25jZShmdW5jdGlvbiAoKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlJywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZSh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG59KVxuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpIHJldHVybiBmLnZhbHVlXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuIiwiZXhwb3J0cy5lbmRpYW5uZXNzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ0xFJyB9O1xuXG5leHBvcnRzLmhvc3RuYW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZVxuICAgIH1cbiAgICBlbHNlIHJldHVybiAnJztcbn07XG5cbmV4cG9ydHMubG9hZGF2ZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdIH07XG5cbmV4cG9ydHMudXB0aW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gMCB9O1xuXG5leHBvcnRzLmZyZWVtZW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE51bWJlci5NQVhfVkFMVUU7XG59O1xuXG5leHBvcnRzLnRvdGFsbWVtID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xufTtcblxuZXhwb3J0cy5jcHVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW10gfTtcblxuZXhwb3J0cy50eXBlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ0Jyb3dzZXInIH07XG5cbmV4cG9ydHMucmVsZWFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5hcHBWZXJzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59O1xuXG5leHBvcnRzLm5ldHdvcmtJbnRlcmZhY2VzXG49IGV4cG9ydHMuZ2V0TmV0d29ya0ludGVyZmFjZXNcbj0gZnVuY3Rpb24gKCkgeyByZXR1cm4ge30gfTtcblxuZXhwb3J0cy5hcmNoID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2phdmFzY3JpcHQnIH07XG5cbmV4cG9ydHMucGxhdGZvcm0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnYnJvd3NlcicgfTtcblxuZXhwb3J0cy50bXBkaXIgPSBleHBvcnRzLnRtcERpciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJy90bXAnO1xufTtcblxuZXhwb3J0cy5FT0wgPSAnXFxuJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBvcyA9IHJlcXVpcmUoJ29zJyk7XG5cbmZ1bmN0aW9uIGhvbWVkaXIoKSB7XG5cdHZhciBlbnYgPSBwcm9jZXNzLmVudjtcblx0dmFyIGhvbWUgPSBlbnYuSE9NRTtcblx0dmFyIHVzZXIgPSBlbnYuTE9HTkFNRSB8fCBlbnYuVVNFUiB8fCBlbnYuTE5BTUUgfHwgZW52LlVTRVJOQU1FO1xuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0cmV0dXJuIGVudi5VU0VSUFJPRklMRSB8fCBlbnYuSE9NRURSSVZFICsgZW52LkhPTUVQQVRIIHx8IGhvbWUgfHwgbnVsbDtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuXHRcdHJldHVybiBob21lIHx8ICh1c2VyID8gJy9Vc2Vycy8nICsgdXNlciA6IG51bGwpO1xuXHR9XG5cblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCcpIHtcblx0XHRyZXR1cm4gaG9tZSB8fCAocHJvY2Vzcy5nZXR1aWQoKSA9PT0gMCA/ICcvcm9vdCcgOiAodXNlciA/ICcvaG9tZS8nICsgdXNlciA6IG51bGwpKTtcblx0fVxuXG5cdHJldHVybiBob21lIHx8IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIG9zLmhvbWVkaXIgPT09ICdmdW5jdGlvbicgPyBvcy5ob21lZGlyIDogaG9tZWRpcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xudmFyIHRyYWlsaW5nU2xhc2hSZSA9IGlzV2luZG93cyA/IC9bXjpdXFxcXCQvIDogLy5cXC8kLztcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9pby5qcy9ibG9iLzNlN2ExNDM4MTQ5N2EzYjczZGRhNjhkMDViNTEzMDU2M2NkYWI0MjAvbGliL29zLmpzI0wyNS1MNDNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgcGF0aDtcblxuXHRpZiAoaXNXaW5kb3dzKSB7XG5cdFx0cGF0aCA9IHByb2Nlc3MuZW52LlRFTVAgfHxcblx0XHRcdHByb2Nlc3MuZW52LlRNUCB8fFxuXHRcdFx0KHByb2Nlc3MuZW52LlN5c3RlbVJvb3QgfHwgcHJvY2Vzcy5lbnYud2luZGlyKSArICdcXFxcdGVtcCc7XG5cdH0gZWxzZSB7XG5cdFx0cGF0aCA9IHByb2Nlc3MuZW52LlRNUERJUiB8fFxuXHRcdFx0cHJvY2Vzcy5lbnYuVE1QIHx8XG5cdFx0XHRwcm9jZXNzLmVudi5URU1QIHx8XG5cdFx0XHQnL3RtcCc7XG5cdH1cblxuXHRpZiAodHJhaWxpbmdTbGFzaFJlLnRlc3QocGF0aCkpIHtcblx0XHRwYXRoID0gcGF0aC5zbGljZSgwLCAtMSk7XG5cdH1cblxuXHRyZXR1cm4gcGF0aDtcbn07XG4iLCJ2YXIgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJylcbnZhciBleGVjID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNcbnZhciBvc1RtcGRpciA9IHJlcXVpcmUoJ29zLXRtcGRpcicpXG52YXIgb3NIb21lZGlyID0gcmVxdWlyZSgnb3MtaG9tZWRpcicpXG5cbi8vIGxvb2tpbmcgdXAgZW52cyBpcyBhIGJpdCBjb3N0bHkuXG4vLyBBbHNvLCBzb21ldGltZXMgd2Ugd2FudCB0byBoYXZlIGEgZmFsbGJhY2tcbi8vIFBhc3MgaW4gYSBjYWxsYmFjayB0byB3YWl0IGZvciB0aGUgZmFsbGJhY2sgb24gZmFpbHVyZXNcbi8vIEFmdGVyIHRoZSBmaXJzdCBsb29rdXAsIGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIHRoaW5nLlxuZnVuY3Rpb24gbWVtbyAoa2V5LCBsb29rdXAsIGZhbGxiYWNrKSB7XG4gIHZhciBmZWxsID0gZmFsc2VcbiAgdmFyIGZhbGxpbmcgPSBmYWxzZVxuICBleHBvcnRzW2tleV0gPSBmdW5jdGlvbiAoY2IpIHtcbiAgICB2YXIgdmFsID0gbG9va3VwKClcbiAgICBpZiAoIXZhbCAmJiAhZmVsbCAmJiAhZmFsbGluZyAmJiBmYWxsYmFjaykge1xuICAgICAgZmVsbCA9IHRydWVcbiAgICAgIGZhbGxpbmcgPSB0cnVlXG4gICAgICBleGVjKGZhbGxiYWNrLCBmdW5jdGlvbiAoZXIsIG91dHB1dCwgc3RkZXJyKSB7XG4gICAgICAgIGZhbGxpbmcgPSBmYWxzZVxuICAgICAgICBpZiAoZXIpIHJldHVybiAvLyBvaCB3ZWxsLCB3ZSB0cmllZFxuICAgICAgICB2YWwgPSBvdXRwdXQudHJpbSgpXG4gICAgICB9KVxuICAgIH1cbiAgICBleHBvcnRzW2tleV0gPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIGlmIChjYikgcHJvY2Vzcy5uZXh0VGljayhjYi5iaW5kKG51bGwsIG51bGwsIHZhbCkpXG4gICAgICByZXR1cm4gdmFsXG4gICAgfVxuICAgIGlmIChjYiAmJiAhZmFsbGluZykgcHJvY2Vzcy5uZXh0VGljayhjYi5iaW5kKG51bGwsIG51bGwsIHZhbCkpXG4gICAgcmV0dXJuIHZhbFxuICB9XG59XG5cbm1lbW8oJ3VzZXInLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoIGlzV2luZG93c1xuICAgICAgICAgPyBwcm9jZXNzLmVudi5VU0VSRE9NQUlOICsgJ1xcXFwnICsgcHJvY2Vzcy5lbnYuVVNFUk5BTUVcbiAgICAgICAgIDogcHJvY2Vzcy5lbnYuVVNFUlxuICAgICAgICAgKVxufSwgJ3dob2FtaScpXG5cbm1lbW8oJ3Byb21wdCcsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzV2luZG93cyA/IHByb2Nlc3MuZW52LlBST01QVCA6IHByb2Nlc3MuZW52LlBTMVxufSlcblxubWVtbygnaG9zdG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpc1dpbmRvd3MgPyBwcm9jZXNzLmVudi5DT01QVVRFUk5BTUUgOiBwcm9jZXNzLmVudi5IT1NUTkFNRVxufSwgJ2hvc3RuYW1lJylcblxubWVtbygndG1wZGlyJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gb3NUbXBkaXIoKVxufSlcblxubWVtbygnaG9tZScsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG9zSG9tZWRpcigpXG59KVxuXG5tZW1vKCdwYXRoJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKHByb2Nlc3MuZW52LlBBVEggfHxcbiAgICAgICAgICBwcm9jZXNzLmVudi5QYXRoIHx8XG4gICAgICAgICAgcHJvY2Vzcy5lbnYucGF0aCkuc3BsaXQoaXNXaW5kb3dzID8gJzsnIDogJzonKVxufSlcblxubWVtbygnZWRpdG9yJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuRURJVE9SIHx8XG4gICAgICAgICBwcm9jZXNzLmVudi5WSVNVQUwgfHxcbiAgICAgICAgIChpc1dpbmRvd3MgPyAnbm90ZXBhZC5leGUnIDogJ3ZpJylcbn0pXG5cbm1lbW8oJ3NoZWxsJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNXaW5kb3dzID8gcHJvY2Vzcy5lbnYuQ29tU3BlYyB8fCAnY21kJ1xuICAgICAgICAgOiBwcm9jZXNzLmVudi5TSEVMTCB8fCAnYmFzaCdcbn0pXG4iLCJcbnZhciBUaHJvdWdoID0gcmVxdWlyZSgncHVsbC10aHJvdWdoJylcbnZhciBSZWFkZXIgPSByZXF1aXJlKCdwdWxsLXJlYWRlcicpXG5cbnZhciBCVUZGRVIgPSAwLCBTVFJJTkcgPSAxLCBPQkpFQ1QgPSAyXG5cbnZhciBHT09EQllFID0gJ0dPT0RCWUUnXG52YXIgaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXJcblxuZnVuY3Rpb24gaXNTdHJpbmcgKHMpIHtcbiAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2Ygc1xufVxuXG5mdW5jdGlvbiBlbmNvZGVQYWlyIChtc2cpIHtcblxuICB2YXIgaGVhZCA9IG5ldyBCdWZmZXIoOSlcbiAgdmFyIGZsYWdzID0gMFxuICB2YXIgdmFsdWUgPSBtc2cudmFsdWUgIT09IHVuZGVmaW5lZCA/IG1zZy52YWx1ZSA6IG1zZy5lbmRcblxuICAvL2ZpbmFsIHBhY2tldFxuICBpZihpc1N0cmluZyhtc2cpICYmIG1zZyA9PT0gR09PREJZRSkge1xuICAgIGhlYWQuZmlsbCgwKVxuICAgIHJldHVybiBbaGVhZCwgbnVsbF1cbiAgfVxuXG4gIGlmKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIGZsYWdzID0gU1RSSU5HXG4gICAgdmFsdWUgPSBuZXcgQnVmZmVyKHZhbHVlKVxuICB9XG4gIGVsc2UgaWYoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgZmxhZ3MgPSBCVUZGRVJcbiAgfVxuICBlbHNlIHtcbiAgICBmbGFncyA9IE9CSkVDVFxuICAgIHZhbHVlID0gbmV3IEJ1ZmZlcihKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gIH1cblxuICAvLyBkb2VzIHRoaXMgZnJhbWUgcmVwcmVzZW50IGEgbXNnLCBhIHJlcSwgb3IgYSBzdHJlYW0/XG5cbiAgLy9lbmQsIHN0cmVhbVxuXG4gIGZsYWdzID0gbXNnLnN0cmVhbSA8PCAzIHwgbXNnLmVuZCA8PCAyIHwgZmxhZ3NcblxuICBoZWFkWzBdID0gZmxhZ3NcblxuICBoZWFkLndyaXRlVUludDMyQkUodmFsdWUubGVuZ3RoLCAxKVxuICBoZWFkLndyaXRlSW50MzJCRShtc2cucmVxIHx8IDAsIDUpXG5cbiAgcmV0dXJuIFtoZWFkLCB2YWx1ZV1cbn1cblxuZnVuY3Rpb24gZGVjb2RlSGVhZCAoYnl0ZXMpIHtcbiAgaWYoYnl0ZXMubGVuZ3RoICE9IDkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBoZWFkZXIgdG8gYmUgOSBieXRlcyBsb25nJylcbiAgdmFyIGZsYWdzID0gYnl0ZXNbMF1cbiAgdmFyIGxlbmd0aCA9IGJ5dGVzLnJlYWRVSW50MzJCRSgxKVxuICB2YXIgcmVxID0gYnl0ZXMucmVhZEludDMyQkUoNSlcblxuICByZXR1cm4ge1xuICAgIHJlcSAgICA6IHJlcSxcbiAgICBzdHJlYW0gOiAhIShmbGFncyAmIDgpLFxuICAgIGVuZCAgICA6ICEhKGZsYWdzICYgNCksXG4gICAgdmFsdWUgIDogbnVsbCxcbiAgICBsZW5ndGggOiBsZW5ndGgsXG4gICAgdHlwZSAgIDogZmxhZ3MgJiAzXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlQm9keSAoYnl0ZXMsIG1zZykge1xuICBpZihieXRlcy5sZW5ndGggIT09IG1zZy5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbmNvcnJlY3QgbGVuZ3RoLCBleHBlY3RlZDonK21zZy5sZW5ndGgrJyBmb3VuZDonK2J5dGVzLmxlbmd0aClcbiAgaWYoQlVGRkVSID09PSBtc2cudHlwZSkgbXNnLnZhbHVlID0gYnl0ZXNcbiAgZWxzZSBpZihTVFJJTkcgPT09IG1zZy50eXBlKSBtc2cudmFsdWUgPSBieXRlcy50b1N0cmluZygpXG4gIGVsc2UgaWYoT0JKRUNUID09PSBtc2cudHlwZSkgbXNnLnZhbHVlID0gSlNPTi5wYXJzZShieXRlcy50b1N0cmluZygpKVxuICBlbHNlIHRocm93IG5ldyBFcnJvcigndW5rbm93biBtZXNzYWdlIHR5cGUnKVxuICByZXR1cm4gbXNnXG59XG5cbmZ1bmN0aW9uIGVuY29kZSAoKSB7XG4gIHJldHVybiBUaHJvdWdoKGZ1bmN0aW9uIChkKSB7XG4gICAgdmFyIGMgPSBlbmNvZGVQYWlyKGQpXG4gICAgdGhpcy5xdWV1ZShjWzBdKVxuICAgIGlmKGNbMV0gIT09IG51bGwpXG4gICAgICB0aGlzLnF1ZXVlKGNbMV0pXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGRlY29kZSAoKSB7XG4gIHZhciByZWFkZXIgPSBSZWFkZXIoKSwgZW5kZWQgPSBmYWxzZVxuXG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIHJlYWRlcihyZWFkKVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICAgIGlmKGVuZGVkKSByZXR1cm4gY2IodHJ1ZSlcbiAgICAgIGlmKGFib3J0KSByZXR1cm4gcmVhZGVyLmFib3J0KGFib3J0LCBjYilcbiAgICAgIHJlYWRlci5yZWFkKDksIGZ1bmN0aW9uIChlcnIsIGhlYWQpIHtcbiAgICAgICAgaWYoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgICB2YXIgbXNnID0gZGVjb2RlSGVhZChoZWFkKVxuICAgICAgICBpZihtc2cubGVuZ3RoID09PSAwKSB7IC8vZmluYWwgcGFja2V0XG4gICAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIEdPT0RCWUUpXG4gICAgICAgIH1cbiAgICAgICAgcmVhZGVyLnJlYWQobXNnLmxlbmd0aCwgZnVuY3Rpb24gKGVyciwgYm9keSkge1xuICAgICAgICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgICBkZWNvZGVCb2R5KGJvZHksIG1zZylcbiAgICAgICAgICBjYihudWxsLCBtc2cpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHJldHVybiB7XG4gICAgc291cmNlOiBlbmNvZGUoKShzdHJlYW0uc291cmNlKSxcbiAgICBzaW5rOiBmdW5jdGlvbiAocmVhZCkgeyByZXR1cm4gc3RyZWFtLnNpbmsoZGVjb2RlKCkocmVhZCkpIH1cbiAgfVxufVxuXG5leHBvcnRzLmVuY29kZVBhaXIgPSBlbmNvZGVQYWlyXG5leHBvcnRzLmRlY29kZUhlYWQgPSBkZWNvZGVIZWFkXG5leHBvcnRzLmRlY29kZUJvZHkgPSBkZWNvZGVCb2R5XG5cbmV4cG9ydHMuZW5jb2RlID0gZW5jb2RlXG5leHBvcnRzLmRlY29kZSA9IGRlY29kZVxuXG4iLCJmdW5jdGlvbiBmbGF0KGVycikge1xuICBpZighZXJyKSByZXR1cm4gZXJyXG4gIGlmKGVyciA9PT0gdHJ1ZSkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIHttZXNzYWdlOiBlcnIubWVzc2FnZSwgbmFtZTogZXJyLm5hbWUsIHN0YWNrOiBlcnIuc3RhY2t9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBQYWNrZXRTdHJlYW0ob3B0cylcbn1cblxuZnVuY3Rpb24gUGFja2V0U3RyZWFtIChvcHRzKSB7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZVxuICB0aGlzLm9wdHMgID0gb3B0cyAvLyBtdXN0IHJlbGVhc2UsIG1heSBjYXB0dXJlIGB0aGlzYFxuXG4gIHRoaXMuX3JlcV9jb3VudGVyID0gMVxuICB0aGlzLl9yZXF1ZXN0cyAgICA9IHt9IC8vIG11c3QgcmVsZWFzZSwgbWF5IGNhcHR1cmUgYHRoaXNgXG4gIHRoaXMuX2luc3RyZWFtcyAgID0ge30gLy8gbXVzdCByZWxlYXNlLCBtYXkgY2FwdHVyZSBgdGhpc2BcbiAgdGhpcy5fb3V0c3RyZWFtcyAgPSB7fSAvLyBtdXN0IHJlbGVhc2UsIG1heSBjYXB0dXJlIGB0aGlzYFxuICB0aGlzLl9jbG9zZWNicyAgICA9IFtdIC8vIG11c3QgcmVsZWFzZSwgbWF5IGNhcHR1cmUgYHRoaXNgXG4gIHRoaXMuX2Nsb3NpbmcgICAgID0gZmFsc2VcbiAgdGhpcy5fY2xvc2VkICAgICAgPSBmYWxzZVxuICBpZiAob3B0cy5jbG9zZSlcbiAgICB0aGlzLl9jbG9zZWNicy5wdXNoKG9wdHMuY2xvc2UpXG59XG5cbi8vIFNlbmRzIGEgc2luZ2xlIG1lc3NhZ2UgdG8gdGhlIG90aGVyIGVuZFxuUGFja2V0U3RyZWFtLnByb3RvdHlwZS5tZXNzYWdlID0gZnVuY3Rpb24gKG9iaikge1xuICB0aGlzLnJlYWQoe3JlcTogMCwgc3RyZWFtOiBmYWxzZSwgZW5kOiBmYWxzZSwgdmFsdWU6IG9ian0pXG59XG5cbi8vIFNlbmRzIGEgbWVzc2FnZSB0byB0aGUgb3RoZXIgZW5kLCBleHBlY3RzIGFuIChlcnIsIG9iaikgcmVzcG9uc2VcblBhY2tldFN0cmVhbS5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIChvYmosIGNiKSB7XG4gIHZhciByaWQgPSB0aGlzLl9yZXFfY291bnRlcisrXG4gIHZhciBzZWxmID0gdGhpc1xuICB0aGlzLl9yZXF1ZXN0c1tyaWRdID0gZnVuY3Rpb24gKGVyciwgdmFsdWUpIHtcbiAgICBkZWxldGUgc2VsZi5fcmVxdWVzdHNbcmlkXVxuICAgIGNiKGVyciwgdmFsdWUpXG4gICAgc2VsZi5fbWF5YmVkb25lKClcbiAgfVxuICB0aGlzLnJlYWQoeyByZXE6cmlkLCBzdHJlYW06IGZhbHNlLCBlbmQ6IGZhbHNlLCB2YWx1ZTogb2JqIH0pXG59XG5cbi8vIFNlbmRzIGEgcmVxdWVzdCB0byB0aGUgb3RoZXIgZW5kIGZvciBhIHN0cmVhbVxuUGFja2V0U3RyZWFtLnByb3RvdHlwZS5zdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByaWQgPSB0aGlzLl9yZXFfY291bnRlcisrXG4gIHZhciBzZWxmID0gdGhpc1xuICB0aGlzLl9vdXRzdHJlYW1zW3JpZF0gPSBuZXcgUGFja2V0U3RyZWFtU3Vic3RyZWFtKHJpZCwgdGhpcywgZnVuY3Rpb24oKSB7IGRlbGV0ZSBzZWxmLl9vdXRzdHJlYW1zW3JpZF0gfSlcbiAgcmV0dXJuIHRoaXMuX291dHN0cmVhbXNbcmlkXVxufVxuXG4vLyBNYXJrcyB0aGUgcGFja2V0c3RyZWFtIHRvIGNsb3NlIHdoZW4gYWxsIGN1cnJlbnQgSU8gaXMgZmluaXNoZWRcblBhY2tldFN0cmVhbS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoY2IpIHtcbiAgaWYoIWNiKSB0aHJvdyBuZXcgRXJyb3IoJ3BhY2tldC1zdHJlYW0uY2xvc2UgKm11c3QqIGhhdmUgY2FsbGJhY2snKVxuICBpZiAodGhpcy5fY2xvc2VkKVxuICAgIHJldHVybiBjYigpXG4gIHRoaXMuX2Nsb3NlY2JzLnB1c2goY2IpXG4gIHRoaXMuX2Nsb3NpbmcgPSB0cnVlXG4gIHRoaXMuX21heWJlZG9uZSgpXG59XG5cbi8vIEZvcmNlcyBpbW1lZGlhdGUgY2xvc2Ugb2YgdGhlIFBhY2tldFN0cmVhbVxuLy8gLSB1c3VhbGx5IHRyaWdnZXJlZCBieSBhbiBgZW5kYCBwYWNrZXQgZnJvbSB0aGUgb3RoZXIgZW5kXG5QYWNrZXRTdHJlYW0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZW5kKSB7XG4gIGVuZCA9IGVuZCB8fCBmbGF0KGVuZClcbiAgdGhpcy5lbmRlZCA9IGVuZFxuXG4gIHZhciBlcnIgPSAoZW5kID09PSB0cnVlKVxuICAgID8gbmV3IEVycm9yKCd1bmV4cGVjdGVkIGVuZCBvZiBwYXJlbnQgc3RyZWFtJylcbiAgICA6IGVuZFxuXG4gIC8vIGZvcmNlLWNsb3NlIGFsbCByZXF1ZXN0cyBhbmQgc3Vic3RyZWFtc1xuICB2YXIgbnVtZW5kZWQgPSAwXG4gIGZvciAodmFyIGsgaW4gdGhpcy5fcmVxdWVzdHMpICAgeyBudW1lbmRlZCsrOyB0aGlzLl9yZXF1ZXN0c1trXShlcnIpIH1cbiAgZm9yICh2YXIgayBpbiB0aGlzLl9pbnN0cmVhbXMpICB7IG51bWVuZGVkKys7IHRoaXMuX2luc3RyZWFtc1trXS5kZXN0cm95KGVycikgfVxuICBmb3IgKHZhciBrIGluIHRoaXMuX291dHN0cmVhbXMpIHsgbnVtZW5kZWQrKzsgdGhpcy5fb3V0c3RyZWFtc1trXS5kZXN0cm95KGVycikgfVxuXG4gIC8vZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIG91dHNpZGUgc3RyZWFtIGl0J3Mgbm90IGFuIGVycm9yXG4gIC8vaWYgdGhlIHN0cmVhbSB3YXMgaW4gYSBzdGF0ZSB0aGF0IHdoZXJlIGVuZCB3YXMgb2theS4gKG5vIG9wZW4gcmVxdWVzdHMvc3RyZWFtcylcbiAgaWYgKG51bWVuZGVkID09PSAwICYmIGVuZCA9PT0gdHJ1ZSlcbiAgICBlcnIgPSBudWxsXG4gIHRoaXMuX2Nsb3NpbmcgPSB0cnVlXG4gIHRoaXMuX21heWJlZG9uZShlcnIpXG59XG5cblBhY2tldFN0cmVhbS5wcm90b3R5cGUuX21heWJlZG9uZSA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgaWYgKHRoaXMuX2Nsb3NlZCB8fCAhdGhpcy5fY2xvc2luZylcbiAgICByZXR1cm5cblxuICAvLyBjaGVjayBpZiBhbGwgcmVxdWVzdHMgYW5kIHN0cmVhbXMgZmluaXNoZWRcbiAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3JlcXVlc3RzKS5sZW5ndGggIT09IDAgfHxcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuX2luc3RyZWFtcykubGVuZ3RoICE9PSAwIHx8XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLl9vdXRzdHJlYW1zKS5sZW5ndGggIT09IDApXG4gICAgcmV0dXJuIC8vIG5vdCB5ZXRcblxuICAvLyBjbG9zZVxuICB0aGlzLl9jbG9zZWQgPSB0cnVlXG4gIHRoaXMuX2Nsb3NlY2JzLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7IGNiKGVycikgfSlcbiAgdGhpcy5yZWFkKG51bGwsIGVyciB8fCB0cnVlKVxuXG4gIC8vIGRlYWxsb2NhdGVcbiAgdGhpcy5vcHRzID0gbnVsbFxuICB0aGlzLl9jbG9zZWNicy5sZW5ndGggPSAwXG4gIHRoaXMucmVhZCA9IGNsb3NlZHJlYWRcbn1cblxuZnVuY3Rpb24gY2xvc2VkcmVhZCAobXNnKSB7XG4gIGNvbnNvbGUuZXJyb3IoJ3BhY2tldC1zdHJlYW0gYXNrZWQgdG8gcmVhZCBhZnRlciBjbG9zZWQnLCBtc2cpXG59XG5cbi8vIFNlbmRzIGRhdGEgb3V0IHRvIHRoZSBvdGhlciBlbmRcbi8vIC0gdG8gYmUgb3ZlcnJpZGRlbiBieSB0aGUgUGFja2V0U3RyZWFtIGNvbnN1bWVyXG5QYWNrZXRTdHJlYW0ucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobXNnKSB7XG4gIGNvbnNvbGUuZXJyb3IoJ3BsZWFzZSBvdmVyd3JpdGUgcmVhZCBtZXRob2QgdG8gZG8gSU8nLCBtc2cpXG59XG5cbi8vIEFjY2VwdHMgZGF0YSBmcm9tIHRoZSBvdGhlciBlbmRcblBhY2tldFN0cmVhbS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAobXNnLCBlbmQpIHtcbiAgaWYgKHRoaXMuZW5kZWQpXG4gICAgcmV0dXJuXG5cbiAgaWYgKGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KGVuZClcbiAgZWxzZSBpZiAobXNnLnJlcSAmJiAhbXNnLnN0cmVhbSkgdGhpcy5fb25yZXF1ZXN0KG1zZylcbiAgZWxzZSBpZiAobXNnLnJlcSAmJiBtc2cuc3RyZWFtKSAgdGhpcy5fb25zdHJlYW0obXNnKVxuICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbm1lc3NhZ2UobXNnKVxufVxuXG4vLyBJbnRlcm5hbCBoYW5kbGVyIG9mIGluY29taW5nIG1lc3NhZ2UgbXNnc1xuUGFja2V0U3RyZWFtLnByb3RvdHlwZS5fb25tZXNzYWdlID0gZnVuY3Rpb24gKG1zZykge1xuICBpZiAodGhpcy5vcHRzICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB0aGlzLm9wdHMubWVzc2FnZSlcbiAgICB0aGlzLm9wdHMubWVzc2FnZShtc2cudmFsdWUpXG59XG5cbi8vIEludGVybmFsIGhhbmRsZXIgb2YgaW5jb21pbmcgcmVxdWVzdCBtc2dzXG5QYWNrZXRTdHJlYW0ucHJvdG90eXBlLl9vbnJlcXVlc3QgPSBmdW5jdGlvbiAobXNnKSB7XG4gIHZhciByaWQgPSBtc2cucmVxKi0xXG4gIGlmKG1zZy5yZXEgPCAwKSB7XG4gICAgLy8gQSBpbmNvbWluZyByZXNwb25zZVxuICAgIGlmICh0eXBlb2YgdGhpcy5fcmVxdWVzdHNbcmlkXSA9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhpcy5fcmVxdWVzdHNbcmlkXShcbiAgICAgICAgbXNnLmVuZCA/IG1zZy52YWx1ZTogbnVsbCxcbiAgICAgICAgbXNnLmVuZCA/IG51bGwgOiBtc2cudmFsdWVcbiAgICAgIClcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBBbiBpbmNvbWluZyByZXF1ZXN0XG4gICAgaWYgKHRoaXMub3B0cyAmJiB0eXBlb2YgdGhpcy5vcHRzLnJlcXVlc3QgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIG9uY2UgPSBmYWxzZVxuICAgICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICB0aGlzLm9wdHMucmVxdWVzdChtc2cudmFsdWUsIGZ1bmN0aW9uIChlcnIsIHZhbHVlKSB7XG4gICAgICAgIGlmKG9uY2UpIHRocm93IG5ldyBFcnJvcignY2IgY2FsbGVkIHR3aWNlIGZyb20gbG9jYWwgYXBpJylcbiAgICAgICAgb25jZSA9IHRydWVcbiAgICAgICAgaWYoZXJyKSBzZWxmLnJlYWQoeyB2YWx1ZTogZmxhdChlcnIpLCBlbmQ6IHRydWUsIHJlcTogcmlkIH0pXG4gICAgICAgIGVsc2UgICAgc2VsZi5yZWFkKHsgdmFsdWU6IHZhbHVlLCBlbmQ6IGZhbHNlLCByZXE6IHJpZCB9KVxuICAgICAgICBzZWxmLl9tYXliZWRvbmUoKVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZW5kZWQpIHtcbiAgICAgICAgdmFyIGVyciA9ICh0aGlzLmVuZGVkID09PSB0cnVlKVxuICAgICAgICAgID8gbmV3IEVycm9yKCd1bmV4cGVjdGVkIGVuZCBvZiBwYXJlbnQgc3RyZWFtJylcbiAgICAgICAgICA6IHRoaXMuZW5kZWRcbiAgICAgICAgdGhpcy5yZWFkKHsgdmFsdWU6IGZsYXQoZXJyKSwgZW5kOiB0cnVlLCBzdHJlYW06IGZhbHNlLCByZXE6IHJpZCB9KVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICB0aGlzLnJlYWQoeyB2YWx1ZToge1xuICAgICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byBoYW5kbGUgcmVxdWVzdHMnLFxuICAgICAgICAgICAgbmFtZTogJ05PX1JFUVVFU1RfSEFORExFUicsIHN0YWNrOiBudWxsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbmQ6IHRydWUsIHN0cmVhbTogZmFsc2UsIHJlcTogcmlkXG4gICAgICAgIH0pXG4gICAgICB0aGlzLl9tYXliZWRvbmUoKVxuICAgIH1cbiAgfVxufVxuXG4vLyBJbnRlcm5hbCBoYW5kbGVyIG9mIGluY29taW5nIHN0cmVhbSBtc2dzXG5QYWNrZXRTdHJlYW0ucHJvdG90eXBlLl9vbnN0cmVhbSA9IGZ1bmN0aW9uIChtc2cpIHtcbiAgaWYobXNnLnJlcSA8IDApIHtcbiAgICAvLyBJbmNvbWluZyBzdHJlYW0gZGF0YVxuICAgIHZhciByaWQgPSBtc2cucmVxKi0xXG4gICAgdmFyIG91dHMgPSB0aGlzLl9vdXRzdHJlYW1zW3JpZF1cbiAgICBpZiAoIW91dHMpXG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignbm8gc3RyZWFtIGZvciBpbmNvbWluZyBtc2cnLCBtc2cpXG5cbiAgICBpZiAobXNnLmVuZCkge1xuICAgICAgaWYgKG91dHMud3JpdGVFbmQpXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9vdXRzdHJlYW1zW3JpZF1cbiAgICAgIG91dHMucmVhZEVuZCA9IHRydWVcbiAgICAgIG91dHMucmVhZChudWxsLCBtc2cudmFsdWUpXG4gICAgICB0aGlzLl9tYXliZWRvbmUoKVxuICAgIH1cbiAgICBlbHNlXG4gICAgICBvdXRzLnJlYWQobXNnLnZhbHVlKVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIEluY29taW5nIHN0cmVhbSByZXF1ZXN0XG4gICAgdmFyIHJpZCA9IG1zZy5yZXFcbiAgICB2YXIgaW5zID0gdGhpcy5faW5zdHJlYW1zW3JpZF1cblxuICAgIGlmICghaW5zKSB7XG4gICAgICAvLyBOZXcgc3RyZWFtXG4gICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgIGlucyA9IHRoaXMuX2luc3RyZWFtc1tyaWRdID0gbmV3IFBhY2tldFN0cmVhbVN1YnN0cmVhbShyaWQqLTEsIHRoaXMsIGZ1bmN0aW9uKCkgeyBkZWxldGUgc2VsZi5faW5zdHJlYW1zW3JpZF0gfSlcbiAgICAgIGlmICh0aGlzLm9wdHMgJiYgdHlwZW9mIHRoaXMub3B0cy5zdHJlYW0gPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhpcy5vcHRzLnN0cmVhbShpbnMpXG4gICAgfVxuXG4gICAgaWYgKCFpbnMucmVhZClcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdubyAucmVhZCBmb3Igc3RyZWFtOicsIGlucy5pZCwgJ2Ryb3BwZWQ6JywgbXNnKVxuXG4gICAgaWYgKG1zZy5lbmQpIHtcbiAgICAgIGlmIChpbnMud3JpdGVFbmQpXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9pbnN0cmVhbXNbcmlkXVxuICAgICAgaW5zLnJlYWRFbmQgPSB0cnVlXG4gICAgICBpbnMucmVhZChudWxsLCBtc2cudmFsdWUpXG4gICAgICB0aGlzLl9tYXliZWRvbmUoKVxuICAgIH1cbiAgICBlbHNlXG4gICAgICBpbnMucmVhZChtc2cudmFsdWUpXG4gIH1cbn1cblxuXG5mdW5jdGlvbiBQYWNrZXRTdHJlYW1TdWJzdHJlYW0gKGlkLCBwcywgcmVtb3ZlKSB7XG4gIHRoaXMuaWQgICAgICAgPSBpZFxuICB0aGlzLnJlYWQgICAgID0gbnVsbCAvLyBtdXN0IHJlbGVhc2UsIG1heSBjYXB0dXJlIGB0aGlzYFxuICB0aGlzLndyaXRlRW5kID0gbnVsbFxuICB0aGlzLnJlYWRFbmQgID0gbnVsbFxuXG4gIHRoaXMuX3BzICAgICAgICAgID0gcHMgICAgIC8vIG11c3QgcmVsZWFzZSwgbWF5IGNhcHR1cmUgYHRoaXNgXG4gIHRoaXMuX3JlbW92ZSAgICAgID0gcmVtb3ZlIC8vIG11c3QgcmVsZWFzZSwgbWF5IGNhcHR1cmUgYHRoaXNgXG4gIHRoaXMuX3NlcV9jb3VudGVyID0gMVxufVxuXG5QYWNrZXRTdHJlYW1TdWJzdHJlYW0ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGVycikge1xuICBpZiAoZXJyKSB7XG4gICAgdGhpcy53cml0ZUVuZCA9IGVyclxuICAgIHZhciBwcyA9IHRoaXMuX3BzXG4gICAgaWYgKHBzKSB7XG4gICAgICBwcy5yZWFkKHsgcmVxOiB0aGlzLmlkLCBzdHJlYW06IHRydWUsIGVuZDogdHJ1ZSwgdmFsdWU6IGZsYXQoZXJyKSB9KVxuICAgICAgaWYgKHRoaXMucmVhZEVuZClcbiAgICAgICAgdGhpcy5kZXN0cm95KClcbiAgICAgIHBzLl9tYXliZWRvbmUoKVxuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBpZiAodGhpcy5fcHMpIHRoaXMuX3BzLnJlYWQoeyByZXE6IHRoaXMuaWQsIHN0cmVhbTogdHJ1ZSwgZW5kOiBmYWxzZSwgdmFsdWU6IGRhdGEgfSlcbiAgfVxufVxuXG4vLyBTZW5kIHRoZSBgZW5kYCBtZXNzYWdlIGZvciB0aGUgc3Vic3RyZWFtXG5QYWNrZXRTdHJlYW1TdWJzdHJlYW0ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgdGhpcy53cml0ZShudWxsLCBmbGF0KGVyciB8fCB0cnVlKSlcbn1cblxuUGFja2V0U3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKGVycikge1xuICBpZiAoIXRoaXMud3JpdGVFbmQpIHtcbiAgICB0aGlzLndyaXRlRW5kID0gdHJ1ZVxuICAgIGlmICghdGhpcy5yZWFkRW5kKSB7XG4gICAgICB0aGlzLnJlYWRFbmQgPSB0cnVlXG4gICAgICB0cnkge1xuICAgICAgICAvLyBjYXRjaCBlcnJvcnMgdG8gZW5zdXJlIGNsZWFudXBcbiAgICAgICAgdGhpcy5yZWFkKG51bGwsIGVycilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXhjZXB0aW9uIHRocm93biBieSBQYWNrZXRTdHJlYW0gc3Vic3RyZWFtIGVuZCBoYW5kbGVyJywgZSlcbiAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLndyaXRlKG51bGwsIGVycilcbiAgfVxuICBlbHNlIGlmICghdGhpcy5yZWFkRW5kKSB7XG4gICAgdGhpcy5yZWFkRW5kID0gdHJ1ZVxuICAgIHRyeSB7XG4gICAgICAvLyBjYXRjaCBlcnJvcnMgdG8gZW5zdXJlIGNsZWFudXBcbiAgICAgIHRoaXMucmVhZChudWxsLCBlcnIpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXhjZXB0aW9uIHRocm93biBieSBQYWNrZXRTdHJlYW0gc3Vic3RyZWFtIGVuZCBoYW5kbGVyJywgZSlcbiAgICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjaylcbiAgICB9XG4gIH1cblxuICAvLyBkZWFsbG9jYXRlXG4gIGlmICh0aGlzLl9wcykge1xuICAgIHRoaXMuX3JlbW92ZSgpXG4gICAgdGhpcy5fcmVtb3ZlID0gbnVsbFxuICAgIHRoaXMucmVhZCA9IGNsb3NlZHJlYWRcbiAgICB0aGlzLl9wcyA9IG51bGxcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1wiMi4xNi44NDAuMS4xMDEuMy40LjEuMVwiOiBcImFlcy0xMjgtZWNiXCIsXG5cIjIuMTYuODQwLjEuMTAxLjMuNC4xLjJcIjogXCJhZXMtMTI4LWNiY1wiLFxuXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4zXCI6IFwiYWVzLTEyOC1vZmJcIixcblwiMi4xNi44NDAuMS4xMDEuMy40LjEuNFwiOiBcImFlcy0xMjgtY2ZiXCIsXG5cIjIuMTYuODQwLjEuMTAxLjMuNC4xLjIxXCI6IFwiYWVzLTE5Mi1lY2JcIixcblwiMi4xNi44NDAuMS4xMDEuMy40LjEuMjJcIjogXCJhZXMtMTkyLWNiY1wiLFxuXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yM1wiOiBcImFlcy0xOTItb2ZiXCIsXG5cIjIuMTYuODQwLjEuMTAxLjMuNC4xLjI0XCI6IFwiYWVzLTE5Mi1jZmJcIixcblwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDFcIjogXCJhZXMtMjU2LWVjYlwiLFxuXCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MlwiOiBcImFlcy0yNTYtY2JjXCIsXG5cIjIuMTYuODQwLjEuMTAxLjMuNC4xLjQzXCI6IFwiYWVzLTI1Ni1vZmJcIixcblwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDRcIjogXCJhZXMtMjU2LWNmYlwiXG59IiwiLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9zZWxmLXNpZ25lZC9ibG9iL2doLXBhZ2VzL2xpYi9hc24xLmpzXG4vLyBGZWRvciwgeW91IGFyZSBhbWF6aW5nLlxuXG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEuanMnKVxuXG52YXIgUlNBUHJpdmF0ZUtleSA9IGFzbjEuZGVmaW5lKCdSU0FQcml2YXRlS2V5JywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgndmVyc2lvbicpLmludCgpLFxuICAgIHRoaXMua2V5KCdtb2R1bHVzJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3B1YmxpY0V4cG9uZW50JykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3ByaXZhdGVFeHBvbmVudCcpLmludCgpLFxuICAgIHRoaXMua2V5KCdwcmltZTEnKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncHJpbWUyJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ2V4cG9uZW50MScpLmludCgpLFxuICAgIHRoaXMua2V5KCdleHBvbmVudDInKS5pbnQoKSxcbiAgICB0aGlzLmtleSgnY29lZmZpY2llbnQnKS5pbnQoKVxuICApXG59KVxuZXhwb3J0cy5SU0FQcml2YXRlS2V5ID0gUlNBUHJpdmF0ZUtleVxuXG52YXIgUlNBUHVibGljS2V5ID0gYXNuMS5kZWZpbmUoJ1JTQVB1YmxpY0tleScsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmooXG4gICAgdGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKVxuICApXG59KVxuZXhwb3J0cy5SU0FQdWJsaWNLZXkgPSBSU0FQdWJsaWNLZXlcblxudmFyIFB1YmxpY0tleSA9IGFzbjEuZGVmaW5lKCdTdWJqZWN0UHVibGljS2V5SW5mbycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmooXG4gICAgdGhpcy5rZXkoJ2FsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcbiAgICB0aGlzLmtleSgnc3ViamVjdFB1YmxpY0tleScpLmJpdHN0cigpXG4gIClcbn0pXG5leHBvcnRzLlB1YmxpY0tleSA9IFB1YmxpY0tleVxuXG52YXIgQWxnb3JpdGhtSWRlbnRpZmllciA9IGFzbjEuZGVmaW5lKCdBbGdvcml0aG1JZGVudGlmaWVyJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgnYWxnb3JpdGhtJykub2JqaWQoKSxcbiAgICB0aGlzLmtleSgnbm9uZScpLm51bGxfKCkub3B0aW9uYWwoKSxcbiAgICB0aGlzLmtleSgnY3VydmUnKS5vYmppZCgpLm9wdGlvbmFsKCksXG4gICAgdGhpcy5rZXkoJ3BhcmFtcycpLnNlcSgpLm9iaihcbiAgICAgIHRoaXMua2V5KCdwJykuaW50KCksXG4gICAgICB0aGlzLmtleSgncScpLmludCgpLFxuICAgICAgdGhpcy5rZXkoJ2cnKS5pbnQoKVxuICAgICkub3B0aW9uYWwoKVxuICApXG59KVxuXG52YXIgUHJpdmF0ZUtleUluZm8gPSBhc24xLmRlZmluZSgnUHJpdmF0ZUtleUluZm8nLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VxKCkub2JqKFxuICAgIHRoaXMua2V5KCd2ZXJzaW9uJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ2FsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcbiAgICB0aGlzLmtleSgnc3ViamVjdFByaXZhdGVLZXknKS5vY3RzdHIoKVxuICApXG59KVxuZXhwb3J0cy5Qcml2YXRlS2V5ID0gUHJpdmF0ZUtleUluZm9cbnZhciBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyA9IGFzbjEuZGVmaW5lKCdFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZXEoKS5vYmooXG4gICAgdGhpcy5rZXkoJ2FsZ29yaXRobScpLnNlcSgpLm9iaihcbiAgICAgIHRoaXMua2V5KCdpZCcpLm9iamlkKCksXG4gICAgICB0aGlzLmtleSgnZGVjcnlwdCcpLnNlcSgpLm9iaihcbiAgICAgICAgdGhpcy5rZXkoJ2tkZScpLnNlcSgpLm9iaihcbiAgICAgICAgICB0aGlzLmtleSgnaWQnKS5vYmppZCgpLFxuICAgICAgICAgIHRoaXMua2V5KCdrZGVwYXJhbXMnKS5zZXEoKS5vYmooXG4gICAgICAgICAgICB0aGlzLmtleSgnc2FsdCcpLm9jdHN0cigpLFxuICAgICAgICAgICAgdGhpcy5rZXkoJ2l0ZXJzJykuaW50KClcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRoaXMua2V5KCdjaXBoZXInKS5zZXEoKS5vYmooXG4gICAgICAgICAgdGhpcy5rZXkoJ2FsZ28nKS5vYmppZCgpLFxuICAgICAgICAgIHRoaXMua2V5KCdpdicpLm9jdHN0cigpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApLFxuICAgIHRoaXMua2V5KCdzdWJqZWN0UHJpdmF0ZUtleScpLm9jdHN0cigpXG4gIClcbn0pXG5cbmV4cG9ydHMuRW5jcnlwdGVkUHJpdmF0ZUtleSA9IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvXG5cbnZhciBEU0FQcml2YXRlS2V5ID0gYXNuMS5kZWZpbmUoJ0RTQVByaXZhdGVLZXknLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VxKCkub2JqKFxuICAgIHRoaXMua2V5KCd2ZXJzaW9uJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3AnKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncScpLmludCgpLFxuICAgIHRoaXMua2V5KCdnJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3B1Yl9rZXknKS5pbnQoKSxcbiAgICB0aGlzLmtleSgncHJpdl9rZXknKS5pbnQoKVxuICApXG59KVxuZXhwb3J0cy5EU0FQcml2YXRlS2V5ID0gRFNBUHJpdmF0ZUtleVxuXG5leHBvcnRzLkRTQXBhcmFtID0gYXNuMS5kZWZpbmUoJ0RTQXBhcmFtJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLmludCgpXG59KVxudmFyIEVDUHJpdmF0ZUtleSA9IGFzbjEuZGVmaW5lKCdFQ1ByaXZhdGVLZXknLCBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VxKCkub2JqKFxuICAgIHRoaXMua2V5KCd2ZXJzaW9uJykuaW50KCksXG4gICAgdGhpcy5rZXkoJ3ByaXZhdGVLZXknKS5vY3RzdHIoKSxcbiAgICB0aGlzLmtleSgncGFyYW1ldGVycycpLm9wdGlvbmFsKCkuZXhwbGljaXQoMCkudXNlKEVDUGFyYW1ldGVycyksXG4gICAgdGhpcy5rZXkoJ3B1YmxpY0tleScpLm9wdGlvbmFsKCkuZXhwbGljaXQoMSkuYml0c3RyKClcbiAgKVxufSlcbmV4cG9ydHMuRUNQcml2YXRlS2V5ID0gRUNQcml2YXRlS2V5XG52YXIgRUNQYXJhbWV0ZXJzID0gYXNuMS5kZWZpbmUoJ0VDUGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jaG9pY2Uoe1xuICAgIG5hbWVkQ3VydmU6IHRoaXMub2JqaWQoKVxuICB9KVxufSlcblxuZXhwb3J0cy5zaWduYXR1cmUgPSBhc24xLmRlZmluZSgnc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnNlcSgpLm9iaihcbiAgICB0aGlzLmtleSgncicpLmludCgpLFxuICAgIHRoaXMua2V5KCdzJykuaW50KClcbiAgKVxufSlcbiIsIi8vIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYXBhdGlsL3BlbXN0cmlwXG52YXIgZmluZFByb2MgPSAvUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFxccj9cXG5ERUstSW5mbzogQUVTLSgoPzoxMjgpfCg/OjE5Mil8KD86MjU2KSktQ0JDLChbMC05QS1IXSspXFxyP1xcblxccj9cXG4oWzAtOUEtelxcblxcclxcK1xcL1xcPV0rKVxccj9cXG4vbVxudmFyIHN0YXJ0UmVnZXggPSAvXi0tLS0tQkVHSU4gKC4qKSBLRVktLS0tLVxccj9cXG4vbVxudmFyIGZ1bGxSZWdleCA9IC9eLS0tLS1CRUdJTiAoLiopIEtFWS0tLS0tXFxyP1xcbihbMC05QS16XFxuXFxyXFwrXFwvXFw9XSspXFxyP1xcbi0tLS0tRU5EIFxcMSBLRVktLS0tLSQvbVxudmFyIGV2cCA9IHJlcXVpcmUoJ2V2cF9ieXRlc3Rva2V5JylcbnZhciBjaXBoZXJzID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1hZXMnKVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2tleSwgcGFzc3dvcmQpIHtcbiAgdmFyIGtleSA9IG9rZXkudG9TdHJpbmcoKVxuICB2YXIgbWF0Y2ggPSBrZXkubWF0Y2goZmluZFByb2MpXG4gIHZhciBkZWNyeXB0ZWRcbiAgaWYgKCFtYXRjaCkge1xuICAgIHZhciBtYXRjaDIgPSBrZXkubWF0Y2goZnVsbFJlZ2V4KVxuICAgIGRlY3J5cHRlZCA9IG5ldyBCdWZmZXIobWF0Y2gyWzJdLnJlcGxhY2UoL1xccj9cXG4vZywgJycpLCAnYmFzZTY0JylcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3VpdGUgPSAnYWVzJyArIG1hdGNoWzFdXG4gICAgdmFyIGl2ID0gbmV3IEJ1ZmZlcihtYXRjaFsyXSwgJ2hleCcpXG4gICAgdmFyIGNpcGhlclRleHQgPSBuZXcgQnVmZmVyKG1hdGNoWzNdLnJlcGxhY2UoL1xccj9cXG4vZywgJycpLCAnYmFzZTY0JylcbiAgICB2YXIgY2lwaGVyS2V5ID0gZXZwKHBhc3N3b3JkLCBpdi5zbGljZSgwLCA4KSwgcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSkua2V5XG4gICAgdmFyIG91dCA9IFtdXG4gICAgdmFyIGNpcGhlciA9IGNpcGhlcnMuY3JlYXRlRGVjaXBoZXJpdihzdWl0ZSwgY2lwaGVyS2V5LCBpdilcbiAgICBvdXQucHVzaChjaXBoZXIudXBkYXRlKGNpcGhlclRleHQpKVxuICAgIG91dC5wdXNoKGNpcGhlci5maW5hbCgpKVxuICAgIGRlY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQob3V0KVxuICB9XG4gIHZhciB0YWcgPSBrZXkubWF0Y2goc3RhcnRSZWdleClbMV0gKyAnIEtFWSdcbiAgcmV0dXJuIHtcbiAgICB0YWc6IHRhZyxcbiAgICBkYXRhOiBkZWNyeXB0ZWRcbiAgfVxufVxuIiwidmFyIGFzbjEgPSByZXF1aXJlKCcuL2FzbjEnKVxudmFyIGFlc2lkID0gcmVxdWlyZSgnLi9hZXNpZC5qc29uJylcbnZhciBmaXhQcm9jID0gcmVxdWlyZSgnLi9maXhQcm9jJylcbnZhciBjaXBoZXJzID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1hZXMnKVxudmFyIGNvbXBhdCA9IHJlcXVpcmUoJ3Bia2RmMicpXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlS2V5c1xuXG5mdW5jdGlvbiBwYXJzZUtleXMgKGJ1ZmZlcikge1xuICB2YXIgcGFzc3dvcmRcbiAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdvYmplY3QnICYmICFCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKSkge1xuICAgIHBhc3N3b3JkID0gYnVmZmVyLnBhc3NwaHJhc2VcbiAgICBidWZmZXIgPSBidWZmZXIua2V5XG4gIH1cbiAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgYnVmZmVyID0gbmV3IEJ1ZmZlcihidWZmZXIpXG4gIH1cblxuICB2YXIgc3RyaXBwZWQgPSBmaXhQcm9jKGJ1ZmZlciwgcGFzc3dvcmQpXG5cbiAgdmFyIHR5cGUgPSBzdHJpcHBlZC50YWdcbiAgdmFyIGRhdGEgPSBzdHJpcHBlZC5kYXRhXG4gIHZhciBzdWJ0eXBlLCBuZGF0YVxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdQVUJMSUMgS0VZJzpcbiAgICAgIG5kYXRhID0gYXNuMS5QdWJsaWNLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgc3VidHlwZSA9IG5kYXRhLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbignLicpXG4gICAgICBzd2l0Y2ggKHN1YnR5cGUpIHtcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMTM1NDkuMS4xLjEnOlxuICAgICAgICAgIHJldHVybiBhc24xLlJTQVB1YmxpY0tleS5kZWNvZGUobmRhdGEuc3ViamVjdFB1YmxpY0tleS5kYXRhLCAnZGVyJylcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMDA0NS4yLjEnOlxuICAgICAgICAgIG5kYXRhLnN1YmplY3RQcml2YXRlS2V5ID0gbmRhdGEuc3ViamVjdFB1YmxpY0tleVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZWMnLFxuICAgICAgICAgICAgZGF0YTogbmRhdGFcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJzEuMi44NDAuMTAwNDAuNC4xJzpcbiAgICAgICAgICBuZGF0YS5hbGdvcml0aG0ucGFyYW1zLnB1Yl9rZXkgPSBhc24xLkRTQXBhcmFtLmRlY29kZShuZGF0YS5zdWJqZWN0UHVibGljS2V5LmRhdGEsICdkZXInKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZHNhJyxcbiAgICAgICAgICAgIGRhdGE6IG5kYXRhLmFsZ29yaXRobS5wYXJhbXNcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcigndW5rbm93biBrZXkgaWQgJyArIHN1YnR5cGUpXG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24ga2V5IHR5cGUgJyArIHR5cGUpXG4gICAgY2FzZSAnRU5DUllQVEVEIFBSSVZBVEUgS0VZJzpcbiAgICAgIGRhdGEgPSBhc24xLkVuY3J5cHRlZFByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgZGF0YSA9IGRlY3J5cHQoZGF0YSwgcGFzc3dvcmQpXG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgY2FzZSAnUFJJVkFURSBLRVknOlxuICAgICAgbmRhdGEgPSBhc24xLlByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgc3VidHlwZSA9IG5kYXRhLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbignLicpXG4gICAgICBzd2l0Y2ggKHN1YnR5cGUpIHtcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMTM1NDkuMS4xLjEnOlxuICAgICAgICAgIHJldHVybiBhc24xLlJTQVByaXZhdGVLZXkuZGVjb2RlKG5kYXRhLnN1YmplY3RQcml2YXRlS2V5LCAnZGVyJylcbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMDA0NS4yLjEnOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJ2ZTogbmRhdGEuYWxnb3JpdGhtLmN1cnZlLFxuICAgICAgICAgICAgcHJpdmF0ZUtleTogYXNuMS5FQ1ByaXZhdGVLZXkuZGVjb2RlKG5kYXRhLnN1YmplY3RQcml2YXRlS2V5LCAnZGVyJykucHJpdmF0ZUtleVxuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnMS4yLjg0MC4xMDA0MC40LjEnOlxuICAgICAgICAgIG5kYXRhLmFsZ29yaXRobS5wYXJhbXMucHJpdl9rZXkgPSBhc24xLkRTQXBhcmFtLmRlY29kZShuZGF0YS5zdWJqZWN0UHJpdmF0ZUtleSwgJ2RlcicpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdkc2EnLFxuICAgICAgICAgICAgcGFyYW1zOiBuZGF0YS5hbGdvcml0aG0ucGFyYW1zXG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24ga2V5IGlkICcgKyBzdWJ0eXBlKVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGtleSB0eXBlICcgKyB0eXBlKVxuICAgIGNhc2UgJ1JTQSBQVUJMSUMgS0VZJzpcbiAgICAgIHJldHVybiBhc24xLlJTQVB1YmxpY0tleS5kZWNvZGUoZGF0YSwgJ2RlcicpXG4gICAgY2FzZSAnUlNBIFBSSVZBVEUgS0VZJzpcbiAgICAgIHJldHVybiBhc24xLlJTQVByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgIGNhc2UgJ0RTQSBQUklWQVRFIEtFWSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZHNhJyxcbiAgICAgICAgcGFyYW1zOiBhc24xLkRTQVByaXZhdGVLZXkuZGVjb2RlKGRhdGEsICdkZXInKVxuICAgICAgfVxuICAgIGNhc2UgJ0VDIFBSSVZBVEUgS0VZJzpcbiAgICAgIGRhdGEgPSBhc24xLkVDUHJpdmF0ZUtleS5kZWNvZGUoZGF0YSwgJ2RlcicpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJ2ZTogZGF0YS5wYXJhbWV0ZXJzLnZhbHVlLFxuICAgICAgICBwcml2YXRlS2V5OiBkYXRhLnByaXZhdGVLZXlcbiAgICAgIH1cbiAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24ga2V5IHR5cGUgJyArIHR5cGUpXG4gIH1cbn1cbnBhcnNlS2V5cy5zaWduYXR1cmUgPSBhc24xLnNpZ25hdHVyZVxuZnVuY3Rpb24gZGVjcnlwdCAoZGF0YSwgcGFzc3dvcmQpIHtcbiAgdmFyIHNhbHQgPSBkYXRhLmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuc2FsdFxuICB2YXIgaXRlcnMgPSBwYXJzZUludChkYXRhLmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuaXRlcnMudG9TdHJpbmcoKSwgMTApXG4gIHZhciBhbGdvID0gYWVzaWRbZGF0YS5hbGdvcml0aG0uZGVjcnlwdC5jaXBoZXIuYWxnby5qb2luKCcuJyldXG4gIHZhciBpdiA9IGRhdGEuYWxnb3JpdGhtLmRlY3J5cHQuY2lwaGVyLml2XG4gIHZhciBjaXBoZXJUZXh0ID0gZGF0YS5zdWJqZWN0UHJpdmF0ZUtleVxuICB2YXIga2V5bGVuID0gcGFyc2VJbnQoYWxnby5zcGxpdCgnLScpWzFdLCAxMCkgLyA4XG4gIHZhciBrZXkgPSBjb21wYXQucGJrZGYyU3luYyhwYXNzd29yZCwgc2FsdCwgaXRlcnMsIGtleWxlbilcbiAgdmFyIGNpcGhlciA9IGNpcGhlcnMuY3JlYXRlRGVjaXBoZXJpdihhbGdvLCBrZXksIGl2KVxuICB2YXIgb3V0ID0gW11cbiAgb3V0LnB1c2goY2lwaGVyLnVwZGF0ZShjaXBoZXJUZXh0KSlcbiAgb3V0LnB1c2goY2lwaGVyLmZpbmFsKCkpXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KG91dClcbn1cbiIsIi8qKlxuICogQGF1dGhvciBUaXR1cyBXb3JtZXJcbiAqIEBjb3B5cmlnaHQgMjAxNSBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSBwYXJzZS1lbnRpdGllc1xuICogQGZpbGVvdmVydmlldyBQYXJzZSBIVE1MIGNoYXJhY3RlciByZWZlcmVuY2VzOiBmYXN0LCBzcGVjLWNvbXBsaWFudCxcbiAqICAgcG9zaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLypcbiAqIERlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgY2hhcmFjdGVyRW50aXRpZXMgPSByZXF1aXJlKCdjaGFyYWN0ZXItZW50aXRpZXMnKTtcbnZhciBsZWdhY3kgPSByZXF1aXJlKCdjaGFyYWN0ZXItZW50aXRpZXMtbGVnYWN5Jyk7XG52YXIgaW52YWxpZCA9IHJlcXVpcmUoJ2NoYXJhY3Rlci1yZWZlcmVuY2UtaW52YWxpZCcpO1xuXG4vKlxuICogTWV0aG9kcy5cbiAqL1xuXG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIG5vb3AgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8qXG4gKiBSZWZlcmVuY2UgdHlwZXMuXG4gKi9cblxudmFyIE5BTUVEID0gJ25hbWVkJztcbnZhciBIRVhBREVDSU1BTCA9ICdoZXhhZGVjaW1hbCc7XG52YXIgREVDSU1BTCA9ICdkZWNpbWFsJztcblxuLypcbiAqIE1hcCBvZiBiYXNlcy5cbiAqL1xuXG52YXIgQkFTRSA9IHt9O1xuXG5CQVNFW0hFWEFERUNJTUFMXSA9IDE2O1xuQkFTRVtERUNJTUFMXSA9IDEwO1xuXG4vKlxuICogV2FybmluZyBtZXNzYWdlcy5cbiAqL1xuXG52YXIgTlVNRVJJQ19SRUZFUkVOQ0UgPSAnTnVtZXJpYyBjaGFyYWN0ZXIgcmVmZXJlbmNlcyc7XG52YXIgTkFNRURfUkVGRVJFTkNFID0gJ05hbWVkIGNoYXJhY3RlciByZWZlcmVuY2VzJztcbnZhciBURVJNSU5BVEVEID0gJyBtdXN0IGJlIHRlcm1pbmF0ZWQgYnkgYSBzZW1pY29sb24nO1xudmFyIFZPSUQgPSAnIGNhbm5vdCBiZSBlbXB0eSc7XG5cbnZhciBOQU1FRF9OT1RfVEVSTUlOQVRFRCA9IDE7XG52YXIgTlVNRVJJQ19OT1RfVEVSTUlOQVRFRCA9IDI7XG52YXIgTkFNRURfRU1QVFkgPSAzO1xudmFyIE5VTUVSSUNfRU1QVFkgPSA0O1xudmFyIE5BTUVEX1VOS05PV04gPSA1O1xudmFyIE5VTUVSSUNfRElTQUxMT1dFRCA9IDY7XG52YXIgTlVNRVJJQ19QUk9ISUJJVEVEID0gNztcblxudmFyIE1FU1NBR0VTID0ge307XG5cbk1FU1NBR0VTW05BTUVEX05PVF9URVJNSU5BVEVEXSA9IE5BTUVEX1JFRkVSRU5DRSArIFRFUk1JTkFURUQ7XG5NRVNTQUdFU1tOVU1FUklDX05PVF9URVJNSU5BVEVEXSA9IE5VTUVSSUNfUkVGRVJFTkNFICsgVEVSTUlOQVRFRDtcbk1FU1NBR0VTW05BTUVEX0VNUFRZXSA9IE5BTUVEX1JFRkVSRU5DRSArIFZPSUQ7XG5NRVNTQUdFU1tOVU1FUklDX0VNUFRZXSA9IE5VTUVSSUNfUkVGRVJFTkNFICsgVk9JRDtcbk1FU1NBR0VTW05BTUVEX1VOS05PV05dID0gTkFNRURfUkVGRVJFTkNFICsgJyBtdXN0IGJlIGtub3duJztcbk1FU1NBR0VTW05VTUVSSUNfRElTQUxMT1dFRF0gPSBOVU1FUklDX1JFRkVSRU5DRSArICcgY2Fubm90IGJlIGRpc2FsbG93ZWQnO1xuTUVTU0FHRVNbTlVNRVJJQ19QUk9ISUJJVEVEXSA9IE5VTUVSSUNfUkVGRVJFTkNFICsgJyBjYW5ub3QgYmUgb3V0c2lkZSB0aGUgJyArXG4gICAgJ3Blcm1pc3NpYmxlIFVuaWNvZGUgcmFuZ2UnO1xuXG4vKlxuICogQ2hhcmFjdGVycy5cbiAqL1xuXG52YXIgUkVQTEFDRU1FTlQgPSAnXFx1RkZGRCc7XG52YXIgRk9STV9GRUVEID0gJ1xcZic7XG52YXIgQU1QRVJTQU5EID0gJyYnO1xudmFyIE9DVE9USE9SUCA9ICcjJztcbnZhciBTRU1JQ09MT04gPSAnOyc7XG52YXIgTkVXTElORSA9ICdcXG4nO1xudmFyIFhfTE9XRVIgPSAneCc7XG52YXIgWF9VUFBFUiA9ICdYJztcbnZhciBTUEFDRSA9ICcgJztcbnZhciBMRVNTX1RIQU4gPSAnPCc7XG52YXIgRVFVQUwgPSAnPSc7XG52YXIgRU1QVFkgPSAnJztcbnZhciBUQUIgPSAnXFx0JztcblxuLyoqXG4gKiBHZXQgdGhlIGNoYXJhY3Rlci1jb2RlIGF0IHRoZSBmaXJzdCBpbmRpY2UgaW5cbiAqIGBjaGFyYWN0ZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXIgLSBWYWx1ZS5cbiAqIEByZXR1cm4ge251bWJlcn0gLSBDaGFyYWN0ZXItY29kZSBhdCB0aGUgZmlyc3QgaW5kaWNlXG4gKiAgIGluIGBjaGFyYWN0ZXJgLlxuICovXG5mdW5jdGlvbiBjaGFyQ29kZShjaGFyYWN0ZXIpIHtcbiAgICByZXR1cm4gY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBgY2hhcmFjdGVyYCBpcyBhIGRlY2ltYWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJhY3RlciAtIFZhbHVlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBXaGV0aGVyIGBjaGFyYWN0ZXJgIGlzIGEgZGVjaW1hbC5cbiAqL1xuZnVuY3Rpb24gaXNEZWNpbWFsKGNoYXJhY3Rlcikge1xuICAgIHZhciBjb2RlID0gY2hhckNvZGUoY2hhcmFjdGVyKTtcblxuICAgIHJldHVybiBjb2RlID49IDQ4IC8qIDAgKi8gJiYgY29kZSA8PSA1NyAvKiA5ICovO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYGNoYXJhY3RlcmAgaXMgYSBoZXhhZGVjaW1hbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhcmFjdGVyIC0gVmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFdoZXRoZXIgYGNoYXJhY3RlcmAgaXMgYVxuICogICBoZXhhZGVjaW1hbC5cbiAqL1xuZnVuY3Rpb24gaXNIZXhhZGVjaW1hbChjaGFyYWN0ZXIpIHtcbiAgICB2YXIgY29kZSA9IGNoYXJDb2RlKGNoYXJhY3Rlcik7XG5cbiAgICByZXR1cm4gKGNvZGUgPj0gNDggLyogMCAqLyAmJiBjb2RlIDw9IDU3IC8qIDkgKi8pIHx8XG4gICAgICAgIChjb2RlID49IDY1IC8qIEEgKi8gJiYgY29kZSA8PSA3MCAvKiBGICovKSB8fFxuICAgICAgICAoY29kZSA+PSA5NyAvKiBhICovICYmIGNvZGUgPD0gMTAyIC8qIGYgKi8pO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYGNoYXJhY3RlcmAgaXMgYW4gYWxwaGFudW1lcmljLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXIgLSBWYWx1ZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gV2hldGhlciBgY2hhcmFjdGVyYCBpcyBhblxuICogICBhbHBoYW51bWVyaWMuXG4gKi9cbmZ1bmN0aW9uIGlzQWxwaGFudW1lcmljKGNoYXJhY3Rlcikge1xuICAgIHZhciBjb2RlID0gY2hhckNvZGUoY2hhcmFjdGVyKTtcblxuICAgIHJldHVybiAoY29kZSA+PSA0OCAvKiAwICovICYmIGNvZGUgPD0gNTcgLyogOSAqLykgfHxcbiAgICAgICAgKGNvZGUgPj0gNjUgLyogQSAqLyAmJiBjb2RlIDw9IDkwIC8qIFogKi8pIHx8XG4gICAgICAgIChjb2RlID49IDk3IC8qIGEgKi8gJiYgY29kZSA8PSAxMjIgLyogeiAqLyk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBgY2hhcmFjdGVyYCBpcyBvdXRzaWRlIHRoZSBwZXJtaXNzaWJsZVxuICogdW5pY29kZSByYW5nZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gY2hhcmFjdGVyQ29kZSAtIFZhbHVlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBXaGV0aGVyIGBjaGFyYWN0ZXJgIGlzIGFuXG4gKiAgIG91dHNpZGUgdGhlIHBlcm1pc3NpYmxlIHVuaWNvZGUgcmFuZ2UuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvaGliaXRlZChjaGFyYWN0ZXJDb2RlKSB7XG4gICAgcmV0dXJuIChjaGFyYWN0ZXJDb2RlID49IDB4RDgwMCAmJiBjaGFyYWN0ZXJDb2RlIDw9IDB4REZGRikgfHxcbiAgICAgICAgKGNoYXJhY3RlckNvZGUgPiAweDEwRkZGRik7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBgY2hhcmFjdGVyYCBpcyBkaXNhbGxvd2VkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjaGFyYWN0ZXJDb2RlIC0gVmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFdoZXRoZXIgYGNoYXJhY3RlcmAgaXMgZGlzYWxsb3dlZC5cbiAqL1xuZnVuY3Rpb24gaXNXYXJuaW5nKGNoYXJhY3RlckNvZGUpIHtcbiAgICByZXR1cm4gKGNoYXJhY3RlckNvZGUgPj0gMHgwMDAxICYmIGNoYXJhY3RlckNvZGUgPD0gMHgwMDA4KSB8fFxuICAgICAgICAoY2hhcmFjdGVyQ29kZSA+PSAweDAwMEQgJiYgY2hhcmFjdGVyQ29kZSA8PSAweDAwMUYpIHx8XG4gICAgICAgIChjaGFyYWN0ZXJDb2RlID49IDB4MDA3RiAmJiBjaGFyYWN0ZXJDb2RlIDw9IDB4MDA5RikgfHxcbiAgICAgICAgKGNoYXJhY3RlckNvZGUgPj0gMHhGREQwICYmIGNoYXJhY3RlckNvZGUgPD0gMHhGREVGKSB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweDAwMEIgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHhGRkZFIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4RkZGRiB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweDFGRkZFIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4MUZGRkYgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHgyRkZGRSB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweDJGRkZGIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4M0ZGRkUgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHgzRkZGRiB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweDRGRkZFIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4NEZGRkYgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHg1RkZGRSB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweDVGRkZGIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4NkZGRkUgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHg2RkZGRiB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweDdGRkZFIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4N0ZGRkYgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHg4RkZGRSB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweDhGRkZGIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4OUZGRkUgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHg5RkZGRiB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweEFGRkZFIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4QUZGRkYgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHhCRkZGRSB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweEJGRkZGIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4Q0ZGRkUgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHhDRkZGRiB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweERGRkZFIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4REZGRkYgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHhFRkZGRSB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweEVGRkZGIHx8XG4gICAgICAgIGNoYXJhY3RlckNvZGUgPT09IDB4RkZGRkUgfHxcbiAgICAgICAgY2hhcmFjdGVyQ29kZSA9PT0gMHhGRkZGRiB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweDEwRkZGRSB8fFxuICAgICAgICBjaGFyYWN0ZXJDb2RlID09PSAweDEwRkZGRjtcbn1cblxuLypcbiAqIE1hcCBvZiB0eXBlcyB0byB0ZXN0cy4gRWFjaCB0eXBlIG9mIGNoYXJhY3RlciByZWZlcmVuY2VcbiAqIGFjY2VwdHMgZGlmZmVyZW50IGNoYXJhY3RlcnMuIFRoaXMgdGVzdCBpcyB1c2VkIHRvXG4gKiBkZXRlY3Qgd2hldGhlciBhIHJlZmVyZW5jZSBoYXMgZW5kZWQgKGFzIHRoZSBzZW1pY29sb25cbiAqIGlzIG5vdCBzdHJpY3RseSBuZWVkZWQpLlxuICovXG5cbnZhciBURVNUUyA9IHt9O1xuXG5URVNUU1tOQU1FRF0gPSBpc0FscGhhbnVtZXJpYztcblRFU1RTW0RFQ0lNQUxdID0gaXNEZWNpbWFsO1xuVEVTVFNbSEVYQURFQ0lNQUxdID0gaXNIZXhhZGVjaW1hbDtcblxuLyoqXG4gKiBQYXJzZSBlbnRpdGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byB0b2tlbmlzZS5cbiAqIEBwYXJhbSB7T2JqZWN0P30gW3NldHRpbmdzXSAtIENvbmZpZ3VyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKHZhbHVlLCBzZXR0aW5ncykge1xuICAgIHZhciBhZGRpdGlvbmFsID0gc2V0dGluZ3MuYWRkaXRpb25hbDtcbiAgICB2YXIgaGFuZGxlVGV4dCA9IHNldHRpbmdzLnRleHQ7XG4gICAgdmFyIGhhbmRsZVJlZmVyZW5jZSA9IHNldHRpbmdzLnJlZmVyZW5jZTtcbiAgICB2YXIgaGFuZGxlV2FybmluZyA9IHNldHRpbmdzLndhcm5pbmc7XG4gICAgdmFyIHRleHRDb250ZXh0ID0gc2V0dGluZ3MudGV4dENvbnRleHQ7XG4gICAgdmFyIHJlZmVyZW5jZUNvbnRleHQgPSBzZXR0aW5ncy5yZWZlcmVuY2VDb250ZXh0O1xuICAgIHZhciB3YXJuaW5nQ29udGV4dCA9IHNldHRpbmdzLndhcm5pbmdDb250ZXh0O1xuICAgIHZhciBwb3MgPSBzZXR0aW5ncy5wb3NpdGlvbjtcbiAgICB2YXIgaW5kZW50ID0gc2V0dGluZ3MuaW5kZW50IHx8IFtdO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbGluZXMgPSAtMTtcbiAgICB2YXIgY29sdW1uID0gcG9zLmNvbHVtbiB8fCAxO1xuICAgIHZhciBsaW5lID0gcG9zLmxpbmUgfHwgMTtcbiAgICB2YXIgcXVldWUgPSBFTVBUWTtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGVudGl0eUNoYXJhY3RlcnM7XG4gICAgdmFyIHRlcm1pbmF0ZWQ7XG4gICAgdmFyIGNoYXJhY3RlcnM7XG4gICAgdmFyIGNoYXJhY3RlcjtcbiAgICB2YXIgcmVmZXJlbmNlO1xuICAgIHZhciBmb2xsb3dpbmc7XG4gICAgdmFyIHdhcm5pbmc7XG4gICAgdmFyIHJlYXNvbjtcbiAgICB2YXIgb3V0cHV0O1xuICAgIHZhciBlbnRpdHk7XG4gICAgdmFyIGJlZ2luO1xuICAgIHZhciBzdGFydDtcbiAgICB2YXIgdHlwZTtcbiAgICB2YXIgdGVzdDtcbiAgICB2YXIgcHJldjtcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgZGlmZjtcbiAgICB2YXIgZW5kO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IC0gUG9zaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBhXG4gICAgICogICBzaW5nbGUgcG9pbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm93KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2xpbmUnOiBsaW5lLFxuICAgICAgICAgICAgJ2NvbHVtbic6IGNvbHVtbixcbiAgICAgICAgICAgICdvZmZzZXQnOiBpbmRleCArIChwb3Mub2Zmc2V0IHx8IDApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog4oCcVGhyb3figJ0gYSBwYXJzZS1lcnJvcjogYSB3YXJuaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGUgLSBJZGVudGlmaWVyIG9mIHJlYXNvbiBmb3JcbiAgICAgKiAgIGZhaWxpbmcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIE9mZnNldCBpbiBjaGFyYWN0ZXJzIGZyb21cbiAgICAgKiAgIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50IGF0IHdoaWNoIHRoZVxuICAgICAqICAgcGFyc2UtZXJyb3Igb2N1cnJlZCwgY2Fubm90IHBvaW50IHBhc3QgbmV3bGluZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VFcnJvcihjb2RlLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gbm93KCk7XG5cbiAgICAgICAgcG9zaXRpb24uY29sdW1uICs9IG9mZnNldDtcbiAgICAgICAgcG9zaXRpb24ub2Zmc2V0ICs9IG9mZnNldDtcblxuICAgICAgICBoYW5kbGVXYXJuaW5nLmNhbGwod2FybmluZ0NvbnRleHQsIE1FU1NBR0VTW2NvZGVdLCBwb3NpdGlvbiwgY29kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNoYXJhY3RlciBhdCBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiAtIEluZGljZSBvZiBjaGFyYWN0ZXIgaW4gYHZhbHVlYC5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ2hhcmFjdGVyIGF0IGBwb3NpdGlvbmAgaW5cbiAgICAgKiAgIGB2YWx1ZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXQocG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmNoYXJBdChwb3NpdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmx1c2ggYHF1ZXVlYCAobm9ybWFsIHRleHQpLiBNYWNybyBpbnZva2VkIGJlZm9yZVxuICAgICAqIGVhY2ggZW50aXR5IGFuZCBhdCB0aGUgZW5kIG9mIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBEb2VzIG5vdGhpbmcgd2hlbiBgcXVldWVgIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHF1ZXVlKTtcblxuICAgICAgICAgICAgaWYgKGhhbmRsZVRleHQpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVUZXh0LmNhbGwodGV4dENvbnRleHQsIHF1ZXVlLCB7XG4gICAgICAgICAgICAgICAgICAgICdzdGFydCc6IHByZXYsXG4gICAgICAgICAgICAgICAgICAgICdlbmQnOiBub3coKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWV1ZSA9IEVNUFRZO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBDYWNoZSB0aGUgY3VycmVudCBwb2ludC5cbiAgICAgKi9cblxuICAgIHByZXYgPSBub3coKTtcblxuICAgIC8qXG4gICAgICogV3JhcCBgaGFuZGxlV2FybmluZ2AuXG4gICAgICovXG5cbiAgICB3YXJuaW5nID0gaGFuZGxlV2FybmluZyA/IHBhcnNlRXJyb3IgOiBub29wO1xuXG4gICAgLypcbiAgICAgKiBFbnN1cmUgdGhlIGFsZ29yaXRobSB3YWxrcyBvdmVyIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAgICAgKiBhbmQgdGhlIGVuZCAoaW5jbHVzaXZlKS5cbiAgICAgKi9cblxuICAgIGluZGV4LS07XG4gICAgbGVuZ3RoKys7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBJZiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIHdhcyBhIG5ld2xpbmUuXG4gICAgICAgICAqL1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IE5FV0xJTkUpIHtcbiAgICAgICAgICAgIGNvbHVtbiA9IGluZGVudFtsaW5lc10gfHwgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoYXJhY3RlciA9IGF0KGluZGV4KTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBIYW5kbGUgYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBhbXBlcnNhbmQsXG4gICAgICAgICAqIGluY2x1ZGluZyBuZXdsaW5lcyBhbmQgRU9GLlxuICAgICAgICAgKi9cblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBBTVBFUlNBTkQpIHtcbiAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IE5FV0xJTkUpIHtcbiAgICAgICAgICAgICAgICBsaW5lKys7XG4gICAgICAgICAgICAgICAgbGluZXMrKztcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyKSB7XG4gICAgICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgIGNvbHVtbisrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9sbG93aW5nID0gYXQoaW5kZXggKyAxKTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIFRoZSBiZWhhdmlvdXIgZGVwZW5kcyBvbiB0aGUgaWRlbnRpdHkgb2YgdGhlIG5leHQgY2hhcmFjdGVyLlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBmb2xsb3dpbmcgPT09IFRBQiB8fFxuICAgICAgICAgICAgICAgIGZvbGxvd2luZyA9PT0gTkVXTElORSB8fFxuICAgICAgICAgICAgICAgIGZvbGxvd2luZyA9PT0gRk9STV9GRUVEIHx8XG4gICAgICAgICAgICAgICAgZm9sbG93aW5nID09PSBTUEFDRSB8fFxuICAgICAgICAgICAgICAgIGZvbGxvd2luZyA9PT0gTEVTU19USEFOIHx8XG4gICAgICAgICAgICAgICAgZm9sbG93aW5nID09PSBBTVBFUlNBTkQgfHxcbiAgICAgICAgICAgICAgICBmb2xsb3dpbmcgPT09IEVNUFRZIHx8XG4gICAgICAgICAgICAgICAgKGFkZGl0aW9uYWwgJiYgZm9sbG93aW5nID09PSBhZGRpdGlvbmFsKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBOb3QgYSBjaGFyYWN0ZXIgcmVmZXJlbmNlLiBObyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICAgICAgICogYXJlIGNvbnN1bWVkLCBhbmQgbm90aGluZyBpcyByZXR1cm5lZC5cbiAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIG5vdCBhbiBlcnJvciwgZWl0aGVyLlxuICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgIGNvbHVtbisrO1xuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YXJ0ID0gYmVnaW4gPSBlbmQgPSBpbmRleCArIDE7XG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBOdW1lcmljYWwgZW50aXR5LlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChmb2xsb3dpbmcgIT09IE9DVE9USE9SUCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSBOQU1FRDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5kID0gKytiZWdpbjtcblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICogVGhlIGJlaGF2aW91ciBmdXJ0aGVyIGRlcGVuZHMgb24gdGhlXG4gICAgICAgICAgICAgICAgICogY2hhcmFjdGVyIGFmdGVyIHRoZSBVKzAwMjMgTlVNQkVSIFNJR04uXG4gICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICBmb2xsb3dpbmcgPSBhdChlbmQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZvbGxvd2luZyA9PT0gWF9MT1dFUiB8fCBmb2xsb3dpbmcgPT09IFhfVVBQRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICogQVNDSUkgaGV4IGRpZ2l0cy5cbiAgICAgICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEhFWEFERUNJTUFMO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSArK2JlZ2luO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAqIEFTQ0lJIGRpZ2l0cy5cbiAgICAgICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERFQ0lNQUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbnRpdHlDaGFyYWN0ZXJzID0gZW50aXR5ID0gY2hhcmFjdGVycyA9IEVNUFRZO1xuICAgICAgICAgICAgdGVzdCA9IFRFU1RTW3R5cGVdO1xuICAgICAgICAgICAgZW5kLS07XG5cbiAgICAgICAgICAgIHdoaWxlICgrK2VuZCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvbGxvd2luZyA9IGF0KGVuZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRlc3QoZm9sbG93aW5nKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzICs9IGZvbGxvd2luZztcblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgY2FuIG1hdGNoIGEgbGVnYWN5IG5hbWVkXG4gICAgICAgICAgICAgICAgICogcmVmZXJlbmNlLiAgSWYgc28sIHdlIGNhY2hlIHRoYXQgYXMgdGhlXG4gICAgICAgICAgICAgICAgICogbGFzdCB2aWFibGUgbmFtZWQgcmVmZXJlbmNlLiAgVGhpc1xuICAgICAgICAgICAgICAgICAqIGVuc3VyZXMgd2UgZG8gbm90IG5lZWQgdG8gd2FsayBiYWNrd2FyZHNcbiAgICAgICAgICAgICAgICAgKiBsYXRlci5cbiAgICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PT0gTkFNRUQgJiZcbiAgICAgICAgICAgICAgICAgICAgaGFzLmNhbGwobGVnYWN5LCBjaGFyYWN0ZXJzKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHlDaGFyYWN0ZXJzID0gY2hhcmFjdGVycztcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gbGVnYWN5W2NoYXJhY3RlcnNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGVybWluYXRlZCA9IGF0KGVuZCkgPT09IFNFTUlDT0xPTjtcblxuICAgICAgICAgICAgaWYgKHRlcm1pbmF0ZWQpIHtcbiAgICAgICAgICAgICAgICBlbmQrKztcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PT0gTkFNRUQgJiZcbiAgICAgICAgICAgICAgICAgICAgaGFzLmNhbGwoY2hhcmFjdGVyRW50aXRpZXMsIGNoYXJhY3RlcnMpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0eUNoYXJhY3RlcnMgPSBjaGFyYWN0ZXJzO1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSBjaGFyYWN0ZXJFbnRpdGllc1tjaGFyYWN0ZXJzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRpZmYgPSAxICsgZW5kIC0gc3RhcnQ7XG5cbiAgICAgICAgICAgIGlmICghY2hhcmFjdGVycykge1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICogQW4gZW1wdHkgKHBvc3NpYmxlKSBlbnRpdHkgaXMgdmFsaWQsIHVubGVzc1xuICAgICAgICAgICAgICAgICAqIGl0cyBudW1lcmljICh0aHVzIGFuIGFtcGVyc2FuZCBmb2xsb3dlZCBieVxuICAgICAgICAgICAgICAgICAqIGFuIG9jdG90aG9ycCkuXG4gICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gTkFNRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZyhOVU1FUklDX0VNUFRZLCBkaWZmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IE5BTUVEKSB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBBbiBhbXBlcnNhbmQgZm9sbG93ZWQgYnkgYW55dGhpbmdcbiAgICAgICAgICAgICAgICAgKiB1bmtub3duLCBhbmQgbm90IHRlcm1pbmF0ZWQsIGlzIGludmFsaWQuXG4gICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICBpZiAodGVybWluYXRlZCAmJiAhZW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoTkFNRURfVU5LTk9XTiwgMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICogSWYgdGhlcmVzIHNvbWV0aGluZyBhZnRlciBhbiBlbnRpdHlcbiAgICAgICAgICAgICAgICAgICAgICogbmFtZSB3aGljaCBpcyBub3Qga25vd24sIGNhcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogcmVmZXJlbmNlLlxuICAgICAgICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW50aXR5Q2hhcmFjdGVycyAhPT0gY2hhcmFjdGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gYmVnaW4gKyBlbnRpdHlDaGFyYWN0ZXJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgPSAxICsgZW5kIC0gYmVnaW47XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgKiBJZiB0aGUgcmVmZXJlbmNlIGlzIG5vdCB0ZXJtaW5hdGVkLFxuICAgICAgICAgICAgICAgICAgICAgKiB3YXJuLlxuICAgICAgICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRlcm1pbmF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9IGVudGl0eUNoYXJhY3RlcnMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVEX05PVF9URVJNSU5BVEVEIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FRF9FTVBUWTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5hdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKHJlYXNvbiwgZGlmZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyA9IGF0KGVuZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9sbG93aW5nID09PSBFUVVBTCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKHJlYXNvbiwgZGlmZik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0FscGhhbnVtZXJpYyhmb2xsb3dpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyhyZWFzb24sIGRpZmYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IGVudGl0eTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXJtaW5hdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAqIEFsbCBub24tdGVybWluYXRlZCBudW1lcmljIGVudGl0aWVzIGFyZVxuICAgICAgICAgICAgICAgICAgICAgKiBub3QgcmVuZGVyZWQsIGFuZCB0cmlnZ2VyIGEgd2FybmluZy5cbiAgICAgICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICAgICAgd2FybmluZyhOVU1FUklDX05PVF9URVJNSU5BVEVELCBkaWZmKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAqIFdoZW4gdGVybWluYXRlZCBhbmQgbnVtYmVyLCBwYXJzZSBhc1xuICAgICAgICAgICAgICAgICAqIGVpdGhlciBoZXhhZGVjaW1hbCBvciBkZWNpbWFsLlxuICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcGFyc2VJbnQoY2hhcmFjdGVycywgQkFTRVt0eXBlXSk7XG5cbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAqIFRyaWdnZXIgYSB3YXJuaW5nIHdoZW4gdGhlIHBhcnNlZCBudW1iZXJcbiAgICAgICAgICAgICAgICAgKiBpcyBwcm9oaWJpdGVkLCBhbmQgcmVwbGFjZSB3aXRoXG4gICAgICAgICAgICAgICAgICogcmVwbGFjZW1lbnQgY2hhcmFjdGVyLlxuICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzUHJvaGliaXRlZChyZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoTlVNRVJJQ19QUk9ISUJJVEVELCBkaWZmKTtcblxuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBSRVBMQUNFTUVOVDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbiBpbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAqIFRyaWdnZXIgYSB3YXJuaW5nIHdoZW4gdGhlIHBhcnNlZCBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICogaXMgZGlzYWxsb3dlZCwgYW5kIHJlcGxhY2UgYnkgYW5cbiAgICAgICAgICAgICAgICAgICAgICogYWx0ZXJuYXRpdmUuXG4gICAgICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoTlVNRVJJQ19ESVNBTExPV0VELCBkaWZmKTtcblxuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBpbnZhbGlkW3JlZmVyZW5jZV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICogUGFyc2UgdGhlIG51bWJlci5cbiAgICAgICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gRU1QVFk7XG5cbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICogVHJpZ2dlciBhIHdhcm5pbmcgd2hlbiB0aGUgcGFyc2VkXG4gICAgICAgICAgICAgICAgICAgICAqIG51bWJlciBzaG91bGQgbm90IGJlIHVzZWQuXG4gICAgICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1dhcm5pbmcocmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyhOVU1FUklDX0RJU0FMTE9XRUQsIGRpZmYpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICogU3RyaW5naWZ5IHRoZSBudW1iZXIuXG4gICAgICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UgPiAweEZGRkYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSAtPSAweDEwMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGZyb21DaGFyQ29kZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IDB4REMwMCB8IHJlZmVyZW5jZSAmIDB4M0ZGO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gb3V0cHV0ICsgZnJvbUNoYXJDb2RlKHJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogSWYgd2UgY291bGQgbm90IGZpbmQgYSByZWZlcmVuY2UsIHF1ZXVlIHRoZVxuICAgICAgICAgICAgICogY2hlY2tlZCBjaGFyYWN0ZXJzIChhcyBub3JtYWwgY2hhcmFjdGVycyksXG4gICAgICAgICAgICAgKiBhbmQgbW92ZSB0aGUgcG9pbnRlciB0byB0aGVpciBlbmQuIFRoaXMgaXNcbiAgICAgICAgICAgICAqIHBvc3NpYmxlIGJlY2F1c2Ugd2UgY2FuIGJlIGNlcnRhaW4gbmVpdGhlclxuICAgICAgICAgICAgICogbmV3bGluZXMgbm9yIGFtcGVyc2FuZHMgYXJlIGluY2x1ZGVkLlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmICghcmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IHZhbHVlLnNsaWNlKHN0YXJ0IC0gMSwgZW5kKTtcbiAgICAgICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXJzO1xuICAgICAgICAgICAgICAgIGNvbHVtbiArPSBjaGFyYWN0ZXJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGVuZCAtIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICogRm91bmQgaXQhIEZpcnN0IGVhdCB0aGUgcXVldWVkXG4gICAgICAgICAgICAgICAgICogY2hhcmFjdGVycyBhcyBub3JtYWwgdGV4dCwgdGhlbiBlYXRcbiAgICAgICAgICAgICAgICAgKiBhbiBlbnRpdHkuXG4gICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICBmbHVzaCgpO1xuXG4gICAgICAgICAgICAgICAgcHJldiA9IG5vdygpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZW5kIC0gMTtcbiAgICAgICAgICAgICAgICBjb2x1bW4gKz0gZW5kIC0gc3RhcnQgKyAxO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgbmV4dCA9IG5vdygpO1xuICAgICAgICAgICAgICAgIG5leHQub2Zmc2V0Kys7XG5cbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVJlZmVyZW5jZS5jYWxsKHJlZmVyZW5jZUNvbnRleHQsIHJlZmVyZW5jZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXJ0JzogcHJldixcbiAgICAgICAgICAgICAgICAgICAgICAgICdlbmQnOiBuZXh0XG4gICAgICAgICAgICAgICAgICAgIH0sIHZhbHVlLnNsaWNlKHN0YXJ0IC0gMSwgZW5kKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJldiA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFJldHVybiB0aGUgcmVkdWNlZCBub2RlcywgYW5kIGFueSBwb3NzaWJsZSB3YXJuaW5ncy5cbiAgICAgKi9cblxuICAgIHJldHVybiByZXN1bHQuam9pbihFTVBUWSk7XG59XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICAnd2FybmluZyc6IG51bGwsXG4gICAgJ3JlZmVyZW5jZSc6IG51bGwsXG4gICAgJ3RleHQnOiBudWxsLFxuICAgICd3YXJuaW5nQ29udGV4dCc6IG51bGwsXG4gICAgJ3JlZmVyZW5jZUNvbnRleHQnOiBudWxsLFxuICAgICd0ZXh0Q29udGV4dCc6IG51bGwsXG4gICAgJ3Bvc2l0aW9uJzoge30sXG4gICAgJ2FkZGl0aW9uYWwnOiBudWxsLFxuICAgICdhdHRyaWJ1dGUnOiBmYWxzZVxufTtcblxuLyoqXG4gKiBXcmFwIHRvIGVuc3VyZSBjbGVhbiBwYXJhbWV0ZXJzIGFyZSBnaXZlbiB0byBgcGFyc2VgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHdpdGggZW50aXRpZXMuXG4gKiBAcGFyYW0ge09iamVjdD99IFtvcHRpb25zXSAtIENvbmZpZ3VyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHdyYXBwZXIodmFsdWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2V0dGluZ3MgPSB7fTtcbiAgICB2YXIga2V5O1xuXG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBmb3IgKGtleSBpbiBkZWZhdWx0cykge1xuICAgICAgICBzZXR0aW5nc1trZXldID0gb3B0aW9uc1trZXldIHx8IGRlZmF1bHRzW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLnBvc2l0aW9uLmluZGVudCB8fCBzZXR0aW5ncy5wb3NpdGlvbi5zdGFydCkge1xuICAgICAgICBzZXR0aW5ncy5pbmRlbnQgPSBzZXR0aW5ncy5wb3NpdGlvbi5pbmRlbnQgfHwgW107XG4gICAgICAgIHNldHRpbmdzLnBvc2l0aW9uID0gc2V0dGluZ3MucG9zaXRpb24uc3RhcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlKHZhbHVlLCBzZXR0aW5ncyk7XG59XG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcGVyO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xudmFyIHNwbGl0UGF0aCA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn07XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn07XG5cblxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBzcGxpdFBhdGgocGF0aClbM107XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIHBvc2l4KHBhdGgpIHtcblx0cmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG5mdW5jdGlvbiB3aW4zMihwYXRoKSB7XG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9ibG9iL2IzZmNjMjQ1ZmIyNTUzOTkwOWVmMWQ1ZWFhMDFkYmY5MmUxNjg2MzMvbGliL3BhdGguanMjTDU2XG5cdHZhciBzcGxpdERldmljZVJlID0gL14oW2EtekEtWl06fFtcXFxcXFwvXXsyfVteXFxcXFxcL10rW1xcXFxcXC9dK1teXFxcXFxcL10rKT8oW1xcXFxcXC9dKT8oW1xcc1xcU10qPykkLztcblx0dmFyIHJlc3VsdCA9IHNwbGl0RGV2aWNlUmUuZXhlYyhwYXRoKTtcblx0dmFyIGRldmljZSA9IHJlc3VsdFsxXSB8fCAnJztcblx0dmFyIGlzVW5jID0gISFkZXZpY2UgJiYgZGV2aWNlLmNoYXJBdCgxKSAhPT0gJzonO1xuXG5cdC8vIFVOQyBwYXRocyBhcmUgYWx3YXlzIGFic29sdXRlXG5cdHJldHVybiAhIXJlc3VsdFsyXSB8fCBpc1VuYztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHdpbjMyIDogcG9zaXg7XG5tb2R1bGUuZXhwb3J0cy5wb3NpeCA9IHBvc2l4O1xubW9kdWxlLmV4cG9ydHMud2luMzIgPSB3aW4zMjtcbiIsInZhciBjcmVhdGVIbWFjID0gcmVxdWlyZSgnY3JlYXRlLWhtYWMnKVxudmFyIE1BWF9BTExPQyA9IE1hdGgucG93KDIsIDMwKSAtIDEgLy8gZGVmYXVsdCBpbiBpb2pzXG5cbmV4cG9ydHMucGJrZGYyID0gcGJrZGYyXG5mdW5jdGlvbiBwYmtkZjIgKHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25zLCBrZXlsZW4sIGRpZ2VzdCwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBkaWdlc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IGRpZ2VzdFxuICAgIGRpZ2VzdCA9IHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gY2FsbGJhY2sgcHJvdmlkZWQgdG8gcGJrZGYyJylcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBwYmtkZjJTeW5jKHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25zLCBrZXlsZW4sIGRpZ2VzdClcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgY2FsbGJhY2sodW5kZWZpbmVkLCByZXN1bHQpXG4gIH0pXG59XG5cbmV4cG9ydHMucGJrZGYyU3luYyA9IHBia2RmMlN5bmNcbmZ1bmN0aW9uIHBia2RmMlN5bmMgKHBhc3N3b3JkLCBzYWx0LCBpdGVyYXRpb25zLCBrZXlsZW4sIGRpZ2VzdCkge1xuICBpZiAodHlwZW9mIGl0ZXJhdGlvbnMgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSXRlcmF0aW9ucyBub3QgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKGl0ZXJhdGlvbnMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIGl0ZXJhdGlvbnMnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXlsZW4gIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignS2V5IGxlbmd0aCBub3QgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKGtleWxlbiA8IDAgfHwga2V5bGVuID4gTUFYX0FMTE9DKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIGtleSBsZW5ndGgnKVxuICB9XG5cbiAgZGlnZXN0ID0gZGlnZXN0IHx8ICdzaGExJ1xuXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHBhc3N3b3JkKSkgcGFzc3dvcmQgPSBuZXcgQnVmZmVyKHBhc3N3b3JkLCAnYmluYXJ5JylcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2FsdCkpIHNhbHQgPSBuZXcgQnVmZmVyKHNhbHQsICdiaW5hcnknKVxuXG4gIHZhciBoTGVuXG4gIHZhciBsID0gMVxuICB2YXIgREsgPSBuZXcgQnVmZmVyKGtleWxlbilcbiAgdmFyIGJsb2NrMSA9IG5ldyBCdWZmZXIoc2FsdC5sZW5ndGggKyA0KVxuICBzYWx0LmNvcHkoYmxvY2sxLCAwLCAwLCBzYWx0Lmxlbmd0aClcblxuICB2YXIgclxuICB2YXIgVFxuXG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IGw7IGkrKykge1xuICAgIGJsb2NrMS53cml0ZVVJbnQzMkJFKGksIHNhbHQubGVuZ3RoKVxuICAgIHZhciBVID0gY3JlYXRlSG1hYyhkaWdlc3QsIHBhc3N3b3JkKS51cGRhdGUoYmxvY2sxKS5kaWdlc3QoKVxuXG4gICAgaWYgKCFoTGVuKSB7XG4gICAgICBoTGVuID0gVS5sZW5ndGhcbiAgICAgIFQgPSBuZXcgQnVmZmVyKGhMZW4pXG4gICAgICBsID0gTWF0aC5jZWlsKGtleWxlbiAvIGhMZW4pXG4gICAgICByID0ga2V5bGVuIC0gKGwgLSAxKSAqIGhMZW5cbiAgICB9XG5cbiAgICBVLmNvcHkoVCwgMCwgMCwgaExlbilcblxuICAgIGZvciAodmFyIGogPSAxOyBqIDwgaXRlcmF0aW9uczsgaisrKSB7XG4gICAgICBVID0gY3JlYXRlSG1hYyhkaWdlc3QsIHBhc3N3b3JkKS51cGRhdGUoVSkuZGlnZXN0KClcblxuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBoTGVuOyBrKyspIHtcbiAgICAgICAgVFtrXSBePSBVW2tdXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlc3RQb3MgPSAoaSAtIDEpICogaExlblxuICAgIHZhciBsZW4gPSAoaSA9PT0gbCA/IHIgOiBoTGVuKVxuICAgIFQuY29weShESywgZGVzdFBvcywgMCwgbGVuKVxuICB9XG5cbiAgcmV0dXJuIERLXG59XG4iLCJcbnZhciBzb2RpdW0gPSByZXF1aXJlKCdjaGxvcmlkZScpXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbnZhciBzY2FsYXJtdWx0ID0gc29kaXVtLmNyeXB0b19zY2FsYXJtdWx0XG52YXIgYm94ICA9IHNvZGl1bS5jcnlwdG9fYm94X2Vhc3lcbnZhciBzZWNyZXRib3ggPSBzb2RpdW0uY3J5cHRvX3NlY3JldGJveF9lYXN5XG52YXIgc2VjcmV0Ym94X29wZW4gPSBzb2RpdW0uY3J5cHRvX3NlY3JldGJveF9vcGVuX2Vhc3lcbnZhciBrZXlwYWlyID0gc29kaXVtLmNyeXB0b19ib3hfa2V5cGFpclxudmFyIGNvbmNhdCA9IEJ1ZmZlci5jb25jYXRcblxuZnVuY3Rpb24gcmFuZG9tYnl0ZXMobikge1xuICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKG4pXG59XG5cbmNvbnN0IE1BWCA9IDdcblxuZXhwb3J0cy5tdWx0aWJveCA9IGZ1bmN0aW9uIChtc2csIHJlY2lwaWVudHMpIHtcblxuICBpZihyZWNpcGllbnRzLmxlbmd0aCA+IE1BWClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21heCByZWNpcGllbnRzIGlzOicrTUFYKycgZm91bmQ6JytyZWNpcGllbnRzLmxlbmd0aClcblxuICB2YXIgbm9uY2UgPSByYW5kb21ieXRlcygyNClcbiAgdmFyIGtleSA9IHJhbmRvbWJ5dGVzKDMyKVxuICB2YXIgb25ldGltZSA9IGtleXBhaXIoKVxuXG4gIHZhciBfa2V5ID0gY29uY2F0KFtuZXcgQnVmZmVyKFtyZWNpcGllbnRzLmxlbmd0aCAmIE1BWF0pLCBrZXldKVxuICByZXR1cm4gY29uY2F0KFtcbiAgICBub25jZSxcbiAgICBvbmV0aW1lLnB1YmxpY0tleSxcbiAgICBjb25jYXQocmVjaXBpZW50cy5tYXAoZnVuY3Rpb24gKHJfcGssIGkpIHtcbiAgICAgIHJldHVybiBzZWNyZXRib3goX2tleSwgbm9uY2UsIHNjYWxhcm11bHQob25ldGltZS5zZWNyZXRLZXksIHJfcGspKVxuICAgIH0pKSxcbiAgICBzZWNyZXRib3gobXNnLCBub25jZSwga2V5KVxuICBdKVxufVxuXG5mdW5jdGlvbiBnZXRfa2V5KGN0eHQsIG15X2tleSkge1xuXG59XG5cbmV4cG9ydHMubXVsdGlib3hfb3BlbiA9IGZ1bmN0aW9uIChjdHh0LCBzaykgeyAvLywgZ3JvdXBzLi4uXG5cbiAgdmFyIG5vbmNlID0gY3R4dC5zbGljZSgwLCAyNClcbiAgdmFyIG9uZXRpbWVfcGsgPSBjdHh0LnNsaWNlKDI0LCAyNCszMilcbiAgdmFyIG15X2tleSA9IHNjYWxhcm11bHQoc2ssIG9uZXRpbWVfcGspXG4gIHZhciBfa2V5LCBrZXksIGxlbmd0aCwgc3RhcnQgPSAyNCszMiwgc2l6ZSA9IDMyKzErMTZcbiAgZm9yKHZhciBpID0gMDsgaSA8PSBNQVg7IGkrKykge1xuICAgIHZhciBzID0gc3RhcnQrc2l6ZSppXG4gICAgaWYocyArIHNpemUgPiAoY3R4dC5sZW5ndGggLSAxNikpIGNvbnRpbnVlXG4gICAgX2tleSA9IHNlY3JldGJveF9vcGVuKGN0eHQuc2xpY2UocywgcyArIHNpemUpLCBub25jZSwgbXlfa2V5KVxuICAgIGlmKF9rZXkpIHtcbiAgICAgIGxlbmd0aCA9IF9rZXlbMF1cbiAgICAgIGtleSA9IF9rZXkuc2xpY2UoMSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICB9XG5cbiAgaWYoIWtleSkgcmV0dXJuXG4gIHJldHVybiBzZWNyZXRib3hfb3BlbihjdHh0LnNsaWNlKHN0YXJ0K2xlbmd0aCpzaXplKSwgbm9uY2UsIGtleSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKCFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBuZXh0VGljaztcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzcy5uZXh0VGljaztcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHtcbiAgICBhcmdzW2krK10gPSBhcmd1bWVudHNbaV07XG4gIH1cbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gIH0pO1xufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJleHBvcnRzLnB1YmxpY0VuY3J5cHQgPSByZXF1aXJlKCcuL3B1YmxpY0VuY3J5cHQnKTtcbmV4cG9ydHMucHJpdmF0ZURlY3J5cHQgPSByZXF1aXJlKCcuL3ByaXZhdGVEZWNyeXB0Jyk7XG5cbmV4cG9ydHMucHJpdmF0ZUVuY3J5cHQgPSBmdW5jdGlvbiBwcml2YXRlRW5jcnlwdChrZXksIGJ1Zikge1xuICByZXR1cm4gZXhwb3J0cy5wdWJsaWNFbmNyeXB0KGtleSwgYnVmLCB0cnVlKTtcbn07XG5cbmV4cG9ydHMucHVibGljRGVjcnlwdCA9IGZ1bmN0aW9uIHB1YmxpY0RlY3J5cHQoa2V5LCBidWYpIHtcbiAgcmV0dXJuIGV4cG9ydHMucHJpdmF0ZURlY3J5cHQoa2V5LCBidWYsIHRydWUpO1xufTsiLCJ2YXIgY3JlYXRlSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZWVkLCBsZW4pIHtcbiAgdmFyIHQgPSBuZXcgQnVmZmVyKCcnKTtcbiAgdmFyICBpID0gMCwgYztcbiAgd2hpbGUgKHQubGVuZ3RoIDwgbGVuKSB7XG4gICAgYyA9IGkyb3BzKGkrKyk7XG4gICAgdCA9IEJ1ZmZlci5jb25jYXQoW3QsIGNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoc2VlZCkudXBkYXRlKGMpLmRpZ2VzdCgpXSk7XG4gIH1cbiAgcmV0dXJuIHQuc2xpY2UoMCwgbGVuKTtcbn07XG5cbmZ1bmN0aW9uIGkyb3BzKGMpIHtcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIoNCk7XG4gIG91dC53cml0ZVVJbnQzMkJFKGMsMCk7XG4gIHJldHVybiBvdXQ7XG59IiwidmFyIHBhcnNlS2V5cyA9IHJlcXVpcmUoJ3BhcnNlLWFzbjEnKTtcbnZhciBtZ2YgPSByZXF1aXJlKCcuL21nZicpO1xudmFyIHhvciA9IHJlcXVpcmUoJy4veG9yJyk7XG52YXIgYm4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGNydCA9IHJlcXVpcmUoJ2Jyb3dzZXJpZnktcnNhJyk7XG52YXIgY3JlYXRlSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJyk7XG52YXIgd2l0aFB1YmxpYyA9IHJlcXVpcmUoJy4vd2l0aFB1YmxpYycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwcml2YXRlRGVjcnlwdChwcml2YXRlX2tleSwgZW5jLCByZXZlcnNlKSB7XG4gIHZhciBwYWRkaW5nO1xuICBpZiAocHJpdmF0ZV9rZXkucGFkZGluZykge1xuICAgIHBhZGRpbmcgPSBwcml2YXRlX2tleS5wYWRkaW5nO1xuICB9IGVsc2UgaWYgKHJldmVyc2UpIHtcbiAgICBwYWRkaW5nID0gMTtcbiAgfSBlbHNlIHtcbiAgICBwYWRkaW5nID0gNDtcbiAgfVxuICBcbiAgdmFyIGtleSA9IHBhcnNlS2V5cyhwcml2YXRlX2tleSk7XG4gIHZhciBrID0ga2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO1xuICBpZiAoZW5jLmxlbmd0aCA+IGsgfHwgbmV3IGJuKGVuYykuY21wKGtleS5tb2R1bHVzKSA+PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZWNyeXB0aW9uIGVycm9yJyk7XG4gIH1cbiAgdmFyIG1zZztcbiAgaWYgKHJldmVyc2UpIHtcbiAgICBtc2cgPSB3aXRoUHVibGljKG5ldyBibihlbmMpLCBrZXkpO1xuICB9IGVsc2Uge1xuICAgIG1zZyA9IGNydChlbmMsIGtleSk7XG4gIH1cbiAgdmFyIHpCdWZmZXIgPSBuZXcgQnVmZmVyKGsgLSBtc2cubGVuZ3RoKTtcbiAgekJ1ZmZlci5maWxsKDApO1xuICBtc2cgPSBCdWZmZXIuY29uY2F0KFt6QnVmZmVyLCBtc2ddLCBrKTtcbiAgaWYgKHBhZGRpbmcgPT09IDQpIHtcbiAgICByZXR1cm4gb2FlcChrZXksIG1zZyk7XG4gIH0gZWxzZSBpZiAocGFkZGluZyA9PT0gMSkge1xuICAgIHJldHVybiBwa2NzMShrZXksIG1zZywgcmV2ZXJzZSk7XG4gIH0gZWxzZSBpZiAocGFkZGluZyA9PT0gMykge1xuICAgIHJldHVybiBtc2c7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHBhZGRpbmcnKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gb2FlcChrZXksIG1zZyl7XG4gIHZhciBuID0ga2V5Lm1vZHVsdXM7XG4gIHZhciBrID0ga2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO1xuICB2YXIgbUxlbiA9IG1zZy5sZW5ndGg7XG4gIHZhciBpSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUobmV3IEJ1ZmZlcignJykpLmRpZ2VzdCgpO1xuICB2YXIgaExlbiA9IGlIYXNoLmxlbmd0aDtcbiAgdmFyIGhMZW4yID0gMiAqIGhMZW47XG4gIGlmIChtc2dbMF0gIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlY3J5cHRpb24gZXJyb3InKTtcbiAgfVxuICB2YXIgbWFza2VkU2VlZCA9IG1zZy5zbGljZSgxLCBoTGVuICsgMSk7XG4gIHZhciBtYXNrZWREYiA9ICBtc2cuc2xpY2UoaExlbiArIDEpO1xuICB2YXIgc2VlZCA9IHhvcihtYXNrZWRTZWVkLCBtZ2YobWFza2VkRGIsIGhMZW4pKTtcbiAgdmFyIGRiID0geG9yKG1hc2tlZERiLCBtZ2Yoc2VlZCwgayAtIGhMZW4gLSAxKSk7XG4gIGlmIChjb21wYXJlKGlIYXNoLCBkYi5zbGljZSgwLCBoTGVuKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlY3J5cHRpb24gZXJyb3InKTtcbiAgfVxuICB2YXIgaSA9IGhMZW47XG4gIHdoaWxlIChkYltpXSA9PT0gMCkge1xuICAgIGkrKztcbiAgfVxuICBpZiAoZGJbaSsrXSAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZGVjcnlwdGlvbiBlcnJvcicpO1xuICB9XG4gIHJldHVybiBkYi5zbGljZShpKTtcbn1cblxuZnVuY3Rpb24gcGtjczEoa2V5LCBtc2csIHJldmVyc2Upe1xuICB2YXIgcDEgPSBtc2cuc2xpY2UoMCwgMik7XG4gIHZhciBpID0gMjtcbiAgdmFyIHN0YXR1cyA9IDA7XG4gIHdoaWxlIChtc2dbaSsrXSAhPT0gMCkge1xuICAgIGlmIChpID49IG1zZy5sZW5ndGgpIHtcbiAgICAgIHN0YXR1cysrO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHZhciBwcyA9IG1zZy5zbGljZSgyLCBpIC0gMSk7XG4gIHZhciBwMiA9IG1zZy5zbGljZShpIC0gMSwgaSk7XG5cbiAgaWYgKChwMS50b1N0cmluZygnaGV4JykgIT09ICcwMDAyJyAmJiAhcmV2ZXJzZSkgfHwgKHAxLnRvU3RyaW5nKCdoZXgnKSAhPT0gJzAwMDEnICYmIHJldmVyc2UpKXtcbiAgICBzdGF0dXMrKztcbiAgfVxuICBpZiAocHMubGVuZ3RoIDwgOCkge1xuICAgIHN0YXR1cysrO1xuICB9XG4gIGlmIChzdGF0dXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlY3J5cHRpb24gZXJyb3InKTtcbiAgfVxuICByZXR1cm4gIG1zZy5zbGljZShpKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYil7XG4gIGEgPSBuZXcgQnVmZmVyKGEpO1xuICBiID0gbmV3IEJ1ZmZlcihiKTtcbiAgdmFyIGRpZiA9IDA7XG4gIHZhciBsZW4gPSBhLmxlbmd0aDtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIGRpZisrO1xuICAgIGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gIH1cbiAgdmFyIGkgPSAtMTtcbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIGRpZiArPSAoYVtpXSBeIGJbaV0pO1xuICB9XG4gIHJldHVybiBkaWY7XG59IiwidmFyIHBhcnNlS2V5cyA9IHJlcXVpcmUoJ3BhcnNlLWFzbjEnKTtcbnZhciByYW5kb21CeXRlcyA9IHJlcXVpcmUoJ3JhbmRvbWJ5dGVzJyk7XG52YXIgY3JlYXRlSGFzaCA9IHJlcXVpcmUoJ2NyZWF0ZS1oYXNoJyk7XG52YXIgbWdmID0gcmVxdWlyZSgnLi9tZ2YnKTtcbnZhciB4b3IgPSByZXF1aXJlKCcuL3hvcicpO1xudmFyIGJuID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciB3aXRoUHVibGljID0gcmVxdWlyZSgnLi93aXRoUHVibGljJyk7XG52YXIgY3J0ID0gcmVxdWlyZSgnYnJvd3NlcmlmeS1yc2EnKTtcblxudmFyIGNvbnN0YW50cyA9IHtcbiAgUlNBX1BLQ1MxX09BRVBfUEFERElORzogNCxcbiAgUlNBX1BLQ1MxX1BBRERJTjogMSxcbiAgUlNBX05PX1BBRERJTkc6IDNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcHVibGljRW5jcnlwdChwdWJsaWNfa2V5LCBtc2csIHJldmVyc2UpIHtcbiAgdmFyIHBhZGRpbmc7XG4gIGlmIChwdWJsaWNfa2V5LnBhZGRpbmcpIHtcbiAgICBwYWRkaW5nID0gcHVibGljX2tleS5wYWRkaW5nO1xuICB9IGVsc2UgaWYgKHJldmVyc2UpIHtcbiAgICBwYWRkaW5nID0gMTtcbiAgfSBlbHNlIHtcbiAgICBwYWRkaW5nID0gNDtcbiAgfVxuICB2YXIga2V5ID0gcGFyc2VLZXlzKHB1YmxpY19rZXkpO1xuICB2YXIgcGFkZGVkTXNnO1xuICBpZiAocGFkZGluZyA9PT0gNCkge1xuICAgIHBhZGRlZE1zZyA9IG9hZXAoa2V5LCBtc2cpO1xuICB9IGVsc2UgaWYgKHBhZGRpbmcgPT09IDEpIHtcbiAgICBwYWRkZWRNc2cgPSBwa2NzMShrZXksIG1zZywgcmV2ZXJzZSk7XG4gIH0gZWxzZSBpZiAocGFkZGluZyA9PT0gMykge1xuICAgIHBhZGRlZE1zZyA9IG5ldyBibihtc2cpO1xuICAgIGlmIChwYWRkZWRNc2cuY21wKGtleS5tb2R1bHVzKSA+PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGEgdG9vIGxvbmcgZm9yIG1vZHVsdXMnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHBhZGRpbmcnKTtcbiAgfVxuICBpZiAocmV2ZXJzZSkge1xuICAgIHJldHVybiBjcnQocGFkZGVkTXNnLCBrZXkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB3aXRoUHVibGljKHBhZGRlZE1zZywga2V5KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gb2FlcChrZXksIG1zZyl7XG4gIHZhciBrID0ga2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO1xuICB2YXIgbUxlbiA9IG1zZy5sZW5ndGg7XG4gIHZhciBpSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUobmV3IEJ1ZmZlcignJykpLmRpZ2VzdCgpO1xuICB2YXIgaExlbiA9IGlIYXNoLmxlbmd0aDtcbiAgdmFyIGhMZW4yID0gMiAqIGhMZW47XG4gIGlmIChtTGVuID4gayAtIGhMZW4yIC0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZSB0b28gbG9uZycpO1xuICB9XG4gIHZhciBwcyA9IG5ldyBCdWZmZXIoayAtIG1MZW4gLSBoTGVuMiAtIDIpO1xuICBwcy5maWxsKDApO1xuICB2YXIgZGJsZW4gPSBrIC0gaExlbiAtIDE7XG4gIHZhciBzZWVkID0gcmFuZG9tQnl0ZXMoaExlbik7XG4gIHZhciBtYXNrZWREYiA9IHhvcihCdWZmZXIuY29uY2F0KFtpSGFzaCwgcHMsIG5ldyBCdWZmZXIoWzFdKSwgbXNnXSwgZGJsZW4pLCBtZ2Yoc2VlZCwgZGJsZW4pKTtcbiAgdmFyIG1hc2tlZFNlZWQgPSB4b3Ioc2VlZCwgbWdmKG1hc2tlZERiLCBoTGVuKSk7XG4gIHJldHVybiBuZXcgYm4oQnVmZmVyLmNvbmNhdChbbmV3IEJ1ZmZlcihbMF0pLCBtYXNrZWRTZWVkLCBtYXNrZWREYl0sIGspKTtcbn1cbmZ1bmN0aW9uIHBrY3MxKGtleSwgbXNnLCByZXZlcnNlKXtcbiAgdmFyIG1MZW4gPSBtc2cubGVuZ3RoO1xuICB2YXIgayA9IGtleS5tb2R1bHVzLmJ5dGVMZW5ndGgoKTtcbiAgaWYgKG1MZW4gPiBrIC0gMTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgdG9vIGxvbmcnKTtcbiAgfVxuICB2YXIgcHM7XG4gIGlmIChyZXZlcnNlKSB7XG4gICAgcHMgPSBuZXcgQnVmZmVyKGsgLSBtTGVuIC0gMyk7XG4gICAgcHMuZmlsbCgweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBwcyA9IG5vblplcm8oayAtIG1MZW4gLSAzKTtcbiAgfVxuICByZXR1cm4gbmV3IGJuKEJ1ZmZlci5jb25jYXQoW25ldyBCdWZmZXIoWzAsIHJldmVyc2U/MToyXSksIHBzLCBuZXcgQnVmZmVyKFswXSksIG1zZ10sIGspKTtcbn1cbmZ1bmN0aW9uIG5vblplcm8obGVuLCBjcnlwdG8pIHtcbiAgdmFyIG91dCA9IG5ldyBCdWZmZXIobGVuKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgY2FjaGUgPSByYW5kb21CeXRlcyhsZW4qMik7XG4gIHZhciBjdXIgPSAwO1xuICB2YXIgbnVtO1xuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIGlmIChjdXIgPT09IGNhY2hlLmxlbmd0aCkge1xuICAgICAgY2FjaGUgPSByYW5kb21CeXRlcyhsZW4qMik7XG4gICAgICBjdXIgPSAwO1xuICAgIH1cbiAgICBudW0gPSBjYWNoZVtjdXIrK107XG4gICAgaWYgKG51bSkge1xuICAgICAgb3V0W2krK10gPSBudW07XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59IiwidmFyIGJuID0gcmVxdWlyZSgnYm4uanMnKTtcbmZ1bmN0aW9uIHdpdGhQdWJsaWMocGFkZGVkTXNnLCBrZXkpIHtcbiAgcmV0dXJuIG5ldyBCdWZmZXIocGFkZGVkTXNnXG4gICAgLnRvUmVkKGJuLm1vbnQoa2V5Lm1vZHVsdXMpKVxuICAgIC5yZWRQb3cobmV3IGJuKGtleS5wdWJsaWNFeHBvbmVudCkpXG4gICAgLmZyb21SZWQoKVxuICAgIC50b0FycmF5KCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdpdGhQdWJsaWM7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4b3IoYSwgYikge1xuICB2YXIgbGVuID0gYS5sZW5ndGg7XG4gIHZhciBpID0gLTE7XG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBhW2ldIF49IGJbaV07XG4gIH1cbiAgcmV0dXJuIGFcbn07IiwiZnVuY3Rpb24gYWJvcnRhYmxlKG9uRW5kKSB7XG4gIHZhciBhYm9ydGVkID0gZmFsc2UsIHJlYWRpbmcgPSBmYWxzZSwgZW5kZWQgPSBmYWxzZSwgX2NiLCBfcmVhZFxuXG4gIGZ1bmN0aW9uIHRlcm1pbmF0ZSAoZXJyKSB7XG4gICAgaWYob25FbmQpIG9uRW5kKGVuZGVkID09PSB0cnVlID8gbnVsbCA6ICBlbmRlZClcbiAgICB2YXIgY2IgPSBfY2I7IF9jYiA9IG51bGxcbiAgICBpZihjYikgY2IoZW5kZWQpXG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwgKCkge1xuICAgIGVuZGVkID0gZW5kZWQgfHwgdHJ1ZVxuICAgIHRlcm1pbmF0ZShhYm9ydGVkIHx8IGVuZGVkKVxuICAgIF9yZWFkKGFib3J0ZWQsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmKF9jYikgX2NiKGVycilcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZGVyIChyZWFkKSB7XG4gICAgX3JlYWQgPSByZWFkXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICAgIF9jYiA9IGNiXG4gICAgICBpZihhYm9ydCkgICBhYm9ydGVkID0gYWJvcnRcbiAgICAgIGlmKGVuZGVkKSAgIHJldHVybiBjYihlbmRlZClcbiAgICAgIGlmKGFib3J0ZWQpIHJldHVyblxuICAgICAgcmVhZGluZyA9IHRydWVcbiAgICAgIHJlYWQoYWJvcnQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICAgIGlmKGFib3J0ZWQpIHJldHVybiAhYWJvcnQgJiYgcmVhZChhYm9ydGVkLCBmdW5jdGlvbiAoKSB7fSlcbiAgICAgICAgaWYoIV9jYikgcmV0dXJuXG4gICAgICAgIHZhciBjYiA9IF9jYlxuICAgICAgICBfY2IgPSBudWxsXG4gICAgICAgIGlmKGVuZCkge1xuICAgICAgICAgIGVuZGVkID0gZW5kXG4gICAgICAgICAgb25FbmQgJiYgb25FbmQoZW5kZWQgPT09IHRydWUgPyBudWxsIDogIGVuZGVkKVxuICAgICAgICAgIGNiKGVuZClcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjYihlbmQsIGRhdGEpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmVhZGVyLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgIGFib3J0ZWQgPSB0cnVlXG4gICAgaWYoZW5kZWQpIHJldHVyblxuICAgIGNhbmNlbCgpXG4gIH1cblxuICByZXR1cm4gcmVhZGVyXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYWJvcnRhYmxlXG5cbiIsIid1c2Ugc3RyaWN0J1xudmFyIHNvZGl1bSA9IHJlcXVpcmUoJ2NobG9yaWRlJylcbnZhciBSZWFkZXIgPSByZXF1aXJlKCdwdWxsLXJlYWRlcicpXG52YXIgaW5jcmVtZW50ID0gcmVxdWlyZSgnaW5jcmVtZW50LWJ1ZmZlcicpXG52YXIgdGhyb3VnaCA9IHJlcXVpcmUoJ3B1bGwtdGhyb3VnaCcpXG52YXIgc3BsaXQgPSByZXF1aXJlKCdzcGxpdC1idWZmZXInKVxuXG52YXIgaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXJcbnZhciBjb25jYXQgPSBCdWZmZXIuY29uY2F0XG5cbnZhciBib3ggPSBzb2RpdW0uY3J5cHRvX3NlY3JldGJveF9lYXN5XG52YXIgdW5ib3ggPSBzb2RpdW0uY3J5cHRvX3NlY3JldGJveF9vcGVuX2Vhc3kgIFxuXG5mdW5jdGlvbiB1bmJveF9kZXRhY2hlZCAobWFjLCBib3hlZCwgbm9uY2UsIGtleSkge1xuICByZXR1cm4gc29kaXVtLmNyeXB0b19zZWNyZXRib3hfb3Blbl9lYXN5KGNvbmNhdChbbWFjLCBib3hlZF0pLCBub25jZSwga2V5KVxufVxuXG52YXIgbWF4ID0gMTAyNCo0XG5cbnZhciBOT05DRV9MRU4gPSAyNFxudmFyIEhFQURFUl9MRU4gPSAyKzE2KzE2XG5cbmZ1bmN0aW9uIGlzWmVyb3MoYikge1xuICBmb3IodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKylcbiAgICBpZihiW2ldICE9PSAwKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gcmFuZG9tU2VjcmV0KG4pIHtcbiAgdmFyIHJhbmQgPSBuZXcgQnVmZmVyKG4pXG4gIHNvZGl1bS5yYW5kb21ieXRlcyhyYW5kKVxuICByZXR1cm4gcmFuZFxufVxuXG5mdW5jdGlvbiBjb3B5IChhKSB7XG4gIHZhciBiID0gbmV3IEJ1ZmZlcihhLmxlbmd0aClcbiAgYS5jb3B5KGIsIDAsIDAsIGEubGVuZ3RoKVxuICByZXR1cm4gYlxufVxuXG5leHBvcnRzLmNyZWF0ZUJveFN0cmVhbSA9XG5leHBvcnRzLmNyZWF0ZUVuY3J5cHRTdHJlYW0gPSBmdW5jdGlvbiAoa2V5LCBpbml0X25vbmNlKSB7XG5cbiAgaWYoa2V5Lmxlbmd0aCA9PT0gNTYpIHtcbiAgICBpbml0X25vbmNlID0ga2V5LnNsaWNlKDMyLCA1NilcbiAgICBrZXkgPSBrZXkuc2xpY2UoMCwgMzIpXG4gIH1cbiAgZWxzZSBpZighKGtleS5sZW5ndGggPT09IDMyICYmIGluaXRfbm9uY2UubGVuZ3RoID09PSAyNCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdub25jZSBtdXN0IGJlIDI0IGJ5dGVzJylcblxuICAvLyB3ZSBuZWVkIHR3byBub25jZXMgYmVjYXVzZSBpbmNyZW1lbnQgbXV0YXRlcyxcbiAgLy8gYW5kIHdlIG5lZWQgdGhlIG5leHQgZm9yIHRoZSBoZWFkZXIsXG4gIC8vIGFuZCB0aGUgbmV4dCBuZXh0IG5vbmNlIGZvciB0aGUgcGFja2V0XG4gIHZhciBub25jZTEgPSBjb3B5KGluaXRfbm9uY2UpLCBub25jZTIgPSBjb3B5KGluaXRfbm9uY2UpXG4gIHZhciBoZWFkID0gbmV3IEJ1ZmZlcigxOClcblxuICByZXR1cm4gdGhyb3VnaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgaWYoJ3N0cmluZycgPT09IHR5cGVvZiBkYXRhKVxuICAgICAgZGF0YSA9IG5ldyBCdWZmZXIoZGF0YSwgJ3V0ZjgnKVxuICAgIGVsc2UgaWYoIWlzQnVmZmVyKGRhdGEpKVxuICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ211c3QgYmUgYnVmZmVyJykpXG5cbiAgICBpZihkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICB2YXIgaW5wdXQgPSBzcGxpdChkYXRhLCBtYXgpXG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhlYWQud3JpdGVVSW50MTZCRShpbnB1dFtpXS5sZW5ndGgsIDApXG4gICAgICB2YXIgYm94ZWQgPSBib3goaW5wdXRbaV0sIGluY3JlbWVudChub25jZTIpLCBrZXkpXG4gICAgICAvL3dyaXRlIHRoZSBtYWMgaW50byB0aGUgaGVhZGVyLlxuICAgICAgYm94ZWQuY29weShoZWFkLCAyLCAwLCAxNilcblxuICAgICAgdGhpcy5xdWV1ZShib3goaGVhZCwgbm9uY2UxLCBrZXkpKVxuICAgICAgdGhpcy5xdWV1ZShib3hlZC5zbGljZSgxNiwgMTYgKyBpbnB1dFtpXS5sZW5ndGgpKVxuXG4gICAgICBpbmNyZW1lbnQoaW5jcmVtZW50KG5vbmNlMSkpOyBpbmNyZW1lbnQobm9uY2UyKVxuICAgIH1cbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmKGVycikgcmV0dXJuIHRoaXMucXVldWUobnVsbClcblxuICAgIC8vaGFuZGxlIHNwZWNpYWwtY2FzZSBvZiBlbXB0eSBzZXNzaW9uXG4gICAgLy9maW5hbCBoZWFkZXIgaXMgc2FtZSBsZW5ndGggYXMgaGVhZGVyIGV4Y2VwdCBhbGwgemVyb3MgKGluc2lkZSBib3gpXG4gICAgdmFyIGZpbmFsID0gbmV3IEJ1ZmZlcigyKzE2KTsgZmluYWwuZmlsbCgwKVxuICAgIHRoaXMucXVldWUoYm94KGZpbmFsLCBub25jZTEsIGtleSkpXG4gICAgdGhpcy5xdWV1ZShudWxsKVxuICB9KVxuXG59XG5leHBvcnRzLmNyZWF0ZVVuYm94U3RyZWFtID1cbmV4cG9ydHMuY3JlYXRlRGVjcnlwdFN0cmVhbSA9IGZ1bmN0aW9uIChrZXksIG5vbmNlKSB7XG5cblxuICBpZihrZXkubGVuZ3RoID09IDU2KSB7XG4gICAgbm9uY2UgPSBrZXkuc2xpY2UoMzIsIDU2KVxuICAgIGtleSA9IGtleS5zbGljZSgwLCAzMilcbiAgfVxuICBlbHNlIGlmKCEoa2V5Lmxlbmd0aCA9PT0gMzIgJiYgbm9uY2UubGVuZ3RoID09PSAyNCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdub25jZSBtdXN0IGJlIDI0IGJ5dGVzJylcblxuICB2YXIgcmVhZGVyID0gUmVhZGVyKCksIGZpcnN0ID0gdHJ1ZSwgIGVuZGVkXG4gIHZhciBmaXJzdCA9IHRydWVcblxuICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICByZWFkZXIocmVhZClcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICAgIGlmKGVuZCkgcmV0dXJuIHJlYWRlci5hYm9ydChlbmQsIGNiKVxuICAgICAgLy91c2UgYWJvcnQgd2hlbiB0aGUgaW5wdXQgd2FzIGludmFsaWQsXG4gICAgICAvL2J1dCB0aGUgc291cmNlIGhhc24ndCBhY3R1YWxseSBlbmRlZCB5ZXQuXG4gICAgICBmdW5jdGlvbiBhYm9ydChlcnIpIHtcbiAgICAgICAgcmVhZGVyLmFib3J0KGVuZGVkID0gZXJyIHx8IHRydWUsIGNiKVxuICAgICAgfVxuXG4gICAgICBpZihlbmRlZCkgcmV0dXJuIGNiKGVuZGVkKVxuICAgICAgcmVhZGVyLnJlYWQoSEVBREVSX0xFTiwgZnVuY3Rpb24gKGVyciwgY2lwaGVyaGVhZGVyKSB7XG4gICAgICAgIGlmKGVyciA9PT0gdHJ1ZSkgcmV0dXJuIGNiKGVuZGVkID0gbmV3IEVycm9yKCd1bmV4cGVjdGVkIGhhbmd1cCcpKVxuICAgICAgICBpZihlcnIpIHJldHVybiBjYihlbmRlZCA9IGVycilcblxuICAgICAgICB2YXIgaGVhZGVyID0gdW5ib3goY2lwaGVyaGVhZGVyLCBub25jZSwga2V5KVxuXG4gICAgICAgIGlmKCFoZWFkZXIpXG4gICAgICAgICAgcmV0dXJuIGFib3J0KG5ldyBFcnJvcignaW52YWxpZCBoZWFkZXInKSlcblxuICAgICAgICAvL3ZhbGlkIGVuZCBvZiBzdHJlYW1cbiAgICAgICAgaWYoaXNaZXJvcyhoZWFkZXIpKVxuICAgICAgICAgIHJldHVybiBjYihlbmRlZCA9IHRydWUpXG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IGhlYWRlci5yZWFkVUludDE2QkUoMClcbiAgICAgICAgdmFyIG1hYyA9IGhlYWRlci5zbGljZSgyLCAzNClcblxuICAgICAgICByZWFkZXIucmVhZChsZW5ndGgsIGZ1bmN0aW9uIChlcnIsIGNpcGhlcnBhY2tldCkge1xuICAgICAgICAgIGlmKGVycikgcmV0dXJuIGNiKGVuZGVkID0gZXJyKVxuICAgICAgICAgIC8vcmVjcmVhdGUgYSB2YWxpZCBwYWNrZXRcbiAgICAgICAgICAvL1RPRE86IFBSIHRvIHNvZGl1bSBiaW5kaW5ncyBmb3IgZGV0YWNoZWQgYm94L29wZW5cbiAgICAgICAgICB2YXIgcGxhaW5wYWNrZXQgPSB1bmJveF9kZXRhY2hlZChtYWMsIGNpcGhlcnBhY2tldCwgaW5jcmVtZW50KG5vbmNlKSwga2V5KVxuICAgICAgICAgIGlmKCFwbGFpbnBhY2tldClcbiAgICAgICAgICAgIHJldHVybiBhYm9ydChuZXcgRXJyb3IoJ2ludmFsaWQgcGFja2V0JykpXG5cbiAgICAgICAgICBpbmNyZW1lbnQobm9uY2UpXG4gICAgICAgICAgY2IobnVsbCwgcGxhaW5wYWNrZXQpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwidmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fVxuXG5mdW5jdGlvbiBhYm9ydEFsbChhcnksIGFib3J0LCBjYikge1xuICB2YXIgbiA9IGFyeS5sZW5ndGhcbiAgaWYoIW4pIHJldHVybiBjYihhYm9ydClcbiAgYXJ5LmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICBpZihmKSBmKGFib3J0LCBuZXh0KVxuICAgIGVsc2UgbmV4dCgpXG4gIH0pXG5cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICBpZigtLW4pIHJldHVyblxuICAgIGNiKGFib3J0KVxuICB9XG4gIGlmKCFuKSBuZXh0KClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyZWFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIDsoZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgICBpZihhYm9ydClcbiAgICAgICAgYWJvcnRBbGwoc3RyZWFtcywgYWJvcnQsIGNiKVxuICAgICAgZWxzZSBpZighc3RyZWFtcy5sZW5ndGgpXG4gICAgICAgIGNiKHRydWUpXG4gICAgICBlbHNlIGlmKCFzdHJlYW1zWzBdKVxuICAgICAgICBzdHJlYW1zLnNoaWZ0KCksIG5leHQoKVxuICAgICAgZWxzZVxuICAgICAgICBzdHJlYW1zWzBdKG51bGwsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgIHN0cmVhbXMuc2hpZnQoKSAvL2Ryb3AgdGhlIGZpcnN0LCBoYXMgYWxyZWFkeSBlbmRlZC5cbiAgICAgICAgICAgIGlmKGVyciA9PT0gdHJ1ZSkgbmV4dCgpXG4gICAgICAgICAgICBlbHNlICAgICAgICAgICAgIGFib3J0QWxsKHN0cmVhbXMsIGVyciwgY2IpXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICAgIH0pXG4gICAgfSkoKVxuICB9XG59XG5cblxuXG5cbiIsImV4cG9ydHMuaWQgPSBcbmZ1bmN0aW9uIChpdGVtKSB7XG4gIHJldHVybiBpdGVtXG59XG5cbmV4cG9ydHMucHJvcCA9IFxuZnVuY3Rpb24gKG1hcCkgeyAgXG4gIGlmKCdzdHJpbmcnID09IHR5cGVvZiBtYXApIHtcbiAgICB2YXIga2V5ID0gbWFwXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhW2tleV0gfVxuICB9XG4gIHJldHVybiBtYXBcbn1cblxuZXhwb3J0cy50ZXN0ZXIgPSBmdW5jdGlvbiAodGVzdCkge1xuICBpZighdGVzdCkgcmV0dXJuIGV4cG9ydHMuaWRcbiAgaWYoJ29iamVjdCcgPT09IHR5cGVvZiB0ZXN0XG4gICAgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRlc3QudGVzdClcbiAgICAgIHJldHVybiB0ZXN0LnRlc3QuYmluZCh0ZXN0KVxuICByZXR1cm4gZXhwb3J0cy5wcm9wKHRlc3QpIHx8IGV4cG9ydHMuaWRcbn1cblxuZXhwb3J0cy5hZGRQaXBlID0gYWRkUGlwZVxuXG5mdW5jdGlvbiBhZGRQaXBlKHJlYWQpIHtcbiAgaWYoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHJlYWQpXG4gICAgcmV0dXJuIHJlYWRcblxuICByZWFkLnBpcGUgPSByZWFkLnBpcGUgfHwgZnVuY3Rpb24gKHJlYWRlcikge1xuICAgIGlmKCdmdW5jdGlvbicgIT0gdHlwZW9mIHJlYWRlciAmJiAnZnVuY3Rpb24nICE9IHR5cGVvZiByZWFkZXIuc2luaylcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwaXBlIHRvIHJlYWRlcicpXG4gICAgdmFyIHBpcGUgPSBhZGRQaXBlKHJlYWRlci5zaW5rID8gcmVhZGVyLnNpbmsocmVhZCkgOiByZWFkZXIocmVhZCkpXG4gICAgcmV0dXJuIHJlYWRlci5zb3VyY2UgfHwgcGlwZTtcbiAgfVxuICBcbiAgcmVhZC50eXBlID0gJ1NvdXJjZSdcbiAgcmV0dXJuIHJlYWRcbn1cblxudmFyIFNvdXJjZSA9XG5leHBvcnRzLlNvdXJjZSA9XG5mdW5jdGlvbiBTb3VyY2UgKGNyZWF0ZVJlYWQpIHtcbiAgZnVuY3Rpb24gcygpIHtcbiAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgIHJldHVybiBhZGRQaXBlKGNyZWF0ZVJlYWQuYXBwbHkobnVsbCwgYXJncykpXG4gIH1cbiAgcy50eXBlID0gJ1NvdXJjZSdcbiAgcmV0dXJuIHNcbn1cblxuXG52YXIgVGhyb3VnaCA9XG5leHBvcnRzLlRocm91Z2ggPSBcbmZ1bmN0aW9uIChjcmVhdGVSZWFkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICB2YXIgcGlwZWQgPSBbXVxuICAgIGZ1bmN0aW9uIHJlYWRlciAocmVhZCkge1xuICAgICAgYXJncy51bnNoaWZ0KHJlYWQpXG4gICAgICByZWFkID0gY3JlYXRlUmVhZC5hcHBseShudWxsLCBhcmdzKVxuICAgICAgd2hpbGUocGlwZWQubGVuZ3RoKVxuICAgICAgICByZWFkID0gcGlwZWQuc2hpZnQoKShyZWFkKVxuICAgICAgcmV0dXJuIHJlYWRcbiAgICAgIC8vcGlwZWluZyB0byBmcm9tIHRoaXMgcmVhZGVyIHNob3VsZCBjb21wb3NlLi4uXG4gICAgfVxuICAgIHJlYWRlci5waXBlID0gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICAgIHBpcGVkLnB1c2gocmVhZCkgXG4gICAgICBpZihyZWFkLnR5cGUgPT09ICdTb3VyY2UnKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBwaXBlICcgKyByZWFkZXIudHlwZSArICcgdG8gU291cmNlJylcbiAgICAgIHJlYWRlci50eXBlID0gcmVhZC50eXBlID09PSAnU2luaycgPyAnU2luaycgOiAnVGhyb3VnaCdcbiAgICAgIHJldHVybiByZWFkZXJcbiAgICB9XG4gICAgcmVhZGVyLnR5cGUgPSAnVGhyb3VnaCdcbiAgICByZXR1cm4gcmVhZGVyXG4gIH1cbn1cblxudmFyIFNpbmsgPVxuZXhwb3J0cy5TaW5rID0gXG5mdW5jdGlvbiBTaW5rKGNyZWF0ZVJlYWRlcikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgaWYoIWNyZWF0ZVJlYWRlcilcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBiZSBjcmVhdGVSZWFkZXIgZnVuY3Rpb24nKVxuICAgIGZ1bmN0aW9uIHMgKHJlYWQpIHtcbiAgICAgIGFyZ3MudW5zaGlmdChyZWFkKVxuICAgICAgcmV0dXJuIGNyZWF0ZVJlYWRlci5hcHBseShudWxsLCBhcmdzKVxuICAgIH1cbiAgICBzLnR5cGUgPSAnU2luaydcbiAgICByZXR1cm4gc1xuICB9XG59XG5cblxuZXhwb3J0cy5tYXliZVNpbmsgPSBcbmV4cG9ydHMubWF5YmVEcmFpbiA9IFxuZnVuY3Rpb24gKGNyZWF0ZVNpbmssIGNiKSB7XG4gIGlmKCFjYilcbiAgICByZXR1cm4gVGhyb3VnaChmdW5jdGlvbiAocmVhZCkge1xuICAgICAgdmFyIGVuZGVkXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGNsb3NlLCBjYikge1xuICAgICAgICBpZihjbG9zZSkgcmV0dXJuIHJlYWQoY2xvc2UsIGNiKVxuICAgICAgICBpZihlbmRlZCkgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgICAgIGNyZWF0ZVNpbmsoZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICAgIGVuZGVkID0gZXJyIHx8IHRydWVcbiAgICAgICAgICBpZighZXJyKSBjYihudWxsLCBkYXRhKVxuICAgICAgICAgIGVsc2UgICAgIGNiKGVuZGVkKVxuICAgICAgICB9KSAocmVhZClcbiAgICAgIH1cbiAgICB9KSgpXG5cbiAgcmV0dXJuIFNpbmsoZnVuY3Rpb24gKHJlYWQpIHtcbiAgICByZXR1cm4gY3JlYXRlU2luayhjYikgKHJlYWQpXG4gIH0pKClcbn1cblxuIiwiXG52YXIgU291cmNlID0gcmVxdWlyZSgnLi9zb3VyY2UnKVxudmFyIFNpbmsgPSByZXF1aXJlKCcuL3NpbmsnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblxuICB2YXIgc291cmNlID0gU291cmNlKClcbiAgdmFyIHNpbmsgPSBTaW5rKClcblxuICByZXR1cm4ge1xuICAgIHNvdXJjZTogc291cmNlLFxuICAgIHNpbms6IHNpbmssXG4gICAgcmVzb2x2ZTogZnVuY3Rpb24gKGR1cGxleCkge1xuICAgICAgc291cmNlLnJlc29sdmUoZHVwbGV4LnNvdXJjZSlcbiAgICAgIHNpbmsucmVzb2x2ZShkdXBsZXguc2luaylcblxuICAgIH1cbiAgfVxuXG5cbn1cbiIsIlxuZXhwb3J0cy5zb3VyY2UgPSByZXF1aXJlKCcuL3NvdXJjZScpXG5leHBvcnRzLnRocm91Z2ggPSByZXF1aXJlKCcuL3Rocm91Z2gnKVxuZXhwb3J0cy5zaW5rID0gcmVxdWlyZSgnLi9zaW5rJylcbmV4cG9ydHMuZHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHZhciByZWFkLCBzdGFydGVkID0gZmFsc2UsIGlkID0gTWF0aC5yYW5kb20oKVxuXG4gIGZ1bmN0aW9uIGNvbnN1bWUgKF9yZWFkKSB7XG4gICAgaWYoIV9yZWFkKSB0aHJvdyBuZXcgRXJyb3IoJ211c3QgYmUgcGFzc2VkIGEgcmVhZGFibGUnKVxuICAgIHJlYWQgPSBfcmVhZFxuICAgIGlmKHN0YXJ0ZWQpIHN0cmVhbShyZWFkKVxuICB9XG5cbiAgY29uc3VtZS5yZXNvbHZlID1cbiAgY29uc3VtZS5yZWFkeSA9XG4gIGNvbnN1bWUuc3RhcnQgPSBmdW5jdGlvbiAoX3N0cmVhbSkge1xuICAgIHN0YXJ0ZWQgPSB0cnVlOyBzdHJlYW0gPSBfc3RyZWFtIHx8IHN0cmVhbVxuICAgIGlmKHJlYWQpIHN0cmVhbShyZWFkKVxuICAgIHJldHVybiBjb25zdW1lXG4gIH1cblxuICByZXR1cm4gY29uc3VtZVxufVxuIiwiXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWFkLCBfY2IsIGFib3J0Q2IsIF9lbmRcblxuICB2YXIgcmVhZCA9IGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoIV9yZWFkKSB7XG4gICAgICBpZihlbmQpIHtcbiAgICAgICAgX2VuZCA9IGVuZFxuICAgICAgICBhYm9ydENiID0gY2JcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgX2NiID0gY2JcbiAgICB9XG4gICAgZWxzZSBfcmVhZChlbmQsIGNiKVxuICB9XG4gIHJlYWQucmVzb2x2ZSA9IGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgaWYoX3JlYWQpIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSByZXNvbHZlZCcpXG4gICAgX3JlYWQgPSByZWFkXG4gICAgaWYoIV9yZWFkKSB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlYWQgY2Fubm90IHJlc29sdmUhJyArIF9yZWFkKVxuICAgIGlmKF9jYikgcmVhZChudWxsLCBfY2IpXG4gICAgaWYoYWJvcnRDYikgcmVhZChfZW5kLCBhYm9ydENiKVxuICB9XG4gIHJlYWQuYWJvcnQgPSBmdW5jdGlvbihlcnIpIHtcbiAgICByZWFkLnJlc29sdmUoZnVuY3Rpb24gKF8sIGNiKSB7XG4gICAgICBjYihlcnIgfHwgdHJ1ZSlcbiAgICB9KVxuICB9XG4gIHJldHVybiByZWFkXG59XG5cbiIsIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByZWFkLCByZWFkZXIsIGNiLCBhYm9ydCwgc3RyZWFtXG5cbiAgZnVuY3Rpb24gZGVsYXllZCAoX3JlYWQpIHtcbiAgICAvL2lmIHdlIGFscmVhZHkgaGF2ZSB0aGUgc3RyZWFtLCBnbyFcbiAgICBpZihzdHJlYW0pIHJldHVybiBzdHJlYW0oX3JlYWQpXG5cbiAgICByZWFkID0gX3JlYWRcbiAgICByZXR1cm4gZnVuY3Rpb24gKF9hYm9ydCwgX2NiKSB7XG4gICAgICBpZihyZWFkZXIpIHJlYWRlcihfYWJvcnQsIF9jYilcbiAgICAgIGVsc2UgYWJvcnQgPSBfYWJvcnQsIGNiID0gX2NiXG5cbiAgICB9XG4gIH1cblxuICBkZWxheWVkLnJlc29sdmUgPSBmdW5jdGlvbiAoX3N0cmVhbSkge1xuICAgIGlmKHN0cmVhbSkgdGhyb3cgbmV3IEVycm9yKCdhbHJlYWR5IHJlc29sdmVkJylcbiAgICBzdHJlYW0gPSBfc3RyZWFtXG4gICAgaWYoIXN0cmVhbSkgdGhyb3cgbmV3IEVycm9yKCdyZXNvbHZlICptdXN0KiBiZSBwYXNzZWQgYSB0cmFuc2Zvcm0gc3RyZWFtJylcbiAgICBpZihyZWFkKSB7XG4gICAgICByZWFkZXIgPSBzdHJlYW0ocmVhZClcbiAgICAgIGlmKGNiKSByZWFkZXIoYWJvcnQsIGNiKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkZWxheWVkXG59XG4iLCJcbi8qIGpzaGludCBub2RlOiB0cnVlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgRGVjb2RlciA9IHJlcXVpcmUoJ3B1bGwtdXRmOC1kZWNvZGVyJylcbi8qKlxuICAjIHB1bGwtZmlsZVxuXG4gIFRoaXMgaXMgYSBzaW1wbGUgbW9kdWxlIHdoaWNoIHVzZXMgcmF3IGZpbGUgcmVhZGluZyBtZXRob2RzIGF2YWlsYWJsZSBpblxuICB0aGUgbm9kZSBgZnNgIG1vZHVsZSB0byByZWFkIGZpbGVzIG9uLWRlbWFuZC4gIEl0J3MgYSB3b3JrIGluIHByb2dyZXNzXG4gIGFuZCBmZWVkYmFjayBpcyB3ZWxjb21lIDopXG5cbiAgIyMgRXhhbXBsZSBVc2FnZVxuXG4gIDw8PCBleGFtcGxlcy9pcHN1bS1jaHVua3MuanNcblxuKiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZpbGVuYW1lLCBvcHRzKSB7XG4gIHZhciBtb2RlID0gb3B0cyAmJiBvcHRzLm1vZGUgfHwgMHgxQjY7IC8vIDA2NjZcbiAgdmFyIGJ1ZmZlclNpemUgPSBvcHRzICYmIG9wdHMuYnVmZmVyU2l6ZSB8fCAxMDI0KjY0O1xuICB2YXIgc3RhcnQgPSBvcHRzICYmIG9wdHMuc3RhcnQgfHwgMFxuICB2YXIgZW5kID0gb3B0cyAmJiBvcHRzLmVuZCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICB2YXIgZmQgPSBvcHRzICYmIG9wdHMuZmRcbiAgdmFyIGVuZGVkLCBjbG9zZU5leHQsIGJ1c3ksIF9jYjtcbiAgdmFyIF9idWZmZXIgPSBuZXcgQnVmZmVyKGJ1ZmZlclNpemUpXG5cbiAgdmFyIGZsYWdzID0gb3B0cyAmJiBvcHRzLmZsYWdzIHx8ICdyJ1xuXG4gIGZ1bmN0aW9uIHJlYWROZXh0KGNiKSB7XG4gICAgaWYoY2xvc2VOZXh0KSByZXR1cm4gY2xvc2UoY2IpXG4gICAgdmFyIHRvUmVhZCA9IE1hdGgubWluKGVuZCAtIHN0YXJ0LCBidWZmZXJTaXplKTtcbiAgICBidXN5ID0gdHJ1ZVxuXG4gICAgZnMucmVhZChcbiAgICAgIGZkLFxuICAgICAgX2J1ZmZlcixcbiAgICAgIDAsXG4gICAgICB0b1JlYWQsXG4gICAgICBzdGFydCxcbiAgICAgIGZ1bmN0aW9uKGVyciwgY291bnQsIGJ1ZmZlcikge1xuICAgICAgICBidXN5ID0gZmFsc2VcbiAgICAgICAgc3RhcnQgKz0gY291bnQ7XG4gICAgICAgIC8vIGlmIHdlIGhhdmUgcmVjZWl2ZWQgYW4gZW5kIG5vdGljaWF0aW9uLCBqdXN0IGRpc2NhcmQgdGhpcyBkYXRhXG4gICAgICAgIGlmKGNsb3NlTmV4dCkge1xuICAgICAgICAgIGNsb3NlKF9jYilcbiAgICAgICAgICByZXR1cm4gY2IoY2xvc2VOZXh0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGVyciB8fCBlbmRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBlbmNvdW50ZXJlZCBhIHJlYWQgZXJyb3IgcGFzcyBpdCBvblxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBpZihjb3VudCA9PT0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIGNiKG51bGwsIGJ1ZmZlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xvc2VOZXh0ID0gdHJ1ZTtcbiAgICAgICAgICBjYihudWxsLCBidWZmZXIuc2xpY2UoMCwgY291bnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gICAgX2J1ZmZlciA9IG5ldyBCdWZmZXIoTWF0aC5taW4oZW5kIC0gc3RhcnQsIGJ1ZmZlclNpemUpKVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbihjYikge1xuICAgIGJ1c3kgPSB0cnVlXG4gICAgZnMub3BlbihmaWxlbmFtZSwgZmxhZ3MsIG1vZGUsIGZ1bmN0aW9uKGVyciwgZGVzY3JpcHRvcikge1xuICAgICAgLy8gc2F2ZSB0aGUgZmlsZSBkZXNjcmlwdG9yXG4gICAgICBmZCA9IGRlc2NyaXB0b3I7XG5cbiAgICAgIGJ1c3kgPSBmYWxzZVxuICAgICAgaWYoY2xvc2VOZXh0KSB7XG4gICAgICAgIGNsb3NlKF9jYilcbiAgICAgICAgcmV0dXJuIGNiKGNsb3NlTmV4dClcbiAgICAgIH1cblxuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVhZCB0aGUgbmV4dCBieXRlc1xuICAgICAgcmV0dXJuIHJlYWROZXh0KGNiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlIChjYikge1xuICAgIC8vaWYgYXV0byBjbG9zZSBpcyBkaXNhYmxlZCwgdGhlbiB1c2VyIG1hbmFnZXMgZmQuXG4gICAgaWYob3B0cyAmJiBvcHRzLmF1dG9DbG9zZSA9PT0gZmFsc2UpIHJldHVybiBjYih0cnVlKVxuXG4gICAgLy93YWl0IHVudGlsIHdlIGhhdmUgZ290IG91dCBvZiBiZWQsIHRoZW4gZ28gYmFjayB0byBiZWQuXG4gICAgLy9vciBpZiB3ZSBhcmUgcmVhZGluZywgd2FpdCB0aWxsIHdlIHJlYWQsIHRoZW4gZ28gYmFjayB0byBiZWQuXG4gICAgZWxzZSBpZihidXN5KSB7XG4gICAgICBfY2IgPSBjYlxuICAgICAgcmV0dXJuIGNsb3NlTmV4dCA9IHRydWVcbiAgICB9XG5cbiAgICAvL2ZpcnN0IHJlYWQgd2FzIGNsb3NlLCBkb24ndCBldmVuIGdldCBvdXQgb2YgYmVkLlxuICAgIGVsc2UgaWYoIWZkKSB7XG4gICAgICByZXR1cm4gY2IodHJ1ZSlcbiAgICB9XG5cbiAgICAvL2dvIGJhY2sgdG8gYmVkXG4gICAgZWxzZSB7XG4gICAgICBmcy5jbG9zZShmZCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIGZkID0gbnVsbDtcbiAgICAgICAgY2IoZXJyIHx8IHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc291cmNlIChlbmQsIGNiKSB7XG4gICAgaWYgKGVuZCkge1xuICAgICAgZW5kZWQgPSBlbmQ7XG4gICAgICBjbG9zZShjYik7XG4gICAgfVxuICAgIC8vIGlmIHdlIGhhdmUgYWxyZWFkeSByZWNlaXZlZCB0aGUgZW5kIG5vdGlmaWNhdGlvbiwgYWJvcnQgZnVydGhlclxuICAgIGVsc2UgaWYgKGVuZGVkKSB7XG4gICAgICBjYihlbmRlZClcbiAgICB9XG5cbiAgICBlbHNlIGlmICghIGZkKSB7XG4gICAgICBvcGVuKGNiKTtcbiAgICB9XG5cbiAgICBlbHNlXG4gICAgICByZWFkTmV4dChjYik7XG4gIH07XG5cbiAgLy9yZWFkIGRpcmVjdGx5IHRvIHRleHRcbiAgaWYob3B0cyAmJiBvcHRzLmVuY29kaW5nKVxuICAgIHJldHVybiBEZWNvZGVyKG9wdHMuZW5jb2RpbmcpKHNvdXJjZSlcblxuICByZXR1cm4gc291cmNlXG5cbn07XG5cblxuXG5cblxuXG5cblxuXG5cbiIsInZhciBwdWxsID0gcmVxdWlyZSgncHVsbC1zdHJlYW0nKVxudmFyIGZzICAgPSByZXF1aXJlKCdmcycpXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxudmFyIFJlYWQgPSByZXF1aXJlKCdwdWxsLWZpbGUnKVxudmFyIFdyaXRlID0gcmVxdWlyZSgncHVsbC13cml0ZS1maWxlJylcblxudmFyIHJlYWRkaXIgPVxuZXhwb3J0cy5yZWFkZGlyID1cbmZ1bmN0aW9uIChkaXIsIG1hdGNoLCBpZ25vcmUpIHtcbiAgdmFyIGxzLCBlbmRlZCA9IGZhbHNlXG4gIG1hdGNoID0gKFxuICAgICFtYXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICA6ICdmdW5jdGlvbicgPT09IHR5cGVvZiBtYXRjaCAgICAgID8gbWF0Y2hcbiAgOiAnZnVuY3Rpb24nID09PSB0eXBlb2YgbWF0Y2gudGVzdCA/IG1hdGNoLnRlc3QuYmluZChtYXRjaClcbiAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxcbiAgKVxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGVuZGVkIHx8IGFib3J0KSB7XG4gICAgICBjYihlbmRlZCA9IGVuZGVkIHx8IGFib3J0KVxuICAgIH1cbiAgICBlbHNlIGlmKCFscylcbiAgICAgIGZzLnJlYWRkaXIoZGlyLCBmdW5jdGlvbiAoZXJyLCBfbHMpIHtcbiAgICAgICAgaWYoZXJyICYmIGVyci5jb2RlID09ICdFTk9URElSJykgY2IoZW5kZWQgPSB0cnVlKVxuICAgICAgICBlbHNlIGlmKGVycikgICAgICAgICAgICAgY2IoZW5kZWQgPSBlcnIpXG4gICAgICAgIGVsc2UgaWYoIV9scy5sZW5ndGgpIGNiKGVuZGVkID0gdHJ1ZSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYobWF0Y2gpXG4gICAgICAgICAgICBfbHMgPSBfbHMuZmlsdGVyKG1hdGNoKVxuICAgICAgICAgIGxzID0gX2xzLm1hcChmdW5jdGlvbiAoZikge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShkaXIsIGYpXG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZihscy5sZW5ndGgpXG4gICAgICAgICAgICBjYihudWxsLCBscy5zaGlmdCgpKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNiKHRydWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgZWxzZSBpZighbHMubGVuZ3RoKSBjYihlbmRlZCA9IHRydWUpXG4gICAgZWxzZSAgICAgICAgICAgICAgICBjYihudWxsLCBscy5zaGlmdCgpKVxuICB9XG59XG5cbnZhciBibG9ja3NpemUgPSA1MTJcblxudmFyIHJlYWQgPSBleHBvcnRzLnJlYWQgPSBSZWFkXG52YXIgd3JpdGUgPSBleHBvcnRzLndyaXRlID0gV3JpdGVcblxudmFyIGV4aXN0cyA9XG5leHBvcnRzLmV4aXN0cyA9XG5mdW5jdGlvbiAodGVzdCkge1xuICB0ZXN0ID0gdGVzdCB8fCBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAhIWVcbiAgfVxuICByZXR1cm4gcHVsbChcbiAgICBwdWxsLmFzeW5jTWFwKGZ1bmN0aW9uIChlLCBjYikge1xuICAgICAgZnMuc3RhdChlLCBmdW5jdGlvbiAoZXJyLCBzdGF0KSB7XG4gICAgICAgIGlmKHN0YXQgJiYgdGVzdChzdGF0KSlcbiAgICAgICAgICBjYihudWxsLCBlKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgY2IobnVsbCwgbnVsbClcbiAgICAgIH0pXG4gICAgfSksXG4gICAgcHVsbC5maWx0ZXIoQm9vbGVhbilcbiAgKVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RhdCh0ZXN0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGV4aXN0cyh0ZXN0KVxuICB9XG59XG5cblxudmFyIGlzRmlsZSA9IFxuZXhwb3J0cy5pc0ZpbGUgPVxudGVzdFN0YXQoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaXNGaWxlKCkgfSlcblxudmFyIGlzRGlyZWN0b3J5ID0gXG5leHBvcnRzLmlzRGlyZWN0b3J5ID1cbnRlc3RTdGF0KGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLmlzRGlyZWN0b3J5KCkgfSlcblxudmFyIGlzQmxvY2tEZXZpY2UgPSBcbmV4cG9ydHMuaXNCbG9ja0RldmljZSA9XG50ZXN0U3RhdChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5pc0Jsb2NrRGV2aWNlKCkgfSlcblxudmFyIGlzQ2hhcmFjdGVyRGV2aWNlID0gXG5leHBvcnRzLmlzQ2hhcmFjdGVyRGV2aWNlID1cbnRlc3RTdGF0KGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLmlzQ2hhcmFjdGVyRGV2aWNlKCkgfSlcblxudmFyIGlzU3ltYm9saWNMaW5rID0gXG5leHBvcnRzLmlzU3ltYm9saWNMaW5rID1cbnRlc3RTdGF0KGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLmlzU3ltYm9saWNMaW5rKCkgfSlcblxudmFyIGlzRklGTyA9IFxuZXhwb3J0cy5pc0ZJRk8gPVxudGVzdFN0YXQoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUuaXNGSUZPKCkgfSlcblxudmFyIGlzU29ja2V0ID0gXG5leHBvcnRzLmlzU29ja2V0ID1cbnRlc3RTdGF0KGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLmlzU29ja2V0KCkgfSlcblxuXG4iLCJcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9jb3JlJylcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJylcblxuZm9yKHZhciBrIGluIGNvcmUpXG4gIGV4cG9ydHNba10gPSBjb3JlW2tdXG5mb3IodmFyIGsgaW4gdXRpbClcbiAgZXhwb3J0c1trXSA9IHV0aWxba11cblxuIiwidmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJylcbnZhciBwdWxsID0gcmVxdWlyZSgncHVsbC1zdHJlYW0nKVxudmFyIGNvcmUgID0gcmVxdWlyZSgnLi9jb3JlJylcbnZhciBmcyAgICA9IHJlcXVpcmUoJ2ZzJylcbnZhciBEZXB0aEZpcnN0ID0gcmVxdWlyZSgncHVsbC10cmF2ZXJzZScpLmRlcHRoRmlyc3RcblxudmFyIGFuY2VzdG9ycyA9IGV4cG9ydHMuYW5jZXN0b3JzID0gZnVuY3Rpb24gKGRpcikge1xuICBkaXIgPSBkaXIgfHwgcHJvY2Vzcy5jd2QoKVxuICB2YXIgcGF0aHMgPSBbXVxuXG4gIHdoaWxlKGRpcikge1xuICAgIHBhdGhzLnB1c2goZGlyKVxuICAgIGRpciA9IHBhdGguZGlybmFtZShkaXIpXG4gICAgaWYoZGlyID09PSAnLycpIHtcbiAgICAgIHBhdGhzLnB1c2goZGlyKSBcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHB1bGwudmFsdWVzKHBhdGhzKVxufVxuXG52YXIgc3RhciA9IGV4cG9ydHMuc3RhciA9IGZ1bmN0aW9uIChtYXRjaCkge1xuICByZXR1cm4gcHVsbChcbiAgICBwdWxsLm1hcChmdW5jdGlvbiAoZGlyKSB7XG4gICAgICByZXR1cm4gY29yZS5yZWFkZGlyKGRpciwgbWF0Y2gpXG4gICAgfSksXG4gICAgcHVsbC5mbGF0dGVuKCksXG4gICAgcHVsbC5maWx0ZXIoKVxuICApXG59XG5cbnZhciBzdGFyU3RhciA9XG5leHBvcnRzLnN0YXJTdGFyID1cbmZ1bmN0aW9uIChtYXRjaCkge1xuICB2YXIgc2VlbiA9IHt9XG4gIHJldHVybiBwdWxsKFxuICAgIHB1bGwubWFwKGZ1bmN0aW9uIChkaXIpIHtcbiAgICAgIHZhciBmaXJzdCA9IHRydWVcbiAgICAgIHJldHVybiBEZXB0aEZpcnN0KHBhdGgucmVzb2x2ZShkaXIpLCBmdW5jdGlvbiAoX2Rpcikge1xuICAgICAgICByZXR1cm4gcHVsbChcbiAgICAgICAgICBjb3JlLnJlYWRkaXIoX2RpciwgbWF0Y2gsIHRydWUpLFxuICAgICAgICAgIHB1bGwuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZihzZWVuW2VdKSByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIHJldHVybiBzZWVuW2VdID0gdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSksXG4gICAgcHVsbC5mbGF0dGVuKCksXG4gICAgcHVsbC5maWx0ZXIoKVxuICApXG59XG5cbnZhciByZXNvbHZlID0gZXhwb3J0cy5yZXNvbHZlID0gZnVuY3Rpb24gKHJlbCkge1xuIHJldHVybiBwdWxsLm1hcChmdW5jdGlvbiAoZGlyKSB7IC8vbWFwIHRvICRkaXIvbm9kZV9tb2R1bGVzXG4gICAgaWYocmVsKVxuICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShkaXIsIHJlbClcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKGRpcilcbiAgfSlcbn1cblxudmFyIHJlbGF0aXZlID0gZXhwb3J0cy5yZWxhdGl2ZSA9IGZ1bmN0aW9uIChyZWwpIHtcbiAgcmVsID0gcmVsIHx8IHByb2Nlc3MuY3dkKClcbiAgcmV0dXJuIHB1bGwubWFwKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgcmV0dXJuIHBhdGgucmVsYXRpdmUocmVsLCBmaWxlKVxuICB9KVxufVxuXG52YXIgYWJzb2x1dGUgPSBleHBvcnRzLmFic29sdXRlID1cbmZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHJlc29sdmUoKVxufVxuXG52YXIgcmVhZEZpbGUgPVxuZXhwb3J0cy5yZWFkRmlsZSA9IGZ1bmN0aW9uIChwYXJzZSkge1xuICByZXR1cm4gcHVsbC5hc3luY01hcChmdW5jdGlvbiAoZmlsZSwgY2IpIHtcbiAgICBmcy5yZWFkRmlsZShmaWxlLCAndXRmLTgnLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBpZihlcnIpIHJldHVybiBjYihlcnIpIFxuICAgICAgdHJ5IHtcbiAgICAgICAgIGRhdGEgPSBwYXJzZSA/IHBhcnNlKGRhdGEpIDogZGF0YVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYihlcnIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY2IobnVsbCwgZGF0YSlcbiAgICB9KVxuICB9KVxufVxuXG5pZighbW9kdWxlLnBhcmVudCkge1xuICBwdWxsKFxuICAgIHB1bGwudmFsdWVzKFsnLiddKSxcbiAgICBzdGFyU3RhcigpLFxuICAgIHB1bGwuZHJhaW4oY29uc29sZS5sb2cpXG4gIClcbn1cblxuXG4iLCJ2YXIgcGZzICA9IHJlcXVpcmUoJ3B1bGwtZnMnKVxudmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG52YXIgZ2xvYiA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHgpIHtcblxuICB2YXIgcmVzdCA9IHBhdGgubm9ybWFsaXplKHgpLnNwbGl0KCcvJylcbiAgdmFyIHN0cmVhbVxuXG4gIHZhciBwaXBlID0gW11cblxuICBpZihyZXN0WzBdID09ICcuLi4nKSB7XG4gICAgcGlwZS5wdXNoKHBmcy5hbmNlc3RvcnMoKSlcbiAgICByZXN0LnNoaWZ0KClcbiAgfSBlbHNlIGlmKHJlc3RbMF0gPT09ICd+JyB8fCByZXN0WzBdID09PSAnJykge1xuICAgIHBpcGUucHVzaChwdWxsLnZhbHVlcyhbcmVzdC5zaGlmdCgpID8gcHJvY2Vzcy5lbnYuSE9NRSA6ICcvJ10pKVxuICB9IGVsc2Uge1xuICAgIHBpcGUucHVzaChwdWxsLnZhbHVlcyhbJy4nXSkpXG4gIH1cblxuICAvL3RoaXMgc2hvdWxkIGJlIHRpZGllZCB1cC5cbiAgLy9uZWVkIGEgbW9yZSBiZXR0ZXJlciBnbG9iIHBhcnNlclxuICAvL3RoYXQgaGFuZGxlcyBlc2NhcGVzLi4uXG4gIHJlc3QuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgIGlmKCcqKicgPT09IGUpIHtcbiAgICAgIHBpcGUucHVzaChwZnMuc3RhclN0YXIoKSlcbiAgICB9IGVsc2UgaWYoL1sqP3t9XS8udGVzdChlKSkge1xuICAgICAgLy9saXRlcmFsXG4gICAgICBlID0gZVxuICAgICAgICAuc3BsaXQoJy4nKS5qb2luKCdcXFxcLicpXG4gICAgICAgIC5zcGxpdCgnPycpLmpvaW4oJy4nKVxuICAgICAgICAuc3BsaXQoLyh7Lio/fSkvKS5tYXAoZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgaWYoaSAlIDIpXG4gICAgICAgICAgcmV0dXJuIGUucmVwbGFjZSgneycsICcoPzonKVxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ30nLCAnKScpXG4gICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKS5qb2luKCd8JylcbiAgICAgICAgcmV0dXJuIGVcbiAgICAgIH0pLmpvaW4oJycpXG5cbiAgICAgIHZhciB4ID0gbmV3IFJlZ0V4cCgnXicrZS5zcGxpdCgnKicpLmpvaW4oJy4qJykrJyQnKVxuICAgICAgcGlwZS5wdXNoKHBmcy5zdGFyKHgpKVxuICAgIH0gZWxzZSBpZihlID09PSAnJylcbiAgICAgIC8vd2lsbCBvbmx5IGhhcHBlbiBpbiB0aGUgbGFzdCBwb3NpdGlvblxuICAgICAgLy9pZiB5b3UgZG8gKi9cbiAgICAgIHBpcGUucHVzaChwZnMuaXNEaXJlY3RvcnkoKSlcbiAgICBlbHNlXG4gICAgICBwaXBlLnB1c2gocHVsbChwZnMucmVzb2x2ZShlKSwgcGZzLmV4aXN0cygpKSlcbiAgfSlcblxuICByZXR1cm4gcHVsbC5hcHBseShudWxsLCBwaXBlKVxufVxuXG4iLCJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZW5kYWJsZSAoZ29vZGJ5ZSkge1xuICB2YXIgZW5kZWQsIHdhaXRpbmcsIHNlbnRFbmRcbiAgZnVuY3Rpb24gaCAocmVhZCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgICByZWFkKGFib3J0LCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgIGlmKGVuZCAmJiAhc2VudEVuZCkge1xuICAgICAgICAgIHNlbnRFbmQgPSB0cnVlXG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIGdvb2RieWUpXG4gICAgICAgIH1cbiAgICAgICAgLy9zZW5kIGVuZCBtZXNzYWdlLi4uXG5cbiAgICAgICAgaWYoZW5kICYmIGVuZGVkKSBjYihlbmQpXG4gICAgICAgIGVsc2UgaWYoZW5kKSAgICAgd2FpdGluZyA9IGNiXG4gICAgICAgIGVsc2UgICAgICAgICAgICAgY2IobnVsbCwgZGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIGguZW5kID0gZnVuY3Rpb24gKCkge1xuICAgIGVuZGVkID0gdHJ1ZVxuICAgIGlmKHdhaXRpbmcpIHdhaXRpbmcoZW5kZWQpXG4gICAgcmV0dXJuIGhcbiAgfVxuICByZXR1cm4gaFxufVxuXG4iLCJcbnZhciBlbmRhYmxlID0gcmVxdWlyZSgnLi9lbmRhYmxlJylcbnZhciBwdWxsID0gcmVxdWlyZSgncHVsbC1zdHJlYW0nKVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyZWFtLCBnb29kYnllKSB7XG4gIGdvb2RieWUgPSBnb29kYnllIHx8ICdHT09EQllFJ1xuICB2YXIgZSA9IGVuZGFibGUoZ29vZGJ5ZSlcblxuICByZXR1cm4ge1xuICAgIC8vIHdoZW4gdGhlIHNvdXJjZSBlbmRzLFxuICAgIC8vIHNlbmQgdGhlIGdvb2RieWUgYW5kIHRoZW4gd2FpdCB0byByZWNpZXZlXG4gICAgLy8gdGhlIG90aGVyIGdvb2RieWUuXG4gICAgc291cmNlOiBwdWxsKHN0cmVhbS5zb3VyY2UsIGUpLFxuICAgIHNpbms6IHB1bGwoXG4gICAgICAvL3doZW4gdGhlIGdvb2RieWUgaXMgcmVjZWl2ZWQsIGFsbG93IHRoZSBzb3VyY2UgdG8gZW5kLlxuICAgICAgcHVsbC5maWx0ZXIoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYoZGF0YSAhPT0gZ29vZGJ5ZSkgcmV0dXJuIHRydWVcbiAgICAgICAgZS5lbmQoKVxuICAgICAgfSksXG4gICAgICBzdHJlYW0uc2lua1xuICAgIClcbiAgfVxuXG59XG4iLCJcbnZhciBSZWFkZXIgPSByZXF1aXJlKCdwdWxsLXJlYWRlcicpXG52YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcbnZhciBkZWZlcnJlZCA9IHJlcXVpcmUoJ3B1bGwtZGVmZXInKVxudmFyIFdyaXRlciA9IHJlcXVpcmUoJ3B1bGwtcHVzaGFibGUnKVxudmFyIGNhdCA9IHJlcXVpcmUoJ3B1bGwtY2F0JylcbnZhciBwYWlyID0gcmVxdWlyZSgncHVsbC1wYWlyJylcblxuZnVuY3Rpb24gb25jZSAoY2IpIHtcbiAgdmFyIGNhbGxlZCA9IDBcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgaWYoY2FsbGVkKyspIHJldHVyblxuICAgIGNiKGEsIGIsIGMpXG4gIH1cbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAoZikge1xuICByZXR1cm4gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0cywgX2NiKSB7XG4gIGlmKGlzRnVuY3Rpb24ob3B0cykpIF9jYiA9IG9wdHMsIG9wdHMgPSB7fVxuICBfY2IgPSBvbmNlKF9jYilcbiAgdmFyIHJlYWRlciA9IFJlYWRlcihvcHRzICYmIG9wdHMudGltZW91dCB8fCA1ZTMpXG4gIHZhciB3cml0ZXIgPSBXcml0ZXIoZnVuY3Rpb24gKGVycikge1xuICAgIGlmKGVycikgX2NiKGVycilcbiAgfSlcblxuICB2YXIgc291cmNlID0gZGVmZXJyZWQuc291cmNlKClcblxuICB2YXIgcCA9IHBhaXIoKVxuXG4gIHJldHVybiB7XG4gICAgaGFuZHNoYWtlOiB7XG4gICAgICByZWFkOiByZWFkZXIucmVhZCxcbiAgICAgIGFib3J0OiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHdyaXRlci5lbmQoZXJyKVxuICAgICAgICByZWFkZXIuYWJvcnQoZXJyLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIH0pXG4gICAgICAgIF9jYihlcnIpXG4gICAgICB9LFxuICAgICAgd3JpdGU6IHdyaXRlci5wdXNoLFxuICAgICAgcmVzdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB3cml0ZXIuZW5kKClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHJlYWRlci5yZWFkKCksXG4gICAgICAgICAgc2luazogcC5zaW5rXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHNpbms6IHJlYWRlcixcbiAgICBzb3VyY2U6IGNhdChbd3JpdGVyLCBwLnNvdXJjZV0pXG4gIH1cbn1cblxuIiwidmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgbW5zICA9IHJlcXVpcmUoJy4vbWFnaWMtbnVtYmVycycpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNiKSB7XG4gIHZhciBkb25lID0gZmFsc2VcbiAgcmV0dXJuIHB1bGwudGhyb3VnaChmdW5jdGlvbiAoYnVmKSB7XG4gICAgaWYgKGRvbmUpIHJldHVyblxuICAgIGRvbmUgPSB0cnVlXG5cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKVxuICAgICAgcmV0dXJuIGNiKGZhbHNlKVxuXG4gICAgLy8gY29tcGFyZSB0aGUgZmlyc3QgYnl0ZXMgYWdhaW5zdCB0aGUgbWFnaWMgbnVtYmVyc1xuICAgIHZhciBoZXggPSBidWYuc2xpY2UoMCwgKGJ1Zi5sZW5ndGggPiAxMCkgPyAxMCA6IGJ1Zi5sZW5ndGgpLnRvU3RyaW5nKCdoZXgnKVxuICAgIGZvciAodmFyIG1hZ2ljTnVtYmVyIGluIG1ucykge1xuICAgICAgaWYgKGhleC5pbmRleE9mKG1hZ2ljTnVtYmVyKSA9PT0gMClcbiAgICAgICAgcmV0dXJuIGNiKG1uc1ttYWdpY051bWJlcl0pXG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBzdHJpbmcsIGNoZWNrIHRoZSBwbGFpbnRleHQgdHlwZXNcbiAgICB2YXIgYXNTdHIgPSBidWYuc2xpY2UoMCwgKGJ1Zi5sZW5ndGggPiA1MTIpID8gNTEyIDogYnVmLmxlbmd0aCkudG9TdHJpbmcoJ3V0Zi04JylcbiAgICBpZiAoYXNTdHIuaW5kZXhPZignPHN2ZycpICE9PSAtMSlcbiAgICAgIHJldHVybiBjYignc3ZnJylcbiAgICBpZiAoYXNTdHIuaW5kZXhPZignPGh0bWwnKSAhPT0gLTEpXG4gICAgICByZXR1cm4gY2IoJ2h0bWwnKVxuICAgIFxuICAgIGNiKGZhbHNlKVxuICB9KVxufSIsIi8vIHRoYW5rcyB0byBodHRwczovL2dpdGh1Yi5jb20vYmliaWcvd2hldGhlclxuXG4vLyBodHRwOi8vd3d3LmFzdHJvLmtlZWxlLmFjLnVrL29sZHVzZXJzL3Juby9jb21wdXRpbmcvZmlsZV9tYWdpYy5odG1sXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL2xpc3Rfb2ZfZmlsZV9zaWduYXR1cmVzXG4vLyBodHRwOi8vYXNlY3VyaXR5c2l0ZS5jb20vZm9yZW5zaWNzL21hZ2ljXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAnZmZkOGZmJzogJ2pwZycsXG4gICc4OTUwNGU0Nyc6ICdwbmcnLFxuICAnNDc0OTQ2MzgnOiAnZ2lmJyxcbiAgJzQyNGQnOiAnYm1wJyxcbiAgJzQ5NDknOiAndGlmJyxcbiAgJzRkNGQnOiAndGlmJyxcbiAgJzQ5NDk0ZTMxJzogJ25pZicsXG4gICcwMDAwMDEwMCc6ICdpY28nLFxuICAnMzg0MjUwNTMnOiAncHNkJyxcbiAgJzUyNjE3MjIxMWEwNyc6ICdyYXInLFxuICAnNTA0YjAzMDQnOiAnemlwJyxcbiAgJzFmOGIwOCc6ICdneicsXG4gICc3NTczNzQ2MTcyJzogJ3RhcicsXG4gICdkMGNmMTFlMGExYjExYWUxJzogJ21zaScsXG4gICc0MzQ0MzAzMDMxJzogJ2lzbycsXG4gICc3YjVjNzI3NDY2MzEnOiAncnRmJyxcbiAgJzUyNDk0NjQ2JzogJ2F2aScsXG4gICc2ZDZmNmY3Nic6ICdtb3YnLFxuICAnMzAyNmIyNzU4ZTY2Y2YnOiAnd212JyxcbiAgJzMwMjZiMjc1OGU2NmNmJzogJ3dtYScsXG4gICc0NjU3NTMnOiAnc3dmJyxcbiAgJzQ2NGM1Nic6ICdmbHYnLFxuICAnNGQ1NDY4NjQnOiAnbWlkJyxcbiAgJzI1NTA0NDQ2JzogJ3BkZicsXG4gICdkMGNmMTFlMGExYjExYWUxJzogJ2RvYycsXG4gICc1MDRiMDMwNCc6ICdkb2N4JyxcbiAgJzQ5NDQ0Myc6ICdtcDMnXG59XG5cbi8qXG5hdmlcbndtdlxud21hXG5zd2ZcbmZsdlxubWlkXG5tcDNcbiovIiwiXG52YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcbnZhciBBYm9ydGFibGUgPSByZXF1aXJlKCdwdWxsLWFib3J0YWJsZScpXG52YXIgUmF0ZSA9IHJlcXVpcmUoJy4vcmF0ZScpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGR1cGxleCwgbWluLCBvbkVuZCkge1xuICBpZignZnVuY3Rpb24nID09PSB0eXBlb2YgbWluKVxuICAgIG9uRW5kID0gbWluLCBtaW4gPSBudWxsXG5cbiAgdmFyIG4gPSAyLCBlcnJvciwgaW50ZXJ2YWxcblxuICBmdW5jdGlvbiBkb25lIChlcnIpIHtcbiAgICBlcnJvciA9IGVycm9yIHx8IGVyclxuICAgIGlmKC0tbikgcmV0dXJuXG4gICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbClcbiAgICBvbkVuZCAmJiBvbkVuZChlcnJvcilcbiAgfVxuXG4gIG1pbiA9IG1pbiB8fCAxMDAwIC8vY2xvc2UgYWZ0ZXIgMSBzZWNvbmQgaW5hY3Rpdml0eS5cblxuICB2YXIgc291cmNlQWJvcnQgPSBBYm9ydGFibGUoZG9uZSlcbiAgdmFyIHNpbmtBYm9ydCAgID0gQWJvcnRhYmxlKGRvbmUpXG4gIHZhciBzb3VyY2VSYXRlICA9IFJhdGUoKVxuICB2YXIgc2lua1JhdGUgICAgPSBSYXRlKClcblxuICBmdW5jdGlvbiByYXRlICgpIHtcbiAgICByZXR1cm4gc291cmNlUmF0ZS5yYXRlKCkgKyBzaW5rUmF0ZS5yYXRlKClcbiAgfVxuXG4gIGZ1bmN0aW9uIGFib3J0ICgpIHtcbiAgICBjbGVhckludGVydmFsKGludGVydmFsKVxuICAgIHNvdXJjZUFib3J0LmFib3J0KClcbiAgICBzaW5rQWJvcnQuYWJvcnQoKVxuICB9XG5cbiAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgaWYoIW1pbikgcmV0dXJuXG4gICAgaWYoTWF0aC5tYXgoc291cmNlUmF0ZS50cywgc2lua1JhdGUudHMpICsgbWluIDwgRGF0ZS5ub3coKSlcbiAgICAgIGFib3J0KClcbiAgfSwgMjAwKVxuXG4gIHJldHVybiB7XG4gICAgc291cmNlOiBwdWxsKGR1cGxleC5zb3VyY2UsIHNvdXJjZVJhdGUsIHNvdXJjZUFib3J0KSxcbiAgICBzaW5rICA6IHB1bGwoc2lua1JhdGUsIHNpbmtBYm9ydCwgZHVwbGV4LnNpbmspLFxuICAgIHJhdGUgIDogcmF0ZSxcbiAgICBzZXRUVEw6IGZ1bmN0aW9uIChfbWluKSB7XG4gICAgICBpZighX21pbikgY2xlYXJJbnRlcnZhbChpbnRlcnZhbClcbiAgICAgIG1pbiA9IF9taW5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcbiAgICBhYm9ydCA6IGFib3J0XG4gIH1cblxufVxuXG5tb2R1bGUuZXhwb3J0cy50aHJvdWdoID0gZnVuY3Rpb24gKG1pbiwgb25FbmQpIHtcbiAgbWluID0gbWluIHx8IDAuMDAyIC8vMmsgcGVyIHNlY29uZFxuICB2YXIgYWJvcnRhYmxlID0gQWJvcnRhYmxlKG9uRW5kKVxuICB2YXIgZmxvdyA9IFJhdGUoKVxuICB2YXIgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgaWYoZmxvdy5yYXRlKCkgPCBtaW4pIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpXG4gICAgICBhYm9ydGFibGUuYWJvcnQoKVxuICAgIH1cbiAgfSwgNTAwKVxuXG4gIHZhciBzdHJlYW0gPSBwdWxsKFxuICAgIGZsb3csXG4gICAgYWJvcnRhYmxlLFxuICAgIHB1bGwudGhyb3VnaChudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsKVxuICAgIH0pXG4gIClcblxuICBzdHJlYW0ucmF0ZSA9IGZsb3cucmF0ZVxuXG4gIHJldHVybiBzdHJlYW1cbn1cbiIsInZhciB1ICAgICAgPSByZXF1aXJlKCdwdWxsLWNvcmUnKVxudmFyIHNvdXJjZXMgPSByZXF1aXJlKCcuL3NvdXJjZXMnKVxudmFyIHNpbmtzID0gcmVxdWlyZSgnLi9zaW5rcycpXG5cbnZhciBwcm9wICAgPSB1LnByb3BcbnZhciBpZCAgICAgPSB1LmlkXG52YXIgdGVzdGVyID0gdS50ZXN0ZXJcblxudmFyIG1hcCA9IGV4cG9ydHMubWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXApIHtcbiAgbWFwID0gcHJvcChtYXApIHx8IGlkXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgcmVhZChhYm9ydCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgIGRhdGEgPSAhZW5kID8gbWFwKGRhdGEpIDogbnVsbFxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiByZWFkKGVyciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgYXN5bmNNYXAgPSBleHBvcnRzLmFzeW5jTWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXApIHtcbiAgaWYoIW1hcCkgcmV0dXJuIHJlYWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmQsIGNiKSAvL2Fib3J0XG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHJldHVybiBjYihlbmQsIGRhdGEpXG4gICAgICBtYXAoZGF0YSwgY2IpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgcGFyYU1hcCA9IGV4cG9ydHMucGFyYU1hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwLCB3aWR0aCkge1xuICBpZighbWFwKSByZXR1cm4gcmVhZFxuICB2YXIgZW5kZWQgPSBmYWxzZSwgcXVldWUgPSBbXSwgX2NiXG5cbiAgZnVuY3Rpb24gZHJhaW4gKCkge1xuICAgIGlmKCFfY2IpIHJldHVyblxuICAgIHZhciBjYiA9IF9jYlxuICAgIF9jYiA9IG51bGxcbiAgICBpZihxdWV1ZS5sZW5ndGgpXG4gICAgICByZXR1cm4gY2IobnVsbCwgcXVldWUuc2hpZnQoKSlcbiAgICBlbHNlIGlmKGVuZGVkICYmICFuKVxuICAgICAgcmV0dXJuIGNiKGVuZGVkKVxuICAgIF9jYiA9IGNiXG4gIH1cblxuICBmdW5jdGlvbiBwdWxsICgpIHtcbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkge1xuICAgICAgICBlbmRlZCA9IGVuZFxuICAgICAgICByZXR1cm4gZHJhaW4oKVxuICAgICAgfVxuICAgICAgbisrXG4gICAgICBtYXAoZGF0YSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICBuLS1cblxuICAgICAgICBxdWV1ZS5wdXNoKGRhdGEpXG4gICAgICAgIGRyYWluKClcbiAgICAgIH0pXG5cbiAgICAgIGlmKG4gPCB3aWR0aCAmJiAhZW5kZWQpXG4gICAgICAgIHB1bGwoKVxuICAgIH0pXG4gIH1cblxuICB2YXIgbiA9IDBcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmQsIGNiKSAvL2Fib3J0XG4gICAgLy9jb250aW51ZSB0byByZWFkIHdoaWxlIHRoZXJlIGFyZSBsZXNzIHRoYW4gMyBtYXBzIGluIGZsaWdodFxuICAgIF9jYiA9IGNiXG4gICAgaWYocXVldWUubGVuZ3RoIHx8IGVuZGVkKVxuICAgICAgcHVsbCgpLCBkcmFpbigpXG4gICAgZWxzZSBwdWxsKClcbiAgfVxuICByZXR1cm4gaGlnaFdhdGVyTWFyayhhc3luY01hcChyZWFkLCBtYXApLCB3aWR0aClcbn1cblxudmFyIGZpbHRlciA9IGV4cG9ydHMuZmlsdGVyID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIC8vcmVnZXhwXG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZ1bmN0aW9uIG5leHQgKGVuZCwgY2IpIHtcbiAgICB2YXIgc3luYywgbG9vcCA9IHRydWVcbiAgICB3aGlsZShsb29wKSB7XG4gICAgICBsb29wID0gZmFsc2VcbiAgICAgIHN5bmMgPSB0cnVlXG4gICAgICByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZighZW5kICYmICF0ZXN0KGRhdGEpKVxuICAgICAgICAgIHJldHVybiBzeW5jID8gbG9vcCA9IHRydWUgOiBuZXh0KGVuZCwgY2IpXG4gICAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICAgIH0pXG4gICAgICBzeW5jID0gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxudmFyIGZpbHRlck5vdCA9IGV4cG9ydHMuZmlsdGVyTm90ID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZpbHRlcihyZWFkLCBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAhdGVzdChlKVxuICB9KVxufVxuXG52YXIgdGhyb3VnaCA9IGV4cG9ydHMudGhyb3VnaCA9XG5mdW5jdGlvbiAocmVhZCwgb3AsIG9uRW5kKSB7XG4gIHZhciBhID0gZmFsc2VcbiAgZnVuY3Rpb24gb25jZSAoYWJvcnQpIHtcbiAgICBpZihhIHx8ICFvbkVuZCkgcmV0dXJuXG4gICAgYSA9IHRydWVcbiAgICBvbkVuZChhYm9ydCA9PT0gdHJ1ZSA/IG51bGwgOiBhYm9ydClcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgb25jZShlbmQpXG4gICAgcmV0dXJuIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZighZW5kKSBvcCAmJiBvcChkYXRhKVxuICAgICAgZWxzZSBvbmNlKGVuZClcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciB0YWtlID0gZXhwb3J0cy50YWtlID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHZhciBlbmRlZCA9IGZhbHNlXG4gIGlmKCdudW1iZXInID09PSB0eXBlb2YgdGVzdCkge1xuICAgIHZhciBuID0gdGVzdDsgdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuIC0tXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kZWQpIHJldHVybiBjYihlbmRlZClcbiAgICBpZihlbmRlZCA9IGVuZCkgcmV0dXJuIHJlYWQoZW5kZWQsIGNiKVxuXG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkgcmV0dXJuIGNiKGVuZGVkKVxuICAgICAgaWYoIXRlc3QoZGF0YSkpIHtcbiAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgIHJlYWQodHJ1ZSwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGNiKGVuZGVkLCBkYXRhKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBjYihudWxsLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHVuaXF1ZSA9IGV4cG9ydHMudW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkLCBpbnZlcnQpIHtcbiAgZmllbGQgPSBwcm9wKGZpZWxkKSB8fCBpZFxuICB2YXIgc2VlbiA9IHt9XG4gIHJldHVybiBmaWx0ZXIocmVhZCwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIga2V5ID0gZmllbGQoZGF0YSlcbiAgICBpZihzZWVuW2tleV0pIHJldHVybiAhIWludmVydCAvL2ZhbHNlLCBieSBkZWZhdWx0XG4gICAgZWxzZSBzZWVuW2tleV0gPSB0cnVlXG4gICAgcmV0dXJuICFpbnZlcnQgLy90cnVlIGJ5IGRlZmF1bHRcbiAgfSlcbn1cblxudmFyIG5vblVuaXF1ZSA9IGV4cG9ydHMubm9uVW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkKSB7XG4gIHJldHVybiB1bmlxdWUocmVhZCwgZmllbGQsIHRydWUpXG59XG5cbnZhciBncm91cCA9IGV4cG9ydHMuZ3JvdXAgPVxuZnVuY3Rpb24gKHJlYWQsIHNpemUpIHtcbiAgdmFyIGVuZGVkOyBzaXplID0gc2l6ZSB8fCA1XG4gIHZhciBxdWV1ZSA9IFtdXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgLy90aGlzIG1lYW5zIHRoYXQgdGhlIHVwc3RyZWFtIGlzIHNlbmRpbmcgYW4gZXJyb3IuXG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmRlZCA9IGVuZCwgY2IpXG4gICAgLy90aGlzIG1lYW5zIHRoYXQgd2UgcmVhZCBhbiBlbmQgYmVmb3JlLlxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIG5leHQoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkge1xuICAgICAgICBpZighcXVldWUubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiBjYihlbmRlZClcblxuICAgICAgICB2YXIgX3F1ZXVlID0gcXVldWU7IHF1ZXVlID0gW11cbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIF9xdWV1ZSlcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goZGF0YSlcbiAgICAgIGlmKHF1ZXVlLmxlbmd0aCA8IHNpemUpXG4gICAgICAgIHJldHVybiByZWFkKG51bGwsIG5leHQpXG5cbiAgICAgIHZhciBfcXVldWUgPSBxdWV1ZTsgcXVldWUgPSBbXVxuICAgICAgY2IobnVsbCwgX3F1ZXVlKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGZsYXR0ZW4gPSBleHBvcnRzLmZsYXR0ZW4gPSBmdW5jdGlvbiAocmVhZCkge1xuICB2YXIgX3JlYWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihfcmVhZCkgbmV4dENodW5rKClcbiAgICBlbHNlICAgICAgbmV4dFN0cmVhbSgpXG5cbiAgICBmdW5jdGlvbiBuZXh0Q2h1bmsgKCkge1xuICAgICAgX3JlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZihlbmQpIG5leHRTdHJlYW0oKVxuICAgICAgICBlbHNlICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgICBmdW5jdGlvbiBuZXh0U3RyZWFtICgpIHtcbiAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgc3RyZWFtKSB7XG4gICAgICAgIGlmKGVuZClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kKVxuICAgICAgICBpZihBcnJheS5pc0FycmF5KHN0cmVhbSkgfHwgc3RyZWFtICYmICdvYmplY3QnID09PSB0eXBlb2Ygc3RyZWFtKVxuICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZXMudmFsdWVzKHN0cmVhbSlcbiAgICAgICAgZWxzZSBpZignZnVuY3Rpb24nICE9IHR5cGVvZiBzdHJlYW0pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJlYW0gb2Ygc3RyZWFtcycpXG4gICAgICAgIF9yZWFkID0gc3RyZWFtXG4gICAgICAgIG5leHRDaHVuaygpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG52YXIgcHJlcGVuZCA9XG5leHBvcnRzLnByZXBlbmQgPVxuZnVuY3Rpb24gKHJlYWQsIGhlYWQpIHtcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGhlYWQgIT09IG51bGwpIHtcbiAgICAgIGlmKGFib3J0KVxuICAgICAgICByZXR1cm4gcmVhZChhYm9ydCwgY2IpXG4gICAgICB2YXIgX2hlYWQgPSBoZWFkXG4gICAgICBoZWFkID0gbnVsbFxuICAgICAgY2IobnVsbCwgX2hlYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWQoYWJvcnQsIGNiKVxuICAgIH1cbiAgfVxuXG59XG5cbi8vdmFyIGRyYWluSWYgPSBleHBvcnRzLmRyYWluSWYgPSBmdW5jdGlvbiAob3AsIGRvbmUpIHtcbi8vICBzaW5rcy5kcmFpbihcbi8vfVxuXG52YXIgX3JlZHVjZSA9IGV4cG9ydHMuX3JlZHVjZSA9IGZ1bmN0aW9uIChyZWFkLCByZWR1Y2UsIGluaXRpYWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjbG9zZSwgY2IpIHtcbiAgICBpZihjbG9zZSkgcmV0dXJuIHJlYWQoY2xvc2UsIGNiKVxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICBzaW5rcy5kcmFpbihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaW5pdGlhbCA9IHJlZHVjZShpbml0aWFsLCBpdGVtKVxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGVuZGVkID0gZXJyIHx8IHRydWVcbiAgICAgIGlmKCFlcnIpIGNiKG51bGwsIGluaXRpYWwpXG4gICAgICBlbHNlICAgICBjYihlbmRlZClcbiAgICB9KVxuICAgIChyZWFkKVxuICB9XG59XG5cbnZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2tcblxudmFyIGhpZ2hXYXRlck1hcmsgPSBleHBvcnRzLmhpZ2hXYXRlck1hcmsgPVxuZnVuY3Rpb24gKHJlYWQsIGhpZ2hXYXRlck1hcmspIHtcbiAgdmFyIGJ1ZmZlciA9IFtdLCB3YWl0aW5nID0gW10sIGVuZGVkLCBlbmRpbmcsIHJlYWRpbmcgPSBmYWxzZVxuICBoaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyayB8fCAxMFxuXG4gIGZ1bmN0aW9uIHJlYWRBaGVhZCAoKSB7XG4gICAgd2hpbGUod2FpdGluZy5sZW5ndGggJiYgKGJ1ZmZlci5sZW5ndGggfHwgZW5kZWQpKVxuICAgICAgd2FpdGluZy5zaGlmdCgpKGVuZGVkLCBlbmRlZCA/IG51bGwgOiBidWZmZXIuc2hpZnQoKSlcblxuICAgIGlmICghYnVmZmVyLmxlbmd0aCAmJiBlbmRpbmcpIGVuZGVkID0gZW5kaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgaWYoZW5kZWQgfHwgZW5kaW5nIHx8IHJlYWRpbmcgfHwgYnVmZmVyLmxlbmd0aCA+PSBoaWdoV2F0ZXJNYXJrKVxuICAgICAgcmV0dXJuXG4gICAgcmVhZGluZyA9IHRydWVcbiAgICByZXR1cm4gcmVhZChlbmRlZCB8fCBlbmRpbmcsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgZW5kaW5nID0gZW5kaW5nIHx8IGVuZFxuICAgICAgaWYoZGF0YSAhPSBudWxsKSBidWZmZXIucHVzaChkYXRhKVxuXG4gICAgICBuZXh0KCk7IHJlYWRBaGVhZCgpXG4gICAgfSlcbiAgfVxuXG4gIHByb2Nlc3MubmV4dFRpY2sobmV4dClcblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBlbmRlZCA9IGVuZGVkIHx8IGVuZFxuICAgIHdhaXRpbmcucHVzaChjYilcblxuICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgfVxufVxuXG52YXIgZmxhdE1hcCA9IGV4cG9ydHMuZmxhdE1hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwcGVyKSB7XG4gIG1hcHBlciA9IG1hcHBlciB8fCBpZFxuICB2YXIgcXVldWUgPSBbXSwgZW5kZWRcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKHF1ZXVlLmxlbmd0aCkgcmV0dXJuIGNiKG51bGwsIHF1ZXVlLnNoaWZ0KCkpXG4gICAgZWxzZSBpZihlbmRlZCkgICByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICByZWFkKGFib3J0LCBmdW5jdGlvbiBuZXh0IChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkgZW5kZWQgPSBlbmRcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgYWRkID0gbWFwcGVyKGRhdGEpXG4gICAgICAgIHdoaWxlKGFkZCAmJiBhZGQubGVuZ3RoKVxuICAgICAgICAgIHF1ZXVlLnB1c2goYWRkLnNoaWZ0KCkpXG4gICAgICB9XG5cbiAgICAgIGlmKHF1ZXVlLmxlbmd0aCkgY2IobnVsbCwgcXVldWUuc2hpZnQoKSlcbiAgICAgIGVsc2UgaWYoZW5kZWQpICAgY2IoZW5kZWQpXG4gICAgICBlbHNlICAgICAgICAgICAgIHJlYWQobnVsbCwgbmV4dClcbiAgICB9KVxuICB9XG59XG5cbiIsInZhciBwdWxsID0gcmVxdWlyZSgncHVsbC1zdHJlYW0nKVxuXG5mdW5jdGlvbiByYXRlIChzKSB7XG4gIHZhciByZWNlbnQgPSBbXVxuICB2YXIgc3RyZWFtID0gcHVsbC50aHJvdWdoKGZ1bmN0aW9uIChkKSB7XG4gICAgc3RyZWFtLnRzID0gRGF0ZS5ub3coKVxuICAgIHJlY2VudC5wdXNoKHtzaXplOiBkLmxlbmd0aCwgdHM6IHN0cmVhbS50c30pXG4gICAgaWYocmVjZW50Lmxlbmd0aCA+IDUpXG4gICAgICByZWNlbnQuc2hpZnQoKVxuXG4gIH0pXG5cbiAgc3RyZWFtLnRzID0gRGF0ZS5ub3coKVxuXG4gIHN0cmVhbS5yYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0cyA9IERhdGUubm93KClcbiAgICBpZihyZWNlbnQubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIHJhdGUgPSAocmVjZW50LnJlZHVjZShmdW5jdGlvbiAoc2l6ZSwgaXRlbSkge1xuICAgICAgICByZXR1cm4gc2l6ZSArIGl0ZW0uc2l6ZVxuICAgICAgfSwgMCkvMTAwMDAwMCkgLyAoKHRzIC0gcmVjZW50WzBdLnRzKS8xMDAwKVxuXG4gICAgICByZXR1cm4gcmF0ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHJlYW1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByYXRlXG4iLCJ2YXIgcHVsbCAgICAgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgdG9QdWxsICAgPSByZXF1aXJlKCdzdHJlYW0tdG8tcHVsbC1zdHJlYW0nKVxudmFyIHB1c2hhYmxlID0gcmVxdWlyZSgncHVsbC1wdXNoYWJsZScpXG52YXIgY2F0ICAgICAgPSByZXF1aXJlKCdwdWxsLWNhdCcpXG52YXIgcHcgICAgICAgPSByZXF1aXJlKCdwdWxsLXdpbmRvdycpXG52YXIgcG9zdCAgICAgPSByZXF1aXJlKCdsZXZlbC1wb3N0JylcblxuZnVuY3Rpb24gcmVhZChkYiwgb3B0cykge1xuICByZXR1cm4gdG9QdWxsLnJlYWQxKGRiLmNyZWF0ZVJlYWRTdHJlYW0ob3B0cykpXG59XG5cbnZhciBsaXZlID1cbmV4cG9ydHMubGl2ZSA9XG5mdW5jdGlvbiAoZGIsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cblxuICB2YXIgbCA9IHB1c2hhYmxlKClcblxuICB2YXIgY2xlYW51cCA9IHBvc3QoZGIsIG9wdHMsIGZ1bmN0aW9uIChjaCkge1xuICAgIGlmKG9wdHMua2V5cyA9PT0gZmFsc2UpXG4gICAgICBsLnB1c2goY2gudmFsdWUpXG4gICAgZWxzZSBpZihvcHRzLnZhbHVlcyA9PT0gZmFsc2UpXG4gICAgICBsLnB1c2goY2gua2V5KVxuICAgIGVsc2VcbiAgICAgIGwucHVzaChjaClcbiAgfSlcblxuICByZXR1cm4gcHVsbChsLCBwdWxsLnRocm91Z2gobnVsbCwgY2xlYW51cCkpXG5cbn1cblxuZXhwb3J0cy5yZWFkID1cbmV4cG9ydHMucmVhZFN0cmVhbSA9XG5leHBvcnRzLmNyZWF0ZVJlYWRTdHJlYW0gPSBmdW5jdGlvbiAoZGIsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgaWYoIShvcHRzLnRhaWwgfHwgb3B0cy5saXZlKSlcbiAgICByZXR1cm4gcmVhZChkYiwgb3B0cylcblxuICAvL29wdGlvbmFsbHkgbm90aWZ5IHdoZW4gd2Ugc3dpdGNoIGZyb20gcmVhZGluZyBoaXN0b3J5IHRvIHJlYWx0aW1lXG4gIHZhciBzeW5jID0gb3B0cy5vblN5bmMgJiYgZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgICAgb3B0cy5vblN5bmMoYWJvcnQpOyBjYihhYm9ydCB8fCB0cnVlKVxuICAgIH1cblxuICByZXR1cm4gY2F0KFtyZWFkKGRiLCBvcHRzKSwgc3luYywgbGl2ZShkYiwgb3B0cyldKVxufVxuXG5leHBvcnRzLndyaXRlID1cbmV4cG9ydHMud3JpdGVTdHJlYW0gPVxuZXhwb3J0cy5jcmVhdGVXcml0ZVN0cmVhbSA9IGZ1bmN0aW9uIChkYiwgb3B0cywgZG9uZSkge1xuICBpZignZnVuY3Rpb24nID09PSB0eXBlb2Ygb3B0cylcbiAgICBkb25lID0gb3B0cywgb3B0cyA9IG51bGxcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgcmV0dXJuIHB1bGwoXG4gICAgcHVsbC5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmKGUudHlwZSkgcmV0dXJuIGVcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleSAgIDogZS5rZXksIFxuICAgICAgICB2YWx1ZSA6IGUudmFsdWUsXG4gICAgICAgIHR5cGUgIDogZS52YWx1ZSA9PSBudWxsID8gJ2RlbCcgOiAncHV0J1xuICAgICAgfVxuICAgIH0pLFxuICAgIHB3LnJlY2VudChvcHRzLndpbmRvd1NpemUsIG9wdHMud2luZG93VGltZSksXG4gICAgcHVsbC5hc3luY01hcChmdW5jdGlvbiAoYmF0Y2gsIGNiKSB7XG4gICAgICBkYi5iYXRjaChiYXRjaCwgY2IpXG4gICAgfSksXG4gICAgcHVsbC5kcmFpbihudWxsLCBkb25lKVxuICApXG59XG5cbiIsImV4cG9ydHMuaWQgPSBcbmZ1bmN0aW9uIChpdGVtKSB7XG4gIHJldHVybiBpdGVtXG59XG5cbmV4cG9ydHMucHJvcCA9IFxuZnVuY3Rpb24gKG1hcCkgeyAgXG4gIGlmKCdzdHJpbmcnID09IHR5cGVvZiBtYXApIHtcbiAgICB2YXIga2V5ID0gbWFwXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhW2tleV0gfVxuICB9XG4gIHJldHVybiBtYXBcbn1cblxuZXhwb3J0cy50ZXN0ZXIgPSBmdW5jdGlvbiAodGVzdCkge1xuICBpZighdGVzdCkgcmV0dXJuIGV4cG9ydHMuaWRcbiAgaWYoJ29iamVjdCcgPT09IHR5cGVvZiB0ZXN0XG4gICAgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRlc3QudGVzdClcbiAgICAgIHJldHVybiB0ZXN0LnRlc3QuYmluZCh0ZXN0KVxuICByZXR1cm4gZXhwb3J0cy5wcm9wKHRlc3QpIHx8IGV4cG9ydHMuaWRcbn1cblxuZXhwb3J0cy5hZGRQaXBlID0gYWRkUGlwZVxuXG5mdW5jdGlvbiBhZGRQaXBlKHJlYWQpIHtcbiAgaWYoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHJlYWQpXG4gICAgcmV0dXJuIHJlYWRcblxuICByZWFkLnBpcGUgPSByZWFkLnBpcGUgfHwgZnVuY3Rpb24gKHJlYWRlcikge1xuICAgIGlmKCdmdW5jdGlvbicgIT0gdHlwZW9mIHJlYWRlcilcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwaXBlIHRvIHJlYWRlcicpXG4gICAgcmV0dXJuIGFkZFBpcGUocmVhZGVyKHJlYWQpKVxuICB9XG4gIHJlYWQudHlwZSA9ICdTb3VyY2UnXG4gIHJldHVybiByZWFkXG59XG5cbnZhciBTb3VyY2UgPVxuZXhwb3J0cy5Tb3VyY2UgPVxuZnVuY3Rpb24gU291cmNlIChjcmVhdGVSZWFkKSB7XG4gIGZ1bmN0aW9uIHMoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICByZXR1cm4gYWRkUGlwZShjcmVhdGVSZWFkLmFwcGx5KG51bGwsIGFyZ3MpKVxuICB9XG4gIHMudHlwZSA9ICdTb3VyY2UnXG4gIHJldHVybiBzXG59XG5cblxudmFyIFRocm91Z2ggPVxuZXhwb3J0cy5UaHJvdWdoID0gXG5mdW5jdGlvbiAoY3JlYXRlUmVhZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgdmFyIHBpcGVkID0gW11cbiAgICBmdW5jdGlvbiByZWFkZXIgKHJlYWQpIHtcbiAgICAgIGFyZ3MudW5zaGlmdChyZWFkKVxuICAgICAgcmVhZCA9IGNyZWF0ZVJlYWQuYXBwbHkobnVsbCwgYXJncylcbiAgICAgIHdoaWxlKHBpcGVkLmxlbmd0aClcbiAgICAgICAgcmVhZCA9IHBpcGVkLnNoaWZ0KCkocmVhZClcbiAgICAgIHJldHVybiByZWFkXG4gICAgICAvL3BpcGVpbmcgdG8gZnJvbSB0aGlzIHJlYWRlciBzaG91bGQgY29tcG9zZS4uLlxuICAgIH1cbiAgICByZWFkZXIucGlwZSA9IGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgICBwaXBlZC5wdXNoKHJlYWQpIFxuICAgICAgaWYocmVhZC50eXBlID09PSAnU291cmNlJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgcGlwZSAnICsgcmVhZGVyLnR5cGUgKyAnIHRvIFNvdXJjZScpXG4gICAgICByZWFkZXIudHlwZSA9IHJlYWQudHlwZSA9PT0gJ1NpbmsnID8gJ1NpbmsnIDogJ1Rocm91Z2gnXG4gICAgICByZXR1cm4gcmVhZGVyXG4gICAgfVxuICAgIHJlYWRlci50eXBlID0gJ1Rocm91Z2gnXG4gICAgcmV0dXJuIHJlYWRlclxuICB9XG59XG5cbnZhciBTaW5rID1cbmV4cG9ydHMuU2luayA9IFxuZnVuY3Rpb24gU2luayhjcmVhdGVSZWFkZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgIGlmKCFjcmVhdGVSZWFkZXIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgYmUgY3JlYXRlUmVhZGVyIGZ1bmN0aW9uJylcbiAgICBmdW5jdGlvbiBzIChyZWFkKSB7XG4gICAgICBhcmdzLnVuc2hpZnQocmVhZClcbiAgICAgIHJldHVybiBjcmVhdGVSZWFkZXIuYXBwbHkobnVsbCwgYXJncylcbiAgICB9XG4gICAgcy50eXBlID0gJ1NpbmsnXG4gICAgcmV0dXJuIHNcbiAgfVxufVxuXG5cbmV4cG9ydHMubWF5YmVTaW5rID0gXG5leHBvcnRzLm1heWJlRHJhaW4gPSBcbmZ1bmN0aW9uIChjcmVhdGVTaW5rLCBjYikge1xuICBpZighY2IpXG4gICAgcmV0dXJuIFRocm91Z2goZnVuY3Rpb24gKHJlYWQpIHtcbiAgICAgIHZhciBlbmRlZFxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjbG9zZSwgY2IpIHtcbiAgICAgICAgaWYoY2xvc2UpIHJldHVybiByZWFkKGNsb3NlLCBjYilcbiAgICAgICAgaWYoZW5kZWQpIHJldHVybiBjYihlbmRlZClcblxuICAgICAgICBjcmVhdGVTaW5rKGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgICBlbmRlZCA9IGVyciB8fCB0cnVlXG4gICAgICAgICAgaWYoIWVycikgY2IobnVsbCwgZGF0YSlcbiAgICAgICAgICBlbHNlICAgICBjYihlbmRlZClcbiAgICAgICAgfSkgKHJlYWQpXG4gICAgICB9XG4gICAgfSkoKVxuXG4gIHJldHVybiBTaW5rKGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVNpbmsoY2IpIChyZWFkKVxuICB9KSgpXG59XG5cbiIsInZhciBwdWxsID0gcmVxdWlyZSgncHVsbC1zdHJlYW0nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHB1bGwuU291cmNlKGZ1bmN0aW9uIChvbkNsb3NlKSB7XG4gIHZhciBidWZmZXIgPSBbXSwgY2JzID0gW10sIHdhaXRpbmcgPSBbXSwgZW5kZWRcblxuICBmdW5jdGlvbiBkcmFpbigpIHtcbiAgICB2YXIgbFxuICAgIHdoaWxlKHdhaXRpbmcubGVuZ3RoICYmICgobCA9IGJ1ZmZlci5sZW5ndGgpIHx8IGVuZGVkKSkge1xuICAgICAgdmFyIGRhdGEgPSBidWZmZXIuc2hpZnQoKVxuICAgICAgdmFyIGNiICAgPSBjYnMuc2hpZnQoKVxuICAgICAgd2FpdGluZy5zaGlmdCgpKGwgPyBudWxsIDogZW5kZWQsIGRhdGEpXG4gICAgICBjYiAmJiBjYihlbmRlZCA9PT0gdHJ1ZSA/IG51bGwgOiBlbmRlZClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChlbmQsIGNiKSB7XG4gICAgZW5kZWQgPSBlbmRlZCB8fCBlbmRcbiAgICB3YWl0aW5nLnB1c2goY2IpXG4gICAgZHJhaW4oKVxuICAgIGlmKGVuZGVkKVxuICAgICAgb25DbG9zZSAmJiBvbkNsb3NlKGVuZGVkID09PSB0cnVlID8gbnVsbCA6IGVuZGVkKVxuICB9XG5cbiAgcmVhZC5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIGNiKSB7XG4gICAgaWYoZW5kZWQpXG4gICAgICByZXR1cm4gY2IgJiYgY2IoZW5kZWQgPT09IHRydWUgPyBudWxsIDogZW5kZWQpXG4gICAgYnVmZmVyLnB1c2goZGF0YSk7IGNicy5wdXNoKGNiKVxuICAgIGRyYWluKClcbiAgfVxuXG4gIHJlYWQuZW5kID0gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZignZnVuY3Rpb24nID09PSB0eXBlb2YgZW5kKVxuICAgICAgY2IgPSBlbmQsIGVuZCA9IHRydWVcbiAgICBlbmRlZCA9IGVuZGVkIHx8IGVuZCB8fCB0cnVlO1xuICAgIGlmKGNiKSBjYnMucHVzaChjYilcbiAgICBkcmFpbigpXG4gICAgaWYoZW5kZWQpXG4gICAgICBvbkNsb3NlICYmIG9uQ2xvc2UoZW5kZWQgPT09IHRydWUgPyBudWxsIDogZW5kZWQpXG4gIH1cblxuICByZXR1cm4gcmVhZFxufSlcblxuIiwiXG52YXIgc291cmNlcyAgPSByZXF1aXJlKCcuL3NvdXJjZXMnKVxudmFyIHNpbmtzICAgID0gcmVxdWlyZSgnLi9zaW5rcycpXG52YXIgdGhyb3VnaHMgPSByZXF1aXJlKCcuL3Rocm91Z2hzJylcbnZhciB1ICAgICAgICA9IHJlcXVpcmUoJ3B1bGwtY29yZScpXG5cbmZvcih2YXIgayBpbiBzb3VyY2VzKVxuICBleHBvcnRzW2tdID0gdS5Tb3VyY2Uoc291cmNlc1trXSlcblxuZm9yKHZhciBrIGluIHRocm91Z2hzKVxuICBleHBvcnRzW2tdID0gdS5UaHJvdWdoKHRocm91Z2hzW2tdKVxuXG5mb3IodmFyIGsgaW4gc2lua3MpXG4gIGV4cG9ydHNba10gPSB1LlNpbmsoc2lua3Nba10pXG5cbnZhciBtYXliZSA9IHJlcXVpcmUoJy4vbWF5YmUnKShleHBvcnRzKVxuXG5mb3IodmFyIGsgaW4gbWF5YmUpXG4gIGV4cG9ydHNba10gPSBtYXliZVtrXVxuXG5leHBvcnRzLkR1cGxleCAgPSBcbmV4cG9ydHMuVGhyb3VnaCA9IGV4cG9ydHMucGlwZWFibGUgICAgICAgPSB1LlRocm91Z2hcbmV4cG9ydHMuU291cmNlICA9IGV4cG9ydHMucGlwZWFibGVTb3VyY2UgPSB1LlNvdXJjZVxuZXhwb3J0cy5TaW5rICAgID0gZXhwb3J0cy5waXBlYWJsZVNpbmsgICA9IHUuU2lua1xuXG5cbiIsInZhciB1ID0gcmVxdWlyZSgncHVsbC1jb3JlJylcbnZhciBwcm9wID0gdS5wcm9wXG52YXIgaWQgICA9IHUuaWRcbnZhciBtYXliZVNpbmsgPSB1Lm1heWJlU2lua1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwdWxsKSB7XG5cbiAgdmFyIGV4cG9ydHMgPSB7fVxuICB2YXIgZHJhaW4gPSBwdWxsLmRyYWluXG5cbiAgdmFyIGZpbmQgPSBcbiAgZXhwb3J0cy5maW5kID0gZnVuY3Rpb24gKHRlc3QsIGNiKSB7XG4gICAgcmV0dXJuIG1heWJlU2luayhmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHZhciBlbmRlZCA9IGZhbHNlXG4gICAgICBpZighY2IpXG4gICAgICAgIGNiID0gdGVzdCwgdGVzdCA9IGlkXG4gICAgICBlbHNlXG4gICAgICAgIHRlc3QgPSBwcm9wKHRlc3QpIHx8IGlkXG5cbiAgICAgIHJldHVybiBkcmFpbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZih0ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgICAgY2IobnVsbCwgZGF0YSlcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYoZW5kZWQpIHJldHVybiAvL2FscmVhZHkgY2FsbGVkIGJhY2tcbiAgICAgICAgY2IoZXJyID09PSB0cnVlID8gbnVsbCA6IGVyciwgbnVsbClcbiAgICAgIH0pXG5cbiAgICB9LCBjYilcbiAgfVxuXG4gIHZhciByZWR1Y2UgPSBleHBvcnRzLnJlZHVjZSA9IFxuICBmdW5jdGlvbiAocmVkdWNlLCBhY2MsIGNiKSB7XG4gICAgXG4gICAgcmV0dXJuIG1heWJlU2luayhmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHJldHVybiBkcmFpbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBhY2MgPSByZWR1Y2UoYWNjLCBkYXRhKVxuICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBjYihlcnIsIGFjYylcbiAgICAgIH0pXG5cbiAgICB9LCBjYilcbiAgfVxuXG4gIHZhciBjb2xsZWN0ID0gZXhwb3J0cy5jb2xsZWN0ID0gZXhwb3J0cy53cml0ZUFycmF5ID1cbiAgZnVuY3Rpb24gKGNiKSB7XG4gICAgcmV0dXJuIHJlZHVjZShmdW5jdGlvbiAoYXJyLCBpdGVtKSB7XG4gICAgICBhcnIucHVzaChpdGVtKVxuICAgICAgcmV0dXJuIGFyclxuICAgIH0sIFtdLCBjYilcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzXG59XG4iLCJ2YXIgZHJhaW4gPSBleHBvcnRzLmRyYWluID0gZnVuY3Rpb24gKHJlYWQsIG9wLCBkb25lKSB7XG5cbiAgOyhmdW5jdGlvbiBuZXh0KCkge1xuICAgIHZhciBsb29wID0gdHJ1ZSwgY2JlZCA9IGZhbHNlXG4gICAgd2hpbGUobG9vcCkge1xuICAgICAgY2JlZCA9IGZhbHNlXG4gICAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgY2JlZCA9IHRydWVcbiAgICAgICAgaWYoZW5kKSB7XG4gICAgICAgICAgbG9vcCA9IGZhbHNlXG4gICAgICAgICAgZG9uZSAmJiBkb25lKGVuZCA9PT0gdHJ1ZSA/IG51bGwgOiBlbmQpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihvcCAmJiBmYWxzZSA9PT0gb3AoZGF0YSkpIHtcbiAgICAgICAgICBsb29wID0gZmFsc2VcbiAgICAgICAgICByZWFkKHRydWUsIGRvbmUgfHwgZnVuY3Rpb24gKCkge30pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZighbG9vcCl7XG4gICAgICAgICAgbmV4dCgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZighY2JlZCkge1xuICAgICAgICBsb29wID0gZmFsc2VcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICB9KSgpXG59XG5cbnZhciBvbkVuZCA9IGV4cG9ydHMub25FbmQgPSBmdW5jdGlvbiAocmVhZCwgZG9uZSkge1xuICByZXR1cm4gZHJhaW4ocmVhZCwgbnVsbCwgZG9uZSlcbn1cblxudmFyIGxvZyA9IGV4cG9ydHMubG9nID0gZnVuY3Rpb24gKHJlYWQsIGRvbmUpIHtcbiAgcmV0dXJuIGRyYWluKHJlYWQsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgY29uc29sZS5sb2coZGF0YSlcbiAgfSwgZG9uZSlcbn1cblxuIiwiXG52YXIga2V5cyA9IGV4cG9ydHMua2V5cyA9XG5mdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB2YWx1ZXMoT2JqZWN0LmtleXMob2JqZWN0KSlcbn1cblxudmFyIG9uY2UgPSBleHBvcnRzLm9uY2UgPVxuZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoYWJvcnQpIHJldHVybiBjYihhYm9ydClcbiAgICBpZih2YWx1ZSAhPSBudWxsKSB7XG4gICAgICB2YXIgX3ZhbHVlID0gdmFsdWU7IHZhbHVlID0gbnVsbFxuICAgICAgY2IobnVsbCwgX3ZhbHVlKVxuICAgIH0gZWxzZVxuICAgICAgY2IodHJ1ZSlcbiAgfVxufVxuXG52YXIgdmFsdWVzID0gZXhwb3J0cy52YWx1ZXMgPSBleHBvcnRzLnJlYWRBcnJheSA9XG5mdW5jdGlvbiAoYXJyYXkpIHtcbiAgaWYoIUFycmF5LmlzQXJyYXkoYXJyYXkpKVxuICAgIGFycmF5ID0gT2JqZWN0LmtleXMoYXJyYXkpLm1hcChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIGFycmF5W2tdXG4gICAgfSlcbiAgdmFyIGkgPSAwXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZClcbiAgICAgIHJldHVybiBjYiAmJiBjYihlbmQpICBcbiAgICBjYihpID49IGFycmF5Lmxlbmd0aCB8fCBudWxsLCBhcnJheVtpKytdKVxuICB9XG59XG5cblxudmFyIGNvdW50ID0gZXhwb3J0cy5jb3VudCA9IFxuZnVuY3Rpb24gKG1heCkge1xuICB2YXIgaSA9IDA7IG1heCA9IG1heCB8fCBJbmZpbml0eVxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiBjYiAmJiBjYihlbmQpXG4gICAgaWYoaSA+IG1heClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIGNiKG51bGwsIGkrKylcbiAgfVxufVxuXG52YXIgaW5maW5pdGUgPSBleHBvcnRzLmluZmluaXRlID0gXG5mdW5jdGlvbiAoZ2VuZXJhdGUpIHtcbiAgZ2VuZXJhdGUgPSBnZW5lcmF0ZSB8fCBNYXRoLnJhbmRvbVxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiBjYiAmJiBjYihlbmQpXG4gICAgcmV0dXJuIGNiKG51bGwsIGdlbmVyYXRlKCkpXG4gIH1cbn1cblxudmFyIGRlZmVyID0gZXhwb3J0cy5kZWZlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWFkLCBjYnMgPSBbXSwgX2VuZFxuXG4gIHZhciByZWFkID0gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZighX3JlYWQpIHtcbiAgICAgIF9lbmQgPSBlbmRcbiAgICAgIGNicy5wdXNoKGNiKVxuICAgIH0gXG4gICAgZWxzZSBfcmVhZChlbmQsIGNiKVxuICB9XG4gIHJlYWQucmVzb2x2ZSA9IGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgaWYoX3JlYWQpIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSByZXNvbHZlZCcpXG4gICAgX3JlYWQgPSByZWFkXG4gICAgaWYoIV9yZWFkKSB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlYWQgY2Fubm90IHJlc29sdmUhJyArIF9yZWFkKVxuICAgIHdoaWxlKGNicy5sZW5ndGgpXG4gICAgICBfcmVhZChfZW5kLCBjYnMuc2hpZnQoKSlcbiAgfVxuICByZWFkLmFib3J0ID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgcmVhZC5yZXNvbHZlKGZ1bmN0aW9uIChfLCBjYikge1xuICAgICAgY2IoZXJyIHx8IHRydWUpXG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVhZFxufVxuXG52YXIgZW1wdHkgPSBleHBvcnRzLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGNiKHRydWUpXG4gIH1cbn1cblxudmFyIGRlcHRoRmlyc3QgPSBleHBvcnRzLmRlcHRoRmlyc3QgPVxuZnVuY3Rpb24gKHN0YXJ0LCBjcmVhdGVTdHJlYW0pIHtcbiAgdmFyIHJlYWRzID0gW11cblxuICByZWFkcy51bnNoaWZ0KG9uY2Uoc3RhcnQpKVxuXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgaWYoIXJlYWRzLmxlbmd0aClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIHJlYWRzWzBdKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSB7XG4gICAgICAgIC8vaWYgdGhpcyBzdHJlYW0gaGFzIGVuZGVkLCBnbyB0byB0aGUgbmV4dCBxdWV1ZVxuICAgICAgICByZWFkcy5zaGlmdCgpXG4gICAgICAgIHJldHVybiBuZXh0KG51bGwsIGNiKVxuICAgICAgfVxuICAgICAgcmVhZHMudW5zaGlmdChjcmVhdGVTdHJlYW0oZGF0YSkpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuLy93aWR0aCBmaXJzdCBpcyBqdXN0IGxpa2UgZGVwdGggZmlyc3QsXG4vL2J1dCBwdXNoIGVhY2ggbmV3IHN0cmVhbSBvbnRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXG52YXIgd2lkdGhGaXJzdCA9IGV4cG9ydHMud2lkdGhGaXJzdCA9IFxuZnVuY3Rpb24gKHN0YXJ0LCBjcmVhdGVTdHJlYW0pIHtcbiAgdmFyIHJlYWRzID0gW11cblxuICByZWFkcy5wdXNoKG9uY2Uoc3RhcnQpKVxuXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgaWYoIXJlYWRzLmxlbmd0aClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIHJlYWRzWzBdKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSB7XG4gICAgICAgIHJlYWRzLnNoaWZ0KClcbiAgICAgICAgcmV0dXJuIG5leHQobnVsbCwgY2IpXG4gICAgICB9XG4gICAgICByZWFkcy5wdXNoKGNyZWF0ZVN0cmVhbShkYXRhKSlcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbi8vdGhpcyBjYW1lIG91dCBkaWZmZXJlbnQgdG8gdGhlIGZpcnN0IChzdHJtKVxuLy9hdHRlbXB0IGF0IGxlYWZGaXJzdCwgYnV0IGl0J3Mgc3RpbGwgYSB2YWxpZFxuLy90b3BvbG9naWNhbCBzb3J0LlxudmFyIGxlYWZGaXJzdCA9IGV4cG9ydHMubGVhZkZpcnN0ID0gXG5mdW5jdGlvbiAoc3RhcnQsIGNyZWF0ZVN0cmVhbSkge1xuICB2YXIgcmVhZHMgPSBbXVxuICB2YXIgb3V0cHV0ID0gW11cbiAgcmVhZHMucHVzaChvbmNlKHN0YXJ0KSlcbiAgXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgcmVhZHNbMF0oZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHtcbiAgICAgICAgcmVhZHMuc2hpZnQoKVxuICAgICAgICBpZighb3V0cHV0Lmxlbmd0aClcbiAgICAgICAgICByZXR1cm4gY2IodHJ1ZSlcbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIG91dHB1dC5zaGlmdCgpKVxuICAgICAgfVxuICAgICAgcmVhZHMudW5zaGlmdChjcmVhdGVTdHJlYW0oZGF0YSkpXG4gICAgICBvdXRwdXQudW5zaGlmdChkYXRhKVxuICAgICAgbmV4dChudWxsLCBjYilcbiAgICB9KVxuICB9XG59XG5cbiIsInZhciB1ICAgICAgPSByZXF1aXJlKCdwdWxsLWNvcmUnKVxudmFyIHNvdXJjZXMgPSByZXF1aXJlKCcuL3NvdXJjZXMnKVxudmFyIHNpbmtzID0gcmVxdWlyZSgnLi9zaW5rcycpXG5cbnZhciBwcm9wICAgPSB1LnByb3BcbnZhciBpZCAgICAgPSB1LmlkXG52YXIgdGVzdGVyID0gdS50ZXN0ZXJcblxudmFyIG1hcCA9IGV4cG9ydHMubWFwID0gXG5mdW5jdGlvbiAocmVhZCwgbWFwKSB7XG4gIG1hcCA9IHByb3AobWFwKSB8fCBpZFxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgdmFyIGRhdGEgPSAhZW5kID8gbWFwKGRhdGEpIDogbnVsbFxuICAgICAgY2IoZW5kLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGFzeW5jTWFwID0gZXhwb3J0cy5hc3luY01hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwKSB7XG4gIGlmKCFtYXApIHJldHVybiByZWFkXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kLCBjYikgLy9hYm9ydFxuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSByZXR1cm4gY2IoZW5kLCBkYXRhKVxuICAgICAgbWFwKGRhdGEsIGNiKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHBhcmFNYXAgPSBleHBvcnRzLnBhcmFNYXAgPVxuZnVuY3Rpb24gKHJlYWQsIG1hcCwgd2lkdGgpIHtcbiAgaWYoIW1hcCkgcmV0dXJuIHJlYWRcbiAgdmFyIGVuZGVkID0gZmFsc2UsIHF1ZXVlID0gW10sIF9jYlxuXG4gIGZ1bmN0aW9uIGRyYWluICgpIHtcbiAgICBpZighX2NiKSByZXR1cm5cbiAgICB2YXIgY2IgPSBfY2JcbiAgICBfY2IgPSBudWxsXG4gICAgaWYocXVldWUubGVuZ3RoKVxuICAgICAgcmV0dXJuIGNiKG51bGwsIHF1ZXVlLnNoaWZ0KCkpXG4gICAgZWxzZSBpZihlbmRlZCAmJiAhbilcbiAgICAgIHJldHVybiBjYihlbmRlZClcbiAgICBfY2IgPSBjYlxuICB9XG5cbiAgZnVuY3Rpb24gcHVsbCAoKSB7XG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHtcbiAgICAgICAgZW5kZWQgPSBlbmRcbiAgICAgICAgcmV0dXJuIGRyYWluKClcbiAgICAgIH1cbiAgICAgIG4rK1xuICAgICAgbWFwKGRhdGEsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgbi0tXG5cbiAgICAgICAgcXVldWUucHVzaChkYXRhKVxuICAgICAgICBkcmFpbigpXG4gICAgICB9KVxuXG4gICAgICBpZihuIDwgd2lkdGggJiYgIWVuZGVkKVxuICAgICAgICBwdWxsKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG4gPSAwXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kLCBjYikgLy9hYm9ydFxuICAgIC8vY29udGludWUgdG8gcmVhZCB3aGlsZSB0aGVyZSBhcmUgbGVzcyB0aGFuIDMgbWFwcyBpbiBmbGlnaHRcbiAgICBfY2IgPSBjYlxuICAgIGlmKHF1ZXVlLmxlbmd0aCB8fCBlbmRlZClcbiAgICAgIHB1bGwoKSwgZHJhaW4oKVxuICAgIGVsc2UgcHVsbCgpXG4gIH1cbiAgcmV0dXJuIGhpZ2hXYXRlck1hcmsoYXN5bmNNYXAocmVhZCwgbWFwKSwgd2lkdGgpXG59XG5cbnZhciBmaWx0ZXIgPSBleHBvcnRzLmZpbHRlciA9XG5mdW5jdGlvbiAocmVhZCwgdGVzdCkge1xuICAvL3JlZ2V4cFxuICB0ZXN0ID0gdGVzdGVyKHRlc3QpXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgcmVhZChlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKCFlbmQgJiYgIXRlc3QoZGF0YSkpXG4gICAgICAgIHJldHVybiBuZXh0KGVuZCwgY2IpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgZmlsdGVyTm90ID0gZXhwb3J0cy5maWx0ZXJOb3QgPVxuZnVuY3Rpb24gKHJlYWQsIHRlc3QpIHtcbiAgdGVzdCA9IHRlc3Rlcih0ZXN0KVxuICByZXR1cm4gZmlsdGVyKHJlYWQsIGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuICF0ZXN0KGUpXG4gIH0pXG59XG5cbnZhciB0aHJvdWdoID0gZXhwb3J0cy50aHJvdWdoID0gXG5mdW5jdGlvbiAocmVhZCwgb3AsIG9uRW5kKSB7XG4gIHZhciBhID0gZmFsc2VcbiAgZnVuY3Rpb24gb25jZSAoYWJvcnQpIHtcbiAgICBpZihhIHx8ICFvbkVuZCkgcmV0dXJuXG4gICAgYSA9IHRydWVcbiAgICBvbkVuZChhYm9ydCA9PT0gdHJ1ZSA/IG51bGwgOiBhYm9ydClcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgb25jZShlbmQpXG4gICAgcmV0dXJuIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZighZW5kKSBvcCAmJiBvcChkYXRhKVxuICAgICAgZWxzZSBvbmNlKGVuZClcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciB0YWtlID0gZXhwb3J0cy50YWtlID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHZhciBlbmRlZCA9IGZhbHNlXG4gIGlmKCdudW1iZXInID09PSB0eXBlb2YgdGVzdCkge1xuICAgIHZhciBuID0gdGVzdDsgdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuIC0tXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kZWQpIHJldHVybiBjYihlbmRlZClcbiAgICBpZihlbmRlZCA9IGVuZCkgcmV0dXJuIHJlYWQoZW5kZWQsIGNiKVxuXG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkgcmV0dXJuIGNiKGVuZGVkKVxuICAgICAgaWYoIXRlc3QoZGF0YSkpIHtcbiAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgIHJlYWQodHJ1ZSwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGNiKGVuZGVkLCBkYXRhKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBjYihudWxsLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHVuaXF1ZSA9IGV4cG9ydHMudW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkLCBpbnZlcnQpIHtcbiAgZmllbGQgPSBwcm9wKGZpZWxkKSB8fCBpZFxuICB2YXIgc2VlbiA9IHt9XG4gIHJldHVybiBmaWx0ZXIocmVhZCwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIga2V5ID0gZmllbGQoZGF0YSlcbiAgICBpZihzZWVuW2tleV0pIHJldHVybiAhIWludmVydCAvL2ZhbHNlLCBieSBkZWZhdWx0XG4gICAgZWxzZSBzZWVuW2tleV0gPSB0cnVlXG4gICAgcmV0dXJuICFpbnZlcnQgLy90cnVlIGJ5IGRlZmF1bHRcbiAgfSlcbn1cblxudmFyIG5vblVuaXF1ZSA9IGV4cG9ydHMubm9uVW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkKSB7XG4gIHJldHVybiB1bmlxdWUocmVhZCwgZmllbGQsIHRydWUpXG59XG5cbnZhciBncm91cCA9IGV4cG9ydHMuZ3JvdXAgPVxuZnVuY3Rpb24gKHJlYWQsIHNpemUpIHtcbiAgdmFyIGVuZGVkOyBzaXplID0gc2l6ZSB8fCA1XG4gIHZhciBxdWV1ZSA9IFtdXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgLy90aGlzIG1lYW5zIHRoYXQgdGhlIHVwc3RyZWFtIGlzIHNlbmRpbmcgYW4gZXJyb3IuXG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmRlZCA9IGVuZCwgY2IpXG4gICAgLy90aGlzIG1lYW5zIHRoYXQgd2UgcmVhZCBhbiBlbmQgYmVmb3JlLlxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIG5leHQoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkge1xuICAgICAgICBpZighcXVldWUubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiBjYihlbmRlZClcblxuICAgICAgICB2YXIgX3F1ZXVlID0gcXVldWU7IHF1ZXVlID0gW11cbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIF9xdWV1ZSlcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goZGF0YSlcbiAgICAgIGlmKHF1ZXVlLmxlbmd0aCA8IHNpemUpXG4gICAgICAgIHJldHVybiByZWFkKG51bGwsIG5leHQpXG5cbiAgICAgIHZhciBfcXVldWUgPSBxdWV1ZTsgcXVldWUgPSBbXVxuICAgICAgY2IobnVsbCwgX3F1ZXVlKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGZsYXR0ZW4gPSBleHBvcnRzLmZsYXR0ZW4gPSBmdW5jdGlvbiAocmVhZCkge1xuICB2YXIgX3JlYWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihfcmVhZCkgbmV4dENodW5rKClcbiAgICBlbHNlICAgICAgbmV4dFN0cmVhbSgpXG5cbiAgICBmdW5jdGlvbiBuZXh0Q2h1bmsgKCkge1xuICAgICAgX3JlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZihlbmQpIG5leHRTdHJlYW0oKVxuICAgICAgICBlbHNlICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgICBmdW5jdGlvbiBuZXh0U3RyZWFtICgpIHtcbiAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgc3RyZWFtKSB7XG4gICAgICAgIGlmKGVuZClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kKVxuICAgICAgICBpZihBcnJheS5pc0FycmF5KHN0cmVhbSkpXG4gICAgICAgICAgc3RyZWFtID0gc291cmNlcy52YWx1ZXMoc3RyZWFtKVxuICAgICAgICBlbHNlIGlmKCdmdW5jdGlvbicgIT0gdHlwZW9mIHN0cmVhbSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmVhbSBvZiBzdHJlYW1zJylcbiAgICAgICAgXG4gICAgICAgIF9yZWFkID0gc3RyZWFtXG4gICAgICAgIG5leHRDaHVuaygpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG52YXIgcHJlcGVuZCA9XG5leHBvcnRzLnByZXBlbmQgPVxuZnVuY3Rpb24gKHJlYWQsIGhlYWQpIHtcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGhlYWQgIT09IG51bGwpIHtcbiAgICAgIGlmKGFib3J0KVxuICAgICAgICByZXR1cm4gcmVhZChhYm9ydCwgY2IpXG4gICAgICB2YXIgX2hlYWQgPSBoZWFkXG4gICAgICBoZWFkID0gbnVsbFxuICAgICAgY2IobnVsbCwgX2hlYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWQoYWJvcnQsIGNiKVxuICAgIH1cbiAgfVxuXG59XG5cbi8vdmFyIGRyYWluSWYgPSBleHBvcnRzLmRyYWluSWYgPSBmdW5jdGlvbiAob3AsIGRvbmUpIHtcbi8vICBzaW5rcy5kcmFpbihcbi8vfVxuXG52YXIgX3JlZHVjZSA9IGV4cG9ydHMuX3JlZHVjZSA9IGZ1bmN0aW9uIChyZWFkLCByZWR1Y2UsIGluaXRpYWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjbG9zZSwgY2IpIHtcbiAgICBpZihjbG9zZSkgcmV0dXJuIHJlYWQoY2xvc2UsIGNiKVxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICBzaW5rcy5kcmFpbihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaW5pdGlhbCA9IHJlZHVjZShpbml0aWFsLCBpdGVtKVxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGVuZGVkID0gZXJyIHx8IHRydWVcbiAgICAgIGlmKCFlcnIpIGNiKG51bGwsIGluaXRpYWwpXG4gICAgICBlbHNlICAgICBjYihlbmRlZClcbiAgICB9KVxuICAgIChyZWFkKVxuICB9XG59XG5cbnZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2tcblxudmFyIGhpZ2hXYXRlck1hcmsgPSBleHBvcnRzLmhpZ2hXYXRlck1hcmsgPSBcbmZ1bmN0aW9uIChyZWFkLCBoaWdoV2F0ZXJNYXJrKSB7XG4gIHZhciBidWZmZXIgPSBbXSwgd2FpdGluZyA9IFtdLCBlbmRlZCwgcmVhZGluZyA9IGZhbHNlXG4gIGhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrIHx8IDEwXG5cbiAgZnVuY3Rpb24gcmVhZEFoZWFkICgpIHtcbiAgICB3aGlsZSh3YWl0aW5nLmxlbmd0aCAmJiAoYnVmZmVyLmxlbmd0aCB8fCBlbmRlZCkpXG4gICAgICB3YWl0aW5nLnNoaWZ0KCkoZW5kZWQsIGVuZGVkID8gbnVsbCA6IGJ1ZmZlci5zaGlmdCgpKVxuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgaWYoZW5kZWQgfHwgcmVhZGluZyB8fCBidWZmZXIubGVuZ3RoID49IGhpZ2hXYXRlck1hcmspXG4gICAgICByZXR1cm5cbiAgICByZWFkaW5nID0gdHJ1ZVxuICAgIHJldHVybiByZWFkKGVuZGVkLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICByZWFkaW5nID0gZmFsc2VcbiAgICAgIGVuZGVkID0gZW5kZWQgfHwgZW5kXG4gICAgICBpZihkYXRhICE9IG51bGwpIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgICBcbiAgICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgICB9KVxuICB9XG5cbiAgbmV4dFRpY2sobmV4dClcblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBlbmRlZCA9IGVuZGVkIHx8IGVuZFxuICAgIHdhaXRpbmcucHVzaChjYilcblxuICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgfVxufVxuXG5cblxuIiwidmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLWNvcmUnKVxuXG5mdW5jdGlvbiBkZXN0cm95KHN0cmVhbSwgY2IpIHtcbiAgZnVuY3Rpb24gb25DbG9zZSAoKSB7XG4gICAgY2xlYW51cCgpOyBjYigpXG4gIH1cbiAgZnVuY3Rpb24gb25FcnJvciAoZXJyKSB7XG4gICAgY2xlYW51cCgpOyBjYihlcnIpXG4gIH1cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25DbG9zZSlcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcilcbiAgfVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgb25DbG9zZSlcbiAgc3RyZWFtLm9uKCdlcnJvcicsIG9uRXJyb3IpXG59XG5cbmZ1bmN0aW9uIHdyaXRlKHJlYWQsIHN0cmVhbSkge1xuICB2YXIgZW5kZWRcbiAgZnVuY3Rpb24gb25DbG9zZSAoKSB7XG4gICAgY2xlYW51cCgpXG4gICAgaWYoIWVuZGVkKSByZWFkKGVuZGVkID0gdHJ1ZSwgZnVuY3Rpb24gKCkge30pXG4gIH1cbiAgZnVuY3Rpb24gb25FcnJvciAoZXJyKSB7XG4gICAgY2xlYW51cCgpXG4gICAgaWYoIWVuZGVkKSByZWFkKGVuZGVkID0gZXJyLCBmdW5jdGlvbiAoKSB7fSlcbiAgfVxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbkNsb3NlKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKVxuICB9XG4gIHN0cmVhbS5vbignY2xvc2UnLCBvbkNsb3NlKVxuICBzdHJlYW0ub24oJ2Vycm9yJywgb25FcnJvcilcbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBuZXh0KCkge1xuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kID09PSB0cnVlKVxuICAgICAgICByZXR1cm4gc3RyZWFtLl9pc1N0ZGlvIHx8IHN0cmVhbS5lbmQoKVxuICAgICAgaWYoZW5kZWQgPSBlbmRlZCB8fCBlbmQpXG4gICAgICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlbmQpXG5cbiAgICAgIHZhciBwYXVzZSA9IHN0cmVhbS53cml0ZShkYXRhKVxuICAgICAgaWYocGF1c2UgPT09IGZhbHNlKVxuICAgICAgICBzdHJlYW0ub25jZSgnZHJhaW4nLCBuZXh0KVxuICAgICAgZWxzZSBuZXh0KClcbiAgICB9KVxuICB9KVxufVxuXG5mdW5jdGlvbiBmaXJzdCAoZW1pdHRlciwgZXZlbnRzLCBoYW5kbGVyKSB7XG4gIGZ1bmN0aW9uIGxpc3RlbmVyICh2YWwpIHtcbiAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihlLCBsaXN0ZW5lcilcbiAgICB9KVxuICAgIGhhbmRsZXIodmFsKVxuICB9IFxuICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgIGVtaXR0ZXIub24oZSwgbGlzdGVuZXIpXG4gIH0pXG4gIHJldHVybiBlbWl0dGVyXG59XG5cbmZ1bmN0aW9uIHJlYWQyKHN0cmVhbSkge1xuICB2YXIgZW5kZWQgPSBmYWxzZSwgd2FpdGluZyA9IGZhbHNlXG4gIHZhciBfY2JcblxuICBmdW5jdGlvbiByZWFkICgpIHtcbiAgICB2YXIgZGF0YSA9IHN0cmVhbS5yZWFkKClcbiAgICBpZihkYXRhICE9PSBudWxsICYmIF9jYikge1xuICAgICAgdmFyIGNiID0gX2NiOyBfY2IgPSBudWxsXG4gICAgICBjYihudWxsLCBkYXRhKVxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgd2FpdGluZyA9IHRydWVcbiAgICBfY2IgJiYgcmVhZCgpXG4gIH0pXG4gIC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGVuZGVkID0gdHJ1ZVxuICAgIF9jYiAmJiBfY2IoZW5kZWQpXG4gIH0pXG4gIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgZW5kZWQgPSBlcnJcbiAgICBfY2IgJiYgX2NiKGVuZGVkKVxuICB9KVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIF9jYiA9IGNiXG4gICAgaWYoZW5kZWQpXG4gICAgICBjYihlbmRlZClcbiAgICBlbHNlIGlmKHdhaXRpbmcpXG4gICAgICByZWFkKClcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkMShzdHJlYW0pIHtcbiAgdmFyIGJ1ZmZlciA9IFtdLCBjYnMgPSBbXSwgZW5kZWQsIHBhdXNlZCA9IGZhbHNlXG5cbiAgdmFyIGRyYWluaW5nXG4gIGZ1bmN0aW9uIGRyYWluKCkge1xuICAgIHdoaWxlKChidWZmZXIubGVuZ3RoIHx8IGVuZGVkKSAmJiBjYnMubGVuZ3RoKVxuICAgICAgY2JzLnNoaWZ0KCkoYnVmZmVyLmxlbmd0aCA/IG51bGwgOiBlbmRlZCwgYnVmZmVyLnNoaWZ0KCkpXG4gICAgaWYoIWJ1ZmZlci5sZW5ndGggJiYgKHBhdXNlZCkpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlXG4gICAgICBzdHJlYW0ucmVzdW1lKClcbiAgICB9XG4gIH1cblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgZHJhaW4oKVxuICAgIGlmKGJ1ZmZlci5sZW5ndGggJiYgc3RyZWFtLnBhdXNlKSB7XG4gICAgICBwYXVzZWQgPSB0cnVlXG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cbiAgfSlcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZW5kZWQgPSB0cnVlXG4gICAgZHJhaW4oKVxuICB9KVxuICBzdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGVuZGVkID0gZXJyXG4gICAgZHJhaW4oKVxuICB9KVxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKCFjYikgdGhyb3cgbmV3IEVycm9yKCcqbXVzdCogcHJvdmlkZSBjYicpXG4gICAgaWYoYWJvcnQpIHtcbiAgICAgIHN0cmVhbS5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2IoYWJvcnQpXG4gICAgICB9KVxuICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgIH1cbiAgICBjYnMucHVzaChjYilcbiAgICBkcmFpbigpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZCAoc3RyZWFtKSB7XG4gIGlmKCdmdW5jdGlvbicgPT09IHR5cGVvZiBzdHJlYW0ucmVhZClcbiAgICByZXR1cm4gcmVhZDIoc3RyZWFtKVxuICByZXR1cm4gcmVhZDEoc3RyZWFtKVxufVxuXG52YXIgc2luayA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgcmV0dXJuIHB1bGwuU2luayhmdW5jdGlvbiAocmVhZCkge1xuICAgIHJldHVybiB3cml0ZShyZWFkLCBzdHJlYW0pXG4gIH0pKClcbn1cblxudmFyIHNvdXJjZSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgcmV0dXJuIHB1bGwuU291cmNlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlYWQoc3RyZWFtKSB9KSgpXG59XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgcmV0dXJuIChcbiAgICBzdHJlYW0ud3JpdGFibGVcbiAgICA/IHN0cmVhbS5yZWFkYWJsZVxuICAgICAgPyBwdWxsLlRocm91Z2goZnVuY3Rpb24oX3JlYWQpIHtcbiAgICAgICAgICB3cml0ZShfcmVhZCwgc3RyZWFtKTsgXG4gICAgICAgICAgcmV0dXJuIHJlYWQoc3RyZWFtKSBcbiAgICAgICAgfSkoKSAgXG4gICAgICA6IHNpbmsoc3RyZWFtKVxuICAgIDogc291cmNlKHN0cmVhbSlcbiAgKVxufVxuXG5leHBvcnRzLnNpbmsgPSBzaW5rXG5leHBvcnRzLnNvdXJjZSA9IHNvdXJjZVxuZXhwb3J0cy5yZWFkID0gcmVhZFxuZXhwb3J0cy5yZWFkMSA9IHJlYWQxXG5leHBvcnRzLnJlYWQyID0gcmVhZDJcblxuIiwiXG5cbi8qXG5hbGwgcHVsbCBzdHJlYW1zIGhhdmUgdGhlc2Ugc3RhdGVzOlxuXG57XG4gIFNUQVJUOiB7XG4gICAgcmVhZDogUkVBRElORyxcbiAgICBhYm9ydDogQUJPUlRJTkdcbiAgfSxcbiAgUkVBRFk6IHtcbiAgICByZWFkOiBSRUFESU5HLFxuICAgIGFib3J0OiBBQk9SVElOR1xuICB9LFxuICBSRUFESU5HOiB7XG4gICAgY2I6IFJFQURZLFxuICAgIGVycjogRVJST1IsXG4gICAgZW5kOiBFTkRcbiAgfSxcbiAgQUJPUlRJTkc6IHtcbiAgICBjYjogRU5EXG4gIH0sXG4gIEVSUk9SOiB7fSxcbiAgRU5EOiB7fVxufVxuXG50aGlzIG1vZHVsZSB0YWtlcyBhIGNvbGxlY3Rpb24gb2YgcHVsbC1zdHJlYW1zLFxuYW5kIGludGVybGVhdmVzIHRoZWlyIHN0YXRlcy5cbmlmIGFsbCB0aGUgc3RyZWFtcyBoYXZlIGVuZGVkLCBpdCBlbmRzLlxuSWYgaXQgaXMgaW4gcmVhZGluZyBzdGF0ZSwgYW5kIG9uZSBzdHJlYW0gZ29lcyBoYXMgUkVBRElORy0+Y2Jcbml0IGdvZXMgaW50byBSRUFEWVxuXG5vbiByZWFkLCB0cmlnZ2VyIHJlYWQgb24gZXZlcnkgc3RyZWFtIGluIFNUQVJUIG9yIFJFQURZXG5cbm9uIGFib3J0LCB0cmlnZ2VyIGFib3J0IG9uIGV2ZXJ5IHN0cmVhbSBpbiBTVEFSVCBvciBSRUFEWVxuXG5pZiBhIHN0cmVhbSBpcyBpbiBSRUFEWSwgYW5kIGJpZyBzdHJlYW0gaXMgaW4gQUJPUlQsXG50cmlnZ2VyIGFib3J0XG5cbmlmIGV2ZXJ5IHN0cmVhbSBpcyBpbiBFTkQgb3IgRVJST1IsIHRyaWdnZXIgZW5kIG9yIGVycm9yXG5cbmNvdWxkIHlvdSBkZXNjcmliZSB0aGlzIGRlY2xhcml0aXZlbHkgb3Igc29tZXRoaW5nP1xuKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJ5KSB7XG5cbiAgdmFyIGNhcHBlZCA9ICEhYXJ5XG4gIHZhciBpbnB1dHMgPSAoYXJ5IHx8IFtdKS5tYXAoY3JlYXRlKSwgaSA9IDAsIGFib3J0LCBjYlxuXG4gIGZ1bmN0aW9uIGNyZWF0ZSAoc3RyZWFtKSB7XG4gICAgcmV0dXJuIHtyZWFkeTogZmFsc2UsIHJlYWRpbmc6IGZhbHNlLCBlbmRlZDogZmFsc2UsIHJlYWQ6IHN0cmVhbSwgZGF0YTogbnVsbH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrICgpIHtcbiAgICBpZighY2IpIHJldHVyblxuICAgIGNsZWFuKClcbiAgICB2YXIgbCA9IGlucHV0cy5sZW5ndGhcbiAgICB2YXIgX2NiID0gY2JcbiAgICBpZihsID09PSAwICYmIChhYm9ydCB8fCBjYXBwZWQpKSB7XG4gICAgICBjYiA9IG51bGw7IF9jYihhYm9ydCB8fCAgdHJ1ZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vc2NhbiB0aGUgaW5wdXRzIHRvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgb25lIHdlIGNhbiB1c2UuXG4gICAgZm9yKHZhciBqID0gMDsgaiA8IGw7IGorKykge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpbnB1dHNbKGkgKyBqKSAlIGxdXG4gICAgICBpZihjdXJyZW50LnJlYWR5ICYmICFjdXJyZW50LmVuZGVkKSB7XG4gICAgICAgIHZhciBkYXRhID0gY3VycmVudC5kYXRhXG4gICAgICAgIGN1cnJlbnQucmVhZHkgPSBmYWxzZVxuICAgICAgICBjdXJyZW50LmRhdGEgPSBudWxsXG4gICAgICAgIGkgKys7IGNiID0gbnVsbFxuICAgICAgICByZXR1cm4gX2NiKG51bGwsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW4gKCkge1xuICAgIHZhciBsID0gaW5wdXRzLmxlbmd0aFxuICAgIC8vaXRlcmF0ZSBiYWNrd2FyZHMgc28gdGhhdCB3ZSBjYW4gcmVtb3ZlIGl0ZW1zLlxuICAgIHdoaWxlKGwtLSkge1xuICAgICAgaWYoaW5wdXRzW2xdLmVuZGVkKVxuICAgICAgICBpbnB1dHMuc3BsaWNlKGwsIDEpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgdmFyIGwgPSBpbnB1dHMubGVuZ3RoXG4gICAgd2hpbGUobC0tKVxuICAgICAgKGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgIC8vcmVhZCB0aGUgbmV4dCBpdGVtIGlmIHdlIGFyZW4ndCBhbHJlYWR5XG4gICAgICAgIGlmKGwgPiBpbnB1dHMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbicpXG4gICAgICAgIGlmKGN1cnJlbnQucmVhZGluZyB8fCBjdXJyZW50LmVuZGVkIHx8IGN1cnJlbnQucmVhZHkpIHJldHVyblxuICAgICAgICBjdXJyZW50LnJlYWRpbmcgPSB0cnVlXG4gICAgICAgIHZhciBzeW5jID0gdHJ1ZVxuICAgICAgICBjdXJyZW50LnJlYWQoYWJvcnQsIGZ1bmN0aW9uIG5leHQgKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGN1cnJlbnQuZGF0YSA9IGRhdGFcbiAgICAgICAgICBjdXJyZW50LnJlYWR5ID0gdHJ1ZVxuICAgICAgICAgIGN1cnJlbnQucmVhZGluZyA9IGZhbHNlXG5cbiAgICAgICAgICBpZihlbmQgPT09IHRydWUgfHwgYWJvcnQpIGN1cnJlbnQuZW5kZWQgPSB0cnVlXG4gICAgICAgICAgZWxzZSBpZihlbmQpIGFib3J0ID0gY3VycmVudC5lbmRlZCA9IGVuZFxuICAgICAgICAgIC8vY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGFib3J0IHRoaXMgc3RyZWFtLlxuICAgICAgICAgIGlmKGFib3J0ICYmICFlbmQpIGN1cnJlbnQucmVhZChhYm9ydCwgbmV4dClcbiAgICAgICAgICBpZighc3luYykgY2hlY2soKVxuICAgICAgICB9KVxuICAgICAgICBzeW5jID0gZmFsc2VcbiAgICAgIH0pKGlucHV0c1tsXSlcblxuICAgIC8vc2NhbiB0aGUgZmVlZFxuICAgIGNoZWNrKClcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKF9hYm9ydCwgX2NiKSB7XG4gICAgYWJvcnQgPSBhYm9ydCB8fCBfYWJvcnQ7IGNiID0gX2NiOyBuZXh0KClcbiAgfVxuXG4gIHJlYWQuYWRkID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgIGlmKCFzdHJlYW0pIHtcbiAgICAgIC8vdGhlIHN0cmVhbSB3aWxsIG5vdyBlbmQgd2hlbiBhbGwgdGhlIHN0cmVhbXMgZW5kLlxuICAgICAgY2FwcGVkID0gdHJ1ZVxuICAgICAgLy93ZSBqdXN0IGNoYW5nZWQgc3RhdGUsIHNvIHdlIG1heSBuZWVkIHRvIGNiXG4gICAgICByZXR1cm4gbmV4dCgpXG4gICAgfVxuICAgIGlucHV0cy5wdXNoKGNyZWF0ZShzdHJlYW0pKVxuICAgIG5leHQoKVxuICB9XG5cbiAgcmVhZC5jYXAgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgcmVhZC5hZGQobnVsbClcbiAgfVxuXG4gIHJldHVybiByZWFkXG59XG4iLCJ2YXIgdSAgICAgID0gcmVxdWlyZSgncHVsbC1jb3JlJylcbnZhciBzb3VyY2VzID0gcmVxdWlyZSgnLi9zb3VyY2VzJylcbnZhciBzaW5rcyA9IHJlcXVpcmUoJy4vc2lua3MnKVxuXG52YXIgcHJvcCAgID0gdS5wcm9wXG52YXIgaWQgICAgID0gdS5pZFxudmFyIHRlc3RlciA9IHUudGVzdGVyXG5cbnZhciBtYXAgPSBleHBvcnRzLm1hcCA9IFxuZnVuY3Rpb24gKHJlYWQsIG1hcCkge1xuICBtYXAgPSBwcm9wKG1hcCkgfHwgaWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgcmVhZChlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIHZhciBkYXRhID0gIWVuZCA/IG1hcChkYXRhKSA6IG51bGxcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciBhc3luY01hcCA9IGV4cG9ydHMuYXN5bmNNYXAgPVxuZnVuY3Rpb24gKHJlYWQsIG1hcCkge1xuICBpZighbWFwKSByZXR1cm4gcmVhZFxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiByZWFkKGVuZCwgY2IpIC8vYWJvcnRcbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkgcmV0dXJuIGNiKGVuZCwgZGF0YSlcbiAgICAgIG1hcChkYXRhLCBjYilcbiAgICB9KVxuICB9XG59XG5cbnZhciBwYXJhTWFwID0gZXhwb3J0cy5wYXJhTWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXAsIHdpZHRoKSB7XG4gIGlmKCFtYXApIHJldHVybiByZWFkXG4gIHZhciBlbmRlZCA9IGZhbHNlLCBxdWV1ZSA9IFtdLCBfY2JcblxuICBmdW5jdGlvbiBkcmFpbiAoKSB7XG4gICAgaWYoIV9jYikgcmV0dXJuXG4gICAgdmFyIGNiID0gX2NiXG4gICAgX2NiID0gbnVsbFxuICAgIGlmKHF1ZXVlLmxlbmd0aClcbiAgICAgIHJldHVybiBjYihudWxsLCBxdWV1ZS5zaGlmdCgpKVxuICAgIGVsc2UgaWYoZW5kZWQgJiYgIW4pXG4gICAgICByZXR1cm4gY2IoZW5kZWQpXG4gICAgX2NiID0gY2JcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1bGwgKCkge1xuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSB7XG4gICAgICAgIGVuZGVkID0gZW5kXG4gICAgICAgIHJldHVybiBkcmFpbigpXG4gICAgICB9XG4gICAgICBuKytcbiAgICAgIG1hcChkYXRhLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgIG4tLVxuXG4gICAgICAgIHF1ZXVlLnB1c2goZGF0YSlcbiAgICAgICAgZHJhaW4oKVxuICAgICAgfSlcblxuICAgICAgaWYobiA8IHdpZHRoICYmICFlbmRlZClcbiAgICAgICAgcHVsbCgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBuID0gMFxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiByZWFkKGVuZCwgY2IpIC8vYWJvcnRcbiAgICAvL2NvbnRpbnVlIHRvIHJlYWQgd2hpbGUgdGhlcmUgYXJlIGxlc3MgdGhhbiAzIG1hcHMgaW4gZmxpZ2h0XG4gICAgX2NiID0gY2JcbiAgICBpZihxdWV1ZS5sZW5ndGggfHwgZW5kZWQpXG4gICAgICBwdWxsKCksIGRyYWluKClcbiAgICBlbHNlIHB1bGwoKVxuICB9XG4gIHJldHVybiBoaWdoV2F0ZXJNYXJrKGFzeW5jTWFwKHJlYWQsIG1hcCksIHdpZHRoKVxufVxuXG52YXIgZmlsdGVyID0gZXhwb3J0cy5maWx0ZXIgPVxuZnVuY3Rpb24gKHJlYWQsIHRlc3QpIHtcbiAgLy9yZWdleHBcbiAgdGVzdCA9IHRlc3Rlcih0ZXN0KVxuICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoZW5kLCBjYikge1xuICAgIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZighZW5kICYmICF0ZXN0KGRhdGEpKVxuICAgICAgICByZXR1cm4gbmV4dChlbmQsIGNiKVxuICAgICAgY2IoZW5kLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGZpbHRlck5vdCA9IGV4cG9ydHMuZmlsdGVyTm90ID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZpbHRlcihyZWFkLCBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAhdGVzdChlKVxuICB9KVxufVxuXG52YXIgdGhyb3VnaCA9IGV4cG9ydHMudGhyb3VnaCA9IFxuZnVuY3Rpb24gKHJlYWQsIG9wLCBvbkVuZCkge1xuICB2YXIgYSA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uY2UgKGFib3J0KSB7XG4gICAgaWYoYSB8fCAhb25FbmQpIHJldHVyblxuICAgIGEgPSB0cnVlXG4gICAgb25FbmQoYWJvcnQgPT09IHRydWUgPyBudWxsIDogYWJvcnQpXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIG9uY2UoZW5kKVxuICAgIHJldHVybiByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoIWVuZCkgb3AgJiYgb3AoZGF0YSlcbiAgICAgIGVsc2Ugb25jZShlbmQpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgdGFrZSA9IGV4cG9ydHMudGFrZSA9XG5mdW5jdGlvbiAocmVhZCwgdGVzdCkge1xuICB2YXIgZW5kZWQgPSBmYWxzZVxuICBpZignbnVtYmVyJyA9PT0gdHlwZW9mIHRlc3QpIHtcbiAgICB2YXIgbiA9IHRlc3Q7IHRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbiAtLVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG4gICAgaWYoZW5kZWQgPSBlbmQpIHJldHVybiByZWFkKGVuZGVkLCBjYilcblxuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kZWQgPSBlbmRlZCB8fCBlbmQpIHJldHVybiBjYihlbmRlZClcbiAgICAgIGlmKCF0ZXN0KGRhdGEpKSB7XG4gICAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgICByZWFkKHRydWUsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgICBjYihlbmRlZCwgZGF0YSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgY2IobnVsbCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciB1bmlxdWUgPSBleHBvcnRzLnVuaXF1ZSA9IGZ1bmN0aW9uIChyZWFkLCBmaWVsZCwgaW52ZXJ0KSB7XG4gIGZpZWxkID0gcHJvcChmaWVsZCkgfHwgaWRcbiAgdmFyIHNlZW4gPSB7fVxuICByZXR1cm4gZmlsdGVyKHJlYWQsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGtleSA9IGZpZWxkKGRhdGEpXG4gICAgaWYoc2VlbltrZXldKSByZXR1cm4gISFpbnZlcnQgLy9mYWxzZSwgYnkgZGVmYXVsdFxuICAgIGVsc2Ugc2VlbltrZXldID0gdHJ1ZVxuICAgIHJldHVybiAhaW52ZXJ0IC8vdHJ1ZSBieSBkZWZhdWx0XG4gIH0pXG59XG5cbnZhciBub25VbmlxdWUgPSBleHBvcnRzLm5vblVuaXF1ZSA9IGZ1bmN0aW9uIChyZWFkLCBmaWVsZCkge1xuICByZXR1cm4gdW5pcXVlKHJlYWQsIGZpZWxkLCB0cnVlKVxufVxuXG52YXIgZ3JvdXAgPSBleHBvcnRzLmdyb3VwID1cbmZ1bmN0aW9uIChyZWFkLCBzaXplKSB7XG4gIHZhciBlbmRlZDsgc2l6ZSA9IHNpemUgfHwgNVxuICB2YXIgcXVldWUgPSBbXVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIC8vdGhpcyBtZWFucyB0aGF0IHRoZSB1cHN0cmVhbSBpcyBzZW5kaW5nIGFuIGVycm9yLlxuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kZWQgPSBlbmQsIGNiKVxuICAgIC8vdGhpcyBtZWFucyB0aGF0IHdlIHJlYWQgYW4gZW5kIGJlZm9yZS5cbiAgICBpZihlbmRlZCkgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiBuZXh0KGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kZWQgPSBlbmRlZCB8fCBlbmQpIHtcbiAgICAgICAgaWYoIXF1ZXVlLmxlbmd0aClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IHF1ZXVlOyBxdWV1ZSA9IFtdXG4gICAgICAgIHJldHVybiBjYihudWxsLCBfcXVldWUpXG4gICAgICB9XG4gICAgICBxdWV1ZS5wdXNoKGRhdGEpXG4gICAgICBpZihxdWV1ZS5sZW5ndGggPCBzaXplKVxuICAgICAgICByZXR1cm4gcmVhZChudWxsLCBuZXh0KVxuXG4gICAgICB2YXIgX3F1ZXVlID0gcXVldWU7IHF1ZXVlID0gW11cbiAgICAgIGNiKG51bGwsIF9xdWV1ZSlcbiAgICB9KVxuICB9XG59XG5cbnZhciBmbGF0dGVuID0gZXhwb3J0cy5mbGF0dGVuID0gZnVuY3Rpb24gKHJlYWQpIHtcbiAgdmFyIF9yZWFkXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoX3JlYWQpIG5leHRDaHVuaygpXG4gICAgZWxzZSAgICAgIG5leHRTdHJlYW0oKVxuXG4gICAgZnVuY3Rpb24gbmV4dENodW5rICgpIHtcbiAgICAgIF9yZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgaWYoZW5kKSBuZXh0U3RyZWFtKClcbiAgICAgICAgZWxzZSAgICBjYihudWxsLCBkYXRhKVxuICAgICAgfSlcbiAgICB9XG4gICAgZnVuY3Rpb24gbmV4dFN0cmVhbSAoKSB7XG4gICAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIHN0cmVhbSkge1xuICAgICAgICBpZihlbmQpXG4gICAgICAgICAgcmV0dXJuIGNiKGVuZClcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShzdHJlYW0pKVxuICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZXMudmFsdWVzKHN0cmVhbSlcbiAgICAgICAgZWxzZSBpZignZnVuY3Rpb24nICE9IHR5cGVvZiBzdHJlYW0pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJlYW0gb2Ygc3RyZWFtcycpXG4gICAgICAgIFxuICAgICAgICBfcmVhZCA9IHN0cmVhbVxuICAgICAgICBuZXh0Q2h1bmsoKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxudmFyIHByZXBlbmQgPVxuZXhwb3J0cy5wcmVwZW5kID1cbmZ1bmN0aW9uIChyZWFkLCBoZWFkKSB7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihoZWFkICE9PSBudWxsKSB7XG4gICAgICBpZihhYm9ydClcbiAgICAgICAgcmV0dXJuIHJlYWQoYWJvcnQsIGNiKVxuICAgICAgdmFyIF9oZWFkID0gaGVhZFxuICAgICAgaGVhZCA9IG51bGxcbiAgICAgIGNiKG51bGwsIF9oZWFkKVxuICAgIH0gZWxzZSB7XG4gICAgICByZWFkKGFib3J0LCBjYilcbiAgICB9XG4gIH1cblxufVxuXG4vL3ZhciBkcmFpbklmID0gZXhwb3J0cy5kcmFpbklmID0gZnVuY3Rpb24gKG9wLCBkb25lKSB7XG4vLyAgc2lua3MuZHJhaW4oXG4vL31cblxudmFyIF9yZWR1Y2UgPSBleHBvcnRzLl9yZWR1Y2UgPSBmdW5jdGlvbiAocmVhZCwgcmVkdWNlLCBpbml0aWFsKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoY2xvc2UsIGNiKSB7XG4gICAgaWYoY2xvc2UpIHJldHVybiByZWFkKGNsb3NlLCBjYilcbiAgICBpZihlbmRlZCkgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgc2lua3MuZHJhaW4oZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIGluaXRpYWwgPSByZWR1Y2UoaW5pdGlhbCwgaXRlbSlcbiAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBlbmRlZCA9IGVyciB8fCB0cnVlXG4gICAgICBpZighZXJyKSBjYihudWxsLCBpbml0aWFsKVxuICAgICAgZWxzZSAgICAgY2IoZW5kZWQpXG4gICAgfSlcbiAgICAocmVhZClcbiAgfVxufVxuXG52YXIgbmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrXG5cbnZhciBoaWdoV2F0ZXJNYXJrID0gZXhwb3J0cy5oaWdoV2F0ZXJNYXJrID0gXG5mdW5jdGlvbiAocmVhZCwgaGlnaFdhdGVyTWFyaykge1xuICB2YXIgYnVmZmVyID0gW10sIHdhaXRpbmcgPSBbXSwgZW5kZWQsIHJlYWRpbmcgPSBmYWxzZVxuICBoaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyayB8fCAxMFxuXG4gIGZ1bmN0aW9uIHJlYWRBaGVhZCAoKSB7XG4gICAgd2hpbGUod2FpdGluZy5sZW5ndGggJiYgKGJ1ZmZlci5sZW5ndGggfHwgZW5kZWQpKVxuICAgICAgd2FpdGluZy5zaGlmdCgpKGVuZGVkLCBlbmRlZCA/IG51bGwgOiBidWZmZXIuc2hpZnQoKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHQgKCkge1xuICAgIGlmKGVuZGVkIHx8IHJlYWRpbmcgfHwgYnVmZmVyLmxlbmd0aCA+PSBoaWdoV2F0ZXJNYXJrKVxuICAgICAgcmV0dXJuXG4gICAgcmVhZGluZyA9IHRydWVcbiAgICByZXR1cm4gcmVhZChlbmRlZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICBlbmRlZCA9IGVuZGVkIHx8IGVuZFxuICAgICAgaWYoZGF0YSAhPSBudWxsKSBidWZmZXIucHVzaChkYXRhKVxuICAgICAgXG4gICAgICBuZXh0KCk7IHJlYWRBaGVhZCgpXG4gICAgfSlcbiAgfVxuXG4gIG5leHRUaWNrKG5leHQpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgZW5kZWQgPSBlbmRlZCB8fCBlbmRcbiAgICB3YWl0aW5nLnB1c2goY2IpXG5cbiAgICBuZXh0KCk7IHJlYWRBaGVhZCgpXG4gIH1cbn1cblxuXG5cbiIsIid1c2Ugc3RyaWN0J1xuXG4vL2EgcGFpciBvZiBwdWxsIHN0cmVhbXMgd2hlcmUgb25lIGRyYWlucyBmcm9tIHRoZSBvdGhlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVhZCwgd2FpdGluZ1xuICBmdW5jdGlvbiBzaW5rIChyZWFkKSB7XG4gICAgaWYoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHJlYWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlYWQgbXVzdCBiZSBmdW5jdGlvbicpXG5cbiAgICBpZihfcmVhZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSBwaXBlZCcpXG4gICAgX3JlYWQgPSByZWFkXG4gICAgaWYod2FpdGluZykge1xuICAgICAgdmFyIF93YWl0aW5nID0gd2FpdGluZ1xuICAgICAgd2FpdGluZyA9IG51bGxcbiAgICAgIF9yZWFkLmFwcGx5KG51bGwsIF93YWl0aW5nKVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzb3VyY2UgKGFib3J0LCBjYikge1xuICAgIGlmKF9yZWFkKVxuICAgICAgX3JlYWQoYWJvcnQsIGNiKVxuICAgIGVsc2VcbiAgICAgIHdhaXRpbmcgPSBbYWJvcnQsIGNiXVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzb3VyY2U6IHNvdXJjZSwgc2luazogc2lua1xuICB9XG59XG5cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1hcCwgd2lkdGgpIHtcbiAgdmFyIHJlYWRpbmcgPSBmYWxzZSwgYWJvcnRcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgdmFyIGkgPSAwLCBqID0gMCwgbGFzdCA9IDBcbiAgICB2YXIgc2VlbiA9IFtdLCBzdGFydGVkID0gZmFsc2UsIGVuZGVkID0gZmFsc2UsIF9jYiwgZXJyb3JcblxuICAgIGZ1bmN0aW9uIGRyYWluICgpIHtcbiAgICAgIGlmKF9jYikge1xuICAgICAgICB2YXIgY2IgPSBfY2JcbiAgICAgICAgaWYoZXJyb3IpIHtcbiAgICAgICAgICBfY2IgPSBudWxsXG4gICAgICAgICAgcmV0dXJuIGNiKGVycm9yKVxuICAgICAgICB9XG4gICAgICAgIGlmKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlZW4sIGopKSB7XG4gICAgICAgICAgX2NiID0gbnVsbFxuICAgICAgICAgIHZhciBkYXRhID0gc2VlbltqXTsgZGVsZXRlIHNlZW5bal07IGorK1xuICAgICAgICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICAgICAgaWYod2lkdGgpIHN0YXJ0KClcbiAgICAgICAgfSBlbHNlIGlmKGogPj0gbGFzdCAmJiBlbmRlZCkge1xuICAgICAgICAgIF9jYiA9IG51bGxcbiAgICAgICAgICBjYih0cnVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RhcnQgKCkge1xuICAgICAgc3RhcnRlZCA9IHRydWVcbiAgICAgIGlmKGVuZGVkKSByZXR1cm4gZHJhaW4oKVxuICAgICAgaWYocmVhZGluZyB8fCB3aWR0aCAmJiAoaSAtIHdpZHRoID49IGopKSByZXR1cm5cbiAgICAgIHJlYWRpbmcgPSB0cnVlXG4gICAgICByZWFkKGFib3J0LCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgICBpZihlbmQpIHtcbiAgICAgICAgICBsYXN0ID0gaTsgZW5kZWQgPSBlbmRcbiAgICAgICAgICBkcmFpbigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGsgPSBpKytcblxuICAgICAgICAgIG1hcChkYXRhLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICBzZWVuW2tdID0gZGF0YVxuICAgICAgICAgICAgaWYoZXJyKSBlcnJvciA9IGVyclxuICAgICAgICAgICAgZHJhaW4oKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZighZW5kZWQpXG4gICAgICAgICAgICBzdGFydCgpXG5cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF9hYm9ydCwgY2IpIHtcbiAgICAgIGlmKF9hYm9ydCkge1xuICAgICAgICByZXR1cm4gcmVhZChlbmRlZCA9IGFib3J0ID0gX2Fib3J0LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaWYoX2NiKSByZXR1cm4gY2IoZXJyKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgX2NiID0gY2JcbiAgICAgIGlmKCFzdGFydGVkKSBzdGFydCgpXG4gICAgICBkcmFpbigpXG4gICAgfVxuICB9XG59XG5cbiIsInZhciBQdXNoYWJsZSA9IHJlcXVpcmUoJ3B1bGwtcHVzaGFibGUnKVxudmFyIFN0YXRzID0gcmVxdWlyZSgnc3RhdGlzdGljcycpXG52YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0cykge1xuICB2YXIgdGltZW91dCA9IG9wdHMgJiYgb3B0cy50aW1lb3V0IHx8IDUqNjAqMTAwMCAvL2RlZmF1bHQ6IDUgbWludXRlc1xuICB2YXIgc2VydmUgPSBmYWxzZSwgdGltZXJcbiAgdmFyIHNvdXJjZSA9IFB1c2hhYmxlKClcbiAgdmFyIHJ0dCA9IFN0YXRzKCksIHNrZXcgPSBTdGF0cygpXG5cbiAgZnVuY3Rpb24gcGluZyAoKSB7XG4gICAgLy9zZXJ2ZSB0aGUgcGluZyBwb25nLCBvcHBvbmVudFxuICAgIC8vd2lsbCB2b2xsZXkgaXQgYmFjayB0byB1cywga2VlcGluZyBjb25uZWN0aW9uIGFsaXZlXG4gICAgLy9hbmQgcmV2ZWFsaW5nIGNsb2NrIHNrZXcuXG4gICAgc2VydmUgPSB0cnVlXG4gICAgc291cmNlLnB1c2godHMgPSBEYXRlLm5vdygpKVxuICB9XG5cbiAgLy93ZSBzZW5kIHRoZSBmaXJzdCBwaW5nXG4gIGlmKG9wdHMgJiYgb3B0cy5zZXJ2ZSkgcGluZygpXG5cbiAgcmV0dXJuIHtcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzaW5rOiBwdWxsLmRyYWluKGZ1bmN0aW9uIChyZW1vdGVfdHMpIHtcbiAgICAgIGlmKHNlcnZlKSB7XG4gICAgICAgIHZhciB0czIgPSBEYXRlLm5vdygpXG4gICAgICAgIHJ0dC52YWx1ZSh0czIgLSB0cylcbiAgICAgICAgLy9pZiB0aGVpciB0aW1lIGlzIGJlaGluZCBoYWxmIGEgcm91bmQgdHJpcCBiZWhpbmcgdHMyXG4gICAgICAgIC8vY29uc2lkZXIgdGhhdCB0byBiZSBuZWdhdGl2ZSBza2V3LlxuICAgICAgICBza2V3LnZhbHVlKHJlbW90ZV90cyAtICgodHMyICsgdHMpLzIpKVxuICAgICAgICBzZXJ2ZSA9IGZhbHNlXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy92b2xsZXkgdGltZXN0YW1wIGJhY2sgdG8gb3Bwb25lbnQuXG4gICAgICAgIHNvdXJjZS5wdXNoKHRzID0gRGF0ZS5ub3coKSlcbiAgICAgICAgLy93ZSdsbCBzZXJ2ZSBuZXh0IHRpbWUuXG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dChwaW5nLCB0aW1lb3V0KVxuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICB9KSxcbiAgICBydHQ6IHJ0dCwgc2tldzogc2tld1xuICB9XG5cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9uQ2xvc2UpIHtcbiAgdmFyIGJ1ZmZlciA9IFtdLCBlbmRlZCwgYWJvcnQsIGNiXG5cbiAgZnVuY3Rpb24gY2FsbGJhY2sgKGVyciwgdmFsKSB7XG4gICAgdmFyIF9jYiA9IGNiXG4gICAgaWYoZXJyICYmIG9uQ2xvc2UpIHtcbiAgICAgIHZhciBjID0gb25DbG9zZVxuICAgICAgb25DbG9zZSA9IG51bGxcbiAgICAgIGMoZXJyID09PSB0cnVlID8gbnVsbCA6IGVycilcbiAgICB9XG4gICAgY2IgPSBudWxsXG4gICAgX2NiKGVyciwgdmFsKVxuXG4gIH1cblxuICBmdW5jdGlvbiBkcmFpbigpIHtcbiAgICBpZighY2IpIHJldHVyblxuXG4gICAgaWYoYWJvcnQpICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soYWJvcnQpXG4gICAgZWxzZSBpZighYnVmZmVyLmxlbmd0aCAmJiBlbmRlZCkgY2FsbGJhY2soZW5kZWQpXG4gICAgZWxzZSBpZihidWZmZXIubGVuZ3RoKSAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgYnVmZmVyLnNoaWZ0KCkpXG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChfYWJvcnQsIF9jYikge1xuICAgIGlmKF9hYm9ydCkge1xuICAgICAgYWJvcnQgPSBfYWJvcnRcbiAgICAgIC8vaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGNiIHdhaXRpbmcsIGFib3J0IGl0LlxuICAgICAgaWYoY2IpIGNhbGxiYWNrKGFib3J0KVxuICAgIH1cbiAgICBjYiA9IF9jYlxuICAgIGRyYWluKClcbiAgfVxuXG4gIHJlYWQucHVzaCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYoZW5kZWQpIHJldHVyblxuICAgIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgZHJhaW4oKVxuICB9XG5cbiAgcmVhZC5lbmQgPSBmdW5jdGlvbiAoZW5kKSB7XG4gICAgZW5kZWQgPSBlbmRlZCB8fCBlbmQgfHwgdHJ1ZTtcbiAgICBkcmFpbigpXG4gIH1cblxuICByZXR1cm4gcmVhZFxufVxuXG5cbiIsIlxudmFyIEJ1ZmZlckxpc3QgPSByZXF1aXJlKCdibCcpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXG4gIHZhciBibCA9IG5ldyBCdWZmZXJMaXN0KClcblxuICBmdW5jdGlvbiBnZXQgKG4pIHtcbiAgICB2YXIgbGVuID0gbiA9PSBudWxsID8gYmwubGVuZ3RoIDogblxuICAgIHZhciBkYXRhID0gYmwuc2xpY2UoMCwgbGVuKVxuICAgIGJsLmNvbnN1bWUobilcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBibCxcbiAgICBhZGQ6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBibC5hcHBlbmQoZGF0YSlcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcbiAgICBoYXM6IGZ1bmN0aW9uIChuKSB7XG4gICAgICBpZihuID09IG51bGwpIHJldHVybiBibC5sZW5ndGggPiAwXG4gICAgICByZXR1cm4gYmwubGVuZ3RoID49IG5cblxuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiAobikge1xuICAgICAgaWYobiA9PSBudWxsKSByZXR1cm4gZ2V0KClcbiAgICAgIGlmKCF0aGlzLmhhcyhuKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdjdXJyZW50IGxlbmd0aCBpczonK2JsLmxlbmd0aFxuICAgICAgICAgICsgJywgY291bGQgbm90IGdldDonK24gKyAnIGJ5dGVzJ1xuICAgICAgICApXG4gICAgICByZXR1cm4gZ2V0KG4pXG4gICAgfVxuICB9XG5cbiAgdmFyIHNvRmFyID0gbmV3IEJ1ZmZlcigwKVxuXG4gIHJldHVybiB7XG4gICAgZGF0YTogc29GYXIsXG4gICAgYWRkOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgaWYoIUJ1ZmZlci5pc0J1ZmZlcihkYXRhKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkYXRhIG11c3QgYmUgYSBidWZmZXIsIHdhczogJyArIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgICAgdGhpcy5kYXRhID0gc29GYXIgPSBCdWZmZXIuY29uY2F0KFtzb0ZhciwgZGF0YV0pXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG4gICAgaGFzOiBmdW5jdGlvbiAobikge1xuICAgICAgaWYobnVsbCA9PSBuKSByZXR1cm4gc29GYXIubGVuZ3RoID4gMFxuICAgICAgcmV0dXJuIHNvRmFyLmxlbmd0aCAtIChuIHx8IDApID49IDBcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gKG4pIHtcbiAgICAgIHZhciBuZXh0XG4gICAgICBpZihudWxsID09IG4pIHtcbiAgICAgICAgbmV4dCA9IHNvRmFyXG4gICAgICAgIHNvRmFyID0gbmV3IEJ1ZmZlcigwKVxuICAgICAgICByZXR1cm4gbmV4dFxuICAgICAgfVxuICAgICAgbmV4dCA9IHNvRmFyLnNsaWNlKDAsIG4pXG4gICAgICBpZihzb0Zhci5sZW5ndGggPCBuKSB0aHJvdyBuZXcgRXJyb3IoJ2N1cnJlbnQgbGVuZ3RoIGlzOicrc29GYXIubGVuZ3RoICsgJywgY291bGQgbm90IGdldDonK24gKyAnIGJ5dGVzJylcbiAgICAgIHNvRmFyID0gc29GYXIuc2xpY2Uobiwgc29GYXIubGVuZ3RoKVxuICAgICAgcmV0dXJuIG5leHRcbiAgICB9XG4gIH1cblxufVxuIiwiJ3VzZSBzdHJpY3QnXG52YXIgU3RhdGUgPSByZXF1aXJlKCcuL2JsLXN0YXRlJylcblxuZnVuY3Rpb24gaXNJbnRlZ2VyIChpKSB7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUoaSlcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAoZikge1xuICByZXR1cm4gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZcbn1cblxuZnVuY3Rpb24gbWF4RGVsYXkoZm4sIGRlbGF5KSB7XG4gIGlmKCFkZWxheSkgcmV0dXJuIGZuXG4gIHJldHVybiBmdW5jdGlvbiAoYSwgY2IpIHtcbiAgICB2YXIgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGZuKG5ldyBFcnJvcigncHVsbC1yZWFkZXI6IHJlYWQgZXhjZWVkZWQgdGltZW91dCcpLCBjYilcbiAgICB9LCBkZWxheSlcbiAgICBmbihhLCBmdW5jdGlvbiAoZXJyLCB2YWx1ZSkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgICAgY2IoZXJyLCB2YWx1ZSlcbiAgICB9KVxuXG4gIH1cblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG5cbiAgdmFyIHF1ZXVlID0gW10sIHJlYWQsIHJlYWRUaW1lZCwgcmVhZGluZyA9IGZhbHNlXG4gIHZhciBzdGF0ZSA9IFN0YXRlKCksIGVuZGVkLCBzdHJlYW1pbmcsIGFib3J0XG5cbiAgZnVuY3Rpb24gZHJhaW4gKCkge1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGlmKG51bGwgPT0gcXVldWVbMF0ubGVuZ3RoICYmIHN0YXRlLmhhcygxKSkge1xuICAgICAgICBxdWV1ZS5zaGlmdCgpLmNiKG51bGwsIHN0YXRlLmdldCgpKVxuICAgICAgfVxuICAgICAgZWxzZSBpZihzdGF0ZS5oYXMocXVldWVbMF0ubGVuZ3RoKSkge1xuICAgICAgICB2YXIgbmV4dCA9IHF1ZXVlLnNoaWZ0KClcbiAgICAgICAgbmV4dC5jYihudWxsLCBzdGF0ZS5nZXQobmV4dC5sZW5ndGgpKVxuICAgICAgfVxuICAgICAgZWxzZSBpZihlbmRlZClcbiAgICAgICAgcXVldWUuc2hpZnQoKS5jYihlbmRlZClcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuICEhcXVldWUubGVuZ3RoXG4gICAgfVxuICAgIC8vYWx3YXlzIHJlYWQgYSBsaXR0bGUgZGF0YVxuICAgIHJldHVybiBxdWV1ZS5sZW5ndGggfHwgIXN0YXRlLmhhcygxKSB8fCBhYm9ydFxuICB9XG5cbiAgZnVuY3Rpb24gbW9yZSAoKSB7XG4gICAgdmFyIGQgPSBkcmFpbigpXG4gICAgaWYoZCAmJiAhcmVhZGluZylcbiAgICBpZihyZWFkICYmICFyZWFkaW5nICYmICFzdHJlYW1pbmcpIHtcbiAgICAgIHJlYWRpbmcgPSB0cnVlXG4gICAgICByZWFkVGltZWQgKG51bGwsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICAgIGlmKGVycikge1xuICAgICAgICAgIGVuZGVkID0gZXJyXG4gICAgICAgICAgcmV0dXJuIGRyYWluKClcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5hZGQoZGF0YSlcbiAgICAgICAgbW9yZSgpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRlciAoX3JlYWQpIHtcbiAgICBpZihhYm9ydCkge1xuICAgICAgd2hpbGUocXVldWUubGVuZ3RoKSBxdWV1ZS5zaGlmdCgpLmNiKGFib3J0KVxuICAgICAgcmV0dXJuIGNiICYmIGNiKGFib3J0KVxuICAgIH1cbiAgICByZWFkVGltZWQgPSBtYXhEZWxheShfcmVhZCwgdGltZW91dClcbiAgICByZWFkID0gX3JlYWRcbiAgICBtb3JlKClcbiAgfVxuXG4gIHJlYWRlci5hYm9ydCA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gICAgYWJvcnQgPSBlcnIgfHwgdHJ1ZVxuICAgIGlmKHJlYWQpIHtcbiAgICAgIHJlYWRpbmcgPSB0cnVlXG4gICAgICByZWFkKGFib3J0LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlKHF1ZXVlLmxlbmd0aCkgcXVldWUuc2hpZnQoKS5jYihhYm9ydClcbiAgICAgICAgY2IgJiYgY2IoYWJvcnQpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHNlXG4gICAgICBjYigpXG4gIH1cblxuICByZWFkZXIucmVhZCA9IGZ1bmN0aW9uIChsZW4sIHRpbWVvdXQsIGNiKSB7XG4gICAgaWYoaXNGdW5jdGlvbih0aW1lb3V0KSlcbiAgICAgIGNiID0gdGltZW91dCwgdGltZW91dCA9IDBcbiAgICBpZihpc0Z1bmN0aW9uKGNiKSkge1xuICAgICAgcXVldWUucHVzaCh7bGVuZ3RoOiBpc0ludGVnZXIobGVuKSA/IGxlbiA6IG51bGwsIGNiOiBjYn0pXG4gICAgICBtb3JlKClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvL3N3aXRjaCBpbnRvIHN0cmVhbWluZyBtb2RlIGZvciB0aGUgcmVzdCBvZiB0aGUgc3RyZWFtLlxuICAgICAgc3RyZWFtaW5nID0gdHJ1ZVxuICAgICAgLy93YWl0IGZvciB0aGUgY3VycmVudCByZWFkIHRvIGNvbXBsZXRlXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgICAgICAvL2lmIHRoZXJlIGlzIGFueXRoaW5nIHN0aWxsIGluIHRoZSBxdWV1ZSxcbiAgICAgICAgaWYocmVhZGluZyB8fCBzdGF0ZS5oYXMoMSkpIHtcbiAgICAgICAgICBpZihhYm9ydCkgcmV0dXJuIHJlYWQoYWJvcnQsIGNiKVxuICAgICAgICAgIHF1ZXVlLnB1c2goe2xlbmd0aDogbnVsbCwgY2I6IGNifSlcbiAgICAgICAgICBtb3JlKClcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgbWF4RGVsYXkocmVhZCwgdGltZW91dCkoYWJvcnQsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGNiKGVyciwgZGF0YSlcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkZXJcbn1cblxuXG5cbiIsInZhciBwdWxsID0gcmVxdWlyZSgncHVsbC1zdHJlYW0nKVxudmFyIHNwbGl0dGVyID0gcmVxdWlyZSgncHVsbC1zcGxpdCcpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHBzLCBfSlNPTiwgb3B0cykge1xuICBfSlNPTiA9IF9KU09OIHx8IEpTT05cbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgdmFyIHNlcGFyYXRvciA9IG9wdHMuc2VwYXJhdG9yIHx8ICdcXG4nXG4gIHJldHVybiB7XG4gICAgc2luazogcHVsbChcbiAgICAgIHNwbGl0dGVyKHNlcGFyYXRvciksXG4gICAgICBwdWxsLm1hcChmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhID09PSAnJylcbiAgICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgICB0cnkgeyByZXR1cm4gX0pTT04ucGFyc2UoZGF0YSkgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmICghb3B0cy5pZ25vcmVFcnJvcnMpXG4gICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgcHVsbC5maWx0ZXIoKSxcbiAgICAgIHBzLnNpbmtcbiAgICApLFxuICAgIHNvdXJjZTogcHVsbChcbiAgICAgIHBzLnNvdXJjZSxcbiAgICAgIHB1bGwubWFwKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEgIT09IHZvaWQgMClcbiAgICAgICAgICByZXR1cm4gX0pTT04uc3RyaW5naWZ5KGRhdGEpICsgc2VwYXJhdG9yXG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuIiwidmFyIHUgICAgICA9IHJlcXVpcmUoJ3B1bGwtY29yZScpXG52YXIgc291cmNlcyA9IHJlcXVpcmUoJy4vc291cmNlcycpXG52YXIgc2lua3MgPSByZXF1aXJlKCcuL3NpbmtzJylcblxudmFyIHByb3AgICA9IHUucHJvcFxudmFyIGlkICAgICA9IHUuaWRcbnZhciB0ZXN0ZXIgPSB1LnRlc3RlclxuXG52YXIgbWFwID0gZXhwb3J0cy5tYXAgPVxuZnVuY3Rpb24gKHJlYWQsIG1hcCkge1xuICBtYXAgPSBwcm9wKG1hcCkgfHwgaWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICByZWFkKGFib3J0LCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgZGF0YSA9ICFlbmQgPyBtYXAoZGF0YSkgOiBudWxsXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHJlYWQoZXJyLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGVycilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciBhc3luY01hcCA9IGV4cG9ydHMuYXN5bmNNYXAgPVxuZnVuY3Rpb24gKHJlYWQsIG1hcCkge1xuICBpZighbWFwKSByZXR1cm4gcmVhZFxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiByZWFkKGVuZCwgY2IpIC8vYWJvcnRcbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkgcmV0dXJuIGNiKGVuZCwgZGF0YSlcbiAgICAgIG1hcChkYXRhLCBjYilcbiAgICB9KVxuICB9XG59XG5cbnZhciBwYXJhTWFwID0gZXhwb3J0cy5wYXJhTWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXAsIHdpZHRoKSB7XG4gIGlmKCFtYXApIHJldHVybiByZWFkXG4gIHZhciBlbmRlZCA9IGZhbHNlLCBxdWV1ZSA9IFtdLCBfY2JcblxuICBmdW5jdGlvbiBkcmFpbiAoKSB7XG4gICAgaWYoIV9jYikgcmV0dXJuXG4gICAgdmFyIGNiID0gX2NiXG4gICAgX2NiID0gbnVsbFxuICAgIGlmKHF1ZXVlLmxlbmd0aClcbiAgICAgIHJldHVybiBjYihudWxsLCBxdWV1ZS5zaGlmdCgpKVxuICAgIGVsc2UgaWYoZW5kZWQgJiYgIW4pXG4gICAgICByZXR1cm4gY2IoZW5kZWQpXG4gICAgX2NiID0gY2JcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1bGwgKCkge1xuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSB7XG4gICAgICAgIGVuZGVkID0gZW5kXG4gICAgICAgIHJldHVybiBkcmFpbigpXG4gICAgICB9XG4gICAgICBuKytcbiAgICAgIG1hcChkYXRhLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgIG4tLVxuXG4gICAgICAgIHF1ZXVlLnB1c2goZGF0YSlcbiAgICAgICAgZHJhaW4oKVxuICAgICAgfSlcblxuICAgICAgaWYobiA8IHdpZHRoICYmICFlbmRlZClcbiAgICAgICAgcHVsbCgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBuID0gMFxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiByZWFkKGVuZCwgY2IpIC8vYWJvcnRcbiAgICAvL2NvbnRpbnVlIHRvIHJlYWQgd2hpbGUgdGhlcmUgYXJlIGxlc3MgdGhhbiAzIG1hcHMgaW4gZmxpZ2h0XG4gICAgX2NiID0gY2JcbiAgICBpZihxdWV1ZS5sZW5ndGggfHwgZW5kZWQpXG4gICAgICBwdWxsKCksIGRyYWluKClcbiAgICBlbHNlIHB1bGwoKVxuICB9XG4gIHJldHVybiBoaWdoV2F0ZXJNYXJrKGFzeW5jTWFwKHJlYWQsIG1hcCksIHdpZHRoKVxufVxuXG52YXIgZmlsdGVyID0gZXhwb3J0cy5maWx0ZXIgPVxuZnVuY3Rpb24gKHJlYWQsIHRlc3QpIHtcbiAgLy9yZWdleHBcbiAgdGVzdCA9IHRlc3Rlcih0ZXN0KVxuICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoZW5kLCBjYikge1xuICAgIHZhciBzeW5jLCBsb29wID0gdHJ1ZVxuICAgIHdoaWxlKGxvb3ApIHtcbiAgICAgIGxvb3AgPSBmYWxzZVxuICAgICAgc3luYyA9IHRydWVcbiAgICAgIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgIGlmKCFlbmQgJiYgIXRlc3QoZGF0YSkpXG4gICAgICAgICAgcmV0dXJuIHN5bmMgPyBsb29wID0gdHJ1ZSA6IG5leHQoZW5kLCBjYilcbiAgICAgICAgY2IoZW5kLCBkYXRhKVxuICAgICAgfSlcbiAgICAgIHN5bmMgPSBmYWxzZVxuICAgIH1cbiAgfVxufVxuXG52YXIgZmlsdGVyTm90ID0gZXhwb3J0cy5maWx0ZXJOb3QgPVxuZnVuY3Rpb24gKHJlYWQsIHRlc3QpIHtcbiAgdGVzdCA9IHRlc3Rlcih0ZXN0KVxuICByZXR1cm4gZmlsdGVyKHJlYWQsIGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuICF0ZXN0KGUpXG4gIH0pXG59XG5cbnZhciB0aHJvdWdoID0gZXhwb3J0cy50aHJvdWdoID1cbmZ1bmN0aW9uIChyZWFkLCBvcCwgb25FbmQpIHtcbiAgdmFyIGEgPSBmYWxzZVxuICBmdW5jdGlvbiBvbmNlIChhYm9ydCkge1xuICAgIGlmKGEgfHwgIW9uRW5kKSByZXR1cm5cbiAgICBhID0gdHJ1ZVxuICAgIG9uRW5kKGFib3J0ID09PSB0cnVlID8gbnVsbCA6IGFib3J0KVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSBvbmNlKGVuZClcbiAgICByZXR1cm4gcmVhZChlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKCFlbmQpIG9wICYmIG9wKGRhdGEpXG4gICAgICBlbHNlIG9uY2UoZW5kKVxuICAgICAgY2IoZW5kLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHRha2UgPSBleHBvcnRzLnRha2UgPVxuZnVuY3Rpb24gKHJlYWQsIHRlc3QpIHtcbiAgdmFyIGVuZGVkID0gZmFsc2VcbiAgaWYoJ251bWJlcicgPT09IHR5cGVvZiB0ZXN0KSB7XG4gICAgdmFyIG4gPSB0ZXN0OyB0ZXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG4gLS1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmRlZCkgcmV0dXJuIGNiKGVuZGVkKVxuICAgIGlmKGVuZGVkID0gZW5kKSByZXR1cm4gcmVhZChlbmRlZCwgY2IpXG5cbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZGVkID0gZW5kZWQgfHwgZW5kKSByZXR1cm4gY2IoZW5kZWQpXG4gICAgICBpZighdGVzdChkYXRhKSkge1xuICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgcmVhZCh0cnVlLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgICAgY2IoZW5kZWQsIGRhdGEpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBlbHNlXG4gICAgICAgIGNiKG51bGwsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgdW5pcXVlID0gZXhwb3J0cy51bmlxdWUgPSBmdW5jdGlvbiAocmVhZCwgZmllbGQsIGludmVydCkge1xuICBmaWVsZCA9IHByb3AoZmllbGQpIHx8IGlkXG4gIHZhciBzZWVuID0ge31cbiAgcmV0dXJuIGZpbHRlcihyZWFkLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBrZXkgPSBmaWVsZChkYXRhKVxuICAgIGlmKHNlZW5ba2V5XSkgcmV0dXJuICEhaW52ZXJ0IC8vZmFsc2UsIGJ5IGRlZmF1bHRcbiAgICBlbHNlIHNlZW5ba2V5XSA9IHRydWVcbiAgICByZXR1cm4gIWludmVydCAvL3RydWUgYnkgZGVmYXVsdFxuICB9KVxufVxuXG52YXIgbm9uVW5pcXVlID0gZXhwb3J0cy5ub25VbmlxdWUgPSBmdW5jdGlvbiAocmVhZCwgZmllbGQpIHtcbiAgcmV0dXJuIHVuaXF1ZShyZWFkLCBmaWVsZCwgdHJ1ZSlcbn1cblxudmFyIGdyb3VwID0gZXhwb3J0cy5ncm91cCA9XG5mdW5jdGlvbiAocmVhZCwgc2l6ZSkge1xuICB2YXIgZW5kZWQ7IHNpemUgPSBzaXplIHx8IDVcbiAgdmFyIHF1ZXVlID0gW11cblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICAvL3RoaXMgbWVhbnMgdGhhdCB0aGUgdXBzdHJlYW0gaXMgc2VuZGluZyBhbiBlcnJvci5cbiAgICBpZihlbmQpIHJldHVybiByZWFkKGVuZGVkID0gZW5kLCBjYilcbiAgICAvL3RoaXMgbWVhbnMgdGhhdCB3ZSByZWFkIGFuIGVuZCBiZWZvcmUuXG4gICAgaWYoZW5kZWQpIHJldHVybiBjYihlbmRlZClcblxuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gbmV4dChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZGVkID0gZW5kZWQgfHwgZW5kKSB7XG4gICAgICAgIGlmKCFxdWV1ZS5sZW5ndGgpXG4gICAgICAgICAgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgICAgIHZhciBfcXVldWUgPSBxdWV1ZTsgcXVldWUgPSBbXVxuICAgICAgICByZXR1cm4gY2IobnVsbCwgX3F1ZXVlKVxuICAgICAgfVxuICAgICAgcXVldWUucHVzaChkYXRhKVxuICAgICAgaWYocXVldWUubGVuZ3RoIDwgc2l6ZSlcbiAgICAgICAgcmV0dXJuIHJlYWQobnVsbCwgbmV4dClcblxuICAgICAgdmFyIF9xdWV1ZSA9IHF1ZXVlOyBxdWV1ZSA9IFtdXG4gICAgICBjYihudWxsLCBfcXVldWUpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgZmxhdHRlbiA9IGV4cG9ydHMuZmxhdHRlbiA9IGZ1bmN0aW9uIChyZWFkKSB7XG4gIHZhciBfcmVhZFxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKF9yZWFkKSBuZXh0Q2h1bmsoKVxuICAgIGVsc2UgICAgICBuZXh0U3RyZWFtKClcblxuICAgIGZ1bmN0aW9uIG5leHRDaHVuayAoKSB7XG4gICAgICBfcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgIGlmKGVuZCkgbmV4dFN0cmVhbSgpXG4gICAgICAgIGVsc2UgICAgY2IobnVsbCwgZGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGZ1bmN0aW9uIG5leHRTdHJlYW0gKCkge1xuICAgICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBzdHJlYW0pIHtcbiAgICAgICAgaWYoZW5kKVxuICAgICAgICAgIHJldHVybiBjYihlbmQpXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoc3RyZWFtKSB8fCBzdHJlYW0gJiYgJ29iamVjdCcgPT09IHR5cGVvZiBzdHJlYW0pXG4gICAgICAgICAgc3RyZWFtID0gc291cmNlcy52YWx1ZXMoc3RyZWFtKVxuICAgICAgICBlbHNlIGlmKCdmdW5jdGlvbicgIT0gdHlwZW9mIHN0cmVhbSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmVhbSBvZiBzdHJlYW1zJylcbiAgICAgICAgX3JlYWQgPSBzdHJlYW1cbiAgICAgICAgbmV4dENodW5rKClcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbnZhciBwcmVwZW5kID1cbmV4cG9ydHMucHJlcGVuZCA9XG5mdW5jdGlvbiAocmVhZCwgaGVhZCkge1xuXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoaGVhZCAhPT0gbnVsbCkge1xuICAgICAgaWYoYWJvcnQpXG4gICAgICAgIHJldHVybiByZWFkKGFib3J0LCBjYilcbiAgICAgIHZhciBfaGVhZCA9IGhlYWRcbiAgICAgIGhlYWQgPSBudWxsXG4gICAgICBjYihudWxsLCBfaGVhZClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhZChhYm9ydCwgY2IpXG4gICAgfVxuICB9XG5cbn1cblxuLy92YXIgZHJhaW5JZiA9IGV4cG9ydHMuZHJhaW5JZiA9IGZ1bmN0aW9uIChvcCwgZG9uZSkge1xuLy8gIHNpbmtzLmRyYWluKFxuLy99XG5cbnZhciBfcmVkdWNlID0gZXhwb3J0cy5fcmVkdWNlID0gZnVuY3Rpb24gKHJlYWQsIHJlZHVjZSwgaW5pdGlhbCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGNsb3NlLCBjYikge1xuICAgIGlmKGNsb3NlKSByZXR1cm4gcmVhZChjbG9zZSwgY2IpXG4gICAgaWYoZW5kZWQpIHJldHVybiBjYihlbmRlZClcblxuICAgIHNpbmtzLmRyYWluKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBpbml0aWFsID0gcmVkdWNlKGluaXRpYWwsIGl0ZW0pXG4gICAgfSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgZW5kZWQgPSBlcnIgfHwgdHJ1ZVxuICAgICAgaWYoIWVycikgY2IobnVsbCwgaW5pdGlhbClcbiAgICAgIGVsc2UgICAgIGNiKGVuZGVkKVxuICAgIH0pXG4gICAgKHJlYWQpXG4gIH1cbn1cblxudmFyIG5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGlja1xuXG52YXIgaGlnaFdhdGVyTWFyayA9IGV4cG9ydHMuaGlnaFdhdGVyTWFyayA9XG5mdW5jdGlvbiAocmVhZCwgaGlnaFdhdGVyTWFyaykge1xuICB2YXIgYnVmZmVyID0gW10sIHdhaXRpbmcgPSBbXSwgZW5kZWQsIGVuZGluZywgcmVhZGluZyA9IGZhbHNlXG4gIGhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrIHx8IDEwXG5cbiAgZnVuY3Rpb24gcmVhZEFoZWFkICgpIHtcbiAgICB3aGlsZSh3YWl0aW5nLmxlbmd0aCAmJiAoYnVmZmVyLmxlbmd0aCB8fCBlbmRlZCkpXG4gICAgICB3YWl0aW5nLnNoaWZ0KCkoZW5kZWQsIGVuZGVkID8gbnVsbCA6IGJ1ZmZlci5zaGlmdCgpKVxuXG4gICAgaWYgKCFidWZmZXIubGVuZ3RoICYmIGVuZGluZykgZW5kZWQgPSBlbmRpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBuZXh0ICgpIHtcbiAgICBpZihlbmRlZCB8fCBlbmRpbmcgfHwgcmVhZGluZyB8fCBidWZmZXIubGVuZ3RoID49IGhpZ2hXYXRlck1hcmspXG4gICAgICByZXR1cm5cbiAgICByZWFkaW5nID0gdHJ1ZVxuICAgIHJldHVybiByZWFkKGVuZGVkIHx8IGVuZGluZywgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICBlbmRpbmcgPSBlbmRpbmcgfHwgZW5kXG4gICAgICBpZihkYXRhICE9IG51bGwpIGJ1ZmZlci5wdXNoKGRhdGEpXG5cbiAgICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgICB9KVxuICB9XG5cbiAgcHJvY2Vzcy5uZXh0VGljayhuZXh0KVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGVuZGVkID0gZW5kZWQgfHwgZW5kXG4gICAgd2FpdGluZy5wdXNoKGNiKVxuXG4gICAgbmV4dCgpOyByZWFkQWhlYWQoKVxuICB9XG59XG5cbnZhciBmbGF0TWFwID0gZXhwb3J0cy5mbGF0TWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXBwZXIpIHtcbiAgbWFwcGVyID0gbWFwcGVyIHx8IGlkXG4gIHZhciBxdWV1ZSA9IFtdLCBlbmRlZFxuXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYocXVldWUubGVuZ3RoKSByZXR1cm4gY2IobnVsbCwgcXVldWUuc2hpZnQoKSlcbiAgICBlbHNlIGlmKGVuZGVkKSAgIHJldHVybiBjYihlbmRlZClcblxuICAgIHJlYWQoYWJvcnQsIGZ1bmN0aW9uIG5leHQgKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSBlbmRlZCA9IGVuZFxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBhZGQgPSBtYXBwZXIoZGF0YSlcbiAgICAgICAgd2hpbGUoYWRkICYmIGFkZC5sZW5ndGgpXG4gICAgICAgICAgcXVldWUucHVzaChhZGQuc2hpZnQoKSlcbiAgICAgIH1cblxuICAgICAgaWYocXVldWUubGVuZ3RoKSBjYihudWxsLCBxdWV1ZS5zaGlmdCgpKVxuICAgICAgZWxzZSBpZihlbmRlZCkgICBjYihlbmRlZClcbiAgICAgIGVsc2UgICAgICAgICAgICAgcmVhZChudWxsLCBuZXh0KVxuICAgIH0pXG4gIH1cbn1cblxuIiwiXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjcmVhdGUpIHtcbiAgdmFyIHJlYWRlciA9IG51bGxcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgaWYoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHJlYWQpIHRocm93IG5ldyBFcnJvcigncmVhZCBtdXN0IGJlIGZ1bmN0aW9uJylcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgICAgaWYoYWJvcnQpIChyZWFkZXIgPyByZWFkZXIuYWJvcnQgOiByZWFkKShhYm9ydCwgY2IpXG4gICAgICBlbHNlIGlmKCFyZWFkZXIpIChyZWFkZXIgPSBjcmVhdGUoY2IpKShyZWFkKVxuICAgICAgZWxzZSAvL3RoZXJlIHdpbGwgb25seSBiZSBvbmUgdmFsdWUsIHNvIGFzc3VtZSB0aGlzIGlzIHRoZSBlbmRcbiAgICAgICAgY2IodHJ1ZSlcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiIsInZhciB0aHJvdWdoID0gcmVxdWlyZSgncHVsbC10aHJvdWdoJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcGxpdCAobWF0Y2hlciwgbWFwcGVyLCByZXZlcnNlKSB7XG4gIHZhciBzb0ZhciA9ICcnXG4gIGlmKCdmdW5jdGlvbicgPT09IHR5cGVvZiBtYXRjaGVyKVxuICAgIG1hcHBlciA9IG1hdGNoZXIsIG1hdGNoZXIgPSBudWxsXG4gIGlmICghbWF0Y2hlcilcbiAgICBtYXRjaGVyID0gJ1xcbidcblxuICByZXR1cm4gdGhyb3VnaChmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgdmFyIHN0cmVhbSA9IHRoaXNcbiAgICAgICwgcGllY2VzID0gKCByZXZlcnNlXG4gICAgICAgID8gYnVmZmVyICsgc29GYXJcbiAgICAgICAgOiBzb0ZhciArIGJ1ZmZlclxuICAgICAgKS5zcGxpdChtYXRjaGVyKVxuXG4gICAgc29GYXIgPSByZXZlcnNlID8gcGllY2VzLnNoaWZ0KCkgOiBwaWVjZXMucG9wKClcblxuICAgIHZhciBsID0gcGllY2VzLmxlbmd0aFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgcGllY2UgPSBwaWVjZXNbcmV2ZXJzZSA/IGwgLSAxIC0gaSA6IGkgXVxuICAgICAgaWYobWFwcGVyKSB7XG4gICAgICAgIHBpZWNlID0gbWFwcGVyKHBpZWNlKVxuICAgICAgICBpZigndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHBpZWNlKVxuICAgICAgICAgIHN0cmVhbS5xdWV1ZShwaWVjZSlcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgc3RyZWFtLnF1ZXVlKHBpZWNlKVxuICAgIH1cbiAgfSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIGlmKHNvRmFyICE9IG51bGwpXG4gICAgICB0aGlzLnF1ZXVlKHNvRmFyKVxuICAgIHRoaXMucXVldWUobnVsbClcbiAgfSlcbn1cblxuIiwiXG52YXIga2V5cyA9IGV4cG9ydHMua2V5cyA9XG5mdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB2YWx1ZXMoT2JqZWN0LmtleXMob2JqZWN0KSlcbn1cblxuZnVuY3Rpb24gYWJvcnRDYihjYiwgYWJvcnQsIG9uQWJvcnQpIHtcbiAgY2IoYWJvcnQpXG4gIG9uQWJvcnQgJiYgb25BYm9ydChhYm9ydCA9PT0gdHJ1ZSA/IG51bGw6IGFib3J0KVxuICByZXR1cm5cbn1cblxudmFyIG9uY2UgPSBleHBvcnRzLm9uY2UgPVxuZnVuY3Rpb24gKHZhbHVlLCBvbkFib3J0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoYWJvcnQpXG4gICAgICByZXR1cm4gYWJvcnRDYihjYiwgYWJvcnQsIG9uQWJvcnQpXG4gICAgaWYodmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFyIF92YWx1ZSA9IHZhbHVlOyB2YWx1ZSA9IG51bGxcbiAgICAgIGNiKG51bGwsIF92YWx1ZSlcbiAgICB9IGVsc2VcbiAgICAgIGNiKHRydWUpXG4gIH1cbn1cblxudmFyIHZhbHVlcyA9IGV4cG9ydHMudmFsdWVzID0gZXhwb3J0cy5yZWFkQXJyYXkgPVxuZnVuY3Rpb24gKGFycmF5LCBvbkFib3J0KSB7XG4gIGlmKCFhcnJheSlcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgICAgaWYoYWJvcnQpIHJldHVybiBhYm9ydENiKGNiLCBhYm9ydCwgb25BYm9ydClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIH1cbiAgaWYoIUFycmF5LmlzQXJyYXkoYXJyYXkpKVxuICAgIGFycmF5ID0gT2JqZWN0LmtleXMoYXJyYXkpLm1hcChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIGFycmF5W2tdXG4gICAgfSlcbiAgdmFyIGkgPSAwXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoYWJvcnQpXG4gICAgICByZXR1cm4gYWJvcnRDYihjYiwgYWJvcnQsIG9uQWJvcnQpXG4gICAgY2IoaSA+PSBhcnJheS5sZW5ndGggfHwgbnVsbCwgYXJyYXlbaSsrXSlcbiAgfVxufVxuXG5cbnZhciBjb3VudCA9IGV4cG9ydHMuY291bnQgPVxuZnVuY3Rpb24gKG1heCkge1xuICB2YXIgaSA9IDA7IG1heCA9IG1heCB8fCBJbmZpbml0eVxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiBjYiAmJiBjYihlbmQpXG4gICAgaWYoaSA+IG1heClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIGNiKG51bGwsIGkrKylcbiAgfVxufVxuXG52YXIgaW5maW5pdGUgPSBleHBvcnRzLmluZmluaXRlID1cbmZ1bmN0aW9uIChnZW5lcmF0ZSkge1xuICBnZW5lcmF0ZSA9IGdlbmVyYXRlIHx8IE1hdGgucmFuZG9tXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIGNiICYmIGNiKGVuZClcbiAgICByZXR1cm4gY2IobnVsbCwgZ2VuZXJhdGUoKSlcbiAgfVxufVxuXG52YXIgZGVmZXIgPSBleHBvcnRzLmRlZmVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlYWQsIGNicyA9IFtdLCBfZW5kXG5cbiAgdmFyIHJlYWQgPSBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKCFfcmVhZCkge1xuICAgICAgX2VuZCA9IGVuZFxuICAgICAgY2JzLnB1c2goY2IpXG4gICAgfSBcbiAgICBlbHNlIF9yZWFkKGVuZCwgY2IpXG4gIH1cbiAgcmVhZC5yZXNvbHZlID0gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICBpZihfcmVhZCkgdGhyb3cgbmV3IEVycm9yKCdhbHJlYWR5IHJlc29sdmVkJylcbiAgICBfcmVhZCA9IHJlYWRcbiAgICBpZighX3JlYWQpIHRocm93IG5ldyBFcnJvcignbm8gcmVhZCBjYW5ub3QgcmVzb2x2ZSEnICsgX3JlYWQpXG4gICAgd2hpbGUoY2JzLmxlbmd0aClcbiAgICAgIF9yZWFkKF9lbmQsIGNicy5zaGlmdCgpKVxuICB9XG4gIHJlYWQuYWJvcnQgPSBmdW5jdGlvbihlcnIpIHtcbiAgICByZWFkLnJlc29sdmUoZnVuY3Rpb24gKF8sIGNiKSB7XG4gICAgICBjYihlcnIgfHwgdHJ1ZSlcbiAgICB9KVxuICB9XG4gIHJldHVybiByZWFkXG59XG5cbnZhciBlbXB0eSA9IGV4cG9ydHMuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgY2IodHJ1ZSlcbiAgfVxufVxuXG52YXIgZXJyb3IgPSBleHBvcnRzLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGNiKGVycilcbiAgfVxufVxuXG52YXIgZGVwdGhGaXJzdCA9IGV4cG9ydHMuZGVwdGhGaXJzdCA9XG5mdW5jdGlvbiAoc3RhcnQsIGNyZWF0ZVN0cmVhbSkge1xuICB2YXIgcmVhZHMgPSBbXVxuXG4gIHJlYWRzLnVuc2hpZnQob25jZShzdGFydCkpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIG5leHQgKGVuZCwgY2IpIHtcbiAgICBpZighcmVhZHMubGVuZ3RoKVxuICAgICAgcmV0dXJuIGNiKHRydWUpXG4gICAgcmVhZHNbMF0oZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHtcbiAgICAgICAgLy9pZiB0aGlzIHN0cmVhbSBoYXMgZW5kZWQsIGdvIHRvIHRoZSBuZXh0IHF1ZXVlXG4gICAgICAgIHJlYWRzLnNoaWZ0KClcbiAgICAgICAgcmV0dXJuIG5leHQobnVsbCwgY2IpXG4gICAgICB9XG4gICAgICByZWFkcy51bnNoaWZ0KGNyZWF0ZVN0cmVhbShkYXRhKSlcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG4vL3dpZHRoIGZpcnN0IGlzIGp1c3QgbGlrZSBkZXB0aCBmaXJzdCxcbi8vYnV0IHB1c2ggZWFjaCBuZXcgc3RyZWFtIG9udG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcbnZhciB3aWR0aEZpcnN0ID0gZXhwb3J0cy53aWR0aEZpcnN0ID1cbmZ1bmN0aW9uIChzdGFydCwgY3JlYXRlU3RyZWFtKSB7XG4gIHZhciByZWFkcyA9IFtdXG5cbiAgcmVhZHMucHVzaChvbmNlKHN0YXJ0KSlcblxuICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoZW5kLCBjYikge1xuICAgIGlmKCFyZWFkcy5sZW5ndGgpXG4gICAgICByZXR1cm4gY2IodHJ1ZSlcbiAgICByZWFkc1swXShlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkge1xuICAgICAgICByZWFkcy5zaGlmdCgpXG4gICAgICAgIHJldHVybiBuZXh0KG51bGwsIGNiKVxuICAgICAgfVxuICAgICAgcmVhZHMucHVzaChjcmVhdGVTdHJlYW0oZGF0YSkpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG4vL3RoaXMgY2FtZSBvdXQgZGlmZmVyZW50IHRvIHRoZSBmaXJzdCAoc3RybSlcbi8vYXR0ZW1wdCBhdCBsZWFmRmlyc3QsIGJ1dCBpdCdzIHN0aWxsIGEgdmFsaWRcbi8vdG9wb2xvZ2ljYWwgc29ydC5cbnZhciBsZWFmRmlyc3QgPSBleHBvcnRzLmxlYWZGaXJzdCA9XG5mdW5jdGlvbiAoc3RhcnQsIGNyZWF0ZVN0cmVhbSkge1xuICB2YXIgcmVhZHMgPSBbXVxuICB2YXIgb3V0cHV0ID0gW11cbiAgcmVhZHMucHVzaChvbmNlKHN0YXJ0KSlcblxuICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoZW5kLCBjYikge1xuICAgIHJlYWRzWzBdKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSB7XG4gICAgICAgIHJlYWRzLnNoaWZ0KClcbiAgICAgICAgaWYoIW91dHB1dC5sZW5ndGgpXG4gICAgICAgICAgcmV0dXJuIGNiKHRydWUpXG4gICAgICAgIHJldHVybiBjYihudWxsLCBvdXRwdXQuc2hpZnQoKSlcbiAgICAgIH1cbiAgICAgIHJlYWRzLnVuc2hpZnQoY3JlYXRlU3RyZWFtKGRhdGEpKVxuICAgICAgb3V0cHV0LnVuc2hpZnQoZGF0YSlcbiAgICAgIG5leHQobnVsbCwgY2IpXG4gICAgfSlcbiAgfVxufVxuXG4iLCJ2YXIgdSAgICAgID0gcmVxdWlyZSgncHVsbC1jb3JlJylcbnZhciBzb3VyY2VzID0gcmVxdWlyZSgnLi9zb3VyY2VzJylcbnZhciBzaW5rcyA9IHJlcXVpcmUoJy4vc2lua3MnKVxuXG52YXIgcHJvcCAgID0gdS5wcm9wXG52YXIgaWQgICAgID0gdS5pZFxudmFyIHRlc3RlciA9IHUudGVzdGVyXG5cbnZhciBtYXAgPSBleHBvcnRzLm1hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwKSB7XG4gIG1hcCA9IHByb3AobWFwKSB8fCBpZFxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIHJlYWQoYWJvcnQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICBkYXRhID0gIWVuZCA/IG1hcChkYXRhKSA6IG51bGxcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gcmVhZChlcnIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY2IoZW5kLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGFzeW5jTWFwID0gZXhwb3J0cy5hc3luY01hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwKSB7XG4gIGlmKCFtYXApIHJldHVybiByZWFkXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kLCBjYikgLy9hYm9ydFxuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSByZXR1cm4gY2IoZW5kLCBkYXRhKVxuICAgICAgbWFwKGRhdGEsIGNiKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHBhcmFNYXAgPSBleHBvcnRzLnBhcmFNYXAgPVxuZnVuY3Rpb24gKHJlYWQsIG1hcCwgd2lkdGgpIHtcbiAgaWYoIW1hcCkgcmV0dXJuIHJlYWRcbiAgdmFyIGVuZGVkID0gZmFsc2UsIHF1ZXVlID0gW10sIF9jYlxuXG4gIGZ1bmN0aW9uIGRyYWluICgpIHtcbiAgICBpZighX2NiKSByZXR1cm5cbiAgICB2YXIgY2IgPSBfY2JcbiAgICBfY2IgPSBudWxsXG4gICAgaWYocXVldWUubGVuZ3RoKVxuICAgICAgcmV0dXJuIGNiKG51bGwsIHF1ZXVlLnNoaWZ0KCkpXG4gICAgZWxzZSBpZihlbmRlZCAmJiAhbilcbiAgICAgIHJldHVybiBjYihlbmRlZClcbiAgICBfY2IgPSBjYlxuICB9XG5cbiAgZnVuY3Rpb24gcHVsbCAoKSB7XG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHtcbiAgICAgICAgZW5kZWQgPSBlbmRcbiAgICAgICAgcmV0dXJuIGRyYWluKClcbiAgICAgIH1cbiAgICAgIG4rK1xuICAgICAgbWFwKGRhdGEsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgbi0tXG5cbiAgICAgICAgcXVldWUucHVzaChkYXRhKVxuICAgICAgICBkcmFpbigpXG4gICAgICB9KVxuXG4gICAgICBpZihuIDwgd2lkdGggJiYgIWVuZGVkKVxuICAgICAgICBwdWxsKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG4gPSAwXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kLCBjYikgLy9hYm9ydFxuICAgIC8vY29udGludWUgdG8gcmVhZCB3aGlsZSB0aGVyZSBhcmUgbGVzcyB0aGFuIDMgbWFwcyBpbiBmbGlnaHRcbiAgICBfY2IgPSBjYlxuICAgIGlmKHF1ZXVlLmxlbmd0aCB8fCBlbmRlZClcbiAgICAgIHB1bGwoKSwgZHJhaW4oKVxuICAgIGVsc2UgcHVsbCgpXG4gIH1cbiAgcmV0dXJuIGhpZ2hXYXRlck1hcmsoYXN5bmNNYXAocmVhZCwgbWFwKSwgd2lkdGgpXG59XG5cbnZhciBmaWx0ZXIgPSBleHBvcnRzLmZpbHRlciA9XG5mdW5jdGlvbiAocmVhZCwgdGVzdCkge1xuICAvL3JlZ2V4cFxuICB0ZXN0ID0gdGVzdGVyKHRlc3QpXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgdmFyIHN5bmMsIGxvb3AgPSB0cnVlXG4gICAgd2hpbGUobG9vcCkge1xuICAgICAgbG9vcCA9IGZhbHNlXG4gICAgICBzeW5jID0gdHJ1ZVxuICAgICAgcmVhZChlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgaWYoIWVuZCAmJiAhdGVzdChkYXRhKSlcbiAgICAgICAgICByZXR1cm4gc3luYyA/IGxvb3AgPSB0cnVlIDogbmV4dChlbmQsIGNiKVxuICAgICAgICBjYihlbmQsIGRhdGEpXG4gICAgICB9KVxuICAgICAgc3luYyA9IGZhbHNlXG4gICAgfVxuICB9XG59XG5cbnZhciBmaWx0ZXJOb3QgPSBleHBvcnRzLmZpbHRlck5vdCA9XG5mdW5jdGlvbiAocmVhZCwgdGVzdCkge1xuICB0ZXN0ID0gdGVzdGVyKHRlc3QpXG4gIHJldHVybiBmaWx0ZXIocmVhZCwgZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gIXRlc3QoZSlcbiAgfSlcbn1cblxudmFyIHRocm91Z2ggPSBleHBvcnRzLnRocm91Z2ggPVxuZnVuY3Rpb24gKHJlYWQsIG9wLCBvbkVuZCkge1xuICB2YXIgYSA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uY2UgKGFib3J0KSB7XG4gICAgaWYoYSB8fCAhb25FbmQpIHJldHVyblxuICAgIGEgPSB0cnVlXG4gICAgb25FbmQoYWJvcnQgPT09IHRydWUgPyBudWxsIDogYWJvcnQpXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIG9uY2UoZW5kKVxuICAgIHJldHVybiByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoIWVuZCkgb3AgJiYgb3AoZGF0YSlcbiAgICAgIGVsc2Ugb25jZShlbmQpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgdGFrZSA9IGV4cG9ydHMudGFrZSA9XG5mdW5jdGlvbiAocmVhZCwgdGVzdCwgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fVxuICB2YXIgbGFzdCA9IG9wdHMubGFzdCB8fCBmYWxzZSAvLyB3aGV0aGVyIHRoZSBmaXJzdCBpdGVtIGZvciB3aGljaCAhdGVzdChpdGVtKSBzaG91bGQgc3RpbGwgcGFzc1xuICB2YXIgZW5kZWQgPSBmYWxzZVxuICBpZignbnVtYmVyJyA9PT0gdHlwZW9mIHRlc3QpIHtcbiAgICBsYXN0ID0gdHJ1ZVxuICAgIHZhciBuID0gdGVzdDsgdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAtLW5cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0ZXJtaW5hdGUgKGNiKSB7XG4gICAgcmVhZCh0cnVlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBsYXN0ID0gZmFsc2U7IGNiKGVyciB8fCB0cnVlKVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmRlZCkgICAgICAgICAgICBsYXN0ID8gdGVybWluYXRlKGNiKSA6IGNiKGVuZGVkKVxuICAgIGVsc2UgaWYoZW5kZWQgPSBlbmQpIHJlYWQoZW5kZWQsIGNiKVxuICAgIGVsc2VcbiAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkge1xuICAgICAgICAgIC8vbGFzdCA/IHRlcm1pbmF0ZShjYikgOlxuICAgICAgICAgIGNiKGVuZGVkKVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoIXRlc3QoZGF0YSkpIHtcbiAgICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgICBsYXN0ID8gY2IobnVsbCwgZGF0YSkgOiB0ZXJtaW5hdGUoY2IpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICB9KVxuICB9XG59XG5cbnZhciB1bmlxdWUgPSBleHBvcnRzLnVuaXF1ZSA9IGZ1bmN0aW9uIChyZWFkLCBmaWVsZCwgaW52ZXJ0KSB7XG4gIGZpZWxkID0gcHJvcChmaWVsZCkgfHwgaWRcbiAgdmFyIHNlZW4gPSB7fVxuICByZXR1cm4gZmlsdGVyKHJlYWQsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGtleSA9IGZpZWxkKGRhdGEpXG4gICAgaWYoc2VlbltrZXldKSByZXR1cm4gISFpbnZlcnQgLy9mYWxzZSwgYnkgZGVmYXVsdFxuICAgIGVsc2Ugc2VlbltrZXldID0gdHJ1ZVxuICAgIHJldHVybiAhaW52ZXJ0IC8vdHJ1ZSBieSBkZWZhdWx0XG4gIH0pXG59XG5cbnZhciBub25VbmlxdWUgPSBleHBvcnRzLm5vblVuaXF1ZSA9IGZ1bmN0aW9uIChyZWFkLCBmaWVsZCkge1xuICByZXR1cm4gdW5pcXVlKHJlYWQsIGZpZWxkLCB0cnVlKVxufVxuXG52YXIgZ3JvdXAgPSBleHBvcnRzLmdyb3VwID1cbmZ1bmN0aW9uIChyZWFkLCBzaXplKSB7XG4gIHZhciBlbmRlZDsgc2l6ZSA9IHNpemUgfHwgNVxuICB2YXIgcXVldWUgPSBbXVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIC8vdGhpcyBtZWFucyB0aGF0IHRoZSB1cHN0cmVhbSBpcyBzZW5kaW5nIGFuIGVycm9yLlxuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kZWQgPSBlbmQsIGNiKVxuICAgIC8vdGhpcyBtZWFucyB0aGF0IHdlIHJlYWQgYW4gZW5kIGJlZm9yZS5cbiAgICBpZihlbmRlZCkgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiBuZXh0KGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kZWQgPSBlbmRlZCB8fCBlbmQpIHtcbiAgICAgICAgaWYoIXF1ZXVlLmxlbmd0aClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IHF1ZXVlOyBxdWV1ZSA9IFtdXG4gICAgICAgIHJldHVybiBjYihudWxsLCBfcXVldWUpXG4gICAgICB9XG4gICAgICBxdWV1ZS5wdXNoKGRhdGEpXG4gICAgICBpZihxdWV1ZS5sZW5ndGggPCBzaXplKVxuICAgICAgICByZXR1cm4gcmVhZChudWxsLCBuZXh0KVxuXG4gICAgICB2YXIgX3F1ZXVlID0gcXVldWU7IHF1ZXVlID0gW11cbiAgICAgIGNiKG51bGwsIF9xdWV1ZSlcbiAgICB9KVxuICB9XG59XG5cbnZhciBmbGF0dGVuID0gZXhwb3J0cy5mbGF0dGVuID0gZnVuY3Rpb24gKHJlYWQpIHtcbiAgdmFyIF9yZWFkXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYgKGFib3J0KSB7XG4gICAgICBfcmVhZCA/IF9yZWFkKGFib3J0LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgcmVhZChlcnIgfHwgYWJvcnQsIGNiKVxuICAgICAgfSkgOiByZWFkKGFib3J0LCBjYilcbiAgICB9XG4gICAgZWxzZSBpZihfcmVhZCkgbmV4dENodW5rKClcbiAgICBlbHNlIG5leHRTdHJlYW0oKVxuXG4gICAgZnVuY3Rpb24gbmV4dENodW5rICgpIHtcbiAgICAgIF9yZWFkKG51bGwsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgaWYgKGVyciA9PT0gdHJ1ZSkgbmV4dFN0cmVhbSgpXG4gICAgICAgIGVsc2UgaWYgKGVycikge1xuICAgICAgICAgIHJlYWQodHJ1ZSwgZnVuY3Rpb24oYWJvcnRFcnIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgZG8gd2UgZG8gd2l0aCB0aGUgYWJvcnRFcnI/XG4gICAgICAgICAgICBjYihlcnIpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGNiKG51bGwsIGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgICBmdW5jdGlvbiBuZXh0U3RyZWFtICgpIHtcbiAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgc3RyZWFtKSB7XG4gICAgICAgIGlmKGVuZClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kKVxuICAgICAgICBpZihBcnJheS5pc0FycmF5KHN0cmVhbSkgfHwgc3RyZWFtICYmICdvYmplY3QnID09PSB0eXBlb2Ygc3RyZWFtKVxuICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZXMudmFsdWVzKHN0cmVhbSlcbiAgICAgICAgZWxzZSBpZignZnVuY3Rpb24nICE9IHR5cGVvZiBzdHJlYW0pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJlYW0gb2Ygc3RyZWFtcycpXG4gICAgICAgIF9yZWFkID0gc3RyZWFtXG4gICAgICAgIG5leHRDaHVuaygpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG52YXIgcHJlcGVuZCA9XG5leHBvcnRzLnByZXBlbmQgPVxuZnVuY3Rpb24gKHJlYWQsIGhlYWQpIHtcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGhlYWQgIT09IG51bGwpIHtcbiAgICAgIGlmKGFib3J0KVxuICAgICAgICByZXR1cm4gcmVhZChhYm9ydCwgY2IpXG4gICAgICB2YXIgX2hlYWQgPSBoZWFkXG4gICAgICBoZWFkID0gbnVsbFxuICAgICAgY2IobnVsbCwgX2hlYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWQoYWJvcnQsIGNiKVxuICAgIH1cbiAgfVxuXG59XG5cbi8vdmFyIGRyYWluSWYgPSBleHBvcnRzLmRyYWluSWYgPSBmdW5jdGlvbiAob3AsIGRvbmUpIHtcbi8vICBzaW5rcy5kcmFpbihcbi8vfVxuXG52YXIgX3JlZHVjZSA9IGV4cG9ydHMuX3JlZHVjZSA9IGZ1bmN0aW9uIChyZWFkLCByZWR1Y2UsIGluaXRpYWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjbG9zZSwgY2IpIHtcbiAgICBpZihjbG9zZSkgcmV0dXJuIHJlYWQoY2xvc2UsIGNiKVxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICBzaW5rcy5kcmFpbihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaW5pdGlhbCA9IHJlZHVjZShpbml0aWFsLCBpdGVtKVxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGVuZGVkID0gZXJyIHx8IHRydWVcbiAgICAgIGlmKCFlcnIpIGNiKG51bGwsIGluaXRpYWwpXG4gICAgICBlbHNlICAgICBjYihlbmRlZClcbiAgICB9KVxuICAgIChyZWFkKVxuICB9XG59XG5cbnZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2tcblxudmFyIGhpZ2hXYXRlck1hcmsgPSBleHBvcnRzLmhpZ2hXYXRlck1hcmsgPVxuZnVuY3Rpb24gKHJlYWQsIGhpZ2hXYXRlck1hcmspIHtcbiAgdmFyIGJ1ZmZlciA9IFtdLCB3YWl0aW5nID0gW10sIGVuZGVkLCBlbmRpbmcsIHJlYWRpbmcgPSBmYWxzZVxuICBoaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyayB8fCAxMFxuXG4gIGZ1bmN0aW9uIHJlYWRBaGVhZCAoKSB7XG4gICAgd2hpbGUod2FpdGluZy5sZW5ndGggJiYgKGJ1ZmZlci5sZW5ndGggfHwgZW5kZWQpKVxuICAgICAgd2FpdGluZy5zaGlmdCgpKGVuZGVkLCBlbmRlZCA/IG51bGwgOiBidWZmZXIuc2hpZnQoKSlcblxuICAgIGlmICghYnVmZmVyLmxlbmd0aCAmJiBlbmRpbmcpIGVuZGVkID0gZW5kaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgaWYoZW5kZWQgfHwgZW5kaW5nIHx8IHJlYWRpbmcgfHwgYnVmZmVyLmxlbmd0aCA+PSBoaWdoV2F0ZXJNYXJrKVxuICAgICAgcmV0dXJuXG4gICAgcmVhZGluZyA9IHRydWVcbiAgICByZXR1cm4gcmVhZChlbmRlZCB8fCBlbmRpbmcsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgZW5kaW5nID0gZW5kaW5nIHx8IGVuZFxuICAgICAgaWYoZGF0YSAhPSBudWxsKSBidWZmZXIucHVzaChkYXRhKVxuXG4gICAgICBuZXh0KCk7IHJlYWRBaGVhZCgpXG4gICAgfSlcbiAgfVxuXG4gIHByb2Nlc3MubmV4dFRpY2sobmV4dClcblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBlbmRlZCA9IGVuZGVkIHx8IGVuZFxuICAgIHdhaXRpbmcucHVzaChjYilcblxuICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgfVxufVxuXG52YXIgZmxhdE1hcCA9IGV4cG9ydHMuZmxhdE1hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwcGVyKSB7XG4gIG1hcHBlciA9IG1hcHBlciB8fCBpZFxuICB2YXIgcXVldWUgPSBbXSwgZW5kZWRcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKHF1ZXVlLmxlbmd0aCkgcmV0dXJuIGNiKG51bGwsIHF1ZXVlLnNoaWZ0KCkpXG4gICAgZWxzZSBpZihlbmRlZCkgICByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICByZWFkKGFib3J0LCBmdW5jdGlvbiBuZXh0IChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkgZW5kZWQgPSBlbmRcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgYWRkID0gbWFwcGVyKGRhdGEpXG4gICAgICAgIHdoaWxlKGFkZCAmJiBhZGQubGVuZ3RoKVxuICAgICAgICAgIHF1ZXVlLnB1c2goYWRkLnNoaWZ0KCkpXG4gICAgICB9XG5cbiAgICAgIGlmKHF1ZXVlLmxlbmd0aCkgY2IobnVsbCwgcXVldWUuc2hpZnQoKSlcbiAgICAgIGVsc2UgaWYoZW5kZWQpICAgY2IoZW5kZWQpXG4gICAgICBlbHNlICAgICAgICAgICAgIHJlYWQobnVsbCwgbmV4dClcbiAgICB9KVxuICB9XG59XG5cbiIsInZhciBsb29wZXIgPSByZXF1aXJlKCdsb29wZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh3cml0ZXIsIGVuZGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIHZhciBxdWV1ZSA9IFtdLCBlbmRlZCwgZXJyb3JcblxuICAgIGZ1bmN0aW9uIGVucXVldWUgKGRhdGEpIHtcbiAgICAgIHF1ZXVlLnB1c2goZGF0YSlcbiAgICB9XG5cbiAgICB3cml0ZXIgPSB3cml0ZXIgfHwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHRoaXMucXVldWUoZGF0YSlcbiAgICB9XG5cbiAgICBlbmRlciA9IGVuZGVyIHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucXVldWUobnVsbClcbiAgICB9XG5cbiAgICB2YXIgZW1pdHRlciA9IHtcbiAgICAgIGVtaXQ6IGZ1bmN0aW9uIChldmVudCwgZGF0YSkge1xuICAgICAgICBpZihldmVudCA9PSAnZGF0YScpIGVucXVldWUoZGF0YSlcbiAgICAgICAgaWYoZXZlbnQgPT0gJ2VuZCcpICBlbmRlZCA9IHRydWUsIGVucXVldWUobnVsbClcbiAgICAgICAgaWYoZXZlbnQgPT0gJ2Vycm9yJykgZXJyb3IgPSBkYXRhXG4gICAgICB9LFxuICAgICAgcXVldWU6IGVucXVldWVcbiAgICB9XG4gICAgdmFyIF9jYlxuICAgIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgICAgZW5kZWQgPSBlbmRlZCB8fCBlbmRcbiAgICAgIGlmKGVuZClcbiAgICAgICAgcmV0dXJuIHJlYWQoZW5kLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYoX2NiKSB7XG4gICAgICAgICAgICB2YXIgdCA9IF9jYjsgX2NiID0gbnVsbDsgdChlbmQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNiKGVuZClcbiAgICAgICAgfSlcblxuICAgICAgX2NiID0gY2JcbiAgICAgIGxvb3BlcihmdW5jdGlvbiBwdWxsIChuZXh0KSB7XG4gICAgICAgIC8vaWYgaXQncyBhbiBlcnJvclxuICAgICAgICBpZighX2NiKSByZXR1cm5cbiAgICAgICAgY2IgPSBfY2JcbiAgICAgICAgaWYoZXJyb3IpIF9jYiA9IG51bGwsIGNiKGVycm9yKVxuICAgICAgICBlbHNlIGlmKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgIHZhciBkYXRhID0gcXVldWUuc2hpZnQoKVxuICAgICAgICAgIF9jYiA9IG51bGwsY2IoZGF0YSA9PT0gbnVsbCwgZGF0YSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZWFkKGVuZGVkLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgICAgICAgLy9udWxsIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgZm9yIHB1bGwtc3RyZWFtXG4gICAgICAgICAgICBpZihlbmQgJiYgZW5kICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGVycm9yID0gZW5kOyByZXR1cm4gbmV4dCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkgIGVuZGVyLmNhbGwoZW1pdHRlcilcbiAgICAgICAgICAgIGVsc2UgaWYoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB3cml0ZXIuY2FsbChlbWl0dGVyLCBkYXRhKVxuICAgICAgICAgICAgICBpZihlcnJvciB8fCBlbmRlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZChlcnJvciB8fCBlbmRlZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgX2NiID0gbnVsbDsgY2IoZXJyb3IgfHwgZW5kZWQpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHQocHVsbClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG4iLCJcbnZhciBsb29wZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgKGZ1bmN0aW9uIG5leHQgKCkge1xuICAgIHZhciBsb29wID0gdHJ1ZSwgcmV0dXJuZWQgPSBmYWxzZSwgc3luYyA9IGZhbHNlXG4gICAgZG8ge1xuICAgICAgc3luYyA9IHRydWU7IGxvb3AgPSBmYWxzZVxuICAgICAgZnVuLmNhbGwodGhpcywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZihzeW5jKSBsb29wID0gdHJ1ZVxuICAgICAgICBlbHNlICAgICBuZXh0KClcbiAgICAgIH0pXG4gICAgICBzeW5jID0gZmFsc2VcbiAgICB9IHdoaWxlKGxvb3ApXG4gIH0pKClcbn1cbiIsIlxudmFyIG9uY2UgPSBleHBvcnRzLm9uY2UgPVxuZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoYWJvcnQpIHJldHVybiBjYihhYm9ydClcbiAgICBpZih2YWx1ZSAhPSBudWxsKSB7XG4gICAgICB2YXIgX3ZhbHVlID0gdmFsdWU7IHZhbHVlID0gbnVsbFxuICAgICAgY2IobnVsbCwgX3ZhbHVlKVxuICAgIH0gZWxzZVxuICAgICAgY2IodHJ1ZSlcbiAgfVxufVxuXG52YXIgZGVwdGhGaXJzdCA9IGV4cG9ydHMuZGVwdGhGaXJzdCA9XG5mdW5jdGlvbiAoc3RhcnQsIGNyZWF0ZVN0cmVhbSkge1xuICB2YXIgcmVhZHMgPSBbXSwgZW5kZWRcblxuICByZWFkcy51bnNoaWZ0KG9uY2Uoc3RhcnQpKVxuXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgaWYoIXJlYWRzLmxlbmd0aClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIGlmKGVuZGVkKVxuICAgICAgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgcmVhZHNbMF0oZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHtcbiAgICAgICAgaWYoZW5kICE9PSB0cnVlKSB7XG4gICAgICAgICAgZW5kZWQgPSBlbmRcbiAgICAgICAgICByZWFkcy5zaGlmdCgpXG5cbiAgICAgICAgICB3aGlsZShyZWFkcy5sZW5ndGgpXG4gICAgICAgICAgICByZWFkcy5zaGlmdCgpKGVuZCwgZnVuY3Rpb24gKCkge30pXG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIGNiKGVuZClcbiAgICAgICAgfVxuICAgICAgICAvL2lmIHRoaXMgc3RyZWFtIGhhcyBlbmRlZCwgZ28gdG8gdGhlIG5leHQgcXVldWVcbiAgICAgICAgcmVhZHMuc2hpZnQoKVxuICAgICAgICByZXR1cm4gbmV4dChudWxsLCBjYilcbiAgICAgIH1cbiAgICAgIHJlYWRzLnVuc2hpZnQoY3JlYXRlU3RyZWFtKGRhdGEpKVxuICAgICAgY2IoZW5kLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cbi8vd2lkdGggZmlyc3QgaXMganVzdCBsaWtlIGRlcHRoIGZpcnN0LFxuLy9idXQgcHVzaCBlYWNoIG5ldyBzdHJlYW0gb250byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxudmFyIHdpZHRoRmlyc3QgPSBleHBvcnRzLndpZHRoRmlyc3QgPSBcbmZ1bmN0aW9uIChzdGFydCwgY3JlYXRlU3RyZWFtKSB7XG4gIHZhciByZWFkcyA9IFtdXG5cbiAgcmVhZHMucHVzaChvbmNlKHN0YXJ0KSlcblxuICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoZW5kLCBjYikge1xuICAgIGlmKCFyZWFkcy5sZW5ndGgpXG4gICAgICByZXR1cm4gY2IodHJ1ZSlcbiAgICByZWFkc1swXShlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkge1xuICAgICAgICByZWFkcy5zaGlmdCgpXG4gICAgICAgIHJldHVybiBuZXh0KG51bGwsIGNiKVxuICAgICAgfVxuICAgICAgcmVhZHMucHVzaChjcmVhdGVTdHJlYW0oZGF0YSkpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG4vL3RoaXMgY2FtZSBvdXQgZGlmZmVyZW50IHRvIHRoZSBmaXJzdCAoc3RybSlcbi8vYXR0ZW1wdCBhdCBsZWFmRmlyc3QsIGJ1dCBpdCdzIHN0aWxsIGEgdmFsaWRcbi8vdG9wb2xvZ2ljYWwgc29ydC5cbnZhciBsZWFmRmlyc3QgPSBleHBvcnRzLmxlYWZGaXJzdCA9IFxuZnVuY3Rpb24gKHN0YXJ0LCBjcmVhdGVTdHJlYW0pIHtcbiAgdmFyIHJlYWRzID0gW11cbiAgdmFyIG91dHB1dCA9IFtdXG4gIHJlYWRzLnB1c2gob25jZShzdGFydCkpXG4gIFxuICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoZW5kLCBjYikge1xuICAgIHJlYWRzWzBdKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSB7XG4gICAgICAgIHJlYWRzLnNoaWZ0KClcbiAgICAgICAgaWYoIW91dHB1dC5sZW5ndGgpXG4gICAgICAgICAgcmV0dXJuIGNiKHRydWUpXG4gICAgICAgIHJldHVybiBjYihudWxsLCBvdXRwdXQuc2hpZnQoKSlcbiAgICAgIH1cbiAgICAgIHJlYWRzLnVuc2hpZnQoY3JlYXRlU3RyZWFtKGRhdGEpKVxuICAgICAgb3V0cHV0LnVuc2hpZnQoZGF0YSlcbiAgICAgIG5leHQobnVsbCwgY2IpXG4gICAgfSlcbiAgfVxufVxuXG4iLCJcbnZhciBEZWNvZGUgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpLlN0cmluZ0RlY29kZXJcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZW5jKSB7XG4gIHZhciBkZWNvZGVyID0gbmV3IERlY29kZShlbmMpLCBlbmRlZFxuICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgICAgaWYoZW5kZWQpIHJldHVybiBjYihlbmRlZClcbiAgICAgIHJlYWQoYWJvcnQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgZW5kZWQgPSBlbmRcbiAgICAgICAgaWYodHJ1ZSA9PT0gZW5kKSB7XG4gICAgICAgICAgaWYoZGF0YSA9IGRlY29kZXIuZW5kKCkpIGNiKG51bGwsIGRhdGEpXG4gICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgIGNiKHRydWUpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihlbmQgJiYgKHRydWUgIT09IGVuZCkpXG4gICAgICAgICAgY2IoZW5kKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgY2IobnVsbCwgZGVjb2Rlci53cml0ZShkYXRhKSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCJ2YXIgbG9vcGVyID0gcmVxdWlyZSgnbG9vcGVyJylcbnZhciBUaHJvdWdoID0gcmVxdWlyZSgncHVsbC1jb3JlJykuVGhyb3VnaFxuXG52YXIgd2luZG93ID0gbW9kdWxlLmV4cG9ydHMgPVxuVGhyb3VnaChmdW5jdGlvbiAocmVhZCwgaW5pdCwgc3RhcnQpIHtcbiAgc3RhcnQgPSBzdGFydCB8fCBmdW5jdGlvbiAoc3RhcnQsIGRhdGEpIHtcbiAgICByZXR1cm4ge3N0YXJ0OiBzdGFydCwgZGF0YTogZGF0YX1cbiAgfVxuICB2YXIgd2luZG93cyA9IFtdLCBvdXRwdXQgPSBbXSwgZW5kZWQgPSBudWxsXG4gIHZhciBkYXRhLCBlbmRcbiAgdmFyIGogPSAwXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihvdXRwdXQubGVuZ3RoKVxuICAgICAgcmV0dXJuIGNiKG51bGwsIG91dHB1dC5zaGlmdCgpKVxuICAgIGlmKGVuZGVkKVxuICAgICAgcmV0dXJuIGNiKGVuZGVkKVxuICAgIHZhciBpID0gMFxuICAgIHZhciBrID0gaiArK1xuICAgIHJlYWQoYWJvcnQsIGxvb3BlcihmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICB2YXIgbmV4dCA9IHRoaXNcbiAgICAgIHZhciByZWR1Y2UsIHVwZGF0ZSwgb25jZSA9IGZhbHNlXG4gICAgICBpZihlbmQpXG4gICAgICAgIGVuZGVkID0gZW5kXG5cbiAgICAgIGZ1bmN0aW9uIF91cGRhdGUgKGVuZCwgX2RhdGEpIHtcbiAgICAgICAgaWYob25jZSkgcmV0dXJuXG4gICAgICAgIG9uY2UgPSB0cnVlXG4gICAgICAgIGRlbGV0ZSB3aW5kb3dzW3dpbmRvd3MuaW5kZXhPZih1cGRhdGUpXVxuICAgICAgICBvdXRwdXQucHVzaChzdGFydChkYXRhLCBfZGF0YSkpXG4gICAgICB9XG5cbiAgICAgIGlmKCFlbmRlZClcbiAgICAgICAgdXBkYXRlID0gaW5pdChkYXRhLCBfdXBkYXRlKVxuXG4gICAgICBpZih1cGRhdGUpXG4gICAgICAgIHdpbmRvd3MucHVzaCh1cGRhdGUpXG4gICAgICBlbHNlXG4gICAgICAgIC8vZG9uJ3QgYWxsb3cgZGF0YSB1bmxlc3MgYSB3aW5kb3cgc3RhcnRlZCBoZXJlIVxuICAgICAgICBvbmNlID0gdHJ1ZVxuXG4gICAgICB3aW5kb3dzLmZvckVhY2goZnVuY3Rpb24gKHVwZGF0ZSwgaSkge1xuICAgICAgICB1cGRhdGUoZW5kLCBkYXRhKVxuICAgICAgfSlcblxuICAgICAgaWYob3V0cHV0Lmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIG91dHB1dC5zaGlmdCgpKVxuICAgICAgZWxzZSBpZihlbmRlZClcbiAgICAgICAgcmV0dXJuIGNiKGVuZGVkKVxuICAgICAgZWxzZVxuICAgICAgICByZWFkKG51bGwsIG5leHQpXG5cbiAgfSkpXG4gIH1cbn0pXG5cbndpbmRvdy5yZWNlbnQgPSBmdW5jdGlvbiAoc2l6ZSwgdGltZSkge1xuICB2YXIgY3VycmVudCA9IG51bGxcbiAgcmV0dXJuIHdpbmRvdyhmdW5jdGlvbiAoZGF0YSwgY2IpIHtcbiAgICBpZihjdXJyZW50KSByZXR1cm5cbiAgICBjdXJyZW50ID0gW11cbiAgICB2YXIgdGltZXJcbiAgICAgIFxuICAgIGZ1bmN0aW9uIGRvbmUgKCkge1xuICAgICAgdmFyIF9jdXJyZW50ID0gY3VycmVudFxuICAgICAgY3VycmVudCA9IG51bGxcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgIGNiKG51bGwsIF9jdXJyZW50KVxuICAgIH1cblxuICAgIGlmKHRpbWUpXG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoZG9uZSwgdGltZSlcblxuICAgIHJldHVybiBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHJldHVybiBkb25lKClcbiAgICAgIGN1cnJlbnQucHVzaChkYXRhKVxuICAgICAgaWYoc2l6ZSAhPSBudWxsICYmIGN1cnJlbnQubGVuZ3RoID49IHNpemUpXG4gICAgICAgIGRvbmUoKVxuICAgIH1cbiAgfSwgZnVuY3Rpb24gKF8sIGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9KVxufVxuXG53aW5kb3cuc2xpZGluZyA9IGZ1bmN0aW9uIChyZWR1Y2UsIHdpZHRoKSB7XG4gIHdpZHRoID0gd2lkdGggfHwgMTBcbiAgdmFyIGsgPSAwXG4gIHJldHVybiB3aW5kb3coZnVuY3Rpb24gKGRhdGEsIGNiKSB7XG4gICAgdmFyIGFjY1xuICAgIHZhciBpID0gMFxuICAgIHZhciBsID0gaysrXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkgcmV0dXJuXG4gICAgICBhY2MgPSByZWR1Y2UoYWNjLCBkYXRhKVxuICAgICAgaWYod2lkdGggPD0gKysgaSlcbiAgICAgICAgY2IobnVsbCwgYWNjKVxuICAgIH1cbiAgfSlcbn1cbiIsInZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocGF0aCwgb3B0cywgY2IpIHtcbiAgaWYoJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygb3B0cylcbiAgICBjYiA9IG9wdHMsIG9wdHMgPSBudWxsXG4gIHZhciBmbGFncyA9IG9wdHMgJiYgb3B0cy5mbGFncyB8fCAndydcbiAgdmFyIG1vZGUgPSBvcHRzICYmIG9wdHMubW9kZSB8fCAwNjY2XG4gIHZhciBwb3MgPSAwXG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIGZzLm9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICByZWFkKG51bGwsIGZ1bmN0aW9uIG5leHQgKGVuZCwgZGF0YSkge1xuICAgICAgICBpZihlbmQgPT09IHRydWUpIGZzLmNsb3NlKGZkLCBjYilcbiAgICAgICAgZWxzZSBpZihlbmQpICAgICBjYihlbmQpIC8vZXJyb3IhXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBmcy53cml0ZShmZCwgZGF0YSwgMCwgZGF0YS5sZW5ndGgsIHBvcywgZnVuY3Rpb24gKGVyciwgYnl0ZXMpIHtcbiAgICAgICAgICAgIGlmKGVycikgcmVhZChlcnIsIGZ1bmN0aW9uICgpIHsgZnMuY2xvc2UoZmQsIGNiKSB9KVxuICAgICAgICAgICAgZWxzZSAgICBwb3MgKz0gYnl0ZXMsIHJlYWQobnVsbCwgbmV4dClcbiAgICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cblxuIiwiLy9hbm90aGVyIGlkZWE6IGJ1ZmZlciAyKiB0aGUgbWF4LCBidXQgb25seSBjYWxsIHdyaXRlIHdpdGggaGFsZiBvZiB0aGF0LFxuLy90aGlzIGNvdWxkIG1hbmFnZSBjYXNlcyB3aGVyZSB0aGUgcmVhZCBhaGVhZCBpcyBsYXRlbnQuIEhtbSwgd2UgcHJvYmFibHlcbi8vc2hvdWxkbid0IGd1ZXNzIGF0IHRoYXQgaGVyZSwganVzdCBoYW5kbGUgd3JpdGUgbGF0ZW5jeS5cblxuLy9ob3cgd291bGQgd2UgbWVhc3VyZSB0aGlzIGFueXdheT9cblxuZnVuY3Rpb24gYXBwZW5kIChhcnJheSwgaXRlbSkge1xuICAoYXJyYXkgPSBhcnJheSB8fCBbXSkucHVzaChpdGVtKVxuICByZXR1cm4gYXJyYXlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAod3JpdGUsIHJlZHVjZSwgbWF4LCBjYikge1xuICByZWR1Y2UgPSByZWR1Y2UgfHwgYXBwZW5kXG4gIHZhciBlbmRlZFxuICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICB2YXIgcXVldWUgPSBudWxsLCB3cml0aW5nID0gZmFsc2UsIGxlbmd0aCA9IDBcblxuICAgIGZ1bmN0aW9uIGZsdXNoICgpIHtcbiAgICAgIGlmKHdyaXRpbmcpIHJldHVyblxuICAgICAgdmFyIF9xdWV1ZSA9IHF1ZXVlXG4gICAgICBxdWV1ZSA9IG51bGw7IHdyaXRpbmcgPSB0cnVlOyBsZW5ndGggPSAwXG4gICAgICB3cml0ZShfcXVldWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgd3JpdGluZyA9IGZhbHNlXG5cbiAgICAgICAgaWYoZW5kZWQgPT09IHRydWUgJiYgIWxlbmd0aCkgY2IoZXJyKVxuICAgICAgICBlbHNlIGlmKGVuZGVkICYmIGVuZGVkICE9PSB0cnVlKSBjYihlcnIgfHwgZW5kZWQpXG4gICAgICAgIGVsc2UgaWYoZXJyKSByZWFkKGVuZGVkID0gZXJyLCBjYikgLy9hYm9ydCB1cHN0cmVhbS5cbiAgICAgICAgZWxzZSBpZihsZW5ndGgpIGZsdXNoKClcbiAgICAgICAgZWxzZSByZWFkKG51bGwsIG5leHQpXG4gICAgICB9KVxuICAgIH1cbiAgICBmdW5jdGlvbiBuZXh0IChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZGVkKSByZXR1cm5cbiAgICAgIGVuZGVkID0gZW5kXG4gICAgICBpZighZW5kZWQpIHtcbiAgICAgICAgcXVldWUgPSByZWR1Y2UocXVldWUsIGRhdGEpXG4gICAgICAgIGxlbmd0aCA9IChxdWV1ZSAmJiBxdWV1ZS5sZW5ndGgpIHx8IDBcbiAgICAgICAgaWYocXVldWUgIT0gbnVsbCkgZmx1c2goKVxuICAgICAgICBpZihsZW5ndGggPCBtYXgpIHJlYWQobnVsbCwgbmV4dClcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYoIXdyaXRpbmcpIGNiKGVuZGVkID09PSB0cnVlID8gbnVsbCA6IGVuZGVkKVxuICAgIH1cbiAgICByZWFkKG51bGwsIG5leHQpXG4gIH1cbn1cblxuXG4iLCIndXNlIHN0cmljdCc7XG52YXIgd3MgPSByZXF1aXJlKCdwdWxsLXdzJylcbnZhciBXZWJTb2NrZXQgPSByZXF1aXJlKCd3cycpXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcblxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7XG4gIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZlxufVxuXG5leHBvcnRzLmNvbm5lY3QgPSBmdW5jdGlvbiAoYWRkciwgb3B0cykge1xuICB2YXIgc3RyZWFtXG4gIGlmKGlzRnVuY3Rpb24ob3B0cykpIHtcbiAgICB2YXIgY2IgPSBvcHRzXG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlXG4gICAgb3B0cyA9IHtcbiAgICAgIG9uT3BlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZihjYWxsZWQpIHJldHVyblxuICAgICAgICBjYWxsZWQgPSB0cnVlXG4gICAgICAgIGNiKG51bGwsIHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBvbkNsb3NlOiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmKGNhbGxlZCkgcmV0dXJuXG4gICAgICAgIGNhbGxlZCA9IHRydWVcbiAgICAgICAgY2IoZXJyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgdSA9IChcbiAgICAnc3RyaW5nJyA9PT0gdHlwZW9mIGFkZHJcbiAgPyBhZGRyXG4gIDogdXJsLmZvcm1hdCh7XG4gICAgICBwcm90b2NvbDogJ3dzJywgc2xhc2hlczogdHJ1ZSxcbiAgICAgIGhvc3RuYW1lOiBhZGRyLmhvc3QgfHwgYWRkci5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IGFkZHIucG9ydCxcbiAgICAgIHBhdGhuYW1lOiBhZGRyLnBhdGhuYW1lXG4gICAgfSlcbiAgKVxuXG4gIHZhciBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHUpXG4gIHN0cmVhbSA9IHdzKHNvY2tldClcbiAgc3RyZWFtLnJlbW90ZUFkZHJlc3MgPSB1XG5cbiAgaWYgKG9wdHMgJiYgdHlwZW9mIG9wdHMub25PcGVuID09ICdmdW5jdGlvbicpIHtcbiAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIG9wdHMub25PcGVuKVxuICB9XG4gIGlmIChvcHRzICYmIHR5cGVvZiBvcHRzLm9uQ2xvc2UgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIG9wdHMub25DbG9zZSlcbiAgfVxuXG4gIHN0cmVhbS5jbG9zZSA9IGZ1bmN0aW9uIChjYikge1xuICAgIGlmIChjYiAmJiB0eXBlb2YgY2IgPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIGNiKVxuICAgIHNvY2tldC5jbG9zZSgpXG4gIH1cblxuICByZXR1cm4gc3RyZWFtXG59XG5cbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGR1cGxleDtcblxuZXhwb3J0cy5zb3VyY2UgPSByZXF1aXJlKCcuL3NvdXJjZScpO1xuZXhwb3J0cy5zaW5rID0gcmVxdWlyZSgnLi9zaW5rJyk7XG5cbmZ1bmN0aW9uIGR1cGxleCAod3MsIG9wdHMpIHtcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2U6IGV4cG9ydHMuc291cmNlKHdzKSxcbiAgICBzaW5rOiBleHBvcnRzLnNpbmsod3MsIG9wdHMpXG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzb2NrZXQsIGNhbGxiYWNrKSB7XG4gIHZhciByZW1vdmUgPSBzb2NrZXQgJiYgKHNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyIHx8IHNvY2tldC5yZW1vdmVMaXN0ZW5lcik7XG5cbiAgZnVuY3Rpb24gY2xlYW51cCAoKSB7XG4gICAgaWYgKHR5cGVvZiByZW1vdmUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVtb3ZlLmNhbGwoc29ja2V0LCAnb3BlbicsIGhhbmRsZU9wZW4pO1xuICAgICAgcmVtb3ZlLmNhbGwoc29ja2V0LCAnZXJyb3InLCBoYW5kbGVFcnIpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU9wZW4oZXZ0KSB7XG4gICAgY2xlYW51cCgpOyBjYWxsYmFjaygpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlRXJyIChldnQpIHtcbiAgICBjbGVhbnVwKCk7IGNhbGxiYWNrKGV2dCk7XG4gIH1cblxuICAvLyBpZiB0aGUgc29ja2V0IGlzIGNsb3Npbmcgb3IgY2xvc2VkLCByZXR1cm4gZW5kXG4gIGlmIChzb2NrZXQucmVhZHlTdGF0ZSA+PSAyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKHRydWUpO1xuICB9XG5cbiAgLy8gaWYgb3BlbiwgdHJpZ2dlciB0aGUgY2FsbGJhY2tcbiAgaWYgKHNvY2tldC5yZWFkeVN0YXRlID09PSAxKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cblxuICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIGhhbmRsZU9wZW4pO1xuICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoYW5kbGVFcnIpO1xufTtcbiIsInZhciBwdWxsID0gcmVxdWlyZSgncHVsbC1jb3JlJyk7XG52YXIgcmVhZHkgPSByZXF1aXJlKCcuL3JlYWR5Jyk7XG5cbi8qKlxuICAjIyMgYHNpbmsoc29ja2V0LCBvcHRzPylgXG5cbiAgQ3JlYXRlIGEgcHVsbC1zdHJlYW0gYFNpbmtgIHRoYXQgd2lsbCB3cml0ZSBkYXRhIHRvIHRoZSBgc29ja2V0YC5cblxuICA8PDwgZXhhbXBsZXMvd3JpdGUuanNcblxuKiovXG5tb2R1bGUuZXhwb3J0cyA9IHB1bGwuU2luayhmdW5jdGlvbihyZWFkLCBzb2NrZXQsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgdmFyIGNsb3NlT25FbmQgPSBvcHRzLmNsb3NlT25FbmQgIT09IGZhbHNlO1xuICB2YXIgb25DbG9zZSA9ICdmdW5jdGlvbicgPT09IHR5cGVvZiBvcHRzID8gb3B0cyA6IG9wdHMub25DbG9zZTtcblxuICBmdW5jdGlvbiBuZXh0KGVuZCwgZGF0YSkge1xuICAgIC8vIGlmIHRoZSBzdHJlYW0gaGFzIGVuZGVkLCBzaW1wbHkgcmV0dXJuXG4gICAgaWYgKGVuZCkge1xuICAgICAgaWYgKGNsb3NlT25FbmQgJiYgc29ja2V0LnJlYWR5U3RhdGUgPD0gMSkge1xuICAgICAgICBpZihvbkNsb3NlKVxuICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYoZXYud2FzQ2xlYW4pIG9uQ2xvc2UoKVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ3dzIGVycm9yJylcbiAgICAgICAgICAgICAgZXJyLmV2ZW50ID0gZXZcbiAgICAgICAgICAgICAgb25DbG9zZShlcnIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzb2NrZXQgcmVhZHk/XG4gICAgcmVhZHkoc29ja2V0LCBmdW5jdGlvbihlbmQpIHtcbiAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWQoZW5kLCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgICB9XG5cbiAgICAgIHNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgcmVhZChudWxsLCBuZXh0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZChudWxsLCBuZXh0KTtcbn0pO1xuIiwidmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLWNvcmUnKTtcbnZhciByZWFkeSA9IHJlcXVpcmUoJy4vcmVhZHknKTtcblxuLyoqXG4gICMjIyBgc291cmNlKHNvY2tldClgXG5cbiAgQ3JlYXRlIGEgcHVsbC1zdHJlYW0gYFNvdXJjZWAgdGhhdCB3aWxsIHJlYWQgZGF0YSBmcm9tIHRoZSBgc29ja2V0YC5cblxuICA8PDwgZXhhbXBsZXMvcmVhZC5qc1xuXG4qKi9cbm1vZHVsZS5leHBvcnRzID0gcHVsbC5Tb3VyY2UoZnVuY3Rpb24oc29ja2V0KSB7XG4gIHZhciBidWZmZXIgPSBbXTtcbiAgdmFyIHJlY2VpdmVyO1xuICB2YXIgZW5kZWQ7XG5cbiAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbihldnQpIHtcbiAgICBpZiAocmVjZWl2ZXIpIHtcbiAgICAgIHJldHVybiByZWNlaXZlcihudWxsLCBldnQuZGF0YSk7XG4gICAgfVxuXG4gICAgYnVmZmVyLnB1c2goZXZ0LmRhdGEpO1xuICB9KTtcblxuICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBmdW5jdGlvbihldnQpIHtcbiAgICBpZiAoZW5kZWQpIHJldHVybjtcbiAgICBpZiAocmVjZWl2ZXIpIHtcbiAgICAgIHJldHVybiByZWNlaXZlcihlbmRlZCA9IHRydWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGlmIChlbmRlZCkgcmV0dXJuO1xuICAgIGVuZGVkID0gZXZ0O1xuICAgIGlmIChyZWNlaXZlcikge1xuICAgICAgcmVjZWl2ZXIoZW5kZWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gcmVhZChhYm9ydCwgY2IpIHtcbiAgICByZWNlaXZlciA9IG51bGw7XG5cbiAgICAvL2lmIHN0cmVhbSBoYXMgYWxyZWFkeSBlbmRlZC5cbiAgICBpZiAoZW5kZWQpXG4gICAgICByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICAvLyBpZiBlbmRlZCwgYWJvcnRcbiAgICBpZiAoYWJvcnQpIHtcbiAgICAgIC8vdGhpcyB3aWxsIGNhbGxiYWNrIHdoZW4gc29ja2V0IGNsb3Nlc1xuICAgICAgcmVjZWl2ZXIgPSBjYlxuICAgICAgcmV0dXJuIHNvY2tldC5jbG9zZSgpXG4gICAgfVxuXG4gICAgcmVhZHkoc29ja2V0LCBmdW5jdGlvbihlbmQpIHtcbiAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgcmV0dXJuIGNiKGVuZGVkID0gZW5kKTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVhZCBmcm9tIHRoZSBzb2NrZXRcbiAgICAgIGlmIChlbmRlZCAmJiBlbmRlZCAhPT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gY2IoZW5kZWQpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIGJ1ZmZlci5zaGlmdCgpKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGVuZGVkKSB7XG4gICAgICAgIHJldHVybiBjYih0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmVjZWl2ZXIgPSBjYjtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gcmVhZDtcbn0pO1xuIiwiLyohIGh0dHBzOi8vbXRocy5iZS9wdW55Y29kZSB2MS4zLjIgYnkgQG1hdGhpYXMgKi9cbjsoZnVuY3Rpb24ocm9vdCkge1xuXG5cdC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZXMgKi9cblx0dmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJlxuXHRcdCFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cdHZhciBmcmVlTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiZcblx0XHQhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblx0dmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbDtcblx0aWYgKFxuXHRcdGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8XG5cdFx0ZnJlZUdsb2JhbC53aW5kb3cgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLnNlbGYgPT09IGZyZWVHbG9iYWxcblx0KSB7XG5cdFx0cm9vdCA9IGZyZWVHbG9iYWw7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGBwdW55Y29kZWAgb2JqZWN0LlxuXHQgKiBAbmFtZSBwdW55Y29kZVxuXHQgKiBAdHlwZSBPYmplY3Rcblx0ICovXG5cdHZhciBwdW55Y29kZSxcblxuXHQvKiogSGlnaGVzdCBwb3NpdGl2ZSBzaWduZWQgMzItYml0IGZsb2F0IHZhbHVlICovXG5cdG1heEludCA9IDIxNDc0ODM2NDcsIC8vIGFrYS4gMHg3RkZGRkZGRiBvciAyXjMxLTFcblxuXHQvKiogQm9vdHN0cmluZyBwYXJhbWV0ZXJzICovXG5cdGJhc2UgPSAzNixcblx0dE1pbiA9IDEsXG5cdHRNYXggPSAyNixcblx0c2tldyA9IDM4LFxuXHRkYW1wID0gNzAwLFxuXHRpbml0aWFsQmlhcyA9IDcyLFxuXHRpbml0aWFsTiA9IDEyOCwgLy8gMHg4MFxuXHRkZWxpbWl0ZXIgPSAnLScsIC8vICdcXHgyRCdcblxuXHQvKiogUmVndWxhciBleHByZXNzaW9ucyAqL1xuXHRyZWdleFB1bnljb2RlID0gL154bi0tLyxcblx0cmVnZXhOb25BU0NJSSA9IC9bXlxceDIwLVxceDdFXS8sIC8vIHVucHJpbnRhYmxlIEFTQ0lJIGNoYXJzICsgbm9uLUFTQ0lJIGNoYXJzXG5cdHJlZ2V4U2VwYXJhdG9ycyA9IC9bXFx4MkVcXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2csIC8vIFJGQyAzNDkwIHNlcGFyYXRvcnNcblxuXHQvKiogRXJyb3IgbWVzc2FnZXMgKi9cblx0ZXJyb3JzID0ge1xuXHRcdCdvdmVyZmxvdyc6ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcycsXG5cdFx0J25vdC1iYXNpYyc6ICdJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpJyxcblx0XHQnaW52YWxpZC1pbnB1dCc6ICdJbnZhbGlkIGlucHV0J1xuXHR9LFxuXG5cdC8qKiBDb252ZW5pZW5jZSBzaG9ydGN1dHMgKi9cblx0YmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluLFxuXHRmbG9vciA9IE1hdGguZmxvb3IsXG5cdHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUsXG5cblx0LyoqIFRlbXBvcmFyeSB2YXJpYWJsZSAqL1xuXHRrZXk7XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0LyoqXG5cdCAqIEEgZ2VuZXJpYyBlcnJvciB1dGlsaXR5IGZ1bmN0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXJyb3IgdHlwZS5cblx0ICogQHJldHVybnMge0Vycm9yfSBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2l0aCB0aGUgYXBwbGljYWJsZSBlcnJvciBtZXNzYWdlLlxuXHQgKi9cblx0ZnVuY3Rpb24gZXJyb3IodHlwZSkge1xuXHRcdHRocm93IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG5cdCAqIGFkZHJlc3Nlcy5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdFx0c3RyaW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRcdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG5cdFx0cmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZGVjb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBjb3VudGVyID0gMCxcblx0XHQgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcblx0XHQgICAgdmFsdWUsXG5cdFx0ICAgIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBlbmNvZGVcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGluIHRoZSByYW5nZSBgMGAgdG8gYGJhc2UgLSAxYCwgb3IgYGJhc2VgIGlmXG5cdCAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYmFzaWNUb0RpZ2l0KGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgLSA0OCA8IDEwKSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA2NSA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA5NyA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XG5cdFx0fVxuXHRcdHJldHVybiBiYXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuXHQgKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuXHQgKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdFx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0XHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG5cdCAqIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGZ1bmN0aW9uIGFkYXB0KGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuXHRcdHZhciBrID0gMDtcblx0XHRkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxO1xuXHRcdGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcblx0XHRmb3IgKC8qIG5vIGluaXRpYWxpemF0aW9uICovOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuXHRcdFx0ZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMgdG8gYSBzdHJpbmcgb2YgVW5pY29kZVxuXHQgKiBzeW1ib2xzLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqL1xuXHRmdW5jdGlvbiBkZWNvZGUoaW5wdXQpIHtcblx0XHQvLyBEb24ndCB1c2UgVUNTLTJcblx0XHR2YXIgb3V0cHV0ID0gW10sXG5cdFx0ICAgIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLFxuXHRcdCAgICBvdXQsXG5cdFx0ICAgIGkgPSAwLFxuXHRcdCAgICBuID0gaW5pdGlhbE4sXG5cdFx0ICAgIGJpYXMgPSBpbml0aWFsQmlhcyxcblx0XHQgICAgYmFzaWMsXG5cdFx0ICAgIGosXG5cdFx0ICAgIGluZGV4LFxuXHRcdCAgICBvbGRpLFxuXHRcdCAgICB3LFxuXHRcdCAgICBrLFxuXHRcdCAgICBkaWdpdCxcblx0XHQgICAgdCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGJhc2VNaW51c1Q7XG5cblx0XHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzOiBsZXQgYGJhc2ljYCBiZSB0aGUgbnVtYmVyIG9mIGlucHV0IGNvZGVcblx0XHQvLyBwb2ludHMgYmVmb3JlIHRoZSBsYXN0IGRlbGltaXRlciwgb3IgYDBgIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4gY29weVxuXHRcdC8vIHRoZSBmaXJzdCBiYXNpYyBjb2RlIHBvaW50cyB0byB0aGUgb3V0cHV0LlxuXG5cdFx0YmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuXHRcdGlmIChiYXNpYyA8IDApIHtcblx0XHRcdGJhc2ljID0gMDtcblx0XHR9XG5cblx0XHRmb3IgKGogPSAwOyBqIDwgYmFzaWM7ICsraikge1xuXHRcdFx0Ly8gaWYgaXQncyBub3QgYSBiYXNpYyBjb2RlIHBvaW50XG5cdFx0XHRpZiAoaW5wdXQuY2hhckNvZGVBdChqKSA+PSAweDgwKSB7XG5cdFx0XHRcdGVycm9yKCdub3QtYmFzaWMnKTtcblx0XHRcdH1cblx0XHRcdG91dHB1dC5wdXNoKGlucHV0LmNoYXJDb2RlQXQoaikpO1xuXHRcdH1cblxuXHRcdC8vIE1haW4gZGVjb2RpbmcgbG9vcDogc3RhcnQganVzdCBhZnRlciB0aGUgbGFzdCBkZWxpbWl0ZXIgaWYgYW55IGJhc2ljIGNvZGVcblx0XHQvLyBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLlxuXG5cdFx0Zm9yIChpbmRleCA9IGJhc2ljID4gMCA/IGJhc2ljICsgMSA6IDA7IGluZGV4IDwgaW5wdXRMZW5ndGg7IC8qIG5vIGZpbmFsIGV4cHJlc3Npb24gKi8pIHtcblxuXHRcdFx0Ly8gYGluZGV4YCBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIGNvbnN1bWVkLlxuXHRcdFx0Ly8gRGVjb2RlIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgaW50byBgZGVsdGFgLFxuXHRcdFx0Ly8gd2hpY2ggZ2V0cyBhZGRlZCB0byBgaWAuIFRoZSBvdmVyZmxvdyBjaGVja2luZyBpcyBlYXNpZXJcblx0XHRcdC8vIGlmIHdlIGluY3JlYXNlIGBpYCBhcyB3ZSBnbywgdGhlbiBzdWJ0cmFjdCBvZmYgaXRzIHN0YXJ0aW5nXG5cdFx0XHQvLyB2YWx1ZSBhdCB0aGUgZW5kIHRvIG9idGFpbiBgZGVsdGFgLlxuXHRcdFx0Zm9yIChvbGRpID0gaSwgdyA9IDEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXG5cdFx0XHRcdGlmIChpbmRleCA+PSBpbnB1dExlbmd0aCkge1xuXHRcdFx0XHRcdGVycm9yKCdpbnZhbGlkLWlucHV0Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkaWdpdCA9IGJhc2ljVG9EaWdpdChpbnB1dC5jaGFyQ29kZUF0KGluZGV4KyspKTtcblxuXHRcdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSB8fCBkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpICs9IGRpZ2l0ICogdztcblx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0IDwgdCkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRpZiAodyA+IGZsb29yKG1heEludCAvIGJhc2VNaW51c1QpKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3ICo9IGJhc2VNaW51c1Q7XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0ID0gb3V0cHV0Lmxlbmd0aCArIDE7XG5cdFx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdFx0Ly8gYGlgIHdhcyBzdXBwb3NlZCB0byB3cmFwIGFyb3VuZCBmcm9tIGBvdXRgIHRvIGAwYCxcblx0XHRcdC8vIGluY3JlbWVudGluZyBgbmAgZWFjaCB0aW1lLCBzbyB3ZSdsbCBmaXggdGhhdCBub3c6XG5cdFx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRuICs9IGZsb29yKGkgLyBvdXQpO1xuXHRcdFx0aSAlPSBvdXQ7XG5cblx0XHRcdC8vIEluc2VydCBgbmAgYXQgcG9zaXRpb24gYGlgIG9mIHRoZSBvdXRwdXRcblx0XHRcdG91dHB1dC5zcGxpY2UoaSsrLCAwLCBuKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB1Y3MyZW5jb2RlKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcblx0ICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZW5jb2RlKGlucHV0KSB7XG5cdFx0dmFyIG4sXG5cdFx0ICAgIGRlbHRhLFxuXHRcdCAgICBoYW5kbGVkQ1BDb3VudCxcblx0XHQgICAgYmFzaWNMZW5ndGgsXG5cdFx0ICAgIGJpYXMsXG5cdFx0ICAgIGosXG5cdFx0ICAgIG0sXG5cdFx0ICAgIHEsXG5cdFx0ICAgIGssXG5cdFx0ICAgIHQsXG5cdFx0ICAgIGN1cnJlbnRWYWx1ZSxcblx0XHQgICAgb3V0cHV0ID0gW10sXG5cdFx0ICAgIC8qKiBgaW5wdXRMZW5ndGhgIHdpbGwgaG9sZCB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIGluIGBpbnB1dGAuICovXG5cdFx0ICAgIGlucHV0TGVuZ3RoLFxuXHRcdCAgICAvKiogQ2FjaGVkIGNhbGN1bGF0aW9uIHJlc3VsdHMgKi9cblx0XHQgICAgaGFuZGxlZENQQ291bnRQbHVzT25lLFxuXHRcdCAgICBiYXNlTWludXNULFxuXHRcdCAgICBxTWludXNUO1xuXG5cdFx0Ly8gQ29udmVydCB0aGUgaW5wdXQgaW4gVUNTLTIgdG8gVW5pY29kZVxuXHRcdGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cblx0XHQvLyBDYWNoZSB0aGUgbGVuZ3RoXG5cdFx0aW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cblx0XHQvLyBJbml0aWFsaXplIHRoZSBzdGF0ZVxuXHRcdG4gPSBpbml0aWFsTjtcblx0XHRkZWx0YSA9IDA7XG5cdFx0YmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50c1xuXHRcdGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShjdXJyZW50VmFsdWUpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcblxuXHRcdC8vIGBoYW5kbGVkQ1BDb3VudGAgaXMgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXHRcdC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cblxuXHRcdC8vIEZpbmlzaCB0aGUgYmFzaWMgc3RyaW5nIC0gaWYgaXQgaXMgbm90IGVtcHR5IC0gd2l0aCBhIGRlbGltaXRlclxuXHRcdGlmIChiYXNpY0xlbmd0aCkge1xuXHRcdFx0b3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGVuY29kaW5nIGxvb3A6XG5cdFx0d2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcblxuXHRcdFx0Ly8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dFxuXHRcdFx0Ly8gbGFyZ2VyIG9uZTpcblx0XHRcdGZvciAobSA9IG1heEludCwgaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkge1xuXHRcdFx0XHRcdG0gPSBjdXJyZW50VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LFxuXHRcdFx0Ly8gYnV0IGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3dcblx0XHRcdGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcblx0XHRcdGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuXHRcdFx0biA9IG07XG5cblx0XHRcdGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT0gbikge1xuXHRcdFx0XHRcdC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyXG5cdFx0XHRcdFx0Zm9yIChxID0gZGVsdGEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXHRcdFx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cdFx0XHRcdFx0XHRpZiAocSA8IHQpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRxTWludXNUID0gcSAtIHQ7XG5cdFx0XHRcdFx0XHRiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaChcblx0XHRcdFx0XHRcdFx0c3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QsIDApKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxLCAwKSkpO1xuXHRcdFx0XHRcdGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7XG5cdFx0XHRcdFx0ZGVsdGEgPSAwO1xuXHRcdFx0XHRcdCsraGFuZGxlZENQQ291bnQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0KytkZWx0YTtcblx0XHRcdCsrbjtcblxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3Ncblx0ICogdG8gVW5pY29kZS4gT25seSB0aGUgUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLlxuXHQgKiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCBvbiBhIHN0cmluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cblx0ICogY29udmVydGVkIHRvIFVuaWNvZGUuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlZCBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIGNvbnZlcnQgdG8gVW5pY29kZS5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG5cdCAqIHN0cmluZy5cblx0ICovXG5cdGZ1bmN0aW9uIHRvVW5pY29kZShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gZGVjb2RlKHN0cmluZy5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFVuaWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3MgdG9cblx0ICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG5cdCAqIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpblxuXHQgKiBBU0NJSS5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0LCBhcyBhXG5cdCAqIFVuaWNvZGUgc3RyaW5nLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG5cdCAqIGVtYWlsIGFkZHJlc3MuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b0FTQ0lJKGlucHV0KSB7XG5cdFx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gcmVnZXhOb25BU0NJSS50ZXN0KHN0cmluZylcblx0XHRcdFx0PyAneG4tLScgKyBlbmNvZGUoc3RyaW5nKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKiBEZWZpbmUgdGhlIHB1YmxpYyBBUEkgKi9cblx0cHVueWNvZGUgPSB7XG5cdFx0LyoqXG5cdFx0ICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IFB1bnljb2RlLmpzIHZlcnNpb24gbnVtYmVyLlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdCd2ZXJzaW9uJzogJzEuMy4yJyxcblx0XHQvKipcblx0XHQgKiBBbiBvYmplY3Qgb2YgbWV0aG9kcyB0byBjb252ZXJ0IGZyb20gSmF2YVNjcmlwdCdzIGludGVybmFsIGNoYXJhY3RlclxuXHRcdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG5cdFx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdFx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdFx0ICogQHR5cGUgT2JqZWN0XG5cdFx0ICovXG5cdFx0J3VjczInOiB7XG5cdFx0XHQnZGVjb2RlJzogdWNzMmRlY29kZSxcblx0XHRcdCdlbmNvZGUnOiB1Y3MyZW5jb2RlXG5cdFx0fSxcblx0XHQnZGVjb2RlJzogZGVjb2RlLFxuXHRcdCdlbmNvZGUnOiBlbmNvZGUsXG5cdFx0J3RvQVNDSUknOiB0b0FTQ0lJLFxuXHRcdCd0b1VuaWNvZGUnOiB0b1VuaWNvZGVcblx0fTtcblxuXHQvKiogRXhwb3NlIGBwdW55Y29kZWAgKi9cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoJ3B1bnljb2RlJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gcHVueWNvZGU7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSkge1xuXHRcdGlmIChtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cykgeyAvLyBpbiBOb2RlLmpzIG9yIFJpbmdvSlMgdjAuOC4wK1xuXHRcdFx0ZnJlZU1vZHVsZS5leHBvcnRzID0gcHVueWNvZGU7XG5cdFx0fSBlbHNlIHsgLy8gaW4gTmFyd2hhbCBvciBSaW5nb0pTIHYwLjcuMC1cblx0XHRcdGZvciAoa2V5IGluIHB1bnljb2RlKSB7XG5cdFx0XHRcdHB1bnljb2RlLmhhc093blByb3BlcnR5KGtleSkgJiYgKGZyZWVFeHBvcnRzW2tleV0gPSBwdW55Y29kZVtrZXldKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7IC8vIGluIFJoaW5vIG9yIGEgd2ViIGJyb3dzZXJcblx0XHRyb290LnB1bnljb2RlID0gcHVueWNvZGU7XG5cdH1cblxufSh0aGlzKSk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBJZiBvYmouaGFzT3duUHJvcGVydHkgaGFzIGJlZW4gb3ZlcnJpZGRlbiwgdGhlbiBjYWxsaW5nXG4vLyBvYmouaGFzT3duUHJvcGVydHkocHJvcCkgd2lsbCBicmVhay5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzA3XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHFzLCBzZXAsIGVxLCBvcHRpb25zKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICB2YXIgb2JqID0ge307XG5cbiAgaWYgKHR5cGVvZiBxcyAhPT0gJ3N0cmluZycgfHwgcXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHZhciByZWdleHAgPSAvXFwrL2c7XG4gIHFzID0gcXMuc3BsaXQoc2VwKTtcblxuICB2YXIgbWF4S2V5cyA9IDEwMDA7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm1heEtleXMgPT09ICdudW1iZXInKSB7XG4gICAgbWF4S2V5cyA9IG9wdGlvbnMubWF4S2V5cztcbiAgfVxuXG4gIHZhciBsZW4gPSBxcy5sZW5ndGg7XG4gIC8vIG1heEtleXMgPD0gMCBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbGltaXQga2V5cyBjb3VudFxuICBpZiAobWF4S2V5cyA+IDAgJiYgbGVuID4gbWF4S2V5cykge1xuICAgIGxlbiA9IG1heEtleXM7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIHggPSBxc1tpXS5yZXBsYWNlKHJlZ2V4cCwgJyUyMCcpLFxuICAgICAgICBpZHggPSB4LmluZGV4T2YoZXEpLFxuICAgICAgICBrc3RyLCB2c3RyLCBrLCB2O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBrc3RyID0geC5zdWJzdHIoMCwgaWR4KTtcbiAgICAgIHZzdHIgPSB4LnN1YnN0cihpZHggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAga3N0ciA9IHg7XG4gICAgICB2c3RyID0gJyc7XG4gICAgfVxuXG4gICAgayA9IGRlY29kZVVSSUNvbXBvbmVudChrc3RyKTtcbiAgICB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KHZzdHIpO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShvYmosIGspKSB7XG4gICAgICBvYmpba10gPSB2O1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICBvYmpba10ucHVzaCh2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tdID0gW29ialtrXSwgdl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeVByaW1pdGl2ZSA9IGZ1bmN0aW9uKHYpIHtcbiAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHYgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBzZXAsIGVxLCBuYW1lKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgb2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG1hcChvYmplY3RLZXlzKG9iaiksIGZ1bmN0aW9uKGspIHtcbiAgICAgIHZhciBrcyA9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUoaykpICsgZXE7XG4gICAgICBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICAgIHJldHVybiBtYXAob2JqW2tdLCBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZSh2KSk7XG4gICAgICAgIH0pLmpvaW4oc2VwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqW2tdKSk7XG4gICAgICB9XG4gICAgfSkuam9pbihzZXApO1xuXG4gIH1cblxuICBpZiAoIW5hbWUpIHJldHVybiAnJztcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUobmFtZSkpICsgZXEgK1xuICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmopKTtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG5mdW5jdGlvbiBtYXAgKHhzLCBmKSB7XG4gIGlmICh4cy5tYXApIHJldHVybiB4cy5tYXAoZik7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy5wdXNoKGYoeHNbaV0sIGkpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHJlcy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuZGVjb2RlID0gZXhwb3J0cy5wYXJzZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5leHBvcnRzLmVuY29kZSA9IGV4cG9ydHMuc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9lbmNvZGUnKTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBvbGRCcm93c2VyICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdzZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyXFxudXNlIGNocm9tZSwgRmlyZUZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMScpXG59XG5cbnZhciBjcnlwdG8gPSBnbG9iYWwuY3J5cHRvIHx8IGdsb2JhbC5tc0NyeXB0b1xuXG5pZiAoY3J5cHRvICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByYW5kb21CeXRlc1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBvbGRCcm93c2VyXG59XG5cbmZ1bmN0aW9uIHJhbmRvbUJ5dGVzIChzaXplLCBjYikge1xuICAvLyBwaGFudG9tanMgbmVlZHMgdG8gdGhyb3dcbiAgaWYgKHNpemUgPiA2NTUzNikgdGhyb3cgbmV3IEVycm9yKCdyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzJylcbiAgLy8gaW4gY2FzZSBicm93c2VyaWZ5ICBpc24ndCB1c2luZyB0aGUgVWludDhBcnJheSB2ZXJzaW9uXG4gIHZhciByYXdCeXRlcyA9IG5ldyBnbG9iYWwuVWludDhBcnJheShzaXplKVxuXG4gIC8vIFRoaXMgd2lsbCBub3Qgd29yayBpbiBvbGRlciBicm93c2Vycy5cbiAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS93aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlc1xuICBpZiAoc2l6ZSA+IDApIHsgIC8vIGdldFJhbmRvbVZhbHVlcyBmYWlscyBvbiBJRSBpZiBzaXplID09IDBcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhd0J5dGVzKVxuICB9XG4gIC8vIHBoYW50b21qcyBkb2Vzbid0IGxpa2UgYSBidWZmZXIgYmVpbmcgcGFzc2VkIGhlcmVcbiAgdmFyIGJ5dGVzID0gbmV3IEJ1ZmZlcihyYXdCeXRlcy5idWZmZXIpXG5cbiAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNiKG51bGwsIGJ5dGVzKVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cbiIsIlxuLy8gd2hlbiB0aGlzIGlzIGxvYWRlZCBpbnRvIHRoZSBicm93c2VyLCBcbi8vIGp1c3QgdXNlIHRoZSBkZWZhdWx0cy4uLlxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lLCBkZWZhdWx0cykge1xuICByZXR1cm4gZGVmYXVsdHNcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSBrZXlzLnB1c2goa2V5KTtcbiAgcmV0dXJuIGtleXM7XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbmZvckVhY2gob2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpLCBmdW5jdGlvbihtZXRob2QpIHtcbiAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pXG4gICAgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG59KTtcblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpXG4gICAgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSlcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpXG4gICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpXG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpXG4gICAgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHByb2Nlc3MubmV4dFRpY2sodGhpcy5lbmQuYmluZCh0aGlzKSk7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2ggKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuaWYgKCFFRS5saXN0ZW5lckNvdW50KSBFRS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFN0cmluZ0RlY29kZXI7XG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ3V0aWwnKTtcbmlmIChkZWJ1ZyAmJiBkZWJ1Zy5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICB2YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSBvcHRpb25zLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH5+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG5cblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KVxuICAgIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHdoZW4gcGlwaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgJ3JlYWRhYmxlJyBldmVudHMgdGhhdCBoYXBwZW5cbiAgLy8gYWZ0ZXIgcmVhZCgpaW5nIGFsbCB0aGUgYnl0ZXMgYW5kIG5vdCBnZXR0aW5nIGFueSBwdXNoYmFjay5cbiAgdGhpcy5yYW5PdXQgPSBmYWxzZTtcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcilcbiAgICAgIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgdmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKVxuICAgIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAodXRpbC5pc1N0cmluZyhjaHVuaykgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICBjaHVuayA9IG5ldyBCdWZmZXIoY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIGVuY29kaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKHV0aWwuaXNOdWxsT3JVbmRlZmluZWQoY2h1bmspKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIGlmICghc3RhdGUuZW5kZWQpXG4gICAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWFkZFRvRnJvbnQgJiYgIWVuY29kaW5nKVxuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpXG4gICAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYykge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgIGlmIChhZGRUb0Zyb250KVxuICAgICAgICAgIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKVxuICAgICAgICAgIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgfVxuXG4gICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiZcbiAgICAgICAgIChzdGF0ZS5uZWVkUmVhZGFibGUgfHxcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8XG4gICAgICAgICAgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbihlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKVxuICAgIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiAxMjhNQlxudmFyIE1BWF9IV00gPSAweDgwMDAwMDtcbmZ1bmN0aW9uIHJvdW5kVXBUb05leHRQb3dlck9mMihuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyXG4gICAgbi0tO1xuICAgIGZvciAodmFyIHAgPSAxOyBwIDwgMzI7IHAgPDw9IDEpIG4gfD0gbiA+PiBwO1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKVxuICAgIHJldHVybiAwO1xuXG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKVxuICAgIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKGlzTmFOKG4pIHx8IHV0aWwuaXNOdWxsKG4pKSB7XG4gICAgLy8gb25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUuYnVmZmVyLmxlbmd0aClcbiAgICAgIHJldHVybiBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKVxuICAgIHJldHVybiAwO1xuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSB0YXJnZXQgYnVmZmVyIGxldmVsLFxuICAvLyB0aGVuIHJhaXNlIHRoZSB3YXRlciBtYXJrLiAgQnVtcCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0XG4gIC8vIHBvd2VyIG9mIDIsIHRvIHByZXZlbnQgaW5jcmVhc2luZyBpdCBleGNlc3NpdmVseSBpbiB0aW55XG4gIC8vIGFtb3VudHMuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaylcbiAgICBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gcm91bmRVcFRvTmV4dFBvd2VyT2YyKG4pO1xuXG4gIC8vIGRvbid0IGhhdmUgdGhhdCBtdWNoLiAgcmV0dXJuIG51bGwsIHVubGVzcyB3ZSd2ZSBlbmRlZC5cbiAgaWYgKG4gPiBzdGF0ZS5sZW5ndGgpIHtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIG47XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcblxuICBpZiAoIXV0aWwuaXNOdW1iZXIobikgfHwgbiA+IDApXG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJlxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlICYmXG4gICAgICAoc3RhdGUubGVuZ3RoID49IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpXG4gICAgICBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICBlbHNlXG4gICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApXG4gICAgICBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuICBkZWJ1ZygnbmVlZCByZWFkYWJsZScsIGRvUmVhZCk7XG5cbiAgLy8gaWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgfHwgc3RhdGUubGVuZ3RoIC0gbiA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkb1JlYWQgPSB0cnVlO1xuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZCk7XG4gIH1cblxuICAvLyBob3dldmVyLCBpZiB3ZSd2ZSBlbmRlZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50LCBhbmQgaWYgd2UncmUgYWxyZWFkeVxuICAvLyByZWFkaW5nLCB0aGVuIGl0J3MgdW5uZWNlc3NhcnkuXG4gIGlmIChzdGF0ZS5lbmRlZCB8fCBzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZG9SZWFkID0gZmFsc2U7XG4gICAgZGVidWcoJ3JlYWRpbmcgb3IgZW5kZWQnLCBkb1JlYWQpO1xuICB9XG5cbiAgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJyk7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKVxuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gIGlmIChkb1JlYWQgJiYgIXN0YXRlLnJlYWRpbmcpXG4gICAgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcblxuICB2YXIgcmV0O1xuICBpZiAobiA+IDApXG4gICAgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO1xuICBlbHNlXG4gICAgcmV0ID0gbnVsbDtcblxuICBpZiAodXRpbC5pc051bGwocmV0KSkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgbiA9IDA7XG4gIH1cblxuICBzdGF0ZS5sZW5ndGggLT0gbjtcblxuICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgLy8gYXMgc29vbiBhcyB3ZSAqZG8qIGdldCBzb21ldGhpbmcgaW50byB0aGUgYnVmZmVyLlxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5lbmRlZClcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMClcbiAgICBlbmRSZWFkYWJsZSh0aGlzKTtcblxuICBpZiAoIXV0aWwuaXNOdWxsKHJldCkpXG4gICAgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIXV0aWwuaXNCdWZmZXIoY2h1bmspICYmXG4gICAgICAhdXRpbC5pc1N0cmluZyhjaHVuaykgJiZcbiAgICAgICF1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKGNodW5rKSAmJlxuICAgICAgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICAgICAgfSk7XG4gICAgZWxzZVxuICAgICAgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmXG4gICAgICAgICBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO1xuICAgIGVsc2VcbiAgICAgIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBwaXBlT3B0cykge1xuICB2YXIgc3JjID0gdGhpcztcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcbiAgZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsIHN0YXRlLnBpcGVzQ291bnQsIHBpcGVPcHRzKTtcblxuICB2YXIgZG9FbmQgPSAoIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2UpICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3Rkb3V0ICYmXG4gICAgICAgICAgICAgIGRlc3QgIT09IHByb2Nlc3Muc3RkZXJyO1xuXG4gIHZhciBlbmRGbiA9IGRvRW5kID8gb25lbmQgOiBjbGVhbnVwO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZClcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVuZEZuKTtcbiAgZWxzZVxuICAgIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSkge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIC8vIGlmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gJiZcbiAgICAgICAgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSlcbiAgICAgIG9uZHJhaW4oKTtcbiAgfVxuXG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQpIHtcbiAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLFxuICAgICAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pO1xuICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKVxuICAgICAgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuICAvLyBUaGlzIGlzIGEgYnJ1dGFsbHkgdWdseSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyXG4gIC8vIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnkgdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuXG4gIGlmICghZGVzdC5fZXZlbnRzIHx8ICFkZXN0Ll9ldmVudHMuZXJyb3IpXG4gICAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZWxzZSBpZiAoaXNBcnJheShkZXN0Ll9ldmVudHMuZXJyb3IpKVxuICAgIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO1xuICBlbHNlXG4gICAgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cblxuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbilcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRS5saXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbihkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMClcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdClcbiAgICAgIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpXG4gICAgICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaSA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaSA9PT0gLTEpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKVxuICAgIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbihldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIC8vIElmIGxpc3RlbmluZyB0byBkYXRhLCBhbmQgaXQgaGFzIG5vdCBleHBsaWNpdGx5IGJlZW4gcGF1c2VkLFxuICAvLyB0aGVuIGNhbGwgcmVzdW1lIHRvIHN0YXJ0IHRoZSBmbG93IG9mIGRhdGEgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKGV2ID09PSAnZGF0YScgJiYgZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIHRoaXMucmVzdW1lKCk7XG4gIH1cblxuICBpZiAoZXYgPT09ICdyZWFkYWJsZScgJiYgdGhpcy5yZWFkYWJsZSkge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gICAgICAgICAgc2VsZi5yZWFkKDApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICAgIHRoaXMucmVhZCgwKTtcbiAgICB9XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgcmVzdW1lXyhzdHJlYW0sIHN0YXRlKTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZylcbiAgICBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO1xuICBpZiAoZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwYXVzZScpO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncGF1c2UnKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2Zsb3cnLCBzdGF0ZS5mbG93aW5nKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgY2h1bmsgPSBzdHJlYW0ucmVhZCgpO1xuICAgIH0gd2hpbGUgKG51bGwgIT09IGNodW5rICYmIHN0YXRlLmZsb3dpbmcpO1xuICB9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aClcbiAgICAgICAgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKVxuICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICBpZiAoIWNodW5rIHx8ICFzdGF0ZS5vYmplY3RNb2RlICYmICFjaHVuay5sZW5ndGgpXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gc2VsZi5wdXNoKGNodW5rKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcHJveHkgYWxsIHRoZSBvdGhlciBtZXRob2RzLlxuICAvLyBpbXBvcnRhbnQgd2hlbiB3cmFwcGluZyBmaWx0ZXJzIGFuZCBkdXBsZXhlcy5cbiAgZm9yICh2YXIgaSBpbiBzdHJlYW0pIHtcbiAgICBpZiAodXRpbC5pc0Z1bmN0aW9uKHN0cmVhbVtpXSkgJiYgdXRpbC5pc1VuZGVmaW5lZCh0aGlzW2ldKSkge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uKG1ldGhvZCkgeyByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICB9fShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbihldikge1xuICAgIHN0cmVhbS5vbihldiwgc2VsZi5lbWl0LmJpbmQoc2VsZiwgZXYpKTtcbiAgfSk7XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgc2VsZi5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn07XG5cblxuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIHZhciBsaXN0ID0gc3RhdGUuYnVmZmVyO1xuICB2YXIgbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICB2YXIgc3RyaW5nTW9kZSA9ICEhc3RhdGUuZGVjb2RlcjtcbiAgdmFyIG9iamVjdE1vZGUgPSAhIXN0YXRlLm9iamVjdE1vZGU7XG4gIHZhciByZXQ7XG5cbiAgLy8gbm90aGluZyBpbiB0aGUgbGlzdCwgZGVmaW5pdGVseSBlbXB0eS5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmIChsZW5ndGggPT09IDApXG4gICAgcmV0ID0gbnVsbDtcbiAgZWxzZSBpZiAob2JqZWN0TW9kZSlcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIGVsc2UgaWYgKCFuIHx8IG4gPj0gbGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBhcnJheS5cbiAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgIHJldCA9IGxpc3Quam9pbignJyk7XG4gICAgZWxzZVxuICAgICAgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKVxuICAgICAgICByZXQgPSAnJztcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0ID0gbmV3IEJ1ZmZlcihuKTtcblxuICAgICAgdmFyIGMgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGwgJiYgYyA8IG47IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgICAgdmFyIGNweSA9IE1hdGgubWluKG4gLSBjLCBidWYubGVuZ3RoKTtcblxuICAgICAgICBpZiAoc3RyaW5nTW9kZSlcbiAgICAgICAgICByZXQgKz0gYnVmLnNsaWNlKDAsIGNweSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBidWYuY29weShyZXQsIGMsIDAsIGNweSk7XG5cbiAgICAgICAgaWYgKGNweSA8IGJ1Zi5sZW5ndGgpXG4gICAgICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKVxuICAgIHRocm93IG5ldyBFcnJvcignZW5kUmVhZGFibGUgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICAgICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoICh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YgKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuXG4vLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xuXG52YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24oZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKVxuICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzJykpO1xuXG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcblxuICBpZiAoIXV0aWwuaXNOdWxsT3JVbmRlZmluZWQoZGF0YSkpXG4gICAgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgaWYgKGNiKVxuICAgIGNiKGVyKTtcblxuICB2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgc3RyZWFtLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59XG5cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpXG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSBuZXcgVHJhbnNmb3JtU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gd2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB2YXIgc3RyZWFtID0gdGhpcztcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdwcmVmaW5pc2gnLCBmdW5jdGlvbigpIHtcbiAgICBpZiAodXRpbC5pc0Z1bmN0aW9uKHRoaXMuX2ZsdXNoKSlcbiAgICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uKGVyKSB7XG4gICAgICAgIGRvbmUoc3RyZWFtLCBlcik7XG4gICAgICB9KTtcbiAgICBlbHNlXG4gICAgICBkb25lKHN0cmVhbSk7XG4gIH0pO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIGlmICghdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fFxuICAgICAgICBycy5uZWVkUmVhZGFibGUgfHxcbiAgICAgICAgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaylcbiAgICAgIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbihuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICghdXRpbC5pc051bGwodHMud3JpdGVjaHVuaykgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIpIHtcbiAgaWYgKGVyKVxuICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgdmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh3cy5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKVxuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgdmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSBvcHRpb25zLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gKGh3bSB8fCBod20gPT09IDApID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KVxuICAgIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24oZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9O1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuXG4gIC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgdmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRob3VnaCB0aGV5J3JlIG5vdFxuICAvLyBpbnN0YW5jZW9mIFdyaXRhYmxlLCB0aGV5J3JlIGluc3RhbmNlb2YgUmVhZGFibGUuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkgJiYgISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSlcbiAgICByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZS4gTm90IHJlYWRhYmxlLicpKTtcbn07XG5cblxuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIHN0YXRlLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgY2IoZXIpO1xuICB9KTtcbn1cblxuLy8gSWYgd2UgZ2V0IHNvbWV0aGluZyB0aGF0IGlzIG5vdCBhIGJ1ZmZlciwgc3RyaW5nLCBudWxsLCBvciB1bmRlZmluZWQsXG4vLyBhbmQgd2UncmUgbm90IGluIG9iamVjdE1vZGUsIHRoZW4gdGhhdCdzIGFuIGVycm9yLlxuLy8gT3RoZXJ3aXNlIHN0cmVhbSBjaHVua3MgYXJlIGFsbCBjb25zaWRlcmVkIHRvIGJlIG9mIGxlbmd0aD0xLCBhbmQgdGhlXG4vLyB3YXRlcm1hcmtzIGRldGVybWluZSBob3cgbWFueSBvYmplY3RzIHRvIGtlZXAgaW4gdGhlIGJ1ZmZlciwgcmF0aGVyIHRoYW5cbi8vIGhvdyBtYW55IGJ5dGVzIG9yIGNoYXJhY3RlcnMuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICBpZiAoIXV0aWwuaXNCdWZmZXIoY2h1bmspICYmXG4gICAgICAhdXRpbC5pc1N0cmluZyhjaHVuaykgJiZcbiAgICAgICF1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKGNodW5rKSAmJlxuICAgICAgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICB2YXIgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBjYihlcik7XG4gICAgfSk7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuXG4gIGlmICh1dGlsLmlzRnVuY3Rpb24oZW5jb2RpbmcpKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAodXRpbC5pc0J1ZmZlcihjaHVuaykpXG4gICAgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgZWxzZSBpZiAoIWVuY29kaW5nKVxuICAgIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICghdXRpbC5pc0Z1bmN0aW9uKGNiKSlcbiAgICBjYiA9IGZ1bmN0aW9uKCkge307XG5cbiAgaWYgKHN0YXRlLmVuZGVkKVxuICAgIHdyaXRlQWZ0ZXJFbmQodGhpcywgc3RhdGUsIGNiKTtcbiAgZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tO1xuXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nICYmXG4gICAgICAgICFzdGF0ZS5jb3JrZWQgJiZcbiAgICAgICAgIXN0YXRlLmZpbmlzaGVkICYmXG4gICAgICAgICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmXG4gICAgICAgIHN0YXRlLmJ1ZmZlci5sZW5ndGgpXG4gICAgICBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmXG4gICAgICBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJlxuICAgICAgdXRpbC5pc1N0cmluZyhjaHVuaykpIHtcbiAgICBjaHVuayA9IG5ldyBCdWZmZXIoY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbi8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcbiAgaWYgKHV0aWwuaXNCdWZmZXIoY2h1bmspKVxuICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpXG4gICAgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpXG4gICAgc3RhdGUuYnVmZmVyLnB1c2gobmV3IFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpKTtcbiAgZWxzZVxuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpXG4gICAgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpO1xuICBlbHNlXG4gICAgc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgaWYgKHN5bmMpXG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgICAgY2IoZXIpO1xuICAgIH0pO1xuICBlbHNlIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICBjYihlcik7XG4gIH1cblxuICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcilcbiAgICBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtcbiAgZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJlxuICAgICAgICAhc3RhdGUuY29ya2VkICYmXG4gICAgICAgICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmXG4gICAgICAgIHN0YXRlLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKVxuICAgIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG4vLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn1cblxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcblxuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgc3RhdGUuYnVmZmVyLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGNicyA9IFtdO1xuICAgIGZvciAodmFyIGMgPSAwOyBjIDwgc3RhdGUuYnVmZmVyLmxlbmd0aDsgYysrKVxuICAgICAgY2JzLnB1c2goc3RhdGUuYnVmZmVyW2NdLmNhbGxiYWNrKTtcblxuICAgIC8vIGNvdW50IHRoZSBvbmUgd2UgYXJlIGFkZGluZywgYXMgd2VsbC5cbiAgICAvLyBUT0RPKGlzYWFjcykgY2xlYW4gdGhpcyB1cFxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgdHJ1ZSwgc3RhdGUubGVuZ3RoLCBzdGF0ZS5idWZmZXIsICcnLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgICAgICBjYnNbaV0oZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENsZWFyIGJ1ZmZlclxuICAgIHN0YXRlLmJ1ZmZlciA9IFtdO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICBmb3IgKHZhciBjID0gMDsgYyA8IHN0YXRlLmJ1ZmZlci5sZW5ndGg7IGMrKykge1xuICAgICAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyW2NdO1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYysrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYyA8IHN0YXRlLmJ1ZmZlci5sZW5ndGgpXG4gICAgICBzdGF0ZS5idWZmZXIgPSBzdGF0ZS5idWZmZXIuc2xpY2UoYyk7XG4gICAgZWxzZVxuICAgICAgc3RhdGUuYnVmZmVyLmxlbmd0aCA9IDA7XG4gIH1cblxuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xuXG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHV0aWwuaXNGdW5jdGlvbihjaHVuaykpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodXRpbC5pc0Z1bmN0aW9uKGVuY29kaW5nKSkge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKCF1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKGNodW5rKSlcbiAgICB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKVxuICAgIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICByZXR1cm4gKHN0YXRlLmVuZGluZyAmJlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICFzdGF0ZS5maW5pc2hlZCAmJlxuICAgICAgICAgICFzdGF0ZS53cml0aW5nKTtcbn1cblxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCkge1xuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgIH0gZWxzZVxuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICB9XG4gIHJldHVybiBuZWVkO1xufVxuXG5mdW5jdGlvbiBlbmRXcml0YWJsZShzdHJlYW0sIHN0YXRlLCBjYikge1xuICBzdGF0ZS5lbmRpbmcgPSB0cnVlO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgaWYgKGNiKSB7XG4gICAgaWYgKHN0YXRlLmZpbmlzaGVkKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYik7XG4gICAgZWxzZVxuICAgICAgc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG59XG4iLCJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbmlmICghcHJvY2Vzcy5icm93c2VyICYmIHByb2Nlc3MuZW52LlJFQURBQkxFX1NUUkVBTSA9PT0gJ2Rpc2FibGUnKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnc3RyZWFtJyk7XG59XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgcmVtYXJrOmh0bWxcbiAqIEBmaWxlb3ZlcnZpZXcgQ29tcGlsZSBNYXJrZG93biB0byBIVE1MIHdpdGggcmVtYXJrLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWVudiBjb21tb25qcyAqL1xuXG4vKlxuICogRGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBjb21waWxlcnMgPSByZXF1aXJlKCcuL2xpYi9jb21waWxlcnMnKTtcbnZhciB0cmFuc2Zvcm1lciA9IHJlcXVpcmUoJy4vbGliL3RyYW5zZm9ybWVyJyk7XG5cbi8qKlxuICogQXR0YWNoIGFuIEhUTUwgY29tcGlsZXIuXG4gKlxuICogQHBhcmFtIHtSZW1hcmt9IHJlbWFyayAtIEluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3Q/fSBbb3B0aW9uc10gLSBDb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBwbHVnaW4ocmVtYXJrLCBvcHRpb25zKSB7XG4gICAgdmFyIE1hcmtkb3duQ29tcGlsZXIgPSByZW1hcmsuQ29tcGlsZXI7XG4gICAgdmFyIGFuY2VzdG9yID0gTWFya2Rvd25Db21waWxlci5wcm90b3R5cGU7XG4gICAgdmFyIHByb3RvO1xuICAgIHZhciBrZXk7XG5cbiAgICAvKipcbiAgICAgKiBFeHRlbnNpYmxlIHByb3RvdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBIVE1MQ29tcGlsZXJQcm90b3R5cGUoKSB7fVxuXG4gICAgSFRNTENvbXBpbGVyUHJvdG90eXBlLnByb3RvdHlwZSA9IGFuY2VzdG9yO1xuXG4gICAgcHJvdG8gPSBuZXcgSFRNTENvbXBpbGVyUHJvdG90eXBlKCk7XG5cbiAgICBwcm90by5vcHRpb25zLnhodG1sID0gZmFsc2U7XG4gICAgcHJvdG8ub3B0aW9ucy5zYW5pdGl6ZSA9IGZhbHNlO1xuICAgIHByb3RvLm9wdGlvbnMuZW50aXRpZXMgPSAndHJ1ZSc7XG5cbiAgICAvKipcbiAgICAgKiBFeHRlbnNpYmxlIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtWRmlsZX0gZmlsZSAtIFZpcnR1YWwgZmlsZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBIVE1MQ29tcGlsZXIoZmlsZSkge1xuICAgICAgICBpZiAoZmlsZS5leHRlbnNpb24pIHtcbiAgICAgICAgICAgIGZpbGUubW92ZSh7XG4gICAgICAgICAgICAgICAgJ2V4dGVuc2lvbic6ICdodG1sJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBNYXJrZG93bkNvbXBpbGVyLmFwcGx5KHRoaXMsIFtmaWxlLCBvcHRpb25zXSk7XG4gICAgfVxuXG4gICAgSFRNTENvbXBpbGVyLnByb3RvdHlwZSA9IHByb3RvO1xuXG4gICAgLypcbiAgICAgKiBFeHBvc2UgY29tcGlsZXJzLlxuICAgICAqL1xuXG4gICAgZm9yIChrZXkgaW4gY29tcGlsZXJzKSB7XG4gICAgICAgIHByb3RvW2tleV0gPSBjb21waWxlcnNba2V5XTtcbiAgICB9XG5cbiAgICByZW1hcmsuQ29tcGlsZXIgPSBIVE1MQ29tcGlsZXI7XG5cbiAgICByZXR1cm4gdHJhbnNmb3JtZXI7XG59XG5cbi8qXG4gKiBFeHBvc2UgYHBsdWdpbmAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwbHVnaW47XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgcmVtYXJrOmh0bWw6Y29tcGlsZXJzXG4gKiBAZmlsZW92ZXJ2aWV3IENvbXBpbGVycyB0byB0cmFuc2Zvcm0gbWRhc3Qgbm9kZXMgdG8gSFRNTC5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLypcbiAqIERlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdHJpbSA9IHJlcXVpcmUoJ3RyaW0nKTtcbnZhciBkZXRhYiA9IHJlcXVpcmUoJ2RldGFiJyk7XG52YXIgY29sbGFwc2UgPSByZXF1aXJlKCdjb2xsYXBzZS13aGl0ZS1zcGFjZScpO1xudmFyIG5vcm1hbGl6ZVVSSSA9IHJlcXVpcmUoJ25vcm1hbGl6ZS11cmknKTtcbnZhciB0cmltTGluZXMgPSByZXF1aXJlKCd0cmltLWxpbmVzJyk7XG52YXIgdmlzaXQgPSByZXF1aXJlKCd1bmlzdC11dGlsLXZpc2l0Jyk7XG52YXIgaCA9IHJlcXVpcmUoJy4vaC5qcycpO1xuXG4vKlxuICogQ29tcGlsZXJzLlxuICovXG5cbnZhciB2aXNpdG9ycyA9IHt9O1xuXG4vKipcbiAqIFJldHVybiB0aGUgY29udGVudCBvZiBhIHJlZmVyZW5jZSB3aXRob3V0IGRlZmluaXRpb25cbiAqIGFzIG1hcmtkb3duLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGZhaWxzYWZlKHtcbiAqICAgICBpZGVudGlmaWVyOiAnZm9vJyxcbiAqICAgICByZWZlcmVuY2VUeXBlOiAnc2hvcnRjdXQnLFxuICogICAgIGNoaWxkcmVuOiBbXG4gKiAgICAgICB7XG4gKiAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICAgICAgdmFsdWU6ICdmb28nXG4gKiAgICAgICB9XG4gKiAgICAgXVxuICogICB9LCB7fSk7IC8vICdbZm9vXSdcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGNvbXBpbGUuXG4gKiBAcGFyYW0ge05vZGU/fSBkZWZpbml0aW9uIC0gRGVmaW5pdGlvbiBub2RlLCB3aGVuXG4gKiAgIGV4aXN0aW5nLlxuICogQHBhcmFtIHtIVE1MQ29tcGlsZXJ9IGNvbnRleHQgLSBJbnN0YW5jZS5cbiAqIEByZXR1cm4ge3N0cmluZz99IC0gSWYgd2l0aG91dCBkZWZpbml0aW9uLCByZXR1cm5zIGFcbiAqICAgc3RyaW5nLCByZXR1cm5zIG5vdGhpbmcgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBmYWlsc2FmZShub2RlLCBkZWZpbml0aW9uLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIGlmIChub2RlLnJlZmVyZW5jZVR5cGUgPT09ICdzaG9ydGN1dCcgJiYgIWRlZmluaXRpb24ubGluaykge1xuICAgICAgICByZXN1bHQgPSBub2RlLmNoaWxkcmVuID8gY29udGV4dC5hbGwobm9kZSkuam9pbignJykgOiBub2RlLmFsdDtcblxuICAgICAgICByZXR1cm4gKG5vZGUudHlwZSA9PT0gJ2ltYWdlUmVmZXJlbmNlJyA/ICchJyA6ICcnKSArXG4gICAgICAgICAgICAnWycgKyByZXN1bHQgKyAnXSc7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmeSBhbGwgZm9vdG5vdGUgZGVmaW5pdGlvbnMsIGlmIGFueS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBnZW5lcmF0ZUZvb3Rub3RlcygpOyAvLyAnPGRpdiBjbGFzcz1cImZvb3Rub3Rlc1wiPlxcbjxocj5cXG4uLi4nXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbXBpbGVkIGZvb3Rub3RlcywgaWYgYW55LlxuICogQHRoaXMge0hUTUxDb21waWxlcn1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVGb290bm90ZXMoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkZWZpbml0aW9ucyA9IHNlbGYuZm9vdG5vdGVzO1xuICAgIHZhciBsZW5ndGggPSBkZWZpbml0aW9ucy5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICB2YXIgZGVmO1xuXG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGRlZiA9IGRlZmluaXRpb25zW2luZGV4XTtcblxuICAgICAgICByZXN1bHRzW2luZGV4XSA9IHNlbGYubGlzdEl0ZW0oe1xuICAgICAgICAgICAgJ3R5cGUnOiAnbGlzdEl0ZW0nLFxuICAgICAgICAgICAgJ2RhdGEnOiB7XG4gICAgICAgICAgICAgICAgJ2h0bWxBdHRyaWJ1dGVzJzoge1xuICAgICAgICAgICAgICAgICAgICAnaWQnOiAnZm4tJyArIGRlZi5pZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdjaGlsZHJlbic6IGRlZi5jaGlsZHJlbi5jb25jYXQoe1xuICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLFxuICAgICAgICAgICAgICAgICdocmVmJzogJyNmbnJlZi0nICsgZGVmLmlkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgJ2RhdGEnOiB7XG4gICAgICAgICAgICAgICAgICAgICdodG1sQXR0cmlidXRlcyc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjbGFzcyc6ICdmb290bm90ZS1iYWNrcmVmJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnY2hpbGRyZW4nOiBbe1xuICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ+KGqSdcbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAncG9zaXRpb24nOiBkZWYucG9zaXRpb25cbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIHJldHVybiBoKHNlbGYsIG51bGwsIHtcbiAgICAgICAgJ25hbWUnOiAnZGl2JyxcbiAgICAgICAgJ2F0dHJpYnV0ZXMnOiB7XG4gICAgICAgICAgICAnY2xhc3MnOiAnZm9vdG5vdGVzJ1xuICAgICAgICB9LFxuICAgICAgICAnY29udGVudCc6IGgoc2VsZiwgbnVsbCwge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ2hyJ1xuICAgICAgICAgICAgfSkgK1xuICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgaChzZWxmLCBudWxsLCB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnb2wnLFxuICAgICAgICAgICAgICAgICdjb250ZW50JzogcmVzdWx0cy5qb2luKCdcXG4nKVxuICAgICAgICAgICAgfSwgbnVsbCwgdHJ1ZSlcbiAgICB9LCBudWxsLCB0cnVlKSArICdcXG4nO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmeSBhbiB1bmtub3duIG5vZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdW5rbm93bih7XG4gKiAgICAgZGF0YToge1xuICogICAgICAgaHRtbE5hbWU6ICdzZWN0aW9uJ1xuICogICAgIH0sXG4gKiAgICAgY2hpbGRyZW46IFtcbiAqICAgICAgIHtcbiAqICAgICAgICAgdHlwZTogJ3RleHQnLFxuICogICAgICAgICB2YWx1ZTogJ2ZvbydcbiAqICAgICAgIH1cbiAqICAgICBdXG4gKiAgIH0pOyAvLyAnPHNlY3Rpb24+Zm9vPC9zZWN0aW9uPidcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGNvbXBpbGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tcGlsZWQgbm9kZS5cbiAqIEB0aGlzIHtIVE1MQ29tcGlsZXJ9XG4gKi9cbmZ1bmN0aW9uIHVua25vd24obm9kZSkge1xuICAgIHZhciBjb250ZW50ID0gJ2NoaWxkcmVuJyBpbiBub2RlID8gdGhpcy5hbGwobm9kZSkuam9pbignJykgOiBub2RlLnZhbHVlO1xuXG4gICAgcmV0dXJuIGgodGhpcywgbm9kZSwge1xuICAgICAgICAnbmFtZSc6ICdkaXYnLFxuICAgICAgICAnY29udGVudCc6IGNvbnRlbnQgfHwgJydcbiAgICB9LCBub2RlLmRhdGEpO1xufVxuXG4vKipcbiAqIFZpc2l0IGEgbm9kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTtcbiAqXG4gKiAgIGNvbXBpbGVyLnZpc2l0KHtcbiAqICAgICB0eXBlOiAnc3Ryb25nJyxcbiAqICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICAgIHZhbHVlOiAnRm9vJ1xuICogICAgIH1dXG4gKiAgIH0pO1xuICogICAvLyAnKipGb28qKidcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIE5vZGUuXG4gKiBAcGFyYW0ge09iamVjdD99IFtwYXJlbnRdIC0gYG5vZGVgcyBwYXJlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tcGlsZWQgYG5vZGVgLlxuICovXG5mdW5jdGlvbiBvbmUobm9kZSwgcGFyZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB0eXBlID0gbm9kZSAmJiBub2RlLnR5cGU7XG4gICAgdmFyIGZuID0gdHlwZW9mIHNlbGZbdHlwZV0gPT09ICdmdW5jdGlvbicgPyB0eXBlIDogJ3Vua25vd24nO1xuXG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHNlbGYuZmlsZS5mYWlsKCdFeHBlY3RlZCBub2RlIGAnICsgbm9kZSArICdgJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGZbZm5dKG5vZGUsIHBhcmVudCk7XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IHRoZSBjaGlsZHJlbiBvZiBgbm9kZWAuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgYWxsKHtcbiAqICAgICBjaGlsZHJlbjogW1xuICogICAgICAge1xuICogICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgIHZhbHVlOiAnZm9vJ1xuICogICAgICAgfVxuICogICAgIF1cbiAqICAgfSk7IC8vICdmb28nXG4gKlxuICogQHBhcmFtIHtOb2RlfSBwYXJlbnQgLSBQYXJlbnQgdG8gdmlzaXQuXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gLSBMaXN0IG9mIGNvbXBpbGVkIG5vZGVzLlxuICogQHRoaXMge0hUTUxDb21waWxlcn1cbiAqL1xuZnVuY3Rpb24gYWxsKHBhcmVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW47XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBsZW5ndGggPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIHZhbHVlO1xuICAgIHZhciBwcmV2O1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFsdWUgPSBzZWxmLnZpc2l0KG5vZGVzW2luZGV4XSwgcGFyZW50KTtcblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYudHlwZSA9PT0gJ2JyZWFrJykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdHJpbS5sZWZ0KHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldiA9IG5vZGVzW2luZGV4XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmeSBhIHJvb3Qgb2JqZWN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIC8vIFRoaXMgd2lsbCBhZGRpdGlvbmFsbHkgaW5jbHVkZSBkZWZpbmVkIGZvb3Rub3RlcyxcbiAqICAgLy8gd2hlbiBhcHBsaWNhYmxlLlxuICogICByb290KHtcbiAqICAgICBjaGlsZHJlbjogW1xuICogICAgICAge1xuICogICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAqICAgICAgICAgY2hpbGRyZW46IFtcbiAqICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgICAgICB2YWx1ZTogJ2ZvbydcbiAqICAgICAgICAgICB9XG4gKiAgICAgICAgIF1cbiAqICAgICAgIH1cbiAqICAgICBdXG4gKiAgIH0pOyAvLyAnPHA+Zm9vPC9wPlxcbidcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGNvbXBpbGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tcGlsZWQgbm9kZS5cbiAqIEB0aGlzIHtIVE1MQ29tcGlsZXJ9XG4gKi9cbmZ1bmN0aW9uIHJvb3Qobm9kZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGVmaW5pdGlvbnMgPSB7fTtcbiAgICB2YXIgZm9vdG5vdGVzID0gW107XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHNlbGYuZGVmaW5pdGlvbnMgPSBkZWZpbml0aW9ucztcbiAgICBzZWxmLmZvb3Rub3RlcyA9IGZvb3Rub3RlcztcblxuICAgIHZpc2l0KG5vZGUsICdkZWZpbml0aW9uJywgZnVuY3Rpb24gKGRlZmluaXRpb24pIHtcbiAgICAgICAgZGVmaW5pdGlvbnNbZGVmaW5pdGlvbi5pZGVudGlmaWVyLnRvVXBwZXJDYXNlKCldID0gZGVmaW5pdGlvbjtcbiAgICB9KTtcblxuICAgIHZpc2l0KG5vZGUsICdmb290bm90ZURlZmluaXRpb24nLCBmdW5jdGlvbiAoZGVmaW5pdGlvbikge1xuICAgICAgICBmb290bm90ZXMucHVzaChkZWZpbml0aW9uKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdCA9IHNlbGYuYWxsKG5vZGUpLmpvaW4oJ1xcbicpO1xuXG4gICAgcmV0dXJuIChyZXN1bHQgPyByZXN1bHQgKyAnXFxuJyA6ICcnKSArIHNlbGYuZ2VuZXJhdGVGb290bm90ZXMoKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBibG9jayBxdW90ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBibG9ja3F1b3RlKHtcbiAqICAgICBjaGlsZHJlbjogW1xuICogICAgICAge1xuICogICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAqICAgICAgICAgY2hpbGRyZW46IFtcbiAqICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgICAgICB2YWx1ZTogJ2ZvbydcbiAqICAgICAgICAgICB9XG4gKiAgICAgICAgIF1cbiAqICAgICAgIH1cbiAqICAgICBdXG4gKiAgIH0pOyAvLyAnPGJsb2NrcXVvdGU+XFxuPHA+Zm9vPC9wPlxcbjwvYmxvY2txdW90ZT4nXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0byBjb21waWxlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbXBpbGVkIG5vZGUuXG4gKiBAdGhpcyB7SFRNTENvbXBpbGVyfVxuICovXG5mdW5jdGlvbiBibG9ja3F1b3RlKG5vZGUpIHtcbiAgICByZXR1cm4gaCh0aGlzLCBub2RlLCB7XG4gICAgICAgICduYW1lJzogJ2Jsb2NrcXVvdGUnLFxuICAgICAgICAnY29udGVudCc6IHRoaXMuYWxsKG5vZGUpLmpvaW4oJ1xcbicpXG4gICAgfSwgbm9kZS5kYXRhLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYW4gaW5saW5lIGZvb3Rub3RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIC8vIFRoaXMgYWRkaXRpb25hbGx5IGFkZHMgYSBkZWZpbml0aW9uIGF0IHRoZSBib3R0ZW1cbiAqICAgLy8gb2YgdGhlIGRvY3VtZW50LlxuICogICBmb290bm90ZSh7XG4gKiAgICAgY2hpbGRyZW46IFtcbiAqICAgICAgIHtcbiAqICAgICAgICAgdHlwZTogJ3RleHQnLFxuICogICAgICAgICB2YWx1ZTogJ2ZvbydcbiAqICAgICAgIH1cbiAqICAgICBdXG4gKiAgIH0pOyAvLyAnPHN1cCBpZD1cImZucmVmLTFcIj48YSBocmVmPVwiI2ZuLTFcIj4xPC9hPjwvc3VwPidcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGNvbXBpbGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tcGlsZWQgbm9kZS5cbiAqIEB0aGlzIHtIVE1MQ29tcGlsZXJ9XG4gKi9cbmZ1bmN0aW9uIGZvb3Rub3RlKG5vZGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGRlZmluaXRpb25zID0gc2VsZi5mb290bm90ZXM7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIGxlbmd0aCA9IGRlZmluaXRpb25zLmxlbmd0aDtcbiAgICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgICB2YXIgaWRlbnRpZmllcjtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGlkZW50aWZpZXJzW2luZGV4XSA9IGRlZmluaXRpb25zW2luZGV4XS5pZGVudGlmaWVyO1xuICAgIH1cblxuICAgIGluZGV4ID0gLTE7XG4gICAgaWRlbnRpZmllciA9IDE7XG5cbiAgICB3aGlsZSAoaWRlbnRpZmllcnMuaW5kZXhPZihTdHJpbmcoaWRlbnRpZmllcikpICE9PSAtMSkge1xuICAgICAgICBpZGVudGlmaWVyKys7XG4gICAgfVxuXG4gICAgaWRlbnRpZmllciA9IFN0cmluZyhpZGVudGlmaWVyKTtcblxuICAgIHNlbGYuZm9vdG5vdGVzLnB1c2goe1xuICAgICAgICAndHlwZSc6ICdmb290bm90ZURlZmluaXRpb24nLFxuICAgICAgICAnaWRlbnRpZmllcic6IGlkZW50aWZpZXIsXG4gICAgICAgICdjaGlsZHJlbic6IG5vZGUuY2hpbGRyZW4sXG4gICAgICAgICdwb3NpdGlvbic6IG5vZGUucG9zaXRpb25cbiAgICB9KTtcblxuICAgIHJldHVybiBzZWxmLmZvb3Rub3RlUmVmZXJlbmNlKHtcbiAgICAgICAgJ3R5cGUnOiAnZm9vdG5vdGVSZWZlcmVuY2UnLFxuICAgICAgICAnaWRlbnRpZmllcic6IGlkZW50aWZpZXIsXG4gICAgICAgICdwb3NpdGlvbic6IG5vZGUucG9zaXRpb25cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBsaXN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGxpc3Qoe1xuICogICAgIG9yZGVyZWQ6IHRydWVcbiAqICAgICBsb29zZTogZmFsc2VcbiAqICAgICBjaGlsZHJlbjogW1xuICogICAgICAge1xuICogICAgICAgICB0eXBlOiAnbGlzdEl0ZW0nLFxuICogICAgICAgICBjaGlsZHJlbjogW1xuICogICAgICAgICAgIHtcbiAqICAgICAgICAgICAgIHR5cGU6ICdwYXJhZ3JhcGgnLFxuICogICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAqICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICAgICAgICAgICAgICB2YWx1ZTogJ2ZvbydcbiAqICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgXVxuICogICAgICAgICAgIH1cbiAqICAgICAgICAgXVxuICogICAgICAgfVxuICogICAgIF1cbiAqICAgfSk7IC8vICc8b2w+XFxuPGxpPmZvbzwvbGk+XFxuPC9vbD4nXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0byBjb21waWxlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbXBpbGVkIG5vZGUuXG4gKiBAdGhpcyB7SFRNTENvbXBpbGVyfVxuICovXG5mdW5jdGlvbiBsaXN0KG5vZGUpIHtcbiAgICByZXR1cm4gaCh0aGlzLCBub2RlLCB7XG4gICAgICAgICduYW1lJzogbm9kZS5vcmRlcmVkID8gJ29sJyA6ICd1bCcsXG4gICAgICAgICdhdHRyaWJ1dGVzJzoge1xuICAgICAgICAgICAgJ3N0YXJ0Jzogbm9kZS5zdGFydCAhPT0gMSA/IG5vZGUuc3RhcnQgOiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgICdjb250ZW50JzogdGhpcy5hbGwobm9kZSkuam9pbignXFxuJylcbiAgICB9LCBub2RlLmRhdGEsIHRydWUpO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmeSBhIGxpc3QtaXRlbS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBsaXN0SXRlbSh7XG4gKiAgICAgY2hpbGRyZW46IFtcbiAqICAgICAgIHtcbiAqICAgICAgICAgdHlwZTogJ3BhcmFncmFwaCcsXG4gKiAgICAgICAgIGNoaWxkcmVuOiBbXG4gKiAgICAgICAgICAge1xuICogICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICogICAgICAgICAgICAgdmFsdWU6ICdmb28nXG4gKiAgICAgICAgICAgfVxuICogICAgICAgICBdXG4gKiAgICAgICB9XG4gKiAgICAgXVxuICogICB9LCB7XG4gKiAgICAgbG9vc2U6IGZhbHNlXG4gKiAgIH0pOyAvLyAnPGxpPmZvbzwvbGk+J1xuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIE5vZGUgdG8gY29tcGlsZS5cbiAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50IC0gUGFyZW50IG9mIGBub2RlYC5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21waWxlZCBub2RlLlxuICogQHRoaXMge0hUTUxDb21waWxlcn1cbiAqL1xuZnVuY3Rpb24gbGlzdEl0ZW0obm9kZSwgcGFyZW50KSB7XG4gICAgdmFyIHNpbmdsZTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgc2luZ2xlID0gIXBhcmVudC5sb29zZSAmJlxuICAgICAgICBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBub2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuO1xuXG4gICAgcmVzdWx0ID0gdGhpcy5hbGwoc2luZ2xlID8gbm9kZS5jaGlsZHJlblswXSA6IG5vZGUpXG4gICAgICAgIC5qb2luKHNpbmdsZSA/ICcnIDogJ1xcbicpO1xuXG4gICAgcmV0dXJuIGgodGhpcywgbm9kZSwge1xuICAgICAgICAnbmFtZSc6ICdsaScsXG4gICAgICAgICdjb250ZW50JzogcmVzdWx0XG4gICAgfSwgbm9kZS5kYXRhLCAhc2luZ2xlKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBoZWFkaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGhlYWRpbmcoe1xuICogICAgIGRlcHRoOiAzLFxuICogICAgIGNoaWxkcmVuOiBbXG4gKiAgICAgICB7XG4gKiAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICAgICAgdmFsdWU6ICdmb28nXG4gKiAgICAgICB9XG4gKiAgICAgXVxuICogICB9KTsgLy8gJzxoMz5mb288L2gzPidcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGNvbXBpbGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tcGlsZWQgbm9kZS5cbiAqIEB0aGlzIHtIVE1MQ29tcGlsZXJ9XG4gKi9cbmZ1bmN0aW9uIGhlYWRpbmcobm9kZSkge1xuICAgIHJldHVybiBoKHRoaXMsIG5vZGUsIHtcbiAgICAgICAgJ25hbWUnOiAnaCcgKyBub2RlLmRlcHRoLFxuICAgICAgICAnY29udGVudCc6IHRoaXMuYWxsKG5vZGUpLmpvaW4oJycpXG4gICAgfSwgbm9kZS5kYXRhKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBwYXJhZ3JhcGguXG4gKlxuICogQGV4YW1wbGVcbiAqICAgcGFyYWdyYXBoKHtcbiAqICAgICBjaGlsZHJlbjogW1xuICogICAgICAge1xuICogICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgIHZhbHVlOiAnZm9vJ1xuICogICAgICAgfVxuICogICAgIF1cbiAqICAgfSk7IC8vICdmb28nXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0byBjb21waWxlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbXBpbGVkIG5vZGUuXG4gKiBAdGhpcyB7SFRNTENvbXBpbGVyfVxuICovXG5mdW5jdGlvbiBwYXJhZ3JhcGgobm9kZSkge1xuICAgIHJldHVybiBoKHRoaXMsIG5vZGUsIHtcbiAgICAgICAgJ25hbWUnOiAncCcsXG4gICAgICAgICdjb250ZW50JzogdHJpbShkZXRhYih0aGlzLmFsbChub2RlKS5qb2luKCcnKSkpXG4gICAgfSwgbm9kZS5kYXRhKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBjb2RlIGJsb2NrLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGNvZGUoe1xuICogICAgIHZhbHVlOiAnZm9vICZhbXA7IGJhcjsnXG4gKiAgIH0pOyAvLyAnPHByZT48Y29kZT5mb28gJmFtcDthbXA7IGJhclxcbjwvY29kZT48L3ByZT4nXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0byBjb21waWxlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbXBpbGVkIG5vZGUuXG4gKiBAdGhpcyB7SFRNTENvbXBpbGVyfVxuICovXG5mdW5jdGlvbiBjb2RlKG5vZGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHZhbHVlID0gbm9kZS52YWx1ZSA/IGRldGFiKG5vZGUudmFsdWUgKyAnXFxuJykgOiAnJztcblxuICAgIHJldHVybiBoKHNlbGYsIG5vZGUsIHtcbiAgICAgICAgJ25hbWUnOiAncHJlJyxcbiAgICAgICAgJ2NvbnRlbnQnOiBoKHNlbGYsIG5vZGUsIHtcbiAgICAgICAgICAgICduYW1lJzogJ2NvZGUnLFxuICAgICAgICAgICAgJ2NvbnRlbnQnOiBzZWxmLmVuY29kZSh2YWx1ZSlcbiAgICAgICAgfSwgbm9kZS5kYXRhKVxuICAgIH0pO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmeSBhIHRhYmxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHRhYmxlKHtcbiAqICAgICBjaGlsZHJlbjogW1xuICogICAgICAge1xuICogICAgICAgICB0eXBlOiAndGFibGVSb3cnLFxuICogICAgICAgICAuLi5cbiAqICAgICAgIH1cbiAqICAgICBdXG4gKiAgIH0pOyAvLyAnPHRhYmxlPjx0aGVhZD4uLi4nXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0byBjb21waWxlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbXBpbGVkIG5vZGUuXG4gKiBAdGhpcyB7SFRNTENvbXBpbGVyfVxuICovXG5mdW5jdGlvbiB0YWJsZShub2RlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciByb3dzID0gbm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgaW5kZXggPSByb3dzLmxlbmd0aDtcbiAgICB2YXIgYWxpZ24gPSBub2RlLmFsaWduO1xuICAgIHZhciBhbGlnbkxlbmd0aCA9IGFsaWduLmxlbmd0aDtcbiAgICB2YXIgcG9zO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgcm93O1xuICAgIHZhciBvdXQ7XG4gICAgdmFyIG5hbWU7XG4gICAgdmFyIGNlbGw7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICBwb3MgPSBhbGlnbkxlbmd0aDtcbiAgICAgICAgcm93ID0gcm93c1tpbmRleF0uY2hpbGRyZW47XG4gICAgICAgIG91dCA9IFtdO1xuICAgICAgICBuYW1lID0gaW5kZXggPT09IDAgPyAndGgnIDogJ3RkJztcblxuICAgICAgICB3aGlsZSAocG9zLS0pIHtcbiAgICAgICAgICAgIGNlbGwgPSByb3dbcG9zXTtcbiAgICAgICAgICAgIG91dFtwb3NdID0gaChzZWxmLCBjZWxsLCB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiBuYW1lLFxuICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVzJzoge1xuICAgICAgICAgICAgICAgICAgICAnYWxpZ24nOiBhbGlnbltwb3NdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnY29udGVudCc6IGNlbGwgPyBzZWxmLmFsbChjZWxsKS5qb2luKCdcXG4nKSA6ICcnXG4gICAgICAgICAgICB9LCBjZWxsICYmIGNlbGwuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRbaW5kZXhdID0gaChzZWxmLCByb3dzW2luZGV4XSwge1xuICAgICAgICAgICAgJ25hbWUnOiAndHInLFxuICAgICAgICAgICAgJ2NvbnRlbnQnOiBvdXQuam9pbignXFxuJylcbiAgICAgICAgfSwgcm93c1tpbmRleF0sIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBoKHNlbGYsIG5vZGUsIHtcbiAgICAgICAgJ25hbWUnOiAndGFibGUnLFxuICAgICAgICAnY29udGVudCc6IGgoc2VsZiwgbm9kZSwge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3RoZWFkJyxcbiAgICAgICAgICAgICAgICAnY29udGVudCc6IHJlc3VsdFswXVxuICAgICAgICAgICAgfSwgbnVsbCwgdHJ1ZSkgK1xuICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgaChzZWxmLCBub2RlLCB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAndGJvZHknLFxuICAgICAgICAgICAgICAgICdjb250ZW50JzogcmVzdWx0LnNsaWNlKDEpLmpvaW4oJ1xcbicpXG4gICAgICAgICAgICB9LCBudWxsLCB0cnVlKVxuICAgIH0sIG5vZGUuZGF0YSwgdHJ1ZSk7XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IGEgbGl0ZXJhbCBIVE1MLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGh0bWwoe1xuICogICAgIHZhbHVlOiAnPGk+aXRhbGljPC9pPidcbiAqICAgfSk7IC8vICc8aT5pdGFsaWM8L2k+J1xuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIE5vZGUgdG8gY29tcGlsZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21waWxlZCBub2RlLlxuICogQHRoaXMge0hUTUxDb21waWxlcn1cbiAqL1xuZnVuY3Rpb24gaHRtbChub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zYW5pdGl6ZSA/IHRoaXMuZW5jb2RlKG5vZGUudmFsdWUpIDogbm9kZS52YWx1ZTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBob3Jpem9udGFsIHJ1bGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgcnVsZSgpOyAvLyAnPGhyPidcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGNvbXBpbGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tcGlsZWQgbm9kZS5cbiAqIEB0aGlzIHtIVE1MQ29tcGlsZXJ9XG4gKi9cbmZ1bmN0aW9uIHJ1bGUobm9kZSkge1xuICAgIHJldHVybiBoKHRoaXMsIG5vZGUsIHtcbiAgICAgICAgJ25hbWUnOiAnaHInXG4gICAgfSwgbm9kZS5kYXRhKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgaW5saW5lIGNvZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgaW5saW5lQ29kZSh7XG4gKiAgICAgdmFsdWU6ICdmb28gJmFtcDsgYmFyOydcbiAqICAgfSk7IC8vICc8Y29kZT5mb28gJmFtcDthbXA7IGJhcjs8L2NvZGU+J1xuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIE5vZGUgdG8gY29tcGlsZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21waWxlZCBub2RlLlxuICogQHRoaXMge0hUTUxDb21waWxlcn1cbiAqL1xuZnVuY3Rpb24gaW5saW5lQ29kZShub2RlKSB7XG4gICAgcmV0dXJuIGgodGhpcywgbm9kZSwge1xuICAgICAgICAnbmFtZSc6ICdjb2RlJyxcbiAgICAgICAgJ2NvbnRlbnQnOiBjb2xsYXBzZSh0aGlzLmVuY29kZShub2RlLnZhbHVlKSlcbiAgICB9LCBub2RlLmRhdGEpO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmeSBzdHJvbmdseSBlbXBoYXNpc2VkIGNvbnRlbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgc3Ryb25nKHtcbiAqICAgICBjaGlsZHJlbjogW1xuICogICAgICAge1xuICogICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgIHZhbHVlOiAnZm9vJ1xuICogICAgICAgfVxuICogICAgIF1cbiAqICAgfSk7IC8vICc8c3Ryb25nPmZvbzwvc3Ryb25nPidcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGNvbXBpbGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tcGlsZWQgbm9kZS5cbiAqIEB0aGlzIHtIVE1MQ29tcGlsZXJ9XG4gKi9cbmZ1bmN0aW9uIHN0cm9uZyhub2RlKSB7XG4gICAgcmV0dXJuIGgodGhpcywgbm9kZSwge1xuICAgICAgICAnbmFtZSc6ICdzdHJvbmcnLFxuICAgICAgICAnY29udGVudCc6IHRoaXMuYWxsKG5vZGUpLmpvaW4oJycpXG4gICAgfSwgbm9kZS5kYXRhKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgZW1waGFzaXNlZCBjb250ZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGVtcGhhc2lzKHtcbiAqICAgICBjaGlsZHJlbjogW1xuICogICAgICAge1xuICogICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgIHZhbHVlOiAnZm9vJ1xuICogICAgICAgfVxuICogICAgIF1cbiAqICAgfSk7IC8vICc8ZW0+Zm9vPC9lbT4nXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0byBjb21waWxlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbXBpbGVkIG5vZGUuXG4gKiBAdGhpcyB7SFRNTENvbXBpbGVyfVxuICovXG5mdW5jdGlvbiBlbXBoYXNpcyhub2RlKSB7XG4gICAgcmV0dXJuIGgodGhpcywgbm9kZSwge1xuICAgICAgICAnbmFtZSc6ICdlbScsXG4gICAgICAgICdjb250ZW50JzogdGhpcy5hbGwobm9kZSkuam9pbignJylcbiAgICB9LCBub2RlLmRhdGEpO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmeSBhbiBpbmxpbmUgYnJlYWsuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgaGFyZEJyZWFrKCk7IC8vICc8YnI+XFxuJ1xuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIE5vZGUgdG8gY29tcGlsZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21waWxlZCBub2RlLlxuICogQHRoaXMge0hUTUxDb21waWxlcn1cbiAqL1xuZnVuY3Rpb24gaGFyZEJyZWFrKG5vZGUpIHtcbiAgICByZXR1cm4gaCh0aGlzLCBub2RlLCB7XG4gICAgICAgICduYW1lJzogJ2JyJ1xuICAgIH0sIG5vZGUuZGF0YSkgKyAnXFxuJztcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBsaW5rLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGxpbmsoe1xuICogICAgIGhyZWY6ICdodHRwOi8vZXhhbXBsZS5jb20nLFxuICogICAgIGNoaWxkcmVuOiBbXG4gKiAgICAgICB7XG4gKiAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICAgICAgdmFsdWU6ICdmb28nXG4gKiAgICAgICB9XG4gKiAgICAgXVxuICogICB9KTsgLy8gJzxhIGhyZWY9XCJodHRwOi8vZXhhbXBsZS5jb21cIj5mb288L2E+J1xuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIE5vZGUgdG8gY29tcGlsZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21waWxlZCBub2RlLlxuICogQHRoaXMge0hUTUxDb21waWxlcn1cbiAqL1xuZnVuY3Rpb24gbGluayhub2RlKSB7XG4gICAgcmV0dXJuIGgodGhpcywgbm9kZSwge1xuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ2F0dHJpYnV0ZXMnOiB7XG4gICAgICAgICAgICAnaHJlZic6IG5vcm1hbGl6ZVVSSShub2RlLmhyZWYpLFxuICAgICAgICAgICAgJ3RpdGxlJzogbm9kZS50aXRsZVxuICAgICAgICB9LFxuICAgICAgICAnY29udGVudCc6IHRoaXMuYWxsKG5vZGUpLmpvaW4oJycpXG4gICAgfSwgbm9kZS5kYXRhKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSByZWZlcmVuY2UgdG8gYSBmb290bm90ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICAvLyBJZiBhIGRlZmluaXRpb24gd2FzIGFkZGVkIHByZXZpb3VzbHk6XG4gKiAgIGZvb3Rub3RlUmVmZXJlbmNlKHtcbiAqICAgICBpZGVudGlmaWVyOiAnZm9vJ1xuICogICB9KTtcbiAqICAgLy8gPHN1cCBpZD1cImZucmVmLWZvb1wiPlxuICogICAvLyAgIDxhIGNsYXNzPVwiZm9vdG5vdGUtcmVmXCIgaHJlZj1cIiNmbi1mb29cIj5mb288L2E+XG4gKiAgIC8vIDwvc3VwPlxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIE5vZGUgdG8gY29tcGlsZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21waWxlZCBub2RlLlxuICogQHRoaXMge0hUTUxDb21waWxlcn1cbiAqL1xuZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2Uobm9kZSkge1xuICAgIHZhciBpZGVudGlmaWVyID0gbm9kZS5pZGVudGlmaWVyO1xuXG4gICAgcmV0dXJuIGgodGhpcywgbm9kZSwge1xuICAgICAgICAnbmFtZSc6ICdzdXAnLFxuICAgICAgICAnYXR0cmlidXRlcyc6IHtcbiAgICAgICAgICAgICdpZCc6ICdmbnJlZi0nICsgaWRlbnRpZmllclxuICAgICAgICB9LFxuICAgICAgICAnY29udGVudCc6IGgodGhpcywgbm9kZSwge1xuICAgICAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICAgICAnYXR0cmlidXRlcyc6IHtcbiAgICAgICAgICAgICAgICAnaHJlZic6ICcjZm4tJyArIGlkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgJ2NsYXNzJzogJ2Zvb3Rub3RlLXJlZidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnY29udGVudCc6IGlkZW50aWZpZXJcbiAgICAgICAgfSlcbiAgICB9LCBub2RlLmRhdGEpO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmeSBhIHJlZmVyZW5jZSB0byBhIGxpbmsuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgLy8gSWYgYSBkZWZpbml0aW9uIHdhcyBhZGRlZCBwcmV2aW91c2x5OlxuICogICBsaW5rUmVmZXJlbmNlKHtcbiAqICAgICBpZGVudGlmaWVyOiAnZm9vJ1xuICogICB9KTsgLy8gJzxhIGhyZWY9XCJodHRwOi8vZXhhbXBsZS5jb20vZmF2Lmljb1wiPjwvYT4nXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0byBjb21waWxlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbXBpbGVkIG5vZGUuXG4gKiBAdGhpcyB7SFRNTENvbXBpbGVyfVxuICovXG5mdW5jdGlvbiBsaW5rUmVmZXJlbmNlKG5vZGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGRlZiA9IHNlbGYuZGVmaW5pdGlvbnNbbm9kZS5pZGVudGlmaWVyLnRvVXBwZXJDYXNlKCldIHx8IHt9O1xuXG4gICAgcmV0dXJuIGZhaWxzYWZlKG5vZGUsIGRlZiwgc2VsZikgfHwgaChzZWxmLCBub2RlLCB7XG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAnYXR0cmlidXRlcyc6IHtcbiAgICAgICAgICAgICdocmVmJzogbm9ybWFsaXplVVJJKGRlZi5saW5rIHx8ICcnKSxcbiAgICAgICAgICAgICd0aXRsZSc6IGRlZi50aXRsZVxuICAgICAgICB9LFxuICAgICAgICAnY29udGVudCc6IHNlbGYuYWxsKG5vZGUpLmpvaW4oJycpXG4gICAgfSwgbm9kZS5kYXRhKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSByZWZlcmVuY2UgdG8gYW4gaW1hZ2UuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgLy8gSWYgYSBkZWZpbml0aW9uIHdhcyBhZGRlZCBwcmV2aW91c2x5OlxuICogICBpbWFnZVJlZmVyZW5jZSh7XG4gKiAgICAgaWRlbnRpZmllcjogJ2ZvbydcbiAqICAgfSk7IC8vICc8aW1nIHNyYz1cImh0dHA6Ly9leGFtcGxlLmNvbS9mYXYuaWNvXCIgYWx0PVwiXCI+J1xuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIE5vZGUgdG8gY29tcGlsZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21waWxlZCBub2RlLlxuICogQHRoaXMge0hUTUxDb21waWxlcn1cbiAqL1xuZnVuY3Rpb24gaW1hZ2VSZWZlcmVuY2Uobm9kZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGVmID0gc2VsZi5kZWZpbml0aW9uc1tub2RlLmlkZW50aWZpZXIudG9VcHBlckNhc2UoKV0gfHwge307XG5cbiAgICByZXR1cm4gZmFpbHNhZmUobm9kZSwgZGVmLCBzZWxmKSB8fCBoKHNlbGYsIG5vZGUsIHtcbiAgICAgICAgJ25hbWUnOiAnaW1nJyxcbiAgICAgICAgJ2F0dHJpYnV0ZXMnOiB7XG4gICAgICAgICAgICAnc3JjJzogbm9ybWFsaXplVVJJKGRlZi5saW5rIHx8ICcnKSxcbiAgICAgICAgICAgICdhbHQnOiBub2RlLmFsdCB8fCAnJyxcbiAgICAgICAgICAgICd0aXRsZSc6IGRlZi50aXRsZVxuICAgICAgICB9XG4gICAgfSwgbm9kZS5kYXRhKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYW4gaW1hZ2UuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgaW1hZ2Uoe1xuICogICAgIHNyYzogJ2h0dHA6Ly9leGFtcGxlLmNvbS9mYXYuaWNvJ1xuICogICB9KTsgLy8gJzxpbWcgc3JjPVwiaHR0cDovL2V4YW1wbGUuY29tL2Zhdi5pY29cIiBhbHQ9XCJcIj4nXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0byBjb21waWxlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbXBpbGVkIG5vZGUuXG4gKiBAdGhpcyB7SFRNTENvbXBpbGVyfVxuICovXG5mdW5jdGlvbiBpbWFnZShub2RlKSB7XG4gICAgcmV0dXJuIGgodGhpcywgbm9kZSwge1xuICAgICAgICAnbmFtZSc6ICdpbWcnLFxuICAgICAgICAnYXR0cmlidXRlcyc6IHtcbiAgICAgICAgICAgICdzcmMnOiBub3JtYWxpemVVUkkobm9kZS5zcmMpLFxuICAgICAgICAgICAgJ2FsdCc6IG5vZGUuYWx0IHx8ICcnLFxuICAgICAgICAgICAgJ3RpdGxlJzogbm9kZS50aXRsZVxuICAgICAgICB9XG4gICAgfSwgbm9kZS5kYXRhKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBkZWxldGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBzdHJpa2V0aHJvdWdoKHtcbiAqICAgICBjaGlsZHJlbjogW1xuICogICAgICAge1xuICogICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgIHZhbHVlOiAnZm9vJ1xuICogICAgICAgfVxuICogICAgIF1cbiAqICAgfSk7IC8vICc8ZGVsPmZvbzwvZGVsPidcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGNvbXBpbGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tcGlsZWQgbm9kZS5cbiAqIEB0aGlzIHtIVE1MQ29tcGlsZXJ9XG4gKi9cbmZ1bmN0aW9uIHN0cmlrZXRocm91Z2gobm9kZSkge1xuICAgIHJldHVybiBoKHRoaXMsIG5vZGUsIHtcbiAgICAgICAgJ25hbWUnOiAnZGVsJyxcbiAgICAgICAgJ2NvbnRlbnQnOiB0aGlzLmFsbChub2RlKS5qb2luKCcnKVxuICAgIH0sIG5vZGUuZGF0YSk7XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IHRleHQuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdGV4dCh7dmFsdWU6ICcmJ30pOyAvLyAnJmFtcDsnXG4gKlxuICogICB0ZXh0KHt2YWx1ZTogJ2Zvbyd9KTsgLy8gJ2ZvbydcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGNvbXBpbGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tcGlsZWQgbm9kZS5cbiAqIEB0aGlzIHtIVE1MQ29tcGlsZXJ9XG4gKi9cbmZ1bmN0aW9uIHRleHQobm9kZSkge1xuICAgIHJldHVybiB0cmltTGluZXModGhpcy5lbmNvZGUobm9kZS52YWx1ZSkpO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBlbXB0eSBzdHJpbmcgZm9yIG5vZGVzIHdoaWNoIGFyZSBpZ25vcmVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGlnbm9yZSgpOyAvLyAnJ1xuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gLSBFbXB0eSBzdHJpbmcuXG4gKiBAdGhpcyB7SFRNTENvbXBpbGVyfVxuICovXG5mdW5jdGlvbiBpZ25vcmUoKSB7XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKlxuICogSGVscGVycy5cbiAqL1xuXG52aXNpdG9ycy52aXNpdCA9IG9uZTtcbnZpc2l0b3JzLmFsbCA9IGFsbDtcbnZpc2l0b3JzLnVua25vd24gPSB1bmtub3duO1xudmlzaXRvcnMuZ2VuZXJhdGVGb290bm90ZXMgPSBnZW5lcmF0ZUZvb3Rub3RlcztcblxuLypcbiAqIElnbm9yZWQgbm9kZXMuXG4gKi9cblxudmlzaXRvcnMueWFtbCA9IGlnbm9yZTtcbnZpc2l0b3JzLmRlZmluaXRpb24gPSBpZ25vcmU7XG52aXNpdG9ycy5mb290bm90ZURlZmluaXRpb24gPSBpZ25vcmU7XG5cbi8qXG4gKiBDb21waWxlcnMuXG4gKi9cblxudmlzaXRvcnMuZm9vdG5vdGUgPSBmb290bm90ZTtcbnZpc2l0b3JzLnJvb3QgPSByb290O1xudmlzaXRvcnMuYmxvY2txdW90ZSA9IGJsb2NrcXVvdGU7XG52aXNpdG9ycy5saXN0ID0gbGlzdDtcbnZpc2l0b3JzLmxpc3RJdGVtID0gbGlzdEl0ZW07XG52aXNpdG9ycy5wYXJhZ3JhcGggPSBwYXJhZ3JhcGg7XG52aXNpdG9ycy5oZWFkaW5nID0gaGVhZGluZztcbnZpc2l0b3JzLnRhYmxlID0gdGFibGU7XG52aXNpdG9ycy5jb2RlID0gY29kZTtcbnZpc2l0b3JzLmh0bWwgPSBodG1sO1xudmlzaXRvcnMuaG9yaXpvbnRhbFJ1bGUgPSBydWxlO1xudmlzaXRvcnMuaW5saW5lQ29kZSA9IGlubGluZUNvZGU7XG52aXNpdG9ycy5zdHJvbmcgPSBzdHJvbmc7XG52aXNpdG9ycy5lbXBoYXNpcyA9IGVtcGhhc2lzO1xudmlzaXRvcnMuYnJlYWsgPSBoYXJkQnJlYWs7XG52aXNpdG9ycy5saW5rID0gbGluaztcbnZpc2l0b3JzLmltYWdlID0gaW1hZ2U7XG52aXNpdG9ycy5mb290bm90ZVJlZmVyZW5jZSA9IGZvb3Rub3RlUmVmZXJlbmNlO1xudmlzaXRvcnMubGlua1JlZmVyZW5jZSA9IGxpbmtSZWZlcmVuY2U7XG52aXNpdG9ycy5pbWFnZVJlZmVyZW5jZSA9IGltYWdlUmVmZXJlbmNlO1xudmlzaXRvcnMuZGVsZXRlID0gc3RyaWtldGhyb3VnaDtcbnZpc2l0b3JzLnRleHQgPSB0ZXh0O1xudmlzaXRvcnMuZXNjYXBlID0gZXNjYXBlO1xuXG4vKlxuICogRXhwb3NlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdmlzaXRvcnM7XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgcmVtYXJrOmh0bWw6aFxuICogQGZpbGVvdmVydmlld1xuICogICBDcmVhdGUgSFRNTCBub2Rlcy4gTG9vc2VseSBpbnNwaXJlZCBieVxuICogICBodHRwczovL2dpdGh1Yi5jb20vTWF0dC1Fc2NoL3ZpcnR1YWwtZG9tL2Jsb2IvbWFzdGVyL1xuICogICB2aXJ0dWFsLWh5cGVyc2NyaXB0L2luZGV4LmpzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzICovXG5cbi8qXG4gKiBEZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxuLypcbiAqIENvbnN0YW50cy5cbiAqL1xuXG52YXIgTElORSA9ICdcXG4nO1xudmFyIEVNUFRZID0gJyc7XG52YXIgU1BBQ0UgPSAnICc7XG52YXIgR1QgPSAnPic7XG52YXIgTFQgPSAnPCc7XG52YXIgU0xBU0ggPSAnLyc7XG52YXIgUVVPVEUgPSAnXCInO1xudmFyIEVRVUFMUyA9ICc9JztcblxuLypcbiAqIExpc3Qgb2Ygc2VsZi1jbG9zaW5nIHRhZ3MuXG4gKi9cblxudmFyIENMT1NJTkcgPSBbJ2hyJywgJ2ltZycsICdiciddO1xuXG4vKipcbiAqIENvbXBpbGUgYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdD99IGF0dHJpYnV0ZXMgLSBNYXAgb2YgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKTogc3RyaW5nfSBlbmNvZGUgLSBTdHJhdGVneVxuICogICB0byB1c2UuXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBtZGFzdCBub2RlIGN1cnJlbnRseSBiZWluZ1xuICogICBjb21waWxlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBIVE1MIGF0dHJpYnV0ZXMuXG4gKi9cbmZ1bmN0aW9uIHRvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBlbmNvZGUsIG5vZGUpIHtcbiAgICB2YXIgcGFyYW1ldGVycyA9IFtdO1xuICAgIHZhciBrZXk7XG4gICAgdmFyIHZhbHVlO1xuXG4gICAgZm9yIChrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXNba2V5XTtcblxuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSBlbmNvZGUoU3RyaW5nKHZhbHVlIHx8IEVNUFRZKSwgbm9kZSk7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1c2goa2V5ICsgRVFVQUxTICsgUVVPVEUgKyB2YWx1ZSArIFFVT1RFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbWV0ZXJzLmxlbmd0aCA/IHBhcmFtZXRlcnMuam9pbihTUEFDRSkgOiBFTVBUWTtcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgYG5vZGVgLCBpbiBgY29udGV4dGAsIGludG8gSFRNTC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBoKGNvbXBpbGVyLCB7XG4gKiAgICAgJ3R5cGUnOiAnYnJlYWsnXG4gKiAgICAgJ2F0dHJpYnV0ZXMnOiB7XG4gKiAgICAgICAnaWQnOiAnZm9vJ1xuICogICAgIH1cbiAqICAgfSwgJ2JyJykgLy8gJzxiciBpZD1cImZvb1wiPidcbiAqXG4gKiAgIGgoY29tcGlsZXIsIHtcbiAqICAgICAndHlwZSc6ICdicmVhaydcbiAqICAgfSwgJ2JyJywge1xuICogICAgICdpZCc6ICdmb28nXG4gKiAgIH0pIC8vICc8YnIgaWQ9XCJmb29cIj4nXG4gKlxuICogQHBhcmFtIHtIVE1MQ29tcGlsZXJ9IGNvbnRleHQgLSBDb250ZXh0IGNvbXBpbGVyLlxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gbWRhc3Qgbm9kZS4gVXNlZCBmb3IgcG9zaXRpb25zXG4gKiAgIG9uIGVycm9ycy5cbiAqIEBwYXJhbSB7T2JqZWN0P30gW2RlZmF1bHRzXSAtIERlZmF1bHQgSFRNTCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtPYmplY3Q/fSBbZGVmYXVsdHMuYXR0cmlidXRlc10gLSBEZWZhdWx0IEF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge09iamVjdD99IFtkZWZhdWx0cy5jb250ZW50XSAtIERlZmF1bHQgY29udGVudC5cbiAqIEBwYXJhbSB7T2JqZWN0P30gW2RlZmF1bHRzLm5hbWVdIC0gRGVmYXVsdCB0YWctbmFtZS5cbiAqIEBwYXJhbSB7T2JqZWN0P30gW2RhdGFdIC0gTm9kZSBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtPYmplY3Q/fSBbZGF0YS5odG1sQXR0cmlidXRlc10gLSBIVE1MIEF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge09iamVjdD99IFtkYXRhLmh0bWxDb250ZW50XSAtIENvbnRlbnQgb2YgZWxlbWVudC5cbiAqIEBwYXJhbSB7T2JqZWN0P30gW2RhdGEuaHRtbE5hbWVdIC0gVGFnLW5hbWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtsb29zZV0gLSBXaGV0aGVyIHRvIGFkZCBhbiBpbml0aWFsIGFuZFxuICogICBhIHRyYWlsaW5nIG5ld2xpbmUgY2hhcmFjdGVyIGluc2lkZSB0aGUgb3BlbmluZyBhbmRcbiAqICAgY2xvc2luZyB0YWdzLlxuICogQHJldHVybiB7c3RyaW5nfSAtIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgYG5vZGVgLCBiYXNlZFxuICogICBvbiB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gaChjb250ZXh0LCBub2RlLCBkZWZhdWx0cywgZGF0YSwgbG9vc2UpIHtcbiAgICB2YXIgbmFtZTtcbiAgICB2YXIgdmFsdWU7XG4gICAgdmFyIHBhcmFtZXRlcnM7XG4gICAgdmFyIGNvbnRlbnQ7XG5cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgZGF0YSA9IHt9O1xuICAgIH1cblxuICAgIG5hbWUgPSBjb250ZXh0LmVuY29kZShkYXRhLmh0bWxOYW1lIHx8IGRlZmF1bHRzLm5hbWUpO1xuXG4gICAgaWYgKGRhdGEuaHRtbENvbnRlbnQgJiYgIWNvbnRleHQub3B0aW9ucy5zYW5pdGl6ZSkge1xuICAgICAgICBjb250ZW50ID0gZGF0YS5odG1sQ29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50ID0gZGVmYXVsdHMuY29udGVudCB8fCBFTVBUWTtcbiAgICB9XG5cbiAgICBwYXJhbWV0ZXJzID0gdG9BdHRyaWJ1dGVzKFxuICAgICAgICBhc3NpZ24oe30sIGRlZmF1bHRzLmF0dHJpYnV0ZXMsIGRhdGEuaHRtbEF0dHJpYnV0ZXNcbiAgICApLCBjb250ZXh0LmVuY29kZSwgbm9kZSk7XG5cbiAgICB2YWx1ZSA9IExUICsgbmFtZSArIChwYXJhbWV0ZXJzID8gU1BBQ0UgKyBwYXJhbWV0ZXJzIDogRU1QVFkpO1xuXG4gICAgaWYgKENMT1NJTkcuaW5kZXhPZihuYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICsgKGNvbnRleHQub3B0aW9ucy54aHRtbCA/IFNQQUNFICsgU0xBU0ggOiBFTVBUWSkgKyBHVDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWUgKyBHVCArXG4gICAgICAgIChsb29zZSA/IExJTkUgOiBFTVBUWSkgK1xuICAgICAgICBjb250ZW50ICtcbiAgICAgICAgKGxvb3NlICYmIGNvbnRlbnQgPyBMSU5FIDogRU1QVFkpICtcbiAgICAgICAgTFQgKyBTTEFTSCArIG5hbWUgKyBHVDtcbn1cblxuLypcbiAqIEV4cG9zZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGg7XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgcmVtYXJrOmh0bWw6Y29tcGlsZXJzXG4gKiBAZmlsZW92ZXJ2aWV3IEFTVCB0cmFuc2Zvcm1lciBmb3IgSFRNTC5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLypcbiAqIERlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdmlzaXQgPSByZXF1aXJlKCd1bmlzdC11dGlsLXZpc2l0Jyk7XG5cbi8qXG4gKiBDb25zdGFudHMuXG4gKi9cblxudmFyIEZJUlNUX1dPUkQgPSAvXlteXFwgXFx0XSsoPz1bXFwgXFx0XXwkKS87XG5cbi8qKlxuICogSGVscGVyIHRvIGdldC9zZXQgYGh0bWxBdHRyaWJ1dGVzYC5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGdldCBkYXRhIGZyb20uXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gQXR0cmlidXRlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0QXR0cmlidXRlcyhub2RlKSB7XG4gICAgdmFyIGRhdGEgPSBub2RlLmRhdGEgfHwgKG5vZGUuZGF0YSA9IHt9KTtcbiAgICByZXR1cm4gZGF0YS5odG1sQXR0cmlidXRlcyB8fCAoZGF0YS5odG1sQXR0cmlidXRlcyA9IHt9KTtcbn1cblxuLyoqXG4gKiBBdWdtZW50IGEgY29kZSBub2RlLlxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIENvZGUgbm9kZS5cbiAqL1xuZnVuY3Rpb24gY29kZShub2RlKSB7XG4gICAgdmFyIGxhbmcgPSBub2RlLmxhbmcgJiYgbm9kZS5sYW5nLm1hdGNoKEZJUlNUX1dPUkQpO1xuICAgIHZhciBhdHRycztcblxuICAgIGlmICghbGFuZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXR0cnMgPSBnZXRBdHRyaWJ1dGVzKG5vZGUpO1xuICAgIGF0dHJzLmNsYXNzID0gKGF0dHJzLmNsYXNzID8gYXR0cnMuY2xhc3MgKyAnICcgOiAnJykgKyAnbGFuZ3VhZ2UtJyArIGxhbmc7XG59XG5cbi8qXG4gKiBNYXAgb2Ygbm9kZS10eXBlIGhhbmRsZXJzLlxuICovXG5cbnZhciBoYW5kbGVycyA9IHt9O1xuXG5oYW5kbGVycy5jb2RlID0gY29kZTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYGFzdGAuXG4gKlxuICogQHBhcmFtIHtOb2RlfSBhc3QgLSBUcmVlLlxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1lcihhc3QpIHtcbiAgICB2aXNpdChhc3QsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGhhbmRsZXJzW25vZGUudHlwZV0obm9kZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLypcbiAqIEV4cG9zZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYW5zZm9ybWVyO1xuIiwiLyoqXG4gKiBAYXV0aG9yIFRpdHVzIFdvcm1lclxuICogQGNvcHlyaWdodCAyMDE1LTIwMTYgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgcmVtYXJrXG4gKiBAdmVyc2lvbiAzLjIuMlxuICogQGZpbGVvdmVydmlldyBNYXJrZG93biBwcm9jZXNzb3IgcG93ZXJlZCBieSBwbHVnaW5zLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWVudiBjb21tb25qcyAqL1xuXG4vKlxuICogRGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciB1bmlmaWVkID0gcmVxdWlyZSgndW5pZmllZCcpO1xudmFyIFBhcnNlciA9IHJlcXVpcmUoJy4vbGliL3BhcnNlLmpzJyk7XG52YXIgQ29tcGlsZXIgPSByZXF1aXJlKCcuL2xpYi9zdHJpbmdpZnkuanMnKTtcbnZhciBlc2NhcGUgPSByZXF1aXJlKCcuL2xpYi9lc2NhcGUuanNvbicpO1xuXG4vKlxuICogRXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWZpZWQoe1xuICAgICduYW1lJzogJ21kYXN0JyxcbiAgICAnUGFyc2VyJzogUGFyc2VyLFxuICAgICdDb21waWxlcic6IENvbXBpbGVyLFxuICAgICdkYXRhJzoge1xuICAgICAgICAnZXNjYXBlJzogZXNjYXBlXG4gICAgfVxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cz1bXG4gICAgXCJhcnRpY2xlXCIsXG4gICAgXCJoZWFkZXJcIixcbiAgICBcImFzaWRlXCIsXG4gICAgXCJoZ3JvdXBcIixcbiAgICBcImJsb2NrcXVvdGVcIixcbiAgICBcImhyXCIsXG4gICAgXCJpZnJhbWVcIixcbiAgICBcImJvZHlcIixcbiAgICBcImxpXCIsXG4gICAgXCJtYXBcIixcbiAgICBcImJ1dHRvblwiLFxuICAgIFwib2JqZWN0XCIsXG4gICAgXCJjYW52YXNcIixcbiAgICBcIm9sXCIsXG4gICAgXCJjYXB0aW9uXCIsXG4gICAgXCJvdXRwdXRcIixcbiAgICBcImNvbFwiLFxuICAgIFwicFwiLFxuICAgIFwiY29sZ3JvdXBcIixcbiAgICBcInByZVwiLFxuICAgIFwiZGRcIixcbiAgICBcInByb2dyZXNzXCIsXG4gICAgXCJkaXZcIixcbiAgICBcInNlY3Rpb25cIixcbiAgICBcImRsXCIsXG4gICAgXCJ0YWJsZVwiLFxuICAgIFwidGRcIixcbiAgICBcImR0XCIsXG4gICAgXCJ0Ym9keVwiLFxuICAgIFwiZW1iZWRcIixcbiAgICBcInRleHRhcmVhXCIsXG4gICAgXCJmaWVsZHNldFwiLFxuICAgIFwidGZvb3RcIixcbiAgICBcImZpZ2NhcHRpb25cIixcbiAgICBcInRoXCIsXG4gICAgXCJmaWd1cmVcIixcbiAgICBcInRoZWFkXCIsXG4gICAgXCJmb290ZXJcIixcbiAgICBcInRyXCIsXG4gICAgXCJmb3JtXCIsXG4gICAgXCJ1bFwiLFxuICAgIFwiaDFcIixcbiAgICBcImgyXCIsXG4gICAgXCJoM1wiLFxuICAgIFwiaDRcIixcbiAgICBcImg1XCIsXG4gICAgXCJoNlwiLFxuICAgIFwidmlkZW9cIixcbiAgICBcInNjcmlwdFwiLFxuICAgIFwic3R5bGVcIlxuXVxuIiwiLyoqXG4gKiBAYXV0aG9yIFRpdHVzIFdvcm1lclxuICogQGNvcHlyaWdodCAyMDE1LTIwMTYgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgcmVtYXJrOmRlZmF1bHRzXG4gKiBAdmVyc2lvbiAzLjIuMlxuICogQGZpbGVvdmVydmlldyBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyc2UgYW5kXG4gKiAgc3RyaW5naWZpY2F0aW9uIHNldHRpbmdzLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWVudiBjb21tb25qcyAqL1xuXG4vKlxuICogTm90ZSB0aGF0IGBzdHJpbmdpZnkuZW50aXRpZXNgIGlzIGEgc3RyaW5nLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdwYXJzZSc6IHtcbiAgICAgICAgJ3Bvc2l0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ2dmbSc6IHRydWUsXG4gICAgICAgICd5YW1sJzogdHJ1ZSxcbiAgICAgICAgJ2NvbW1vbm1hcmsnOiBmYWxzZSxcbiAgICAgICAgJ2Zvb3Rub3Rlcyc6IGZhbHNlLFxuICAgICAgICAncGVkYW50aWMnOiBmYWxzZSxcbiAgICAgICAgJ2JyZWFrcyc6IGZhbHNlXG4gICAgfSxcbiAgICAnc3RyaW5naWZ5Jzoge1xuICAgICAgICAnZ2ZtJzogdHJ1ZSxcbiAgICAgICAgJ2NvbW1vbm1hcmsnOiBmYWxzZSxcbiAgICAgICAgJ2VudGl0aWVzJzogJ2ZhbHNlJyxcbiAgICAgICAgJ3NldGV4dCc6IGZhbHNlLFxuICAgICAgICAnY2xvc2VBdHgnOiBmYWxzZSxcbiAgICAgICAgJ2xvb3NlVGFibGUnOiBmYWxzZSxcbiAgICAgICAgJ3NwYWNlZFRhYmxlJzogdHJ1ZSxcbiAgICAgICAgJ2luY3JlbWVudExpc3RNYXJrZXInOiB0cnVlLFxuICAgICAgICAnZmVuY2VzJzogZmFsc2UsXG4gICAgICAgICdmZW5jZSc6ICdgJyxcbiAgICAgICAgJ2J1bGxldCc6ICctJyxcbiAgICAgICAgJ2xpc3RJdGVtSW5kZW50JzogJ3RhYicsXG4gICAgICAgICdydWxlJzogJyonLFxuICAgICAgICAncnVsZVNwYWNlcyc6IHRydWUsXG4gICAgICAgICdydWxlUmVwZXRpdGlvbic6IDMsXG4gICAgICAgICdzdHJvbmcnOiAnKicsXG4gICAgICAgICdlbXBoYXNpcyc6ICdfJ1xuICAgIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwiZGVmYXVsdFwiOiBbXG4gICAgXCJcXFxcXCIsXG4gICAgXCJgXCIsXG4gICAgXCIqXCIsXG4gICAgXCJ7XCIsXG4gICAgXCJ9XCIsXG4gICAgXCJbXCIsXG4gICAgXCJdXCIsXG4gICAgXCIoXCIsXG4gICAgXCIpXCIsXG4gICAgXCIjXCIsXG4gICAgXCIrXCIsXG4gICAgXCItXCIsXG4gICAgXCIuXCIsXG4gICAgXCIhXCIsXG4gICAgXCJfXCIsXG4gICAgXCI+XCJcbiAgXSxcbiAgXCJnZm1cIjogW1xuICAgIFwiXFxcXFwiLFxuICAgIFwiYFwiLFxuICAgIFwiKlwiLFxuICAgIFwie1wiLFxuICAgIFwifVwiLFxuICAgIFwiW1wiLFxuICAgIFwiXVwiLFxuICAgIFwiKFwiLFxuICAgIFwiKVwiLFxuICAgIFwiI1wiLFxuICAgIFwiK1wiLFxuICAgIFwiLVwiLFxuICAgIFwiLlwiLFxuICAgIFwiIVwiLFxuICAgIFwiX1wiLFxuICAgIFwiPlwiLFxuICAgIFwiflwiLFxuICAgIFwifFwiXG4gIF0sXG4gIFwiY29tbW9ubWFya1wiOiBbXG4gICAgXCJcXFxcXCIsXG4gICAgXCJgXCIsXG4gICAgXCIqXCIsXG4gICAgXCJ7XCIsXG4gICAgXCJ9XCIsXG4gICAgXCJbXCIsXG4gICAgXCJdXCIsXG4gICAgXCIoXCIsXG4gICAgXCIpXCIsXG4gICAgXCIjXCIsXG4gICAgXCIrXCIsXG4gICAgXCItXCIsXG4gICAgXCIuXCIsXG4gICAgXCIhXCIsXG4gICAgXCJfXCIsXG4gICAgXCI+XCIsXG4gICAgXCJ+XCIsXG4gICAgXCJ8XCIsXG4gICAgXCJcXG5cIixcbiAgICBcIlxcXCJcIixcbiAgICBcIiRcIixcbiAgICBcIiVcIixcbiAgICBcIiZcIixcbiAgICBcIidcIixcbiAgICBcIixcIixcbiAgICBcIi9cIixcbiAgICBcIjpcIixcbiAgICBcIjtcIixcbiAgICBcIjxcIixcbiAgICBcIj1cIixcbiAgICBcIj9cIixcbiAgICBcIkBcIixcbiAgICBcIl5cIlxuICBdXG59XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUtMjAxNiBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSByZW1hcms6cGFyc2VcbiAqIEB2ZXJzaW9uIDMuMi4yXG4gKiBAZmlsZW92ZXJ2aWV3IFBhcnNlIGEgbWFya2Rvd24gZG9jdW1lbnQgaW50byBhblxuICogICBhYnN0cmFjdCBzeW50YXggdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLypcbiAqIERlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgZGVjb2RlID0gcmVxdWlyZSgncGFyc2UtZW50aXRpZXMnKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG52YXIgdHJpbSA9IHJlcXVpcmUoJ3RyaW0nKTtcbnZhciB0cmltVHJhaWxpbmdMaW5lcyA9IHJlcXVpcmUoJ3RyaW0tdHJhaWxpbmctbGluZXMnKTtcbnZhciBleHRlbmQgPSByZXF1aXJlKCdleHRlbmQuanMnKTtcbnZhciB1dGlsaXRpZXMgPSByZXF1aXJlKCcuL3V0aWxpdGllcy5qcycpO1xudmFyIGRlZmF1bHRPcHRpb25zID0gcmVxdWlyZSgnLi9kZWZhdWx0cy5qcycpLnBhcnNlO1xudmFyIGJsb2NrRWxlbWVudHMgPSByZXF1aXJlKCcuL2Jsb2NrLWVsZW1lbnRzLmpzb24nKTtcblxuLypcbiAqIE1ldGhvZHMuXG4gKi9cblxudmFyIHJhaXNlID0gdXRpbGl0aWVzLnJhaXNlO1xudmFyIGNsZWFuID0gdXRpbGl0aWVzLmNsZWFuO1xudmFyIHZhbGlkYXRlID0gdXRpbGl0aWVzLnZhbGlkYXRlO1xudmFyIG5vcm1hbGl6ZSA9IHV0aWxpdGllcy5ub3JtYWxpemVJZGVudGlmaWVyO1xudmFyIHN0YXRlVG9nZ2xlciA9IHV0aWxpdGllcy5zdGF0ZVRvZ2dsZXI7XG52YXIgbWVyZ2VhYmxlID0gdXRpbGl0aWVzLm1lcmdlYWJsZTtcbnZhciBNRVJHRUFCTEVfTk9ERVMgPSB1dGlsaXRpZXMuTUVSR0VBQkxFX05PREVTO1xudmFyIGhhcyA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4vKlxuICogTnVtZXJpYyBjb25zdGFudHMuXG4gKi9cblxudmFyIFNQQUNFX1NJWkUgPSAxO1xudmFyIFRBQl9TSVpFID0gNDtcbnZhciBDT0RFX0lOREVOVF9MRU5HVEggPSA0O1xudmFyIE1JTl9GRU5DRV9DT1VOVCA9IDM7XG52YXIgTUFYX0FUWF9DT1VOVCA9IDY7XG52YXIgTUFYX0xJTkVfSEVBRElOR19JTkRFTlQgPSAzO1xudmFyIEhPUklaT05UQUxfUlVMRV9NQVJLRVJfQ09VTlQgPSAzO1xudmFyIE1JTl9DTE9TSU5HX0hUTUxfTkVXTElORV9DT1VOVCA9IDI7XG52YXIgTUlOX0JSRUFLX0xFTkdUSCA9IDI7XG52YXIgTUlOX1RBQkxFX0NPTFVNTlMgPSAyO1xudmFyIE1JTl9UQUJMRV9ST1dTID0gMjtcblxuLypcbiAqIEVycm9yIG1lc3NhZ2VzLlxuICovXG5cbnZhciBFUlJfSU5GSU5JVEVfTE9PUCA9ICdJbmZpbml0ZSBsb29wJztcbnZhciBFUlJfTUlTU0lOR19MT0NBVE9SID0gJ01pc3NpbmcgbG9jYXRvcjogJztcbnZhciBFUlJfSU5DT1JSRUNUTFlfRUFURU4gPSAnSW5jb3JyZWN0bHkgZWF0ZW4gdmFsdWU6IHBsZWFzZSByZXBvcnQgdGhpcyAnICtcbiAgICAnd2FybmluZyBvbiBodHRwOi8vZ2l0LmlvL3ZVWVd6JztcblxuLypcbiAqIEV4cHJlc3Npb25zLlxuICovXG5cbnZhciBFWFBSRVNTSU9OX0JVTExFVCA9IC9eKFsgXFx0XSopKFsqKy1dfFxcZCtbLildKSggezEsNH0oPyEgKXwgfFxcdHwkfCg/PVxcbikpKFteXFxuXSopLztcbnZhciBFWFBSRVNTSU9OX1BFREFOVElDX0JVTExFVCA9IC9eKFsgXFx0XSopKFsqKy1dfFxcZCtbLildKShbIFxcdF0rKS87XG52YXIgRVhQUkVTU0lPTl9JTklUSUFMX0lOREVOVCA9IC9eKCB7MSw0fXxcXHQpPy9nbTtcbnZhciBFWFBSRVNTSU9OX0lOSVRJQUxfVEFCID0gL14oIHs0fXxcXHQpPy9nbTtcbnZhciBFWFBSRVNTSU9OX0hUTUxfTElOS19PUEVOID0gL148YSAvaTtcbnZhciBFWFBSRVNTSU9OX0hUTUxfTElOS19DTE9TRSA9IC9ePFxcL2E+L2k7XG52YXIgRVhQUkVTU0lPTl9MT09TRV9MSVNUX0lURU0gPSAvXFxuXFxuKD8hXFxzKiQpLztcbnZhciBFWFBSRVNTSU9OX1RBU0tfSVRFTSA9IC9eXFxbKFtcXCBcXHRdfHh8WClcXF1bXFwgXFx0XS87XG5cbi8qXG4gKiBDaGFyYWN0ZXJzLlxuICovXG5cbnZhciBDX0JBQ0tTTEFTSCA9ICdcXFxcJztcbnZhciBDX1VOREVSU0NPUkUgPSAnXyc7XG52YXIgQ19BU1RFUklTSyA9ICcqJztcbnZhciBDX1RJQ0sgPSAnYCc7XG52YXIgQ19BVF9TSUdOID0gJ0AnO1xudmFyIENfSEFTSCA9ICcjJztcbnZhciBDX1BMVVMgPSAnKyc7XG52YXIgQ19EQVNIID0gJy0nO1xudmFyIENfRE9UID0gJy4nO1xudmFyIENfUElQRSA9ICd8JztcbnZhciBDX0RPVUJMRV9RVU9URSA9ICdcIic7XG52YXIgQ19TSU5HTEVfUVVPVEUgPSAnXFwnJztcbnZhciBDX0NPTU1BID0gJywnO1xudmFyIENfU0xBU0ggPSAnLyc7XG52YXIgQ19DT0xPTiA9ICc6JztcbnZhciBDX1NFTUlfQ09MT04gPSAnOyc7XG52YXIgQ19RVUVTVElPTl9NQVJLID0gJz8nO1xudmFyIENfQ0FSRVQgPSAnXic7XG52YXIgQ19FUVVBTFMgPSAnPSc7XG52YXIgQ19FWENMQU1BVElPTl9NQVJLID0gJyEnO1xudmFyIENfVElMREUgPSAnfic7XG52YXIgQ19MVCA9ICc8JztcbnZhciBDX0dUID0gJz4nO1xudmFyIENfQlJBQ0tFVF9PUEVOID0gJ1snO1xudmFyIENfQlJBQ0tFVF9DTE9TRSA9ICddJztcbnZhciBDX1BBUkVOX09QRU4gPSAnKCc7XG52YXIgQ19QQVJFTl9DTE9TRSA9ICcpJztcbnZhciBDX1NQQUNFID0gJyAnO1xudmFyIENfRk9STV9GRUVEID0gJ1xcZic7XG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19DQVJSSUFHRV9SRVRVUk4gPSAnXFxyJztcbnZhciBDX1RBQiA9ICdcXHQnO1xudmFyIENfVkVSVElDQUxfVEFCID0gJ1xcdic7XG52YXIgQ19OT19CUkVBS19TUEFDRSA9ICdcXHUwMGEwJztcbnZhciBDX09HSEFNX1NQQUNFID0gJ1xcdTE2ODAnO1xudmFyIENfTU9OR09MSUFOX1ZPV0VMX1NFUEFSQVRPUiA9ICdcXHUxODBlJztcbnZhciBDX0VOX1FVQUQgPSAnXFx1MjAwMCc7XG52YXIgQ19FTV9RVUFEID0gJ1xcdTIwMDEnO1xudmFyIENfRU5fU1BBQ0UgPSAnXFx1MjAwMic7XG52YXIgQ19FTV9TUEFDRSA9ICdcXHUyMDAzJztcbnZhciBDX1RIUkVFX1BFUl9FTV9TUEFDRSA9ICdcXHUyMDA0JztcbnZhciBDX0ZPVVJfUEVSX0VNX1NQQUNFID0gJ1xcdTIwMDUnO1xudmFyIENfU0lYX1BFUl9FTV9TUEFDRSA9ICdcXHUyMDA2JztcbnZhciBDX0ZJR1VSRV9TUEFDRSA9ICdcXHUyMDA3JztcbnZhciBDX1BVTkNUVUFUSU9OX1NQQUNFID0gJ1xcdTIwMDgnO1xudmFyIENfVEhJTl9TUEFDRSA9ICdcXHUyMDA5JztcbnZhciBDX0hBSVJfU1BBQ0UgPSAnXFx1MjAwYSc7XG52YXIgQ19MSU5FX1NFUEFSQVRPUiA9ICfigItcXHUyMDI4JztcbnZhciBDX1BBUkFHUkFQSF9TRVBBUkFUT1IgPSAn4oCLXFx1MjAyOSc7XG52YXIgQ19OQVJST1dfTk9fQlJFQUtfU1BBQ0UgPSAnXFx1MjAyZic7XG52YXIgQ19JREVPR1JBUEhJQ19TUEFDRSA9ICdcXHUzMDAwJztcbnZhciBDX1pFUk9fV0lEVEhfTk9fQlJFQUtfU1BBQ0UgPSAnXFx1ZmVmZic7XG52YXIgQ19YX0xPV0VSID0gJ3gnO1xuXG4vKlxuICogQ2hhcmFjdGVyIGNvZGVzLlxuICovXG5cbnZhciBDQ19BX0xPV0VSID0gJ2EnLmNoYXJDb2RlQXQoMCk7XG52YXIgQ0NfQV9VUFBFUiA9ICdBJy5jaGFyQ29kZUF0KDApO1xudmFyIENDX1pfTE9XRVIgPSAneicuY2hhckNvZGVBdCgwKTtcbnZhciBDQ19aX1VQUEVSID0gJ1onLmNoYXJDb2RlQXQoMCk7XG52YXIgQ0NfMCA9ICcwJy5jaGFyQ29kZUF0KDApO1xudmFyIENDXzkgPSAnOScuY2hhckNvZGVBdCgwKTtcblxuLypcbiAqIFByb3RvY29scy5cbiAqL1xuXG52YXIgSFRUUF9QUk9UT0NPTCA9ICdodHRwOi8vJztcbnZhciBIVFRQU19QUk9UT0NPTCA9ICdodHRwczovLyc7XG52YXIgTUFJTFRPX1BST1RPQ09MID0gJ21haWx0bzonO1xuXG52YXIgUFJPVE9DT0xTID0gW1xuICAgIEhUVFBfUFJPVE9DT0wsXG4gICAgSFRUUFNfUFJPVE9DT0wsXG4gICAgTUFJTFRPX1BST1RPQ09MXG5dO1xuXG52YXIgUFJPVE9DT0xTX0xFTkdUSCA9IFBST1RPQ09MUy5sZW5ndGg7XG5cbi8qXG4gKiBUZXh0dWFsIGNvbnN0YW50cy5cbiAqL1xuXG52YXIgWUFNTF9GRU5DRSA9IHJlcGVhdChDX0RBU0gsIDMpO1xudmFyIENPREVfSU5ERU5UID0gcmVwZWF0KENfU1BBQ0UsIENPREVfSU5ERU5UX0xFTkdUSCk7XG52YXIgRU1QVFkgPSAnJztcbnZhciBCTE9DSyA9ICdibG9jayc7XG52YXIgSU5MSU5FID0gJ2lubGluZSc7XG52YXIgQ09NTUVOVF9TVEFSVCA9ICc8IS0tJztcbnZhciBDT01NRU5UX0VORCA9ICctLT4nO1xudmFyIENEQVRBX1NUQVJUID0gJzwhW0NEQVRBWyc7XG52YXIgQ0RBVEFfRU5EID0gJ11dPic7XG52YXIgQ09NTUVOVF9FTkRfQ0hBUiA9IENPTU1FTlRfRU5ELmNoYXJBdCgwKTtcbnZhciBDREFUQV9FTkRfQ0hBUiA9IENEQVRBX0VORC5jaGFyQXQoMCk7XG52YXIgQ09NTUVOVF9TVEFSVF9MRU5HVEggPSBDT01NRU5UX1NUQVJULmxlbmd0aDtcbnZhciBDT01NRU5UX0VORF9MRU5HVEggPSBDT01NRU5UX0VORC5sZW5ndGg7XG52YXIgQ0RBVEFfU1RBUlRfTEVOR1RIID0gQ0RBVEFfU1RBUlQubGVuZ3RoO1xudmFyIENEQVRBX0VORF9MRU5HVEggPSBDREFUQV9FTkQubGVuZ3RoO1xuXG4vKlxuICogTm9kZSB0eXBlcy5cbiAqL1xuXG52YXIgVF9IT1JJWk9OVEFMX1JVTEUgPSAnaG9yaXpvbnRhbFJ1bGUnO1xudmFyIFRfSFRNTCA9ICdodG1sJztcbnZhciBUX1lBTUwgPSAneWFtbCc7XG52YXIgVF9UQUJMRSA9ICd0YWJsZSc7XG52YXIgVF9UQUJMRV9DRUxMID0gJ3RhYmxlQ2VsbCc7XG52YXIgVF9UQUJMRV9IRUFERVIgPSAndGFibGVIZWFkZXInO1xudmFyIFRfVEFCTEVfUk9XID0gJ3RhYmxlUm93JztcbnZhciBUX1BBUkFHUkFQSCA9ICdwYXJhZ3JhcGgnO1xudmFyIFRfVEVYVCA9ICd0ZXh0JztcbnZhciBUX0NPREUgPSAnY29kZSc7XG52YXIgVF9MSVNUID0gJ2xpc3QnO1xudmFyIFRfTElTVF9JVEVNID0gJ2xpc3RJdGVtJztcbnZhciBUX0RFRklOSVRJT04gPSAnZGVmaW5pdGlvbic7XG52YXIgVF9GT09UTk9URV9ERUZJTklUSU9OID0gJ2Zvb3Rub3RlRGVmaW5pdGlvbic7XG52YXIgVF9IRUFESU5HID0gJ2hlYWRpbmcnO1xudmFyIFRfQkxPQ0tRVU9URSA9ICdibG9ja3F1b3RlJztcbnZhciBUX0xJTksgPSAnbGluayc7XG52YXIgVF9JTUFHRSA9ICdpbWFnZSc7XG52YXIgVF9GT09UTk9URSA9ICdmb290bm90ZSc7XG52YXIgVF9TVFJPTkcgPSAnc3Ryb25nJztcbnZhciBUX0VNUEhBU0lTID0gJ2VtcGhhc2lzJztcbnZhciBUX0RFTEVURSA9ICdkZWxldGUnO1xudmFyIFRfSU5MSU5FX0NPREUgPSAnaW5saW5lQ29kZSc7XG52YXIgVF9CUkVBSyA9ICdicmVhayc7XG52YXIgVF9ST09UID0gJ3Jvb3QnO1xuXG4vKlxuICogQXZhaWxhYmxlIHRhYmxlIGFsaWdubWVudHMuXG4gKi9cblxudmFyIFRBQkxFX0FMSUdOX0xFRlQgPSAnbGVmdCc7XG52YXIgVEFCTEVfQUxJR05fQ0VOVEVSID0gJ2NlbnRlcic7XG52YXIgVEFCTEVfQUxJR05fUklHSFQgPSAncmlnaHQnO1xudmFyIFRBQkxFX0FMSUdOX05PTkUgPSBudWxsO1xuXG4vKlxuICogQXZhaWxhYmxlIHJlZmVyZW5jZSB0eXBlcy5cbiAqL1xuXG52YXIgUkVGRVJFTkNFX1RZUEVfU0hPUlRDVVQgPSAnc2hvcnRjdXQnO1xudmFyIFJFRkVSRU5DRV9UWVBFX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQnO1xudmFyIFJFRkVSRU5DRV9UWVBFX0ZVTEwgPSAnZnVsbCc7XG5cbi8qXG4gKiBBIG1hcCBvZiBjaGFyYWN0ZXJzLCBhbmQgdGhlaXIgY29sdW1uIGxlbmd0aCxcbiAqIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGluZGVudGF0aW9uLlxuICovXG5cbnZhciBJTkRFTlRBVElPTl9DSEFSQUNURVJTID0ge307XG5cbklOREVOVEFUSU9OX0NIQVJBQ1RFUlNbQ19TUEFDRV0gPSBTUEFDRV9TSVpFO1xuSU5ERU5UQVRJT05fQ0hBUkFDVEVSU1tDX1RBQl0gPSBUQUJfU0laRTtcblxuLypcbiAqIEEgbWFwIG9mIGNoYXJhY3RlcnMsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcmsgZW1waGFzaXMuXG4gKi9cblxudmFyIEVNUEhBU0lTX01BUktFUlMgPSB7fTtcblxuRU1QSEFTSVNfTUFSS0VSU1tDX0FTVEVSSVNLXSA9IHRydWU7XG5FTVBIQVNJU19NQVJLRVJTW0NfVU5ERVJTQ09SRV0gPSB0cnVlO1xuXG4vKlxuICogQSBtYXAgb2YgY2hhcmFjdGVycywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFyayBydWxlcy5cbiAqL1xuXG52YXIgUlVMRV9NQVJLRVJTID0ge307XG5cblJVTEVfTUFSS0VSU1tDX0FTVEVSSVNLXSA9IHRydWU7XG5SVUxFX01BUktFUlNbQ19VTkRFUlNDT1JFXSA9IHRydWU7XG5SVUxFX01BUktFUlNbQ19EQVNIXSA9IHRydWU7XG5cbi8qXG4gKiBBIG1hcCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcmtcbiAqIGxpc3QtaXRlbXMuXG4gKi9cblxudmFyIExJU1RfVU5PUkRFUkVEX01BUktFUlMgPSB7fTtcblxuTElTVF9VTk9SREVSRURfTUFSS0VSU1tDX0FTVEVSSVNLXSA9IHRydWU7XG5MSVNUX1VOT1JERVJFRF9NQVJLRVJTW0NfUExVU10gPSB0cnVlO1xuTElTVF9VTk9SREVSRURfTUFSS0VSU1tDX0RBU0hdID0gdHJ1ZTtcblxuLypcbiAqIEEgbWFwIG9mIGNoYXJhY3RlcnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFya1xuICogbGlzdC1pdGVtcyBhZnRlciBhIGRpZ2l0LlxuICovXG5cbnZhciBMSVNUX09SREVSRURfTUFSS0VSUyA9IHt9O1xuXG5MSVNUX09SREVSRURfTUFSS0VSU1tDX0RPVF0gPSB0cnVlO1xuXG4vKlxuICogQSBtYXAgb2YgY2hhcmFjdGVycyB3aGljaCBjYW4gYmUgdXNlZCB0byBtYXJrXG4gKiBsaXN0LWl0ZW1zIGFmdGVyIGEgZGlnaXQuXG4gKi9cblxudmFyIExJU1RfT1JERVJFRF9DT01NT05NQVJLX01BUktFUlMgPSB7fTtcblxuTElTVF9PUkRFUkVEX0NPTU1PTk1BUktfTUFSS0VSU1tDX0RPVF0gPSB0cnVlO1xuTElTVF9PUkRFUkVEX0NPTU1PTk1BUktfTUFSS0VSU1tDX1BBUkVOX0NMT1NFXSA9IHRydWU7XG5cbi8qXG4gKiBBIG1hcCBvZiBjaGFyYWN0ZXJzLCB3aGljaCBjYW4gYmUgdXNlZCB0byBtYXJrIGxpbmtcbiAqIGFuZCBpbWFnZSB0aXRsZXMuXG4gKi9cblxudmFyIExJTktfVElUTEVfTUFSS0VSUyA9IHt9O1xuXG5MSU5LX1RJVExFX01BUktFUlNbQ19ET1VCTEVfUVVPVEVdID0gQ19ET1VCTEVfUVVPVEU7XG5MSU5LX1RJVExFX01BUktFUlNbQ19TSU5HTEVfUVVPVEVdID0gQ19TSU5HTEVfUVVPVEU7XG5cbi8qXG4gKiBBIG1hcCBvZiBjaGFyYWN0ZXJzLCB3aGljaCBjYW4gYmUgdXNlZCB0byBtYXJrIGxpbmtcbiAqIGFuZCBpbWFnZSB0aXRsZXMgaW4gY29tbW9ubWFyay1tb2RlLlxuICovXG5cbnZhciBDT01NT05NQVJLX0xJTktfVElUTEVfTUFSS0VSUyA9IHt9O1xuXG5DT01NT05NQVJLX0xJTktfVElUTEVfTUFSS0VSU1tDX0RPVUJMRV9RVU9URV0gPSBDX0RPVUJMRV9RVU9URTtcbkNPTU1PTk1BUktfTElOS19USVRMRV9NQVJLRVJTW0NfU0lOR0xFX1FVT1RFXSA9IENfU0lOR0xFX1FVT1RFO1xuQ09NTU9OTUFSS19MSU5LX1RJVExFX01BUktFUlNbQ19QQVJFTl9PUEVOXSA9IENfUEFSRU5fQ0xPU0U7XG5cbi8qXG4gKiBBIG1hcCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcmsgc2V0ZXh0XG4gKiBoZWFkZXJzLCBtYXBwaW5nIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZGVwdGguXG4gKi9cblxudmFyIFNFVEVYVF9NQVJLRVJTID0ge307XG5cblNFVEVYVF9NQVJLRVJTW0NfRVFVQUxTXSA9IDE7XG5TRVRFWFRfTUFSS0VSU1tDX0RBU0hdID0gMjtcblxuLypcbiAqIEEgbWFwIG9mIHR3byBmdW5jdGlvbnMgd2hpY2ggY2FuIGNyZWF0ZSBsaXN0IGl0ZW1zLlxuICovXG5cbnZhciBMSVNUX0lURU1fTUFQID0ge307XG5cbkxJU1RfSVRFTV9NQVAudHJ1ZSA9IHJlbmRlclBlZGFudGljTGlzdEl0ZW07XG5MSVNUX0lURU1fTUFQLmZhbHNlID0gcmVuZGVyTm9ybWFsTGlzdEl0ZW07XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBgY2hhcmFjdGVyYCBpcyBhbHBoYWJldGljLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXIgLSBTaW5nbGUgY2hhcmFjdGVyIHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBXaGV0aGVyIG9yIG5vdCBgY2hhcmFjdGVyYCBpc1xuICogICBhbHBoYWJldGljLlxuICovXG5mdW5jdGlvbiBpc0FscGhhYmV0aWMoY2hhcmFjdGVyKSB7XG4gICAgdmFyIGNvZGUgPSBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKTtcblxuICAgIHJldHVybiAoY29kZSA+PSBDQ19BX0xPV0VSICYmIGNvZGUgPD0gQ0NfWl9MT1dFUikgfHxcbiAgICAgICAgKGNvZGUgPj0gQ0NfQV9VUFBFUiAmJiBjb2RlIDw9IENDX1pfVVBQRVIpO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYGNoYXJhY3RlcmAgaXMgbnVtZXJpYy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhcmFjdGVyIC0gU2luZ2xlIGNoYXJhY3RlciB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gV2hldGhlciBvciBub3QgYGNoYXJhY3RlcmAgaXNcbiAqICAgbnVtZXJpYy5cbiAqL1xuZnVuY3Rpb24gaXNOdW1lcmljKGNoYXJhY3Rlcikge1xuICAgIHZhciBjb2RlID0gY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCk7XG5cbiAgICByZXR1cm4gY29kZSA+PSBDQ18wICYmIGNvZGUgPD0gQ0NfOTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGBjaGFyYWN0ZXJgIGlzIGEgd29yZCBjaGFyYWN0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJhY3RlciAtIFNpbmdsZSBjaGFyYWN0ZXIgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFdoZXRoZXIgb3Igbm90IGBjaGFyYWN0ZXJgIGlzIGFcbiAqICAgd29yZCBjaGFyYWN0ZXIuXG4gKi9cbmZ1bmN0aW9uIGlzV29yZENoYXJhY3RlcihjaGFyYWN0ZXIpIHtcbiAgICByZXR1cm4gY2hhcmFjdGVyID09PSBDX1VOREVSU0NPUkUgfHxcbiAgICAgICAgaXNBbHBoYWJldGljKGNoYXJhY3RlcikgfHxcbiAgICAgICAgaXNOdW1lcmljKGNoYXJhY3Rlcik7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBgY2hhcmFjdGVyYCBpcyB3aGl0ZS1zcGFjZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhcmFjdGVyIC0gU2luZ2xlIGNoYXJhY3RlciB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gV2hldGhlciBvciBub3QgYGNoYXJhY3RlcmAgaXNcbiAqICAgd2hpdGUtc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIGlzV2hpdGVTcGFjZShjaGFyYWN0ZXIpIHtcbiAgICByZXR1cm4gY2hhcmFjdGVyID09PSBDX1NQQUNFIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gQ19GT1JNX0ZFRUQgfHxcbiAgICAgICAgY2hhcmFjdGVyID09PSBDX05FV0xJTkUgfHxcbiAgICAgICAgY2hhcmFjdGVyID09PSBDX0NBUlJJQUdFX1JFVFVSTiB8fFxuICAgICAgICBjaGFyYWN0ZXIgPT09IENfVEFCIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gQ19WRVJUSUNBTF9UQUIgfHxcbiAgICAgICAgY2hhcmFjdGVyID09PSBDX05PX0JSRUFLX1NQQUNFIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gQ19PR0hBTV9TUEFDRSB8fFxuICAgICAgICBjaGFyYWN0ZXIgPT09IENfTU9OR09MSUFOX1ZPV0VMX1NFUEFSQVRPUiB8fFxuICAgICAgICBjaGFyYWN0ZXIgPT09IENfRU5fUVVBRCB8fFxuICAgICAgICBjaGFyYWN0ZXIgPT09IENfRU1fUVVBRCB8fFxuICAgICAgICBjaGFyYWN0ZXIgPT09IENfRU5fU1BBQ0UgfHxcbiAgICAgICAgY2hhcmFjdGVyID09PSBDX0VNX1NQQUNFIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gQ19USFJFRV9QRVJfRU1fU1BBQ0UgfHxcbiAgICAgICAgY2hhcmFjdGVyID09PSBDX0ZPVVJfUEVSX0VNX1NQQUNFIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gQ19TSVhfUEVSX0VNX1NQQUNFIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gQ19GSUdVUkVfU1BBQ0UgfHxcbiAgICAgICAgY2hhcmFjdGVyID09PSBDX1BVTkNUVUFUSU9OX1NQQUNFIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gQ19USElOX1NQQUNFIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gQ19IQUlSX1NQQUNFIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gQ19MSU5FX1NFUEFSQVRPUiB8fFxuICAgICAgICBjaGFyYWN0ZXIgPT09IENfUEFSQUdSQVBIX1NFUEFSQVRPUiB8fFxuICAgICAgICBjaGFyYWN0ZXIgPT09IENfTkFSUk9XX05PX0JSRUFLX1NQQUNFIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gQ19JREVPR1JBUEhJQ19TUEFDRSB8fFxuICAgICAgICBjaGFyYWN0ZXIgPT09IENfWkVST19XSURUSF9OT19CUkVBS19TUEFDRTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGBjaGFyYWN0ZXJgIGNhbiBiZSBpbnNpZGUgYW4gdW5xdW90ZWRcbiAqIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhcmFjdGVyIC0gU2luZ2xlIGNoYXJhY3RlciB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gV2hldGhlciBvciBub3QgYGNoYXJhY3RlcmAgY2FuIGJlXG4gKiAgIGluc2lkZSBhbiB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGlzVW5xdW90ZWRBdHRyaWJ1dGVDaGFyYWN0ZXIoY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIGNoYXJhY3RlciAhPT0gQ19ET1VCTEVfUVVPVEUgJiZcbiAgICAgICAgY2hhcmFjdGVyICE9PSBDX1NJTkdMRV9RVU9URSAmJlxuICAgICAgICBjaGFyYWN0ZXIgIT09IENfRVFVQUxTICYmXG4gICAgICAgIGNoYXJhY3RlciAhPT0gQ19MVCAmJlxuICAgICAgICBjaGFyYWN0ZXIgIT09IENfR1QgJiZcbiAgICAgICAgY2hhcmFjdGVyICE9PSBDX1RJQ0s7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBgY2hhcmFjdGVyYCBjYW4gYmUgaW5zaWRlIGEgZG91YmxlLXF1b3RlZFxuICogYXR0cmlidXRlIHZhbHVlLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWxpbWl0ZXIgLSBDbG9zaW5nIGRlbGltaXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXIgLSBTaW5nbGUgY2hhcmFjdGVyIHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBXaGV0aGVyIG9yIG5vdCBgY2hhcmFjdGVyYCBjYW4gYmVcbiAqICAgaW5zaWRlIGEgZG91YmxlLXF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGlzRG91YmxlUXVvdGVkQXR0cmlidXRlQ2hhcmFjdGVyKGNoYXJhY3Rlcikge1xuICAgIHJldHVybiBjaGFyYWN0ZXIgIT09IENfRE9VQkxFX1FVT1RFO1xufVxuXG5pc0RvdWJsZVF1b3RlZEF0dHJpYnV0ZUNoYXJhY3Rlci5kZWxpbWl0ZXIgPSBDX0RPVUJMRV9RVU9URTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGBjaGFyYWN0ZXJgIGNhbiBiZSBpbnNpZGUgYSBzaW5nbGUtcXVvdGVkXG4gKiBhdHRyaWJ1dGUgdmFsdWUuXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlbGltaXRlciAtIENsb3NpbmcgZGVsaW1pdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJhY3RlciAtIFNpbmdsZSBjaGFyYWN0ZXIgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFdoZXRoZXIgb3Igbm90IGBjaGFyYWN0ZXJgIGNhbiBiZVxuICogICBpbnNpZGUgYSBzaW5nbGUtcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaXNTaW5nbGVRdW90ZWRBdHRyaWJ1dGVDaGFyYWN0ZXIoY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIGNoYXJhY3RlciAhPT0gQ19TSU5HTEVfUVVPVEU7XG59XG5cbmlzU2luZ2xlUXVvdGVkQXR0cmlidXRlQ2hhcmFjdGVyLmRlbGltaXRlciA9IENfU0lOR0xFX1FVT1RFO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYGNoYXJhY3RlcmAgY2FuIGJlIGluc2lkZSBhbiBlbmNsb3NlZFxuICogVVJJLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWxpbWl0ZXIgLSBDbG9zaW5nIGRlbGltaXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXIgLSBDaGFyYWN0ZXIgdG8gdGVzdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gV2hldGhlciBvciBub3QgYGNoYXJhY3RlcmAgY2FuIGJlXG4gKiAgIGluc2lkZSBhbiBlbmNsb3NlZCBVUkkuXG4gKi9cbmZ1bmN0aW9uIGlzRW5jbG9zZWRVUkxDaGFyYWN0ZXIoY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIGNoYXJhY3RlciAhPT0gQ19HVCAmJlxuICAgICAgICBjaGFyYWN0ZXIgIT09IENfQlJBQ0tFVF9PUEVOICYmXG4gICAgICAgIGNoYXJhY3RlciAhPT0gQ19CUkFDS0VUX0NMT1NFO1xufVxuXG5pc0VuY2xvc2VkVVJMQ2hhcmFjdGVyLmRlbGltaXRlciA9IENfR1Q7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBgY2hhcmFjdGVyYCBjYW4gYmUgaW5zaWRlIGFuIHVuY2xvc2VkXG4gKiBVUkkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJhY3RlciAtIENoYXJhY3RlciB0byB0ZXN0LlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBXaGV0aGVyIG9yIG5vdCBgY2hhcmFjdGVyYCBjYW4gYmVcbiAqICAgaW5zaWRlIGFuIHVuY2xvc2VkIFVSSS5cbiAqL1xuZnVuY3Rpb24gaXNVbmNsb3NlZFVSTENoYXJhY3RlcihjaGFyYWN0ZXIpIHtcbiAgICByZXR1cm4gY2hhcmFjdGVyICE9PSBDX0JSQUNLRVRfT1BFTiAmJlxuICAgICAgICBjaGFyYWN0ZXIgIT09IENfQlJBQ0tFVF9DTE9TRSAmJlxuICAgICAgICAhaXNXaGl0ZVNwYWNlKGNoYXJhY3Rlcik7XG59XG5cbi8qKlxuICogRmFjdG9yeSB0byBjcmVhdGUgYW4gZW50aXR5IGRlY29kZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgLSBDb250ZXh0IHRvIGF0dGFjaCB0bywgZS5nLixcbiAqICAgYSBwYXJzZXIuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gLSBTZWUgYGRlY29kZWAuXG4gKi9cbmZ1bmN0aW9uIGRlY29kZUZhY3RvcnkoY29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZSBgcG9zaXRpb25gIHRvIGFkZCBhbiBgaW5kZW50YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uIC0gUmVmZXJlbmNlXG4gICAgICogQHJldHVybiB7UG9zaXRpb259IC0gQXVnbWVudGVkIHdpdGggYGluZGVudGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplKHBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnc3RhcnQnOiBwb3NpdGlvbixcbiAgICAgICAgICAgICdpbmRlbnQnOiBjb250ZXh0LmdldEluZGVudChwb3NpdGlvbi5saW5lKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBhIHdhcm5pbmcuXG4gICAgICpcbiAgICAgKiBAdGhpcyB7VkZpbGV9IC0gVmlydHVhbCBmaWxlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBSZWFzb24gZm9yIHdhcm5pbmcuXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb24gLSBQbGFjZSBvZiB3YXJuaW5nLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlIC0gQ29kZSBmb3Igd2FybmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVXYXJuaW5nKHJlYXNvbiwgcG9zaXRpb24sIGNvZGUpIHtcbiAgICAgICAgaWYgKGNvZGUgPT09IDMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuZmlsZS53YXJuKHJlYXNvbiwgcG9zaXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlY29kZSBgdmFsdWVgIChhdCBgcG9zaXRpb25gKSBpbnRvIHRleHQtbm9kZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBwYXJzZS5cbiAgICAgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvbiAtIFBvc2l0aW9uIHRvIHN0YXJ0IHBhcnNpbmcgYXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciAtIE5vZGUgaGFuZGxlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWNvZGVyKHZhbHVlLCBwb3NpdGlvbiwgaGFuZGxlcikge1xuICAgICAgICB2YXIgaGFzUG9zaXRpb24gPSBjb250ZXh0Lm9wdGlvbnMucG9zaXRpb247XG5cbiAgICAgICAgZGVjb2RlKHZhbHVlLCB7XG4gICAgICAgICAgICAncG9zaXRpb24nOiBwb3NpdGlvbiAmJiBub3JtYWxpemUocG9zaXRpb24pLFxuICAgICAgICAgICAgJ3dhcm5pbmcnOiBoYXNQb3NpdGlvbiAmJiBoYW5kbGVXYXJuaW5nLFxuICAgICAgICAgICAgJ3RleHQnOiBoYW5kbGVyLFxuICAgICAgICAgICAgJ3JlZmVyZW5jZSc6IGhhbmRsZXIsXG4gICAgICAgICAgICAndGV4dENvbnRleHQnOiBjb250ZXh0LFxuICAgICAgICAgICAgJ3JlZmVyZW5jZUNvbnRleHQnOiBjb250ZXh0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlY29kZSBgdmFsdWVgIChhdCBgcG9zaXRpb25gKSBpbnRvIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gcGFyc2UuXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb24gLSBQb3NpdGlvbiB0byBzdGFydFxuICAgICAqICAgcGFyc2luZyBhdC5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gUGxhaW4tdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWNvZGVSYXcodmFsdWUsIHBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGUodmFsdWUsIHtcbiAgICAgICAgICAgICdwb3NpdGlvbic6IHBvc2l0aW9uICYmIG5vcm1hbGl6ZShwb3NpdGlvbiksXG4gICAgICAgICAgICAnd2FybmluZyc6IGNvbnRleHQub3B0aW9ucy5wb3NpdGlvbiAmJiBoYW5kbGVXYXJuaW5nXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlY29kZXIucmF3ID0gZGVjb2RlUmF3O1xuXG4gICAgcmV0dXJuIGRlY29kZXI7XG59XG5cbi8qKlxuICogRmFjdG9yeSB0byBkZS1lc2NhcGUgYSB2YWx1ZSwgYmFzZWQgb24gYSBsaXN0IGF0IGBrZXlgXG4gKiBpbiBgc2NvcGVgLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBzY29wZSA9IHtlc2NhcGU6IFsnYSddfVxuICogICB2YXIgZGVzY2FwZSA9IGRlc2NhcGVGYWN0b3J5KHNjb3BlLCAnZXNjYXBlJyk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNjb3BlIC0gTGlzdCBvZiBlc2NhcGFibGUgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBLZXkgaW4gYG1hcGAgYXQgd2hpY2ggdGhlIGxpc3RcbiAqICAgZXhpc3RzLlxuICogQHJldHVybiB7ZnVuY3Rpb24oc3RyaW5nKTogc3RyaW5nfSAtIEZ1bmN0aW9uIHdoaWNoXG4gKiAgIHRha2VzIGEgdmFsdWUgYW5kIHJldHVybnMgaXRzIHVuZXNjYXBlZCB2ZXJzaW9uLlxuICovXG5mdW5jdGlvbiBkZXNjYXBlRmFjdG9yeShzY29wZSwga2V5KSB7XG4gICAgLyoqXG4gICAgICogRGUtZXNjYXBlIGEgc3RyaW5nIHVzaW5nIHRoZSBleHByZXNzaW9uIGF0IGBrZXlgXG4gICAgICogaW4gYHNjb3BlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICB2YXIgc2NvcGUgPSB7ZXNjYXBlOiBbJ2EnXX1cbiAgICAgKiAgIHZhciBkZXNjYXBlID0gZGVzY2FwZUZhY3Rvcnkoc2NvcGUsICdlc2NhcGUnKTtcbiAgICAgKiAgIGRlc2NhcGUoJ1xcYSBcXGInKTsgLy8gJ2EgXFxiJ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gRXNjYXBlZCBzdHJpbmcuXG4gICAgICogQHJldHVybiB7c3RyaW5nfSAtIFVuZXNjYXBlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVzY2FwZSh2YWx1ZSkge1xuICAgICAgICB2YXIgcHJldiA9IDA7XG4gICAgICAgIHZhciBpbmRleCA9IHZhbHVlLmluZGV4T2YoQ19CQUNLU0xBU0gpO1xuICAgICAgICB2YXIgZXNjYXBlID0gc2NvcGVba2V5XTtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG4gICAgICAgIHZhciBjaGFyYWN0ZXI7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgcXVldWUucHVzaCh2YWx1ZS5zbGljZShwcmV2LCBpbmRleCkpO1xuICAgICAgICAgICAgcHJldiA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChwcmV2KTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIElmIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGlzIG5vdCBhIHZhbGlkIGVzY2FwZSxcbiAgICAgICAgICAgICAqIGFkZCB0aGUgc2xhc2guXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXIgfHwgZXNjYXBlLmluZGV4T2YoY2hhcmFjdGVyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKENfQkFDS1NMQVNIKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5kZXggPSB2YWx1ZS5pbmRleE9mKENfQkFDS1NMQVNILCBwcmV2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnB1c2godmFsdWUuc2xpY2UocHJldikpO1xuXG4gICAgICAgIHJldHVybiBxdWV1ZS5qb2luKEVNUFRZKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVzY2FwZTtcbn1cblxuLyoqXG4gKiBHZXRzIGluZGVudGF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGxpbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgZ2V0SW5kZW50KCcgIGZvbycpO1xuICogICAvLyB7aW5kZW50OiAyLCBzdG9wczogezE6IDAsIDI6IDF9fVxuICpcbiAqICAgZ2V0SW5kZW50KCdcXHRmb28nKTtcbiAqICAgLy8ge2luZGVudDogNCwgc3RvcHM6IHs0OiAwfX1cbiAqXG4gKiAgIGdldEluZGVudCgnICBcXHRmb28nKTtcbiAqICAgLy8ge2luZGVudDogNCwgc3RvcHM6IHsxOiAwLCAyOiAxLCA0OiAyfX1cbiAqXG4gKiAgIGdldEluZGVudCgnXFx0ICBmb28nKVxuICogICAvLyB7aW5kZW50OiA2LCBzdG9wczogezQ6IDAsIDU6IDEsIDY6IDJ9fVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIEluZGVudGVkIGxpbmUuXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gSW5kZXRhdGlvbiBpbmZvcm1hdGlvbi5cbiAqL1xuZnVuY3Rpb24gZ2V0SW5kZW50KHZhbHVlKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgaW5kZW50ID0gMDtcbiAgICB2YXIgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgICB2YXIgc3RvcHMgPSB7fTtcbiAgICB2YXIgc2l6ZTtcblxuICAgIHdoaWxlIChjaGFyYWN0ZXIgaW4gSU5ERU5UQVRJT05fQ0hBUkFDVEVSUykge1xuICAgICAgICBzaXplID0gSU5ERU5UQVRJT05fQ0hBUkFDVEVSU1tjaGFyYWN0ZXJdO1xuXG4gICAgICAgIGluZGVudCArPSBzaXplO1xuXG4gICAgICAgIGlmIChzaXplID4gMSkge1xuICAgICAgICAgICAgaW5kZW50ID0gTWF0aC5mbG9vcihpbmRlbnQgLyBzaXplKSAqIHNpemU7XG4gICAgICAgIH1cblxuICAgICAgICBzdG9wc1tpbmRlbnRdID0gaW5kZXg7XG5cbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgICdpbmRlbnQnOiBpbmRlbnQsXG4gICAgICAgICdzdG9wcyc6IHN0b3BzXG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG1pbmltdW0gaW5kZW50IGZyb20gZXZlcnkgbGluZSBpbiBgdmFsdWVgLlxuICogU3VwcG9ydHMgYm90aCB0YWIsIHNwYWNlZCwgYW5kIG1peGVkIGluZGVudGF0aW9uIChhc1xuICogd2VsbCBhcyBwb3NzaWJsZSkuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgcmVtb3ZlSW5kZW50YXRpb24oJyAgZm9vJyk7IC8vICdmb28nXG4gKiAgIHJlbW92ZUluZGVudGF0aW9uKCcgICAgZm9vJywgMik7IC8vICcgIGZvbydcbiAqICAgcmVtb3ZlSW5kZW50YXRpb24oJ1xcdGZvbycsIDIpOyAvLyAnICBmb28nXG4gKiAgIHJlbW92ZUluZGVudGF0aW9uKCcgIGZvb1xcbiBiYXInKTsgLy8gJyBmb29cXG4gYmFyJ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIHRyaW0uXG4gKiBAcGFyYW0ge251bWJlcj99IFttYXhpbXVtXSAtIE1heGltdW0gaW5kZW50YXRpb25cbiAqICAgdG8gcmVtb3ZlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIFVuaW5kZW50ZWQgYHZhbHVlYC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlSW5kZW50YXRpb24odmFsdWUsIG1heGltdW0pIHtcbiAgICB2YXIgdmFsdWVzID0gdmFsdWUuc3BsaXQoQ19ORVdMSU5FKTtcbiAgICB2YXIgcG9zaXRpb24gPSB2YWx1ZXMubGVuZ3RoICsgMTtcbiAgICB2YXIgbWluSW5kZW50ID0gSW5maW5pdHk7XG4gICAgdmFyIG1hdHJpeCA9IFtdO1xuICAgIHZhciBpbmRleDtcbiAgICB2YXIgaW5kZW50YXRpb247XG4gICAgdmFyIHN0b3BzO1xuICAgIHZhciBwYWRkaW5nO1xuXG4gICAgdmFsdWVzLnVuc2hpZnQocmVwZWF0KENfU1BBQ0UsIG1heGltdW0pICsgQ19FWENMQU1BVElPTl9NQVJLKTtcblxuICAgIHdoaWxlIChwb3NpdGlvbi0tKSB7XG4gICAgICAgIGluZGVudGF0aW9uID0gZ2V0SW5kZW50KHZhbHVlc1twb3NpdGlvbl0pO1xuXG4gICAgICAgIG1hdHJpeFtwb3NpdGlvbl0gPSBpbmRlbnRhdGlvbi5zdG9wcztcblxuICAgICAgICBpZiAodHJpbSh2YWx1ZXNbcG9zaXRpb25dKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGVudGF0aW9uLmluZGVudCkge1xuICAgICAgICAgICAgaWYgKGluZGVudGF0aW9uLmluZGVudCA+IDAgJiYgaW5kZW50YXRpb24uaW5kZW50IDwgbWluSW5kZW50KSB7XG4gICAgICAgICAgICAgICAgbWluSW5kZW50ID0gaW5kZW50YXRpb24uaW5kZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWluSW5kZW50ID0gSW5maW5pdHk7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pbkluZGVudCAhPT0gSW5maW5pdHkpIHtcbiAgICAgICAgcG9zaXRpb24gPSB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbi0tKSB7XG4gICAgICAgICAgICBzdG9wcyA9IG1hdHJpeFtwb3NpdGlvbl07XG4gICAgICAgICAgICBpbmRleCA9IG1pbkluZGVudDtcblxuICAgICAgICAgICAgd2hpbGUgKGluZGV4ICYmICEoaW5kZXggaW4gc3RvcHMpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRyaW0odmFsdWVzW3Bvc2l0aW9uXSkubGVuZ3RoICE9PSAwICYmXG4gICAgICAgICAgICAgICAgbWluSW5kZW50ICYmXG4gICAgICAgICAgICAgICAgaW5kZXggIT09IG1pbkluZGVudFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcGFkZGluZyA9IENfVEFCO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nID0gRU1QVFk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbHVlc1twb3NpdGlvbl0gPSBwYWRkaW5nICsgdmFsdWVzW3Bvc2l0aW9uXS5zbGljZShcbiAgICAgICAgICAgICAgICBpbmRleCBpbiBzdG9wcyA/IHN0b3BzW2luZGV4XSArIDEgOiAwXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsdWVzLnNoaWZ0KCk7XG5cbiAgICByZXR1cm4gdmFsdWVzLmpvaW4oQ19ORVdMSU5FKTtcbn1cblxuLyoqXG4gKiBUb2tlbmlzZSBhIGxpbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdG9rZW5pemVOZXdsaW5lKGVhdCwgJ1xcblxcbicpO1xuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gZWF0IC0gRWF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSZXN0IG9mIGNvbnRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbc2lsZW50XSAtIFdoZXRoZXIgdGhpcyBpcyBhIGRyeSBydW4uXG4gKiBAcmV0dXJuIHtib29sZWFuP30gLSBgdHJ1ZWAgd2hlbiBtYXRjaGluZy5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVOZXdsaW5lKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICAgIHZhciBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoMCk7XG4gICAgdmFyIGxlbmd0aDtcbiAgICB2YXIgc3VidmFsdWU7XG4gICAgdmFyIHF1ZXVlO1xuICAgIHZhciBpbmRleDtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfTkVXTElORSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gbmV2ZXIgdXNlZCAoeWV0KSAqL1xuICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaW5kZXggPSAxO1xuICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICBzdWJ2YWx1ZSA9IENfTkVXTElORTtcbiAgICBxdWV1ZSA9IEVNUFRZO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19ORVdMSU5FKSB7XG4gICAgICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZTtcbiAgICAgICAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGVhdChzdWJ2YWx1ZSk7XG59XG5cbi8qKlxuICogVG9rZW5pc2UgYW4gaW5kZW50ZWQgY29kZSBibG9jay5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZUNvZGUoZWF0LCAnXFx0Zm9vJyk7XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBlYXQgLSBFYXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlc3Qgb2YgY29udGVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFtzaWxlbnRdIC0gV2hldGhlciB0aGlzIGlzIGEgZHJ5IHJ1bi5cbiAqIEByZXR1cm4ge05vZGU/fGJvb2xlYW59IC0gYGNvZGVgIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplQ29kZShlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgY2hhcmFjdGVyO1xuICAgIHZhciBzdWJ2YWx1ZSA9IEVNUFRZO1xuICAgIHZhciBjb250ZW50ID0gRU1QVFk7XG4gICAgdmFyIHN1YnZhbHVlUXVldWUgPSBFTVBUWTtcbiAgICB2YXIgY29udGVudFF1ZXVlID0gRU1QVFk7XG4gICAgdmFyIGJsYW5rUXVldWU7XG4gICAgdmFyIGluZGVudDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICAgICAgaW5kZW50ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHN1YnZhbHVlICs9IHN1YnZhbHVlUXVldWU7XG4gICAgICAgICAgICBjb250ZW50ICs9IGNvbnRlbnRRdWV1ZTtcbiAgICAgICAgICAgIHN1YnZhbHVlUXVldWUgPSBjb250ZW50UXVldWUgPSBFTVBUWTtcblxuICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19ORVdMSU5FKSB7XG4gICAgICAgICAgICAgICAgc3VidmFsdWVRdWV1ZSA9IGNvbnRlbnRRdWV1ZSA9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gY2hhcmFjdGVyO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoYXJhY3RlciB8fCBjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFF1ZXVlID0gc3VidmFsdWVRdWV1ZSA9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaGFyYWN0ZXIgPT09IENfU1BBQ0UgJiZcbiAgICAgICAgICAgIHZhbHVlLmNoYXJBdChpbmRleCArIDEpID09PSBDX1NQQUNFICYmXG4gICAgICAgICAgICB2YWx1ZS5jaGFyQXQoaW5kZXggKyAyKSA9PT0gQ19TUEFDRSAmJlxuICAgICAgICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMykgPT09IENfU1BBQ0VcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzdWJ2YWx1ZVF1ZXVlICs9IENPREVfSU5ERU5UO1xuICAgICAgICAgICAgaW5kZXggKz0gMztcbiAgICAgICAgICAgIGluZGVudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1RBQikge1xuICAgICAgICAgICAgc3VidmFsdWVRdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRlbnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmxhbmtRdWV1ZSA9IEVNUFRZO1xuXG4gICAgICAgICAgICB3aGlsZSAoY2hhcmFjdGVyID09PSBDX1RBQiB8fCBjaGFyYWN0ZXIgPT09IENfU1BBQ0UpIHtcbiAgICAgICAgICAgICAgICBibGFua1F1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgIT09IENfTkVXTElORSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdWJ2YWx1ZVF1ZXVlICs9IGJsYW5rUXVldWUgKyBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBjb250ZW50UXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWF0KHN1YnZhbHVlKShzZWxmLnJlbmRlckNvZGVCbG9jayhjb250ZW50KSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRva2VuaXNlIGEgZmVuY2VkIGNvZGUgYmxvY2suXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdG9rZW5pemVGZW5jZXMoZWF0LCAnYGBganNcXG5mb28oKVxcbmBgYCcpO1xuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gZWF0IC0gRWF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSZXN0IG9mIGNvbnRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbc2lsZW50XSAtIFdoZXRoZXIgdGhpcyBpcyBhIGRyeSBydW4uXG4gKiBAcmV0dXJuIHtOb2RlP3xib29sZWFufSAtIGBjb2RlYCBub2RlLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUZlbmNlcyhlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNldHRpbmdzID0gc2VsZi5vcHRpb25zO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyAxO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIHN1YnZhbHVlID0gRU1QVFk7XG4gICAgdmFyIGZlbmNlQ291bnQ7XG4gICAgdmFyIG1hcmtlcjtcbiAgICB2YXIgY2hhcmFjdGVyO1xuICAgIHZhciBmbGFnO1xuICAgIHZhciBxdWV1ZTtcbiAgICB2YXIgY29udGVudDtcbiAgICB2YXIgZXhkZW50ZWRDb250ZW50O1xuICAgIHZhciBjbG9zaW5nO1xuICAgIHZhciBleGRlbnRlZENsb3Npbmc7XG4gICAgdmFyIGluZGVudDtcbiAgICB2YXIgbm93O1xuXG4gICAgaWYgKCFzZXR0aW5ncy5nZm0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogRWF0IGluaXRpYWwgc3BhY2luZy5cbiAgICAgKi9cblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgaW5kZW50ID0gaW5kZXg7IC8vIFRPRE86IENIRUNLLlxuXG4gICAgLypcbiAgICAgKiBFYXQgdGhlIGZlbmNlLlxuICAgICAqL1xuXG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfVElMREUgJiYgY2hhcmFjdGVyICE9PSBDX1RJQ0spIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluZGV4Kys7XG4gICAgbWFya2VyID0gY2hhcmFjdGVyO1xuICAgIGZlbmNlQ291bnQgPSAxO1xuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgIT09IG1hcmtlcikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGZlbmNlQ291bnQrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAoZmVuY2VDb3VudCA8IE1JTl9GRU5DRV9DT1VOVCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBFYXQgc3BhY2luZyBiZWZvcmUgZmxhZy5cbiAgICAgKi9cblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBFYXQgZmxhZy5cbiAgICAgKi9cblxuICAgIGZsYWcgPSBxdWV1ZSA9IEVNUFRZO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX05FV0xJTkUgfHxcbiAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQ19USUxERSB8fFxuICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX1RJQ0tcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfU1BBQ0UgfHwgY2hhcmFjdGVyID09PSBDX1RBQikge1xuICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmxhZyArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICAgICAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICYmIGNoYXJhY3RlciAhPT0gQ19ORVdMSU5FKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG5vdyA9IGVhdC5ub3coKTtcbiAgICBub3cuY29sdW1uICs9IHN1YnZhbHVlLmxlbmd0aDtcblxuICAgIHN1YnZhbHVlICs9IGZsYWc7XG4gICAgZmxhZyA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLmRlc2NhcGUoZmxhZyksIG5vdyk7XG5cbiAgICBpZiAocXVldWUpIHtcbiAgICAgICAgc3VidmFsdWUgKz0gcXVldWU7XG4gICAgfVxuXG4gICAgcXVldWUgPSBjbG9zaW5nID0gZXhkZW50ZWRDbG9zaW5nID0gY29udGVudCA9IGV4ZGVudGVkQ29udGVudCA9IEVNUFRZO1xuXG4gICAgLypcbiAgICAgKiBFYXQgY29udGVudC5cbiAgICAgKi9cblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgICAgICBjb250ZW50ICs9IGNsb3Npbmc7XG4gICAgICAgIGV4ZGVudGVkQ29udGVudCArPSBleGRlbnRlZENsb3Npbmc7XG4gICAgICAgIGNsb3NpbmcgPSBleGRlbnRlZENsb3NpbmcgPSBFTVBUWTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX05FV0xJTkUpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgZXhkZW50ZWRDbG9zaW5nICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIEFkZCB0aGUgbmV3bGluZSB0byBgc3VidmFsdWVgIGlmIGl0cyB0aGUgZmlyc3RcbiAgICAgICAgICogY2hhcmFjdGVyLiBPdGhlcndpc2UsIGFkZCBpdCB0byB0aGUgYGNsb3NpbmdgXG4gICAgICAgICAqIHF1ZXVlLlxuICAgICAgICAgKi9cblxuICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsb3NpbmcgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgZXhkZW50ZWRDbG9zaW5nICs9IGNoYXJhY3RlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBjbG9zaW5nICs9IHF1ZXVlO1xuICAgICAgICBleGRlbnRlZENsb3NpbmcgKz0gcXVldWUuc2xpY2UoaW5kZW50KTtcblxuICAgICAgICBpZiAocXVldWUubGVuZ3RoID49IENPREVfSU5ERU5UX0xFTkdUSCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZSA9IEVNUFRZO1xuXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgaWYgKGNoYXJhY3RlciAhPT0gbWFya2VyKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBjbG9zaW5nICs9IHF1ZXVlO1xuICAgICAgICBleGRlbnRlZENsb3NpbmcgKz0gcXVldWU7XG5cbiAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA8IGZlbmNlQ291bnQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgPSBFTVBUWTtcblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbG9zaW5nICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGV4ZGVudGVkQ2xvc2luZyArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjaGFyYWN0ZXIgfHwgY2hhcmFjdGVyID09PSBDX05FV0xJTkUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY29udGVudCArIGNsb3Npbmc7XG5cbiAgICByZXR1cm4gZWF0KHN1YnZhbHVlKShzZWxmLnJlbmRlckNvZGVCbG9jayhleGRlbnRlZENvbnRlbnQsIGZsYWcpKTtcbn1cblxuLyoqXG4gKiBUb2tlbmlzZSBhbiBBVFgtc3R5bGUgaGVhZGluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZUhlYWRpbmcoZWF0LCAnICMgZm9vJyk7XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBlYXQgLSBFYXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlc3Qgb2YgY29udGVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFtzaWxlbnRdIC0gV2hldGhlciB0aGlzIGlzIGEgZHJ5IHJ1bi5cbiAqIEByZXR1cm4ge05vZGU/fGJvb2xlYW59IC0gYGhlYWRpbmdgIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplSGVhZGluZyhlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNldHRpbmdzID0gc2VsZi5vcHRpb25zO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyAxO1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBub3cgPSBlYXQubm93KCk7XG4gICAgdmFyIHN1YnZhbHVlID0gRU1QVFk7XG4gICAgdmFyIGNvbnRlbnQgPSBFTVBUWTtcbiAgICB2YXIgY2hhcmFjdGVyO1xuICAgIHZhciBxdWV1ZTtcbiAgICB2YXIgZGVwdGg7XG5cbiAgICAvKlxuICAgICAqIEVhdCBpbml0aWFsIHNwYWNpbmcuXG4gICAgICovXG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogRWF0IGhhc2hlcy5cbiAgICAgKi9cblxuICAgIGRlcHRoID0gMDtcbiAgICBsZW5ndGggPSBpbmRleCArIE1BWF9BVFhfQ09VTlQgKyAxO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciAhPT0gQ19IQVNIKSB7XG4gICAgICAgICAgICBpbmRleC0tO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGRlcHRoKys7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICAhZGVwdGggfHxcbiAgICAgICAgKCFzZXR0aW5ncy5wZWRhbnRpYyAmJiB2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKSA9PT0gQ19IQVNIKVxuICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoICsgMTtcblxuICAgIC8qXG4gICAgICogRWF0IGludGVybWVkaWF0ZSB3aGl0ZS1zcGFjZS5cbiAgICAgKi9cblxuICAgIHF1ZXVlID0gRU1QVFk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogRXhpdCB3aGVuIG5vdCBpbiBwZWRhbnRpYyBtb2RlIHdpdGhvdXQgc3BhY2luZy5cbiAgICAgKi9cblxuICAgIGlmIChcbiAgICAgICAgIXNldHRpbmdzLnBlZGFudGljICYmXG4gICAgICAgICFxdWV1ZS5sZW5ndGggJiZcbiAgICAgICAgY2hhcmFjdGVyICYmXG4gICAgICAgIGNoYXJhY3RlciAhPT0gQ19ORVdMSU5FXG4gICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogRWF0IGNvbnRlbnQuXG4gICAgICovXG5cbiAgICBzdWJ2YWx1ZSArPSBxdWV1ZTtcbiAgICBxdWV1ZSA9IGNvbnRlbnQgPSBFTVBUWTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKCFjaGFyYWN0ZXIgfHwgY2hhcmFjdGVyID09PSBDX05FV0xJTkUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmXG4gICAgICAgICAgICBjaGFyYWN0ZXIgIT09IENfVEFCICYmXG4gICAgICAgICAgICBjaGFyYWN0ZXIgIT09IENfSEFTSFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnRlbnQgKz0gcXVldWUgKyBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBxdWV1ZSA9IEVNUFRZO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoY2hhcmFjdGVyID09PSBDX1NQQUNFIHx8IGNoYXJhY3RlciA9PT0gQ19UQUIpIHtcbiAgICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChjaGFyYWN0ZXIgPT09IENfSEFTSCkge1xuICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGNoYXJhY3RlciA9PT0gQ19TUEFDRSB8fCBjaGFyYWN0ZXIgPT09IENfVEFCKSB7XG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleC0tO1xuICAgIH1cblxuICAgIG5vdy5jb2x1bW4gKz0gc3VidmFsdWUubGVuZ3RoO1xuICAgIHN1YnZhbHVlICs9IGNvbnRlbnQgKyBxdWV1ZTtcblxuICAgIHJldHVybiBlYXQoc3VidmFsdWUpKHNlbGYucmVuZGVySGVhZGluZyhjb250ZW50LCBkZXB0aCwgbm93KSk7XG59XG5cbi8qKlxuICogVG9rZW5pc2UgYSBTZXRleHQtc3R5bGUgaGVhZGluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZUxpbmVIZWFkaW5nKGVhdCwgJ2Zvb1xcbj09PScpO1xuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gZWF0IC0gRWF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSZXN0IG9mIGNvbnRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbc2lsZW50XSAtIFdoZXRoZXIgdGhpcyBpcyBhIGRyeSBydW4uXG4gKiBAcmV0dXJuIHtOb2RlP3xib29sZWFufSAtIGBoZWFkaW5nYCBub2RlLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUxpbmVIZWFkaW5nKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbm93ID0gZWF0Lm5vdygpO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIHN1YnZhbHVlID0gRU1QVFk7XG4gICAgdmFyIGNvbnRlbnQ7XG4gICAgdmFyIHF1ZXVlO1xuICAgIHZhciBjaGFyYWN0ZXI7XG4gICAgdmFyIG1hcmtlcjtcbiAgICB2YXIgZGVwdGg7XG5cbiAgICAvKlxuICAgICAqIEVhdCBpbml0aWFsIGluZGVudGF0aW9uLlxuICAgICAqL1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFIHx8IGluZGV4ID49IE1BWF9MSU5FX0hFQURJTkdfSU5ERU5UKSB7XG4gICAgICAgICAgICBpbmRleC0tO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBFYXQgY29udGVudC5cbiAgICAgKi9cblxuICAgIGNvbnRlbnQgPSBxdWV1ZSA9IEVNUFRZO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX05FV0xJTkUpIHtcbiAgICAgICAgICAgIGluZGV4LS07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfU1BBQ0UgfHwgY2hhcmFjdGVyID09PSBDX1RBQikge1xuICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudCArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICAgICAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBub3cuY29sdW1uICs9IHN1YnZhbHVlLmxlbmd0aDtcbiAgICBzdWJ2YWx1ZSArPSBjb250ZW50ICsgcXVldWU7XG5cbiAgICAvKlxuICAgICAqIEVuc3VyZSB0aGUgY29udGVudCBpcyBmb2xsb3dlZCBieSBhIG5ld2xpbmUgYW5kIGFcbiAgICAgKiB2YWxpZCBtYXJrZXIuXG4gICAgICovXG5cbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gICAgbWFya2VyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuXG4gICAgaWYgKFxuICAgICAgICBjaGFyYWN0ZXIgIT09IENfTkVXTElORSB8fFxuICAgICAgICAhU0VURVhUX01BUktFUlNbbWFya2VyXVxuICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNpbGVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG5cbiAgICAvKlxuICAgICAqIEVhdCBTZXRleHQtbGluZS5cbiAgICAgKi9cblxuICAgIHF1ZXVlID0gbWFya2VyO1xuICAgIGRlcHRoID0gU0VURVhUX01BUktFUlNbbWFya2VyXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciAhPT0gbWFya2VyKSB7XG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX05FV0xJTkUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4LS07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZWF0KHN1YnZhbHVlICsgcXVldWUpKHNlbGYucmVuZGVySGVhZGluZyhjb250ZW50LCBkZXB0aCwgbm93KSk7XG59XG5cbi8qKlxuICogVG9rZW5pc2UgYSBob3Jpem9udGFsIHJ1bGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdG9rZW5pemVIb3Jpem9udGFsUnVsZShlYXQsICcqKionKTtcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyl9IGVhdCAtIEVhdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gUmVzdCBvZiBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFuP30gW3NpbGVudF0gLSBXaGV0aGVyIHRoaXMgaXMgYSBkcnkgcnVuLlxuICogQHJldHVybiB7Tm9kZT98Ym9vbGVhbn0gLSBgaG9yaXpvbnRhbFJ1bGVgIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplSG9yaXpvbnRhbFJ1bGUoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyAxO1xuICAgIHZhciBzdWJ2YWx1ZSA9IEVNUFRZO1xuICAgIHZhciBjaGFyYWN0ZXI7XG4gICAgdmFyIG1hcmtlcjtcbiAgICB2YXIgbWFya2VyQ291bnQ7XG4gICAgdmFyIHF1ZXVlO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1RBQiAmJiBjaGFyYWN0ZXIgIT09IENfU1BBQ0UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIH1cblxuICAgIGlmIChSVUxFX01BUktFUlNbY2hhcmFjdGVyXSAhPT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWFya2VyID0gY2hhcmFjdGVyO1xuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICBtYXJrZXJDb3VudCA9IDE7XG4gICAgcXVldWUgPSBFTVBUWTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gbWFya2VyKSB7XG4gICAgICAgICAgICBtYXJrZXJDb3VudCsrO1xuICAgICAgICAgICAgc3VidmFsdWUgKz0gcXVldWUgKyBtYXJrZXI7XG4gICAgICAgICAgICBxdWV1ZSA9IEVNUFRZO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19TUEFDRSkge1xuICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgbWFya2VyQ291bnQgPj0gSE9SSVpPTlRBTF9SVUxFX01BUktFUl9DT1VOVCAmJlxuICAgICAgICAgICAgKCFjaGFyYWN0ZXIgfHwgY2hhcmFjdGVyID09PSBDX05FV0xJTkUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgc3VidmFsdWUgKz0gcXVldWU7XG5cbiAgICAgICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoc2VsZi5yZW5kZXJWb2lkKFRfSE9SSVpPTlRBTF9SVUxFKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogVG9rZW5pc2UgYSBibG9ja3F1b3RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHRva2VuaXplQmxvY2txdW90ZShlYXQsICc+IEZvbycpO1xuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gZWF0IC0gRWF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSZXN0IG9mIGNvbnRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbc2lsZW50XSAtIFdoZXRoZXIgdGhpcyBpcyBhIGRyeSBydW4uXG4gKiBAcmV0dXJuIHtOb2RlP3xib29sZWFufSAtIGBibG9ja3F1b3RlYCBub2RlLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUJsb2NrcXVvdGUoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjb21tb25tYXJrID0gc2VsZi5vcHRpb25zLmNvbW1vbm1hcms7XG4gICAgdmFyIG5vdyA9IGVhdC5ub3coKTtcbiAgICB2YXIgaW5kZW50ID0gc2VsZi5pbmRlbnQobm93LmxpbmUpO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhciBjb250ZW50cyA9IFtdO1xuICAgIHZhciBpbmRlbnRzID0gW107XG4gICAgdmFyIGFkZDtcbiAgICB2YXIgdG9rZW5pemVycztcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBjaGFyYWN0ZXI7XG4gICAgdmFyIHJlc3Q7XG4gICAgdmFyIG5leHRJbmRleDtcbiAgICB2YXIgY29udGVudDtcbiAgICB2YXIgbGluZTtcbiAgICB2YXIgc3RhcnRJbmRleDtcbiAgICB2YXIgcHJlZml4ZWQ7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmIGNoYXJhY3RlciAhPT0gQ19UQUIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuY2hhckF0KGluZGV4KSAhPT0gQ19HVCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNpbGVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0b2tlbml6ZXJzID0gc2VsZi5ibG9ja1Rva2VuaXplcnM7XG4gICAgaW5kZXggPSAwO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIG5leHRJbmRleCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FLCBpbmRleCk7XG4gICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleDtcbiAgICAgICAgcHJlZml4ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAobmV4dEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gbGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmIGNoYXJhY3RlciAhPT0gQ19UQUIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBDX0dUKSB7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgcHJlZml4ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUuY2hhckF0KGluZGV4KSA9PT0gQ19TUEFDRSkge1xuICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZW50ID0gdmFsdWUuc2xpY2UoaW5kZXgsIG5leHRJbmRleCk7XG5cbiAgICAgICAgaWYgKCFwcmVmaXhlZCAmJiAhdHJpbShjb250ZW50KSkge1xuICAgICAgICAgICAgaW5kZXggPSBzdGFydEluZGV4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByZWZpeGVkKSB7XG4gICAgICAgICAgICByZXN0ID0gdmFsdWUuc2xpY2UoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29tbW9ubWFyayAmJlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5pemVycy5jb2RlLmNhbGwoc2VsZiwgZWF0LCByZXN0LCB0cnVlKSB8fFxuICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXJzLmZlbmNlcy5jYWxsKHNlbGYsIGVhdCwgcmVzdCwgdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5pemVycy5oZWFkaW5nLmNhbGwoc2VsZiwgZWF0LCByZXN0LCB0cnVlKSB8fFxuICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXJzLmxpbmVIZWFkaW5nLmNhbGwoc2VsZiwgZWF0LCByZXN0LCB0cnVlKSB8fFxuICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXJzLmhvcml6b250YWxSdWxlLmNhbGwoc2VsZiwgZWF0LCByZXN0LCB0cnVlKSB8fFxuICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXJzLmh0bWwuY2FsbChzZWxmLCBlYXQsIHJlc3QsIHRydWUpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRva2VuaXplcnMubGlzdC5jYWxsKHNlbGYsIGVhdCwgcmVzdCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFjb21tb25tYXJrICYmXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXJzLmRlZmluaXRpb24uY2FsbChzZWxmLCBlYXQsIHJlc3QsIHRydWUpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRva2VuaXplcnMuZm9vdG5vdGVEZWZpbml0aW9uLmNhbGwoc2VsZiwgZWF0LCByZXN0LCB0cnVlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGluZSA9IHN0YXJ0SW5kZXggPT09IGluZGV4ID9cbiAgICAgICAgICAgIGNvbnRlbnQgOlxuICAgICAgICAgICAgdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCwgbmV4dEluZGV4KTtcblxuICAgICAgICBpbmRlbnRzLnB1c2goaW5kZXggLSBzdGFydEluZGV4KTtcbiAgICAgICAgdmFsdWVzLnB1c2gobGluZSk7XG4gICAgICAgIGNvbnRlbnRzLnB1c2goY29udGVudCk7XG5cbiAgICAgICAgaW5kZXggPSBuZXh0SW5kZXggKyAxO1xuICAgIH1cblxuICAgIGluZGV4ID0gLTE7XG4gICAgbGVuZ3RoID0gaW5kZW50cy5sZW5ndGg7XG4gICAgYWRkID0gZWF0KHZhbHVlcy5qb2luKENfTkVXTElORSkpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgaW5kZW50KGluZGVudHNbaW5kZXhdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkKHNlbGYucmVuZGVyQmxvY2txdW90ZShjb250ZW50cy5qb2luKENfTkVXTElORSksIG5vdykpO1xufVxuXG4vKipcbiAqIFRva2VuaXNlIGEgbGlzdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZUxpc3QoZWF0LCAnLSBGb28nKTtcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyl9IGVhdCAtIEVhdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gUmVzdCBvZiBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFuP30gW3NpbGVudF0gLSBXaGV0aGVyIHRoaXMgaXMgYSBkcnkgcnVuLlxuICogQHJldHVybiB7Tm9kZT98Ym9vbGVhbn0gLSBgbGlzdGAgbm9kZS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVMaXN0KGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY29tbW9ubWFyayA9IHNlbGYub3B0aW9ucy5jb21tb25tYXJrO1xuICAgIHZhciBwZWRhbnRpYyA9IHNlbGYub3B0aW9ucy5wZWRhbnRpYztcbiAgICB2YXIgdG9rZW5pemVycyA9IHNlbGYuYmxvY2tUb2tlbml6ZXJzO1xuICAgIHZhciBtYXJrZXJzO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgc3RhcnQgPSBudWxsO1xuICAgIHZhciBxdWV1ZTtcbiAgICB2YXIgb3JkZXJlZDtcbiAgICB2YXIgY2hhcmFjdGVyO1xuICAgIHZhciBtYXJrZXI7XG4gICAgdmFyIG5leHRJbmRleDtcbiAgICB2YXIgc3RhcnRJbmRleDtcbiAgICB2YXIgcHJlZml4ZWQ7XG4gICAgdmFyIGN1cnJlbnRNYXJrZXI7XG4gICAgdmFyIGNvbnRlbnQ7XG4gICAgdmFyIGxpbmU7XG4gICAgdmFyIHByZXZFbXB0eTtcbiAgICB2YXIgZW1wdHk7XG4gICAgdmFyIGl0ZW1zO1xuICAgIHZhciBhbGxMaW5lcztcbiAgICB2YXIgZW1wdHlMaW5lcztcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgZW50ZXJUb3A7XG4gICAgdmFyIGV4aXRCbG9ja3F1b3RlO1xuICAgIHZhciBpc0xvb3NlO1xuICAgIHZhciBub2RlO1xuICAgIHZhciBub3c7XG4gICAgdmFyIGVuZDtcbiAgICB2YXIgaW5kZW50ZWQ7XG4gICAgdmFyIHNpemU7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmIGNoYXJhY3RlciAhPT0gQ19UQUIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgbWFya2VycyA9IGNvbW1vbm1hcmsgP1xuICAgICAgICBMSVNUX09SREVSRURfQ09NTU9OTUFSS19NQVJLRVJTIDpcbiAgICAgICAgTElTVF9PUkRFUkVEX01BUktFUlM7XG5cbiAgICBpZiAoTElTVF9VTk9SREVSRURfTUFSS0VSU1tjaGFyYWN0ZXJdID09PSB0cnVlKSB7XG4gICAgICAgIG1hcmtlciA9IGNoYXJhY3RlcjtcbiAgICAgICAgb3JkZXJlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9yZGVyZWQgPSB0cnVlO1xuICAgICAgICBxdWV1ZSA9IEVNUFRZO1xuXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgaWYgKCFpc051bWVyaWMoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoIXF1ZXVlIHx8IG1hcmtlcnNbY2hhcmFjdGVyXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBwYXJzZUludChxdWV1ZSwgMTApO1xuICAgICAgICBtYXJrZXIgPSBjaGFyYWN0ZXI7XG4gICAgfVxuXG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciAhPT0gQ19TUEFDRSAmJiBjaGFyYWN0ZXIgIT09IENfVEFCKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGluZGV4ID0gMDtcbiAgICBpdGVtcyA9IFtdO1xuICAgIGFsbExpbmVzID0gW107XG4gICAgZW1wdHlMaW5lcyA9IFtdO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIG5leHRJbmRleCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FLCBpbmRleCk7XG4gICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleDtcbiAgICAgICAgcHJlZml4ZWQgPSBmYWxzZTtcbiAgICAgICAgaW5kZW50ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAobmV4dEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gbGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5kID0gaW5kZXggKyBUQUJfU0laRTtcbiAgICAgICAgc2l6ZSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX1RBQikge1xuICAgICAgICAgICAgICAgIHNpemUgKz0gVEFCX1NJWkUgLSBzaXplICUgVEFCX1NJWkU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19TUEFDRSkge1xuICAgICAgICAgICAgICAgIHNpemUrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2l6ZSA+PSBUQUJfU0laRSkge1xuICAgICAgICAgICAgaW5kZW50ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0gJiYgc2l6ZSA+PSBpdGVtLmluZGVudCkge1xuICAgICAgICAgICAgaW5kZW50ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgICAgICAgY3VycmVudE1hcmtlciA9IG51bGw7XG5cbiAgICAgICAgaWYgKCFpbmRlbnRlZCkge1xuICAgICAgICAgICAgaWYgKExJU1RfVU5PUkRFUkVEX01BUktFUlNbY2hhcmFjdGVyXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRNYXJrZXIgPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXVlID0gRU1QVFk7XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTnVtZXJpYyhjaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICBpZiAocXVldWUgJiYgbWFya2Vyc1tjaGFyYWN0ZXJdID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNYXJrZXIgPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgICAgIHNpemUgKz0gcXVldWUubGVuZ3RoICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50TWFya2VyKSB7XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfVEFCKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpemUgKz0gVEFCX1NJWkUgLSBzaXplICUgVEFCX1NJWkU7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfU1BBQ0UpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gaW5kZXggKyBUQUJfU0laRTtcblxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpICE9PSBDX1NQQUNFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGVuZCAmJiB2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBDX1NQQUNFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCAtPSBUQUJfU0laRSAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplIC09IFRBQl9TSVpFIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gQ19ORVdMSU5FICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gRU1QVFlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE1hcmtlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnRNYXJrZXIpIHtcbiAgICAgICAgICAgIGlmIChjb21tb25tYXJrICYmIG1hcmtlciAhPT0gY3VycmVudE1hcmtlcikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcmVmaXhlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWNvbW1vbm1hcmsgJiZcbiAgICAgICAgICAgICAgICAhaW5kZW50ZWQgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZS5jaGFyQXQoc3RhcnRJbmRleCkgPT09IENfU1BBQ0VcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgY29tbW9ubWFyayAmJlxuICAgICAgICAgICAgICAgIGl0ZW1cbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGluZGVudGVkID0gc2l6ZSA+PSBpdGVtLmluZGVudCB8fCBzaXplID4gVEFCX1NJWkU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZWZpeGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBsaW5lID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCwgbmV4dEluZGV4KTtcbiAgICAgICAgY29udGVudCA9IHN0YXJ0SW5kZXggPT09IGluZGV4ID8gbGluZSA6IHZhbHVlLnNsaWNlKGluZGV4LCBuZXh0SW5kZXgpO1xuXG4gICAgICAgIGlmIChjdXJyZW50TWFya2VyICYmIFJVTEVfTUFSS0VSU1tjdXJyZW50TWFya2VyXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRva2VuaXplcnMuaG9yaXpvbnRhbFJ1bGUuY2FsbChzZWxmLCBlYXQsIGxpbmUsIHRydWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZFbXB0eSA9IGVtcHR5O1xuICAgICAgICBlbXB0eSA9ICF0cmltKGNvbnRlbnQpLmxlbmd0aDtcblxuICAgICAgICBpZiAoaW5kZW50ZWQgJiYgaXRlbSkge1xuICAgICAgICAgICAgaXRlbS52YWx1ZSA9IGl0ZW0udmFsdWUuY29uY2F0KGVtcHR5TGluZXMsIGxpbmUpO1xuICAgICAgICAgICAgYWxsTGluZXMgPSBhbGxMaW5lcy5jb25jYXQoZW1wdHlMaW5lcywgbGluZSk7XG4gICAgICAgICAgICBlbXB0eUxpbmVzID0gW107XG4gICAgICAgIH0gZWxzZSBpZiAocHJlZml4ZWQpIHtcbiAgICAgICAgICAgIGlmIChlbXB0eUxpbmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUucHVzaChFTVBUWSk7XG4gICAgICAgICAgICAgICAgaXRlbS50cmFpbCA9IGVtcHR5TGluZXMuY29uY2F0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgLy8gJ2J1bGxldCc6IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXgsIGluZGV4KSxcbiAgICAgICAgICAgICAgICAndmFsdWUnOiBbbGluZV0sXG4gICAgICAgICAgICAgICAgJ2luZGVudCc6IHNpemUsXG4gICAgICAgICAgICAgICAgJ3RyYWlsJzogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICBhbGxMaW5lcyA9IGFsbExpbmVzLmNvbmNhdChlbXB0eUxpbmVzLCBsaW5lKTtcbiAgICAgICAgICAgIGVtcHR5TGluZXMgPSBbXTtcbiAgICAgICAgfSBlbHNlIGlmIChlbXB0eSkge1xuICAgICAgICAgICAgLy8gVE9ETzogZGlzYWJsZSB3aGVuIGluIHBlZGFudGljLW1vZGUuXG4gICAgICAgICAgICBpZiAocHJldkVtcHR5KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVtcHR5TGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwcmV2RW1wdHkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFwZWRhbnRpYyAmJlxuICAgICAgICAgICAgICAgIHRva2VuaXplcnMuaG9yaXpvbnRhbFJ1bGUuY2FsbChzZWxmLCBlYXQsIGxpbmUsIHRydWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFjb21tb25tYXJrKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXJzLmRlZmluaXRpb24uY2FsbChzZWxmLCBlYXQsIGxpbmUsIHRydWUpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRva2VuaXplcnMuZm9vdG5vdGVEZWZpbml0aW9uLmNhbGwoc2VsZiwgZWF0LCBsaW5lLCB0cnVlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSBpdGVtLnZhbHVlLmNvbmNhdChlbXB0eUxpbmVzLCBsaW5lKTtcbiAgICAgICAgICAgIGFsbExpbmVzID0gYWxsTGluZXMuY29uY2F0KGVtcHR5TGluZXMsIGxpbmUpO1xuICAgICAgICAgICAgZW1wdHlMaW5lcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSBuZXh0SW5kZXggKyAxO1xuICAgIH1cblxuICAgIG5vZGUgPSBlYXQoYWxsTGluZXMuam9pbihDX05FV0xJTkUpKS5yZXNldCh7XG4gICAgICAgICd0eXBlJzogVF9MSVNULFxuICAgICAgICAnb3JkZXJlZCc6IG9yZGVyZWQsXG4gICAgICAgICdzdGFydCc6IHN0YXJ0LFxuICAgICAgICAnbG9vc2UnOiBudWxsLFxuICAgICAgICAnY2hpbGRyZW4nOiBbXVxuICAgIH0pO1xuXG4gICAgZW50ZXJUb3AgPSBzZWxmLmV4aXRUb3AoKTtcbiAgICBleGl0QmxvY2txdW90ZSA9IHNlbGYuZW50ZXJCbG9ja3F1b3RlKCk7XG4gICAgaXNMb29zZSA9IGZhbHNlO1xuICAgIGluZGV4ID0gLTE7XG4gICAgbGVuZ3RoID0gaXRlbXMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgaXRlbSA9IGl0ZW1zW2luZGV4XS52YWx1ZS5qb2luKENfTkVXTElORSk7XG4gICAgICAgIG5vdyA9IGVhdC5ub3coKTtcblxuICAgICAgICBpdGVtID0gZWF0KGl0ZW0pKHNlbGYucmVuZGVyTGlzdEl0ZW0oaXRlbSwgbm93KSwgbm9kZSk7XG5cbiAgICAgICAgaWYgKGl0ZW0ubG9vc2UpIHtcbiAgICAgICAgICAgIGlzTG9vc2UgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbSA9IGl0ZW1zW2luZGV4XS50cmFpbC5qb2luKENfTkVXTElORSk7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSBsZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBpdGVtICs9IENfTkVXTElORTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVhdChpdGVtKTtcbiAgICB9XG5cbiAgICBlbnRlclRvcCgpO1xuICAgIGV4aXRCbG9ja3F1b3RlKCk7XG5cbiAgICBub2RlLmxvb3NlID0gaXNMb29zZTtcblxuICAgIHJldHVybiBub2RlO1xufVxuXG4vKipcbiAqIFRyeSB0byBtYXRjaCBjb21tZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIHBhcnNlLlxuICogQHBhcmFtIHtPYmplY3R9IHNldHRpbmdzIC0gQ29uZmlndXJhdGlvbiBhcyBhdmFpbGFibGUgb25cbiAqICAgYSBwYXJzZXIuXG4gKiBAcmV0dXJuIHtzdHJpbmc/fSAtIFdoZW4gYXBwbGljYWJsZSwgdGhlIGNvbW1lbnQgYXQgdGhlXG4gKiAgIHN0YXJ0IG9mIGB2YWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGVhdEhUTUxDb21tZW50KHZhbHVlLCBzZXR0aW5ncykge1xuICAgIHZhciBpbmRleCA9IENPTU1FTlRfU1RBUlRfTEVOR1RIO1xuICAgIHZhciBxdWV1ZSA9IENPTU1FTlRfU1RBUlQ7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgY29tbW9ubWFyayA9IHNldHRpbmdzLmNvbW1vbm1hcms7XG4gICAgdmFyIGNoYXJhY3RlcjtcbiAgICB2YXIgaGFzTm9uRGFzaDtcblxuICAgIGlmICh2YWx1ZS5zbGljZSgwLCBpbmRleCkgPT09IHF1ZXVlKSB7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQ09NTUVOVF9FTkRfQ0hBUiAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKGluZGV4LCBpbmRleCArIENPTU1FTlRfRU5EX0xFTkdUSCkgPT09IENPTU1FTlRfRU5EXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcXVldWUgKyBDT01NRU5UX0VORDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbW1vbm1hcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX0dUICYmICFoYXNOb25EYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX0RBU0gpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCArIDEpID09PSBDX0RBU0gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc05vbkRhc2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBUcnkgdG8gbWF0Y2ggQ0RBVEEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gcGFyc2UuXG4gKiBAcmV0dXJuIHtzdHJpbmc/fSAtIFdoZW4gYXBwbGljYWJsZSwgdGhlIENEQVRBIGF0IHRoZVxuICogICBzdGFydCBvZiBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBlYXRIVE1MQ0RBVEEodmFsdWUpIHtcbiAgICB2YXIgaW5kZXggPSBDREFUQV9TVEFSVF9MRU5HVEg7XG4gICAgdmFyIHF1ZXVlID0gdmFsdWUuc2xpY2UoMCwgaW5kZXgpO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgdmFyIGNoYXJhY3RlcjtcblxuICAgIGlmIChxdWV1ZS50b1VwcGVyQ2FzZSgpID09PSBDREFUQV9TVEFSVCkge1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPT09IENEQVRBX0VORF9DSEFSICYmXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoaW5kZXgsIGluZGV4ICsgQ0RBVEFfRU5EX0xFTkdUSCkgPT09IENEQVRBX0VORFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXVlICsgQ0RBVEFfRU5EO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIFRyeSB0byBtYXRjaCBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gcGFyc2UuXG4gKiBAcmV0dXJuIHtzdHJpbmc/fSAtIFdoZW4gYXBwbGljYWJsZSwgdGhlIHByb2Nlc3NpbmdcbiAqICAgaW5zdHJ1Y3Rpb24gYXQgdGhlIHN0YXJ0IG9mIGB2YWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGVhdEhUTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odmFsdWUpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBxdWV1ZSA9IEVNUFRZO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgdmFyIGNoYXJhY3RlcjtcblxuICAgIGlmIChcbiAgICAgICAgdmFsdWUuY2hhckF0KGluZGV4KSA9PT0gQ19MVCAmJlxuICAgICAgICB2YWx1ZS5jaGFyQXQoKytpbmRleCkgPT09IENfUVVFU1RJT05fTUFSS1xuICAgICkge1xuICAgICAgICBxdWV1ZSA9IENfTFQgKyBDX1FVRVNUSU9OX01BUks7XG4gICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX1FVRVNUSU9OX01BUksgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKSA9PT0gQ19HVFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXVlICsgY2hhcmFjdGVyICsgQ19HVDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBUcnkgdG8gbWF0Y2ggYSBkZWNsYXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBwYXJzZS5cbiAqIEByZXR1cm4ge3N0cmluZz99IC0gV2hlbiBhcHBsaWNhYmxlLCB0aGUgZGVjbGFyYXRpb24gYXRcbiAqICAgdGhlIHN0YXJ0IG9mIGB2YWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGVhdEhUTUxEZWNsYXJhdGlvbih2YWx1ZSkge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgcXVldWUgPSBFTVBUWTtcbiAgICB2YXIgc3VicXVldWUgPSBFTVBUWTtcbiAgICB2YXIgY2hhcmFjdGVyO1xuXG4gICAgaWYgKFxuICAgICAgICB2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBDX0xUICYmXG4gICAgICAgIHZhbHVlLmNoYXJBdCgrK2luZGV4KSA9PT0gQ19FWENMQU1BVElPTl9NQVJLXG4gICAgKSB7XG4gICAgICAgIHF1ZXVlID0gQ19MVCArIENfRVhDTEFNQVRJT05fTUFSSztcbiAgICAgICAgaW5kZXgrKztcblxuICAgICAgICAvKlxuICAgICAgICAgKiBFYXQgYXMgbWFueSBhbHBoYWJldGljIGNoYXJhY3RlcnMgYXNcbiAgICAgICAgICogcG9zc2libGUuXG4gICAgICAgICAqL1xuXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgaWYgKCFpc0FscGhhYmV0aWMoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoIXN1YnF1ZXVlIHx8ICFpc1doaXRlU3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gc3VicXVldWUgKyBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX0dUKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIFRyeSB0byBtYXRjaCBhIGNsb3NpbmcgdGFnLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIHBhcnNlLlxuICogQHBhcmFtIHtib29sZWFuP30gW2lzQmxvY2tdIC0gV2hldGhlciB0aGUgdGFnLW5hbWVcbiAqICAgbXVzdCBiZSBhIGtub3duIGJsb2NrLWxldmVsIG5vZGUgdG8gbWF0Y2guXG4gKiBAcmV0dXJuIHtzdHJpbmc/fSAtIFdoZW4gYXBwbGljYWJsZSwgdGhlIGNsb3NpbmcgdGFnIGF0XG4gKiAgIHRoZSBzdGFydCBvZiBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBlYXRIVE1MQ2xvc2luZ1RhZyh2YWx1ZSwgaXNCbG9jaykge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgcXVldWUgPSBFTVBUWTtcbiAgICB2YXIgc3VicXVldWUgPSBFTVBUWTtcbiAgICB2YXIgY2hhcmFjdGVyO1xuXG4gICAgaWYgKFxuICAgICAgICB2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBDX0xUICYmXG4gICAgICAgIHZhbHVlLmNoYXJBdCgrK2luZGV4KSA9PT0gQ19TTEFTSFxuICAgICkge1xuICAgICAgICBxdWV1ZSA9IENfTFQgKyBDX1NMQVNIO1xuICAgICAgICBzdWJxdWV1ZSA9IGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcblxuICAgICAgICBpZiAoIWlzQWxwaGFiZXRpYyhjaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIEVhdCBhcyBtYW55IGFscGhhYmV0aWMgY2hhcmFjdGVycyBhc1xuICAgICAgICAgKiBwb3NzaWJsZS5cbiAgICAgICAgICovXG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoIWlzQWxwaGFiZXRpYyhjaGFyYWN0ZXIpICYmICFpc051bWVyaWMoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQmxvY2sgJiYgYmxvY2tFbGVtZW50cy5pbmRleE9mKHN1YnF1ZXVlLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gc3VicXVldWU7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogRWF0IHdoaXRlLXNwYWNlLlxuICAgICAgICAgKi9cblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBDX0dUKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUgKyBDX0dUO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIFRyeSB0byBtYXRjaCBhbiBvcGVuaW5nIHRhZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBwYXJzZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFtpc0Jsb2NrXSAtIFdoZXRoZXIgdGhlIHRhZy1uYW1lXG4gKiAgIG11c3QgYmUgYSBrbm93biBibG9jay1sZXZlbCBub2RlIHRvIG1hdGNoLlxuICogQHJldHVybiB7c3RyaW5nP30gLSBXaGVuIGFwcGxpY2FibGUsIHRoZSBvcGVuaW5nIHRhZyBhdFxuICogICB0aGUgc3RhcnQgb2YgYHZhbHVlYC5cbiAqL1xuZnVuY3Rpb24gZWF0SFRNTE9wZW5pbmdUYWcodmFsdWUsIGlzQmxvY2spIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgdmFyIHF1ZXVlID0gRU1QVFk7XG4gICAgdmFyIHN1YnF1ZXVlID0gRU1QVFk7XG4gICAgdmFyIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG4gICAgdmFyIGhhc0VxdWFscztcbiAgICB2YXIgdGVzdDtcblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IENfTFQpIHtcbiAgICAgICAgcXVldWUgPSBjaGFyYWN0ZXI7XG4gICAgICAgIHN1YnF1ZXVlID0gY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuXG4gICAgICAgIGlmICghaXNBbHBoYWJldGljKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogRWF0IGFzIG1hbnkgYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGFzXG4gICAgICAgICAqIHBvc3NpYmxlLlxuICAgICAgICAgKi9cblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgIGlmICghaXNBbHBoYWJldGljKGNoYXJhY3RlcikgJiYgIWlzTnVtZXJpYyhjaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1YnF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNCbG9jayAmJiBibG9ja0VsZW1lbnRzLmluZGV4T2Yoc3VicXVldWUudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZSArPSBzdWJxdWV1ZTtcbiAgICAgICAgc3VicXVldWUgPSBFTVBUWTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBGaW5kIGF0dHJpYnV0ZXMuXG4gICAgICAgICAqL1xuXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIEVhdCB3aGl0ZS1zcGFjZS5cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzdWJxdWV1ZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogRWF0IGFuIGF0dHJpYnV0ZSBuYW1lLlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIHF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgICAgICAgICAgc3VicXVldWUgPSBFTVBUWTtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpc0FscGhhYmV0aWMoY2hhcmFjdGVyKSB8fFxuICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQ19VTkRFUlNDT1JFIHx8XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX0NPTE9OXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzdWJxdWV1ZSA9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgIWlzQWxwaGFiZXRpYyhjaGFyYWN0ZXIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhaXNOdW1lcmljKGNoYXJhY3RlcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gQ19VTkRFUlNDT1JFICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgIT09IENfQ09MT04gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gQ19ET1QgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gQ19EQVNIXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXN1YnF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgICAgICAgICAgc3VicXVldWUgPSBFTVBUWTtcbiAgICAgICAgICAgIGhhc0VxdWFscyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogRWF0IHplcm8gb3IgbW9yZSB3aGl0ZS1zcGFjZSBhbmQgb25lXG4gICAgICAgICAgICAgKiBlcXVhbHMgc2lnbi5cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0VxdWFscyAmJiBjaGFyYWN0ZXIgPT09IENfRVFVQUxTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFcXVhbHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcXVldWUgKz0gc3VicXVldWU7XG4gICAgICAgICAgICBzdWJxdWV1ZSA9IEVNUFRZO1xuXG4gICAgICAgICAgICBpZiAoIWhhc0VxdWFscykge1xuICAgICAgICAgICAgICAgIHF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgICAgICAgICAgICAgIHF1ZXVlICs9IHN1YnF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19ET1VCTEVfUVVPVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdCA9IGlzRG91YmxlUXVvdGVkQXR0cmlidXRlQ2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgICAgICBzdWJxdWV1ZSA9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19TSU5HTEVfUVVPVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdCA9IGlzU2luZ2xlUXVvdGVkQXR0cmlidXRlQ2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgICAgICBzdWJxdWV1ZSA9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gaXNVbnF1b3RlZEF0dHJpYnV0ZUNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICAgICAgc3VicXVldWUgPSBFTVBUWTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRlc3QoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0ZXN0LmRlbGltaXRlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gdGVzdC5kZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VicXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBxdWV1ZSArPSBzdWJxdWV1ZTtcbiAgICAgICAgICAgICAgICBzdWJxdWV1ZSA9IEVNUFRZO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogTW9yZSB3aGl0ZS1zcGFjZSBpcyBhbHJlYWR5IGVhdGVuIGJ5IHRoZVxuICAgICAgICAgKiBhdHRyaWJ1dGVzIHN1YnJvdXRpbmUuXG4gICAgICAgICAqL1xuXG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogRWF0IGFuIG9wdGlvbmFsIGJhY2tzbGFzaCAoZm9yIHNlbGYtY2xvc2luZ1xuICAgICAgICAgKiB0YWdzKS5cbiAgICAgICAgICovXG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19TTEFTSCkge1xuICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoYXJhY3RlciA9PT0gQ19HVCA/IHF1ZXVlICsgY2hhcmFjdGVyIDogbnVsbDtcbiAgICB9XG59XG5cbi8qKlxuICogVG9rZW5pc2UgSFRNTC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZUhUTUwoZWF0LCAnPHNwYW4+Zm9vPC9zcGFuPicpO1xuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gZWF0IC0gRWF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSZXN0IG9mIGNvbnRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbc2lsZW50XSAtIFdoZXRoZXIgdGhpcyBpcyBhIGRyeSBydW4uXG4gKiBAcmV0dXJuIHtOb2RlP3xib29sZWFufSAtIGBodG1sYCBub2RlLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUhUTUwoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgc3VidmFsdWUgPSBFTVBUWTtcbiAgICB2YXIgb2Zmc2V0O1xuICAgIHZhciBsaW5lQ291bnQ7XG4gICAgdmFyIGNoYXJhY3RlcjtcbiAgICB2YXIgcXVldWU7XG5cbiAgICAvKlxuICAgICAqIEVhdCBpbml0aWFsIHNwYWNpbmcuXG4gICAgICovXG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1RBQiAmJiBjaGFyYWN0ZXIgIT09IENfU1BBQ0UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIG9mZnNldCA9IGluZGV4O1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2Uob2Zmc2V0KTtcblxuICAgIC8qXG4gICAgICogVHJ5IHRvIGVhdCBhbiBIVE1MIHRoaW5nLlxuICAgICAqL1xuXG4gICAgcXVldWUgPSBlYXRIVE1MQ29tbWVudCh2YWx1ZSwgc2VsZi5vcHRpb25zKSB8fFxuICAgICAgICBlYXRIVE1MQ0RBVEEodmFsdWUpIHx8XG4gICAgICAgIGVhdEhUTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odmFsdWUpIHx8XG4gICAgICAgIGVhdEhUTUxEZWNsYXJhdGlvbih2YWx1ZSkgfHxcbiAgICAgICAgZWF0SFRNTENsb3NpbmdUYWcodmFsdWUsIHRydWUpIHx8XG4gICAgICAgIGVhdEhUTUxPcGVuaW5nVGFnKHZhbHVlLCB0cnVlKTtcblxuICAgIGlmICghcXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gcXVldWU7XG4gICAgaW5kZXggPSBzdWJ2YWx1ZS5sZW5ndGggLSBvZmZzZXQ7XG4gICAgcXVldWUgPSBFTVBUWTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgbGluZUNvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAocXVldWUubGVuZ3RoIDwgTUlOX0NMT1NJTkdfSFRNTF9ORVdMSU5FX0NPVU5UKSB7XG4gICAgICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICAgICAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoc2VsZi5yZW5kZXJSYXcoVF9IVE1MLCBzdWJ2YWx1ZSkpO1xufVxuXG4vKipcbiAqIFRva2VuaXNlIGEgZGVmaW5pdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgdmFsdWUgPSAnW2Zvb106IGh0dHA6Ly9leGFtcGxlLmNvbSBcIkV4YW1wbGUgRG9tYWluXCInO1xuICogICB0b2tlbml6ZURlZmluaXRpb24oZWF0LCB2YWx1ZSk7XG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBvbmx5QXRUb3BcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbm90SW5CbG9ja3F1b3RlXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyl9IGVhdCAtIEVhdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gUmVzdCBvZiBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFuP30gW3NpbGVudF0gLSBXaGV0aGVyIHRoaXMgaXMgYSBkcnkgcnVuLlxuICogQHJldHVybiB7Tm9kZT98Ym9vbGVhbn0gLSBgZGVmaW5pdGlvbmAgbm9kZS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVEZWZpbml0aW9uKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY29tbW9ubWFyayA9IHNlbGYub3B0aW9ucy5jb21tb25tYXJrO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgc3VidmFsdWUgPSBFTVBUWTtcbiAgICB2YXIgYmVmb3JlVVJMO1xuICAgIHZhciBiZWZvcmVUaXRsZTtcbiAgICB2YXIgcXVldWU7XG4gICAgdmFyIGNoYXJhY3RlcjtcbiAgICB2YXIgdGVzdDtcbiAgICB2YXIgaWRlbnRpZmllcjtcbiAgICB2YXIgdXJsO1xuICAgIHZhciB0aXRsZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfQlJBQ0tFVF9PUEVOKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbmRleCsrO1xuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICBxdWV1ZSA9IEVNUFRZO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfQkFDS1NMQVNIKSB7XG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgICFxdWV1ZSB8fFxuICAgICAgICB2YWx1ZS5jaGFyQXQoaW5kZXgpICE9PSBDX0JSQUNLRVRfQ0xPU0UgfHxcbiAgICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgIT09IENfQ09MT05cbiAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlkZW50aWZpZXIgPSBxdWV1ZTtcbiAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIENfQlJBQ0tFVF9DTE9TRSArIENfQ09MT047XG4gICAgaW5kZXggPSBzdWJ2YWx1ZS5sZW5ndGg7XG4gICAgcXVldWUgPSBFTVBUWTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gQ19UQUIgJiZcbiAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gQ19TUEFDRSAmJlxuICAgICAgICAgICAgY2hhcmFjdGVyICE9PSBDX05FV0xJTkVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgYmVmb3JlVVJMID0gc3VidmFsdWU7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX0xUKSB7XG4gICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoIWlzRW5jbG9zZWRVUkxDaGFyYWN0ZXIoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBpc0VuY2xvc2VkVVJMQ2hhcmFjdGVyLmRlbGltaXRlcikge1xuICAgICAgICAgICAgaWYgKGNvbW1vbm1hcmspIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4IC09IHF1ZXVlLmxlbmd0aCArIDE7XG4gICAgICAgICAgICBxdWV1ZSA9IEVNUFRZO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VidmFsdWUgKz0gQ19MVCArIHF1ZXVlICsgY2hhcmFjdGVyO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcXVldWUpIHtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoIWlzVW5jbG9zZWRVUkxDaGFyYWN0ZXIoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VidmFsdWUgKz0gcXVldWU7XG4gICAgfVxuXG4gICAgaWYgKCFxdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdXJsID0gcXVldWU7XG4gICAgcXVldWUgPSBFTVBUWTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gQ19UQUIgJiZcbiAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gQ19TUEFDRSAmJlxuICAgICAgICAgICAgY2hhcmFjdGVyICE9PSBDX05FV0xJTkVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIHRlc3QgPSBudWxsO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19ET1VCTEVfUVVPVEUpIHtcbiAgICAgICAgdGVzdCA9IENfRE9VQkxFX1FVT1RFO1xuICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1NJTkdMRV9RVU9URSkge1xuICAgICAgICB0ZXN0ID0gQ19TSU5HTEVfUVVPVEU7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfUEFSRU5fT1BFTikge1xuICAgICAgICB0ZXN0ID0gQ19QQVJFTl9DTE9TRTtcbiAgICB9XG5cbiAgICBpZiAoIXRlc3QpIHtcbiAgICAgICAgcXVldWUgPSBFTVBUWTtcbiAgICAgICAgaW5kZXggPSBzdWJ2YWx1ZS5sZW5ndGg7XG4gICAgfSBlbHNlIGlmICghcXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnZhbHVlICs9IHF1ZXVlICsgY2hhcmFjdGVyO1xuICAgICAgICBpbmRleCA9IHN1YnZhbHVlLmxlbmd0aDtcbiAgICAgICAgcXVldWUgPSBFTVBUWTtcblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IHRlc3QpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19ORVdMSU5FKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19ORVdMSU5FIHx8IGNoYXJhY3RlciA9PT0gdGVzdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcXVldWUgKz0gQ19ORVdMSU5FO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSB0ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBiZWZvcmVUaXRsZSA9IHN1YnZhbHVlO1xuICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgdGl0bGUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBFTVBUWTtcbiAgICB9XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1RBQiAmJiBjaGFyYWN0ZXIgIT09IENfU1BBQ0UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIWNoYXJhY3RlciB8fCBjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJlZm9yZVVSTCA9IGVhdChiZWZvcmVVUkwpLnRlc3QoKS5lbmQ7XG4gICAgICAgIHVybCA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLmRlc2NhcGUodXJsKSwgYmVmb3JlVVJMKTtcblxuICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgIGJlZm9yZVRpdGxlID0gZWF0KGJlZm9yZVRpdGxlKS50ZXN0KCkuZW5kO1xuICAgICAgICAgICAgdGl0bGUgPSBzZWxmLmRlY29kZS5yYXcoc2VsZi5kZXNjYXBlKHRpdGxlKSwgYmVmb3JlVGl0bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe1xuICAgICAgICAgICAgJ3R5cGUnOiBUX0RFRklOSVRJT04sXG4gICAgICAgICAgICAnaWRlbnRpZmllcic6IG5vcm1hbGl6ZShpZGVudGlmaWVyKSxcbiAgICAgICAgICAgICd0aXRsZSc6IHRpdGxlIHx8IG51bGwsXG4gICAgICAgICAgICAnbGluayc6IHVybFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbnRva2VuaXplRGVmaW5pdGlvbi5vbmx5QXRUb3AgPSB0cnVlO1xudG9rZW5pemVEZWZpbml0aW9uLm5vdEluQmxvY2txdW90ZSA9IHRydWU7XG5cbi8qKlxuICogVG9rZW5pc2UgWUFNTCBmcm9udCBtYXR0ZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdG9rZW5pemVZQU1MRnJvbnRNYXR0ZXIoZWF0LCAnLS0tXFxuZm9vOiBiYXJcXG4tLS0nKTtcbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9ubHlBdFN0YXJ0XG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyl9IGVhdCAtIEVhdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gUmVzdCBvZiBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFuP30gW3NpbGVudF0gLSBXaGV0aGVyIHRoaXMgaXMgYSBkcnkgcnVuLlxuICogQHJldHVybiB7Tm9kZT98Ym9vbGVhbn0gLSBgeWFtbGAgbm9kZS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVZQU1MRnJvbnRNYXR0ZXIoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzdWJ2YWx1ZTtcbiAgICB2YXIgY29udGVudDtcbiAgICB2YXIgaW5kZXg7XG4gICAgdmFyIGxlbmd0aDtcbiAgICB2YXIgY2hhcmFjdGVyO1xuICAgIHZhciBxdWV1ZTtcblxuICAgIGlmIChcbiAgICAgICAgIXNlbGYub3B0aW9ucy55YW1sIHx8XG4gICAgICAgIHZhbHVlLmNoYXJBdCgwKSAhPT0gQ19EQVNIIHx8XG4gICAgICAgIHZhbHVlLmNoYXJBdCgxKSAhPT0gQ19EQVNIIHx8XG4gICAgICAgIHZhbHVlLmNoYXJBdCgyKSAhPT0gQ19EQVNIIHx8XG4gICAgICAgIHZhbHVlLmNoYXJBdCgzKSAhPT0gQ19ORVdMSU5FXG4gICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWJ2YWx1ZSA9IFlBTUxfRkVOQ0UgKyBDX05FV0xJTkU7XG4gICAgY29udGVudCA9IHF1ZXVlID0gRU1QVFk7XG4gICAgaW5kZXggPSAzO1xuICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX0RBU0ggJiZcbiAgICAgICAgICAgIChxdWV1ZSB8fCAhY29udGVudCkgJiZcbiAgICAgICAgICAgIHZhbHVlLmNoYXJBdChpbmRleCArIDEpID09PSBDX0RBU0ggJiZcbiAgICAgICAgICAgIHZhbHVlLmNoYXJBdChpbmRleCArIDIpID09PSBDX0RBU0hcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1YnZhbHVlICs9IHF1ZXVlICsgWUFNTF9GRU5DRTtcblxuICAgICAgICAgICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoc2VsZi5yZW5kZXJSYXcoVF9ZQU1MLCBjb250ZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX05FV0xJTkUpIHtcbiAgICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YnZhbHVlICs9IHF1ZXVlICsgY2hhcmFjdGVyO1xuICAgICAgICAgICAgY29udGVudCArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICAgICAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnRva2VuaXplWUFNTEZyb250TWF0dGVyLm9ubHlBdFN0YXJ0ID0gdHJ1ZTtcblxuLyoqXG4gKiBUb2tlbmlzZSBhIGZvb3Rub3RlIGRlZmluaXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdG9rZW5pemVGb290bm90ZURlZmluaXRpb24oZWF0LCAnW15mb29dOiBCYXIuJyk7XG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBvbmx5QXRUb3BcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbm90SW5CbG9ja3F1b3RlXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyl9IGVhdCAtIEVhdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gUmVzdCBvZiBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFuP30gW3NpbGVudF0gLSBXaGV0aGVyIHRoaXMgaXMgYSBkcnkgcnVuLlxuICogQHJldHVybiB7Tm9kZT98Ym9vbGVhbn0gLSBgZm9vdG5vdGVEZWZpbml0aW9uYCBub2RlLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUZvb3Rub3RlRGVmaW5pdGlvbihlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGluZGV4O1xuICAgIHZhciBsZW5ndGg7XG4gICAgdmFyIHN1YnZhbHVlO1xuICAgIHZhciBub3c7XG4gICAgdmFyIGluZGVudDtcbiAgICB2YXIgY29udGVudDtcbiAgICB2YXIgcXVldWU7XG4gICAgdmFyIHN1YnF1ZXVlO1xuICAgIHZhciBjaGFyYWN0ZXI7XG4gICAgdmFyIGlkZW50aWZpZXI7XG5cbiAgICBpZiAoIXNlbGYub3B0aW9ucy5mb290bm90ZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluZGV4ID0gMDtcbiAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgc3VidmFsdWUgPSBFTVBUWTtcbiAgICBub3cgPSBlYXQubm93KCk7XG4gICAgaW5kZW50ID0gc2VsZi5pbmRlbnQobm93LmxpbmUpO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICB2YWx1ZS5jaGFyQXQoaW5kZXgpICE9PSBDX0JSQUNLRVRfT1BFTiB8fFxuICAgICAgICB2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKSAhPT0gQ19DQVJFVFxuICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gQ19CUkFDS0VUX09QRU4gKyBDX0NBUkVUO1xuICAgIGluZGV4ID0gc3VidmFsdWUubGVuZ3RoO1xuICAgIHF1ZXVlID0gRU1QVFk7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfQ0xPU0UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19CQUNLU0xBU0gpIHtcbiAgICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgIXF1ZXVlIHx8XG4gICAgICAgIHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfQlJBQ0tFVF9DTE9TRSB8fFxuICAgICAgICB2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKSAhPT0gQ19DT0xPTlxuICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNpbGVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZGVudGlmaWVyID0gbm9ybWFsaXplKHF1ZXVlKTtcbiAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIENfQlJBQ0tFVF9DTE9TRSArIENfQ09MT047XG4gICAgaW5kZXggPSBzdWJ2YWx1ZS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGFyYWN0ZXIgIT09IENfVEFCICYmXG4gICAgICAgICAgICBjaGFyYWN0ZXIgIT09IENfU1BBQ0VcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBub3cuY29sdW1uICs9IHN1YnZhbHVlLmxlbmd0aDtcbiAgICBxdWV1ZSA9IGNvbnRlbnQgPSBzdWJxdWV1ZSA9IEVNUFRZO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19ORVdMSU5FKSB7XG4gICAgICAgICAgICBzdWJxdWV1ZSA9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX05FV0xJTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3VicXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgICAgICAgICAgc3VicXVldWUgPSBFTVBUWTtcblxuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3VicXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc3VicXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgICAgICBjb250ZW50ICs9IHF1ZXVlO1xuICAgICAgICAgICAgcXVldWUgPSBFTVBUWTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNvbnRlbnQ7XG5cbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKEVYUFJFU1NJT05fSU5JVElBTF9UQUIsIGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgIGluZGVudChsaW5lLmxlbmd0aCk7XG5cbiAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoXG4gICAgICAgIHNlbGYucmVuZGVyRm9vdG5vdGVEZWZpbml0aW9uKGlkZW50aWZpZXIsIGNvbnRlbnQsIG5vdylcbiAgICApO1xufVxuXG50b2tlbml6ZUZvb3Rub3RlRGVmaW5pdGlvbi5vbmx5QXRUb3AgPSB0cnVlO1xudG9rZW5pemVGb290bm90ZURlZmluaXRpb24ubm90SW5CbG9ja3F1b3RlID0gdHJ1ZTtcblxuLyoqXG4gKiBUb2tlbmlzZSBhIHRhYmxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHRva2VuaXplVGFibGUoZWF0LCAnIHwgZm9vIHxcXG4gfCAtLS0gfFxcbiB8IGJhciB8Jyk7XG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBvbmx5QXRUb3BcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gZWF0IC0gRWF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSZXN0IG9mIGNvbnRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbc2lsZW50XSAtIFdoZXRoZXIgdGhpcyBpcyBhIGRyeSBydW4uXG4gKiBAcmV0dXJuIHtOb2RlP3xib29sZWFufSAtIGB0YWJsZWAgbm9kZS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVUYWJsZShlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGluZGV4O1xuICAgIHZhciBhbGlnbm1lbnRzO1xuICAgIHZhciBhbGlnbm1lbnQ7XG4gICAgdmFyIHN1YnZhbHVlO1xuICAgIHZhciByb3c7XG4gICAgdmFyIGxlbmd0aDtcbiAgICB2YXIgbGluZXM7XG4gICAgdmFyIHF1ZXVlO1xuICAgIHZhciBjaGFyYWN0ZXI7XG4gICAgdmFyIGhhc0Rhc2g7XG4gICAgdmFyIGFsaWduO1xuICAgIHZhciBjZWxsO1xuICAgIHZhciBwcmVhbWJsZTtcbiAgICB2YXIgY291bnQ7XG4gICAgdmFyIG9wZW5pbmc7XG4gICAgdmFyIG5vdztcbiAgICB2YXIgcG9zaXRpb247XG4gICAgdmFyIGxpbmVDb3VudDtcbiAgICB2YXIgbGluZTtcbiAgICB2YXIgcm93cztcbiAgICB2YXIgdGFibGU7XG4gICAgdmFyIGxpbmVJbmRleDtcbiAgICB2YXIgcGlwZUluZGV4O1xuICAgIHZhciBmaXJzdDtcblxuICAgIC8qXG4gICAgICogRXhpdCB3aGVuIG5vdCBpbiBnZm0tbW9kZS5cbiAgICAgKi9cblxuICAgIGlmICghc2VsZi5vcHRpb25zLmdmbSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBHZXQgdGhlIHJvd3MuXG4gICAgICogRGV0ZWN0aW5nIHRhYmxlcyBzb29uIGlzIGhhcmQsIHNvIHRoZXJlIGFyZSBzb21lXG4gICAgICogY2hlY2tzIGZvciBwZXJmb3JtYW5jZSBoZXJlLCBzdWNoIGFzIHRoZSBtaW5pbXVtXG4gICAgICogbnVtYmVyIG9mIHJvd3MsIGFuZCBhbGxvd2VkIGNoYXJhY3RlcnMgaW4gdGhlXG4gICAgICogYWxpZ25tZW50IHJvdy5cbiAgICAgKi9cblxuICAgIGluZGV4ID0gbGluZUNvdW50ID0gMDtcbiAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyAxO1xuICAgIGxpbmVzID0gW107XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgbGluZUluZGV4ID0gdmFsdWUuaW5kZXhPZihDX05FV0xJTkUsIGluZGV4KTtcbiAgICAgICAgcGlwZUluZGV4ID0gdmFsdWUuaW5kZXhPZihDX1BJUEUsIGluZGV4ICsgMSk7XG5cbiAgICAgICAgaWYgKGxpbmVJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGxpbmVJbmRleCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBpcGVJbmRleCA9PT0gLTEgfHxcbiAgICAgICAgICAgIHBpcGVJbmRleCA+IGxpbmVJbmRleFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPCBNSU5fVEFCTEVfUk9XUykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBsaW5lcy5wdXNoKHZhbHVlLnNsaWNlKGluZGV4LCBsaW5lSW5kZXgpKTtcbiAgICAgICAgbGluZUNvdW50Kys7XG4gICAgICAgIGluZGV4ID0gbGluZUluZGV4ICsgMTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFBhcnNlIHRoZSBhbGlnbm1lbnQgcm93LlxuICAgICAqL1xuXG4gICAgc3VidmFsdWUgPSBsaW5lcy5qb2luKENfTkVXTElORSk7XG4gICAgYWxpZ25tZW50cyA9IGxpbmVzLnNwbGljZSgxLCAxKVswXTtcbiAgICBpbmRleCA9IDA7XG4gICAgbGVuZ3RoID0gYWxpZ25tZW50cy5sZW5ndGg7XG4gICAgbGluZUNvdW50LS07XG4gICAgYWxpZ25tZW50ID0gZmFsc2U7XG4gICAgYWxpZ24gPSBbXTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSBhbGlnbm1lbnRzLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19QSVBFKSB7XG4gICAgICAgICAgICBoYXNEYXNoID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGFsaWdubWVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFsaWduLnB1c2goYWxpZ25tZW50KTtcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfREFTSCkge1xuICAgICAgICAgICAgaGFzRGFzaCA9IHRydWU7XG4gICAgICAgICAgICBhbGlnbm1lbnQgPSBhbGlnbm1lbnQgfHwgVEFCTEVfQUxJR05fTk9ORTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfQ09MT04pIHtcbiAgICAgICAgICAgIGlmIChhbGlnbm1lbnQgPT09IFRBQkxFX0FMSUdOX0xFRlQpIHtcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBUQUJMRV9BTElHTl9DRU5URVI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc0Rhc2ggJiYgYWxpZ25tZW50ID09PSBUQUJMRV9BTElHTl9OT05FKSB7XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gVEFCTEVfQUxJR05fUklHSFQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFsaWdubWVudCA9IFRBQkxFX0FMSUdOX0xFRlQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzV2hpdGVTcGFjZShjaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGlmIChhbGlnbm1lbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIGFsaWduLnB1c2goYWxpZ25tZW50KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEV4aXQgd2hlbiB3aXRob3V0IGVub3VnaCBjb2x1bW5zLlxuICAgICAqL1xuXG4gICAgaWYgKGFsaWduLmxlbmd0aCA8IE1JTl9UQUJMRV9DT0xVTU5TKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgaWYgKHNpbGVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFBhcnNlIHRoZSByb3dzLlxuICAgICAqL1xuXG4gICAgcG9zaXRpb24gPSAtMTtcbiAgICByb3dzID0gW107XG5cbiAgICB0YWJsZSA9IGVhdChzdWJ2YWx1ZSkucmVzZXQoe1xuICAgICAgICAndHlwZSc6IFRfVEFCTEUsXG4gICAgICAgICdhbGlnbic6IGFsaWduLFxuICAgICAgICAnY2hpbGRyZW4nOiByb3dzXG4gICAgfSk7XG5cbiAgICB3aGlsZSAoKytwb3NpdGlvbiA8IGxpbmVDb3VudCkge1xuICAgICAgICBsaW5lID0gbGluZXNbcG9zaXRpb25dO1xuICAgICAgICByb3cgPSBzZWxmLnJlbmRlclBhcmVudChwb3NpdGlvbiA/IFRfVEFCTEVfUk9XIDogVF9UQUJMRV9IRUFERVIsIFtdKTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBFYXQgYSBuZXdsaW5lIGNoYXJhY3RlciB3aGVuIHRoaXMgaXMgbm90IHRoZVxuICAgICAgICAgKiBmaXJzdCByb3cuXG4gICAgICAgICAqL1xuXG4gICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgZWF0KENfTkVXTElORSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBFYXQgdGhlIHJvdy5cbiAgICAgICAgICovXG5cbiAgICAgICAgZWF0KGxpbmUpLnJlc2V0KHJvdywgdGFibGUpO1xuXG4gICAgICAgIGxlbmd0aCA9IGxpbmUubGVuZ3RoICsgMTtcbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICBxdWV1ZSA9IEVNUFRZO1xuICAgICAgICBjZWxsID0gRU1QVFk7XG4gICAgICAgIHByZWFtYmxlID0gdHJ1ZTtcbiAgICAgICAgY291bnQgPSBvcGVuaW5nID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IGxpbmUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19UQUIgfHwgY2hhcmFjdGVyID09PSBDX1NQQUNFKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVhdChjaGFyYWN0ZXIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IEVNUFRZIHx8IGNoYXJhY3RlciA9PT0gQ19QSVBFKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZWFtYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVhdChjaGFyYWN0ZXIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgJiYgb3BlbmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChjZWxsIHx8IGNoYXJhY3RlcikgJiYgIXByZWFtYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJ2YWx1ZSA9IGNlbGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZS5zbGljZSgwLCBxdWV1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUgPSBxdWV1ZS5jaGFyQXQocXVldWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidmFsdWUgKz0gcXVldWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBub3cgPSBlYXQubm93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVhdChzdWJ2YWx1ZSkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW5kZXJJbmxpbmUoVF9UQUJMRV9DRUxMLCBjZWxsLCBub3cpLCByb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBlYXQocXVldWUgKyBjaGFyYWN0ZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwgPSBFTVBUWTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjZWxsICs9IHF1ZXVlO1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZSA9IEVNUFRZO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNlbGwgKz0gY2hhcmFjdGVyO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CQUNLU0xBU0ggJiYgaW5kZXggIT09IGxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbCArPSBsaW5lLmNoYXJBdChpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfVElDSykge1xuICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxpbmUuY2hhckF0KGluZGV4ICsgMSkgPT09IGNoYXJhY3Rlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbCArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghb3BlbmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmluZyA9IGNvdW50O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID49IG9wZW5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5pbmcgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcmVhbWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIEVhdCB0aGUgYWxpZ25tZW50IHJvdy5cbiAgICAgICAgICovXG5cbiAgICAgICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgICAgICAgZWF0KENfTkVXTElORSArIGFsaWdubWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlO1xufVxuXG50b2tlbml6ZVRhYmxlLm9ubHlBdFRvcCA9IHRydWU7XG5cbi8qKlxuICogVG9rZW5pc2UgYSBwYXJhZ3JhcGggbm9kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZVBhcmFncmFwaChlYXQsICdGb28uJyk7XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBlYXQgLSBFYXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlc3Qgb2YgY29udGVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFtzaWxlbnRdIC0gV2hldGhlciB0aGlzIGlzIGEgZHJ5IHJ1bi5cbiAqIEByZXR1cm4ge05vZGU/fGJvb2xlYW59IC0gYHBhcmFncmFwaGAgbm9kZS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVQYXJhZ3JhcGgoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucztcbiAgICB2YXIgY29tbW9ubWFyayA9IHNldHRpbmdzLmNvbW1vbm1hcms7XG4gICAgdmFyIGdmbSA9IHNldHRpbmdzLmdmbTtcbiAgICB2YXIgdG9rZW5pemVycyA9IHNlbGYuYmxvY2tUb2tlbml6ZXJzO1xuICAgIHZhciBpbmRleCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FKTtcbiAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgIHZhciBwb3NpdGlvbjtcbiAgICB2YXIgc3VidmFsdWU7XG4gICAgdmFyIGNoYXJhY3RlcjtcbiAgICB2YXIgc2l6ZTtcbiAgICB2YXIgbm93O1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIEVhdCBldmVyeXRoaW5nIGlmIHRoZXJl4oCZcyBubyBmb2xsb3dpbmcgbmV3bGluZS5cbiAgICAgICAgICovXG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFN0b3AgaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIE5FV0xJTkUuXG4gICAgICAgICAqL1xuXG4gICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKSA9PT0gQ19ORVdMSU5FKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIEluIGNvbW1vbm1hcmstbW9kZSwgZm9sbG93aW5nIGluZGVudGVkIGxpbmVzXG4gICAgICAgICAqIGFyZSBwYXJ0IG9mIHRoZSBwYXJhZ3JhcGguXG4gICAgICAgICAqL1xuXG4gICAgICAgIGlmIChjb21tb25tYXJrKSB7XG4gICAgICAgICAgICBzaXplID0gMDtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaW5kZXggKyAxO1xuXG4gICAgICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQocG9zaXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19UQUIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFRBQl9TSVpFO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19TUEFDRSkge1xuICAgICAgICAgICAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcG9zaXRpb24rKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNpemUgPj0gVEFCX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FLCBpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogQ2hlY2sgaWYgdGhlIGZvbGxvd2luZyBjb2RlIGNvbnRhaW5zIGEgcG9zc2libGVcbiAgICAgICAgICogYmxvY2suXG4gICAgICAgICAqL1xuXG4gICAgICAgIHN1YnZhbHVlID0gdmFsdWUuc2xpY2UoaW5kZXggKyAxKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0b2tlbml6ZXJzLmhvcml6b250YWxSdWxlLmNhbGwoc2VsZiwgZWF0LCBzdWJ2YWx1ZSwgdHJ1ZSkgfHxcbiAgICAgICAgICAgIHRva2VuaXplcnMuaGVhZGluZy5jYWxsKHNlbGYsIGVhdCwgc3VidmFsdWUsIHRydWUpIHx8XG4gICAgICAgICAgICB0b2tlbml6ZXJzLmZlbmNlcy5jYWxsKHNlbGYsIGVhdCwgc3VidmFsdWUsIHRydWUpIHx8XG4gICAgICAgICAgICB0b2tlbml6ZXJzLmJsb2NrcXVvdGUuY2FsbChzZWxmLCBlYXQsIHN1YnZhbHVlLCB0cnVlKSB8fFxuICAgICAgICAgICAgdG9rZW5pemVycy5odG1sLmNhbGwoc2VsZiwgZWF0LCBzdWJ2YWx1ZSwgdHJ1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZm0gJiYgdG9rZW5pemVycy5saXN0LmNhbGwoc2VsZiwgZWF0LCBzdWJ2YWx1ZSwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWNvbW1vbm1hcmsgJiZcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICB0b2tlbml6ZXJzLmxpbmVIZWFkaW5nLmNhbGwoc2VsZiwgZWF0LCBzdWJ2YWx1ZSwgdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgICB0b2tlbml6ZXJzLmRlZmluaXRpb24uY2FsbChzZWxmLCBlYXQsIHN1YnZhbHVlLCB0cnVlKSB8fFxuICAgICAgICAgICAgICAgIHRva2VuaXplcnMuZm9vdG5vdGVEZWZpbml0aW9uLmNhbGwoc2VsZiwgZWF0LCBzdWJ2YWx1ZSwgdHJ1ZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gdmFsdWUuaW5kZXhPZihDX05FV0xJTkUsIGluZGV4ICsgMSk7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpbmRleCk7XG5cbiAgICBpZiAodHJpbShzdWJ2YWx1ZSkgPT09IEVNUFRZKSB7XG4gICAgICAgIGVhdChzdWJ2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gbmV2ZXIgdXNlZCAoeWV0KSAqL1xuICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbm93ID0gZWF0Lm5vdygpO1xuICAgIHN1YnZhbHVlID0gdHJpbVRyYWlsaW5nTGluZXMoc3VidmFsdWUpO1xuXG4gICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoc2VsZi5yZW5kZXJJbmxpbmUoVF9QQVJBR1JBUEgsIHN1YnZhbHVlLCBub3cpKTtcbn1cblxuLyoqXG4gKiBUb2tlbmlzZSBhIHRleHQgbm9kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZVRleHQoZWF0LCAnZm9vJyk7XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBlYXQgLSBFYXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlc3Qgb2YgY29udGVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFtzaWxlbnRdIC0gV2hldGhlciB0aGlzIGlzIGEgZHJ5IHJ1bi5cbiAqIEByZXR1cm4ge05vZGU/fGJvb2xlYW59IC0gYHRleHRgIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplVGV4dChlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG1ldGhvZHM7XG4gICAgdmFyIHRva2VuaXplcnM7XG4gICAgdmFyIGluZGV4O1xuICAgIHZhciBsZW5ndGg7XG4gICAgdmFyIHN1YnZhbHVlO1xuICAgIHZhciBwb3NpdGlvbjtcbiAgICB2YXIgdG9rZW5pemVyO1xuICAgIHZhciBuYW1lO1xuICAgIHZhciBtaW47XG4gICAgdmFyIG5vdztcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG1ldGhvZHMgPSBzZWxmLmlubGluZU1ldGhvZHM7XG4gICAgbGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7XG4gICAgdG9rZW5pemVycyA9IHNlbGYuaW5saW5lVG9rZW5pemVycztcbiAgICBpbmRleCA9IC0xO1xuICAgIG1pbiA9IHZhbHVlLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIG5hbWUgPSBtZXRob2RzW2luZGV4XTtcblxuICAgICAgICBpZiAobmFtZSA9PT0gJ2lubGluZVRleHQnIHx8ICF0b2tlbml6ZXJzW25hbWVdKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRva2VuaXplciA9IHRva2VuaXplcnNbbmFtZV0ubG9jYXRvcjtcblxuICAgICAgICBpZiAoIXRva2VuaXplcikge1xuICAgICAgICAgICAgZWF0LmZpbGUuZmFpbChFUlJfTUlTU0lOR19MT0NBVE9SICsgQ19USUNLICsgbmFtZSArIENfVElDSyk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc2l0aW9uID0gdG9rZW5pemVyLmNhbGwoc2VsZiwgdmFsdWUsIDEpO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gLTEgJiYgcG9zaXRpb24gPCBtaW4pIHtcbiAgICAgICAgICAgIG1pbiA9IHBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3VidmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBtaW4pO1xuICAgIG5vdyA9IGVhdC5ub3coKTtcblxuICAgIHNlbGYuZGVjb2RlKHN1YnZhbHVlLCBub3csIGZ1bmN0aW9uIChjb250ZW50LCBwb3NpdGlvbiwgc291cmNlKSB7XG4gICAgICAgIGVhdChzb3VyY2UgfHwgY29udGVudCkoc2VsZi5yZW5kZXJSYXcoVF9URVhULCBjb250ZW50KSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY29kZS1ibG9jayBub2RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHJlbmRlckNvZGVCbG9jaygnZm9vKCknLCAnanMnLCBub3coKSk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmc/fSBbdmFsdWVdIC0gQ29kZS5cbiAqIEBwYXJhbSB7c3RyaW5nP30gW2xhbmd1YWdlXSAtIE9wdGlvbmFsIGxhbmd1YWdlIGZsYWcuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYXQgLSBFYXRlci5cbiAqIEByZXR1cm4ge09iamVjdH0gLSBgY29kZWAgbm9kZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyQ29kZUJsb2NrKHZhbHVlLCBsYW5ndWFnZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgICd0eXBlJzogVF9DT0RFLFxuICAgICAgICAnbGFuZyc6IGxhbmd1YWdlIHx8IG51bGwsXG4gICAgICAgICd2YWx1ZSc6IHRyaW1UcmFpbGluZ0xpbmVzKHZhbHVlIHx8IEVNUFRZKVxuICAgIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbGlzdC1pdGVtIHVzaW5nIG92ZXJseSBzaW1wbGUgbWVjaGFuaWNzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHJlbmRlclBlZGFudGljTGlzdEl0ZW0oJy0gX2Zvb18nLCBub3coKSk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gTGlzdC1pdGVtLlxuICogQHBhcmFtIHtPYmplY3R9IHBvc2l0aW9uIC0gTGlzdC1pdGVtIGxvY2F0aW9uLlxuICogQHJldHVybiB7c3RyaW5nfSAtIENsZWFuZWQgYHZhbHVlYC5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyUGVkYW50aWNMaXN0SXRlbSh2YWx1ZSwgcG9zaXRpb24pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGluZGVudCA9IHNlbGYuaW5kZW50KHBvc2l0aW9uLmxpbmUpO1xuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgcmVwbGFjZXIgd2hpY2ggcmVtb3ZlZCBhbGwgbWF0Y2hlcyxcbiAgICAgKiBhbmQgYWRkcyB0aGVpciBsZW5ndGggdG8gYG9mZnNldGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gJDAgLSBJbmRlbnRhdGlvbiB0byBzdWJ0cmFjdC5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gQW4gZW1wdHkgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2VyKCQwKSB7XG4gICAgICAgIGluZGVudCgkMC5sZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFJlbW92ZSB0aGUgbGlzdC1pdGVt4oCZcyBidWxsZXQuXG4gICAgICovXG5cbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoRVhQUkVTU0lPTl9QRURBTlRJQ19CVUxMRVQsIHJlcGxhY2VyKTtcblxuICAgIC8qXG4gICAgICogVGhlIGluaXRpYWwgbGluZSB3YXMgYWxzbyBtYXRjaGVkIGJ5IHRoZSBiZWxvdywgc29cbiAgICAgKiB3ZSByZXNldCB0aGUgYGxpbmVgLlxuICAgICAqL1xuXG4gICAgaW5kZW50ID0gc2VsZi5pbmRlbnQocG9zaXRpb24ubGluZSk7XG5cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZShFWFBSRVNTSU9OX0lOSVRJQUxfSU5ERU5ULCByZXBsYWNlcik7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbGlzdC1pdGVtIHVzaW5nIHNhbmUgbWVjaGFuaWNzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHJlbmRlck5vcm1hbExpc3RJdGVtKCctIF9mb29fJywgbm93KCkpO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIExpc3QtaXRlbS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwb3NpdGlvbiAtIExpc3QtaXRlbSBsb2NhdGlvbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDbGVhbmVkIGB2YWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlck5vcm1hbExpc3RJdGVtKHZhbHVlLCBwb3NpdGlvbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaW5kZW50ID0gc2VsZi5pbmRlbnQocG9zaXRpb24ubGluZSk7XG4gICAgdmFyIG1heDtcbiAgICB2YXIgYnVsbGV0O1xuICAgIHZhciByZXN0O1xuICAgIHZhciBsaW5lcztcbiAgICB2YXIgdHJpbW1lZExpbmVzO1xuICAgIHZhciBpbmRleDtcbiAgICB2YXIgbGVuZ3RoO1xuXG4gICAgLypcbiAgICAgKiBSZW1vdmUgdGhlIGxpc3QtaXRlbeKAmXMgYnVsbGV0LlxuICAgICAqL1xuXG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKEVYUFJFU1NJT05fQlVMTEVULCBmdW5jdGlvbiAoJDAsICQxLCAkMiwgJDMsICQ0KSB7XG4gICAgICAgIGJ1bGxldCA9ICQxICsgJDIgKyAkMztcbiAgICAgICAgcmVzdCA9ICQ0O1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBuaW5lIG51bWJlcmVkIGxpc3QgaXRlbXNcbiAgICAgICAgICogY2FuIGluZGVudCB3aXRoIGFuIGV4dHJhIHNwYWNlLiAgVGhhdCBpcywgd2hlblxuICAgICAgICAgKiB0aGUgYnVsbGV0IGRpZCBub3QgcmVjZWl2ZSBhbiBleHRyYSBmaW5hbCBzcGFjZS5cbiAgICAgICAgICovXG5cbiAgICAgICAgaWYgKE51bWJlcigkMikgPCAxMCAmJiBidWxsZXQubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgICAgICAgICAgJDIgPSBDX1NQQUNFICsgJDI7XG4gICAgICAgIH1cblxuICAgICAgICBtYXggPSAkMSArIHJlcGVhdChDX1NQQUNFLCAkMi5sZW5ndGgpICsgJDM7XG5cbiAgICAgICAgcmV0dXJuIG1heCArIHJlc3Q7XG4gICAgfSk7XG5cbiAgICBsaW5lcyA9IHZhbHVlLnNwbGl0KENfTkVXTElORSk7XG5cbiAgICB0cmltbWVkTGluZXMgPSByZW1vdmVJbmRlbnRhdGlvbihcbiAgICAgICAgdmFsdWUsIGdldEluZGVudChtYXgpLmluZGVudFxuICAgICkuc3BsaXQoQ19ORVdMSU5FKTtcblxuICAgIC8qXG4gICAgICogV2UgcmVwbGFjZWQgdGhlIGluaXRpYWwgYnVsbGV0IHdpdGggc29tZXRoaW5nXG4gICAgICogZWxzZSBhYm92ZSwgd2hpY2ggd2FzIHVzZWQgdG8gdHJpY2tcbiAgICAgKiBgcmVtb3ZlSW5kZW50YXRpb25gIGludG8gcmVtb3Zpbmcgc29tZSBtb3JlXG4gICAgICogY2hhcmFjdGVycyB3aGVuIHBvc3NpYmxlLiBIb3dldmVyLCB0aGF0IGNvdWxkXG4gICAgICogcmVzdWx0IGluIHRoZSBpbml0aWFsIGxpbmUgdG8gYmUgc3RyaXBwZWQgbW9yZVxuICAgICAqIHRoYW4gaXQgc2hvdWxkIGJlLlxuICAgICAqL1xuXG4gICAgdHJpbW1lZExpbmVzWzBdID0gcmVzdDtcblxuICAgIGluZGVudChidWxsZXQubGVuZ3RoKTtcblxuICAgIGluZGV4ID0gMDtcbiAgICBsZW5ndGggPSBsaW5lcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBpbmRlbnQobGluZXNbaW5kZXhdLmxlbmd0aCAtIHRyaW1tZWRMaW5lc1tpbmRleF0ubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJpbW1lZExpbmVzLmpvaW4oQ19ORVdMSU5FKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBsaXN0LWl0ZW0gbm9kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICByZW5kZXJMaXN0SXRlbSgnLSBfZm9vXycsIG5vdygpKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgLSBMaXN0LWl0ZW0uXG4gKiBAcGFyYW0ge09iamVjdH0gcG9zaXRpb24gLSBMaXN0LWl0ZW0gbG9jYXRpb24uXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gYGxpc3RJdGVtYCBub2RlLlxuICovXG5mdW5jdGlvbiByZW5kZXJMaXN0SXRlbSh2YWx1ZSwgcG9zaXRpb24pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNoZWNrZWQgPSBudWxsO1xuICAgIHZhciBub2RlO1xuICAgIHZhciB0YXNrO1xuICAgIHZhciBpbmRlbnQ7XG5cbiAgICB2YWx1ZSA9IExJU1RfSVRFTV9NQVBbc2VsZi5vcHRpb25zLnBlZGFudGljXS5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKHNlbGYub3B0aW9ucy5nZm0pIHtcbiAgICAgICAgdGFzayA9IHZhbHVlLm1hdGNoKEVYUFJFU1NJT05fVEFTS19JVEVNKTtcblxuICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgaW5kZW50ID0gdGFza1swXS5sZW5ndGg7XG4gICAgICAgICAgICBjaGVja2VkID0gdGFza1sxXS50b0xvd2VyQ2FzZSgpID09PSBDX1hfTE9XRVI7XG5cbiAgICAgICAgICAgIHNlbGYuaW5kZW50KHBvc2l0aW9uLmxpbmUpKGluZGVudCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKGluZGVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0ge1xuICAgICAgICAndHlwZSc6IFRfTElTVF9JVEVNLFxuICAgICAgICAnbG9vc2UnOiBFWFBSRVNTSU9OX0xPT1NFX0xJU1RfSVRFTS50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAgICAgdmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCAtIDEpID09PSBDX05FV0xJTkVcbiAgICB9O1xuXG4gICAgaWYgKHNlbGYub3B0aW9ucy5nZm0pIHtcbiAgICAgICAgbm9kZS5jaGVja2VkID0gY2hlY2tlZDtcbiAgICB9XG5cbiAgICBub2RlLmNoaWxkcmVuID0gc2VsZi50b2tlbml6ZUJsb2NrKHZhbHVlLCBwb3NpdGlvbik7XG5cbiAgICByZXR1cm4gbm9kZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmb290bm90ZS1kZWZpbml0aW9uIG5vZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgcmVuZGVyRm9vdG5vdGVEZWZpbml0aW9uKCcxJywgJ19mb29fJywgbm93KCkpO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGlmaWVyIC0gVW5pcXVlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIENvbnRlbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gcG9zaXRpb24gLSBEZWZpbml0aW9uIGxvY2F0aW9uLlxuICogQHJldHVybiB7T2JqZWN0fSAtIGBmb290bm90ZURlZmluaXRpb25gIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckZvb3Rub3RlRGVmaW5pdGlvbihpZGVudGlmaWVyLCB2YWx1ZSwgcG9zaXRpb24pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGV4aXRCbG9ja3F1b3RlID0gc2VsZi5lbnRlckJsb2NrcXVvdGUoKTtcbiAgICB2YXIgbm9kZTtcblxuICAgIG5vZGUgPSB7XG4gICAgICAgICd0eXBlJzogVF9GT09UTk9URV9ERUZJTklUSU9OLFxuICAgICAgICAnaWRlbnRpZmllcic6IGlkZW50aWZpZXIsXG4gICAgICAgICdjaGlsZHJlbic6IHNlbGYudG9rZW5pemVCbG9jayh2YWx1ZSwgcG9zaXRpb24pXG4gICAgfTtcblxuICAgIGV4aXRCbG9ja3F1b3RlKCk7XG5cbiAgICByZXR1cm4gbm9kZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBoZWFkaW5nIG5vZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgcmVuZGVySGVhZGluZygnX2Zvb18nLCAxLCBub3coKSk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQ29udGVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCAtIEhlYWRpbmcgZGVwdGguXG4gKiBAcGFyYW0ge09iamVjdH0gcG9zaXRpb24gLSBIZWFkaW5nIGNvbnRlbnQgbG9jYXRpb24uXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gYGhlYWRpbmdgIG5vZGVcbiAqL1xuZnVuY3Rpb24gcmVuZGVySGVhZGluZyh2YWx1ZSwgZGVwdGgsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3R5cGUnOiBUX0hFQURJTkcsXG4gICAgICAgICdkZXB0aCc6IGRlcHRoLFxuICAgICAgICAnY2hpbGRyZW4nOiB0aGlzLnRva2VuaXplSW5saW5lKHZhbHVlLCBwb3NpdGlvbilcbiAgICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJsb2NrcXVvdGUgbm9kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICByZW5kZXJCbG9ja3F1b3RlKCdfZm9vXycsIGVhdCk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQ29udGVudC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBub3cgLSBQb3NpdGlvbi5cbiAqIEByZXR1cm4ge09iamVjdH0gLSBgYmxvY2txdW90ZWAgbm9kZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyQmxvY2txdW90ZSh2YWx1ZSwgbm93KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBleGl0QmxvY2txdW90ZSA9IHNlbGYuZW50ZXJCbG9ja3F1b3RlKCk7XG4gICAgdmFyIG5vZGUgPSB7XG4gICAgICAgICd0eXBlJzogVF9CTE9DS1FVT1RFLFxuICAgICAgICAnY2hpbGRyZW4nOiBzZWxmLnRva2VuaXplQmxvY2sodmFsdWUsIG5vdylcbiAgICB9O1xuXG4gICAgZXhpdEJsb2NrcXVvdGUoKTtcblxuICAgIHJldHVybiBub2RlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHZvaWQgbm9kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICByZW5kZXJWb2lkKCdob3Jpem9udGFsUnVsZScpO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gTm9kZSB0eXBlLlxuICogQHJldHVybiB7T2JqZWN0fSAtIE5vZGUgb2YgdHlwZSBgdHlwZWAuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclZvaWQodHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgICd0eXBlJzogdHlwZVxuICAgIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcGFyZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHJlbmRlclBhcmVudCgncGFyYWdyYXBoJywgJ19mb29fJyk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBOb2RlIHR5cGUuXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSBjaGlsZHJlbiAtIENoaWxkIG5vZGVzLlxuICogQHJldHVybiB7T2JqZWN0fSAtIE5vZGUgb2YgdHlwZSBgdHlwZWAuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclBhcmVudCh0eXBlLCBjaGlsZHJlbikge1xuICAgIHJldHVybiB7XG4gICAgICAgICd0eXBlJzogdHlwZSxcbiAgICAgICAgJ2NoaWxkcmVuJzogY2hpbGRyZW5cbiAgICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHJhdyBub2RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHJlbmRlclJhdygnaW5saW5lQ29kZScsICdmb28oKScpO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gTm9kZSB0eXBlLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQ29udGVudHMuXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gTm9kZSBvZiB0eXBlIGB0eXBlYC5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyUmF3KHR5cGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3R5cGUnOiB0eXBlLFxuICAgICAgICAndmFsdWUnOiB2YWx1ZVxuICAgIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbGluayBub2RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHJlbmRlckxpbmsodHJ1ZSwgJ2V4YW1wbGUuY29tJywgJ2V4YW1wbGUnLCAnRXhhbXBsZSBEb21haW4nLCBub3coKSwgZWF0KTtcbiAqICAgcmVuZGVyTGluayhmYWxzZSwgJ2Zhdi5pY28nLCAnZXhhbXBsZScsICdFeGFtcGxlIERvbWFpbicsIG5vdygpLCBlYXQpO1xuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNMaW5rIC0gV2hldGhlciBsaW5raW5nIHRvIGEgZG9jdW1lbnRcbiAqICAgb3IgYW4gaW1hZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gaHJlZiAtIFVSSSByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIENvbnRlbnQuXG4gKiBAcGFyYW0ge3N0cmluZz99IHRpdGxlIC0gVGl0bGUuXG4gKiBAcGFyYW0ge09iamVjdH0gcG9zaXRpb24gLSBMb2NhdGlvbiBvZiBsaW5rLlxuICogQHJldHVybiB7T2JqZWN0fSAtIGBsaW5rYCBvciBgaW1hZ2VgIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckxpbmsoaXNMaW5rLCBocmVmLCB0ZXh0LCB0aXRsZSwgcG9zaXRpb24pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGV4aXRMaW5rID0gc2VsZi5lbnRlckxpbmsoKTtcbiAgICB2YXIgbm9kZTtcblxuICAgIG5vZGUgPSB7XG4gICAgICAgICd0eXBlJzogaXNMaW5rID8gVF9MSU5LIDogVF9JTUFHRSxcbiAgICAgICAgJ3RpdGxlJzogdGl0bGUgfHwgbnVsbFxuICAgIH07XG5cbiAgICBpZiAoaXNMaW5rKSB7XG4gICAgICAgIG5vZGUuaHJlZiA9IGhyZWY7XG4gICAgICAgIG5vZGUuY2hpbGRyZW4gPSBzZWxmLnRva2VuaXplSW5saW5lKHRleHQsIHBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnNyYyA9IGhyZWY7XG4gICAgICAgIG5vZGUuYWx0ID0gdGV4dCA/XG4gICAgICAgICAgICBzZWxmLmRlY29kZS5yYXcoc2VsZi5kZXNjYXBlKHRleHQpLCBwb3NpdGlvbikgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICB9XG5cbiAgICBleGl0TGluaygpO1xuXG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZm9vdG5vdGUgbm9kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICByZW5kZXJGb290bm90ZSgnX2Zvb18nLCBub3coKSk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQ29udGVudHMuXG4gKiBAcGFyYW0ge09iamVjdH0gcG9zaXRpb24gLSBMb2NhdGlvbiBvZiBmb290bm90ZS5cbiAqIEByZXR1cm4ge09iamVjdH0gLSBgZm9vdG5vdGVgIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckZvb3Rub3RlKHZhbHVlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcklubGluZShUX0ZPT1ROT1RFLCB2YWx1ZSwgcG9zaXRpb24pO1xufVxuXG4vKipcbiAqIEFkZCBhIG5vZGUgd2l0aCBpbmxpbmUgY29udGVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICByZW5kZXJJbmxpbmUoJ3N0cm9uZycsICdfZm9vXycsIG5vdygpKTtcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIE5vZGUgdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIENvbnRlbnRzLlxuICogQHBhcmFtIHtPYmplY3R9IHBvc2l0aW9uIC0gTG9jYXRpb24gb2Ygbm9kZS5cbiAqIEByZXR1cm4ge09iamVjdH0gLSBOb2RlIG9mIHR5cGUgYHR5cGVgLlxuICovXG5mdW5jdGlvbiByZW5kZXJJbmxpbmUodHlwZSwgdmFsdWUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyUGFyZW50KHR5cGUsIHRoaXMudG9rZW5pemVJbmxpbmUodmFsdWUsIHBvc2l0aW9uKSk7XG59XG5cbi8qKlxuICogQWRkIGEgbm9kZSB3aXRoIGJsb2NrIGNvbnRlbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgcmVuZGVyQmxvY2soJ2Jsb2NrcXVvdGUnLCAnRm9vLicsIG5vdygpKTtcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIE5vZGUgdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIENvbnRlbnRzLlxuICogQHBhcmFtIHtPYmplY3R9IHBvc2l0aW9uIC0gTG9jYXRpb24gb2Ygbm9kZS5cbiAqIEByZXR1cm4ge09iamVjdH0gLSBOb2RlIG9mIHR5cGUgYHR5cGVgLlxuICovXG5mdW5jdGlvbiByZW5kZXJCbG9jayh0eXBlLCB2YWx1ZSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJQYXJlbnQodHlwZSwgdGhpcy50b2tlbml6ZUJsb2NrKHZhbHVlLCBwb3NpdGlvbikpO1xufVxuXG4vKipcbiAqIEZpbmQgYSBwb3NzaWJsZSBlc2NhcGUgc2VxdWVuY2UuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgbG9jYXRlRXNjYXBlKCdmb28gXFwtIGJhcicpOyAvLyA0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gc2VhcmNoLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCAtIEluZGV4IHRvIHN0YXJ0IHNlYXJjaGluZyBhdC5cbiAqIEByZXR1cm4ge251bWJlcn0gLSBMb2NhdGlvbiBvZiBwb3NzaWJsZSBlc2NhcGUgc2VxdWVuY2UuXG4gKi9cbmZ1bmN0aW9uIGxvY2F0ZUVzY2FwZSh2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YoQ19CQUNLU0xBU0gsIGZyb21JbmRleCk7XG59XG5cbi8qKlxuICogVG9rZW5pc2UgYW4gZXNjYXBlIHNlcXVlbmNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHRva2VuaXplRXNjYXBlKGVhdCwgJ1xcXFxhJyk7XG4gKlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gbG9jYXRvciAtIEVzY2FwZSBsb2NhdG9yLlxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBlYXQgLSBFYXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlc3Qgb2YgY29udGVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFtzaWxlbnRdIC0gV2hldGhlciB0aGlzIGlzIGEgZHJ5IHJ1bi5cbiAqIEByZXR1cm4ge05vZGU/fGJvb2xlYW59IC0gYHRleHRgIG9yIGBicmVha2Agbm9kZS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVFc2NhcGUoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjaGFyYWN0ZXI7XG5cbiAgICBpZiAodmFsdWUuY2hhckF0KDApID09PSBDX0JBQ0tTTEFTSCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoMSk7XG5cbiAgICAgICAgaWYgKHNlbGYuZXNjYXBlLmluZGV4T2YoY2hhcmFjdGVyKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgICAgICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGVhdChDX0JBQ0tTTEFTSCArIGNoYXJhY3RlcikoXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX05FV0xJTkUgP1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlclZvaWQoVF9CUkVBSykgOlxuICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlclJhdyhUX1RFWFQsIGNoYXJhY3RlcilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnRva2VuaXplRXNjYXBlLmxvY2F0b3IgPSBsb2NhdGVFc2NhcGU7XG5cbi8qKlxuICogRmluZCBhIHBvc3NpYmxlIGF1dG8tbGluay5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBsb2NhdGVBdXRvTGluaygnZm9vIDxiYXInKTsgLy8gNFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggLSBJbmRleCB0byBzdGFydCBzZWFyY2hpbmcgYXQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IC0gTG9jYXRpb24gb2YgcG9zc2libGUgYXV0by1saW5rLlxuICovXG5mdW5jdGlvbiBsb2NhdGVBdXRvTGluayh2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YoQ19MVCwgZnJvbUluZGV4KTtcbn1cblxuLyoqXG4gKiBUb2tlbmlzZSBhIFVSTCBpbiBjYXJldHMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdG9rZW5pemVBdXRvTGluayhlYXQsICc8aHR0cDovL2Zvby5iYXI+Jyk7XG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBub3RJbkxpbmtcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxvY2F0b3IgLSBBdXRvLWxpbmsgbG9jYXRvci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gZWF0IC0gRWF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSZXN0IG9mIGNvbnRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbc2lsZW50XSAtIFdoZXRoZXIgdGhpcyBpcyBhIGRyeSBydW4uXG4gKiBAcmV0dXJuIHtOb2RlP3xib29sZWFufSAtIGBsaW5rYCBub2RlLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUF1dG9MaW5rKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICAgIHZhciBzZWxmO1xuICAgIHZhciBzdWJ2YWx1ZTtcbiAgICB2YXIgbGVuZ3RoO1xuICAgIHZhciBpbmRleDtcbiAgICB2YXIgcXVldWU7XG4gICAgdmFyIGNoYXJhY3RlcjtcbiAgICB2YXIgaGFzQXRDaGFyYWN0ZXI7XG4gICAgdmFyIGxpbms7XG4gICAgdmFyIG5vdztcbiAgICB2YXIgY29udGVudDtcbiAgICB2YXIgdG9rZW5pemU7XG4gICAgdmFyIG5vZGU7XG5cbiAgICBpZiAodmFsdWUuY2hhckF0KDApICE9PSBDX0xUKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmID0gdGhpcztcbiAgICBzdWJ2YWx1ZSA9IEVNUFRZO1xuICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICBpbmRleCA9IDA7XG4gICAgcXVldWUgPSBFTVBUWTtcbiAgICBoYXNBdENoYXJhY3RlciA9IGZhbHNlO1xuICAgIGxpbmsgPSBFTVBUWTtcblxuICAgIGluZGV4Kys7XG4gICAgc3VidmFsdWUgPSBDX0xUO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX1NQQUNFIHx8XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPT09IENfR1QgfHxcbiAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQ19BVF9TSUdOIHx8XG4gICAgICAgICAgICAoY2hhcmFjdGVyID09PSBDX0NPTE9OICYmIHZhbHVlLmNoYXJBdChpbmRleCArIDEpID09PSBDX1NMQVNIKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGlmICghcXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxpbmsgKz0gcXVldWU7XG4gICAgcXVldWUgPSBFTVBUWTtcblxuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG4gICAgbGluayArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IENfQVRfU0lHTikge1xuICAgICAgICBoYXNBdENoYXJhY3RlciA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhcmFjdGVyICE9PSBDX0NPTE9OIHx8XG4gICAgICAgICAgICB2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKSAhPT0gQ19TTEFTSFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmsgKz0gQ19TTEFTSDtcbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX1NQQUNFIHx8IGNoYXJhY3RlciA9PT0gQ19HVCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmICghcXVldWUgfHwgY2hhcmFjdGVyICE9PSBDX0dUKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgaWYgKHNpbGVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsaW5rICs9IHF1ZXVlO1xuICAgIGNvbnRlbnQgPSBsaW5rO1xuICAgIHN1YnZhbHVlICs9IGxpbmsgKyBjaGFyYWN0ZXI7XG4gICAgbm93ID0gZWF0Lm5vdygpO1xuICAgIG5vdy5jb2x1bW4rKztcblxuICAgIGlmIChoYXNBdENoYXJhY3Rlcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsaW5rLnN1YnN0cigwLCBNQUlMVE9fUFJPVE9DT0wubGVuZ3RoKS50b0xvd2VyQ2FzZSgpICE9PVxuICAgICAgICAgICAgTUFJTFRPX1BST1RPQ09MXG4gICAgICAgICkge1xuICAgICAgICAgICAgbGluayA9IE1BSUxUT19QUk9UT0NPTCArIGxpbms7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zdWJzdHIoTUFJTFRPX1BST1RPQ09MLmxlbmd0aCk7XG4gICAgICAgICAgICBub3cuY29sdW1uICs9IE1BSUxUT19QUk9UT0NPTC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFRlbXBvcmFyaWx5IHJlbW92ZSBzdXBwb3J0IGZvciBlc2NhcGVzIGluIGF1dG9saW5rcy5cbiAgICAgKi9cblxuICAgIHRva2VuaXplID0gc2VsZi5pbmxpbmVUb2tlbml6ZXJzLmVzY2FwZTtcbiAgICBzZWxmLmlubGluZVRva2VuaXplcnMuZXNjYXBlID0gbnVsbDtcblxuICAgIG5vZGUgPSBlYXQoc3VidmFsdWUpKFxuICAgICAgICBzZWxmLnJlbmRlckxpbmsodHJ1ZSwgZGVjb2RlKGxpbmspLCBjb250ZW50LCBudWxsLCBub3csIGVhdClcbiAgICApO1xuXG4gICAgc2VsZi5pbmxpbmVUb2tlbml6ZXJzLmVzY2FwZSA9IHRva2VuaXplO1xuXG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbnRva2VuaXplQXV0b0xpbmsubm90SW5MaW5rID0gdHJ1ZTtcbnRva2VuaXplQXV0b0xpbmsubG9jYXRvciA9IGxvY2F0ZUF1dG9MaW5rO1xuXG4vKipcbiAqIEZpbmQgYSBwb3NzaWJsZSBVUkwuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgbG9jYXRlVVJMKCdmb28gaHR0cDovL2JhcicpOyAvLyA0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gc2VhcmNoLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCAtIEluZGV4IHRvIHN0YXJ0IHNlYXJjaGluZyBhdC5cbiAqIEByZXR1cm4ge251bWJlcn0gLSBMb2NhdGlvbiBvZiBwb3NzaWJsZSBVUkwuXG4gKi9cbmZ1bmN0aW9uIGxvY2F0ZVVSTCh2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIG1pbiA9IC0xO1xuICAgIHZhciBwb3NpdGlvbjtcblxuICAgIGlmICghdGhpcy5vcHRpb25zLmdmbSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBQUk9UT0NPTFNfTEVOR1RIKSB7XG4gICAgICAgIHBvc2l0aW9uID0gdmFsdWUuaW5kZXhPZihQUk9UT0NPTFNbaW5kZXhdLCBmcm9tSW5kZXgpO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gLTEgJiYgKHBvc2l0aW9uIDwgbWluIHx8IG1pbiA9PT0gLTEpKSB7XG4gICAgICAgICAgICBtaW4gPSBwb3NpdGlvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtaW47XG59XG5cbi8qKlxuICogVG9rZW5pc2UgYSBVUkwgaW4gdGV4dC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZVVSTChlYXQsICdodHRwOi8vZm9vLmJhcicpO1xuICpcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbm90SW5MaW5rXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBsb2NhdG9yIC0gVVJMIGxvY2F0b3IuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyl9IGVhdCAtIEVhdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gUmVzdCBvZiBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFuP30gW3NpbGVudF0gLSBXaGV0aGVyIHRoaXMgaXMgYSBkcnkgcnVuLlxuICogQHJldHVybiB7Tm9kZT98Ym9vbGVhbn0gLSBgbGlua2Agbm9kZS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVVUkwoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzdWJ2YWx1ZTtcbiAgICB2YXIgY29udGVudDtcbiAgICB2YXIgY2hhcmFjdGVyO1xuICAgIHZhciBpbmRleDtcbiAgICB2YXIgcG9zaXRpb247XG4gICAgdmFyIHByb3RvY29sO1xuICAgIHZhciBtYXRjaDtcbiAgICB2YXIgbGVuZ3RoO1xuICAgIHZhciBxdWV1ZTtcbiAgICB2YXIgcGFyZW5Db3VudDtcbiAgICB2YXIgbmV4dENoYXJhY3RlcjtcbiAgICB2YXIgbm93O1xuXG4gICAgaWYgKCFzZWxmLm9wdGlvbnMuZ2ZtKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWJ2YWx1ZSA9IEVNUFRZO1xuICAgIGluZGV4ID0gLTE7XG4gICAgbGVuZ3RoID0gUFJPVE9DT0xTX0xFTkdUSDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHByb3RvY29sID0gUFJPVE9DT0xTW2luZGV4XTtcbiAgICAgICAgbWF0Y2ggPSB2YWx1ZS5zbGljZSgwLCBwcm90b2NvbC5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChtYXRjaC50b0xvd2VyQ2FzZSgpID09PSBwcm90b2NvbCkge1xuICAgICAgICAgICAgc3VidmFsdWUgPSBtYXRjaDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzdWJ2YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5kZXggPSBzdWJ2YWx1ZS5sZW5ndGg7XG4gICAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgcGFyZW5Db3VudCA9IDA7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoaXNXaGl0ZVNwYWNlKGNoYXJhY3RlcikgfHwgY2hhcmFjdGVyID09PSBDX0xUKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQ19ET1QgfHxcbiAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQ19DT01NQSB8fFxuICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX0NPTE9OIHx8XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPT09IENfU0VNSV9DT0xPTiB8fFxuICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX0RPVUJMRV9RVU9URSB8fFxuICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX1NJTkdMRV9RVU9URSB8fFxuICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX1BBUkVOX0NMT1NFIHx8XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPT09IENfQlJBQ0tFVF9DTE9TRVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG5leHRDaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFuZXh0Q2hhcmFjdGVyIHx8XG4gICAgICAgICAgICAgICAgaXNXaGl0ZVNwYWNlKG5leHRDaGFyYWN0ZXIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQ19QQVJFTl9PUEVOIHx8XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPT09IENfQlJBQ0tFVF9PUEVOXG4gICAgICAgICkge1xuICAgICAgICAgICAgcGFyZW5Db3VudCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX1BBUkVOX0NMT1NFIHx8XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPT09IENfQlJBQ0tFVF9DTE9TRVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHBhcmVuQ291bnQtLTtcblxuICAgICAgICAgICAgaWYgKHBhcmVuQ291bnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKCFxdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gcXVldWU7XG4gICAgY29udGVudCA9IHN1YnZhbHVlO1xuXG4gICAgaWYgKHByb3RvY29sID09PSBNQUlMVE9fUFJPVE9DT0wpIHtcbiAgICAgICAgcG9zaXRpb24gPSBxdWV1ZS5pbmRleE9mKENfQVRfU0lHTik7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAtMSB8fCBwb3NpdGlvbiA9PT0gbGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc3Vic3RyKE1BSUxUT19QUk9UT0NPTC5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG5vdyA9IGVhdC5ub3coKTtcblxuICAgIHJldHVybiBlYXQoc3VidmFsdWUpKFxuICAgICAgICBzZWxmLnJlbmRlckxpbmsodHJ1ZSwgZGVjb2RlKHN1YnZhbHVlKSwgY29udGVudCwgbnVsbCwgbm93LCBlYXQpXG4gICAgKTtcbn1cblxudG9rZW5pemVVUkwubm90SW5MaW5rID0gdHJ1ZTtcbnRva2VuaXplVVJMLmxvY2F0b3IgPSBsb2NhdGVVUkw7XG5cbi8qKlxuICogRmluZCBhIHBvc3NpYmxlIHRhZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBsb2NhdGVUYWcoJ2ZvbyA8YmFyJyk7IC8vIDRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBzZWFyY2guXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IC0gSW5kZXggdG8gc3RhcnQgc2VhcmNoaW5nIGF0LlxuICogQHJldHVybiB7bnVtYmVyfSAtIExvY2F0aW9uIG9mIHBvc3NpYmxlIHRhZy5cbiAqL1xuZnVuY3Rpb24gbG9jYXRlVGFnKHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihDX0xULCBmcm9tSW5kZXgpO1xufVxuXG4vKipcbiAqIFRva2VuaXNlIGFuIEhUTUwgdGFnLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHRva2VuaXplVGFnKGVhdCwgJzxzcGFuIGZvbz1cImJhclwiPicpO1xuICpcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxvY2F0b3IgLSBUYWcgbG9jYXRvci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gZWF0IC0gRWF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSZXN0IG9mIGNvbnRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbc2lsZW50XSAtIFdoZXRoZXIgdGhpcyBpcyBhIGRyeSBydW4uXG4gKiBAcmV0dXJuIHtOb2RlP3xib29sZWFufSAtIGBodG1sYCBub2RlLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZVRhZyhlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHN1YnZhbHVlID0gZWF0SFRNTENvbW1lbnQodmFsdWUsIHNlbGYub3B0aW9ucykgfHxcbiAgICAgICAgZWF0SFRNTENEQVRBKHZhbHVlKSB8fFxuICAgICAgICBlYXRIVE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uKHZhbHVlKSB8fFxuICAgICAgICBlYXRIVE1MRGVjbGFyYXRpb24odmFsdWUpIHx8XG4gICAgICAgIGVhdEhUTUxDbG9zaW5nVGFnKHZhbHVlKSB8fFxuICAgICAgICBlYXRIVE1MT3BlbmluZ1RhZyh2YWx1ZSk7XG5cbiAgICBpZiAoIXN1YnZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgaWYgKHNpbGVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXNlbGYuaW5MaW5rICYmIEVYUFJFU1NJT05fSFRNTF9MSU5LX09QRU4udGVzdChzdWJ2YWx1ZSkpIHtcbiAgICAgICAgc2VsZi5pbkxpbmsgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoc2VsZi5pbkxpbmsgJiYgRVhQUkVTU0lPTl9IVE1MX0xJTktfQ0xPU0UudGVzdChzdWJ2YWx1ZSkpIHtcbiAgICAgICAgc2VsZi5pbkxpbmsgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWF0KHN1YnZhbHVlKShzZWxmLnJlbmRlclJhdyhUX0hUTUwsIHN1YnZhbHVlKSk7XG59XG5cbnRva2VuaXplVGFnLmxvY2F0b3IgPSBsb2NhdGVUYWc7XG5cbi8qKlxuICogRmluZCBhIHBvc3NpYmxlIGxpbmsuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgbG9jYXRlTGluaygnZm9vICFbYmFyJyk7IC8vIDRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBzZWFyY2guXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IC0gSW5kZXggdG8gc3RhcnQgc2VhcmNoaW5nIGF0LlxuICogQHJldHVybiB7bnVtYmVyfSAtIExvY2F0aW9uIG9mIHBvc3NpYmxlIGxpbmsuXG4gKi9cbmZ1bmN0aW9uIGxvY2F0ZUxpbmsodmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBsaW5rID0gdmFsdWUuaW5kZXhPZihDX0JSQUNLRVRfT1BFTiwgZnJvbUluZGV4KTtcbiAgICB2YXIgaW1hZ2UgPSB2YWx1ZS5pbmRleE9mKENfRVhDTEFNQVRJT05fTUFSSyArIENfQlJBQ0tFVF9PUEVOLCBmcm9tSW5kZXgpO1xuXG4gICAgaWYgKGltYWdlID09PSAtMSkge1xuICAgICAgICByZXR1cm4gbGluaztcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIExpbmsgY2FuIG5ldmVyIGJlIGAtMWAgaWYgYW4gaW1hZ2UgaXMgZm91bmQsIHNvIHdlIGRvbuKAmXQgbmVlZCB0b1xuICAgICAqIGNoZWNrIGZvciB0aGF0IDopXG4gICAgICovXG5cbiAgICByZXR1cm4gbGluayA8IGltYWdlID8gbGluayA6IGltYWdlO1xufVxuXG4vKipcbiAqIFRva2VuaXNlIGEgbGluay5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZUxpbmsoZWF0LCAnIVtmb29dKGZhdi5pY28gXCJGYXZpY29uXCIpKTtcbiAqXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBsb2NhdG9yIC0gTGluayBsb2NhdG9yLlxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBlYXQgLSBFYXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlc3Qgb2YgY29udGVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFtzaWxlbnRdIC0gV2hldGhlciB0aGlzIGlzIGEgZHJ5IHJ1bi5cbiAqIEByZXR1cm4ge05vZGU/fGJvb2xlYW59IC0gYGxpbmtgIG9yIGBpbWFnZWAgbm9kZS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVMaW5rKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgc3VidmFsdWUgPSBFTVBUWTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoMCk7XG4gICAgdmFyIGJlZm9yZVVSTDtcbiAgICB2YXIgYmVmb3JlVGl0bGU7XG4gICAgdmFyIHdoaXRlU3BhY2VRdWV1ZTtcbiAgICB2YXIgY29tbW9ubWFyaztcbiAgICB2YXIgb3BlbkNvdW50O1xuICAgIHZhciBoYXNNYXJrZXI7XG4gICAgdmFyIG1hcmtlcnM7XG4gICAgdmFyIGlzSW1hZ2U7XG4gICAgdmFyIGNvbnRlbnQ7XG4gICAgdmFyIG1hcmtlcjtcbiAgICB2YXIgbGVuZ3RoO1xuICAgIHZhciB0aXRsZTtcbiAgICB2YXIgZGVwdGg7XG4gICAgdmFyIHF1ZXVlO1xuICAgIHZhciB1cmw7XG4gICAgdmFyIG5vdztcblxuICAgIC8qXG4gICAgICogRGV0ZWN0IHdoZXRoZXIgdGhpcyBpcyBhbiBpbWFnZS5cbiAgICAgKi9cblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IENfRVhDTEFNQVRJT05fTUFSSykge1xuICAgICAgICBpc0ltYWdlID0gdHJ1ZTtcbiAgICAgICAgc3VidmFsdWUgPSBjaGFyYWN0ZXI7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEVhdCB0aGUgb3BlbmluZy5cbiAgICAgKi9cblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfQlJBQ0tFVF9PUEVOKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEV4aXQgd2hlbiB0aGlzIGlzIGEgbGluayBhbmQgd2XigJlyZSBhbHJlYWR5IGluc2lkZVxuICAgICAqIGEgbGluay5cbiAgICAgKi9cblxuICAgIGlmICghaXNJbWFnZSAmJiBzZWxmLmluTGluaykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgaW5kZXgrKztcblxuICAgIC8qXG4gICAgICogRWF0IHRoZSBjb250ZW50LlxuICAgICAqL1xuXG4gICAgY29tbW9ubWFyayA9IHNlbGYub3B0aW9ucy5jb21tb25tYXJrO1xuICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICBub3cgPSBlYXQubm93KCk7XG4gICAgZGVwdGggPSAwO1xuXG4gICAgbm93LmNvbHVtbiArPSBpbmRleDtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfQlJBQ0tFVF9PUEVOKSB7XG4gICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogQWxsb3cgYSBzaW5nbGUgY2xvc2luZyBicmFja2V0IHdoZW4gbm90IGluXG4gICAgICAgICAgICAgKiBjb21tb25tYXJrLW1vZGUuXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKCFjb21tb25tYXJrICYmICFkZXB0aCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKSA9PT0gQ19QQVJFTl9PUEVOKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogRWF0IHRoZSBjb250ZW50IGNsb3NpbmcuXG4gICAgICovXG5cbiAgICBpZiAoXG4gICAgICAgIHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfQlJBQ0tFVF9DTE9TRSB8fFxuICAgICAgICB2YWx1ZS5jaGFyQXQoKytpbmRleCkgIT09IENfUEFSRU5fT1BFTlxuICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gcXVldWUgKyBDX0JSQUNLRVRfQ0xPU0UgKyBDX1BBUkVOX09QRU47XG4gICAgaW5kZXgrKztcbiAgICBjb250ZW50ID0gcXVldWU7XG5cbiAgICAvKlxuICAgICAqIEVhdCB3aGl0ZS1zcGFjZS5cbiAgICAgKi9cblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogRWF0IHRoZSBVUkwuXG4gICAgICovXG5cbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIG1hcmtlcnMgPSBjb21tb25tYXJrID8gQ09NTU9OTUFSS19MSU5LX1RJVExFX01BUktFUlMgOiBMSU5LX1RJVExFX01BUktFUlM7XG4gICAgb3BlbkNvdW50ID0gMDtcbiAgICBxdWV1ZSA9IEVNUFRZO1xuICAgIGJlZm9yZVVSTCA9IHN1YnZhbHVlO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19MVCkge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBiZWZvcmVVUkwgKz0gQ19MVDtcblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfR1QpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbW1vbm1hcmsgJiYgY2hhcmFjdGVyID09PSBDX05FV0xJTkUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUuY2hhckF0KGluZGV4KSAhPT0gQ19HVCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VidmFsdWUgKz0gQ19MVCArIHF1ZXVlICsgQ19HVDtcbiAgICAgICAgdXJsID0gcXVldWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY2hhcmFjdGVyID0gbnVsbDtcbiAgICAgICAgd2hpdGVTcGFjZVF1ZXVlID0gRU1QVFk7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAod2hpdGVTcGFjZVF1ZXVlICYmIGhhcy5jYWxsKG1hcmtlcnMsIGNoYXJhY3RlcikpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzV2hpdGVTcGFjZShjaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1vbm1hcmspIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgd2hpdGVTcGFjZVF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19QQVJFTl9PUEVOKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgICAgICAgICAgICAgIG9wZW5Db3VudCsrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1BBUkVOX0NMT1NFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHF1ZXVlICs9IHdoaXRlU3BhY2VRdWV1ZTtcbiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlUXVldWUgPSBFTVBUWTtcblxuICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfQkFDS1NMQVNIKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlICs9IENfQkFDS1NMQVNIO1xuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgPSBxdWV1ZTtcbiAgICAgICAgc3VidmFsdWUgKz0gcXVldWU7XG4gICAgICAgIHVybCA9IHF1ZXVlO1xuICAgICAgICBpbmRleCA9IHN1YnZhbHVlLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEVhdCB3aGl0ZS1zcGFjZS5cbiAgICAgKi9cblxuICAgIHF1ZXVlID0gRU1QVFk7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoIWlzV2hpdGVTcGFjZShjaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIHN1YnZhbHVlICs9IHF1ZXVlO1xuXG4gICAgLypcbiAgICAgKiBFYXQgdGhlIHRpdGxlLlxuICAgICAqL1xuXG4gICAgaWYgKHF1ZXVlICYmIGhhcy5jYWxsKG1hcmtlcnMsIGNoYXJhY3RlcikpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICBxdWV1ZSA9IEVNUFRZO1xuICAgICAgICBtYXJrZXIgPSBtYXJrZXJzW2NoYXJhY3Rlcl07XG4gICAgICAgIGJlZm9yZVRpdGxlID0gc3VidmFsdWU7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogSW4gY29tbW9ubWFyay1tb2RlLCB0aGluZ3MgYXJlIHByZXR0eSBlYXN5OiB0aGVcbiAgICAgICAgICogbWFya2VyIGNhbm5vdCBvY2N1ciBpbnNpZGUgdGhlIHRpdGxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOb24tY29tbW9ubWFyayBkb2VzLCBob3dldmVyLCBzdXBwb3J0IG5lc3RlZFxuICAgICAgICAgKiBkZWxpbWl0ZXJzLlxuICAgICAgICAgKi9cblxuICAgICAgICBpZiAoY29tbW9ubWFyaykge1xuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IG1hcmtlcikge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JBQ0tTTEFTSCkge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZSArPSBDX0JBQ0tTTEFTSDtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBtYXJrZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRpdGxlID0gcXVldWU7XG4gICAgICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzV2hpdGVTcGFjZShjaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2hpdGVTcGFjZVF1ZXVlID0gRU1QVFk7XG5cbiAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBtYXJrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc01hcmtlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUgKz0gbWFya2VyICsgd2hpdGVTcGFjZVF1ZXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVTcGFjZVF1ZXVlID0gRU1QVFk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBoYXNNYXJrZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc01hcmtlcikge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfUEFSRU5fQ0xPU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VidmFsdWUgKz0gcXVldWUgKyBtYXJrZXIgKyB3aGl0ZVNwYWNlUXVldWU7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gcXVldWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZVNwYWNlKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpdGVTcGFjZVF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZSArPSBtYXJrZXIgKyB3aGl0ZVNwYWNlUXVldWUgKyBjaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgICAgIHdoaXRlU3BhY2VRdWV1ZSA9IEVNUFRZO1xuICAgICAgICAgICAgICAgICAgICBoYXNNYXJrZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfUEFSRU5fQ0xPU0UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IENfUEFSRU5fQ0xPU0U7XG5cbiAgICB1cmwgPSBzZWxmLmRlY29kZS5yYXcoc2VsZi5kZXNjYXBlKHVybCksIGVhdChiZWZvcmVVUkwpLnRlc3QoKS5lbmQpO1xuXG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICAgIGJlZm9yZVRpdGxlID0gZWF0KGJlZm9yZVRpdGxlKS50ZXN0KCkuZW5kO1xuICAgICAgICB0aXRsZSA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLmRlc2NhcGUodGl0bGUpLCBiZWZvcmVUaXRsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoXG4gICAgICAgIHNlbGYucmVuZGVyTGluayghaXNJbWFnZSwgdXJsLCBjb250ZW50LCB0aXRsZSwgbm93LCBlYXQpXG4gICAgKTtcbn1cblxudG9rZW5pemVMaW5rLmxvY2F0b3IgPSBsb2NhdGVMaW5rO1xuXG4vKipcbiAqIFRva2VuaXNlIGEgcmVmZXJlbmNlIGxpbmssIGltYWdlLCBvciBmb290bm90ZTtcbiAqIHNob3J0Y3V0IHJlZmVyZW5jZSBsaW5rLCBvciBmb290bm90ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZVJlZmVyZW5jZShlYXQsICdbZm9vXScpO1xuICogICB0b2tlbml6ZVJlZmVyZW5jZShlYXQsICdbZm9vXVtdJyk7XG4gKiAgIHRva2VuaXplUmVmZXJlbmNlKGVhdCwgJ1tmb29dW2Jhcl0nKTtcbiAqXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBsb2NhdG9yIC0gUmVmZXJlbmNlIGxvY2F0b3IuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyl9IGVhdCAtIEVhdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gUmVzdCBvZiBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFuP30gW3NpbGVudF0gLSBXaGV0aGVyIHRoaXMgaXMgYSBkcnkgcnVuLlxuICogQHJldHVybiB7Tm9kZT98Ym9vbGVhbn0gLSBSZWZlcmVuY2Ugbm9kZS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVSZWZlcmVuY2UoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoMCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgIHZhciBzdWJ2YWx1ZSA9IEVNUFRZO1xuICAgIHZhciBpbnRybyA9IEVNUFRZO1xuICAgIHZhciB0eXBlID0gVF9MSU5LO1xuICAgIHZhciByZWZlcmVuY2VUeXBlID0gUkVGRVJFTkNFX1RZUEVfU0hPUlRDVVQ7XG4gICAgdmFyIHRleHQ7XG4gICAgdmFyIGlkZW50aWZpZXI7XG4gICAgdmFyIG5vdztcbiAgICB2YXIgbm9kZTtcbiAgICB2YXIgZXhpdExpbms7XG4gICAgdmFyIHF1ZXVlO1xuICAgIHZhciBicmFja2V0ZWQ7XG4gICAgdmFyIGRlcHRoO1xuXG4gICAgLypcbiAgICAgKiBDaGVjayB3aGV0aGVyIHdl4oCZcmUgZWF0aW5nIGFuIGltYWdlLlxuICAgICAqL1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19FWENMQU1BVElPTl9NQVJLKSB7XG4gICAgICAgIHR5cGUgPSBUX0lNQUdFO1xuICAgICAgICBpbnRybyA9IGNoYXJhY3RlcjtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuICAgIH1cblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfQlJBQ0tFVF9PUEVOKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbmRleCsrO1xuICAgIGludHJvICs9IGNoYXJhY3RlcjtcbiAgICBxdWV1ZSA9IEVNUFRZO1xuXG4gICAgLypcbiAgICAgKiBDaGVjayB3aGV0aGVyIHdl4oCZcmUgZWF0aW5nIGEgZm9vdG5vdGUuXG4gICAgICovXG5cbiAgICBpZiAoXG4gICAgICAgIHNlbGYub3B0aW9ucy5mb290bm90ZXMgJiZcbiAgICAgICAgdHlwZSA9PT0gVF9MSU5LICYmXG4gICAgICAgIHZhbHVlLmNoYXJBdChpbmRleCkgPT09IENfQ0FSRVRcbiAgICApIHtcbiAgICAgICAgaW50cm8gKz0gQ19DQVJFVDtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgdHlwZSA9IFRfRk9PVE5PVEU7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBFYXQgdGhlIHRleHQuXG4gICAgICovXG5cbiAgICBkZXB0aCA9IDA7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfT1BFTikge1xuICAgICAgICAgICAgYnJhY2tldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfQ0xPU0UpIHtcbiAgICAgICAgICAgIGlmICghZGVwdGgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfQkFDS1NMQVNIKSB7XG4gICAgICAgICAgICBxdWV1ZSArPSBDX0JBQ0tTTEFTSDtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBzdWJ2YWx1ZSA9IHRleHQgPSBxdWV1ZTtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciAhPT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbmRleCsrO1xuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICBxdWV1ZSA9IEVNUFRZO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKCFpc1doaXRlU3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfQlJBQ0tFVF9PUEVOKSB7XG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWRlbnRpZmllciA9IHRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWRlbnRpZmllciA9IEVNUFRZO1xuICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfT1BFTiB8fFxuICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX0NMT1NFXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CQUNLU0xBU0gpIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyICs9IENfQkFDS1NMQVNIO1xuICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWRlbnRpZmllciArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfQ0xPU0UpIHtcbiAgICAgICAgICAgIHF1ZXVlICs9IGlkZW50aWZpZXIgKyBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuXG4gICAgICAgICAgICByZWZlcmVuY2VUeXBlID0gaWRlbnRpZmllciA/XG4gICAgICAgICAgICAgICAgUkVGRVJFTkNFX1RZUEVfRlVMTCA6XG4gICAgICAgICAgICAgICAgUkVGRVJFTkNFX1RZUEVfQ09MTEFQU0VEO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRlbnRpZmllciA9IEVNUFRZO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VidmFsdWUgKz0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBCcmFja2V0cyBjYW5ub3QgYmUgaW5zaWRlIHRoZSBpZGVudGlmaWVyLlxuICAgICAqL1xuXG4gICAgaWYgKHJlZmVyZW5jZVR5cGUgIT09IFJFRkVSRU5DRV9UWVBFX0ZVTEwgJiYgYnJhY2tldGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIElubGluZSBmb290bm90ZXMgY2Fubm90IGhhdmUgYW4gaWRlbnRpZmllci5cbiAgICAgKi9cblxuICAgIGlmICh0eXBlID09PSBUX0ZPT1ROT1RFICYmIHJlZmVyZW5jZVR5cGUgIT09IFJFRkVSRU5DRV9UWVBFX1NIT1JUQ1VUKSB7XG4gICAgICAgIHR5cGUgPSBUX0xJTks7XG4gICAgICAgIGludHJvID0gQ19CUkFDS0VUX09QRU4gKyBDX0NBUkVUO1xuICAgICAgICB0ZXh0ID0gQ19DQVJFVCArIHRleHQ7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgPSBpbnRybyArIHN1YnZhbHVlO1xuXG4gICAgaWYgKHR5cGUgPT09IFRfTElOSyAmJiBzZWxmLmluTGluaykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgaWYgKHNpbGVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gVF9GT09UTk9URSAmJiB0ZXh0LmluZGV4T2YoQ19TUEFDRSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBlYXQoc3VidmFsdWUpKHNlbGYucmVuZGVyRm9vdG5vdGUodGV4dCwgZWF0Lm5vdygpKSk7XG4gICAgfVxuXG4gICAgbm93ID0gZWF0Lm5vdygpO1xuICAgIG5vdy5jb2x1bW4gKz0gaW50cm8ubGVuZ3RoO1xuICAgIGlkZW50aWZpZXIgPSByZWZlcmVuY2VUeXBlID09PSBSRUZFUkVOQ0VfVFlQRV9GVUxMID8gaWRlbnRpZmllciA6IHRleHQ7XG5cbiAgICBub2RlID0ge1xuICAgICAgICAndHlwZSc6IHR5cGUgKyAnUmVmZXJlbmNlJyxcbiAgICAgICAgJ2lkZW50aWZpZXInOiBub3JtYWxpemUoaWRlbnRpZmllcilcbiAgICB9O1xuXG4gICAgaWYgKHR5cGUgPT09IFRfTElOSyB8fCB0eXBlID09PSBUX0lNQUdFKSB7XG4gICAgICAgIG5vZGUucmVmZXJlbmNlVHlwZSA9IHJlZmVyZW5jZVR5cGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFRfTElOSykge1xuICAgICAgICBleGl0TGluayA9IHNlbGYuZW50ZXJMaW5rKCk7XG4gICAgICAgIG5vZGUuY2hpbGRyZW4gPSBzZWxmLnRva2VuaXplSW5saW5lKHRleHQsIG5vdyk7XG4gICAgICAgIGV4aXRMaW5rKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBUX0lNQUdFKSB7XG4gICAgICAgIG5vZGUuYWx0ID0gc2VsZi5kZWNvZGUucmF3KHNlbGYuZGVzY2FwZSh0ZXh0KSwgbm93KSB8fCBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBlYXQoc3VidmFsdWUpKG5vZGUpO1xufVxuXG50b2tlbml6ZVJlZmVyZW5jZS5sb2NhdG9yID0gbG9jYXRlTGluaztcblxuLyoqXG4gKiBGaW5kIGEgcG9zc2libGUgc3Ryb25nIGVtcGhhc2lzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGxvY2F0ZVN0cm9uZygnZm9vICoqYmFyJyk7IC8vIDRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBzZWFyY2guXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IC0gSW5kZXggdG8gc3RhcnQgc2VhcmNoaW5nIGF0LlxuICogQHJldHVybiB7bnVtYmVyfSAtIExvY2F0aW9uIG9mIHBvc3NpYmxlIHN0cm9uZyBlbXBoYXNpcy5cbiAqL1xuZnVuY3Rpb24gbG9jYXRlU3Ryb25nKHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgYXN0ZXJpc2sgPSB2YWx1ZS5pbmRleE9mKENfQVNURVJJU0sgKyBDX0FTVEVSSVNLLCBmcm9tSW5kZXgpO1xuICAgIHZhciB1bmRlcnNjb3JlID0gdmFsdWUuaW5kZXhPZihDX1VOREVSU0NPUkUgKyBDX1VOREVSU0NPUkUsIGZyb21JbmRleCk7XG5cbiAgICBpZiAodW5kZXJzY29yZSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGFzdGVyaXNrO1xuICAgIH1cblxuICAgIGlmIChhc3RlcmlzayA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVyc2NvcmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVyc2NvcmUgPCBhc3RlcmlzayA/IHVuZGVyc2NvcmUgOiBhc3Rlcmlzaztcbn1cblxuLyoqXG4gKiBUb2tlbmlzZSBzdHJvbmcgZW1waGFzaXMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdG9rZW5pemVTdHJvbmcoZWF0LCAnKipmb28qKicpO1xuICogICB0b2tlbml6ZVN0cm9uZyhlYXQsICdfX2Zvb19fJyk7XG4gKlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gbG9jYXRvciAtIFN0cm9uZyBlbXBoYXNpcyBsb2NhdG9yLlxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBlYXQgLSBFYXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlc3Qgb2YgY29udGVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFtzaWxlbnRdIC0gV2hldGhlciB0aGlzIGlzIGEgZHJ5IHJ1bi5cbiAqIEByZXR1cm4ge05vZGU/fGJvb2xlYW59IC0gYHN0cm9uZ2Agbm9kZS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVTdHJvbmcoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG4gICAgdmFyIG5vdztcbiAgICB2YXIgcGVkYW50aWM7XG4gICAgdmFyIG1hcmtlcjtcbiAgICB2YXIgcXVldWU7XG4gICAgdmFyIHN1YnZhbHVlO1xuICAgIHZhciBsZW5ndGg7XG4gICAgdmFyIHByZXY7XG5cbiAgICBpZiAoXG4gICAgICAgIEVNUEhBU0lTX01BUktFUlNbY2hhcmFjdGVyXSAhPT0gdHJ1ZSB8fFxuICAgICAgICB2YWx1ZS5jaGFyQXQoKytpbmRleCkgIT09IGNoYXJhY3RlclxuICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGVkYW50aWMgPSBzZWxmLm9wdGlvbnMucGVkYW50aWM7XG4gICAgbWFya2VyID0gY2hhcmFjdGVyO1xuICAgIHN1YnZhbHVlID0gbWFya2VyICsgbWFya2VyO1xuICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICBpbmRleCsrO1xuICAgIHF1ZXVlID0gY2hhcmFjdGVyID0gRU1QVFk7XG5cbiAgICBpZiAocGVkYW50aWMgJiYgaXNXaGl0ZVNwYWNlKHZhbHVlLmNoYXJBdChpbmRleCkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcHJldiA9IGNoYXJhY3RlcjtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGFyYWN0ZXIgPT09IG1hcmtlciAmJlxuICAgICAgICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IG1hcmtlciAmJlxuICAgICAgICAgICAgKCFwZWRhbnRpYyB8fCAhaXNXaGl0ZVNwYWNlKHByZXYpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCArIDIpO1xuXG4gICAgICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBtYXJrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRyaW0ocXVldWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgICAgICAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBub3cgPSBlYXQubm93KCk7XG4gICAgICAgICAgICAgICAgbm93LmNvbHVtbiArPSAyO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSArIHF1ZXVlICsgc3VidmFsdWUpKFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlcklubGluZShUX1NUUk9ORywgcXVldWUsIG5vdylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwZWRhbnRpYyAmJiBjaGFyYWN0ZXIgPT09IENfQkFDS1NMQVNIKSB7XG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgfVxufVxuXG50b2tlbml6ZVN0cm9uZy5sb2NhdG9yID0gbG9jYXRlU3Ryb25nO1xuXG4vKipcbiAqIEZpbmQgcG9zc2libGUgc2xpZ2h0IGVtcGhhc2lzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGxvY2F0ZUVtcGhhc2lzKCdmb28gKmJhcicpOyAvLyA0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gc2VhcmNoLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCAtIEluZGV4IHRvIHN0YXJ0IHNlYXJjaGluZyBhdC5cbiAqIEByZXR1cm4ge251bWJlcn0gLSBMb2NhdGlvbiBvZiBwb3NzaWJsZSBzbGlnaHQgZW1waGFzaXMuXG4gKi9cbmZ1bmN0aW9uIGxvY2F0ZUVtcGhhc2lzKHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgYXN0ZXJpc2sgPSB2YWx1ZS5pbmRleE9mKENfQVNURVJJU0ssIGZyb21JbmRleCk7XG4gICAgdmFyIHVuZGVyc2NvcmUgPSB2YWx1ZS5pbmRleE9mKENfVU5ERVJTQ09SRSwgZnJvbUluZGV4KTtcblxuICAgIGlmICh1bmRlcnNjb3JlID09PSAtMSkge1xuICAgICAgICByZXR1cm4gYXN0ZXJpc2s7XG4gICAgfVxuXG4gICAgaWYgKGFzdGVyaXNrID09PSAtMSkge1xuICAgICAgICByZXR1cm4gdW5kZXJzY29yZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZXJzY29yZSA8IGFzdGVyaXNrID8gdW5kZXJzY29yZSA6IGFzdGVyaXNrO1xufVxuXG4vKipcbiAqIFRva2VuaXNlIHNsaWdodCBlbXBoYXNpcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZUVtcGhhc2lzKGVhdCwgJypmb28qJyk7XG4gKiAgIHRva2VuaXplRW1waGFzaXMoZWF0LCAnX2Zvb18nKTtcbiAqXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBsb2NhdG9yIC0gU2xpZ2h0IGVtcGhhc2lzIGxvY2F0b3IuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyl9IGVhdCAtIEVhdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gUmVzdCBvZiBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFuP30gW3NpbGVudF0gLSBXaGV0aGVyIHRoaXMgaXMgYSBkcnkgcnVuLlxuICogQHJldHVybiB7Tm9kZT98Ym9vbGVhbn0gLSBgZW1waGFzaXNgIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplRW1waGFzaXMoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG4gICAgdmFyIG5vdztcbiAgICB2YXIgcGVkYW50aWM7XG4gICAgdmFyIG1hcmtlcjtcbiAgICB2YXIgcXVldWU7XG4gICAgdmFyIHN1YnZhbHVlO1xuICAgIHZhciBsZW5ndGg7XG4gICAgdmFyIHByZXY7XG5cbiAgICBpZiAoRU1QSEFTSVNfTUFSS0VSU1tjaGFyYWN0ZXJdICE9PSB0cnVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwZWRhbnRpYyA9IHNlbGYub3B0aW9ucy5wZWRhbnRpYztcbiAgICBzdWJ2YWx1ZSA9IG1hcmtlciA9IGNoYXJhY3RlcjtcbiAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgaW5kZXgrKztcbiAgICBxdWV1ZSA9IGNoYXJhY3RlciA9IEVNUFRZO1xuXG4gICAgaWYgKHBlZGFudGljICYmIGlzV2hpdGVTcGFjZSh2YWx1ZS5jaGFyQXQoaW5kZXgpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHByZXYgPSBjaGFyYWN0ZXI7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhcmFjdGVyID09PSBtYXJrZXIgJiZcbiAgICAgICAgICAgICghcGVkYW50aWMgfHwgIWlzV2hpdGVTcGFjZShwcmV2KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgIT09IG1hcmtlcikge1xuICAgICAgICAgICAgICAgIGlmICghdHJpbShxdWV1ZSkgfHwgcHJldiA9PT0gbWFya2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHBlZGFudGljIHx8XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlciAhPT0gQ19VTkRFUlNDT1JFIHx8XG4gICAgICAgICAgICAgICAgICAgICFpc1dvcmRDaGFyYWN0ZXIoY2hhcmFjdGVyKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbm93ID0gZWF0Lm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBub3cuY29sdW1uKys7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSArIHF1ZXVlICsgbWFya2VyKShcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVySW5saW5lKFRfRU1QSEFTSVMsIHF1ZXVlLCBub3cpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWV1ZSArPSBtYXJrZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBlZGFudGljICYmIGNoYXJhY3RlciA9PT0gQ19CQUNLU0xBU0gpIHtcbiAgICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG59XG5cbnRva2VuaXplRW1waGFzaXMubG9jYXRvciA9IGxvY2F0ZUVtcGhhc2lzO1xuXG4vKipcbiAqIEZpbmQgYSBwb3NzaWJsZSBkZWxldGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBsb2NhdGVEZWxldGlvbignZm9vIH5+YmFyJyk7IC8vIDRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBzZWFyY2guXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IC0gSW5kZXggdG8gc3RhcnQgc2VhcmNoaW5nIGF0LlxuICogQHJldHVybiB7bnVtYmVyfSAtIExvY2F0aW9uIG9mIHBvc3NpYmxlIGRlbGV0aW9uLlxuICovXG5mdW5jdGlvbiBsb2NhdGVEZWxldGlvbih2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YoQ19USUxERSArIENfVElMREUsIGZyb21JbmRleCk7XG59XG5cbi8qKlxuICogVG9rZW5pc2UgYSBkZWxldGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZURlbGV0aW9uKGVhdCwgJ35+Zm9vfn4nKTtcbiAqXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBsb2NhdG9yIC0gRGVsZXRpb24gbG9jYXRvci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gZWF0IC0gRWF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSZXN0IG9mIGNvbnRlbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbc2lsZW50XSAtIFdoZXRoZXIgdGhpcyBpcyBhIGRyeSBydW4uXG4gKiBAcmV0dXJuIHtOb2RlP3xib29sZWFufSAtIGBkZWxldGVgIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplRGVsZXRpb24oZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjaGFyYWN0ZXIgPSBFTVBUWTtcbiAgICB2YXIgcHJldmlvdXMgPSBFTVBUWTtcbiAgICB2YXIgcHJlY2VkaW5nID0gRU1QVFk7XG4gICAgdmFyIHN1YnZhbHVlID0gRU1QVFk7XG4gICAgdmFyIGluZGV4O1xuICAgIHZhciBsZW5ndGg7XG4gICAgdmFyIG5vdztcblxuICAgIGlmIChcbiAgICAgICAgIXNlbGYub3B0aW9ucy5nZm0gfHxcbiAgICAgICAgdmFsdWUuY2hhckF0KDApICE9PSBDX1RJTERFIHx8XG4gICAgICAgIHZhbHVlLmNoYXJBdCgxKSAhPT0gQ19USUxERSB8fFxuICAgICAgICBpc1doaXRlU3BhY2UodmFsdWUuY2hhckF0KDIpKVxuICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5kZXggPSAxO1xuICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICBub3cgPSBlYXQubm93KCk7XG4gICAgbm93LmNvbHVtbiArPSAyO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGFyYWN0ZXIgPT09IENfVElMREUgJiZcbiAgICAgICAgICAgIHByZXZpb3VzID09PSBDX1RJTERFICYmXG4gICAgICAgICAgICAoIXByZWNlZGluZyB8fCAhaXNXaGl0ZVNwYWNlKHByZWNlZGluZykpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gbmV2ZXIgdXNlZCAoeWV0KSAqL1xuICAgICAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZWF0KENfVElMREUgKyBDX1RJTERFICsgc3VidmFsdWUgKyBDX1RJTERFICsgQ19USUxERSkoXG4gICAgICAgICAgICAgICAgc2VsZi5yZW5kZXJJbmxpbmUoVF9ERUxFVEUsIHN1YnZhbHVlLCBub3cpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VidmFsdWUgKz0gcHJldmlvdXM7XG4gICAgICAgIHByZWNlZGluZyA9IHByZXZpb3VzO1xuICAgICAgICBwcmV2aW91cyA9IGNoYXJhY3RlcjtcbiAgICB9XG59XG5cbnRva2VuaXplRGVsZXRpb24ubG9jYXRvciA9IGxvY2F0ZURlbGV0aW9uO1xuXG4vKipcbiAqIEZpbmQgcG9zc2libGUgaW5saW5lIGNvZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgbG9jYXRlSW5saW5lQ29kZSgnZm9vIGBiYXInKTsgLy8gNFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggLSBJbmRleCB0byBzdGFydCBzZWFyY2hpbmcgYXQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IC0gTG9jYXRpb24gb2YgcG9zc2libGUgaW5saW5lIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIGxvY2F0ZUlubGluZUNvZGUodmFsdWUsIGZyb21JbmRleCkge1xuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKENfVElDSywgZnJvbUluZGV4KTtcbn1cblxuLyoqXG4gKiBUb2tlbmlzZSBpbmxpbmUgY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB0b2tlbml6ZUlubGluZUNvZGUoZWF0LCAnYGZvbygpYCcpO1xuICpcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxvY2F0b3IgLSBJbmxpbmUgY29kZSBsb2NhdG9yLlxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBlYXQgLSBFYXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlc3Qgb2YgY29udGVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFtzaWxlbnRdIC0gV2hldGhlciB0aGlzIGlzIGEgZHJ5IHJ1bi5cbiAqIEByZXR1cm4ge05vZGU/fGJvb2xlYW59IC0gYGlubGluZUNvZGVgIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplSW5saW5lQ29kZShlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBxdWV1ZSA9IEVNUFRZO1xuICAgIHZhciB0aWNrUXVldWUgPSBFTVBUWTtcbiAgICB2YXIgY29udGVudFF1ZXVlO1xuICAgIHZhciB3aGl0ZVNwYWNlUXVldWU7XG4gICAgdmFyIGNvdW50O1xuICAgIHZhciBvcGVuaW5nQ291bnQ7XG4gICAgdmFyIHN1YnZhbHVlO1xuICAgIHZhciBjaGFyYWN0ZXI7XG4gICAgdmFyIGZvdW5kO1xuICAgIHZhciBuZXh0O1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpICE9PSBDX1RJQ0spIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gQ19USUNLO1xuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGlmICghcXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1YnZhbHVlID0gcXVldWU7XG4gICAgb3BlbmluZ0NvdW50ID0gaW5kZXg7XG4gICAgcXVldWUgPSBFTVBUWTtcbiAgICBuZXh0ID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgICBjb3VudCA9IDA7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gbmV4dDtcbiAgICAgICAgbmV4dCA9IHZhbHVlLmNoYXJBdChpbmRleCArIDEpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfVElDSykge1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIHRpY2tRdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY291bnQgJiYgbmV4dCAhPT0gQ19USUNLKSB7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IG9wZW5pbmdDb3VudCkge1xuICAgICAgICAgICAgICAgIHN1YnZhbHVlICs9IHF1ZXVlICsgdGlja1F1ZXVlO1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcXVldWUgKz0gdGlja1F1ZXVlO1xuICAgICAgICAgICAgdGlja1F1ZXVlID0gRU1QVFk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgaWYgKG9wZW5pbmdDb3VudCAlIDIgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gbmV2ZXIgdXNlZCAoeWV0KSAqL1xuICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29udGVudFF1ZXVlID0gd2hpdGVTcGFjZVF1ZXVlID0gRU1QVFk7XG4gICAgbGVuZ3RoID0gcXVldWUubGVuZ3RoO1xuICAgIGluZGV4ID0gLTE7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSBxdWV1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChpc1doaXRlU3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgd2hpdGVTcGFjZVF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdoaXRlU3BhY2VRdWV1ZSkge1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRRdWV1ZSArPSB3aGl0ZVNwYWNlUXVldWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaXRlU3BhY2VRdWV1ZSA9IEVNUFRZO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGVudFF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZWF0KHN1YnZhbHVlKShzZWxmLnJlbmRlclJhdyhUX0lOTElORV9DT0RFLCBjb250ZW50UXVldWUpKTtcbn1cblxudG9rZW5pemVJbmxpbmVDb2RlLmxvY2F0b3IgPSBsb2NhdGVJbmxpbmVDb2RlO1xuXG4vKipcbiAqIEZpbmQgYSBwb3NzaWJsZSBicmVhay5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBsb2NhdGVCcmVhaygnZm9vICAgXFxuYmFyJyk7IC8vIDNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBzZWFyY2guXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IC0gSW5kZXggdG8gc3RhcnQgc2VhcmNoaW5nIGF0LlxuICogQHJldHVybiB7bnVtYmVyfSAtIExvY2F0aW9uIG9mIHBvc3NpYmxlIGJyZWFrLlxuICovXG5mdW5jdGlvbiBsb2NhdGVCcmVhayh2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gdmFsdWUuaW5kZXhPZihDX05FV0xJTkUsIGZyb21JbmRleCk7XG5cbiAgICB3aGlsZSAoaW5kZXggPiBmcm9tSW5kZXgpIHtcbiAgICAgICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCAtIDEpICE9PSBDX1NQQUNFKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4LS07XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIFRva2VuaXNlIGEgYnJlYWsuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdG9rZW5pemVCcmVhayhlYXQsICcgIFxcbicpO1xuICpcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxvY2F0b3IgLSBCcmVhayBsb2NhdG9yLlxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBlYXQgLSBFYXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlc3Qgb2YgY29udGVudC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFtzaWxlbnRdIC0gV2hldGhlciB0aGlzIGlzIGEgZHJ5IHJ1bi5cbiAqIEByZXR1cm4ge05vZGU/fGJvb2xlYW59IC0gYGJyZWFrYCBub2RlLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZUJyZWFrKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYnJlYWtzID0gc2VsZi5vcHRpb25zLmJyZWFrcztcbiAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBxdWV1ZSA9IEVNUFRZO1xuICAgIHZhciBjaGFyYWN0ZXI7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgICAgICAgaWYgKCFicmVha3MgJiYgaW5kZXggPCBNSU5fQlJFQUtfTEVOR1RIKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIHJldHVybiBlYXQocXVldWUpKHNlbGYucmVuZGVyVm9pZChUX0JSRUFLKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgfVxufVxuXG50b2tlbml6ZUJyZWFrLmxvY2F0b3IgPSBsb2NhdGVCcmVhaztcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBuZXcgcGFyc2VyLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKG5ldyBWRmlsZSgnRm9vJykpO1xuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGNsYXNzIHtQYXJzZXJ9XG4gKiBAcGFyYW0ge1ZGaWxlfSBmaWxlIC0gRmlsZSB0byBwYXJzZS5cbiAqIEBwYXJhbSB7T2JqZWN0P30gW29wdGlvbnNdIC0gUGFzc2VkIHRvXG4gKiAgIGBQYXJzZXIjc2V0T3B0aW9ucygpYC5cbiAqL1xuZnVuY3Rpb24gUGFyc2VyKGZpbGUsIG9wdGlvbnMsIHByb2Nlc3Nvcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHNlbGYuZmlsZSA9IGZpbGU7XG4gICAgc2VsZi5pbkxpbmsgPSBmYWxzZTtcbiAgICBzZWxmLmF0VG9wID0gdHJ1ZTtcbiAgICBzZWxmLmF0U3RhcnQgPSB0cnVlO1xuICAgIHNlbGYuaW5CbG9ja3F1b3RlID0gZmFsc2U7XG4gICAgc2VsZi5kYXRhID0gcHJvY2Vzc29yLmRhdGE7XG5cbiAgICBzZWxmLmRlc2NhcGUgPSBkZXNjYXBlRmFjdG9yeShzZWxmLCAnZXNjYXBlJyk7XG4gICAgc2VsZi5kZWNvZGUgPSBkZWNvZGVGYWN0b3J5KHNlbGYpO1xuXG4gICAgc2VsZi5vcHRpb25zID0gZXh0ZW5kKHt9LCBzZWxmLm9wdGlvbnMpO1xuXG4gICAgc2VsZi5zZXRPcHRpb25zKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFNldCBvcHRpb25zLiAgRG9lcyBub3Qgb3ZlcndyaXRlIHByZXZpb3VzbHkgc2V0XG4gKiBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG4gKiAgIHBhcnNlci5zZXRPcHRpb25zKHtnZm06IHRydWV9KTtcbiAqXG4gKiBAdGhpcyB7UGFyc2VyfVxuICogQHRocm93cyB7RXJyb3J9IC0gV2hlbiBhbiBvcHRpb24gaXMgaW52YWxpZC5cbiAqIEBwYXJhbSB7T2JqZWN0P30gW29wdGlvbnNdIC0gUGFyc2Ugc2V0dGluZ3MuXG4gKiBAcmV0dXJuIHtQYXJzZXJ9IC0gYHNlbGZgLlxuICovXG5QYXJzZXIucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZXNjYXBlID0gc2VsZi5kYXRhLmVzY2FwZTtcbiAgICB2YXIgY3VycmVudCA9IHNlbGYub3B0aW9ucztcbiAgICB2YXIga2V5O1xuXG4gICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByYWlzZShvcHRpb25zLCAnb3B0aW9ucycpO1xuICAgIH1cblxuICAgIGZvciAoa2V5IGluIGRlZmF1bHRPcHRpb25zKSB7XG4gICAgICAgIHZhbGlkYXRlLmJvb2xlYW4ob3B0aW9ucywga2V5LCBjdXJyZW50W2tleV0pO1xuICAgIH1cblxuICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBpZiAob3B0aW9ucy5jb21tb25tYXJrKSB7XG4gICAgICAgIHNlbGYuZXNjYXBlID0gZXNjYXBlLmNvbW1vbm1hcms7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmdmbSkge1xuICAgICAgICBzZWxmLmVzY2FwZSA9IGVzY2FwZS5nZm07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5lc2NhcGUgPSBlc2NhcGUuZGVmYXVsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbn07XG5cbi8qXG4gKiBFeHBvc2UgYGRlZmF1bHRzYC5cbiAqL1xuXG5QYXJzZXIucHJvdG90eXBlLm9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcblxuLyoqXG4gKiBGYWN0b3J5IHRvIHRyYWNrIGluZGVudGF0aW9uIGZvciBlYWNoIGxpbmUgY29ycmVzcG9uZGluZ1xuICogdG8gdGhlIGdpdmVuIGBzdGFydGAgYW5kIHRoZSBudW1iZXIgb2YgaW52b2NhdGlvbnMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gU3RhcnRpbmcgbGluZS5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKG9mZnNldCl9IC0gSW5kZW50ZXIuXG4gKi9cblBhcnNlci5wcm90b3R5cGUuaW5kZW50ID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBsaW5lID0gc3RhcnQ7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbmRlciB3aGljaCBpbmNyZW1lbnRzIHRoZSBnbG9iYWwgb2Zmc2V0LFxuICAgICAqIHN0YXJ0aW5nIGF0IHRoZSBib3VuZCBsaW5lLCBhbmQgZnVydGhlciBpbmNyZW1lbnRpbmdcbiAgICAgKiBlYWNoIGxpbmUgZm9yIGVhY2ggaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBpbmRlbnRlcigyKTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBOdW1iZXIgdG8gaW5jcmVtZW50IHRoZVxuICAgICAqICAgb2Zmc2V0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluZGVudGVyKG9mZnNldCkge1xuICAgICAgICBzZWxmLm9mZnNldFtsaW5lXSA9IChzZWxmLm9mZnNldFtsaW5lXSB8fCAwKSArIG9mZnNldDtcblxuICAgICAgICBsaW5lKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGVudGVyO1xufTtcblxuLyoqXG4gKiBHZXQgZm91bmQgb2Zmc2V0cyBzdGFydGluZyBhdCBgc3RhcnRgLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFN0YXJ0aW5nIGxpbmUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gLSBPZmZzZXRzIHN0YXJ0aW5nIGF0IGBzdGFydGAuXG4gKi9cblBhcnNlci5wcm90b3R5cGUuZ2V0SW5kZW50ID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK3N0YXJ0KSB7XG4gICAgICAgIGlmICghKHN0YXJ0IGluIG9mZnNldCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnB1c2goKG9mZnNldFtzdGFydF0gfHwgMCkgKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgYm91bmQgZmlsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBuZXcgUGFyc2VyKG5ldyBGaWxlKCdfRm9vXy4nKSkucGFyc2UoKTtcbiAqXG4gKiBAdGhpcyB7UGFyc2VyfVxuICogQHJldHVybiB7T2JqZWN0fSAtIGByb290YCBub2RlLlxuICovXG5QYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdmFsdWUgPSBjbGVhbihTdHJpbmcoc2VsZi5maWxlKSk7XG4gICAgdmFyIG5vZGU7XG5cbiAgICAvKlxuICAgICAqIEFkZCBhbiBgb2Zmc2V0YCBtYXRyaXgsIHVzZWQgdG8ga2VlcCB0cmFjayBvZlxuICAgICAqIHN5bnRheCBhbmQgd2hpdGUgc3BhY2UgaW5kZW50YXRpb24gcGVyIGxpbmUuXG4gICAgICovXG5cbiAgICBzZWxmLm9mZnNldCA9IHt9O1xuXG4gICAgbm9kZSA9IHNlbGYucmVuZGVyQmxvY2soVF9ST09ULCB2YWx1ZSk7XG5cbiAgICBpZiAoc2VsZi5vcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgIG5vZGUucG9zaXRpb24gPSB7XG4gICAgICAgICAgICAnc3RhcnQnOiB7XG4gICAgICAgICAgICAgICAgJ2xpbmUnOiAxLFxuICAgICAgICAgICAgICAgICdjb2x1bW4nOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbm9kZS5wb3NpdGlvbi5lbmQgPSBzZWxmLmVvZiB8fCBub2RlLnBvc2l0aW9uLnN0YXJ0O1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xufTtcblxuLypcbiAqIEVudGVyIGFuZCBleGl0IGhlbHBlcnMuXG4gKi9cblxuUGFyc2VyLnByb3RvdHlwZS5lbnRlckxpbmsgPSBzdGF0ZVRvZ2dsZXIoJ2luTGluaycsIGZhbHNlKTtcblBhcnNlci5wcm90b3R5cGUuZXhpdFRvcCA9IHN0YXRlVG9nZ2xlcignYXRUb3AnLCB0cnVlKTtcblBhcnNlci5wcm90b3R5cGUuZXhpdFN0YXJ0ID0gc3RhdGVUb2dnbGVyKCdhdFN0YXJ0JywgdHJ1ZSk7XG5QYXJzZXIucHJvdG90eXBlLmVudGVyQmxvY2txdW90ZSA9IHN0YXRlVG9nZ2xlcignaW5CbG9ja3F1b3RlJywgZmFsc2UpO1xuXG4vKlxuICogRXhwb3NlIGhlbHBlcnNcbiAqL1xuXG5QYXJzZXIucHJvdG90eXBlLnJlbmRlclJhdyA9IHJlbmRlclJhdztcblBhcnNlci5wcm90b3R5cGUucmVuZGVyVm9pZCA9IHJlbmRlclZvaWQ7XG5QYXJzZXIucHJvdG90eXBlLnJlbmRlclBhcmVudCA9IHJlbmRlclBhcmVudDtcblBhcnNlci5wcm90b3R5cGUucmVuZGVySW5saW5lID0gcmVuZGVySW5saW5lO1xuUGFyc2VyLnByb3RvdHlwZS5yZW5kZXJCbG9jayA9IHJlbmRlckJsb2NrO1xuXG5QYXJzZXIucHJvdG90eXBlLnJlbmRlckxpbmsgPSByZW5kZXJMaW5rO1xuUGFyc2VyLnByb3RvdHlwZS5yZW5kZXJDb2RlQmxvY2sgPSByZW5kZXJDb2RlQmxvY2s7XG5QYXJzZXIucHJvdG90eXBlLnJlbmRlckJsb2NrcXVvdGUgPSByZW5kZXJCbG9ja3F1b3RlO1xuUGFyc2VyLnByb3RvdHlwZS5yZW5kZXJMaXN0SXRlbSA9IHJlbmRlckxpc3RJdGVtO1xuUGFyc2VyLnByb3RvdHlwZS5yZW5kZXJGb290bm90ZURlZmluaXRpb24gPSByZW5kZXJGb290bm90ZURlZmluaXRpb247XG5QYXJzZXIucHJvdG90eXBlLnJlbmRlckhlYWRpbmcgPSByZW5kZXJIZWFkaW5nO1xuUGFyc2VyLnByb3RvdHlwZS5yZW5kZXJGb290bm90ZSA9IHJlbmRlckZvb3Rub3RlO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIHRva2VuaXplci4gIFRoaXMgY3JlYXRlcyBib3RoXG4gKiBgdG9rZW5pemVJbmxpbmVgIGFuZCBgdG9rZW5pemVCbG9ja2AuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgUGFyc2VyLnByb3RvdHlwZS50b2tlbml6ZUlubGluZSA9IHRva2VuaXplRmFjdG9yeSgnaW5saW5lJyk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBOYW1lIG9mIHBhcnNlciwgdXNlZCB0byBmaW5kXG4gKiAgIGl0cyBleHByZXNzaW9ucyAoYCVzTWV0aG9kc2ApIGFuZCB0b2tlbml6ZXJzXG4gKiAgIChgJVRva2VuaXplcnNgKS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSAtIFRva2VuaXplci5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVGYWN0b3J5KHR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBUb2tlbml6ZXIgZm9yIGEgYm91bmQgYHR5cGVgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgcGFyc2VyID0gbmV3IFBhcnNlcigpO1xuICAgICAqICAgcGFyc2VyLnRva2VuaXplSW5saW5lKCdfZm9vXycpO1xuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQ29udGVudC5cbiAgICAgKiBAcGFyYW0ge09iamVjdD99IFtsb2NhdGlvbl0gLSBPZmZzZXQgYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqICAgc3RhcnRzLlxuICAgICAqIEByZXR1cm4ge0FycmF5LjxPYmplY3Q+fSAtIE5vZGVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRva2VuaXplKHZhbHVlLCBsb2NhdGlvbikge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBvZmZzZXQgPSBzZWxmLm9mZnNldDtcbiAgICAgICAgdmFyIHRva2VucyA9IFtdO1xuICAgICAgICB2YXIgbWV0aG9kcyA9IHNlbGZbdHlwZSArICdNZXRob2RzJ107XG4gICAgICAgIHZhciB0b2tlbml6ZXJzID0gc2VsZlt0eXBlICsgJ1Rva2VuaXplcnMnXTtcbiAgICAgICAgdmFyIGxpbmUgPSBsb2NhdGlvbiA/IGxvY2F0aW9uLmxpbmUgOiAxO1xuICAgICAgICB2YXIgY29sdW1uID0gbG9jYXRpb24gPyBsb2NhdGlvbi5jb2x1bW4gOiAxO1xuICAgICAgICB2YXIgcGF0Y2hQb3NpdGlvbiA9IHNlbGYub3B0aW9ucy5wb3NpdGlvbjtcbiAgICAgICAgdmFyIGFkZDtcbiAgICAgICAgdmFyIGluZGV4O1xuICAgICAgICB2YXIgbGVuZ3RoO1xuICAgICAgICB2YXIgbWV0aG9kO1xuICAgICAgICB2YXIgbmFtZTtcbiAgICAgICAgdmFyIG1hdGNoZWQ7XG4gICAgICAgIHZhciB2YWx1ZUxlbmd0aDtcbiAgICAgICAgdmFyIGVhdGVyO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRyaW0gd2hpdGUgc3BhY2Ugb25seSBsaW5lcy5cbiAgICAgICAgICovXG5cbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgbGluZSBhbmQgY29sdW1uIGJhc2VkIG9uIGB2YWx1ZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqICAgdXBkYXRlUG9zaXRpb24oJ2ZvbycpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3VidmFsdWUgLSBTdWJ2YWx1ZSB0byBlYXQuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbihzdWJ2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IC0xO1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gc3VidmFsdWUuaW5kZXhPZihDX05FV0xJTkUpO1xuXG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGluZSsrO1xuICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIGluZGV4ID0gc3VidmFsdWUuaW5kZXhPZihDX05FV0xJTkUsIGluZGV4ICsgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uICsgc3VidmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBzdWJ2YWx1ZS5sZW5ndGggLSBsYXN0SW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsaW5lIGluIG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbiArPSBvZmZzZXRbbGluZV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4gPD0gb2Zmc2V0W2xpbmVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IG9mZnNldFtsaW5lXSArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBvZmZzZXQuIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpc1xuICAgICAgICAgKiBlYXRlbiB0byByZXRyaWV2ZSB0aGUgcmFuZ2UncyBvZmZzZXRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gLSBgZG9uZWAsIHRvIGJlIGNhbGxlZCB3aGVuXG4gICAgICAgICAqICAgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGVhdGVuLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T2Zmc2V0KCkge1xuICAgICAgICAgICAgdmFyIGluZGVudGF0aW9uID0gW107XG4gICAgICAgICAgICB2YXIgcG9zID0gbGluZSArIDE7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRG9uZS4gQ2FsbGVkIHdoZW4gdGhlIGxhc3QgY2hhcmFjdGVyIGlzXG4gICAgICAgICAgICAgKiBlYXRlbiB0byByZXRyaWV2ZSB0aGUgcmFuZ2XigJlzIG9mZnNldHMuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IC0gT2Zmc2V0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0ID0gbGluZSArIDE7XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAocG9zIDwgbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbi5wdXNoKChvZmZzZXRbcG9zXSB8fCAwKSArIDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIHBvcysrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBpbmRlbnRhdGlvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRvbmU7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAgIHBvc2l0aW9uID0gbm93KCk7IC8vIHtsaW5lOiAxLCBjb2x1bW46IDF9XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gLSBDdXJyZW50IFBvc2l0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm93KCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnbGluZSc6IGxpbmUsXG4gICAgICAgICAgICAgICAgJ2NvbHVtbic6IGNvbHVtblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdG9yZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBub2RlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAgIHN0YXJ0ID0gbm93KCk7XG4gICAgICAgICAqICAgdXBkYXRlUG9zaXRpb24oJ2ZvbycpO1xuICAgICAgICAgKiAgIGxvY2F0aW9uID0gbmV3IFBvc2l0aW9uKHN0YXJ0KTtcbiAgICAgICAgICogICAvLyB7c3RhcnQ6IHtsaW5lOiAxLCBjb2x1bW46IDF9LCBlbmQ6IHtsaW5lOiAxLCBjb2x1bW46IDN9fVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhcnQgLSBTdGFydGluZyBwb3NpdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFBvc2l0aW9uKHN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICB0aGlzLmVuZCA9IG5vdygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRocm93IHdoZW4gYSB2YWx1ZSBpcyBpbmNvcnJlY3RseSBlYXRlbi5cbiAgICAgICAgICogVGhpcyBzaG91bGRu4oCZdCBoYXBwZW4gYnV0IHdpbGwgdGhyb3cgb24gbmV3LFxuICAgICAgICAgKiBpbmNvcnJlY3QgcnVsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqICAgLy8gV2hlbiB0aGUgY3VycmVudCB2YWx1ZSBpcyBzZXQgdG8gYGZvbyBiYXJgLlxuICAgICAgICAgKiAgIHZhbGlkYXRlRWF0KCdmb28nKTtcbiAgICAgICAgICogICBlYXQoJ2ZvbycpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgIHZhbGlkYXRlRWF0KCdiYXInKTtcbiAgICAgICAgICogICAvLyB0aHJvd3MsIGJlY2F1c2UgdGhlIHNwYWNlIGlzIG5vdCBlYXRlbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnZhbHVlIC0gVmFsdWUgdG8gYmUgZWF0ZW4uXG4gICAgICAgICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdoZW4gYHN1YnZhbHVlYCBjYW5ub3QgYmUgZWF0ZW4uXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZUVhdChzdWJ2YWx1ZSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICBpZiAodmFsdWUuc3Vic3RyaW5nKDAsIHN1YnZhbHVlLmxlbmd0aCkgIT09IHN1YnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5maWxlLmZhaWwoRVJSX0lOQ09SUkVDVExZX0VBVEVOLCBub3coKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFyayBwb3NpdGlvbiBhbmQgcGF0Y2ggYG5vZGUucG9zaXRpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAgIHZhciB1cGRhdGUgPSBwb3NpdGlvbigpO1xuICAgICAgICAgKiAgIHVwZGF0ZVBvc2l0aW9uKCdmb28nKTtcbiAgICAgICAgICogICB1cGRhdGUoe30pO1xuICAgICAgICAgKiAgIC8vIHtcbiAgICAgICAgICogICAvLyAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAqICAgLy8gICAgIHN0YXJ0OiB7bGluZTogMSwgY29sdW1uOiAxfVxuICAgICAgICAgKiAgIC8vICAgICBlbmQ6IHtsaW5lOiAxLCBjb2x1bW46IDN9XG4gICAgICAgICAqICAgLy8gICB9XG4gICAgICAgICAqICAgLy8gfVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IC0gVXBkYXRlci5cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHBvc2l0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGJlZm9yZSA9IG5vdygpO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEFkZCB0aGUgcG9zaXRpb24gdG8gYSBub2RlLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAgICAgKiAgIHVwZGF0ZSh7dHlwZTogJ3RleHQnLCB2YWx1ZTogJ2Zvbyd9KTtcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBOb2RlIHRvIGF0dGFjaCBwb3NpdGlvblxuICAgICAgICAgICAgICogICBvbi5cbiAgICAgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFtpbmRlbnRdIC0gSW5kZW50YXRpb24gZm9yXG4gICAgICAgICAgICAgKiAgIGBub2RlYC5cbiAgICAgICAgICAgICAqIEByZXR1cm4ge05vZGV9IC0gYG5vZGVgLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGUobm9kZSwgaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXYgPSBub2RlLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IHByZXYgPyBwcmV2LnN0YXJ0IDogYmVmb3JlO1xuICAgICAgICAgICAgICAgIHZhciBjb21iaW5lZCA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBuID0gcHJldiAmJiBwcmV2LmVuZC5saW5lO1xuICAgICAgICAgICAgICAgIHZhciBsID0gYmVmb3JlLmxpbmU7XG5cbiAgICAgICAgICAgICAgICBub2RlLnBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKHN0YXJ0KTtcblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICogSWYgdGhlcmUgd2FzIGFscmVhZHkgYSBgcG9zaXRpb25gLCB0aGlzXG4gICAgICAgICAgICAgICAgICogbm9kZSB3YXMgbWVyZ2VkLiAgRml4aW5nIGBzdGFydGAgd2FzbuKAmXRcbiAgICAgICAgICAgICAgICAgKiBoYXJkLCBidXQgdGhlIGluZGVudCBpcyBkaWZmZXJlbnQuXG4gICAgICAgICAgICAgICAgICogRXNwZWNpYWxseSBiZWNhdXNlIHNvbWUgaW5mb3JtYXRpb24sIHRoZVxuICAgICAgICAgICAgICAgICAqIGluZGVudCBiZXR3ZWVuIGBuYCBhbmQgYGxgIHdhc27igJl0XG4gICAgICAgICAgICAgICAgICogdHJhY2tlZC4gIEx1Y2tpbHksIHRoYXQgc3BhY2UgaXNcbiAgICAgICAgICAgICAgICAgKiAoc2hvdWxkIGJlPykgZW1wdHksIHNvIHdlIGNhbiBzYWZlbHlcbiAgICAgICAgICAgICAgICAgKiBjaGVjayBmb3IgaXQgbm93LlxuICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgaWYgKHByZXYgJiYgaW5kZW50ICYmIHByZXYuaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkID0gcHJldi5pbmRlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG4gPCBsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKytuIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkLnB1c2goKG9mZnNldFtuXSB8fCAwKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZC5wdXNoKGJlZm9yZS5jb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gY29tYmluZWQuY29uY2F0KGluZGVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9kZS5wb3NpdGlvbi5pbmRlbnQgPSBpbmRlbnQgfHwgW107XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGQgYG5vZGVgIHRvIGBwYXJlbnRgcyBjaGlsZHJlbiBvciB0byBgdG9rZW5zYC5cbiAgICAgICAgICogUGVyZm9ybXMgbWVyZ2VzIHdoZXJlIHBvc3NpYmxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAgIGFkZCh7fSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgYWRkKHt9LCB7Y2hpbGRyZW46IFtdfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gTm9kZSB0byBhZGQuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyZW50XSAtIFBhcmVudCB0byBpbnNlcnQgaW50by5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSAtIEFkZGVkIG9yIG1lcmdlZCBpbnRvIG5vZGUuXG4gICAgICAgICAqL1xuICAgICAgICBhZGQgPSBmdW5jdGlvbiAobm9kZSwgcGFyZW50KSB7XG4gICAgICAgICAgICB2YXIgcHJldjtcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbjtcblxuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHRva2VucztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGRyZW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZXYgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHByZXYgJiZcbiAgICAgICAgICAgICAgICBub2RlLnR5cGUgPT09IHByZXYudHlwZSAmJlxuICAgICAgICAgICAgICAgIG5vZGUudHlwZSBpbiBNRVJHRUFCTEVfTk9ERVMgJiZcbiAgICAgICAgICAgICAgICBtZXJnZWFibGUocHJldikgJiZcbiAgICAgICAgICAgICAgICBtZXJnZWFibGUobm9kZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBNRVJHRUFCTEVfTk9ERVNbbm9kZS50eXBlXS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICBzZWxmLCBwcmV2LCBub2RlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGUgIT09IHByZXYpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VsZi5hdFN0YXJ0ICYmIHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmV4aXRTdGFydCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVtb3ZlIGBzdWJ2YWx1ZWAgZnJvbSBgdmFsdWVgLlxuICAgICAgICAgKiBFeHBlY3RzIGBzdWJ2YWx1ZWAgdG8gYmUgYXQgdGhlIHN0YXJ0IGZyb21cbiAgICAgICAgICogYHZhbHVlYCwgYW5kIGFwcGxpZXMgbm8gdmFsaWRhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogICBlYXQoJ2ZvbycpKHt0eXBlOiAndGV4dCcsIHZhbHVlOiAnZm9vJ30pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3VidmFsdWUgLSBSZW1vdmVkIGZyb20gYHZhbHVlYCxcbiAgICAgICAgICogICBhbmQgcGFzc2VkIHRvIGB1cGRhdGVQb3NpdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSAtIFdyYXBwZXIgYXJvdW5kIGBhZGRgLCB3aGljaFxuICAgICAgICAgKiAgIGFsc28gYWRkcyBgcG9zaXRpb25gIHRvIG5vZGUuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBlYXQoc3VidmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBpbmRlbnQgPSBnZXRPZmZzZXQoKTtcbiAgICAgICAgICAgIHZhciBwb3MgPSBwb3NpdGlvbigpO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBub3coKTtcblxuICAgICAgICAgICAgdmFsaWRhdGVFYXQoc3VidmFsdWUpO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEFkZCB0aGUgZ2l2ZW4gYXJndW1lbnRzLCBhZGQgYHBvc2l0aW9uYCB0b1xuICAgICAgICAgICAgICogdGhlIHJldHVybmVkIG5vZGUsIGFuZCByZXR1cm4gdGhlIG5vZGUuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBOb2RlIHRvIGFkZC5cbiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyZW50XSAtIE5vZGUgdG8gaW5zZXJ0IGludG8uXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHtOb2RlfSAtIEFkZGVkIG5vZGUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGx5KG5vZGUsIHBhcmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb3MoYWRkKHBvcyhub2RlKSwgcGFyZW50KSwgaW5kZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBGdW5jdGlvbnMganVzdCBsaWtlIGFwcGx5LCBidXQgcmVzZXRzIHRoZVxuICAgICAgICAgICAgICogY29udGVudDogIHRoZSBsaW5lIGFuZCBjb2x1bW4gYXJlIHJldmVyc2VkLFxuICAgICAgICAgICAgICogYW5kIHRoZSBlYXRlbiB2YWx1ZSBpcyByZS1hZGRlZC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igbm9kZXMgd2l0aCBhIHNpbmdsZVxuICAgICAgICAgICAgICogdHlwZSBvZiBjb250ZW50LCBzdWNoIGFzIGxpc3RzIGFuZCB0YWJsZXMuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogU2VlIGBhcHBseWAgYWJvdmUgZm9yIHdoYXQgcGFyYW1ldGVycyBhcmVcbiAgICAgICAgICAgICAqIGV4cGVjdGVkLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEByZXR1cm4ge05vZGV9IC0gQWRkZWQgbm9kZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBhcHBseS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgbGluZSA9IGN1cnJlbnQubGluZTtcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBjdXJyZW50LmNvbHVtbjtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHN1YnZhbHVlICsgdmFsdWU7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUZXN0IHRoZSBwb3NpdGlvbiwgYWZ0ZXIgZWF0aW5nLCBhbmQgcmV2ZXJzZVxuICAgICAgICAgICAgICogdG8gYSBub3QtZWF0ZW4gc3RhdGUuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHJldHVybiB7UG9zaXRpb259IC0gUG9zaXRpb24gYWZ0ZXIgZWF0aW5nIGBzdWJ2YWx1ZWAuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGZ1bmN0aW9uIHRlc3QoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBvcyh7fSk7XG5cbiAgICAgICAgICAgICAgICBsaW5lID0gY3VycmVudC5saW5lO1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGN1cnJlbnQuY29sdW1uO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gc3VidmFsdWUgKyB2YWx1ZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucG9zaXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFwcGx5LnJlc2V0ID0gcmVzZXQ7XG4gICAgICAgICAgICBhcHBseS50ZXN0ID0gcmVzZXQudGVzdCA9IHRlc3Q7XG5cbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKHN1YnZhbHVlLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIHVwZGF0ZVBvc2l0aW9uKHN1YnZhbHVlKTtcblxuICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50KCk7XG5cbiAgICAgICAgICAgIHJldHVybiBhcHBseTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTYW1lIGFzIGBlYXRgIGFib3ZlLCBidXQgd2lsbCBub3QgYWRkIHBvc2l0aW9uYWxcbiAgICAgICAgICogaW5mb3JtYXRpb24gdG8gbm9kZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqICAgbm9FYXQoJ2ZvbycpKHt0eXBlOiAndGV4dCcsIHZhbHVlOiAnZm9vJ30pO1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3VidmFsdWUgLSBSZW1vdmVkIGZyb20gYHZhbHVlYC5cbiAgICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IC0gV3JhcHBlciBhcm91bmQgYGFkZGAuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub0VhdChzdWJ2YWx1ZSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFYXQoc3VidmFsdWUpO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEFkZCB0aGUgZ2l2ZW4gYXJndW1lbnRzLCBhbmQgcmV0dXJuIHRoZVxuICAgICAgICAgICAgICogbm9kZS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHtOb2RlfSAtIEFkZGVkIG5vZGUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGx5KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhZGQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBGdW5jdGlvbnMganVzdCBsaWtlIGFwcGx5LCBidXQgcmVzZXRzIHRoZVxuICAgICAgICAgICAgICogY29udGVudDogdGhlIGVhdGVuIHZhbHVlIGlzIHJlLWFkZGVkLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEByZXR1cm4ge05vZGV9IC0gQWRkZWQgbm9kZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBhcHBseS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBzdWJ2YWx1ZSArIHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGVzdCB0aGUgcG9zaXRpb24sIHdoaWNoIGluIHRoaXMgbW9kZSBpcyBhblxuICAgICAgICAgICAgICogZW1wdHkgb2JqZWN0LlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gLSBFbXB0eSBwb3NpdGlvbiBvYmplY3QuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGZ1bmN0aW9uIHRlc3QoKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBzdWJ2YWx1ZSArIHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhcHBseS5yZXNldCA9IHJlc2V0O1xuICAgICAgICAgICAgYXBwbHkudGVzdCA9IHJlc2V0LnRlc3QgPSB0ZXN0O1xuXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyhzdWJ2YWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgICAgICByZXR1cm4gYXBwbHk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBFeHBvc2UgdGhlIGVhdGVyLCBkZXBlbmRpbmcgb24gaWYgYHBvc2l0aW9uYHNcbiAgICAgICAgICogc2hvdWxkIGJlIHBhdGNoZWQgb24gbm9kZXMuXG4gICAgICAgICAqL1xuXG4gICAgICAgIGVhdGVyID0gcGF0Y2hQb3NpdGlvbiA/IGVhdCA6IG5vRWF0O1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIEV4cG9zZSBgbm93YCBvbiBgZWF0ZXJgLlxuICAgICAgICAgKi9cblxuICAgICAgICBlYXRlci5ub3cgPSBub3c7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogRXhwb3NlIGBmaWxlYCBvbiBgZWF0ZXJgLlxuICAgICAgICAgKi9cblxuICAgICAgICBlYXRlci5maWxlID0gc2VsZi5maWxlO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFN5bmMgaW5pdGlhbCBvZmZzZXQuXG4gICAgICAgICAqL1xuXG4gICAgICAgIHVwZGF0ZVBvc2l0aW9uKEVNUFRZKTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBJdGVyYXRlIG92ZXIgYHZhbHVlYCwgYW5kIGl0ZXJhdGUgb3ZlciBhbGxcbiAgICAgICAgICogdG9rZW5pemVycy4gIFdoZW4gb25lIGVhdHMgc29tZXRoaW5nLCByZS1pdGVyYXRlXG4gICAgICAgICAqIHdpdGggdGhlIHJlbWFpbmluZyB2YWx1ZS4gIElmIG5vIHRva2VuaXplciBlYXRzLFxuICAgICAgICAgKiBzb21ldGhpbmcgZmFpbGVkIChzaG91bGQgbm90IGhhcHBlbikgYW5kIGFuXG4gICAgICAgICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG4gICAgICAgICAqL1xuXG4gICAgICAgIHdoaWxlICh2YWx1ZSkge1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoO1xuICAgICAgICAgICAgbWF0Y2hlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG5hbWUgPSBtZXRob2RzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSB0b2tlbml6ZXJzW25hbWVdO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtZXRob2QgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFtZXRob2Qub25seUF0U3RhcnQgfHwgc2VsZi5hdFN0YXJ0KSAmJlxuICAgICAgICAgICAgICAgICAgICAoIW1ldGhvZC5vbmx5QXRUb3AgfHwgc2VsZi5hdFRvcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFtZXRob2Qubm90SW5CbG9ja3F1b3RlIHx8ICFzZWxmLmluQmxvY2txdW90ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFtZXRob2Qubm90SW5MaW5rIHx8ICFzZWxmLmluTGluaylcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVMZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmFwcGx5KHNlbGYsIFtlYXRlciwgdmFsdWVdKTtcblxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gdmFsdWVMZW5ndGggIT09IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5maWxlLmZhaWwoRVJSX0lORklOSVRFX0xPT1AsIGVhdGVyLm5vdygpKTtcblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICogRXJyb3JzIGFyZSBub3QgdGhyb3duIG9uIGBGaWxlI2ZhaWxgXG4gICAgICAgICAgICAgICAgICogd2hlbiBgcXVpZXQ6IHRydWVgLlxuICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmVvZiA9IG5vdygpO1xuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VuaXplO1xufVxuXG4vKlxuICogRXhwb3NlIHRva2VuaXplcnMgZm9yIGJsb2NrLWxldmVsIG5vZGVzLlxuICovXG5cblBhcnNlci5wcm90b3R5cGUuYmxvY2tUb2tlbml6ZXJzID0ge1xuICAgICd5YW1sRnJvbnRNYXR0ZXInOiB0b2tlbml6ZVlBTUxGcm9udE1hdHRlcixcbiAgICAnbmV3bGluZSc6IHRva2VuaXplTmV3bGluZSxcbiAgICAnY29kZSc6IHRva2VuaXplQ29kZSxcbiAgICAnZmVuY2VzJzogdG9rZW5pemVGZW5jZXMsXG4gICAgJ2hlYWRpbmcnOiB0b2tlbml6ZUhlYWRpbmcsXG4gICAgJ2xpbmVIZWFkaW5nJzogdG9rZW5pemVMaW5lSGVhZGluZyxcbiAgICAnaG9yaXpvbnRhbFJ1bGUnOiB0b2tlbml6ZUhvcml6b250YWxSdWxlLFxuICAgICdibG9ja3F1b3RlJzogdG9rZW5pemVCbG9ja3F1b3RlLFxuICAgICdsaXN0JzogdG9rZW5pemVMaXN0LFxuICAgICdodG1sJzogdG9rZW5pemVIVE1MLFxuICAgICdkZWZpbml0aW9uJzogdG9rZW5pemVEZWZpbml0aW9uLFxuICAgICdmb290bm90ZURlZmluaXRpb24nOiB0b2tlbml6ZUZvb3Rub3RlRGVmaW5pdGlvbixcbiAgICAndGFibGUnOiB0b2tlbml6ZVRhYmxlLFxuICAgICdwYXJhZ3JhcGgnOiB0b2tlbml6ZVBhcmFncmFwaFxufTtcblxuLypcbiAqIEV4cG9zZSBvcmRlciBpbiB3aGljaCB0byBwYXJzZSBibG9jay1sZXZlbCBub2Rlcy5cbiAqL1xuXG5QYXJzZXIucHJvdG90eXBlLmJsb2NrTWV0aG9kcyA9IFtcbiAgICAneWFtbEZyb250TWF0dGVyJyxcbiAgICAnbmV3bGluZScsXG4gICAgJ2NvZGUnLFxuICAgICdmZW5jZXMnLFxuICAgICdibG9ja3F1b3RlJyxcbiAgICAnaGVhZGluZycsXG4gICAgJ2hvcml6b250YWxSdWxlJyxcbiAgICAnbGlzdCcsXG4gICAgJ2xpbmVIZWFkaW5nJyxcbiAgICAnaHRtbCcsXG4gICAgJ2Zvb3Rub3RlRGVmaW5pdGlvbicsXG4gICAgJ2RlZmluaXRpb24nLFxuICAgICdsb29zZVRhYmxlJyxcbiAgICAndGFibGUnLFxuICAgICdwYXJhZ3JhcGgnXG5dO1xuXG4vKipcbiAqIEJsb2NrIHRva2VuaXplci5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgcGFyc2VyID0gbmV3IFBhcnNlcigpO1xuICogICBwYXJzZXIudG9rZW5pemVCbG9jaygnPiBmb28uJyk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQ29udGVudC5cbiAqIEByZXR1cm4ge0FycmF5LjxPYmplY3Q+fSAtIE5vZGVzLlxuICovXG5cblBhcnNlci5wcm90b3R5cGUudG9rZW5pemVCbG9jayA9IHRva2VuaXplRmFjdG9yeShCTE9DSyk7XG5cbi8qXG4gKiBFeHBvc2UgdG9rZW5pemVycyBmb3IgaW5saW5lLWxldmVsIG5vZGVzLlxuICovXG5cblBhcnNlci5wcm90b3R5cGUuaW5saW5lVG9rZW5pemVycyA9IHtcbiAgICAnZXNjYXBlJzogdG9rZW5pemVFc2NhcGUsXG4gICAgJ2F1dG9MaW5rJzogdG9rZW5pemVBdXRvTGluayxcbiAgICAndXJsJzogdG9rZW5pemVVUkwsXG4gICAgJ3RhZyc6IHRva2VuaXplVGFnLFxuICAgICdsaW5rJzogdG9rZW5pemVMaW5rLFxuICAgICdyZWZlcmVuY2UnOiB0b2tlbml6ZVJlZmVyZW5jZSxcbiAgICAnc3Ryb25nJzogdG9rZW5pemVTdHJvbmcsXG4gICAgJ2VtcGhhc2lzJzogdG9rZW5pemVFbXBoYXNpcyxcbiAgICAnZGVsZXRpb24nOiB0b2tlbml6ZURlbGV0aW9uLFxuICAgICdpbmxpbmVDb2RlJzogdG9rZW5pemVJbmxpbmVDb2RlLFxuICAgICdicmVhayc6IHRva2VuaXplQnJlYWssXG4gICAgJ2lubGluZVRleHQnOiB0b2tlbml6ZVRleHRcbn07XG5cbi8qXG4gKiBFeHBvc2Ugb3JkZXIgaW4gd2hpY2ggdG8gcGFyc2UgaW5saW5lLWxldmVsIG5vZGVzLlxuICovXG5cblBhcnNlci5wcm90b3R5cGUuaW5saW5lTWV0aG9kcyA9IFtcbiAgICAnZXNjYXBlJyxcbiAgICAnYXV0b0xpbmsnLFxuICAgICd1cmwnLFxuICAgICd0YWcnLFxuICAgICdsaW5rJyxcbiAgICAncmVmZXJlbmNlJyxcbiAgICAnc2hvcnRjdXRSZWZlcmVuY2UnLFxuICAgICdzdHJvbmcnLFxuICAgICdlbXBoYXNpcycsXG4gICAgJ2RlbGV0aW9uJyxcbiAgICAnaW5saW5lQ29kZScsXG4gICAgJ2JyZWFrJyxcbiAgICAnaW5saW5lVGV4dCdcbl07XG5cbi8qKlxuICogSW5saW5lIHRva2VuaXplci5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgcGFyc2VyID0gbmV3IFBhcnNlcigpO1xuICogICBwYXJzZXIudG9rZW5pemVJbmxpbmUoJ19mb29fJyk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQ29udGVudC5cbiAqIEByZXR1cm4ge0FycmF5LjxPYmplY3Q+fSAtIE5vZGVzLlxuICovXG5cblBhcnNlci5wcm90b3R5cGUudG9rZW5pemVJbmxpbmUgPSB0b2tlbml6ZUZhY3RvcnkoSU5MSU5FKTtcblxuLypcbiAqIEV4cG9zZSBgdG9rZW5pemVGYWN0b3J5YCBzbyBkZXBlbmRlbmNpZXMgY291bGQgY3JlYXRlXG4gKiB0aGVpciBvd24gdG9rZW5pemVycy5cbiAqL1xuXG5QYXJzZXIucHJvdG90eXBlLnRva2VuaXplRmFjdG9yeSA9IHRva2VuaXplRmFjdG9yeTtcblxuLypcbiAqIEV4cG9zZSBgcGFyc2VgIG9uIGBtb2R1bGUuZXhwb3J0c2AuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZXI7XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUtMjAxNiBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSByZW1hcms6c3RyaW5naWZ5XG4gKiBAdmVyc2lvbiAzLjIuMlxuICogQGZpbGVvdmVydmlldyBDb21waWxlIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIGludG9cbiAqICAgYSBtYXJrZG93biBkb2N1bWVudC5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLypcbiAqIERlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgZGVjb2RlID0gcmVxdWlyZSgncGFyc2UtZW50aXRpZXMnKTtcbnZhciBlbmNvZGUgPSByZXF1aXJlKCdzdHJpbmdpZnktZW50aXRpZXMnKTtcbnZhciB0YWJsZSA9IHJlcXVpcmUoJ21hcmtkb3duLXRhYmxlJyk7XG52YXIgcmVwZWF0ID0gcmVxdWlyZSgncmVwZWF0LXN0cmluZycpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoJ2V4dGVuZC5qcycpO1xudmFyIGNjb3VudCA9IHJlcXVpcmUoJ2Njb3VudCcpO1xudmFyIGxvbmdlc3RTdHJlYWsgPSByZXF1aXJlKCdsb25nZXN0LXN0cmVhaycpO1xudmFyIHV0aWxpdGllcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzLmpzJyk7XG52YXIgZGVmYXVsdE9wdGlvbnMgPSByZXF1aXJlKCcuL2RlZmF1bHRzLmpzJykuc3RyaW5naWZ5O1xuXG4vKlxuICogTWV0aG9kcy5cbiAqL1xuXG52YXIgcmFpc2UgPSB1dGlsaXRpZXMucmFpc2U7XG52YXIgdmFsaWRhdGUgPSB1dGlsaXRpZXMudmFsaWRhdGU7XG52YXIgc3RhdGVUb2dnbGVyID0gdXRpbGl0aWVzLnN0YXRlVG9nZ2xlcjtcbnZhciBtZXJnZWFibGUgPSB1dGlsaXRpZXMubWVyZ2VhYmxlO1xudmFyIE1FUkdFQUJMRV9OT0RFUyA9IHV0aWxpdGllcy5NRVJHRUFCTEVfTk9ERVM7XG5cbi8qXG4gKiBDb25zdGFudHMuXG4gKi9cblxudmFyIElOREVOVCA9IDQ7XG52YXIgTUlOSU1VTV9DT0RFX0ZFTkNFX0xFTkdUSCA9IDM7XG52YXIgWUFNTF9GRU5DRV9MRU5HVEggPSAzO1xudmFyIE1JTklNVU1fUlVMRV9MRU5HVEggPSAzO1xudmFyIE1BSUxUTyA9ICdtYWlsdG86JztcbnZhciBFUlJPUl9MSVNUX0lURU1fSU5ERU5UID0gJ0Nhbm5vdCBpbmRlbnQgY29kZSBwcm9wZXJseS4gU2VlICcgK1xuICAgICdodHRwOi8vZ2l0LmlvL21kYXN0LWxpaSc7XG5cbi8qXG4gKiBFeHByZXNzaW9ucy5cbiAqL1xuXG52YXIgRVhQUkVTU0lPTlNfV0hJVEVfU1BBQ0UgPSAvXFxzLztcblxuLypcbiAqIE5haXZlIGZlbmNlIGV4cHJlc3Npb24uXG4gKi9cblxudmFyIEZFTkNFID0gLyhbYH5dKVxcMXsyfS87XG5cbi8qXG4gKiBFeHByZXNzaW9uIGZvciBhIHByb3RvY29sLlxuICpcbiAqIEBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VUklfc2NoZW1lI0dlbmVyaWNfc3ludGF4XG4gKi9cblxudmFyIFBST1RPQ09MID0gL15bYS16XVthLXorLi1dKzpcXC8/L2k7XG5cbi8qXG4gKiBQdW5jdHVhdGlvbiBjaGFyYWN0ZXJzLlxuICovXG5cbnZhciBQVU5DVFVBVElPTiA9IC9bLSFcIiMkJSYnKCkqKywuXFwvOjs8PT4/QFxcW1xcXFxcXF1eYHt8fX5fXS87XG5cbi8qXG4gKiBDaGFyYWN0ZXJzLlxuICovXG5cbnZhciBBTkdMRV9CUkFDS0VUX0NMT1NFID0gJz4nO1xudmFyIEFOR0xFX0JSQUNLRVRfT1BFTiA9ICc8JztcbnZhciBBU1RFUklTSyA9ICcqJztcbnZhciBCQUNLU0xBU0ggPSAnXFxcXCc7XG52YXIgQ0FSRVQgPSAnXic7XG52YXIgQ09MT04gPSAnOic7XG52YXIgU0VNSUNPTE9OID0gJzsnO1xudmFyIERBU0ggPSAnLSc7XG52YXIgRE9UID0gJy4nO1xudmFyIEVNUFRZID0gJyc7XG52YXIgRVFVQUxTID0gJz0nO1xudmFyIEVYQ0xBTUFUSU9OX01BUksgPSAnISc7XG52YXIgSEFTSCA9ICcjJztcbnZhciBBTVBFUlNBTkQgPSAnJic7XG52YXIgTElORSA9ICdcXG4nO1xudmFyIENBUlJJQUdFID0gJ1xccic7XG52YXIgRk9STV9GRUVEID0gJ1xcZic7XG52YXIgUEFSRU5USEVTSVNfT1BFTiA9ICcoJztcbnZhciBQQVJFTlRIRVNJU19DTE9TRSA9ICcpJztcbnZhciBQSVBFID0gJ3wnO1xudmFyIFBMVVMgPSAnKyc7XG52YXIgUVVPVEVfRE9VQkxFID0gJ1wiJztcbnZhciBRVU9URV9TSU5HTEUgPSAnXFwnJztcbnZhciBTUEFDRSA9ICcgJztcbnZhciBUQUIgPSAnXFx0JztcbnZhciBWRVJUSUNBTF9UQUIgPSAnXFx1MDAwQic7XG52YXIgU1FVQVJFX0JSQUNLRVRfT1BFTiA9ICdbJztcbnZhciBTUVVBUkVfQlJBQ0tFVF9DTE9TRSA9ICddJztcbnZhciBUSUNLID0gJ2AnO1xudmFyIFRJTERFID0gJ34nO1xudmFyIFVOREVSU0NPUkUgPSAnXyc7XG5cbi8qXG4gKiBFbnRpdGllcy5cbiAqL1xuXG52YXIgRU5USVRZX0FNUEVSU0FORCA9IEFNUEVSU0FORCArICdhbXAnICsgU0VNSUNPTE9OO1xudmFyIEVOVElUWV9BTkdMRV9CUkFDS0VUX09QRU4gPSBBTVBFUlNBTkQgKyAnbHQnICsgU0VNSUNPTE9OO1xudmFyIEVOVElUWV9DT0xPTiA9IEFNUEVSU0FORCArICcjeDNBJyArIFNFTUlDT0xPTjtcblxuLypcbiAqIENoYXJhY3RlciBjb21iaW5hdGlvbnMuXG4gKi9cblxudmFyIEJSRUFLID0gTElORSArIExJTkU7XG52YXIgR0FQID0gQlJFQUsgKyBMSU5FO1xudmFyIERPVUJMRV9USUxERSA9IFRJTERFICsgVElMREU7XG5cbi8qXG4gKiBBbGxvd2VkIGVudGl0eSBvcHRpb25zLlxuICovXG5cbnZhciBFTlRJVFlfT1BUSU9OUyA9IHt9O1xuXG5FTlRJVFlfT1BUSU9OUy50cnVlID0gdHJ1ZTtcbkVOVElUWV9PUFRJT05TLmZhbHNlID0gdHJ1ZTtcbkVOVElUWV9PUFRJT05TLm51bWJlcnMgPSB0cnVlO1xuRU5USVRZX09QVElPTlMuZXNjYXBlID0gdHJ1ZTtcblxuLypcbiAqIEFsbG93ZWQgbGlzdC1idWxsZXQgY2hhcmFjdGVycy5cbiAqL1xuXG52YXIgTElTVF9CVUxMRVRTID0ge307XG5cbkxJU1RfQlVMTEVUU1tBU1RFUklTS10gPSB0cnVlO1xuTElTVF9CVUxMRVRTW0RBU0hdID0gdHJ1ZTtcbkxJU1RfQlVMTEVUU1tQTFVTXSA9IHRydWU7XG5cbi8qXG4gKiBBbGxvd2VkIGhvcml6b250YWwtcnVsZSBidWxsZXQgY2hhcmFjdGVycy5cbiAqL1xuXG52YXIgSE9SSVpPTlRBTF9SVUxFX0JVTExFVFMgPSB7fTtcblxuSE9SSVpPTlRBTF9SVUxFX0JVTExFVFNbQVNURVJJU0tdID0gdHJ1ZTtcbkhPUklaT05UQUxfUlVMRV9CVUxMRVRTW0RBU0hdID0gdHJ1ZTtcbkhPUklaT05UQUxfUlVMRV9CVUxMRVRTW1VOREVSU0NPUkVdID0gdHJ1ZTtcblxuLypcbiAqIEFsbG93ZWQgZW1waGFzaXMgY2hhcmFjdGVycy5cbiAqL1xuXG52YXIgRU1QSEFTSVNfTUFSS0VSUyA9IHt9O1xuXG5FTVBIQVNJU19NQVJLRVJTW1VOREVSU0NPUkVdID0gdHJ1ZTtcbkVNUEhBU0lTX01BUktFUlNbQVNURVJJU0tdID0gdHJ1ZTtcblxuLypcbiAqIEFsbG93ZWQgZmVuY2UgbWFya2Vycy5cbiAqL1xuXG52YXIgRkVOQ0VfTUFSS0VSUyA9IHt9O1xuXG5GRU5DRV9NQVJLRVJTW1RJQ0tdID0gdHJ1ZTtcbkZFTkNFX01BUktFUlNbVElMREVdID0gdHJ1ZTtcblxuLypcbiAqIFdoaWNoIG1ldGhvZCB0byB1c2UgYmFzZWQgb24gYGxpc3Qub3JkZXJlZGAuXG4gKi9cblxudmFyIE9SREVSRURfTUFQID0ge307XG5cbk9SREVSRURfTUFQLnRydWUgPSAndmlzaXRPcmRlcmVkSXRlbXMnO1xuT1JERVJFRF9NQVAuZmFsc2UgPSAndmlzaXRVbm9yZGVyZWRJdGVtcyc7XG5cbi8qXG4gKiBBbGxvd2VkIGxpc3QtaXRlbS1pbmRlbnQncy5cbiAqL1xuXG52YXIgTElTVF9JVEVNX0lOREVOVFMgPSB7fTtcblxudmFyIExJU1RfSVRFTV9UQUIgPSAndGFiJztcbnZhciBMSVNUX0lURU1fT05FID0gJzEnO1xudmFyIExJU1RfSVRFTV9NSVhFRCA9ICdtaXhlZCc7XG5cbkxJU1RfSVRFTV9JTkRFTlRTW0xJU1RfSVRFTV9PTkVdID0gdHJ1ZTtcbkxJU1RfSVRFTV9JTkRFTlRTW0xJU1RfSVRFTV9UQUJdID0gdHJ1ZTtcbkxJU1RfSVRFTV9JTkRFTlRTW0xJU1RfSVRFTV9NSVhFRF0gPSB0cnVlO1xuXG4vKlxuICogV2hpY2ggY2hlY2tib3ggdG8gdXNlLlxuICovXG5cbnZhciBDSEVDS0JPWF9NQVAgPSB7fTtcblxuQ0hFQ0tCT1hfTUFQLm51bGwgPSBFTVBUWTtcbkNIRUNLQk9YX01BUC51bmRlZmluZWQgPSBFTVBUWTtcbkNIRUNLQk9YX01BUC50cnVlID0gU1FVQVJFX0JSQUNLRVRfT1BFTiArICd4JyArIFNRVUFSRV9CUkFDS0VUX0NMT1NFICsgU1BBQ0U7XG5DSEVDS0JPWF9NQVAuZmFsc2UgPSBTUVVBUkVfQlJBQ0tFVF9PUEVOICsgU1BBQ0UgKyBTUVVBUkVfQlJBQ0tFVF9DTE9TRSArXG4gICAgU1BBQ0U7XG5cbi8qKlxuICogRW5jb2RlIG5vb3AuXG4gKiBTaW1wbHkgcmV0dXJucyB0aGUgZ2l2ZW4gdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGVuY29kZSA9IGVuY29kZU5vb3AoKTtcbiAqICAgZW5jb2RlKCdBVCZUJykgLy8gJ0FUJlQnXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQ29udGVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb250ZW50LCB3aXRob3V0IGFueSBtb2RpZmljYXRpb25zLlxuICovXG5mdW5jdGlvbiBlbmNvZGVOb29wKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgdG8gZW5jb2RlIEhUTUwgZW50aXRpZXMuXG4gKiBDcmVhdGVzIGEgbm8tb3BlcmF0aW9uIGZ1bmN0aW9uIHdoZW4gYHR5cGVgIGlzXG4gKiBgJ2ZhbHNlJ2AsIGEgZnVuY3Rpb24gd2hpY2ggZW5jb2RlcyB1c2luZyBuYW1lZFxuICogcmVmZXJlbmNlcyB3aGVuIGB0eXBlYCBpcyBgJ3RydWUnYCwgYW5kIGEgZnVuY3Rpb25cbiAqIHdoaWNoIGVuY29kZXMgdXNpbmcgbnVtYmVyZWQgcmVmZXJlbmNlcyB3aGVuIGB0eXBlYCBpc1xuICogYCdudW1iZXJzJ2AuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgZW5jb2RlRmFjdG9yeSgnZmFsc2UnKSgnQVQmVCcpIC8vICdBVCZUJ1xuICogICBlbmNvZGVGYWN0b3J5KCd0cnVlJykoJ0FUJlQnKSAvLyAnQVQmYW1wO1QnXG4gKiAgIGVuY29kZUZhY3RvcnkoJ251bWJlcnMnKSgnQVQmVCcpIC8vICdBVFQmI3gyNjtUJ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gRWl0aGVyIGAndHJ1ZSdgLCBgJ2ZhbHNlJ2AsIG9yXG4gKiAgIGAnbnVtYmVycydgLlxuICogQHJldHVybiB7ZnVuY3Rpb24oc3RyaW5nKTogc3RyaW5nfSAtIEZ1bmN0aW9uIHdoaWNoXG4gKiAgIHRha2VzIGEgdmFsdWUgYW5kIHJldHVybnMgaXRzIGVuY29kZWQgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlRmFjdG9yeSh0eXBlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7fTtcblxuICAgIGlmICh0eXBlID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiBlbmNvZGVOb29wO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAndHJ1ZScpIHtcbiAgICAgICAgb3B0aW9ucy51c2VOYW1lZFJlZmVyZW5jZXMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnZXNjYXBlJykge1xuICAgICAgICBvcHRpb25zLmVzY2FwZU9ubHkgPSBvcHRpb25zLnVzZU5hbWVkUmVmZXJlbmNlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5jb2RlIEhUTUwgZW50aXRpZXMgdXNpbmcgYGhlYCB1c2luZyBib3VuZCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9oZSNzdHJpY3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICAvLyBXaGVuIGB0eXBlYCBpcyBgJ3RydWUnYC5cbiAgICAgKiAgIGVuY29kZSgnQVQmVCcpOyAvLyAnQVQmYW1wO1QnXG4gICAgICpcbiAgICAgKiAgIC8vIFdoZW4gYHR5cGVgIGlzIGAnbnVtYmVycydgLlxuICAgICAqICAgZW5jb2RlKCdBVCZUJyk7IC8vICdBVFQmI3gyNjtUJ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gQ29udGVudC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW25vZGVdIC0gTm9kZSB3aGljaCBpcyBjb21waWxlZC5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gRW5jb2RlZCBjb250ZW50LlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdoZW4gYGZpbGUucXVpZXRgIGlzIG5vdCBgdHJ1ZWAuXG4gICAgICogICBIb3dldmVyLCBieSBkZWZhdWx0IGBoZWAgZG9lcyBub3QgdGhyb3cgb25cbiAgICAgKiAgIHBhcnNlIGVycm9ycywgYnV0IHdoZW5cbiAgICAgKiAgIGBoZS5lbmNvZGUub3B0aW9ucy5zdHJpY3Q6IHRydWVgLCB0aGV5IG9jY3VyIG9uXG4gICAgICogICBpbnZhbGlkIEhUTUwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5jb2Rlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZW5jb2RlKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5jb2Rlcjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgSFRNTCBlbnRpdHkgdGhhdCBpcyBhIHByZWZpeCBvZlxuICogdGhlIGdpdmVuIHN0cmluZyAoZXhjbHVkaW5nIHRoZSBhbXBlcnNhbmQpLCAwIGlmIGl0XG4gKiBkb2VzIG5vdCBzdGFydCB3aXRoIGFuIGVudGl0eS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBlbnRpdHlQcmVmaXhMZW5ndGgoJyZjb3B5Y2F0JykgLy8gNFxuICogICBlbnRpdHlQcmVmaXhMZW5ndGgoJyZmb28gJmFtcCAmYmFyJykgLy8gMFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIElucHV0IHN0cmluZy5cbiAqIEByZXR1cm4ge251bWJlcn0gLSBMZW5ndGggb2YgYW4gZW50aXR5LlxuICovXG5mdW5jdGlvbiBlbnRpdHlQcmVmaXhMZW5ndGgodmFsdWUpIHtcbiAgICB2YXIgcHJlZml4O1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gQ3VycmVudGx5IGFsc28gdGVzdGVkIGZvciBhdFxuICAgICAqIGltcGxlbWVudGlvbiwgYnV0IHdlIGtlZXAgaXQgaGVyZSBiZWNhdXNlIHRoYXTigJlzXG4gICAgICogcHJvcGVyLiAqL1xuICAgIGlmICh2YWx1ZS5jaGFyQXQoMCkgIT09IEFNUEVSU0FORCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwcmVmaXggPSB2YWx1ZS5zcGxpdChBTVBFUlNBTkQsIDIpLmpvaW4oQU1QRVJTQU5EKTtcblxuICAgIHJldHVybiBwcmVmaXgubGVuZ3RoIC0gZGVjb2RlKHByZWZpeCkubGVuZ3RoO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHN0cmluZyBzdGFydHMgd2l0aCBIVE1MIGVudGl0eS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBzdGFydHNXaXRoRW50aXR5KCcmY29weWNhdCcpIC8vIHRydWVcbiAqICAgc3RhcnRzV2l0aEVudGl0eSgnJmZvbyAmYW1wICZiYXInKSAvLyBmYWxzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybiB7bnVtYmVyfSAtIFdoZXRoZXIgYHZhbHVlYCBzdGFydHMgYW4gZW50aXR5LlxuICovXG5mdW5jdGlvbiBzdGFydHNXaXRoRW50aXR5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGVudGl0eVByZWZpeExlbmd0aCh2YWx1ZSkgPiAwO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBjaGFyYWN0ZXJgIGlzIGEgdmFsaWQgYWxpZ25tZW50IHJvdyBjaGFyYWN0ZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgaXNBbGlnbm1lbnRSb3dDaGFyYWN0ZXIoJzonKSAvLyB0cnVlXG4gKiAgIGlzQWxpZ25tZW50Um93Q2hhcmFjdGVyKCc9JykgLy8gZmFsc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhcmFjdGVyIC0gQ2hhcmFjdGVyIHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBXaGV0aGVyIGBjaGFyYWN0ZXJgIGlzIGEgdmFsaWRcbiAqICAgYWxpZ25tZW50IHJvdyBjaGFyYWN0ZXIuXG4gKi9cbmZ1bmN0aW9uIGlzQWxpZ25tZW50Um93Q2hhcmFjdGVyKGNoYXJhY3Rlcikge1xuICAgIHJldHVybiBjaGFyYWN0ZXIgPT09IENPTE9OIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gREFTSCB8fFxuICAgICAgICBjaGFyYWN0ZXIgPT09IFNQQUNFIHx8XG4gICAgICAgIGNoYXJhY3RlciA9PT0gUElQRTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgaW5kZXhgIGluIGB2YWx1ZWAgaXMgaW5zaWRlIGFuIGFsaWdubWVudCByb3cuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgaXNJbkFsaWdubWVudFJvdygnOi0tOicsIDIpIC8vIHRydWVcbiAqICAgaXNJbkFsaWdubWVudFJvdygnOi0tOlxcbjotKi06JywgOSkgLy8gZmFsc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFBvc2l0aW9uIGluIGB2YWx1ZWAgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFdoZXRoZXIgYGluZGV4YCBpbiBgdmFsdWVgIGlzIGluXG4gKiAgIGFuIGFsaWdubWVudCByb3cuXG4gKi9cbmZ1bmN0aW9uIGlzSW5BbGlnbm1lbnRSb3codmFsdWUsIGluZGV4KSB7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgc3RhcnQgPSBpbmRleDtcbiAgICB2YXIgY2hhcmFjdGVyO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBMSU5FKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBbGlnbm1lbnRSb3dDaGFyYWN0ZXIoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5kZXggPSBzdGFydDtcblxuICAgIHdoaWxlICgtLWluZGV4ID4gLTEpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBMSU5FKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBbGlnbm1lbnRSb3dDaGFyYWN0ZXIoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRmFjdG9yeSB0byBlc2NhcGUgY2hhcmFjdGVycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgZXNjYXBlID0gZXNjYXBlRmFjdG9yeSh7IGNvbW1vbm1hcms6IHRydWUgfSk7XG4gKiAgIGVzY2FwZSgneCp4JywgeyB0eXBlOiAndGV4dCcsIHZhbHVlOiAneCp4JyB9KSAvLyAneFxcXFwqeCdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIENvbXBpbGVyIG9wdGlvbnMuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbih2YWx1ZSwgbm9kZSwgcGFyZW50KTogc3RyaW5nfSAtIEZ1bmN0aW9uIHdoaWNoXG4gKiAgIHRha2VzIGEgdmFsdWUgYW5kIGEgbm9kZSBhbmQgKG9wdGlvbmFsbHkpIGl0cyBwYXJlbnQgYW5kIHJldHVybnNcbiAqICAgaXRzIGVzY2FwZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUZhY3Rvcnkob3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIEVzY2FwZSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzIGluIGEgbm9kZSdzIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gZXNjYXBlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gTm9kZSBpbiB3aGljaCBgdmFsdWVgIGV4aXN0cy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmVudF0gLSBQYXJlbnQgb2YgYG5vZGVgLlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gLSBFc2NhcGVkIGB2YWx1ZWAuXG4gICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGVzY2FwZSh2YWx1ZSwgbm9kZSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGdmbSA9IG9wdGlvbnMuZ2ZtO1xuICAgICAgICB2YXIgY29tbW9ubWFyayA9IG9wdGlvbnMuY29tbW9ubWFyaztcbiAgICAgICAgdmFyIHNpYmxpbmdzID0gcGFyZW50ICYmIHBhcmVudC5jaGlsZHJlbjtcbiAgICAgICAgdmFyIGluZGV4ID0gc2libGluZ3MgJiYgc2libGluZ3MuaW5kZXhPZihub2RlKTtcbiAgICAgICAgdmFyIHByZXYgPSBzaWJsaW5ncyAmJiBzaWJsaW5nc1tpbmRleCAtIDFdO1xuICAgICAgICB2YXIgbmV4dCA9IHNpYmxpbmdzICYmIHNpYmxpbmdzW2luZGV4ICsgMV07XG4gICAgICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IC0xO1xuICAgICAgICB2YXIgcXVldWUgPSBbXTtcbiAgICAgICAgdmFyIGVzY2FwZWQgPSBxdWV1ZTtcbiAgICAgICAgdmFyIGFmdGVyTmV3TGluZTtcbiAgICAgICAgdmFyIGNoYXJhY3RlcjtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgYWZ0ZXJOZXdMaW5lID0gcHJldi50eXBlID09PSAndGV4dCcgJiYgL1xcblxccyokLy50ZXN0KHByZXYudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgYWZ0ZXJOZXdMaW5lID0gcGFyZW50LnR5cGUgPT09ICdwYXJhZ3JhcGgnO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKCsrcG9zaXRpb24gPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChwb3NpdGlvbik7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPT09IEJBQ0tTTEFTSCB8fFxuICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gVElDSyB8fFxuICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQVNURVJJU0sgfHxcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPT09IFNRVUFSRV9CUkFDS0VUX09QRU4gfHxcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPT09IFVOREVSU0NPUkUgfHxcbiAgICAgICAgICAgICAgICAoc2VsZi5pbkxpbmsgJiYgY2hhcmFjdGVyID09PSBTUVVBUkVfQlJBQ0tFVF9DTE9TRSkgfHxcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIGdmbSAmJlxuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPT09IFBJUEUgJiZcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pblRhYmxlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0luQWxpZ25tZW50Um93KHZhbHVlLCBwb3NpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFmdGVyTmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goQkFDS1NMQVNIKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBBTkdMRV9CUkFDS0VUX09QRU4pIHtcbiAgICAgICAgICAgICAgICBhZnRlck5ld0xpbmUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGlmIChjb21tb25tYXJrKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goQkFDS1NMQVNIKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKEVOVElUWV9BTkdMRV9CUkFDS0VUX09QRU4pO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIGdmbSAmJlxuICAgICAgICAgICAgICAgICFzZWxmLmluTGluayAmJlxuICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQ09MT04gJiZcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnNsaWNlKC02KS5qb2luKEVNUFRZKSA9PT0gJ21haWx0bycgfHxcbiAgICAgICAgICAgICAgICAgICAgcXVldWUuc2xpY2UoLTUpLmpvaW4oRU1QVFkpID09PSAnaHR0cHMnIHx8XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnNsaWNlKC00KS5qb2luKEVNUFRZKSA9PT0gJ2h0dHAnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXJOZXdMaW5lID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29tbW9ubWFyaykge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKEJBQ0tTTEFTSCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChFTlRJVFlfQ09MT04pO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBJbXBvc3NpYmxlIHRvIHRlc3Qgd2l0aFxuICAgICAgICAgICAgICogdGhlIGN1cnJlbnQgc2V0LXVwLiAgV2UgbmVlZCB0ZXN0cyB3aGljaCB0cnlcbiAgICAgICAgICAgICAqIHRvIGZvcmNlIG1hcmtkb3duIGNvbnRlbnQgaW50byB0aGUgdHJlZS4gKi9cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID09PSBBTVBFUlNBTkQgJiZcbiAgICAgICAgICAgICAgICBzdGFydHNXaXRoRW50aXR5KHZhbHVlLnNsaWNlKHBvc2l0aW9uKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFmdGVyTmV3TGluZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1vbm1hcmspIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChCQUNLU0xBU0gpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goRU5USVRZX0FNUEVSU0FORCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgZ2ZtICYmXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyID09PSBUSUxERSAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdChwb3NpdGlvbiArIDEpID09PSBUSUxERVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaChCQUNLU0xBU0gsIFRJTERFKTtcbiAgICAgICAgICAgICAgICBhZnRlck5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IExJTkUpIHtcbiAgICAgICAgICAgICAgICBhZnRlck5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhZnRlck5ld0xpbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PT0gQU5HTEVfQlJBQ0tFVF9DTE9TRSB8fFxuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPT09IEhBU0ggfHxcbiAgICAgICAgICAgICAgICAgICAgTElTVF9CVUxMRVRTW2NoYXJhY3Rlcl1cbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChCQUNLU0xBU0gpO1xuICAgICAgICAgICAgICAgICAgICBhZnRlck5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgIT09IFNQQUNFICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gVEFCICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciAhPT0gQ0FSUklBR0UgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICE9PSBWRVJUSUNBTF9UQUIgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyICE9PSBGT1JNX0ZFRURcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJOZXdMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGNoYXJhY3Rlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBNdWx0aS1ub2RlIHZlcnNpb25zLlxuICAgICAgICAgKi9cblxuICAgICAgICBpZiAoc2libGluZ3MgJiYgbm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBDaGVjayBmb3IgYW4gb3BlbmluZyBwYXJlbnRoZXNlcyBhZnRlciBhXG4gICAgICAgICAgICAgKiBsaW5rLXJlZmVyZW5jZSAod2hpY2ggY2FuIGJlIGpvaW5lZCBieVxuICAgICAgICAgICAgICogd2hpdGUtc3BhY2UpLlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwcmV2ICYmXG4gICAgICAgICAgICAgICAgcHJldi5yZWZlcmVuY2VUeXBlID09PSAnc2hvcnRjdXQnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IC0xO1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9IGVzY2FwZWQubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKCsrcG9zaXRpb24gPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gZXNjYXBlZFtwb3NpdGlvbl07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gU1BBQ0UgfHwgY2hhcmFjdGVyID09PSBUQUIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gUEFSRU5USEVTSVNfT1BFTikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFtwb3NpdGlvbl0gPSBCQUNLU0xBU0ggKyBjaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDT0xPTikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1vbm1hcmspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkW3Bvc2l0aW9uXSA9IEJBQ0tTTEFTSCArIGNoYXJhY3RlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFtwb3NpdGlvbl0gPSBFTlRJVFlfQ09MT047XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBFbnN1cmUgbm9uLWF1dG8tbGlua3MgYXJlIG5vdCBzZWVuIGFzIGxpbmtzLlxuICAgICAgICAgICAgICogVGhpcyBwYXR0ZXJuIG5lZWRzIHRvIGNoZWNrIHRoZSBwcmVjZWRpbmdcbiAgICAgICAgICAgICAqIG5vZGVzIHRvby5cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZ2ZtICYmXG4gICAgICAgICAgICAgICAgIXNlbGYuaW5MaW5rICYmXG4gICAgICAgICAgICAgICAgcHJldiAmJlxuICAgICAgICAgICAgICAgIHByZXYudHlwZSA9PT0gJ3RleHQnICYmXG4gICAgICAgICAgICAgICAgdmFsdWUuY2hhckF0KDApID09PSBDT0xPTlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcXVldWUgPSBwcmV2LnZhbHVlLnNsaWNlKC02KTtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcXVldWUgPT09ICdtYWlsdG8nIHx8XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnNsaWNlKC01KSA9PT0gJ2h0dHBzJyB8fFxuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5zbGljZSgtNCkgPT09ICdodHRwJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbW9ubWFyaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZC51bnNoaWZ0KEJBQ0tTTEFTSCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkLnNwbGljZSgwLCAxLCBFTlRJVFlfQ09MT04pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogRXNjYXBlIGFtcGVyc2FuZCBpZiBpdCB3b3VsZCBvdGhlcndpc2VcbiAgICAgICAgICAgICAqIHN0YXJ0IGFuIGVudGl0eS5cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbmV4dCAmJlxuICAgICAgICAgICAgICAgIG5leHQudHlwZSA9PT0gJ3RleHQnICYmXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoLTEpID09PSBBTVBFUlNBTkQgJiZcbiAgICAgICAgICAgICAgICBzdGFydHNXaXRoRW50aXR5KEFNUEVSU0FORCArIG5leHQudmFsdWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tbW9ubWFyaykge1xuICAgICAgICAgICAgICAgICAgICBlc2NhcGVkLnNwbGljZShlc2NhcGVkLmxlbmd0aCAtIDEsIDAsIEJBQ0tTTEFTSCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZC5wdXNoKCdhbXAnLCBTRU1JQ09MT04pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIEVzY2FwZSBkb3VibGUgdGlsZGVzIGluIEdGTS5cbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZ2ZtICYmXG4gICAgICAgICAgICAgICAgbmV4dCAmJlxuICAgICAgICAgICAgICAgIG5leHQudHlwZSA9PT0gJ3RleHQnICYmXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoLTEpID09PSBUSUxERSAmJlxuICAgICAgICAgICAgICAgIG5leHQudmFsdWUuY2hhckF0KDApID09PSBUSUxERVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZXNjYXBlZC5zcGxpY2UoZXNjYXBlZC5sZW5ndGggLSAxLCAwLCBCQUNLU0xBU0gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVzY2FwZWQuam9pbihFTVBUWSk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBXcmFwIGB1cmxgIGluIGFuZ2xlIGJyYWNrZXRzIHdoZW4gbmVlZGVkLCBvciB3aGVuXG4gKiBmb3JjZWQuXG4gKlxuICogSW4gbGlua3MsIGltYWdlcywgYW5kIGRlZmluaXRpb25zLCB0aGUgVVJMIHBhcnQgbmVlZHNcbiAqIHRvIGJlIGVuY2xvc2VkIHdoZW4gaXQ6XG4gKlxuICogLSBoYXMgYSBsZW5ndGggb2YgYDBgO1xuICogLSBjb250YWlucyB3aGl0ZS1zcGFjZTtcbiAqIC0gaGFzIG1vcmUgb3IgbGVzcyBvcGVuaW5nIHRoYW4gY2xvc2luZyBwYXJlbnRoZXNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBlbmNsb3NlVVJJKCdmb28gYmFyJykgLy8gJzxmb28gYmFyPidcbiAqICAgZW5jbG9zZVVSSSgnZm9vKGJhcihiYXopJykgLy8gJzxmb28oYmFyKGJheik+J1xuICogICBlbmNsb3NlVVJJKCcnKSAvLyAnPD4nXG4gKiAgIGVuY2xvc2VVUkkoJ2V4YW1wbGUuY29tJykgLy8gJ2V4YW1wbGUuY29tJ1xuICogICBlbmNsb3NlVVJJKCdleGFtcGxlLmNvbScsIHRydWUpIC8vICc8ZXhhbXBsZS5jb20+J1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmkgLSBVUkkgdG8gZW5jbG9zZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbj99IFthbHdheXNdIC0gRm9yY2UgZW5jbG9zaW5nLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBQcm9wZXJseSBlbmNsb3NlZCBgdXJpYC5cbiAqL1xuZnVuY3Rpb24gZW5jbG9zZVVSSSh1cmksIGFsd2F5cykge1xuICAgIGlmIChcbiAgICAgICAgYWx3YXlzIHx8XG4gICAgICAgICF1cmkubGVuZ3RoIHx8XG4gICAgICAgIEVYUFJFU1NJT05TX1dISVRFX1NQQUNFLnRlc3QodXJpKSB8fFxuICAgICAgICBjY291bnQodXJpLCBQQVJFTlRIRVNJU19PUEVOKSAhPT0gY2NvdW50KHVyaSwgUEFSRU5USEVTSVNfQ0xPU0UpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBBTkdMRV9CUkFDS0VUX09QRU4gKyB1cmkgKyBBTkdMRV9CUkFDS0VUX0NMT1NFO1xuICAgIH1cblxuICAgIHJldHVybiB1cmk7XG59XG5cbi8qKlxuICogVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byBzdXBwb3J0IG5lc3RlZCBkZWxpbWl0ZXJzXG4gKiBhY3Jvc3MgTWFya2Rvd24ucGwsIENvbW1vbk1hcmssIGFuZCBHaXRIdWIgKFJlZENhcnBldCkuXG4gKiBUaGUgZm9sbG93aW5nIGNvZGUgc3VwcG9ydHMgTWFya2Rvd24ucGwgYW5kIEdpdEh1Yi5cbiAqIENvbW1vbk1hcmsgaXMgbm90IHN1cHBvcnRlZCB3aGVuIG1peGluZyBkb3VibGUtIGFuZFxuICogc2luZ2xlIHF1b3RlcyBpbnNpZGUgYSB0aXRsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92bWcvcmVkY2FycGV0L2lzc3Vlcy80NzNcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2pnbS9Db21tb25NYXJrL2lzc3Vlcy8zMDhcbiAqXG4gKiBAZXhhbXBsZVxuICogICBlbmNsb3NlVGl0bGUoJ2ZvbycpIC8vICdcImZvb1wiJ1xuICogICBlbmNsb3NlVGl0bGUoJ2ZvbyBcXCdiYXJcXCcgYmF6JykgLy8gJ1wiZm9vIFxcJ2JhclxcJyBiYXpcIidcbiAqICAgZW5jbG9zZVRpdGxlKCdmb28gXCJiYXJcIiBiYXonKSAvLyAnXFwnZm9vIFwiYmFyXCIgYmF6XFwnJ1xuICogICBlbmNsb3NlVGl0bGUoJ2ZvbyBcImJhclwiIFxcJ2JhelxcJycpIC8vICdcImZvbyBcImJhclwiIFxcJ2JhelxcJ1wiJ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIENvbnRlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gUHJvcGVybHkgZW5jbG9zZWQgdGl0bGUuXG4gKi9cbmZ1bmN0aW9uIGVuY2xvc2VUaXRsZSh0aXRsZSkge1xuICAgIHZhciBkZWxpbWl0ZXIgPSBRVU9URV9ET1VCTEU7XG5cbiAgICBpZiAodGl0bGUuaW5kZXhPZihkZWxpbWl0ZXIpICE9PSAtMSkge1xuICAgICAgICBkZWxpbWl0ZXIgPSBRVU9URV9TSU5HTEU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGltaXRlciArIHRpdGxlICsgZGVsaW1pdGVyO1xufVxuXG4vKipcbiAqIFBhZCBgdmFsdWVgIHdpdGggYGxldmVsICogSU5ERU5UYCBzcGFjZXMuICBSZXNwZWN0c1xuICogbGluZXMuIElnbm9yZXMgZW1wdHkgbGluZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgcGFkKCdmb28nLCAxKSAvLyAnICAgIGZvbydcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBDb250ZW50LlxuICogQHBhcmFtIHtudW1iZXJ9IGxldmVsIC0gSW5kZW50YXRpb24gbGV2ZWwuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gUGFkZGVkIGB2YWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIHBhZCh2YWx1ZSwgbGV2ZWwpIHtcbiAgICB2YXIgaW5kZXg7XG4gICAgdmFyIHBhZGRpbmc7XG5cbiAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KExJTkUpO1xuXG4gICAgaW5kZXggPSB2YWx1ZS5sZW5ndGg7XG4gICAgcGFkZGluZyA9IHJlcGVhdChTUEFDRSwgbGV2ZWwgKiBJTkRFTlQpO1xuXG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgaWYgKHZhbHVlW2luZGV4XS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHZhbHVlW2luZGV4XSA9IHBhZGRpbmcgKyB2YWx1ZVtpbmRleF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWUuam9pbihMSU5FKTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBuZXcgY29tcGlsZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKG5ldyBGaWxlKCc+IGZvby4nKSk7XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAY2xhc3Mge0NvbXBpbGVyfVxuICogQHBhcmFtIHtGaWxlfSBmaWxlIC0gVmlydHVhbCBmaWxlLlxuICogQHBhcmFtIHtPYmplY3Q/fSBbb3B0aW9uc10gLSBQYXNzZWQgdG9cbiAqICAgYENvbXBpbGVyI3NldE9wdGlvbnMoKWAuXG4gKi9cbmZ1bmN0aW9uIENvbXBpbGVyKGZpbGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBzZWxmLmZpbGUgPSBmaWxlO1xuXG4gICAgc2VsZi5vcHRpb25zID0gZXh0ZW5kKHt9LCBzZWxmLm9wdGlvbnMpO1xuXG4gICAgc2VsZi5zZXRPcHRpb25zKG9wdGlvbnMpO1xufVxuXG4vKlxuICogQ2FjaGUgcHJvdG90eXBlLlxuICovXG5cbnZhciBjb21waWxlclByb3RvdHlwZSA9IENvbXBpbGVyLnByb3RvdHlwZTtcblxuLypcbiAqIEV4cG9zZSBkZWZhdWx0cy5cbiAqL1xuXG5jb21waWxlclByb3RvdHlwZS5vcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG5cbi8qXG4gKiBNYXAgb2YgYXBwbGljYWJsZSBlbnVtJ3MuXG4gKi9cblxudmFyIG1hcHMgPSB7XG4gICAgJ2VudGl0aWVzJzogRU5USVRZX09QVElPTlMsXG4gICAgJ2J1bGxldCc6IExJU1RfQlVMTEVUUyxcbiAgICAncnVsZSc6IEhPUklaT05UQUxfUlVMRV9CVUxMRVRTLFxuICAgICdsaXN0SXRlbUluZGVudCc6IExJU1RfSVRFTV9JTkRFTlRTLFxuICAgICdlbXBoYXNpcyc6IEVNUEhBU0lTX01BUktFUlMsXG4gICAgJ3N0cm9uZyc6IEVNUEhBU0lTX01BUktFUlMsXG4gICAgJ2ZlbmNlJzogRkVOQ0VfTUFSS0VSU1xufTtcblxuLyoqXG4gKiBTZXQgb3B0aW9ucy4gIERvZXMgbm90IG92ZXJ3cml0ZSBwcmV2aW91c2x5IHNldFxuICogb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTtcbiAqICAgY29tcGlsZXIuc2V0T3B0aW9ucyh7YnVsbGV0OiAnKid9KTtcbiAqXG4gKiBAdGhpcyB7Q29tcGlsZXJ9XG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaGVuIGFuIG9wdGlvbiBpcyBpbnZhbGlkLlxuICogQHBhcmFtIHtPYmplY3Q/fSBbb3B0aW9uc10gLSBTdHJpbmdpZnkgc2V0dGluZ3MuXG4gKiBAcmV0dXJuIHtDb21waWxlcn0gLSBgc2VsZmAuXG4gKi9cbmNvbXBpbGVyUHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY3VycmVudCA9IHNlbGYub3B0aW9ucztcbiAgICB2YXIgcnVsZVJlcGV0aXRpb247XG4gICAgdmFyIGtleTtcblxuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmFpc2Uob3B0aW9ucywgJ29wdGlvbnMnKTtcbiAgICB9XG5cbiAgICBmb3IgKGtleSBpbiBkZWZhdWx0T3B0aW9ucykge1xuICAgICAgICB2YWxpZGF0ZVt0eXBlb2YgY3VycmVudFtrZXldXShcbiAgICAgICAgICAgIG9wdGlvbnMsIGtleSwgY3VycmVudFtrZXldLCBtYXBzW2tleV1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBydWxlUmVwZXRpdGlvbiA9IG9wdGlvbnMucnVsZVJlcGV0aXRpb247XG5cbiAgICBpZiAocnVsZVJlcGV0aXRpb24gJiYgcnVsZVJlcGV0aXRpb24gPCBNSU5JTVVNX1JVTEVfTEVOR1RIKSB7XG4gICAgICAgIHJhaXNlKHJ1bGVSZXBldGl0aW9uLCAnb3B0aW9ucy5ydWxlUmVwZXRpdGlvbicpO1xuICAgIH1cblxuICAgIHNlbGYuZW5jb2RlID0gZW5jb2RlRmFjdG9yeShTdHJpbmcob3B0aW9ucy5lbnRpdGllcykpO1xuICAgIHNlbGYuZXNjYXBlID0gZXNjYXBlRmFjdG9yeShvcHRpb25zKTtcblxuICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gc2VsZjtcbn07XG5cbi8qXG4gKiBFbnRlciBhbmQgZXhpdCBoZWxwZXJzLlxuICovXG5cbmNvbXBpbGVyUHJvdG90eXBlLmVudGVyTGluayA9IHN0YXRlVG9nZ2xlcignaW5MaW5rJywgZmFsc2UpO1xuY29tcGlsZXJQcm90b3R5cGUuZW50ZXJUYWJsZSA9IHN0YXRlVG9nZ2xlcignaW5UYWJsZScsIGZhbHNlKTtcblxuLyoqXG4gKiBTaG9ydGN1dCBhbmQgY29sbGFwc2VkIGxpbmsgcmVmZXJlbmNlcyBuZWVkIG5vIGVzY2FwaW5nXG4gKiBhbmQgZW5jb2RpbmcgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIGNoaWxkIG5vZGVzIChpdFxuICogbXVzdCBiZSBpbXBsaWVkIGZyb20gaWRlbnRpZmllcikuXG4gKlxuICogVGhpcyB0b2dnbGVyIHR1cm5zIGVuY29kaW5nIGFuZCBlc2NhcGluZyBvZmYgZm9yIHNob3J0Y3V0XG4gKiBhbmQgY29sbGFwc2VkIHJlZmVyZW5jZXMuXG4gKlxuICogSW1wbGllcyBgZW50ZXJMaW5rYC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBpbGVyfSBjb21waWxlciAtIENvbXBpbGVyIGluc3RhbmNlLlxuICogQHBhcmFtIHtMaW5rUmVmZXJlbmNlfSBub2RlIC0gTGlua1JlZmVyZW5jZSBub2RlLlxuICogQHJldHVybiB7RnVuY3Rpb259IC0gRXhpdCBzdGF0ZS5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuZW50ZXJMaW5rUmVmZXJlbmNlID0gZnVuY3Rpb24gKGNvbXBpbGVyLCBub2RlKSB7XG4gICAgdmFyIGVuY29kZSA9IGNvbXBpbGVyLmVuY29kZTtcbiAgICB2YXIgZXNjYXBlID0gY29tcGlsZXIuZXNjYXBlO1xuICAgIHZhciBleGl0TGluayA9IGNvbXBpbGVyLmVudGVyTGluaygpO1xuXG4gICAgaWYgKFxuICAgICAgICBub2RlLnJlZmVyZW5jZVR5cGUgPT09ICdzaG9ydGN1dCcgfHxcbiAgICAgICAgbm9kZS5yZWZlcmVuY2VUeXBlID09PSAnY29sbGFwc2VkJ1xuICAgICkge1xuICAgICAgICBjb21waWxlci5lbmNvZGUgPSBjb21waWxlci5lc2NhcGUgPSBlbmNvZGVOb29wO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29tcGlsZXIuZW5jb2RlID0gZW5jb2RlO1xuICAgICAgICAgICAgY29tcGlsZXIuZXNjYXBlID0gZXNjYXBlO1xuICAgICAgICAgICAgZXhpdExpbmsoKTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZXhpdExpbms7XG4gICAgfVxufTtcblxuLyoqXG4gKiBWaXNpdCBhIG5vZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKCk7XG4gKlxuICogICBjb21waWxlci52aXNpdCh7XG4gKiAgICAgdHlwZTogJ3N0cm9uZycsXG4gKiAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICB2YWx1ZTogJ0ZvbydcbiAqICAgICB9XVxuICogICB9KTtcbiAqICAgLy8gJyoqRm9vKionXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBOb2RlLlxuICogQHBhcmFtIHtPYmplY3Q/fSBbcGFyZW50XSAtIGBub2RlYHMgcGFyZW50LlxuICogQHJldHVybiB7c3RyaW5nfSAtIENvbXBpbGVkIGBub2RlYC5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAobm9kZSwgcGFyZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLypcbiAgICAgKiBGYWlsIG9uIHVua25vd24gbm9kZXMuXG4gICAgICovXG5cbiAgICBpZiAodHlwZW9mIHNlbGZbbm9kZS50eXBlXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzZWxmLmZpbGUuZmFpbChcbiAgICAgICAgICAgICdNaXNzaW5nIGNvbXBpbGVyIGZvciBub2RlIG9mIHR5cGUgYCcgK1xuICAgICAgICAgICAgbm9kZS50eXBlICsgJ2A6IGAnICsgbm9kZSArICdgJyxcbiAgICAgICAgICAgIG5vZGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZltub2RlLnR5cGVdKG5vZGUsIHBhcmVudCk7XG59O1xuXG4vKipcbiAqIFZpc2l0IGFsbCBjaGlsZHJlbiBvZiBgcGFyZW50YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTtcbiAqXG4gKiAgIGNvbXBpbGVyLmFsbCh7XG4gKiAgICAgdHlwZTogJ3N0cm9uZycsXG4gKiAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICB2YWx1ZTogJ0ZvbydcbiAqICAgICB9LFxuICogICAgIHtcbiAqICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICAgIHZhbHVlOiAnQmFyJ1xuICogICAgIH1dXG4gKiAgIH0pO1xuICogICAvLyBbJ0ZvbycsICdCYXInXVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBQYXJlbnQgbm9kZSBvZiBjaGlsZHJlbi5cbiAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSAtIExpc3Qgb2YgY29tcGlsZWQgY2hpbGRyZW4uXG4gKi9cbmNvbXBpbGVyUHJvdG90eXBlLmFsbCA9IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgdmFyIG5vZGUgPSBjaGlsZHJlblswXTtcbiAgICB2YXIgbmV4dDtcblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBuZXh0ID0gY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIG5vZGUudHlwZSA9PT0gbmV4dC50eXBlICYmXG4gICAgICAgICAgICBub2RlLnR5cGUgaW4gTUVSR0VBQkxFX05PREVTICYmXG4gICAgICAgICAgICBtZXJnZWFibGUobm9kZSkgJiZcbiAgICAgICAgICAgIG1lcmdlYWJsZShuZXh0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG5vZGUgPSBNRVJHRUFCTEVfTk9ERVNbbm9kZS50eXBlXS5jYWxsKHNlbGYsIG5vZGUsIG5leHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goc2VsZi52aXNpdChub2RlLCBwYXJlbnQpKTtcbiAgICAgICAgICAgIG5vZGUgPSBuZXh0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsdWVzLnB1c2goc2VsZi52aXNpdChub2RlLCBwYXJlbnQpKTtcblxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG4vKipcbiAqIFZpc2l0IG9yZGVyZWQgbGlzdCBpdGVtcy5cbiAqXG4gKiBTdGFydHMgdGhlIGxpc3Qgd2l0aFxuICogYG5vZGUuc3RhcnRgIGFuZCBpbmNyZW1lbnRzIGVhY2ggZm9sbG93aW5nIGxpc3QgaXRlbVxuICogYnVsbGV0IGJ5IG9uZTpcbiAqXG4gKiAgICAgMi4gZm9vXG4gKiAgICAgMy4gYmFyXG4gKlxuICogSW4gYGluY3JlbWVudExpc3RNYXJrZXI6IGZhbHNlYCBtb2RlLCBkb2VzIG5vdCBpbmNyZW1lbnRcbiAqIGVhY2ggbWFya2VyIGFuZCBzdGF5cyBvbiBgbm9kZS5zdGFydGA6XG4gKlxuICogICAgIDEuIGZvb1xuICogICAgIDEuIGJhclxuICpcbiAqIEFkZHMgYW4gZXh0cmEgbGluZSBhZnRlciBhbiBpdGVtIGlmIGl0IGhhc1xuICogYGxvb3NlOiB0cnVlYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTtcbiAqXG4gKiAgIGNvbXBpbGVyLnZpc2l0T3JkZXJlZEl0ZW1zKHtcbiAqICAgICB0eXBlOiAnbGlzdCcsXG4gKiAgICAgb3JkZXJlZDogdHJ1ZSxcbiAqICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgIHR5cGU6ICdsaXN0SXRlbScsXG4gKiAgICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgICAgdHlwZTogJ3RleHQnLFxuICogICAgICAgICB2YWx1ZTogJ2JhcidcbiAqICAgICAgIH1dXG4gKiAgICAgfV1cbiAqICAgfSk7XG4gKiAgIC8vICcxLiAgYmFyJ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gYGxpc3RgIG5vZGUgd2l0aFxuICogICBgb3JkZXJlZDogdHJ1ZWAuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gbGlzdC5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUudmlzaXRPcmRlcmVkSXRlbXMgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaW5jcmVtZW50ID0gc2VsZi5vcHRpb25zLmluY3JlbWVudExpc3RNYXJrZXI7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhciBzdGFydCA9IG5vZGUuc3RhcnQ7XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBidWxsZXQ7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBidWxsZXQgPSAoaW5jcmVtZW50ID8gc3RhcnQgKyBpbmRleCA6IHN0YXJ0KSArIERPVDtcbiAgICAgICAgdmFsdWVzW2luZGV4XSA9IHNlbGYubGlzdEl0ZW0oY2hpbGRyZW5baW5kZXhdLCBub2RlLCBpbmRleCwgYnVsbGV0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzLmpvaW4oTElORSk7XG59O1xuXG4vKipcbiAqIFZpc2l0IHVub3JkZXJlZCBsaXN0IGl0ZW1zLlxuICpcbiAqIFVzZXMgYG9wdGlvbnMuYnVsbGV0YCBhcyBlYWNoIGl0ZW0ncyBidWxsZXQuXG4gKlxuICogQWRkcyBhbiBleHRyYSBsaW5lIGFmdGVyIGFuIGl0ZW0gaWYgaXQgaGFzXG4gKiBgbG9vc2U6IHRydWVgLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIudmlzaXRVbm9yZGVyZWRJdGVtcyh7XG4gKiAgICAgdHlwZTogJ2xpc3QnLFxuICogICAgIG9yZGVyZWQ6IGZhbHNlLFxuICogICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgdHlwZTogJ2xpc3RJdGVtJyxcbiAqICAgICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgIHZhbHVlOiAnYmFyJ1xuICogICAgICAgfV1cbiAqICAgICB9XVxuICogICB9KTtcbiAqICAgLy8gJy0gICBiYXInXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBgbGlzdGAgbm9kZSB3aXRoXG4gKiAgIGBvcmRlcmVkOiBmYWxzZWAuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gbGlzdC5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUudmlzaXRVbm9yZGVyZWRJdGVtcyA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIHZhciBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIGJ1bGxldCA9IHNlbGYub3B0aW9ucy5idWxsZXQ7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YWx1ZXNbaW5kZXhdID0gc2VsZi5saXN0SXRlbShjaGlsZHJlbltpbmRleF0sIG5vZGUsIGluZGV4LCBidWxsZXQpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXMuam9pbihMSU5FKTtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGEgYmxvY2sgbm9kZSB3aXRoIGJsb2NrIGNoaWxkcmVuIChlLmcuLCBgcm9vdGBcbiAqIG9yIGBibG9ja3F1b3RlYCkuXG4gKlxuICogS25vd3MgYWJvdXQgY29kZSBmb2xsb3dpbmcgYSBsaXN0LCBvciBhZGphY2VudCBsaXN0c1xuICogd2l0aCBzaW1pbGFyIGJ1bGxldHMsIGFuZCBwbGFjZXMgYW4gZXh0cmEgbmV3bGluZVxuICogYmV0d2VlbiB0aGVtLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIuYmxvY2soe1xuICogICAgIHR5cGU6ICdyb290JyxcbiAqICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgIHR5cGU6ICdwYXJhZ3JhcGgnLFxuICogICAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICAgICAgdmFsdWU6ICdiYXInXG4gKiAgICAgICB9XVxuICogICAgIH1dXG4gKiAgIH0pO1xuICogICAvLyAnYmFyJ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gYHJvb3RgIG5vZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gYmxvY2sgY29udGVudC5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuYmxvY2sgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBjaGlsZDtcbiAgICB2YXIgcHJldjtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoaWxkID0gY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogRHVwbGljYXRlIG5vZGVzLCBzdWNoIGFzIGEgbGlzdFxuICAgICAgICAgICAgICogZGlyZWN0bHkgZm9sbG93aW5nIGFub3RoZXIgbGlzdCxcbiAgICAgICAgICAgICAqIG9mdGVuIG5lZWQgbXVsdGlwbGUgbmV3IGxpbmVzLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEFkZGl0aW9uYWxseSwgY29kZSBibG9ja3MgZm9sbG93aW5nIGEgbGlzdFxuICAgICAgICAgICAgICogbWlnaHQgZWFzaWx5IGJlIG1pc3Rha2VuIGZvciBhIHBhcmFncmFwaFxuICAgICAgICAgICAgICogaW4gdGhlIGxpc3QgaXRzZWxmLlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBwcmV2LnR5cGUgJiYgcHJldi50eXBlID09PSAnbGlzdCcpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChwcmV2Lm9yZGVyZWQgPT09IGNoaWxkLm9yZGVyZWQgPyBHQVAgOiBCUkVBSyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHByZXYudHlwZSA9PT0gJ2xpc3QnICYmXG4gICAgICAgICAgICAgICAgY2hpbGQudHlwZSA9PT0gJ2NvZGUnICYmXG4gICAgICAgICAgICAgICAgIWNoaWxkLmxhbmdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKEdBUCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKEJSRUFLKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlcy5wdXNoKHNlbGYudmlzaXQoY2hpbGQsIG5vZGUpKTtcblxuICAgICAgICBwcmV2ID0gY2hpbGQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcy5qb2luKEVNUFRZKTtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGEgcm9vdC5cbiAqXG4gKiBBZGRzIGEgZmluYWwgbmV3bGluZSB0byBlbnN1cmUgdmFsaWQgUE9TSVggZmlsZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKCk7XG4gKlxuICogICBjb21waWxlci5yb290KHtcbiAqICAgICB0eXBlOiAncm9vdCcsXG4gKiAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAqICAgICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgIHZhbHVlOiAnYmFyJ1xuICogICAgICAgfV1cbiAqICAgICB9XVxuICogICB9KTtcbiAqICAgLy8gJ2JhcidcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIGByb290YCBub2RlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIE1hcmtkb3duIGRvY3VtZW50LlxuICovXG5jb21waWxlclByb3RvdHlwZS5yb290ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5ibG9jayhub2RlKSArIExJTkU7XG59O1xuXG4vKipcbiAqIFN0cmluZ2lmeSBhIGhlYWRpbmcuXG4gKlxuICogSW4gYHNldGV4dDogdHJ1ZWAgbW9kZSBhbmQgd2hlbiBgZGVwdGhgIGlzIHNtYWxsZXIgdGhhblxuICogdGhyZWUsIGNyZWF0ZXMgYSBzZXRleHQgaGVhZGVyOlxuICpcbiAqICAgICBGb29cbiAqICAgICA9PT1cbiAqXG4gKiBPdGhlcndpc2UsIGFuIEFUWCBoZWFkZXIgaXMgZ2VuZXJhdGVkOlxuICpcbiAqICAgICAjIyMgRm9vXG4gKlxuICogSW4gYGNsb3NlQXR4OiB0cnVlYCBtb2RlLCB0aGUgaGVhZGVyIGlzIGNsb3NlZCB3aXRoXG4gKiBoYXNoZXM6XG4gKlxuICogICAgICMjIyBGb28gIyMjXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKCk7XG4gKlxuICogICBjb21waWxlci5oZWFkaW5nKHtcbiAqICAgICB0eXBlOiAnaGVhZGluZycsXG4gKiAgICAgZGVwdGg6IDIsXG4gKiAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICB0eXBlOiAnc3Ryb25nJyxcbiAqICAgICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgIHZhbHVlOiAnYmFyJ1xuICogICAgICAgfV1cbiAqICAgICB9XVxuICogICB9KTtcbiAqICAgLy8gJyMjICoqYmFyKionXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBgaGVhZGluZ2Agbm9kZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBNYXJrZG93biBoZWFkaW5nLlxuICovXG5jb21waWxlclByb3RvdHlwZS5oZWFkaW5nID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNldGV4dCA9IHNlbGYub3B0aW9ucy5zZXRleHQ7XG4gICAgdmFyIGNsb3NlQXR4ID0gc2VsZi5vcHRpb25zLmNsb3NlQXR4O1xuICAgIHZhciBkZXB0aCA9IG5vZGUuZGVwdGg7XG4gICAgdmFyIGNvbnRlbnQgPSBzZWxmLmFsbChub2RlKS5qb2luKEVNUFRZKTtcbiAgICB2YXIgcHJlZml4O1xuXG4gICAgaWYgKHNldGV4dCAmJiBkZXB0aCA8IDMpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgKyBMSU5FICtcbiAgICAgICAgICAgIHJlcGVhdChkZXB0aCA9PT0gMSA/IEVRVUFMUyA6IERBU0gsIGNvbnRlbnQubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcmVmaXggPSByZXBlYXQoSEFTSCwgbm9kZS5kZXB0aCk7XG4gICAgY29udGVudCA9IHByZWZpeCArIFNQQUNFICsgY29udGVudDtcblxuICAgIGlmIChjbG9zZUF0eCkge1xuICAgICAgICBjb250ZW50ICs9IFNQQUNFICsgcHJlZml4O1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgdGV4dC5cbiAqXG4gKiBTdXBwb3J0cyBuYW1lZCBlbnRpdGllcyBpbiBgc2V0dGluZ3MuZW5jb2RlOiB0cnVlYCBtb2RlOlxuICpcbiAqICAgICBBVCZhbXA7VFxuICpcbiAqIFN1cHBvcnRzIG51bWJlcmVkIGVudGl0aWVzIGluIGBzZXR0aW5ncy5lbmNvZGU6IG51bWJlcnNgXG4gKiBtb2RlOlxuICpcbiAqICAgICBBVCYjeDI2O1RcbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTtcbiAqXG4gKiAgIGNvbXBpbGVyLnRleHQoe1xuICogICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICB2YWx1ZTogJ2ZvbydcbiAqICAgfSk7XG4gKiAgIC8vICdmb28nXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBgdGV4dGAgbm9kZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBQYXJlbnQgb2YgYG5vZGVgLlxuICogQHJldHVybiB7c3RyaW5nfSAtIFJhdyBtYXJrZG93biB0ZXh0LlxuICovXG5jb21waWxlclByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24gKG5vZGUsIHBhcmVudCkge1xuICAgIHJldHVybiB0aGlzLmVuY29kZSh0aGlzLmVzY2FwZShub2RlLnZhbHVlLCBub2RlLCBwYXJlbnQpLCBub2RlKTtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGEgcGFyYWdyYXBoLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIucGFyYWdyYXBoKHtcbiAqICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAqICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgIHR5cGU6ICdzdHJvbmcnLFxuICogICAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICAgICAgdmFsdWU6ICdiYXInXG4gKiAgICAgICB9XVxuICogICAgIH1dXG4gKiAgIH0pO1xuICogICAvLyAnKipiYXIqKidcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIGBwYXJhZ3JhcGhgIG5vZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gcGFyYWdyYXBoLlxuICovXG5jb21waWxlclByb3RvdHlwZS5wYXJhZ3JhcGggPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiB0aGlzLmFsbChub2RlKS5qb2luKEVNUFRZKTtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGEgYmxvY2sgcXVvdGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKCk7XG4gKlxuICogICBjb21waWxlci5wYXJhZ3JhcGgoe1xuICogICAgIHR5cGU6ICdibG9ja3F1b3RlJyxcbiAqICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgIHR5cGU6ICdwYXJhZ3JhcGgnLFxuICogICAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICAgIHR5cGU6ICdzdHJvbmcnLFxuICogICAgICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgICAgdmFsdWU6ICdiYXInXG4gKiAgICAgICAgIH1dXG4gKiAgICAgICB9XVxuICogICAgIH1dXG4gKiAgIH0pO1xuICogICAvLyAnPiAqKmJhcioqJ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gYGJsb2NrcXVvdGVgIG5vZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gYmxvY2sgcXVvdGUuXG4gKi9cbmNvbXBpbGVyUHJvdG90eXBlLmJsb2NrcXVvdGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmJsb2NrKG5vZGUpLnNwbGl0KExJTkUpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICB2YXIgdmFsdWU7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF07XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSAodmFsdWUgPyBTUEFDRSA6IEVNUFRZKSArIHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBBTkdMRV9CUkFDS0VUX0NMT1NFICsgcmVzdWx0LmpvaW4oTElORSArIEFOR0xFX0JSQUNLRVRfQ0xPU0UpO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBsaXN0LiBTZWUgYENvbXBpbGVyI3Zpc2l0T3JkZXJlZExpc3QoKWAgYW5kXG4gKiBgQ29tcGlsZXIjdmlzaXRVbm9yZGVyZWRMaXN0KClgIGZvciBpbnRlcm5hbCB3b3JraW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIudmlzaXRVbm9yZGVyZWRJdGVtcyh7XG4gKiAgICAgdHlwZTogJ2xpc3QnLFxuICogICAgIG9yZGVyZWQ6IGZhbHNlLFxuICogICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgdHlwZTogJ2xpc3RJdGVtJyxcbiAqICAgICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICAgIHZhbHVlOiAnYmFyJ1xuICogICAgICAgfV1cbiAqICAgICB9XVxuICogICB9KTtcbiAqICAgLy8gJy0gICBiYXInXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBgbGlzdGAgbm9kZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBNYXJrZG93biBsaXN0LlxuICovXG5jb21waWxlclByb3RvdHlwZS5saXN0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpc1tPUkRFUkVEX01BUFtub2RlLm9yZGVyZWRdXShub2RlKTtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGEgbGlzdCBpdGVtLlxuICpcbiAqIFByZWZpeGVzIHRoZSBjb250ZW50IHdpdGggYSBjaGVja2VkIGNoZWNrYm94IHdoZW5cbiAqIGBjaGVja2VkOiB0cnVlYDpcbiAqXG4gKiAgICAgW3hdIGZvb1xuICpcbiAqIFByZWZpeGVzIHRoZSBjb250ZW50IHdpdGggYW4gdW5jaGVja2VkIGNoZWNrYm94IHdoZW5cbiAqIGBjaGVja2VkOiBmYWxzZWA6XG4gKlxuICogICAgIFsgXSBmb29cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTtcbiAqXG4gKiAgIGNvbXBpbGVyLmxpc3RJdGVtKHtcbiAqICAgICB0eXBlOiAnbGlzdEl0ZW0nLFxuICogICAgIGNoZWNrZWQ6IHRydWUsXG4gKiAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICB2YWx1ZTogJ2JhcidcbiAqICAgICB9XVxuICogICB9LCB7XG4gKiAgICAgdHlwZTogJ2xpc3QnLFxuICogICAgIG9yZGVyZWQ6IGZhbHNlLFxuICogICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgdHlwZTogJ2xpc3RJdGVtJyxcbiAqICAgICAgIGNoZWNrZWQ6IHRydWUsXG4gKiAgICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgICAgdHlwZTogJ3RleHQnLFxuICogICAgICAgICB2YWx1ZTogJ2JhcidcbiAqICAgICAgIH1dXG4gKiAgICAgfV1cbiAqICAgfSwgMCwgJyonKTtcbiAqICAgJy0gICBbeF0gYmFyJ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gYGxpc3RJdGVtYCBub2RlLlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmVudCAtIGBsaXN0YCBub2RlLlxuICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uIC0gSW5kZXggb2YgYG5vZGVgIGluIGBwYXJlbnRgLlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1bGxldCAtIEJ1bGxldCB0byB1c2UuICBUaGlzLCBhbmQgdGhlXG4gKiAgIGBsaXN0SXRlbUluZGVudGAgc2V0dGluZyBkZWZpbmUgdGhlIHVzZWQgaW5kZW50LlxuICogQHJldHVybiB7c3RyaW5nfSAtIE1hcmtkb3duIGxpc3QgaXRlbS5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUubGlzdEl0ZW0gPSBmdW5jdGlvbiAobm9kZSwgcGFyZW50LCBwb3NpdGlvbiwgYnVsbGV0KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzdHlsZSA9IHNlbGYub3B0aW9ucy5saXN0SXRlbUluZGVudDtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICB2YXIgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHZhciBsb29zZSA9IG5vZGUubG9vc2U7XG4gICAgdmFyIHZhbHVlO1xuICAgIHZhciBpbmRlbnQ7XG4gICAgdmFyIHNwYWNpbmc7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YWx1ZXNbaW5kZXhdID0gc2VsZi52aXNpdChjaGlsZHJlbltpbmRleF0sIG5vZGUpO1xuICAgIH1cblxuICAgIHZhbHVlID0gQ0hFQ0tCT1hfTUFQW25vZGUuY2hlY2tlZF0gKyB2YWx1ZXMuam9pbihsb29zZSA/IEJSRUFLIDogTElORSk7XG5cbiAgICBpZiAoXG4gICAgICAgIHN0eWxlID09PSBMSVNUX0lURU1fT05FIHx8XG4gICAgICAgIChzdHlsZSA9PT0gTElTVF9JVEVNX01JWEVEICYmIHZhbHVlLmluZGV4T2YoTElORSkgPT09IC0xKVxuICAgICkge1xuICAgICAgICBpbmRlbnQgPSBidWxsZXQubGVuZ3RoICsgMTtcbiAgICAgICAgc3BhY2luZyA9IFNQQUNFO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGVudCA9IE1hdGguY2VpbCgoYnVsbGV0Lmxlbmd0aCArIDEpIC8gSU5ERU5UKSAqIElOREVOVDtcbiAgICAgICAgc3BhY2luZyA9IHJlcGVhdChTUEFDRSwgaW5kZW50IC0gYnVsbGV0Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgdmFsdWUgPSBidWxsZXQgKyBzcGFjaW5nICsgcGFkKHZhbHVlLCBpbmRlbnQgLyBJTkRFTlQpLnNsaWNlKGluZGVudCk7XG5cbiAgICBpZiAobG9vc2UgJiYgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDEgIT09IHBvc2l0aW9uKSB7XG4gICAgICAgIHZhbHVlICs9IExJTkU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgaW5saW5lIGNvZGUuXG4gKlxuICogS25vd3MgYWJvdXQgaW50ZXJuYWwgdGlja3MgKGBcXGBgKSwgYW5kIGVuc3VyZXMgb25lIG1vcmVcbiAqIHRpY2sgaXMgdXNlZCB0byBlbmNsb3NlIHRoZSBpbmxpbmUgY29kZTpcbiAqXG4gKiAgICAgYGBgZm9vIGBgYmFyYGAgYmF6YGBgXG4gKlxuICogRXZlbiBrbm93cyBhYm91dCBpbml0YWwgYW5kIGZpbmFsIHRpY2tzOlxuICpcbiAqICAgICBgYCBgZm9vIGBgXG4gKiAgICAgYGAgZm9vYCBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIuaW5saW5lQ29kZSh7XG4gKiAgICAgdHlwZTogJ2lubGluZUNvZGUnLFxuICogICAgIHZhbHVlOiAnZm9vKCk7IGBiYXJgOyBiYXooKSdcbiAqICAgfSk7XG4gKiAgIC8vICdgYGZvbygpOyBgYmFyYDsgYmF6KClgYCdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIGBpbmxpbmVDb2RlYCBub2RlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIE1hcmtkb3duIGlubGluZSBjb2RlLlxuICovXG5jb21waWxlclByb3RvdHlwZS5pbmxpbmVDb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgdmFsdWUgPSBub2RlLnZhbHVlO1xuICAgIHZhciB0aWNrcyA9IHJlcGVhdChUSUNLLCBsb25nZXN0U3RyZWFrKHZhbHVlLCBUSUNLKSArIDEpO1xuICAgIHZhciBzdGFydCA9IHRpY2tzO1xuICAgIHZhciBlbmQgPSB0aWNrcztcblxuICAgIGlmICh2YWx1ZS5jaGFyQXQoMCkgPT09IFRJQ0spIHtcbiAgICAgICAgc3RhcnQgKz0gU1BBQ0U7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmNoYXJBdCh2YWx1ZS5sZW5ndGggLSAxKSA9PT0gVElDSykge1xuICAgICAgICBlbmQgPSBTUEFDRSArIGVuZDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhcnQgKyBub2RlLnZhbHVlICsgZW5kO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgWUFNTCBmcm9udCBtYXR0ZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKCk7XG4gKlxuICogICBjb21waWxlci55YW1sKHtcbiAqICAgICB0eXBlOiAneWFtbCcsXG4gKiAgICAgdmFsdWU6ICdmb286IGJhcidcbiAqICAgfSk7XG4gKiAgIC8vICctLS1cXG5mb286IGJhclxcbi0tLSdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIGB5YW1sYCBub2RlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIE1hcmtkb3duIFlBTUwgZG9jdW1lbnQuXG4gKi9cbmNvbXBpbGVyUHJvdG90eXBlLnlhbWwgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBkZWxpbWl0ZXIgPSByZXBlYXQoREFTSCwgWUFNTF9GRU5DRV9MRU5HVEgpO1xuICAgIHZhciB2YWx1ZSA9IG5vZGUudmFsdWUgPyBMSU5FICsgbm9kZS52YWx1ZSA6IEVNUFRZO1xuXG4gICAgcmV0dXJuIGRlbGltaXRlciArIHZhbHVlICsgTElORSArIGRlbGltaXRlcjtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGEgY29kZSBibG9jay5cbiAqXG4gKiBDcmVhdGVzIGluZGVudGVkIGNvZGUgd2hlbjpcbiAqXG4gKiAtIE5vIGxhbmd1YWdlIHRhZyBleGlzdHM7XG4gKiAtIE5vdCBpbiBgZmVuY2VzOiB0cnVlYCBtb2RlO1xuICogLSBBIG5vbi1lbXB0eSB2YWx1ZSBleGlzdHMuXG4gKlxuICogT3RoZXJ3aXNlLCBHRk0gZmVuY2VkIGNvZGUgaXMgY3JlYXRlZDpcbiAqXG4gKiAgICAgYGBganNcbiAqICAgICBmb28oKTtcbiAqICAgICBgYGBcbiAqXG4gKiBXaGVuIGluIGBgZmVuY2U6IGB+YCBgYCBtb2RlLCB1c2VzIHRpbGRlcyBhcyBmZW5jZXM6XG4gKlxuICogICAgIH5+fmpzXG4gKiAgICAgZm9vKCk7XG4gKiAgICAgfn5+XG4gKlxuICogS25vd3MgYWJvdXQgaW50ZXJuYWwgZmVuY2VzIChOb3RlOiBHaXRIdWIvS3JhbWRvd24gZG9lc1xuICogbm90IHN1cHBvcnQgdGhpcyk6XG4gKlxuICogICAgIGBgYGBqYXZhc2NyaXB0XG4gKiAgICAgYGBgbWFya2Rvd25cbiAqICAgICBmb29cbiAqICAgICBgYGBcbiAqICAgICBgYGBgXG4gKlxuICogU3VwcG9ydHMgbmFtZWQgZW50aXRpZXMgaW4gdGhlIGxhbmd1YWdlIGZsYWcgd2l0aFxuICogYHNldHRpbmdzLmVuY29kZWAgbW9kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTtcbiAqXG4gKiAgIGNvbXBpbGVyLmNvZGUoe1xuICogICAgIHR5cGU6ICdjb2RlJyxcbiAqICAgICBsYW5nOiAnanMnLFxuICogICAgIHZhbHVlOiAnZm9vbygpOydcbiAqICAgfSk7XG4gKiAgIC8vICdgYGBqc1xcbmZvb28oKTtcXG5gYGAnXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBgY29kZWAgbm9kZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBQYXJlbnQgb2YgYG5vZGVgLlxuICogQHJldHVybiB7c3RyaW5nfSAtIE1hcmtkb3duIGNvZGUgYmxvY2suXG4gKi9cbmNvbXBpbGVyUHJvdG90eXBlLmNvZGUgPSBmdW5jdGlvbiAobm9kZSwgcGFyZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gICAgdmFyIG9wdGlvbnMgPSBzZWxmLm9wdGlvbnM7XG4gICAgdmFyIG1hcmtlciA9IG9wdGlvbnMuZmVuY2U7XG4gICAgdmFyIGxhbmd1YWdlID0gc2VsZi5lbmNvZGUobm9kZS5sYW5nIHx8IEVNUFRZLCBub2RlKTtcbiAgICB2YXIgZmVuY2U7XG5cbiAgICAvKlxuICAgICAqIFdpdGhvdXQgKG5lZWRlZCkgZmVuY2VzLlxuICAgICAqL1xuXG4gICAgaWYgKCFsYW5ndWFnZSAmJiAhb3B0aW9ucy5mZW5jZXMgJiYgdmFsdWUpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogVGhyb3cgd2hlbiBwZWRhbnRpYywgaW4gYSBsaXN0IGl0ZW0gd2hpY2hcbiAgICAgICAgICogaXNu4oCZdCBjb21waWxlZCB1c2luZyBhIHRhYi5cbiAgICAgICAgICovXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyZW50ICYmXG4gICAgICAgICAgICBwYXJlbnQudHlwZSA9PT0gJ2xpc3RJdGVtJyAmJlxuICAgICAgICAgICAgb3B0aW9ucy5saXN0SXRlbUluZGVudCAhPT0gTElTVF9JVEVNX1RBQiAmJlxuICAgICAgICAgICAgb3B0aW9ucy5wZWRhbnRpY1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHNlbGYuZmlsZS5mYWlsKEVSUk9SX0xJU1RfSVRFTV9JTkRFTlQsIG5vZGUucG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhZCh2YWx1ZSwgMSk7XG4gICAgfVxuXG4gICAgZmVuY2UgPSBsb25nZXN0U3RyZWFrKHZhbHVlLCBtYXJrZXIpICsgMTtcblxuICAgIC8qXG4gICAgICogRml4IEdGTSAvIFJlZENhcnBldCBidWcsIHdoZXJlIGZlbmNlLWxpa2UgY2hhcmFjdGVyc1xuICAgICAqIGluc2lkZSBmZW5jZWQgY29kZSBjYW4gZXhpdCBhIGNvZGUtYmxvY2suXG4gICAgICogWWVzLCBldmVuIHdoZW4gdGhlIG91dGVyIGZlbmNlIHVzZXMgZGlmZmVyZW50XG4gICAgICogY2hhcmFjdGVycywgb3IgaXMgbG9uZ2VyLlxuICAgICAqIFRodXMsIHdlIGNhbiBvbmx5IHBhZCB0aGUgY29kZSB0byBtYWtlIGl0IHdvcmsuXG4gICAgICovXG5cbiAgICBpZiAoRkVOQ0UudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSBwYWQodmFsdWUsIDEpO1xuICAgIH1cblxuICAgIGZlbmNlID0gcmVwZWF0KG1hcmtlciwgTWF0aC5tYXgoZmVuY2UsIE1JTklNVU1fQ09ERV9GRU5DRV9MRU5HVEgpKTtcblxuICAgIHJldHVybiBmZW5jZSArIGxhbmd1YWdlICsgTElORSArIHZhbHVlICsgTElORSArIGZlbmNlO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgSFRNTC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTtcbiAqXG4gKiAgIGNvbXBpbGVyLmh0bWwoe1xuICogICAgIHR5cGU6ICdodG1sJyxcbiAqICAgICB2YWx1ZTogJzxkaXY+YmFyPC9kaXY+J1xuICogICB9KTtcbiAqICAgLy8gJzxkaXY+YmFyPC9kaXY+J1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gYGh0bWxgIG5vZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gSFRNTC5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuaHRtbCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWU7XG59O1xuXG4vKipcbiAqIFN0cmluZ2lmeSBhIGhvcml6b250YWwgcnVsZS5cbiAqXG4gKiBUaGUgY2hhcmFjdGVyIHVzZWQgaXMgY29uZmlndXJhYmxlIGJ5IGBydWxlYDogKGAnXydgKVxuICpcbiAqICAgICBfX19cbiAqXG4gKiBUaGUgbnVtYmVyIG9mIHJlcGl0aXRpb25zIGlzIGRlZmluZWQgdGhyb3VnaFxuICogYHJ1bGVSZXBldGl0aW9uYDogKGA2YClcbiAqXG4gKiAgICAgKioqKioqXG4gKlxuICogV2hldGhlciBzcGFjZXMgZGVsaW1pdCBlYWNoIGNoYXJhY3RlciwgaXMgY29uZmlndXJlZFxuICogdGhyb3VnaCBgcnVsZVNwYWNlc2A6IChgdHJ1ZWApXG4gKlxuICogICAgICogKiAqXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKCk7XG4gKlxuICogICBjb21waWxlci5ob3Jpem9udGFsUnVsZSh7XG4gKiAgICAgdHlwZTogJ2hvcml6b250YWxSdWxlJ1xuICogICB9KTtcbiAqICAgLy8gJyoqKidcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gcnVsZS5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuaG9yaXpvbnRhbFJ1bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgdmFyIHJ1bGUgPSByZXBlYXQob3B0aW9ucy5ydWxlLCBvcHRpb25zLnJ1bGVSZXBldGl0aW9uKTtcblxuICAgIGlmIChvcHRpb25zLnJ1bGVTcGFjZXMpIHtcbiAgICAgICAgcnVsZSA9IHJ1bGUuc3BsaXQoRU1QVFkpLmpvaW4oU1BBQ0UpO1xuICAgIH1cblxuICAgIHJldHVybiBydWxlO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBzdHJvbmcuXG4gKlxuICogVGhlIG1hcmtlciB1c2VkIGlzIGNvbmZpZ3VyYWJsZSBieSBgc3Ryb25nYCwgd2hpY2hcbiAqIGRlZmF1bHRzIHRvIGFuIGFzdGVyaXNrIChgJyonYCkgYnV0IGFsc28gYWNjZXB0cyBhblxuICogdW5kZXJzY29yZSAoYCdfJ2ApOlxuICpcbiAqICAgICBfZm9vX1xuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIuc3Ryb25nKHtcbiAqICAgICB0eXBlOiAnc3Ryb25nJyxcbiAqICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICAgIHZhbHVlOiAnRm9vJ1xuICogICAgIH1dXG4gKiAgIH0pO1xuICogICAvLyAnKipGb28qKidcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIGBzdHJvbmdgIG5vZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gc3Ryb25nLWVtcGhhc2lzZWQgdGV4dC5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuc3Ryb25nID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgbWFya2VyID0gdGhpcy5vcHRpb25zLnN0cm9uZztcblxuICAgIG1hcmtlciA9IG1hcmtlciArIG1hcmtlcjtcblxuICAgIHJldHVybiBtYXJrZXIgKyB0aGlzLmFsbChub2RlKS5qb2luKEVNUFRZKSArIG1hcmtlcjtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGFuIGVtcGhhc2lzLlxuICpcbiAqIFRoZSBtYXJrZXIgdXNlZCBpcyBjb25maWd1cmFibGUgYnkgYGVtcGhhc2lzYCwgd2hpY2hcbiAqIGRlZmF1bHRzIHRvIGFuIHVuZGVyc2NvcmUgKGAnXydgKSBidXQgYWxzbyBhY2NlcHRzIGFuXG4gKiBhc3RlcmlzayAoYCcqJ2ApOlxuICpcbiAqICAgICAqZm9vKlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIuZW1waGFzaXMoe1xuICogICAgIHR5cGU6ICdlbXBoYXNpcycsXG4gKiAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICB2YWx1ZTogJ0ZvbydcbiAqICAgICB9XVxuICogICB9KTtcbiAqICAgLy8gJ19Gb29fJ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gYGVtcGhhc2lzYCBub2RlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIE1hcmtkb3duIGVtcGhhc2lzZWQgdGV4dC5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuZW1waGFzaXMgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBtYXJrZXIgPSB0aGlzLm9wdGlvbnMuZW1waGFzaXM7XG5cbiAgICByZXR1cm4gbWFya2VyICsgdGhpcy5hbGwobm9kZSkuam9pbihFTVBUWSkgKyBtYXJrZXI7XG59O1xuXG4vKipcbiAqIFN0cmluZ2lmeSBhIGhhcmQgYnJlYWsuXG4gKlxuICogSW4gQ29tbW9ubWFyayBtb2RlLCB0cmFpbGluZyBiYWNrc2xhc2ggZm9ybSBpcyB1c2VkIGluIG9yZGVyXG4gKiB0byBwcmVzZXJ2ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHRoYXQgdGhlIGxpbmUgbWF5IGVuZCB3aXRoLFxuICogYW5kIGFsc28gZm9yIGJldHRlciB2aXNpYmlsaXR5LlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIuYnJlYWsoe1xuICogICAgIHR5cGU6ICdicmVhaydcbiAqICAgfSk7XG4gKiAgIC8vICcgIFxcbidcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gSGFyZCBtYXJrZG93biBicmVhay5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuYnJlYWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb21tb25tYXJrID8gQkFDS1NMQVNIICsgTElORSA6IFNQQUNFICsgU1BBQ0UgKyBMSU5FO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBkZWxldGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKCk7XG4gKlxuICogICBjb21waWxlci5kZWxldGUoe1xuICogICAgIHR5cGU6ICdkZWxldGUnLFxuICogICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgdHlwZTogJ3RleHQnLFxuICogICAgICAgdmFsdWU6ICdGb28nXG4gKiAgICAgfV1cbiAqICAgfSk7XG4gKiAgIC8vICd+fkZvb35+J1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gYGRlbGV0ZWAgbm9kZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBNYXJrZG93biBzdHJpa2UtdGhyb3VnaC5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gRE9VQkxFX1RJTERFICsgdGhpcy5hbGwobm9kZSkuam9pbihFTVBUWSkgKyBET1VCTEVfVElMREU7XG59O1xuXG4vKipcbiAqIFN0cmluZ2lmeSBhIGxpbmsuXG4gKlxuICogV2hlbiBubyB0aXRsZSBleGlzdHMsIHRoZSBjb21waWxlZCBgY2hpbGRyZW5gIGVxdWFsXG4gKiBgaHJlZmAsIGFuZCBgaHJlZmAgc3RhcnRzIHdpdGggYSBwcm90b2NvbCwgYW4gYXV0b1xuICogbGluayBpcyBjcmVhdGVkOlxuICpcbiAqICAgICA8aHR0cDovL2V4YW1wbGUuY29tPlxuICpcbiAqIE90aGVyd2lzZSwgaXMgc21hcnQgYWJvdXQgZW5jbG9zaW5nIGBocmVmYCAoc2VlXG4gKiBgZW5jbG9zZVVSSSgpYCkgYW5kIGB0aXRsZWAgKHNlZSBgZW5jbG9zZVRpdGxlKClgKS5cbiAqXG4gKiAgICBbZm9vXSg8Zm9vIGF0IGJhciBkb3QgY29tPiAnQW4gXCJleGFtcGxlXCIgZS1tYWlsJylcbiAqXG4gKiBTdXBwb3J0cyBuYW1lZCBlbnRpdGllcyBpbiB0aGUgYGhyZWZgIGFuZCBgdGl0bGVgIHdoZW5cbiAqIGluIGBzZXR0aW5ncy5lbmNvZGVgIG1vZGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKCk7XG4gKlxuICogICBjb21waWxlci5saW5rKHtcbiAqICAgICB0eXBlOiAnbGluaycsXG4gKiAgICAgaHJlZjogJ2h0dHA6Ly9leGFtcGxlLmNvbScsXG4gKiAgICAgdGl0bGU6ICdFeGFtcGxlIERvbWFpbicsXG4gKiAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICB2YWx1ZTogJ0ZvbydcbiAqICAgICB9XVxuICogICB9KTtcbiAqICAgLy8gJ1tGb29dKGh0dHA6Ly9leGFtcGxlLmNvbSBcIkV4YW1wbGUgRG9tYWluXCIpJ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gYGxpbmtgIG5vZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gbGluay5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB1cmwgPSBzZWxmLmVuY29kZShub2RlLmhyZWYsIG5vZGUpO1xuICAgIHZhciBleGl0ID0gc2VsZi5lbnRlckxpbmsoKTtcbiAgICB2YXIgZXNjYXBlZFVSTCA9IHNlbGYuZW5jb2RlKHNlbGYuZXNjYXBlKG5vZGUuaHJlZiwgbm9kZSkpO1xuICAgIHZhciB2YWx1ZSA9IHNlbGYuYWxsKG5vZGUpLmpvaW4oRU1QVFkpO1xuXG4gICAgZXhpdCgpO1xuXG4gICAgaWYgKFxuICAgICAgICBub2RlLnRpdGxlID09PSBudWxsICYmXG4gICAgICAgIFBST1RPQ09MLnRlc3QodXJsKSAmJlxuICAgICAgICAoZXNjYXBlZFVSTCA9PT0gdmFsdWUgfHwgZXNjYXBlZFVSTCA9PT0gTUFJTFRPICsgdmFsdWUpXG4gICAgKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIEJhY2tzbGFzaCBlc2NhcGVzIGRvIG5vdCB3b3JrIGluIGF1dG9saW5rcyxcbiAgICAgICAgICogc28gd2UgZG8gbm90IGVzY2FwZS5cbiAgICAgICAgICovXG5cbiAgICAgICAgcmV0dXJuIGVuY2xvc2VVUkkoc2VsZi5lbmNvZGUobm9kZS5ocmVmKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdXJsID0gZW5jbG9zZVVSSSh1cmwpO1xuXG4gICAgaWYgKG5vZGUudGl0bGUpIHtcbiAgICAgICAgdXJsICs9IFNQQUNFICsgZW5jbG9zZVRpdGxlKHNlbGYuZW5jb2RlKHNlbGYuZXNjYXBlKFxuICAgICAgICAgICAgbm9kZS50aXRsZSwgbm9kZVxuICAgICAgICApLCBub2RlKSk7XG4gICAgfVxuXG4gICAgdmFsdWUgPSBTUVVBUkVfQlJBQ0tFVF9PUEVOICsgdmFsdWUgKyBTUVVBUkVfQlJBQ0tFVF9DTE9TRTtcblxuICAgIHZhbHVlICs9IFBBUkVOVEhFU0lTX09QRU4gKyB1cmwgKyBQQVJFTlRIRVNJU19DTE9TRTtcblxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGEgbGluayBsYWJlbC5cbiAqXG4gKiBCZWNhdXNlIGxpbmsgcmVmZXJlbmNlcyBhcmUgZWFzaWx5LCBtaXN0YWtpbmdseSxcbiAqIGNyZWF0ZWQgKGZvciBleGFtcGxlLCBgW2Zvb11gKSwgcmVmZXJlbmNlIG5vZGVzIGhhdmVcbiAqIGFuIGV4dHJhIHByb3BlcnR5IGRlcGljdGluZyBob3cgaXQgbG9va2VkIGluIHRoZVxuICogb3JpZ2luYWwgZG9jdW1lbnQsIHNvIHN0cmluZ2lmaWNhdGlvbiBjYW4gY2F1c2UgbWluaW1hbFxuICogY2hhbmdlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBsYWJlbCh7XG4gKiAgICAgdHlwZTogJ3JlZmVyZW5jZUltYWdlJyxcbiAqICAgICByZWZlcmVuY2VUeXBlOiAnZnVsbCcsXG4gKiAgICAgaWRlbnRpZmllcjogJ2ZvbydcbiAqICAgfSk7XG4gKiAgIC8vICdbZm9vXSdcbiAqXG4gKiAgIGxhYmVsKHtcbiAqICAgICB0eXBlOiAncmVmZXJlbmNlSW1hZ2UnLFxuICogICAgIHJlZmVyZW5jZVR5cGU6ICdjb2xsYXBzZWQnLFxuICogICAgIGlkZW50aWZpZXI6ICdmb28nXG4gKiAgIH0pO1xuICogICAvLyAnW10nXG4gKlxuICogICBsYWJlbCh7XG4gKiAgICAgdHlwZTogJ3JlZmVyZW5jZUltYWdlJyxcbiAqICAgICByZWZlcmVuY2VUeXBlOiAnc2hvcnRjdXQnLFxuICogICAgIGlkZW50aWZpZXI6ICdmb28nXG4gKiAgIH0pO1xuICogICAvLyAnJ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gYGxpbmtSZWZlcmVuY2VgIG9yXG4gKiAgIGBpbWFnZVJlZmVyZW5jZWAgbm9kZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBNYXJrZG93biBsYWJlbCByZWZlcmVuY2UuXG4gKi9cbmZ1bmN0aW9uIGxhYmVsKG5vZGUpIHtcbiAgICB2YXIgdmFsdWUgPSBFTVBUWTtcbiAgICB2YXIgdHlwZSA9IG5vZGUucmVmZXJlbmNlVHlwZTtcblxuICAgIGlmICh0eXBlID09PSAnZnVsbCcpIHtcbiAgICAgICAgdmFsdWUgPSBub2RlLmlkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdzaG9ydGN1dCcpIHtcbiAgICAgICAgdmFsdWUgPSBTUVVBUkVfQlJBQ0tFVF9PUEVOICsgdmFsdWUgKyBTUVVBUkVfQlJBQ0tFVF9DTE9TRTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogRm9yIHNob3J0Y3V0IGFuZCBjb2xsYXBzZWQgcmVmZXJlbmNlIGxpbmtzLCB0aGUgY29udGVudHNcbiAqIGlzIGFsc28gYW4gaWRlbnRpZmllciwgc28gd2UgbmVlZCB0byByZXN0b3JlIHRoZSBvcmlnaW5hbFxuICogZW5jb2RpbmcgYW5kIGVzY2FwaW5nIHRoYXQgd2VyZSBwcmVzZW50IGluIHRoZSBzb3VyY2VcbiAqIHN0cmluZy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1bmVzY2FwZWQgJiB1bmVuY29kZWQgdmFsdWUgZnJvbVxuICogc2hvcnRjdXQncyBjaGlsZCBub2RlcyBhbmQgdGhlIGlkZW50aWZpZXIgYW5kIGVuY29kZXNcbiAqIHRoZSBmb3JtZXIgYWNjb3JkaW5nIHRvIHRoZSBsYXR0ZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgY29weUlkZW50aWZpZXJFbmNvZGluZygnYSpiJywgJ2FcXFxcKmIqYycpXG4gKiAgIC8vICdhXFxcXCpiKmMnXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVW5lc2NhcGVkIGFuZCB1bmVuY29kZWQgc3RyaW5naWZpZWRcbiAqICAgbGluayB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGlmaWVyIC0gTGluayBpZGVudGlmaWVyLlxuICogQHJldHVybiB7c3RyaW5nfSAtIEVuY29kZWQgbGluayB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gY29weUlkZW50aWZpZXJFbmNvZGluZyh2YWx1ZSwgaWRlbnRpZmllcikge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIHBvc2l0aW9uID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgIHZhciBjb3VudCA9IGlkZW50aWZpZXIubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgc3RhcnQ7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogVGFrZSBuZXh0IG5vbi1wdW5jdHVhdGlvbiBjaGFyYWN0ZXJzIGZyb20gYHZhbHVlYC5cbiAgICAgICAgICovXG5cbiAgICAgICAgc3RhcnQgPSBpbmRleDtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBpbmRleCA8IGxlbmd0aCAmJlxuICAgICAgICAgICAgIVBVTkNUVUFUSU9OLnRlc3QodmFsdWUuY2hhckF0KGluZGV4KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnB1c2godmFsdWUuc2xpY2Uoc3RhcnQsIGluZGV4KSk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogQWR2YW5jZSBgcG9zaXRpb25gIHRvIHRoZSBuZXh0IHB1bmN0dWF0aW9uIGNoYXJhY3Rlci5cbiAgICAgICAgICovXG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIHBvc2l0aW9uIDwgY291bnQgJiZcbiAgICAgICAgICAgICFQVU5DVFVBVElPTi50ZXN0KGlkZW50aWZpZXIuY2hhckF0KHBvc2l0aW9uKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogVGFrZSBuZXh0IHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMgZnJvbSBgaWRlbnRpZmllcmAuXG4gICAgICAgICAqL1xuICAgICAgICBzdGFydCA9IHBvc2l0aW9uO1xuXG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIHBvc2l0aW9uIDwgY291bnQgJiZcbiAgICAgICAgICAgIFBVTkNUVUFUSU9OLnRlc3QoaWRlbnRpZmllci5jaGFyQXQocG9zaXRpb24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChpZGVudGlmaWVyLmNoYXJBdChwb3NpdGlvbikgPT09IEFNUEVSU0FORCkge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IGVudGl0eVByZWZpeExlbmd0aChpZGVudGlmaWVyLnNsaWNlKHBvc2l0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NpdGlvbiArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnB1c2goaWRlbnRpZmllci5zbGljZShzdGFydCwgcG9zaXRpb24pKTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBBZHZhbmNlIGBpbmRleGAgdG8gdGhlIG5leHQgbm9uLXB1bmN0dWF0aW9uIGNoYXJhY3Rlci5cbiAgICAgICAgICovXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCAmJiBQVU5DVFVBVElPTi50ZXN0KHZhbHVlLmNoYXJBdChpbmRleCkpKSB7XG4gICAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5qb2luKEVNUFRZKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBsaW5rIHJlZmVyZW5jZS5cbiAqXG4gKiBTZWUgYGxhYmVsKClgIG9uIGhvdyByZWZlcmVuY2UgbGFiZWxzIGFyZSBjcmVhdGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIubGlua1JlZmVyZW5jZSh7XG4gKiAgICAgdHlwZTogJ2xpbmtSZWZlcmVuY2UnLFxuICogICAgIHJlZmVyZW5jZVR5cGU6ICdjb2xsYXBzZWQnLFxuICogICAgIGlkZW50aWZpZXI6ICdmb28nLFxuICogICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgdHlwZTogJ3RleHQnLFxuICogICAgICAgdmFsdWU6ICdGb28nXG4gKiAgICAgfV1cbiAqICAgfSk7XG4gKiAgIC8vICdbRm9vXVtdJ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gYGxpbmtSZWZlcmVuY2VgIG5vZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gbGluayByZWZlcmVuY2UuXG4gKi9cbmNvbXBpbGVyUHJvdG90eXBlLmxpbmtSZWZlcmVuY2UgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZXhpdExpbmtSZWZlcmVuY2UgPSBzZWxmLmVudGVyTGlua1JlZmVyZW5jZShzZWxmLCBub2RlKTtcbiAgICB2YXIgdmFsdWUgPSBzZWxmLmFsbChub2RlKS5qb2luKEVNUFRZKTtcblxuICAgIGV4aXRMaW5rUmVmZXJlbmNlKCk7XG5cbiAgICBpZiAoXG4gICAgICAgIG5vZGUucmVmZXJlbmNlVHlwZSA9PT0gJ3Nob3J0Y3V0JyB8fFxuICAgICAgICBub2RlLnJlZmVyZW5jZVR5cGUgPT09ICdjb2xsYXBzZWQnXG4gICAgKSB7XG4gICAgICAgIHZhbHVlID0gY29weUlkZW50aWZpZXJFbmNvZGluZyh2YWx1ZSwgbm9kZS5pZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU1FVQVJFX0JSQUNLRVRfT1BFTiArIHZhbHVlICsgU1FVQVJFX0JSQUNLRVRfQ0xPU0UgKyBsYWJlbChub2RlKTtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGFuIGltYWdlIHJlZmVyZW5jZS5cbiAqXG4gKiBTZWUgYGxhYmVsKClgIG9uIGhvdyByZWZlcmVuY2UgbGFiZWxzIGFyZSBjcmVhdGVkLlxuICpcbiAqIFN1cHBvcnRzIG5hbWVkIGVudGl0aWVzIGluIHRoZSBgYWx0YCB3aGVuXG4gKiBpbiBgc2V0dGluZ3MuZW5jb2RlYCBtb2RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIuaW1hZ2VSZWZlcmVuY2Uoe1xuICogICAgIHR5cGU6ICdpbWFnZVJlZmVyZW5jZScsXG4gKiAgICAgcmVmZXJlbmNlVHlwZTogJ2Z1bGwnLFxuICogICAgIGlkZW50aWZpZXI6ICdmb28nLFxuICogICAgIGFsdDogJ0ZvbydcbiAqICAgfSk7XG4gKiAgIC8vICchW0Zvb11bZm9vXSdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIGBpbWFnZVJlZmVyZW5jZWAgbm9kZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBNYXJrZG93biBpbWFnZSByZWZlcmVuY2UuXG4gKi9cbmNvbXBpbGVyUHJvdG90eXBlLmltYWdlUmVmZXJlbmNlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgYWx0ID0gdGhpcy5lbmNvZGUobm9kZS5hbHQsIG5vZGUpIHx8IEVNUFRZO1xuXG4gICAgcmV0dXJuIEVYQ0xBTUFUSU9OX01BUksgK1xuICAgICAgICBTUVVBUkVfQlJBQ0tFVF9PUEVOICsgYWx0ICsgU1FVQVJFX0JSQUNLRVRfQ0xPU0UgK1xuICAgICAgICBsYWJlbChub2RlKTtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IGEgZm9vdG5vdGUgcmVmZXJlbmNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIuZm9vdG5vdGVSZWZlcmVuY2Uoe1xuICogICAgIHR5cGU6ICdmb290bm90ZVJlZmVyZW5jZScsXG4gKiAgICAgaWRlbnRpZmllcjogJ2ZvbydcbiAqICAgfSk7XG4gKiAgIC8vICdbXmZvb10nXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBgZm9vdG5vdGVSZWZlcmVuY2VgIG5vZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gTWFya2Rvd24gZm9vdG5vdGUgcmVmZXJlbmNlLlxuICovXG5jb21waWxlclByb3RvdHlwZS5mb290bm90ZVJlZmVyZW5jZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIFNRVUFSRV9CUkFDS0VUX09QRU4gKyBDQVJFVCArIG5vZGUuaWRlbnRpZmllciArXG4gICAgICAgIFNRVUFSRV9CUkFDS0VUX0NMT1NFO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgYW4gbGluay0gb3IgaW1hZ2UgZGVmaW5pdGlvbi5cbiAqXG4gKiBJcyBzbWFydCBhYm91dCBlbmNsb3NpbmcgYGhyZWZgIChzZWUgYGVuY2xvc2VVUkkoKWApIGFuZFxuICogYHRpdGxlYCAoc2VlIGBlbmNsb3NlVGl0bGUoKWApLlxuICpcbiAqICAgIFtmb29dOiA8Zm9vIGF0IGJhciBkb3QgY29tPiAnQW4gXCJleGFtcGxlXCIgZS1tYWlsJ1xuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIuZGVmaW5pdGlvbih7XG4gKiAgICAgdHlwZTogJ2RlZmluaXRpb24nLFxuICogICAgIGxpbms6ICdodHRwOi8vZXhhbXBsZS5jb20nLFxuICogICAgIHRpdGxlOiAnRXhhbXBsZSBEb21haW4nLFxuICogICAgIGlkZW50aWZpZXI6ICdmb28nXG4gKiAgIH0pO1xuICogICAvLyAnW2Zvb106IGh0dHA6Ly9leGFtcGxlLmNvbSBcIkV4YW1wbGUgRG9tYWluXCInXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBgZGVmaW5pdGlvbmAgbm9kZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBNYXJrZG93biBsaW5rLSBvciBpbWFnZSBkZWZpbml0aW9uLlxuICovXG5jb21waWxlclByb3RvdHlwZS5kZWZpbml0aW9uID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgdmFsdWUgPSBTUVVBUkVfQlJBQ0tFVF9PUEVOICsgbm9kZS5pZGVudGlmaWVyICsgU1FVQVJFX0JSQUNLRVRfQ0xPU0U7XG4gICAgdmFyIHVybCA9IGVuY2xvc2VVUkkobm9kZS5saW5rKTtcblxuICAgIGlmIChub2RlLnRpdGxlKSB7XG4gICAgICAgIHVybCArPSBTUEFDRSArIGVuY2xvc2VUaXRsZShub2RlLnRpdGxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWUgKyBDT0xPTiArIFNQQUNFICsgdXJsO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgYW4gaW1hZ2UuXG4gKlxuICogSXMgc21hcnQgYWJvdXQgZW5jbG9zaW5nIGBocmVmYCAoc2VlIGBlbmNsb3NlVVJJKClgKSBhbmRcbiAqIGB0aXRsZWAgKHNlZSBgZW5jbG9zZVRpdGxlKClgKS5cbiAqXG4gKiAgICAhW2Zvb10oPC9mYXYgaWNvbi5wbmc+ICdNeSBcImZhdm91cml0ZVwiIGljb24nKVxuICpcbiAqIFN1cHBvcnRzIG5hbWVkIGVudGl0aWVzIGluIGBzcmNgLCBgYWx0YCwgYW5kIGB0aXRsZWBcbiAqIHdoZW4gaW4gYHNldHRpbmdzLmVuY29kZWAgbW9kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTtcbiAqXG4gKiAgIGNvbXBpbGVyLmltYWdlKHtcbiAqICAgICB0eXBlOiAnaW1hZ2UnLFxuICogICAgIGhyZWY6ICdodHRwOi8vZXhhbXBsZS5wbmcvZmF2aWNvbi5wbmcnLFxuICogICAgIHRpdGxlOiAnRXhhbXBsZSBJY29uJyxcbiAqICAgICBhbHQ6ICdGb28nXG4gKiAgIH0pO1xuICogICAvLyAnIVtGb29dKGh0dHA6Ly9leGFtcGxlLnBuZy9mYXZpY29uLnBuZyBcIkV4YW1wbGUgSWNvblwiKSdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIGBpbWFnZWAgbm9kZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBNYXJrZG93biBpbWFnZS5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuaW1hZ2UgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciB1cmwgPSBlbmNsb3NlVVJJKHRoaXMuZW5jb2RlKG5vZGUuc3JjLCBub2RlKSk7XG4gICAgdmFyIHZhbHVlO1xuXG4gICAgaWYgKG5vZGUudGl0bGUpIHtcbiAgICAgICAgdXJsICs9IFNQQUNFICsgZW5jbG9zZVRpdGxlKHRoaXMuZW5jb2RlKG5vZGUudGl0bGUsIG5vZGUpKTtcbiAgICB9XG5cbiAgICB2YWx1ZSA9IEVYQ0xBTUFUSU9OX01BUksgK1xuICAgICAgICBTUVVBUkVfQlJBQ0tFVF9PUEVOICsgdGhpcy5lbmNvZGUobm9kZS5hbHQgfHwgRU1QVFksIG5vZGUpICtcbiAgICAgICAgU1FVQVJFX0JSQUNLRVRfQ0xPU0U7XG5cbiAgICB2YWx1ZSArPSBQQVJFTlRIRVNJU19PUEVOICsgdXJsICsgUEFSRU5USEVTSVNfQ0xPU0U7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIFN0cmluZ2lmeSBhIGZvb3Rub3RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIuZm9vdG5vdGUoe1xuICogICAgIHR5cGU6ICdmb290bm90ZScsXG4gKiAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICB2YWx1ZTogJ0ZvbydcbiAqICAgICB9XVxuICogICB9KTtcbiAqICAgLy8gJ1teRm9vXSdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIGBmb290bm90ZWAgbm9kZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBNYXJrZG93biBmb290bm90ZS5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuZm9vdG5vdGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBTUVVBUkVfQlJBQ0tFVF9PUEVOICsgQ0FSRVQgKyB0aGlzLmFsbChub2RlKS5qb2luKEVNUFRZKSArXG4gICAgICAgIFNRVUFSRV9CUkFDS0VUX0NMT1NFO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBmb290bm90ZSBkZWZpbml0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIuZm9vdG5vdGVEZWZpbml0aW9uKHtcbiAqICAgICB0eXBlOiAnZm9vdG5vdGVEZWZpbml0aW9uJyxcbiAqICAgICBpZGVudGlmaWVyOiAnZm9vJyxcbiAqICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgIHR5cGU6ICdwYXJhZ3JhcGgnLFxuICogICAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAqICAgICAgICAgdmFsdWU6ICdiYXInXG4gKiAgICAgICB9XVxuICogICAgIH1dXG4gKiAgIH0pO1xuICogICAvLyAnW15mb29dOiBiYXInXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBgZm9vdG5vdGVEZWZpbml0aW9uYCBub2RlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIE1hcmtkb3duIGZvb3Rub3RlIGRlZmluaXRpb24uXG4gKi9cbmNvbXBpbGVyUHJvdG90eXBlLmZvb3Rub3RlRGVmaW5pdGlvbiA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIGlkID0gbm9kZS5pZGVudGlmaWVyLnRvTG93ZXJDYXNlKCk7XG5cbiAgICByZXR1cm4gU1FVQVJFX0JSQUNLRVRfT1BFTiArIENBUkVUICsgaWQgK1xuICAgICAgICBTUVVBUkVfQlJBQ0tFVF9DTE9TRSArIENPTE9OICsgU1BBQ0UgK1xuICAgICAgICB0aGlzLmFsbChub2RlKS5qb2luKEJSRUFLICsgcmVwZWF0KFNQQUNFLCBJTkRFTlQpKTtcbn07XG5cbi8qKlxuICogU3RyaW5naWZ5IHRhYmxlLlxuICpcbiAqIENyZWF0ZXMgYSBmZW5jZWQgdGFibGUgYnkgZGVmYXVsdCwgYnV0IG5vdCBpblxuICogYGxvb3NlVGFibGU6IHRydWVgIG1vZGU6XG4gKlxuICogICAgIEZvbyB8IEJhclxuICogICAgIDotOiB8IC0tLVxuICogICAgIEJheiB8IFF1eFxuICpcbiAqIE5PVEU6IEJlIGNhcmVmdWwgd2l0aCBgbG9vc2VUYWJsZTogdHJ1ZWAgbW9kZSwgYXMgYVxuICogbG9vc2UgdGFibGUgaW5zaWRlIGFuIGluZGVudGVkIGNvZGUgYmxvY2sgb24gR2l0SHViXG4gKiByZW5kZXJzIGFzIGFuIGFjdHVhbCB0YWJsZSFcbiAqXG4gKiBDcmVhdGVzIGEgc3BhY2VzIHRhYmxlIGJ5IGRlZmF1bHQsIGJ1dCBub3QgaW5cbiAqIGBzcGFjZWRUYWJsZTogZmFsc2VgOlxuICpcbiAqICAgICB8Rm9vfEJhcnxcbiAqICAgICB8Oi06fC0tLXxcbiAqICAgICB8QmF6fFF1eHxcbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoKTtcbiAqXG4gKiAgIGNvbXBpbGVyLnRhYmxlKHtcbiAqICAgICB0eXBlOiAndGFibGUnLFxuICogICAgIGFsaWduOiBbJ2NlbnRlcicsIG51bGxdLFxuICogICAgIGNoaWxkcmVuOiBbXG4gKiAgICAgICB7XG4gKiAgICAgICAgIHR5cGU6ICd0YWJsZUhlYWRlcicsXG4gKiAgICAgICAgIGNoaWxkcmVuOiBbXG4gKiAgICAgICAgICAge1xuICogICAgICAgICAgICAgdHlwZTogJ3RhYmxlQ2VsbCdcbiAqICAgICAgICAgICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgICAgICAgICB0eXBlOiAndGV4dCdcbiAqICAgICAgICAgICAgICAgdmFsdWU6ICdGb28nXG4gKiAgICAgICAgICAgICB9XVxuICogICAgICAgICAgIH0sXG4gKiAgICAgICAgICAge1xuICogICAgICAgICAgICAgdHlwZTogJ3RhYmxlQ2VsbCdcbiAqICAgICAgICAgICAgIGNoaWxkcmVuOiBbe1xuICogICAgICAgICAgICAgICB0eXBlOiAndGV4dCdcbiAqICAgICAgICAgICAgICAgdmFsdWU6ICdCYXInXG4gKiAgICAgICAgICAgICB9XVxuICogICAgICAgICAgIH1cbiAqICAgICAgICAgXVxuICogICAgICAgfSxcbiAqICAgICAgIHtcbiAqICAgICAgICAgdHlwZTogJ3RhYmxlUm93JyxcbiAqICAgICAgICAgY2hpbGRyZW46IFtcbiAqICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICB0eXBlOiAndGFibGVDZWxsJ1xuICogICAgICAgICAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0J1xuICogICAgICAgICAgICAgICB2YWx1ZTogJ0JheidcbiAqICAgICAgICAgICAgIH1dXG4gKiAgICAgICAgICAgfSxcbiAqICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICB0eXBlOiAndGFibGVDZWxsJ1xuICogICAgICAgICAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0J1xuICogICAgICAgICAgICAgICB2YWx1ZTogJ1F1eCdcbiAqICAgICAgICAgICAgIH1dXG4gKiAgICAgICAgICAgfVxuICogICAgICAgICBdXG4gKiAgICAgICB9XG4gKiAgICAgXVxuICogICB9KTtcbiAqICAgLy8gJ3wgRm9vIHwgQmFyIHxcXG58IDotOiB8IC0tLSB8XFxufCBCYXogfCBRdXggfCdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIGB0YWJsZWAgbm9kZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBNYXJrZG93biB0YWJsZS5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUudGFibGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbG9vc2UgPSBzZWxmLm9wdGlvbnMubG9vc2VUYWJsZTtcbiAgICB2YXIgc3BhY2VkID0gc2VsZi5vcHRpb25zLnNwYWNlZFRhYmxlO1xuICAgIHZhciByb3dzID0gbm9kZS5jaGlsZHJlbjtcbiAgICB2YXIgaW5kZXggPSByb3dzLmxlbmd0aDtcbiAgICB2YXIgZXhpdCA9IHNlbGYuZW50ZXJUYWJsZSgpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgc3RhcnQ7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc2VsZi5hbGwocm93c1tpbmRleF0pO1xuICAgIH1cblxuICAgIGV4aXQoKTtcblxuICAgIHN0YXJ0ID0gbG9vc2UgPyBFTVBUWSA6IHNwYWNlZCA/IFBJUEUgKyBTUEFDRSA6IFBJUEU7XG5cbiAgICByZXR1cm4gdGFibGUocmVzdWx0LCB7XG4gICAgICAgICdhbGlnbic6IG5vZGUuYWxpZ24sXG4gICAgICAgICdzdGFydCc6IHN0YXJ0LFxuICAgICAgICAnZW5kJzogc3RhcnQuc3BsaXQoRU1QVFkpLnJldmVyc2UoKS5qb2luKEVNUFRZKSxcbiAgICAgICAgJ2RlbGltaXRlcic6IHNwYWNlZCA/IFNQQUNFICsgUElQRSArIFNQQUNFIDogUElQRVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgYSB0YWJsZSBjZWxsLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcigpO1xuICpcbiAqICAgY29tcGlsZXIudGFibGVDZWxsKHtcbiAqICAgICB0eXBlOiAndGFibGVDZWxsJyxcbiAqICAgICBjaGlsZHJlbjogW3tcbiAqICAgICAgIHR5cGU6ICd0ZXh0J1xuICogICAgICAgdmFsdWU6ICdRdXgnXG4gKiAgICAgfV1cbiAqICAgfSk7XG4gKiAgIC8vICdRdXgnXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBgdGFibGVDZWxsYCBub2RlLlxuICogQHJldHVybiB7c3RyaW5nfSAtIE1hcmtkb3duIHRhYmxlIGNlbGwuXG4gKi9cbmNvbXBpbGVyUHJvdG90eXBlLnRhYmxlQ2VsbCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxsKG5vZGUpLmpvaW4oRU1QVFkpO1xufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgdGhlIGJvdW5kIGZpbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGZpbGUgPSBuZXcgVkZpbGUoJ19fRm9vX18nKTtcbiAqXG4gKiAgIGZpbGUubmFtZXNwYWNlKCdtZGFzdCcpLnRyZWUgPSB7XG4gKiAgICAgdHlwZTogJ3N0cm9uZycsXG4gKiAgICAgY2hpbGRyZW46IFt7XG4gKiAgICAgICB0eXBlOiAndGV4dCcsXG4gKiAgICAgICB2YWx1ZTogJ0ZvbydcbiAqICAgICB9XVxuICogICB9KTtcbiAqXG4gKiAgIG5ldyBDb21waWxlcihmaWxlKS5jb21waWxlKCk7XG4gKiAgIC8vICcqKkZvbyoqJ1xuICpcbiAqIEB0aGlzIHtDb21waWxlcn1cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBNYXJrZG93biBkb2N1bWVudC5cbiAqL1xuY29tcGlsZXJQcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpdCh0aGlzLmZpbGUubmFtZXNwYWNlKCdtZGFzdCcpLnRyZWUpO1xufTtcblxuLypcbiAqIEV4cG9zZSBgc3RyaW5naWZ5YCBvbiBgbW9kdWxlLmV4cG9ydHNgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcGlsZXI7XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUtMjAxNiBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSByZW1hcms6dXRpbGl0aWVzXG4gKiBAdmVyc2lvbiAzLjIuMlxuICogQGZpbGVvdmVydmlldyBDb2xsZWN0aW9uIG9mIHRpbnkgaGVscGVycyB1c2VmdWwgZm9yXG4gKiAgIGJvdGggcGFyc2luZyBhbmQgY29tcGlsaW5nIG1hcmtkb3duLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWVudiBjb21tb25qcyAqL1xuXG4vKlxuICogRGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBjb2xsYXBzZVdoaXRlU3BhY2UgPSByZXF1aXJlKCdjb2xsYXBzZS13aGl0ZS1zcGFjZScpO1xuXG4vKlxuICogRXhwcmVzc2lvbnMuXG4gKi9cblxudmFyIEVYUFJFU1NJT05fTElORV9CUkVBS1MgPSAvXFxyXFxufFxcci9nO1xudmFyIEVYUFJFU1NJT05fU1lNQk9MX0ZPUl9ORVdfTElORSA9IC9cXHUyNDI0L2c7XG52YXIgRVhQUkVTU0lPTl9CT00gPSAvXlxcdWZlZmYvO1xuXG4vKipcbiAqIFRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGluIGl0cyBgbWVzc2FnZWAgYHZhbHVlYFxuICogYW5kIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIC0gSW52YWxpZCB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gU2V0dGluZyBuYW1lLlxuICovXG5mdW5jdGlvbiByYWlzZSh2YWx1ZSwgbmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgdmFsdWUgYCcgKyB2YWx1ZSArICdgICcgK1xuICAgICAgICAnZm9yIHNldHRpbmcgYCcgKyBuYW1lICsgJ2AnXG4gICAgKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIHZhbHVlIHRvIGJlIGJvb2xlYW4uIERlZmF1bHRzIHRvIGBkZWZgLlxuICogUmFpc2VzIGFuIGV4Y2VwdGlvbiB3aXRoIGBjb250ZXh0W25hbWVdYCB3aGVuIG5vdFxuICogYSBib29sZWFuLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhbGlkYXRlQm9vbGVhbih7Zm9vOiBudWxsfSwgJ2ZvbycsIHRydWUpIC8vIHRydWVcbiAqICAgdmFsaWRhdGVCb29sZWFuKHtmb286IGZhbHNlfSwgJ2ZvbycsIHRydWUpIC8vIGZhbHNlXG4gKiAgIHZhbGlkYXRlQm9vbGVhbih7Zm9vOiAnYmFyJ30sICdmb28nLCB0cnVlKSAvLyBUaHJvd3NcbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaGVuIGEgc2V0dGluZyBpcyBuZWl0aGVyIG9taXR0ZWQgbm9yXG4gKiAgIGEgYm9vbGVhbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IC0gU2V0dGluZ3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFNldHRpbmcgbmFtZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVmIC0gRGVmYXVsdCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCb29sZWFuKGNvbnRleHQsIG5hbWUsIGRlZikge1xuICAgIHZhciB2YWx1ZSA9IGNvbnRleHRbbmFtZV07XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IGRlZjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmFpc2UodmFsdWUsICdvcHRpb25zLicgKyBuYW1lKTtcbiAgICB9XG5cbiAgICBjb250ZXh0W25hbWVdID0gdmFsdWU7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSB2YWx1ZSB0byBiZSBib29sZWFuLiBEZWZhdWx0cyB0byBgZGVmYC5cbiAqIFJhaXNlcyBhbiBleGNlcHRpb24gd2l0aCBgY29udGV4dFtuYW1lXWAgd2hlbiBub3RcbiAqIGEgYm9vbGVhbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YWxpZGF0ZU51bWJlcih7Zm9vOiBudWxsfSwgJ2ZvbycsIDEpIC8vIDFcbiAqICAgdmFsaWRhdGVOdW1iZXIoe2ZvbzogMn0sICdmb28nLCAxKSAvLyAyXG4gKiAgIHZhbGlkYXRlTnVtYmVyKHtmb286ICdiYXInfSwgJ2ZvbycsIDEpIC8vIFRocm93c1xuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdoZW4gYSBzZXR0aW5nIGlzIG5laXRoZXIgb21pdHRlZCBub3JcbiAqICAgYSBudW1iZXIuXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCAtIFNldHRpbmdzLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBTZXR0aW5nIG5hbWUuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVmIC0gRGVmYXVsdCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIoY29udGV4dCwgbmFtZSwgZGVmKSB7XG4gICAgdmFyIHZhbHVlID0gY29udGV4dFtuYW1lXTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlID0gZGVmO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8IHZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICByYWlzZSh2YWx1ZSwgJ29wdGlvbnMuJyArIG5hbWUpO1xuICAgIH1cblxuICAgIGNvbnRleHRbbmFtZV0gPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIHZhbHVlIHRvIGJlIGluIGBtYXBgLiBEZWZhdWx0cyB0byBgZGVmYC5cbiAqIFJhaXNlcyBhbiBleGNlcHRpb24gd2l0aCBgY29udGV4dFtuYW1lXWAgd2hlbiBub3RcbiAqIG5vdCBpbiBgbWFwYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgbWFwID0ge2JhcjogdHJ1ZSwgYmF6OiB0cnVlfTtcbiAqICAgdmFsaWRhdGVTdHJpbmcoe2ZvbzogbnVsbH0sICdmb28nLCAnYmFyJywgbWFwKSAvLyAnYmFyJ1xuICogICB2YWxpZGF0ZVN0cmluZyh7Zm9vOiAnYmF6J30sICdmb28nLCAnYmFyJywgbWFwKSAvLyAnYmF6J1xuICogICB2YWxpZGF0ZVN0cmluZyh7Zm9vOiB0cnVlfSwgJ2ZvbycsICdiYXInLCBtYXApIC8vIFRocm93c1xuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdoZW4gYSBzZXR0aW5nIGlzIG5laXRoZXIgb21pdHRlZCBub3JcbiAqICAgaW4gYG1hcGAuXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCAtIFNldHRpbmdzLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBTZXR0aW5nIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVmIC0gRGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgLSBFbnVtLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyhjb250ZXh0LCBuYW1lLCBkZWYsIG1hcCkge1xuICAgIHZhciB2YWx1ZSA9IGNvbnRleHRbbmFtZV07XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IGRlZjtcbiAgICB9XG5cbiAgICBpZiAoISh2YWx1ZSBpbiBtYXApKSB7XG4gICAgICAgIHJhaXNlKHZhbHVlLCAnb3B0aW9ucy4nICsgbmFtZSk7XG4gICAgfVxuXG4gICAgY29udGV4dFtuYW1lXSA9IHZhbHVlO1xufVxuXG4vKipcbiAqIENsZWFuIGEgc3RyaW5nIGluIHByZXBlcmF0aW9uIG9mIHBhcnNpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgY2xlYW4oJ1xcdWZlZmZmb28nKTsgLy8gJ2ZvbydcbiAqICAgY2xlYW4oJ2Zvb1xcclxcbmJhcicpOyAvLyAnZm9vXFxuYmFyJ1xuICogICBjbGVhbignZm9vXFx1MjQyNGJhcicpOyAvLyAnZm9vXFxuYmFyJ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIENvbnRlbnQgdG8gY2xlYW4uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ2xlYW5lZCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBjbGVhbih2YWx1ZSkge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgICAgIC5yZXBsYWNlKEVYUFJFU1NJT05fQk9NLCAnJylcbiAgICAgICAgLnJlcGxhY2UoRVhQUkVTU0lPTl9MSU5FX0JSRUFLUywgJ1xcbicpXG4gICAgICAgIC5yZXBsYWNlKEVYUFJFU1NJT05fU1lNQk9MX0ZPUl9ORVdfTElORSwgJ1xcbicpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbiBpZGVudGlmaWVyLiAgQ29sbGFwc2VzIG11bHRpcGxlIHdoaXRlIHNwYWNlXG4gKiBjaGFyYWN0ZXJzIGludG8gYSBzaW5nbGUgc3BhY2UsIGFuZCByZW1vdmVzIGNhc2luZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBub3JtYWxpemVJZGVudGlmaWVyKCdGT09cXHQgYmFyJyk7IC8vICdmb28gYmFyJ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIENvbnRlbnQgdG8gbm9ybWFsaXplLlxuICogQHJldHVybiB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSWRlbnRpZmllcih2YWx1ZSkge1xuICAgIHJldHVybiBjb2xsYXBzZVdoaXRlU3BhY2UodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgc3RhdGUgYHRvZ2dsZXJgOiBhIGZ1bmN0aW9uIHdoaWNoIGludmVyc2VzXG4gKiBgcHJvcGVydHlgIGluIGNvbnRleHQgYmFzZWQgb24gaXRzIGN1cnJlbnQgdmFsdWUuXG4gKiBUaGUgYnkgYHRvZ2dsZXJgIHJldHVybmVkIGZ1bmN0aW9uIHJlc3RvcmVzIHRoYXQgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGNvbnRleHQgPSB7fTtcbiAqICAgdmFyIGtleSA9ICdmb28nO1xuICogICB2YXIgdmFsID0gdHJ1ZTtcbiAqICAgY29udGV4dFtrZXldID0gdmFsO1xuICogICBjb250ZXh0LmVudGVyID0gc3RhdGVUb2dnbGVyKGtleSwgdmFsKTtcbiAqICAgY29udGV4dFtrZXldOyAvLyB0cnVlXG4gKiAgIHZhciBleGl0ID0gY29udGV4dC5lbnRlcigpO1xuICogICBjb250ZXh0W2tleV07IC8vIGZhbHNlXG4gKiAgIHZhciBuZXN0ZWQgPSBjb250ZXh0LmVudGVyKCk7XG4gKiAgIGNvbnRleHRba2V5XTsgLy8gZmFsc2VcbiAqICAgbmVzdGVkKCk7XG4gKiAgIGNvbnRleHRba2V5XTsgLy8gZmFsc2VcbiAqICAgZXhpdCgpO1xuICogICBjb250ZXh0W2tleV07IC8vIHRydWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gUHJvcGVydHkgdG8gdG9nZ2xlLlxuICogQHBhcmFtIHtib29sZWFufSBzdGF0ZSAtIEl0J3MgZGVmYXVsdCBzdGF0ZS5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKCk6IGZ1bmN0aW9uKCl9IC0gRW50ZXIuXG4gKi9cbmZ1bmN0aW9uIHN0YXRlVG9nZ2xlcihrZXksIHN0YXRlKSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgdG9nZ2xlciBmb3IgdGhlIGJvdW5kIGBrZXlgLlxuICAgICAqXG4gICAgICogQHJldHVybiB7RnVuY3Rpb259IC0gRXhpdCBzdGF0ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbnRlcigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgY3VycmVudCA9IHNlbGZba2V5XTtcblxuICAgICAgICBzZWxmW2tleV0gPSAhc3RhdGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN0YXRlIGNhbmNlbGVyLCBjYW5jZWxzIHRoZSBzdGF0ZSwgaWYgYWxsb3dlZC5cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGV4aXQoKSB7XG4gICAgICAgICAgICBzZWxmW2tleV0gPSBjdXJyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGVyO1xufVxuXG4vKlxuICogRGVmaW5lIG5vZGVzIG9mIGEgdHlwZSB3aGljaCBjYW4gYmUgbWVyZ2VkLlxuICovXG5cbnZhciBNRVJHRUFCTEVfTk9ERVMgPSB7fTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgbm9kZSBpcyBtZXJnZWFibGUgd2l0aCBhZGphY2VudCBub2Rlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIE5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFdoZXRoZXIgYG5vZGVgIGlzIG1lcmdhYmxlLlxuICovXG5mdW5jdGlvbiBtZXJnZWFibGUobm9kZSkge1xuICAgIHZhciBzdGFydDtcbiAgICB2YXIgZW5kO1xuXG4gICAgaWYgKG5vZGUudHlwZSAhPT0gJ3RleHQnIHx8ICFub2RlLnBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXJ0ID0gbm9kZS5wb3NpdGlvbi5zdGFydDtcbiAgICBlbmQgPSBub2RlLnBvc2l0aW9uLmVuZDtcblxuICAgIC8qXG4gICAgICogT25seSBtZXJnZSBub2RlcyB3aGljaCBvY2N1cHkgdGhlIHNhbWUgc2l6ZSBhcyB0aGVpclxuICAgICAqIGB2YWx1ZWAuXG4gICAgICovXG5cbiAgICByZXR1cm4gc3RhcnQubGluZSAhPT0gZW5kLmxpbmUgfHxcbiAgICAgICAgZW5kLmNvbHVtbiAtIHN0YXJ0LmNvbHVtbiA9PT0gbm9kZS52YWx1ZS5sZW5ndGg7XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIHRleHQgbm9kZXM6IGBub2RlYCBpbnRvIGBwcmV2YC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJldiAtIFByZWNlZGluZyBzaWJsaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBGb2xsb3dpbmcgc2libGluZy5cbiAqIEByZXR1cm4ge09iamVjdH0gLSBgcHJldmAuXG4gKi9cbk1FUkdFQUJMRV9OT0RFUy50ZXh0ID0gZnVuY3Rpb24gKHByZXYsIG5vZGUpIHtcbiAgICBwcmV2LnZhbHVlICs9IG5vZGUudmFsdWU7XG5cbiAgICByZXR1cm4gcHJldjtcbn07XG5cbi8qKlxuICogTWVyZ2UgdHdvIGJsb2NrcXVvdGVzOiBgbm9kZWAgaW50byBgcHJldmAsIHVubGVzcyBpblxuICogQ29tbW9uTWFyayBtb2RlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcmV2IC0gUHJlY2VkaW5nIHNpYmxpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIEZvbGxvd2luZyBzaWJsaW5nLlxuICogQHJldHVybiB7T2JqZWN0fSAtIGBwcmV2YCwgb3IgYG5vZGVgIGluIENvbW1vbk1hcmsgbW9kZS5cbiAqL1xuTUVSR0VBQkxFX05PREVTLmJsb2NrcXVvdGUgPSBmdW5jdGlvbiAocHJldiwgbm9kZSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tbW9ubWFyaykge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBwcmV2LmNoaWxkcmVuID0gcHJldi5jaGlsZHJlbi5jb25jYXQobm9kZS5jaGlsZHJlbik7XG5cbiAgICByZXR1cm4gcHJldjtcbn07XG5cbi8qXG4gKiBFeHBvc2UgYHZhbGlkYXRlYC5cbiAqL1xuXG5leHBvcnRzLnZhbGlkYXRlID0ge1xuICAgICdib29sZWFuJzogdmFsaWRhdGVCb29sZWFuLFxuICAgICdzdHJpbmcnOiB2YWxpZGF0ZVN0cmluZyxcbiAgICAnbnVtYmVyJzogdmFsaWRhdGVOdW1iZXJcbn07XG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxuZXhwb3J0cy5ub3JtYWxpemVJZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcjtcbmV4cG9ydHMuY2xlYW4gPSBjbGVhbjtcbmV4cG9ydHMucmFpc2UgPSByYWlzZTtcbmV4cG9ydHMuc3RhdGVUb2dnbGVyID0gc3RhdGVUb2dnbGVyO1xuZXhwb3J0cy5tZXJnZWFibGUgPSBtZXJnZWFibGU7XG5leHBvcnRzLk1FUkdFQUJMRV9OT0RFUyA9IE1FUkdFQUJMRV9OT0RFUztcbiIsIi8qIVxuICogcmVwZWF0LXN0cmluZyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvcmVwZWF0LXN0cmluZz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFJlc3VsdHMgY2FjaGVcbiAqL1xuXG52YXIgcmVzID0gJyc7XG52YXIgY2FjaGU7XG5cbi8qKlxuICogRXhwb3NlIGByZXBlYXRgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXBlYXQ7XG5cbi8qKlxuICogUmVwZWF0IHRoZSBnaXZlbiBgc3RyaW5nYCB0aGUgc3BlY2lmaWVkIGBudW1iZXJgXG4gKiBvZiB0aW1lcy5cbiAqXG4gKiAqKkV4YW1wbGU6KipcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKTtcbiAqIHJlcGVhdCgnQScsIDUpO1xuICogLy89PiBBQUFBQVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJpbmdgIFRoZSBzdHJpbmcgdG8gcmVwZWF0XG4gKiBAcGFyYW0ge051bWJlcn0gYG51bWJlcmAgVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZ1xuICogQHJldHVybiB7U3RyaW5nfSBSZXBlYXRlZCBzdHJpbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcmVwZWF0KHN0ciwgbnVtKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcGVhdC1zdHJpbmcgZXhwZWN0cyBhIHN0cmluZy4nKTtcbiAgfVxuXG4gIC8vIGNvdmVyIGNvbW1vbiwgcXVpY2sgdXNlIGNhc2VzXG4gIGlmIChudW0gPT09IDEpIHJldHVybiBzdHI7XG4gIGlmIChudW0gPT09IDIpIHJldHVybiBzdHIgKyBzdHI7XG5cbiAgdmFyIG1heCA9IHN0ci5sZW5ndGggKiBudW07XG4gIGlmIChjYWNoZSAhPT0gc3RyIHx8IHR5cGVvZiBjYWNoZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjYWNoZSA9IHN0cjtcbiAgICByZXMgPSAnJztcbiAgfVxuXG4gIHdoaWxlIChtYXggPiByZXMubGVuZ3RoICYmIG51bSA+IDApIHtcbiAgICBpZiAobnVtICYgMSkge1xuICAgICAgcmVzICs9IHN0cjtcbiAgICB9XG5cbiAgICBudW0gPj49IDE7XG4gICAgaWYgKCFudW0pIGJyZWFrO1xuICAgIHN0ciArPSBzdHI7XG4gIH1cblxuICByZXR1cm4gcmVzLnN1YnN0cigwLCBtYXgpO1xufVxuXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJpbXJhZlxucmltcmFmLnN5bmMgPSByaW1yYWZTeW5jXG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKFwiYXNzZXJ0XCIpXG52YXIgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpXG52YXIgZnMgPSByZXF1aXJlKFwiZnNcIilcbnZhciBnbG9iID0gcmVxdWlyZShcImdsb2JcIilcblxudmFyIGdsb2JPcHRzID0ge1xuICBub3NvcnQ6IHRydWUsXG4gIG5vY29tbWVudDogdHJ1ZSxcbiAgbm9uZWdhdGU6IHRydWUsXG4gIHNpbGVudDogdHJ1ZVxufVxuXG4vLyBmb3IgRU1GSUxFIGhhbmRsaW5nXG52YXIgdGltZW91dCA9IDBcblxudmFyIGlzV2luZG93cyA9IChwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIpXG5cbmZ1bmN0aW9uIGRlZmF1bHRzIChvcHRpb25zKSB7XG4gIHZhciBtZXRob2RzID0gW1xuICAgICd1bmxpbmsnLFxuICAgICdjaG1vZCcsXG4gICAgJ3N0YXQnLFxuICAgICdsc3RhdCcsXG4gICAgJ3JtZGlyJyxcbiAgICAncmVhZGRpcidcbiAgXVxuICBtZXRob2RzLmZvckVhY2goZnVuY3Rpb24obSkge1xuICAgIG9wdGlvbnNbbV0gPSBvcHRpb25zW21dIHx8IGZzW21dXG4gICAgbSA9IG0gKyAnU3luYydcbiAgICBvcHRpb25zW21dID0gb3B0aW9uc1ttXSB8fCBmc1ttXVxuICB9KVxuXG4gIG9wdGlvbnMubWF4QnVzeVRyaWVzID0gb3B0aW9ucy5tYXhCdXN5VHJpZXMgfHwgM1xuICBvcHRpb25zLmVtZmlsZVdhaXQgPSBvcHRpb25zLmVtZmlsZVdhaXQgfHwgMTAwMFxuICBvcHRpb25zLmRpc2FibGVHbG9iID0gb3B0aW9ucy5kaXNhYmxlR2xvYiB8fCBmYWxzZVxufVxuXG5mdW5jdGlvbiByaW1yYWYgKHAsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgYXNzZXJ0KHAsICdyaW1yYWY6IG1pc3NpbmcgcGF0aCcpXG4gIGFzc2VydC5lcXVhbCh0eXBlb2YgcCwgJ3N0cmluZycsICdyaW1yYWY6IHBhdGggc2hvdWxkIGJlIGEgc3RyaW5nJylcbiAgYXNzZXJ0KG9wdGlvbnMsICdyaW1yYWY6IG1pc3Npbmcgb3B0aW9ucycpXG4gIGFzc2VydC5lcXVhbCh0eXBlb2Ygb3B0aW9ucywgJ29iamVjdCcsICdyaW1yYWY6IG9wdGlvbnMgc2hvdWxkIGJlIG9iamVjdCcpXG4gIGFzc2VydC5lcXVhbCh0eXBlb2YgY2IsICdmdW5jdGlvbicsICdyaW1yYWY6IGNhbGxiYWNrIGZ1bmN0aW9uIHJlcXVpcmVkJylcblxuICBkZWZhdWx0cyhvcHRpb25zKVxuXG4gIHZhciBidXN5VHJpZXMgPSAwXG4gIHZhciBlcnJTdGF0ZSA9IG51bGxcbiAgdmFyIG4gPSAwXG5cbiAgaWYgKG9wdGlvbnMuZGlzYWJsZUdsb2IgfHwgIWdsb2IuaGFzTWFnaWMocCkpXG4gICAgcmV0dXJuIGFmdGVyR2xvYihudWxsLCBbcF0pXG5cbiAgZnMubHN0YXQocCwgZnVuY3Rpb24gKGVyLCBzdGF0KSB7XG4gICAgaWYgKCFlcilcbiAgICAgIHJldHVybiBhZnRlckdsb2IobnVsbCwgW3BdKVxuXG4gICAgZ2xvYihwLCBnbG9iT3B0cywgYWZ0ZXJHbG9iKVxuICB9KVxuXG4gIGZ1bmN0aW9uIG5leHQgKGVyKSB7XG4gICAgZXJyU3RhdGUgPSBlcnJTdGF0ZSB8fCBlclxuICAgIGlmICgtLW4gPT09IDApXG4gICAgICBjYihlcnJTdGF0ZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyR2xvYiAoZXIsIHJlc3VsdHMpIHtcbiAgICBpZiAoZXIpXG4gICAgICByZXR1cm4gY2IoZXIpXG5cbiAgICBuID0gcmVzdWx0cy5sZW5ndGhcbiAgICBpZiAobiA9PT0gMClcbiAgICAgIHJldHVybiBjYigpXG5cbiAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIHJpbXJhZl8ocCwgb3B0aW9ucywgZnVuY3Rpb24gQ0IgKGVyKSB7XG4gICAgICAgIGlmIChlcikge1xuICAgICAgICAgIGlmIChpc1dpbmRvd3MgJiYgKGVyLmNvZGUgPT09IFwiRUJVU1lcIiB8fCBlci5jb2RlID09PSBcIkVOT1RFTVBUWVwiIHx8IGVyLmNvZGUgPT09IFwiRVBFUk1cIikgJiZcbiAgICAgICAgICAgICAgYnVzeVRyaWVzIDwgb3B0aW9ucy5tYXhCdXN5VHJpZXMpIHtcbiAgICAgICAgICAgIGJ1c3lUcmllcyArK1xuICAgICAgICAgICAgdmFyIHRpbWUgPSBidXN5VHJpZXMgKiAxMDBcbiAgICAgICAgICAgIC8vIHRyeSBhZ2Fpbiwgd2l0aCB0aGUgc2FtZSBleGFjdCBjYWxsYmFjayBhcyB0aGlzIG9uZS5cbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmltcmFmXyhwLCBvcHRpb25zLCBDQilcbiAgICAgICAgICAgIH0sIHRpbWUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gdGhpcyBvbmUgd29uJ3QgaGFwcGVuIGlmIGdyYWNlZnVsLWZzIGlzIHVzZWQuXG4gICAgICAgICAgaWYgKGVyLmNvZGUgPT09IFwiRU1GSUxFXCIgJiYgdGltZW91dCA8IG9wdGlvbnMuZW1maWxlV2FpdCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByaW1yYWZfKHAsIG9wdGlvbnMsIENCKVxuICAgICAgICAgICAgfSwgdGltZW91dCArKylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBhbHJlYWR5IGdvbmVcbiAgICAgICAgICBpZiAoZXIuY29kZSA9PT0gXCJFTk9FTlRcIikgZXIgPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICB0aW1lb3V0ID0gMFxuICAgICAgICBuZXh0KGVyKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbi8vIFR3byBwb3NzaWJsZSBzdHJhdGVnaWVzLlxuLy8gMS4gQXNzdW1lIGl0J3MgYSBmaWxlLiAgdW5saW5rIGl0LCB0aGVuIGRvIHRoZSBkaXIgc3R1ZmYgb24gRVBFUk0gb3IgRUlTRElSXG4vLyAyLiBBc3N1bWUgaXQncyBhIGRpcmVjdG9yeS4gIHJlYWRkaXIsIHRoZW4gZG8gdGhlIGZpbGUgc3R1ZmYgb24gRU5PVERJUlxuLy9cbi8vIEJvdGggcmVzdWx0IGluIGFuIGV4dHJhIHN5c2NhbGwgd2hlbiB5b3UgZ3Vlc3Mgd3JvbmcuICBIb3dldmVyLCB0aGVyZVxuLy8gYXJlIGxpa2VseSBmYXIgbW9yZSBub3JtYWwgZmlsZXMgaW4gdGhlIHdvcmxkIHRoYW4gZGlyZWN0b3JpZXMuICBUaGlzXG4vLyBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGEgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGZpbGVzIHBlclxuLy8gZGlyZWN0b3J5IGlzID49IDEuXG4vL1xuLy8gSWYgYW55b25lIGV2ZXIgY29tcGxhaW5zIGFib3V0IHRoaXMsIHRoZW4gSSBndWVzcyB0aGUgc3RyYXRlZ3kgY291bGRcbi8vIGJlIG1hZGUgY29uZmlndXJhYmxlIHNvbWVob3cuICBCdXQgdW50aWwgdGhlbiwgWUFHTkkuXG5mdW5jdGlvbiByaW1yYWZfIChwLCBvcHRpb25zLCBjYikge1xuICBhc3NlcnQocClcbiAgYXNzZXJ0KG9wdGlvbnMpXG4gIGFzc2VydCh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG5cbiAgLy8gc3Vub3MgbGV0cyB0aGUgcm9vdCB1c2VyIHVubGluayBkaXJlY3Rvcmllcywgd2hpY2ggaXMuLi4gd2VpcmQuXG4gIC8vIHNvIHdlIGhhdmUgdG8gbHN0YXQgaGVyZSBhbmQgbWFrZSBzdXJlIGl0J3Mgbm90IGEgZGlyLlxuICBvcHRpb25zLmxzdGF0KHAsIGZ1bmN0aW9uIChlciwgc3QpIHtcbiAgICBpZiAoZXIgJiYgZXIuY29kZSA9PT0gXCJFTk9FTlRcIilcbiAgICAgIHJldHVybiBjYihudWxsKVxuXG4gICAgaWYgKHN0ICYmIHN0LmlzRGlyZWN0b3J5KCkpXG4gICAgICByZXR1cm4gcm1kaXIocCwgb3B0aW9ucywgZXIsIGNiKVxuXG4gICAgb3B0aW9ucy51bmxpbmsocCwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICBpZiAoZXIpIHtcbiAgICAgICAgaWYgKGVyLmNvZGUgPT09IFwiRU5PRU5UXCIpXG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwpXG4gICAgICAgIGlmIChlci5jb2RlID09PSBcIkVQRVJNXCIpXG4gICAgICAgICAgcmV0dXJuIChpc1dpbmRvd3MpXG4gICAgICAgICAgICA/IGZpeFdpbkVQRVJNKHAsIG9wdGlvbnMsIGVyLCBjYilcbiAgICAgICAgICAgIDogcm1kaXIocCwgb3B0aW9ucywgZXIsIGNiKVxuICAgICAgICBpZiAoZXIuY29kZSA9PT0gXCJFSVNESVJcIilcbiAgICAgICAgICByZXR1cm4gcm1kaXIocCwgb3B0aW9ucywgZXIsIGNiKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNiKGVyKVxuICAgIH0pXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGZpeFdpbkVQRVJNIChwLCBvcHRpb25zLCBlciwgY2IpIHtcbiAgYXNzZXJ0KHApXG4gIGFzc2VydChvcHRpb25zKVxuICBhc3NlcnQodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICBpZiAoZXIpXG4gICAgYXNzZXJ0KGVyIGluc3RhbmNlb2YgRXJyb3IpXG5cbiAgb3B0aW9ucy5jaG1vZChwLCA2NjYsIGZ1bmN0aW9uIChlcjIpIHtcbiAgICBpZiAoZXIyKVxuICAgICAgY2IoZXIyLmNvZGUgPT09IFwiRU5PRU5UXCIgPyBudWxsIDogZXIpXG4gICAgZWxzZVxuICAgICAgb3B0aW9ucy5zdGF0KHAsIGZ1bmN0aW9uKGVyMywgc3RhdHMpIHtcbiAgICAgICAgaWYgKGVyMylcbiAgICAgICAgICBjYihlcjMuY29kZSA9PT0gXCJFTk9FTlRcIiA/IG51bGwgOiBlcilcbiAgICAgICAgZWxzZSBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICBybWRpcihwLCBvcHRpb25zLCBlciwgY2IpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBvcHRpb25zLnVubGluayhwLCBjYilcbiAgICAgIH0pXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGZpeFdpbkVQRVJNU3luYyAocCwgb3B0aW9ucywgZXIpIHtcbiAgYXNzZXJ0KHApXG4gIGFzc2VydChvcHRpb25zKVxuICBpZiAoZXIpXG4gICAgYXNzZXJ0KGVyIGluc3RhbmNlb2YgRXJyb3IpXG5cbiAgdHJ5IHtcbiAgICBvcHRpb25zLmNobW9kU3luYyhwLCA2NjYpXG4gIH0gY2F0Y2ggKGVyMikge1xuICAgIGlmIChlcjIuY29kZSA9PT0gXCJFTk9FTlRcIilcbiAgICAgIHJldHVyblxuICAgIGVsc2VcbiAgICAgIHRocm93IGVyXG4gIH1cblxuICB0cnkge1xuICAgIHZhciBzdGF0cyA9IG9wdGlvbnMuc3RhdFN5bmMocClcbiAgfSBjYXRjaCAoZXIzKSB7XG4gICAgaWYgKGVyMy5jb2RlID09PSBcIkVOT0VOVFwiKVxuICAgICAgcmV0dXJuXG4gICAgZWxzZVxuICAgICAgdGhyb3cgZXJcbiAgfVxuXG4gIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKVxuICAgIHJtZGlyU3luYyhwLCBvcHRpb25zLCBlcilcbiAgZWxzZVxuICAgIG9wdGlvbnMudW5saW5rU3luYyhwKVxufVxuXG5mdW5jdGlvbiBybWRpciAocCwgb3B0aW9ucywgb3JpZ2luYWxFciwgY2IpIHtcbiAgYXNzZXJ0KHApXG4gIGFzc2VydChvcHRpb25zKVxuICBpZiAob3JpZ2luYWxFcilcbiAgICBhc3NlcnQob3JpZ2luYWxFciBpbnN0YW5jZW9mIEVycm9yKVxuICBhc3NlcnQodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuXG4gIC8vIHRyeSB0byBybWRpciBmaXJzdCwgYW5kIG9ubHkgcmVhZGRpciBvbiBFTk9URU1QVFkgb3IgRUVYSVNUIChTdW5PUylcbiAgLy8gaWYgd2UgZ3Vlc3NlZCB3cm9uZywgYW5kIGl0J3Mgbm90IGEgZGlyZWN0b3J5LCB0aGVuXG4gIC8vIHJhaXNlIHRoZSBvcmlnaW5hbCBlcnJvci5cbiAgb3B0aW9ucy5ybWRpcihwLCBmdW5jdGlvbiAoZXIpIHtcbiAgICBpZiAoZXIgJiYgKGVyLmNvZGUgPT09IFwiRU5PVEVNUFRZXCIgfHwgZXIuY29kZSA9PT0gXCJFRVhJU1RcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIpKVxuICAgICAgcm1raWRzKHAsIG9wdGlvbnMsIGNiKVxuICAgIGVsc2UgaWYgKGVyICYmIGVyLmNvZGUgPT09IFwiRU5PVERJUlwiKVxuICAgICAgY2Iob3JpZ2luYWxFcilcbiAgICBlbHNlXG4gICAgICBjYihlcilcbiAgfSlcbn1cblxuZnVuY3Rpb24gcm1raWRzKHAsIG9wdGlvbnMsIGNiKSB7XG4gIGFzc2VydChwKVxuICBhc3NlcnQob3B0aW9ucylcbiAgYXNzZXJ0KHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcblxuICBvcHRpb25zLnJlYWRkaXIocCwgZnVuY3Rpb24gKGVyLCBmaWxlcykge1xuICAgIGlmIChlcilcbiAgICAgIHJldHVybiBjYihlcilcbiAgICB2YXIgbiA9IGZpbGVzLmxlbmd0aFxuICAgIGlmIChuID09PSAwKVxuICAgICAgcmV0dXJuIG9wdGlvbnMucm1kaXIocCwgY2IpXG4gICAgdmFyIGVyclN0YXRlXG4gICAgZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgcmltcmFmKHBhdGguam9pbihwLCBmKSwgb3B0aW9ucywgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgIGlmIChlcnJTdGF0ZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgaWYgKGVyKVxuICAgICAgICAgIHJldHVybiBjYihlcnJTdGF0ZSA9IGVyKVxuICAgICAgICBpZiAoLS1uID09PSAwKVxuICAgICAgICAgIG9wdGlvbnMucm1kaXIocCwgY2IpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIHRoaXMgbG9va3Mgc2ltcGxlciwgYW5kIGlzIHN0cmljdGx5ICpmYXN0ZXIqLCBidXQgd2lsbFxuLy8gdGllIHVwIHRoZSBKYXZhU2NyaXB0IHRocmVhZCBhbmQgZmFpbCBvbiBleGNlc3NpdmVseVxuLy8gZGVlcCBkaXJlY3RvcnkgdHJlZXMuXG5mdW5jdGlvbiByaW1yYWZTeW5jIChwLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIGRlZmF1bHRzKG9wdGlvbnMpXG5cbiAgYXNzZXJ0KHAsICdyaW1yYWY6IG1pc3NpbmcgcGF0aCcpXG4gIGFzc2VydC5lcXVhbCh0eXBlb2YgcCwgJ3N0cmluZycsICdyaW1yYWY6IHBhdGggc2hvdWxkIGJlIGEgc3RyaW5nJylcbiAgYXNzZXJ0KG9wdGlvbnMsICdyaW1yYWY6IG1pc3Npbmcgb3B0aW9ucycpXG4gIGFzc2VydC5lcXVhbCh0eXBlb2Ygb3B0aW9ucywgJ29iamVjdCcsICdyaW1yYWY6IG9wdGlvbnMgc2hvdWxkIGJlIG9iamVjdCcpXG5cbiAgdmFyIHJlc3VsdHNcblxuICBpZiAob3B0aW9ucy5kaXNhYmxlR2xvYiB8fCAhZ2xvYi5oYXNNYWdpYyhwKSkge1xuICAgIHJlc3VsdHMgPSBbcF1cbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgZnMubHN0YXRTeW5jKHApXG4gICAgICByZXN1bHRzID0gW3BdXG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIHJlc3VsdHMgPSBnbG9iLnN5bmMocCwgZ2xvYk9wdHMpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFyZXN1bHRzLmxlbmd0aClcbiAgICByZXR1cm5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IHJlc3VsdHNbaV1cblxuICAgIHRyeSB7XG4gICAgICB2YXIgc3QgPSBvcHRpb25zLmxzdGF0U3luYyhwKVxuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICBpZiAoZXIuY29kZSA9PT0gXCJFTk9FTlRcIilcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIHN1bm9zIGxldHMgdGhlIHJvb3QgdXNlciB1bmxpbmsgZGlyZWN0b3JpZXMsIHdoaWNoIGlzLi4uIHdlaXJkLlxuICAgICAgaWYgKHN0ICYmIHN0LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIHJtZGlyU3luYyhwLCBvcHRpb25zLCBudWxsKVxuICAgICAgZWxzZVxuICAgICAgICBvcHRpb25zLnVubGlua1N5bmMocClcbiAgICB9IGNhdGNoIChlcikge1xuICAgICAgaWYgKGVyLmNvZGUgPT09IFwiRU5PRU5UXCIpXG4gICAgICAgIHJldHVyblxuICAgICAgaWYgKGVyLmNvZGUgPT09IFwiRVBFUk1cIilcbiAgICAgICAgcmV0dXJuIGlzV2luZG93cyA/IGZpeFdpbkVQRVJNU3luYyhwLCBvcHRpb25zLCBlcikgOiBybWRpclN5bmMocCwgb3B0aW9ucywgZXIpXG4gICAgICBpZiAoZXIuY29kZSAhPT0gXCJFSVNESVJcIilcbiAgICAgICAgdGhyb3cgZXJcbiAgICAgIHJtZGlyU3luYyhwLCBvcHRpb25zLCBlcilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcm1kaXJTeW5jIChwLCBvcHRpb25zLCBvcmlnaW5hbEVyKSB7XG4gIGFzc2VydChwKVxuICBhc3NlcnQob3B0aW9ucylcbiAgaWYgKG9yaWdpbmFsRXIpXG4gICAgYXNzZXJ0KG9yaWdpbmFsRXIgaW5zdGFuY2VvZiBFcnJvcilcblxuICB0cnkge1xuICAgIG9wdGlvbnMucm1kaXJTeW5jKHApXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgaWYgKGVyLmNvZGUgPT09IFwiRU5PRU5UXCIpXG4gICAgICByZXR1cm5cbiAgICBpZiAoZXIuY29kZSA9PT0gXCJFTk9URElSXCIpXG4gICAgICB0aHJvdyBvcmlnaW5hbEVyXG4gICAgaWYgKGVyLmNvZGUgPT09IFwiRU5PVEVNUFRZXCIgfHwgZXIuY29kZSA9PT0gXCJFRVhJU1RcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIpXG4gICAgICBybWtpZHNTeW5jKHAsIG9wdGlvbnMpXG4gIH1cbn1cblxuZnVuY3Rpb24gcm1raWRzU3luYyAocCwgb3B0aW9ucykge1xuICBhc3NlcnQocClcbiAgYXNzZXJ0KG9wdGlvbnMpXG4gIG9wdGlvbnMucmVhZGRpclN5bmMocCkuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgIHJpbXJhZlN5bmMocGF0aC5qb2luKHAsIGYpLCBvcHRpb25zKVxuICB9KVxuICBvcHRpb25zLnJtZGlyU3luYyhwLCBvcHRpb25zKVxufVxuIiwiLypcbkNyeXB0b0pTIHYzLjEuMlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4vKiogQHByZXNlcnZlXG4oYykgMjAxMiBieSBDw6lkcmljIE1lc25pbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8vIGNvbnN0YW50cyB0YWJsZVxudmFyIHpsID0gW1xuICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LFxuICA3LCA0LCAxMywgMSwgMTAsIDYsIDE1LCAzLCAxMiwgMCwgOSwgNSwgMiwgMTQsIDExLCA4LFxuICAzLCAxMCwgMTQsIDQsIDksIDE1LCA4LCAxLCAyLCA3LCAwLCA2LCAxMywgMTEsIDUsIDEyLFxuICAxLCA5LCAxMSwgMTAsIDAsIDgsIDEyLCA0LCAxMywgMywgNywgMTUsIDE0LCA1LCA2LCAyLFxuICA0LCAwLCA1LCA5LCA3LCAxMiwgMiwgMTAsIDE0LCAxLCAzLCA4LCAxMSwgNiwgMTUsIDEzXG5dXG5cbnZhciB6ciA9IFtcbiAgNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMixcbiAgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMixcbiAgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMyxcbiAgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCxcbiAgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMVxuXVxuXG52YXIgc2wgPSBbXG4gIDExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCxcbiAgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLFxuICAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsXG4gIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMixcbiAgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XG5dXG5cbnZhciBzciA9IFtcbiAgOCwgOSwgOSwgMTEsIDEzLCAxNSwgMTUsIDUsIDcsIDcsIDgsIDExLCAxNCwgMTQsIDEyLCA2LFxuICA5LCAxMywgMTUsIDcsIDEyLCA4LCA5LCAxMSwgNywgNywgMTIsIDcsIDYsIDE1LCAxMywgMTEsXG4gIDksIDcsIDE1LCAxMSwgOCwgNiwgNiwgMTQsIDEyLCAxMywgNSwgMTQsIDEzLCAxMywgNywgNSxcbiAgMTUsIDUsIDgsIDExLCAxNCwgMTQsIDYsIDE0LCA2LCA5LCAxMiwgOSwgMTIsIDUsIDE1LCA4LFxuICA4LCA1LCAxMiwgOSwgMTIsIDUsIDE0LCA2LCA4LCAxMywgNiwgNSwgMTUsIDEzLCAxMSwgMTFcbl1cblxudmFyIGhsID0gWzB4MDAwMDAwMDAsIDB4NUE4Mjc5OTksIDB4NkVEOUVCQTEsIDB4OEYxQkJDREMsIDB4QTk1M0ZENEVdXG52YXIgaHIgPSBbMHg1MEEyOEJFNiwgMHg1QzRERDEyNCwgMHg2RDcwM0VGMywgMHg3QTZENzZFOSwgMHgwMDAwMDAwMF1cblxuZnVuY3Rpb24gYnl0ZXNUb1dvcmRzIChieXRlcykge1xuICB2YXIgd29yZHMgPSBbXVxuICBmb3IgKHZhciBpID0gMCwgYiA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKywgYiArPSA4KSB7XG4gICAgd29yZHNbYiA+Pj4gNV0gfD0gYnl0ZXNbaV0gPDwgKDI0IC0gYiAlIDMyKVxuICB9XG4gIHJldHVybiB3b3Jkc1xufVxuXG5mdW5jdGlvbiB3b3Jkc1RvQnl0ZXMgKHdvcmRzKSB7XG4gIHZhciBieXRlcyA9IFtdXG4gIGZvciAodmFyIGIgPSAwOyBiIDwgd29yZHMubGVuZ3RoICogMzI7IGIgKz0gOCkge1xuICAgIGJ5dGVzLnB1c2goKHdvcmRzW2IgPj4+IDVdID4+PiAoMjQgLSBiICUgMzIpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NCbG9jayAoSCwgTSwgb2Zmc2V0KSB7XG4gIC8vIHN3YXAgZW5kaWFuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIHZhciBvZmZzZXRfaSA9IG9mZnNldCArIGlcbiAgICB2YXIgTV9vZmZzZXRfaSA9IE1bb2Zmc2V0X2ldXG5cbiAgICAvLyBTd2FwXG4gICAgTVtvZmZzZXRfaV0gPSAoXG4gICAgICAoKChNX29mZnNldF9pIDw8IDgpIHwgKE1fb2Zmc2V0X2kgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG4gICAgICAoKChNX29mZnNldF9pIDw8IDI0KSB8IChNX29mZnNldF9pID4+PiA4KSkgJiAweGZmMDBmZjAwKVxuICAgIClcbiAgfVxuXG4gIC8vIFdvcmtpbmcgdmFyaWFibGVzXG4gIHZhciBhbCwgYmwsIGNsLCBkbCwgZWxcbiAgdmFyIGFyLCBiciwgY3IsIGRyLCBlclxuXG4gIGFyID0gYWwgPSBIWzBdXG4gIGJyID0gYmwgPSBIWzFdXG4gIGNyID0gY2wgPSBIWzJdXG4gIGRyID0gZGwgPSBIWzNdXG4gIGVyID0gZWwgPSBIWzRdXG5cbiAgLy8gY29tcHV0YXRpb25cbiAgdmFyIHRcbiAgZm9yIChpID0gMDsgaSA8IDgwOyBpICs9IDEpIHtcbiAgICB0ID0gKGFsICsgTVtvZmZzZXQgKyB6bFtpXV0pIHwgMFxuICAgIGlmIChpIDwgMTYpIHtcbiAgICAgIHQgKz0gZjEoYmwsIGNsLCBkbCkgKyBobFswXVxuICAgIH0gZWxzZSBpZiAoaSA8IDMyKSB7XG4gICAgICB0ICs9IGYyKGJsLCBjbCwgZGwpICsgaGxbMV1cbiAgICB9IGVsc2UgaWYgKGkgPCA0OCkge1xuICAgICAgdCArPSBmMyhibCwgY2wsIGRsKSArIGhsWzJdXG4gICAgfSBlbHNlIGlmIChpIDwgNjQpIHtcbiAgICAgIHQgKz0gZjQoYmwsIGNsLCBkbCkgKyBobFszXVxuICAgIH0gZWxzZSB7Ly8gaWYgKGk8ODApIHtcbiAgICAgIHQgKz0gZjUoYmwsIGNsLCBkbCkgKyBobFs0XVxuICAgIH1cbiAgICB0ID0gdCB8IDBcbiAgICB0ID0gcm90bCh0LCBzbFtpXSlcbiAgICB0ID0gKHQgKyBlbCkgfCAwXG4gICAgYWwgPSBlbFxuICAgIGVsID0gZGxcbiAgICBkbCA9IHJvdGwoY2wsIDEwKVxuICAgIGNsID0gYmxcbiAgICBibCA9IHRcblxuICAgIHQgPSAoYXIgKyBNW29mZnNldCArIHpyW2ldXSkgfCAwXG4gICAgaWYgKGkgPCAxNikge1xuICAgICAgdCArPSBmNShiciwgY3IsIGRyKSArIGhyWzBdXG4gICAgfSBlbHNlIGlmIChpIDwgMzIpIHtcbiAgICAgIHQgKz0gZjQoYnIsIGNyLCBkcikgKyBoclsxXVxuICAgIH0gZWxzZSBpZiAoaSA8IDQ4KSB7XG4gICAgICB0ICs9IGYzKGJyLCBjciwgZHIpICsgaHJbMl1cbiAgICB9IGVsc2UgaWYgKGkgPCA2NCkge1xuICAgICAgdCArPSBmMihiciwgY3IsIGRyKSArIGhyWzNdXG4gICAgfSBlbHNlIHsvLyBpZiAoaTw4MCkge1xuICAgICAgdCArPSBmMShiciwgY3IsIGRyKSArIGhyWzRdXG4gICAgfVxuXG4gICAgdCA9IHQgfCAwXG4gICAgdCA9IHJvdGwodCwgc3JbaV0pXG4gICAgdCA9ICh0ICsgZXIpIHwgMFxuICAgIGFyID0gZXJcbiAgICBlciA9IGRyXG4gICAgZHIgPSByb3RsKGNyLCAxMClcbiAgICBjciA9IGJyXG4gICAgYnIgPSB0XG4gIH1cblxuICAvLyBpbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZVxuICB0ID0gKEhbMV0gKyBjbCArIGRyKSB8IDBcbiAgSFsxXSA9IChIWzJdICsgZGwgKyBlcikgfCAwXG4gIEhbMl0gPSAoSFszXSArIGVsICsgYXIpIHwgMFxuICBIWzNdID0gKEhbNF0gKyBhbCArIGJyKSB8IDBcbiAgSFs0XSA9IChIWzBdICsgYmwgKyBjcikgfCAwXG4gIEhbMF0gPSB0XG59XG5cbmZ1bmN0aW9uIGYxICh4LCB5LCB6KSB7XG4gIHJldHVybiAoKHgpIF4gKHkpIF4gKHopKVxufVxuXG5mdW5jdGlvbiBmMiAoeCwgeSwgeikge1xuICByZXR1cm4gKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKVxufVxuXG5mdW5jdGlvbiBmMyAoeCwgeSwgeikge1xuICByZXR1cm4gKCgoeCkgfCAofih5KSkpIF4gKHopKVxufVxuXG5mdW5jdGlvbiBmNCAoeCwgeSwgeikge1xuICByZXR1cm4gKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+KHopKSkpXG59XG5cbmZ1bmN0aW9uIGY1ICh4LCB5LCB6KSB7XG4gIHJldHVybiAoKHgpIF4gKCh5KSB8ICh+KHopKSkpXG59XG5cbmZ1bmN0aW9uIHJvdGwgKHgsIG4pIHtcbiAgcmV0dXJuICh4IDw8IG4pIHwgKHggPj4+ICgzMiAtIG4pKVxufVxuXG5mdW5jdGlvbiByaXBlbWQxNjAgKG1lc3NhZ2UpIHtcbiAgdmFyIEggPSBbMHg2NzQ1MjMwMSwgMHhFRkNEQUI4OSwgMHg5OEJBRENGRSwgMHgxMDMyNTQ3NiwgMHhDM0QyRTFGMF1cblxuICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgbWVzc2FnZSA9IG5ldyBCdWZmZXIobWVzc2FnZSwgJ3V0ZjgnKVxuICB9XG5cbiAgdmFyIG0gPSBieXRlc1RvV29yZHMobWVzc2FnZSlcblxuICB2YXIgbkJpdHNMZWZ0ID0gbWVzc2FnZS5sZW5ndGggKiA4XG4gIHZhciBuQml0c1RvdGFsID0gbWVzc2FnZS5sZW5ndGggKiA4XG5cbiAgLy8gQWRkIHBhZGRpbmdcbiAgbVtuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpXG4gIG1bKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IChcbiAgICAoKChuQml0c1RvdGFsIDw8IDgpIHwgKG5CaXRzVG90YWwgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG4gICAgKCgobkJpdHNUb3RhbCA8PCAyNCkgfCAobkJpdHNUb3RhbCA+Pj4gOCkpICYgMHhmZjAwZmYwMClcbiAgKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICBwcm9jZXNzQmxvY2soSCwgbSwgaSlcbiAgfVxuXG4gIC8vIHN3YXAgZW5kaWFuXG4gIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAvLyBzaG9ydGN1dFxuICAgIHZhciBIX2kgPSBIW2ldXG5cbiAgICAvLyBTd2FwXG4gICAgSFtpXSA9ICgoKEhfaSA8PCA4KSB8IChIX2kgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG4gICAgICAoKChIX2kgPDwgMjQpIHwgKEhfaSA+Pj4gOCkpICYgMHhmZjAwZmYwMClcbiAgfVxuXG4gIHZhciBkaWdlc3RieXRlcyA9IHdvcmRzVG9CeXRlcyhIKVxuICByZXR1cm4gbmV3IEJ1ZmZlcihkaWdlc3RieXRlcylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByaXBlbWQxNjBcbiIsInZhciBTZWNyZXRTdGFjayA9IHJlcXVpcmUoJ3NlY3JldC1zdGFjaycpXG52YXIgY3JlYXRlICAgICA9IHJlcXVpcmUoJ3NlY3VyZS1zY3V0dGxlYnV0dC9jcmVhdGUnKVxudmFyIHNzYktleXMgICAgPSByZXF1aXJlKCdzc2Ita2V5cycpXG52YXIgcGF0aCAgICAgICA9IHJlcXVpcmUoJ3BhdGgnKVxudmFyIG9zZW52ICAgICAgPSByZXF1aXJlKCdvc2VudicpXG52YXIgbWtkaXJwICAgICA9IHJlcXVpcmUoJ21rZGlycCcpXG52YXIgcmltcmFmICAgICA9IHJlcXVpcmUoJ3JpbXJhZicpXG52YXIgbWRtICAgICAgICA9IHJlcXVpcmUoJ21kbWFuaWZlc3QnKVxudmFyIGNtZEFsaWFzZXMgPSByZXF1aXJlKCcuL2xpYi9jbGktY21kLWFsaWFzZXMnKVxudmFyIHZhbGlkICAgICAgPSByZXF1aXJlKCcuL2xpYi92YWxpZGF0b3JzJylcbnZhciBhcGlkb2NzICAgID0gcmVxdWlyZSgnLi9saWIvYXBpZG9jcy5qcycpXG5cbmZ1bmN0aW9uIGlzU3RyaW5nKHMpIHsgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2YgcyB9XG5cbi8vIGNyZWF0ZSBTZWNyZXRTdGFjayBkZWZpbml0aW9uXG52YXIgbWFuaWZlc3QgPSBtZG0ubWFuaWZlc3QoYXBpZG9jcy5fKVxubWFuaWZlc3QudXNhZ2UgPSAnc3luYydcbnZhciBTU0IgPSB7XG4gIG1hbmlmZXN0OiBtYW5pZmVzdCxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBtYXN0ZXI6IHthbGxvdzogbnVsbCwgZGVueTogbnVsbH0sXG4gICAgYW5vbnltb3VzOiB7YWxsb3c6IFsnY3JlYXRlSGlzdG9yeVN0cmVhbSddLCBkZW55OiBudWxsfVxuICB9LFxuICBpbml0OiBmdW5jdGlvbiAoYXBpLCBvcHRzKSB7XG5cbiAgICAvLyAudGVtcDogdXNlIGEgL3RtcCBkYXRhIGRpcmVjdG9yeVxuICAgIC8vICh1c2VmdWwgZm9yIHRlc3RpbmcpXG4gICAgaWYob3B0cy50ZW1wKSB7XG4gICAgICB2YXIgbmFtZSA9IGlzU3RyaW5nKG9wdHMudGVtcCkgPyBvcHRzLnRlbXAgOiAnJytEYXRlLm5vdygpXG4gICAgICBvcHRzLnBhdGggPSBwYXRoLmpvaW4ob3NlbnYudG1wZGlyKCksIG5hbWUpXG4gICAgICByaW1yYWYuc3luYyhvcHRzLnBhdGgpXG4gICAgfVxuXG4gICAgLy8gbG9hZC9jcmVhdGUgc2VjdXJlIHNjdXR0bGVidXR0IGRhdGEgZGlyZWN0b3J5XG4gICAgdmFyIGRiUGF0aCA9IHBhdGguam9pbihvcHRzLnBhdGgsICdkYicpXG4gICAgbWtkaXJwLnN5bmMoZGJQYXRoKVxuXG4gICAgaWYoIW9wdHMua2V5cylcbiAgICAgIG9wdHMua2V5cyA9IHNzYktleXMuZ2VuZXJhdGUoJ2VkMjU1MTknLCBvcHRzLnNlZWQgJiYgbmV3IEJ1ZmZlcihvcHRzLnNlZWQsICdiYXNlNjQnKSlcblxuICAgIGlmKCFvcHRzLnBhdGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdHMucGF0aCAqbXVzdCogYmUgcHJvdmlkZWQsIG9yIHVzZSBvcHRzLnRlbXA9bmFtZSB0byBjcmVhdGUgYSB0ZXN0IGluc3RhbmNlJylcblxuICAgIC8vIG1haW4gaW50ZXJmYWNlXG4gICAgdmFyIHNzYiA9IGNyZWF0ZShwYXRoLmpvaW4ob3B0cy5wYXRoLCAnZGInKSwgbnVsbCwgb3B0cy5rZXlzKVxuICAgIHZhciBmZWVkID0gc3NiLmNyZWF0ZUZlZWQob3B0cy5rZXlzKVxuICAgIHZhciBfY2xvc2UgPSBhcGkuY2xvc2VcbiAgICB2YXIgY2xvc2UgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIC8vIG92ZXJyaWRlIHRvIGNsb3NlIHRoZSBTU0IgZGF0YWJhc2VcbiAgICAgIHNzYi5jbG9zZShmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIHRocm93IGVyclxuICAgICAgICBfY2xvc2UoY2IpXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQgICAgICAgICAgICAgICAgICAgICAgIDogZmVlZC5pZCxcbiAgICAgIGtleXMgICAgICAgICAgICAgICAgICAgICA6IG9wdHMua2V5cyxcblxuICAgICAgdXNhZ2UgICAgICAgICAgICAgICAgICAgIDogdmFsaWQuc3luYyh1c2FnZSwgJ3N0cmluZz98Ym9vbGVhbj8nKSxcbiAgICAgIGNsb3NlICAgICAgICAgICAgICAgICAgICA6IHZhbGlkLmFzeW5jKGNsb3NlKSxcblxuICAgICAgcHVibGlzaCAgICAgICAgICAgICAgICAgIDogdmFsaWQuYXN5bmMoZmVlZC5hZGQsICdzdHJpbmd8bXNnQ29udGVudCcpLFxuICAgICAgYWRkICAgICAgICAgICAgICAgICAgICAgIDogdmFsaWQuYXN5bmMoc3NiLmFkZCwgJ21zZycpLFxuICAgICAgZ2V0ICAgICAgICAgICAgICAgICAgICAgIDogdmFsaWQuYXN5bmMoc3NiLmdldCwgJ21zZ0lkJyksXG5cbiAgICAgIHByZSAgICAgICAgICAgICAgICAgICAgICA6IHNzYi5wcmUsXG4gICAgICBwb3N0ICAgICAgICAgICAgICAgICAgICAgOiBzc2IucG9zdCxcblxuICAgICAgZ2V0UHVibGljS2V5ICAgICAgICAgICAgIDogc3NiLmdldFB1YmxpY0tleSxcbiAgICAgIGxhdGVzdCAgICAgICAgICAgICAgICAgICA6IHNzYi5sYXRlc3QsXG4gICAgICBnZXRMYXRlc3QgICAgICAgICAgICAgICAgOiB2YWxpZC5hc3luYyhzc2IuZ2V0TGF0ZXN0LCAnZmVlZElkJyksXG4gICAgICBsYXRlc3RTZXF1ZW5jZSAgICAgICAgICAgOiB2YWxpZC5hc3luYyhzc2IubGF0ZXN0U2VxdWVuY2UsICdmZWVkSWQnKSxcbiAgICAgIGNyZWF0ZUZlZWQgICAgICAgICAgICAgICA6IHNzYi5jcmVhdGVGZWVkLFxuICAgICAgd2hvYW1pICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4geyBpZDogZmVlZC5pZCB9IH0sXG4gICAgICByZWxhdGVkTWVzc2FnZXMgICAgICAgICAgOiB2YWxpZC5hc3luYyhzc2IucmVsYXRlZE1lc3NhZ2VzLCAncmVsYXRlZE1lc3NhZ2VzT3B0cycpLFxuICAgICAgcXVlcnkgICAgICAgICAgICAgICAgICAgIDogc3NiLnF1ZXJ5LFxuICAgICAgY3JlYXRlRmVlZFN0cmVhbSAgICAgICAgIDogdmFsaWQuc291cmNlKHNzYi5jcmVhdGVGZWVkU3RyZWFtLCAncmVhZFN0cmVhbU9wdHM/JyksXG4gICAgICBjcmVhdGVIaXN0b3J5U3RyZWFtICAgICAgOiB2YWxpZC5zb3VyY2Uoc3NiLmNyZWF0ZUhpc3RvcnlTdHJlYW0sIFsnY3JlYXRlSGlzdG9yeVN0cmVhbU9wdHMnXSwgWydmZWVkSWQnLCAnbnVtYmVyPycsICdib29sZWFuPyddKSxcbiAgICAgIGNyZWF0ZUxvZ1N0cmVhbSAgICAgICAgICA6IHZhbGlkLnNvdXJjZShzc2IuY3JlYXRlTG9nU3RyZWFtLCAncmVhZFN0cmVhbU9wdHM/JyksXG4gICAgICBjcmVhdGVVc2VyU3RyZWFtICAgICAgICAgOiB2YWxpZC5zb3VyY2Uoc3NiLmNyZWF0ZVVzZXJTdHJlYW0sICdjcmVhdGVVc2VyU3RyZWFtT3B0cycpLFxuICAgICAgbGlua3MgICAgICAgICAgICAgICAgICAgIDogdmFsaWQuc291cmNlKHNzYi5saW5rcywgJ2xpbmtzT3B0cycpLFxuICAgICAgc3VibGV2ZWwgICAgICAgICAgICAgICAgIDogc3NiLnN1YmxldmVsLFxuICAgICAgbWVzc2FnZXNCeVR5cGUgICAgICAgICAgIDogdmFsaWQuc291cmNlKHNzYi5tZXNzYWdlc0J5VHlwZSwgJ3N0cmluZ3xtZXNzYWdlc0J5VHlwZU9wdHMnKSxcbiAgICAgIGNyZWF0ZVdyaXRlU3RyZWFtICAgICAgICA6IHNzYi5jcmVhdGVXcml0ZVN0cmVhbSxcbi8vICAgICAgY3JlYXRlTGF0ZXN0TG9va3VwU3RyZWFtIDogc3NiLmNyZWF0ZUxhdGVzdExvb2t1cFN0cmVhbSxcbiAgICB9XG4gIH1cbn1cblxuLy8gbGl2ZSBoZWxwIFJQQyBtZXRob2RcbmZ1bmN0aW9uIHVzYWdlIChjbWQpIHtcbiAgdmFyIHBhdGggPSAoY21kfHwnJykuc3BsaXQoJy4nKVxuICBpZiAoKHBhdGhbMF0gJiYgYXBpZG9jc1twYXRoWzBdXSkgfHwgKGNtZCAmJiBhcGlkb2NzW2NtZF0pKSB7XG4gICAgLy8gcmV0dXJuIHVzYWdlIGZvciB0aGUgcGx1Z2luXG4gICAgY21kID0gcGF0aC5zbGljZSgxKS5qb2luKCcuJylcbiAgICByZXR1cm4gbWRtLnVzYWdlKGFwaWRvY3NbcGF0aFswXV0sIGNtZCwgeyBwcmVmaXg6IHBhdGhbMF0gfSlcbiAgfVxuICBpZiAoIWNtZCkge1xuICAgIC8vIHJldHVybiB1c2FnZSBmb3IgYWxsIGRvY3NcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXBpZG9jcykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBpZiAobmFtZSA9PSAnXycpXG4gICAgICAgIHJldHVybiBtZG0udXNhZ2UoYXBpZG9jc1tuYW1lXSwgbnVsbCwgeyBuYW1lV2lkdGg6IDIwIH0pXG5cbiAgICAgIHZhciB0ZXh0ID0gbWRtLnVzYWdlKGFwaWRvY3NbbmFtZV0sIG51bGwsIHsgcHJlZml4OiBuYW1lLCBuYW1lV2lkdGg6IDIwIH0pXG4gICAgICByZXR1cm4gdGV4dC5zbGljZSh0ZXh0LmluZGV4T2YoJ0NvbW1hbmRzOicpICsgMTApIC8vIHNraXAgcGFzdCB0aGUgdG9wbGV2ZWwgc3VtbWFyeSwgc3RyYWlnaHQgdG8gdGhlIGNtZCBsaXN0XG4gICAgfSkuam9pbignXFxuXFxuJylcbiAgfVxuICAvLyB0b3BsZXZlbCBjbWQgdXNhZ2VcbiAgY21kID0gY21kQWxpYXNlc1tjbWRdIHx8IGNtZFxuICByZXR1cm4gbWRtLnVzYWdlKGFwaWRvY3MuXywgY21kKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlY3JldFN0YWNrKHtcbiAgYXBwS2V5OiByZXF1aXJlKCcuL2xpYi9zc2ItY2FwJylcbn0pXG4udXNlKFNTQilcblxuIiwidmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJylcbm1vZHVsZS5leHBvcnRzID0ge1xuICBfOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2FwaS5tZCcpLCAndXRmLTgnKSxcbiAgYmxvYnM6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vcGx1Z2lucy9ibG9icy5tZCcpLCAndXRmLTgnKSxcbiAgYmxvY2s6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vcGx1Z2lucy9ibG9jay5tZCcpLCAndXRmLTgnKSxcbiAgZnJpZW5kczogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9wbHVnaW5zL2ZyaWVuZHMubWQnKSwgJ3V0Zi04JyksXG4gIGdvc3NpcDogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9wbHVnaW5zL2dvc3NpcC5tZCcpLCAndXRmLTgnKSxcbiAgaW52aXRlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3BsdWdpbnMvaW52aXRlLm1kJyksICd1dGYtOCcpLFxuICBwbHVnaW5zOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3BsdWdpbnMvcGx1Z2lucy5tZCcpLCAndXRmLTgnKSxcbiAgJ3ByaXZhdGUnOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3BsdWdpbnMvcHJpdmF0ZS5tZCcpLCAndXRmLTgnKSxcbiAgcmVwbGljYXRlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3BsdWdpbnMvcmVwbGljYXRlLm1kJyksICd1dGYtOCcpXG59IiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGZlZWQ6ICdjcmVhdGVGZWVkU3RyZWFtJyxcbiAgaGlzdG9yeTogJ2NyZWF0ZUhpc3RvcnlTdHJlYW0nLFxuICBoaXN0OiAnY3JlYXRlSGlzdG9yeVN0cmVhbScsXG4gIHB1YmxpYzogJ2dldFB1YmxpY0tleScsXG4gIHB1YjogJ2dldFB1YmxpY0tleScsXG4gIGxvZzogJ2NyZWF0ZUxvZ1N0cmVhbScsXG4gIGxvZ3Q6ICdtZXNzYWdlc0J5VHlwZScsXG4gIGNvbmY6ICdjb25maWcnXG59IiwiLy90aGlzIGlzIHRoZSBrZXkgZm9yIGFjY2Vzc2luZyB0aGUgc3NiIHByb3RvY29sLlxuLy90aGlzIHdpbGwgYmUgdXBkYXRlZCB3aGVuZXZlciBicmVha2luZyBjaGFuZ2VzIGFyZSBtYWRlLlxuLy8oc2VlIHNlY3JldC1oYW5kc2hha2UgcGFwZXIgZm9yIGEgZnVsbCBleHBsYWluYXRpb24pXG5tb2R1bGUuZXhwb3J0cyA9XG4gIG5ldyBCdWZmZXIoJzFLSExpS1p2QXZqYlkxemlaRUhNWGF3YkNFSU02cXdqQ0RtM1ZZUmFuL3M9JywgJ2Jhc2U2NCcpXG5cbi8vdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoaXMgdmFsdWUuXG4vL0kgZ2VuZXJhdGVkIGl0IGluIHRoZSBub2RlIHJlcGwgd2l0aDpcbi8vXG4vLyA+IGNyeXB0by5yYW5kb21CeXRlcygzMikudG9TdHJpbmcoJ2Jhc2U2NCcpXG4vL1xuLy9hbmQgY29waWVkIGl0IGhlcmUuXG5cbiIsInZhciByZWYgPSByZXF1aXJlKCdzc2ItcmVmJylcblxuZnVuY3Rpb24gaXNPYmplY3Qobykge1xuICByZXR1cm4gbyAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG9cbn1cbnZhciBERUZBVUxUX1BPUlQgPSA4MDA4XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheVxuXG52YXIgaXNJbnRlZ2VyID0gTnVtYmVyLmlzSW50ZWdlclxuXG5mdW5jdGlvbiBpc1N0cmluZyAocykge1xuICByZXR1cm4gJ3N0cmluZycgPT09IHR5cGVvZiBzXG59XG5cbnZhciBmaW5kID0gZXhwb3J0cy5maW5kID0gZnVuY3Rpb24gZmluZChhcnksIHRlc3QpIHtcbiAgZm9yKHZhciBpIGluIGFyeSlcbiAgICBpZih0ZXN0KGFyeVtpXSwgaSwgYXJ5KSkgcmV0dXJuIGFyeVtpXVxufVxuXG52YXIgY2xvbmUgPSBleHBvcnRzLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKG9iaiwgbWFwcGVyKSB7XG4gIGZ1bmN0aW9uIG1hcCh2LCBrKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHYpID8gY2xvbmUodiwgbWFwcGVyKSA6IG1hcHBlcih2LCBrKVxuICB9XG4gIGlmKGlzQXJyYXkob2JqKSlcbiAgICByZXR1cm4gb2JqLm1hcChtYXApXG4gIGVsc2UgaWYoaXNPYmplY3Qob2JqKSkge1xuICAgIHZhciBvID0ge31cbiAgICBmb3IodmFyIGsgaW4gb2JqKVxuICAgICAgb1trXSA9IG1hcChvYmpba10sIGspXG4gICAgcmV0dXJuIG9cbiAgfVxuICBlbHNlXG4gICAgcmV0dXJuIG1hcChvYmopXG59XG5cbnZhciBtZXJnZUtleXMgPSBleHBvcnRzLm1lcmdlS2V5cyA9IGZ1bmN0aW9uIChhLCBiLCBpdGVyKSB7XG4gIHZhciBvID0ge31cbiAgZm9yKHZhciBrIGluIGEpIHtcbiAgICBpZighaXNVbmRlZmluZWQoYVtrXSkpXG4gICAgICBvW2tdID0gaXRlcih2W2tdLCBiW2tdLCBrKVxuICB9XG4gIGZvcih2YXIgayBpbiBiKSB7XG4gICAgaWYoaXNVbmRlZmluZWQoYVthXSkpXG4gICAgICBvW2tdID0gaXRlcih1bmRlZmluZWQsIGJba10sIGspXG4gIH1cbiAgcmV0dXJuIG9cbn1cblxuZXhwb3J0cy5tZXJnZSA9IGZ1bmN0aW9uIChhLCBiKSB7XG5cbiAgLy9tZXJnZSBhIGFuZCBiIG9iamVjdHNcblxuICBpZihpc0FycmF5KGEpICE9IGlzQXJyYXkoYikpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgbWVyZ2UgYXJyYXkgd2l0aCBub24tYXJyYXknKVxuICBpZihpc09iamVjdChhKSAhPSBpc09iamVjdChiKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBtZXJnZSBvYmplY3Qgd2l0aCBub24tb2JqZWN0JylcblxuICBhID0gY2xvbmUoYSlcblxuICB2YXIga2V5c1xuXG4gIGlmKGlzT2JqZWN0KGIpKSB7XG4gICAgZm9yKHZhciBrIGluIGIpXG4gICAgICBhW2tdID0gYlxuICB9XG59XG5cbmV4cG9ydHMuc3RyaW5naWZ5QWRkcmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gIGlmKGlzU3RyaW5nKGUpKSByZXR1cm4gZVxuICByZXR1cm4gW2UuaG9zdCwgZS5wb3J0IHx8IERFRkFVTFRfUE9SVCwgZS5rZXldLmpvaW4oJzonKVxufVxuXG5leHBvcnRzLnBhcnNlQWRkcmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gIGlmKGlzU3RyaW5nKGUpKSB7XG4gICAgdmFyIHBhcnRzID0gZS5zcGxpdCgnOicpXG4gICAgdmFyIGlkID0gcGFydHMucG9wKCksIHBvcnQgPSBwYXJ0cy5wb3AoKSwgaG9zdCA9IHBhcnRzLmpvaW4oJzonKVxuICAgIHZhciBlID0ge1xuICAgICAgaG9zdDogaG9zdCxcbiAgICAgIHBvcnQ6ICsocG9ydCB8fCBERUZBVUxUX1BPUlQpLFxuICAgICAga2V5OiBpZFxuICAgIH1cbiAgICByZXR1cm4gZVxuICB9XG4gIHJldHVybiBlXG59XG5cbmV4cG9ydHMuaXNBZGRyZXNzID0gZnVuY3Rpb24gKGFkZHIpIHtcbiAgcmV0dXJuIChcbiAgICByZWYuaXNGZWVkSWQoYWRkci5rZXkgfHwgYWRkci5saW5rKVxuICAgICYmIGlzSW50ZWdlcihhZGRyLnBvcnQpXG4gICAgJiYgdHlwZW9mIGFkZHIuaG9zdCA9PT0gJ3N0cmluZycgJiYgISFhZGRyLmhvc3RcbiAgKVxufVxuXG5leHBvcnRzLnRvQWRkcmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gIGUgPSBleHBvcnRzLnBhcnNlQWRkcmVzcyhlKVxuICBlLnBvcnQgPSBlLnBvcnQgfHwgREVGQVVMVF9QT1JUXG4gIGUuaG9zdCA9IGUuaG9zdCB8fCAnbG9jYWxob3N0J1xuICByZXR1cm4gZVxufVxuIiwidmFyIHZhbGlkID0gcmVxdWlyZSgnbXV4cnBjLXZhbGlkYXRpb24nKVxudmFyIHplcnIgID0gcmVxdWlyZSgnemVycicpXG52YXIgcmVmICAgPSByZXF1aXJlKCdzc2ItcmVmJylcblxuLy8gZXJyb3JzXG52YXIgTWlzc2luZ0F0dHIgPSB6ZXJyKCdVc2FnZScsICdQYXJhbSAlIG11c3QgaGF2ZSBhIC4lIG9mIHR5cGUgXCIlXCInKVxudmFyIEF0dHJUeXBlID0gemVycignVXNhZ2UnLCAnLiUgb2YgcGFyYW0gJSBtdXN0IGJlIG9mIHR5cGUgXCIlXCInKVxuXG5mdW5jdGlvbiBpc0ZpbHRlciAodikge1xuICByZXR1cm4gKHYgPT0gJ0AnIHx8IHYgPT0gJyUnIHx8IHYgPT0gJyYnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkKHtcbiAgbXNnSWQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgaWYgKCFyZWYuaXNNc2codikpXG4gICAgICByZXR1cm4gJ3R5cGUnXG4gIH0sXG4gIGZlZWRJZDogZnVuY3Rpb24gKHYpIHtcbiAgICBpZiAoIXJlZi5pc0ZlZWQodikpXG4gICAgICByZXR1cm4gJ3R5cGUnXG4gIH0sXG4gIGJsb2JJZDogZnVuY3Rpb24gKHYpIHtcbiAgICBpZiAoIXJlZi5pc0Jsb2IodikpXG4gICAgICByZXR1cm4gJ3R5cGUnXG4gIH0sXG5cbiAgbXNnQ29udGVudDogZnVuY3Rpb24gKHYsIG4pIHtcbiAgICB2YXIgZXJyID0gdGhpcy5nZXQoJ29iamVjdCcpKHYsIG4pXG4gICAgaWYgKGVycikgcmV0dXJuIGVyclxuICAgIGlmICghdi50eXBlIHx8IHR5cGVvZiB2LnR5cGUgIT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gTWlzc2luZ0F0dHIobiwgJ3R5cGUnLCAnc3RyaW5nJylcbiAgfSxcblxuICBtc2c6IGZ1bmN0aW9uICh2LCBuKSB7XG4gICAgdmFyIGVyciA9IHRoaXMuZ2V0KCdvYmplY3QnKSh2LCBuKVxuICAgIGlmIChlcnIpXG4gICAgICByZXR1cm4gZXJyXG4gICAgXG4gICAgLy8gLmNvbnRlbnRcbiAgICB2YXIgZXJyID0gdGhpcy5nZXQoJ29iamVjdCcpKHYuY29udGVudCwgbilcbiAgICBpZiAoZXJyKSBcbiAgICAgIHJldHVybiBNaXNzaW5nQXR0cihuLCAnY29udGVudCcsICdvYmplY3QnKVxuXG4gICAgLy8gLmNvbnRlbnQudHlwZVxuICAgIGlmICghdi5jb250ZW50LnR5cGUgfHwgdHlwZW9mIHYuY29udGVudC50eXBlICE9ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIE1pc3NpbmdBdHRyKG4sICdjb250ZW50LnR5cGUnLCAnc3RyaW5nJylcblxuICAgIC8vIC5hdXRob3JcbiAgICBpZiAoIXJlZi5pc0ZlZWQodi5hdXRob3IpKVxuICAgICAgcmV0dXJuIE1pc3NpbmdBdHRyKG4sICdhdXRob3InLCAnZmVlZElkJylcblxuICAgIC8vIC5zZXF1ZW5jZVxuICAgIGlmICh0eXBlb2Ygdi5zZXF1ZW5jZSAhPSAnbnVtYmVyJylcbiAgICAgIHJldHVybiBNaXNzaW5nQXR0cihuLCAnc2VxdWVuY2UnLCAnbnVtYmVyJylcblxuICAgIC8vIC5wcmV2aW91c1xuICAgIGlmICh2LnNlcXVlbmNlID4gMSAmJiAhcmVmLmlzTXNnKHYucHJldmlvdXMpKVxuICAgICAgcmV0dXJuIE1pc3NpbmdBdHRyKG4sICdwcmV2aW91cycsICdtc2dJZCcpXG4gICAgZWxzZSBpZih2LnNlcXVlbmNlID09IDEgJiYgdi5wcmV2aW91cyAhPSBudWxsKVxuICAgICAgcmV0dXJuIE1pc3NpbmdBdHRyKG4sICdwcmV2aW91cycsICdudWxsJylcblxuICAgIC8vIC50aW1lc3RhbXBcbiAgICBpZiAodHlwZW9mIHYudGltZXN0YW1wICE9ICdudW1iZXInKVxuICAgICAgcmV0dXJuIE1pc3NpbmdBdHRyKG4sICd0aW1lc3RhbXAnLCAnbnVtYmVyJylcblxuICAgIC8vIC5oYXNoXG4gICAgaWYgKHYuaGFzaCAhPSAnc2hhMjU2JylcbiAgICAgIHJldHVybiB6ZXJyKCdVc2FnZScsICdQYXJhbSAlIG11c3QgaGF2ZSAuaGFzaCBzZXQgdG8gXCJzaGEyNTZcIicpKG4pXG5cbiAgICAvLyAuc2lnbmF0dXJlXG4gICAgaWYgKHR5cGVvZiB2LnNpZ25hdHVyZSAhPSAnc3RyaW5nJylcbiAgICAgIHJldHVybiBNaXNzaW5nQXR0cihuLCAnc2lnbmF0dXJlJywgJ3N0cmluZycpXG4gIH0sXG5cbiAgcmVhZFN0cmVhbU9wdHM6IGZ1bmN0aW9uICh2LCBuKSB7XG4gICAgdmFyIGVyciA9IHRoaXMuZ2V0KCdvYmplY3QnKSh2LCBuKVxuICAgIGlmIChlcnIpXG4gICAgICByZXR1cm4gZXJyXG5cbiAgICAvLyAubGl2ZVxuICAgIGlmICh2LmxpdmUgJiYgdHlwZW9mIHYubGl2ZSAhPSAnYm9vbGVhbicgJiYgdHlwZW9mIHYubGl2ZSAhPSAnbnVtYmVyJylcbiAgICAgIHJldHVybiBBdHRyVHlwZShuLCAnbGl2ZScsICdib29sZWFuJylcblxuICAgIC8vIC5yZXZlcnNlXG4gICAgaWYgKHYucmV2ZXJzZSAmJiB0eXBlb2Ygdi5yZXZlcnNlICE9ICdib29sZWFuJyAmJiB0eXBlb2Ygdi5yZXZlcnNlICE9ICdudW1iZXInKVxuICAgICAgcmV0dXJuIEF0dHJUeXBlKG4sICdyZXZlcnNlJywgJ2Jvb2xlYW4nKVxuXG4gICAgLy8gLmtleXNcbiAgICBpZiAodi5rZXlzICYmIHR5cGVvZiB2LmtleXMgIT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiB2LmtleXMgIT0gJ251bWJlcicpXG4gICAgICByZXR1cm4gQXR0clR5cGUobiwgJ2tleXMnLCAnYm9vbGVhbicpXG5cbiAgICAvLyAudmFsdWVzXG4gICAgaWYgKHYudmFsdWVzICYmIHR5cGVvZiB2LnZhbHVlcyAhPSAnYm9vbGVhbicgJiYgdHlwZW9mIHYudmFsdWVzICE9ICdudW1iZXInKVxuICAgICAgcmV0dXJuIEF0dHJUeXBlKG4sICd2YWx1ZXMnLCAnYm9vbGVhbicpXG5cbiAgICAvLyAubGltaXRcbiAgICBpZiAodi5saW1pdCAmJiB0eXBlb2Ygdi5saW1pdCAhPSAnbnVtYmVyJylcbiAgICAgIHJldHVybiBBdHRyVHlwZShuLCAnbGltaXQnLCAnbnVtYmVyJylcblxuICAgIC8vIC5maWxsQ2FjaGVcbiAgICBpZiAodi5maWxsQ2FjaGUgJiYgdHlwZW9mIHYuZmlsbENhY2hlICE9ICdib29sZWFuJyAmJiB0eXBlb2Ygdi5maWxsQ2FjaGUgIT0gJ251bWJlcicpXG4gICAgICByZXR1cm4gQXR0clR5cGUobiwgJ2ZpbGxDYWNoZScsICdib29sZWFuJylcbiAgfSxcblxuICBjcmVhdGVIaXN0b3J5U3RyZWFtT3B0czogZnVuY3Rpb24gKHYsIG4pIHtcbiAgICAvLyAuaWRcbiAgICBpZiAoIXJlZi5pc0ZlZWQodi5pZCkpXG4gICAgICByZXR1cm4gTWlzc2luZ0F0dHIobiwgJ2lkJywgJ2ZlZWRJZCcpXG5cbiAgICAvLyAuc2VxXG4gICAgaWYgKHYuc2VxICYmIHR5cGVvZiB2LnNlcSAhPSAnbnVtYmVyJylcbiAgICAgIHJldHVybiBBdHRyVHlwZShuLCAnc2VxJywgJ251bWJlcicpXG5cbiAgICAvLyAubGl2ZVxuICAgIGlmICh2LmxpdmUgJiYgdHlwZW9mIHYubGl2ZSAhPSAnYm9vbGVhbicgJiYgdHlwZW9mIHYubGl2ZSAhPSAnbnVtYmVyJylcbiAgICAgIHJldHVybiBBdHRyVHlwZShuLCAnbGl2ZScsICdib29sZWFuJylcbiAgfSxcblxuICBjcmVhdGVVc2VyU3RyZWFtT3B0czogZnVuY3Rpb24gKHYsIG4pIHtcbiAgICB2YXIgZXJyID0gdGhpcy5nZXQoJ3JlYWRTdHJlYW1PcHRzJykodiwgbilcbiAgICBpZiAoZXJyKVxuICAgICAgcmV0dXJuIGVyclxuXG4gICAgLy8gLmlkXG4gICAgaWYgKCFyZWYuaXNGZWVkKHYuaWQpKVxuICAgICAgcmV0dXJuIE1pc3NpbmdBdHRyKG4sICdpZCcsICdmZWVkSWQnKVxuICB9LFxuXG4gIG1lc3NhZ2VzQnlUeXBlT3B0czogZnVuY3Rpb24gKHYsIG4pIHtcbiAgICB2YXIgZXJyID0gdGhpcy5nZXQoJ3JlYWRTdHJlYW1PcHRzJykodiwgbilcbiAgICBpZiAoZXJyKVxuICAgICAgcmV0dXJuIGVyclxuXG4gICAgLy8gLnR5cGVcbiAgICBpZiAodHlwZW9mIHYudHlwZSAhPSAnc3RyaW5nJylcbiAgICAgIHJldHVybiBNaXNzaW5nQXR0cihuLCAndHlwZScsICdzdHJpbmcnKVxuICB9LFxuXG4gIGxpbmtzT3B0czogZnVuY3Rpb24gKHYsIG4pIHtcbiAgICB2YXIgZXJyID0gdGhpcy5nZXQoJ29iamVjdCcpKHYsIG4pXG4gICAgaWYgKGVycilcbiAgICAgIHJldHVybiBlcnJcblxuICAgIC8vIC5zb3VyY2VcbiAgICBpZiAodi5zb3VyY2UgJiYgIXJlZi5pc0xpbmsodi5zb3VyY2UpICYmICFpc0ZpbHRlcih2LnNvdXJjZSkpXG4gICAgICByZXR1cm4gQXR0clR5cGUobiwgJ3NvdXJjZScsICdpZHxmaWx0ZXInKVxuXG4gICAgLy8gLmRlc3RcbiAgICBpZiAodi5kZXN0ICYmICFyZWYuaXNMaW5rKHYuZGVzdCkgJiYgIWlzRmlsdGVyKHYuZGVzdCkpXG4gICAgICByZXR1cm4gQXR0clR5cGUobiwgJ2Rlc3QnLCAnaWR8ZmlsdGVyJylcblxuICAgIC8vIC5yZWxcbiAgICBpZiAodi5yZWwgJiYgdHlwZW9mIHYucmVsICE9ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIEF0dHJUeXBlKG4sICdyZWwnLCAnc3RyaW5nJylcblxuICAgIC8vIC5saXZlXG4gICAgaWYgKHYubGl2ZSAmJiB0eXBlb2Ygdi5saXZlICE9ICdib29sZWFuJyAmJiB0eXBlb2Ygdi5saXZlICE9ICdudW1iZXInKVxuICAgICAgcmV0dXJuIEF0dHJUeXBlKG4sICdsaXZlJywgJ2Jvb2xlYW4nKVxuXG4gICAgLy8gLnJldmVyc2VcbiAgICBpZiAodi5yZXZlcnNlICYmIHR5cGVvZiB2LnJldmVyc2UgIT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiB2LnJldmVyc2UgIT0gJ251bWJlcicpXG4gICAgICByZXR1cm4gQXR0clR5cGUobiwgJ3JldmVyc2UnLCAnYm9vbGVhbicpXG5cbiAgICAvLyAua2V5c1xuICAgIGlmICh2LmtleXMgJiYgdHlwZW9mIHYua2V5cyAhPSAnYm9vbGVhbicgJiYgdHlwZW9mIHYua2V5cyAhPSAnbnVtYmVyJylcbiAgICAgIHJldHVybiBBdHRyVHlwZShuLCAna2V5cycsICdib29sZWFuJylcblxuICAgIC8vIC52YWx1ZXNcbiAgICBpZiAodi52YWx1ZXMgJiYgdHlwZW9mIHYudmFsdWVzICE9ICdib29sZWFuJyAmJiB0eXBlb2Ygdi52YWx1ZXMgIT0gJ251bWJlcicpXG4gICAgICByZXR1cm4gQXR0clR5cGUobiwgJ3ZhbHVlcycsICdib29sZWFuJylcbiAgfSxcblxuICByZWxhdGVkTWVzc2FnZXNPcHRzOiBmdW5jdGlvbiAodiwgbikge1xuICAgIHZhciBlcnIgPSB0aGlzLmdldCgnb2JqZWN0JykodiwgbilcbiAgICBpZiAoZXJyKVxuICAgICAgcmV0dXJuIGVyclxuXG4gICAgLy8gLmlkXG4gICAgaWYgKCFyZWYuaXNNc2codi5pZCkpXG4gICAgICByZXR1cm4gTWlzc2luZ0F0dHIobiwgJ2lkJywgJ21zZ0lkJylcblxuICAgIC8vIC5yZWxcbiAgICBpZiAodi5yZWwgJiYgdHlwZW9mIHYucmVsICE9ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIEF0dHJUeXBlKG4sICdyZWwnLCAnc3RyaW5nJylcblxuICAgIC8vIC5jb3VudFxuICAgIGlmICh2LmNvdW50ICYmIHR5cGVvZiB2LmNvdW50ICE9ICdib29sZWFuJyAmJiB0eXBlb2Ygdi5jb3VudCAhPSAnbnVtYmVyJylcbiAgICAgIHJldHVybiBBdHRyVHlwZShuLCAnY291bnQnLCAnYm9vbGVhbicpXG5cbiAgICAvLyAucGFyZW50XG4gICAgaWYgKHYucGFyZW50ICYmIHR5cGVvZiB2LnBhcmVudCAhPSAnYm9vbGVhbicgJiYgdHlwZW9mIHYucGFyZW50ICE9ICdudW1iZXInKVxuICAgICAgcmV0dXJuIEF0dHJUeXBlKG4sICdwYXJlbnQnLCAnYm9vbGVhbicpXG4gIH0sXG5cbiAgaXNCbG9ja2VkT3B0czogZnVuY3Rpb24gKHYsIG4pIHtcbiAgICB2YXIgZXJyID0gdGhpcy5nZXQoJ29iamVjdCcpKHYsIG4pXG4gICAgaWYgKGVycilcbiAgICAgIHJldHVybiBlcnJcblxuICAgIC8vIC5zb3VyY2VcbiAgICBpZiAodi5zb3VyY2UgJiYgIXJlZi5pc0ZlZWQodi5zb3VyY2UpKVxuICAgICAgcmV0dXJuIEF0dHJUeXBlKG4sICdzb3VyY2UnLCAnZmVlZElkJylcblxuICAgIC8vIC5kZXN0XG4gICAgaWYgKHYuZGVzdCAmJiAhcmVmLmlzRmVlZCh2LmRlc3QpKVxuICAgICAgcmV0dXJuIEF0dHJUeXBlKG4sICdkZXN0JywgJ2ZlZWRJZCcpXG4gIH0sXG5cbiAgY3JlYXRlRnJpZW5kU3RyZWFtT3B0czogZnVuY3Rpb24gKHYsIG4pIHtcbiAgICB2YXIgZXJyID0gdGhpcy5nZXQoJ29iamVjdCcpKHYsIG4pXG4gICAgaWYgKGVycilcbiAgICAgIHJldHVybiBlcnJcblxuICAgIC8vIC5zdGFydFxuICAgIGlmICh2LnN0YXJ0ICYmICFyZWYuaXNGZWVkKHYuc3RhcnQpKVxuICAgICAgcmV0dXJuIEF0dHJUeXBlKG4sICdzdGFydCcsICdmZWVkSWQnKVxuXG4gICAgLy8gLmdyYXBoXG4gICAgaWYgKHYuZ3JhcGggJiYgdHlwZW9mIHYuZ3JhcGggIT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gQXR0clR5cGUobiwgJ2dyYXBoJywgJ3N0cmluZycpXG5cbiAgICAvLyAuZHVuYmFyXG4gICAgaWYgKHYuZHVuYmFyICYmIHR5cGVvZiB2LmR1bmJhciAhPSAnbnVtYmVyJylcbiAgICAgIHJldHVybiBBdHRyVHlwZShuLCAnZHVuYmFyJywgJ251bWJlcicpXG5cbiAgICAvLyAuaG9wc1xuICAgIGlmICh2LmhvcHMgJiYgdHlwZW9mIHYuaG9wcyAhPSAnbnVtYmVyJylcbiAgICAgIHJldHVybiBBdHRyVHlwZShuLCAnaG9wcycsICdudW1iZXInKVxuICB9XG59KVxuIiwidmFyIHJlZiA9IHJlcXVpcmUoJ3NzYi1yZWYnKVxuXG5mdW5jdGlvbiBpc09iamVjdCAobykgeyByZXR1cm4gbyAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG8gfVxuZnVuY3Rpb24gaXNCb29sIChvKSB7IHJldHVybiAnYm9vbGVhbicgPT09IHR5cGVvZiBvIH1cbmZ1bmN0aW9uIGlzU3RyaW5nIChzKSB7IHJldHVybiAnc3RyaW5nJyA9PT0gdHlwZW9mIHMgfVxuXG5mdW5jdGlvbiB0cmF2ZXJzZSAob2JqLCBlYWNoKSB7XG4gIGZvciAodmFyIGsgaW4gb2JqKSB7XG4gICAgaWYgKCFvYmpba10pXG4gICAgICBjb250aW51ZVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9ialtrXSkpIHtcbiAgICAgIG9ialtrXS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIGVhY2godiwgaylcbiAgICAgIH0pXG4gICAgfSBlbHNlXG4gICAgICBlYWNoKG9ialtrXSwgaylcbiAgfVxufVxuXG5leHBvcnRzLmluZGV4TGlua3MgPSBmdW5jdGlvbiAobWVzc2FnZSwgb3B0cywgZWFjaCkge1xuICBpZiAodHlwZW9mIG9wdHMgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVhY2ggPSBvcHRzXG4gICAgb3B0cyA9IG51bGxcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMgPT0gJ3N0cmluZycpXG4gICAgb3B0cyA9IHsgcmVsOiBvcHRzIH1cbiAgaWYgKCFvcHRzKVxuICAgIG9wdHMgPSB7fVxuICB2YXIgbXNnICA9IG9wdHMubXNnXG4gIHZhciBmZWVkID0gb3B0cy5mZWVkXG4gIHZhciBibG9iID0gb3B0cy5ibG9iXG4gIHZhciBhbnkgID0gIShtc2cgfHwgZmVlZCB8fCBibG9iKVxuXG4gIHRyYXZlcnNlKG1lc3NhZ2UsIGZ1bmN0aW9uIChvYmosIHJlbCkge1xuICAgIGlmIChvcHRzLnJlbCAmJiByZWwgIT09IG9wdHMucmVsKSByZXR1cm5cblxuICAgIHZhciByID0gKHR5cGVvZiBvYmogPT0gJ3N0cmluZycpID8gb2JqIDogb2JqLmxpbmtcbiAgICBpZiAoYW55KSB7XG4gICAgICBpZiAoIXJlZi5pc0xpbmsocikpIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobXNnKSB7XG4gICAgICAgIGlmIChpc0Jvb2wobXNnKSAmJiByZWYudHlwZShyKSAhPSAnbXNnJykgcmV0dXJuIFxuICAgICAgICBpZiAoIWlzQm9vbChtc2cpICYmIHIgIT0gbXNnKSByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGZlZWQpIHtcbiAgICAgICAgaWYgKGlzQm9vbChmZWVkKSAmJiByZWYudHlwZShyKSAhPSAnZmVlZCcpIHJldHVybiBcbiAgICAgICAgaWYgKCFpc0Jvb2woZmVlZCkgJiYgciAhPSBmZWVkKSByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGJsb2IpIHtcbiAgICAgICAgaWYgKGlzQm9vbChibG9iKSAmJiByZWYudHlwZShyKSAhPSAnYmxvYicpIHJldHVybiBcbiAgICAgICAgaWYgKCFpc0Jvb2woYmxvYikgJiYgciAhPSBibG9iKSByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBlYWNoKCh0eXBlb2Ygb2JqID09ICdzdHJpbmcnKSA/IHsgbGluazogb2JqIH0gOiBvYmosIHJlbClcbiAgfSlcbn1cblxuZXhwb3J0cy5saW5rID1cbmV4cG9ydHMuYXNMaW5rID0gZnVuY3Rpb24gKG9iaiwgdHlwZSkge1xuICBpZiAoIW9iailcbiAgICByZXR1cm4gbnVsbFxuICBpZiAoaXNTdHJpbmcob2JqKSlcbiAgICBvYmogPSB7IGxpbms6IG9iaiB9XG4gIHJldHVybiBpc0xpbmsob2JqLCB0eXBlKSA/IG9iaiA6IG51bGxcbn1cblxuZXhwb3J0cy5saW5rcyA9XG5leHBvcnRzLmFzTGlua3MgPSBmdW5jdGlvbiAob2JqLCB0eXBlKSB7XG4gIGlmICghb2JqKVxuICAgIHJldHVybiBbXVxuICB2YXIgYXJyID0gQXJyYXkuaXNBcnJheShvYmopID8gb2JqIDogW29ial1cbiAgcmV0dXJuIGFyclxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKGwpIHsgcmV0dXJuIGlzTGluayhsLCB0eXBlKSB9KVxuICAgIC5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICh0eXBlb2YgbyA9PSAnc3RyaW5nJykgPyB7IGxpbms6IG8gfSA6IG8gfSlcbn1cblxudmFyIGlzTGluayA9XG5leHBvcnRzLmlzTGluayA9IGZ1bmN0aW9uIChvYmosIHR5cGUpIHtcbiAgaWYgKCFvYmopXG4gICAgcmV0dXJuIGZhbHNlXG4gIHZhciByID0gKGlzU3RyaW5nKG9iaikpID8gb2JqIDogb2JqLmxpbmtcbiAgcmV0dXJuICh0eXBlKSA/IChyZWYudHlwZShyKSA9PSB0eXBlKSA6IHJlZi5pc0xpbmsocilcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgQmxvYnMgID0gcmVxdWlyZSgnbXVsdGlibG9iJylcbnZhciBwYXRoICAgPSByZXF1aXJlKCdwYXRoJylcbnZhciBwdWxsICAgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgaXNCbG9iID0gcmVxdWlyZSgnc3NiLXJlZicpLmlzQmxvYklkXG52YXIgUXVvdGEgID0gcmVxdWlyZSgnLi9xdW90YScpXG52YXIgTm90aWZ5ID0gcmVxdWlyZSgncHVsbC1ub3RpZnknKVxudmFyIG1kbSAgICA9IHJlcXVpcmUoJ21kbWFuaWZlc3QnKVxudmFyIHZhbGlkICA9IHJlcXVpcmUoJy4uLy4uL2xpYi92YWxpZGF0b3JzJylcbnZhciBhcGlkb2MgPSByZXF1aXJlKCcuLi8uLi9saWIvYXBpZG9jcycpLmJsb2JzXG52YXIgUmVwbGljYXRlID0gcmVxdWlyZSgnLi9yZXBsaWNhdGlvbicpXG5cbi8vIGJsb2JzIHBsdWdpblxuLy8gbWV0aG9kcyB0byByZWFkL3dyaXRlIHRoZSBibG9ic3RvcmVcbi8vIGFuZCBhdXRvbWF0ZWQgYmxvYi1mZXRjaGluZyBmcm9tIHRoZSBuZXR3b3JrXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuICdmdW5jdGlvbicgPT09IHR5cGVvZiBmXG59XG5cbmZ1bmN0aW9uIGRlc2lnaWwgKGhhc2gpIHtcbiAgcmV0dXJuIGlzQmxvYihoYXNoKSA/IGhhc2guc3Vic3RyaW5nKDEpIDogaGFzaFxufVxuXG5mdW5jdGlvbiByZXNpZ2lsIChoYXNoKSB7XG4gIHJldHVybiBpc0Jsb2IoaGFzaCkgPyBoYXNoIDogJyYnK2hhc2hcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcgKHMpIHtcbiAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2Ygc1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmFtZTogJ2Jsb2JzJyxcbiAgdmVyc2lvbjogJzAuMC4wJyxcbiAgbWFuaWZlc3Q6IG1kbS5tYW5pZmVzdChhcGlkb2MpLFxuICBwZXJtaXNzaW9uczoge1xuICAgIGFub255bW91czoge2FsbG93OiBbJ2hhcycsICdnZXQnLCAnY2hhbmdlcyddfSxcbiAgfSxcbiAgaW5pdDogZnVuY3Rpb24gKHNib3QsIG9wdHMpIHtcblxuICAgIHZhciBub3RpZnkgPSBOb3RpZnkoKVxuICAgIHZhciBjb25maWcgPSBvcHRzXG5cbiAgICB2YXIgYmxvYnMgPSBzYm90Ll9ibG9icyA9IEJsb2JzKHtcbiAgICAgIGRpcjogcGF0aC5qb2luKGNvbmZpZy5wYXRoLCAnYmxvYnMnKSxcbiAgICAgIGhhc2g6ICdzaGEyNTYnXG4gICAgfSlcblxuICAgIHZhciB1c2VyUXVvdGFzID0ge30gLy8gbWFwIG9mIHsgZmVlZElkID0+IHF1b3RhVXNhZ2UgfSwgZm9yIHJhdGUtbGltaXRpbmdcbiAgICB2YXIgZHJhaW4gPSBRdW90YShzYm90LCBibG9icywgdXNlclF1b3RhcylcbiAgICB2YXIgd2FudExpc3QgPSBSZXBsaWNhdGUoc2JvdCwgY29uZmlnLCBub3RpZnksIHVzZXJRdW90YXMpXG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0OiB2YWxpZC5zb3VyY2UoZnVuY3Rpb24gKGhhc2gpIHtcbiAgICAgICAgcmV0dXJuIGJsb2JzLmdldChkZXNpZ2lsKGhhc2gpKVxuICAgICAgfSwgJ2Jsb2JJZCcpLFxuXG4gICAgICBoYXM6IHZhbGlkLmFzeW5jKGZ1bmN0aW9uIChoYXNoLCBjYikge1xuICAgICAgICAvL2VtaXQgYmxvYnM6aGFzIGV2ZW50IHdoZW4gdGhpcyBhcGkgaXMgY2FsbGVkIHJlbW90ZWx5LlxuICAgICAgICAvL25lZWRlZCB0byBtYWtlIHRlc3RzIHBhc3MuIHNob3VsZCBwcm9iYWJseSByZW1vdmUgdGhpcy5cbiAgICAgICAgaWYodGhpcy5pZCkgc2JvdC5lbWl0KCdibG9iczpoYXMnLCBoYXNoKVxuICAgICAgICBibG9icy5oYXMoZGVzaWdpbChoYXNoKSwgY2IpXG4gICAgICB9LCAnYmxvYklkfGFycmF5JyksXG5cbiAgICAgIHNpemU6IHZhbGlkLmFzeW5jKGZ1bmN0aW9uIChoYXNoLCBjYikge1xuICAgICAgICAvL3Nib3QuZW1pdCgnYmxvYnM6c2l6ZScsIGhhc2gpXG4gICAgICAgIGJsb2JzLnNpemUoZGVzaWdpbChoYXNoKSwgY2IpXG4gICAgICB9LCAnYmxvYklkfGFycmF5JyksXG5cbiAgICAgIGFkZDogdmFsaWQuc2luayhmdW5jdGlvbiAoaGFzaCwgY2IpIHtcbiAgICAgICAgLy8gY2Igb25jZSBibG9iIGlzIHN1Y2Nlc3NmdWxseSBhZGRlZC5cbiAgICAgICAgLy8gc2luayBjYnMgYXJlIG5vdCBleHBvc2VkIG92ZXIgcnBjXG4gICAgICAgIC8vIHNvIHRoaXMgaXMgb25seSBhdmFpbGFibGUgd2hlbiB1c2luZyB0aGlzIGFwaSBcbiAgICAgICAgaWYoaXNGdW5jdGlvbihoYXNoKSkgY2IgPSBoYXNoLCBoYXNoID0gbnVsbFxuXG4gICAgICAgIHJldHVybiBibG9icy5hZGQoZGVzaWdpbChoYXNoKSwgZnVuY3Rpb24gKGVyciwgaGFzaCkge1xuICAgICAgICAgIGlmKCFlcnIpIHtcbiAgICAgICAgICAgIGhhc2ggPSByZXNpZ2lsKGhhc2gpXG4gICAgICAgICAgICBzYm90LmVtaXQoJ2Jsb2JzOmdvdCcsIGhhc2gpXG4gICAgICAgICAgICBub3RpZnkoaGFzaClcbiAgICAgICAgICAgIC8vd2FpdCB1bnRpbCBxdW90YXMgaGF2ZSBiZWVuIGNhbGN1bGF0ZWRcbiAgICAgICAgICAgIC8vYmVmb3IgcmV0dXJuaW5nICh0ZXN0cyB3aWxsIGZhaWwgd2l0aG91dCB0aGlzKVxuICAgICAgICAgICAgaWYoY2IpIGRyYWluKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgY2IobnVsbCwgaGFzaClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoY2IpIGNiKGVyciwgaGFzaClcbiAgICAgICAgICAgIGVsc2UgICBjb25zb2xlLmVycm9yKGVyci5zdGFjaylcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LCAnc3RyaW5nPycpLFxuXG4gICAgICBybTogdmFsaWQuYXN5bmMoZnVuY3Rpb24gKGhhc2gsIGNiKSB7XG4gICAgICAgIHJldHVybiBibG9icy5ybShkZXNpZ2lsKGhhc2gpLCBjYilcbiAgICAgIH0sICdzdHJpbmcnKSxcblxuICAgICAgbHM6IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICAgIHJldHVybiBwdWxsKGJsb2JzLmxzKG9wdHMpLCBwdWxsLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGlmKGUuc3luYykgcmV0dXJuIGVcbiAgICAgICAgICBpZihpc1N0cmluZyhlKSkgcmV0dXJuIHJlc2lnaWwoZSlcbiAgICAgICAgICBlLmlkID0gcmVzaWdpbChlLmlkKVxuICAgICAgICAgIHJldHVybiBlXG4gICAgICAgIH0pKVxuICAgICAgfSxcbiAgICAgIC8vIHJlcXVlc3QgdG8gcmV0cmlldmUgYSBibG9iLFxuICAgICAgLy8gY2FsbHMgYmFjayB3aGVuIHRoYXQgZmlsZSBpcyBhdmFpbGFibGUuXG4gICAgICAvLyAtIGBvcHRzLm5vd2FpdGA6IGNhbGwgY2IgaW1tZWRpYXRlbHkgaWYgbm90IGZvdW5kIChkb250IHJlZ2lzdGVyIGZvciBjYWxsYmFjaylcbiAgICAgIHdhbnQ6IHZhbGlkLmFzeW5jKGZ1bmN0aW9uIChoYXNoLCBvcHRzLCBjYikge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihvcHRzKSkge1xuICAgICAgICAgIGNiID0gb3B0c1xuICAgICAgICAgIG9wdHMgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlkID0gdGhpcy5pZFxuICAgICAgICBpZighaXNCbG9iKGhhc2gpKSByZXR1cm4gY2IobmV3IEVycm9yKCdub3QgYSBoYXNoOicgKyBoYXNoKSlcblxuICAgICAgICBzYm90LmVtaXQoJ2Jsb2JzOndhbnRzJywgaGFzaClcbiAgICAgICAgYmxvYnMuaGFzKGRlc2lnaWwoaGFzaCksIGZ1bmN0aW9uIChfLCBoYXMpIHtcbiAgICAgICAgICBpZiAoaGFzKSByZXR1cm4gY2IobnVsbCwgdHJ1ZSlcbiAgICAgICAgICAvLyB1cGRhdGUgcXVldWVcbiAgICAgICAgICB3YW50TGlzdC53YW50KGhhc2gsIGlkLCBjYilcbiAgICAgICAgfSlcbiAgICAgIH0sICdibG9iSWQnLCAnb2JqZWN0PycpLFxuXG4gICAgICBjaGFuZ2VzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBub3RpZnkubGlzdGVuKClcbiAgICAgIH0sXG5cbiAgICAgIHF1b3RhOiB2YWxpZC5zeW5jKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gd2FudExpc3QucXVvdGEoaWQpXG4gICAgICB9LCAnZmVlZElkJyksXG5cbiAgICAgIC8vIGdldCBjdXJyZW50IHdhbnQgbGlzdFxuICAgICAgd2FudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHdhbnRMaXN0LmpvYnNcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIFF1ZXVlXG4vLyByZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2guLi5cbi8vIC0gb25seSBhY3RzIGlmIG5vdCBhbHJlYWR5IGFjdGluZ1xuLy8gLSBhdXRvbWF0aWNhbGx5IHJlcXVldWVzIGlmIHRoZSB0YXNrIGlzIG5vdCB5ZXQgZG9uZVxuLy8gLSBgZGVsYXlgOiBtcywgYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZWZvcmUgY2FsbGluZyBhZ2FpblxuLy8gLSBgbmA6IG51bWJlciwgYW1vdW50IG9mIHNpbXVsdGFuZW91cyBjYWxscyBhbGxvd2VkXG4vLyAtIGBsYWJlbGA6IHN0cmluZywgbmFtZSBvZiB0aGUgdGFzayAoZm9yIGxvZ2dpbmcpXG4vLyAtIGBmdW5gOiBmdW5jdGlvbihjYihkb25lPykpLCBjYWxscyBjYih0cnVlKSB3aGVuIGRvbmUsIGNiKGZhbHNlKSB3aGVuIG5lZWRzIHRvIHJlcXVldWVcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAoZikge1xuICByZXR1cm4gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZcbn1cblxuZnVuY3Rpb24gV29yayhhdmdXYWl0LCBuLCBsYWJlbCwgZnVuKSB7XG4gIG4gID0gMVxuICB2YXIgZG9pbmcgPSAwLCB0aW1lb3V0XG5cbiAgdmFyIHRpbWVycyA9IFtdXG5cbiAgZnVuY3Rpb24gY2xlYXIgKHRpbWVyKSB7XG4gICAgdmFyIGkgPSB0aW1lcnMuaW5kZXhPZih0aW1lcilcbiAgICBjbGVhclRpbWVvdXQodGltZXJbaV0pXG4gICAgdGltZXMuc3BsaWNlKGksIDEpXG4gIH1cblxuICBmdW5jdGlvbiBkZWxheSAoam9iLCBkKSB7XG4gICAgdmFyIGlcbiAgICB2YXIgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRpbWVycy5zcGxpY2UodGltZXJzLmluZGV4T2YodGltZXIpLCAxKTsgam9iKClcbiAgICB9LCBkKVxuICAgIHRpbWVyLnVucmVmKClcbiAgICB0aW1lcnMucHVzaCh0aW1lcilcblxuICAgIHJldHVybiB0aW1lclxuICB9XG5cbiAgZnVuY3Rpb24gam9iICgpIHtcbiAgICAvLyBhYm9ydCBpZiBhbHJlYWR5IGRvaW5nIHRvbyBtYW55XG5cbiAgICBpZihkb2luZyA+PSBuKSByZXR1cm5cbiAgICBkb2luZysrXG5cbiAgICAvLyBydW4gdGhlIGJlaGF2aW9yXG4gICAgZnVuKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICBkb2luZy0tXG4gICAgICBpZihkb25lKSB7XG4gICAgICAgIC8vIHdlJ3JlIGRvbmUsIGRvbnQgcmVxdWV1ZVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gcmVxdWV1ZSBhZnRlciBhIGRlbGF5XG4gICAgICB2YXIgd2FpdCA9IH5+KGF2Z1dhaXQvMiArIGF2Z1dhaXQqTWF0aC5yYW5kb20oKSlcbiAgICAgIGRlbGF5KGpvYiwgd2FpdClcbiAgICB9KVxuICB9XG5cbiAgam9iLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgIHRpbWVycy5mb3JFYWNoKGNsZWFyKVxuICB9XG5cbiAgcmV0dXJuIGpvYlxufVxuXG5mdW5jdGlvbiBmaW5kIChqb2JzLCB0ZXN0KSB7XG4gIGZvcih2YXIgayBpbiBqb2JzKVxuICAgIGlmKHRlc3Qoam9ic1trXSkpIHJldHVybiBrXG4gIHJldHVybiAtMVxufVxuXG5mdW5jdGlvbiBtYXggKGpvYnMsIHRlc3QpIHtcbiAgdmFyIE0gPSAtSW5maW5pdHksIGkgPSAtMVxuICBmb3IodmFyIGsgaW4gam9icykge1xuICAgIHZhciBtID0gdGVzdChqb2JzW2tdLCBrLCBqb2JzKVxuICAgIGlmKG0gPiBNKSB7XG4gICAgICBNID0gbVxuICAgICAgaSA9IGtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAod29yaykge1xuXG4gIHZhciBqb2JzID0gW11cblxuICB2YXIgcXVldWUgPSB7XG4gICAgcHVzaDogZnVuY3Rpb24gKGpvYikge1xuICAgICAgam9icy5wdXNoKGpvYilcbiAgICB9LFxuXG4gICAgcHVsbDogZnVuY3Rpb24gKGlkKSB7XG4gICAgICB2YXIgdGVzdCA9IGlzRnVuY3Rpb24oaWQpID8gaWQgOiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5pZCA9PT0gaWQgfVxuICAgICAgaWYoIXRoaXMubGVuZ3RoKCkpIHJldHVyblxuICAgICAgaWYoIWlkKVxuICAgICAgICByZXR1cm4gam9icy5zaGlmdCgpXG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGluZGV4ID0gZmluZChqb2JzLCB0ZXN0KVxuICAgICAgICBpZih+aW5kZXgpIHJldHVybiBqb2JzLnNwbGljZShpbmRleCwgMSlbMF1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZWFjaDogZnVuY3Rpb24gKGl0ZXIpIHtcbiAgICAgIGpvYnMuZm9yRWFjaChpdGVyKVxuICAgIH0sXG5cbiAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBqb2JzLmxlbmd0aFxuICAgIH0sXG5cbiAgICB0b0pTT046IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBqb2JzLnNsaWNlKClcbiAgICB9XG4gIH1cblxuICBXb3JrKDEwMCwgMiwgbnVsbCwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICBpZighcXVldWUubGVuZ3RoKCkpIHJldHVybiBkb25lKClcbiAgICB3b3JrKHF1ZXVlLCBkb25lKVxuICB9KSAoKVxuXG4gIHJldHVybiBxdWV1ZVxufVxuXG5cblxuXG5cblxuXG4iLCJ2YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcbnZhciBwYXJhbWFwID0gcmVxdWlyZSgncHVsbC1wYXJhbWFwJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2JvdCwgYmxvYnMsIHVzZXJRdW90YXMsIGNiKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXVxuXG4gIC8vcmVjYWxjdWxhdGUgdGhlIHF1b3RhLCB3aXRoIGxpdmUgdXBkYXRlcy5cblxuICAvLyBzaGFyZSBhIGZpbGUgc2l6ZSBiZXR3ZWVuIHRoZSBmZWVkcyB0aGF0IGxpbmsgdG8gaXQuXG4gIC8vIEF0IHRoZSB0aW1lIHdlIGRvd25sb2FkIGl0LlxuXG4gIC8vIE1vcmUgZmVlZHMgbWlnaHQgbGluayB0byBpdCBsYXRlciwgYW5kIHRoZXNlXG4gIC8vIHdvbid0IGJlIGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbi5cbiAgLy8gYnV0IGl0J3Mgc2ltcGxlc3QgdG8gZG8gaXQgdGhpcyB3YXkuXG5cbiAgLy8gdGhpcyBpcyBvbmx5IGluIG1lbW9yeSwgc28gaXQgd2lsbCBiZSByZWNhbGN1bGF0ZWRcbiAgLy8gd2hlbiBzYm90IGlzIHJlc3RhcnRlZC5cblxuICB2YXIgdG90YWwgPSAwXG4gIHZhciBzdGFydCA9IERhdGUubm93KClcbiAgdmFyIGluZmxpZ2h0ID0gMFxuXG4gIHB1bGwoXG4gICAgYmxvYnMubHMoe2xvbmc6IHRydWUsIGxpdmU6IHRydWV9KSxcbiAgICBwYXJhbWFwKGZ1bmN0aW9uIChkYXRhLCBjYikge1xuICAgICAgaWYoZGF0YS5zeW5jKSByZXR1cm4gY2IobnVsbCwgZGF0YSlcblxuICAgICAgdmFyIGFjYyA9IHt9LCBjb3VudCA9IDBcbiAgICAgIHRvdGFsICs9IGRhdGEuc2l6ZVxuXG4gICAgICBpbmZsaWdodCArK1xuICAgICAgcHVsbChcbiAgICAgICAgc2JvdC5saW5rcyh7ZGVzdDogJyYnK2RhdGEuaWR9KSxcbiAgICAgICAgcHVsbC5kcmFpbihmdW5jdGlvbiAobGluaykge1xuICAgICAgICAgIGlmKCFhY2NbbGluay5zb3VyY2VdKSB7XG4gICAgICAgICAgICBhY2NbbGluay5zb3VyY2VdID0gdHJ1ZVxuICAgICAgICAgICAgY291bnQgKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaW5mbGlnaHQgLS1cbiAgICAgICAgICBpZihlcnIpIHJldHVybiBjYihlcnIpXG4gICAgICAgICAgdmFyIHNpemUgPSBkYXRhLnNpemVcbiAgICAgICAgICBmb3IodmFyIGsgaW4gYWNjKVxuICAgICAgICAgICAgdXNlclF1b3Rhc1trXSA9ICh1c2VyUXVvdGFzW2tdIHx8IDApICsgc2l6ZS9jb3VudFxuXG4gICAgICAgICAgaWYoaW5mbGlnaHQgPT09IDApXG4gICAgICAgICAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aCkgbGlzdGVuZXJzLnNoaWZ0KCkoKVxuXG4gICAgICAgICBjYihudWxsLCBkYXRhKVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0pLFxuICAgIHB1bGwuZHJhaW4oKVxuICApXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgIGlmKCFpbmZsaWdodCkgbGlzdGVuZXIoKVxuICAgIGVsc2UgICAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpXG4gIH1cbn1cbiIsInZhciBwdWxsID0gcmVxdWlyZSgncHVsbC1zdHJlYW0nKVxudmFyIFF1ZXVlID0gcmVxdWlyZSgnLi9xdWV1ZScpXG5cbmZ1bmN0aW9uIGVhY2ggKG9iaiwgaXRlcikge1xuICBmb3IodmFyIGsgaW4gb2JqKVxuICAgIGl0ZXIob2JqW2tdLCBrLCBvYmopXG59XG5cbmZ1bmN0aW9uIGZpcnN0IChvYmosIHRlc3QpIHtcbiAgdmFyIHZcbiAgZm9yICh2YXIgayBpbiBvYmopXG4gICAgaWYodiA9IHRlc3Qob2JqW2tdLCBrLCBvYmopKVxuICAgICAgcmV0dXJuIHZcbn1cblxuZnVuY3Rpb24gdW5pb24gKGEsIGIpIHtcbiAgYiA9IHRvQXJyYXkoYilcbiAgYSA9IHRvQXJyYXkoYSlcbiAgaWYoIWEubGVuZ3RoKSByZXR1cm4gYlxuICBpZihhLmxlbmd0aCA8IGIubGVuZ3RoKSB7XG4gICAgdmFyIHQgPSBiOyBiID0gYTsgYSA9IHRcbiAgfVxuICBiLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICBpZighfmEuaW5kZXhPZihlKSkgYS5wdXNoKGUpXG4gIH0pXG4gIHJldHVybiBhXG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkgKHMpIHtcbiAgcmV0dXJuIHMgIT0gbnVsbCA/IChBcnJheS5pc0FycmF5KHMpID8gcyA6IFtzXSkgOiBbXVxufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7XG4gIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZlxufVxuXG52YXIgTUIgPSAxMDI0KjEwMjRcbi8vZGVmYXVsdCByZXBsaWNhdGlvbiBsaW1pdHMuXG52YXIgZGVmYXVsdHMgPSB7bGltaXQ6IFstMSwgMTAwKk1CLCAyMCpNQl0sIG1pbkxpbWl0OiA1Kk1CfVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2JvdCwgb3B0cywgbm90aWZ5LCB1c2VyUXVvdGFzKSB7XG4gIHZhciBqb2JzID0ge30sIGhhc1F1ZXVlLCBnZXRRdWV1ZVxuICB2YXIgY29uZiA9IG9wdHMuYmxvYnMgfHwgZGVmYXVsdHMsIHdsXG5cbiAgLy9rZWVwIHRyYWNrIG9mIHdobyBpcyBvdmVyIHF1b3RhIHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgbG9nZ2VkIGFnYWluIGFuZCBhZ2Fpbi5cbiAgdmFyIG92ZXIgPSB7fVxuXG4gIC8vIGNhbGN1bGF0ZSBxdW90YXMgZm9yIGVhY2ggZmVlZC5cbiAgLy8gc3RhcnQgd2l0aCBzaXplIG9mIGVhY2ggYmxvYlxuICAvLyBkaXZpZGVkIGJldHdlZW4gdGhlIGZlZWRzIHRoYXQgbWVudGlvbiBpdC5cbiAgLy8gZ2V0dGluZyBhIHVzZSBmb3IgZWFjaCBmZWVkLlxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUpvYihpZCwgb3duZXIsIGNiKSB7XG4gICAgdG9BcnJheShvd25lcikuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgaWYoZVswXSAhPT0gJ0AnKSB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIG93bmVyOicrZSlcbiAgICB9KVxuICAgIGlmKGpvYnNbaWRdKSB7XG4gICAgICBqb2JzW2lkXS5vd25lciA9IHVuaW9uKGpvYnNbaWRdLm93bmVyLCBvd25lciB8fCBbXSlcbiAgICAgIGpvYnNbaWRdLmNicy5wdXNoKGNiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGhhc1F1ZXVlLnB1c2goam9ic1tpZF0gPSB7XG4gICAgICBpZDogaWQsIGhhczoge30sIG93bmVyOiB0b0FycmF5KG93bmVyKSxcbiAgICAgIGNiczogY2IgPyBbY2JdIDogW10sIGRvbmU6IGZhbHNlXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaEpvYihqb2IpIHtcbiAgICBpZigham9iKSByZXR1cm5cbiAgICBkZWxldGUgam9ic1tqb2IuaWRdXG4gICAgd2hpbGUoam9iLmNicyAmJiBqb2IuY2JzLmxlbmd0aCkge1xuICAgICAgdmFyIGNiID0gam9iLmNicy5zaGlmdCgpXG4gICAgICBpZihpc0Z1bmN0aW9uKGNiKSkgY2IobnVsbCwgdHJ1ZSlcbiAgICB9XG4gIH1cblxuICAvL2lmIHdhbnQgaXMgY2FsbGVkIGFuZCB0aGVuIGl0J3MgbG9jYWxseSBhZGRlZCxcbiAgLy9oYW5kbGUgdGhhdCBieSBjYWxsaW5nIGJhY2sgd2FudC5cbiAgcHVsbChub3RpZnkubGlzdGVuKCksIHB1bGwuZHJhaW4oZnVuY3Rpb24gKGhhc2gpIHtcbiAgICBmaW5pc2hKb2IoaGFzUXVldWUucHVsbChoYXNoKSB8fCBnZXRRdWV1ZS5wdWxsKGhhc2gpKVxuICB9KSlcblxuICBmdW5jdGlvbiBoYXNQZWVycyAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNib3QucGVlcnMpLmxlbmd0aCAhPT0gMFxuICB9XG5cbiAgZnVuY3Rpb24gaG9wcyAoaWQpIHtcbiAgICB2YXIgcCA9IHNib3QuZnJpZW5kcy5wYXRoKHtcbiAgICAgIHNvdXJjZTogc2JvdC5pZCwgZGVzdDogaWQsIGhvcHM6IGNvbmYubGltaXQubGVuZ3RoXG4gICAgfSlcbiAgICByZXR1cm4gcCA/IHAubGVuZ3RoIC0gMSA6IC0xXG4gIH1cblxuICBmdW5jdGlvbiBsaW1pdEZvcihpZCkge1xuICAgIGlmKG9wdHMucGFydHkpIHJldHVybiAtMVxuICAgIHZhciBoID0gaG9wcyhpZClcbiAgICBpZihob3BzID09PSAtMSkgcmV0dXJuIGNvbmYubWluTGltaXRcbiAgICByZXR1cm4gY29uZi5saW1pdFtoXSB8fCBjb25mLm1pbkxpbWl0XG4gIH1cblxuICBmdW5jdGlvbiBmaWx0ZXIgKGpvYikge1xuICAgIC8vc2V0IGNvbmZpZy5ibG9icy5wYXJ0eSA9IHRydWVcbiAgICAvL3RvIGRpc2FibGUgYWxsIHF1b3Rhcy5cbiAgICBpZihjb25mLnBhcnR5KSByZXR1cm4gdHJ1ZVxuICAgIHJldHVybiBqb2Iub3duZXIuZXZlcnkoZnVuY3Rpb24gKGlkKSB7XG4gICAgICB2YXIgbCA9IGxpbWl0Rm9yKGlkKVxuICAgICAgaWYobCA8IDApIHJldHVybiB0cnVlXG4gICAgICBlbHNlIGlmICgodXNlclF1b3Rhc1tpZF0gfHwgMCkgPCBsKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgZWxzZSBpZighb3ZlcltpZF0pIHtcbiAgICAgICAgb3ZlcltpZF0gPSB1c2VyUXVvdGFzW2lkXVxuICAgICAgICBjb25zb2xlLmxvZygnT3ZlciBRdW90YTonLCBpZCwgd2wucXVvdGEoaWQpKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBoYXNRdWV1ZSA9IFF1ZXVlKGZ1bmN0aW9uIChfLCBkb25lKSB7XG4gICAgLy9jaGVjayBpZiB0aGVyZSBpcyBhIHNvbWV0aGluZyBpbiB0aGUgaGFzIHF1ZXVlLlxuICAgIC8vZmlsdGVyIG91dCBjYXNlcyB3aGVyZSB3b3JrIGlzIGltcG9zc2libGUuLi5cbiAgICAvLyhlbXB0eSBxdWV1ZSwgb3Igbm8gcGVlcnMpXG4gICAgaWYoIWhhc1BlZXJzKCkpIHJldHVybiBkb25lKClcblxuICAgIHZhciBqb2IgPSBoYXNRdWV1ZS5wdWxsKGZpbHRlcilcblxuICAgIGlmKCFqb2IgfHwgam9iLmRvbmUpIHJldHVybiBkb25lKClcblxuICAgIHZhciBuID0gMCwgZm91bmQgPSBmYWxzZVxuICAgIGVhY2goc2JvdC5wZWVycywgZnVuY3Rpb24gKHBlZXJzLCBpZCkge1xuICAgICAgaWYoKCd1bmRlZmluZWQnICE9PSB0eXBlb2Ygam9iLmhhc1tpZF0pIHx8ICFwZWVyc1swXSkgcmV0dXJuXG4gICAgICBuKytcbiAgICAgIHBlZXJzWzBdLmJsb2JzLmhhcyhqb2IuaWQsIGZ1bmN0aW9uIChlcnIsIGhhcykge1xuICAgICAgICBmb3VuZCA9IGZvdW5kIHx8IChqb2IuaGFzW2lkXSA9IGhhcylcbiAgICAgICAgaWYoLS1uKSByZXR1cm5cbiAgICAgICAgbmV4dCgpXG4gICAgICB9KVxuICAgIH0pXG4gICAgaWYoIW4pIHJldHVybiBoYXNRdWV1ZS5wdXNoKGpvYiksIGRvbmUoKVxuXG4gICAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgICAoZm91bmQgPyBnZXRRdWV1ZSA6IGhhc1F1ZXVlKS5wdXNoKGpvYilcbiAgICAgIGRvbmUoKVxuICAgIH1cbiAgfSlcblxuICBnZXRRdWV1ZSA9IFF1ZXVlKGZ1bmN0aW9uIChfLCBkb25lKSB7XG4gICAgaWYoIWhhc1BlZXJzKCkpIHJldHVybiBkb25lKClcblxuICAgIC8vY2hlY2sgaWYgdGhpcyBmaWxlIGlzIG92ZXIgcXVvdGEuXG4gICAgdmFyIGpvYiA9IGdldFF1ZXVlLnB1bGwoZmlsdGVyKVxuICAgIGlmKCFqb2IpIHJldHVybiBkb25lKClcbiAgICAvL3RoaXMgY292ZXJzIHdlaXJkIGVkZ2VjYXNlIHdoZXJlIGEgYmxvYiBpcyBhZGRlZFxuICAgIC8vd2hpbGUgc29tZXRoaW5nIGlzIGxvb2tpbmcgZm9yIGl0LiBjb3ZlcmVkIGluXG4gICAgLy90ZXN0L2Jsb2JzMi5qc1xuICAgIGlmKGpvYi5kb25lKSB7XG4gICAgICBkZWxldGUgam9ic1tqb2IuaWRdXG4gICAgICByZXR1cm4gZG9uZSgpXG4gICAgfVxuXG4gICAgdmFyIHJlbW90ZSA9IGZpcnN0KGpvYi5oYXMsIGZ1bmN0aW9uIChoYXMsIGlkKSB7XG4gICAgICBpZiAoaGFzKVxuICAgICAgICByZXR1cm4gZ2V0UGVlcihpZClcbiAgICB9KVxuXG4gICAgaWYoIXJlbW90ZSkge1xuICAgICAgaGFzUXVldWUucHVzaChqb2IpOyByZXR1cm4gZG9uZSgpXG4gICAgfVxuXG4gICAgcHVsbChcbiAgICAgIHJlbW90ZS5ibG9icy5nZXQoam9iLmlkKSxcbiAgICAgIC8vb25seSBhY2NlcHQgYmxvYnMgdGhhdCBoYXZlIHRoZSBjb3JyZWN0IHNpemUuXG4gICAgICBzYm90LmJsb2JzLmFkZChqb2IuaWQsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYoIWVycikge1xuICAgICAgICAgIGZpbmlzaEpvYihqb2IpXG4gICAgICAgICAgcmV0dXJuIGRvbmUoKSAvL3N1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgdGhlIHJlbW90ZSwgaXQgbWF5IGJlIG1pc2JlaGF2aW5nXG4gICAgICAgIGRlbGV0ZSBqb2IuaGFzW3JlbW90ZS5pZF1cbiAgICAgICAgLy8gcHV0IGl0IGJhY2sgb24gdGhlIGdldCBvciBoYXMgcXVldWVcbiAgICAgICAgaWYoT2JqZWN0LmtleXMoam9iLmhhcykubGVuZ3RoKSBnZXRRdWV1ZS5wdXNoKGpvYilcbiAgICAgICAgZWxzZSBoYXNRdWV1ZS5wdXNoKGpvYilcbiAgICAgICAgZG9uZSgpXG4gICAgICB9KVxuICAgIClcbiAgfSlcblxuICBmdW5jdGlvbiBnZXRQZWVyKGlkKSB7XG4gICAgcmV0dXJuIHNib3QucGVlcnNbaWRdICYmIHNib3QucGVlcnNbaWRdWzBdXG4gIH1cblxuICAvLyBtb25pdG9yIHRoZSBmZWVkIGZvciBuZXcgbGlua3MgdG8gYmxvYnNcbiAgcHVsbChcbiAgICBzYm90LmxpbmtzKHtkZXN0OiAnJicsIGxpdmU6IHRydWV9KSxcbiAgICBwdWxsLmRyYWluKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAvLyBkbyB3ZSBoYXZlIHRoZSByZWZlcmVuY2VkIGJsb2IgeWV0P1xuICAgICAgc2JvdC5ibG9icy5oYXMoZGF0YS5kZXN0LCBmdW5jdGlvbiAoXywgaGFzKSB7XG4gICAgICAgIGlmKCFoYXMpIGNyZWF0ZUpvYihkYXRhLmRlc3QsIGRhdGEuc291cmNlKVxuICAgICAgfSlcbiAgICB9KVxuICApXG5cbiAgLy9oYW5kbGUgd2VpcmQgZWRnZSBjYXNlIHdoZXJlIHNvbWV0aGluZyBpcyBhZGRlZCBsb2NhbGx5XG4gIC8vYnV0IHdlIGFyZSBhbHJlYWR5IGxvb2tpbmcgZm9yIGl0IGJlY2F1c2Ugd2Ugc2F3IGEgbGluay5cbiAgc2JvdC5vbignYmxvYnM6Z290JywgZnVuY3Rpb24gKGhhc2gpIHtcbiAgICBpZihqb2JzW2hhc2hdKSBqb2JzW2hhc2hdLmRvbmUgPSB0cnVlXG4gIH0pXG5cbiAgc2JvdC5vbigncnBjOmNvbm5lY3QnLCBmdW5jdGlvbiAocnBjKSB7XG4gICAgZm9yKGlkIGluIGpvYnMpXG4gICAgICBpZihmYWxzZSA9PT0gam9ic1tpZF0uaGFzW3JwYy5pZF0pXG4gICAgICAgIGRlbGV0ZSBqb2JzW2lkXS5oYXNbcnBjLmlkXVxuICB9KVxuXG4gIHJldHVybiB3bCA9IHtcbiAgICBoYXM6IGhhc1F1ZXVlLFxuICAgIGdldDogZ2V0UXVldWUsXG4gICAgd2FudDogZnVuY3Rpb24gKGlkLCBvd25lciwgY2IpIHtcbiAgICAgIGNyZWF0ZUpvYihpZCwgb3duZXIgfHwgc2JvdC5pZCwgY2IpXG4gICAgfSxcbiAgICBxdW90YTogZnVuY3Rpb24gKGlkKSB7XG4gICAgICB2YXIgbCA9IGxpbWl0Rm9yKGlkKSwgcSA9IHVzZXJRdW90YXNbaWRdIHx8IDBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbWl0OiBsLFxuICAgICAgICB1c2FnZTogcSxcbiAgICAgICAgaG9wczogaG9wcyhpZCksXG4gICAgICAgIHBlcmNlbnQ6ICgocS9sKSoxMDApLnRvUHJlY2lzaW9uKDQpKyclJ1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxuIiwidmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgdmFsaWQgPSByZXF1aXJlKCcuLi9saWIvdmFsaWRhdG9ycycpXG5cbmV4cG9ydHMubmFtZSA9ICdibG9jaydcbmV4cG9ydHMudmVyc2lvbiA9ICcxLjAuMCdcbmV4cG9ydHMubWFuaWZlc3QgPSB7XG4gIGlzQmxvY2tlZCAgOiAnc3luYycsXG59XG5cbmV4cG9ydHMuaW5pdCA9IGZ1bmN0aW9uIChzYm90KSB7XG5cbiAgLy9UT0RPOiBtb3ZlIG90aGVyIGJsb2NraW5nIGNvZGUgaW4gaGVyZSxcbiAgLy8gICAgICBpIHRoaW5rIHdlJ2xsIG5lZWQgYSBob29rIHN5c3RlbSBmb3IgdGhpcy5cblxuICAvL2lmIGEgY3VycmVudGx5IGNvbm5lY3RlZCBwZWVyIGlzIGJsb2NrZWQsIGRpc2Nvbm5lY3QgdGhlbSBpbW1lZGlhdGVseS5cbiAgcHVsbChcbiAgICBzYm90LmZyaWVuZHMuY3JlYXRlRnJpZW5kU3RyZWFtKHtncmFwaDogJ2ZsYWcnLCBsaXZlOiB0cnVlfSksXG4gICAgcHVsbC5kcmFpbihmdW5jdGlvbiAoYmxvY2tlZCkge1xuICAgICAgaWYoc2JvdC5wZWVyc1tibG9ja2VkXSkge1xuICAgICAgICBzYm90LnBlZXJzW2Jsb2NrZWRdLmZvckVhY2goZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgICBiLmNsb3NlKHRydWUsIGZ1bmN0aW9uICgpIHt9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIClcblxuICBmdW5jdGlvbiBpc0Jsb2NrZWQgKF9vcHRzKSB7XG4gICAgdmFyIG9wdHNcblxuICAgIGlmKCdzdHJpbmcnID09PSB0eXBlb2YgX29wdHMpXG4gICAgICBvcHRzID0ge1xuICAgICAgICBzb3VyY2U6IHNib3QuaWQsIGRlc3Q6IF9vcHRzLCBncmFwaDonZmxhZydcbiAgICAgIH1cbiAgICBlbHNlIG9wdHMgPSB7XG4gICAgICBzb3VyY2U6IF9vcHRzLnNvdXJjZSwgZGVzdDogX29wdHMuZGVzdCwgZ3JhcGg6ICdmbGFnJ1xuICAgIH1cbiAgICByZXR1cm4gc2JvdC5mcmllbmRzLmdldChvcHRzKVxuICB9XG5cbiAgc2JvdC5jcmVhdGVIaXN0b3J5U3RyZWFtLmhvb2soZnVuY3Rpb24gKGZuLCBhcmdzKSB7XG4gICAgdmFyIG9wdHMgPSBhcmdzWzBdLCBpZCA9IHRoaXMuaWRcbiAgICBpZihvcHRzLmlkICE9PSB0aGlzLmlkICYmIGlzQmxvY2tlZCh7c291cmNlOiBvcHRzLmlkLCBkZXN0OiB0aGlzLmlkfSkpXG4gICAgICByZXR1cm4gZm4oe2lkOiBudWxsLCBzZXF1ZW5jZTogMH0pXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHB1bGwoXG4gICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3MpLFxuICAgICAgICAvL2JyZWFrIG9mZiB0aGlzIGZlZWQgaWYgdGhleSBzdWRkZW5seSBibG9ja1xuICAgICAgICAvL3RoZSByZWNpcGllbnQuXG4gICAgICAgIHB1bGwudGFrZShmdW5jdGlvbiAobXNnKSB7XG4gICAgICAgICAgLy9oYW5kbGUgd2hlbiBjcmVhdGVIaXN0b3J5U3RyZWFtIGlzIGNhbGxlZCB3aXRoIGtleXM6IHRydWVcbiAgICAgICAgICBpZighbXNnLmNvbnRlbnQgJiYgbXNnLnZhbHVlLmNvbnRlbnQpXG4gICAgICAgICAgICBtc2cgPSBtc2cudmFsdWVcbiAgICAgICAgICBpZihtc2cuY29udGVudC50eXBlICE9PSAnY29udGFjdCcpIHJldHVybiB0cnVlXG4gICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICBtc2cuY29udGVudC5mbGFnZ2VkICYmXG4gICAgICAgICAgICBtc2cuY29udGVudC5jb250YWN0ID09PSBpZFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIClcbiAgfSlcblxuICBzYm90LmF1dGguaG9vayhmdW5jdGlvbiAoZm4sIGFyZ3MpIHtcbiAgICBpZihpc0Jsb2NrZWQoYXJnc1swXSkpIGFyZ3NbMV0obmV3IEVycm9yKCdjbGllbnQgaXMgYmxvY2tlZCcpKVxuICAgIGVsc2UgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gIH0pXG5cbiAgcmV0dXJuIHtpc0Jsb2NrZWQ6IHZhbGlkLnN5bmMoaXNCbG9ja2VkLCAnZmVlZElkfGlzQmxvY2tlZE9wdHMnKSB9XG5cbn1cbiIsInZhciBHcmFwaG1pdHRlciA9IHJlcXVpcmUoJ2dyYXBobWl0dGVyJylcbnZhciBwdWxsICAgICAgICA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcbnZhciBtbGliICAgICAgICA9IHJlcXVpcmUoJ3NzYi1tc2dzJylcbnZhciBtZW12aWV3ICAgICA9IHJlcXVpcmUoJ2xldmVsLW1lbXZpZXcnKVxudmFyIHB1c2hhYmxlICAgID0gcmVxdWlyZSgncHVsbC1wdXNoYWJsZScpXG52YXIgbWRtICAgICAgICAgPSByZXF1aXJlKCdtZG1hbmlmZXN0JylcbnZhciB2YWxpZCAgICAgICA9IHJlcXVpcmUoJy4uL2xpYi92YWxpZGF0b3JzJylcbnZhciBhcGlkb2MgICAgICA9IHJlcXVpcmUoJy4uL2xpYi9hcGlkb2NzJykuZnJpZW5kc1xuXG4vLyBmcmllbmRzIHBsdWdpblxuLy8gbWV0aG9kcyB0byBhbmFseXplIHRoZSBzb2NpYWwgZ3JhcGhcbi8vIG1haW50YWlucyBhICdmb2xsb3cnIGFuZCAnZmxhZycgZ3JhcGhcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAoZikge1xuICByZXR1cm4gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcgKHMpIHtcbiAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2Ygc1xufVxuXG5leHBvcnRzLm5hbWUgPSAnZnJpZW5kcydcbmV4cG9ydHMudmVyc2lvbiA9ICcxLjAuMCdcbmV4cG9ydHMubWFuaWZlc3QgPSBtZG0ubWFuaWZlc3QoYXBpZG9jKVxuXG5leHBvcnRzLmluaXQgPSBmdW5jdGlvbiAoc2JvdCwgY29uZmlnKSB7XG5cbiAgdmFyIGdyYXBocyA9IHtcbiAgICBmb2xsb3c6IG5ldyBHcmFwaG1pdHRlcigpLFxuICAgIGZsYWc6IG5ldyBHcmFwaG1pdHRlcigpXG4gIH1cblxuICAvLyB2aWV3IHByb2Nlc3NvclxuICB2YXIgc3luY0NicyA9IFtdXG4gIGZ1bmN0aW9uIGF3YWl0U3luYyAoY2IpIHtcbiAgICBpZiAoc3luY0Nicykgc3luY0Nicy5wdXNoKGNiKVxuICAgIGVsc2UgY2IoKVxuICB9XG5cbiAgLy8gcmVhZC93YXRjaCB0aGUgbG9nIGZvciBjaGFuZ2VzIHRvIHRoZSBzb2NpYWwgZ3JhcGhcbiAgcHVsbChzYm90LmNyZWF0ZUxvZ1N0cmVhbSh7IGxpdmU6IHRydWUgfSksIHB1bGwuZHJhaW4oZnVuY3Rpb24gKG1zZykge1xuXG4gICAgaWYgKG1zZy5zeW5jKSB7XG4gICAgICBzeW5jQ2JzLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7IGNiKCkgfSlcbiAgICAgIHN5bmNDYnMgPSBudWxsXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgYyA9IG1zZy52YWx1ZS5jb250ZW50XG4gICAgaWYgKGMudHlwZSA9PSAnY29udGFjdCcpIHtcbiAgICAgIG1saWIuYXNMaW5rcyhjLmNvbnRhY3QpLmZvckVhY2goZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgICAgaWYgKCdmb2xsb3dpbmcnIGluIGMpIHtcbiAgICAgICAgICBpZiAoYy5mb2xsb3dpbmcpXG4gICAgICAgICAgICBncmFwaHMuZm9sbG93LmVkZ2UobXNnLnZhbHVlLmF1dGhvciwgbGluay5saW5rLCB0cnVlKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGdyYXBocy5mb2xsb3cuZGVsKG1zZy52YWx1ZS5hdXRob3IsIGxpbmsubGluaylcblxuICAgICAgICB9XG4gICAgICAgIGlmICgnZmxhZ2dlZCcgaW4gYykge1xuICAgICAgICAgIGlmIChjLmZsYWdnZWQpXG4gICAgICAgICAgICBncmFwaHMuZmxhZy5lZGdlKG1zZy52YWx1ZS5hdXRob3IsIGxpbmsubGluaywgYy5mbGFnZ2VkKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGdyYXBocy5mbGFnLmRlbChtc2cudmFsdWUuYXV0aG9yLCBsaW5rLmxpbmspXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9KSlcblxuICByZXR1cm4ge1xuXG4gICAgZ2V0OiB2YWxpZC5zeW5jKGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICB2YXIgZyA9IGdyYXBoc1tvcHRzLmdyYXBoIHx8ICdmb2xsb3cnXVxuICAgICAgaWYoIWcpIHRocm93IG5ldyBFcnJvcignb3B0cy5ncmFwaCBtdXN0IGJlIHByb3ZpZGVkJylcbiAgICAgIHJldHVybiBnLmdldChvcHRzLnNvdXJjZSwgb3B0cy5kZXN0KVxuICAgIH0sICdvYmplY3Q/JyksXG5cbiAgICBhbGw6IHZhbGlkLmFzeW5jKGZ1bmN0aW9uIChncmFwaCwgY2IpIHtcbiAgICAgIGlmICh0eXBlb2YgZ3JhcGggPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IGdyYXBoXG4gICAgICAgIGdyYXBoID0gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKCFncmFwaClcbiAgICAgICAgZ3JhcGggPSAnZm9sbG93J1xuICAgICAgYXdhaXRTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2IobnVsbCwgZ3JhcGhzW2dyYXBoXSA/IGdyYXBoc1tncmFwaF0udG9KU09OKCkgOiBudWxsKVxuICAgICAgfSlcbiAgICB9LCAnc3RyaW5nPycpLFxuXG4gICAgcGF0aDogdmFsaWQuc3luYyhmdW5jdGlvbiAob3B0cykge1xuICAgICAgaWYoaXNTdHJpbmcob3B0cykpXG4gICAgICAgIG9wdHMgPSB7c291cmNlOiBzYm90LmlkLCBkZXN0OiBvcHRzfVxuICAgICAgcmV0dXJuIGdyYXBocy5mb2xsb3cucGF0aChvcHRzKVxuXG4gICAgfSwgJ3N0cmluZ3xvYmplY3QnKSxcbiAgICBcbiAgICBjcmVhdGVGcmllbmRTdHJlYW06IHZhbGlkLnNvdXJjZShmdW5jdGlvbiAob3B0cykge1xuICAgICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICAgIHZhciBsaXZlID0gb3B0cy5saXZlID09PSB0cnVlXG4gICAgICB2YXIgbWV0YSA9IG9wdHMubWV0YSA9PT0gdHJ1ZVxuICAgICAgdmFyIHN0YXJ0ID0gb3B0cy5zdGFydCB8fCBzYm90LmlkXG4gICAgICB2YXIgZ3JhcGggPSBncmFwaHNbb3B0cy5ncmFwaCB8fCAnZm9sbG93J11cbiAgICAgIGlmKCFncmFwaClcbiAgICAgICAgcmV0dXJuIHB1bGwuZXJyb3IobmV3IEVycm9yKCd1bmtub3duIGdyYXBoOicgKyBvcHRzLmdyYXBoKSlcbiAgICAgIHZhciBjYW5jZWwsIHBzID0gcHVzaGFibGUoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYW5jZWwgJiYgY2FuY2VsKClcbiAgICAgIH0pXG5cbiAgICAgIGZ1bmN0aW9uIHB1c2ggKHRvLCBob3BzKSB7XG4gICAgICAgIHJldHVybiBwcy5wdXNoKG1ldGEgPyB7aWQ6IHRvLCBob3BzOiBob3BzfSA6IHRvKVxuICAgICAgfVxuXG4gICAgICAvL2J5IGRlZmF1bHQsIGFsc28gZW1pdCB5b3VyIG93biBrZXkuXG4gICAgICBpZihvcHRzLnNlbGYgIT09IGZhbHNlKVxuICAgICAgICBwdXNoKHN0YXJ0LCAwKVxuXG4gICAgICB2YXIgY29uZiA9IGNvbmZpZy5mcmllbmRzIHx8IHt9XG4gICAgICBjYW5jZWwgPSBncmFwaC50cmF2ZXJzZSh7XG4gICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgaG9wczogb3B0cy5ob3BzIHx8IGNvbmYuaG9wcyB8fCAzLFxuICAgICAgICBtYXg6IG9wdHMuZHVuYmFyIHx8IGNvbmYuZHVuYmFyIHx8IDE1MCxcbiAgICAgICAgZWFjaDogZnVuY3Rpb24gKF8sIHRvLCBob3BzKSB7XG4gICAgICAgICAgaWYodG8gIT09IHN0YXJ0KSBwdXNoKHRvLCBob3BzKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZighbGl2ZSkgeyBjYW5jZWwoKTsgcHMuZW5kKCkgfVxuXG4gICAgICByZXR1cm4gcHNcbiAgICB9LCAnY3JlYXRlRnJpZW5kU3RyZWFtT3B0cz8nKSxcblxuICAgIGhvcHM6IHZhbGlkLmFzeW5jKGZ1bmN0aW9uIChzdGFydCwgZ3JhcGgsIG9wdHMsIGNiKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMgPT0gJ2Z1bmN0aW9uJykgeyAvLyAoc3RhcnR8b3B0cywgZ3JhcGgsIGNiKVxuICAgICAgICBjYiA9IG9wdHNcbiAgICAgICAgb3B0cyA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGdyYXBoID09ICdmdW5jdGlvbicpIHsgLy8gKHN0YXJ0fG9wdHMsIGNiKVxuICAgICAgICBjYiA9IGdyYXBoXG4gICAgICAgIG9wdHMgPSBncmFwaCA9IG51bGxcbiAgICAgIH1cbiAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG4gICAgICBpZihpc1N0cmluZyhzdGFydCkpIHsgLy8gKHN0YXJ0LCAuLi4pXG4gICAgICAgIC8vIGZpcnN0IGFyZyBpcyBpZCBzdHJpbmdcbiAgICAgICAgb3B0cy5zdGFydCA9IHN0YXJ0XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0ICYmIHR5cGVvZiBzdGFydCA9PSAnb2JqZWN0JykgeyAvLyAob3B0cywgLi4uKVxuICAgICAgICAvLyBmaXJzdCBhcmcgaXMgb3B0c1xuICAgICAgICBmb3IgKHZhciBrIGluIHN0YXJ0KVxuICAgICAgICAgIG9wdHNba10gPSBzdGFydFtrXVxuICAgICAgfVxuXG4gICAgICB2YXIgY29uZiA9IGNvbmZpZy5mcmllbmRzIHx8IHt9XG4gICAgICBvcHRzLnN0YXJ0ICA9IG9wdHMuc3RhcnQgIHx8IHNib3QuaWRcbiAgICAgIG9wdHMuZHVuYmFyID0gb3B0cy5kdW5iYXIgfHwgY29uZi5kdW5iYXIgfHwgMTUwXG4gICAgICBvcHRzLmhvcHMgICA9IG9wdHMuaG9wcyAgIHx8IGNvbmYuaG9wcyAgIHx8IDNcblxuICAgICAgdmFyIGcgPSBncmFwaHNbZ3JhcGggfHwgJ2ZvbGxvdyddXG4gICAgICBpZiAoIWcpXG4gICAgICAgIHJldHVybiBjYihuZXcgRXJyb3IoJ0ludmFsaWQgZ3JhcGggdHlwZTogJytncmFwaCkpXG5cbiAgICAgIGF3YWl0U3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNiKG51bGwsIGcudHJhdmVyc2Uob3B0cykpXG4gICAgICB9KVxuICAgIH0sIFsnZmVlZElkJywgJ3N0cmluZz8nLCAnb2JqZWN0PyddLCBbJ2NyZWF0ZUZyaWVuZFN0cmVhbU9wdHMnXSlcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG52YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcbnZhciBOb3RpZnkgPSByZXF1aXJlKCdwdWxsLW5vdGlmeScpXG52YXIgdG9BZGRyZXNzID0gcmVxdWlyZSgnLi4vLi4vbGliL3V0aWwnKS50b0FkZHJlc3NcbnZhciBtZG0gPSByZXF1aXJlKCdtZG1hbmlmZXN0JylcbnZhciB2YWxpZCA9IHJlcXVpcmUoJy4uLy4uL2xpYi92YWxpZGF0b3JzJylcbnZhciBhcGlkb2MgPSByZXF1aXJlKCcuLi8uLi9saWIvYXBpZG9jcycpLmdvc3NpcFxudmFyIHUgPSByZXF1aXJlKCcuLi8uLi9saWIvdXRpbCcpXG52YXIgcGluZyA9IHJlcXVpcmUoJ3B1bGwtcGluZycpXG52YXIgU3RhdHMgPSByZXF1aXJlKCdzdGF0aXN0aWNzJylcbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheVxudmFyIFNjaGVkdWxlID0gcmVxdWlyZSgnLi9zY2hlZHVsZScpXG52YXIgSW5pdCA9IHJlcXVpcmUoJy4vaW5pdCcpXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuICdmdW5jdGlvbicgPT09IHR5cGVvZiBmXG59XG5cbi8qXG5QZWVycyA6IFt7XG4gIGtleTogaWQsXG4gIGhvc3Q6IGlwLFxuICBwb3J0OiBpbnQsXG4gIC8vdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBwYXRjaHdvcmsuLi5cbiAgYW5ub3VuY2Vyczoge2xlbmd0aDogaW50fVxuICBzb3VyY2U6ICdwdWInfCdtYW51YWwnfCdsb2NhbCdcbn1dXG4qL1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBuYW1lOiAnZ29zc2lwJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWFuaWZlc3Q6IG1kbS5tYW5pZmVzdChhcGlkb2MpLFxuICBwZXJtaXNzaW9uczoge1xuICAgIGFub255bW91czoge2FsbG93OiBbJ3BpbmcnXX1cbiAgfSxcbiAgaW5pdDogZnVuY3Rpb24gKHNlcnZlciwgY29uZmlnKSB7XG4gICAgdmFyIG5vdGlmeSA9IE5vdGlmeSgpXG4gICAgdmFyIGNvbmYgPSBjb25maWcuZ29zc2lwIHx8IHt9XG4gICAgdmFyIGhvbWUgPSB1LnRvQWRkcmVzcyhzZXJ2ZXIuZ2V0QWRkcmVzcygpKVxuXG4gICAgLy9Lbm93biBQZWVyc1xuICAgIHZhciBwZWVycyA9IFtdXG5cbiAgICBmdW5jdGlvbiBnZXRQZWVyKGlkKSB7XG4gICAgICByZXR1cm4gdS5maW5kKHBlZXJzLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSAmJiBlLmtleSA9PT0gaWRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdmFyIHRpbWVyX3BpbmcgPSA1KjZlNFxuXG4gICAgdmFyIGdvc3NpcCA9IHtcbiAgICAgIHBlZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBwZWVyc1xuICAgICAgfSxcbiAgICAgIGdldDogZnVuY3Rpb24gKGFkZHIpIHtcbiAgICAgICAgYWRkciA9IHUudG9BZGRyZXNzKGFkZHIpXG4gICAgICAgIHJldHVybiB1LmZpbmQocGVlcnMsIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGFkZHIucG9ydCA9PT0gYS5wb3J0XG4gICAgICAgICAgICAmJiBhZGRyLmhvc3QgPT09IGEuaG9zdFxuICAgICAgICAgICAgJiYgYWRkci5rZXkgPT09IGEua2V5XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIGNvbm5lY3Q6IHZhbGlkLmFzeW5jKGZ1bmN0aW9uIChhZGRyLCBjYikge1xuICAgICAgICBhZGRyID0gdS50b0FkZHJlc3MoYWRkcilcbiAgICAgICAgaWYgKCFhZGRyIHx8IHR5cGVvZiBhZGRyICE9ICdvYmplY3QnKVxuICAgICAgICAgIHJldHVybiBjYihuZXcgRXJyb3IoJ2ZpcnN0IHBhcmFtIG11c3QgYmUgYW4gYWRkcmVzcycpKVxuXG4gICAgICAgIGlmKCFhZGRyLmtleSkgcmV0dXJuIGNiKG5ldyBFcnJvcignYWRkcmVzcyBtdXN0IGhhdmUgZWQyNTUxOSBrZXknKSlcbiAgICAgICAgLy8gYWRkIHBlZXIgdG8gdGhlIHRhYmxlLCBpbmNhc2UgaXQgaXNuJ3QgYWxyZWFkeS5cbiAgICAgICAgZ29zc2lwLmFkZChhZGRyLCAnbWFudWFsJylcbiAgICAgICAgdmFyIHAgPSBnb3NzaXAuZ2V0KGFkZHIpXG4gICAgICAgIGlmKCFwKSByZXR1cm4gY2IoKVxuXG4gICAgICAgIHAuc3RhdGVDaGFuZ2UgPSBEYXRlLm5vdygpXG4gICAgICAgIHAuc3RhdGUgPSAnY29ubmVjdGluZydcbiAgICAgICAgc2VydmVyLmNvbm5lY3QocCwgZnVuY3Rpb24gKGVyciwgcnBjKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcC5zdGF0ZSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgcC5mYWlsdXJlID0gKHAuZmFpbHVyZSB8fCAwKSArIDFcbiAgICAgICAgICAgIHAuc3RhdGVDaGFuZ2UgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBub3RpZnkoeyB0eXBlOiAnY29ubmVjdC1mYWlsdXJlJywgcGVlcjogcCB9KVxuICAgICAgICAgICAgc2VydmVyLmVtaXQoJ2xvZzppbmZvJywgWydTQk9UJywgcC5ob3N0Kyc6JytwLnBvcnQrcC5rZXksICdjb25uZWN0aW9uIGZhaWxlZCcsIGVyci5tZXNzYWdlIHx8IGVycl0pXG4gICAgICAgICAgICBwLmR1cmF0aW9uLnZhbHVlKDApXG4gICAgICAgICAgICByZXR1cm4gKGNiICYmIGNiKGVycikpXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcC5zdGF0ZSA9ICdjb25uZWN0ZWQnXG4gICAgICAgICAgICBwLmZhaWx1cmUgPSAwXG4gICAgICAgICAgfVxuICAgICAgICAgIGNiICYmIGNiKG51bGwsIHJwYylcbiAgICAgICAgfSlcblxuICAgICAgfSwgJ3N0cmluZ3xvYmplY3QnKSxcblxuICAgICAgZGlzY29ubmVjdDogdmFsaWQuYXN5bmMoZnVuY3Rpb24gKGFkZHIsIGNiKSB7XG4gICAgICAgIHZhciBwZWVyID0gdGhpcy5nZXQoYWRkcilcblxuICAgICAgICBwZWVyLnN0YXRlID0gJ2Rpc2Nvbm5lY3RpbmcnXG4gICAgICAgIHBlZXIuc3RhdGVDaGFuZ2UgPSBEYXRlLm5vdygpXG4gICAgICAgIGlmKCFwZWVyIHx8ICFwZWVyLmRpc2Nvbm5lY3QpIGNiICYmIGNiKClcbiAgICAgICAgZWxzZSBwZWVyLmRpc2Nvbm5lY3QodHJ1ZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIHBlZXIuc3RhdGVDaGFuZ2UgPSBEYXRlLm5vdygpXG4gICAgICAgIH0pXG5cbiAgICAgIH0sICdzdHJpbmd8b2JqZWN0JyksXG5cbiAgICAgIGNoYW5nZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5vdGlmeS5saXN0ZW4oKVxuICAgICAgfSxcbiAgICAgIC8vYWRkIGFuIGFkZHJlc3MgdG8gdGhlIHBlZXIgdGFibGUuXG4gICAgICBhZGQ6IHZhbGlkLnN5bmMoZnVuY3Rpb24gKGFkZHIsIHNvdXJjZSkge1xuICAgICAgICBhZGRyID0gdS50b0FkZHJlc3MoYWRkcilcbiAgICAgICAgaWYoIXUuaXNBZGRyZXNzKGFkZHIpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGEgdmFsaWQgYWRkcmVzczonICsgSlNPTi5zdHJpbmdpZnkoYWRkcikpXG4gICAgICAgIC8vIGNoZWNrIHRoYXQgdGhpcyBpcyBhIHZhbGlkIGFkZHJlc3MsIGFuZCBub3QgcG9pbnRpbmcgYXQgc2VsZi5cblxuICAgICAgICBpZihhZGRyLmtleSA9PT0gaG9tZS5rZXkpIHJldHVyblxuICAgICAgICBpZihhZGRyLmhvc3QgPT09IGhvbWUuaG9zdCAmJiBhZGRyLnBvcnQgPT09IGhvbWUucG9ydCkgcmV0dXJuXG5cbiAgICAgICAgdmFyIGYgPSBnb3NzaXAuZ2V0KGFkZHIpXG5cbiAgICAgICAgaWYoIWYpIHtcbiAgICAgICAgICAvLyBuZXcgcGVlclxuICAgICAgICAgIGFkZHIuc291cmNlID0gc291cmNlXG4gICAgICAgICAgYWRkci5hbm5vdW5jZXJzID0gMVxuICAgICAgICAgIGFkZHIuZHVyYXRpb24gPSBTdGF0cygpXG4gICAgICAgICAgcGVlcnMucHVzaChhZGRyKVxuICAgICAgICAgIG5vdGlmeSh7IHR5cGU6ICdkaXNjb3ZlcicsIHBlZXI6IGFkZHIsIHNvdXJjZTogc291cmNlIHx8ICdtYW51YWwnIH0pXG4gICAgICAgICAgcmV0dXJuIGFkZHJcbiAgICAgICAgfVxuICAgICAgICAvL2Rvbid0IGNvdW50IGxvY2FsIG92ZXIgYW5kIG92ZXJcbiAgICAgICAgZWxzZSBpZihmLnNvdXJjZSAhPSAnbG9jYWwnKVxuICAgICAgICAgIGYuYW5ub3VuY2VycyArK1xuXG4gICAgICAgIHJldHVybiBmXG4gICAgICB9LCAnc3RyaW5nfG9iamVjdCcsICdzdHJpbmc/JyksXG4gICAgICBwaW5nOiBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB2YXIgdGltZW91dCA9IGNvbmZpZy50aW1lcnMgJiYgY29uZmlnLnRpbWVycy5waW5nIHx8IDUqNjBlM1xuICAgICAgICAvL2JldHdlZW4gMTAgc2Vjb25kcyBhbmQgMzAgbWludXRlcywgZGVmYXVsdCA1IG1pblxuICAgICAgICB0aW1lb3V0ID0gTWF0aC5tYXgoMTBlMywgTWF0aC5taW4odGltZW91dCwgMzAqNjBlMykpXG4gICAgICAgIHJldHVybiBwaW5nKHt0aW1lb3V0OiB0aW1lb3V0fSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBTY2hlZHVsZSAoZ29zc2lwLCBjb25maWcsIHNlcnZlcilcbiAgICBJbml0IChnb3NzaXAsIGNvbmZpZywgc2VydmVyKVxuICAgIC8vZ2V0IGN1cnJlbnQgc3RhdGVcblxuICAgIHNlcnZlci5vbigncnBjOmNvbm5lY3QnLCBmdW5jdGlvbiAocnBjLCBpc0NsaWVudCkge1xuICAgICAgdmFyIHBlZXIgPSBnZXRQZWVyKHJwYy5pZClcbiAgICAgIC8vZG9uJ3QgdHJhY2sgY2xpZW50cyB0aGF0IGNvbm5lY3QsIGJ1dCBhcm4ndCBjb25zaWRlcmVkIHBlZXJzLlxuICAgICAgLy9tYXliZSB3ZSBzaG91bGQgdGhvdWdoP1xuICAgICAgaWYoIXBlZXIpIHJldHVyblxuICAgICAgY29uc29sZS5sb2coJytjb25uZWN0ZWQnLCB1LnN0cmluZ2lmeUFkZHJlc3MocGVlcikpXG4gICAgICAvL21lYW5zIHRoYXQgd2UgaGF2ZSBjcmVhdGVkIHRoaXMgY29ubmVjdGlvbiwgbm90IHJlY2VpdmVkIGl0LlxuICAgICAgcGVlci5jbGllbnQgPSAhIWlzQ2xpZW50XG4gICAgICBwZWVyLnN0YXRlID0gJ2Nvbm5lY3RlZCdcbiAgICAgIHBlZXIuc3RhdGVDaGFuZ2UgPSBEYXRlLm5vdygpXG4gICAgICBwZWVyLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICAgICAgICBpZihpc0Z1bmN0aW9uKGVycikpIGNiID0gZXJyLCBlcnIgPSBudWxsXG4gICAgICAgIHJwYy5jbG9zZShlcnIsIGNiKVxuICAgICAgfVxuXG4gICAgICBpZihpc0NsaWVudCkge1xuICAgICAgICAvL2RlZmF1bHQgcGluZyBpcyA1IG1pbnV0ZXMuLi5cbiAgICAgICAgdmFyIHBwID0gcGluZyh7c2VydmU6IHRydWUsIHRpbWVvdXQ6IHRpbWVyX3Bpbmd9LCBmdW5jdGlvbiAoXykge30pXG4gICAgICAgIHBlZXIucGluZyA9IHtydHQ6IHBwLnJ0dCwgc2tldzogcHAuc2tld31cbiAgICAgICAgcHVsbChcbiAgICAgICAgICBwcCxcbiAgICAgICAgICBycGMuZ29zc2lwLnBpbmcoe3RpbWVvdXQ6IHRpbWVyX3Bpbmd9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBpZihlcnIubmFtZSA9PT0gJ1R5cGVFcnJvcicpIHBlZXIucGluZy5mYWlsID0gdHJ1ZVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHBwXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcnBjLm9uKCdjbG9zZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctZGlzY29ubmVjdGVkJywgdS5zdHJpbmdpZnlBZGRyZXNzKHBlZXIpKVxuICAgICAgICAvL3RyYWNrIHdoZXRoZXIgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgY29ubmVjdGVkLlxuICAgICAgICAvL29yIGhvdyBtYW55IGZhaWx1cmVzIHRoZXJlIGhhdmUgYmVlbi5cbiAgICAgICAgdmFyIHNpbmNlID0gcGVlci5zdGF0ZUNoYW5nZVxuICAgICAgICBwZWVyLnN0YXRlQ2hhbmdlID0gRGF0ZS5ub3coKVxuICAgICAgICBpZihwZWVyLnN0YXRlID09PSAnY29ubmVjdGVkJykgLy9tYXkgYmUgXCJkaXNjb25uZWN0aW5nXCJcbiAgICAgICAgICBwZWVyLmR1cmF0aW9uLnZhbHVlKHBlZXIuc3RhdGVDaGFuZ2UgLSBzaW5jZSlcbiAgICAgICAgcGVlci5zdGF0ZSA9IHVuZGVmaW5lZFxuICAgICAgICBub3RpZnkoeyB0eXBlOiAnZGlzY29ubmVjdCcsIHBlZXI6IHBlZXIgfSlcbiAgICAgICAgc2VydmVyLmVtaXQoJ2xvZzppbmZvJywgWydTQk9UJywgcnBjLmlkLCAnZGlzY29ubmVjdCddKVxuICAgICAgfSlcblxuICAgICAgbm90aWZ5KHsgdHlwZTogJ2Nvbm5lY3QnLCBwZWVyOiBwZWVyIH0pXG4gICAgfSlcblxuICAgIHJldHVybiBnb3NzaXBcbiAgfVxufVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4iLCJ2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXlcbnZhciBwdWxsID0gcmVxdWlyZSgncHVsbC1zdHJlYW0nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChnb3NzaXAsIGNvbmZpZywgc2VydmVyKSB7XG5cbiAgLy8gcG9wdWxhdGUgcGVlcnRhYmxlIHdpdGggY29uZmlndXJlZCBzZWVkcyAobWFpbmx5IHVzZWQgaW4gdGVzdGluZylcbiAgdmFyIHNlZWRzID0gY29uZmlnLnNlZWRzXG5cbiAgOyhpc0FycmF5KHNlZWRzKSAgPyBzZWVkcyA6IFtzZWVkc10pLmZpbHRlcihCb29sZWFuKVxuICAuZm9yRWFjaChmdW5jdGlvbiAoYWRkcikgeyBnb3NzaXAuYWRkKGFkZHIsICdzZWVkJykgfSlcblxuICAvLyBwb3B1bGF0ZSBwZWVydGFibGUgd2l0aCBwdWIgYW5ub3VuY2VtZW50cyBvbiB0aGUgZmVlZFxuICBwdWxsKFxuICAgIHNlcnZlci5tZXNzYWdlc0J5VHlwZSh7XG4gICAgICB0eXBlOiAncHViJywgbGl2ZTogdHJ1ZSwga2V5czogZmFsc2VcbiAgICB9KSxcbiAgICBwdWxsLmRyYWluKGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgIGlmKCFtc2cuY29udGVudC5hZGRyZXNzKSByZXR1cm5cbiAgICAgIGdvc3NpcC5hZGQobXNnLmNvbnRlbnQuYWRkcmVzcywgJ3B1YicpXG4gICAgfSlcbiAgKVxuXG4gIC8vIHBvcHVsYXRlIHBlZXJ0YWJsZSB3aXRoIGFubm91bmNlbWVudHMgb24gdGhlIExBTiBtdWx0aWNhc3RcbiAgc2VydmVyLm9uKCdsb2NhbCcsIGZ1bmN0aW9uIChfcGVlcikge1xuICAgIGdvc3NpcC5hZGQoX3BlZXIsICdsb2NhbCcpXG4gIH0pXG5cbn1cblxuXG5cbiIsInZhciBub25Qcml2YXRlID0gcmVxdWlyZSgnbm9uLXByaXZhdGUtaXAnKVxudmFyIGlwID0gcmVxdWlyZSgnaXAnKVxudmFyIG9uV2FrZXVwID0gcmVxdWlyZSgnb24td2FrZXVwJylcbnZhciBTdGF0cyA9IHJlcXVpcmUoJ3N0YXRpc3RpY3MnKVxudmFyIG9zID0gcmVxdWlyZSgnb3MnKVxudmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgdSA9IHJlcXVpcmUoJy4uLy4uL2xpYi91dGlsJylcblxuZnVuY3Rpb24gcmFuZChhcnJheSkge1xuICByZXR1cm4gYXJyYXlbfn4oTWF0aC5yYW5kb20oKSphcnJheS5sZW5ndGgpXVxufVxuXG5mdW5jdGlvbiBub3QgKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gIWZuKGUpIH1cbn1cblxuZnVuY3Rpb24gYW5kICgpIHtcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBhcmdzLmV2ZXJ5KGZ1bmN0aW9uIChmbikgeyByZXR1cm4gZm4uY2FsbChudWxsLCB2YWx1ZSkgfSlcbiAgfVxufVxuXG4vL21pbiBkZWxheSAoZGVsYXkgc2luY2UgbGFzdCBkaXNjb25uZWN0IG9mIG1vc3QgcmVjZW50IHBlZXIgaW4gdW5jb25uZWN0ZWQgc2V0KVxuLy91bmNvbm5lY3RlZCBmaWx0ZXIgZGVsYXkgcGVlciA8IG1pbiBkZWxheVxuZnVuY3Rpb24gZGVsYXkgKGZhaWx1cmVzLCBmYWN0b3IsIG1heCkge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5wb3coMiwgZmFpbHVyZXMpKmZhY3RvciwgbWF4IHx8IEluZmluaXR5KVxufVxuXG5mdW5jdGlvbiBtYXhTdGF0ZUNoYW5nZSAoTSwgZSkge1xuICByZXR1cm4gTWF0aC5tYXgoTSwgZS5zdGF0ZUNoYW5nZSB8fCAwKVxufVxuXG5mdW5jdGlvbiBwZWVyTmV4dChwZWVyLCBvcHRzKSB7XG4gIHJldHVybiAocGVlci5zdGF0ZUNoYW5nZXwwKSArIGRlbGF5KHBlZXIuZmFpbHVyZXwwLCBvcHRzLmZhY3Rvciwgb3B0cy5tYXgpXG59XG5cblxuLy9kZXRlY3QgaWYgbm90IGNvbm5lY3RlZCB0byB3aWZpIG9yIG90aGVyIG5ldHdvcmtcbi8vKGkuZS4gaWYgdGhlcmUgaXMgb25seSBsb2NhbGhvc3QpXG5cbmZ1bmN0aW9uIGlzT2ZmbGluZSAoKSB7XG4gIHZhciBsbyA9IE9iamVjdC5rZXlzKG9zLm5ldHdvcmtJbnRlcmZhY2VzKCkpXG4gIHJldHVybiBsby5sZW5ndGggPT09IDEgJiYgbG9bMF0gPT09ICdsbydcbn1cblxudmFyIGlzT25saW5lID0gbm90KGlzT2ZmbGluZSlcblxuZnVuY3Rpb24gaXNMb2NhbCAoZSkge1xuICByZXR1cm4gaXAuaXNQcml2YXRlKGUuaG9zdClcbn1cblxuZnVuY3Rpb24gaXNVbmF0dGVtcHRlZCAoZSkge1xuICByZXR1cm4gIWUuc3RhdGVDaGFuZ2Vcbn1cblxuLy9zZWxlY3QgcGVlcnMgd2hpY2ggaGF2ZSBuZXZlciBiZWVuIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8geWV0LFxuLy9idXQgaGF2ZSBiZWVuIHRyaWVkLlxuZnVuY3Rpb24gaXNJbmFjdGl2ZSAoZSkge1xuICByZXR1cm4gZS5zdGF0ZUNoYW5nZSAmJiBlLmR1cmF0aW9uLm1lYW4gPT0gMFxufVxuXG5mdW5jdGlvbiBpc0xvbmd0ZXJtIChlKSB7XG4gIHJldHVybiBlLnBpbmcgJiYgZS5waW5nLnJ0dC5tZWFuID4gMFxufVxuXG4vL3BlZXJzIHdoaWNoIHdlIGNhbiBjb25uZWN0IHRvLCBidXQgYXJlIG5vdCB1cGdyYWRlZC5cbi8vc2VsZWN0IHBlZXJzIHdoaWNoIHdlIGNhbiBjb25uZWN0IHRvLCBidXQgYXJlIG5vdCB1cGdyYWRlZCB0byBMVC5cbi8vYXNzdW1lIGFueSBwZWVyIGlzIGxlZ2FjeSwgdW50aWwgd2Uga25vdyBvdGhlcndpc2UuLi5cbmZ1bmN0aW9uIGlzTGVnYWN5IChwZWVyKSB7XG4gIHJldHVybiBwZWVyLmR1cmF0aW9uLm1lYW4gPiAwICYmICFleHBvcnRzLmlzTG9uZ3Rlcm0ocGVlcilcbn1cblxuZnVuY3Rpb24gaXNDb25uZWN0IChlKSB7XG4gIHJldHVybiAnY29ubmVjdGVkJyA9PT0gZS5zdGF0ZSB8fCAnY29ubmVjdGluZycgPT09IGUuc3RhdGVcbn1cblxuLy9zb3J0IG9sZGVzdCB0byBuZXdlc3QgdGhlbiB0YWtlIGZpcnN0IG5cbmZ1bmN0aW9uIGVhcmxpZXN0KHBlZXJzLCBuKSB7XG4gIHJldHVybiBwZWVycy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEuc3RhdGVDaGFuZ2UgLSBiLnN0YXRlQ2hhbmdlXG4gIH0pLnNsaWNlKDAsIE1hdGgubWF4KG4sIDApKVxufVxuXG5mdW5jdGlvbiBzZWxlY3QocGVlcnMsIHRzLCBmaWx0ZXIsIG9wdHMpIHtcbiAgaWYob3B0cy5kaXNhYmxlKSByZXR1cm4gW11cbiAgLy9vcHRzOiB7IHF1b3RhLCBncm91cE1pbiwgbWluLCBmYWN0b3IsIG1heCB9XG4gIHZhciB0eXBlID0gcGVlcnMuZmlsdGVyKGZpbHRlcilcbiAgdmFyIHVuY29ubmVjdCA9IHR5cGUuZmlsdGVyKG5vdChpc0Nvbm5lY3QpKVxuICB2YXIgY291bnQgPSBNYXRoLm1heChvcHRzLnF1b3RhIC0gdHlwZS5maWx0ZXIoaXNDb25uZWN0KS5sZW5ndGgsIDApXG4gIHZhciBtaW4gPSB1bmNvbm5lY3QucmVkdWNlKG1heFN0YXRlQ2hhbmdlLCAwKSArIG9wdHMuZ3JvdXBNaW5cbiAgaWYodHMgPCBtaW4pIHJldHVybiBbXVxuXG4gIHJldHVybiBlYXJsaWVzdCh1bmNvbm5lY3QuZmlsdGVyKGZ1bmN0aW9uIChwZWVyKSB7XG4gICAgcmV0dXJuIHBlZXJOZXh0KHBlZXIsIG9wdHMpIDwgdHNcbiAgfSksIGNvdW50KVxufVxuXG52YXIgc2NoZWR1bGUgPSBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPVxuZnVuY3Rpb24gKGdvc3NpcCwgY29uZmlnLCBzZXJ2ZXIpIHsgXG5cbiAgdmFyIG1pbiA9IDYwZTMsIGhvdXIgPSA2MCo2MGUzXG5cbiAgZnVuY3Rpb24gY29uZihuYW1lLCBkZWYpIHtcbiAgICBpZighY29uZmlnLmdvc3NpcCkgcmV0dXJuIGRlZlxuICAgIHZhciB2YWx1ZSA9IGNvbmZpZy5nb3NzaXBbbmFtZV1cbiAgICByZXR1cm4gKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSA/IGRlZiA6IHZhbHVlXG4gIH1cblxuICBmdW5jdGlvbiBjb25uZWN0IChwZWVycywgdHMsIG5hbWUsIGZpbHRlciwgb3B0cykge1xuICAgIHZhciBjb25uZWN0ZWQgPSBwZWVycy5maWx0ZXIoaXNDb25uZWN0KS5maWx0ZXIoZmlsdGVyKVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAocGVlcikge1xuICAgICAgICByZXR1cm4gcGVlci5zdGF0ZUNoYW5nZSArIDEwZTMgPCB0c1xuICAgICAgfSlcblxuICAgIGlmKGNvbm5lY3RlZC5sZW5ndGggPiBvcHRzLnF1b3RhKSB7XG4gICAgICByZXR1cm4gZWFybGllc3QoY29ubmVjdGVkLCBjb25uZWN0ZWQubGVuZ3RoIC0gb3B0cy5xdW90YSlcbiAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHBlZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnRGlzY29ubmVjdCcsIG5hbWUsIHUuc3RyaW5naWZ5QWRkcmVzcyhwZWVyKSlcbiAgICAgICAgICBnb3NzaXAuZGlzY29ubmVjdChwZWVyKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHNlbGVjdChwZWVycywgdHMsIGFuZChmaWx0ZXIsIGlzT25saW5lKSwgb3B0cylcbiAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChwZWVyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDb25uZWN0JywgbmFtZSwgdS5zdHJpbmdpZnlBZGRyZXNzKHBlZXIpKVxuICAgICAgICBnb3NzaXAuY29ubmVjdChwZWVyKVxuICAgICAgfSlcbiAgfVxuXG5cbiAgZnVuY3Rpb24gY29ubmVjdGlvbnMgKCkge1xuICAgIHZhciB0cyA9IERhdGUubm93KClcbiAgICB2YXIgcGVlcnMgPSBnb3NzaXAucGVlcnMoKVxuXG4gICAgY29ubmVjdChwZWVycywgdHMsICdhdHRlbXB0JywgZXhwb3J0cy5pc1VuYXR0ZW1wdGVkLCB7XG4gICAgICAgIG1pbjogMCwgcXVvdGE6IDEwLCBmYWN0b3I6IDAsIG1heDogMCwgZ3JvdXBNaW46IDAsXG4gICAgICAgIGRpc2FibGU6ICFjb25mKCdnbG9iYWwnLCB0cnVlKVxuICAgIH0pXG5cbiAgICAvL3F1b3RhLCBncm91cE1pbiwgbWluLCBmYWN0b3IsIG1heFxuICAgIGNvbm5lY3QocGVlcnMsIHRzLCAncmV0cnknLCBleHBvcnRzLmlzSW5hY3RpdmUsIHtcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBxdW90YTogMywgZmFjdG9yOiA1KjYwZTMsIG1heDogMyo2MCo2MGUzLCBncm91cE1pbjogNSo1MGUzXG4gICAgICB9KVxuXG4gICAgY29ubmVjdChwZWVycywgdHMsICdsZWdhY3knLCBleHBvcnRzLmlzTGVnYWN5LCB7XG4gICAgICAgIHF1b3RhOiAzLCBmYWN0b3I6IDUqbWluLCBtYXg6IDMqaG91ciwgZ3JvdXBNaW46IDUqbWluLFxuICAgICAgICBkaXNhYmxlOiAhY29uZignZ2xvYmFsJywgdHJ1ZSlcbiAgICAgIH0pXG5cbiAgICBjb25uZWN0KHBlZXJzLCB0cywgJ2xvbmd0ZXJtJywgZXhwb3J0cy5pc0xvbmd0ZXJtLCB7XG4gICAgICBxdW90YTogMywgZmFjdG9yOiAxMGUzLCBtYXg6IDEwKm1pbiwgZ3JvdXBNaW46IDVlMyxcbiAgICAgIGRpc2FibGU6ICFjb25mKCdnbG9iYWwnLCB0cnVlKVxuICAgIH0pXG5cbiAgICBjb25uZWN0KHBlZXJzLCB0cywgJ2xvY2FsJywgZXhwb3J0cy5pc0xvY2FsLCB7XG4gICAgICBxdW90YTogMywgZmFjdG9yOiAyZTMsIG1heDogMTAqbWluLCBncm91cE1pbjogMWUzLFxuICAgICAgZGlzYWJsZTogIWNvbmYoJ2xvY2FsJywgdHJ1ZSlcbiAgICB9KVxuXG4gIH1cblxuICAgIHB1bGwoXG4gICAgICBnb3NzaXAuY2hhbmdlcygpLFxuICAgICAgcHVsbC5kcmFpbihmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgaWYoZXYudHlwZSA9PSAnZGlzY29ubmVjdCcpXG4gICAgICAgICAgY29ubmVjdGlvbnMoKVxuICAgICAgfSlcbiAgICApXG5cbiAgICBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25uZWN0aW9ucygpXG4gICAgfSwgMmUzKS51bnJlZigpXG5cbiAgICBjb25uZWN0aW9ucygpXG5cbn1cblxuZXhwb3J0cy5pc1VuYXR0ZW1wdGVkID0gaXNVbmF0dGVtcHRlZFxuZXhwb3J0cy5pc0luYWN0aXZlID0gaXNJbmFjdGl2ZVxuZXhwb3J0cy5pc0xvbmd0ZXJtID0gaXNMb25ndGVybVxuZXhwb3J0cy5pc0xlZ2FjeSA9IGlzTGVnYWN5XG5leHBvcnRzLmlzTG9jYWwgPSBpc0xvY2FsXG5leHBvcnRzLmlzQ29ubmVjdGVkT3JDb25uZWN0aW5nID0gaXNDb25uZWN0XG5leHBvcnRzLnNlbGVjdCA9IHNlbGVjdFxuXG5cblxuXG5cblxuXG5cblxuIiwidmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpXG52YXIgc3NiS2V5cyA9IHJlcXVpcmUoJ3NzYi1rZXlzJylcbnZhciB0b0FkZHJlc3MgPSByZXF1aXJlKCcuLi9saWIvdXRpbCcpLnRvQWRkcmVzc1xudmFyIGNvbnQgPSByZXF1aXJlKCdjb250JylcbnZhciBleHBsYWluID0gcmVxdWlyZSgnZXhwbGFpbi1lcnJvcicpXG52YXIgaXAgPSByZXF1aXJlKCdpcCcpXG52YXIgbWRtID0gcmVxdWlyZSgnbWRtYW5pZmVzdCcpXG52YXIgdmFsaWQgPSByZXF1aXJlKCcuLi9saWIvdmFsaWRhdG9ycycpXG52YXIgYXBpZG9jID0gcmVxdWlyZSgnLi4vbGliL2FwaWRvY3MnKS5pbnZpdGVcblxuLy8gaW52aXRlIHBsdWdpblxuLy8gYWRkcyBtZXRob2RzIGZvciBwcm9kdWNpbmcgaW52aXRlLWNvZGVzLFxuLy8gd2hpY2ggcGVlcnMgY2FuIHVzZSB0byBjb21tYW5kIHlvdXIgc2VydmVyIHRvIGZvbGxvdyB0aGVtLlxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7XG4gIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZlxufVxuXG5mdW5jdGlvbiBpc1N0cmluZyAocykge1xuICByZXR1cm4gJ3N0cmluZycgPT09IHR5cGVvZiBzXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBuYW1lOiAnaW52aXRlJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWFuaWZlc3Q6IG1kbS5tYW5pZmVzdChhcGlkb2MpLFxuICBwZXJtaXNzaW9uczoge1xuICAgIG1hc3Rlcjoge2FsbG93OiBbJ2NyZWF0ZSddfSxcbiAgICAvL3RlbXA6IHthbGxvdzogWyd1c2UnXX1cbiAgfSxcbiAgaW5pdDogZnVuY3Rpb24gKHNlcnZlciwgY29uZmlnKSB7XG4gICAgdmFyIGNvZGVzID0ge31cbiAgICB2YXIgY29kZXNEQiA9IHNlcnZlci5zdWJsZXZlbCgnY29kZXMnKVxuXG4gICAgdmFyIGNyZWF0ZUNsaWVudCA9IHRoaXMuY3JlYXRlQ2xpZW50XG5cbiAgICAvL2FkZCBhbiBhdXRoIGhvb2suXG4gICAgc2VydmVyLmF1dGguaG9vayhmdW5jdGlvbiAoZm4sIGFyZ3MpIHtcbiAgICAgIHZhciBwdWJrZXkgPSBhcmdzWzBdLCBjYiA9IGFyZ3NbMV1cblxuICAgICAgLy8gcnVuIG5vcm1hbCBhdXRoZW50aWNhdGlvblxuICAgICAgZm4ocHVia2V5LCBmdW5jdGlvbiAoZXJyLCBhdXRoKSB7XG4gICAgICAgIGlmKGVyciB8fCBhdXRoKSByZXR1cm4gY2IoZXJyLCBhdXRoKVxuXG4gICAgICAgIC8vIGlmIG5vIHJpZ2h0cyB3ZXJlIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhpcyBwdWJrZXlcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHB1YmtleSBpcyBvbmUgb2Ygb3VyIGludml0ZSBjb2Rlc1xuICAgICAgICBjb2Rlc0RCLmdldChwdWJrZXksIGZ1bmN0aW9uIChfLCBjb2RlKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIGNvZGUgJiYgY29kZS5wZXJtaXNzaW9ucylcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGU6IHZhbGlkLmFzeW5jKGZ1bmN0aW9uIChuLCBjYikge1xuICAgICAgICB2YXIgYWRkciA9IHNlcnZlci5nZXRBZGRyZXNzKClcbiAgICAgICAgdmFyIGhvc3QgPSB0b0FkZHJlc3MoYWRkcikuaG9zdFxuICAgICAgICBpZighY29uZmlnLmFsbG93UHJpdmF0ZSAmJiAoaXAuaXNQcml2YXRlKGhvc3QpIHx8ICdsb2NhbGhvc3QnID09PSBob3N0KSlcbiAgICAgICAgICByZXR1cm4gY2IobmV3IEVycm9yKCdTZXJ2ZXIgaGFzIG5vIHB1YmxpYyBpcCBhZGRyZXNzLCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnY2Fubm90IGNyZWF0ZSB1c2VhYmxlIGludml0YXRpb24nKSlcblxuICAgICAgICAvL3RoaXMgc3R1ZmYgaXMgU0VDVVJJVFkgQ1JJVElDQUxcbiAgICAgICAgLy9zbyBpdCBzaG91bGQgYmUgbW92ZWQgaW50byB0aGUgbWFpbiBhcHAuXG4gICAgICAgIC8vdGhlcmUgc2hvdWxkIGJlIHNvbWV0aGluZyB0aGF0IHJlc3RyaWN0cyB3aGF0XG4gICAgICAgIC8vcGVybWlzc2lvbnMgdGhlIHBsdWdpbiBjYW4gY3JlYXRlIGFsc286XG4gICAgICAgIC8vaXQgc2hvdWxkIGJlIGFibGUgdG8gZGltaW5pc2ggaXQncyBvd24gcGVybWlzc2lvbnMuXG5cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBrZXktc2VlZCBhbmQgaXRzIGtleVxuICAgICAgICB2YXIgc2VlZCA9IGNyeXB0by5yYW5kb21CeXRlcygzMilcbiAgICAgICAgdmFyIGtleUNhcCA9IHNzYktleXMuZ2VuZXJhdGUoJ2VkMjU1MTknLCBzZWVkKVxuXG4gICAgICAgIC8vIHN0b3JlIG1ldGFkYXRhIHVuZGVyIHRoZSBnZW5lcmF0ZWQgcHVia2V5XG4gICAgICAgIHZhciBvd25lciA9IHNlcnZlci5pZFxuICAgICAgICBjb2Rlc0RCLnB1dChrZXlDYXAuaWQsICB7XG4gICAgICAgICAgaWQ6IGtleUNhcC5pZCxcbiAgICAgICAgICB0b3RhbDogK24sXG4gICAgICAgICAgdXNlZDogMCxcbiAgICAgICAgICBwZXJtaXNzaW9uczoge2FsbG93OiBbJ2ludml0ZS51c2UnXSwgZGVueTogbnVsbH1cbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIC8vIGVtaXQgdGhlIGludml0ZSBjb2RlOiBvdXIgc2VydmVyIGFkZHJlc3MsIHBsdXMgdGhlIGtleS1zZWVkXG4gICAgICAgICAgaWYoZXJyKSBjYihlcnIpXG4gICAgICAgICAgZWxzZSBjYihudWxsLCBhZGRyICsgJ34nICsgc2VlZC50b1N0cmluZygnYmFzZTY0JykpXG4gICAgICAgIH0pXG4gICAgICB9LCAnbnVtYmVyJyksXG4gICAgICB1c2U6IHZhbGlkLmFzeW5jKGZ1bmN0aW9uIChyZXEsIGNiKSB7XG4gICAgICAgIHZhciBycGMgPSB0aGlzXG5cbiAgICAgICAgLy8gZmV0Y2ggdGhlIGNvZGVcbiAgICAgICAgY29kZXNEQi5nZXQocnBjLmlkLCBmdW5jdGlvbihlcnIsIGludml0ZSkge1xuICAgICAgICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcblxuICAgICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGFscmVhZHkgZm9sbG93aW5nIHRoZW1cbiAgICAgICAgICBzZXJ2ZXIuZnJpZW5kcy5hbGwoJ2ZvbGxvdycsIGZ1bmN0aW9uKGVyciwgZm9sbG93cykge1xuICAgICAgICAgICAgaWYgKGZvbGxvd3MgJiYgZm9sbG93c1tzZXJ2ZXIuaWRdICYmIGZvbGxvd3Nbc2VydmVyLmlkXVtyZXEuZmVlZF0pXG4gICAgICAgICAgICAgIHJldHVybiBjYihuZXcgRXJyb3IoJ2FscmVhZHkgZm9sbG93aW5nJykpXG5cbiAgICAgICAgICAgIC8vIGFsdGhvdWdoIHdlIGFscmVhZHkga25vdyB0aGUgY3VycmVudCBmZWVkXG4gICAgICAgICAgICAvLyBpdCdzIGluY2x1ZGVkIHNvIHRoYXQgcmVxdWVzdCBjYW5ub3QgYmUgcmVwbGF5ZWQuXG4gICAgICAgICAgICBpZighcmVxLmZlZWQpXG4gICAgICAgICAgICAgIHJldHVybiBjYihuZXcgRXJyb3IoJ2ZlZWQgdG8gZm9sbG93IGlzIG1pc3NpbmcnKSlcblxuICAgICAgICAgICAgaWYoaW52aXRlLnVzZWQgPj0gaW52aXRlLnRvdGFsKVxuICAgICAgICAgICAgICByZXR1cm4gY2IobmV3IEVycm9yKCdpbnZpdGUgaGFzIGV4cGlyZWQnKSlcblxuICAgICAgICAgICAgaW52aXRlLnVzZWQgKytcblxuICAgICAgICAgICAgLy9uZXZlciBhbGxvdyB0aGlzIHRvIGJlIHVzZWQgYWdhaW5cbiAgICAgICAgICAgIGlmKGludml0ZS51c2VkID49IGludml0ZS50b3RhbClcbiAgICAgICAgICAgICAgaW52aXRlLnBlcm1pc3Npb25zID0ge2FsbG93OiBbXSwgZGVueTogbnVsbH1cblxuICAgICAgICAgICAgLy9UT0RPXG4gICAgICAgICAgICAvL29rYXkgc28gdGhlcmUgaXMgYSBzbWFsbCByYWNlIGNvbmRpdGlvbiBoZXJlXG4gICAgICAgICAgICAvL2lmIHBlb3BsZSB1c2UgYSBjb2RlIG1hc3NpdmVseSBpbiBwYXJhbGxlbFxuICAgICAgICAgICAgLy90aGVuIGl0IG1heSBub3QgYmUgY291bnRlZCBjb3JyZWN0bHkuLi5cbiAgICAgICAgICAgIC8vdGhpcyBpcyBub3QgYSBiaWcgZW5vdWdoIGRlYWwgdG8gZml4IHRob3VnaC5cbiAgICAgICAgICAgIC8vLWRvbWluaWNcblxuICAgICAgICAgICAgLy8gdXBkYXRlIGNvZGUgbWV0YWRhdGFcbiAgICAgICAgICAgIGNvZGVzREIucHV0KHJwYy5pZCwgaW52aXRlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgIHNlcnZlci5lbWl0KCdsb2c6aW5mbycsIFsnaW52aXRlJywgcnBjLmlkLCAndXNlJywgcmVxXSlcblxuICAgICAgICAgICAgICAvLyBmb2xsb3cgdGhlIHVzZXJcbiAgICAgICAgICAgICAgc2VydmVyLnB1Ymxpc2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb250YWN0JyxcbiAgICAgICAgICAgICAgICBjb250YWN0OiByZXEuZmVlZCxcbiAgICAgICAgICAgICAgICBmb2xsb3dpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgYXV0b2ZvbGxvdzogdHJ1ZVxuICAgICAgICAgICAgICB9LCBjYilcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0sICdvYmplY3QnKSxcbiAgICAgIGFjY2VwdDogdmFsaWQuYXN5bmMoZnVuY3Rpb24gKGludml0ZSwgY2IpIHtcbiAgICAgICAgLy8gcmVtb3ZlIHN1cnJvdW5kaW5nIHF1b3RlcywgaWYgZm91bmRcbiAgICAgICAgaWYgKGludml0ZS5jaGFyQXQoMCkgPT09ICdcIicgJiYgaW52aXRlLmNoYXJBdChpbnZpdGUubGVuZ3RoIC0gMSkgPT09ICdcIicpXG4gICAgICAgICAgaW52aXRlID0gaW52aXRlLnNsaWNlKDEsIC0xKVxuXG4gICAgICAgIC8vIGNvbm5lY3QgdG8gdGhlIGFkZHJlc3MgaW4gdGhlIGludml0ZSBjb2RlXG4gICAgICAgIC8vIHVzaW5nIGEga2V5cGFpciBnZW5lcmF0ZWQgZnJvbSB0aGUga2V5LXNlZWQgaW4gdGhlIGludml0ZSBjb2RlXG5cbiAgICAgICAgdmFyIHBhcnRzID0gaW52aXRlLnNwbGl0KCd+JylcbiAgICAgICAgdmFyIGFkZHIgPSB0b0FkZHJlc3MocGFydHNbMF0pXG5cbiAgICAgICAgY3JlYXRlQ2xpZW50KHsgc2VlZDogcGFydHNbMV0gfSlcbiAgICAgICAgKGFkZHIsIGZ1bmN0aW9uIChlcnIsIHJwYykge1xuICAgICAgICAgIGlmKGVycikgcmV0dXJuIGNiKGV4cGxhaW4oZXJyLCAnY291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyJykpXG5cbiAgICAgICAgICAvLyBjb21tYW5kIHRoZSBwZWVyIHRvIGZvbGxvdyBtZVxuICAgICAgICAgIHJwYy5pbnZpdGUudXNlKHsgZmVlZDogc2VydmVyLmlkIH0sIGZ1bmN0aW9uIChlcnIsIG1zZykge1xuICAgICAgICAgICAgaWYoZXJyKSByZXR1cm4gY2IoZXhwbGFpbihlcnIsICdpbnZpdGUgbm90IGFjY2VwdGVkJykpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGZvbGxvdyBhbmQgYW5ub3VuY2UgdGhlIHB1YlxuICAgICAgICAgICAgY29udC5wYXJhKFtcbiAgICAgICAgICAgICAgc2VydmVyLnB1Ymxpc2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb250YWN0JyxcbiAgICAgICAgICAgICAgICBmb2xsb3dpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgYXV0b2ZvbGxvdzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb250YWN0OiBhZGRyLmxpbmsgfHwgYWRkci5rZXlcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHNlcnZlci5wdWJsaXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAncHViJyxcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBhZGRyLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSkoZnVuY3Rpb24gKGVyciwgcmVzdWx0cykge1xuICAgICAgICAgICAgICBycGMuY2xvc2UoKVxuICAgICAgICAgICAgICBjYihlcnIsIHJlc3VsdHMpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9LCAnc3RyaW5nJylcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuIiwidmFyIGJyb2FkY2FzdCA9IHJlcXVpcmUoJ2Jyb2FkY2FzdC1zdHJlYW0nKVxuXG4vLyBsb2NhbCBwbHVnaW5cbi8vIGJyb2FkY2FzdHMgdGhlIGFkZHJlc3M6cG9ydDpwdWJrZXkgdHJpcGxlIG9mIHRoZSBzYm90IHNlcnZlclxuLy8gb24gdGhlIExBTiwgdXNpbmcgbXVsdGljYXN0IFVEUFxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7XG4gIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmFtZTogJ2xvY2FsJyxcbiAgdmVyc2lvbjogJzIuMC4wJyxcbiAgaW5pdDogZnVuY3Rpb24gKHNib3QsIGNvbmZpZykge1xuXG4gICAgdmFyIGxvY2FsID0gYnJvYWRjYXN0KGNvbmZpZy5wb3J0KVxuXG4gICAgbG9jYWwub24oJ2RhdGEnLCBmdW5jdGlvbiAoYnVmKSB7XG4gICAgICBpZihidWYubG9vcGJhY2spIHJldHVyblxuICAgICAgdmFyIGRhdGEgPSBidWYudG9TdHJpbmcoKVxuICAgICAgc2JvdC5nb3NzaXAuYWRkKGRhdGEsICdsb2NhbCcpXG4gICAgfSlcblxuICAgIHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGJyb2FkY2FzdCBzZWxmXG4gICAgICAvLyBUT0RPOiBzaWduIGJlYWNvbnMsIHNvIHRoYXQgcmVjZWlwaWVudCBjYW4gYmUgY29uZmlkYW50XG4gICAgICAvLyB0aGF0IGlzIHJlYWxseSB5b3VyIGlkLlxuICAgICAgLy8gKHdoaWNoIG1lYW5zIHRoZXkgY2FuIHVwZGF0ZSB0aGVpciBwZWVyIHRhYmxlKVxuICAgICAgLy8gT2ggaWYgdGhpcyBpbmNsdWRlcyB5b3VyIGxvY2FsIGFkZHJlc3MsXG4gICAgICAvLyB0aGVuIGl0IGJlY29tZXMgdW5mb3JnZWFibGUuXG4gICAgICBsb2NhbC53cml0ZShzYm90LmdldEFkZHJlc3MoKSlcbiAgICB9LCAxMDAwKVxuICB9XG59XG5cbiIsInZhciBjb2xvciA9IHJlcXVpcmUoJ2Jhc2gtY29sb3InKVxuXG4vLyBsb2dnaW5nIHBsdWdpblxuLy8gc3Vic2NyaWJlcyB0byAnbG9nOionIGV2ZW50c1xuLy8gYW5kIGVtaXRzIHVzaW5nIGxvdmVseSBjb2xvcnNcblxudmFyIExPR19MRVZFTFMgPSBbXG4gICdlcnJvcicsXG4gICd3YXJuaW5nJyxcbiAgJ25vdGljZScsXG4gICdpbmZvJ1xuXVxudmFyIERFRkFVTFRfTEVWRUwgPSBMT0dfTEVWRUxTLmluZGV4T2YoJ25vdGljZScpXG5cbmZ1bmN0aW9uIGluZGVudCAobykge1xuICByZXR1cm4gby5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuICcgICcgKyBlXG4gIH0pLmpvaW4oJ1xcbicpXG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKHMpIHtcbiAgcmV0dXJuICdzdHJpbmcnID09PSBzXG59XG5cbmZ1bmN0aW9uIGZvcm1hdHRlcihpZCwgbGV2ZWwpIHtcbiAgdmFyIGIgPSBpZC5zdWJzdHJpbmcoMCwgNClcbiAgcmV0dXJuIGZ1bmN0aW9uIChhcnkpIHtcbiAgICB2YXIgcGx1ZyA9IGFyeVswXS5zdWJzdHJpbmcoMCwgNCkudG9VcHBlckNhc2UoKVxuICAgIHZhciBpZCA9IGFyeVsxXVxuICAgIHZhciB2ZXJiID0gYXJ5WzJdXG4gICAgdmFyIGRhdGEgPSBhcnkubGVuZ3RoID4gNCA/IGFyeS5zbGljZSgzKSA6IGFyeVszXVxuICAgIHZhciBfZGF0YSA9IChpc1N0cmluZyhkYXRhKSA/IGRhdGEgOiBKU09OLnN0cmluZ2lmeShkYXRhKSkgfHwgJydcblxuICAgIHZhciBwcmUgPSBbcGx1ZywgaWQsIGNvbG9yLmN5YW4odmVyYildLmpvaW4oJyAnKVxuICAgIHZhciBsZW5ndGggPSAoNSArIHByZS5sZW5ndGggKyAxICsgX2RhdGEubGVuZ3RoKVxuICAgIHZhciBsaW5lcyA9IGlzU3RyaW5nKGRhdGEpICYmIGRhdGEuc3BsaXQoJ1xcbicpLmxlbmd0aCA+IDFcblxuICAgIHZhciBjID0gcHJvY2Vzcy5zdGRvdXQuY29sdW1uc1xuICAgIGlmKChwcm9jZXNzLnN0ZG91dC5jb2x1bW5zID4gbGVuZ3RoKSAmJiAhbGluZXMpXG4gICAgICBjb25zb2xlLmxvZyhbbGV2ZWwsIGIsIHByZSwgX2RhdGFdLmpvaW4oJyAnKSlcbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFtsZXZlbCwgYiwgcHJlXS5qb2luKCcgJykpXG4gICAgICBpZihsaW5lcylcbiAgICAgICAgY29uc29sZS5sb2coaW5kZW50KGRhdGEpKVxuICAgICAgZWxzZSBpZihkYXRhICYmIGRhdGEuc3RhY2spXG4gICAgICAgIGNvbnNvbGUubG9nKGluZGVudChkYXRhLnN0YWNrKSlcbiAgICAgIGVsc2UgaWYoZGF0YSkge1xuICAgICAgICBjb25zb2xlLmxvZyhpbmRlbnQoSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMikpKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGxvZ2dpbmcgKHNlcnZlciwgY29uZikge1xuICB2YXIgbGV2ZWwgPSBjb25mLmxvZ2dpbmcgJiYgY29uZi5sb2dnaW5nLmxldmVsICYmIExPR19MRVZFTFMuaW5kZXhPZihjb25mLmxvZ2dpbmcubGV2ZWwpIHx8IERFRkFVTFRfTEVWRUxcbiAgaWYgKGxldmVsID09PSAtMSkge1xuICAgIGNvbnNvbGUubG9nKCdXYXJuaW5nLCBsb2dnaW5nLmxldmVsIGNvbmZpZ3VyZWQgdG8gYW4gaW52YWxpZCB2YWx1ZTonLCBjb25mLmxvZ2dpbmcubGV2ZWwpXG4gICAgY29uc29sZS5sb2coJ1Nob3VsZCBiZSBvbmUgb2Y6JywgTE9HX0xFVkVMUy5qb2luKCcsICcpKVxuICAgIGxldmVsID0gREVGQVVMVF9MRVZFTFxuICB9XG4gIGNvbnNvbGUubG9nKCdMb2cgbGV2ZWw6JywgTE9HX0xFVkVMU1tsZXZlbF0pXG5cbiAgdmFyIGlkID0gc2VydmVyLmlkXG4gIGlmIChsZXZlbCA+PSBMT0dfTEVWRUxTLmluZGV4T2YoJ2luZm8nKSlcbiAgICBzZXJ2ZXIub24oJ2xvZzppbmZvJywgICAgZm9ybWF0dGVyKGlkLCBjb2xvci5ncmVlbignaW5mbycpKSlcbiAgaWYgKGxldmVsID49IExPR19MRVZFTFMuaW5kZXhPZignbm90aWNlJykpXG4gICAgc2VydmVyLm9uKCdsb2c6bm90aWNlJywgIGZvcm1hdHRlcihpZCwgY29sb3IuYmx1ZSgnbm90ZScpKSlcbiAgaWYgKGxldmVsID49IExPR19MRVZFTFMuaW5kZXhPZignd2FybmluZycpKVxuICAgIHNlcnZlci5vbignbG9nOndhcm5pbmcnLCBmb3JtYXR0ZXIoaWQsIGNvbG9yLnllbGxvdygnd2FybicpKSlcbiAgaWYgKGxldmVsID49IExPR19MRVZFTFMuaW5kZXhPZignZXJyb3InKSlcbiAgICBzZXJ2ZXIub24oJ2xvZzplcnJvcicsICAgZm9ybWF0dGVyKGlkLCBjb2xvci5yZWQoJ2VyciEnKSkpXG59XG5cbm1vZHVsZS5leHBvcnRzLmluaXQgPSBtb2R1bGUuZXhwb3J0c1xuIiwiLy8gbWFzdGVyIHBsdWdpblxuLy8gYWxsb3dzIHlvdSB0byBkZWZpbmUgXCJtYXN0ZXJcIiBJRHMgaW4gdGhlIGNvbmZpZ1xuLy8gd2hpY2ggYXJlIGdpdmVuIHRoZSBmdWxsIHJpZ2h0cyBvZiB0aGUgbG9jYWwgbWFpbiBJRFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXBpLCBvcHRzKSB7XG4gIHZhciBtYXN0ZXJzID0gW2FwaS5pZF0uY29uY2F0KG9wdHMubWFzdGVyKS5maWx0ZXIoQm9vbGVhbilcbiAgYXBpLmF1dGguaG9vayhmdW5jdGlvbiAoZm4sIGFyZ3MpIHtcbiAgICB2YXIgaWQgPSBhcmdzWzBdXG4gICAgdmFyIGNiID0gYXJnc1sxXVxuICAgIGNiKG51bGwsIH5tYXN0ZXJzLmluZGV4T2YoaWQpID8ge2FsbG93OiBudWxsLCBkZW55OiBudWxsfSA6IG51bGwpXG4gIH0pXG59XG4iLCJ2YXIgc3NiS2V5cyA9IHJlcXVpcmUoJ3NzYi1rZXlzJylcbnZhciBleHBsYWluID0gcmVxdWlyZSgnZXhwbGFpbi1lcnJvcicpXG52YXIgbWRtID0gcmVxdWlyZSgnbWRtYW5pZmVzdCcpXG52YXIgdmFsaWQgPSByZXF1aXJlKCcuLi9saWIvdmFsaWRhdG9ycycpXG52YXIgYXBpZG9jID0gcmVxdWlyZSgnLi4vbGliL2FwaWRvY3MnKS5wcml2YXRlXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBuYW1lOiAncHJpdmF0ZScsXG4gIHZlcnNpb246ICcwLjAuMCcsXG4gIG1hbmlmZXN0OiBtZG0ubWFuaWZlc3QoYXBpZG9jKSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBhbm9ueW1vdXM6IHt9LFxuICB9LFxuICBpbml0OiBmdW5jdGlvbiAoc2JvdCwgb3B0cykge1xuICAgIHJldHVybiB7XG4gICAgICBwdWJsaXNoOiB2YWxpZC5hc3luYyhmdW5jdGlvbiAoZGF0YSwgcmVjcHMsIGNiKSB7XG4gICAgICAgIHZhciBjaXBoZXJ0ZXh0XG4gICAgICAgIHRyeSB7IGNpcGhlcnRleHQgPSBzc2JLZXlzLmJveChkYXRhLCByZWNwcykgfVxuICAgICAgICBjYXRjaCAoZSkgeyByZXR1cm4gY2IoZXhwbGFpbihlLCAnZmFpbGVkIHRvIGVuY3J5cHQnKSkgfVxuXG4gICAgICAgIHNib3QucHVibGlzaChjaXBoZXJ0ZXh0LCBjYilcbiAgICAgIH0sICdzdHJpbmd8b2JqZWN0JywgJ2FycmF5JyksXG4gICAgICB1bmJveDogdmFsaWQuc3luYyhmdW5jdGlvbiAoY2lwaGVydGV4dCkge1xuICAgICAgICB2YXIgZGF0YVxuICAgICAgICB0cnkgeyBkYXRhID0gc3NiS2V5cy51bmJveChjaXBoZXJ0ZXh0LCBzYm90LmtleXMucHJpdmF0ZSkgfVxuICAgICAgICBjYXRjaCAoZSkgeyB0aHJvdyBleHBsYWluKGUsICdmYWlsZWQgdG8gZGVjcnlwdCcpIH1cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgIH0sICdzdHJpbmcnKVxuICAgIH1cbiAgfVxufSIsInZhciBwdWxsID0gcmVxdWlyZSgncHVsbC1zdHJlYW0nKVxudmFyIHBhcmEgPSByZXF1aXJlKCdwdWxsLXBhcmFtYXAnKVxudmFyIE5vdGlmeSA9IHJlcXVpcmUoJ3B1bGwtbm90aWZ5JylcbnZhciBtYW55ID0gcmVxdWlyZSgncHVsbC1tYW55JylcbnZhciBjYXQgPSByZXF1aXJlKCdwdWxsLWNhdCcpXG52YXIgQWJvcnQgPSByZXF1aXJlKCdwdWxsLWFib3J0YWJsZScpXG52YXIgRGVib3VuY2UgPSByZXF1aXJlKCdvYnNlcnYtZGVib3VuY2UnKVxudmFyIE9ic2VydiA9IHJlcXVpcmUoJ29ic2VydicpXG52YXIgbWRtID0gcmVxdWlyZSgnbWRtYW5pZmVzdCcpXG52YXIgYXBpZG9jID0gcmVxdWlyZSgnLi4vbGliL2FwaWRvY3MnKS5yZXBsaWNhdGVcblxudmFyIERBWSA9IDEwMDAqNjAqNjAqMjRcbnZhciBMSU1JVCA9IFstMSwgLTEsIDEwMF0gLy8gZGVmYXVsdCByYXRlLWxpbWl0cywgYnkgaG9wcyBvdXRcblxudmFyIG5vdGlmeSA9IE5vdGlmeSgpXG5cbmZ1bmN0aW9uIGxhc3QgKGEpIHsgcmV0dXJuIGFbYS5sZW5ndGggLSAxXSB9XG5cbi8vIG1haW4gbG9nLXJlcGxpY2F0aW9uIGJlaGF2aW9yXG5mdW5jdGlvbiByZXBsaWNhdGUoc2JvdCwgY29uZmlnLCBycGMsIGNiKSB7XG5cbiAgLy8gcmF0ZSBsaW1pdGVyOlxuICAvLyBjYWxjdWxhdGUgaG93IG1hbnkgbWVzc2FnZXMgd2UncmUgd2lsbGluZyB0byByZWNlaXZlIGZvciBhIHVzZXJcbiAgLy8gLSB3b3JrcyBieSBudW1iZXIgb2YgXCJob3BzXCIgYXdheSBmcm9tIHRoZSBsb2NhbCB1c2VyLCBpbiB0aGUgZm9sbG93IGdyYXBoXG4gIGZ1bmN0aW9uIGNhbGNMaW1pdCAodXB0bykge1xuXG4gICAgdmFyIGxpbWl0ID0gY29uZmlnLnJlcGxpY2F0aW9uICYmIGNvbmZpZy5yZXBsaWNhdGlvbi5saW1pdFxuICAgIGlmKCFBcnJheS5pc0FycmF5KGxpbWl0KSkgbGltaXQgPSBMSU1JVFxuXG4gICAgdmFyIGhvcExpbWl0ID0gKHVwdG8uaG9wcyA8IGxpbWl0Lmxlbmd0aCkgPyBsaW1pdFt1cHRvLmhvcHNdIDogbGFzdChsaW1pdClcbiAgICBpZihob3BMaW1pdCA8PTApIHJldHVybiBob3BMaW1pdFxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgIXVwdG8udHNcbiAgICAgID8gaG9wTGltaXRcbiAgICAgIDogTWF0aC5jZWlsKChEYXRlLm5vdygpIC0gdXB0by50cykvREFZICogaG9wTGltaXQpXG4gICAgKVxuICB9XG5cbiAgLy8gVE9ET1xuICAvLyBpcyBgaW5pdGlhbGAgYW5kIGB0b19yZWN2YCB0aGUgc2FtZSB0aGluZz8gZG8gd2UgbmVlZCBib3RoP1xuICAvLyAtcHJmXG4gIHZhciBhYm9ydGVyID0gQWJvcnQoKVxuICB2YXIgc291cmNlcyA9IG1hbnkoKVxuICB2YXIgdG9fc2VuZCA9IHt9IC8vIHsgZmVlZElkID0+IHRoZWlyIGxhdGVzdCBzZXEgfSBtYXAgZm9yIGZlZWRzIHJlcXVlc3RlZCBieSB0aGUgcGVlclxuICB2YXIgdG9fcmVjdiA9IHt9IC8vIHsgZmVlZElkID0+IG91ciBsYXRlc3Qgc2VxIH0gbWFwIGZvciBmZWVkcyB3ZSByZXF1ZXN0XG4gIHZhciBpbml0aWFsID0ge30gLy8geyBmZWVkSWQgPT4gaW5pdGlhbCBzZXEgfSBtYXAgZm9yIGZlZWRzIHJlcXVlc3QsIHJlbWVtYmVycyB3aGF0IHNlcSBlYWNoIGZlZWQgd2FzIGluaXRpYWxseSBhdFxuICB2YXIgcmVwbGljYXRlZCA9IHt9IC8vIHsgZmVlZElkID0+IGZpbmFsIHNlcSB9IG1hcCBmb3IgZmVlZHMgcmVxdWVzdCwgdHJhY2tzIHRoZSBmaW5hbCBzZXEgZm9yIGVhY2ggcmVjZWl2ZWQgZmVlZFxuICB2YXIgZGVib3VuY2UgPSBEZWJvdW5jZSgxMDApXG5cbiAgLy8gdHJhY2sgcHJvZ3Jlc3MsIGFuZCBlbWl0IHVwZGF0ZSBldmVudHMgcGVyaW9kaWNhbGx5XG4gIGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBIQUNLXG4gICAgLy8gVGhpcyB1c2VzIHRoZSBpbmZvcm1hdGlvbiBwcm9kdWNlZCBieSBub3JtYWwgcmVwbGljYXRpb24gXG4gICAgLy8gdG8gZ2V0IGEgcm91Z2ggYXBwcm94aW1hdGlvbiBmb3IgYSBwcm9ncmVzcy1iYXIuXG4gICAgLy8gV2hlbiB0aGUgcGVlciByZXF1ZXN0cyBmZWVkcywgdGhleSdsbCB0ZWxsIHVzIHdoYXQgc2VxdWVuY2UgdGhleSBoYXZlIGZvciBlYWNoIGZlZWQuXG4gICAgLy8gV2UgdHJhY2sgdGhhdCBpbiBgdG9fc2VuZGAuXG4gICAgLy8gV2UgYWxzbyB0cmFjayB0aGUgc2VxdWVuY2Ugd2UgaGF2ZSwgZm9yIHRoZSBmZWVkcyB3ZSdyZSByZXF1ZXN0aW5nLCBpbiBgdG9fcmVjdmAuXG4gICAgLy8gSWYgaXQgc28gaGFwcGVucyB0aGV5IGhhdmUgYSBoaWdoZXIgc2VxdWVuY2UgZm9yIGEgZmVlZCB0aGFuIHdlIGRvLCB0aGVuXG4gICAgLy8gYHRvX3NlbmRgIHdpbGwgYmUgaGlnaGVyIHRoYW4gYHRvX3JlY3ZgLlxuICAgIC8vIFRoaXMgbWVhbnMgdGhleSBoYXZlIHRvIHJlcXVlc3QgYSBmZWVkIGZvciB1cyB0byB0cmFjayB0aGF0IGZlZWQncyBwcm9ncmVzcywgd2hpY2ggaXNcbiAgICAvLyBvZnRlbiB0aGUgY2FzZSwgYnV0IG5vdCBhbHdheXMuXG4gICAgLy8gV29ya3MgZm9yIG5vdy5cbiAgICAvLyAtcHJmIChidXQgY29kZSBieSBkb21pbmljLCBibGFtZSBoaW0pXG4gICAgdmFyIHRvdGFsID0gMCwgcHJvZ3Jlc3MgPSAwLCBmZWVkcyA9IDBcbiAgICBmb3IodmFyIGlkIGluIHRvX3JlY3YpIHtcbiAgICAgIHZhciBmZWVkX3RvX3NlbmQgICAgPSB0b19zZW5kW2lkXSAgICB8fCAwXG4gICAgICB2YXIgZmVlZF90b19yZWN2ICAgID0gdG9fcmVjdltpZF0gICAgfHwgMFxuICAgICAgdmFyIGZlZWRfcmVwbGljYXRlZCA9IHJlcGxpY2F0ZWRbaWRdIHx8IDBcbiAgICAgIGlmKHRvX3NlbmRbaWRdICE9IG51bGwgJiYgdG9fcmVjdltpZF0gIT0gbnVsbCkge1xuICAgICAgICBmZWVkcysrXG4gICAgICAgIGlmKGZlZWRfdG9fc2VuZCA+IGZlZWRfdG9fcmVjdikge1xuICAgICAgICAgIHRvdGFsICAgICs9IChmZWVkX3RvX3NlbmQgICAgLSBmZWVkX3RvX3JlY3YpXG4gICAgICAgICAgcHJvZ3Jlc3MgKz0gKGZlZWRfcmVwbGljYXRlZCAtIGZlZWRfdG9fcmVjdilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVtaXQgcHJvZ3Jlc3MgZXZlbnRcbiAgICBub3RpZnkoe1xuICAgICAgdHlwZTogJ3Byb2dyZXNzJyxcbiAgICAgIHBlZXJpZDogcnBjLmlkLFxuICAgICAgdG90YWw6IHRvdGFsLFxuICAgICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgICAgZmVlZHM6IGZlZWRzLFxuICAgICAgc3luYzogISEoZmVlZHMgJiYgKHByb2dyZXNzID49IHRvdGFsKSlcbiAgICB9KVxuICB9KVxuXG4gIHJwYy5vbignY2FsbDpjcmVhdGVIaXN0b3J5U3RyZWFtJywgZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAvLyB0cmFjayB3aGF0IHNlcXVlbmNlIHRoZSBwZWVyIGhhcyBmb3IgZWFjaCBmZWVkXG4gICAgdG9fc2VuZFtvcHRzLmlkXSA9IChvcHRzLnNlcXVlbmNlIHx8IG9wdHMuc2VxKSAtIDFcbiAgICBkZWJvdW5jZS5zZXQoKVxuICB9KVxuXG4gIC8vIGNvbXBhdGliaWxpdHkgZnVuY3Rpb24gZm9yIG9sZCBpbXBsZW1lbnRhdGlvbnMgb2YgYGxhdGVzdFNlcXVlbmNlYFxuICBmdW5jdGlvbiB0b1NlcSAocykge1xuICAgIHJldHVybiAnbnVtYmVyJyA9PT0gdHlwZW9mIHMgPyBzIDogcy5zZXF1ZW5jZVxuICB9XG5cbiAgLy8gY29sbGVjdCB0aGUgSURzIG9mIGZlZWRzIHdlIHdhbnQgdG8gcmVxdWVzdFxuICB2YXIgb3B0cyA9IGNvbmZpZy5yZXBsaWNhdGlvbiB8fCB7fVxuICBvcHRzLmhvcHMgPSBvcHRzLmhvcHMgfHwgM1xuICBvcHRzLmR1bmJhciA9IG9wdHMuZHVuYmFyIHx8IDE1MFxuICBvcHRzLmxpdmUgPSB0cnVlXG4gIG9wdHMubWV0YSA9IHRydWVcbiAgdmFyIHVzZXJTb3VyY2VzID0gW3Nib3QuZnJpZW5kcy5jcmVhdGVGcmllbmRTdHJlYW0ob3B0cyldXG4gIGlmIChzYm90Lmdvc3NpcCkge1xuICAgIC8vIGlmIHdlIGhhdmUgdGhlIGdvc3NpcCBwbHVnaW4gYWN0aXZlLCB0aGVuIGluY2x1ZGUgbmV3IGxvY2FsIHBlZXJzXG4gICAgLy8gc28gdGhhdCB5b3UgY2FuIHB1dCBhIG5hbWUgdG8gc29tZW9uZSBvbiB5b3VyIGxvY2FsIG5ldHdvcmsuXG4gICAgdXNlclNvdXJjZXMudW5zaGlmdChwdWxsLnZhbHVlcyhcbiAgICAgIHNib3QuZ29zc2lwLnBlZXJzKClcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5zb3VyY2UgPT09ICdsb2NhbCcgfSlcbiAgICAgICAgLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4ge2lkOiBlLmtleSwgaG9wczogNn0gfSlcbiAgICApKVxuICB9XG5cbiAgLy8gY3JlYXRlIHJlYWQtc3RyZWFtcyBmb3IgdGhlIGRlc2lyZWQgZmVlZHNcbiAgcHVsbChcbiAgICBjYXQodXNlclNvdXJjZXMpLFxuICAgIGFib3J0ZXIsXG4gICAgLy8gZmlsdGVyIG91dCBkdXBsaWNhdGVzLCBhbmQgYWxzbyBrZWVwIHRyYWNrIG9mIHdoYXQgd2UgZXhwZWN0IHRvIHJlY2VpdmVcbiAgICBwdWxsLmZpbHRlcihmdW5jdGlvbiAocykge1xuICAgICAgdmFyIGlkID0gJ3N0cmluZycgPT09IHR5cGVvZiBzID8gcyAgOiBzLmlkXG4gICAgICBpZih0b19yZWN2W2lkXSA9PSBudWxsKSB7IHRvX3JlY3ZbaWRdID0gMDsgcmV0dXJuIHRydWUgfVxuICAgIH0pLFxuICAgIC8vIGxvb2t1cCB0aGUgbGF0ZXN0IHNlcXVlbmNlIGZyb20gZWFjaCB1c2VyXG4gICAgcGFyYShmdW5jdGlvbiAoZGF0YSwgY2IpIHtcbiAgICAgIGlmKGRhdGEuc3luYykgcmV0dXJuIGNiKG51bGwsIGRhdGEpXG4gICAgICB2YXIgaWQgPSBkYXRhLmlkIHx8IGRhdGFcbiAgICAgIHNib3QubGF0ZXN0U2VxdWVuY2UoaWQsIGZ1bmN0aW9uIChlcnIsIHNlcSkge1xuICAgICAgICBjYihudWxsLCB7XG4gICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgIHNlcXVlbmNlOiBlcnIgPyAwIDogdG9TZXEoc2VxKSxcbiAgICAgICAgICB0czogZXJyID8gbnVsbCA6IHNlcS50cyxcbiAgICAgICAgICBob3BzOiBkYXRhLmhvcHNcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgMzIpLFxuICAgIHB1bGwuZHJhaW4oZnVuY3Rpb24gKHVwdG8pIHtcbiAgICAgIHRvX3JlY3ZbdXB0by5pZF0gPSB1cHRvLnNlcXVlbmNlXG4gICAgICBpbml0aWFsW3VwdG8uaWRdID0gcmVwbGljYXRlZFt1cHRvLmlkXSA9IHVwdG8uc2VxdWVuY2VcblxuICAgICAgdmFyIGxpbWl0ID0gY29uZmlnLnBhcnR5ID8gbnVsbCA6IGNhbGNMaW1pdCh1cHRvKVxuXG4gICAgICBzb3VyY2VzLmFkZChcbiAgICAgICAgcHVsbChcblxuICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAvLyBob3cgZG8gYGxpbWl0YCBhbmQgYGxpdmVgIGludGVyYWN0LCBoZXJlP1xuICAgICAgICAgIC8vIHdoYXQgaWYgb25seSB0aGUgZmlyc3QgMTAwIG1lc3NhZ2VzLCBvZiAyMDAsIHdlcmUgcmVxdWVzdGVkPyBcbiAgICAgICAgICAvLyB3b3VsZCB5b3Ugc3RhcnQgZ2V0dGluZyBsaXZlIHVwZGF0ZXMsIHN0YXJ0aW5nIGF0IHNlcXVlbmNlIDIwMT9cbiAgICAgICAgICAvLyAtcHJmXG4gICAgICAgICAgcnBjLmNyZWF0ZUhpc3RvcnlTdHJlYW0oe1xuICAgICAgICAgICAgaWQ6IHVwdG8uaWQsXG4gICAgICAgICAgICBzZXE6IHVwdG8uc2VxdWVuY2UgKyAxLFxuICAgICAgICAgICAgbGltaXQ6IGxpbWl0LFxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGtleXM6IGZhbHNlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHVsbC50aHJvdWdoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKGxpbWl0ID09PSBudWxsIHx8IGxpbWl0LS0pIHJldHVyblxuICAgICAgICAgICAgLy9SRVBMSUNBVElPQU4gQkFDSyBQUkVTU1VSRVxuICAgICAgICAgICAgcnBjLmNsb3NlKHRydWUpXG5cbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIC8vIGRvIHdlIHdhbnQgdG8gY2xvc2UgdGhlIGVudGlyZSBSUEMgY29ubmVjdGlvbiB3aGVuIHRoZSBsaW1pdCBpcyBoaXQ/XG4gICAgICAgICAgICAvLyB0aGUgbGltaXQgaXMgcGVyIGZlZWQgLi4uIGl0IHNob3VsZCBqdXN0IGNsb3NlIHRoZSBmZWVkJ3MgaGlzdG9yeSBzdHJlYW1cbiAgICAgICAgICAgIC8vIC1wcmZcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG5cbiAgICAgIGRlYm91bmNlLnNldCgpXG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYoZXJyKVxuICAgICAgICBzYm90LmVtaXQoJ2xvZzplcnJvcicsIFsncmVwbGljYXRpb24nLCByZXAuaWQsICdlcnJvcicsIGVycl0pXG4gICAgICBzb3VyY2VzLmNhcCgpXG4gICAgfSlcbiAgKVxuXG4gIC8vIGNyZWF0ZSB0aGUgcmVhZCAtPiB3cml0ZSBzdHJlYW1cbiAgcHVsbChcbiAgICBzb3VyY2VzLFxuICAgIHB1bGwudGhyb3VnaChmdW5jdGlvbiAobXNnKSB7XG4gICAgICAvLyB0cmFjayBwcm9ncmVzc1xuICAgICAgcmVwbGljYXRlZFttc2cuYXV0aG9yXSA9IE1hdGgubWF4KFxuICAgICAgICByZXBsaWNhdGVkW21zZy5hdXRob3JdfHwwLFxuICAgICAgICBtc2cuc2VxdWVuY2VcbiAgICAgIClcbiAgICAgIGRlYm91bmNlLnNldCgpXG4gICAgfSksXG4gICAgc2JvdC5jcmVhdGVXcml0ZVN0cmVhbShmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBhYm9ydGVyLmFib3J0KClcbiAgICAgIGRlYm91bmNlLmltbWVkaWF0ZSgpXG5cbiAgICAgIC8vIGRvbmUhXG4gICAgICBjYihlcnIsIHJlcGxpY2F0ZWQsIGluaXRpYWwpXG4gICAgfSlcbiAgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmFtZTogJ3JlcGxpY2F0ZScsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1hbmlmZXN0OiBtZG0ubWFuaWZlc3QoYXBpZG9jKSxcbiAgcmVwbGljYXRlOiByZXBsaWNhdGUsXG4gIGluaXQ6IGZ1bmN0aW9uIChzYm90LCBjb25maWcpIHtcbiAgICBzYm90LmNyZWF0ZUhpc3RvcnlTdHJlYW0uaG9vayhmdW5jdGlvbiAoZm4sIGFyZ3MpIHtcbiAgICAgIGlmKHRoaXMuX2VtaXQpXG4gICAgICAgIHRoaXMuX2VtaXQoJ2NhbGw6Y3JlYXRlSGlzdG9yeVN0cmVhbScsIGFyZ3NbMF0pXG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncylcbiAgICB9KVxuXG4gICAgLy8gd2F0Y2ggZm9yIG5ldyBjb25uZWN0aW9ucyBhbmQgcmVwbGljYXRlIG9uIGNyZWF0aW9uXG4gICAgc2JvdC5vbigncnBjOmNvbm5lY3QnLCBmdW5jdGlvbihycGMpIHtcbiAgICAgIC8vIHRoaXMgaXMgdGhlIGNsaSBjbGllbnQsIGp1c3QgaWdub3JlLlxuICAgICAgaWYocnBjLmlkID09PSBzYm90LmlkKSByZXR1cm5cblxuICAgICAgc2JvdC5lbWl0KCdsb2c6aW5mbycsIFsncmVwbGljYXRlJywgcnBjLmlkLCAnc3RhcnQnXSlcbiAgICAgIHNib3QuZW1pdCgncmVwbGljYXRlOnN0YXJ0JywgcnBjKVxuICAgICAgcmVwbGljYXRlKHNib3QsIGNvbmZpZywgcnBjLCBmdW5jdGlvbiAoZXJyLCBmaW5hbCwgaW5pdGlhbCkge1xuICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICBzYm90LmVtaXQoJ3JlcGxpY2F0ZTpmYWlsJywgZXJyKVxuICAgICAgICAgIHNib3QuZW1pdCgnbG9nOndhcm5pbmcnLCBbJ3JlcGxpY2F0ZScsIHJwYy5pZCwgJ2Vycm9yJywgZXJyXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSB7fVxuICAgICAgICAgIC8vIHN1YnRyYWN0IGBpbml0aWFsYCBmcm9tIGBmaW5hbGAgc28gYHByb2dyZXNzYCByZXByZXNlbnRzIGEgZGVsdGFcbiAgICAgICAgICBmb3IgKHZhciBhdXRob3IgaW4gZmluYWwpXG4gICAgICAgICAgICBwcm9ncmVzc1thdXRob3JdID0gZmluYWxbYXV0aG9yXSAtIChpbml0aWFsW2F1dGhvcl0gfHwgMClcblxuICAgICAgICAgIHZhciBwcm9ncmVzc1N1bW1hcnkgPSBzdW1tYXJpemVQcm9ncmVzcyhwcm9ncmVzcylcbiAgICAgICAgICBpZiAocHJvZ3Jlc3NTdW1tYXJ5KVxuICAgICAgICAgICAgc2JvdC5lbWl0KCdsb2c6bm90aWNlJywgWydyZXBsaWNhdGUnLCBycGMuaWQsICdzdWNjZXNzJywgcHJvZ3Jlc3NTdW1tYXJ5XSlcbiAgICAgICAgICBzYm90LmVtaXQoJ3JlcGxpY2F0ZTpmaW5pc2gnLCBmaW5hbClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5nZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5vdGlmeS5saXN0ZW4oKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdW1tYXJpemVQcm9ncmVzcyAocHJvZ3Jlc3MpIHtcbiAgLy8gY291bnQgdGhlIG51bWJlciBvZiBmZWVkcyB1cGRhdGVkLCBhbmQgdGhlIG51bWJlciBvZiBuZXcgbWVzc2FnZXNcbiAgdmFyIHVwZGF0ZWRGZWVkcyA9IDAsIG5ld01lc3NhZ2VzID0gMFxuICBmb3IgKHZhciBhdXRob3IgaW4gcHJvZ3Jlc3MpIHtcbiAgICBpZiAocHJvZ3Jlc3NbYXV0aG9yXSA+IDApIHtcbiAgICAgIHVwZGF0ZWRGZWVkcysrXG4gICAgICBuZXdNZXNzYWdlcyArPSBwcm9ncmVzc1thdXRob3JdXG4gICAgfVxuICB9XG4gIC8vIG5vIG1lc3NhZ2UgaWYgbm8gdXBkYXRlc1xuICBpZiAodXBkYXRlZEZlZWRzID09PSAwKVxuICAgIHJldHVybiBmYWxzZVxuICByZXR1cm4gJ0ZlZWRzIHVwZGF0ZWQ6ICcrdXBkYXRlZEZlZWRzKycsIE5ldyBtZXNzYWdlczogJytuZXdNZXNzYWdlc1xufVxuXG5cblxuXG5cblxuIiwidmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG5cbnZhciBIYW5kc2hha2UgPSByZXF1aXJlKCdwdWxsLWhhbmRzaGFrZScpXG52YXIgU3RhdGUgPSByZXF1aXJlKCcuL3N0YXRlJylcblxudmFyIGNoYWxsZW5nZV9sZW5ndGggPSA2NFxudmFyIGNsaWVudF9hdXRoX2xlbmd0aCA9IDE2KzMyKzY0XG52YXIgc2VydmVyX2F1dGhfbGVuZ3RoID0gMTYrNjRcbnZhciBtYWNfbGVuZ3RoID0gMTZcblxuLy9jbGllbnQgaXMgQWxpY2Vcbi8vY3JlYXRlIHRoZSBjbGllbnQgc3RyZWFtIHdpdGggdGhlIHB1YmxpYyBrZXkgeW91IGV4cGVjdCB0byBjb25uZWN0IHRvLlxuZXhwb3J0cy5jbGllbnQgPVxuZXhwb3J0cy5jcmVhdGVDbGllbnRTdHJlYW0gPSBmdW5jdGlvbiAoYWxpY2UsIGFwcF9rZXksIHRpbWVvdXQpIHtcblxuICByZXR1cm4gZnVuY3Rpb24gKGJvYl9wdWIsIGNiKSB7XG4gICAgdmFyIHN0YXRlID0gbmV3IFN0YXRlKGFwcF9rZXksIGFsaWNlLCBib2JfcHViKVxuXG4gICAgdmFyIHN0cmVhbSA9IEhhbmRzaGFrZSh7dGltZW91dDogdGltZW91dH0sIGNiKVxuICAgIHZhciBzaGFrZSA9IHN0cmVhbS5oYW5kc2hha2VcbiAgICBkZWxldGUgc3RyZWFtLmhhbmRzaGFrZVxuXG4gICAgZnVuY3Rpb24gYWJvcnQoZXJyLCByZWFzb24pIHtcbiAgICAgIGlmKGVyciAmJiBlcnIgIT09IHRydWUpIHNoYWtlLmFib3J0KGVyciwgY2IpXG4gICAgICBlbHNlICAgICAgICAgICAgICAgICAgICBzaGFrZS5hYm9ydChuZXcgRXJyb3IocmVhc29uKSwgY2IpXG4gICAgfVxuXG4gICAgc2hha2Uud3JpdGUoc3RhdGUuY3JlYXRlQ2hhbGxlbmdlKCkpXG5cbiAgICBzaGFrZS5yZWFkKGNoYWxsZW5nZV9sZW5ndGgsIGZ1bmN0aW9uIChlcnIsIG1zZykge1xuICAgICAgaWYoZXJyKSByZXR1cm4gYWJvcnQoZXJyLCAnY2hhbGxlbmdlIG5vdCBhY2NlcHRlZCcpXG4gICAgICAvL2NyZWF0ZSB0aGUgY2hhbGxlbmdlIGZpcnN0LCBiZWNhdXNlIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBsb2NhbCBrZXlcbiAgICAgIGlmKCFzdGF0ZS52ZXJpZnlDaGFsbGVuZ2UobXNnKSlcbiAgICAgICAgcmV0dXJuIGFib3J0KG51bGwsICd3cm9uZyBwcm90b2NvbCAodmVyc2lvbj8pJylcblxuICAgICAgc2hha2Uud3JpdGUoc3RhdGUuY3JlYXRlQ2xpZW50QXV0aCgpKVxuXG4gICAgICBzaGFrZS5yZWFkKHNlcnZlcl9hdXRoX2xlbmd0aCwgZnVuY3Rpb24gKGVyciwgYm94ZWRfc2lnKSB7XG4gICAgICAgIGlmKGVycikgcmV0dXJuIGFib3J0KGVyciwgJ2hlbGxvIG5vdCBhY2NlcHRlZCcpXG5cbiAgICAgICAgaWYoIXN0YXRlLnZlcmlmeVNlcnZlckFjY2VwdChib3hlZF9zaWcpKVxuICAgICAgICAgIHJldHVybiBhYm9ydChudWxsLCAnc2VydmVyIG5vdCBhdXRoZW50aWNhdGVkJylcblxuICAgICAgICBjYihudWxsLCBzaGFrZS5yZXN0KCksIHN0YXRlLmNsZWFuU2VjcmV0cygpKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG59XG5cbi8vc2VydmVyIGlzIEJvYi5cbmV4cG9ydHMuc2VydmVyID1cbmV4cG9ydHMuY3JlYXRlU2VydmVyU3RyZWFtID0gZnVuY3Rpb24gKGJvYiwgYXV0aG9yaXplLCBhcHBfa2V5LCB0aW1lb3V0KSB7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChjYikge1xuICAgIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZShhcHBfa2V5LCBib2IpXG4gICAgdmFyIHN0cmVhbSA9IEhhbmRzaGFrZSh7dGltZW91dDogdGltZW91dH0sIGNiKVxuXG4gICAgdmFyIHNoYWtlID0gc3RyZWFtLmhhbmRzaGFrZVxuICAgIGRlbGV0ZSBzdHJlYW0uaGFuZHNoYWtlXG5cbiAgICBmdW5jdGlvbiBhYm9ydCAoZXJyLCByZWFzb24pIHtcbiAgICAgIGlmKGVyciAmJiBlcnIgIT09IHRydWUpIHNoYWtlLmFib3J0KGVyciwgY2IpXG4gICAgICBlbHNlICAgICAgICAgICAgICAgICAgICBzaGFrZS5hYm9ydChuZXcgRXJyb3IocmVhc29uKSwgY2IpXG4gICAgfVxuXG4gICAgc2hha2UucmVhZChjaGFsbGVuZ2VfbGVuZ3RoLCBmdW5jdGlvbiAoZXJyLCBjaGFsbGVuZ2UpIHtcbiAgICAgIGlmKGVycikgcmV0dXJuIGFib3J0KGVyciwgJ2V4cGVjdGVkIGNoYWxsZW5nZScpXG4gICAgICBpZighc3RhdGUudmVyaWZ5Q2hhbGxlbmdlKGNoYWxsZW5nZSkpXG4gICAgICAgIHJldHVybiBzaGFrZS5hYm9ydChuZXcgRXJyb3IoJ3dyb25nIHByb3RvY29sL3ZlcnNpb24nKSlcblxuICAgICAgc2hha2Uud3JpdGUoc3RhdGUuY3JlYXRlQ2hhbGxlbmdlKCkpXG4gICAgICBzaGFrZS5yZWFkKGNsaWVudF9hdXRoX2xlbmd0aCwgZnVuY3Rpb24gKGVyciwgaGVsbG8pIHtcbiAgICAgICAgaWYoZXJyKSByZXR1cm4gYWJvcnQoZXJyLCAnZXhwZWN0ZWQgaGVsbG8nKVxuICAgICAgICBpZighc3RhdGUudmVyaWZ5Q2xpZW50QXV0aChoZWxsbykpIHtcbiAgICAgICAgICAvL3dlIGtub3cgd2hvIHRoZSBjbGllbnQgd2FzLCBidXQgY2hvc2Ugbm90IHRvIGFuc3dlcjpcbiAgICAgICAgICBpZihzdGF0ZS5yZW1vdGUucHVibGljKVxuICAgICAgICAgICAgcmV0dXJuIGFib3J0KG51bGwsICd1bmF1dGhlbnRpY2F0ZWQgY2xpZW50OicgKyBzdGF0ZS5yZW1vdGUucHVibGljLnRvU3RyaW5nKCdoZXgnKSwgY2IpXG4gICAgICAgICAgLy9jbGllbnQgZGlhbGVkIHdyb25nIG51bWJlci4uLiAod2UgZG9uJ3Qga25vdyB3aG8gdGhleSB3aGVyZSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gYWJvcnQobnVsbCwgJ3dyb25nIG51bWJlcicpXG4gICAgICAgIH1cbiAgICAgICAgLy9jaGVjayBpZiB0aGUgdXNlciB3YW50cyB0byBzcGVhayB0byBhbGljZS5cbiAgICAgICAgYXV0aG9yaXplKHN0YXRlLnJlbW90ZS5wdWJsaWMsIGZ1bmN0aW9uIChlcnIsIGF1dGgpIHtcbiAgICAgICAgICBpZihhdXRoID09IG51bGwgJiYgIWVycikgZXJyID0gbmV3IEVycm9yKCdjbGllbnQgdW5hdXRob3JpemVkJylcbiAgICAgICAgICBpZighYXV0aCkgcmV0dXJuIGFib3J0KGVyciwgJ2NsaWVudCBhdXRoZW50aWNhdGlvbiByZWplY3RlZCcpXG4gICAgICAgICAgc3RhdGUuYXV0aCA9IGF1dGhcbiAgICAgICAgICBzaGFrZS53cml0ZShzdGF0ZS5jcmVhdGVTZXJ2ZXJBY2NlcHQoKSlcbiAgICAgICAgICBjYihudWxsLCBzaGFrZS5yZXN0KCksIHN0YXRlLmNsZWFuU2VjcmV0cygpKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxufVxuXG5cbiIsInZhciBoYW5kc2hha2UgPSByZXF1aXJlKCcuL2hhbmRzaGFrZScpXG52YXIgc2VjdXJlID0gcmVxdWlyZSgnLi9zZWN1cmUnKVxuXG5leHBvcnRzLmNsaWVudCA9XG5leHBvcnRzLmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uIChhbGljZSwgYXBwX2tleSwgdGltZW91dCkge1xuICB2YXIgY3JlYXRlID0gaGFuZHNoYWtlLmNsaWVudChhbGljZSwgYXBwX2tleSwgdGltZW91dClcblxuICByZXR1cm4gZnVuY3Rpb24gKGJvYiwgY2IpIHtcbiAgICBpZighQnVmZmVyLmlzQnVmZmVyKGJvYikgfHwgYm9iLmxlbmd0aCAhPSAzMilcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlQ2xpZW50ICptdXN0KiBiZSBwYXNzZWQgYSBwdWJsaWMga2V5JylcbiAgICByZXR1cm4gY3JlYXRlKGJvYiwgc2VjdXJlKGNiKSlcbiAgfVxuXG59XG5leHBvcnRzLnNlcnZlciA9XG5leHBvcnRzLmNyZWF0ZVNlcnZlciA9IGZ1bmN0aW9uIChib2IsIGF1dGhvcml6ZSwgYXBwX2tleSwgdGltZW91dCkge1xuICB2YXIgY3JlYXRlID0gaGFuZHNoYWtlLnNlcnZlcihib2IsIGF1dGhvcml6ZSwgYXBwX2tleSwgdGltZW91dClcblxuICByZXR1cm4gZnVuY3Rpb24gKGNiKSB7XG4gICAgcmV0dXJuIGNyZWF0ZShzZWN1cmUoY2IpKVxuICB9XG5cbn1cblxuXG4iLCJcbnZhciBzb2RpdW0gPSByZXF1aXJlKCdjaGxvcmlkZScpXG52YXIgbmV0ID0gcmVxdWlyZSgnbmV0JylcbnZhciB0b1B1bGwgPSByZXF1aXJlKCdzdHJlYW0tdG8tcHVsbC1zdHJlYW0nKVxudmFyIHNocyA9IHJlcXVpcmUoJy4vJylcbnZhciBpc0J1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlclxudmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgRGVmZXIgPSByZXF1aXJlKCdwdWxsLWRlZmVyL2R1cGxleCcpXG5cbmZ1bmN0aW9uIGFzc2VydE9wdHMgKG9wdHMpIHtcbiAgaWYoIShvcHRzICYmICdvYmplY3QnID09PSB0eXBlb2Ygb3B0cykpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvcHRzICptdXN0KiBiZSBwcm92aWRlZCcpXG59XG5mdW5jdGlvbiBhc3NlcnRLZXlzIChvcHRzKSB7XG4gIGlmKCEoXG4gICAgICBvcHRzLmtleXNcbiAgICAmJiBpc0J1ZmZlcihvcHRzLmtleXMucHVibGljS2V5KVxuICAgICYmIGlzQnVmZmVyKG9wdHMua2V5cy5zZWNyZXRLZXkpXG4gICkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvcHRzLmtleXMgPSBlZDI1NTE5IGtleSBwYWlyICptdXN0KiBiZSBwcm92aWRlZC4nKVxufVxuZnVuY3Rpb24gYXNzZXJ0QXBwS2V5IChvcHRzKSB7XG4gIGlmKCFpc0J1ZmZlcihvcHRzLmFwcEtleSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdhcHBLZXkgbXVzdCBiZSBwcm92aWRlZCcpXG59XG5cbmZ1bmN0aW9uIGFzc2VydEFkZHIgKGFkZHIpIHtcbiAgaWYoIWlzQnVmZmVyKGFkZHIua2V5KSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdHMua2V5ICptdXN0KiBiZSBhbiBlZDI1NTE5IHB1YmxpYyBrZXknKVxuICBpZighTnVtYmVyLmlzSW50ZWdlcigrYWRkci5wb3J0KSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdHMucG9ydCAqbXVzdCogYmUgcHJvdmlkZWQnKVxuICBpZighKCdzdHJpbmcnID09PSB0eXBlb2YgYWRkci5ob3N0IHx8IG51bGwgPT0gYWRkci5ob3N0KSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdHMuaG9zdCBtdXN0IGJlIHN0cmluZyBvciBudWxsJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGVOb2RlIChvcHRzKSB7XG4gIHZhciBrZXlzID1cbiAgICBpc0J1ZmZlcihvcHRzLnNlZWQpXG4gICAgPyBzb2RpdW0uY3J5cHRvX3NpZ25fc2VlZF9rZXlwYWlyKG9wdHMuc2VlZClcbiAgICA6IG9wdHMua2V5c1xuXG4gIGFzc2VydE9wdHMob3B0cyk7IGFzc2VydEtleXMoe2tleXM6IGtleXN9KTsgYXNzZXJ0QXBwS2V5KG9wdHMpXG5cbiAgdmFyIGNyZWF0ZSA9IHNocy5jcmVhdGVDbGllbnQoa2V5cywgb3B0cy5hcHBLZXksIG9wdHMudGltZW91dClcblxuICByZXR1cm4ge1xuICAgIHB1YmxpY0tleToga2V5cy5wdWJsaWNLZXksXG4gICAgY3JlYXRlU2VydmVyOiBmdW5jdGlvbiAob25Db25uZWN0KSB7XG4gICAgICBpZignZnVuY3Rpb24nICE9PSB0eXBlb2Ygb3B0cy5hdXRoZW50aWNhdGUpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZnVuY3Rpb24gb3B0cy5hdXRoZW50aWNhdGUocHViLCBjYiknXG4gICAgICAgICAgKyAnKm11c3QqIGJlIHByb3ZpZGVkIGluIG9yZGVyIHRvIHJlY2VpdmUgY29ubmVjdGlvbnMnKVxuICAgICAgdmFyIGNyZWF0ZVNlcnZlclN0cmVhbSA9XG4gICAgICAgIHNocy5jcmVhdGVTZXJ2ZXIoa2V5cywgb3B0cy5hdXRoZW50aWNhdGUsIG9wdHMuYXBwS2V5LCBvcHRzLnRpbWVvdXQpXG4gICAgICB2YXIgc2VydmVyXG4gICAgICByZXR1cm4gc2VydmVyID0gbmV0LmNyZWF0ZVNlcnZlcihmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbSA9IHRvUHVsbC5kdXBsZXgoc3RyZWFtKVxuICAgICAgICBwdWxsKFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBjcmVhdGVTZXJ2ZXJTdHJlYW0oZnVuY3Rpb24gKGVyciwgc3RyZWFtKSB7XG4gICAgICAgICAgICBpZihlcnIpIHJldHVybiBzZXJ2ZXIuZW1pdCgndW5hdXRoZW50aWNhdGVkJywgZXJyKVxuICAgICAgICAgICAgb25Db25uZWN0KHN0cmVhbSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzdHJlYW1cbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9LFxuICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChhZGRyLCBjYikge1xuICAgICAgYXNzZXJ0QWRkcihhZGRyKVxuICAgICAgdmFyIHN0cmVhbSA9IHRvUHVsbC5kdXBsZXgobmV0LmNvbm5lY3QoYWRkci5wb3J0LCBhZGRyLmhvc3QpKVxuXG4gICAgICBpZihjYikge1xuICAgICAgICBwdWxsKFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBjcmVhdGUoYWRkci5rZXksIGNiKSxcbiAgICAgICAgICBzdHJlYW1cbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG5cbiAgICAgICAgdmFyIGRlZmVyID0gRGVmZXIoKVxuXG4gICAgICAgIHB1bGwoXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIGNyZWF0ZShhZGRyLmtleSwgZnVuY3Rpb24gKGVyciwgc3RyZWFtKSB7XG4gICAgICAgICAgICBpZihlcnIpXG4gICAgICAgICAgICAgIGRlZmVyLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKGFib3J0LCBjYikgeyBjYihlcnIpIH0sXG4gICAgICAgICAgICAgICAgc2luazogZnVuY3Rpb24gKHJlYWQpIHsgcmVhZChlcnIsIGZ1bmN0aW9uICgpe30pIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGVsc2UgZGVmZXIucmVzb2x2ZShzdHJlYW0pXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3RyZWFtXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gZGVmZXJcblxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwidmFyIHNvZGl1bSA9IHJlcXVpcmUoJ2NobG9yaWRlJylcbnZhciBoYXNoID0gc29kaXVtLmNyeXB0b19oYXNoX3NoYTI1NlxudmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgYm94ZXMgPSByZXF1aXJlKCdwdWxsLWJveC1zdHJlYW0nKVxuXG52YXIgY29uY2F0ID0gQnVmZmVyLmNvbmNhdFxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjYikge1xuXG4gIHJldHVybiBmdW5jdGlvbiAoZXJyLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYoZXJyKSByZXR1cm4gY2IoZXJyKVxuXG4gICAgdmFyIGVuX2tleSA9IGhhc2goY29uY2F0KFtzdGF0ZS5zZWNyZXQsIHN0YXRlLnJlbW90ZS5wdWJsaWNdKSlcbiAgICB2YXIgZGVfa2V5ID0gaGFzaChjb25jYXQoW3N0YXRlLnNlY3JldCwgc3RhdGUubG9jYWwucHVibGljXSkpXG5cbiAgICB2YXIgZW5fbm9uY2UgPSBzdGF0ZS5yZW1vdGUuYXBwX21hYy5zbGljZSgwLCAyNClcbiAgICB2YXIgZGVfbm9uY2UgPSBzdGF0ZS5sb2NhbC5hcHBfbWFjLnNsaWNlKDAsIDI0KVxuXG4gICAgY2IobnVsbCwge1xuICAgICAgcmVtb3RlOiBzdGF0ZS5yZW1vdGUucHVibGljLFxuICAgICAgLy9vbiB0aGUgc2VydmVyLCBhdHRhY2ggYW55IG1ldGFkYXRhIGdhdGhlcmVkXG4gICAgICAvL2R1cmluZyBgYXV0aG9yaXplYCBjYWxsXG4gICAgICBhdXRoOiBzdGF0ZS5hdXRoLFxuICAgICAgc291cmNlOiBwdWxsKFxuICAgICAgICBzdHJlYW0uc291cmNlLFxuICAgICAgICBib3hlcy5jcmVhdGVVbmJveFN0cmVhbShkZV9rZXksIGRlX25vbmNlKVxuICAgICAgKSxcbiAgICAgIHNpbms6IHB1bGwoXG4gICAgICAgIGJveGVzLmNyZWF0ZUJveFN0cmVhbShlbl9rZXksIGVuX25vbmNlKSxcbiAgICAgICAgc3RyZWFtLnNpbmtcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbn1cblxuXG4iLCJcbnZhciBzb2RpdW0gICAgICA9IHJlcXVpcmUoJ2NobG9yaWRlJylcblxudmFyIGtleXBhaXIgICAgID0gc29kaXVtLmNyeXB0b19ib3hfa2V5cGFpclxudmFyIHNoYXJlZCAgICAgID0gc29kaXVtLmNyeXB0b19zY2FsYXJtdWx0XG52YXIgaGFzaCAgICAgICAgPSBzb2RpdW0uY3J5cHRvX2hhc2hfc2hhMjU2XG52YXIgc2lnbiAgICAgICAgPSBzb2RpdW0uY3J5cHRvX3NpZ25fZGV0YWNoZWRcbnZhciB2ZXJpZnkgICAgICA9IHNvZGl1bS5jcnlwdG9fc2lnbl92ZXJpZnlfZGV0YWNoZWRcbnZhciBhdXRoICAgICAgICA9IHNvZGl1bS5jcnlwdG9fYXV0aFxudmFyIHZlcmlmeV9hdXRoID0gc29kaXVtLmNyeXB0b19hdXRoX3ZlcmlmeVxudmFyIGN1cnZpZnlfcGsgID0gc29kaXVtLmNyeXB0b19zaWduX2VkMjU1MTlfcGtfdG9fY3VydmUyNTUxOVxudmFyIGN1cnZpZnlfc2sgID0gc29kaXVtLmNyeXB0b19zaWduX2VkMjU1MTlfc2tfdG9fY3VydmUyNTUxOVxudmFyIGJveCAgICAgICAgID0gc29kaXVtLmNyeXB0b19zZWNyZXRib3hfZWFzeVxudmFyIHVuYm94ICAgICAgID0gc29kaXVtLmNyeXB0b19zZWNyZXRib3hfb3Blbl9lYXN5XG5cbnZhciBjb25jYXQgPSBCdWZmZXIuY29uY2F0XG5cbnZhciBub25jZSA9IG5ldyBCdWZmZXIoMjQpOyBub25jZS5maWxsKDApXG5cbnZhciBjaGFsbGVuZ2VfbGVuZ3RoID0gNjRcbnZhciBjbGllbnRfYXV0aF9sZW5ndGggPSAxNiszMis2NFxudmFyIHNlcnZlcl9hdXRoX2xlbmd0aCA9IDE2KzY0XG52YXIgbWFjX2xlbmd0aCA9IDE2XG5cbi8vdGhpcyBpcyBhIHNpbXBsZSBzZWN1cmUgaGFuZHNoYWtlLFxuLy90aGUgY2xpZW50IHB1YmxpYyBrZXkgaXMgcGFzc2VkIGluIHBsYWluIHRleHQsXG5cbm1vZHVsZS5leHBvcnRzID0gU3RhdGVcblxuZnVuY3Rpb24gU3RhdGUgKGFwcF9rZXksIGxvY2FsLCByZW1vdGUpIHtcbiAgaWYoISh0aGlzIGluc3RhbmNlb2YgU3RhdGUpKSByZXR1cm4gbmV3IFN0YXRlKGFwcF9rZXksIGxvY2FsLCByZW1vdGUpXG4gIHRoaXMuYXBwX2tleSA9IGFwcF9rZXlcbiAgdmFyIGt4ID0ga2V5cGFpcigpXG4gIHRoaXMubG9jYWwgPSB7XG4gICAga3hfcGs6IGt4LnB1YmxpY0tleSxcbiAgICBreF9zazoga3guc2VjcmV0S2V5LFxuICAgIHB1YmxpYzogbG9jYWwucHVibGljS2V5LFxuICAgIHNlY3JldDogbG9jYWwuc2VjcmV0S2V5XG4gIH1cbiAgdGhpcy5yZW1vdGUgPSB7XG4gICAgcHVibGljOiByZW1vdGUgfHwgbnVsbFxuICB9XG5cbn1cblxudmFyIHByb3RvID0gU3RhdGUucHJvdG90eXBlXG5cbnByb3RvLmNyZWF0ZUNoYWxsZW5nZSA9XG5mdW5jdGlvbiBjcmVhdGVDaGFsbGVuZ2UgKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzXG5cbiAgc3RhdGUubG9jYWwuYXBwX21hYyA9IGF1dGgoc3RhdGUubG9jYWwua3hfcGssIHN0YXRlLmFwcF9rZXkpXG4gIHJldHVybiBjb25jYXQoW3N0YXRlLmxvY2FsLmFwcF9tYWMsIHN0YXRlLmxvY2FsLmt4X3BrXSlcbn1cblxucHJvdG8udmVyaWZ5Q2hhbGxlbmdlID1cbmZ1bmN0aW9uIHZlcmlmeUNoYWxsZW5nZSAoY2hhbGxlbmdlKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXNcblxuICB2YXIgbWFjID0gY2hhbGxlbmdlLnNsaWNlKDAsIDMyKVxuICB2YXIgcmVtb3RlX3BrID0gY2hhbGxlbmdlLnNsaWNlKDMyLCBjaGFsbGVuZ2UubGVuZ3RoKVxuICBpZigwICE9PSB2ZXJpZnlfYXV0aChtYWMsIHJlbW90ZV9waywgc3RhdGUuYXBwX2tleSkpXG4gICAgcmV0dXJuIG51bGxcblxuICBzdGF0ZS5yZW1vdGUua3hfcGsgPSByZW1vdGVfcGtcbiAgc3RhdGUucmVtb3RlLmFwcF9tYWMgPSBtYWNcbiAgc3RhdGUuc2VjcmV0ID0gc2hhcmVkKHN0YXRlLmxvY2FsLmt4X3NrLCBzdGF0ZS5yZW1vdGUua3hfcGspXG4gIHN0YXRlLnNoYXNoID0gaGFzaChzdGF0ZS5zZWNyZXQpXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuXG5wcm90by5jcmVhdGVDbGllbnRBdXRoID1cbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudEF1dGggKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzXG4gIC8vbm93IHdlIGhhdmUgYWdyZWVkIG9uIHRoZSBzZWNyZXQuXG4gIC8vdGhpcyBjYW4gYmUgYW4gZW5jcnlwdGlvbiBzZWNyZXQsXG4gIC8vb3IgYSBobWFjIHNlY3JldC5cblxuICAvLyBzaGFyZWQobG9jYWwua3gsIHJlbW90ZS5wdWJsaWMpXG4gIHZhciBhX2JvYiA9IHNoYXJlZChzdGF0ZS5sb2NhbC5reF9zaywgY3VydmlmeV9wayhzdGF0ZS5yZW1vdGUucHVibGljKSlcbiAgc3RhdGUuYV9ib2IgPSBhX2JvYlxuICBzdGF0ZS5zZWNyZXQyID0gaGFzaChjb25jYXQoW3N0YXRlLmFwcF9rZXksIHN0YXRlLnNlY3JldCwgYV9ib2JdKSlcblxuICB2YXIgc2lnbmVkID0gY29uY2F0KFtzdGF0ZS5hcHBfa2V5LCBzdGF0ZS5yZW1vdGUucHVibGljLCBzdGF0ZS5zaGFzaF0pXG4gIHZhciBzaWcgPSBzaWduKHNpZ25lZCwgc3RhdGUubG9jYWwuc2VjcmV0KVxuXG4gIHN0YXRlLmxvY2FsLmhlbGxvID0gQnVmZmVyLmNvbmNhdChbc2lnLCBzdGF0ZS5sb2NhbC5wdWJsaWNdKVxuICByZXR1cm4gYm94KHN0YXRlLmxvY2FsLmhlbGxvLCBub25jZSwgc3RhdGUuc2VjcmV0Milcbn1cblxucHJvdG8udmVyaWZ5Q2xpZW50QXV0aCA9XG5mdW5jdGlvbiB2ZXJpZnlDbGllbnRBdXRoIChkYXRhKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXNcblxuICB2YXIgYV9ib2IgPSBzaGFyZWQoY3VydmlmeV9zayhzdGF0ZS5sb2NhbC5zZWNyZXQpLCBzdGF0ZS5yZW1vdGUua3hfcGspXG4gIHN0YXRlLmFfYm9iID0gYV9ib2JcbiAgc3RhdGUuc2VjcmV0MiA9IGhhc2goY29uY2F0KFtzdGF0ZS5hcHBfa2V5LCBzdGF0ZS5zZWNyZXQsIGFfYm9iXSkpXG5cbiAgc3RhdGUucmVtb3RlLmhlbGxvID0gdW5ib3goZGF0YSwgbm9uY2UsIHN0YXRlLnNlY3JldDIpXG4gIGlmKCFzdGF0ZS5yZW1vdGUuaGVsbG8pXG4gICAgcmV0dXJuIG51bGxcblxuICB2YXIgc2lnID0gc3RhdGUucmVtb3RlLmhlbGxvLnNsaWNlKDAsIDY0KVxuICB2YXIgcHVibGljID0gc3RhdGUucmVtb3RlLmhlbGxvLnNsaWNlKDY0LCBjbGllbnRfYXV0aF9sZW5ndGgpXG5cbiAgdmFyIHNpZ25lZCA9IGNvbmNhdChbc3RhdGUuYXBwX2tleSwgc3RhdGUubG9jYWwucHVibGljLCBzdGF0ZS5zaGFzaF0pXG4gIGlmKCF2ZXJpZnkoc2lnLCBzaWduZWQsIHB1YmxpYykpXG4gICAgcmV0dXJuIG51bGxcblxuICBzdGF0ZS5yZW1vdGUucHVibGljID0gcHVibGljXG5cbiAgcmV0dXJuIHRydWVcbn1cblxucHJvdG8uY3JlYXRlU2VydmVyQWNjZXB0ID1cbmZ1bmN0aW9uIGNyZWF0ZVNlcnZlckFjY2VwdCAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXNcblxuICAvL3NoYXJlZCBrZXkgYmV0d2VlbiBteSBsb2NhbCBlcGhlbWVyYWwga2V5ICsgcmVtb3RlIHB1YmxpY1xuICB2YXIgYl9hbGljZSA9IHNoYXJlZChzdGF0ZS5sb2NhbC5reF9zaywgY3VydmlmeV9wayhzdGF0ZS5yZW1vdGUucHVibGljKSlcbiAgc3RhdGUuYl9hbGljZSA9IGJfYWxpY2VcbiAgc3RhdGUuc2VjcmV0MyA9IGhhc2goY29uY2F0KFtzdGF0ZS5hcHBfa2V5LCBzdGF0ZS5zZWNyZXQsIHN0YXRlLmFfYm9iLCBzdGF0ZS5iX2FsaWNlXSkpXG5cbiAgdmFyIHNpZ25lZCA9IGNvbmNhdChbc3RhdGUuYXBwX2tleSwgc3RhdGUucmVtb3RlLmhlbGxvLCBzdGF0ZS5zaGFzaF0pXG4gIHZhciBva2F5ID0gc2lnbihzaWduZWQsIHN0YXRlLmxvY2FsLnNlY3JldClcbiAgcmV0dXJuIGJveChva2F5LCBub25jZSwgc3RhdGUuc2VjcmV0Mylcbn1cblxucHJvdG8udmVyaWZ5U2VydmVyQWNjZXB0ID1cbmZ1bmN0aW9uIHZlcmlmeVNlcnZlckFjY2VwdCAoYm94ZWRfb2theSkge1xuICB2YXIgc3RhdGUgPSB0aGlzXG5cbiAgdmFyIGJfYWxpY2UgPSBzaGFyZWQoY3VydmlmeV9zayhzdGF0ZS5sb2NhbC5zZWNyZXQpLCBzdGF0ZS5yZW1vdGUua3hfcGspXG4gIHN0YXRlLmJfYWxpY2UgPSBiX2FsaWNlXG4vLyAgc3RhdGUuc2VjcmV0MyA9IGhhc2goY29uY2F0KFtzdGF0ZS5zZWNyZXQyLCBiX2FsaWNlXSkpXG4gIHN0YXRlLnNlY3JldDMgPSBoYXNoKGNvbmNhdChbc3RhdGUuYXBwX2tleSwgc3RhdGUuc2VjcmV0LCBzdGF0ZS5hX2JvYiwgc3RhdGUuYl9hbGljZV0pKVxuXG4gIHZhciBzaWcgPSB1bmJveChib3hlZF9va2F5LCBub25jZSwgc3RhdGUuc2VjcmV0MylcbiAgaWYoIXNpZykgcmV0dXJuIG51bGxcbiAgdmFyIHNpZ25lZCA9IGNvbmNhdChbc3RhdGUuYXBwX2tleSwgc3RhdGUubG9jYWwuaGVsbG8sIHN0YXRlLnNoYXNoXSlcbiAgaWYoIXZlcmlmeShzaWcsIHNpZ25lZCwgc3RhdGUucmVtb3RlLnB1YmxpYykpXG4gICAgICByZXR1cm4gbnVsbFxuICByZXR1cm4gdHJ1ZVxufVxuXG5wcm90by5jbGVhblNlY3JldHMgPVxuZnVuY3Rpb24gY2xlYW5TZWNyZXRzICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpc1xuXG4gIC8vIGNsZWFuIGF3YXkgYWxsIHRoZSBzZWNyZXRzIGZvciBmb3J3YXJkIHNlY3VyaXR5LlxuICAvLyB1c2UgYSBkaWZmZXJlbnQgc2VjcmV0IGhhc2goc2VjcmV0MykgaW4gdGhlIHJlc3Qgb2YgdGhlIHNlc3Npb24sXG4gIC8vIGFuZCBzbyB0aGF0IGEgc2xvcHB5IGFwcGxpY2F0aW9uIGNhbm5vdCBjb21wcm9taXNlIHRoZSBoYW5kc2hha2UuXG5cbiAgZGVsZXRlIHN0YXRlLmxvY2FsLnNlY3JldFxuICBzdGF0ZS5zaGFzaC5maWxsKDApXG4gIHN0YXRlLnNlY3JldC5maWxsKDApXG4gIHN0YXRlLmFfYm9iLmZpbGwoMClcbiAgc3RhdGUuYl9hbGljZS5maWxsKDApXG4gIHN0YXRlLnNlY3JldCA9IGhhc2goc3RhdGUuc2VjcmV0MylcbiAgc3RhdGUuc2VjcmV0Mi5maWxsKDApXG4gIHN0YXRlLnNlY3JldDMuZmlsbCgwKVxuICBzdGF0ZS5sb2NhbC5reF9zay5maWxsKDApXG5cbiAgZGVsZXRlIHN0YXRlLnNoYXNoXG4gIGRlbGV0ZSBzdGF0ZS5zZWNyZXQyXG4gIGRlbGV0ZSBzdGF0ZS5zZWNyZXQzXG4gIGRlbGV0ZSBzdGF0ZS5hX2JvYlxuICBkZWxldGUgc3RhdGUuYl9hbGljZVxuICBkZWxldGUgc3RhdGUubG9jYWwua3hfc2tcblxuICByZXR1cm4gc3RhdGVcbn1cblxuIiwidmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpXG52YXIgdSAgICAgICAgICAgID0gcmVxdWlyZSgnLi91dGlsJylcbnZhciBIb29rYWJsZSAgICAgPSByZXF1aXJlKCdob294JylcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAoZikge1xuICByZXR1cm4gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZcbn1cblxuZnVuY3Rpb24gbWVyZ2UgKGEsIGIsIG1hcHBlcikge1xuXG4gIGZvcih2YXIgayBpbiBiKSB7XG4gICAgaWYoYltrXSAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIGJba10gJiYgIUJ1ZmZlci5pc0J1ZmZlcihiW2tdKSlcbiAgICAgIG1lcmdlKGFba10gPSB7fSwgYltrXSwgbWFwcGVyKVxuICAgIGVsc2VcbiAgICAgIGFba10gPSBtYXBwZXIoYltrXSwgaylcbiAgfVxuXG4gIHJldHVybiBhXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHBsdWdpbnMpIHtcblxuICBmdW5jdGlvbiBjcmVhdGUgKG9wdHMpIHtcbiAgICAvL2NoYW5nZSBldmVudCBlbWl0dGVyIHRvIHNvbWV0aGluZyB3aXRoIG1vcmUgcmlnb3JvdXMgc2VjdXJpdHk/XG4gICAgdmFyIGFwaSA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICAgIGNyZWF0ZS5wbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWcpIHtcbiAgICAgIHZhciBfYXBpID0gcGx1Zy5pbml0LmNhbGwoe2NyZWF0ZUNsaWVudDogY3JlYXRlLmNyZWF0ZUNsaWVudH0sIGFwaSwgb3B0cylcbiAgICAgIGlmKHBsdWcubmFtZSkge1xuICAgICAgICB2YXIgbyA9IHt9OyBvW3BsdWcubmFtZV0gPSBfYXBpOyBfYXBpID0gb1xuICAgICAgfVxuICAgICAgYXBpID0gbWVyZ2UoYXBpLCBfYXBpLCBmdW5jdGlvbiAodiwgaykge1xuICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHYpIHtcbiAgICAgICAgICB2ID0gSG9va2FibGUodilcbiAgICAgICAgICBpZiAocGx1Zy5tYW5pZmVzdCAmJiBwbHVnLm1hbmlmZXN0W2tdID09PSAnc3luYycpIHtcbiAgICAgICAgICAgIHUuaG9va09wdGlvbmFsQ0IodilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiBhcGlcbiAgfVxuXG4gIGNyZWF0ZS5wbHVnaW5zID0gW11cbiAgY3JlYXRlLm1hbmlmZXN0ID0ge31cbiAgY3JlYXRlLnBlcm1pc3Npb25zID0ge31cblxuICBjcmVhdGUudXNlID0gZnVuY3Rpb24gKHBsdWcpIHtcbiAgICBpZihpc0Z1bmN0aW9uKHBsdWcpKVxuICAgICAgcmV0dXJuIGNyZWF0ZS5wbHVnaW5zLnB1c2goe2luaXQ6IHBsdWd9KSwgY3JlYXRlXG5cbiAgICBpZighcGx1Zy5pbml0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwbHVnaW5zICptdXN0KiBoYXZlIFwiaW5pdFwiIG1ldGhvZCcpXG5cbiAgICB2YXIgbmFtZSA9IHBsdWcubmFtZVxuICAgIGlmKHBsdWcubWFuaWZlc3QpXG4gICAgICBjcmVhdGUubWFuaWZlc3QgPVxuICAgICAgICB1Lm1lcmdlLm1hbmlmZXN0KGNyZWF0ZS5tYW5pZmVzdCwgcGx1Zy5tYW5pZmVzdCwgbmFtZSlcbiAgICBpZihwbHVnLnBlcm1pc3Npb25zKVxuICAgICAgY3JlYXRlLnBlcm1pc3Npb25zID1cbiAgICAgICAgdS5tZXJnZS5wZXJtaXNzaW9ucyhjcmVhdGUucGVybWlzc2lvbnMsIHBsdWcucGVybWlzc2lvbnMsIG5hbWUpXG4gICAgY3JlYXRlLnBsdWdpbnMucHVzaChwbHVnKVxuXG4gICAgcmV0dXJuIGNyZWF0ZVxuICB9XG5cbiAgO1tdLmNvbmNhdChwbHVnaW5zKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChjcmVhdGUudXNlKVxuXG4gIHJldHVybiBjcmVhdGVcbn1cbiIsInZhciB1ICAgICAgICAgID0gcmVxdWlyZSgnLi91dGlsJylcbnZhciBBcGkgICAgICAgID0gcmVxdWlyZSgnLi9hcGknKVxudmFyIE11eHJwYyAgICAgPSByZXF1aXJlKCdtdXhycGMnKVxudmFyIHB1bGwgICAgICAgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgY3JlYXRlTm9kZSA9IHJlcXVpcmUoJ3NlY3JldC1oYW5kc2hha2UvbmV0JylcbnZhciBub25Qcml2YXRlID0gcmVxdWlyZSgnbm9uLXByaXZhdGUtaXAnKVxudmFyIEluYWN0aXZlICAgPSByZXF1aXJlKCdwdWxsLWluYWN0aXZpdHknKVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7IHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZiB9XG5cbmZ1bmN0aW9uIGlzU3RyaW5nIChzKSB7IHJldHVybiAnc3RyaW5nJyA9PT0gdHlwZW9mIHMgfVxuXG5mdW5jdGlvbiBlYWNoKG9iaiwgaXRlcikge1xuICBpZihBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmouZm9yRWFjaChpdGVyKVxuICBmb3IodmFyIGsgaW4gb2JqKSBpdGVyKG9ialtrXSwgaywgb2JqKVxufVxuXG5mdW5jdGlvbiB0b0J1ZmZlcihiYXNlNjQpIHtcbiAgaWYoQnVmZmVyLmlzQnVmZmVyKGJhc2U2NCkpIHJldHVybiBiYXNlNjRcbiAgdmFyIGkgPSBiYXNlNjQuaW5kZXhPZignLicpXG4gIHJldHVybiBuZXcgQnVmZmVyKH5pID8gYmFzZTY0LnN1YnN0cmluZygwLCBpKSA6IGJhc2U2NCwgJ2Jhc2U2NCcpXG59XG5cbmZ1bmN0aW9uIHRvU29kaXVtS2V5cyAoa2V5cykge1xuICBpZighKGlzU3RyaW5nKGtleXMucHVibGljKSAmJiBpc1N0cmluZyhrZXlzLnByaXZhdGUpKSlcbiAgICByZXR1cm4ga2V5c1xuICByZXR1cm4ge1xuICAgIHB1YmxpY0tleTogdG9CdWZmZXIoa2V5cy5wdWJsaWMpLFxuICAgIHNlY3JldEtleTogdG9CdWZmZXIoa2V5cy5wcml2YXRlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvZWFyc2VBZGRyZXNzIChhZGRyZXNzKSB7XG4gIGlmKGlzU3RyaW5nKGFkZHJlc3MpKSBhZGRyZXNzID0gdS5wYXJzZUFkZHJlc3MoYWRkcmVzcylcbiAgaWYoaXNTdHJpbmcoYWRkcmVzcy5rZXkpKVxuICAgIHJldHVybiB7XG4gICAgICBob3N0OiBhZGRyZXNzLmhvc3QsIHBvcnQ6IGFkZHJlc3MucG9ydCxcbiAgICAgIGtleTogbmV3IEJ1ZmZlcihcbiAgICAgICAgYWRkcmVzcy5rZXlcbiAgICAgICAgICAuc3Vic3RyaW5nKDEsIGFkZHJlc3Mua2V5LmluZGV4T2YoJy4nKSksXG4gICAgICAgICdiYXNlNjQnXG4gICAgICApXG4gICAgfVxuICByZXR1cm4gYWRkcmVzc1xufVxuXG4vL29wdHMgbXVzdCBoYXZlIGFwcEtleVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0cykge1xuXG4gIHZhciBhcHBLZXkgPSBvcHRzLmFwcEtleVxuICB2YXIgZGVmYXVsdFRpbWVvdXQgPSAoXG4gICAgb3B0cy5kZWZhdWx0VGltZW91dCB8fCA1ZTMgLy8gNSBzZWNvbmRzLlxuICApXG4gIHZhciB0aW1lb3V0X2hhbmRzaGFrZVxuXG4gIGlmKG9wdHMudGltZXJzICYmICFpc05hTihvcHRzLnRpbWVycy5pbmFjdGl2aXR5KSlcbiAgICBkZWZhdWx0VGltZW91dCA9IG9wdHMudGltZXJzLmluYWN0aXZpdHlcbiAgaWYob3B0cy50aW1lcnMgJiYgIWlzTmFOKG9wdHMudGltZXJzLmhhbmRzaGFrZSkpXG4gICAgdGltZW91dF9oYW5kc2hha2UgPSBvcHRzLnRpbWVycy5oYW5kc2hha2VcbiAgdGltZW91dF9oYW5kc2hha2UgPSB0aW1lb3V0X2hhbmRzaGFrZSB8fCA1ZTNcblxuICBvcHRzLnBlcm1pc3Npb25zID0gb3B0cy5wZXJtaXNzaW9ucyB8fCB7fVxuXG4gIHZhciBjcmVhdGUgPSBBcGkob3B0cy5wZXJtaXNzaW9ucyA/IFt7XG4gICAgcGVybWlzc2lvbnM6IG9wdHMucGVybWlzc2lvbnMsXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge31cbiAgfV06IG51bGwpXG5cbiAgY3JlYXRlLmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgaWYob3B0cy5rZXlzKSBvcHRzLmtleXMgPSB0b1NvZGl1bUtleXMob3B0cy5rZXlzKVxuICAgIGlmKG9wdHMuc2VlZCkgb3B0cy5zZWVkID0gdG9CdWZmZXIob3B0cy5zZWVkKVxuLy8gICAgb3B0cy5hcHBLZXkgPSB0b0J1ZmZlcihvcHRzLmFwcEtleSB8fCBhcHBLZXkpXG5cbiAgICB2YXIgc25ldCA9IGNyZWF0ZU5vZGUoe1xuICAgICAga2V5czogb3B0cy5rZXlzICYmIHRvU29kaXVtS2V5cyhvcHRzLmtleXMpLFxuICAgICAgc2VlZDogb3B0cy5zZWVkICYmIHRvQnVmZmVyKG9wdHMuc2VlZCksXG4gICAgICBhcHBLZXk6IHRvQnVmZmVyKG9wdHMuYXBwS2V5IHx8IGFwcEtleSksXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQgfHwgKG9wdHMudGltZXJzICYmIG9wdHMudGltZXJzLmhhbmRzaGFrZSkgfHwgNWUzXG4gICAgfSlcblxuICAgIHJldHVybiBmdW5jdGlvbiAoYWRkcmVzcywgY2IpIHtcbiAgICAgIGFkZHJlc3MgPSBjb2VhcnNlQWRkcmVzcyhhZGRyZXNzKVxuXG4gICAgICBzbmV0LmNvbm5lY3QoYWRkcmVzcywgZnVuY3Rpb24gKGVyciwgc3RyZWFtKSB7XG4gICAgICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgdmFyIHJwYyA9IE11eHJwYyhvcHRzLm1hbmlmZXN0IHx8IGNyZWF0ZS5tYW5pZmVzdCwge30pKHt9KVxuICAgICAgICBwdWxsKHN0cmVhbSwgcnBjLmNyZWF0ZVN0cmVhbSgpLCBzdHJlYW0pXG4gICAgICAgIGNiKG51bGwsIHJwYylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZS51c2Uoe1xuICAgIG1hbmlmZXN0OiB7XG4gICAgICBhdXRoOiAnYXN5bmMnLFxuICAgICAgYWRkcmVzczogJ3N5bmMnLFxuICAgICAgbWFuaWZlc3Q6ICdzeW5jJyxcbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGksIG9wdHMsIHBlcm1pc3Npb25zLCBtYW5pZmVzdCkge1xuICAgICAgdmFyIHNuZXQgPSBjcmVhdGVOb2RlKHtcbiAgICAgICAga2V5czogb3B0cy5rZXlzICYmIHRvU29kaXVtS2V5cyhvcHRzLmtleXMpLFxuICAgICAgICBzZWVkOiBvcHRzLnNlZWQsXG4gICAgICAgIGFwcEtleTogdG9CdWZmZXIob3B0cy5hcHBLZXkgfHwgYXBwS2V5KSxcblxuICAgICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgdGltZW91dDogdGltZW91dF9oYW5kc2hha2UsXG5cbiAgICAgICAgYXV0aGVudGljYXRlOiBmdW5jdGlvbiAocHViLCBjYikge1xuICAgICAgICAgIHZhciBpZCA9ICdAJyt1LnRvSWQocHViKVxuICAgICAgICAgIGFwaS5hdXRoKGlkLCBmdW5jdGlvbiAoZXJyLCBhdXRoKSB7XG4gICAgICAgICAgICBpZihlcnIpIGNiKGVycilcbiAgICAgICAgICAgIGVsc2UgICAgY2IobnVsbCwgYXV0aCB8fCBjcmVhdGUucGVybWlzc2lvbnMuYW5vbnltb3VzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vdXNlIGNvbmZpZ3VyZWQgcG9ydCwgb3IgYSByYW5kb20gdXNlciBwb3J0LlxuICAgICAgdmFyIHBvcnQgPSBvcHRzLnBvcnQgfHwgMTAyNCsofn4oTWF0aC5yYW5kb20oKSooNjU1MzYtMTAyNCkpKVxuICAgICAgdmFyIGhvc3QgPSBvcHRzLmhvc3QgfHwgbm9uUHJpdmF0ZS52NCB8fCBub25Qcml2YXRlLnByaXZhdGUudjQgfHwgJzEyNy4wLjAuMSdcblxuICAgICAgdmFyIHBlZXJzID0gYXBpLnBlZXJzID0ge31cblxuICAgICAgdmFyIHNlcnZlciA9IHNuZXQuY3JlYXRlU2VydmVyKHNldHVwUlBDKVxuICAgICAgc2VydmVyLmxpc3Rlbihwb3J0KVxuXG4gICAgICBmdW5jdGlvbiBzZXR1cFJQQyAoc3RyZWFtLCBtYW5mLCBpc0NsaWVudCkge1xuICAgICAgICB2YXIgcnBjID0gTXV4cnBjKGNyZWF0ZS5tYW5pZmVzdCwgbWFuZiB8fCBjcmVhdGUubWFuaWZlc3QpKGFwaSwgc3RyZWFtLmF1dGgpXG4gICAgICAgIHZhciB0aW1lb3V0ID0gb3B0cy50aW1lb3V0ID09IG51bGwgPyBkZWZhdWx0VGltZW91dCA6IG9wdHMudGltZW91dFxuICAgICAgICB2YXIgcnBjU3RyZWFtID0gcnBjLmNyZWF0ZVN0cmVhbSgpXG4gICAgICAgIGlmKHRpbWVvdXQgPiAwKSBycGNTdHJlYW0gPSBJbmFjdGl2ZShycGNTdHJlYW0sIG9wdHMudGltZW91dClcblxuICAgICAgICBwdWxsKHN0cmVhbSwgcnBjU3RyZWFtLCBzdHJlYW0pXG5cbiAgICAgICAgdmFyIGlkID0gcnBjLmlkID0gJ0AnK3UudG9JZChzdHJlYW0ucmVtb3RlKVxuXG4gICAgICAgIC8va2VlcCB0cmFjayBvZiBjdXJyZW50IGNvbm5lY3Rpb25zLlxuICAgICAgICBpZighcGVlcnNbaWRdKSBwZWVyc1tpZF0gPSBbXVxuICAgICAgICBwZWVyc1tpZF0ucHVzaChycGMpXG4gICAgICAgIHJwYy5vbmNlKCdjbG9zZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcGVlcnNbaWRdLnNwbGljZShwZWVyc1tpZF0uaW5kZXhPZihycGMpLCAxKVxuICAgICAgICB9KVxuXG4gICAgICAgIGFwaS5lbWl0KCdycGM6Y29ubmVjdCcsIHJwYywgISFpc0NsaWVudClcblxuICAgICAgICByZXR1cm4gcnBjXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vY2FuIGJlIGNhbGxlZCByZW1vdGVseS5cbiAgICAgICAgcHVibGljS2V5OiBzbmV0LnB1YmxpY0tleSxcbiAgICAgICAgYXV0aDogZnVuY3Rpb24gKHB1YiwgY2IpIHsgY2IoKSB9LFxuICAgICAgICBhZGRyZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWRkcmVzcygpXG4gICAgICAgIH0sXG4gICAgICAgIGdldEFkZHJlc3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gW2hvc3QsIHBvcnQsICdAJyt1LnRvSWQoc25ldC5wdWJsaWNLZXkpXS5qb2luKCc6JylcbiAgICAgICAgfSxcbiAgICAgICAgbWFuaWZlc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlLm1hbmlmZXN0XG4gICAgICAgIH0sXG4gICAgICAgIGdldE1hbmlmZXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWFuaWZlc3QoKVxuICAgICAgICB9LFxuICAgICAgICAvL2Nhbm5vdCBiZSBjYWxsZWQgcmVtb3RlLlxuICAgICAgICBjb25uZWN0OiBmdW5jdGlvbiAoYWRkcmVzcywgY2IpIHtcbiAgICAgICAgICBhZGRyZXNzID0gY29lYXJzZUFkZHJlc3MoYWRkcmVzcylcbiAgICAgICAgICBhZGRyZXNzLmFwcEtleSA9IG9wdHMuYXBwS2V5IHx8IGFwcEtleVxuICAgICAgICAgIHNuZXQuY29ubmVjdChhZGRyZXNzLCBmdW5jdGlvbiAoZXJyLCBzdHJlYW0pIHtcbiAgICAgICAgICAgIHJldHVybiBlcnIgPyBjYihlcnIpIDogY2IobnVsbCwgc2V0dXBSUEMoc3RyZWFtLCBudWxsLCB0cnVlKSlcbiAgICAgICAgICB9KVxuICAgICAgICB9LFxuXG4gICAgICAgIGNsb3NlOiBmdW5jdGlvbiAoZXJyLCBjYikge1xuICAgICAgICAgIGlmKGlzRnVuY3Rpb24oZXJyKSkgY2IgPSBlcnIsIGVyciA9IG51bGxcbiAgICAgICAgICBhcGkuY2xvc2VkID0gdHJ1ZVxuICAgICAgICAgIHNlcnZlci5jbG9zZShmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBhcGkuZW1pdCgnY2xvc2UnLCBlcnIpXG4gICAgICAgICAgICBjYiAmJiBjYihlcnIpXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmKGVycikge1xuICAgICAgICAgICAgZWFjaChwZWVycywgZnVuY3Rpb24gKGNvbm5lY3Rpb25zLCBpZCkge1xuICAgICAgICAgICAgICBlYWNoKGNvbm5lY3Rpb25zLCBmdW5jdGlvbiAocnBjKSB7XG4gICAgICAgICAgICAgICAgcnBjLmNsb3NlKGVycilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5cblxuIiwidmFyIG9zID0gcmVxdWlyZSgnb3MnKVxudmFyIGlwID0gcmVxdWlyZSgnaXAnKVxuLy9waWNrIHRoZSBmaXJzdCByZWFzb25hYmxlIGxvb2tpbmcgaG9zdC5cbi8vdGhpcyBzaG91bGQgKmp1c3Qgd29yayogd2hlbiBydW5uaW5nIG9uIGEgdnBzLlxuXG52YXIgaXNQcml2YXRlID0gaXAuaXNQcml2YXRlXG5cbmZ1bmN0aW9uIGlzTm9uUHJpdmF0ZSAoZSkge1xuICByZXR1cm4gIWlzUHJpdmF0ZShlKVxufVxuXG5cbnZhciBhZGRyZXNzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW50ZXIsIGZpbHRlcikge1xuICBpbnRlciA9IGludGVyIHx8IG9zLm5ldHdvcmtJbnRlcmZhY2VzKClcbiAgZmlsdGVyID0gZmlsdGVyIHx8IGlzTm9uUHJpdmF0ZVxuICBmb3IodmFyIGsgaW4gaW50ZXIpIHtcbiAgICBmb3IodmFyIGkgaW4gaW50ZXJba10pIHtcbiAgICAgIHZhciBlID0gaW50ZXJba11baV1cbiAgICAgIC8vIGZpbmQgYSByZWFzb25hYmxlIGxvb2tpbmcgYWRkcmVzc1xuICAgICAgaWYoIWUuaW50ZXJuYWwgJiYgZmlsdGVyKGUuYWRkcmVzcywgZSkpXG4gICAgICAgICAgcmV0dXJuIGUuYWRkcmVzc1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1Y0IChlKSB7XG4gIHJldHVybiBlLmZhbWlseSA9PT0gJ0lQdjQnXG59XG5cbmZ1bmN0aW9uIGlzVjYgKGUpIHtcbiAgcmV0dXJuIGUuZmFtaWx5ID09PSAnSVB2Nidcbn1cblxudmFyIHByaXZhdGUgPSBtb2R1bGUuZXhwb3J0cy5wcml2YXRlID0gZnVuY3Rpb24gKGludGVyKSB7XG4gIHJldHVybiBhZGRyZXNzKGludGVyLCBpc1ByaXZhdGUpXG59XG5cbm1vZHVsZS5leHBvcnRzLnY0ID0gYWRkcmVzcyhudWxsLCBmdW5jdGlvbiAoYWRkciwgZSkge1xuICByZXR1cm4gaXNWNChlKSAmJiBpc05vblByaXZhdGUoYWRkcilcbn0pXG5cbm1vZHVsZS5leHBvcnRzLnY2ID0gYWRkcmVzcyhudWxsLCBmdW5jdGlvbiAoYWRkciwgZSkge1xuICByZXR1cm4gaXNWNihlKSAmJiBpc05vblByaXZhdGUoYWRkcilcbn0pXG5cbnByaXZhdGUudjQgPSBhZGRyZXNzKG51bGwsIGZ1bmN0aW9uIChhZGRyLCBlKSB7XG4gIHJldHVybiBpc1Y0KGUpICYmIGlzUHJpdmF0ZShhZGRyKVxufSlcblxucHJpdmF0ZS52NiA9IGFkZHJlc3MobnVsbCwgZnVuY3Rpb24gKGFkZHIsIGUpIHtcbiAgcmV0dXJuIGlzVjYoZSkgJiYgaXNQcml2YXRlKGFkZHIpXG59KVxuXG5tb2R1bGUuZXhwb3J0cy5hbGwgPSB7XG4gIHB1YmxpYzoge1xuICAgIHY0OiBtb2R1bGUuZXhwb3J0cy52NCwgdjY6IG1vZHVsZS5leHBvcnRzLnY2XG4gIH0sXG4gIHByaXZhdGU6IHtcbiAgICB2NDogcHJpdmF0ZS52NCwgdjY6IHByaXZhdGUudjZcbiAgfVxufVxuXG5cbmlmKCFtb2R1bGUucGFyZW50KSB7XG4gIGNvbnNvbGUubG9nKG1vZHVsZS5leHBvcnRzLmFsbClcbn1cbiIsInZhciB1ICAgICAgPSByZXF1aXJlKCdwdWxsLWNvcmUnKVxudmFyIHNvdXJjZXMgPSByZXF1aXJlKCcuL3NvdXJjZXMnKVxudmFyIHNpbmtzID0gcmVxdWlyZSgnLi9zaW5rcycpXG5cbnZhciBwcm9wICAgPSB1LnByb3BcbnZhciBpZCAgICAgPSB1LmlkXG52YXIgdGVzdGVyID0gdS50ZXN0ZXJcblxudmFyIG1hcCA9IGV4cG9ydHMubWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXApIHtcbiAgbWFwID0gcHJvcChtYXApIHx8IGlkXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgcmVhZChhYm9ydCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgIGRhdGEgPSAhZW5kID8gbWFwKGRhdGEpIDogbnVsbFxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiByZWFkKGVyciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgYXN5bmNNYXAgPSBleHBvcnRzLmFzeW5jTWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXApIHtcbiAgaWYoIW1hcCkgcmV0dXJuIHJlYWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmQsIGNiKSAvL2Fib3J0XG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHJldHVybiBjYihlbmQsIGRhdGEpXG4gICAgICBtYXAoZGF0YSwgY2IpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgcGFyYU1hcCA9IGV4cG9ydHMucGFyYU1hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwLCB3aWR0aCkge1xuICBpZighbWFwKSByZXR1cm4gcmVhZFxuICB2YXIgZW5kZWQgPSBmYWxzZSwgcXVldWUgPSBbXSwgX2NiXG5cbiAgZnVuY3Rpb24gZHJhaW4gKCkge1xuICAgIGlmKCFfY2IpIHJldHVyblxuICAgIHZhciBjYiA9IF9jYlxuICAgIF9jYiA9IG51bGxcbiAgICBpZihxdWV1ZS5sZW5ndGgpXG4gICAgICByZXR1cm4gY2IobnVsbCwgcXVldWUuc2hpZnQoKSlcbiAgICBlbHNlIGlmKGVuZGVkICYmICFuKVxuICAgICAgcmV0dXJuIGNiKGVuZGVkKVxuICAgIF9jYiA9IGNiXG4gIH1cblxuICBmdW5jdGlvbiBwdWxsICgpIHtcbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkge1xuICAgICAgICBlbmRlZCA9IGVuZFxuICAgICAgICByZXR1cm4gZHJhaW4oKVxuICAgICAgfVxuICAgICAgbisrXG4gICAgICBtYXAoZGF0YSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICBuLS1cblxuICAgICAgICBxdWV1ZS5wdXNoKGRhdGEpXG4gICAgICAgIGRyYWluKClcbiAgICAgIH0pXG5cbiAgICAgIGlmKG4gPCB3aWR0aCAmJiAhZW5kZWQpXG4gICAgICAgIHB1bGwoKVxuICAgIH0pXG4gIH1cblxuICB2YXIgbiA9IDBcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmQsIGNiKSAvL2Fib3J0XG4gICAgLy9jb250aW51ZSB0byByZWFkIHdoaWxlIHRoZXJlIGFyZSBsZXNzIHRoYW4gMyBtYXBzIGluIGZsaWdodFxuICAgIF9jYiA9IGNiXG4gICAgaWYocXVldWUubGVuZ3RoIHx8IGVuZGVkKVxuICAgICAgcHVsbCgpLCBkcmFpbigpXG4gICAgZWxzZSBwdWxsKClcbiAgfVxuICByZXR1cm4gaGlnaFdhdGVyTWFyayhhc3luY01hcChyZWFkLCBtYXApLCB3aWR0aClcbn1cblxudmFyIGZpbHRlciA9IGV4cG9ydHMuZmlsdGVyID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIC8vcmVnZXhwXG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZ1bmN0aW9uIG5leHQgKGVuZCwgY2IpIHtcbiAgICB2YXIgc3luYywgbG9vcCA9IHRydWVcbiAgICB3aGlsZShsb29wKSB7XG4gICAgICBsb29wID0gZmFsc2VcbiAgICAgIHN5bmMgPSB0cnVlXG4gICAgICByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZighZW5kICYmICF0ZXN0KGRhdGEpKVxuICAgICAgICAgIHJldHVybiBzeW5jID8gbG9vcCA9IHRydWUgOiBuZXh0KGVuZCwgY2IpXG4gICAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICAgIH0pXG4gICAgICBzeW5jID0gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxudmFyIGZpbHRlck5vdCA9IGV4cG9ydHMuZmlsdGVyTm90ID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZpbHRlcihyZWFkLCBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAhdGVzdChlKVxuICB9KVxufVxuXG52YXIgdGhyb3VnaCA9IGV4cG9ydHMudGhyb3VnaCA9XG5mdW5jdGlvbiAocmVhZCwgb3AsIG9uRW5kKSB7XG4gIHZhciBhID0gZmFsc2VcbiAgZnVuY3Rpb24gb25jZSAoYWJvcnQpIHtcbiAgICBpZihhIHx8ICFvbkVuZCkgcmV0dXJuXG4gICAgYSA9IHRydWVcbiAgICBvbkVuZChhYm9ydCA9PT0gdHJ1ZSA/IG51bGwgOiBhYm9ydClcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgb25jZShlbmQpXG4gICAgcmV0dXJuIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZighZW5kKSBvcCAmJiBvcChkYXRhKVxuICAgICAgZWxzZSBvbmNlKGVuZClcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciB0YWtlID0gZXhwb3J0cy50YWtlID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHZhciBlbmRlZCA9IGZhbHNlXG4gIGlmKCdudW1iZXInID09PSB0eXBlb2YgdGVzdCkge1xuICAgIHZhciBuID0gdGVzdDsgdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuIC0tXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kZWQpIHJldHVybiBjYihlbmRlZClcbiAgICBpZihlbmRlZCA9IGVuZCkgcmV0dXJuIHJlYWQoZW5kZWQsIGNiKVxuXG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkgcmV0dXJuIGNiKGVuZGVkKVxuICAgICAgaWYoIXRlc3QoZGF0YSkpIHtcbiAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgIHJlYWQodHJ1ZSwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGNiKGVuZGVkLCBkYXRhKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBjYihudWxsLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHVuaXF1ZSA9IGV4cG9ydHMudW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkLCBpbnZlcnQpIHtcbiAgZmllbGQgPSBwcm9wKGZpZWxkKSB8fCBpZFxuICB2YXIgc2VlbiA9IHt9XG4gIHJldHVybiBmaWx0ZXIocmVhZCwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIga2V5ID0gZmllbGQoZGF0YSlcbiAgICBpZihzZWVuW2tleV0pIHJldHVybiAhIWludmVydCAvL2ZhbHNlLCBieSBkZWZhdWx0XG4gICAgZWxzZSBzZWVuW2tleV0gPSB0cnVlXG4gICAgcmV0dXJuICFpbnZlcnQgLy90cnVlIGJ5IGRlZmF1bHRcbiAgfSlcbn1cblxudmFyIG5vblVuaXF1ZSA9IGV4cG9ydHMubm9uVW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkKSB7XG4gIHJldHVybiB1bmlxdWUocmVhZCwgZmllbGQsIHRydWUpXG59XG5cbnZhciBncm91cCA9IGV4cG9ydHMuZ3JvdXAgPVxuZnVuY3Rpb24gKHJlYWQsIHNpemUpIHtcbiAgdmFyIGVuZGVkOyBzaXplID0gc2l6ZSB8fCA1XG4gIHZhciBxdWV1ZSA9IFtdXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgLy90aGlzIG1lYW5zIHRoYXQgdGhlIHVwc3RyZWFtIGlzIHNlbmRpbmcgYW4gZXJyb3IuXG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmRlZCA9IGVuZCwgY2IpXG4gICAgLy90aGlzIG1lYW5zIHRoYXQgd2UgcmVhZCBhbiBlbmQgYmVmb3JlLlxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIG5leHQoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkge1xuICAgICAgICBpZighcXVldWUubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiBjYihlbmRlZClcblxuICAgICAgICB2YXIgX3F1ZXVlID0gcXVldWU7IHF1ZXVlID0gW11cbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIF9xdWV1ZSlcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goZGF0YSlcbiAgICAgIGlmKHF1ZXVlLmxlbmd0aCA8IHNpemUpXG4gICAgICAgIHJldHVybiByZWFkKG51bGwsIG5leHQpXG5cbiAgICAgIHZhciBfcXVldWUgPSBxdWV1ZTsgcXVldWUgPSBbXVxuICAgICAgY2IobnVsbCwgX3F1ZXVlKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGZsYXR0ZW4gPSBleHBvcnRzLmZsYXR0ZW4gPSBmdW5jdGlvbiAocmVhZCkge1xuICB2YXIgX3JlYWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihfcmVhZCkgbmV4dENodW5rKClcbiAgICBlbHNlICAgICAgbmV4dFN0cmVhbSgpXG5cbiAgICBmdW5jdGlvbiBuZXh0Q2h1bmsgKCkge1xuICAgICAgX3JlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZihlbmQpIG5leHRTdHJlYW0oKVxuICAgICAgICBlbHNlICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgICBmdW5jdGlvbiBuZXh0U3RyZWFtICgpIHtcbiAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgc3RyZWFtKSB7XG4gICAgICAgIGlmKGVuZClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kKVxuICAgICAgICBpZihBcnJheS5pc0FycmF5KHN0cmVhbSkgfHwgc3RyZWFtICYmICdvYmplY3QnID09PSB0eXBlb2Ygc3RyZWFtKVxuICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZXMudmFsdWVzKHN0cmVhbSlcbiAgICAgICAgZWxzZSBpZignZnVuY3Rpb24nICE9IHR5cGVvZiBzdHJlYW0pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJlYW0gb2Ygc3RyZWFtcycpXG4gICAgICAgIF9yZWFkID0gc3RyZWFtXG4gICAgICAgIG5leHRDaHVuaygpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG52YXIgcHJlcGVuZCA9XG5leHBvcnRzLnByZXBlbmQgPVxuZnVuY3Rpb24gKHJlYWQsIGhlYWQpIHtcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGhlYWQgIT09IG51bGwpIHtcbiAgICAgIGlmKGFib3J0KVxuICAgICAgICByZXR1cm4gcmVhZChhYm9ydCwgY2IpXG4gICAgICB2YXIgX2hlYWQgPSBoZWFkXG4gICAgICBoZWFkID0gbnVsbFxuICAgICAgY2IobnVsbCwgX2hlYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWQoYWJvcnQsIGNiKVxuICAgIH1cbiAgfVxuXG59XG5cbi8vdmFyIGRyYWluSWYgPSBleHBvcnRzLmRyYWluSWYgPSBmdW5jdGlvbiAob3AsIGRvbmUpIHtcbi8vICBzaW5rcy5kcmFpbihcbi8vfVxuXG52YXIgX3JlZHVjZSA9IGV4cG9ydHMuX3JlZHVjZSA9IGZ1bmN0aW9uIChyZWFkLCByZWR1Y2UsIGluaXRpYWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjbG9zZSwgY2IpIHtcbiAgICBpZihjbG9zZSkgcmV0dXJuIHJlYWQoY2xvc2UsIGNiKVxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICBzaW5rcy5kcmFpbihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaW5pdGlhbCA9IHJlZHVjZShpbml0aWFsLCBpdGVtKVxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGVuZGVkID0gZXJyIHx8IHRydWVcbiAgICAgIGlmKCFlcnIpIGNiKG51bGwsIGluaXRpYWwpXG4gICAgICBlbHNlICAgICBjYihlbmRlZClcbiAgICB9KVxuICAgIChyZWFkKVxuICB9XG59XG5cbnZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2tcblxudmFyIGhpZ2hXYXRlck1hcmsgPSBleHBvcnRzLmhpZ2hXYXRlck1hcmsgPVxuZnVuY3Rpb24gKHJlYWQsIGhpZ2hXYXRlck1hcmspIHtcbiAgdmFyIGJ1ZmZlciA9IFtdLCB3YWl0aW5nID0gW10sIGVuZGVkLCBlbmRpbmcsIHJlYWRpbmcgPSBmYWxzZVxuICBoaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyayB8fCAxMFxuXG4gIGZ1bmN0aW9uIHJlYWRBaGVhZCAoKSB7XG4gICAgd2hpbGUod2FpdGluZy5sZW5ndGggJiYgKGJ1ZmZlci5sZW5ndGggfHwgZW5kZWQpKVxuICAgICAgd2FpdGluZy5zaGlmdCgpKGVuZGVkLCBlbmRlZCA/IG51bGwgOiBidWZmZXIuc2hpZnQoKSlcblxuICAgIGlmICghYnVmZmVyLmxlbmd0aCAmJiBlbmRpbmcpIGVuZGVkID0gZW5kaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgaWYoZW5kZWQgfHwgZW5kaW5nIHx8IHJlYWRpbmcgfHwgYnVmZmVyLmxlbmd0aCA+PSBoaWdoV2F0ZXJNYXJrKVxuICAgICAgcmV0dXJuXG4gICAgcmVhZGluZyA9IHRydWVcbiAgICByZXR1cm4gcmVhZChlbmRlZCB8fCBlbmRpbmcsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgZW5kaW5nID0gZW5kaW5nIHx8IGVuZFxuICAgICAgaWYoZGF0YSAhPSBudWxsKSBidWZmZXIucHVzaChkYXRhKVxuXG4gICAgICBuZXh0KCk7IHJlYWRBaGVhZCgpXG4gICAgfSlcbiAgfVxuXG4gIHByb2Nlc3MubmV4dFRpY2sobmV4dClcblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBlbmRlZCA9IGVuZGVkIHx8IGVuZFxuICAgIHdhaXRpbmcucHVzaChjYilcblxuICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgfVxufVxuXG52YXIgZmxhdE1hcCA9IGV4cG9ydHMuZmxhdE1hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwcGVyKSB7XG4gIG1hcHBlciA9IG1hcHBlciB8fCBpZFxuICB2YXIgcXVldWUgPSBbXSwgZW5kZWRcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKHF1ZXVlLmxlbmd0aCkgcmV0dXJuIGNiKG51bGwsIHF1ZXVlLnNoaWZ0KCkpXG4gICAgZWxzZSBpZihlbmRlZCkgICByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICByZWFkKGFib3J0LCBmdW5jdGlvbiBuZXh0IChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkgZW5kZWQgPSBlbmRcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgYWRkID0gbWFwcGVyKGRhdGEpXG4gICAgICAgIHdoaWxlKGFkZCAmJiBhZGQubGVuZ3RoKVxuICAgICAgICAgIHF1ZXVlLnB1c2goYWRkLnNoaWZ0KCkpXG4gICAgICB9XG5cbiAgICAgIGlmKHF1ZXVlLmxlbmd0aCkgY2IobnVsbCwgcXVldWUuc2hpZnQoKSlcbiAgICAgIGVsc2UgaWYoZW5kZWQpICAgY2IoZW5kZWQpXG4gICAgICBlbHNlICAgICAgICAgICAgIHJlYWQobnVsbCwgbmV4dClcbiAgICB9KVxuICB9XG59XG5cbiIsInZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheVxudmFyIG1lcmdlICAgPSByZXF1aXJlKCdtYXAtbWVyZ2UnKVxuXG5mdW5jdGlvbiBpc09iamVjdCAobykge1xuICByZXR1cm4gbyAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG9cbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcgKHMpIHtcbiAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2Ygc1xufVxuXG52YXIgY2xvbmUgPSBleHBvcnRzLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKG9iaiwgbWFwcGVyKSB7XG4gIGZ1bmN0aW9uIG1hcCh2LCBrKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHYpID8gY2xvbmUodiwgbWFwcGVyKSA6IG1hcHBlcih2LCBrKVxuICB9XG4gIGlmKGlzQXJyYXkob2JqKSlcbiAgICByZXR1cm4gb2JqLm1hcChtYXApXG4gIGVsc2UgaWYoaXNPYmplY3Qob2JqKSkge1xuICAgIHZhciBvID0ge31cbiAgICBmb3IodmFyIGsgaW4gb2JqKVxuICAgICAgb1trXSA9IG1hcChvYmpba10sIGspXG4gICAgcmV0dXJuIG9cbiAgfVxuICBlbHNlXG4gICAgcmV0dXJuIG1hcChvYmopXG59XG5cbmV4cG9ydHMucGFyc2VBZGRyZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgaWYoaXNTdHJpbmcoZSkpIHtcbiAgICB2YXIgcGFydHMgPSBlLnNwbGl0KCc6JylcbiAgICB2YXIgZSA9IHtcbiAgICAgIGhvc3Q6IHBhcnRzWzBdLFxuICAgICAgcG9ydDogK3BhcnRzWzFdLFxuICAgICAga2V5OiBmcm9tSWQocGFydHNbMl0pXG4gICAgfVxuICAgIHJldHVybiBlXG4gIH1cbiAgcmV0dXJuIGVcbn1cblxudmFyIGZyb21JZCA9IGV4cG9ydHMuZnJvbUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBuZXcgQnVmZmVyKGlkLnN1YnN0cmluZygwLCBpZC5pbmRleE9mKCcuJykpLCAnYmFzZTY0Jylcbn1cblxuZXhwb3J0cy50b0lkID0gZnVuY3Rpb24gKHB1Yikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKHB1YikgPyBwdWIudG9TdHJpbmcoJ2Jhc2U2NCcpKycuZWQyNTUxOScgOiBwdWJcbn1cblxuZXhwb3J0cy5tZXJnZSA9IHtcbiAgcGVybWlzc2lvbnM6IGZ1bmN0aW9uIChwZXJtcywgX3Blcm1zLCBuYW1lKSB7XG4gICAgcmV0dXJuIG1lcmdlKHBlcm1zLFxuICAgICAgY2xvbmUoX3Blcm1zLCBmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gbmFtZSA/IG5hbWUgKyAnLicgKyB2IDogdlxuICAgICAgfSlcbiAgICApXG5cbiAgfSxcbiAgbWFuaWZlc3Q6IGZ1bmN0aW9uIChtYW5mLCBfbWFuZiwgbmFtZSkge1xuICAgIGlmKG5hbWUpIHtcbiAgICAgIHZhciBvID0ge307IG9bbmFtZV0gPSBfbWFuZjsgX21hbmYgPSBvXG4gICAgfVxuICAgIHJldHVybiBtZXJnZShtYW5mLCBfbWFuZilcbiAgfVxufVxuXG5leHBvcnRzLmhvb2tPcHRpb25hbENCID0gZnVuY3Rpb24gKHN5bmNGbikge1xuICAvLyBzeW5jRm4gaXMgYSBmdW5jdGlvbiB0aGF0J3MgZXhwZWN0ZWQgdG8gcmV0dXJuIGl0cyByZXN1bHQgb3IgdGhyb3cgYW4gZXJyb3JcbiAgLy8gd2UncmUgZ29pbmcgdG8gaG9vayBpdCBzbyB5b3UgY2FuIG9wdGlvbmFsbHkgcGFzcyBhIGNhbGxiYWNrXG4gIHN5bmNGbi5ob29rKGZ1bmN0aW9uKGZuLCBhcmdzKSB7XG4gICAgLy8gaWYgYSBmdW5jdGlvbiBpcyBnaXZlbiBhcyB0aGUgbGFzdCBhcmd1bWVudCwgdHJlYXQgaXQgYXMgYSBjYWxsYmFja1xuICAgIHZhciBjYiA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXVxuICAgIGlmICh0eXBlb2YgY2IgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJlc1xuICAgICAgYXJncy5wb3AoKSAvLyByZW1vdmUgY2IgZnJvbSB0aGUgYXJndW1lbnRzXG4gICAgICB0cnkgeyByZXMgPSBmbi5hcHBseSh0aGlzLCBhcmdzKSB9XG4gICAgICBjYXRjaCAoZSkgeyByZXR1cm4gY2IoZSkgfVxuICAgICAgY2IobnVsbCwgcmVzKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBubyBjYiBwcm92aWRlZCwgcmVndWxhciB1c2FnZVxuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgfVxuICB9KVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlY29kZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cmluZylcbiAgfSxcbiAgZW5jb2RlOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMilcbiAgfSxcbiAgYnVmZmVyOiBmYWxzZVxufVxuXG4iLCJcbnZhciBsZXZlbCA9IHJlcXVpcmUoJ2xldmVsJylcbnZhciBzdWJsZXZlbCA9IHJlcXVpcmUoJ2xldmVsLXN1YmxldmVsL2J5dGV3aXNlJylcbnZhciBvcHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpXG52YXIgU1NCID0gcmVxdWlyZSgnLi8nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXRoLCBvcHRzLCBrZXlzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHJlcXVpcmUoJy4vZGVmYXVsdHMnKVxuICByZXR1cm4gU1NCKFxuICAgIHN1YmxldmVsKGxldmVsKHBhdGgsIHtcbiAgICAgIHZhbHVlRW5jb2Rpbmc6IG9wdHMuY29kZWNcbiAgICB9KSksIG9wdHMsIGtleXMpXG59XG4iLCJcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnc3NiLWtleXMnKVxubW9kdWxlLmV4cG9ydHMuY29kZWMgPSByZXF1aXJlKCcuL2NvZGVjJylcbm1vZHVsZS5leHBvcnRzLmtleXMgPSBtb2R1bGUuZXhwb3J0c1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb250cGFyYSAgPSByZXF1aXJlKCdjb250JykucGFyYVxudmFyIHB1bGwgICAgICA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcbnZhciBwbCAgICAgICAgPSByZXF1aXJlKCdwdWxsLWxldmVsJylcbnZhciBwYXJhbWFwICAgPSByZXF1aXJlKCdwdWxsLXBhcmFtYXAnKVxudmFyIHRpbWVzdGFtcCA9IHJlcXVpcmUoJ21vbm90b25pYy10aW1lc3RhbXAnKVxudmFyIGFzc2VydCAgICA9IHJlcXVpcmUoJ2Fzc2VydCcpXG52YXIgbHRndCAgICAgID0gcmVxdWlyZSgnbHRndCcpXG52YXIgbWxpYiAgICAgID0gcmVxdWlyZSgnc3NiLW1zZ3MnKVxudmFyIGV4cGxhaW4gICA9IHJlcXVpcmUoJ2V4cGxhaW4tZXJyb3InKVxudmFyIHBkb3Rqc29uICA9IHJlcXVpcmUoJy4vcGFja2FnZS5qc29uJylcbnZhciBjcmVhdGVGZWVkID0gcmVxdWlyZSgnc3NiLWZlZWQnKVxudmFyIGNhdCAgICAgICA9IHJlcXVpcmUoJ3B1bGwtY2F0JylcbnZhciBzc2JyZWYgICAgPSByZXF1aXJlKCdzc2ItcmVmJylcbnZhciBzc2JLZXlzICAgPSByZXF1aXJlKCdzc2Ita2V5cycpXG5cbnZhciBWYWxpZGF0b3IgPSByZXF1aXJlKCdzc2ItZmVlZC92YWxpZGF0b3InKVxuXG52YXIgaXNGZWVkSWQgPSBzc2JyZWYuaXNGZWVkSWRcbnZhciBpc01zZ0lkICA9IHNzYnJlZi5pc01zZ0lkXG52YXIgaXNCbG9iSWQgPSBzc2JyZWYuaXNCbG9iSWRcblxuLy92YXIgdSAgICAgICAgID0gcmVxdWlyZSgnLi91dGlsJylcblxuLy81MyBiaXQgaW50ZWdlclxudmFyIE1BWF9JTlQgID0gMHgxZmZmZmZmZmZmZmZmZlxuXG5mdW5jdGlvbiBpc051bWJlciAobikge1xuICByZXR1cm4gdHlwZW9mIG4gPT09ICdudW1iZXInXG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nIChzKSB7XG4gIHJldHVybiAnc3RyaW5nJyA9PT0gdHlwZW9mIHNcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QgKG8pIHtcbiAgcmV0dXJuIG8gJiYgJ29iamVjdCcgPT09IHR5cGVvZiBvICYmICFBcnJheS5pc0FycmF5KG8pXG59XG5cbmZ1bmN0aW9uIGFsbCAoc3RyZWFtKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoY2IpIHtcbiAgICBwdWxsKHN0cmVhbSwgcHVsbC5jb2xsZWN0KGNiKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwXG59XG5cbmZ1bmN0aW9uIGdldFZNYWpvciAoKSB7XG4gIHZhciB2ZXJzaW9uID0gcmVxdWlyZSgnLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uXG4gIHJldHVybiAodmVyc2lvbi5zcGxpdCgnLicpWzBdKXwwXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRiLCBvcHRzLCBrZXlzKSB7XG4gIHZhciBzeXNEQiAgID0gZGIuc3VibGV2ZWwoJ3N5cycpXG4gIHZhciBsb2dEQiAgID0gZGIuc3VibGV2ZWwoJ2xvZycpXG4gIHZhciBmZWVkREIgID0gZGIuc3VibGV2ZWwoJ2ZkJylcbiAgdmFyIGNsb2NrREIgPSBkYi5zdWJsZXZlbCgnY2xrJylcbiAgdmFyIGxhc3REQiAgPSBkYi5zdWJsZXZlbCgnbHN0JylcbiAgdmFyIGluZGV4REIgPSBkYi5zdWJsZXZlbCgnaWR4JylcbiAgdmFyIGFwcHNEQiAgPSBkYi5zdWJsZXZlbCgnYXBwJylcblxuICBmdW5jdGlvbiBnZXQgKGRiLCBrZXkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNiKSB7IGRiLmdldChrZXksIGNiKSB9XG4gIH1cblxuICBkYi5vcHRzID0gb3B0c1xuXG4gIGRiLmFkZCA9IFZhbGlkYXRvcihkYilcblxuICBkYi5wcmUoZnVuY3Rpb24gKG9wLCBhZGQsIF9iYXRjaCkge1xuICAgIHZhciBtc2cgPSBvcC52YWx1ZVxuICAgIHZhciBpZCA9IG9wLmtleVxuICAgIC8vIGluZGV4IGJ5IHNlcXVlbmNlIG51bWJlclxuXG4gICAgYWRkKHtcbiAgICAgIGtleTogW21zZy5hdXRob3IsIG1zZy5zZXF1ZW5jZV0sIHZhbHVlOiBpZCxcbiAgICAgIHR5cGU6ICdwdXQnLCBwcmVmaXg6IGNsb2NrREJcbiAgICB9KVxuXG4gICAgLy8gaW5kZXggbXkgdGltZXN0YW1wLCB1c2VkIHRvIGdlbmVyYXRlIGZlZWQuXG4gICAgYWRkKHtcbiAgICAgIGtleTogW21zZy50aW1lc3RhbXAsIG1zZy5hdXRob3JdLCB2YWx1ZTogaWQsXG4gICAgICB0eXBlOiAncHV0JywgcHJlZml4OiBmZWVkREJcbiAgICB9KVxuXG4gICAgdmFyIGxvY2FsdGltZSA9IG9wLnRpbWVzdGFtcCA9IHRpbWVzdGFtcCgpXG5cbiAgICAvLyBpbmRleCB0aGUgbGF0ZXN0IG1lc3NhZ2UgZnJvbSBlYWNoIGF1dGhvclxuICAgIGFkZCh7XG4gICAgICBrZXk6IG1zZy5hdXRob3IsIHZhbHVlOiB7c2VxdWVuY2U6IG1zZy5zZXF1ZW5jZSwgdHM6IGxvY2FsdGltZSB9LFxuICAgICAgdHlwZTogJ3B1dCcsIHByZWZpeDogbGFzdERCXG4gICAgfSlcblxuICAgIC8vIGluZGV4IG1lc3NhZ2VzIGluIHRoZSBvcmRlciBfcmVjZWl2ZWRfXG4gICAgLy8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gcGFzcyB0byBwbHVnaW5zIHdoaWNoXG4gICAgLy8gbXVzdCBjcmVhdGUgdGhlaXIgaW5kZXhlcyBhc3luY2x5LlxuXG4gICAgYWRkKHtcbiAgICAgIGtleTogbG9jYWx0aW1lLCB2YWx1ZTogaWQsXG4gICAgICB0eXBlOiAncHV0JywgcHJlZml4OiBsb2dEQlxuICAgIH0pXG5cbiAgICBpbmRleE1zZyhhZGQsIGxvY2FsdGltZSwgaWQsIG1zZylcblxuICB9KVxuXG4gIGZ1bmN0aW9uIGluZGV4TXNnIChhZGQsIGxvY2FsdGltZSwgaWQsIG1zZykge1xuICAgIC8vREVDUllQVCB0aGUgbWVzc2FnZSwgaWYgcG9zc2libGVcbiAgICAvL3RvIGVuYWJsZSBpbmRleGluZy4gSWYgZXh0ZXJuYWwgYXBpc1xuICAgIC8vYXJlIG5vdCBwcm92aWRlZCB0aGF0IG1heSBhY2Nlc3MgaW5kZXhlc1xuICAgIC8vdGhlbiB0aGlzIHdpbGwgbm90IGxlYWsgaW5mb3JtYXRpb24uXG4gICAgLy9vdGhlcndpc2UsIHdlIG1heSBuZWVkIHRvIGZpZ3VyZSBzb21ldGhpbmcgb3V0LlxuXG4gICAgdmFyIGNvbnRlbnQgPSAoa2V5cyAmJiBpc1N0cmluZyhtc2cuY29udGVudCkpXG4gICAgICA/IHNzYktleXMudW5ib3gobXNnLmNvbnRlbnQsIGtleXMpXG4gICAgICA6IG1zZy5jb250ZW50XG5cbiAgICBpZighY29udGVudCkgcmV0dXJuXG5cbiAgICBpZihpc1N0cmluZyhjb250ZW50LnR5cGUpKVxuICAgICAgYWRkKHtcbiAgICAgICAga2V5OiBbJ3R5cGUnLCBjb250ZW50LnR5cGUudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMzIpLCBsb2NhbHRpbWVdLFxuICAgICAgICB2YWx1ZTogaWQsIHR5cGU6ICdwdXQnLCBwcmVmaXg6IGluZGV4REJcbiAgICAgIH0pXG5cbiAgICBtbGliLmluZGV4TGlua3MoY29udGVudCwgZnVuY3Rpb24gKG9iaiwgcmVsKSB7XG4gICAgICBhZGQoe1xuICAgICAgICBrZXk6IFsnbGluaycsIG1zZy5hdXRob3IsIHJlbCwgb2JqLmxpbmssIG1zZy5zZXF1ZW5jZSwgaWRdLFxuICAgICAgICB2YWx1ZTogb2JqLFxuICAgICAgICB0eXBlOiAncHV0JywgcHJlZml4OiBpbmRleERCXG4gICAgICB9KVxuICAgICAgYWRkKHtcbiAgICAgICAga2V5OiBbJ19saW5rJywgb2JqLmxpbmssIHJlbCwgbXNnLmF1dGhvciwgbXNnLnNlcXVlbmNlLCBpZF0sXG4gICAgICAgIHZhbHVlOiBvYmosXG4gICAgICAgIHR5cGU6ICdwdXQnLCBwcmVmaXg6IGluZGV4REJcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGRiLmNyZWF0ZUZlZWQgPSBmdW5jdGlvbiAoa2V5cykge1xuICAgIHJldHVybiBjcmVhdGVGZWVkKGRiLCBrZXlzLCBvcHRzKVxuICB9XG5cbiAgZGIubmVlZHNSZWJ1aWxkID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgc3lzREIuZ2V0KCd2bWFqb3InLCBmdW5jdGlvbiAoZXJyLCBkYnZtYWpvcikge1xuICAgICAgZGJ2bWFqb3IgPSAoZGJ2bWFqb3J8MCkgfHwgMFxuICAgICAgY2IobnVsbCwgZGJ2bWFqb3IgPCBnZXRWTWFqb3IoKSlcbiAgICB9KVxuICB9XG5cbiAgZGIucmVidWlsZEluZGV4ID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgLy8gcmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gdGhlIGluZGV4XG4gICAgcHVsbChcbiAgICAgIHBsLnJlYWQoaW5kZXhEQiwgeyBrZXlzOiB0cnVlLCB2YWx1ZXM6IGZhbHNlIH0pLFxuICAgICAgcGFyYW1hcChmdW5jdGlvbiAoa2V5LCBjYikgeyBpbmRleERCLmRlbChrZXksIGNiKSB9KSxcbiAgICAgIHB1bGwuZHJhaW4obnVsbCwgbmV4dClcbiAgICApXG5cbiAgICBmdW5jdGlvbiBuZXh0IChlcnIpIHtcbiAgICAgIGlmIChlcnIpXG4gICAgICAgIHJldHVybiBjYihlcnIpXG5cbiAgICAgIC8vIHJlcGxheSB0aGUgbG9nXG4gICAgICBwdWxsKFxuICAgICAgICBkYi5jcmVhdGVMb2dTdHJlYW0oeyBrZXlzOiB0cnVlLCB2YWx1ZXM6IHRydWUgfSksXG4gICAgICAgIHB1bGwubWFwKGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgICAgICB2YXIgb3BzID0gW11cbiAgICAgICAgICBmdW5jdGlvbiBhZGQgKGl0ZW0pIHsgb3BzLnB1c2goaXRlbSkgfVxuICAgICAgICAgIGluZGV4TXNnKGFkZCwgbXNnLnRpbWVzdGFtcCwgbXNnLmtleSwgbXNnLnZhbHVlKVxuICAgICAgICAgIHJldHVybiBvcHNcbiAgICAgICAgfSksXG4gICAgICAgIHB1bGwuZmxhdHRlbigpLFxuICAgICAgICBwbC53cml0ZShpbmRleERCLCBuZXh0MilcbiAgICAgIClcbiAgICAgIGZ1bmN0aW9uIG5leHQyIChlcnIpIHtcbiAgICAgICAgaWYgKGVycilcbiAgICAgICAgICByZXR1cm4gY2IoZXJyKVxuXG4gICAgICAgIHN5c0RCLnB1dCgndm1ham9yJywgZ2V0Vk1ham9yKCksIGNiKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG9wdHMgc3RhbmRhcmRpemVkIHRvIHdvcmsgbGlrZSBsZXZlbHVwIGFwaVxuICBmdW5jdGlvbiBzdGRvcHRzIChvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICBpZiAob3B0cy5rZXlzICE9PSBmYWxzZSlcbiAgICAgIG9wdHMua2V5cyA9IHRydWVcbiAgICBpZiAob3B0cy52YWx1ZXMgIT09IGZhbHNlKVxuICAgICAgb3B0cy52YWx1ZXMgPSB0cnVlXG4gICAgcmV0dXJuIG9wdHNcbiAgfVxuICBmdW5jdGlvbiBtc2dGbXQgKGtleXMsIHZhbHVlcywgb2JqKSB7XG4gICAgaWYgKGtleXMgJiYgdmFsdWVzKVxuICAgICAgcmV0dXJuIG9ialxuICAgIGlmIChrZXlzKVxuICAgICAgcmV0dXJuIG9iai5rZXlcbiAgICBpZiAodmFsdWVzKVxuICAgICAgcmV0dXJuIG9iai52YWx1ZVxuICAgIHJldHVybiBudWxsIC8vIGkgZ3Vlc3M/XG4gIH1cblxuICAvL1RPRE86IGV2ZW50dWFsbHksIHRoaXMgc2hvdWxkIGZpbHRlciBvdXQgYXV0aG9ycyB5b3UgZG8gbm90IGZvbGxvdy5cbiAgZGIuY3JlYXRlRmVlZFN0cmVhbSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgb3B0cyA9IHN0ZG9wdHMob3B0cylcbiAgICBsdGd0LnRvTHRndChvcHRzLCBvcHRzLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBbdmFsdWUsIExPXVxuICAgIH0sIExPLCBISSlcbiAgICB2YXIgX2tleXMgPSBvcHRzLmtleXNcbiAgICB2YXIgX3ZhbHVlcyA9IG9wdHMudmFsdWVzXG4gICAgb3B0cy5rZXlzID0gZmFsc2VcbiAgICBvcHRzLnZhbHVlcyA9IHRydWVcblxuICAgIHJldHVybiBwdWxsKFxuICAgICAgcGwucmVhZChmZWVkREIsIG9wdHMpLFxuICAgICAgbG9va3VwKF9rZXlzLCBfdmFsdWVzKVxuICAgIClcbiAgfVxuXG4gIC8vbGF0ZXN0IHdhcyBzdG9yZWQgYXMgYXV0aG9yOiBzZXFcbiAgLy9idXQgZm9yIHRoZSBwdXJwb3NlcyBvZiByZXBsaWNhdGlvbiBiYWNrIHByZXNzdXJlXG4gIC8vd2UgbmVlZCB0byBrbm93IHdoZW4gd2UgbGFzdCByZXBsaWNhdGVkIHdpdGggc29tZW9uZS5cbiAgLy9pbnN0ZWFkIHN0b3JlIGFzOiB7c2VxdWVuY2U6IHNlcSwgdHM6IGxvY2FsdGltZX1cbiAgLy90aGVuLCBwZWVycyBjYW4gcmVxdWVzdCBhIG1heCBudW1iZXIgb2YgcG9zdHMgcGVyIGZlZWQuXG5cbiAgZnVuY3Rpb24gdG9TZXEgKGxhdGVzdCkge1xuICAgIHJldHVybiBpc051bWJlcihsYXRlc3QpID8gbGF0ZXN0IDogbGF0ZXN0LnNlcXVlbmNlXG4gIH1cblxuICBkYi5sYXRlc3QgPSBmdW5jdGlvbiAob3B0cykge1xuICAgIHJldHVybiBwdWxsKFxuICAgICAgcGwucmVhZChsYXN0REIsIG9wdHMpLFxuICAgICAgcHVsbC5tYXAoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIGQgPSB7aWQ6IGRhdGEua2V5LCBzZXF1ZW5jZTogdG9TZXEoZGF0YS52YWx1ZSksIHRzOiBkYXRhLnZhbHVlLnRzIH1cbiAgICAgICAgcmV0dXJuIGRcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gbG9va3VwKGtleXMsIHZhbHVlcykge1xuICAgIHJldHVybiBwYXJhbWFwKGZ1bmN0aW9uIChrZXksIGNiKSB7XG4gICAgICBpZihrZXkuc3luYykgcmV0dXJuIGNiKG51bGwsIGtleSlcbiAgICAgIGlmKCF2YWx1ZXMpIHJldHVybiBjYihudWxsLCBrZXkpXG4gICAgICBkYi5nZXQoa2V5LCBmdW5jdGlvbiAoZXJyLCBtc2cpIHtcbiAgICAgICAgaWYgKGVycikgY2IoZXJyKVxuICAgICAgICBlbHNlIGNiKG51bGwsIG1zZ0ZtdChrZXlzLCB2YWx1ZXMsIHsga2V5OiBrZXksIHZhbHVlOiBtc2cgfSkpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBkYi5jcmVhdGVIaXN0b3J5U3RyZWFtID0gZnVuY3Rpb24gKGlkLCBzZXEsIGxpdmUpIHtcbiAgICB2YXIgX2tleXMgPSB0cnVlLCBfdmFsdWVzID0gdHJ1ZSwgbGltaXRcbiAgICBpZighaXNGZWVkSWQoaWQpKSB7XG4gICAgICB2YXIgb3B0cyA9IHN0ZG9wdHMoaWQpXG4gICAgICBpZCAgICAgICA9IG9wdHMuaWRcbiAgICAgIHNlcSAgICAgID0gb3B0cy5zZXF1ZW5jZSB8fCBvcHRzLnNlcSB8fCAwXG4gICAgICBsaXZlICAgICA9ICEhb3B0cy5saXZlXG4gICAgICBsaW1pdCAgICA9IG9wdHMubGltaXRcbiAgICAgIF9rZXlzICAgID0gb3B0cy5rZXlzICE9PSBmYWxzZVxuICAgICAgX3ZhbHVlcyAgPSBvcHRzLnZhbHVlcyAhPT0gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHB1bGwoXG4gICAgICBwbC5yZWFkKGNsb2NrREIsIHtcbiAgICAgICAgZ3RlOiAgW2lkLCBzZXFdLFxuICAgICAgICBsdGU6ICBbaWQsIE1BWF9JTlRdLFxuICAgICAgICBsaXZlOiBsaXZlLFxuICAgICAgICBrZXlzOiBmYWxzZSxcbiAgICAgICAgc3luYzogb3B0cyAmJiBvcHRzLnN5bmMsXG4gICAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgICAgb25BYm9ydDogb3B0cyAmJiBvcHRzLm9uQWJvcnRcbiAgICAgIH0pLFxuICAgICAgbG9va3VwKF9rZXlzLCBfdmFsdWVzKVxuICAgIClcbiAgfVxuXG5cbiAgZGIuY3JlYXRlVXNlclN0cmVhbSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgb3B0cyA9IHN0ZG9wdHMob3B0cylcbiAgICBsdGd0LnRvTHRndChvcHRzLCBvcHRzLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBbb3B0cy5pZCwgdmFsdWVdXG4gICAgfSwgTE8sIEhJKVxuICAgIHZhciBfa2V5cyA9IG9wdHMua2V5c1xuICAgIHZhciBfdmFsdWVzID0gb3B0cy52YWx1ZXNcblxuICAgIG9wdHMua2V5cyA9IGZhbHNlXG4gICAgb3B0cy52YWx1ZXMgPSB0cnVlXG4gICAgcmV0dXJuIHB1bGwoXG4gICAgICBwbC5yZWFkKGNsb2NrREIsIG9wdHMpLFxuICAgICAgbG9va3VwKF9rZXlzLCBfdmFsdWVzKVxuICAgIClcbiAgfVxuXG5cbiAgLy93cml0ZVN0cmVhbSAtIHVzZWQgaW4gcmVwbGljYXRpb24uXG4gIGRiLmNyZWF0ZVdyaXRlU3RyZWFtID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgcmV0dXJuIHB1bGwoXG4gICAgICBwYXJhbWFwKGZ1bmN0aW9uIChkYXRhLCBjYikge1xuICAgICAgICBkYi5hZGQoZGF0YSwgZnVuY3Rpb24gKGVyciwgbXNnKSB7XG4gICAgICAgICAgZGIuZW1pdCgnaW52YWxpZCcsIGVyciwgbXNnKVxuICAgICAgICAgIGNiKClcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgICAgcHVsbC5kcmFpbihudWxsLCBjYilcbiAgICApXG4gIH1cblxuICBkYi5jcmVhdGVGZWVkID0gZnVuY3Rpb24gKGtleXMpIHtcbiAgICBpZigha2V5cylcbiAgICAgIGtleXMgPSBvcHRzLmtleXMuZ2VuZXJhdGUoKVxuICAgIHJldHVybiBjcmVhdGVGZWVkKGRiLCBrZXlzLCBvcHRzKVxuICB9XG5cbiAgZGIubGF0ZXN0U2VxdWVuY2UgPSBmdW5jdGlvbiAoaWQsIGNiKSB7XG4gICAgbGFzdERCLmdldChpZCwgY2IpXG4gIH1cblxuICBkYi5nZXRMYXRlc3QgPSBmdW5jdGlvbiAoaWQsIGNiKSB7XG4gICAgbGFzdERCLmdldChpZCwgZnVuY3Rpb24gKGVyciwgdikge1xuICAgICAgaWYoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgY2xvY2tEQi5nZXQoW2lkLCB0b1NlcSh2KV0sIGZ1bmN0aW9uIChlcnIsIGhhc2gpIHtcbiAgICAgICAgaWYoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgICBkYi5nZXQoaGFzaCwgZnVuY3Rpb24gKGVyciwgbXNnKSB7XG4gICAgICAgICAgY2IoZXJyLCB7a2V5OiBoYXNoLCB2YWx1ZTogbXNnfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGRiLmNyZWF0ZUxvZ1N0cmVhbSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgb3B0cyA9IHN0ZG9wdHMob3B0cylcbiAgICB2YXIgbGl2ZSA9IG9wdHMubGl2ZSB8fCBvcHRzLnRhaWw7IGRlbGV0ZSBvcHRzLmxpdmVcbiAgICB2YXIga2V5cyA9IG9wdHMua2V5czsgZGVsZXRlIG9wdHMua2V5c1xuICAgIHZhciB2YWx1ZXMgPSBvcHRzLnZhbHVlczsgZGVsZXRlIG9wdHMudmFsdWVzXG5cbiAgICB2YXIgb2xkID0gcHVsbChcbiAgICAgIHBsLnJlYWQobG9nREIsIG9wdHMpLFxuICAgICAgcGFyYW1hcChmdW5jdGlvbiAoZGF0YSwgY2IpIHtcbiAgICAgICAgaWYoZGF0YS5zeW5jKSByZXR1cm4gY2IobnVsbCwgZGF0YSlcbiAgICAgICAgdmFyIGtleSA9IGRhdGEudmFsdWVcbiAgICAgICAgdmFyIHNlcSA9IGRhdGEua2V5XG4gICAgICAgIGRiLmdldChrZXksIGZ1bmN0aW9uIChlcnIsIHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGVycikgY2IoZXJyKVxuICAgICAgICAgIGVsc2UgY2IobnVsbCwgbXNnRm10KGtleXMsIHZhbHVlcywge2tleToga2V5LCB2YWx1ZTogdmFsdWUsIHRpbWVzdGFtcDogc2VxfSkpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIClcbiAgICBpZighbGl2ZSkgcmV0dXJuIG9sZFxuXG4gICAgcmV0dXJuIGNhdChbb2xkLCBwdWxsLnZhbHVlcyhbe3N5bmM6IHRydWV9XSksIHBsLmxpdmUoZGIpXSlcblxuICB9XG5cbiAgdmFyIEhJID0gdW5kZWZpbmVkLCBMTyA9IG51bGxcblxuICBkYi5tZXNzYWdlc0J5VHlwZSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgaWYoIW9wdHMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSB7dHlwZTogc3RyaW5nfSB0byBtZXNzYWdlc0J5VHlwZScpXG5cbiAgICBpZihpc1N0cmluZyhvcHRzKSlcbiAgICAgIG9wdHMgPSB7dHlwZTogb3B0c31cblxuICAgIG9wdHMgPSBzdGRvcHRzKG9wdHMpXG4gICAgdmFyIF9rZXlzICAgPSBvcHRzLmtleXNcbiAgICB2YXIgX3ZhbHVlcyA9IG9wdHMudmFsdWVzXG4gICAgb3B0cy52YWx1ZXMgPSB0cnVlXG5cbiAgICBsdGd0LnRvTHRndChvcHRzLCBvcHRzLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBbJ3R5cGUnLCBvcHRzLnR5cGUsIHZhbHVlXVxuICAgIH0sIExPLCBISSlcblxuICAgIHJldHVybiBwdWxsKFxuICAgICAgcGwucmVhZChpbmRleERCLCBvcHRzKSxcbiAgICAgIHBhcmFtYXAoZnVuY3Rpb24gKGRhdGEsIGNiKSB7XG4gICAgICAgIHZhciBpZCA9IF9rZXlzID8gZGF0YS52YWx1ZSA6IGRhdGFcbiAgICAgICAgZGIuZ2V0KGlkLCBmdW5jdGlvbiAoZXJyLCBtc2cpIHtcbiAgICAgICAgICB2YXIgdHMgPSBvcHRzLmtleXMgPyBkYXRhLmtleVsyXSA6IHVuZGVmaW5lZFxuICAgICAgICAgIGNiKG51bGwsIG1zZ0ZtdChfa2V5cywgX3ZhbHVlcywge2tleTogaWQsIHRzOiB0cywgdmFsdWU6IG1zZ30pKVxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgICBwdWxsLmZpbHRlcigpXG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0KG9wdHMsIG9wLCBrZXksIHZhbHVlKSB7XG4gICAgdmFyIG1ldGEgPSBvcHRzLm1ldGEgIT09IGZhbHNlICAvL2RlZmF1bHQ6IHRydWVcbiAgICB2YXIga2V5cyA9IG9wdHMua2V5cyAhPT0gZmFsc2UgIC8vZGVmYXVsdDogdHJ1ZVxuICAgIHZhciB2YWxzID0gb3B0cy52YWx1ZXMgPT09IHRydWUgLy9kZWZhdWx0OiBmYWxzZVxuICAgIGlmKCFtZXRhJiYha2V5cyYmIXZhbHMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Egc3RyZWFtIHdpdGhvdXQgYW55IHZhbHVlcyBkb2VzIG5vdCBtYWtlIHNlbnNlJylcbiAgICBpZighbWV0YSkgcmV0dXJuIChcbiAgICAgICAgICBrZXlzICYmIHZhbHMgID8ge2tleTogb3Aua2V5LCB2YWx1ZTogdmFsdWV9XG4gICAgICAgIDoga2V5cyAgICAgICAgICA/IG9wLmtleVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgKVxuICAgIGVsc2Uge1xuICAgICAgaWYodmFscykgIG9wLnZhbHVlID0gdmFsdWVcbiAgICAgIGlmKCFrZXlzKSBkZWxldGUgb3Aua2V5XG4gICAgICByZXR1cm4gb3BcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0eXBlKHQpIHsgcmV0dXJuIHtmZWVkOiAnQCcsIG1zZzogJyUnLCBibG9iOiAnJid9W3RdIHx8IHQgfVxuXG4gIGRiLmxpbmtzID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBpZighb3B0cykgdGhyb3cgbmV3IEVycm9yKCdvcHRzICptdXN0KiBiZSBwcm92aWRlZCcpXG4gICAgb3B0cy5tZXRhID0gb3B0cy5tZXRhICE9PSBmYWxzZSAvL2RlZmF1bHQ6IHRydWVcbiAgICBvcHRzLmtleXMgPSBvcHRzLmtleXMgIT09IGZhbHNlIC8vZGVmYXVsdDogdHJ1ZVxuICAgIGlmKCFvcHRzLnZhbHVlcyYmIW9wdHMubWV0YSYmIW9wdHMua2V5cylcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWFrZXMgbm8gc2Vuc2UgdG8gcmV0dXJuIHN0cmVhbSB3aXRob3V0IHJlc3VsdHMnXG4gICAgICAgICsgJ3NldCBhdCBsZWFzdCBvbmUgb2Yge2tleXMsIHZhbHVlcywgbWV0YX0gdG8gdHJ1ZScpXG5cbiAgICBmdW5jdGlvbiB0b2xpbmsgKHYpIHtcbiAgICAgIHJldHVybiAoc3NicmVmLmlzTGluayh2KSkgPyB2IDogbnVsbFxuICAgIH1cblxuICAgIHZhciBzcmMgPSB0eXBlKG9wdHMuc291cmNlKSwgZHN0ID0gdHlwZShvcHRzLmRlc3QpLCByZWwgPSBvcHRzLnJlbFxuXG4gICAgdmFyIGJhY2sgPSBkc3QgJiYgIXNyY1xuICAgIHZhciBmcm9tID0gYmFjayA/IGRzdCA6IHNyYywgdG8gPSBiYWNrID8gc3JjIDogZHN0XG5cbiAgICBmdW5jdGlvbiByYW5nZSh2YWx1ZSwgZW5kLCBkZWYpIHtcbiAgICAgIHJldHVybiAhdmFsdWUgPyBkZWYgOiAvXltAJSZdJC8udGVzdCh2YWx1ZSkgPyB2YWx1ZSArIGVuZCA6IHZhbHVlXG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvKHZhbHVlKSB7IHJldHVybiByYW5nZSh2YWx1ZSwgXCIhXCIsIExPKSB9XG4gICAgZnVuY3Rpb24gaGkodmFsdWUpIHsgcmV0dXJuIHJhbmdlKHZhbHVlLCBcIn5cIiwgSEkpIH1cblxuXG4gICAgdmFyIGluZGV4ID0gYmFjayA/ICdfbGluaycgOiAnbGluaydcbiAgICB2YXIgZ3RlID0gW2luZGV4LCBsbyhmcm9tKSwgcmVsIHx8IExPLCBsbyh0byksIExPLCBMT11cbiAgICB2YXIgbHRlID0gW2luZGV4LCBoaShmcm9tKSwgcmVsIHx8IEhJLCBoaSh0byksIEhJLCBISV1cblxuICAgIGZ1bmN0aW9uIHRlc3RMaW5rIChhLCBlKSB7IC8vYWN0dWFsLCBleHBlY3RlZFxuICAgICAgcmV0dXJuIGUgPyBlLmxlbmd0aCA9PT0gMSA/IGFbMF09PWVbMF0gOiBhPT09ZSA6IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gcHVsbChcbiAgICAgIHBsLnJlYWQoaW5kZXhEQiwgeyBndGU6IGd0ZSwgbHRlOiBsdGUsIGxpdmU6IG9wdHMubGl2ZSwgcmV2ZXJzZTogb3B0cy5yZXZlcnNlIH0pLFxuICAgICAgcHVsbC5tYXAoZnVuY3Rpb24gKG9wKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiBvcC5rZXlbYmFjaz8zOjFdLFxuICAgICAgICAgIHJlbDogb3Aua2V5WzJdLFxuICAgICAgICAgIGRlc3Q6IG9wLmtleVtiYWNrPzE6M10sXG4gICAgICAgICAga2V5OiBvcC5rZXlbNV1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAvLyBpbiBjYXNlIHNvdXJjZSBhbmQgZGVzdCBhcmUga25vd24gYnV0IG5vdCByZWwsXG4gICAgICAvLyB0aGlzIHdpbGwgc2NhbiBhbGwgbGlua3MgZnJvbSB0aGUgc291cmNlXG4gICAgICAvLyBhbmQgZmlsdGVyIG91dCB0aG9zZSB0byB0aGUgZGVzdC4gbm90IGVmZmljaWVudFxuICAgICAgLy8gYnV0IHByb2JhYmx5IGEgcmFyZSBxdWVyeS5cbiAgICAgIHB1bGwuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmKHJlbCAmJiByZWwgIT09IGRhdGEucmVsKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYoIXRlc3RMaW5rKGRhdGEuZGVzdCwgZHN0KSkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmKCF0ZXN0TGluayhkYXRhLnNvdXJjZSwgc3JjKSkgcmV0dXJuIGZhbHNlXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KSxcbiAgICAgICEgb3B0cy52YWx1ZXNcbiAgICAgID8gcHVsbC5tYXAoZnVuY3Rpb24gKG9wKSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdChvcHRzLCBvcCwgb3Aua2V5LCBudWxsKVxuICAgICAgICB9KVxuICAgICAgOiBwYXJhbWFwKGZ1bmN0aW9uIChvcCwgY2IpIHtcbiAgICAgICAgICBkYi5nZXQob3Aua2V5LCBmdW5jdGlvbiAoZXJyLCBtc2cpIHtcbiAgICAgICAgICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgICAgIGNiKG51bGwsIGZvcm1hdChvcHRzLCBvcCwgb3Aua2V5LCBtc2cpKVxuICAgICAgICAgIH0pXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIC8vZ2V0IGFsbCBtZXNzYWdlcyB0aGF0IGxpbmsgdG8gYSBnaXZlbiBtZXNzYWdlLlxuICBkYi5yZWxhdGVkTWVzc2FnZXMgPSBmdW5jdGlvbiAob3B0cywgY2IpIHtcbiAgICBpZihpc1N0cmluZyhvcHRzKSkgb3B0cyA9IHtrZXk6IG9wdHN9XG4gICAgaWYoIW9wdHMpIHRocm93IG5ldyBFcnJvcignb3B0cyAqbXVzdCogYmUgb2JqZWN0JylcbiAgICB2YXIga2V5ID0gb3B0cy5pZCB8fCBvcHRzLmtleVxuXG4gICAgdmFyIG4gPSAxXG4gICAgdmFyIG1zZ3MgPSB7a2V5OiBrZXksIHZhbHVlOiBudWxsfVxuICAgIGRiLmdldChrZXksIGZ1bmN0aW9uIChlcnIsIG1zZykge1xuICAgICAgbXNncy52YWx1ZSA9IG1zZ1xuICAgICAgaWYgKGVyciAmJiBlcnIubm90Rm91bmQpXG4gICAgICAgIGVyciA9IG51bGwgLy8gaWdub3JlIG5vdCBmb3VuZFxuICAgICAgZG9uZShlcnIpXG4gICAgfSlcblxuICAgIHJlbGF0ZWQobXNncylcblxuICAgIGZ1bmN0aW9uIHJlbGF0ZWQgKG1zZykge1xuICAgICAgaWYgKG48MCkgcmV0dXJuXG4gICAgICBuKytcbiAgICAgIGFsbChkYi5saW5rcyh7ZGVzdDogbXNnLmtleSwgcmVsOiBvcHRzLnJlbCwga2V5czogdHJ1ZSwgdmFsdWVzOnRydWUsIG1ldGE6IGZhbHNlLCB0eXBlOidtc2cnfSkpXG4gICAgICAoZnVuY3Rpb24gKGVyciwgYXJ5KSB7XG4gICAgICAgIGlmKGFyeSAmJiBhcnkubGVuZ3RoKSB7XG4gICAgICAgICAgYXJ5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlKGEudmFsdWUudGltZXN0YW1wLCBiLnZhbHVlLnRpbWVzdGFtcCkgfHwgY29tcGFyZShhLmtleSwgYi5rZXkpXG4gICAgICAgICAgfSlcbiAgICAgICAgICBtc2cucmVsYXRlZCA9IGFyeVxuICAgICAgICAgIGFyeS5mb3JFYWNoKHJlbGF0ZWQpXG4gICAgICAgIH1cbiAgICAgICAgZG9uZShlcnIpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvdW50IChtc2cpIHtcbiAgICAgIGlmKCFtc2cucmVsYXRlZClcbiAgICAgICAgcmV0dXJuIG1zZ1xuICAgICAgdmFyIGMgPSAwXG4gICAgICBtc2cucmVsYXRlZC5mb3JFYWNoKGZ1bmN0aW9uIChfbXNnKSB7XG4gICAgICAgIGlmKG9wdHMucGFyZW50KSBfbXNnLnBhcmVudCA9IG1zZy5rZXlcbiAgICAgICAgYyArPSAxICsgKGNvdW50KF9tc2cpLmNvdW50IHx8IDApXG4gICAgICB9KVxuICAgICAgaWYob3B0cy5jb3VudCkgbXNnLmNvdW50ID0gY1xuICAgICAgcmV0dXJuIG1zZ1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRvbmUgKGVycikge1xuICAgICAgaWYoZXJyICYmIG4gPiAwKSB7XG4gICAgICAgIG4gPSAtMVxuICAgICAgICByZXR1cm4gY2IoZXJyKVxuICAgICAgfVxuICAgICAgaWYoLS1uKSByZXR1cm5cbiAgICAgIGNiKG51bGwsIGNvdW50KG1zZ3MpKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYlxufVxuXG5cblxuXG4iLCIvLyByZXF1aXJlIHR5cGV3aXNlIGZpcnN0IHRvIGV4dGVuZCB3aXRoIGNvcmUgdHlwZXdpc2UgZnVuY3Rpb25hbGl0eVxucmVxdWlyZSgndHlwZXdpc2UnKVxuXG4vLyBUT0RPOiBieXRld2lzZS1iaW5hcnkgZW5jb2RpbmcgLS0gbm8gaGV4IHBhcnNpbmcgb3IgdG9TdHJpbmcgaGFja2VyeVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdieXRld2lzZS1jb3JlJylcbiIsIi8vIFRPRE86IHN0YW5kYXJkIGJ5dGV3aXNlIGVuY29kaW5nIGNvbnN0cnVjdG9yXG4vLyBUT0RPOiBlbmhhbmNlIGJpbmFyeSBlbmNvZGluZyB3aXRoIG9wdGlvbmFsIGhleCBoZWxwZXJzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYmluYXJ5JykiLCIvLyBUT0RPOiBpbml0aWFsaXplIGFuZCBleHBvcnQgYSBzdGFuZGFyZCBieXRld2lzZSBlbmNvZGluZywgYWRkIGhleCBhbmQgYmluYXJ5XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZW5jb2RpbmcvJylcbiIsInZhciBudXQgICAgID0gcmVxdWlyZSgnLi9udXQnKVxudmFyIHNoZWxsICAgPSByZXF1aXJlKCcuL3NoZWxsJykgLy90aGUgc2hlbGwgc3Vycm91bmRzIHRoZSBudXRcbnZhciBjb2RlYyAgID0gcmVxdWlyZSgnbGV2ZWx1cC9saWIvY29kZWMnKVxudmFyIG1lcmdlICAgPSByZXF1aXJlKCd4dGVuZCcpXG52YXIgY29tcGFyZSA9IHJlcXVpcmUoJ3R5cGV3aXNlbGl0ZScpXG52YXIgUmVhZFN0cmVhbSA9IHJlcXVpcmUoJ2xldmVsdXAvbGliL3JlYWQtc3RyZWFtJylcblxudmFyIHByZWNvZGVjID0gcmVxdWlyZSgnLi9jb2RlYy9ieXRld2lzZScpXG5cbmZ1bmN0aW9uIGlkIChlKSB7XG4gIHJldHVybiBlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRiLCBvcHRzKSB7XG5cbiAgb3B0cyA9IG1lcmdlKGRiLm9wdGlvbnMsIHtcbiAgICBrZXlFbmNvZGluZzoge1xuICAgICAgZW5jb2RlOiBpZCxcbiAgICAgIGRlY29kZTogaWQsXG4gICAgICBidWZmZXI6IHRydWVcbiAgICB9XG4gIH0sIG9wdHMpXG5cbiAgcmV0dXJuIHNoZWxsIChcbiAgICBudXQgKCBkYiwgcHJlY29kZWMsIGNvZGVjLCBjb21wYXJlICksXG4gICAgW10sIFJlYWRTdHJlYW0sIG9wdHNcbiAgKVxufVxuXG5cbiIsInZhciBieXRld2lzZSA9IHJlcXVpcmUoJ2J5dGV3aXNlJylcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGVuY29kZTogYnl0ZXdpc2UuZW5jb2RlLFxuICBkZWNvZGU6IGJ5dGV3aXNlLmRlY29kZSxcbiAgbG93ZXJCb3VuZDogbnVsbCxcbiAgdXBwZXJCb3VuZDogdW5kZWZpbmVkLFxuICBidWZmZXI6IHRydWVcbn1cbiIsIlxudmFyIGluUmFuZ2UgPSByZXF1aXJlKCcuL3JhbmdlJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY29tcGFyZSkge1xuICB2YXIgaG9va3MgPSBbXVxuXG4gIHJldHVybiB7XG4gICAgYWRkOiBmdW5jdGlvbiAocmFuZ2UsIGhvb2spIHtcbiAgICAgIHZhciBtID0ge3JhbmdlOiByYW5nZSwgaG9vazogaG9va31cbiAgICAgIGhvb2tzLnB1c2gobSlcbiAgICAgIC8vY2FsbCB0aGlzIHRvIHJlbW92ZVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGkgPSBob29rcy5pbmRleE9mKG0pXG4gICAgICAgIGlmKH5pKSByZXR1cm4gaG9va3Muc3BsaWNlKGksIDEpXG4gICAgICB9XG5cbiAgICB9LFxuXG4gICAgLy9yZW1vdmUgYWxsIGxpc3RlbmVycyB3aXRoaW4gYSByYW5nZS5cbiAgICAvL3RoaXMgd2lsbCBiZSB1c2VkIHRvIGNsb3NlIGEgc3VibGV2ZWwuXG4gICAgcmVtb3ZlQWxsOiBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJylcbiAgICB9LFxuXG4gICAgdHJpZ2dlcjogZnVuY3Rpb24gKGtleSwgYXJncykge1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0ZXN0ID0gaG9va3NbaV1cbiAgICAgICAgaWYoaW5SYW5nZSh0ZXN0LnJhbmdlLCBrZXksIGNvbXBhcmUpKVxuICAgICAgICAgIHRlc3QuaG9vay5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiXG5leHBvcnRzLmNvbXBhcmUgPSBmdW5jdGlvbiAoYSwgYikge1xuXG4gIGlmKEJ1ZmZlci5pc0J1ZmZlcihhKSkge1xuICAgIHZhciBsID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBjbXAgPSBhW2ldIC0gYltpXVxuICAgICAgaWYoY21wKSByZXR1cm4gY21wXG4gICAgfVxuICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDBcbn1cblxuZnVuY3Rpb24gaGFzKG9iaiwga2V5KSB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcbn1cblxuLy8gdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IGFic3RyYWN0LWxldmVsZG93biB0ZXN0c1xuLy8gbnVsbGlzaCBvciBlbXB0eSBzdHJpbmdzLlxuLy8gSSBjb3VsZCB1c2UgISF2YWwgYnV0IEkgd2FudCB0byBwZXJtaXQgbnVtYmVycyBhbmQgYm9vbGVhbnMsXG4vLyBpZiBwb3NzaWJsZS5cblxuZnVuY3Rpb24gaXNEZWYgKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSAnJ1xufVxuXG5mdW5jdGlvbiBoYXMgKHJhbmdlLCBuYW1lKSB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyYW5nZSwgbmFtZSlcbn1cblxuZnVuY3Rpb24gaGFzS2V5KHJhbmdlLCBuYW1lKSB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyYW5nZSwgbmFtZSkgJiYgbmFtZVxufVxuXG52YXIgbG93ZXJCb3VuZEtleSA9IGV4cG9ydHMubG93ZXJCb3VuZEtleSA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHJldHVybiAoXG4gICAgICAgaGFzS2V5KHJhbmdlLCAnZ3QnKVxuICAgIHx8IGhhc0tleShyYW5nZSwgJ2d0ZScpXG4gICAgfHwgaGFzS2V5KHJhbmdlLCAnbWluJylcbiAgICB8fCAocmFuZ2UucmV2ZXJzZSA/IGhhc0tleShyYW5nZSwgJ2VuZCcpIDogaGFzS2V5KHJhbmdlLCAnc3RhcnQnKSlcbiAgICB8fCB1bmRlZmluZWRcbiAgICApXG59XG5cbnZhciBsb3dlckJvdW5kID0gZXhwb3J0cy5sb3dlckJvdW5kID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gIHZhciBrID0gbG93ZXJCb3VuZEtleShyYW5nZSlcbiAgcmV0dXJuIGsgJiYgcmFuZ2Vba11cbn1cblxuZXhwb3J0cy5sb3dlckJvdW5kSW5jbHVzaXZlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gIHJldHVybiBoYXMocmFuZ2UsICdndCcpID8gZmFsc2UgOiB0cnVlXG59XG5cbmV4cG9ydHMudXBwZXJCb3VuZEluY2x1c2l2ZSA9XG4gIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHJldHVybiBoYXMocmFuZ2UsICdsdCcpIHx8ICFyYW5nZS5taW5FeCA/IGZhbHNlIDogdHJ1ZVxuICB9XG5cbnZhciBsb3dlckJvdW5kRXhjbHVzaXZlID0gZXhwb3J0cy5sb3dlckJvdW5kRXhjbHVzaXZlID1cbiAgZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgcmV0dXJuIGhhcyhyYW5nZSwgJ2d0JykgfHwgcmFuZ2UubWluRXggPyB0cnVlIDogZmFsc2VcbiAgfVxuXG52YXIgdXBwZXJCb3VuZEV4Y2x1c2l2ZSA9IGV4cG9ydHMudXBwZXJCb3VuZEV4Y2x1c2l2ZSA9XG4gIGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHJldHVybiBoYXMocmFuZ2UsICdsdCcpID8gdHJ1ZSA6IGZhbHNlXG4gIH1cblxudmFyIHVwcGVyQm91bmRLZXkgPSBleHBvcnRzLnVwcGVyQm91bmRLZXkgPSBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICByZXR1cm4gKFxuICAgICAgIGhhc0tleShyYW5nZSwgJ2x0JylcbiAgICB8fCBoYXNLZXkocmFuZ2UsICdsdGUnKVxuICAgIHx8IGhhc0tleShyYW5nZSwgJ21heCcpXG4gICAgfHwgKHJhbmdlLnJldmVyc2UgPyBoYXNLZXkocmFuZ2UsICdzdGFydCcpIDogaGFzS2V5KHJhbmdlLCAnZW5kJykpXG4gICAgfHwgdW5kZWZpbmVkXG4gICAgKVxufVxuXG52YXIgdXBwZXJCb3VuZCA9IGV4cG9ydHMudXBwZXJCb3VuZCA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICB2YXIgayA9IHVwcGVyQm91bmRLZXkocmFuZ2UpXG4gIHJldHVybiBrICYmIHJhbmdlW2tdXG59XG5cbmZ1bmN0aW9uIGlkIChlKSB7IHJldHVybiBlIH1cblxuZXhwb3J0cy50b0x0Z3QgPSBmdW5jdGlvbiAocmFuZ2UsIF9yYW5nZSwgbWFwLCBsb3dlciwgdXBwZXIpIHtcbiAgX3JhbmdlID0gX3JhbmdlIHx8IHt9XG4gIG1hcCA9IG1hcCB8fCBpZFxuICB2YXIgZGVmYXVsdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gM1xuICB2YXIgbGIgPSBleHBvcnRzLmxvd2VyQm91bmRLZXkocmFuZ2UpXG4gIHZhciB1YiA9IGV4cG9ydHMudXBwZXJCb3VuZEtleShyYW5nZSlcbiAgaWYobGIpIHtcbiAgICBpZihsYiA9PT0gJ2d0JykgX3JhbmdlLmd0ID0gbWFwKHJhbmdlLmd0LCBmYWxzZSlcbiAgICBlbHNlICAgICAgICAgICAgX3JhbmdlLmd0ZSA9IG1hcChyYW5nZVtsYl0sIGZhbHNlKVxuICB9XG4gIGVsc2UgaWYoZGVmYXVsdHMpXG4gICAgX3JhbmdlLmd0ZSA9IG1hcChsb3dlciwgZmFsc2UpXG5cbiAgaWYodWIpIHtcbiAgICBpZih1YiA9PT0gJ2x0JykgX3JhbmdlLmx0ID0gbWFwKHJhbmdlLmx0LCB0cnVlKVxuICAgIGVsc2UgICAgICAgICAgICBfcmFuZ2UubHRlID0gbWFwKHJhbmdlW3ViXSwgdHJ1ZSlcbiAgfVxuICBlbHNlIGlmKGRlZmF1bHRzKVxuICAgIF9yYW5nZS5sdGUgPSBtYXAodXBwZXIsIHRydWUpXG5cbiAgaWYocmFuZ2UucmV2ZXJzZSAhPSBudWxsKVxuICAgIF9yYW5nZS5yZXZlcnNlID0gISFyYW5nZS5yZXZlcnNlXG5cbiAgLy9pZiByYW5nZSB3YXMgdXNlZCBtdXRhYmx5XG4gIC8vKGluIGxldmVsLXN1YmxldmVsIGl0J3MgcGFydCBvZiBhbiBvcHRpb25zIG9iamVjdFxuICAvL3RoYXQgaGFzIG1vcmUgcHJvcGVydGllcyBvbiBpdC4pXG4gIGlmKGhhcyhfcmFuZ2UsICdtYXgnKSkgICBkZWxldGUgX3JhbmdlLm1heFxuICBpZihoYXMoX3JhbmdlLCAnbWluJykpICAgZGVsZXRlIF9yYW5nZS5taW5cbiAgaWYoaGFzKF9yYW5nZSwgJ3N0YXJ0JykpIGRlbGV0ZSBfcmFuZ2Uuc3RhcnRcbiAgaWYoaGFzKF9yYW5nZSwgJ2VuZCcpKSAgIGRlbGV0ZSBfcmFuZ2UuZW5kXG5cbiAgcmV0dXJuIF9yYW5nZVxufVxuXG5leHBvcnRzLmNvbnRhaW5zID0gZnVuY3Rpb24gKHJhbmdlLCBrZXksIGNvbXBhcmUpIHtcbiAgY29tcGFyZSA9IGNvbXBhcmUgfHwgZXhwb3J0cy5jb21wYXJlXG5cbiAgdmFyIGxiID0gbG93ZXJCb3VuZChyYW5nZSlcbiAgaWYoaXNEZWYobGIpKSB7XG4gICAgdmFyIGNtcCA9IGNvbXBhcmUoa2V5LCBsYilcbiAgICBpZihjbXAgPCAwIHx8IChjbXAgPT09IDAgJiYgbG93ZXJCb3VuZEV4Y2x1c2l2ZShyYW5nZSkpKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB2YXIgdWIgPSB1cHBlckJvdW5kKHJhbmdlKVxuICBpZihpc0RlZih1YikpIHtcbiAgICB2YXIgY21wID0gY29tcGFyZShrZXksIHViKVxuICAgIGlmKGNtcCA+IDAgfHwgKGNtcCA9PT0gMCkgJiYgdXBwZXJCb3VuZEV4Y2x1c2l2ZShyYW5nZSkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydHMuZmlsdGVyID0gZnVuY3Rpb24gKHJhbmdlLCBjb21wYXJlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY29udGFpbnMocmFuZ2UsIGtleSwgY29tcGFyZSlcbiAgfVxufVxuIiwidmFyIGhvb2tzID0gcmVxdWlyZSgnLi9ob29rcycpXG52YXIgbHRndCA9IHJlcXVpcmUoJ2x0Z3QnKVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7XG4gIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZlxufVxuXG5mdW5jdGlvbiBnZXRQcmVmaXggKGRiKSB7XG4gIGlmKGRiID09IG51bGwpIHJldHVybiBkYlxuICBpZihpc0Z1bmN0aW9uKGRiLnByZWZpeCkpIHJldHVybiBkYi5wcmVmaXgoKVxuICByZXR1cm4gZGJcbn1cblxuZnVuY3Rpb24gaGFzKG9iaiwgbmFtZSkge1xuICByZXR1cm4gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwob2JqLCBuYW1lKVxufVxuXG5mdW5jdGlvbiBjbG9uZSAoX29iaikge1xuICB2YXIgb2JqID0ge31cbiAgZm9yKHZhciBrIGluIF9vYmopXG4gICAgb2JqW2tdID0gX29ialtrXVxuICByZXR1cm4gb2JqXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRiLCBwcmVjb2RlYywgY29kZWMsIGNvbXBhcmUpIHtcbiAgdmFyIHByZWhvb2tzID0gaG9va3MoY29tcGFyZSlcbiAgdmFyIHBvc3Rob29rcyA9IGhvb2tzKGNvbXBhcmUpXG4gIHZhciB3YWl0aW5nID0gW10sIHJlYWR5ID0gZmFsc2VcblxuICBmdW5jdGlvbiBlbmNvZGVQcmVmaXgocHJlZml4LCBrZXksIG9wdHMxLCBvcHRzMikge1xuICAgIHJldHVybiBwcmVjb2RlYy5lbmNvZGUoWyBwcmVmaXgsIGNvZGVjLmVuY29kZUtleShrZXksIG9wdHMxLCBvcHRzMiApIF0pXG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVQcmVmaXgoZGF0YSkge1xuICAgIHJldHVybiBwcmVjb2RlYy5kZWNvZGUoZGF0YSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZEVuY29kaW5ncyhvcCwgcHJlZml4KSB7XG4gICAgaWYocHJlZml4ICYmIHByZWZpeC5vcHRpb25zKSB7XG4gICAgICBvcC5rZXlFbmNvZGluZyA9XG4gICAgICAgIG9wLmtleUVuY29kaW5nIHx8IHByZWZpeC5vcHRpb25zLmtleUVuY29kaW5nXG4gICAgICBvcC52YWx1ZUVuY29kaW5nID1cbiAgICAgICAgb3AudmFsdWVFbmNvZGluZyB8fCBwcmVmaXgub3B0aW9ucy52YWx1ZUVuY29kaW5nXG4gICAgfVxuICAgIHJldHVybiBvcFxuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQgKCkge1xuICAgIHJlYWR5ID0gdHJ1ZVxuICAgIHdoaWxlKHdhaXRpbmcubGVuZ3RoKVxuICAgICAgd2FpdGluZy5zaGlmdCgpKClcbiAgfVxuXG4gIGlmKGlzRnVuY3Rpb24oZGIuaXNPcGVuKSkge1xuICAgIGlmKGRiLmlzT3BlbigpKVxuICAgICAgcmVhZHkgPSB0cnVlXG4gICAgZWxzZVxuICAgICAgZGIub3BlbihzdGFydClcbiAgfSBlbHNlIHtcbiAgICBkYi5vcGVuKHN0YXJ0KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseTogZnVuY3Rpb24gKG9wcywgb3B0cywgY2IpIHtcbiAgICAgIC8vYXBwbHkgcHJlaG9va3MgaGVyZS5cbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG9wID0gb3BzW2ldXG5cbiAgICAgICAgZnVuY3Rpb24gYWRkKG9wKSB7XG4gICAgICAgICAgaWYob3AgPT09IGZhbHNlKSByZXR1cm4gZGVsZXRlIG9wc1tpXVxuICAgICAgICAgIG9wcy5wdXNoKG9wKVxuICAgICAgICB9XG5cbiAgICAgICAgYWRkRW5jb2RpbmdzKG9wLCBvcC5wcmVmaXgpXG4gICAgICAgIG9wLnByZWZpeCA9IGdldFByZWZpeChvcC5wcmVmaXgpXG4gICAgICAgIHByZWhvb2tzLnRyaWdnZXIoW29wLnByZWZpeCwgb3Aua2V5XSwgW29wLCBhZGQsIG9wc10pXG4gICAgICB9XG5cbiAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgIGlmKCdvYmplY3QnICE9PSB0eXBlb2Ygb3B0cykgdGhyb3cgbmV3IEVycm9yKCdvcHRzIG11c3QgYmUgb2JqZWN0LCB3YXM6Jysgb3B0cykgXG5cbiAgICAgIGlmKCdmdW5jdGlvbicgPT09IHR5cGVvZiBvcHRzKSBjYiA9IG9wdHMsIG9wdHMgPSB7fVxuXG4gICAgICBpZihvcHMubGVuZ3RoKVxuICAgICAgICAoZGIuZGIgfHwgZGIpLmJhdGNoKFxuICAgICAgICAgIG9wcy5tYXAoZnVuY3Rpb24gKG9wKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBrZXk6IGVuY29kZVByZWZpeChvcC5wcmVmaXgsIG9wLmtleSwgb3B0cywgb3ApLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgIG9wLnR5cGUgIT09ICdkZWwnXG4gICAgICAgICAgICAgICAgPyBjb2RlYy5lbmNvZGVWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgb3AudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG9wdHMsXG4gICAgICAgICAgICAgICAgICAgIG9wXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHR5cGU6XG4gICAgICAgICAgICAgICAgb3AudHlwZSB8fCAob3AudmFsdWUgPT09IHVuZGVmaW5lZCA/ICdkZWwnIDogJ3B1dCcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgb3B0cyxcbiAgICAgICAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgICAgIG9wcy5mb3JFYWNoKGZ1bmN0aW9uIChvcCkge1xuICAgICAgICAgICAgICBwb3N0aG9va3MudHJpZ2dlcihbb3AucHJlZml4LCBvcC5rZXldLCBbb3BdKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNiKClcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIGVsc2VcbiAgICAgICAgY2IoKVxuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiAoa2V5LCBwcmVmaXgsIG9wdHMsIGNiKSB7XG4gICAgICBvcHRzLmFzQnVmZmVyID0gY29kZWMuaXNWYWx1ZUFzQnVmZmVyKG9wdHMpXG4gICAgICByZXR1cm4gKGRiLmRiIHx8IGRiKS5nZXQoXG4gICAgICAgIGVuY29kZVByZWZpeChwcmVmaXgsIGtleSwgb3B0cyksXG4gICAgICAgIG9wdHMsXG4gICAgICAgIGZ1bmN0aW9uIChlcnIsIHZhbHVlKSB7XG4gICAgICAgICAgaWYoZXJyKSBjYihlcnIpXG4gICAgICAgICAgZWxzZSAgICBjYihudWxsLCBjb2RlYy5kZWNvZGVWYWx1ZSh2YWx1ZSwgb3B0cykpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9LFxuICAgIHByZTogcHJlaG9va3MuYWRkLFxuICAgIHBvc3Q6IHBvc3Rob29rcy5hZGQsXG4gICAgY3JlYXRlRGVjb2RlcjogZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgIGlmKG9wdHMua2V5cyAhPT0gZmFsc2UgJiYgb3B0cy52YWx1ZXMgIT09IGZhbHNlKVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiBjb2RlYy5kZWNvZGVLZXkocHJlY29kZWMuZGVjb2RlKGtleSlbMV0sIG9wdHMpLFxuICAgICAgICAgICAgdmFsdWU6IGNvZGVjLmRlY29kZVZhbHVlKHZhbHVlLCBvcHRzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgaWYob3B0cy52YWx1ZXMgIT09IGZhbHNlKVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF8sIHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvZGVjLmRlY29kZVZhbHVlKHZhbHVlLCBvcHRzKVxuICAgICAgICB9XG4gICAgICBpZihvcHRzLmtleXMgIT09IGZhbHNlKVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBjb2RlYy5kZWNvZGVLZXkocHJlY29kZWMuZGVjb2RlKGtleSlbMV0sIG9wdHMpXG4gICAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fVxuICAgIH0sXG4gICAgaXNPcGVuOiBmdW5jdGlvbiBpc09wZW4oKSB7XG4gICAgICBpZiAoZGIuZGIgJiYgaXNGdW5jdGlvbihkYi5kYi5pc09wZW4pKVxuICAgICAgICByZXR1cm4gZGIuZGIuaXNPcGVuKClcblxuICAgICAgcmV0dXJuIGRiLmlzT3BlbigpXG4gICAgfSxcbiAgICBpc0Nsb3NlZDogZnVuY3Rpb24gaXNDbG9zZWQoKSB7XG4gICAgICBpZiAoZGIuZGIgJiYgaXNGdW5jdGlvbihkYi5kYi5pc0Nsb3NlZCkpXG4gICAgICAgIHJldHVybiBkYi5kYi5pc0Nsb3NlZCgpXG5cbiAgICAgIHJldHVybiBkYi5pc0Nsb3NlZCgpXG4gICAgfSxcbiAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UgKGNiKSB7XG4gICAgICByZXR1cm4gZGIuY2xvc2UoY2IpXG4gICAgfSxcbiAgICBpdGVyYXRvcjogZnVuY3Rpb24gKF9vcHRzLCBjYikge1xuICAgICAgdmFyIG9wdHMgPSBjbG9uZShfb3B0cyB8fCB7fSlcbiAgICAgIHZhciBwcmVmaXggPSBfb3B0cy5wcmVmaXggfHwgW11cblxuICAgICAgZnVuY3Rpb24gZW5jb2RlS2V5KGtleSkge1xuICAgICAgICByZXR1cm4gZW5jb2RlUHJlZml4KHByZWZpeCwga2V5LCBvcHRzLCB7fSlcbiAgICAgIH1cblxuICAgICAgbHRndC50b0x0Z3QoX29wdHMsIG9wdHMsIGVuY29kZUtleSwgcHJlY29kZWMubG93ZXJCb3VuZCwgcHJlY29kZWMudXBwZXJCb3VuZClcblxuICAgICAgLy8gaWYgdGhlc2UgbGVnYWN5IHZhbHVlcyBhcmUgaW4gdGhlIG9wdGlvbnMsIHJlbW92ZSB0aGVtXG5cbiAgICAgIG9wdHMucHJlZml4ID0gbnVsbFxuXG4gICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgLy9oYXJkIGNvZGVkIGRlZmF1bHRzLCBmb3Igbm93Li4uXG4gICAgICAvL1RPRE86IHB1bGwgZGVmYXVsdHMgYW5kIGVuY29kaW5nIG91dCBvZiBsZXZlbHVwLlxuICAgICAgb3B0cy5rZXlBc0J1ZmZlciA9IG9wdHMudmFsdWVBc0J1ZmZlciA9IGZhbHNlXG4gICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5cbiAgICAgIC8vdGhpcyBpcyB2aXRhbCwgb3RoZXJ3aXNlIGxpbWl0OiB1bmRlZmluZWQgd2lsbFxuICAgICAgLy9jcmVhdGUgYW4gZW1wdHkgc3RyZWFtLlxuICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2Ygb3B0cy5saW1pdClcbiAgICAgICAgb3B0cy5saW1pdCA9IC0xXG5cbiAgICAgIG9wdHMua2V5QXNCdWZmZXIgPSBwcmVjb2RlYy5idWZmZXJcbiAgICAgIG9wdHMudmFsdWVBc0J1ZmZlciA9IGNvZGVjLmlzVmFsdWVBc0J1ZmZlcihvcHRzKVxuXG4gICAgICBmdW5jdGlvbiB3cmFwSXRlcmF0b3IgKGl0ZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV4dDogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IubmV4dChjYilcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVuZDogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5lbmQoY2IpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKHJlYWR5KVxuICAgICAgICByZXR1cm4gd3JhcEl0ZXJhdG9yKChkYi5kYiB8fCBkYikuaXRlcmF0b3Iob3B0cykpXG4gICAgICBlbHNlXG4gICAgICAgIHdhaXRpbmcucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2IobnVsbCwgd3JhcEl0ZXJhdG9yKChkYi5kYiB8fCBkYikuaXRlcmF0b3Iob3B0cykpKVxuICAgICAgICB9KVxuXG4gICAgfVxuICB9XG5cbn1cbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJfYXJnc1wiOiBbXG4gICAgW1xuICAgICAgXCJsZXZlbC1zdWJsZXZlbEBeNi41LjJcIixcbiAgICAgIFwiL1VzZXJzL2pvcmFuL0RvY3VtZW50cy9kZXZlbG9wbWVudC9wYXRjaGRlY2svbm9kZV9tb2R1bGVzL3NlY3VyZS1zY3V0dGxlYnV0dFwiXG4gICAgXVxuICBdLFxuICBcIl9mcm9tXCI6IFwibGV2ZWwtc3VibGV2ZWxAPj02LjUuMiA8Ny4wLjBcIixcbiAgXCJfaWRcIjogXCJsZXZlbC1zdWJsZXZlbEA2LjUuNFwiLFxuICBcIl9pbkNhY2hlXCI6IHRydWUsXG4gIFwiX2luc3RhbGxhYmxlXCI6IHRydWUsXG4gIFwiX2xvY2F0aW9uXCI6IFwiL3NlY3VyZS1zY3V0dGxlYnV0dC9sZXZlbC1zdWJsZXZlbFwiLFxuICBcIl9ub2RlVmVyc2lvblwiOiBcIjUuMy4wXCIsXG4gIFwiX25wbVVzZXJcIjoge1xuICAgIFwiZW1haWxcIjogXCJkb21pbmljLnRhcnJAZ21haWwuY29tXCIsXG4gICAgXCJuYW1lXCI6IFwiZG9taW5pY3RhcnJcIlxuICB9LFxuICBcIl9ucG1WZXJzaW9uXCI6IFwiMy4zLjEyXCIsXG4gIFwiX3BoYW50b21DaGlsZHJlblwiOiB7XG4gICAgXCJwdWxsLWNvcmVcIjogXCIxLjAuMFwiXG4gIH0sXG4gIFwiX3JlcXVlc3RlZFwiOiB7XG4gICAgXCJuYW1lXCI6IFwibGV2ZWwtc3VibGV2ZWxcIixcbiAgICBcInJhd1wiOiBcImxldmVsLXN1YmxldmVsQF42LjUuMlwiLFxuICAgIFwicmF3U3BlY1wiOiBcIl42LjUuMlwiLFxuICAgIFwic2NvcGVcIjogbnVsbCxcbiAgICBcInNwZWNcIjogXCI+PTYuNS4yIDw3LjAuMFwiLFxuICAgIFwidHlwZVwiOiBcInJhbmdlXCJcbiAgfSxcbiAgXCJfcmVxdWlyZWRCeVwiOiBbXG4gICAgXCIvc2VjdXJlLXNjdXR0bGVidXR0XCJcbiAgXSxcbiAgXCJfcmVzb2x2ZWRcIjogXCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sZXZlbC1zdWJsZXZlbC8tL2xldmVsLXN1YmxldmVsLTYuNS40LnRnelwiLFxuICBcIl9zaGFzdW1cIjogXCI5MmU2NTM0ZTdhYzNmYTM1YzhiZGIxMjFiOGE4MDk0YThkMWMwODI2XCIsXG4gIFwiX3Nocmlua3dyYXBcIjogbnVsbCxcbiAgXCJfc3BlY1wiOiBcImxldmVsLXN1YmxldmVsQF42LjUuMlwiLFxuICBcIl93aGVyZVwiOiBcIi9Vc2Vycy9qb3Jhbi9Eb2N1bWVudHMvZGV2ZWxvcG1lbnQvcGF0Y2hkZWNrL25vZGVfbW9kdWxlcy9zZWN1cmUtc2N1dHRsZWJ1dHRcIixcbiAgXCJhdXRob3JcIjoge1xuICAgIFwiZW1haWxcIjogXCJkb21pbmljLnRhcnJAZ21haWwuY29tXCIsXG4gICAgXCJuYW1lXCI6IFwiRG9taW5pYyBUYXJyXCIsXG4gICAgXCJ1cmxcIjogXCJodHRwOi8vZG9taW5pY3RhcnIuY29tXCJcbiAgfSxcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9kb21pbmljdGFyci9sZXZlbC1zdWJsZXZlbC9pc3N1ZXNcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJieXRld2lzZVwiOiBcIn4xLjEuMFwiLFxuICAgIFwibGV2ZWx1cFwiOiBcIn4wLjE5LjBcIixcbiAgICBcImx0Z3RcIjogXCJ+Mi4xLjFcIixcbiAgICBcInB1bGwtc3RyZWFtXCI6IFwifjIuMjEuMFwiLFxuICAgIFwidHlwZXdpc2VsaXRlXCI6IFwifjEuMC4wXCIsXG4gICAgXCJ4dGVuZFwiOiBcIn40LjAuMFwiXG4gIH0sXG4gIFwiZGVzY3JpcHRpb25cIjogXCJwYXJ0aXRpb24gbGV2ZWx1cCBkYXRhYmFzZXNcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwibGV2ZWxcIjogXCJeMS40LjBcIixcbiAgICBcImxldmVsLXRlc3RcIjogXCJeMi4wLjFcIixcbiAgICBcIm1vbm90b25pYy10aW1lc3RhbXBcIjogXCIwLjAuOFwiLFxuICAgIFwicHVsbC1sZXZlbFwiOiBcIn4xLjEuMVwiLFxuICAgIFwicmltcmFmXCI6IFwifjIuMS40XCIsXG4gICAgXCJzaGFzdW1cIjogXCIwLjAuMlwiLFxuICAgIFwic3RyZWFtLXRvLXB1bGwtc3RyZWFtXCI6IFwifjEuMi4wXCIsXG4gICAgXCJ0YXBlXCI6IFwifjIuMTQuMFwiLFxuICAgIFwidGhyb3VnaFwiOiBcIn4yLjMuNFwiXG4gIH0sXG4gIFwiZGlyZWN0b3JpZXNcIjoge30sXG4gIFwiZGlzdFwiOiB7XG4gICAgXCJzaGFzdW1cIjogXCI5MmU2NTM0ZTdhYzNmYTM1YzhiZGIxMjFiOGE4MDk0YThkMWMwODI2XCIsXG4gICAgXCJ0YXJiYWxsXCI6IFwiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sZXZlbC1zdWJsZXZlbC8tL2xldmVsLXN1YmxldmVsLTYuNS40LnRnelwiXG4gIH0sXG4gIFwiZ2l0SGVhZFwiOiBcImZhMWI3MTIxZjk2MzJiNjM3ZTY1MGNjMWVjOWIxNzIzYjYwZGY4NjRcIixcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9kb21pbmljdGFyci9sZXZlbC1zdWJsZXZlbFwiLFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJtYWludGFpbmVyc1wiOiBbXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiZG9taW5pY3RhcnJcIixcbiAgICAgIFwiZW1haWxcIjogXCJkb21pbmljLnRhcnJAZ21haWwuY29tXCJcbiAgICB9XG4gIF0sXG4gIFwibmFtZVwiOiBcImxldmVsLXN1YmxldmVsXCIsXG4gIFwib3B0aW9uYWxEZXBlbmRlbmNpZXNcIjoge30sXG4gIFwicmVhZG1lXCI6IFwiRVJST1I6IE5vIFJFQURNRSBkYXRhIGZvdW5kIVwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0Oi8vZ2l0aHViLmNvbS9kb21pbmljdGFyci9sZXZlbC1zdWJsZXZlbC5naXRcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwidGVzdFwiOiBcInNldCAtZTsgZm9yIHQgaW4gdGVzdC8qLmpzOyBkbyBub2RlICR0OyBkb25lXCJcbiAgfSxcbiAgXCJzdGFiaWxpdHlcIjogXCJ1bnN0YWJsZVwiLFxuICBcInRlc3RsaW5nXCI6IHtcbiAgICBcImJyb3dzZXJzXCI6IFtcbiAgICAgIFwiYW5kcm9pZC1icm93c2VyLzQuMi4ubGF0ZXN0XCIsXG4gICAgICBcImNocm9tZS8yMi4ubGF0ZXN0XCIsXG4gICAgICBcImNocm9tZS9jYW5hcnlcIixcbiAgICAgIFwiZmlyZWZveC8xNy4ubGF0ZXN0XCIsXG4gICAgICBcImZpcmVmb3gvbmlnaHRseVwiLFxuICAgICAgXCJpZS84Li5sYXRlc3RcIixcbiAgICAgIFwiaXBhZC82LjAuLmxhdGVzdFwiLFxuICAgICAgXCJpcGhvbmUvNi4wLi5sYXRlc3RcIixcbiAgICAgIFwib3BlcmEvMTIuLmxhdGVzdFwiLFxuICAgICAgXCJvcGVyYS9uZXh0XCIsXG4gICAgICBcInNhZmFyaS81LjEuLmxhdGVzdFwiXG4gICAgXSxcbiAgICBcImZpbGVzXCI6IFwidGVzdC8qLmpzXCJcbiAgfSxcbiAgXCJ2ZXJzaW9uXCI6IFwiNi41LjRcIlxufVxuIiwidmFyIGx0Z3QgPSByZXF1aXJlKCdsdGd0JylcblxuLy9jb21wYXJlIHR3byBhcnJheSBpdGVtc1xuZnVuY3Rpb24gaXNBcnJheUxpa2UgKGEpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYSkgfHwgQnVmZmVyLmlzQnVmZmVyKGEpXG59XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlIChhKSB7XG4gIHJldHVybiAnc3RyaW5nJyA9PT0gdHlwZW9mIGEgfHwgJ251bWJlcicgPT09IHR5cGVvZiBhXG59XG5cbmZ1bmN0aW9uIGhhcyhvLCBrKSB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKVxufVxuXG5mdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmKGlzQXJyYXlMaWtlKGEpICYmIGlzQXJyYXlMaWtlKGIpKSB7XG4gICAgdmFyIGwgPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGMgPSBjb21wYXJlKGFbaV0sIGJbaV0pXG4gICAgICBpZihjKSByZXR1cm4gY1xuICAgIH1cbiAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aFxuICB9XG4gIGlmKGlzUHJpbWl0aXZlKGEpICYmIGlzUHJpbWl0aXZlKGIpKVxuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMFxuXG4gIHRocm93IG5ldyBFcnJvcignaXRlbXMgbm90IGNvbXBhcmFibGU6J1xuICAgICsgSlNPTi5zdHJpbmdpZnkoYSkgKyAnICcgKyBKU09OLnN0cmluZ2lmeShiKSlcbn1cblxuLy90aGlzIGFzc3VtZXMgdGhhdCB0aGUgcHJlZml4IGlzIG9mIHRoZSBmb3JtOlxuLy8gW0FycmF5LCBzdHJpbmddXG5cbmZ1bmN0aW9uIHByZWZpeCAoYSwgYikge1xuICBpZihhLmxlbmd0aCA+IGIubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgdmFyIGwgPSBhLmxlbmd0aCAtIDFcbiAgdmFyIGxhc3RBID0gYVtsXVxuICB2YXIgbGFzdEIgPSBiW2xdXG5cbiAgaWYodHlwZW9mIGxhc3RBICE9PSB0eXBlb2YgbGFzdEIpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgaWYoJ3N0cmluZycgPT0gdHlwZW9mIGxhc3RBXG4gICAgJiYgMCAhPSBsYXN0Qi5pbmRleE9mKGxhc3RBKSlcbiAgICAgIHJldHVybiBmYWxzZVxuICBcbiAgLy9oYW5kbGUgY2FzIHdoZXJlIHRoZXJlIGlzIG5vIGtleSBwcmVmaXhcbiAgLy8oYSBob29rIG9uIGFuIGVudGlyZSBzdWJsZXZlbClcbiAgaWYoYS5sZW5ndGggPT0gMSAmJiBpc0FycmF5TGlrZShsYXN0QSkpIGwgKytcbiAgXG4gIHdoaWxlKGwtLSkge1xuICAgIGlmKGNvbXBhcmUoYVtsXSwgYltsXSkpIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyYW5nZSwga2V5LCBfY29tcGFyZSkge1xuICBfY29tcGFyZSA9IF9jb21wYXJlIHx8IGNvbXBhcmVcbiAgLy9oYW5kbGUgcHJlZml4IHNwZWNpYWxseSxcbiAgLy9jaGVjayB0aGF0IGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3QgaXRlbSBpcyBlcXVhbFxuICAvL3RoZW4gY2hlY2sgdGhlIGxhc3QgaXRlbSBzdGFydHMgd2l0aFxuICBpZihpc0FycmF5TGlrZShyYW5nZSkpIHJldHVybiBwcmVmaXgocmFuZ2UsIGtleSlcblxuICByZXR1cm4gbHRndC5jb250YWlucyhyYW5nZSwga2V5LCBfY29tcGFyZSlcbn1cblxuZnVuY3Rpb24gYWRkUHJlZml4KHByZWZpeCwgcmFuZ2UpIHtcbiAgdmFyIG8gPSBsdGd0LnRvTHRndChyYW5nZSwgbnVsbCwgZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBbcHJlZml4LCBrZXldXG4gIH0pXG5cbiAgLy9pZiB0aGVyZSB3aGVyZSBubyByYW5nZXMsIHRoZW4gdGhlbiBqdXN0IHVzZSBhIHByZWZpeC5cbiAgaWYoIWhhcyhvLCAnZ3RlJykgJiYgIWhhcyhvLCAnbHRlJykpIHJldHVybiBbcHJlZml4XVxuXG4gIHJldHVybiBvXG59XG5cbmV4cG9ydHMuY29tcGFyZSA9IGNvbXBhcmVcbmV4cG9ydHMucHJlZml4ID0gcHJlZml4XG5leHBvcnRzLmFkZFByZWZpeCA9IGFkZFByZWZpeFxuIiwidmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlclxudmFyIGFkZHByZSA9IHJlcXVpcmUoJy4vcmFuZ2UnKS5hZGRQcmVmaXhcblxudmFyIGVycm9ycyA9IHJlcXVpcmUoJ2xldmVsdXAvbGliL2Vycm9ycycpXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuICdmdW5jdGlvbicgPT09IHR5cGVvZiBmXG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nIChzKSB7XG4gIHJldHVybiAnc3RyaW5nJyA9PT0gdHlwZW9mIHNcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QgKG8pIHtcbiAgcmV0dXJuIG8gJiYgJ29iamVjdCcgPT09IHR5cGVvZiBvXG59XG5cbnZhciB2ZXJzaW9uID0gcmVxdWlyZSgnLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uXG5cbnZhciBzdWJsZXZlbCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG51dCwgcHJlZml4LCBjcmVhdGVTdHJlYW0sIG9wdGlvbnMpIHtcbiAgdmFyIGVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgZW1pdHRlci5zdWJsZXZlbHMgPSB7fVxuICBlbWl0dGVyLm9wdGlvbnMgPSBvcHRpb25zXG5cbiAgZW1pdHRlci52ZXJzaW9uID0gdmVyc2lvblxuXG4gIGVtaXR0ZXIubWV0aG9kcyA9IHt9XG4gIHByZWZpeCA9IHByZWZpeCB8fCBbXVxuXG4gIGZ1bmN0aW9uIGVycmJhY2sgKGVycikgeyBpZiAoZXJyKSBlbWl0dGVyLmVtaXQoJ2Vycm9yJywgZXJyKSB9XG5cbiAgY3JlYXRlU3RyZWFtID0gY3JlYXRlU3RyZWFtIHx8IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlIH1cblxuICBmdW5jdGlvbiBtZXJnZU9wdHMob3B0cykge1xuICAgIHZhciBvID0ge31cbiAgICBpZihvcHRpb25zKVxuICAgICAgZm9yKHZhciBrIGluIG9wdGlvbnMpXG4gICAgICAgIGlmKG9wdGlvbnNba10gIT0gdW5kZWZpbmVkKW9ba10gPSBvcHRpb25zW2tdXG4gICAgaWYob3B0cylcbiAgICAgIGZvcih2YXIgayBpbiBvcHRzKVxuICAgICAgICBpZihvcHRzW2tdICE9IHVuZGVmaW5lZCkgb1trXSA9IG9wdHNba11cbiAgICByZXR1cm4gb1xuICB9XG5cbiAgZW1pdHRlci5wdXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgb3B0cywgY2IpIHtcbiAgICBpZignZnVuY3Rpb24nID09PSB0eXBlb2Ygb3B0cykgY2IgPSBvcHRzLCBvcHRzID0ge31cbiAgICBpZighY2IpIGNiID0gZXJyYmFja1xuXG4gICAgbnV0LmFwcGx5KFt7XG4gICAgICBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLFxuICAgICAgcHJlZml4OiBwcmVmaXguc2xpY2UoKSwgdHlwZTogJ3B1dCdcbiAgICB9XSwgbWVyZ2VPcHRzKG9wdHMpLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZighZXJyKSB7IGVtaXR0ZXIuZW1pdCgncHV0Jywga2V5LCB2YWx1ZSk7IGNiKG51bGwpIH1cbiAgICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcbiAgICB9KVxuICB9XG5cbiAgZW1pdHRlci5wcmVmaXggPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHByZWZpeC5zbGljZSgpXG4gIH1cblxuICBlbWl0dGVyLmRlbCA9IGZ1bmN0aW9uIChrZXksIG9wdHMsIGNiKSB7XG4gICAgaWYoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9wdHMpIGNiID0gb3B0cywgb3B0cyA9IHt9XG4gICAgaWYoIWNiKSBjYiA9IGVycmJhY2tcblxuICAgIG51dC5hcHBseShbe1xuICAgICAga2V5OiBrZXksXG4gICAgICBwcmVmaXg6IHByZWZpeC5zbGljZSgpLCB0eXBlOiAnZGVsJ1xuICAgIH1dLCBtZXJnZU9wdHMob3B0cyksIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmKCFlcnIpIHsgZW1pdHRlci5lbWl0KCdkZWwnLCBrZXkpOyBjYihudWxsKSB9XG4gICAgICBpZihlcnIpIHJldHVybiBjYihlcnIpXG4gICAgfSlcbiAgfVxuXG4gIGVtaXR0ZXIuYmF0Y2ggPSBmdW5jdGlvbiAob3BzLCBvcHRzLCBjYikge1xuICAgIGlmKCdmdW5jdGlvbicgPT09IHR5cGVvZiBvcHRzKVxuICAgICAgY2IgPSBvcHRzLCBvcHRzID0ge31cbiAgICBpZighY2IpIGNiID0gZXJyYmFja1xuXG4gICAgb3BzID0gb3BzLm1hcChmdW5jdGlvbiAob3ApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogICAgICAgICAgIG9wLmtleSxcbiAgICAgICAgdmFsdWU6ICAgICAgICAgb3AudmFsdWUsXG4gICAgICAgIHByZWZpeDogICAgICAgIG9wLnByZWZpeCB8fCBwcmVmaXgsXG4gICAgICAgIGtleUVuY29kaW5nOiAgIG9wLmtleUVuY29kaW5nLCAgICAvLyAqXG4gICAgICAgIHZhbHVlRW5jb2Rpbmc6IG9wLnZhbHVlRW5jb2RpbmcsICAvLyAqIChUT0RPOiBlbmNvZGluZ3Mgb24gc3VibGV2ZWwpXG4gICAgICAgIHR5cGU6ICAgICAgICAgIG9wLnR5cGVcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgbnV0LmFwcGx5KG9wcywgbWVyZ2VPcHRzKG9wdHMpLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZighZXJyKSB7IGVtaXR0ZXIuZW1pdCgnYmF0Y2gnLCBvcHMpOyBjYihudWxsKSB9XG4gICAgICBpZihlcnIpIHJldHVybiBjYihlcnIpXG4gICAgfSlcbiAgfVxuXG4gIGVtaXR0ZXIuZ2V0ID0gZnVuY3Rpb24gKGtleSwgb3B0cywgY2IpIHtcbiAgICBpZignZnVuY3Rpb24nID09PSB0eXBlb2Ygb3B0cylcbiAgICAgIGNiID0gb3B0cywgb3B0cyA9IHt9XG4gICAgbnV0LmdldChrZXksIHByZWZpeCwgbWVyZ2VPcHRzKG9wdHMpLCBmdW5jdGlvbiAoZXJyLCB2YWx1ZSkge1xuICAgICAgaWYoZXJyKSBjYihuZXcgZXJyb3JzLk5vdEZvdW5kRXJyb3IoJ0tleSBub3QgZm91bmQgaW4gZGF0YWJhc2UnLCBlcnIpKVxuICAgICAgZWxzZSBjYihudWxsLCB2YWx1ZSlcbiAgICB9KVxuICB9XG5cbiAgZW1pdHRlci5jbG9uZSA9IGZ1bmN0aW9uKG9wdHMpIHtcbiAgICByZXR1cm4gc3VibGV2ZWwobnV0LCBwcmVmaXgsIGNyZWF0ZVN0cmVhbSwgbWVyZ2VPcHRzKG9wdHMpKVxuICB9XG5cbiAgZW1pdHRlci5zdWJsZXZlbCA9IGZ1bmN0aW9uIChuYW1lLCBvcHRzKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIuc3VibGV2ZWxzW25hbWVdID1cbiAgICAgIGVtaXR0ZXIuc3VibGV2ZWxzW25hbWVdIHx8IHN1YmxldmVsKG51dCwgcHJlZml4LmNvbmNhdChuYW1lKSwgY3JlYXRlU3RyZWFtLCBtZXJnZU9wdHMob3B0cykpXG4gIH1cblxuICBlbWl0dGVyLnByZSA9IGZ1bmN0aW9uIChrZXksIGhvb2spIHtcbiAgICBpZihpc0Z1bmN0aW9uKGtleSkpIHJldHVybiBudXQucHJlKFtwcmVmaXhdLCBrZXkpXG4gICAgaWYoaXNTdHJpbmcoa2V5KSkgcmV0dXJuIG51dC5wcmUoW3ByZWZpeCwga2V5XSwgaG9vaylcbiAgICBpZihpc09iamVjdChrZXkpKSByZXR1cm4gbnV0LnByZShhZGRwcmUocHJlZml4LCBrZXkpLCBob29rKVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQgeWV0JylcbiAgfVxuXG4gIGVtaXR0ZXIucG9zdCA9IGZ1bmN0aW9uIChrZXksIGhvb2spIHtcbiAgICBpZihpc0Z1bmN0aW9uKGtleSkpIHJldHVybiBudXQucG9zdChbcHJlZml4XSwga2V5KVxuICAgIGlmKGlzU3RyaW5nKGtleSkpICAgcmV0dXJuIG51dC5wb3N0KFtwcmVmaXgsIGtleV0sIGhvb2spXG4gICAgaWYoaXNPYmplY3Qoa2V5KSkgICByZXR1cm4gbnV0LnBvc3QoYWRkcHJlKHByZWZpeCwga2V5KSwgaG9vaylcblxuICAgIC8vVE9ETzogaGFuZGxlIHJhbmdlcywgbmVlZGVkIGZvciBsZXZlbC1saXZlLXN0cmVhbSwgZXRjLlxuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkIHlldCcpXG4gIH1cblxuICBlbWl0dGVyLnJlYWRTdHJlYW0gPVxuICBlbWl0dGVyLmNyZWF0ZVJlYWRTdHJlYW0gPSBmdW5jdGlvbiAob3B0cykge1xuICAgIG9wdHMgPSBtZXJnZU9wdHMob3B0cylcbiAgICBvcHRzLnByZWZpeCA9IHByZWZpeFxuICAgIHZhciBzdHJlYW1cbiAgICB2YXIgaXQgPSBudXQuaXRlcmF0b3Iob3B0cywgZnVuY3Rpb24gKGVyciwgaXQpIHtcbiAgICAgIHN0cmVhbS5zZXRJdGVyYXRvcihpdClcbiAgICB9KVxuXG4gICAgc3RyZWFtID0gY3JlYXRlU3RyZWFtKG9wdHMsIG51dC5jcmVhdGVEZWNvZGVyKG9wdHMpKVxuICAgIGlmKGl0KSBzdHJlYW0uc2V0SXRlcmF0b3IoaXQpXG5cbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cblxuICBlbWl0dGVyLnZhbHVlU3RyZWFtID1cbiAgZW1pdHRlci5jcmVhdGVWYWx1ZVN0cmVhbSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICBvcHRzLnZhbHVlcyA9IHRydWVcbiAgICBvcHRzLmtleXMgPSBmYWxzZVxuICAgIHJldHVybiBlbWl0dGVyLmNyZWF0ZVJlYWRTdHJlYW0ob3B0cylcbiAgfVxuXG4gIGVtaXR0ZXIua2V5U3RyZWFtID1cbiAgZW1pdHRlci5jcmVhdGVLZXlTdHJlYW0gPSBmdW5jdGlvbiAob3B0cykge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9XG4gICAgb3B0cy52YWx1ZXMgPSBmYWxzZVxuICAgIG9wdHMua2V5cyA9IHRydWVcbiAgICByZXR1cm4gZW1pdHRlci5jcmVhdGVSZWFkU3RyZWFtKG9wdHMpXG4gIH1cblxuICBlbWl0dGVyLmNsb3NlID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgLy9UT0RPOiBkZXJlZ2lzdGVyIGFsbCBob29rc1xuICAgIGNiID0gY2IgfHwgZnVuY3Rpb24gKCkge31cbiAgICBpZiAoIXByZWZpeC5sZW5ndGgpIG51dC5jbG9zZShjYilcbiAgICBlbHNlIHByb2Nlc3MubmV4dFRpY2soY2IpXG4gIH1cblxuICBlbWl0dGVyLmlzT3BlbiA9IG51dC5pc09wZW5cbiAgZW1pdHRlci5pc0Nsb3NlZCA9IG51dC5pc0Nsb3NlZFxuXG4gIHJldHVybiBlbWl0dGVyXG59XG4iLCJ2YXIgcHVsbCAgICAgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgdG9QdWxsICAgPSByZXF1aXJlKCdzdHJlYW0tdG8tcHVsbC1zdHJlYW0nKVxudmFyIHB1c2hhYmxlID0gcmVxdWlyZSgncHVsbC1wdXNoYWJsZScpXG52YXIgY2F0ICAgICAgPSByZXF1aXJlKCdwdWxsLWNhdCcpXG52YXIgcHcgICAgICAgPSByZXF1aXJlKCdwdWxsLXdpbmRvdycpXG52YXIgcG9zdCAgICAgPSByZXF1aXJlKCdsZXZlbC1wb3N0JylcblxuZnVuY3Rpb24gcmVhZChkYiwgb3B0cykge1xuICByZXR1cm4gdG9QdWxsLnJlYWQxKGRiLmNyZWF0ZVJlYWRTdHJlYW0ob3B0cykpXG59XG5cbnZhciBsaXZlID1cbmV4cG9ydHMubGl2ZSA9XG5mdW5jdGlvbiAoZGIsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cblxuICB2YXIgbCA9IHB1c2hhYmxlKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZihvcHRzLm9uQWJvcnQpIG9wdHMub25BYm9ydChlcnIpXG4gICAgY2xlYW51cCgpXG4gIH0pXG5cbiAgdmFyIGNsZWFudXAgPSBwb3N0KGRiLCBvcHRzLCBmdW5jdGlvbiAoY2gpIHtcbiAgICBpZihvcHRzLmtleXMgPT09IGZhbHNlKVxuICAgICAgbC5wdXNoKGNoLnZhbHVlKVxuICAgIGVsc2UgaWYob3B0cy52YWx1ZXMgPT09IGZhbHNlKVxuICAgICAgbC5wdXNoKGNoLmtleSlcbiAgICBlbHNlXG4gICAgICBsLnB1c2goY2gpXG4gIH0pXG5cbiAgcmV0dXJuIGxcblxufVxuXG5leHBvcnRzLnJlYWQgPVxuZXhwb3J0cy5yZWFkU3RyZWFtID1cbmV4cG9ydHMuY3JlYXRlUmVhZFN0cmVhbSA9IGZ1bmN0aW9uIChkYiwgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fVxuICBpZighKG9wdHMudGFpbCB8fCBvcHRzLmxpdmUpKVxuICAgIHJldHVybiByZWFkKGRiLCBvcHRzKVxuXG4gIC8vb3B0aW9uYWxseSBub3RpZnkgd2hlbiB3ZSBzd2l0Y2ggZnJvbSByZWFkaW5nIGhpc3RvcnkgdG8gcmVhbHRpbWVcbiAgdmFyIHN5bmMgPSBvcHRzLm9uU3luYyAmJiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgICBvcHRzLm9uU3luYyhhYm9ydCk7IGNiKGFib3J0IHx8IHRydWUpXG4gICAgfVxuXG4gIGlmKG9wdHMub25TeW5jID09PSB0cnVlIHx8IG9wdHMuc3luYyA9PT0gdHJ1ZSlcbiAgICBzeW5jID0gcHVsbC52YWx1ZXMoW3tzeW5jOiB0cnVlfV0pXG5cbiAgcmV0dXJuIGNhdChbcmVhZChkYiwgb3B0cyksIHN5bmMsIGxpdmUoZGIsIG9wdHMpXSlcbn1cblxuZXhwb3J0cy53cml0ZSA9XG5leHBvcnRzLndyaXRlU3RyZWFtID1cbmV4cG9ydHMuY3JlYXRlV3JpdGVTdHJlYW0gPSBmdW5jdGlvbiAoZGIsIG9wdHMsIGRvbmUpIHtcbiAgaWYoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9wdHMpXG4gICAgZG9uZSA9IG9wdHMsIG9wdHMgPSBudWxsXG4gIG9wdHMgPSBvcHRzIHx8IHt9XG4gIHJldHVybiBwdWxsKFxuICAgIHB1bGwubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZihlLnR5cGUpIHJldHVybiBlXG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXkgICA6IGUua2V5LCBcbiAgICAgICAgdmFsdWUgOiBlLnZhbHVlLFxuICAgICAgICB0eXBlICA6IGUudmFsdWUgPT0gbnVsbCA/ICdkZWwnIDogJ3B1dCdcbiAgICAgIH1cbiAgICB9KSxcbiAgICBwdy5yZWNlbnQob3B0cy53aW5kb3dTaXplLCBvcHRzLndpbmRvd1RpbWUpLFxuICAgIHB1bGwuYXN5bmNNYXAoZnVuY3Rpb24gKGJhdGNoLCBjYikge1xuICAgICAgZGIuYmF0Y2goYmF0Y2gsIGNiKVxuICAgIH0pLFxuICAgIHB1bGwuZHJhaW4obnVsbCwgZG9uZSlcbiAgKVxufVxuXG4iLCJ2YXIgdSAgICAgID0gcmVxdWlyZSgncHVsbC1jb3JlJylcbnZhciBzb3VyY2VzID0gcmVxdWlyZSgnLi9zb3VyY2VzJylcbnZhciBzaW5rcyA9IHJlcXVpcmUoJy4vc2lua3MnKVxuXG52YXIgcHJvcCAgID0gdS5wcm9wXG52YXIgaWQgICAgID0gdS5pZFxudmFyIHRlc3RlciA9IHUudGVzdGVyXG5cbnZhciBtYXAgPSBleHBvcnRzLm1hcCA9IFxuZnVuY3Rpb24gKHJlYWQsIG1hcCkge1xuICBtYXAgPSBwcm9wKG1hcCkgfHwgaWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgcmVhZChlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIHZhciBkYXRhID0gIWVuZCA/IG1hcChkYXRhKSA6IG51bGxcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciBhc3luY01hcCA9IGV4cG9ydHMuYXN5bmNNYXAgPVxuZnVuY3Rpb24gKHJlYWQsIG1hcCkge1xuICBpZighbWFwKSByZXR1cm4gcmVhZFxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiByZWFkKGVuZCwgY2IpIC8vYWJvcnRcbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkgcmV0dXJuIGNiKGVuZCwgZGF0YSlcbiAgICAgIG1hcChkYXRhLCBjYilcbiAgICB9KVxuICB9XG59XG5cbnZhciBwYXJhTWFwID0gZXhwb3J0cy5wYXJhTWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXAsIHdpZHRoKSB7XG4gIGlmKCFtYXApIHJldHVybiByZWFkXG4gIHZhciBlbmRlZCA9IGZhbHNlLCBxdWV1ZSA9IFtdLCBfY2JcblxuICBmdW5jdGlvbiBkcmFpbiAoKSB7XG4gICAgaWYoIV9jYikgcmV0dXJuXG4gICAgdmFyIGNiID0gX2NiXG4gICAgX2NiID0gbnVsbFxuICAgIGlmKHF1ZXVlLmxlbmd0aClcbiAgICAgIHJldHVybiBjYihudWxsLCBxdWV1ZS5zaGlmdCgpKVxuICAgIGVsc2UgaWYoZW5kZWQgJiYgIW4pXG4gICAgICByZXR1cm4gY2IoZW5kZWQpXG4gICAgX2NiID0gY2JcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1bGwgKCkge1xuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSB7XG4gICAgICAgIGVuZGVkID0gZW5kXG4gICAgICAgIHJldHVybiBkcmFpbigpXG4gICAgICB9XG4gICAgICBuKytcbiAgICAgIG1hcChkYXRhLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgIG4tLVxuXG4gICAgICAgIHF1ZXVlLnB1c2goZGF0YSlcbiAgICAgICAgZHJhaW4oKVxuICAgICAgfSlcblxuICAgICAgaWYobiA8IHdpZHRoICYmICFlbmRlZClcbiAgICAgICAgcHVsbCgpXG4gICAgfSlcbiAgfVxuXG4gIHZhciBuID0gMFxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiByZWFkKGVuZCwgY2IpIC8vYWJvcnRcbiAgICAvL2NvbnRpbnVlIHRvIHJlYWQgd2hpbGUgdGhlcmUgYXJlIGxlc3MgdGhhbiAzIG1hcHMgaW4gZmxpZ2h0XG4gICAgX2NiID0gY2JcbiAgICBpZihxdWV1ZS5sZW5ndGggfHwgZW5kZWQpXG4gICAgICBwdWxsKCksIGRyYWluKClcbiAgICBlbHNlIHB1bGwoKVxuICB9XG4gIHJldHVybiBoaWdoV2F0ZXJNYXJrKGFzeW5jTWFwKHJlYWQsIG1hcCksIHdpZHRoKVxufVxuXG52YXIgZmlsdGVyID0gZXhwb3J0cy5maWx0ZXIgPVxuZnVuY3Rpb24gKHJlYWQsIHRlc3QpIHtcbiAgLy9yZWdleHBcbiAgdGVzdCA9IHRlc3Rlcih0ZXN0KVxuICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoZW5kLCBjYikge1xuICAgIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZighZW5kICYmICF0ZXN0KGRhdGEpKVxuICAgICAgICByZXR1cm4gbmV4dChlbmQsIGNiKVxuICAgICAgY2IoZW5kLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGZpbHRlck5vdCA9IGV4cG9ydHMuZmlsdGVyTm90ID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZpbHRlcihyZWFkLCBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAhdGVzdChlKVxuICB9KVxufVxuXG52YXIgdGhyb3VnaCA9IGV4cG9ydHMudGhyb3VnaCA9IFxuZnVuY3Rpb24gKHJlYWQsIG9wLCBvbkVuZCkge1xuICB2YXIgYSA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uY2UgKGFib3J0KSB7XG4gICAgaWYoYSB8fCAhb25FbmQpIHJldHVyblxuICAgIGEgPSB0cnVlXG4gICAgb25FbmQoYWJvcnQgPT09IHRydWUgPyBudWxsIDogYWJvcnQpXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIG9uY2UoZW5kKVxuICAgIHJldHVybiByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoIWVuZCkgb3AgJiYgb3AoZGF0YSlcbiAgICAgIGVsc2Ugb25jZShlbmQpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgdGFrZSA9IGV4cG9ydHMudGFrZSA9XG5mdW5jdGlvbiAocmVhZCwgdGVzdCkge1xuICB2YXIgZW5kZWQgPSBmYWxzZVxuICBpZignbnVtYmVyJyA9PT0gdHlwZW9mIHRlc3QpIHtcbiAgICB2YXIgbiA9IHRlc3Q7IHRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbiAtLVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG4gICAgaWYoZW5kZWQgPSBlbmQpIHJldHVybiByZWFkKGVuZGVkLCBjYilcblxuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kZWQgPSBlbmRlZCB8fCBlbmQpIHJldHVybiBjYihlbmRlZClcbiAgICAgIGlmKCF0ZXN0KGRhdGEpKSB7XG4gICAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgICByZWFkKHRydWUsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgICBjYihlbmRlZCwgZGF0YSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgY2IobnVsbCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciB1bmlxdWUgPSBleHBvcnRzLnVuaXF1ZSA9IGZ1bmN0aW9uIChyZWFkLCBmaWVsZCwgaW52ZXJ0KSB7XG4gIGZpZWxkID0gcHJvcChmaWVsZCkgfHwgaWRcbiAgdmFyIHNlZW4gPSB7fVxuICByZXR1cm4gZmlsdGVyKHJlYWQsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGtleSA9IGZpZWxkKGRhdGEpXG4gICAgaWYoc2VlbltrZXldKSByZXR1cm4gISFpbnZlcnQgLy9mYWxzZSwgYnkgZGVmYXVsdFxuICAgIGVsc2Ugc2VlbltrZXldID0gdHJ1ZVxuICAgIHJldHVybiAhaW52ZXJ0IC8vdHJ1ZSBieSBkZWZhdWx0XG4gIH0pXG59XG5cbnZhciBub25VbmlxdWUgPSBleHBvcnRzLm5vblVuaXF1ZSA9IGZ1bmN0aW9uIChyZWFkLCBmaWVsZCkge1xuICByZXR1cm4gdW5pcXVlKHJlYWQsIGZpZWxkLCB0cnVlKVxufVxuXG52YXIgZ3JvdXAgPSBleHBvcnRzLmdyb3VwID1cbmZ1bmN0aW9uIChyZWFkLCBzaXplKSB7XG4gIHZhciBlbmRlZDsgc2l6ZSA9IHNpemUgfHwgNVxuICB2YXIgcXVldWUgPSBbXVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIC8vdGhpcyBtZWFucyB0aGF0IHRoZSB1cHN0cmVhbSBpcyBzZW5kaW5nIGFuIGVycm9yLlxuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kZWQgPSBlbmQsIGNiKVxuICAgIC8vdGhpcyBtZWFucyB0aGF0IHdlIHJlYWQgYW4gZW5kIGJlZm9yZS5cbiAgICBpZihlbmRlZCkgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiBuZXh0KGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kZWQgPSBlbmRlZCB8fCBlbmQpIHtcbiAgICAgICAgaWYoIXF1ZXVlLmxlbmd0aClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IHF1ZXVlOyBxdWV1ZSA9IFtdXG4gICAgICAgIHJldHVybiBjYihudWxsLCBfcXVldWUpXG4gICAgICB9XG4gICAgICBxdWV1ZS5wdXNoKGRhdGEpXG4gICAgICBpZihxdWV1ZS5sZW5ndGggPCBzaXplKVxuICAgICAgICByZXR1cm4gcmVhZChudWxsLCBuZXh0KVxuXG4gICAgICB2YXIgX3F1ZXVlID0gcXVldWU7IHF1ZXVlID0gW11cbiAgICAgIGNiKG51bGwsIF9xdWV1ZSlcbiAgICB9KVxuICB9XG59XG5cbnZhciBmbGF0dGVuID0gZXhwb3J0cy5mbGF0dGVuID0gZnVuY3Rpb24gKHJlYWQpIHtcbiAgdmFyIF9yZWFkXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoX3JlYWQpIG5leHRDaHVuaygpXG4gICAgZWxzZSAgICAgIG5leHRTdHJlYW0oKVxuXG4gICAgZnVuY3Rpb24gbmV4dENodW5rICgpIHtcbiAgICAgIF9yZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgaWYoZW5kKSBuZXh0U3RyZWFtKClcbiAgICAgICAgZWxzZSAgICBjYihudWxsLCBkYXRhKVxuICAgICAgfSlcbiAgICB9XG4gICAgZnVuY3Rpb24gbmV4dFN0cmVhbSAoKSB7XG4gICAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIHN0cmVhbSkge1xuICAgICAgICBpZihlbmQpXG4gICAgICAgICAgcmV0dXJuIGNiKGVuZClcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShzdHJlYW0pKVxuICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZXMudmFsdWVzKHN0cmVhbSlcbiAgICAgICAgZWxzZSBpZignZnVuY3Rpb24nICE9IHR5cGVvZiBzdHJlYW0pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJlYW0gb2Ygc3RyZWFtcycpXG4gICAgICAgIFxuICAgICAgICBfcmVhZCA9IHN0cmVhbVxuICAgICAgICBuZXh0Q2h1bmsoKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxudmFyIHByZXBlbmQgPVxuZXhwb3J0cy5wcmVwZW5kID1cbmZ1bmN0aW9uIChyZWFkLCBoZWFkKSB7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihoZWFkICE9PSBudWxsKSB7XG4gICAgICBpZihhYm9ydClcbiAgICAgICAgcmV0dXJuIHJlYWQoYWJvcnQsIGNiKVxuICAgICAgdmFyIF9oZWFkID0gaGVhZFxuICAgICAgaGVhZCA9IG51bGxcbiAgICAgIGNiKG51bGwsIF9oZWFkKVxuICAgIH0gZWxzZSB7XG4gICAgICByZWFkKGFib3J0LCBjYilcbiAgICB9XG4gIH1cblxufVxuXG4vL3ZhciBkcmFpbklmID0gZXhwb3J0cy5kcmFpbklmID0gZnVuY3Rpb24gKG9wLCBkb25lKSB7XG4vLyAgc2lua3MuZHJhaW4oXG4vL31cblxudmFyIF9yZWR1Y2UgPSBleHBvcnRzLl9yZWR1Y2UgPSBmdW5jdGlvbiAocmVhZCwgcmVkdWNlLCBpbml0aWFsKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoY2xvc2UsIGNiKSB7XG4gICAgaWYoY2xvc2UpIHJldHVybiByZWFkKGNsb3NlLCBjYilcbiAgICBpZihlbmRlZCkgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgc2lua3MuZHJhaW4oZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIGluaXRpYWwgPSByZWR1Y2UoaW5pdGlhbCwgaXRlbSlcbiAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBlbmRlZCA9IGVyciB8fCB0cnVlXG4gICAgICBpZighZXJyKSBjYihudWxsLCBpbml0aWFsKVxuICAgICAgZWxzZSAgICAgY2IoZW5kZWQpXG4gICAgfSlcbiAgICAocmVhZClcbiAgfVxufVxuXG52YXIgbmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrXG5cbnZhciBoaWdoV2F0ZXJNYXJrID0gZXhwb3J0cy5oaWdoV2F0ZXJNYXJrID0gXG5mdW5jdGlvbiAocmVhZCwgaGlnaFdhdGVyTWFyaykge1xuICB2YXIgYnVmZmVyID0gW10sIHdhaXRpbmcgPSBbXSwgZW5kZWQsIHJlYWRpbmcgPSBmYWxzZVxuICBoaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyayB8fCAxMFxuXG4gIGZ1bmN0aW9uIHJlYWRBaGVhZCAoKSB7XG4gICAgd2hpbGUod2FpdGluZy5sZW5ndGggJiYgKGJ1ZmZlci5sZW5ndGggfHwgZW5kZWQpKVxuICAgICAgd2FpdGluZy5zaGlmdCgpKGVuZGVkLCBlbmRlZCA/IG51bGwgOiBidWZmZXIuc2hpZnQoKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHQgKCkge1xuICAgIGlmKGVuZGVkIHx8IHJlYWRpbmcgfHwgYnVmZmVyLmxlbmd0aCA+PSBoaWdoV2F0ZXJNYXJrKVxuICAgICAgcmV0dXJuXG4gICAgcmVhZGluZyA9IHRydWVcbiAgICByZXR1cm4gcmVhZChlbmRlZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICBlbmRlZCA9IGVuZGVkIHx8IGVuZFxuICAgICAgaWYoZGF0YSAhPSBudWxsKSBidWZmZXIucHVzaChkYXRhKVxuICAgICAgXG4gICAgICBuZXh0KCk7IHJlYWRBaGVhZCgpXG4gICAgfSlcbiAgfVxuXG4gIG5leHRUaWNrKG5leHQpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgZW5kZWQgPSBlbmRlZCB8fCBlbmRcbiAgICB3YWl0aW5nLnB1c2goY2IpXG5cbiAgICBuZXh0KCk7IHJlYWRBaGVhZCgpXG4gIH1cbn1cblxuXG5cbiIsIlxudmFyIGtleXMgPSBleHBvcnRzLmtleXMgPVxuZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdmFsdWVzKE9iamVjdC5rZXlzKG9iamVjdCkpXG59XG5cbnZhciBvbmNlID0gZXhwb3J0cy5vbmNlID1cbmZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGFib3J0KSByZXR1cm4gY2IoYWJvcnQpXG4gICAgaWYodmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFyIF92YWx1ZSA9IHZhbHVlOyB2YWx1ZSA9IG51bGxcbiAgICAgIGNiKG51bGwsIF92YWx1ZSlcbiAgICB9IGVsc2VcbiAgICAgIGNiKHRydWUpXG4gIH1cbn1cblxudmFyIHZhbHVlcyA9IGV4cG9ydHMudmFsdWVzID0gZXhwb3J0cy5yZWFkQXJyYXkgPVxuZnVuY3Rpb24gKGFycmF5KSB7XG4gIGlmKCFBcnJheS5pc0FycmF5KGFycmF5KSlcbiAgICBhcnJheSA9IE9iamVjdC5rZXlzKGFycmF5KS5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBhcnJheVtrXVxuICAgIH0pXG4gIHZhciBpID0gMFxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpXG4gICAgICByZXR1cm4gY2IgJiYgY2IoZW5kKVxuICAgIGNiKGkgPj0gYXJyYXkubGVuZ3RoIHx8IG51bGwsIGFycmF5W2krK10pXG4gIH1cbn1cblxuXG52YXIgY291bnQgPSBleHBvcnRzLmNvdW50ID1cbmZ1bmN0aW9uIChtYXgpIHtcbiAgdmFyIGkgPSAwOyBtYXggPSBtYXggfHwgSW5maW5pdHlcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSByZXR1cm4gY2IgJiYgY2IoZW5kKVxuICAgIGlmKGkgPiBtYXgpXG4gICAgICByZXR1cm4gY2IodHJ1ZSlcbiAgICBjYihudWxsLCBpKyspXG4gIH1cbn1cblxudmFyIGluZmluaXRlID0gZXhwb3J0cy5pbmZpbml0ZSA9XG5mdW5jdGlvbiAoZ2VuZXJhdGUpIHtcbiAgZ2VuZXJhdGUgPSBnZW5lcmF0ZSB8fCBNYXRoLnJhbmRvbVxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiBjYiAmJiBjYihlbmQpXG4gICAgcmV0dXJuIGNiKG51bGwsIGdlbmVyYXRlKCkpXG4gIH1cbn1cblxudmFyIGRlZmVyID0gZXhwb3J0cy5kZWZlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWFkLCBjYnMgPSBbXSwgX2VuZFxuXG4gIHZhciByZWFkID0gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZighX3JlYWQpIHtcbiAgICAgIF9lbmQgPSBlbmRcbiAgICAgIGNicy5wdXNoKGNiKVxuICAgIH0gXG4gICAgZWxzZSBfcmVhZChlbmQsIGNiKVxuICB9XG4gIHJlYWQucmVzb2x2ZSA9IGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgaWYoX3JlYWQpIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSByZXNvbHZlZCcpXG4gICAgX3JlYWQgPSByZWFkXG4gICAgaWYoIV9yZWFkKSB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlYWQgY2Fubm90IHJlc29sdmUhJyArIF9yZWFkKVxuICAgIHdoaWxlKGNicy5sZW5ndGgpXG4gICAgICBfcmVhZChfZW5kLCBjYnMuc2hpZnQoKSlcbiAgfVxuICByZWFkLmFib3J0ID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgcmVhZC5yZXNvbHZlKGZ1bmN0aW9uIChfLCBjYikge1xuICAgICAgY2IoZXJyIHx8IHRydWUpXG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVhZFxufVxuXG52YXIgZW1wdHkgPSBleHBvcnRzLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGNiKHRydWUpXG4gIH1cbn1cblxudmFyIGRlcHRoRmlyc3QgPSBleHBvcnRzLmRlcHRoRmlyc3QgPVxuZnVuY3Rpb24gKHN0YXJ0LCBjcmVhdGVTdHJlYW0pIHtcbiAgdmFyIHJlYWRzID0gW11cblxuICByZWFkcy51bnNoaWZ0KG9uY2Uoc3RhcnQpKVxuXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgaWYoIXJlYWRzLmxlbmd0aClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIHJlYWRzWzBdKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSB7XG4gICAgICAgIC8vaWYgdGhpcyBzdHJlYW0gaGFzIGVuZGVkLCBnbyB0byB0aGUgbmV4dCBxdWV1ZVxuICAgICAgICByZWFkcy5zaGlmdCgpXG4gICAgICAgIHJldHVybiBuZXh0KG51bGwsIGNiKVxuICAgICAgfVxuICAgICAgcmVhZHMudW5zaGlmdChjcmVhdGVTdHJlYW0oZGF0YSkpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuLy93aWR0aCBmaXJzdCBpcyBqdXN0IGxpa2UgZGVwdGggZmlyc3QsXG4vL2J1dCBwdXNoIGVhY2ggbmV3IHN0cmVhbSBvbnRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXG52YXIgd2lkdGhGaXJzdCA9IGV4cG9ydHMud2lkdGhGaXJzdCA9XG5mdW5jdGlvbiAoc3RhcnQsIGNyZWF0ZVN0cmVhbSkge1xuICB2YXIgcmVhZHMgPSBbXVxuXG4gIHJlYWRzLnB1c2gob25jZShzdGFydCkpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIG5leHQgKGVuZCwgY2IpIHtcbiAgICBpZighcmVhZHMubGVuZ3RoKVxuICAgICAgcmV0dXJuIGNiKHRydWUpXG4gICAgcmVhZHNbMF0oZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHtcbiAgICAgICAgcmVhZHMuc2hpZnQoKVxuICAgICAgICByZXR1cm4gbmV4dChudWxsLCBjYilcbiAgICAgIH1cbiAgICAgIHJlYWRzLnB1c2goY3JlYXRlU3RyZWFtKGRhdGEpKVxuICAgICAgY2IoZW5kLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxuLy90aGlzIGNhbWUgb3V0IGRpZmZlcmVudCB0byB0aGUgZmlyc3QgKHN0cm0pXG4vL2F0dGVtcHQgYXQgbGVhZkZpcnN0LCBidXQgaXQncyBzdGlsbCBhIHZhbGlkXG4vL3RvcG9sb2dpY2FsIHNvcnQuXG52YXIgbGVhZkZpcnN0ID0gZXhwb3J0cy5sZWFmRmlyc3QgPVxuZnVuY3Rpb24gKHN0YXJ0LCBjcmVhdGVTdHJlYW0pIHtcbiAgdmFyIHJlYWRzID0gW11cbiAgdmFyIG91dHB1dCA9IFtdXG4gIHJlYWRzLnB1c2gob25jZShzdGFydCkpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIG5leHQgKGVuZCwgY2IpIHtcbiAgICByZWFkc1swXShlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkge1xuICAgICAgICByZWFkcy5zaGlmdCgpXG4gICAgICAgIGlmKCFvdXRwdXQubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiBjYih0cnVlKVxuICAgICAgICByZXR1cm4gY2IobnVsbCwgb3V0cHV0LnNoaWZ0KCkpXG4gICAgICB9XG4gICAgICByZWFkcy51bnNoaWZ0KGNyZWF0ZVN0cmVhbShkYXRhKSlcbiAgICAgIG91dHB1dC51bnNoaWZ0KGRhdGEpXG4gICAgICBuZXh0KG51bGwsIGNiKVxuICAgIH0pXG4gIH1cbn1cblxuIiwidmFyIHUgICAgICA9IHJlcXVpcmUoJ3B1bGwtY29yZScpXG52YXIgc291cmNlcyA9IHJlcXVpcmUoJy4vc291cmNlcycpXG52YXIgc2lua3MgPSByZXF1aXJlKCcuL3NpbmtzJylcblxudmFyIHByb3AgICA9IHUucHJvcFxudmFyIGlkICAgICA9IHUuaWRcbnZhciB0ZXN0ZXIgPSB1LnRlc3RlclxuXG52YXIgbWFwID0gZXhwb3J0cy5tYXAgPSBcbmZ1bmN0aW9uIChyZWFkLCBtYXApIHtcbiAgbWFwID0gcHJvcChtYXApIHx8IGlkXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgcmVhZChhYm9ydCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgIGRhdGEgPSAhZW5kID8gbWFwKGRhdGEpIDogbnVsbFxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiByZWFkKGVyciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgYXN5bmNNYXAgPSBleHBvcnRzLmFzeW5jTWFwID1cbmZ1bmN0aW9uIChyZWFkLCBtYXApIHtcbiAgaWYoIW1hcCkgcmV0dXJuIHJlYWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmQsIGNiKSAvL2Fib3J0XG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHJldHVybiBjYihlbmQsIGRhdGEpXG4gICAgICBtYXAoZGF0YSwgY2IpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgcGFyYU1hcCA9IGV4cG9ydHMucGFyYU1hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwLCB3aWR0aCkge1xuICBpZighbWFwKSByZXR1cm4gcmVhZFxuICB2YXIgZW5kZWQgPSBmYWxzZSwgcXVldWUgPSBbXSwgX2NiXG5cbiAgZnVuY3Rpb24gZHJhaW4gKCkge1xuICAgIGlmKCFfY2IpIHJldHVyblxuICAgIHZhciBjYiA9IF9jYlxuICAgIF9jYiA9IG51bGxcbiAgICBpZihxdWV1ZS5sZW5ndGgpXG4gICAgICByZXR1cm4gY2IobnVsbCwgcXVldWUuc2hpZnQoKSlcbiAgICBlbHNlIGlmKGVuZGVkICYmICFuKVxuICAgICAgcmV0dXJuIGNiKGVuZGVkKVxuICAgIF9jYiA9IGNiXG4gIH1cblxuICBmdW5jdGlvbiBwdWxsICgpIHtcbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKGVuZCkge1xuICAgICAgICBlbmRlZCA9IGVuZFxuICAgICAgICByZXR1cm4gZHJhaW4oKVxuICAgICAgfVxuICAgICAgbisrXG4gICAgICBtYXAoZGF0YSwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICBuLS1cblxuICAgICAgICBxdWV1ZS5wdXNoKGRhdGEpXG4gICAgICAgIGRyYWluKClcbiAgICAgIH0pXG5cbiAgICAgIGlmKG4gPCB3aWR0aCAmJiAhZW5kZWQpXG4gICAgICAgIHB1bGwoKVxuICAgIH0pXG4gIH1cblxuICB2YXIgbiA9IDBcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmQsIGNiKSAvL2Fib3J0XG4gICAgLy9jb250aW51ZSB0byByZWFkIHdoaWxlIHRoZXJlIGFyZSBsZXNzIHRoYW4gMyBtYXBzIGluIGZsaWdodFxuICAgIF9jYiA9IGNiXG4gICAgaWYocXVldWUubGVuZ3RoIHx8IGVuZGVkKVxuICAgICAgcHVsbCgpLCBkcmFpbigpXG4gICAgZWxzZSBwdWxsKClcbiAgfVxuICByZXR1cm4gaGlnaFdhdGVyTWFyayhhc3luY01hcChyZWFkLCBtYXApLCB3aWR0aClcbn1cblxudmFyIGZpbHRlciA9IGV4cG9ydHMuZmlsdGVyID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIC8vcmVnZXhwXG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZ1bmN0aW9uIG5leHQgKGVuZCwgY2IpIHtcbiAgICB2YXIgc3luYywgbG9vcCA9IHRydWVcbiAgICB3aGlsZShsb29wKSB7XG4gICAgICBsb29wID0gZmFsc2VcbiAgICAgIHN5bmMgPSB0cnVlXG4gICAgICByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZighZW5kICYmICF0ZXN0KGRhdGEpKVxuICAgICAgICAgIHJldHVybiBzeW5jID8gbG9vcCA9IHRydWUgOiBuZXh0KGVuZCwgY2IpXG4gICAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICAgIH0pXG4gICAgICBzeW5jID0gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxudmFyIGZpbHRlck5vdCA9IGV4cG9ydHMuZmlsdGVyTm90ID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZpbHRlcihyZWFkLCBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAhdGVzdChlKVxuICB9KVxufVxuXG52YXIgdGhyb3VnaCA9IGV4cG9ydHMudGhyb3VnaCA9IFxuZnVuY3Rpb24gKHJlYWQsIG9wLCBvbkVuZCkge1xuICB2YXIgYSA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uY2UgKGFib3J0KSB7XG4gICAgaWYoYSB8fCAhb25FbmQpIHJldHVyblxuICAgIGEgPSB0cnVlXG4gICAgb25FbmQoYWJvcnQgPT09IHRydWUgPyBudWxsIDogYWJvcnQpXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIG9uY2UoZW5kKVxuICAgIHJldHVybiByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoIWVuZCkgb3AgJiYgb3AoZGF0YSlcbiAgICAgIGVsc2Ugb25jZShlbmQpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgdGFrZSA9IGV4cG9ydHMudGFrZSA9XG5mdW5jdGlvbiAocmVhZCwgdGVzdCkge1xuICB2YXIgZW5kZWQgPSBmYWxzZVxuICBpZignbnVtYmVyJyA9PT0gdHlwZW9mIHRlc3QpIHtcbiAgICB2YXIgbiA9IHRlc3Q7IHRlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbiAtLVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG4gICAgaWYoZW5kZWQgPSBlbmQpIHJldHVybiByZWFkKGVuZGVkLCBjYilcblxuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kZWQgPSBlbmRlZCB8fCBlbmQpIHJldHVybiBjYihlbmRlZClcbiAgICAgIGlmKCF0ZXN0KGRhdGEpKSB7XG4gICAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgICByZWFkKHRydWUsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgICBjYihlbmRlZCwgZGF0YSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgY2IobnVsbCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciB1bmlxdWUgPSBleHBvcnRzLnVuaXF1ZSA9IGZ1bmN0aW9uIChyZWFkLCBmaWVsZCwgaW52ZXJ0KSB7XG4gIGZpZWxkID0gcHJvcChmaWVsZCkgfHwgaWRcbiAgdmFyIHNlZW4gPSB7fVxuICByZXR1cm4gZmlsdGVyKHJlYWQsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGtleSA9IGZpZWxkKGRhdGEpXG4gICAgaWYoc2VlbltrZXldKSByZXR1cm4gISFpbnZlcnQgLy9mYWxzZSwgYnkgZGVmYXVsdFxuICAgIGVsc2Ugc2VlbltrZXldID0gdHJ1ZVxuICAgIHJldHVybiAhaW52ZXJ0IC8vdHJ1ZSBieSBkZWZhdWx0XG4gIH0pXG59XG5cbnZhciBub25VbmlxdWUgPSBleHBvcnRzLm5vblVuaXF1ZSA9IGZ1bmN0aW9uIChyZWFkLCBmaWVsZCkge1xuICByZXR1cm4gdW5pcXVlKHJlYWQsIGZpZWxkLCB0cnVlKVxufVxuXG52YXIgZ3JvdXAgPSBleHBvcnRzLmdyb3VwID1cbmZ1bmN0aW9uIChyZWFkLCBzaXplKSB7XG4gIHZhciBlbmRlZDsgc2l6ZSA9IHNpemUgfHwgNVxuICB2YXIgcXVldWUgPSBbXVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIC8vdGhpcyBtZWFucyB0aGF0IHRoZSB1cHN0cmVhbSBpcyBzZW5kaW5nIGFuIGVycm9yLlxuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kZWQgPSBlbmQsIGNiKVxuICAgIC8vdGhpcyBtZWFucyB0aGF0IHdlIHJlYWQgYW4gZW5kIGJlZm9yZS5cbiAgICBpZihlbmRlZCkgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiBuZXh0KGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kZWQgPSBlbmRlZCB8fCBlbmQpIHtcbiAgICAgICAgaWYoIXF1ZXVlLmxlbmd0aClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IHF1ZXVlOyBxdWV1ZSA9IFtdXG4gICAgICAgIHJldHVybiBjYihudWxsLCBfcXVldWUpXG4gICAgICB9XG4gICAgICBxdWV1ZS5wdXNoKGRhdGEpXG4gICAgICBpZihxdWV1ZS5sZW5ndGggPCBzaXplKVxuICAgICAgICByZXR1cm4gcmVhZChudWxsLCBuZXh0KVxuXG4gICAgICB2YXIgX3F1ZXVlID0gcXVldWU7IHF1ZXVlID0gW11cbiAgICAgIGNiKG51bGwsIF9xdWV1ZSlcbiAgICB9KVxuICB9XG59XG5cbnZhciBmbGF0dGVuID0gZXhwb3J0cy5mbGF0dGVuID0gZnVuY3Rpb24gKHJlYWQpIHtcbiAgdmFyIF9yZWFkXG4gIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgaWYoX3JlYWQpIG5leHRDaHVuaygpXG4gICAgZWxzZSAgICAgIG5leHRTdHJlYW0oKVxuXG4gICAgZnVuY3Rpb24gbmV4dENodW5rICgpIHtcbiAgICAgIF9yZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgaWYoZW5kKSBuZXh0U3RyZWFtKClcbiAgICAgICAgZWxzZSAgICBjYihudWxsLCBkYXRhKVxuICAgICAgfSlcbiAgICB9XG4gICAgZnVuY3Rpb24gbmV4dFN0cmVhbSAoKSB7XG4gICAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIHN0cmVhbSkge1xuICAgICAgICBpZihlbmQpXG4gICAgICAgICAgcmV0dXJuIGNiKGVuZClcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShzdHJlYW0pKVxuICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZXMudmFsdWVzKHN0cmVhbSlcbiAgICAgICAgZWxzZSBpZignZnVuY3Rpb24nICE9IHR5cGVvZiBzdHJlYW0pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJlYW0gb2Ygc3RyZWFtcycpXG4gICAgICAgIFxuICAgICAgICBfcmVhZCA9IHN0cmVhbVxuICAgICAgICBuZXh0Q2h1bmsoKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxudmFyIHByZXBlbmQgPVxuZXhwb3J0cy5wcmVwZW5kID1cbmZ1bmN0aW9uIChyZWFkLCBoZWFkKSB7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihoZWFkICE9PSBudWxsKSB7XG4gICAgICBpZihhYm9ydClcbiAgICAgICAgcmV0dXJuIHJlYWQoYWJvcnQsIGNiKVxuICAgICAgdmFyIF9oZWFkID0gaGVhZFxuICAgICAgaGVhZCA9IG51bGxcbiAgICAgIGNiKG51bGwsIF9oZWFkKVxuICAgIH0gZWxzZSB7XG4gICAgICByZWFkKGFib3J0LCBjYilcbiAgICB9XG4gIH1cblxufVxuXG4vL3ZhciBkcmFpbklmID0gZXhwb3J0cy5kcmFpbklmID0gZnVuY3Rpb24gKG9wLCBkb25lKSB7XG4vLyAgc2lua3MuZHJhaW4oXG4vL31cblxudmFyIF9yZWR1Y2UgPSBleHBvcnRzLl9yZWR1Y2UgPSBmdW5jdGlvbiAocmVhZCwgcmVkdWNlLCBpbml0aWFsKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoY2xvc2UsIGNiKSB7XG4gICAgaWYoY2xvc2UpIHJldHVybiByZWFkKGNsb3NlLCBjYilcbiAgICBpZihlbmRlZCkgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgc2lua3MuZHJhaW4oZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIGluaXRpYWwgPSByZWR1Y2UoaW5pdGlhbCwgaXRlbSlcbiAgICB9LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBlbmRlZCA9IGVyciB8fCB0cnVlXG4gICAgICBpZighZXJyKSBjYihudWxsLCBpbml0aWFsKVxuICAgICAgZWxzZSAgICAgY2IoZW5kZWQpXG4gICAgfSlcbiAgICAocmVhZClcbiAgfVxufVxuXG52YXIgbmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrXG5cbnZhciBoaWdoV2F0ZXJNYXJrID0gZXhwb3J0cy5oaWdoV2F0ZXJNYXJrID1cbmZ1bmN0aW9uIChyZWFkLCBoaWdoV2F0ZXJNYXJrKSB7XG4gIHZhciBidWZmZXIgPSBbXSwgd2FpdGluZyA9IFtdLCBlbmRlZCwgZW5kaW5nLCByZWFkaW5nID0gZmFsc2VcbiAgaGlnaFdhdGVyTWFyayA9IGhpZ2hXYXRlck1hcmsgfHwgMTBcblxuICBmdW5jdGlvbiByZWFkQWhlYWQgKCkge1xuICAgIHdoaWxlKHdhaXRpbmcubGVuZ3RoICYmIChidWZmZXIubGVuZ3RoIHx8IGVuZGVkKSlcbiAgICAgIHdhaXRpbmcuc2hpZnQoKShlbmRlZCwgZW5kZWQgPyBudWxsIDogYnVmZmVyLnNoaWZ0KCkpXG5cbiAgICBpZiAoIWJ1ZmZlci5sZW5ndGggJiYgZW5kaW5nKSBlbmRlZCA9IGVuZGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHQgKCkge1xuICAgIGlmKGVuZGVkIHx8IGVuZGluZyB8fCByZWFkaW5nIHx8IGJ1ZmZlci5sZW5ndGggPj0gaGlnaFdhdGVyTWFyaylcbiAgICAgIHJldHVyblxuICAgIHJlYWRpbmcgPSB0cnVlXG4gICAgcmV0dXJuIHJlYWQoZW5kZWQgfHwgZW5kaW5nLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICByZWFkaW5nID0gZmFsc2VcbiAgICAgIGVuZGluZyA9IGVuZGluZyB8fCBlbmRcbiAgICAgIGlmKGRhdGEgIT0gbnVsbCkgYnVmZmVyLnB1c2goZGF0YSlcblxuICAgICAgbmV4dCgpOyByZWFkQWhlYWQoKVxuICAgIH0pXG4gIH1cblxuICBwcm9jZXNzLm5leHRUaWNrKG5leHQpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgZW5kZWQgPSBlbmRlZCB8fCBlbmRcbiAgICB3YWl0aW5nLnB1c2goY2IpXG5cbiAgICBuZXh0KCk7IHJlYWRBaGVhZCgpXG4gIH1cbn1cblxudmFyIGZsYXRNYXAgPSBleHBvcnRzLmZsYXRNYXAgPVxuZnVuY3Rpb24gKHJlYWQsIG1hcHBlcikge1xuICBtYXBwZXIgPSBtYXBwZXIgfHwgaWRcbiAgdmFyIHF1ZXVlID0gW10sIGVuZGVkXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihxdWV1ZS5sZW5ndGgpIHJldHVybiBjYihudWxsLCBxdWV1ZS5zaGlmdCgpKVxuICAgIGVsc2UgaWYoZW5kZWQpICAgcmV0dXJuIGNiKGVuZGVkKVxuXG4gICAgcmVhZChhYm9ydCwgZnVuY3Rpb24gbmV4dCAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIGVuZGVkID0gZW5kXG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGFkZCA9IG1hcHBlcihkYXRhKVxuICAgICAgICB3aGlsZShhZGQgJiYgYWRkLmxlbmd0aClcbiAgICAgICAgICBxdWV1ZS5wdXNoKGFkZC5zaGlmdCgpKVxuICAgICAgfVxuXG4gICAgICBpZihxdWV1ZS5sZW5ndGgpIGNiKG51bGwsIHF1ZXVlLnNoaWZ0KCkpXG4gICAgICBlbHNlIGlmKGVuZGVkKSAgIGNiKGVuZGVkKVxuICAgICAgZWxzZSAgICAgICAgICAgICByZWFkKG51bGwsIG5leHQpXG4gICAgfSlcbiAgfVxufVxuXG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwiX2FyZ3NcIjogW1xuICAgIFtcbiAgICAgIFwic2VjdXJlLXNjdXR0bGVidXR0QGdpdCtodHRwczovL2dpdGh1Yi5jb20vc3NiYy9zZWN1cmUtc2N1dHRsZWJ1dHQuZ2l0I2I4ZGU0ODBiZDI2MmE2OWMzNTdlODA2ODFkZDYwY2Y2MGMxNzY4MWRcIixcbiAgICAgIFwiL1VzZXJzL2pvcmFuL0RvY3VtZW50cy9kZXZlbG9wbWVudC9wYXRjaGRlY2svbm9kZV9tb2R1bGVzL3NjdXR0bGVib3RcIlxuICAgIF1cbiAgXSxcbiAgXCJfZnJvbVwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vc3NiYy9zZWN1cmUtc2N1dHRsZWJ1dHQuZ2l0I2I4ZGU0ODBiZDI2MmE2OWMzNTdlODA2ODFkZDYwY2Y2MGMxNzY4MWRcIixcbiAgXCJfaWRcIjogXCJzZWN1cmUtc2N1dHRsZWJ1dHRAMTUuMC41XCIsXG4gIFwiX2luQ2FjaGVcIjogdHJ1ZSxcbiAgXCJfaW5zdGFsbGFibGVcIjogdHJ1ZSxcbiAgXCJfbG9jYXRpb25cIjogXCIvc2VjdXJlLXNjdXR0bGVidXR0XCIsXG4gIFwiX3BoYW50b21DaGlsZHJlblwiOiB7XG4gICAgXCJieXRld2lzZS1jb3JlXCI6IFwiMS4yLjNcIixcbiAgICBcImxldmVsLXBvc3RcIjogXCIxLjAuNFwiLFxuICAgIFwibGV2ZWx1cFwiOiBcIjAuMTkuMVwiLFxuICAgIFwicHVsbC1jYXRcIjogXCIxLjEuOVwiLFxuICAgIFwicHVsbC13aW5kb3dcIjogXCIyLjEuM1wiLFxuICAgIFwic3RyZWFtLXRvLXB1bGwtc3RyZWFtXCI6IFwiMS42LjhcIixcbiAgICBcInR5cGV3aXNlXCI6IFwiMS4wLjNcIixcbiAgICBcInR5cGV3aXNlbGl0ZVwiOiBcIjEuMC4wXCJcbiAgfSxcbiAgXCJfcmVxdWVzdGVkXCI6IHtcbiAgICBcImhvc3RlZFwiOiB7XG4gICAgICBcImRpcmVjdFVybFwiOiBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9zc2JjL3NlY3VyZS1zY3V0dGxlYnV0dC9iOGRlNDgwYmQyNjJhNjljMzU3ZTgwNjgxZGQ2MGNmNjBjMTc2ODFkL3BhY2thZ2UuanNvblwiLFxuICAgICAgXCJnaXRVcmxcIjogXCJnaXQ6Ly9naXRodWIuY29tL3NzYmMvc2VjdXJlLXNjdXR0bGVidXR0LmdpdCNiOGRlNDgwYmQyNjJhNjljMzU3ZTgwNjgxZGQ2MGNmNjBjMTc2ODFkXCIsXG4gICAgICBcImh0dHBzVXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9zc2JjL3NlY3VyZS1zY3V0dGxlYnV0dC5naXQjYjhkZTQ4MGJkMjYyYTY5YzM1N2U4MDY4MWRkNjBjZjYwYzE3NjgxZFwiLFxuICAgICAgXCJzaG9ydGN1dFwiOiBcImdpdGh1Yjpzc2JjL3NlY3VyZS1zY3V0dGxlYnV0dCNiOGRlNDgwYmQyNjJhNjljMzU3ZTgwNjgxZGQ2MGNmNjBjMTc2ODFkXCIsXG4gICAgICBcInNzaFwiOiBcImdpdEBnaXRodWIuY29tOnNzYmMvc2VjdXJlLXNjdXR0bGVidXR0LmdpdCNiOGRlNDgwYmQyNjJhNjljMzU3ZTgwNjgxZGQ2MGNmNjBjMTc2ODFkXCIsXG4gICAgICBcInNzaFVybFwiOiBcImdpdCtzc2g6Ly9naXRAZ2l0aHViLmNvbS9zc2JjL3NlY3VyZS1zY3V0dGxlYnV0dC5naXQjYjhkZTQ4MGJkMjYyYTY5YzM1N2U4MDY4MWRkNjBjZjYwYzE3NjgxZFwiLFxuICAgICAgXCJ0eXBlXCI6IFwiZ2l0aHViXCJcbiAgICB9LFxuICAgIFwibmFtZVwiOiBcInNlY3VyZS1zY3V0dGxlYnV0dFwiLFxuICAgIFwicmF3XCI6IFwic2VjdXJlLXNjdXR0bGVidXR0QGdpdCtodHRwczovL2dpdGh1Yi5jb20vc3NiYy9zZWN1cmUtc2N1dHRsZWJ1dHQuZ2l0I2I4ZGU0ODBiZDI2MmE2OWMzNTdlODA2ODFkZDYwY2Y2MGMxNzY4MWRcIixcbiAgICBcInJhd1NwZWNcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL3NzYmMvc2VjdXJlLXNjdXR0bGVidXR0LmdpdCNiOGRlNDgwYmQyNjJhNjljMzU3ZTgwNjgxZGQ2MGNmNjBjMTc2ODFkXCIsXG4gICAgXCJzY29wZVwiOiBudWxsLFxuICAgIFwic3BlY1wiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vc3NiYy9zZWN1cmUtc2N1dHRsZWJ1dHQuZ2l0I2I4ZGU0ODBiZDI2MmE2OWMzNTdlODA2ODFkZDYwY2Y2MGMxNzY4MWRcIixcbiAgICBcInR5cGVcIjogXCJob3N0ZWRcIlxuICB9LFxuICBcIl9yZXF1aXJlZEJ5XCI6IFtcbiAgICBcIi9zY3V0dGxlYm90XCJcbiAgXSxcbiAgXCJfcmVzb2x2ZWRcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL3NzYmMvc2VjdXJlLXNjdXR0bGVidXR0LmdpdCNiOGRlNDgwYmQyNjJhNjljMzU3ZTgwNjgxZGQ2MGNmNjBjMTc2ODFkXCIsXG4gIFwiX3NoYXN1bVwiOiBcIjRjMmZhNjhmZDVlYmQ4ZDllZTBkNGIyNzI3OWNiOWMxNTZlZDc4NjhcIixcbiAgXCJfc2hyaW5rd3JhcFwiOiBudWxsLFxuICBcIl9zcGVjXCI6IFwic2VjdXJlLXNjdXR0bGVidXR0QGdpdCtodHRwczovL2dpdGh1Yi5jb20vc3NiYy9zZWN1cmUtc2N1dHRsZWJ1dHQuZ2l0I2I4ZGU0ODBiZDI2MmE2OWMzNTdlODA2ODFkZDYwY2Y2MGMxNzY4MWRcIixcbiAgXCJfd2hlcmVcIjogXCIvVXNlcnMvam9yYW4vRG9jdW1lbnRzL2RldmVsb3BtZW50L3BhdGNoZGVjay9ub2RlX21vZHVsZXMvc2N1dHRsZWJvdFwiLFxuICBcImF1dGhvclwiOiB7XG4gICAgXCJlbWFpbFwiOiBcImRvbWluaWMudGFyckBnbWFpbC5jb21cIixcbiAgICBcIm5hbWVcIjogXCJEb21pbmljIFRhcnJcIixcbiAgICBcInVybFwiOiBcImh0dHA6Ly9kb21pbmljdGFyci5jb21cIlxuICB9LFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3NzYmMvc2VjdXJlLXNjdXR0bGVidXR0L2lzc3Vlc1wiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImNvbnRcIjogXCJ+MS4wLjBcIixcbiAgICBcImRlZXAtZXF1YWxcIjogXCJ+MC4yLjFcIixcbiAgICBcImV4cGxhaW4tZXJyb3JcIjogXCJ+MS4wLjFcIixcbiAgICBcImxldmVsXCI6IFwiXjEuMy4wXCIsXG4gICAgXCJsZXZlbC1zdWJsZXZlbFwiOiBcIl42LjUuMlwiLFxuICAgIFwibHRndFwiOiBcIn4yLjAuMFwiLFxuICAgIFwibW9ub3RvbmljLXRpbWVzdGFtcFwiOiBcIn4wLjAuOFwiLFxuICAgIFwicHVsbC1jYXRcIjogXCJ+MS4xLjVcIixcbiAgICBcInB1bGwtbGV2ZWxcIjogXCJ+MS40LjBcIixcbiAgICBcInB1bGwtcGFyYW1hcFwiOiBcIn4xLjEuM1wiLFxuICAgIFwicHVsbC1zdHJlYW1cIjogXCJ+Mi4yNC4xXCIsXG4gICAgXCJzc2ItZmVlZFwiOiBcIl4yLjAuMFwiLFxuICAgIFwic3NiLWtleXNcIjogXCJeNS4wLjBcIixcbiAgICBcInNzYi1tc2dzXCI6IFwiXjUuMC4wXCIsXG4gICAgXCJzc2ItcmVmXCI6IFwiXjIuMC4wXCJcbiAgfSxcbiAgXCJkZXNjcmlwdGlvblwiOiBcImEgc2VjdXJlLCByZXBsaWNhdGFibGUgZGF0YWJhc2VcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZGVlcC1lcXVhbFwiOiBcIl4wLjIuMVwiLFxuICAgIFwiaGV4cHBcIjogXCJ+MS4xLjNcIixcbiAgICBcImxldmVsLXRlc3RcIjogXCJeMi4wLjFcIixcbiAgICBcIm11bHRpY2JcIjogXCJ+MC4wLjJcIixcbiAgICBcInB1bGwtYWJvcnRhYmxlXCI6IFwifjQuMS4wXCIsXG4gICAgXCJwdWxsLXJhbmRvbWx5LXNwbGl0XCI6IFwifjEuMC40XCIsXG4gICAgXCJyaW1yYWZcIjogXCJ+Mi4yLjhcIixcbiAgICBcInRhcGVcIjogXCJeNC4yLjJcIixcbiAgICBcInR5cGV3aXNlbGl0ZVwiOiBcIn4xLjAuMFwiXG4gIH0sXG4gIFwiZ2l0SGVhZFwiOiBcImI4ZGU0ODBiZDI2MmE2OWMzNTdlODA2ODFkZDYwY2Y2MGMxNzY4MWRcIixcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9zc2JjL3NlY3VyZS1zY3V0dGxlYnV0dFwiLFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJuYW1lXCI6IFwic2VjdXJlLXNjdXR0bGVidXR0XCIsXG4gIFwib3B0aW9uYWxEZXBlbmRlbmNpZXNcIjoge30sXG4gIFwicmVhZG1lXCI6IFwiIyBzZWN1cmUtc2N1dHRsZWJ1dHRcXG5cXG5BIGRhdGFiYXNlIG9mIHVuZm9yZ2FibGUgYXBwZW5kLW9ubHkgZmVlZHMsIG9wdGltaXplZCBmb3IgZWZmaWNpZW50IHJlcGxpY2F0aW9uIGZvciBwZWVyIHRvIHBlZXIgcHJvdG9jb2xzLlxcblxcbiMjIFdoYXQgZG9lcyBpdCBkbz9cXG5cXG5TZWN1cmUtc2N1dHRsZWJ1dHQgcHJvdmlkZXMgdG9vbHMgZm9yIGRlYWxpbmcgd2l0aCB1bmZvcmdlYWJsZSBhcHBlbmQtb25seSBtZXNzYWdlIFxcbmZlZWRzLiBZb3UgY2FuIGNyZWF0ZSBhIGZlZWQsIHBvc3QgbWVzc2FnZXMgdG8gdGhhdCBmZWVkLCB2ZXJpZnkgYSBmZWVkIGNyZWF0ZWQgYnlcXG5zb21lb25lIGVsc2UsIHN0cmVhbSBtZXNzYWdlcyB0byBhbmQgZnJvbSBmZWVkcywgYW5kIG1vcmUgKHNlZSBbQVBJXSgjQVBJKSkuXFxuXFxuXFxcIlVuZm9yZ2VhYmxlXFxcIiBtZWFucyB0aGF0IG9ubHkgdGhlIG93bmVyIG9mIGEgZmVlZCBjYW4gbW9kaWZ5IHRoYXQgZmVlZCwgYXNcXG5lbmZvcmNlZCBieSBkaWdpdGFsIHNpZ25pbmcgKHNlZSBbU2VjdXJpdHkgcHJvcGVydGllc10oI3NlY3VyaXR5LXByb3BlcnRpZXMpKS5cXG5UaGlzIHByb3BlcnR5IG1ha2VzIHNlY3VyZS1zY3V0dGxlYnV0dCB1c2VmdWwgZm9yIHBlZXItdG8tcGVlciBhcHBsaWNhdGlvbnMuXFxuU2VjdXJlLXNjdXR0bGVidXR0IGFsc28gbWFrZXMgaXQgZWFzeSB0byBlbmNyeXB0IG1lc3NhZ2VzLlxcblxcbiMjIEV4YW1wbGVcXG5cXG5JbiB0aGlzIGV4YW1wbGUsIHdlIGNyZWF0ZSBhIGZlZWQsIHBvc3QgYSBzaWduZWQgbWVzc2FnZSB0byBpdCwgdGhlbiBjcmVhdGUgYSBzdHJlYW0gXFxudGhhdCByZWFkcyBmcm9tIHRoZSBmZWVkLlxcblxcbmBgYCBqc1xcbi8qKlxcbiAqIGNyZWF0ZSBhIHNlY3VyZSBzY3V0dGxlYnV0dCBpbnN0YW5jZSBhbmQgYWRkIGEgbWVzc2FnZSB0byBpdC5cXG4gKi9cXG5cXG52YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcXG5cXG4vLyBwYXRoczpcXG52YXIgcGF0aFRvREIgICAgID0gJy90bXAvc3NiMS8nXFxudmFyIHBhdGhUb1NlY3JldCA9ICcvdG1wL3NzYjEtc2VjcmV0J1xcblxcbi8vIHdheXMgdG8gY3JlYXRlIGtleXM6XFxudmFyIGtleXMgPSByZXF1aXJlKCdzc2Ita2V5cycpLmdlbmVyYXRlKClcXG52YXIga2V5cyA9IHJlcXVpcmUoJ3NzYi1rZXlzJykubG9hZFN5bmMocGF0aFRvU2VjcmV0KVxcbnZhciBrZXlzID0gcmVxdWlyZSgnc3NiLWtleXMnKS5jcmVhdGVTeW5jKHBhdGhUb1NlY3JldClcXG52YXIga2V5cyA9IHJlcXVpcmUoJ3NzYi1rZXlzJykubG9hZE9yQ3JlYXRlU3luYyhwYXRoVG9TZWNyZXQpXFxuXFxuLy8gY3JlYXRlIHRoZSBkYiBpbnN0YW5jZS5cXG4vLyAgLSB1c2VzIGxldmVsZGIuXFxuLy8gIC0gY2FuIG9ubHkgb3BlbiBvbmUgaW5zdGFuY2UgYXQgYSB0aW1lLlxcblxcbnZhciBzc2IgPSByZXF1aXJlKCdzZWN1cmUtc2N1dHRsZWJ1dHQvY3JlYXRlJykocGF0aFRvREIpXFxuXFxuLy8gY3JlYXRlIGEgZmVlZC5cXG4vLyAgLSB0aGlzIHJlcHJlc2VudHMgYSB3cml0ZSBhY2Nlc3MgLyB1c2VyLlxcbi8vICAtIHlvdSBtdXN0IHBhc3MgaW4ga2V5cy5cXG4vLyAgKHNlZSBvcHRpb25zIHNlY3Rpb24pXFxuXFxudmFyIGZlZWQgPSBzc2IuY3JlYXRlRmVlZChrZXlzKVxcblxcbi8vIHB1Ymxpc2ggYSBtZXNzYWdlLlxcbi8vICAtIGZlZWQuYWRkIGFwcGVuZHMgYSBtZXNzYWdlIHRvIHlvdXIga2V5J3MgY2hhaW4uXFxuLy8gIC0gdGhlIGB0eXBlYCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuXFxuXFxuZmVlZC5hZGQoeyB0eXBlOiAncG9zdCcsIHRleHQ6ICdNeSBGaXJzdCBQb3N0IScgfSwgZnVuY3Rpb24gKGVyciwgbXNnLCBoYXNoKSB7XFxuICAvLyB0aGUgbWVzc2FnZSBhcyBpdCBhcHBlYXJzIGluIHRoZSBkYXRhYmFzZTpcXG4gIGNvbnNvbGUubG9nKG1zZylcXG5cXG4gIC8vIGFuZCBpdHMgaGFzaDpcXG4gIGNvbnNvbGUubG9nKGhhc2gpXFxufSlcXG5cXG4vLyBzdHJlYW0gYWxsIG1lc3NhZ2VzIGZvciBhbGwga2V5cGFpcnMuXFxucHVsbChcXG4gIHNzYi5jcmVhdGVGZWVkU3RyZWFtKCksXFxuICBwdWxsLmNvbGxlY3QoZnVuY3Rpb24gKGVyciwgYXJ5KSB7XFxuICAgIGNvbnNvbGUubG9nKGFyeSlcXG4gIH0pXFxuKVxcblxcbi8vIHN0cmVhbSBhbGwgbWVzc2FnZXMgZm9yIGEgcGFydGljdWxhciBrZXlwYWlyLlxcbnB1bGwoXFxuICBzc2IuY3JlYXRlSGlzdG9yeVN0cmVhbShmZWVkLmlkKSxcXG4gIHB1bGwuY29sbGVjdChmdW5jdGlvbiAoZXJyLCBhcnkpIHtcXG4gICAgY29uc29sZS5sb2coYXJ5KVxcbiAgfSlcXG4pXFxuYGBgXFxuXFxuIyMgQ29uY2VwdHNcXG5cXG5CdWlsZGluZyB1cG9uIHNlY3VyZS1zY3V0dGxlYnV0dCByZXF1aXJlcyB1bmRlcnN0YW5kaW5nIGEgZmV3IGNvbmNlcHRzXFxudGhhdCBpdCB1c2VzIHRvIGVuc3VyZSB0aGUgdW5mb3JnZWFiaWxpdHkgb2YgbWVzc2FnZSBmZWVkcy5cXG5cXG4jIyMgSWRlbnRpdGllc1xcblxcbkFuIGlkZW50aXR5IGlzIHNpbXBseSBhIHB1YmxpYy9wcml2YXRlIGtleSBwYWlyLlxcblxcbkV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vIHdvcmxkd2lkZSBzdG9yZSBvZiBpZGVudGl0aWVzLCBpdCdzIGluZmVhc2libGVcXG5mb3IgYW55b25lIHRvIGZvcmdlIHlvdXIgaWRlbnRpdHkuIElkZW50aXRpZXMgYXJlIGJpbmFyeSBzdHJpbmdzLCBzbyBub3RcXG5wYXJ0aWN1bGFybHkgaHVtYW4tcmVhZGFibGUuXFxuXFxuIyMjIEZlZWRzXFxuXFxuQSBmZWVkIGlzIGFuIGFwcGVuZC1vbmx5IHNlcXVlbmNlIG9mIG1lc3NhZ2VzLiBFYWNoIGZlZWQgaXMgYXNzb2NpYXRlZFxcbjE6MSB3aXRoIGFuIGlkZW50aXR5LiBUaGUgZmVlZCBpcyBpZGVudGlmaWVkIGJ5IGl0cyBwdWJsaWMga2V5LiBUaGlzXFxud29ya3MgYmVjYXVzZSBwdWJsaWMga2V5cyBhcmUgdW5pcXVlLlxcblxcblNpbmNlIGZlZWRzIGFyZSBhcHBlbmQtb25seSwgcmVwbGljYXRpb24gaXMgc2ltcGxlOiByZXF1ZXN0IGFsbCBtZXNzYWdlc1xcbmluIHRoZSBmZWVkIHRoYXQgYXJlIG5ld2VyIHRoYW4gdGhlIGxhdGVzdCBtZXNzYWdlIHlvdSBrbm93IGFib3V0Llxcblxcbk5vdGUgdGhhdCBhcHBlbmQtb25seSByZWFsbHkgbWVhbnMgYXBwZW5kLW9ubHk6IHlvdSBjYW5ub3QgZGVsZXRlIGFuXFxuZXhpc3RpbmcgbWVzc2FnZS4gSWYgeW91IHdhbnQgdG8gZW5hYmxlIGVudGl0aWVzIHRvIGJlIGRlbGV0ZWQgb3IgXFxubW9kaWZpZWQgaW4geW91ciBkYXRhIG1vZGVsLCB0aGF0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiBhIGxheWVyIG9uIHRvcCBcXG5vZiBzZWN1cmUtc2N1dHRsZWJ1dHQgdXNpbmcgXFxuW2RlbHRhIGVuY29kaW5nXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZWx0YV9lbmNvZGluZykuIFxcblxcbiMjIyBNZXNzYWdlc1xcblxcbkVhY2ggbWVzc2FnZSBjb250YWluczpcXG5cXG4tIEEgbWVzc2FnZSBvYmplY3QuIFRoaXMgaXMgdGhlIHRoaW5nIHRoYXQgdGhlIGVuZCB1c2VyIGNhcmVzIGFib3V0LiBJZlxcbiAgdGhlcmUgaXMgbm8gZW5jcnlwdGlvbiwgdGhpcyBpcyBhIGB7fWAgb2JqZWN0LiBJZiB0aGVyZSBpcyBlbmNyeXB0aW9uLFxcbiAgdGhpcyBpcyBhbiBlbmNyeXB0ZWQgc3RyaW5nLlxcbi0gQSBjb250ZW50LWhhc2ggb2YgdGhlIHByZXZpb3VzIG1lc3NhZ2UuIFRoaXMgcHJldmVudHMgc29tZWJvZHkgd2l0aFxcbiAgdGhlIHByaXZhdGUga2V5IGZyb20gY2hhbmdpbmcgdGhlIGZlZWQgaGlzdG9yeSBhZnRlciBwdWJsaXNoaW5nLCBhcyBhXFxuICBuZXdseS1jcmVhdGVkIG1lc3NhZ2Ugd291bGRuJ3QgbWF0Y2ggdGhlIFxcXCJwcmV2LWhhc2hcXFwiIG9mIGxhdGVyIG1lc3NhZ2VzXFxuICB3aGljaCB3ZXJlIGFscmVhZHkgcmVwbGljYXRlZC5cXG4tIFRoZSBzaWduaW5nIHB1YmxpYyBrZXkuXFxuLSBBIHNpZ25hdHVyZS4gVGhpcyBwcmV2ZW50cyBtYWxpY2lvdXMgcGFydGllcyBmcm9tIHdyaXRpbmcgZmFrZSBcXG4gIG1lc3NhZ2VzIHRvIGEgc3RyZWFtLlxcbi0gQSBzZXF1ZW5jZSBudW1iZXIuIFRoaXMgcHJldmVudHMgYSBtYWxpY2lvdXMgcGFydHkgZnJvbSBtYWtpbmcgYSBjb3B5XFxuICBvZiB0aGUgZmVlZCB0aGF0IG9taXRzIG9yIHJlb3JkZXJzIG1lc3NhZ2VzLlxcbiAgXFxuU2luY2UgZWFjaCBtZXNzYWdlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyBtZXNzYWdlLCBhIGZlZWQgXFxubXVzdCBiZSByZXBsaWNhdGVkIGluIG9yZGVyLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBtZXNzYWdlLiBUaGlzIGlzXFxudGhlIG9ubHkgd2F5IHRoYXQgdGhlIGZlZWQgY2FuIGJlIHZlcmlmaWVkLiBBIGZlZWQgY2FuIGJlICp2aWV3ZWQqIGluXFxuYW55IG9yZGVyIGFmdGVyIGl0J3MgYmVlbiByZXBsaWNhdGVkLlxcblxcbiMjIyBPYmplY3QgaWRzXFxuXFxuVGhlIHRleHQgaW5zaWRlIGEgbWVzc2FnZSBjYW4gcmVmZXIgdG8gdGhyZWUgdHlwZXMgb2Ygc2VjdXJlLXNjdXR0bGVidXR0XFxuZW50aXRpZXM6IG1lc3NhZ2VzLCBmZWVkcywgYW5kIGJsb2JzIChpLmUuIGF0dGFjaG1lbnRzKS4gTWVzc2FnZXMgYW5kIFxcbmJsb2JzIGFyZSByZWZlcnJlZCB0byBieSB0aGVpciBoYXNoZXMsIGJ1dCBhIGZlZWQgaXMgcmVmZXJyZWQgdG8gYnkgaXRzXFxuc2lnbmluZyBwdWJsaWMga2V5LiBUaHVzLCBhIG1lc3NhZ2Ugd2l0aGluIGEgZmVlZCBjYW4gcmVmZXIgdG8gYW5vdGhlclxcbmZlZWQsIG9yIHRvIGEgcGFydGljdWxhciBwb2ludCBfd2l0aGluXyBhIGZlZWQuXFxuXFxuT2JqZWN0IGlkcyBiZWdpbiB3aXRoIGEgc2lnaWwgYEBgIGAlYCBhbmQgYCZgIGZvciBhIGBmZWVkSWRgLCBgbXNnSWRgXFxuYW5kIGBibG9iSWRgIHJlc3BlY3RpdmVseS5cXG5cXG5Ob3RlIHRoYXQgc2VjdXJlLXNjdXR0bGVidXR0IGRvZXMgbm90IGluY2x1ZGUgZmFjaWxpdGllcyBmb3IgcmV0cmlldmluZ1xcbmEgYmxvYiBnaXZlbiB0aGUgaGFzaC5cXG5cXG4jIyMgUmVwbGljYXRpb25cXG5cXG5JdCBpcyBwb3NzaWJsZSB0byBlYXNpbHkgcmVwbGljYXRlIGRhdGEgYmV0d2VlbiB0d28gU2VjdXJlU2N1dHRsZWJ1dHRzLlxcbkZpcnN0LCB0aGV5IGV4Y2hhbmdlIG1hcHMgb2YgdGhlaXIgbmV3ZXN0IGRhdGEuIFRoZW4sIGVhY2ggb25lIGRvd25sb2Fkc1xcbmFsbCBkYXRhIG5ld2VyIHRoYW4gaXRzIG5ld2VzdCBkYXRhLlxcblxcbltTY3V0dGxlYm90XShodHRwczovL2dpdGh1Yi5jb20vc3NiYy9zY3V0dGxlYm90KSBpcyBhIHRvb2wgdGhhdFxcbm1ha2VzIGl0IGVhc3kgdG8gcmVwbGljYXRlIG11bHRpcGxlIFNlY3VyZVNjdXR0bGVidXR0cyB1c2luZyBhXFxuZGVjZW50cmFsaXplZCBuZXR3b3JrLlxcblxcbiMjIyBTZWN1cml0eSBwcm9wZXJ0aWVzXFxuU2VjdXJlLXNjdXR0bGVidXR0IG1haW50YWlucyB1c2VmdWwgc2VjdXJpdHkgcHJvcGVydGllcyBldmVuIHdoZW4gaXQgaXNcXG5jb25uZWN0ZWQgdG8gYSBtYWxpY2lvdXMgc2VjdXJlLXNjdXR0bGVidXR0IGRhdGFiYXNlLiBUaGlzIG1ha2VzIGl0IGlkZWFsXFxuYXMgYSBzdG9yZSBmb3IgcGVlci10by1wZWVyIGFwcGxpY2F0aW9ucy5cXG5cXG5JbWFnaW5lIHRoYXQgd2Ugd2FudCB0byByZWFkIGZyb20gYSBmZWVkIGZvciB3aGljaCB3ZSBrbm93IHRoZSBpZGVudGl0eSxcXG5idXQgd2UncmUgY29ubmVjdGVkIHRvIGEgbWFsaWNpb3VzIHNlY3VyZS1zY3V0dGxlYnV0dCBpbnN0YW5jZS4gQXNcXG5sb25nIGFzIHRoZSBtYWxpY2lvdXMgZGF0YWJhc2UgZG9lcyBub3QgaGF2ZSB0aGUgcHJpdmF0ZSBrZXk6XFxuXFxuLSBUaGUgbWFsaWNpb3VzIGRhdGFiYXNlIGNhbm5vdCBjcmVhdGUgYSBuZXcgZmVlZCB3aXRoIHRoZSBzYW1lIGlkZW50aWZpZXJcXG4tIFRoZSBtYWxpY2lvdXMgZGF0YWJhc2UgY2Fubm90IHdyaXRlIG5ldyBmYWtlIG1lc3NhZ2VzIHRvIHRoZSBmZWVkXFxuLSBUaGUgbWFsaWNpb3VzIGRhdGFiYXNlIGNhbm5vdCByZW9yZGVyIHRoZSBtZXNzYWdlcyBpbiB0aGUgZmVlZFxcbi0gVGhlIG1hbGljaW91cyBkYXRhYmFzZSBjYW5ub3Qgc2VuZCB1cyBhIG5ldyBjb3B5IG9mIHRoZSBmZWVkIHRoYXQgb21pdHNcXG4gIG1lc3NhZ2VzIGZyb20gdGhlIG1pZGRsZVxcbi0gVGhlIG1hbGljaW91cyBkYXRhYmFzZSAqY2FuKiByZWZ1c2UgdG8gc2VuZCB1cyB0aGUgZmVlZCwgb3Igb25seSBzZW5kXFxuICB1cyB0aGUgZmlyc3QgKk4qIG1lc3NhZ2VzIGluIHRoZSBmZWVkXFxuLSBNZXNzYWdlcyBtYXkgb3B0aW9uYWxseSBiZSBlbmNyeXB0ZWQuIFNlZSBgdGVzdC9lbmQtdG8tZW5kLmpzYC5cXG5cXG5cXG4jIyBBUElcXG5cXG4jIyMgc3NiID0gcmVxdWlyZSgnc2VjdXJlLXNjdXR0bGVidXR0L2NyZWF0ZScpKHBhdGgpXFxuXFxuQ3JlYXRlIGEgc2VjdXJlLXNjdXR0bGVidXR0IGRhdGFiYXNlIGF0IHRoZSBnaXZlbiBwYXRoLFxcbnJldHVybnMgYW4gaW5zdGFuY2UuXFxuXFxuIyMjIHJlcXVpcmUoJ3NlY3VyZS1zY3V0dGxlYnV0dCcpKGRiLCBvcHRzKVxcblxcblBhc3MgaW4gYSBbbGV2ZWx1cF0oaHR0cHM6Ly9naXRodWIuY29tL3J2YWdnL25vZGUtbGV2ZWx1cCkgaW5zdGFuY2VcXG4oaXQgbXVzdCBoYXZlIFtzdWJsZXZlbF0oaHR0cHM6Ly9naXRodWIuY29tL2RvbWluaWN0YXJyL2xldmVsLXN1YmxldmVsKSBpbnN0YWxsZWQpLFxcbmFuZCBhbiBvcHRpb25zIG9iamVjdC4gVGhlIG9wdGlvbnMgb2JqZWN0IHByb3ZpZGVzIHRoZSBjcnlwdG9cXG5hbmQgZW5jb2RpbmcgZnVuY3Rpb25zLCB0aGF0IGFyZSBub3QgZGlyZWN0bHkgdGllZCBpbnRvIGhvd1xcbnNlY3VyZS1zY3V0dGxlYnV0dCB3b3Jrcy5cXG5cXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgYWxsIGFwcGx5IHRvIGEgYFNlY3VyZVNjdXR0bGVidXR0YCBpbnN0YW5jZVxcblxcbiMjIyBTZWN1cmVTY3V0dGxlYnV0dCNjcmVhdGVGZWVkIChrZXlzPylcXG5cXG5DcmVhdGUgYSBGZWVkIG9iamVjdC4gQSBmZWVkIGlzIGEgY2hhaW4gb2YgbWVzc2FnZXMgc2lnbmVkXFxuYnkgYSBzaW5nbGUga2V5ICh0aGUgaWRlbnRpdHkgb2YgdGhlIGZlZWQpLlxcblRoaXMgaGFuZGxlcyB0aGUgc3RhdGUgbmVlZGVkIHRvIGFwcGVuZCB2YWxpZCBtZXNzYWdlcyB0byBhIGZlZWQuXFxuSWYga2V5cyBhcmUgbm90IHByb3ZpZGVkLCB0aGVuIGEgbmV3IGtleSBwYWlyIHdpbGwgYmUgZ2VuZXJhdGVkLlxcblxcblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcHBseSB0byB0aGUgRmVlZCB0eXBlLlxcblxcbiMjIyMgRmVlZCNhZGQgKG1lc3NhZ2UsIGNiKVxcblxcbkFkZHMgYSBtZXNzYWdlIG9mIGEgZ2l2ZW4gdHlwZSB0byBhIGZlZWQuXFxuVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGFwcGVuZCBtZXNzYWdlcy5cXG5tZXNzYWdlIGlzIGEgamF2YXNjcmlwdCBvYmplY3QuIEl0IG11c3QgYmUgYSBge31gIG9iamVjdCB3aXRoIGEgYHR5cGVgXFxucHJvcGVydHkgdGhhdCBpcyBhIHN0cmluZyBiZXR3ZWVuIDMgYW5kIDMyIGNoYXJzIGxvbmcuXFxuXFxuIyMjIyBGZWVkI2lkXFxuXFxudGhlIGlkIG9mIHRoZSBmZWVkICh3aGljaCBpcyB0aGUgZmVlZCdzIHB1YmxpYyBrZXkpXFxuXFxuIyMjIyBGZWVkI2tleXNcXG5cXG50aGUga2V5IHBhaXIgZm9yIHRoaXMgZmVlZC5cXG5cXG4jIyMgU2VjdXJlU2N1dHRsZWJ1dHQjbmVlZHNSZWJ1aWxkKGNiKVxcblxcbkNoZWNrcyB0aGUgdmVyc2lvbiBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlIGFnYWluc3QgdGhlIGNvZGUgdmVyc2lvbiBhbmRcXG5jYWxscyBiYWNrIHRydWUvZmFsc2UgYWNjb3JkaW5nbHkuIFRoaXMga2VlcHMgdGhlIGRhdGFiYXNlIGluIHN5bmMgd2l0aFxcbm1ham9yIGJyZWFraW5nIGNoYW5nZXMgdG8gc2VjdXJlLXNjdXR0bGVidXR0IHdoZW4gdGhleSBvY2N1ci5cXG5cXG5TaG91bGQgYmUgcnVuIGF0IHN0YXJ0dXAuIElmIHRydWUsIHlvdSBzaG91bGQgY2FsbCBgcmVidWlsZEluZGV4YCBiZWZvcmVcXG51c2luZyB0aGUgZGF0YWJhc2UuXFxuXFxuYGBganNcXG5zc2IubmVlZHNSZWJ1aWxkKGZ1bmN0aW9uIChlcnIsIGIpIHtcXG4gIGlmIChiKVxcbiAgICBzc2IucmVidWlsZEluZGV4KG5leHQpXFxufSlcXG5gYGBcXG5cXG4jIyMgU2VjdXJlU2N1dHRsZWJ1dHQjcmVidWlsZEluZGV4KGNiKVxcblxcblJlYnVpbGRzIHRoZSBpbmRleGVzIGJ5IHJlcGxheWluZyBoaXN0b3J5LiBTZWUgYG5lZWRzUmVidWlsZGAuXFxuXFxuIyMjIFNlY3VyZVNjdXR0bGVidXR0I2NyZWF0ZUZlZWRTdHJlYW0gKG9wdHMpIC0+IFB1bGxTb3VyY2VcXG5cXG5DcmVhdGUgYSBbcHVsbC1zdHJlYW1dKGh0dHBzOi8vZ2l0aHViLmNvbS9kb21pbmljdGFyci9wdWxsLXN0cmVhbSlcXG5vZiBhbGwgdGhlIGZlZWRzIGluIHRoZSBkYXRhYmFzZSwgb3JkZXJlZCBieSB0aW1lc3RhbXBzLlxcbkFsbCBbcHVsbC1sZXZlbF0oaHR0cHM6Ly9naXRodWIuY29tL2RvbWluaWN0YXJyL3B1bGwtbGV2ZWwpIG9wdGlvbnNcXG5hcmUgYWxsb3dlZCAoc3RhcnQsIGVuZCwgcmV2ZXJzZSwgdGFpbClcXG5cXG4jIyMgU2VjdXJlU2N1dHRsZWJ1dHQjY3JlYXRlTG9nU3RyZWFtKHtndDogdHMsIHRhaWw6IGJvb2xlYW59KSAtPiBQdWxsU291cmNlXFxuXFxuY3JlYXRlIGEgc3RyZWFtIG9mIHRoZSBtZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoaXMgaW5zdGFuY2VcXG5pbiB0aGUgb3JkZXIgdGhleSBhcnJpdmVkLiBUaGlzIGlzIG1haW5seSBpbnRlbmRlZCBmb3IgYnVpbGRpbmcgdmlld3MuXFxuVGhlIG9iamVjdHMgaW4gdGhpcyBzdHJlYW0gd2lsbCBiZSBvZiB0aGUgZm9ybTpcXG5cXG5gYGAganNcXG57XFxuICBrZXk6IEhhc2gsIHZhbHVlOiBNZXNzYWdlLCB0aW1lc3RhbXA6IHRpbWVzdGFtcFxcbn1cXG5gYGBcXG5gdGltZXN0YW1wYCBpcyBnZW5lcmF0ZWQgYnlcXG5bbW9ub3RvbmljLXRpbWVzdGFtcF0oaHR0cHM6Ly9naXRodWIuY29tL2RvbWluaWN0YXJyL21vbm90b25pYy10aW1lc3RhbXApXFxuXFxuIyMjIFNlY3VyZVNjdXR0bGVidXR0I2NyZWF0ZUhpc3RvcnlTdHJlYW0gKHtpZDogZmVlZElkLCBzZXE6IGludD8sIGxpdmU6IGJvb2w/fSkgLT4gUHVsbFNvdXJjZVxcblxcbkNyZWF0ZSBhIHN0cmVhbSBvZiB0aGUgaGlzdG9yeSBvZiBgaWRgLiBJZiBgc2VxID4gMGAsIHRoZW5cXG5vbmx5IHN0cmVhbSBtZXNzYWdlcyB3aXRoIHNlcXVlbmNlIG51bWJlcnMgZ3JlYXRlciB0aGFuIGBzZXFgLlxcbmlmIGBsaXZlYCBpcyB0cnVlLCB0aGUgc3RyZWFtIHdpbGwgYmUgYVxcbltsaXZlIG1vZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9kb21pbmljdGFyci9wdWxsLWxldmVsI2V4YW1wbGUtLS1yZWFkaW5nKVxcblxcbiMjIyBTZWN1cmVTY3V0dGxlYnV0dCNtZXNzYWdlc0J5VHlwZSAoe3R5cGU6IHN0cmluZywgbGl2ZTogYm9vbD99KSAtPiBQdWxsU291cmNlXFxuXFxucmV0cml2ZSBtZXNzYWdlcyB3aXRoIGEgZ2l2ZW4gdHlwZS4gQWxsIG1lc3NhZ2VzIG11c3QgaGF2ZSBhIHR5cGUsXFxuc28gdGhpcyBpcyBhIGdvb2Qgd2F5IHRvIHNlbGVjdCBtZXNzYWdlcyB0aGF0IGFuIGFwcGxpY2F0aW9uIG1pZ2h0IHVzZS5cXG5SZXR1cm5zIGEgc291cmNlIHB1bGwtc3RyZWFtLiBUaGlzIGZ1bmN0aW9uIHRha2VzIGFsbCB0aGUgb3B0aW9ucyBmcm9tIFtwdWxsLWxldmVsI3JlYWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kb21pbmljdGFyci9wdWxsLWxldmVsI2V4YW1wbGUtLS1yZWFkaW5nKVxcbihndCwgbHQsIGd0ZSwgbHRlLCBsaW1pdCwgcmV2ZXJzZSwgbGl2ZSlcXG5cXG5cXG4jIyMgU2VjdXJlU2N1dHRsZWJ1dHQjbGlua3MgKHtzb3VyY2U6IGZlZWRJZD8sIGRlc3Q6IGZlZWRJZHxtc2dJZHxibG9iSWQ/LCByZWw6IHN0cmluZz8sIG1ldGE6IHRydWU/LCBrZXlzOiB0cnVlPywgdmFsdWVzOiBmYWxzZT8sIGxpdmU6ZmFsc2U/LCByZXZlcnNlOiBmYWxzZT99KSAtPiBQdWxsU291cmNlXFxuXFxuR2V0IGEgc3RyZWFtIG9mIGxpbmtzIGZyb20gYSBmZWVkIHRvIGEgYmxvYi9tc2cvZmVlZCBpZC5cXG5cXG5UaGUgb2JqZWN0cyBpbiB0aGlzIHN0cmVhbSB3aWxsIGJlIG9mIHRoZSBmb3JtOlxcblxcbmBgYFxcbnsgc291cmNlOiBmZWVkSWQsIHJlbDogU3RyaW5nLCBkZXN0OiBJZCwga2V5OiBNc2dJZCwgdmFsdWU6IE9iamVjdD8gfVxcbmBgYFxcblxcbiAtIGBzb3VyY2VgIChzdHJpbmcsIG9wdGlvbmFsKTogZmVlZCBpZC4uXFxuIC0gYGRlc3RgIChzdHJpbmcsIG9wdGlvbmFsKTogQW4gaWQgb3IgZmlsdGVyLCBzcGVjaWZ5aW5nIHdoZXJlIHRoZSBsaW5rIHNob3VsZCBwb2ludCB0by5cXG4gIFRvIGZpbHRlciwganVzdCB1c2UgdGhlIHNpZ2lsIG9mIHRoZSB0eXBlIHlvdSB3YW50OiBgQGAgZm9yIGZlZWRzLCBgJWAgZm9yIG1lc3NhZ2VzLCBhbmQgYCZgIGZvciBibG9icy5cXG4gLSBgcmVsYCAoc3RyaW5nLCBvcHRpb25hbCk6IEZpbHRlcnMgdGhlIGxpbmtzIGJ5IHRoZSByZWxhdGlvbiBzdHJpbmcuXFxuXFxuSWYgYG9wdHMudmFsdWVzYCBpcyBzZXQgKGRlZmF1bHQ6IGZhbHNlKSBgdmFsdWVgIHdpbGwgYmUgdGhlIG1lc3NhZ2UgdGhlIGxpbmsgb2NjdXJzIGluLlxcbklmIGBvcHRzLmtleXNgIGlzIHNldCAoZGVmYXVsdDogdHJ1ZSkgYGtleWAgd2lsbCBiZSB0aGUgbWVzc2FnZSBpZC5cXG5JZiBgb3B0cy5tZXRhYCBpcyB1bnNldCAoZGVmYXVsdDogdHJ1ZSkgYHNvdXJjZSwgaGFzaCwgcmVsYCB3aWxsIGJlIGxlZnQgb2ZmLlxcblxcbj4gTm90ZTogaWYgYHNvdXJjZWAsIGFuZCBgZGVzdGAgaXMgcHJvdmlkZWQsIGJ1dCBub3QgYHJlbGAsIHNzYiB3aWxsXFxuPiBoYXZlIHRvIHNjYW4gYWxsIHRoZSBsaW5rcyBmcm9tIHNvdXJjZSwgYW5kIHRoZW4gZmlsdGVyIGJ5IGRlc3QuXFxuPiB5b3VyIHF1ZXJ5IHdpbGwgYmUgbW9yZSBlZmZpY2llbnQgaWYgeW91IGFsc28gcHJvdmlkZSBgcmVsYC5cXG5cXG5cXG4jIyMgU2VjdXJlU2N1dHRsZWJ1dHQjcmVsYXRlZE1lc3NhZ2VzICh7aWQ6IG1zZ0lkLCByZWw6IHN0cmluZz8sIGNvdW50OiBmYWxzZT8sIHBhcmVudDogZmFsc2U/fSwgY2IpXFxuXFxuUmV0cmlldmUgdGhlIHRyZWUgb2YgbWVzc2FnZXMgcmVsYXRlZCB0byBgaWRgLlxcblRoaXMgaXMgaWRlYWwgZm9yIGNvbGxlY3RpbmcgdGhpbmdzIGxpa2UgdGhyZWFkZWQgcmVwbGllcy5cXG5JZiBgcmVsYCBpcyBwcm92aWRlZCwgb25seSBtZXNzYWdlcyB0aGF0IGxpbmsgdG8gdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhcmUgaW5jbHVkZWQuXFxuVGhlIG91dHB1dCBpcyBhIHJlY3Vyc2l2ZSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOlxcblxcbmBgYCBqc1xcbntcXG4gIGtleTogPG1zZ0lkPixcXG4gIHZhbHVlOiA8bXNnPixcXG4gIHJlbGF0ZWQ6IFtcXG4gICAgPHJlY3Vyc2l2ZT4sLi4uXFxuICBdLFxcbiAgLy9udW1iZXIgb2YgbWVzc2FnZXMgYmVsb3cgdGhpcyBwb2ludC4gKHdoZW4gb3B0cy5jb3VudCA9IHRydWUpXFxuICBjb3VudDogPGludD4sXFxuICAvL3RoZSBtZXNzYWdlIHRoaXMgbWVzc2FnZSBsaW5rcyB0by4gdGhpcyB3aWxsIG5vdCBhcHBlYXIgb24gdGhlIGJvdHRvbSBsZXZlbC5cXG4gIC8vKHdoZW4gb3B0cy5wYXJlbnQgPSB0cnVlKVxcbiAgcGFyZW50OiA8cGFyZW50X2lkPlxcbn1cXG5gYGBcXG5cXG5JZiBgY291bnRgIG9wdGlvbiBpcyB0cnVlLCB0aGVuIGVhY2ggbWVzc2FnZSB3aWxsIGNvbnRhaW4gYSBgY291bnRgXFxuaXQncyBkZXNjZW5kYW50IG1lc3NhZ2VzLiBJZiBgcGFyZW50YCBpcyB0cnVlIHRoZW4gZWFjaCBsZXZlbCB3aWxsIGhhdmUgXFxuYHBhcmVudGAsIHRoZSBgaWQva2V5YCBvZiBpdCdzIHBhcmVudCBtZXNzYWdlLlxcblxcbiMjIFN0YWJpbGl0eVxcblxcblN0YWJsZTogRXhwZWN0IHBhdGNoZXMsIHBvc3NpYmxlIGZlYXR1cmVzIGFkZGl0aW9ucy5cXG5cXG4jIyBMaWNlbnNlXFxuXFxuTUlUXFxuXFxuXCIsXG4gIFwicmVhZG1lRmlsZW5hbWVcIjogXCJSRUFETUUubWRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdDovL2dpdGh1Yi5jb20vc3NiYy9zZWN1cmUtc2N1dHRsZWJ1dHQuZ2l0XCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInByZXB1Ymxpc2hcIjogXCJucG0gbHMgJiYgbnBtIHRlc3RcIixcbiAgICBcInRlc3RcIjogXCJzZXQgLWU7IGZvciB0IGluIHRlc3QvKi5qczsgZG8gbm9kZSAkdDsgZG9uZVwiXG4gIH0sXG4gIFwidGVzdGxpbmdcIjoge1xuICAgIFwiYnJvd3NlcnNcIjogW1xuICAgICAgXCJjaHJvbWUvMjIuLmxhdGVzdFwiLFxuICAgICAgXCJjaHJvbWUvY2FuYXJ5XCIsXG4gICAgICBcImZpcmVmb3gvMTcuLmxhdGVzdFwiLFxuICAgICAgXCJmaXJlZm94L25pZ2h0bHlcIixcbiAgICAgIFwiaWUvOC4ubGF0ZXN0XCIsXG4gICAgICBcImlwYWQvNi4wLi5sYXRlc3RcIixcbiAgICAgIFwiaXBob25lLzYuMC4ubGF0ZXN0XCIsXG4gICAgICBcIm9wZXJhLzEyLi5sYXRlc3RcIixcbiAgICAgIFwib3BlcmEvbmV4dFwiLFxuICAgICAgXCJzYWZhcmkvNS4xLi5sYXRlc3RcIlxuICAgIF0sXG4gICAgXCJmaWxlc1wiOiBcInRlc3QvZGVmYXVsdHMuanNcIlxuICB9LFxuICBcInZlcnNpb25cIjogXCIxNS4wLjVcIlxufVxuIiwiLy8gcHJvdG90eXBlIGNsYXNzIGZvciBoYXNoIGZ1bmN0aW9uc1xuZnVuY3Rpb24gSGFzaCAoYmxvY2tTaXplLCBmaW5hbFNpemUpIHtcbiAgdGhpcy5fYmxvY2sgPSBuZXcgQnVmZmVyKGJsb2NrU2l6ZSlcbiAgdGhpcy5fZmluYWxTaXplID0gZmluYWxTaXplXG4gIHRoaXMuX2Jsb2NrU2l6ZSA9IGJsb2NrU2l6ZVxuICB0aGlzLl9sZW4gPSAwXG4gIHRoaXMuX3MgPSAwXG59XG5cbkhhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkYXRhLCBlbmMpIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGVuYyA9IGVuYyB8fCAndXRmOCdcbiAgICBkYXRhID0gbmV3IEJ1ZmZlcihkYXRhLCBlbmMpXG4gIH1cblxuICB2YXIgbCA9IHRoaXMuX2xlbiArPSBkYXRhLmxlbmd0aFxuICB2YXIgcyA9IHRoaXMuX3MgfHwgMFxuICB2YXIgZiA9IDBcbiAgdmFyIGJ1ZmZlciA9IHRoaXMuX2Jsb2NrXG5cbiAgd2hpbGUgKHMgPCBsKSB7XG4gICAgdmFyIHQgPSBNYXRoLm1pbihkYXRhLmxlbmd0aCwgZiArIHRoaXMuX2Jsb2NrU2l6ZSAtIChzICUgdGhpcy5fYmxvY2tTaXplKSlcbiAgICB2YXIgY2ggPSAodCAtIGYpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoOyBpKyspIHtcbiAgICAgIGJ1ZmZlclsocyAlIHRoaXMuX2Jsb2NrU2l6ZSkgKyBpXSA9IGRhdGFbaSArIGZdXG4gICAgfVxuXG4gICAgcyArPSBjaFxuICAgIGYgKz0gY2hcblxuICAgIGlmICgocyAlIHRoaXMuX2Jsb2NrU2l6ZSkgPT09IDApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZShidWZmZXIpXG4gICAgfVxuICB9XG4gIHRoaXMuX3MgPSBzXG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuSGFzaC5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gKGVuYykge1xuICAvLyBTdXBwb3NlIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgTSwgaW4gYml0cywgaXMgbFxuICB2YXIgbCA9IHRoaXMuX2xlbiAqIDhcblxuICAvLyBBcHBlbmQgdGhlIGJpdCAxIHRvIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2VcbiAgdGhpcy5fYmxvY2tbdGhpcy5fbGVuICUgdGhpcy5fYmxvY2tTaXplXSA9IDB4ODBcblxuICAvLyBhbmQgdGhlbiBrIHplcm8gYml0cywgd2hlcmUgayBpcyB0aGUgc21hbGxlc3Qgbm9uLW5lZ2F0aXZlIHNvbHV0aW9uIHRvIHRoZSBlcXVhdGlvbiAobCArIDEgKyBrKSA9PT0gZmluYWxTaXplIG1vZCBibG9ja1NpemVcbiAgdGhpcy5fYmxvY2suZmlsbCgwLCB0aGlzLl9sZW4gJSB0aGlzLl9ibG9ja1NpemUgKyAxKVxuXG4gIGlmIChsICUgKHRoaXMuX2Jsb2NrU2l6ZSAqIDgpID49IHRoaXMuX2ZpbmFsU2l6ZSAqIDgpIHtcbiAgICB0aGlzLl91cGRhdGUodGhpcy5fYmxvY2spXG4gICAgdGhpcy5fYmxvY2suZmlsbCgwKVxuICB9XG5cbiAgLy8gdG8gdGhpcyBhcHBlbmQgdGhlIGJsb2NrIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgbCB3cml0dGVuIGluIGJpbmFyeVxuICAvLyBUT0RPOiBoYW5kbGUgY2FzZSB3aGVyZSBsIGlzID4gTWF0aC5wb3coMiwgMjkpXG4gIHRoaXMuX2Jsb2NrLndyaXRlSW50MzJCRShsLCB0aGlzLl9ibG9ja1NpemUgLSA0KVxuXG4gIHZhciBoYXNoID0gdGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKSB8fCB0aGlzLl9oYXNoKClcblxuICByZXR1cm4gZW5jID8gaGFzaC50b1N0cmluZyhlbmMpIDogaGFzaFxufVxuXG5IYXNoLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ191cGRhdGUgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gSGFzaFxuIiwidmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIFNIQSAoYWxnb3JpdGhtKSB7XG4gIGFsZ29yaXRobSA9IGFsZ29yaXRobS50b0xvd2VyQ2FzZSgpXG5cbiAgdmFyIEFsZ29yaXRobSA9IGV4cG9ydHNbYWxnb3JpdGhtXVxuICBpZiAoIUFsZ29yaXRobSkgdGhyb3cgbmV3IEVycm9yKGFsZ29yaXRobSArICcgaXMgbm90IHN1cHBvcnRlZCAod2UgYWNjZXB0IHB1bGwgcmVxdWVzdHMpJylcblxuICByZXR1cm4gbmV3IEFsZ29yaXRobSgpXG59XG5cbmV4cG9ydHMuc2hhID0gcmVxdWlyZSgnLi9zaGEnKVxuZXhwb3J0cy5zaGExID0gcmVxdWlyZSgnLi9zaGExJylcbmV4cG9ydHMuc2hhMjI0ID0gcmVxdWlyZSgnLi9zaGEyMjQnKVxuZXhwb3J0cy5zaGEyNTYgPSByZXF1aXJlKCcuL3NoYTI1NicpXG5leHBvcnRzLnNoYTM4NCA9IHJlcXVpcmUoJy4vc2hhMzg0JylcbmV4cG9ydHMuc2hhNTEyID0gcmVxdWlyZSgnLi9zaGE1MTInKVxuIiwiLypcbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VjdXJlIEhhc2ggQWxnb3JpdGhtLCBTSEEtMCwgYXMgZGVmaW5lZFxuICogaW4gRklQUyBQVUIgMTgwLTFcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNoYTEuanMgb2YgdGhlIHNhbWUgcmVwb3NpdG9yeS5cbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gU0hBLTAgYW5kIFNIQS0xIGlzIGp1c3QgYSBiaXR3aXNlIHJvdGF0ZSBsZWZ0XG4gKiBvcGVyYXRpb24gd2FzIGFkZGVkLlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBIYXNoID0gcmVxdWlyZSgnLi9oYXNoJylcblxudmFyIEsgPSBbXG4gIDB4NWE4Mjc5OTksIDB4NmVkOWViYTEsIDB4OGYxYmJjZGMgfCAwLCAweGNhNjJjMWQ2IHwgMFxuXVxuXG52YXIgVyA9IG5ldyBBcnJheSg4MClcblxuZnVuY3Rpb24gU2hhICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgNjQsIDU2KVxufVxuXG5pbmhlcml0cyhTaGEsIEhhc2gpXG5cblNoYS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fYSA9IDB4Njc0NTIzMDFcbiAgdGhpcy5fYiA9IDB4ZWZjZGFiODlcbiAgdGhpcy5fYyA9IDB4OThiYWRjZmVcbiAgdGhpcy5fZCA9IDB4MTAzMjU0NzZcbiAgdGhpcy5fZSA9IDB4YzNkMmUxZjBcblxuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiByb3RsNSAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDUpIHwgKG51bSA+Pj4gMjcpXG59XG5cbmZ1bmN0aW9uIHJvdGwzMCAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDMwKSB8IChudW0gPj4+IDIpXG59XG5cbmZ1bmN0aW9uIGZ0IChzLCBiLCBjLCBkKSB7XG4gIGlmIChzID09PSAwKSByZXR1cm4gKGIgJiBjKSB8ICgofmIpICYgZClcbiAgaWYgKHMgPT09IDIpIHJldHVybiAoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZClcbiAgcmV0dXJuIGIgXiBjIF4gZFxufVxuXG5TaGEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoTSkge1xuICB2YXIgVyA9IHRoaXMuX3dcblxuICB2YXIgYSA9IHRoaXMuX2EgfCAwXG4gIHZhciBiID0gdGhpcy5fYiB8IDBcbiAgdmFyIGMgPSB0aGlzLl9jIHwgMFxuICB2YXIgZCA9IHRoaXMuX2QgfCAwXG4gIHZhciBlID0gdGhpcy5fZSB8IDBcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIFdbaV0gPSBNLnJlYWRJbnQzMkJFKGkgKiA0KVxuICBmb3IgKDsgaSA8IDgwOyArK2kpIFdbaV0gPSBXW2kgLSAzXSBeIFdbaSAtIDhdIF4gV1tpIC0gMTRdIF4gV1tpIC0gMTZdXG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgKytqKSB7XG4gICAgdmFyIHMgPSB+fihqIC8gMjApXG4gICAgdmFyIHQgPSAocm90bDUoYSkgKyBmdChzLCBiLCBjLCBkKSArIGUgKyBXW2pdICsgS1tzXSkgfCAwXG5cbiAgICBlID0gZFxuICAgIGQgPSBjXG4gICAgYyA9IHJvdGwzMChiKVxuICAgIGIgPSBhXG4gICAgYSA9IHRcbiAgfVxuXG4gIHRoaXMuX2EgPSAoYSArIHRoaXMuX2EpIHwgMFxuICB0aGlzLl9iID0gKGIgKyB0aGlzLl9iKSB8IDBcbiAgdGhpcy5fYyA9IChjICsgdGhpcy5fYykgfCAwXG4gIHRoaXMuX2QgPSAoZCArIHRoaXMuX2QpIHwgMFxuICB0aGlzLl9lID0gKGUgKyB0aGlzLl9lKSB8IDBcbn1cblxuU2hhLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBuZXcgQnVmZmVyKDIwKVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EgfCAwLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iIHwgMCwgNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYyB8IDAsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QgfCAwLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSB8IDAsIDE2KVxuXG4gIHJldHVybiBIXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2hhXG4iLCIvKlxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWN1cmUgSGFzaCBBbGdvcml0aG0sIFNIQS0xLCBhcyBkZWZpbmVkXG4gKiBpbiBGSVBTIFBVQiAxODAtMVxuICogVmVyc2lvbiAyLjFhIENvcHlyaWdodCBQYXVsIEpvaG5zdG9uIDIwMDAgLSAyMDAyLlxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgZGV0YWlscy5cbiAqL1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG5cbnZhciBLID0gW1xuICAweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjIHwgMCwgMHhjYTYyYzFkNiB8IDBcbl1cblxudmFyIFcgPSBuZXcgQXJyYXkoODApXG5cbmZ1bmN0aW9uIFNoYTEgKCkge1xuICB0aGlzLmluaXQoKVxuICB0aGlzLl93ID0gV1xuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYTEsIEhhc2gpXG5cblNoYTEucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2EgPSAweDY3NDUyMzAxXG4gIHRoaXMuX2IgPSAweGVmY2RhYjg5XG4gIHRoaXMuX2MgPSAweDk4YmFkY2ZlXG4gIHRoaXMuX2QgPSAweDEwMzI1NDc2XG4gIHRoaXMuX2UgPSAweGMzZDJlMWYwXG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuZnVuY3Rpb24gcm90bDEgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAxKSB8IChudW0gPj4+IDMxKVxufVxuXG5mdW5jdGlvbiByb3RsNSAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDUpIHwgKG51bSA+Pj4gMjcpXG59XG5cbmZ1bmN0aW9uIHJvdGwzMCAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDMwKSB8IChudW0gPj4+IDIpXG59XG5cbmZ1bmN0aW9uIGZ0IChzLCBiLCBjLCBkKSB7XG4gIGlmIChzID09PSAwKSByZXR1cm4gKGIgJiBjKSB8ICgofmIpICYgZClcbiAgaWYgKHMgPT09IDIpIHJldHVybiAoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZClcbiAgcmV0dXJuIGIgXiBjIF4gZFxufVxuXG5TaGExLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKE0pIHtcbiAgdmFyIFcgPSB0aGlzLl93XG5cbiAgdmFyIGEgPSB0aGlzLl9hIHwgMFxuICB2YXIgYiA9IHRoaXMuX2IgfCAwXG4gIHZhciBjID0gdGhpcy5fYyB8IDBcbiAgdmFyIGQgPSB0aGlzLl9kIHwgMFxuICB2YXIgZSA9IHRoaXMuX2UgfCAwXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSBXW2ldID0gTS5yZWFkSW50MzJCRShpICogNClcbiAgZm9yICg7IGkgPCA4MDsgKytpKSBXW2ldID0gcm90bDEoV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XSlcblxuICBmb3IgKHZhciBqID0gMDsgaiA8IDgwOyArK2opIHtcbiAgICB2YXIgcyA9IH5+KGogLyAyMClcbiAgICB2YXIgdCA9IChyb3RsNShhKSArIGZ0KHMsIGIsIGMsIGQpICsgZSArIFdbal0gKyBLW3NdKSB8IDBcblxuICAgIGUgPSBkXG4gICAgZCA9IGNcbiAgICBjID0gcm90bDMwKGIpXG4gICAgYiA9IGFcbiAgICBhID0gdFxuICB9XG5cbiAgdGhpcy5fYSA9IChhICsgdGhpcy5fYSkgfCAwXG4gIHRoaXMuX2IgPSAoYiArIHRoaXMuX2IpIHwgMFxuICB0aGlzLl9jID0gKGMgKyB0aGlzLl9jKSB8IDBcbiAgdGhpcy5fZCA9IChkICsgdGhpcy5fZCkgfCAwXG4gIHRoaXMuX2UgPSAoZSArIHRoaXMuX2UpIHwgMFxufVxuXG5TaGExLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBuZXcgQnVmZmVyKDIwKVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EgfCAwLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iIHwgMCwgNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYyB8IDAsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QgfCAwLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSB8IDAsIDE2KVxuXG4gIHJldHVybiBIXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2hhMVxuIiwiLyoqXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTI1NiwgYXMgZGVmaW5lZFxuICogaW4gRklQUyAxODAtMlxuICogVmVyc2lvbiAyLjItYmV0YSBDb3B5cmlnaHQgQW5nZWwgTWFyaW4sIFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDkuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBTaGEyNTYgPSByZXF1aXJlKCcuL3NoYTI1NicpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG5cbnZhciBXID0gbmV3IEFycmF5KDY0KVxuXG5mdW5jdGlvbiBTaGEyMjQgKCkge1xuICB0aGlzLmluaXQoKVxuXG4gIHRoaXMuX3cgPSBXIC8vIG5ldyBBcnJheSg2NClcblxuICBIYXNoLmNhbGwodGhpcywgNjQsIDU2KVxufVxuXG5pbmhlcml0cyhTaGEyMjQsIFNoYTI1NilcblxuU2hhMjI0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHhjMTA1OWVkOFxuICB0aGlzLl9iID0gMHgzNjdjZDUwN1xuICB0aGlzLl9jID0gMHgzMDcwZGQxN1xuICB0aGlzLl9kID0gMHhmNzBlNTkzOVxuICB0aGlzLl9lID0gMHhmZmMwMGIzMVxuICB0aGlzLl9mID0gMHg2ODU4MTUxMVxuICB0aGlzLl9nID0gMHg2NGY5OGZhN1xuICB0aGlzLl9oID0gMHhiZWZhNGZhNFxuXG4gIHJldHVybiB0aGlzXG59XG5cblNoYTIyNC5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gbmV3IEJ1ZmZlcigyOClcblxuICBILndyaXRlSW50MzJCRSh0aGlzLl9hLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iLCA0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9jLCA4KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9kLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSwgMTYpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2YsIDIwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9nLCAyNClcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTIyNFxuIiwiLyoqXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTI1NiwgYXMgZGVmaW5lZFxuICogaW4gRklQUyAxODAtMlxuICogVmVyc2lvbiAyLjItYmV0YSBDb3B5cmlnaHQgQW5nZWwgTWFyaW4sIFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDkuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBIYXNoID0gcmVxdWlyZSgnLi9oYXNoJylcblxudmFyIEsgPSBbXG4gIDB4NDI4QTJGOTgsIDB4NzEzNzQ0OTEsIDB4QjVDMEZCQ0YsIDB4RTlCNURCQTUsXG4gIDB4Mzk1NkMyNUIsIDB4NTlGMTExRjEsIDB4OTIzRjgyQTQsIDB4QUIxQzVFRDUsXG4gIDB4RDgwN0FBOTgsIDB4MTI4MzVCMDEsIDB4MjQzMTg1QkUsIDB4NTUwQzdEQzMsXG4gIDB4NzJCRTVENzQsIDB4ODBERUIxRkUsIDB4OUJEQzA2QTcsIDB4QzE5QkYxNzQsXG4gIDB4RTQ5QjY5QzEsIDB4RUZCRTQ3ODYsIDB4MEZDMTlEQzYsIDB4MjQwQ0ExQ0MsXG4gIDB4MkRFOTJDNkYsIDB4NEE3NDg0QUEsIDB4NUNCMEE5REMsIDB4NzZGOTg4REEsXG4gIDB4OTgzRTUxNTIsIDB4QTgzMUM2NkQsIDB4QjAwMzI3QzgsIDB4QkY1OTdGQzcsXG4gIDB4QzZFMDBCRjMsIDB4RDVBNzkxNDcsIDB4MDZDQTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdCNzBBODUsIDB4MkUxQjIxMzgsIDB4NEQyQzZERkMsIDB4NTMzODBEMTMsXG4gIDB4NjUwQTczNTQsIDB4NzY2QTBBQkIsIDB4ODFDMkM5MkUsIDB4OTI3MjJDODUsXG4gIDB4QTJCRkU4QTEsIDB4QTgxQTY2NEIsIDB4QzI0QjhCNzAsIDB4Qzc2QzUxQTMsXG4gIDB4RDE5MkU4MTksIDB4RDY5OTA2MjQsIDB4RjQwRTM1ODUsIDB4MTA2QUEwNzAsXG4gIDB4MTlBNEMxMTYsIDB4MUUzNzZDMDgsIDB4Mjc0ODc3NEMsIDB4MzRCMEJDQjUsXG4gIDB4MzkxQzBDQjMsIDB4NEVEOEFBNEEsIDB4NUI5Q0NBNEYsIDB4NjgyRTZGRjMsXG4gIDB4NzQ4RjgyRUUsIDB4NzhBNTYzNkYsIDB4ODRDODc4MTQsIDB4OENDNzAyMDgsXG4gIDB4OTBCRUZGRkEsIDB4QTQ1MDZDRUIsIDB4QkVGOUEzRjcsIDB4QzY3MTc4RjJcbl1cblxudmFyIFcgPSBuZXcgQXJyYXkoNjQpXG5cbmZ1bmN0aW9uIFNoYTI1NiAoKSB7XG4gIHRoaXMuaW5pdCgpXG5cbiAgdGhpcy5fdyA9IFcgLy8gbmV3IEFycmF5KDY0KVxuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYTI1NiwgSGFzaClcblxuU2hhMjU2LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHg2YTA5ZTY2N1xuICB0aGlzLl9iID0gMHhiYjY3YWU4NVxuICB0aGlzLl9jID0gMHgzYzZlZjM3MlxuICB0aGlzLl9kID0gMHhhNTRmZjUzYVxuICB0aGlzLl9lID0gMHg1MTBlNTI3ZlxuICB0aGlzLl9mID0gMHg5YjA1Njg4Y1xuICB0aGlzLl9nID0gMHgxZjgzZDlhYlxuICB0aGlzLl9oID0gMHg1YmUwY2QxOVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIGNoICh4LCB5LCB6KSB7XG4gIHJldHVybiB6IF4gKHggJiAoeSBeIHopKVxufVxuXG5mdW5jdGlvbiBtYWogKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgfCAoeiAmICh4IHwgeSkpXG59XG5cbmZ1bmN0aW9uIHNpZ21hMCAoeCkge1xuICByZXR1cm4gKHggPj4+IDIgfCB4IDw8IDMwKSBeICh4ID4+PiAxMyB8IHggPDwgMTkpIF4gKHggPj4+IDIyIHwgeCA8PCAxMClcbn1cblxuZnVuY3Rpb24gc2lnbWExICh4KSB7XG4gIHJldHVybiAoeCA+Pj4gNiB8IHggPDwgMjYpIF4gKHggPj4+IDExIHwgeCA8PCAyMSkgXiAoeCA+Pj4gMjUgfCB4IDw8IDcpXG59XG5cbmZ1bmN0aW9uIGdhbW1hMCAoeCkge1xuICByZXR1cm4gKHggPj4+IDcgfCB4IDw8IDI1KSBeICh4ID4+PiAxOCB8IHggPDwgMTQpIF4gKHggPj4+IDMpXG59XG5cbmZ1bmN0aW9uIGdhbW1hMSAoeCkge1xuICByZXR1cm4gKHggPj4+IDE3IHwgeCA8PCAxNSkgXiAoeCA+Pj4gMTkgfCB4IDw8IDEzKSBeICh4ID4+PiAxMClcbn1cblxuU2hhMjU2LnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKE0pIHtcbiAgdmFyIFcgPSB0aGlzLl93XG5cbiAgdmFyIGEgPSB0aGlzLl9hIHwgMFxuICB2YXIgYiA9IHRoaXMuX2IgfCAwXG4gIHZhciBjID0gdGhpcy5fYyB8IDBcbiAgdmFyIGQgPSB0aGlzLl9kIHwgMFxuICB2YXIgZSA9IHRoaXMuX2UgfCAwXG4gIHZhciBmID0gdGhpcy5fZiB8IDBcbiAgdmFyIGcgPSB0aGlzLl9nIHwgMFxuICB2YXIgaCA9IHRoaXMuX2ggfCAwXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSBXW2ldID0gTS5yZWFkSW50MzJCRShpICogNClcbiAgZm9yICg7IGkgPCA2NDsgKytpKSBXW2ldID0gKGdhbW1hMShXW2kgLSAyXSkgKyBXW2kgLSA3XSArIGdhbW1hMChXW2kgLSAxNV0pICsgV1tpIC0gMTZdKSB8IDBcblxuICBmb3IgKHZhciBqID0gMDsgaiA8IDY0OyArK2opIHtcbiAgICB2YXIgVDEgPSAoaCArIHNpZ21hMShlKSArIGNoKGUsIGYsIGcpICsgS1tqXSArIFdbal0pIHwgMFxuICAgIHZhciBUMiA9IChzaWdtYTAoYSkgKyBtYWooYSwgYiwgYykpIHwgMFxuXG4gICAgaCA9IGdcbiAgICBnID0gZlxuICAgIGYgPSBlXG4gICAgZSA9IChkICsgVDEpIHwgMFxuICAgIGQgPSBjXG4gICAgYyA9IGJcbiAgICBiID0gYVxuICAgIGEgPSAoVDEgKyBUMikgfCAwXG4gIH1cblxuICB0aGlzLl9hID0gKGEgKyB0aGlzLl9hKSB8IDBcbiAgdGhpcy5fYiA9IChiICsgdGhpcy5fYikgfCAwXG4gIHRoaXMuX2MgPSAoYyArIHRoaXMuX2MpIHwgMFxuICB0aGlzLl9kID0gKGQgKyB0aGlzLl9kKSB8IDBcbiAgdGhpcy5fZSA9IChlICsgdGhpcy5fZSkgfCAwXG4gIHRoaXMuX2YgPSAoZiArIHRoaXMuX2YpIHwgMFxuICB0aGlzLl9nID0gKGcgKyB0aGlzLl9nKSB8IDBcbiAgdGhpcy5faCA9IChoICsgdGhpcy5faCkgfCAwXG59XG5cblNoYTI1Ni5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gbmV3IEJ1ZmZlcigzMilcblxuICBILndyaXRlSW50MzJCRSh0aGlzLl9hLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iLCA0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9jLCA4KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9kLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSwgMTYpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2YsIDIwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9nLCAyNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5faCwgMjgpXG5cbiAgcmV0dXJuIEhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTaGEyNTZcbiIsInZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBTSEE1MTIgPSByZXF1aXJlKCcuL3NoYTUxMicpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG5cbnZhciBXID0gbmV3IEFycmF5KDE2MClcblxuZnVuY3Rpb24gU2hhMzg0ICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgMTI4LCAxMTIpXG59XG5cbmluaGVyaXRzKFNoYTM4NCwgU0hBNTEyKVxuXG5TaGEzODQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2FoID0gMHhjYmJiOWQ1ZFxuICB0aGlzLl9iaCA9IDB4NjI5YTI5MmFcbiAgdGhpcy5fY2ggPSAweDkxNTkwMTVhXG4gIHRoaXMuX2RoID0gMHgxNTJmZWNkOFxuICB0aGlzLl9laCA9IDB4NjczMzI2NjdcbiAgdGhpcy5fZmggPSAweDhlYjQ0YTg3XG4gIHRoaXMuX2doID0gMHhkYjBjMmUwZFxuICB0aGlzLl9oaCA9IDB4NDdiNTQ4MWRcblxuICB0aGlzLl9hbCA9IDB4YzEwNTllZDhcbiAgdGhpcy5fYmwgPSAweDM2N2NkNTA3XG4gIHRoaXMuX2NsID0gMHgzMDcwZGQxN1xuICB0aGlzLl9kbCA9IDB4ZjcwZTU5MzlcbiAgdGhpcy5fZWwgPSAweGZmYzAwYjMxXG4gIHRoaXMuX2ZsID0gMHg2ODU4MTUxMVxuICB0aGlzLl9nbCA9IDB4NjRmOThmYTdcbiAgdGhpcy5faGwgPSAweGJlZmE0ZmE0XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuU2hhMzg0LnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBuZXcgQnVmZmVyKDQ4KVxuXG4gIGZ1bmN0aW9uIHdyaXRlSW50NjRCRSAoaCwgbCwgb2Zmc2V0KSB7XG4gICAgSC53cml0ZUludDMyQkUoaCwgb2Zmc2V0KVxuICAgIEgud3JpdGVJbnQzMkJFKGwsIG9mZnNldCArIDQpXG4gIH1cblxuICB3cml0ZUludDY0QkUodGhpcy5fYWgsIHRoaXMuX2FsLCAwKVxuICB3cml0ZUludDY0QkUodGhpcy5fYmgsIHRoaXMuX2JsLCA4KVxuICB3cml0ZUludDY0QkUodGhpcy5fY2gsIHRoaXMuX2NsLCAxNilcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2RoLCB0aGlzLl9kbCwgMjQpXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9laCwgdGhpcy5fZWwsIDMyKVxuICB3cml0ZUludDY0QkUodGhpcy5fZmgsIHRoaXMuX2ZsLCA0MClcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTM4NFxuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKVxuXG52YXIgSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiwgMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCxcbiAgMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiwgMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyxcbiAgMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSxcbiAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCxcbiAgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwgMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSxcbiAgMHgyNDMxODViZSwgMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywgMHhkNWZmYjRlMixcbiAgMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiwgMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSxcbiAgMHg5YmRjMDZhNywgMHgyNWM3MTIzNSwgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCxcbiAgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMyxcbiAgMHgwZmMxOWRjNiwgMHg4YjhjZDViNSwgMHgyNDBjYTFjYywgMHg3N2FjOWM2NSxcbiAgMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSwgMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyxcbiAgMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwgMHg4MzExNTNiNSxcbiAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCxcbiAgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwgMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCxcbiAgMHhjNmUwMGJmMywgMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywgMHg5MzBhYTcyNSxcbiAgMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiwgMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCxcbiAgMHgyN2I3MGE4NSwgMHg0NmQyMmZmYywgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNixcbiAgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZixcbiAgMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSwgMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCxcbiAgMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiwgMHg5MjcyMmM4NSwgMHgxNDgyMzUzYixcbiAgMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwgMHhiYzQyMzAwMSxcbiAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCxcbiAgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwgMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCxcbiAgMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCxcbiAgMHgxOWE0YzExNiwgMHhiOGQyZDBjOCwgMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyxcbiAgMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSwgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCxcbiAgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYixcbiAgMHg1YjljY2E0ZiwgMHg3NzYzZTM3MywgMHg2ODJlNmZmMywgMHhkNmIyYjhhMyxcbiAgMHg3NDhmODJlZSwgMHg1ZGVmYjJmYywgMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCxcbiAgMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyxcbiAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSxcbiAgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwgMHhjNjcxNzhmMiwgMHhlMzcyNTMyYixcbiAgMHhjYTI3M2VjZSwgMHhlYTI2NjE5YywgMHhkMTg2YjhjNywgMHgyMWMwYzIwNyxcbiAgMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSwgMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCxcbiAgMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSwgMHgwYTYzN2RjNSwgMHhhMmM4OThhNixcbiAgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYixcbiAgMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCwgMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyxcbiAgMHgzYzllYmUwYSwgMHgxNWM5YmViYywgMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyxcbiAgMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywgMHhmYzY1N2UyYSxcbiAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxN1xuXVxuXG52YXIgVyA9IG5ldyBBcnJheSgxNjApXG5cbmZ1bmN0aW9uIFNoYTUxMiAoKSB7XG4gIHRoaXMuaW5pdCgpXG4gIHRoaXMuX3cgPSBXXG5cbiAgSGFzaC5jYWxsKHRoaXMsIDEyOCwgMTEyKVxufVxuXG5pbmhlcml0cyhTaGE1MTIsIEhhc2gpXG5cblNoYTUxMi5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fYWggPSAweDZhMDllNjY3XG4gIHRoaXMuX2JoID0gMHhiYjY3YWU4NVxuICB0aGlzLl9jaCA9IDB4M2M2ZWYzNzJcbiAgdGhpcy5fZGggPSAweGE1NGZmNTNhXG4gIHRoaXMuX2VoID0gMHg1MTBlNTI3ZlxuICB0aGlzLl9maCA9IDB4OWIwNTY4OGNcbiAgdGhpcy5fZ2ggPSAweDFmODNkOWFiXG4gIHRoaXMuX2hoID0gMHg1YmUwY2QxOVxuXG4gIHRoaXMuX2FsID0gMHhmM2JjYzkwOFxuICB0aGlzLl9ibCA9IDB4ODRjYWE3M2JcbiAgdGhpcy5fY2wgPSAweGZlOTRmODJiXG4gIHRoaXMuX2RsID0gMHg1ZjFkMzZmMVxuICB0aGlzLl9lbCA9IDB4YWRlNjgyZDFcbiAgdGhpcy5fZmwgPSAweDJiM2U2YzFmXG4gIHRoaXMuX2dsID0gMHhmYjQxYmQ2YlxuICB0aGlzLl9obCA9IDB4MTM3ZTIxNzlcblxuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiBDaCAoeCwgeSwgeikge1xuICByZXR1cm4geiBeICh4ICYgKHkgXiB6KSlcbn1cblxuZnVuY3Rpb24gbWFqICh4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIHwgKHogJiAoeCB8IHkpKVxufVxuXG5mdW5jdGlvbiBzaWdtYTAgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMjggfCB4bCA8PCA0KSBeICh4bCA+Pj4gMiB8IHggPDwgMzApIF4gKHhsID4+PiA3IHwgeCA8PCAyNSlcbn1cblxuZnVuY3Rpb24gc2lnbWExICh4LCB4bCkge1xuICByZXR1cm4gKHggPj4+IDE0IHwgeGwgPDwgMTgpIF4gKHggPj4+IDE4IHwgeGwgPDwgMTQpIF4gKHhsID4+PiA5IHwgeCA8PCAyMylcbn1cblxuZnVuY3Rpb24gR2FtbWEwICh4LCB4bCkge1xuICByZXR1cm4gKHggPj4+IDEgfCB4bCA8PCAzMSkgXiAoeCA+Pj4gOCB8IHhsIDw8IDI0KSBeICh4ID4+PiA3KVxufVxuXG5mdW5jdGlvbiBHYW1tYTBsICh4LCB4bCkge1xuICByZXR1cm4gKHggPj4+IDEgfCB4bCA8PCAzMSkgXiAoeCA+Pj4gOCB8IHhsIDw8IDI0KSBeICh4ID4+PiA3IHwgeGwgPDwgMjUpXG59XG5cbmZ1bmN0aW9uIEdhbW1hMSAoeCwgeGwpIHtcbiAgcmV0dXJuICh4ID4+PiAxOSB8IHhsIDw8IDEzKSBeICh4bCA+Pj4gMjkgfCB4IDw8IDMpIF4gKHggPj4+IDYpXG59XG5cbmZ1bmN0aW9uIEdhbW1hMWwgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMTkgfCB4bCA8PCAxMykgXiAoeGwgPj4+IDI5IHwgeCA8PCAzKSBeICh4ID4+PiA2IHwgeGwgPDwgMjYpXG59XG5cbmZ1bmN0aW9uIGdldENhcnJ5IChhLCBiKSB7XG4gIHJldHVybiAoYSA+Pj4gMCkgPCAoYiA+Pj4gMCkgPyAxIDogMFxufVxuXG5TaGE1MTIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoTSkge1xuICB2YXIgVyA9IHRoaXMuX3dcblxuICB2YXIgYWggPSB0aGlzLl9haCB8IDBcbiAgdmFyIGJoID0gdGhpcy5fYmggfCAwXG4gIHZhciBjaCA9IHRoaXMuX2NoIHwgMFxuICB2YXIgZGggPSB0aGlzLl9kaCB8IDBcbiAgdmFyIGVoID0gdGhpcy5fZWggfCAwXG4gIHZhciBmaCA9IHRoaXMuX2ZoIHwgMFxuICB2YXIgZ2ggPSB0aGlzLl9naCB8IDBcbiAgdmFyIGhoID0gdGhpcy5faGggfCAwXG5cbiAgdmFyIGFsID0gdGhpcy5fYWwgfCAwXG4gIHZhciBibCA9IHRoaXMuX2JsIHwgMFxuICB2YXIgY2wgPSB0aGlzLl9jbCB8IDBcbiAgdmFyIGRsID0gdGhpcy5fZGwgfCAwXG4gIHZhciBlbCA9IHRoaXMuX2VsIHwgMFxuICB2YXIgZmwgPSB0aGlzLl9mbCB8IDBcbiAgdmFyIGdsID0gdGhpcy5fZ2wgfCAwXG4gIHZhciBobCA9IHRoaXMuX2hsIHwgMFxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkgKz0gMikge1xuICAgIFdbaV0gPSBNLnJlYWRJbnQzMkJFKGkgKiA0KVxuICAgIFdbaSArIDFdID0gTS5yZWFkSW50MzJCRShpICogNCArIDQpXG4gIH1cbiAgZm9yICg7IGkgPCAxNjA7IGkgKz0gMikge1xuICAgIHZhciB4aCA9IFdbaSAtIDE1ICogMl1cbiAgICB2YXIgeGwgPSBXW2kgLSAxNSAqIDIgKyAxXVxuICAgIHZhciBnYW1tYTAgPSBHYW1tYTAoeGgsIHhsKVxuICAgIHZhciBnYW1tYTBsID0gR2FtbWEwbCh4bCwgeGgpXG5cbiAgICB4aCA9IFdbaSAtIDIgKiAyXVxuICAgIHhsID0gV1tpIC0gMiAqIDIgKyAxXVxuICAgIHZhciBnYW1tYTEgPSBHYW1tYTEoeGgsIHhsKVxuICAgIHZhciBnYW1tYTFsID0gR2FtbWExbCh4bCwgeGgpXG5cbiAgICAvLyBXW2ldID0gZ2FtbWEwICsgV1tpIC0gN10gKyBnYW1tYTEgKyBXW2kgLSAxNl1cbiAgICB2YXIgV2k3aCA9IFdbaSAtIDcgKiAyXVxuICAgIHZhciBXaTdsID0gV1tpIC0gNyAqIDIgKyAxXVxuXG4gICAgdmFyIFdpMTZoID0gV1tpIC0gMTYgKiAyXVxuICAgIHZhciBXaTE2bCA9IFdbaSAtIDE2ICogMiArIDFdXG5cbiAgICB2YXIgV2lsID0gKGdhbW1hMGwgKyBXaTdsKSB8IDBcbiAgICB2YXIgV2loID0gKGdhbW1hMCArIFdpN2ggKyBnZXRDYXJyeShXaWwsIGdhbW1hMGwpKSB8IDBcbiAgICBXaWwgPSAoV2lsICsgZ2FtbWExbCkgfCAwXG4gICAgV2loID0gKFdpaCArIGdhbW1hMSArIGdldENhcnJ5KFdpbCwgZ2FtbWExbCkpIHwgMFxuICAgIFdpbCA9IChXaWwgKyBXaTE2bCkgfCAwXG4gICAgV2loID0gKFdpaCArIFdpMTZoICsgZ2V0Q2FycnkoV2lsLCBXaTE2bCkpIHwgMFxuXG4gICAgV1tpXSA9IFdpaFxuICAgIFdbaSArIDFdID0gV2lsXG4gIH1cblxuICBmb3IgKHZhciBqID0gMDsgaiA8IDE2MDsgaiArPSAyKSB7XG4gICAgV2loID0gV1tqXVxuICAgIFdpbCA9IFdbaiArIDFdXG5cbiAgICB2YXIgbWFqaCA9IG1haihhaCwgYmgsIGNoKVxuICAgIHZhciBtYWpsID0gbWFqKGFsLCBibCwgY2wpXG5cbiAgICB2YXIgc2lnbWEwaCA9IHNpZ21hMChhaCwgYWwpXG4gICAgdmFyIHNpZ21hMGwgPSBzaWdtYTAoYWwsIGFoKVxuICAgIHZhciBzaWdtYTFoID0gc2lnbWExKGVoLCBlbClcbiAgICB2YXIgc2lnbWExbCA9IHNpZ21hMShlbCwgZWgpXG5cbiAgICAvLyB0MSA9IGggKyBzaWdtYTEgKyBjaCArIEtbal0gKyBXW2pdXG4gICAgdmFyIEtpaCA9IEtbal1cbiAgICB2YXIgS2lsID0gS1tqICsgMV1cblxuICAgIHZhciBjaGggPSBDaChlaCwgZmgsIGdoKVxuICAgIHZhciBjaGwgPSBDaChlbCwgZmwsIGdsKVxuXG4gICAgdmFyIHQxbCA9IChobCArIHNpZ21hMWwpIHwgMFxuICAgIHZhciB0MWggPSAoaGggKyBzaWdtYTFoICsgZ2V0Q2FycnkodDFsLCBobCkpIHwgMFxuICAgIHQxbCA9ICh0MWwgKyBjaGwpIHwgMFxuICAgIHQxaCA9ICh0MWggKyBjaGggKyBnZXRDYXJyeSh0MWwsIGNobCkpIHwgMFxuICAgIHQxbCA9ICh0MWwgKyBLaWwpIHwgMFxuICAgIHQxaCA9ICh0MWggKyBLaWggKyBnZXRDYXJyeSh0MWwsIEtpbCkpIHwgMFxuICAgIHQxbCA9ICh0MWwgKyBXaWwpIHwgMFxuICAgIHQxaCA9ICh0MWggKyBXaWggKyBnZXRDYXJyeSh0MWwsIFdpbCkpIHwgMFxuXG4gICAgLy8gdDIgPSBzaWdtYTAgKyBtYWpcbiAgICB2YXIgdDJsID0gKHNpZ21hMGwgKyBtYWpsKSB8IDBcbiAgICB2YXIgdDJoID0gKHNpZ21hMGggKyBtYWpoICsgZ2V0Q2FycnkodDJsLCBzaWdtYTBsKSkgfCAwXG5cbiAgICBoaCA9IGdoXG4gICAgaGwgPSBnbFxuICAgIGdoID0gZmhcbiAgICBnbCA9IGZsXG4gICAgZmggPSBlaFxuICAgIGZsID0gZWxcbiAgICBlbCA9IChkbCArIHQxbCkgfCAwXG4gICAgZWggPSAoZGggKyB0MWggKyBnZXRDYXJyeShlbCwgZGwpKSB8IDBcbiAgICBkaCA9IGNoXG4gICAgZGwgPSBjbFxuICAgIGNoID0gYmhcbiAgICBjbCA9IGJsXG4gICAgYmggPSBhaFxuICAgIGJsID0gYWxcbiAgICBhbCA9ICh0MWwgKyB0MmwpIHwgMFxuICAgIGFoID0gKHQxaCArIHQyaCArIGdldENhcnJ5KGFsLCB0MWwpKSB8IDBcbiAgfVxuXG4gIHRoaXMuX2FsID0gKHRoaXMuX2FsICsgYWwpIHwgMFxuICB0aGlzLl9ibCA9ICh0aGlzLl9ibCArIGJsKSB8IDBcbiAgdGhpcy5fY2wgPSAodGhpcy5fY2wgKyBjbCkgfCAwXG4gIHRoaXMuX2RsID0gKHRoaXMuX2RsICsgZGwpIHwgMFxuICB0aGlzLl9lbCA9ICh0aGlzLl9lbCArIGVsKSB8IDBcbiAgdGhpcy5fZmwgPSAodGhpcy5fZmwgKyBmbCkgfCAwXG4gIHRoaXMuX2dsID0gKHRoaXMuX2dsICsgZ2wpIHwgMFxuICB0aGlzLl9obCA9ICh0aGlzLl9obCArIGhsKSB8IDBcblxuICB0aGlzLl9haCA9ICh0aGlzLl9haCArIGFoICsgZ2V0Q2FycnkodGhpcy5fYWwsIGFsKSkgfCAwXG4gIHRoaXMuX2JoID0gKHRoaXMuX2JoICsgYmggKyBnZXRDYXJyeSh0aGlzLl9ibCwgYmwpKSB8IDBcbiAgdGhpcy5fY2ggPSAodGhpcy5fY2ggKyBjaCArIGdldENhcnJ5KHRoaXMuX2NsLCBjbCkpIHwgMFxuICB0aGlzLl9kaCA9ICh0aGlzLl9kaCArIGRoICsgZ2V0Q2FycnkodGhpcy5fZGwsIGRsKSkgfCAwXG4gIHRoaXMuX2VoID0gKHRoaXMuX2VoICsgZWggKyBnZXRDYXJyeSh0aGlzLl9lbCwgZWwpKSB8IDBcbiAgdGhpcy5fZmggPSAodGhpcy5fZmggKyBmaCArIGdldENhcnJ5KHRoaXMuX2ZsLCBmbCkpIHwgMFxuICB0aGlzLl9naCA9ICh0aGlzLl9naCArIGdoICsgZ2V0Q2FycnkodGhpcy5fZ2wsIGdsKSkgfCAwXG4gIHRoaXMuX2hoID0gKHRoaXMuX2hoICsgaGggKyBnZXRDYXJyeSh0aGlzLl9obCwgaGwpKSB8IDBcbn1cblxuU2hhNTEyLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBuZXcgQnVmZmVyKDY0KVxuXG4gIGZ1bmN0aW9uIHdyaXRlSW50NjRCRSAoaCwgbCwgb2Zmc2V0KSB7XG4gICAgSC53cml0ZUludDMyQkUoaCwgb2Zmc2V0KVxuICAgIEgud3JpdGVJbnQzMkJFKGwsIG9mZnNldCArIDQpXG4gIH1cblxuICB3cml0ZUludDY0QkUodGhpcy5fYWgsIHRoaXMuX2FsLCAwKVxuICB3cml0ZUludDY0QkUodGhpcy5fYmgsIHRoaXMuX2JsLCA4KVxuICB3cml0ZUludDY0QkUodGhpcy5fY2gsIHRoaXMuX2NsLCAxNilcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2RoLCB0aGlzLl9kbCwgMjQpXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9laCwgdGhpcy5fZWwsIDMyKVxuICB3cml0ZUludDY0QkUodGhpcy5fZmgsIHRoaXMuX2ZsLCA0MClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2doLCB0aGlzLl9nbCwgNDgpXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9oaCwgdGhpcy5faGwsIDU2KVxuXG4gIHJldHVybiBIXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2hhNTEyXG4iLCJcbnZhciBzb2RpdW0gPSByZXF1aXJlKCdsaWJzb2RpdW0td3JhcHBlcnMnKVxuXG5mdW5jdGlvbiBJKGIpIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihiKSA/IG5ldyBVaW50OEFycmF5KGIpIDogYlxufVxuXG5mdW5jdGlvbiBCKGIpIHtcbiAgcmV0dXJuIChiIGluc3RhbmNlb2YgVWludDhBcnJheSkgPyBuZXcgQnVmZmVyKGIpIDogYlxufVxuXG5mdW5jdGlvbiBidWZmZXJpemUoZm4pIHtcbiAgaWYoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGZuKVxuICAgIHRocm93IG5ldyBFcnJvcignbm90IGEgZnVuY3Rpb24nKVxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW10ubWFwLmNhbGwoYXJndW1lbnRzLCBJKVxuICAgIHZhciByID0gIEIoZm4uYXBwbHkodGhpcywgYXJncykpXG4gICAgcmV0dXJuIHJcbiAgfVxufVxuXG5mdW5jdGlvbiBrZXlzIChrKSB7XG4gIHJldHVybiB7XG4gICAgcHVibGljS2V5OiBCKGsucHVibGljS2V5KSxcbiAgICBzZWNyZXRLZXk6IEIoay5zZWNyZXRLZXkgfHwgay5wcml2YXRlS2V5KVxuICB9XG59XG5cbmV4cG9ydHMuY3J5cHRvX3NpZ25fc2VlZF9rZXlwYWlyID0gZnVuY3Rpb24gKHNlZWQpIHtcbiAgcmV0dXJuIGtleXMoc29kaXVtLmNyeXB0b19zaWduX3NlZWRfa2V5cGFpcihJKHNlZWQpKSlcbn1cblxuZXhwb3J0cy5jcnlwdG9fc2lnbl9rZXlwYWlyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4ga2V5cyhzb2RpdW0uY3J5cHRvX3NpZ25fa2V5cGFpcigpKVxufVxuXG5leHBvcnRzLmNyeXB0b19ib3hfa2V5cGFpciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGtleXMoc29kaXVtLmNyeXB0b19ib3hfa2V5cGFpcigpKVxufVxuXG47W1xuICAnc2lnbl92ZXJpZnlfZGV0YWNoZWQnLFxuICAnc2lnbl9kZXRhY2hlZCcsXG4gICdzaWduJyxcbiAgJ3NpZ25fb3BlbicsXG4gICdzaWduX2VkMjU1MTlfcGtfdG9fY3VydmUyNTUxOScsXG4gICdzaWduX2VkMjU1MTlfc2tfdG9fY3VydmUyNTUxOScsXG4gICdzY2FsYXJtdWx0JyxcbiAgJ3NlY3JldGJveF9lYXN5JyxcbiAgJ3NlY3JldGJveF9vcGVuX2Vhc3knLFxuICAnYm94X2Vhc3knLFxuICAnYm94X29wZW5fZWFzeScsXG4gICdhdXRoJyxcbiAgJ2F1dGhfdmVyaWZ5JyxcbiAgJ2hhc2gnXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYobmFtZSA9PT0gJ2F1dGhfdmVyaWZ5Jykge1xuICAgIC8vdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBzaWduX3ZlcmlmeSEhXG4gICAgdmFyIGZuID0gYnVmZmVyaXplKHNvZGl1bS5jcnlwdG9fYXV0aF92ZXJpZnkpXG4gICAgZXhwb3J0c1snY3J5cHRvXycrbmFtZV0gPSBmdW5jdGlvbiAobXNnLCB0b2ssIGtleSkgeyByZXR1cm4gZm4obXNnLCB0b2ssIGtleSkgPyAwIDogMSB9XG4gIH1cbiAgZWxzZVxuICAgIGV4cG9ydHNbJ2NyeXB0b18nK25hbWVdID0gYnVmZmVyaXplKHNvZGl1bVsnY3J5cHRvXycrbmFtZV0pXG59KVxuXG52YXIgU2hhMjU2ID0gcmVxdWlyZSgnc2hhLmpzL3NoYTI1NicpXG5leHBvcnRzLmNyeXB0b19oYXNoX3NoYTI1NiA9IGZ1bmN0aW9uIChtc2cpIHtcbiAgcmV0dXJuIG5ldyBTaGEyNTYoKS51cGRhdGUobXNnKS5kaWdlc3QoKVxufVxuXG5mdW5jdGlvbiBudWxsSWZUaHJldyAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB0cnkgeyByZXR1cm4gZm4uYXBwbHkodGhpcywgW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKSB9XG4gICAgY2F0Y2ggKGVycikgeyByZXR1cm4gbnVsbCB9XG4gIH1cbn1cblxuZXhwb3J0cy5jcnlwdG9fc2VjcmV0Ym94X29wZW5fZWFzeSA9IG51bGxJZlRocmV3KGV4cG9ydHMuY3J5cHRvX3NlY3JldGJveF9vcGVuX2Vhc3kpXG5leHBvcnRzLmNyeXB0b19ib3hfb3Blbl9lYXN5ID0gbnVsbElmVGhyZXcoZXhwb3J0cy5jcnlwdG9fYm94X29wZW5fZWFzeSlcblxuIiwiXG4vL29ubHkgZXhwb3J0cyBicm93c2VyIGFwaS4gdXNlIGNobG9yaWRlIG1vZHVsZVxuLy90byBnZXQgYXV0b21hdGljIGZhbGxiYWNrcyFcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9icm93c2VyJylcbiIsIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcGxpdCAoZGF0YSwgbWF4KSB7XG5cbiAgaWYobWF4IDw9IDApIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwbGl0IGludG8gemVybyAob3Igc21hbGxlcikgbGVuZ3RoIGJ1ZmZlcnMnKVxuXG4gIGlmKGRhdGEubGVuZ3RoIDw9IG1heClcbiAgICByZXR1cm4gW2RhdGFdXG4gIHZhciBvdXQgPSBbXSwgbGVuID0gMFxuXG4gIHdoaWxlKGxlbiA8IGRhdGEubGVuZ3RoKSB7XG4gICAgb3V0LnB1c2goZGF0YS5zbGljZShsZW4sIE1hdGgubWluKGxlbiArIG1heCwgZGF0YS5sZW5ndGgpKSlcbiAgICBsZW4gKz0gbWF4XG4gIH1cblxuICByZXR1cm4gb3V0XG59XG5cbiIsInZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG52YXIgaG9tZSA9IHJlcXVpcmUoJ29zZW52JykuaG9tZVxudmFyIG5vblByaXZhdGUgPSByZXF1aXJlKCdub24tcHJpdmF0ZS1pcCcpXG52YXIgbWVyZ2UgPSByZXF1aXJlKCdkZWVwLWV4dGVuZCcpXG5cbnZhciBSQyA9IHJlcXVpcmUoJ3JjJylcblxudmFyIFNFQyA9IDFlM1xudmFyIE1JTiA9IDYwKlNFQ1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lLCBvdmVycmlkZSkge1xuICBuYW1lID0gbmFtZSB8fCAnc3NiJ1xuICByZXR1cm4gUkMobmFtZSB8fCAnc3NiJywgbWVyZ2Uoe1xuICAgIC8vanVzdCB1c2UgYW4gaXB2NCBhZGRyZXNzIGJ5IGRlZmF1bHQuXG4gICAgLy90aGVyZSBoYXZlIGJlZW4gc29tZSByZXBvcnRzIG9mIHNlZW1pbmdseSBub24tcHJpdmF0ZVxuICAgIC8vaXB2NiBhZGRyZXNzZXMgYmVpbmcgcmV0dXJuZWQgYW5kIG5vdCB3b3JraW5nLlxuICAgIC8vaHR0cHM6Ly9naXRodWIuY29tL3NzYmMvc2N1dHRsZWJvdC9wdWxsLzEwMlxuICAgIHBhcnR5OiB0cnVlLFxuICAgIGhvc3Q6IG5vblByaXZhdGUudjQgfHwgJycsXG4gICAgcG9ydDogODAwOCxcbiAgICB0aW1lb3V0OiAwLFxuICAgIHB1YjogdHJ1ZSxcbiAgICBsb2NhbDogdHJ1ZSxcbiAgICBmcmllbmRzOiB7XG4gICAgICBkdW5iYXI6IDE1MCxcbiAgICAgIGhvcHM6IDNcbiAgICB9LFxuICAgIGdvc3NpcDoge1xuICAgICAgY29ubmVjdGlvbnM6IDNcbiAgICB9LFxuICAgIHBhdGg6IHBhdGguam9pbihob21lKCksICcuJyArIG5hbWUpLFxuICAgIHRpbWVyczoge1xuICAgICAgY29ubmVjdGlvbjogMCxcbiAgICAgIHJlY29ubmVjdDogNSpTRUMsXG4gICAgICBwaW5nOiA1Kk1JTixcbiAgICAgIGhhbmRzaGFrZTogNSpTRUNcbiAgICB9LFxuICAgIHBhdGg6IHBhdGguam9pbihob21lKCksICcuJyArIG5hbWUpLFxuICAgIG1hc3RlcjogW10sXG4gICAgbG9nZ2luZzogeyBsZXZlbDogJ25vdGljZScgfSxcbiAgICBwYXJ0eTogdHJ1ZSAvL2Rpc2FibGUgcXVvdGFzXG4gIH0sIG92ZXJyaWRlIHx8IHt9KSlcbn1cblxuXG5cblxuIiwidmFyIGNvbnQgPSByZXF1aXJlKCdjb250JylcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJylcblxudmFyIHNzYktleXMgPSByZXF1aXJlKCdzc2Ita2V5cycpXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGYpIHtcbiAgcmV0dXJuICdmdW5jdGlvbicgPT09IHR5cGVvZiBmXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0IChvKSB7XG4gIHJldHVybiAoXG4gICAgbyAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG9cbiAgICAmJiAhQnVmZmVyLmlzQnVmZmVyKG8pXG4gICAgJiYgIUFycmF5LmlzQXJyYXkobylcbiAgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzc2IsIGtleXMpIHtcblxuICBpZighc3NiLmFkZClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJyptdXN0KiBpbnN0YWxsIGZlZWRzIG9uIHRoaXMgc3NiIGluc3RhbmNlJylcblxuICBmdW5jdGlvbiBnZXRQcmV2KG5leHQpIHtcbiAgICBzc2IuZ2V0TGF0ZXN0KGtleXMuaWQsIG5leHQpXG4gIH1cbiAgZnVuY3Rpb24gbm9vcCAoZXJyKSB7XG4gICAgaWYgKGVycikgdGhyb3cgZXJyXG4gIH1cblxuICB2YXIgcXVldWUgPSBudWxsXG4gIHZhciBwcmV2ID0gbnVsbFxuICB2YXIgd3JpdGluZyA9IGZhbHNlXG4gIHZhciBwdWJsaXNoID1cbiAgICBjb250KGZ1bmN0aW9uICh0eXBlLCBtZXNzYWdlLCBjYikge1xuICAgICAgLy8gYXJndW1lbnQgdmFyaWF0aW9uc1xuICAgICAgaWYgKGlzRnVuY3Rpb24obWVzc2FnZSkpICAgIHsgY2IgPSBtZXNzYWdlOyBtZXNzYWdlID0gdHlwZSB9IC8vIGFkZChtc2dPYmosIGNiRm4pXG4gICAgICBlbHNlIGlmIChpc09iamVjdChtZXNzYWdlKSkgeyBtZXNzYWdlLnR5cGUgPSB0eXBlIH0gLy8gYWRkKHR5cGVTdHIsIG1nT2JqLCBjYkZuKVxuICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHsgbWVzc2FnZSA9IHsgdHlwZTogdHlwZSwgdmFsdWU6IG1lc3NhZ2UgfSB9IC8vIGFkZCh0eXBlU3RyLCBtc2dTdHIsIGNiRm4pXG5cbiAgICAgIHZhciBlcnIgPSB1dGlsLmlzSW52YWxpZENvbnRlbnQobWVzc2FnZSlcbiAgICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcblxuICAgICAgcmV0dXJuIHNzYi5hZGQucXVldWUoa2V5cy5pZCwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHV0aWwuY3JlYXRlKGtleXMsIG51bGwsIG1lc3NhZ2UsIHZhbHVlLCBrZXkpXG4gICAgICB9LCBjYilcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9KVxuXG4gIHJldHVybiB7XG4gICAgaWQ6IGtleXMuaWQsXG4gICAga2V5czoga2V5cyxcbiAgICBhZGQ6IHB1Ymxpc2gsXG4gICAgcHVibGlzaDogcHVibGlzaFxuICB9XG59XG5cblxuIiwidmFyIHNzYktleXMgPSByZXF1aXJlKCdzc2Ita2V5cycpXG52YXIgdGltZXN0YW1wID0gcmVxdWlyZSgnbW9ub3RvbmljLXRpbWVzdGFtcCcpXG52YXIgaXNSZWYgPSByZXF1aXJlKCdzc2ItcmVmJylcbnZhciBpc0hhc2ggPSBpc1JlZi5pc0hhc2hcbnZhciBpc0ZlZWRJZCA9IGlzUmVmLmlzRmVlZElkXG5cbnZhciBlbmNvZGUgPSBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMilcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcgKHMpIHtcbiAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2Ygc1xufVxuXG5mdW5jdGlvbiBpc0ludGVnZXIgKG4pIHtcbiAgcmV0dXJuIH5+biA9PT0gblxufVxuXG5mdW5jdGlvbiBpc09iamVjdCAobykge1xuICByZXR1cm4gbyAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG9cbn1cblxuZnVuY3Rpb24gY2xvbmUgKG9iaikge1xuICB2YXIgbyA9IHt9XG4gIGZvcih2YXIgayBpbiBvYmopIG9ba10gPSBvYmpba107XG4gIHJldHVybiBvXG59XG5cbmZ1bmN0aW9uIGlzRW5jcnlwdGVkIChzdHIpIHtcbiAgcmV0dXJuIGlzU3RyaW5nKHN0cikgJiYgL15bMC05QS1aYS16XFwvK10rPXswLDJ9XFwuYm94Ly50ZXN0KHN0cilcbn1cblxuZXhwb3J0cy5CYXRjaFF1ZXVlID0gZnVuY3Rpb24gQmF0Y2hRdWV1ZSAoZGIpIHtcblxuICB2YXIgYmF0Y2ggPSBbXSwgd3JpdGluZyA9IGZhbHNlXG5cbiAgZnVuY3Rpb24gZHJhaW4gKCkge1xuICAgIHdyaXRpbmcgPSB0cnVlXG4gICAgdmFyIF9iYXRjaCA9IGJhdGNoXG4gICAgYmF0Y2ggPSBbXVxuXG4gICAgZGIuYmF0Y2goX2JhdGNoLCBmdW5jdGlvbiAoKSB7XG4gICAgICB3cml0aW5nID0gZmFsc2VcbiAgICAgIHdyaXRlLnNpemUgPSBiYXRjaC5sZW5ndGhcbiAgICAgIGlmKGJhdGNoLmxlbmd0aCkgZHJhaW4oKVxuICAgICAgX2JhdGNoLmZvckVhY2goZnVuY3Rpb24gKG9wKSB7XG4gICAgICAgIG9wLmNiKG51bGwsIHtrZXk6b3Aua2V5LCB2YWx1ZTogb3AudmFsdWV9KVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGUgKG9wKSB7XG4gICAgYmF0Y2gucHVzaChvcClcbiAgICB3cml0ZS5zaXplID0gYmF0Y2gubGVuZ3RoXG4gICAgaWYoIXdyaXRpbmcpIGRyYWluKClcbiAgfVxuXG4gIHdyaXRlLnNpemUgPSAwXG5cbiAgcmV0dXJuIHdyaXRlXG59XG5cbmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24gKGtleXMsIHR5cGUsIGNvbnRlbnQsIHByZXYsIHByZXZfa2V5KSB7XG5cbiAgLy90aGlzIG5vaXNlIGlzIHRvIGhhbmRsZSB0aGluZ3MgY2FsbGluZyB0aGlzIHdpdGggbGVnYWN5IGFwaS5cbiAgaWYoaXNTdHJpbmcodHlwZSkgJiYgKEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50KSB8fCBpc1N0cmluZyhjb250ZW50KSkpXG4gICAgY29udGVudCA9IHt0eXBlOiB0eXBlLCB2YWx1ZTogY29udGVudH1cbiAgaWYoaXNPYmplY3QoY29udGVudCkpXG4gICAgY29udGVudC50eXBlID0gY29udGVudC50eXBlIHx8IHR5cGVcbiAgLy9ub2lzZSBlbmRcblxuICBwcmV2X2tleSA9ICFwcmV2X2tleSAmJiBwcmV2ID8gKCclJytzc2JLZXlzLmhhc2goZW5jb2RlKHByZXYpKSkgOiBwcmV2X2tleSB8fCBudWxsXG5cbiAgcmV0dXJuIHNzYktleXMuc2lnbk9iaihrZXlzLCB7XG4gICAgcHJldmlvdXM6IHByZXZfa2V5LFxuICAgIGF1dGhvcjoga2V5cy5pZCxcbiAgICBzZXF1ZW5jZTogcHJldiA/IHByZXYuc2VxdWVuY2UgKyAxIDogMSxcbiAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCgpLFxuICAgIGhhc2g6ICdzaGEyNTYnLFxuICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gIH0pXG59XG5cbnZhciBpc0ludmFsaWRDb250ZW50ID0gZXhwb3J0cy5pc0ludmFsaWRDb250ZW50ID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgaWYoIWlzRW5jcnlwdGVkKGNvbnRlbnQpKSB7XG5cbiAgICB0eXBlID0gY29udGVudC50eXBlXG5cbiAgICBpZiAoIShpc1N0cmluZyh0eXBlKSAmJiB0eXBlLmxlbmd0aCA8PSA1MiAmJiB0eXBlLmxlbmd0aCA+PSAzKSkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcigndHlwZSBtdXN0IGJlIGEgc3RyaW5nJyArXG4gICAgICAgICczIDw9IHR5cGUubGVuZ3RoIDwgNTIsIHdhczonICsgdHlwZVxuICAgICAgKVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0cy5pc0ludmFsaWRTaGFwZSA9IGZ1bmN0aW9uIChtc2cpIHtcbiAgaWYoXG4gICAgIWlzT2JqZWN0KG1zZykgfHxcbiAgICAhaXNJbnRlZ2VyKG1zZy5zZXF1ZW5jZSkgfHxcbiAgICAhaXNGZWVkSWQobXNnLmF1dGhvcikgfHxcbiAgICAhKGlzT2JqZWN0KG1zZy5jb250ZW50KSB8fCBpc0VuY3J5cHRlZChtc2cuY29udGVudCkpXG4gIClcbiAgICByZXR1cm4gbmV3IEVycm9yKCdtZXNzYWdlIGhhcyBpbnZhbGlkIHByb3BlcnRpZXMnKVxuXG4gIC8vYWxsb3cgZW5jcnlwdGVkIG1lc3NhZ2VzLCB3aGVyZSBjb250ZW50IGlzIGEgYmFzZTY0IHN0cmluZy5cblxuICB2YXIgYXNKc29uID0gZW5jb2RlKG1zZylcbiAgaWYgKGFzSnNvbi5sZW5ndGggPiA4MTkyKSAvLyA4a2JcbiAgICByZXR1cm4gbmV3IEVycm9yKCAnZW5jb2RlZCBtZXNzYWdlIG11c3Qgbm90IGJlIGxhcmdlciB0aGFuIDgxOTIgYnl0ZXMnKVxuXG4gIHJldHVybiBpc0ludmFsaWRDb250ZW50KG1zZy5jb250ZW50KVxufVxuXG5leHBvcnRzLmlzSW52YWxpZCA9IGZ1bmN0aW9uIHZhbGlkYXRlU3luYyAocHViLCBtc2csIHByZXZpb3VzKSB7XG4gIC8vIDpUT0RPOiBpcyB0aGVyZSBhIGZhc3RlciB3YXkgdG8gbWVhc3VyZSB0aGUgc2l6ZSBvZiB0aGlzIG1lc3NhZ2U/XG5cbiAgdmFyIGtleSA9IHByZXZpb3VzLmtleVxuICB2YXIgcHJldiA9IHByZXZpb3VzLnZhbHVlXG5cbiAgaWYocHJldikge1xuICAgIGlmKG1zZy5wcmV2aW91cyAhPT0ga2V5KVxuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgICAgICAnZXhwZWN0ZWQgcHJldmlvdXM6ICdcbiAgICAgICAgKyBrZXlcbiAgICAgICAgKyAnYnV0IGZvdW5kOicgKyBtc2cucHJldmlvdXNcbiAgICAgIClcblxuICAgIGlmKG1zZy5zZXF1ZW5jZSAhPT0gcHJldi5zZXF1ZW5jZSArIDFcbiAgICAgfHwgbXNnLnRpbWVzdGFtcCA8PSBwcmV2LnRpbWVzdGFtcClcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignb3V0IG9mIG9yZGVyJylcbiAgfVxuICBlbHNlIHtcbiAgICBpZighKG1zZy5wcmV2aW91cyA9PSBudWxsXG4gICAgICAmJiBtc2cuc2VxdWVuY2UgPT09IDEgJiYgbXNnLnRpbWVzdGFtcCA+IDApKVxuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdleHBlY3RlZCBpbml0aWFsIG1lc3NhZ2UnKVxuICB9XG5cbiAgaWYobXNnLmF1dGhvciAhPT0gcHViKSB7XG5cbiAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgICAgICAnZXhwZWN0ZWQgZGlmZmVyZW50IGF1dGhvcjonXG4gICAgICArIGhhc2gocHViLnB1YmxpYyB8fCBwdWIpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgKyAnYnV0IGZvdW5kOicgKyBtc2cuYXV0aG9yLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIClcbiAgfVxuXG4gIGlmKCFzc2JLZXlzLnZlcmlmeU9iaihwdWIsIG1zZykpXG4gICAgcmV0dXJuIG5ldyBFcnJvcignc2lnbmF0dXJlIHdhcyBpbnZhbGlkJylcblxuICByZXR1cm4gZmFsc2Vcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzaCA9IHJlcXVpcmUoJ3NzYi1rZXlzJykuaGFzaFxuXG4vLyBtYWtlIGEgdmFsaWRhdGlvbiBzdHJlYW0/XG4vLyByZWFkIHRoZSBsYXRlc3QgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuLy8gY2hlY2sgaXQgYWdhaW5zdCB0aGUgaW5jb21pbmcgZGF0YSxcbi8vIGFuZCB0aGVuIHJlYWQgdGhyb3VnaFxuXG5mdW5jdGlvbiBpc1N0cmluZyAocykge1xuICByZXR1cm4gJ3N0cmluZycgPT09IHR5cGVvZiBzXG59XG5cbmZ1bmN0aW9uIGlzSW50ZWdlciAobikge1xuICByZXR1cm4gfn5uID09PSBuXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0IChvKSB7XG4gIHJldHVybiBvICYmICdvYmplY3QnID09PSB0eXBlb2Ygb1xufVxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG52YXIgZW5jb2RlID0gdXRpbC5lbmNvZGVcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3NiKSB7XG5cbiAgdmFyIHdyaXRlID0gdXRpbC5CYXRjaFF1ZXVlKHNzYilcblxuICBmdW5jdGlvbiBnZXRMYXRlc3QgKGlkLCBjYikge1xuICAgIHNzYi5nZXRMYXRlc3QoaWQsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmKGVycikgcmV0dXJuIGNiKG51bGwsIHtrZXk6IG51bGwsIHZhbHVlOiBudWxsLCB0eXBlOiAncHV0JywgcHVibGljOiBudWxsLCByZWFkeTogdHJ1ZX0pXG4gICAgICBjYihudWxsLCB7XG4gICAgICAgIGtleTogZGF0YS5rZXksIHZhbHVlOiBkYXRhLnZhbHVlLCB0eXBlOiAncHV0JyxcbiAgICAgICAgcHVibGljOiBkYXRhLnZhbHVlICYmIGRhdGEudmFsdWUuYXV0aG9yLCByZWFkeTogdHJ1ZVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdmFyIGxhdGVzdCA9IHt9XG5cbiAgZnVuY3Rpb24gc2V0TGF0ZXN0KGlkKSB7XG4gICAgaWYobGF0ZXN0W2lkXS5yZWFkeSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2V0TGF0ZXN0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlJylcbiAgICBzc2IuZ2V0TGF0ZXN0KGlkLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICBsYXRlc3RbaWRdLnJlYWR5ID0gdHJ1ZVxuICAgICAgaWYoZGF0YSkge1xuICAgICAgICBsYXRlc3RbaWRdLmtleSA9IGRhdGEua2V5XG4gICAgICAgIGxhdGVzdFtpZF0udmFsdWUgPSBkYXRhLnZhbHVlXG4gICAgICB9XG4gICAgICB2YWxpZGF0ZShpZClcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGUoaWQpIHtcbiAgICB2YXIgZmVlZCA9IGxhdGVzdFtpZF1cbiAgICBpZighZmVlZC5xdWV1ZS5sZW5ndGgpIHJldHVyblxuICAgIGlmKCFmZWVkLnJlYWR5KSByZXR1cm5cblxuICAgIHdoaWxlKGZlZWQucXVldWUubGVuZ3RoKSB7XG4gICAgICB2YXIgb3AgPSBmZWVkLnF1ZXVlLnNoaWZ0KClcblxuXG4gICAgICBpZignZnVuY3Rpb24nID09IHR5cGVvZiBvcC5jcmVhdGUpIHtcbiAgICAgICAgb3AudmFsdWUgPSBvcC5jcmVhdGUoZmVlZC5rZXksIGZlZWQudmFsdWUpXG4gICAgICAgIG9wLmtleSA9ICclJytoYXNoKGVuY29kZShvcC52YWx1ZSkpXG4gICAgICB9XG5cbiAgICAgIHZhciBlcnIgPVxuICAgICAgICB1dGlsLmlzSW52YWxpZFNoYXBlKG9wLnZhbHVlKSB8fFxuICAgICAgICB1dGlsLmlzSW52YWxpZChpZCwgb3AudmFsdWUsIGZlZWQpXG5cbiAgICAgIGlmKGVycilcbiAgICAgICAgb3AuY2IoZXJyKVxuICAgICAgZWxzZSB7XG4gICAgICAgIGZlZWQua2V5ID0gb3Aua2V5XG4gICAgICAgIGZlZWQudmFsdWUgPSBvcC52YWx1ZVxuICAgICAgICBmZWVkLnRzID0gRGF0ZS5ub3coKVxuICAgICAgICB3cml0ZShvcClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBxdWV1ZSAoaWQsIGpvYikge1xuICAgIGlmKCFsYXRlc3RbaWRdKSB7XG4gICAgICBsYXRlc3RbaWRdID0ge1xuICAgICAgICBrZXk6bnVsbCwgdmFsdWU6IG51bGwsXG4gICAgICAgIHJlYWR5OiBmYWxzZSwgcXVldWU6IFtdLFxuICAgICAgICB0czogRGF0ZS5ub3coKVxuICAgICAgfVxuICAgICAgbGF0ZXN0W2lkXS5xdWV1ZS5wdXNoKGpvYilcbiAgICAgIHNldExhdGVzdChpZClcbiAgICB9XG4gICAgZWxzZVxuICAgICAgbGF0ZXN0W2lkXS5xdWV1ZS5wdXNoKGpvYilcblxuICAgIHZhbGlkYXRlKGlkKVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkIChtc2csIGNiKSB7XG4gICAgdmFyIGVyciA9IHV0aWwuaXNJbnZhbGlkU2hhcGUobXNnKVxuICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcblxuICAgIHF1ZXVlKG1zZy5hdXRob3IsIHtcbiAgICAgICAga2V5OiAnJScraGFzaChlbmNvZGUobXNnKSksXG4gICAgICAgIHZhbHVlOiBtc2csIGNiOiBjYixcbiAgICAgICAgY3JlYXRlOiBudWxsXG4gICAgICB9KVxuICB9XG5cbiAgYWRkLnF1ZXVlID0gZnVuY3Rpb24gKGlkLCBjcmVhdGUsIGNiKSB7XG4gICAgcXVldWUoaWQsIHtcbiAgICAgICAga2V5OiBudWxsLCB2YWx1ZTogbnVsbCxcbiAgICAgICAgY3JlYXRlOiBjcmVhdGUsIGNiOiBjYlxuICAgICAgfSlcblxuICB9XG5cbiAgcmV0dXJuIGFkZFxufVxuIiwidmFyIHB1bGwgICA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcbnZhciB0b1B1bGwgPSByZXF1aXJlKCdzdHJlYW0tdG8tcHVsbC1zdHJlYW0nKVxudmFyIGNhdCAgICA9IHJlcXVpcmUoJ3B1bGwtY2F0JylcbnZhciBpZGVudCAgPSByZXF1aXJlKCdwdWxsLWlkZW50aWZ5LWZpbGV0eXBlJylcbnZhciBtaW1lICAgPSByZXF1aXJlKCdtaW1lLXR5cGVzJylcbnZhciBVUkwgICAgPSByZXF1aXJlKCd1cmwnKVxudmFyIGZzICAgICA9IHJlcXVpcmUoJ2ZzJylcbnZhciByZWZzICAgPSByZXF1aXJlKCdzc2ItcmVmJylcbnZhciBTdGFjayAgPSByZXF1aXJlKCdzdGFjaycpXG52YXIgaXAgICAgID0gcmVxdWlyZSgnaXAnKVxuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2JvdCwgY29uZmlnKSB7XG4gIHJlcXVpcmUoJ2h0dHAnKS5jcmVhdGVTZXJ2ZXIoZXhwb3J0cy5CbG9iU3RhY2soc2JvdCkpLmxpc3Rlbig3Nzc3KVxufVxuXG5mdW5jdGlvbiByZXNwb25kIChyZXMsIHN0YXR1cywgbWVzc2FnZSkge1xuICByZXMud3JpdGVIZWFkKHN0YXR1cylcbiAgcmVzLmVuZChtZXNzYWdlKVxufVxuXG5mdW5jdGlvbiByZXNwb25kU291cmNlIChyZXMsIHNvdXJjZSwgd3JhcCkge1xuICBpZih3cmFwKSB7XG4gICAgcmVzLndyaXRlSGVhZCgyMDAsIHsnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCd9KVxuICAgIHB1bGwoXG4gICAgICBjYXQoW1xuICAgICAgICBwdWxsLm9uY2UoJzxodG1sPjxib2R5PjxzY3JpcHQ+JyksXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgcHVsbC5vbmNlKCc8L3NjcmlwdD48L2JvZHk+PC9odG1sPicpXG4gICAgICBdKSxcbiAgICAgIHRvUHVsbC5zaW5rKHJlcylcbiAgICApXG4gIH1cbiAgZWxzZSB7XG4gICAgcHVsbChcbiAgICAgIHNvdXJjZSxcbiAgICAgIGlkZW50KGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIGlmICh0eXBlKSByZXMud3JpdGVIZWFkKDIwMCwgeydDb250ZW50LVR5cGUnOiBtaW1lLmxvb2t1cCh0eXBlKX0pXG4gICAgICB9KSxcbiAgICAgIHRvUHVsbC5zaW5rKHJlcylcbiAgICApXG4gIH1cbn1cblxudmFyIExvY2FsaG9zdCA9IGV4cG9ydHMuTG9jYWxob3N0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgaWYgKCFpcC5pc0xvb3BiYWNrKHJlcS5zb2NrZXQucmVtb3RlQWRkcmVzcykpXG4gICAgICByZXR1cm4gcmVzcG9uZChyZXMsIDQwMywgJ1JlbW90ZSBhY2Nlc3MgZm9yYmlkZGVuJylcbiAgICBuZXh0KClcbiAgfVxufVxuXG52YXIgQ1NQID0gZXhwb3J0cy5DU1AgPSBmdW5jdGlvbiAob3JpZ2luKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsIFxuICAgICAgXCJkZWZhdWx0LXNyYyBcIitvcmlnaW4rXCIgJ3Vuc2FmZS1pbmxpbmUnICd1bnNhZmUtZXZhbCcgZGF0YTo7IFwiK1xuICAgICAgXCJvYmplY3Qtc3JjICdub25lJzsgXCIrXG4gICAgICBcImZyYW1lLXNyYyAnbm9uZSc7IFwiK1xuICAgICAgXCJzYW5kYm94XCJcbiAgICApXG4gICAgbmV4dCgpXG4gIH1cbn1cblxudmFyIFNlcnZlQmxvYnMgPSBleHBvcnRzLlNlcnZlQmxvYnMgPSBmdW5jdGlvbiAoc2JvdCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgdmFyIHBhcnNlZCA9IFVSTC5wYXJzZShyZXEudXJsLCB0cnVlKVxuICAgIHZhciBoYXNoID0gcGFyc2VkLnBhdGhuYW1lLnNsaWNlKDEpXG4gICAgc2JvdC5ibG9icy53YW50KGhhc2gsIGZ1bmN0aW9uKGVyciwgaGFzKSB7XG4gICAgICBpZiAoIWhhcykgcmV0dXJuIHJlc3BvbmQocmVzLCA0MDQsICdGaWxlIG5vdCBmb3VuZCcpXG5cbiAgICAgIC8vIG9wdGlvbmFsIG5hbWUgb3ZlcnJpZGVcbiAgICAgIGlmIChwYXJzZWQucXVlcnkubmFtZSlcbiAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdpbmxpbmU7IGZpbGVuYW1lPScrZW5jb2RlVVJJQ29tcG9uZW50KHBhcnNlZC5xdWVyeS5uYW1lKSlcblxuICAgICAgLy8gc2VydmVcbiAgICAgIHJlc3BvbmRTb3VyY2UocmVzLCBzYm90LmJsb2JzLmdldChoYXNoKSwgZmFsc2UpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgU2VydmVGaWxlcyA9IGV4cG9ydHMuU2VydmVGaWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xuICAgIHZhciBwYXJzZWQgPSBVUkwucGFyc2UocmVxLnVybCwgdHJ1ZSlcbiAgICBmcy5zdGF0KHBhcnNlZC5wYXRobmFtZSwgZnVuY3Rpb24gKGVyciwgc3RhdCkge1xuICAgICAgaWYoZXJyKSByZXR1cm4gcmVzcG9uZChyZXMsIDQwNCwgJ0ZpbGUgbm90IGZvdW5kJylcbiAgICAgIGlmKCFzdGF0LmlzRmlsZSgpKSByZXR1cm4gcmVzcG9uZChyZXMsIDQwMywgJ01heSBvbmx5IGxvYWQgZmlsZXNzJylcbiAgICAgIHJlc3BvbmRTb3VyY2UoXG4gICAgICAgIHJlcyxcbiAgICAgICAgdG9QdWxsLnNvdXJjZShmcy5jcmVhdGVSZWFkU3RyZWFtKHBhcnNlZC5wYXRobmFtZSkpLFxuICAgICAgICBmYWxzZVxuICAgICAgKVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0cy5CbG9iU3RhY2sgPSBmdW5jdGlvbiAoc2JvdCwgb3B0cykge1xuICByZXR1cm4gU3RhY2soXG4gICAgTG9jYWxob3N0KCksXG4gICAgQ1NQKCdodHRwOi8vbG9jYWxob3N0Ojc3NzcnKSxcbiAgICBTZXJ2ZUJsb2JzKHNib3QpXG4gIClcbn1cblxuZXhwb3J0cy5GaWxlU3RhY2sgPSBmdW5jdGlvbiAob3B0cykge1xuICByZXR1cm4gU3RhY2soXG4gICAgTG9jYWxob3N0KCksXG4gICAgQ1NQKCdodHRwOi8vbG9jYWxob3N0Ojc3NzcnKSxcbiAgICBTZXJ2ZUZpbGVzKClcbiAgKVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXAgPSBleHBvcnRzO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbnZhciBvcyA9IHJlcXVpcmUoJ29zJyk7XG5cbmlwLnRvQnVmZmVyID0gZnVuY3Rpb24oaXAsIGJ1ZmYsIG9mZnNldCkge1xuICBvZmZzZXQgPSB+fm9mZnNldDtcblxuICB2YXIgcmVzdWx0O1xuXG4gIGlmICh0aGlzLmlzVjRGb3JtYXQoaXApKSB7XG4gICAgcmVzdWx0ID0gYnVmZiB8fCBuZXcgQnVmZmVyKG9mZnNldCArIDQpO1xuICAgIGlwLnNwbGl0KC9cXC4vZykubWFwKGZ1bmN0aW9uKGJ5dGUpIHtcbiAgICAgIHJlc3VsdFtvZmZzZXQrK10gPSBwYXJzZUludChieXRlLCAxMCkgJiAweGZmO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHRoaXMuaXNWNkZvcm1hdChpcCkpIHtcbiAgICB2YXIgc2VjdGlvbnMgPSBpcC5zcGxpdCgnOicsIDgpO1xuXG4gICAgdmFyIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXN2NCA9IHRoaXMuaXNWNEZvcm1hdChzZWN0aW9uc1tpXSk7XG4gICAgICB2YXIgdjRCdWZmZXI7XG5cbiAgICAgIGlmIChpc3Y0KSB7XG4gICAgICAgIHY0QnVmZmVyID0gdGhpcy50b0J1ZmZlcihzZWN0aW9uc1tpXSk7XG4gICAgICAgIHNlY3Rpb25zW2ldID0gdjRCdWZmZXIuc2xpY2UoMCwgMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodjRCdWZmZXIgJiYgKytpIDwgOCkge1xuICAgICAgICBzZWN0aW9ucy5zcGxpY2UoaSwgMCwgdjRCdWZmZXIuc2xpY2UoMiwgNCkudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VjdGlvbnNbMF0gPT09ICcnKSB7XG4gICAgICB3aGlsZSAoc2VjdGlvbnMubGVuZ3RoIDwgOCkgc2VjdGlvbnMudW5zaGlmdCgnMCcpO1xuICAgIH0gZWxzZSBpZiAoc2VjdGlvbnNbc2VjdGlvbnMubGVuZ3RoIC0gMV0gPT09ICcnKSB7XG4gICAgICB3aGlsZSAoc2VjdGlvbnMubGVuZ3RoIDwgOCkgc2VjdGlvbnMucHVzaCgnMCcpO1xuICAgIH0gZWxzZSBpZiAoc2VjdGlvbnMubGVuZ3RoIDwgOCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb25zLmxlbmd0aCAmJiBzZWN0aW9uc1tpXSAhPT0gJyc7IGkrKyk7XG4gICAgICB2YXIgYXJndiA9IFsgaSwgMSBdO1xuICAgICAgZm9yIChpID0gOSAtIHNlY3Rpb25zLmxlbmd0aDsgaSA+IDA7IGktLSkge1xuICAgICAgICBhcmd2LnB1c2goJzAnKTtcbiAgICAgIH1cbiAgICAgIHNlY3Rpb25zLnNwbGljZS5hcHBseShzZWN0aW9ucywgYXJndik7XG4gICAgfVxuXG4gICAgcmVzdWx0ID0gYnVmZiB8fCBuZXcgQnVmZmVyKG9mZnNldCArIDE2KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3b3JkID0gcGFyc2VJbnQoc2VjdGlvbnNbaV0sIDE2KTtcbiAgICAgIHJlc3VsdFtvZmZzZXQrK10gPSAod29yZCA+PiA4KSAmIDB4ZmY7XG4gICAgICByZXN1bHRbb2Zmc2V0KytdID0gd29yZCAmIDB4ZmY7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyZXN1bHQpIHtcbiAgICB0aHJvdyBFcnJvcignSW52YWxpZCBpcCBhZGRyZXNzOiAnICsgaXApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmlwLnRvU3RyaW5nID0gZnVuY3Rpb24oYnVmZiwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gfn5vZmZzZXQ7XG4gIGxlbmd0aCA9IGxlbmd0aCB8fCAoYnVmZi5sZW5ndGggLSBvZmZzZXQpO1xuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKGxlbmd0aCA9PT0gNCkge1xuICAgIC8vIElQdjRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaChidWZmW29mZnNldCArIGldKTtcbiAgICB9XG4gICAgcmVzdWx0ID0gcmVzdWx0LmpvaW4oJy4nKTtcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IDE2KSB7XG4gICAgLy8gSVB2NlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGJ1ZmYucmVhZFVJbnQxNkJFKG9mZnNldCArIGkpLnRvU3RyaW5nKDE2KSk7XG4gICAgfVxuICAgIHJlc3VsdCA9IHJlc3VsdC5qb2luKCc6Jyk7XG4gICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLyhefDopMCg6MCkqOjAoOnwkKS8sICckMTo6JDMnKTtcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvOnszLDR9LywgJzo6Jyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIGlwdjRSZWdleCA9IC9eKFxcZHsxLDN9XFwuKXszLDN9XFxkezEsM30kLztcbnZhciBpcHY2UmVnZXggPVxuICAgIC9eKDo6KT8oKChcXGR7MSwzfVxcLil7M30oXFxkezEsM30pezF9KT8oWzAtOWEtZl0pezAsNH06ezAsMn0pezEsOH0oOjopPyQvaTtcblxuaXAuaXNWNEZvcm1hdCA9IGZ1bmN0aW9uKGlwKSB7XG4gIHJldHVybiBpcHY0UmVnZXgudGVzdChpcCk7XG59O1xuXG5pcC5pc1Y2Rm9ybWF0ID0gZnVuY3Rpb24oaXApIHtcbiAgcmV0dXJuIGlwdjZSZWdleC50ZXN0KGlwKTtcbn07XG5mdW5jdGlvbiBfbm9ybWFsaXplRmFtaWx5KGZhbWlseSkge1xuICByZXR1cm4gZmFtaWx5ID8gZmFtaWx5LnRvTG93ZXJDYXNlKCkgOiAnaXB2NCc7XG59XG5cbmlwLmZyb21QcmVmaXhMZW4gPSBmdW5jdGlvbihwcmVmaXhsZW4sIGZhbWlseSkge1xuICBpZiAocHJlZml4bGVuID4gMzIpIHtcbiAgICBmYW1pbHkgPSAnaXB2Nic7XG4gIH0gZWxzZSB7XG4gICAgZmFtaWx5ID0gX25vcm1hbGl6ZUZhbWlseShmYW1pbHkpO1xuICB9XG5cbiAgdmFyIGxlbiA9IDQ7XG4gIGlmIChmYW1pbHkgPT09ICdpcHY2Jykge1xuICAgIGxlbiA9IDE2O1xuICB9XG4gIHZhciBidWZmID0gbmV3IEJ1ZmZlcihsZW4pO1xuXG4gIGZvciAodmFyIGkgPSAwLCBuID0gYnVmZi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICB2YXIgYml0cyA9IDg7XG4gICAgaWYgKHByZWZpeGxlbiA8IDgpIHtcbiAgICAgIGJpdHMgPSBwcmVmaXhsZW47XG4gICAgfVxuICAgIHByZWZpeGxlbiAtPSBiaXRzO1xuXG4gICAgYnVmZltpXSA9IH4oMHhmZiA+PiBiaXRzKTtcbiAgfVxuXG4gIHJldHVybiBpcC50b1N0cmluZyhidWZmKTtcbn07XG5cbmlwLm1hc2sgPSBmdW5jdGlvbihhZGRyLCBtYXNrKSB7XG4gIGFkZHIgPSBpcC50b0J1ZmZlcihhZGRyKTtcbiAgbWFzayA9IGlwLnRvQnVmZmVyKG1hc2spO1xuXG4gIHZhciByZXN1bHQgPSBuZXcgQnVmZmVyKE1hdGgubWF4KGFkZHIubGVuZ3RoLCBtYXNrLmxlbmd0aCkpO1xuXG4gIC8vIFNhbWUgcHJvdG9jb2wgLSBkbyBiaXR3aXNlIGFuZFxuICBpZiAoYWRkci5sZW5ndGggPT09IG1hc2subGVuZ3RoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhZGRyLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBhZGRyW2ldICYgbWFza1tpXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobWFzay5sZW5ndGggPT09IDQpIHtcbiAgICAvLyBJUHY2IGFkZHJlc3MgYW5kIElQdjQgbWFza1xuICAgIC8vIChNYXNrIGxvdyBiaXRzKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFzay5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gYWRkclthZGRyLmxlbmd0aCAtIDQgICsgaV0gJiBtYXNrW2ldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJUHY2IG1hc2sgYW5kIElQdjQgYWRkclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aCAtIDY7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gMDtcbiAgICB9XG5cbiAgICAvLyA6OmZmZmY6aXB2NFxuICAgIHJlc3VsdFsxMF0gPSAweGZmO1xuICAgIHJlc3VsdFsxMV0gPSAweGZmO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWRkci5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2kgKyAxMl0gPSBhZGRyW2ldICYgbWFza1tpICsgMTJdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpcC50b1N0cmluZyhyZXN1bHQpO1xufTtcblxuaXAuY2lkciA9IGZ1bmN0aW9uKGNpZHJTdHJpbmcpIHtcbiAgdmFyIGNpZHJQYXJ0cyA9IGNpZHJTdHJpbmcuc3BsaXQoJy8nKTtcblxuICB2YXIgYWRkciA9IGNpZHJQYXJ0c1swXTtcbiAgaWYgKGNpZHJQYXJ0cy5sZW5ndGggIT09IDIpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIENJRFIgc3VibmV0OiAnICsgYWRkcik7XG5cbiAgdmFyIG1hc2sgPSBpcC5mcm9tUHJlZml4TGVuKHBhcnNlSW50KGNpZHJQYXJ0c1sxXSwgMTApKTtcblxuICByZXR1cm4gaXAubWFzayhhZGRyLCBtYXNrKTtcbn07XG5cbmlwLnN1Ym5ldCA9IGZ1bmN0aW9uKGFkZHIsIG1hc2spIHtcbiAgdmFyIG5ldHdvcmtBZGRyZXNzID0gaXAudG9Mb25nKGlwLm1hc2soYWRkciwgbWFzaykpO1xuXG4gIC8vIENhbGN1bGF0ZSB0aGUgbWFzaydzIGxlbmd0aC5cbiAgdmFyIG1hc2tCdWZmZXIgPSBpcC50b0J1ZmZlcihtYXNrKTtcbiAgdmFyIG1hc2tMZW5ndGggPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWFza0J1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChtYXNrQnVmZmVyW2ldID09PSAweGZmKSB7XG4gICAgICBtYXNrTGVuZ3RoICs9IDg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvY3RldCA9IG1hc2tCdWZmZXJbaV0gJiAweGZmO1xuICAgICAgd2hpbGUgKG9jdGV0KSB7XG4gICAgICAgIG9jdGV0ID0gKG9jdGV0IDw8IDEpICYgMHhmZjtcbiAgICAgICAgbWFza0xlbmd0aCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBudW1iZXJPZkFkZHJlc3NlcyA9IE1hdGgucG93KDIsIDMyIC0gbWFza0xlbmd0aCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuZXR3b3JrQWRkcmVzczogaXAuZnJvbUxvbmcobmV0d29ya0FkZHJlc3MpLFxuICAgIGZpcnN0QWRkcmVzczogbnVtYmVyT2ZBZGRyZXNzZXMgPD0gMiA/XG4gICAgICAgICAgICAgICAgICAgIGlwLmZyb21Mb25nKG5ldHdvcmtBZGRyZXNzKSA6XG4gICAgICAgICAgICAgICAgICAgIGlwLmZyb21Mb25nKG5ldHdvcmtBZGRyZXNzICsgMSksXG4gICAgbGFzdEFkZHJlc3M6IG51bWJlck9mQWRkcmVzc2VzIDw9IDIgP1xuICAgICAgICAgICAgICAgICAgICBpcC5mcm9tTG9uZyhuZXR3b3JrQWRkcmVzcyArIG51bWJlck9mQWRkcmVzc2VzIC0gMSkgOlxuICAgICAgICAgICAgICAgICAgICBpcC5mcm9tTG9uZyhuZXR3b3JrQWRkcmVzcyArIG51bWJlck9mQWRkcmVzc2VzIC0gMiksXG4gICAgYnJvYWRjYXN0QWRkcmVzczogaXAuZnJvbUxvbmcobmV0d29ya0FkZHJlc3MgKyBudW1iZXJPZkFkZHJlc3NlcyAtIDEpLFxuICAgIHN1Ym5ldE1hc2s6IG1hc2ssXG4gICAgc3VibmV0TWFza0xlbmd0aDogbWFza0xlbmd0aCxcbiAgICBudW1Ib3N0czogbnVtYmVyT2ZBZGRyZXNzZXMgPD0gMiA/XG4gICAgICAgICAgICAgICAgbnVtYmVyT2ZBZGRyZXNzZXMgOiBudW1iZXJPZkFkZHJlc3NlcyAtIDIsXG4gICAgbGVuZ3RoOiBudW1iZXJPZkFkZHJlc3NlcyxcbiAgICBjb250YWluczogZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIHJldHVybiBuZXR3b3JrQWRkcmVzcyA9PT0gaXAudG9Mb25nKGlwLm1hc2sob3RoZXIsIG1hc2spKTtcbiAgICB9XG4gIH07XG59O1xuXG5pcC5jaWRyU3VibmV0ID0gZnVuY3Rpb24oY2lkclN0cmluZykge1xuICB2YXIgY2lkclBhcnRzID0gY2lkclN0cmluZy5zcGxpdCgnLycpO1xuXG4gIHZhciBhZGRyID0gY2lkclBhcnRzWzBdO1xuICBpZiAoY2lkclBhcnRzLmxlbmd0aCAhPT0gMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgQ0lEUiBzdWJuZXQ6ICcgKyBhZGRyKTtcblxuICB2YXIgbWFzayA9IGlwLmZyb21QcmVmaXhMZW4ocGFyc2VJbnQoY2lkclBhcnRzWzFdLCAxMCkpO1xuXG4gIHJldHVybiBpcC5zdWJuZXQoYWRkciwgbWFzayk7XG59O1xuXG5pcC5ub3QgPSBmdW5jdGlvbihhZGRyKSB7XG4gIHZhciBidWZmID0gaXAudG9CdWZmZXIoYWRkcik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZi5sZW5ndGg7IGkrKykge1xuICAgIGJ1ZmZbaV0gPSAweGZmIF4gYnVmZltpXTtcbiAgfVxuICByZXR1cm4gaXAudG9TdHJpbmcoYnVmZik7XG59O1xuXG5pcC5vciA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgYSA9IGlwLnRvQnVmZmVyKGEpO1xuICBiID0gaXAudG9CdWZmZXIoYik7XG5cbiAgLy8gc2FtZSBwcm90b2NvbFxuICBpZiAoYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG4gICAgICBhW2ldIHw9IGJbaV07XG4gICAgfVxuICAgIHJldHVybiBpcC50b1N0cmluZyhhKTtcblxuICAvLyBtaXhlZCBwcm90b2NvbHNcbiAgfSBlbHNlIHtcbiAgICB2YXIgYnVmZiA9IGE7XG4gICAgdmFyIG90aGVyID0gYjtcbiAgICBpZiAoYi5sZW5ndGggPiBhLmxlbmd0aCkge1xuICAgICAgYnVmZiA9IGI7XG4gICAgICBvdGhlciA9IGE7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldCA9IGJ1ZmYubGVuZ3RoIC0gb3RoZXIubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSBvZmZzZXQ7IGkgPCBidWZmLmxlbmd0aDsgKytpKSB7XG4gICAgICBidWZmW2ldIHw9IG90aGVyW2kgLSBvZmZzZXRdO1xuICAgIH1cblxuICAgIHJldHVybiBpcC50b1N0cmluZyhidWZmKTtcbiAgfVxufTtcblxuaXAuaXNFcXVhbCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgYSA9IGlwLnRvQnVmZmVyKGEpO1xuICBiID0gaXAudG9CdWZmZXIoYik7XG5cbiAgLy8gU2FtZSBwcm90b2NvbFxuICBpZiAoYS5sZW5ndGggPT09IGIubGVuZ3RoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFN3YXBcbiAgaWYgKGIubGVuZ3RoID09PSA0KSB7XG4gICAgdmFyIHQgPSBiO1xuICAgIGIgPSBhO1xuICAgIGEgPSB0O1xuICB9XG5cbiAgLy8gYSAtIElQdjQsIGIgLSBJUHY2XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgIGlmIChiW2ldICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgd29yZCA9IGIucmVhZFVJbnQxNkJFKDEwKTtcbiAgaWYgKHdvcmQgIT09IDAgJiYgd29yZCAhPT0gMHhmZmZmKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpICsgMTJdKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmlwLmlzUHJpdmF0ZSA9IGZ1bmN0aW9uKGFkZHIpIHtcbiAgcmV0dXJuIC9eKDo6Zns0fTopPzEwXFwuKFswLTldezEsM30pXFwuKFswLTldezEsM30pXFwuKFswLTldezEsM30pJC9pXG4gICAgICAudGVzdChhZGRyKSB8fFxuICAgIC9eKDo6Zns0fTopPzE5MlxcLjE2OFxcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KSQvaS50ZXN0KGFkZHIpIHx8XG4gICAgL14oOjpmezR9Oik/MTcyXFwuKDFbNi05XXwyXFxkfDMwfDMxKVxcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KSQvaVxuICAgICAgLnRlc3QoYWRkcikgfHxcbiAgICAvXig6OmZ7NH06KT8xMjdcXC4oWzAtOV17MSwzfSlcXC4oWzAtOV17MSwzfSlcXC4oWzAtOV17MSwzfSkkL2kudGVzdChhZGRyKSB8fFxuICAgIC9eKDo6Zns0fTopPzE2OVxcLjI1NFxcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KSQvaS50ZXN0KGFkZHIpIHx8XG4gICAgL15mW2NkXVswLTlhLWZdezJ9Oi9pLnRlc3QoYWRkcikgfHxcbiAgICAvXmZlODA6L2kudGVzdChhZGRyKSB8fFxuICAgIC9eOjoxJC8udGVzdChhZGRyKSB8fFxuICAgIC9eOjokLy50ZXN0KGFkZHIpO1xufTtcblxuaXAuaXNQdWJsaWMgPSBmdW5jdGlvbihhZGRyKSB7XG4gIHJldHVybiAhaXAuaXNQcml2YXRlKGFkZHIpO1xufTtcblxuaXAuaXNMb29wYmFjayA9IGZ1bmN0aW9uKGFkZHIpIHtcbiAgcmV0dXJuIC9eKDo6Zns0fTopPzEyN1xcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KS9cbiAgICAgIC50ZXN0KGFkZHIpIHx8XG4gICAgL15mZTgwOjoxJC8udGVzdChhZGRyKSB8fFxuICAgIC9eOjoxJC8udGVzdChhZGRyKSB8fFxuICAgIC9eOjokLy50ZXN0KGFkZHIpO1xufTtcblxuaXAubG9vcGJhY2sgPSBmdW5jdGlvbihmYW1pbHkpIHtcbiAgLy9cbiAgLy8gRGVmYXVsdCB0byBgaXB2NGBcbiAgLy9cbiAgZmFtaWx5ID0gX25vcm1hbGl6ZUZhbWlseShmYW1pbHkpO1xuXG4gIGlmIChmYW1pbHkgIT09ICdpcHY0JyAmJiBmYW1pbHkgIT09ICdpcHY2Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignZmFtaWx5IG11c3QgYmUgaXB2NCBvciBpcHY2Jyk7XG4gIH1cblxuICByZXR1cm4gZmFtaWx5ID09PSAnaXB2NCcgPyAnMTI3LjAuMC4xJyA6ICdmZTgwOjoxJztcbn07XG5cbi8vXG4vLyAjIyMgZnVuY3Rpb24gYWRkcmVzcyAobmFtZSwgZmFtaWx5KVxuLy8gIyMjIyBAbmFtZSB7c3RyaW5nfCdwdWJsaWMnfCdwcml2YXRlJ30gKipPcHRpb25hbCoqIE5hbWUgb3Igc2VjdXJpdHlcbi8vICAgICAgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlLlxuLy8gIyMjIyBAZmFtaWx5IHtpcHY0fGlwdjZ9ICoqT3B0aW9uYWwqKiBJUCBmYW1pbHkgb2YgdGhlIGFkZHJlc3MgKGRlZmF1bHRzXG4vLyAgICAgIHRvIGlwdjQpLlxuLy9cbi8vIFJldHVybnMgdGhlIGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrIGludGVyZmFjZSBvbiB0aGUgY3VycmVudCBzeXN0ZW0gd2l0aFxuLy8gdGhlIHNwZWNpZmllZCBgbmFtZWA6XG4vLyAgICogU3RyaW5nOiBGaXJzdCBgZmFtaWx5YCBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UuXG4vLyAgICAgICAgICAgICBJZiBub3QgZm91bmQgc2VlIGB1bmRlZmluZWRgLlxuLy8gICAqICdwdWJsaWMnOiB0aGUgZmlyc3QgcHVibGljIGlwIGFkZHJlc3Mgb2YgZmFtaWx5LlxuLy8gICAqICdwcml2YXRlJzogdGhlIGZpcnN0IHByaXZhdGUgaXAgYWRkcmVzcyBvZiBmYW1pbHkuXG4vLyAgICogdW5kZWZpbmVkOiBGaXJzdCBhZGRyZXNzIHdpdGggYGlwdjRgIG9yIGxvb3BiYWNrIGFkZHJlc3MgYDEyNy4wLjAuMWAuXG4vL1xuaXAuYWRkcmVzcyA9IGZ1bmN0aW9uKG5hbWUsIGZhbWlseSkge1xuICB2YXIgaW50ZXJmYWNlcyA9IG9zLm5ldHdvcmtJbnRlcmZhY2VzKCk7XG4gIHZhciBhbGw7XG5cbiAgLy9cbiAgLy8gRGVmYXVsdCB0byBgaXB2NGBcbiAgLy9cbiAgZmFtaWx5ID0gX25vcm1hbGl6ZUZhbWlseShmYW1pbHkpO1xuXG4gIC8vXG4gIC8vIElmIGEgc3BlY2lmaWMgbmV0d29yayBpbnRlcmZhY2UgaGFzIGJlZW4gbmFtZWQsXG4gIC8vIHJldHVybiB0aGUgYWRkcmVzcy5cbiAgLy9cbiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gJ3ByaXZhdGUnICYmIG5hbWUgIT09ICdwdWJsaWMnKSB7XG4gICAgdmFyIHJlcyA9IGludGVyZmFjZXNbbmFtZV0uZmlsdGVyKGZ1bmN0aW9uKGRldGFpbHMpIHtcbiAgICAgIHZhciBpdGVtRmFtaWx5ID0gZGV0YWlscy5mYW1pbHkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBpdGVtRmFtaWx5ID09PSBmYW1pbHk7XG4gICAgfSk7XG4gICAgaWYgKHJlcy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNbMF0uYWRkcmVzcztcbiAgfVxuXG4gIHZhciBhbGwgPSBPYmplY3Qua2V5cyhpbnRlcmZhY2VzKS5tYXAoZnVuY3Rpb24gKG5pYykge1xuICAgIC8vXG4gICAgLy8gTm90ZTogbmFtZSB3aWxsIG9ubHkgYmUgYHB1YmxpY2Agb3IgYHByaXZhdGVgXG4gICAgLy8gd2hlbiB0aGlzIGlzIGNhbGxlZC5cbiAgICAvL1xuICAgIHZhciBhZGRyZXNzZXMgPSBpbnRlcmZhY2VzW25pY10uZmlsdGVyKGZ1bmN0aW9uIChkZXRhaWxzKSB7XG4gICAgICBkZXRhaWxzLmZhbWlseSA9IGRldGFpbHMuZmFtaWx5LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoZGV0YWlscy5mYW1pbHkgIT09IGZhbWlseSB8fCBpcC5pc0xvb3BiYWNrKGRldGFpbHMuYWRkcmVzcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICghbmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5hbWUgPT09ICdwdWJsaWMnID8gIWlwLmlzUHJpdmF0ZShkZXRhaWxzLmFkZHJlc3MpIDpcbiAgICAgICAgICBpcC5pc1ByaXZhdGUoZGV0YWlscy5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhZGRyZXNzZXMubGVuZ3RoID8gYWRkcmVzc2VzWzBdLmFkZHJlc3MgOiB1bmRlZmluZWQ7XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcblxuICByZXR1cm4gIWFsbC5sZW5ndGggPyBpcC5sb29wYmFjayhmYW1pbHkpIDogYWxsWzBdO1xufTtcblxuaXAudG9Mb25nID0gZnVuY3Rpb24oaXApIHtcbiAgdmFyIGlwbCA9IDA7XG4gIGlwLnNwbGl0KCcuJykuZm9yRWFjaChmdW5jdGlvbihvY3RldCkge1xuICAgIGlwbCA8PD0gODtcbiAgICBpcGwgKz0gcGFyc2VJbnQob2N0ZXQpO1xuICB9KTtcbiAgcmV0dXJuKGlwbCA+Pj4gMCk7XG59O1xuXG5pcC5mcm9tTG9uZyA9IGZ1bmN0aW9uKGlwbCkge1xuICByZXR1cm4gKChpcGwgPj4+IDI0KSArICcuJyArXG4gICAgICAoaXBsID4+IDE2ICYgMjU1KSArICcuJyArXG4gICAgICAoaXBsID4+IDggJiAyNTUpICsgJy4nICtcbiAgICAgIChpcGwgJiAyNTUpICk7XG59O1xuIiwiXG5cbnZhciBlY2MgPSByZXF1aXJlKCdlY2NqcycpXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbnZhciBCbGFrZTJzID0gcmVxdWlyZSgnYmxha2UycycpXG5cbnZhciBjdXJ2ZSA9IGVjYy5jdXJ2ZXMuazI1NlxuXG5mdW5jdGlvbiBoYXNoIChtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgQmxha2UycygpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICBjdXJ2ZXM6IFsnazI1NiddLFxuXG4gIGdlbmVyYXRlOiBmdW5jdGlvbiAoc2VlZCkge1xuICAgIC8vd2UgdXNlIGVjY2pzLnJlc3RvcmUgaGVyZSwgaW5zdGVhZCBvZiBlY2Nqcy5nZW5lcmF0ZVxuICAgIC8vYmVjYXVzZSB3ZSB0cnVzdCBub2RlJ3MgcmFuZG9tIGdlbmVyYXRvciBtdWNoIG1vcmUgdGhhblxuICAgIC8vc2pjbCdzICh2aWEgY3J5cHRvLWJyb3dzZXJpZnkncyBwb2x5ZmlsIHRoaXMgdXNlc1xuICAgIC8vd2ViY3J5cHRvJ3MgcmFuZG9tIGdlbmVyYXRvciBpbiB0aGUgYnJvd3NlcilcblxuICAgIHZhciBrZXlzID0gZWNjLnJlc3RvcmUoY3VydmUsIHNlZWQgfHwgY3J5cHRvLnJhbmRvbUJ5dGVzKDMyKSlcblxuICAgIHJldHVybiB7XG4gICAgICBjdXJ2ZTogJ2syNTYnLFxuICAgICAgcHVibGljOiBrZXlzLnB1YmxpYyxcbiAgICAgIHByaXZhdGU6IGtleXMucHJpdmF0ZVxuICAgIH1cbiAgfSxcblxuICBzaWduOiBmdW5jdGlvbiAocHJpdmF0ZSwgbWVzc2FnZSkge1xuICAgIHJldHVybiBlY2Muc2lnbihjdXJ2ZSwgcHJpdmF0ZSwgaGFzaChtZXNzYWdlKSlcbiAgfSxcblxuICB2ZXJpZnk6IGZ1bmN0aW9uIChwdWJsaWMsIHNpZywgbWVzc2FnZSkge1xuICAgIHJldHVybiBlY2MudmVyaWZ5KGN1cnZlLCBwdWJsaWMsIHNpZywgaGFzaChtZXNzYWdlKSlcbiAgfSxcblxuICByZXN0b3JlOiBmdW5jdGlvbiAoc2VlZCkge1xuICAgIHJldHVybiBlY2MucmVzdG9yZShjdXJ2ZSwgc2VlZClcbiAgfVxuXG59XG4iLCJ2YXIgZnMgICAgICAgICA9IHJlcXVpcmUoJ2ZzJylcbnZhciBta2RpcnAgICAgID0gcmVxdWlyZSgnbWtkaXJwJylcbnZhciBwYXRoICAgICAgID0gcmVxdWlyZSgncGF0aCcpXG52YXIgZGVlcEVxdWFsICA9IHJlcXVpcmUoJ2RlZXAtZXF1YWwnKVxuXG52YXIgY3J5cHRvICAgICA9IHJlcXVpcmUoJ2NyeXB0bycpXG52YXIgY3JlYXRlSG1hYyA9IHJlcXVpcmUoJ2htYWMnKVxuXG52YXIgc29kaXVtICAgICA9IHJlcXVpcmUoJ2NobG9yaWRlJylcbnZhciBzc2JyZWYgICAgID0gcmVxdWlyZSgnc3NiLXJlZicpXG5cbnZhciBwYiAgICAgICAgID0gcmVxdWlyZSgncHJpdmF0ZS1ib3gnKVxuXG52YXIgaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXJcblxuZnVuY3Rpb24gaXNTdHJpbmcgKHMpIHtcbiAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2Ygc1xufVxuLy9VVElMU1xuXG5mdW5jdGlvbiBjbG9uZSAob2JqKSB7XG4gIHZhciBfb2JqID0ge31cbiAgZm9yKHZhciBrIGluIG9iaikge1xuICAgIGlmKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaykpXG4gICAgICBfb2JqW2tdID0gb2JqW2tdXG4gIH1cbiAgcmV0dXJuIF9vYmpcbn1cblxuZnVuY3Rpb24gaGFzaCAoZGF0YSwgZW5jKSB7XG4gIGRhdGEgPSAoXG4gICAgJ3N0cmluZycgPT09IHR5cGVvZiBkYXRhICYmIGVuYyA9PSBudWxsXG4gID8gbmV3IEJ1ZmZlcihkYXRhLCAnYmluYXJ5JylcbiAgOiBuZXcgQnVmZmVyKGRhdGEsIGVuYylcbiAgKVxuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShkYXRhKS5kaWdlc3QoJ2Jhc2U2NCcpKycuc2hhMjU2J1xufVxuXG52YXIgaXNMaW5rID0gc3NicmVmLmlzTGlua1xudmFyIGlzRmVlZElkID0gc3NicmVmLmlzRmVlZElkXG5cbmV4cG9ydHMuaGFzaCA9IGhhc2hcblxuZnVuY3Rpb24gaXNPYmplY3QgKG8pIHtcbiAgcmV0dXJuICdvYmplY3QnID09PSB0eXBlb2Ygb1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7XG4gIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZlxufVxuXG5mdW5jdGlvbiBpc1N0cmluZyhzKSB7XG4gIHJldHVybiAnc3RyaW5nJyA9PT0gdHlwZW9mIHNcbn1cblxuZnVuY3Rpb24gaGFzU2lnaWwgKHMpIHtcbiAgcmV0dXJuIC9eKEB8JXwmKS8udGVzdChzKVxufVxuXG5mdW5jdGlvbiBlbXB0eSh2KSB7IHJldHVybiAhIXYgfVxuXG5mdW5jdGlvbiB0b0J1ZmZlcihidWYpIHtcbiAgaWYoYnVmID09IG51bGwpIHJldHVybiBidWZcbiAgaWYoQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSBhIGJ1ZmZlcicpXG4gIHZhciBpID0gYnVmLmluZGV4T2YoJy4nKVxuICB2YXIgc3RhcnQgPSAoaGFzU2lnaWwoYnVmKSkgPyAxIDogMFxuICByZXR1cm4gbmV3IEJ1ZmZlcihidWYuc3Vic3RyaW5nKHN0YXJ0LCB+aSA/IGkgOiBidWYubGVuZ3RoKSwgJ2Jhc2U2NCcpXG59XG5cbmZ1bmN0aW9uIHRvVWludDgoYnVmKSB7XG4gIHJldHVybiBuZXcgVWludDhBcnJheSh0b0J1ZmZlcihidWYpKVxufVxuXG5mdW5jdGlvbiBnZXRUYWcgKHN0cmluZykge1xuICB2YXIgaSA9IHN0cmluZy5pbmRleE9mKCcuJylcbiAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoaSsxKVxufVxuXG5leHBvcnRzLmdldFRhZyA9IGdldFRhZ1xuXG5mdW5jdGlvbiB0YWcgKGtleSwgdGFnKSB7XG4gIGlmKCF0YWcpIHRocm93IG5ldyBFcnJvcignbm8gdGFnIGZvcjonICsga2V5LnRvU3RyaW5nKCdiYXNlNjQnKSlcbiAgcmV0dXJuIGtleS50b1N0cmluZygnYmFzZTY0JykrJy4nICsgdGFnLnJlcGxhY2UoL15cXC4vLCAnJylcbn1cblxuZnVuY3Rpb24ga2V5c1RvSlNPTihrZXlzLCBjdXJ2ZSkge1xuICBjdXJ2ZSA9IChrZXlzLmN1cnZlIHx8IGN1cnZlKVxuXG4gIHZhciBwdWIgPSB0YWcoa2V5cy5wdWJsaWMudG9TdHJpbmcoJ2Jhc2U2NCcpLCBjdXJ2ZSlcbiAgcmV0dXJuIHtcbiAgICBjdXJ2ZTogY3VydmUsXG4gICAgcHVibGljOiBwdWIsXG4gICAgcHJpdmF0ZToga2V5cy5wcml2YXRlID8gdGFnKGtleXMucHJpdmF0ZS50b1N0cmluZygnYmFzZTY0JyksIGN1cnZlKSA6IHVuZGVmaW5lZCxcbiAgICBpZDogJ0AnKyhjdXJ2ZSA9PT0gJ2VkMjU1MTknID8gcHViIDogaGFzaChwdWIpKVxuICB9XG59XG5cbi8vKERFKVNFUklBTElaRSBLRVlTXG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEtleXMoa2V5cywgbGVnYWN5KSB7XG4gIGlmKCFrZXlzKSB0aHJvdyBuZXcgRXJyb3IoJyptdXN0KiBwYXNzIGluIGtleXMnKSBcblxuICByZXR1cm4gW1xuICAnIyB0aGlzIGlzIHlvdXIgU0VDUkVUIG5hbWUuJyxcbiAgJyMgdGhpcyBuYW1lIGdpdmVzIHlvdSBtYWdpY2FsIHBvd2Vycy4nLFxuICAnIyB3aXRoIGl0IHlvdSBjYW4gbWFyayB5b3VyIG1lc3NhZ2VzIHNvIHRoYXQgeW91ciBmcmllbmRzIGNhbiB2ZXJpZnknLFxuICAnIyB0aGF0IHRoZXkgcmVhbGx5IGRpZCBjb21lIGZyb20geW91LicsXG4gICcjJyxcbiAgJyMgaWYgYW55IG9uZSBsZWFybnMgdGhpcyBuYW1lLCB0aGV5IGNhbiB1c2UgaXQgdG8gZGVzdHJveSB5b3VyIGlkZW50aXR5JyxcbiAgJyMgTkVWRVIgc2hvdyB0aGlzIHRvIGFueW9uZSEhIScsXG4gICcnLFxuICBsZWdhY3kgPyBrZXlzLnByaXZhdGUgOiBKU09OLnN0cmluZ2lmeShrZXlzLCBudWxsLCAyKSxcbiAgJycsXG4gICcjIFdBUk5JTkchIEl0XFwncyB2aXRhbCB0aGF0IHlvdSBETyBOT1QgZWRpdCBPUiBzaGFyZSB5b3VyIHNlY3JldCBuYW1lJyxcbiAgJyMgaW5zdGVhZCwgc2hhcmUgeW91ciBwdWJsaWMgbmFtZScsXG4gICcjIHlvdXIgcHVibGljIG5hbWU6ICcgKyBrZXlzLmlkXG4gIF0uam9pbignXFxuJylcbn1cblxuZnVuY3Rpb24gcmVjb25zdHJ1Y3RLZXlzKGtleWZpbGUpIHtcbiAgdmFyIHByaXZhdGUgPSBrZXlmaWxlXG4gICAgLnJlcGxhY2UoL1xccypcXCNbXlxcbl0qL2csICcnKVxuICAgIC5zcGxpdCgnXFxuJykuZmlsdGVyKGVtcHR5KS5qb2luKCcnKVxuXG4gIC8vaWYgdGhlIGtleSBpcyBpbiBKU09OIGZvcm1hdCwgd2UgYXJlIGdvb2QuXG4gIHRyeSB7XG4gICAgdmFyIGtleXMgPSBKU09OLnBhcnNlKHByaXZhdGUpXG4gICAgaWYoIWhhc1NpZ2lsKGtleXMuaWQpKSBrZXlzLmlkID0gJ0AnICsga2V5cy5wdWJsaWNcbiAgICByZXR1cm4ga2V5c1xuICB9IGNhdGNoIChfKSB7fVxuXG4gIC8vZWxzZSwgcmVjb25zdHJ1Y3QgbGVnYWN5IGN1cnZlLi4uXG5cbiAgdmFyIGN1cnZlID0gZ2V0VGFnKHByaXZhdGUpXG5cbiAgaWYoY3VydmUgIT09ICdrMjU2JylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGxlZ2FjeSBjdXJ2ZSAoazI1NikgYnV0IGZvdW5kOicgKyBjdXJ2ZSlcblxuICB2YXIgZWNjID0gcmVxdWlyZSgnLi9lY2NqcycpXG5cbiAgcmV0dXJuIGtleXNUb0pTT04oZWNjLnJlc3RvcmUodG9CdWZmZXIocHJpdmF0ZSkpLCAnazI1NicpXG59XG5cbnZhciB0b05hbWVGaWxlID0gZXhwb3J0cy50b05hbWVGaWxlID0gZnVuY3Rpb24gKG5hbWVmaWxlKSB7XG4gIGlmKGlzT2JqZWN0KG5hbWVmaWxlKSlcbiAgICByZXR1cm4gcGF0aC5qb2luKG5hbWVmaWxlLnBhdGgsICdzZWNyZXQnKVxuICByZXR1cm4gbmFtZWZpbGVcbn1cblxuZXhwb3J0cy5sb2FkID0gZnVuY3Rpb24obmFtZWZpbGUsIGNiKSB7XG4gIG5hbWVmaWxlID0gdG9OYW1lRmlsZShuYW1lZmlsZSlcbiAgZnMucmVhZEZpbGUobmFtZWZpbGUsICdhc2NpaScsIGZ1bmN0aW9uKGVyciwgcHJpdmF0ZUtleVN0cikge1xuICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgdHJ5IHsgY2IobnVsbCwgcmVjb25zdHJ1Y3RLZXlzKHByaXZhdGVLZXlTdHIpKSB9XG4gICAgY2F0Y2ggKGUpIHsgY2IoZXJyKSB9XG4gIH0pXG59XG5cbmV4cG9ydHMubG9hZFN5bmMgPSBmdW5jdGlvbihuYW1lZmlsZSkge1xuICBuYW1lZmlsZSA9IHRvTmFtZUZpbGUobmFtZWZpbGUpXG4gIHJldHVybiByZWNvbnN0cnVjdEtleXMoZnMucmVhZEZpbGVTeW5jKG5hbWVmaWxlLCAnYXNjaWknKSlcbn1cblxuZXhwb3J0cy5jcmVhdGUgPSBmdW5jdGlvbihuYW1lZmlsZSwgY3VydmUsIGxlZ2FjeSwgY2IpIHtcbiAgaWYoaXNGdW5jdGlvbihsZWdhY3kpKVxuICAgIGNiID0gbGVnYWN5LCBsZWdhY3kgPSBudWxsXG4gIGlmKGlzRnVuY3Rpb24oY3VydmUpKVxuICAgIGNiID0gY3VydmUsIGN1cnZlID0gbnVsbFxuXG4gIG5hbWVmaWxlID0gdG9OYW1lRmlsZShuYW1lZmlsZSlcbiAgdmFyIGtleXMgPSBleHBvcnRzLmdlbmVyYXRlKGN1cnZlKVxuICB2YXIga2V5ZmlsZSA9IGNvbnN0cnVjdEtleXMoa2V5cywgbGVnYWN5KVxuICBta2RpcnAocGF0aC5kaXJuYW1lKG5hbWVmaWxlKSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcbiAgICBmcy53cml0ZUZpbGUobmFtZWZpbGUsIGtleWZpbGUsIGZ1bmN0aW9uKGVycikge1xuICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgIGNiKG51bGwsIGtleXMpXG4gICAgfSlcbiAgfSlcbn1cblxuZXhwb3J0cy5jcmVhdGVTeW5jID0gZnVuY3Rpb24obmFtZWZpbGUsIGN1cnZlLCBsZWdhY3kpIHtcbiAgbmFtZWZpbGUgPSB0b05hbWVGaWxlKG5hbWVmaWxlKVxuICB2YXIga2V5cyA9IGV4cG9ydHMuZ2VuZXJhdGUoY3VydmUpXG4gIHZhciBrZXlmaWxlID0gY29uc3RydWN0S2V5cyhrZXlzLCBsZWdhY3kpXG4gIG1rZGlycC5zeW5jKHBhdGguZGlybmFtZShuYW1lZmlsZSkpXG4gIGZzLndyaXRlRmlsZVN5bmMobmFtZWZpbGUsIGtleWZpbGUpXG4gIHJldHVybiBrZXlzXG59XG5cbmV4cG9ydHMubG9hZE9yQ3JlYXRlID0gZnVuY3Rpb24gKG5hbWVmaWxlLCBjYikge1xuICBuYW1lZmlsZSA9IHRvTmFtZUZpbGUobmFtZWZpbGUpXG4gIGV4cG9ydHMubG9hZChuYW1lZmlsZSwgZnVuY3Rpb24gKGVyciwga2V5cykge1xuICAgIGlmKCFlcnIpIHJldHVybiBjYihudWxsLCBrZXlzKVxuICAgIGV4cG9ydHMuY3JlYXRlKG5hbWVmaWxlLCBjYilcbiAgfSlcbn1cblxuZXhwb3J0cy5sb2FkT3JDcmVhdGVTeW5jID0gZnVuY3Rpb24gKG5hbWVmaWxlKSB7XG4gIG5hbWVmaWxlID0gdG9OYW1lRmlsZShuYW1lZmlsZSlcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXhwb3J0cy5sb2FkU3luYyhuYW1lZmlsZSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY3JlYXRlU3luYyhuYW1lZmlsZSlcbiAgfVxufVxuXG5cbi8vIERJR0lUQUwgU0lHTkFUVVJFU1xuXG52YXIgY3VydmVzID0ge31cbmN1cnZlcy5lZDI1NTE5ID0gcmVxdWlyZSgnLi9zb2RpdW0nKVxudHJ5IHsgY3VydmVzLmsyNTYgPSByZXF1aXJlKCcuL2VjY2pzJykgfVxuY2F0Y2ggKF8pIHt9XG5cbmZ1bmN0aW9uIGdldEN1cnZlKGtleXMpIHtcbiAgdmFyIGN1cnZlID0ga2V5cy5jdXJ2ZVxuXG4gIGlmKCFrZXlzLmN1cnZlICYmIGlzU3RyaW5nKGtleXMucHVibGljKSlcbiAgICBrZXlzID0ga2V5cy5wdWJsaWNcblxuICBpZighY3VydmUgJiYgaXNTdHJpbmcoa2V5cykpXG4gICAgY3VydmUgPSBnZXRUYWcoa2V5cylcblxuICBpZighY3VydmVzW2N1cnZlXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICd1bmtvd24gY3VydmU6JyArIGN1cnZlICtcbiAgICAgICcgZXhwZWN0ZWQ6ICcrT2JqZWN0LmtleXMoY3VydmVzKVxuICAgIClcbiAgfVxuXG4gIHJldHVybiBjdXJ2ZVxufVxuXG4vL3RoaXMgc2hvdWxkIHJldHVybiBhIGtleSBwYWlyOlxuLy8ge2N1cnZlOiBjdXJ2ZSwgcHVibGljOiBCdWZmZXIsIHByaXZhdGU6IEJ1ZmZlcn1cblxuZXhwb3J0cy5nZW5lcmF0ZSA9IGZ1bmN0aW9uIChjdXJ2ZSwgc2VlZCkge1xuICBjdXJ2ZSA9IGN1cnZlIHx8ICdlZDI1NTE5J1xuXG4gIGlmKCFjdXJ2ZXNbY3VydmVdKVxuICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjdXJ2ZTonK2N1cnZlKVxuXG4gIHJldHVybiBrZXlzVG9KU09OKGN1cnZlc1tjdXJ2ZV0uZ2VuZXJhdGUoc2VlZCksIGN1cnZlKVxufVxuXG4vL3Rha2VzIGEgcHVibGljIGtleSBhbmQgYSBoYXNoIGFuZCByZXR1cm5zIGEgc2lnbmF0dXJlLlxuLy8oYSBzaWduYXR1cmUgbXVzdCBiZSBhIG5vZGUgYnVmZmVyKVxuXG5leHBvcnRzLnNpZ24gPSBmdW5jdGlvbiAoa2V5cywgbXNnKSB7XG4gIGlmKGlzU3RyaW5nKG1zZykpXG4gICAgbXNnID0gbmV3IEJ1ZmZlcihtc2cpXG4gIGlmKCFpc0J1ZmZlcihtc2cpKVxuICAgIHRocm93IG5ldyBFcnJvcignbXNnIHNob3VsZCBiZSBidWZmZXInKVxuICB2YXIgY3VydmUgPSBnZXRDdXJ2ZShrZXlzKVxuXG4gIHJldHVybiBjdXJ2ZXNbY3VydmVdXG4gICAgLnNpZ24odG9CdWZmZXIoa2V5cy5wcml2YXRlIHx8IGtleXMpLCBtc2cpXG4gICAgLnRvU3RyaW5nKCdiYXNlNjQnKSsnLnNpZy4nK2N1cnZlXG5cbn1cblxuLy90YWtlcyBhIHB1YmxpYyBrZXksIHNpZ25hdHVyZSwgYW5kIGEgaGFzaFxuLy9hbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBzaWduYXR1cmUgd2FzIHZhbGlkLlxuZXhwb3J0cy52ZXJpZnkgPSBmdW5jdGlvbiAoa2V5cywgc2lnLCBtc2cpIHtcbiAgaWYoaXNPYmplY3Qoc2lnKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25hdHVyZSBzaG91bGQgYmUgYmFzZTY0IHN0cmluZywgZGlkIHlvdSBtZWFuIHZlcmlmeU9iaihwdWJsaWMsIHNpZ25lZF9vYmopJylcbiAgcmV0dXJuIGN1cnZlc1tnZXRDdXJ2ZShrZXlzKV0udmVyaWZ5KFxuICAgIHRvQnVmZmVyKGtleXMucHVibGljIHx8IGtleXMpLFxuICAgIHRvQnVmZmVyKHNpZyksXG4gICAgaXNCdWZmZXIobXNnKSA/IG1zZyA6IG5ldyBCdWZmZXIobXNnKVxuICApXG59XG5cbi8vIE9USEVSIENSWVRQTyBGVU5DVElPTlNcblxuZXhwb3J0cy5obWFjID0gZnVuY3Rpb24gKGRhdGEsIGtleSkge1xuICByZXR1cm4gY3JlYXRlSG1hYyhjcmVhdGVIYXNoLCA2NCwga2V5KVxuICAgIC51cGRhdGUoZGF0YSkuZGlnZXN0KCdiYXNlNjQnKSsnLnNoYTI1Ni5obWFjJ1xufVxuXG5leHBvcnRzLnNpZ25PYmogPSBmdW5jdGlvbiAoa2V5cywgb2JqKSB7XG4gIHZhciBfb2JqID0gY2xvbmUob2JqKVxuICB2YXIgYiA9IG5ldyBCdWZmZXIoSlNPTi5zdHJpbmdpZnkoX29iaiwgbnVsbCwgMikpXG4gIF9vYmouc2lnbmF0dXJlID0gZXhwb3J0cy5zaWduKGtleXMsIGIpXG4gIHJldHVybiBfb2JqXG59XG5cbmV4cG9ydHMudmVyaWZ5T2JqID0gZnVuY3Rpb24gKGtleXMsIG9iaikge1xuICBvYmogPSBjbG9uZShvYmopXG4gIHZhciBzaWcgPSBvYmouc2lnbmF0dXJlXG4gIGRlbGV0ZSBvYmouc2lnbmF0dXJlXG4gIHZhciBiID0gbmV3IEJ1ZmZlcihKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpKVxuICByZXR1cm4gZXhwb3J0cy52ZXJpZnkoa2V5cywgc2lnLCBiKVxufVxuXG5leHBvcnRzLmJveCA9IGZ1bmN0aW9uIChtc2csIHJlY2lwaWVudHMpIHtcbiAgbXNnID0gbmV3IEJ1ZmZlcihKU09OLnN0cmluZ2lmeShtc2cpKVxuXG4gIHJlY2lwaWVudHMgPSByZWNpcGllbnRzLm1hcChmdW5jdGlvbiAoa2V5cykge1xuICAgIHZhciBwdWJsaWMgPSBrZXlzLnB1YmxpYyB8fCBrZXlzXG4gICAgcmV0dXJuIHNvZGl1bS5jcnlwdG9fc2lnbl9lZDI1NTE5X3BrX3RvX2N1cnZlMjU1MTkodG9CdWZmZXIocHVibGljKSlcbiAgfSlcblxuICAvL2l0J3Mgc2luY2UgdGhlIG5vbmNlIGlzIDI0IGJ5dGVzIChhIG11bHRpcGxlIG9mIDMpXG4gIC8vaXQncyBwb3NzaWJsZSB0byBjb25jYXRlbmF0ZSB0aGUgYmFzZTY0IHN0cmluZ3NcbiAgLy9hbmQgc3RpbGwgaGF2ZSBhIHZhbGlkIGJhc2U2NCBzdHJpbmcuXG4gIHJldHVybiBwYi5tdWx0aWJveChtc2csIHJlY2lwaWVudHMpLnRvU3RyaW5nKCdiYXNlNjQnKSsnLmJveCdcbn1cblxuZXhwb3J0cy51bmJveCA9IGZ1bmN0aW9uIChib3hlZCwga2V5cykge1xuICBib3hlZCA9IHRvQnVmZmVyKGJveGVkKVxuICB2YXIgc2sgPSBzb2RpdW0uY3J5cHRvX3NpZ25fZWQyNTUxOV9za190b19jdXJ2ZTI1NTE5KHRvQnVmZmVyKGtleXMucHJpdmF0ZSB8fCBrZXlzKSlcblxuICB2YXIgbXNnID0gcGIubXVsdGlib3hfb3Blbihib3hlZCwgc2spXG4gIGlmKG1zZykgcmV0dXJuIEpTT04ucGFyc2UoJycrbXNnKVxufVxuXG5cbiIsInZhciBwU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4vbGliL2tleXMuanMnKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vbGliL2lzX2FyZ3VtZW50cy5qcycpO1xuXG52YXIgZGVlcEVxdWFsID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCwgb3B0cykge1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fTtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfSBlbHNlIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBEYXRlICYmIGV4cGVjdGVkIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zLiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKHR5cGVvZiBhY3R1YWwgIT0gJ29iamVjdCcgJiYgdHlwZW9mIGV4cGVjdGVkICE9ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyA3LjQuIEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgLy8gZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gIC8vIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgLy8gKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAvLyBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAvLyBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgb3B0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWRPck51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyICh4KSB7XG4gIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHgubGVuZ3RoICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIHguY29weSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeC5zbGljZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoeC5sZW5ndGggPiAwICYmIHR5cGVvZiB4WzBdICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgb3B0cykge1xuICB2YXIgaSwga2V5O1xuICBpZiAoaXNVbmRlZmluZWRPck51bGwoYSkgfHwgaXNVbmRlZmluZWRPck51bGwoYikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuXG4gIGlmIChhLnByb3RvdHlwZSAhPT0gYi5wcm90b3R5cGUpIHJldHVybiBmYWxzZTtcbiAgLy9+fn5JJ3ZlIG1hbmFnZWQgdG8gYnJlYWsgT2JqZWN0LmtleXMgdGhyb3VnaCBzY3Jld3kgYXJndW1lbnRzIHBhc3NpbmcuXG4gIC8vICAgQ29udmVydGluZyB0byBhcnJheSBzb2x2ZXMgdGhlIHByb2JsZW0uXG4gIGlmIChpc0FyZ3VtZW50cyhhKSkge1xuICAgIGlmICghaXNBcmd1bWVudHMoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYSA9IHBTbGljZS5jYWxsKGEpO1xuICAgIGIgPSBwU2xpY2UuY2FsbChiKTtcbiAgICByZXR1cm4gZGVlcEVxdWFsKGEsIGIsIG9wdHMpO1xuICB9XG4gIGlmIChpc0J1ZmZlcihhKSkge1xuICAgIGlmICghaXNCdWZmZXIoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHZhciBrYSA9IG9iamVjdEtleXMoYSksXG4gICAgICAgIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgfSBjYXRjaCAoZSkgey8vaGFwcGVucyB3aGVuIG9uZSBpcyBhIHN0cmluZyBsaXRlcmFsIGFuZCB0aGUgb3RoZXIgaXNuJ3RcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL2VxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kXG4gIC8vfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuICAgIGlmICghZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBvcHRzKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGI7XG59XG4iLCJ2YXIgc3VwcG9ydHNBcmd1bWVudHNDbGFzcyA9IChmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50cylcbn0pKCkgPT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHN1cHBvcnRzQXJndW1lbnRzQ2xhc3MgPyBzdXBwb3J0ZWQgOiB1bnN1cHBvcnRlZDtcblxuZXhwb3J0cy5zdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7XG5mdW5jdGlvbiBzdXBwb3J0ZWQob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn07XG5cbmV4cG9ydHMudW5zdXBwb3J0ZWQgPSB1bnN1cHBvcnRlZDtcbmZ1bmN0aW9uIHVuc3VwcG9ydGVkKG9iamVjdCl7XG4gIHJldHVybiBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09ICdvYmplY3QnICYmXG4gICAgdHlwZW9mIG9iamVjdC5sZW5ndGggPT0gJ251bWJlcicgJiZcbiAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnY2FsbGVlJykgJiZcbiAgICAhT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgJ2NhbGxlZScpIHx8XG4gICAgZmFsc2U7XG59O1xuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nXG4gID8gT2JqZWN0LmtleXMgOiBzaGltO1xuXG5leHBvcnRzLnNoaW0gPSBzaGltO1xuZnVuY3Rpb24gc2hpbSAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICByZXR1cm4ga2V5cztcbn1cbiIsIlxudmFyIHNvZGl1bSA9IHJlcXVpcmUoJ2NobG9yaWRlJylcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICBjdXJ2ZXM6IFsnZWQyNTUxOSddLFxuXG4gIGdlbmVyYXRlOiBmdW5jdGlvbiAoc2VlZCkge1xuICAgIHZhciBrZXlzID0gc29kaXVtLmNyeXB0b19zaWduX3NlZWRfa2V5cGFpcihzZWVkIHx8IGNyeXB0by5yYW5kb21CeXRlcygzMikpXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnZlOiAnZWQyNTUxOScsXG4gICAgICBwdWJsaWM6IGtleXMucHVibGljS2V5LFxuXG4gICAgICAvL3NvIHRoYXQgdGhpcyB3b3JrcyB3aXRoIGVpdGhlciBzb2RpdW1cbiAgICAgIC8vb3IgbGlic29kaXVtLXdyYXBwZXJzIChpbiBicm93c2VyKVxuICAgICAgcHJpdmF0ZToga2V5cy5wcml2YXRlS2V5IHx8IGtleXMuc2VjcmV0S2V5XG4gICAgfVxuICB9LFxuXG4gIHNpZ246IGZ1bmN0aW9uIChwcml2YXRlLCBtZXNzYWdlKSB7XG4gICAgcmV0dXJuIHNvZGl1bS5jcnlwdG9fc2lnbl9kZXRhY2hlZChtZXNzYWdlLCBwcml2YXRlKVxuICB9LFxuXG4gIHZlcmlmeTogZnVuY3Rpb24gKHB1YmxpYywgc2lnLCBtZXNzYWdlKSB7XG4gICAgcmV0dXJuIHNvZGl1bS5jcnlwdG9fc2lnbl92ZXJpZnlfZGV0YWNoZWQoc2lnLCBtZXNzYWdlLCBwdWJsaWMpXG4gIH1cblxufVxuIiwidmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgTGlua3MgPSByZXF1aXJlKCdzdHJlYW12aWV3LWxpbmtzJylcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5cbnZhciBleHRyYWN0TGlua3MgPSByZXF1aXJlKCcuL2xpbmtzJylcblxuLy93ZSBjb3VsZCBoYXZlIHVwIHRvIHNpeCBpbmRleGVzIGZvciBsaW5rcyxcbi8vYnV0IHRoZXNlIGFyZSB0aGUgdGhyZWUgdGhhdCB3ZSByZWFsbHkgbmVlZC5cbi8vKHF1ZXJpZXMgYXJlIGZhc3QgaWYgdGhlIGZpZWxkcyB5b3UgYWxyZWFkeSBrbm93XG4vL2FyZSBsZWZ0IG1vc3QsIGFuZCB0aGUgcmFuZ2VzIGFyZSB0byB0aGUgcmlnaHQgb2YgdGhhdC5cblxudmFyIGluZGV4ZXMgPSBbXG4gIHsga2V5OiAnU1JEJywgdmFsdWU6IFsnc291cmNlJywgJ3JlbCcsICdkZXN0JywgJ3RzJ10gfSxcbiAgeyBrZXk6ICdEUlMnLCB2YWx1ZTogWydkZXN0JywgJ3JlbCcsICdzb3VyY2UnLCAndHMnXSB9LFxuICB7IGtleTogJ1JEUycsIHZhbHVlOiBbJ3JlbCcsICdkZXN0JywgJ3NvdXJjZScsICd0cyddIH1cbl1cblxuZXhwb3J0cy5uYW1lID0gJ2xpbmtzMidcblxuZXhwb3J0cy5tYW5pZmVzdCA9IHtcbiAgcmVhZDogJ3NvdXJjZScsXG4gIGR1bXA6ICdzb3VyY2UnXG59XG5leHBvcnRzLmluaXQgPSBmdW5jdGlvbiAoc3NiLCBjb25maWcpIHtcblxuICB2YXIgZGlyID0gcGF0aC5qb2luKGNvbmZpZy5wYXRoLCAnbGlua3MnKVxuXG4gIHZhciB2ZXJzaW9uID0gNVxuICAvL2l0J3MgcmVhbGx5IG5pY2UgdG8gdHdlYWsgYSBmZXcgdGhpbmdzXG4gIC8vYW5kIHRoZW4gY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlcixcbiAgLy9yZXN0YXJ0IHRoZSBzZXJ2ZXIgYW5kIGhhdmUgaXQgcmVnZW5lcmF0ZSB0aGUgaW5kZXhlcyxcbiAgLy9hbGwgY29uc2lzdGVudCBhZ2Fpbi5cbiAgdmFyIGxpbmtzID0gTGlua3MoZGlyLCBpbmRleGVzLCBleHRyYWN0TGlua3MsIHZlcnNpb24pXG5cbiAgbGlua3MuaW5pdChmdW5jdGlvbiAoZXJyLCBzaW5jZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0xPQUQgTElOS1MgU0lOQ0UnLCBlcnIsIHNpbmNlKVxuICAgIHB1bGwoXG4gICAgICBzc2IuY3JlYXRlTG9nU3RyZWFtKHtndDogc2luY2UgfHwgMCwgbGl2ZTogdHJ1ZSwgbGltaXQ6IC0xfSksXG4gICAgICBwdWxsLnRocm91Z2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJy4nKVxuICAgICAgfSksXG4gICAgICBsaW5rcy53cml0ZShmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmKGVycikgdGhyb3cgZXJyXG4gICAgICB9KVxuICAgIClcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGR1bXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBsaW5rcy5kdW1wKClcbiAgICB9LFxuICAgIHJlYWQ6IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICBpZihvcHRzICYmICdzdHJpbmcnID09IHR5cGVvZiBvcHRzKVxuICAgICAgICB0cnkgeyBvcHRzID0ge3F1ZXJ5OiBKU09OLnBhcnNlKG9wdHMpIH0gfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBwdWxsLmVycm9yKGVycilcbiAgICAgIH1cbiAgICAgIHJldHVybiBsaW5rcy5yZWFkKG9wdHMpXG4gICAgfVxuICB9XG59XG5cblxuIiwidmFyIG1zZ3MgPSByZXF1aXJlKCdzc2ItbXNncycpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRhdGEsIGl0ZXIpIHtcbiAgaWYoZGF0YS5zeW5jKSByZXR1cm5cbiAgdmFyIGNvbnRlbnQgPSBkYXRhLnZhbHVlLmNvbnRlbnRcbiAgdmFyIHNvdXJjZSA9IGRhdGEudmFsdWUuYXV0aG9yXG5cbiAgLy9UT0RPIHBhcnNlIHRoZSBsaW5rcyBmcm9tIG1hcmtkb3duXG4gIC8vYW5kIGluZGV4IHRob3NlIGFsc28uIG1vc3Qgb2YgdGhlc2UgYXJlIGh0dHAgbGlua3MsXG4gIC8vc29tZSBpcGZzLlxuXG4gIC8vaXQgd291bGQgYmUgZWFzeSB0byB0YWcgYW5vdGhlciBtZXNzYWdlLFxuICAvL2FuZCBxdWVyeSB0aGF0LCBvbmNlIG1hcmtkb3duIGxpbmtzIGFyZSByZWFkeVxuICAvL1sjaGFzaHRhZ10obXNnSWQpIHdvdWxkIHRhZyBtc2cgd2l0aCAjaGFzaHRhZ1xuXG4gIC8vVE9ETzogd2hhdCBhYm91dCBhIHN5bnRheCBmb3Igc2VsZi1saW5rcz9cbiAgLy9pbnRlcnByZXQgYSBsb25lIGhhc2h0YWcgaW4gYSBtZXNzYWdlIGFzIGEgc2VsZmxpbmssXG4gIC8vYW5kIHRoZW4gdGhhdCB3aWxsIHdvcmsuXG5cbiAgbXNncy5pbmRleExpbmtzKGRhdGEudmFsdWUsIGZ1bmN0aW9uIChsbiwgcmVsKSB7XG4gICAgdmFyIGRlc3QgPSBsbi5saW5rXG5cbiAgICAvL3Rha2UgYWxsIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGxpbmtzIGFuZCBwdXRcbiAgICAvL3RoZSByZWxhdmFudCBhc3BlY3RzIGludG8gdGhlIGluZGV4LFxuICAgIC8vYXMgcGFydCBvZiB0aGUgcmVsLCBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gbG9va3VwXG4gICAgLy90aGUgbWVzc2FnZSB0byBnZXQgdGhlbSwgYW5kIGV2ZW4gYmV0dGVyLFxuICAgIC8vd2UgY2FuIHF1ZXJ5IGJ5IHRoZXNlIGF0dHJpYnV0ZXMhIGVuYWJsaW5nIHNlYXJjaC5cblxuICAgIGlmKHJlbCA9PSAndm90ZScpXG4gICAgICByZWwgPSBbJ3ZvdGUnLCBsbi52YWx1ZV1cbiAgICBlbHNlIGlmKHJlbCA9PSAnZmxhZycpXG4gICAgICByZWwgPSBbJ2ZsYWcnLCBsbi5yZWFzb25dXG4gICAgZWxzZSBpZihyZWwgPT0gJ21lbnRpb25zJykge1xuICAgICAgaWYobG4ubGlua1swXSA9PT0gJ0AnKVxuICAgICAgICByZWwgPSBbJ21lbnRpb25zJywgJ0AnKyhsbi5uYW1lfHwnJykudG9Mb3dlckNhc2UoKV1cbiAgICAgIGVsc2UgIGlmKGxuLmxpbmtbMF0gPT0gJyYnKSB7XG4gICAgICAgIHJlbCA9IFsnbWVudGlvbnMnLCBsbi5maWxlbmFtZSB8fCBsbi5uYW1lLCBsbi5zaXplXVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vVE9ETzogY2hlY2sgd2hldGhlciB0aGV5IGluY2x1ZGVkIHNvbWUgdGV4dCBpbiB0aGUgbWFya2Rvd24gbGluay5cbiAgICAgICAgcmVsID0gWydtZW50aW9ucyddXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYocmVsID09ICdhYm91dCcpIHtcbiAgICAgIHJlbCA9IFsnYWJvdXQnLCBjb250ZW50Lm5hbWVdXG4gICAgfVxuICAgIGVsc2UgaWYocmVsID09ICdpbWFnZScpXG4gICAgICByZWwgPSBbJ2ltYWdlJywgbG4udHlwZSwgbG4uc2l6ZV1cbiAgICBlbHNlIGlmKHJlbCA9PSAnY29udGFjdCcpXG4gICAgICByZWwgPSBbJ2NvbnRhY3QnLCBjb250ZW50LmZvbGxvd2luZywgY29udGVudC5ibG9ja2luZ11cbiAgICBlbHNlXG4gICAgICByZWwgPSBbcmVsXVxuXG4gICAgaXRlcih7XG4gICAgICBzb3VyY2U6IHNvdXJjZSwgZGVzdDogZGVzdCxcbiAgICAgIHJlbDogcmVsLFxuICAgICAgdHM6IGRhdGEudGltZXN0YW1wXG4gICAgfSlcbiAgfSlcbn1cblxuXG5cblxuXG4iLCJ2YXIgcmVmID0gcmVxdWlyZSgnc3NiLXJlZicpXG5cbmZ1bmN0aW9uIGlzT2JqZWN0IChvKSB7IHJldHVybiBvICYmICdvYmplY3QnID09PSB0eXBlb2YgbyB9XG5mdW5jdGlvbiBpc0Jvb2wgKG8pIHsgcmV0dXJuICdib29sZWFuJyA9PT0gdHlwZW9mIG8gfVxuZnVuY3Rpb24gaXNTdHJpbmcgKHMpIHsgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2YgcyB9XG5cbmZ1bmN0aW9uIHRvQXJyYXkgKHYsIGZvcmNlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHYpKVxuICAgIHJldHVybiB2XG5cbiAgLy8gbWF5YmUgaXQncyBhbiBhcnJheS1saWtlIG9iamVjdD8gKG9iamVjdCB3aXRoIG9yZGVyZWQgbnVtZXJpYyBrZXlzKVxuICB2YXIgaT0wLCBhcnI9W11cbiAgaWYgKGlzT2JqZWN0KHYpKSB7XG4gICAgd2hpbGUgKHZbaV0pIHtcbiAgICAgIGFycltpXSA9IHZbaV1cbiAgICAgIGkrK1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoYXJyKS5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIGFyciAvLyBpdCB3YXMhXG4gIH1cblxuICAvLyBpdCB3YXNudC4uLlxuICBpZiAoZm9yY2UpIHtcbiAgICAvLyAuLi5qdXN0IHB1dCB2IGluIHRoZSBhcnJcbiAgICBhcnIucHVzaCh2KVxuICAgIHJldHVybiBhcnJcbiAgfVxuICByZXR1cm4gdlxufVxuXG4vLyBnaXZlbiBhbnkgcGFydCBvZiB0aGUgbWVzc2FnZS1vYmogaGllcmFyY2h5LCBwdWxsIG91dCB0aGUgY29udGVudC1vYmplY3Rcbi8vIC0gdXNlcyBkdWNrdHlwaW5nIHRvIGZpbmQgdGhlIGNvbnRlbnRcbmZ1bmN0aW9uIHRvTXNnQ29udGVudCAob2JqKSB7XG4gIGlmICghb2JqKVxuICAgIHJldHVybiBudWxsXG4gIGlmIChvYmoudmFsdWUgJiYgb2JqLnZhbHVlLmNvbnRlbnQgJiYgb2JqLnZhbHVlLmNvbnRlbnQudHlwZSlcbiAgICByZXR1cm4gb2JqLnZhbHVlLmNvbnRlbnRcbiAgaWYgKG9iai5jb250ZW50ICYmIG9iai5jb250ZW50LnR5cGUpXG4gICAgcmV0dXJuIG9iai5jb250ZW50XG4gIHJldHVybiBvYmpcbn1cblxuZnVuY3Rpb24gdHJhdmVyc2UgKG9iaiwgZWFjaCkge1xuICBmb3IgKHZhciBrIGluIG9iaikge1xuICAgIGlmICghb2JqW2tdKVxuICAgICAgY29udGludWVcbiAgICB2YXIgYXJyID0gdG9BcnJheShvYmpba10sIGZhbHNlKVxuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIGVhY2godiwgaylcbiAgICAgIH0pXG4gICAgfSBlbHNlXG4gICAgICBlYWNoKG9ialtrXSwgaylcbiAgfVxufVxuXG4vLyBpdGVyYXRlIGxpbmtzIGluIHRoZSBtZXNzYWdlXG5leHBvcnRzLmluZGV4TGlua3MgPSBmdW5jdGlvbiAobWVzc2FnZSwgb3B0cywgZWFjaCkge1xuICBpZiAodHlwZW9mIG9wdHMgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVhY2ggPSBvcHRzXG4gICAgb3B0cyA9IG51bGxcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMgPT0gJ3N0cmluZycpXG4gICAgb3B0cyA9IHsgcmVsOiBvcHRzIH1cbiAgaWYgKCFvcHRzKVxuICAgIG9wdHMgPSB7fVxuICB2YXIgbXNnICA9IG9wdHMubXNnXG4gIHZhciBmZWVkID0gb3B0cy5mZWVkXG4gIHZhciBibG9iID0gb3B0cy5ibG9iXG4gIHZhciBhbnkgID0gIShtc2cgfHwgZmVlZCB8fCBibG9iKVxuXG4gIHRyYXZlcnNlKHRvTXNnQ29udGVudChtZXNzYWdlKSwgZnVuY3Rpb24gKG9iaiwgcmVsKSB7XG4gICAgaWYgKG9wdHMucmVsICYmIHJlbCAhPT0gb3B0cy5yZWwpIHJldHVyblxuXG4gICAgdmFyIHIgPSAodHlwZW9mIG9iaiA9PSAnc3RyaW5nJykgPyBvYmogOiBvYmoubGlua1xuICAgIGlmIChhbnkpIHtcbiAgICAgIGlmICghcmVmLmlzTGluayhyKSkgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtc2cpIHtcbiAgICAgICAgaWYgKGlzQm9vbChtc2cpICYmIHJlZi50eXBlKHIpICE9ICdtc2cnKSByZXR1cm4gXG4gICAgICAgIGlmICghaXNCb29sKG1zZykgJiYgciAhPSBtc2cpIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZmVlZCkge1xuICAgICAgICBpZiAoaXNCb29sKGZlZWQpICYmIHJlZi50eXBlKHIpICE9ICdmZWVkJykgcmV0dXJuIFxuICAgICAgICBpZiAoIWlzQm9vbChmZWVkKSAmJiByICE9IGZlZWQpIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoYmxvYikge1xuICAgICAgICBpZiAoaXNCb29sKGJsb2IpICYmIHJlZi50eXBlKHIpICE9ICdibG9iJykgcmV0dXJuIFxuICAgICAgICBpZiAoIWlzQm9vbChibG9iKSAmJiByICE9IGJsb2IpIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGVhY2goKHR5cGVvZiBvYmogPT0gJ3N0cmluZycpID8geyBsaW5rOiBvYmogfSA6IG9iaiwgcmVsKVxuICB9KVxufVxuXG4vLyBjb2VyY2UgdG8gbGluayBvYmplY3QsIG9wdGlvbmFsbHkgb2YgYSBnaXZlbiB0eXBlXG4vLyBudWxsIGlmIGNvZXJzaW9uIGZhaWxzXG5leHBvcnRzLmxpbmsgPVxuZXhwb3J0cy5hc0xpbmsgPSBmdW5jdGlvbiAob2JqLCB0eXBlKSB7XG4gIGlmICghb2JqKVxuICAgIHJldHVybiBudWxsXG4gIGlmIChpc1N0cmluZyhvYmopKVxuICAgIG9iaiA9IHsgbGluazogb2JqIH1cbiAgcmV0dXJuIGlzTGluayhvYmosIHR5cGUpID8gb2JqIDogbnVsbFxufVxuXG4vLyBjb2VyY2UgdG8gbGlua3MgYXJyYXksIG9wdGlvbmFsbHkgb2YgYSBnaXZlbiB0eXBlXG4vLyBmaWx0ZXJzIG91dCBmYWlsZWQgY29lcnNpb25zXG5leHBvcnRzLmxpbmtzID1cbmV4cG9ydHMuYXNMaW5rcyA9IGZ1bmN0aW9uIChvYmosIHR5cGUpIHtcbiAgaWYgKCFvYmopXG4gICAgcmV0dXJuIFtdXG4gIHZhciBhcnIgPSB0b0FycmF5KG9iaiwgdHJ1ZSlcbiAgcmV0dXJuIGFyclxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKGwpIHsgcmV0dXJuIGlzTGluayhsLCB0eXBlKSB9KVxuICAgIC5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICh0eXBlb2YgbyA9PSAnc3RyaW5nJykgPyB7IGxpbms6IG8gfSA6IG8gfSlcbn1cblxuLy8gZGV0ZWN0cyB3aGV0aGVyIHRoZSBnaXZlbiBzdHJpbmcvb2JqZWN0IGlzIGEgbGlua1xuLy8gLSBgdHlwZWAgb3B0aW9uYWxcbnZhciBpc0xpbmsgPVxuZXhwb3J0cy5pc0xpbmsgPSBmdW5jdGlvbiAob2JqLCB0eXBlKSB7XG4gIGlmICghb2JqKVxuICAgIHJldHVybiBmYWxzZVxuICB2YXIgciA9IChpc1N0cmluZyhvYmopKSA/IG9iaiA6IG9iai5saW5rXG4gIHJldHVybiAodHlwZSkgPyAocmVmLnR5cGUocikgPT0gdHlwZSkgOiByZWYuaXNMaW5rKHIpXG59XG5cbmZ1bmN0aW9uIGluZGV4TGlua3NUbyAobXNnQSwgbXNnQiwgZWFjaCkge1xuICBpZiAoIW1zZ0EgfHwgIW1zZ0IgfHwgIW1zZ0Iua2V5KVxuICAgIHJldHVyblxuICBleHBvcnRzLmluZGV4TGlua3MobXNnQSwgZnVuY3Rpb24gKGwsIHJlbCkge1xuICAgIGlmIChsLmxpbmsgPT09IG1zZ0Iua2V5KVxuICAgICAgZWFjaChsLCByZWwpXG4gIH0pXG59XG5cbi8vIGl0ZXJhdGUgYG1zZ0FgIGFuZCBmaW5kIGFsbCBsaW5rcyB0byBgbXNnQmAsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgbGluayBvYmplY3RzXG5leHBvcnRzLmxpbmtzVG8gPSBmdW5jdGlvbiAobXNnQSwgbXNnQikge1xuICB2YXIgbGlua3MgPSBbXVxuICBpbmRleExpbmtzVG8obXNnQSwgbXNnQiwgZnVuY3Rpb24gKGxpbmssIHJlbCkge1xuICAgIGxpbmtzLnB1c2gobGluaylcbiAgfSlcbiAgcmV0dXJuIGxpbmtzXG59XG5cbi8vIGl0ZXJhdGUgYG1zZ0FgIGFuZCBmaW5kIGFsbCBsaW5rcyB0byBgbXNnQmAsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgbGluayByZWxzIFxuZXhwb3J0cy5yZWxhdGlvbnNUbyA9IGZ1bmN0aW9uIChtc2dBLCBtc2dCKSB7XG4gIHZhciByZWxzID0gW11cbiAgaW5kZXhMaW5rc1RvKG1zZ0EsIG1zZ0IsIGZ1bmN0aW9uIChsaW5rLCByZWwpIHtcbiAgICByZWxzLnB1c2gocmVsKVxuICB9KVxuICByZXR1cm4gcmVsc1xufSIsIlxudmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxudmFyIExpbmtzID0gcmVxdWlyZSgnc3RyZWFtdmlldy1saW5rcycpXG52YXIgZXhwbGFpbiA9IHJlcXVpcmUoJ2V4cGxhaW4tZXJyb3InKVxuXG5leHBvcnRzLm5hbWUgPSAncXVlcnknXG5leHBvcnRzLnZlcnNpb24gPSByZXF1aXJlKCcuL3BhY2thZ2UuanNvbicpLnZlcnNpb25cbmV4cG9ydHMubWFuaWZlc3QgPSB7XG4gIHJlYWQ6ICdzb3VyY2UnLCBkdW1wOiAnc291cmNlJ1xufVxuXG52YXIgaW5kZXhlcyA9IFtcbiAge2tleTogJ2NsaycsIHZhbHVlOiBbWyd2YWx1ZScsICdhdXRob3InXSwgWyd2YWx1ZScsICdzZXF1ZW5jZSddLCAndGltZXN0YW1wJ10gfSxcbiAge2tleTogJ3R5cCcsIHZhbHVlOiBbWyd2YWx1ZScsICdjb250ZW50JywgJ3R5cGUnXSwgJ3RpbWVzdGFtcCddIH0sXG4gIHtrZXk6ICdoc2gnLCB2YWx1ZTogWydrZXknLCAndGltZXN0YW1wJ119LFxuLy8gIHtrZXk6ICdhdHknLCB2YWx1ZTogW1sndmFsdWUnLCAnYXV0aG9yJ10sIFsndmFsdWUnLCAnY29udGVudCcsICd0eXBlJ10sICd0cyddfVxuXVxuXG4vL2NyZWF0ZUhpc3RvcnlTdHJlYW0oIGlkLCBzZXEgKVxuLy9beyRmaWx0ZXI6IHthdXRob3I6IDxpZD4sIHNlcXVlbmNlOiB7JGd0OiA8c2VxPn19fSwgeyRtYXA6IHRydWV9XVxuXG4vL21lc3NhZ2VzQnlUeXBlICh0eXBlKVxuXG4vL1t7JGZpbHRlcjoge2NvbnRlbnQ6IHt0eXBlOiA8dHlwZT59fX0sIHskbWFwOiB0cnVlfV1cblxuZXhwb3J0cy5pbml0ID0gZnVuY3Rpb24gIChzc2IsIGNvbmZpZykge1xuXG4gIHZhciBkaXIgPSBwYXRoLmpvaW4oY29uZmlnLnBhdGgsICdxdWVyeScpXG5cbiAgdmFyIHZlcnNpb24gPSAxMlxuICAvL2l0J3MgcmVhbGx5IG5pY2UgdG8gdHdlYWsgYSBmZXcgdGhpbmdzXG4gIC8vYW5kIHRoZW4gY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlcixcbiAgLy9yZXN0YXJ0IHRoZSBzZXJ2ZXIgYW5kIGhhdmUgaXQgcmVnZW5lcmF0ZSB0aGUgaW5kZXhlcyxcbiAgLy9hbGwgY29uc2lzdGVudCBhZ2Fpbi5cbiAgZnVuY3Rpb24gaWQgKGUsIGVtaXQpIHtcbiAgICByZXR1cm4gZW1pdChlKVxuICB9XG5cbiAgdmFyIGxpbmtzID0gTGlua3MoZGlyLCBpbmRleGVzLCBpZCwgdmVyc2lvbilcblxuICBsaW5rcy5pbml0KGZ1bmN0aW9uIChlcnIsIHNpbmNlKSB7XG4gICAgcHVsbChcbiAgICAgIHNzYi5jcmVhdGVMb2dTdHJlYW0oe2d0OiBzaW5jZSB8fCAwLCBsaXZlOiB0cnVlLCBsaW1pdDogLTF9KSxcbiAgICAgIHB1bGwudGhyb3VnaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCd4JylcbiAgICAgIH0pLFxuICAgICAgbGlua3Mud3JpdGUoZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZihlcnIpIHRocm93IGVyclxuICAgICAgfSlcbiAgICApXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBkdW1wOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbGlua3MuZHVtcCgpXG4gICAgfSxcblxuICAgIHJlYWQ6IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICBpZihvcHRzICYmICdzdHJpbmcnID09IHR5cGVvZiBvcHRzKVxuICAgICAgICB0cnkgeyBvcHRzID0ge3F1ZXJ5OiBKU09OLnBhcnNlKG9wdHMpIH0gfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBwdWxsLmVycm9yKGVycilcbiAgICAgIH1cbiAgICBjb25zb2xlLmxvZygncXVlcnknLCBKU09OLnN0cmluZ2lmeShvcHRzLnF1ZXJ5LCBudWxsLCAyKSlcbiAgICAgIHJldHVybiBsaW5rcy5yZWFkKG9wdHMsIGZ1bmN0aW9uICh0cywgY2IpIHtcbiAgICAgICAgc3NiLnN1YmxldmVsKCdsb2cnKS5nZXQodHMsIGZ1bmN0aW9uIChlcnIsIGtleSkge1xuICAgICAgICAgIGlmKGVycikgcmV0dXJuIGNiKGV4cGxhaW4oZXJyLCAnbWlzc2luZyB0aW1lc3RhbXA6Jyt0cykpXG4gICAgICAgICAgc3NiLmdldChrZXksIGZ1bmN0aW9uIChlcnIsIHZhbHVlKSB7XG4gICAgICAgICAgICBpZihlcnIpIHJldHVybiBjYihleHBsYWluKGVyciwgJ21pc3Npbmcga2V5Oicra2V5KSlcbiAgICAgICAgICAgIGNiKG51bGwsIHtrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCB0aW1lc3RhbXA6IHRzfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuXG4iLCJcbm1vZHVsZS5leHBvcnRzID0ge1xuICAkY291bnQ6XG4gICAgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIGlmKGIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIChhfHwwKVxuICAgICAgcmV0dXJuIChhfHwwKSsxXG4gICAgfSxcbiAgJHN1bTpcbiAgICBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgaWYoYiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gKGF8fDApXG4gICAgICByZXR1cm4gKGF8fDApKyhifHwwKVxuICAgIH0sXG4gICRtYXg6XG4gICAgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIGlmKGIgPT09IHVuZGVmaW5lZCkgYVxuICAgICAgaWYoYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYlxuICAgICAgcmV0dXJuIE1hdGgubWF4KGEsIGIpXG4gICAgfSxcbiAgJG1pbjpcbiAgICBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgaWYoYiA9PT0gdW5kZWZpbmVkKSBhXG4gICAgICBpZihhID09PSB1bmRlZmluZWQpIHJldHVybiBiXG4gICAgICByZXR1cm4gTWF0aC5taW4oYSwgYilcbiAgICB9LFxuICAkY29sbGVjdDpcbiAgICBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgaWYoIWEpIGEgPSBhIHx8IFtdXG4gICAgICBpZighQXJyYXkuaXNBcnJheShhKSkgYSA9IFthXVxuICAgICAgYS5wdXNoKGIpXG4gICAgICByZXR1cm4gYVxuICAgIH1cbn1cblxuIiwidmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG5cbnZhciBmaWx0ZXIgPSByZXF1aXJlKCcuL2ZpbHRlcicpXG52YXIgbWFwID0gcmVxdWlyZSgnLi9tYXAnKVxudmFyIHJlZHVjZSA9IHJlcXVpcmUoJy4vcmVkdWNlJylcbnZhciBTaW5rVGhyb3VnaCA9IHJlcXVpcmUoJ3B1bGwtc2luay10aHJvdWdoJylcblxuZnVuY3Rpb24gZmlyc3QgKHEpIHtcbiAgZm9yKHZhciBrIGluIHEpIHJldHVybiBrXG59XG5cbmZ1bmN0aW9uIGdldCAocSkge1xuICB2YXIgayA9IGZpcnN0KHEpXG4gIHZhciBzID0gay5zdWJzdHJpbmcoMSlcbiAgaWYoa1swXSA9PSAnJCcgJiYgZXhwb3J0c1tzXSkgcmV0dXJuIGV4cG9ydHNbc10ocVtrXSlcbiAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGZ1bmN0aW9uOicrIGspXG59XG5cbmZ1bmN0aW9uIGxhc3QgKGwpIHtcbiAgcmV0dXJuIGxbbC5sZW5ndGggLSAxXVxufVxuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocSwgY2IpIHtcbiAgcSA9IHEuZmlsdGVyKEJvb2xlYW4pXG4gIGlmKGxhc3QocSkuJHJlZHVjZSAmJiBjYikge1xuICAgIHJldHVybiBwdWxsLmFwcGx5KG51bGwsXG4gICAgICBxLnNsaWNlKDAsIHEubGVuZ3RoIC0gMSkubWFwKGdldClcbiAgICAgICAgLmNvbmNhdChleHBvcnRzLnJlZHVjZShsYXN0KHEpLiRyZWR1Y2UsIGNiKSlcbiAgICApXG4gIH1cbiAgZWxzZSBpZihBcnJheS5pc0FycmF5KHEpKVxuICAgIHJldHVybiBwdWxsLmFwcGx5KG51bGwsIHEubWFwKGdldCkpXG4gIGVsc2VcbiAgcmV0dXJuIGdldChxKVxufVxuXG5leHBvcnRzLmZpbHRlciA9IGZ1bmN0aW9uIChxKSB7XG4gIHJldHVybiBwdWxsLmZpbHRlcihmaWx0ZXIocSkpXG59XG5cbmV4cG9ydHMubWFwID0gZnVuY3Rpb24gKHEpIHtcbiAgcmV0dXJuIHB1bGwocHVsbC5tYXAobWFwKHEpKSxwdWxsLmZpbHRlcigpKVxufVxuXG5leHBvcnRzLnJlZHVjZSA9IGZ1bmN0aW9uIChxLCBjYikge1xuICBpZihjYilcbiAgICByZXR1cm4gcHVsbC5yZWR1Y2UocmVkdWNlKHEpLCBudWxsLCBjYilcbiAgcmV0dXJuIHB1bGwoU2lua1Rocm91Z2goZnVuY3Rpb24gKGNiKSB7XG4gICAgcmV0dXJuIHB1bGwucmVkdWNlKHJlZHVjZShxKSwgbnVsbCwgY2IpXG4gIH0pLCBwdWxsLmZsYXR0ZW4oKSlcbn1cblxuIiwidmFyIHUgPSByZXF1aXJlKCcuL3V0aWwnKVxudmFyIG1hcCA9IHUubWFwXG5cbmZ1bmN0aW9uIGlkICh2LCBrKSB7XG4gIHJldHVybiBrID8gdltrXSA6IHZcbn1cblxuZnVuY3Rpb24gaXNOdWxsIChuKSB7XG4gIHJldHVybiBuID09IG51bGxcbn1cblxuZnVuY3Rpb24ga2V5KHEpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2KSB7XG4gICAgaWYoaXNOdWxsKHYpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHZbcV1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRoIChxKSB7XG4gIHJldHVybiBxLnJlZHVjZShmdW5jdGlvbiAobWFwMSwgbWFwMikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gbWFwMihtYXAxKHYpKSB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIG5vdEVtcHR5IChvKSB7XG4gIGZvcih2YXIgayBpbiBvKSByZXR1cm4gb1xuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIG9iaiAocSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHYpIHtcbiAgICBpZihpc051bGwodikpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gbm90RW1wdHkobWFwKHEsIGZ1bmN0aW9uIChmbiwgaywgbykge1xuICAgICAgcmV0dXJuIGZuKHYsIGspXG4gICAgfSkpXG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZShxKSB7XG4gIGlmKHRydWUgPT09IHEpIHJldHVybiBpZFxuICBpZihpc051bGwocSkpIHJldHVybiBpc051bGxcbiAgaWYodS5pc1N0cmluZyhxKSB8fCB1LmlzTnVtYmVyKHEpKSByZXR1cm4ga2V5KHEpXG4gIGlmKHUuaXNBcnJheShxKSkgcmV0dXJuIHBhdGgocS5tYXAobWFrZSkpXG4gIGlmKHUuaXNPYmplY3QocSkpIHJldHVybiBvYmoobWFwKHEsIG1ha2UpKVxuICB0aHJvdyBuZXcgRXJyb3IoJ25vIG1hdGNoIC0gc2hvdWxkIG5ldmVyIGhhcHBlbicpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFrZVxuXG4iLCJ2YXIgdSA9IHJlcXVpcmUoJy4vdXRpbCcpXG52YXIgTWFwID0gcmVxdWlyZSgnLi9tYXAnKVxudmFyIHNpbXBsZSA9IHJlcXVpcmUoJy4vYmFzaWMnKVxudmFyIHNlYXJjaCA9IHJlcXVpcmUoJ2JpbmFyeS1zZWFyY2gnKVxudmFyIGNvbXBhcmUgPSByZXF1aXJlKCd0eXBld2lzZWxpdGUnKVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7IHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZiB9XG5cbmZ1bmN0aW9uIGlzU2ltcGxlKHF1ZXJ5KSB7XG4gIGlmKHF1ZXJ5LiRyZWR1Y2UpIHJldHVybiBhbWFrZShxdWVyeS4kcmVkdWNlKVxuICBmb3IodmFyIGsgaW4gc2ltcGxlKSBpZih1LmhhcyhxdWVyeSwgaykpIHJldHVybiBsb29rdXAoc2ltcGxlW2tdLCBxdWVyeVtrXSlcbn1cblxuLy90aGlzIHNob3VsZCBiZSBhIHJlZHVjZSBhbmQgYSBtYXBcbmZ1bmN0aW9uIGxvb2t1cChyZWR1Y2UsIHBhdGgpIHtcbiAgaWYocGF0aCA9PT0gdHJ1ZSkgcmV0dXJuIHJlZHVjZVxuICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gcmVkdWNlKGEsIHUuZ2V0KGIsIHBhdGgpKVxuICB9XG59XG5cbmZ1bmN0aW9uIG11bHRpKHF1ZXJ5KSB7XG4gIGlmKHUuaXNGdW5jdGlvbihxdWVyeSkpIHJldHVybiBxdWVyeVxuXG4gIHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiB1Lm1hcChxdWVyeSwgZnVuY3Rpb24gdHJhdmVyc2UgKHJlZHVjZSwgaykge1xuICAgICAgLy9zb21lIHJlZHVjZSBmdW5jdGlvbnMgbWF5IGJlIG1hcHMgKHdoaWNoIHRha2Ugb25lIGFyZylcbiAgICAgIHJldHVybiByZWR1Y2UubGVuZ3RoID09IDEgPyByZWR1Y2UoYikgOiByZWR1Y2UoYVtrXSwgYilcbiAgICB9LCBhID0gYSB8fCB7fSlcbiAgfVxufVxuXG4vL3Jhd3BhdGhzLCByZWR1Y2VkcGF0aHMsIHJlZHVjZVxuZnVuY3Rpb24gYXJyYXlHcm91cCAoX2csIGcsIHJlZHVjZSkge1xuXG4gIC8vd2UgY2FuIHVzZSBhIGRpZmZlcmVudCBsb29rdXAgcGF0aCBvbiB0aGUgcmlnaHQgaGFuZCBvYmplY3RcbiAgLy9pcyBhbHdheXMgdGhlIFwibmVlZGxlXCJcbiAgLy9jb21wYXJlKGhheXN0YXlbal0sIG5lZWRsZSlcbiAgZnVuY3Rpb24gX2NvbXBhcmUgKGhheSwgbmVlZGxlKSB7XG4gICAgZm9yKHZhciBpIGluIF9nKSB7XG4gICAgICB2YXIgeCA9IHUuZ2V0KGhheSwgX2dbaV0pLCB5ID0gbmVlZGxlW2ldXG4gICAgaWYoeCAhPT0geSkgcmV0dXJuIGNvbXBhcmUoeCwgeSkgLy8gPCB5ID8gLTEgOiAxXG4gICAgfVxuICAgIHJldHVybiAwXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICBpZihhICYmICFBcnJheS5pc0FycmF5KGEpKSBhID0gcmVkdWNlKFtdLCBhKVxuICAgIHZhciBBID0gYSA9IGEgfHwgW11cbiAgICB2YXIgaSA9IHNlYXJjaChBLCBnLm1hcChmdW5jdGlvbiAoZm4pIHsgcmV0dXJuIGZuKGIpIH0pLCBfY29tcGFyZSlcblxuICAgIGlmKGkgPj0gMCkgQVtpXSA9IHJlZHVjZShBW2ldLCBiKVxuICAgIGVsc2UgICAgICAgQS5zcGxpY2UofmksIDAsIHJlZHVjZSh1bmRlZmluZWQsIGIpKVxuXG4gICAgcmV0dXJuIGFcbiAgfVxufVxuXG5mdW5jdGlvbiBvYmplY3RHcm91cCAoZywgcmVkdWNlKSB7XG4gIGlmKCdzdHJpbmcnID09PSB0eXBlb2YgZykgZyA9IFtnXVxuICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgQSA9IGEgPSBhIHx8IHt9XG4gICAgdS5lYWNoKGcsIGZ1bmN0aW9uIChrLCBpKSB7XG4gICAgICB2YXIgbGFzdCA9IChpID09IChnLmxlbmd0aCAtIDEpKVxuICAgICAgdmFyIHYgPSB1LmdldChiLCBrKVxuICAgICAgQVt2XSA9IGxhc3QgPyByZWR1Y2UoQVt2XSwgYikgOiBBW3ZdIHx8IHt9XG4gICAgICBBID0gQVt2XVxuICAgIH0pXG4gICAgcmV0dXJuIGFcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlMiAocXVlcnkpIHtcbiAgdmFyIHIgPSBpc1NpbXBsZShxdWVyeSlcbiAgaWYocikgcmV0dXJuIHJcbiAgaWYocXVlcnkuJGdyb3VwKVxuICAgIHJldHVybiBvYmplY3RHcm91cChxdWVyeS4kZ3JvdXAsIG11bHRpKG1ha2UyKHF1ZXJ5LiRyZWR1Y2UpKSlcbiAgaWYocXVlcnkuJHJlZHVjZSlcbiAgICByZXR1cm4gbWFrZTIocXVlcnkuJHJlZHVjZSlcbiAgaWYodS5pc09iamVjdChxdWVyeSkpXG4gICAgcmV0dXJuIHUubWFwKHF1ZXJ5LCBtYWtlMilcbiAgcmV0dXJuIE1hcChxdWVyeSlcbn1cblxuZnVuY3Rpb24gbWFrZSAocXVlcnkpIHtcbiAgdmFyIHIgPSBpc1NpbXBsZShxdWVyeSlcbiAgaWYocikgcmV0dXJuIHJcbiAgZWxzZSBpZihxdWVyeS4kZ3JvdXApXG4gICAgcmV0dXJuIG9iamVjdEdyb3VwKHF1ZXJ5LiRncm91cCwgZ21ha2UocXVlcnkuJHJlZHVjZSkpXG4gIGVsc2UgaWYodS5pc09iamVjdChxdWVyeSkgJiYgIXUuaXNBcnJheShxdWVyeSkpIHtcbiAgICByZXR1cm4gbXVsdGkodS5tYXAocXVlcnksIGdtYWtlKSlcbiAgfVxuICBlbHNlIHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiB1LmdldChiLCBxdWVyeSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhbWFrZSAocXVlcnkpIHtcbiAgdmFyIF9xdWVyeSA9IG1ha2UyKHF1ZXJ5KVxuICBpZihxdWVyeS4kZ3JvdXApXG4gICAgICByZXR1cm4gb2JqZWN0R3JvdXAocXVlcnkuJGdyb3VwLCBtYWtlKHF1ZXJ5LiRyZWR1Y2UpKVxuICB2YXIgciA9IGlzU2ltcGxlKHF1ZXJ5KVxuICBpZihyKSByZXR1cm4gclxuXG4gIC8vZ2V0IHRoZSBsb29rdXAgcGF0aHMsIGFuZCB0aGUgcGF0aHMgdGhleSB3aWxsIGJlIHNhdmVkIHRvLlxuICAvL3RoZXNlIHdpbGwgYm90aCBiZSBwYXNzZWQgdG8gYXJyYXlHcm91cC5cbiAgdmFyIHBhdGhzID0gW11cbiAgdmFyIF9wYXRocyA9IHUucGF0aHMoX3F1ZXJ5LCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZih1LmlzRnVuY3Rpb24odmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHBhdGhzLnB1c2godmFsdWUpLCB0cnVlXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBwYXRocy5sZW5ndGggPyBhcnJheUdyb3VwKF9wYXRocywgcGF0aHMsIG1ha2UocXVlcnkpKSA6IG1ha2UocXVlcnkpXG59XG5cbmZ1bmN0aW9uIGdtYWtlIChxdWVyeSkge1xuICBpZihxdWVyeS4kZ3JvdXAgJiYgIXF1ZXJ5LiRyZWR1Y2UpIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgJHJlZHVjZScpXG4gIHJldHVybiBxdWVyeS4kZ3JvdXAgPyBvYmplY3RHcm91cChxdWVyeS4kZ3JvdXAsIGdtYWtlKHF1ZXJ5LiRyZWR1Y2UpKSA6IG1ha2UocXVlcnkpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYW1ha2VcblxuXG5cblxuIiwiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIGlzU3RyaW5nKHMpIHsgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2YgcyB9XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKG4pIHsgcmV0dXJuICFpc05hTigrbikgfVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4gKGIpIHsgcmV0dXJuICdib29sZWFuJyA9PT0gdHlwZW9mIGIgfVxuXG5mdW5jdGlvbiBpc0Jhc2ljIChwKSB7IHJldHVybiBpc1N0cmluZyhwKSB8fCBpc051bWJlcihwKSB8fCBpc0Jvb2xlYW4ocCkgfVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmKSB7IHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZiB9XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheVxuXG5mdW5jdGlvbiBpc09iamVjdCAobykgeyByZXR1cm4gbyAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG8gJiYgIWlzQXJyYXkobykgfVxuXG5mdW5jdGlvbiBoYXMobywgaykge1xuICByZXR1cm4gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobywgaylcbn1cblxuZnVuY3Rpb24gaXNFeGFjdCAodikge1xuICBpZihpc0Jhc2ljKHYpKSByZXR1cm4gdHJ1ZVxuICBpZihpc0FycmF5KHYpKVxuICAgIHJldHVybiB2LmV2ZXJ5KGlzRXhhY3QpXG4gIHJldHVybiBpc09iamVjdCh2KSAmJiBoYXModiwgJyRlcScpXG59XG5cbmZ1bmN0aW9uIGlzTHRndCAodikge1xuICByZXR1cm4gaGFzKHYsICckbHQnKSB8fCBoYXModiwgJyRndCcpIHx8IGhhcyh2LCAnJGx0ZScpIHx8IGhhcyh2LCAnJGd0ZScpXG59XG5cbmZ1bmN0aW9uIGlzUmFuZ2UgKHYpIHtcbiAgaWYoIWlzT2JqZWN0KHYpKSByZXR1cm4gZmFsc2VcbiAgaWYoaXNTdHJpbmcodi4kcHJlZml4KSkgcmV0dXJuIHRydWVcbiAgaWYoaXNBcnJheSh2KSkgcmV0dXJuIGZpbmQodiwgaXNSYW5nZSlcbiAgcmV0dXJuIGlzTHRndCh2KVxufVxuXG5mdW5jdGlvbiBmaW5kIChhcnksIHRlc3QpIHtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGFyeS5sZW5ndGg7IGkrKylcbiAgICBpZih0ZXN0KGFyeVtpXSwgaSwgYXJ5KSkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGxvd2VyICh2KSB7XG4gIGlmKGlzQmFzaWModikpIHJldHVybiB2XG4gIGlmKGlzT2JqZWN0KHYpKSB7XG4gICAgaWYoaXNBcnJheSh2LiRwcmVmaXgpKSByZXR1cm4gdi4kcHJlZml4LmNvbmNhdChleHBvcnRzLkhJKVxuICAgIGlmKGlzU3RyaW5nKHYuJHByZWZpeCkpIHJldHVybiB2LiRwcmVmaXhcbiAgICBpZihoYXModiwgJyRndCcpKSByZXR1cm4gdi4kZ3RcbiAgICBpZihoYXModiwgJyRndGUnKSkgcmV0dXJuIHYuJGd0ZVxuICB9XG4gIGlmKGlzQXJyYXkodikpIHJldHVybiB2Lm1hcChsb3dlcilcbn1cblxuZnVuY3Rpb24gdXBwZXIgKHYpIHtcbiAgaWYoaXNCYXNpYyh2KSkgcmV0dXJuIHZcbiAgaWYoaXNPYmplY3QodikpIHtcbiAgICBpZihpc0FycmF5KHYuJHByZWZpeCkpIHJldHVybiB2LiRwcmVmaXguY29uY2F0KGV4cG9ydHMuTE8pXG4gICAgaWYoaXNTdHJpbmcodi4kcHJlZml4KSkgcmV0dXJuIHYuJHByZWZpeCsnXFx1ZmZmZidcbiAgICBpZihoYXModiwgJyRsZScpKSByZXR1cm4gdi4kbHRcbiAgICBpZihoYXModiwgJyRsdGUnKSkgcmV0dXJuIHYuJGx0ZVxuICB9XG4gIGlmKGlzQXJyYXkodikpIHJldHVybiB2Lm1hcCh1cHBlcilcbn1cblxuZnVuY3Rpb24gZ2V0KG9iaiwgcGF0aCkge1xuICBpZihpc1N0cmluZyhwYXRoKSkgcmV0dXJuIG9ialtwYXRoXVxuICBpZihpc0FycmF5KHBhdGgpKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmKG9iaiA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICBvYmogPSBvYmpbcGF0aFtpXV1cbiAgICB9XG4gICAgcmV0dXJuIG9ialxuICB9XG4gIGlmKHBhdGggPT09IHRydWUpIHJldHVybiBvYmpcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBtYXAob2JqLCBpdGVyLCBvKSB7XG4gIGlmKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5tYXAoaXRlcilcbiAgbyA9IG8gfHwge31cbiAgZm9yKHZhciBrIGluIG9iailcbiAgICBvW2tdID0gaXRlcihvYmpba10sIGssIG9iailcbiAgcmV0dXJuIG9cbn1cblxuXG5mdW5jdGlvbiBtYXBhKG9iaiwgaXRlcikge1xuICBpZihBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubWFwKGl0ZXIpXG4gIHZhciBhID0gW11cbiAgZm9yKHZhciBrIGluIG9iaikge1xuICAgIHZhciB2ID0gaXRlcihvYmpba10sIGssIG9iailcbiAgICBpZih2ICE9PSB1bmRlZmluZWQpIGEucHVzaCh2KVxuICB9XG4gIHJldHVybiBhXG5cbn1cblxuZnVuY3Rpb24gZWFjaChvYmosIGl0ZXIpIHtcbiAgaWYoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLmZvckVhY2goaXRlcilcbiAgZWxzZSBpZihpc09iamVjdChvYmopKVxuICAgIGZvcih2YXIgayBpbiBvYmopIGl0ZXIob2JqW2tdLCBrLCBvYmopXG4gIGVsc2VcbiAgICBpdGVyKG9iailcbn1cblxuZnVuY3Rpb24gcHJvamVjdCAodmFsdWUsIG1hcCwgaXNPYmopIHtcbiAgaXNPYmogPSBpc09iaiB8fCBpc09iamVjdFxuICBpZighaXNPYmoodmFsdWUpKVxuICAgIHJldHVybiBtYXAodmFsdWUpXG4gIGVsc2Uge1xuICAgIHZhciBvXG4gICAgZm9yKHZhciBrIGluIHZhbHVlKSB7XG4gICAgICB2YXIgdiA9IHByb2plY3QodmFsdWVba10sIG1hcCwgaXNPYmopXG4gICAgICBpZih2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIChvID0gbyB8fCB7fSlba10gPSB2XG4gICAgfVxuICAgIHJldHVybiBvXG4gIH1cbn1cblxuLy9nZXQgYWxsIHBhdGhzIHdpdGhpbiBhbiBvYmplY3Rcbi8vdGhpcyBjYW4gcHJvYmFibHkgYmUgb3B0aW1pemVkIHRvIGNyZWF0ZSBsZXNzIGFycmF5cyFcbmZ1bmN0aW9uIHBhdGhzIChvYmplY3QsIHRlc3QpIHtcbiAgdmFyIHAgPSBbXVxuICBpZih0ZXN0KG9iamVjdCkpIHJldHVybiBbXVxuICBmb3IodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XVxuICAgIGlmKHRlc3QodmFsdWUpKSBwLnB1c2goa2V5KVxuICAgIGVsc2UgaWYoaXNPYmplY3QodmFsdWUpKVxuICAgICAgcCA9IHAuY29uY2F0KHBhdGhzKHZhbHVlLCB0ZXN0KS5tYXAoZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIFtrZXldLmNvbmNhdChwYXRoKVxuICAgICAgfSkpXG4gIH1cbiAgcmV0dXJuIHBcbn1cblxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nXG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXJcbmV4cG9ydHMuaXNCYXNpYyA9IGlzQmFzaWNcbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXlcbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdFxuZXhwb3J0cy5pc1JhbmdlID0gaXNSYW5nZVxuZXhwb3J0cy5pc0V4YWN0ID0gaXNFeGFjdFxuZXhwb3J0cy5pc0x0Z3QgPSBpc0x0Z3RcbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb25cblxuZXhwb3J0cy5oYXMgICAgID0gaGFzXG5leHBvcnRzLmdldCAgICAgPSBnZXRcbmV4cG9ydHMubWFwICAgICA9IG1hcFxuZXhwb3J0cy5tYXBhICAgID0gbWFwYVxuZXhwb3J0cy5wcm9qZWN0ID0gcHJvamVjdFxuZXhwb3J0cy5wYXRocyAgID0gcGF0aHNcbmV4cG9ydHMuZWFjaCAgICA9IGVhY2hcblxuZXhwb3J0cy51cHBlciA9IHVwcGVyXG5leHBvcnRzLmxvd2VyID0gbG93ZXJcblxuZXhwb3J0cy5ISSA9IHVuZGVmaW5lZFxuZXhwb3J0cy5MTyA9IG51bGxcblxuXG5cblxuXG5cbiIsInZhciB1ICAgICAgPSByZXF1aXJlKCdwdWxsLWNvcmUnKVxudmFyIHNvdXJjZXMgPSByZXF1aXJlKCcuL3NvdXJjZXMnKVxudmFyIHNpbmtzID0gcmVxdWlyZSgnLi9zaW5rcycpXG5cbnZhciBwcm9wICAgPSB1LnByb3BcbnZhciBpZCAgICAgPSB1LmlkXG52YXIgdGVzdGVyID0gdS50ZXN0ZXJcblxudmFyIG1hcCA9IGV4cG9ydHMubWFwID0gXG5mdW5jdGlvbiAocmVhZCwgbWFwKSB7XG4gIG1hcCA9IHByb3AobWFwKSB8fCBpZFxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgdmFyIGRhdGEgPSAhZW5kID8gbWFwKGRhdGEpIDogbnVsbFxuICAgICAgY2IoZW5kLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGFzeW5jTWFwID0gZXhwb3J0cy5hc3luY01hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwKSB7XG4gIGlmKCFtYXApIHJldHVybiByZWFkXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kLCBjYikgLy9hYm9ydFxuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSByZXR1cm4gY2IoZW5kLCBkYXRhKVxuICAgICAgbWFwKGRhdGEsIGNiKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHBhcmFNYXAgPSBleHBvcnRzLnBhcmFNYXAgPVxuZnVuY3Rpb24gKHJlYWQsIG1hcCwgd2lkdGgpIHtcbiAgaWYoIW1hcCkgcmV0dXJuIHJlYWRcbiAgdmFyIGVuZGVkID0gZmFsc2UsIHF1ZXVlID0gW10sIF9jYlxuXG4gIGZ1bmN0aW9uIGRyYWluICgpIHtcbiAgICBpZighX2NiKSByZXR1cm5cbiAgICB2YXIgY2IgPSBfY2JcbiAgICBfY2IgPSBudWxsXG4gICAgaWYocXVldWUubGVuZ3RoKVxuICAgICAgcmV0dXJuIGNiKG51bGwsIHF1ZXVlLnNoaWZ0KCkpXG4gICAgZWxzZSBpZihlbmRlZCAmJiAhbilcbiAgICAgIHJldHVybiBjYihlbmRlZClcbiAgICBfY2IgPSBjYlxuICB9XG5cbiAgZnVuY3Rpb24gcHVsbCAoKSB7XG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHtcbiAgICAgICAgZW5kZWQgPSBlbmRcbiAgICAgICAgcmV0dXJuIGRyYWluKClcbiAgICAgIH1cbiAgICAgIG4rK1xuICAgICAgbWFwKGRhdGEsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgbi0tXG5cbiAgICAgICAgcXVldWUucHVzaChkYXRhKVxuICAgICAgICBkcmFpbigpXG4gICAgICB9KVxuXG4gICAgICBpZihuIDwgd2lkdGggJiYgIWVuZGVkKVxuICAgICAgICBwdWxsKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG4gPSAwXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kLCBjYikgLy9hYm9ydFxuICAgIC8vY29udGludWUgdG8gcmVhZCB3aGlsZSB0aGVyZSBhcmUgbGVzcyB0aGFuIDMgbWFwcyBpbiBmbGlnaHRcbiAgICBfY2IgPSBjYlxuICAgIGlmKHF1ZXVlLmxlbmd0aCB8fCBlbmRlZClcbiAgICAgIHB1bGwoKSwgZHJhaW4oKVxuICAgIGVsc2UgcHVsbCgpXG4gIH1cbiAgcmV0dXJuIGhpZ2hXYXRlck1hcmsoYXN5bmNNYXAocmVhZCwgbWFwKSwgd2lkdGgpXG59XG5cbnZhciBmaWx0ZXIgPSBleHBvcnRzLmZpbHRlciA9XG5mdW5jdGlvbiAocmVhZCwgdGVzdCkge1xuICAvL3JlZ2V4cFxuICB0ZXN0ID0gdGVzdGVyKHRlc3QpXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgcmVhZChlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKCFlbmQgJiYgIXRlc3QoZGF0YSkpXG4gICAgICAgIHJldHVybiBuZXh0KGVuZCwgY2IpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgZmlsdGVyTm90ID0gZXhwb3J0cy5maWx0ZXJOb3QgPVxuZnVuY3Rpb24gKHJlYWQsIHRlc3QpIHtcbiAgdGVzdCA9IHRlc3Rlcih0ZXN0KVxuICByZXR1cm4gZmlsdGVyKHJlYWQsIGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuICF0ZXN0KGUpXG4gIH0pXG59XG5cbnZhciB0aHJvdWdoID0gZXhwb3J0cy50aHJvdWdoID0gXG5mdW5jdGlvbiAocmVhZCwgb3AsIG9uRW5kKSB7XG4gIHZhciBhID0gZmFsc2VcbiAgZnVuY3Rpb24gb25jZSAoYWJvcnQpIHtcbiAgICBpZihhIHx8ICFvbkVuZCkgcmV0dXJuXG4gICAgYSA9IHRydWVcbiAgICBvbkVuZChhYm9ydCA9PT0gdHJ1ZSA/IG51bGwgOiBhYm9ydClcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgb25jZShlbmQpXG4gICAgcmV0dXJuIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZighZW5kKSBvcCAmJiBvcChkYXRhKVxuICAgICAgZWxzZSBvbmNlKGVuZClcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciB0YWtlID0gZXhwb3J0cy50YWtlID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHZhciBlbmRlZCA9IGZhbHNlXG4gIGlmKCdudW1iZXInID09PSB0eXBlb2YgdGVzdCkge1xuICAgIHZhciBuID0gdGVzdDsgdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuIC0tXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kZWQpIHJldHVybiBjYihlbmRlZClcbiAgICBpZihlbmRlZCA9IGVuZCkgcmV0dXJuIHJlYWQoZW5kZWQsIGNiKVxuXG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkgcmV0dXJuIGNiKGVuZGVkKVxuICAgICAgaWYoIXRlc3QoZGF0YSkpIHtcbiAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgIHJlYWQodHJ1ZSwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGNiKGVuZGVkLCBkYXRhKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBjYihudWxsLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHVuaXF1ZSA9IGV4cG9ydHMudW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkLCBpbnZlcnQpIHtcbiAgZmllbGQgPSBwcm9wKGZpZWxkKSB8fCBpZFxuICB2YXIgc2VlbiA9IHt9XG4gIHJldHVybiBmaWx0ZXIocmVhZCwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIga2V5ID0gZmllbGQoZGF0YSlcbiAgICBpZihzZWVuW2tleV0pIHJldHVybiAhIWludmVydCAvL2ZhbHNlLCBieSBkZWZhdWx0XG4gICAgZWxzZSBzZWVuW2tleV0gPSB0cnVlXG4gICAgcmV0dXJuICFpbnZlcnQgLy90cnVlIGJ5IGRlZmF1bHRcbiAgfSlcbn1cblxudmFyIG5vblVuaXF1ZSA9IGV4cG9ydHMubm9uVW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkKSB7XG4gIHJldHVybiB1bmlxdWUocmVhZCwgZmllbGQsIHRydWUpXG59XG5cbnZhciBncm91cCA9IGV4cG9ydHMuZ3JvdXAgPVxuZnVuY3Rpb24gKHJlYWQsIHNpemUpIHtcbiAgdmFyIGVuZGVkOyBzaXplID0gc2l6ZSB8fCA1XG4gIHZhciBxdWV1ZSA9IFtdXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgLy90aGlzIG1lYW5zIHRoYXQgdGhlIHVwc3RyZWFtIGlzIHNlbmRpbmcgYW4gZXJyb3IuXG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmRlZCA9IGVuZCwgY2IpXG4gICAgLy90aGlzIG1lYW5zIHRoYXQgd2UgcmVhZCBhbiBlbmQgYmVmb3JlLlxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIG5leHQoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkge1xuICAgICAgICBpZighcXVldWUubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiBjYihlbmRlZClcblxuICAgICAgICB2YXIgX3F1ZXVlID0gcXVldWU7IHF1ZXVlID0gW11cbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIF9xdWV1ZSlcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goZGF0YSlcbiAgICAgIGlmKHF1ZXVlLmxlbmd0aCA8IHNpemUpXG4gICAgICAgIHJldHVybiByZWFkKG51bGwsIG5leHQpXG5cbiAgICAgIHZhciBfcXVldWUgPSBxdWV1ZTsgcXVldWUgPSBbXVxuICAgICAgY2IobnVsbCwgX3F1ZXVlKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGZsYXR0ZW4gPSBleHBvcnRzLmZsYXR0ZW4gPSBmdW5jdGlvbiAocmVhZCkge1xuICB2YXIgX3JlYWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihfcmVhZCkgbmV4dENodW5rKClcbiAgICBlbHNlICAgICAgbmV4dFN0cmVhbSgpXG5cbiAgICBmdW5jdGlvbiBuZXh0Q2h1bmsgKCkge1xuICAgICAgX3JlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZihlbmQpIG5leHRTdHJlYW0oKVxuICAgICAgICBlbHNlICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgICBmdW5jdGlvbiBuZXh0U3RyZWFtICgpIHtcbiAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgc3RyZWFtKSB7XG4gICAgICAgIGlmKGVuZClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kKVxuICAgICAgICBpZihBcnJheS5pc0FycmF5KHN0cmVhbSkpXG4gICAgICAgICAgc3RyZWFtID0gc291cmNlcy52YWx1ZXMoc3RyZWFtKVxuICAgICAgICBlbHNlIGlmKCdmdW5jdGlvbicgIT0gdHlwZW9mIHN0cmVhbSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmVhbSBvZiBzdHJlYW1zJylcbiAgICAgICAgXG4gICAgICAgIF9yZWFkID0gc3RyZWFtXG4gICAgICAgIG5leHRDaHVuaygpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG52YXIgcHJlcGVuZCA9XG5leHBvcnRzLnByZXBlbmQgPVxuZnVuY3Rpb24gKHJlYWQsIGhlYWQpIHtcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGhlYWQgIT09IG51bGwpIHtcbiAgICAgIGlmKGFib3J0KVxuICAgICAgICByZXR1cm4gcmVhZChhYm9ydCwgY2IpXG4gICAgICB2YXIgX2hlYWQgPSBoZWFkXG4gICAgICBoZWFkID0gbnVsbFxuICAgICAgY2IobnVsbCwgX2hlYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWQoYWJvcnQsIGNiKVxuICAgIH1cbiAgfVxuXG59XG5cbi8vdmFyIGRyYWluSWYgPSBleHBvcnRzLmRyYWluSWYgPSBmdW5jdGlvbiAob3AsIGRvbmUpIHtcbi8vICBzaW5rcy5kcmFpbihcbi8vfVxuXG52YXIgX3JlZHVjZSA9IGV4cG9ydHMuX3JlZHVjZSA9IGZ1bmN0aW9uIChyZWFkLCByZWR1Y2UsIGluaXRpYWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjbG9zZSwgY2IpIHtcbiAgICBpZihjbG9zZSkgcmV0dXJuIHJlYWQoY2xvc2UsIGNiKVxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICBzaW5rcy5kcmFpbihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaW5pdGlhbCA9IHJlZHVjZShpbml0aWFsLCBpdGVtKVxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGVuZGVkID0gZXJyIHx8IHRydWVcbiAgICAgIGlmKCFlcnIpIGNiKG51bGwsIGluaXRpYWwpXG4gICAgICBlbHNlICAgICBjYihlbmRlZClcbiAgICB9KVxuICAgIChyZWFkKVxuICB9XG59XG5cbnZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2tcblxudmFyIGhpZ2hXYXRlck1hcmsgPSBleHBvcnRzLmhpZ2hXYXRlck1hcmsgPSBcbmZ1bmN0aW9uIChyZWFkLCBoaWdoV2F0ZXJNYXJrKSB7XG4gIHZhciBidWZmZXIgPSBbXSwgd2FpdGluZyA9IFtdLCBlbmRlZCwgcmVhZGluZyA9IGZhbHNlXG4gIGhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrIHx8IDEwXG5cbiAgZnVuY3Rpb24gcmVhZEFoZWFkICgpIHtcbiAgICB3aGlsZSh3YWl0aW5nLmxlbmd0aCAmJiAoYnVmZmVyLmxlbmd0aCB8fCBlbmRlZCkpXG4gICAgICB3YWl0aW5nLnNoaWZ0KCkoZW5kZWQsIGVuZGVkID8gbnVsbCA6IGJ1ZmZlci5zaGlmdCgpKVxuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgaWYoZW5kZWQgfHwgcmVhZGluZyB8fCBidWZmZXIubGVuZ3RoID49IGhpZ2hXYXRlck1hcmspXG4gICAgICByZXR1cm5cbiAgICByZWFkaW5nID0gdHJ1ZVxuICAgIHJldHVybiByZWFkKGVuZGVkLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICByZWFkaW5nID0gZmFsc2VcbiAgICAgIGVuZGVkID0gZW5kZWQgfHwgZW5kXG4gICAgICBpZihkYXRhICE9IG51bGwpIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgICBcbiAgICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgICB9KVxuICB9XG5cbiAgbmV4dFRpY2sobmV4dClcblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBlbmRlZCA9IGVuZGVkIHx8IGVuZFxuICAgIHdhaXRpbmcucHVzaChjYilcblxuICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgfVxufVxuXG5cblxuIiwiJ3VzZSBzdHJpY3QnXG52YXIgbGV2ZWwgPSByZXF1aXJlKCdsZXZlbCcpXG52YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtJylcbnZhciBXcml0ZSA9IHJlcXVpcmUoJ3B1bGwtd3JpdGUnKVxudmFyIHBsID0gcmVxdWlyZSgncHVsbC1sZXZlbCcpXG52YXIgcXVlcnkgPSByZXF1aXJlKCcuL3F1ZXJ5JylcbnZhciBzZWxlY3QgPSByZXF1aXJlKCcuL3NlbGVjdCcpXG52YXIgbWZyID0gcmVxdWlyZSgnbWFwLWZpbHRlci1yZWR1Y2UnKVxudmFyIGtleXMgPSByZXF1aXJlKCdtYXAtZmlsdGVyLXJlZHVjZS9rZXlzJylcbnZhciBieXRld2lzZSA9IHJlcXVpcmUoJ2J5dGV3aXNlJylcbnZhciBwYXJhbWFwID0gcmVxdWlyZSgncHVsbC1wYXJhbWFwJylcbnZhciBleHBsYWluID0gcmVxdWlyZSgnZXhwbGFpbi1lcnJvcicpXG52YXIgdSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheVxuXG4vL3NvcnRlZCBpbmRleC5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXRoLCBpbmRleGVzLCBsaW5rcywgdmVyc2lvbiwgY29kZWMpIHtcbiAgY29kZWMgPSBjb2RlYyB8fCByZXF1aXJlKCdieXRld2lzZScpXG4gIHZhciBkYiA9IGxldmVsKHBhdGgpXG5cbiAgaWYoJ3N0cmluZycgIT09IHR5cGVvZiBwYXRoKVxuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIHBhdGggZm9yIGxldmVsZGIgaW5zdGFuY2UnKVxuICBpZighQXJyYXkuaXNBcnJheShpbmRleGVzKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBhbiBhcnJheSBvZiBpbmRleGVzJylcbiAgaWYoJ251bWJlcicgIT09IHR5cGVvZiB2ZXJzaW9uKVxuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIHZlcnNpb24gbnVtYmVyJylcblxuICBpZighbGlua3MpXG4gICAgbGlua3MgPSBmdW5jdGlvbiAoZGF0YSwgZW1pdCkgeyBlbWl0KGRhdGEpIH1cblxuICAvL2Fsd2F5cyB3cml0ZSBtZXRhZGEgdG8gdGhlIGxvd2VzdCBrZXksXG4gIC8vc28gdGhlIGluZGV4ZXMgZG8gbm90IGludGVyZmVlclxuICAvL3dlIGRvbid0IHdhbnQgdG8gZW5jb2RlIHRoaXMgd2l0aCB0aGUgY29kZWMsXG4gIC8vYmVjYXVzZSB0aGVuIHdlIGNhbid0IGNoYW5nZSB0aGUgY29kZWMgc2FmZWx5XG4gIC8vKHByZWhhcHMgdGhlIGVuY29kaW5nIG9mIE1FVEEgaXMgYWxzbyBzb21lIGluZGV4ZWQgdmFsdWUgaW4gYW5vdGhlciBjb2RlYz8pXG4gIHZhciBNRVRBID0gJ1xceDAwJ1xuXG4gIHJldHVybiB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGNiKSB7XG4gICAgICBkYi5nZXQoTUVUQSwgZnVuY3Rpb24gKGVyciwgdmFsdWUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1JFTE9BRCBJTkRFWDonLCB2YWx1ZSlcbiAgICAgICAgaWYodmFsdWUpXG4gICAgICAgICAgdHJ5IHsgdmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlKSB9XG4gICAgICAgICAgY2F0Y2ggKGVycikgeyByZXR1cm4gY2IobnVsbCwgMCkgfVxuXG4gICAgICAgIGlmKGVycikgLy9maXJzdCB0aW1lIHRoaXMgd2FzIHJ1blxuICAgICAgICAgIGNiKG51bGwsIDApXG4gICAgICAgIC8vaWYgdGhlIHZpZXcgaGFzIGNoYW5nZWQsIHJlYnVpbGQgZW50aXJlIGluZGV4LlxuICAgICAgICAvL2Vsc2UsIHJlYWQgY3VycmVudCB2ZXJzaW9uLlxuXG4gICAgICAgIGVsc2UgaWYodmVyc2lvbiAmJiB2YWx1ZS52ZXJzaW9uICE9PSB2ZXJzaW9uKSB7XG4gICAgICAgICAgZGIuY2xvc2UoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV2ZWwuZGVzdHJveShwYXRoLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgICAgICAgZGIgPSBsZXZlbChwYXRoKVxuICAgICAgICAgICAgICBjYihudWxsLCAwKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBjYihudWxsLCB2YWx1ZS5zaW5jZSB8fCAwKVxuICAgICAgfSlcbiAgICB9LFxuICAgIHdyaXRlOiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHJldHVybiBwdWxsKFxuICAgICAgICBXcml0ZShmdW5jdGlvbiAoYmF0Y2gsIGNiKSB7XG4gICAgICAgICAgZGIuYmF0Y2goYmF0Y2gsIGNiKVxuICAgICAgICB9LCBmdW5jdGlvbiAoYmF0Y2gsIGRhdGEpIHtcbiAgICAgICAgICBpZihkYXRhLnN5bmMpIHJldHVybiBiYXRjaFxuICAgICAgICAgIGlmKCFiYXRjaClcbiAgICAgICAgICAgIGJhdGNoID0gW3tcbiAgICAgICAgICAgICAga2V5OiBNRVRBLFxuICAgICAgICAgICAgICB2YWx1ZToge3ZlcnNpb246IHZlcnNpb24sIHNpbmNlOiBkYXRhLnRzfSxcbiAgICAgICAgICAgICAgdmFsdWVFbmNvZGluZzogJ2pzb24nLFxuICAgICAgICAgICAgICB0eXBlOiAncHV0J1xuICAgICAgICAgICAgfV1cblxuICAgICAgICAgIGZ1bmN0aW9uIHB1c2goYXJ5KSB7XG4gICAgICAgICAgICBiYXRjaC5wdXNoKHtrZXk6IGNvZGVjLmVuY29kZShhcnkpLCB2YWx1ZTogJyAnLCB0eXBlOiAncHV0J30pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlua3MoZGF0YSwgZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgICAgICAgIGluZGV4ZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgdmFyIGEgPSBbaW5kZXgua2V5XVxuICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgaW5kZXgudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gaW5kZXgudmFsdWVbaV1cbiAgICAgICAgICAgICAgICBpZighdS5oYXMoa2V5LCBsaW5rKSkgcmV0dXJuXG4gICAgICAgICAgICAgICAgYS5wdXNoKHUuZ2V0KGtleSwgbGluaykpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHVzaChhKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgdmFyIHRzID0gZGF0YS50cyB8fCBkYXRhLnRpbWVzdGFtcFxuICAgICAgICAgIGlmKHRzKSBiYXRjaFswXS52YWx1ZS5zaW5jZSA9IHRzXG4gICAgICAgICAgcmV0dXJuIGJhdGNoXG4gICAgICAgIH0sIDEwMCwgY2IpXG4gICAgICApXG4gICAgfSxcbiAgICBjbG9zZTogZnVuY3Rpb24gKGNiKSB7XG4gICAgICBkYi5jbG9zZShjYilcbiAgICB9LFxuICAgIC8vZ2V0IHRoZSByYXcgaW5kZXhlcywgZm9yIGRlYnVnZ2luZy5cbiAgICBkdW1wOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcGwucmVhZChkYiwge2tleUVuY29kaW5nOiBjb2RlYywgZ3Q6ICdcXHgwMCd9KVxuICAgIH0sXG4gICAgLy9yZWFkIGFsbCB0aGUgbWVzc2FnZXMgb3V0LCB2aWEgbWF0Y2hpbmcgcmFuZ2VzLlxuICAgIHJlYWQ6IGZ1bmN0aW9uIChvcHRzLCBnZXQpIHtcbiAgICAgIHZhciBsb29rdXBcbiAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG4gICAgICB2YXIgX29wdHMgPSB7fVxuICAgICAgdmFyIHEsIGtcblxuICAgICAgaWYoaXNBcnJheShvcHRzLnF1ZXJ5KSkge1xuICAgICAgICBxID0gb3B0cy5xdWVyeVswXS4kZmlsdGVyIHx8IHt9XG4gICAgICAgIGsgPSBrZXlzKG9wdHMucXVlcnkpXG4gICAgICB9XG4gICAgICBlbHNlIGlmKG9wdHMucXVlcnkpIHtcbiAgICAgICAgcSA9IG9wdHMucXVlcnlcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgcSA9IHt9XG5cbiAgICAgIHZhciBpbmRleCA9IHNlbGVjdChpbmRleGVzLCBxKVxuICAgICAgdmFyIF9vcHRzID0gcXVlcnkoaW5kZXgsIHEpXG5cbiAgICBjb25zb2xlLmxvZyhfb3B0cylcblxuICAgICAgX29wdHMudmFsdWVzID0gZmFsc2VcbiAgICAgIF9vcHRzLmtleXMgPSB0cnVlXG4gICAgICBfb3B0cy5rZXlFbmNvZGluZyA9IGNvZGVjXG5cbiAgICAgIF9vcHRzLnJldmVyc2UgPSAhIW9wdHMucmV2ZXJzZVxuICAgICAgX29wdHMubGl2ZSA9ICEhb3B0cy5saXZlXG4gICAgICBfb3B0cy5saW1pdCA9IG9wdHMubGltaXQgfHwgLTFcblxuICAgICAgLy8gSWYgYSBxdWVyeSB1c2VzIGEga2V5IG5vdCBpbiB0aGUgaW5kZXhcbiAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBnZXQgdGhhdCBzb21laG93LlxuICAgICAgLy8gaWYgdGhpcyBpcyBhIGtleSBmcm9tIHRoZSB0aGluZyBpbmRleGVkLFxuICAgICAgLy8gaXQgbWFrZXMgc2Vuc2UgdG8gbG9vayB1cCB0aGF0IHJlY29yZC5cbiAgICAgIC8vIGhvdyB0byBkbyB0aGF0IG1pZ2h0IGJlIGRpZmZlcmVudCBpbiBhIHZpZXcuXG5cbiAgICAgIC8vIGp1c3QgZGlzYWJsZSB0aGlzIGZvciBub3cuXG5cbiAgICAgIGlmKGdldClcbiAgICAgICAgbG9va3VwID0gcGFyYW1hcChmdW5jdGlvbiAobGluaywgY2IpIHtcbiAgICAgICAgICBnZXQobGluay50cyB8fCBsaW5rLnRpbWVzdGFtcCwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICAgICAgaWYoZXJyKSByZXR1cm4gY2IoZXhwbGFpbihlcnIsICdjb3VsZCBub3QgZmluZCBtYXRjaGluZyB0aW1lc3RhbXAgZm9yIGluZGV4OicrSlNPTi5zdHJpbmdpZnkobGluaykpKVxuICAgICAgICAgICAgbGluay5rZXkgPSBkYXRhLmtleVxuICAgICAgICAgICAgbGluay52YWx1ZSA9IGRhdGEudmFsdWVcbiAgICAgICAgICAgIGNiKG51bGwsIGxpbmspXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgcmV0dXJuIHB1bGwoXG4gICAgICAgIHBsLnJlYWQoZGIsIF9vcHRzKSxcbiAgICAgICAgLy9yZWh5ZHJhdGUgdGhlIGluZGV4IHRvIHJlc2VtYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAgICAgIHB1bGwubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdmFyIG8gPSB7fVxuICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBpbmRleC52YWx1ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHUuc2V0KGluZGV4LnZhbHVlW2ldLCBlW2krMV0sIG8pXG4gICAgICAgICAgcmV0dXJuIG9cbiAgICAgICAgfSksXG4gICAgICAgIGxvb2t1cCxcbiAgICAgICAgaXNBcnJheShvcHRzLnF1ZXJ5KSA/IG1mcihvcHRzLnF1ZXJ5KSA6IHB1bGwudGhyb3VnaCgpXG4gICAgICApXG4gICAgfVxuICB9XG59XG5cblxuXG5cbiIsInZhciBRID0gcmVxdWlyZSgnbWFwLWZpbHRlci1yZWR1Y2UvdXRpbCcpXG52YXIgc2VsZWN0ID0gcmVxdWlyZSgnLi9zZWxlY3QnKVxudmFyIGdldCA9IHJlcXVpcmUoJy4vdXRpbCcpLmdldFxuXG5mdW5jdGlvbiBpZCAoZSkgeyByZXR1cm4gZSB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBxdWVyeSkge1xuXG4gIGZ1bmN0aW9uIGJvdW5kICh2YWx1ZSwgcmFuZ2UsIHNlbnRpbmVsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlID09IG51bGwgICAgPyBzZW50aW5lbFxuICAgIDogUS5pc1JhbmdlKHZhbHVlKSA/IHJhbmdlKHZhbHVlKVxuICAgIDogICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGQgKGluZGV4LCBtYXApIHtcbiAgICB2YXIgYSA9IFtpbmRleC5rZXldXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGluZGV4LnZhbHVlLmxlbmd0aDsgaSsrKVxuICAgICAgYS5wdXNoKG1hcChnZXQoaW5kZXgudmFsdWVbaV0sIHF1ZXJ5KSkpXG4gICAgcmV0dXJuIGFcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ3RlOiBidWlsZChpbmRleCwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gYm91bmQodmFsdWUsIFEubG93ZXIsIFEuTE8pXG4gICAgfSksXG4gICAgbHRlOiBidWlsZChpbmRleCwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gYm91bmQodmFsdWUsIFEudXBwZXIsIFEuSEkpXG4gICAgfSlcbiAgICAvL3JldmVyc2UsIGxpbWl0LCBsaXZlP1xuICB9XG5cbn1cblxuXG4iLCJcbi8vb2Ygc2V2ZXJhbCBpbmRleGVzIGF2YWlsYWJsZSxcbi8vc2VsZWN0IHRoZSBvbmUgbW9zdCBzdWl0YWJsZSBmb3IgYSBnaXZlbiBxdWVyeS5cblxuLy8gc2VsZWN0IHRoZSBpbmRleCB0aGF0IG1hdGNoZXMgdGhlIG1vc3QgZXhhY3QgZmllbGRzIGluIHRoZSBxdWVyeVxuLy8gc3RhcnRpbmcgZnJvbSB0aGUgbGVmdCwgdGhlbiBtb3Zpbmcgb24gdG8gcmFuZ2UgZmllbGRzLlxuXG52YXIgUSA9IHJlcXVpcmUoJ21hcC1maWx0ZXItcmVkdWNlL3V0aWwnKVxudmFyIHUgPSByZXF1aXJlKCcuL3V0aWwnKVxuZnVuY3Rpb24gbWF4KGFycmF5LCBjb21wYXJlKSB7XG4gIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKG1heCwgZSkge1xuICAgIHJldHVybiBjb21wYXJlKGUudmFsdWUsIG1heC52YWx1ZSkgPiAwID8gZSA6IG1heFxuICB9LCBhcnJheVswXSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZWxlY3QgKGluZGV4ZXMsIHF1ZXJ5KSB7XG5cbiAgZnVuY3Rpb24gc2NvcmUgKGspIHtcbiAgICB2YXIgdiA9IHUuZ2V0KGssIHF1ZXJ5KVxuICAgIHJldHVybiB1LmhhcyhrLCBxdWVyeSkgPyAoXG4gICAgICAgIFEuaXNFeGFjdCh2KSA/IDNcbiAgICAgIDogUS5pc1JhbmdlKHYpID8gMlxuICAgICAgOiAgICAgICAgICAgICAgICAxXG4gICAgKSA6IDBcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4YWN0IChrKSB7XG4gICAgcmV0dXJuIHUuaGFzKGssIHF1ZXJ5KSAmJiBRLmlzRXhhY3QodS5nZXQoaywgcXVlcnkpKVxuICB9XG5cbiAgZnVuY3Rpb24gcmFuZ2UgKGspIHtcbiAgICByZXR1cm4gdS5oYXMoaywgcXVlcnkpICYmIFEuaXNSYW5nZSh1LmdldChrLCBxdWVyeSkpXG4gIH1cblxuICBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICB2YXIgbCA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aClcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgayA9IGFbaV0sIGogPSBiW2ldXG5cbiAgICAgIHZhciB2ID0gc2NvcmUoayksIHggPSBzY29yZShqKVxuICAgICAgaWYodiAhPSB4KSByZXR1cm4gdiAtIHhcblxuICAgICAgLy8gZWxzZSwgbG9vcCB0byBuZXh0IGl0ZW0uXG4gICAgfVxuICAgIHJldHVybiAwXG4gIH1cblxuICByZXR1cm4gbWF4KGluZGV4ZXMsIGNvbXBhcmUpXG5cbn1cblxuXG5cblxuXG5cblxuIiwiZXhwb3J0cy5oYXMgPSBmdW5jdGlvbiBoYXMgKGtleSwgb2JqKSB7XG4gIGlmKCdzdHJpbmcnID09PSB0eXBlb2Yga2V5KVxuICAgIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcbiAgZm9yKHZhciBpIGluIGtleSkge1xuICAgIGlmKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5W2ldKSlcbiAgICAgIG9iaiA9IG9ialtrZXlbaV1dXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0cy5nZXQgPSBmdW5jdGlvbiBnZXQgKGtleSwgb2JqKSB7XG4gIGlmKCdzdHJpbmcnID09PSB0eXBlb2Yga2V5KSByZXR1cm4gb2JqW2tleV1cbiAgZm9yKHZhciBpIGluIGtleSkge1xuICAgIG9iaiA9IG9ialtrZXlbaV1dXG4gICAgaWYoIW9iaikgcmV0dXJuIG9ialxuICB9XG4gIHJldHVybiBvYmpcbn1cblxuZXhwb3J0cy5zZXQgPSBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSwgb2JqKSB7XG4gIGlmKCdzdHJpbmcnID09PSB0eXBlb2Yga2V5KVxuICAgIG9ialtrZXldID0gdmFsdWVcbiAgZWxzZSB7XG4gICAgZm9yKHZhciBpID0gMCA7IGkgPCBrZXkubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBvYmogPSAob2JqW2tleVtpXV0gPSBvYmpba2V5W2ldXSB8fCB7fSlcbiAgICB9XG4gICAgb2JqW2tleVtrZXkubGVuZ3RoIC0xXV0gPSB2YWx1ZVxuICB9XG59XG5cblxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIl9hcmdzXCI6IFtcbiAgICBbXG4gICAgICBcInNzYi1xdWVyeUAwLjAuMlwiLFxuICAgICAgXCIvVXNlcnMvam9yYW4vRG9jdW1lbnRzL2RldmVsb3BtZW50L3BhdGNoZGVja1wiXG4gICAgXVxuICBdLFxuICBcIl9mcm9tXCI6IFwic3NiLXF1ZXJ5QDAuMC4yXCIsXG4gIFwiX2lkXCI6IFwic3NiLXF1ZXJ5QDAuMC4yXCIsXG4gIFwiX2luQ2FjaGVcIjogdHJ1ZSxcbiAgXCJfaW5zdGFsbGFibGVcIjogdHJ1ZSxcbiAgXCJfbG9jYXRpb25cIjogXCIvc3NiLXF1ZXJ5XCIsXG4gIFwiX25vZGVWZXJzaW9uXCI6IFwiNS42LjBcIixcbiAgXCJfbnBtT3BlcmF0aW9uYWxJbnRlcm5hbFwiOiB7XG4gICAgXCJob3N0XCI6IFwicGFja2FnZXMtMTYtZWFzdC5pbnRlcm5hbC5ucG1qcy5jb21cIixcbiAgICBcInRtcFwiOiBcInRtcC9zc2ItcXVlcnktMC4wLjIudGd6XzE0NjA2MDc5MDgxMzNfMC4xODQxOTIyMzA0NTkzMDI2NlwiXG4gIH0sXG4gIFwiX25wbVVzZXJcIjoge1xuICAgIFwiZW1haWxcIjogXCJkb21pbmljLnRhcnJAZ21haWwuY29tXCIsXG4gICAgXCJuYW1lXCI6IFwiZG9taW5pY3RhcnJcIlxuICB9LFxuICBcIl9ucG1WZXJzaW9uXCI6IFwiMy42LjBcIixcbiAgXCJfcGhhbnRvbUNoaWxkcmVuXCI6IHtcbiAgICBcImJpbmFyeS1zZWFyY2hcIjogXCIxLjIuMFwiLFxuICAgIFwiYnl0ZXdpc2UtY29yZVwiOiBcIjEuMi4zXCIsXG4gICAgXCJleHBsYWluLWVycm9yXCI6IFwiMS4wLjFcIixcbiAgICBcImxldmVsXCI6IFwiMS40LjBcIixcbiAgICBcImxldmVsLXBvc3RcIjogXCIxLjAuNFwiLFxuICAgIFwicHVsbC1jYXRcIjogXCIxLjEuOVwiLFxuICAgIFwicHVsbC1wYXJhbWFwXCI6IFwiMS4xLjRcIixcbiAgICBcInB1bGwtc2luay10aHJvdWdoXCI6IFwiMC4wLjBcIixcbiAgICBcInB1bGwtd2luZG93XCI6IFwiMi4xLjNcIixcbiAgICBcInB1bGwtd3JpdGVcIjogXCIxLjAuMlwiLFxuICAgIFwic3RyZWFtLXRvLXB1bGwtc3RyZWFtXCI6IFwiMS42LjhcIixcbiAgICBcInR5cGV3aXNlXCI6IFwiMS4wLjNcIixcbiAgICBcInR5cGV3aXNlbGl0ZVwiOiBcIjEuMC4wXCJcbiAgfSxcbiAgXCJfcmVxdWVzdGVkXCI6IHtcbiAgICBcIm5hbWVcIjogXCJzc2ItcXVlcnlcIixcbiAgICBcInJhd1wiOiBcInNzYi1xdWVyeUAwLjAuMlwiLFxuICAgIFwicmF3U3BlY1wiOiBcIjAuMC4yXCIsXG4gICAgXCJzY29wZVwiOiBudWxsLFxuICAgIFwic3BlY1wiOiBcIjAuMC4yXCIsXG4gICAgXCJ0eXBlXCI6IFwidmVyc2lvblwiXG4gIH0sXG4gIFwiX3JlcXVpcmVkQnlcIjogW1xuICAgIFwiL1wiXG4gIF0sXG4gIFwiX3Jlc29sdmVkXCI6IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3NiLXF1ZXJ5Ly0vc3NiLXF1ZXJ5LTAuMC4yLnRnelwiLFxuICBcIl9zaGFzdW1cIjogXCI5YWYyMGU3MzRmZmRhMjE3MjQ4NzNmYWQzNzVkN2QxNjBlODMxZWIzXCIsXG4gIFwiX3Nocmlua3dyYXBcIjogbnVsbCxcbiAgXCJfc3BlY1wiOiBcInNzYi1xdWVyeUAwLjAuMlwiLFxuICBcIl93aGVyZVwiOiBcIi9Vc2Vycy9qb3Jhbi9Eb2N1bWVudHMvZGV2ZWxvcG1lbnQvcGF0Y2hkZWNrXCIsXG4gIFwiYXV0aG9yXCI6IHtcbiAgICBcImVtYWlsXCI6IFwiZG9taW5pYy50YXJyQGdtYWlsLmNvbVwiLFxuICAgIFwibmFtZVwiOiBcIkRvbWluaWMgVGFyclwiLFxuICAgIFwidXJsXCI6IFwiaHR0cDovL2RvbWluaWN0YXJyLmNvbVwiXG4gIH0sXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZG9taW5pY3RhcnIvc3NiLXF1ZXJ5L2lzc3Vlc1wiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImV4cGxhaW4tZXJyb3JcIjogXCJeMS4wLjFcIixcbiAgICBcInN0cmVhbXZpZXctbGlua3NcIjogXCJeMi4wLjBcIlxuICB9LFxuICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHt9LFxuICBcImRpcmVjdG9yaWVzXCI6IHt9LFxuICBcImRpc3RcIjoge1xuICAgIFwic2hhc3VtXCI6IFwiOWFmMjBlNzM0ZmZkYTIxNzI0ODczZmFkMzc1ZDdkMTYwZTgzMWViM1wiLFxuICAgIFwidGFyYmFsbFwiOiBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NzYi1xdWVyeS8tL3NzYi1xdWVyeS0wLjAuMi50Z3pcIlxuICB9LFxuICBcImdpdEhlYWRcIjogXCI5MDFiMzZhZmQ1ZmIyNTgxNWVjZjA3N2U3MWEwYTg4MjVlODQ3OTA3XCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZG9taW5pY3RhcnIvc3NiLXF1ZXJ5XCIsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcIm1haW50YWluZXJzXCI6IFtcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJkb21pbmljdGFyclwiLFxuICAgICAgXCJlbWFpbFwiOiBcImRvbWluaWMudGFyckBnbWFpbC5jb21cIlxuICAgIH1cbiAgXSxcbiAgXCJuYW1lXCI6IFwic3NiLXF1ZXJ5XCIsXG4gIFwib3B0aW9uYWxEZXBlbmRlbmNpZXNcIjoge30sXG4gIFwicmVhZG1lXCI6IFwiRVJST1I6IE5vIFJFQURNRSBkYXRhIGZvdW5kIVwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0Oi8vZ2l0aHViLmNvbS9kb21pbmljdGFyci9zc2ItcXVlcnkuZ2l0XCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInRlc3RcIjogXCJzZXQgLWU7IGZvciB0IGluIHRlc3QvKi5qczsgZG8gbm9kZSAkdDsgZG9uZVwiXG4gIH0sXG4gIFwidmVyc2lvblwiOiBcIjAuMC4yXCJcbn1cbiIsInZhciBpc0RvbWFpbiA9IHJlcXVpcmUoJ2lzLXZhbGlkLWRvbWFpbicpXG52YXIgcnggPSByZXF1aXJlKCdpcC1yZWdleCcpKHtleGFjdDogdHJ1ZX0pXG52YXIgaXNJUCA9IHJ4LnRlc3QuYmluZChyeClcblxudmFyIGlzSW50ZWdlciA9IE51bWJlci5pc0ludGVnZXJcblxuZnVuY3Rpb24gaXNTdHJpbmcocykge1xuICByZXR1cm4gJ3N0cmluZycgPT09IHR5cGVvZiBzXG59XG5cbnZhciBpc0xpbmsgPSBleHBvcnRzLmlzTGluayA9XG4gIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKGRhdGEpICYmIC9eKEB8JXwmKVtBLVphLXowLTlcXC8rXXs0M309XFwuW1xcd1xcZF0rJC8udGVzdChkYXRhKVxuICB9XG5cbnZhciBpc0ZlZWRJZCA9IGV4cG9ydHMuaXNGZWVkID0gZXhwb3J0cy5pc0ZlZWRJZCA9XG4gIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKGRhdGEpICYmIC9eQFtBLVphLXowLTlcXC8rXXs0M309XFwuKD86c2hhMjU2fGVkMjU1MTkpJC8udGVzdChkYXRhKVxuICB9XG5cbnZhciBpc01zZ0lkID0gZXhwb3J0cy5pc01zZyA9IGV4cG9ydHMuaXNNc2dJZCA9XG4gIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKGRhdGEpICYmIC9eJVtBLVphLXowLTlcXC8rXXs0M309XFwuc2hhMjU2JC8udGVzdChkYXRhKVxuICB9XG5cbnZhciBpc0Jsb2JJZCA9IGV4cG9ydHMuaXNCbG9iID0gZXhwb3J0cy5pc0Jsb2JJZCA9XG4gIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKGRhdGEpICYmIC9eJltBLVphLXowLTlcXC8rXXs0M309XFwuc2hhMjU2JC8udGVzdChkYXRhKVxuICB9XG5cbnZhciBpc0FkZHJlc3MgPSBleHBvcnRzLmlzQWRkcmVzcyA9XG4gIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYoIWlzU3RyaW5nKGRhdGEpKSByZXR1cm4gZmFsc2VcbiAgdmFyIHBhcnRzID0gZGF0YS5zcGxpdCgnOicpXG4gIHZhciBpZCA9IHBhcnRzLnBvcCgpLCBwb3J0ID0gcGFydHMucG9wKCksIGFkZHIgPSBwYXJ0cy5qb2luKCc6JylcbiAgcmV0dXJuIChcbiAgICBpc0ZlZWRJZChpZCkgJiYgaXNJbnRlZ2VyKCtwb3J0KVxuICAgICYmIChpc0lQKGFkZHIpIHx8IGlzRG9tYWluKGFkZHIpIHx8IGFkZHIgPT09ICdsb2NhbGhvc3QnKVxuICApXG59XG5cbnZhciBpc0ludml0ZSA9IGV4cG9ydHMuaXNJbnZpdGUgPVxuICBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmKCFpc1N0cmluZyhkYXRhKSkgcmV0dXJuIGZhbHNlXG4gICAgdmFyIHBhcnRzID0gZGF0YS5zcGxpdCgnficpXG4gICAgLy9jb25zb2xlLmxvZyhwYXJ0cywgaXNBZGRyZXNzKHBhcnRzWzBdKSwgL15bQS1aYS16MC05XFwvK117NDN9PSQvLnRlc3QocGFydHNbMV0pKVxuICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPT0gMiAmJiBpc0FkZHJlc3MocGFydHNbMF0pICYmIC9eW0EtWmEtejAtOVxcLytdezQzfT0kLy50ZXN0KHBhcnRzWzFdKVxuICB9XG5cbmV4cG9ydHMudHlwZSA9XG4gIGZ1bmN0aW9uIChpZCkge1xuICAgIGlmKCFpc1N0cmluZyhpZCkpIHJldHVybiBmYWxzZVxuICAgIHZhciBjID0gaWQuY2hhckF0KDApXG4gICAgaWYgKGMgPT0gJ0AnICYmIGlzRmVlZElkKGlkKSlcbiAgICAgIHJldHVybiAnZmVlZCdcbiAgICBlbHNlIGlmIChjID09ICclJyAmJiBpc01zZ0lkKGlkKSlcbiAgICAgIHJldHVybiAnbXNnJ1xuICAgIGVsc2UgaWYgKGMgPT0gJyYnICYmIGlzQmxvYklkKGlkKSlcbiAgICAgIHJldHVybiAnYmxvYidcbiAgICBlbHNlIGlmKGlzQWRkcmVzcyhpZCkpIHJldHVybiAnYWRkcmVzcydcbiAgICBlbHNlIGlmKGlzSW52aXRlKGlkKSkgcmV0dXJuICdpbnZpdGUnXG4gICAgZWxzZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbmV4cG9ydHMuZXh0cmFjdCA9XG4gIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYgKCFpc1N0cmluZyhkYXRhKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgdmFyIF9kYXRhID0gZGF0YVxuICAgIHRyeSB7IF9kYXRhID0gZGVjb2RlVVJJQ29tcG9uZW50KGRhdGEpIH1cbiAgICBjYXRjaCAoZSkge30gLy8gdGhpcyBtYXkgZmFpbCBpZiBpdCdzIG5vdCBlbmNvZGVkLCBzbyBkb24ndCB3b3JyeSBpZiBpdCBkb2VzXG4gICAgX2RhdGEgPSBfZGF0YS5yZXBsYWNlKC8mYW1wOy9nLCAnJicpXG5cbiAgICB2YXIgcmVzID0gLyhbQCUmXVtBLVphLXowLTlcXC8rXXs0M309XFwuW1xcd1xcZF0rKS8uZXhlYyhfZGF0YSlcbiAgICByZXR1cm4gcmVzICYmIHJlc1swXVxuICB9IiwibW9kdWxlLmV4cG9ydHMgPSBTdGFjaztcbnZhciBVcmwgPSByZXF1aXJlKCd1cmwnKTtcblxuZnVuY3Rpb24gU3RhY2soLypsYXllcnMqLykge1xuICB2YXIgZXJyb3IgPSBTdGFjay5lcnJvckhhbmRsZXIsXG4gICAgICBoYW5kbGUgPSBlcnJvcjtcbiAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbiAobGF5ZXIpIHtcbiAgICB2YXIgY2hpbGQgPSBoYW5kbGU7XG4gICAgaGFuZGxlID0gZnVuY3Rpb24gKHJlcSwgcmVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsYXllcihyZXEsIHJlcywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGlmIChlcnIpIHsgcmV0dXJuIGVycm9yKHJlcSwgcmVzLCBlcnIpOyB9XG4gICAgICAgICAgY2hpbGQocmVxLCByZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlcnJvcihyZXEsIHJlcywgZXJyKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGhhbmRsZTtcbn1cblN0YWNrLmVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIGVycm9yKHJlcSwgcmVzLCBlcnIpIHtcbiAgaWYgKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICByZXMud3JpdGVIZWFkKDUwMCwge1wiQ29udGVudC1UeXBlXCI6IFwidGV4dC9wbGFpblwifSk7XG4gICAgcmVzLmVuZChlcnIuc3RhY2sgKyBcIlxcblwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVzLndyaXRlSGVhZCg0MDQsIHtcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvcGxhaW5cIn0pO1xuICByZXMuZW5kKFwiTm90IEZvdW5kXFxuXCIpO1xufTtcblxuZnVuY3Rpb24gY29yZShyZXEsIHJlcywgbmV4dCkgeyBuZXh0KCk7IH1cblxuLy8gQnVpbGQgYSBjb21wb3NpdGUgc3RhY2sgbWFkZSBvZiBzZXZlcmFsIGxheWVyc1xuU3RhY2suY29tcG9zZSA9IGZ1bmN0aW9uIGNvbXBvc2UoLypsYXllcnMqLykge1xuICAvLyBEb24ndCBib3RoZXIgY29tcG9zaW5nIHNpbmdsZXRvbnNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgeyByZXR1cm4gYXJndW1lbnRzWzBdOyB9XG5cbiAgdmFyIHN0YWNrID0gY29yZTtcbiAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbiAobGF5ZXIpIHtcblxuICAgIHZhciBjaGlsZCA9IHN0YWNrO1xuICAgIHN0YWNrID0gZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBsYXllcihyZXEsIHJlcywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGlmIChlcnIpIHsgcmV0dXJuIG5leHQoZXJyKTsgfVxuICAgICAgICAgIGNoaWxkKHJlcSwgcmVzLCBuZXh0KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbmV4dChlcnIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgfSk7XG5cbiAgcmV0dXJuIHN0YWNrO1xufVxuXG4vLyBNb3VudHMgYSBzdWJzdGFjayBhcHAgYXQgYSB1cmwgc3VidHJlZVxuU3RhY2subW91bnQgPSBmdW5jdGlvbiBtb3VudChtb3VudHBvaW50LyosIHN0YWNrKi8pIHtcblxuICB2YXIgc3RhY2sgPSBTdGFjay5jb21wb3NlLmFwcGx5KG51bGwsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuXG4gIGlmIChtb3VudHBvaW50LnN1YnN0cihtb3VudHBvaW50Lmxlbmd0aCAtIDEpID09IFwiL1wiKSB7XG4gICAgbW91bnRwb2ludCA9IG1vdW50cG9pbnQuc3Vic3RyKDAsIG1vdW50cG9pbnQubGVuZ3RoIC0gMSk7XG4gIH1cblxuICB2YXIgbWF0Y2hwb2ludCA9IG1vdW50cG9pbnQgKyBcIi9cIjtcblxuICByZXR1cm4gZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgdmFyIHVybCA9IHJlcS51cmw7XG4gICAgdmFyIHVyaSA9IHJlcS51cmk7XG5cbiAgICBpZiAodXJsLnN1YnN0cigwLCBtYXRjaHBvaW50Lmxlbmd0aCkgIT09IG1hdGNocG9pbnQpIHsgcmV0dXJuIG5leHQoKTsgfVxuXG4gICAgLy8gTW9kaWZ5IHRoZSB1cmxcbiAgICBpZiAoIXJlcS5yZWFsVXJsKSB7IHJlcS5yZWFsVXJsID0gdXJsOyB9XG5cbiAgICByZXEudXJsID0gdXJsLnN1YnN0cihtb3VudHBvaW50Lmxlbmd0aCk7XG4gICAgaWYgKHJlcS51cmkpIHsgcmVxLnVyaSA9IFVybC5wYXJzZShyZXEudXJsKTsgfVxuXG4gICAgc3RhY2socmVxLCByZXMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIHJlcS51cmwgPSB1cmw7XG4gICAgICByZXEudXJpID0gdXJpO1xuICAgICAgbmV4dChlcnIpXG4gICAgfSk7XG5cbiAgfTtcblxufTtcbiIsIlxuLy9cbi8vIGNhbHVjbGF0ZSBzaW1wbGUgc3RhdGlzdGljc1xuLy9cblxubW9kdWxlLmV4cG9ydHMgPSBTdGF0c1xuXG5mdW5jdGlvbiBTdGF0cyAoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdGF0cykpIHJldHVybiBuZXcgU3RhdHMoKVxuICB0aGlzLnN1bSA9IDBcbiAgdGhpcy5zcXN1bSA9IDBcbiAgdGhpcy5tZWFuID0gMFxuICB0aGlzLmNvdW50ID0gMFxuICB0aGlzLm1heCA9IG51bGxcbiAgdGhpcy5taW4gPSBudWxsXG59XG5cblN0YXRzLnByb3RvdHlwZSA9IHtcbiAgdmFsdWU6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB0aGlzLnN1bSArPSB2YWxcbiAgICB0aGlzLnNxc3VtICs9IHZhbCp2YWxcbiAgICB0aGlzLmNvdW50ICsrXG4gICAgdGhpcy5tZWFuID0gdGhpcy5zdW0gLyB0aGlzLmNvdW50XG4gICAgdGhpcy5tYXggPSBcbiAgICAgICAgdGhpcy5tYXggPT09IG51bGwgPyB2YWwgXG4gICAgICA6IHZhbCA+IHRoaXMubWF4ID8gdmFsXG4gICAgICA6IHRoaXMubWF4IFxuICAgIHRoaXMubWluID0gXG4gICAgICAgIHRoaXMubWluID09PSBudWxsID8gdmFsIFxuICAgICAgOiB2YWwgPCB0aGlzLm1pbiA/IHZhbFxuICAgICAgOiB0aGlzLm1pbiBcbiAgICByZXR1cm4gdGhpc1xuICB9LFxuICBnZXQgdmFyaWFuY2UgKCkge1xuICAgIHJldHVybiB0aGlzLnNxc3VtIC8gdGhpcy5jb3VudCAtICh0aGlzLm1lYW4gKiB0aGlzLm1lYW4pXG4gIH0sXG4gIGdldCBzdGRldigpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMudmFyaWFuY2UpXG4gIH0sXG4gIHRvSlNPTjogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7bWVhbjogdGhpcy5tZWFuLCBjb3VudDogdGhpcy5jb3VudCwgc3RkZXY6IHRoaXMuc3RkZXZ9XG4gIH1cbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuaW5oZXJpdHMoU3RyZWFtLCBFRSk7XG5TdHJlYW0uUmVhZGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMnKTtcblN0cmVhbS5Xcml0YWJsZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS5qcycpO1xuU3RyZWFtLkR1cGxleCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9kdXBsZXguanMnKTtcblN0cmVhbS5UcmFuc2Zvcm0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vdHJhbnNmb3JtLmpzJyk7XG5TdHJlYW0uUGFzc1Rocm91Z2ggPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanMnKTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC40LnhcblN0cmVhbS5TdHJlYW0gPSBTdHJlYW07XG5cblxuXG4vLyBvbGQtc3R5bGUgc3RyZWFtcy4gIE5vdGUgdGhhdCB0aGUgcGlwZSBtZXRob2QgKHRoZSBvbmx5IHJlbGV2YW50XG4vLyBwYXJ0IG9mIHRoaXMgY2xhc3MpIGlzIG92ZXJyaWRkZW4gaW4gdGhlIFJlYWRhYmxlIGNsYXNzLlxuXG5mdW5jdGlvbiBTdHJlYW0oKSB7XG4gIEVFLmNhbGwodGhpcyk7XG59XG5cblN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKGRlc3QsIG9wdGlvbnMpIHtcbiAgdmFyIHNvdXJjZSA9IHRoaXM7XG5cbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgaWYgKGRlc3Qud3JpdGFibGUpIHtcbiAgICAgIGlmIChmYWxzZSA9PT0gZGVzdC53cml0ZShjaHVuaykgJiYgc291cmNlLnBhdXNlKSB7XG4gICAgICAgIHNvdXJjZS5wYXVzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZGF0YScsIG9uZGF0YSk7XG5cbiAgZnVuY3Rpb24gb25kcmFpbigpIHtcbiAgICBpZiAoc291cmNlLnJlYWRhYmxlICYmIHNvdXJjZS5yZXN1bWUpIHtcbiAgICAgIHNvdXJjZS5yZXN1bWUoKTtcbiAgICB9XG4gIH1cblxuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIC8vIElmIHRoZSAnZW5kJyBvcHRpb24gaXMgbm90IHN1cHBsaWVkLCBkZXN0LmVuZCgpIHdpbGwgYmUgY2FsbGVkIHdoZW5cbiAgLy8gc291cmNlIGdldHMgdGhlICdlbmQnIG9yICdjbG9zZScgZXZlbnRzLiAgT25seSBkZXN0LmVuZCgpIG9uY2UuXG4gIGlmICghZGVzdC5faXNTdGRpbyAmJiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5lbmQgIT09IGZhbHNlKSkge1xuICAgIHNvdXJjZS5vbignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5vbignY2xvc2UnLCBvbmNsb3NlKTtcbiAgfVxuXG4gIHZhciBkaWRPbkVuZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG5cbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cblxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGlmICh0eXBlb2YgZGVzdC5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSBkZXN0LmRlc3Ryb3koKTtcbiAgfVxuXG4gIC8vIGRvbid0IGxlYXZlIGRhbmdsaW5nIHBpcGVzIHdoZW4gdGhlcmUgYXJlIGVycm9ycy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGNsZWFudXAoKTtcbiAgICBpZiAoRUUubGlzdGVuZXJDb3VudCh0aGlzLCAnZXJyb3InKSA9PT0gMCkge1xuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCBzdHJlYW0gZXJyb3IgaW4gcGlwZS5cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGRlc3Qub24oJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gcmVtb3ZlIGFsbCB0aGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgd2VyZSBhZGRlZC5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcbiAgfVxuXG4gIHNvdXJjZS5vbignZW5kJywgY2xlYW51cCk7XG4gIHNvdXJjZS5vbignY2xvc2UnLCBjbGVhbnVwKTtcblxuICBkZXN0Lm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3QuZW1pdCgncGlwZScsIHNvdXJjZSk7XG5cbiAgLy8gQWxsb3cgZm9yIHVuaXgtbGlrZSB1c2FnZTogQS5waXBlKEIpLnBpcGUoQylcbiAgcmV0dXJuIGRlc3Q7XG59O1xuIiwiLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB1bmRlZmluZWQ7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG5cbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyWzBdLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKSByZXR1cm4gMDtcblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IGJ1ZmZlciBsZXZlbCxcbiAgLy8gdGhlbiByYWlzZSB0aGUgd2F0ZXIgbWFyay4gIEJ1bXAgdXAgdG8gdGhlIG5leHQgaGlnaGVzdFxuICAvLyBwb3dlciBvZiAyLCB0byBwcmV2ZW50IGluY3JlYXNpbmcgaXQgZXhjZXNzaXZlbHkgaW4gdGlueVxuICAvLyBhbW91bnRzLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICBpZiAoZG9SZWFkICYmICFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzTmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXNbMF0gPT09IGRlc3QgJiYgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcikgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO2Vsc2UgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgZGVzdHNbX2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0ID0gbnVsbDtlbHNlIGlmIChvYmplY3RNb2RlKSByZXQgPSBsaXN0LnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSBsaXN0LmpvaW4oJycpO2Vsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKSByZXQgPSBsaXN0WzBdO2Vsc2UgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSAnJztlbHNlIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtlbHNlIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aCkgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO2Vsc2UgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlcikge1xuICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICB2YXIgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHdzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhdHJ1ZSA/IHNldEltbWVkaWF0ZSA6IHByb2Nlc3NOZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGNyZWF0ZSB0aGUgdHdvIG9iamVjdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBjb3JrZWQgcmVxdWVzdHNcbiAgLy8gdGhleSBhcmUgbm90IGEgbGlua2VkIGxpc3QsIGFzIG5vIG5ldyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlcmVcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZS4gTm90IHJlYWRhYmxlLicpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cnk7XG4gICAgX3RoaXMuZW50cnkgPSBudWxsO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVycik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gX3RoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IF90aGlzO1xuICAgIH1cbiAgfTtcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzXCIpXG4iLCJ2YXIgU3RyZWFtID0gKGZ1bmN0aW9uICgpe1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdzdCcgKyAncmVhbScpOyAvLyBoYWNrIHRvIGZpeCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWUgd2hlbiB1c2VkIHdpdGggYnJvd3NlcmlmeVxuICB9IGNhdGNoKF8pe31cbn0oKSk7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IFN0cmVhbSB8fCBleHBvcnRzO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcblxuLy8gaW5saW5lLXByb2Nlc3MtYnJvd3NlciBhbmQgdW5yZWFjaGFibGUtYnJhbmNoLXRyYW5zZm9ybSBtYWtlIHN1cmUgdGhpcyBpc1xuLy8gcmVtb3ZlZCBpbiBicm93c2VyaWZ5IGJ1aWxkc1xuaWYgKCF0cnVlKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnc3RyZWFtJyk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qc1wiKVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9saWIvX3N0cmVhbV93cml0YWJsZS5qc1wiKVxuIiwidmFyIENsaWVudFJlcXVlc3QgPSByZXF1aXJlKCcuL2xpYi9yZXF1ZXN0JylcbnZhciBleHRlbmQgPSByZXF1aXJlKCd4dGVuZCcpXG52YXIgc3RhdHVzQ29kZXMgPSByZXF1aXJlKCdidWlsdGluLXN0YXR1cy1jb2RlcycpXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcblxudmFyIGh0dHAgPSBleHBvcnRzXG5cbmh0dHAucmVxdWVzdCA9IGZ1bmN0aW9uIChvcHRzLCBjYikge1xuXHRpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKVxuXHRcdG9wdHMgPSB1cmwucGFyc2Uob3B0cylcblx0ZWxzZVxuXHRcdG9wdHMgPSBleHRlbmQob3B0cylcblxuXHQvLyBOb3JtYWxseSwgdGhlIHBhZ2UgaXMgbG9hZGVkIGZyb20gaHR0cCBvciBodHRwcywgc28gbm90IHNwZWNpZnlpbmcgYSBwcm90b2NvbFxuXHQvLyB3aWxsIHJlc3VsdCBpbiBhICh2YWxpZCkgcHJvdG9jb2wtcmVsYXRpdmUgdXJsLiBIb3dldmVyLCB0aGlzIHdvbid0IHdvcmsgaWZcblx0Ly8gdGhlIHByb3RvY29sIGlzIHNvbWV0aGluZyBlbHNlLCBsaWtlICdmaWxlOidcblx0dmFyIGRlZmF1bHRQcm90b2NvbCA9IGdsb2JhbC5sb2NhdGlvbi5wcm90b2NvbC5zZWFyY2goL15odHRwcz86JC8pID09PSAtMSA/ICdodHRwOicgOiAnJ1xuXG5cdHZhciBwcm90b2NvbCA9IG9wdHMucHJvdG9jb2wgfHwgZGVmYXVsdFByb3RvY29sXG5cdHZhciBob3N0ID0gb3B0cy5ob3N0bmFtZSB8fCBvcHRzLmhvc3Rcblx0dmFyIHBvcnQgPSBvcHRzLnBvcnRcblx0dmFyIHBhdGggPSBvcHRzLnBhdGggfHwgJy8nXG5cblx0Ly8gTmVjZXNzYXJ5IGZvciBJUHY2IGFkZHJlc3Nlc1xuXHRpZiAoaG9zdCAmJiBob3N0LmluZGV4T2YoJzonKSAhPT0gLTEpXG5cdFx0aG9zdCA9ICdbJyArIGhvc3QgKyAnXSdcblxuXHQvLyBUaGlzIG1heSBiZSBhIHJlbGF0aXZlIHVybC4gVGhlIGJyb3dzZXIgc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIGludGVycHJldCBpdCBjb3JyZWN0bHkuXG5cdG9wdHMudXJsID0gKGhvc3QgPyAocHJvdG9jb2wgKyAnLy8nICsgaG9zdCkgOiAnJykgKyAocG9ydCA/ICc6JyArIHBvcnQgOiAnJykgKyBwYXRoXG5cdG9wdHMubWV0aG9kID0gKG9wdHMubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpXG5cdG9wdHMuaGVhZGVycyA9IG9wdHMuaGVhZGVycyB8fCB7fVxuXG5cdC8vIEFsc28gdmFsaWQgb3B0cy5hdXRoLCBvcHRzLm1vZGVcblxuXHR2YXIgcmVxID0gbmV3IENsaWVudFJlcXVlc3Qob3B0cylcblx0aWYgKGNiKVxuXHRcdHJlcS5vbigncmVzcG9uc2UnLCBjYilcblx0cmV0dXJuIHJlcVxufVxuXG5odHRwLmdldCA9IGZ1bmN0aW9uIGdldCAob3B0cywgY2IpIHtcblx0dmFyIHJlcSA9IGh0dHAucmVxdWVzdChvcHRzLCBjYilcblx0cmVxLmVuZCgpXG5cdHJldHVybiByZXFcbn1cblxuaHR0cC5BZ2VudCA9IGZ1bmN0aW9uICgpIHt9XG5odHRwLkFnZW50LmRlZmF1bHRNYXhTb2NrZXRzID0gNFxuXG5odHRwLlNUQVRVU19DT0RFUyA9IHN0YXR1c0NvZGVzXG5cbmh0dHAuTUVUSE9EUyA9IFtcblx0J0NIRUNLT1VUJyxcblx0J0NPTk5FQ1QnLFxuXHQnQ09QWScsXG5cdCdERUxFVEUnLFxuXHQnR0VUJyxcblx0J0hFQUQnLFxuXHQnTE9DSycsXG5cdCdNLVNFQVJDSCcsXG5cdCdNRVJHRScsXG5cdCdNS0FDVElWSVRZJyxcblx0J01LQ09MJyxcblx0J01PVkUnLFxuXHQnTk9USUZZJyxcblx0J09QVElPTlMnLFxuXHQnUEFUQ0gnLFxuXHQnUE9TVCcsXG5cdCdQUk9QRklORCcsXG5cdCdQUk9QUEFUQ0gnLFxuXHQnUFVSR0UnLFxuXHQnUFVUJyxcblx0J1JFUE9SVCcsXG5cdCdTRUFSQ0gnLFxuXHQnU1VCU0NSSUJFJyxcblx0J1RSQUNFJyxcblx0J1VOTE9DSycsXG5cdCdVTlNVQlNDUklCRSdcbl0iLCJleHBvcnRzLmZldGNoID0gaXNGdW5jdGlvbihnbG9iYWwuZmV0Y2gpICYmIGlzRnVuY3Rpb24oZ2xvYmFsLlJlYWRhYmxlQnl0ZVN0cmVhbSlcblxuZXhwb3J0cy5ibG9iQ29uc3RydWN0b3IgPSBmYWxzZVxudHJ5IHtcblx0bmV3IEJsb2IoW25ldyBBcnJheUJ1ZmZlcigxKV0pXG5cdGV4cG9ydHMuYmxvYkNvbnN0cnVjdG9yID0gdHJ1ZVxufSBjYXRjaCAoZSkge31cblxudmFyIHhociA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKVxuLy8gSWYgbG9jYXRpb24uaG9zdCBpcyBlbXB0eSwgZS5nLiBpZiB0aGlzIHBhZ2Uvd29ya2VyIHdhcyBsb2FkZWRcbi8vIGZyb20gYSBCbG9iLCB0aGVuIHVzZSBleGFtcGxlLmNvbSB0byBhdm9pZCBhbiBlcnJvclxueGhyLm9wZW4oJ0dFVCcsIGdsb2JhbC5sb2NhdGlvbi5ob3N0ID8gJy8nIDogJ2h0dHBzOi8vZXhhbXBsZS5jb20nKVxuXG5mdW5jdGlvbiBjaGVja1R5cGVTdXBwb3J0ICh0eXBlKSB7XG5cdHRyeSB7XG5cdFx0eGhyLnJlc3BvbnNlVHlwZSA9IHR5cGVcblx0XHRyZXR1cm4geGhyLnJlc3BvbnNlVHlwZSA9PT0gdHlwZVxuXHR9IGNhdGNoIChlKSB7fVxuXHRyZXR1cm4gZmFsc2Vcbn1cblxuLy8gRm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIFNhZmFyaSA3LjAgcmVwb3J0cyB0eXBlb2YgZ2xvYmFsLkFycmF5QnVmZmVyID09PSAnb2JqZWN0Jy5cbi8vIFNhZmFyaSA3LjEgYXBwZWFycyB0byBoYXZlIGZpeGVkIHRoaXMgYnVnLlxudmFyIGhhdmVBcnJheUJ1ZmZlciA9IHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnXG52YXIgaGF2ZVNsaWNlID0gaGF2ZUFycmF5QnVmZmVyICYmIGlzRnVuY3Rpb24oZ2xvYmFsLkFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSlcblxuZXhwb3J0cy5hcnJheWJ1ZmZlciA9IGhhdmVBcnJheUJ1ZmZlciAmJiBjaGVja1R5cGVTdXBwb3J0KCdhcnJheWJ1ZmZlcicpXG4vLyBUaGVzZSBuZXh0IHR3byB0ZXN0cyB1bmF2b2lkYWJseSBzaG93IHdhcm5pbmdzIGluIENocm9tZS4gU2luY2UgZmV0Y2ggd2lsbCBhbHdheXNcbi8vIGJlIHVzZWQgaWYgaXQncyBhdmFpbGFibGUsIGp1c3QgcmV0dXJuIGZhbHNlIGZvciB0aGVzZSB0byBhdm9pZCB0aGUgd2FybmluZ3MuXG5leHBvcnRzLm1zc3RyZWFtID0gIWV4cG9ydHMuZmV0Y2ggJiYgaGF2ZVNsaWNlICYmIGNoZWNrVHlwZVN1cHBvcnQoJ21zLXN0cmVhbScpXG5leHBvcnRzLm1vemNodW5rZWRhcnJheWJ1ZmZlciA9ICFleHBvcnRzLmZldGNoICYmIGhhdmVBcnJheUJ1ZmZlciAmJlxuXHRjaGVja1R5cGVTdXBwb3J0KCdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcicpXG5leHBvcnRzLm92ZXJyaWRlTWltZVR5cGUgPSBpc0Z1bmN0aW9uKHhoci5vdmVycmlkZU1pbWVUeXBlKVxuZXhwb3J0cy52YkFycmF5ID0gaXNGdW5jdGlvbihnbG9iYWwuVkJBcnJheSlcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG54aHIgPSBudWxsIC8vIEhlbHAgZ2NcbiIsIi8vIHZhciBCYXNlNjQgPSByZXF1aXJlKCdCYXNlNjQnKVxudmFyIGNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL2NhcGFiaWxpdHknKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIHJlc3BvbnNlID0gcmVxdWlyZSgnLi9yZXNwb25zZScpXG52YXIgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbnZhciB0b0FycmF5QnVmZmVyID0gcmVxdWlyZSgndG8tYXJyYXlidWZmZXInKVxuXG52YXIgSW5jb21pbmdNZXNzYWdlID0gcmVzcG9uc2UuSW5jb21pbmdNZXNzYWdlXG52YXIgclN0YXRlcyA9IHJlc3BvbnNlLnJlYWR5U3RhdGVzXG5cbmZ1bmN0aW9uIGRlY2lkZU1vZGUgKHByZWZlckJpbmFyeSkge1xuXHRpZiAoY2FwYWJpbGl0eS5mZXRjaCkge1xuXHRcdHJldHVybiAnZmV0Y2gnXG5cdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS5tb3pjaHVua2VkYXJyYXlidWZmZXIpIHtcblx0XHRyZXR1cm4gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJ1xuXHR9IGVsc2UgaWYgKGNhcGFiaWxpdHkubXNzdHJlYW0pIHtcblx0XHRyZXR1cm4gJ21zLXN0cmVhbSdcblx0fSBlbHNlIGlmIChjYXBhYmlsaXR5LmFycmF5YnVmZmVyICYmIHByZWZlckJpbmFyeSkge1xuXHRcdHJldHVybiAnYXJyYXlidWZmZXInXG5cdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS52YkFycmF5ICYmIHByZWZlckJpbmFyeSkge1xuXHRcdHJldHVybiAndGV4dDp2YmFycmF5J1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAndGV4dCdcblx0fVxufVxuXG52YXIgQ2xpZW50UmVxdWVzdCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdHMpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHN0cmVhbS5Xcml0YWJsZS5jYWxsKHNlbGYpXG5cblx0c2VsZi5fb3B0cyA9IG9wdHNcblx0c2VsZi5fYm9keSA9IFtdXG5cdHNlbGYuX2hlYWRlcnMgPSB7fVxuXHRpZiAob3B0cy5hdXRoKVxuXHRcdHNlbGYuc2V0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBuZXcgQnVmZmVyKG9wdHMuYXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpKVxuXHRPYmplY3Qua2V5cyhvcHRzLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcblx0XHRzZWxmLnNldEhlYWRlcihuYW1lLCBvcHRzLmhlYWRlcnNbbmFtZV0pXG5cdH0pXG5cblx0dmFyIHByZWZlckJpbmFyeVxuXHRpZiAob3B0cy5tb2RlID09PSAncHJlZmVyLXN0cmVhbWluZycpIHtcblx0XHQvLyBJZiBzdHJlYW1pbmcgaXMgYSBoaWdoIHByaW9yaXR5IGJ1dCBiaW5hcnkgY29tcGF0aWJpbGl0eSBhbmRcblx0XHQvLyB0aGUgYWNjdXJhY3kgb2YgdGhlICdjb250ZW50LXR5cGUnIGhlYWRlciBhcmVuJ3Rcblx0XHRwcmVmZXJCaW5hcnkgPSBmYWxzZVxuXHR9IGVsc2UgaWYgKG9wdHMubW9kZSA9PT0gJ2FsbG93LXdyb25nLWNvbnRlbnQtdHlwZScpIHtcblx0XHQvLyBJZiBzdHJlYW1pbmcgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBwcmVzZXJ2aW5nIHRoZSAnY29udGVudC10eXBlJyBoZWFkZXJcblx0XHRwcmVmZXJCaW5hcnkgPSAhY2FwYWJpbGl0eS5vdmVycmlkZU1pbWVUeXBlXG5cdH0gZWxzZSBpZiAoIW9wdHMubW9kZSB8fCBvcHRzLm1vZGUgPT09ICdkZWZhdWx0JyB8fCBvcHRzLm1vZGUgPT09ICdwcmVmZXItZmFzdCcpIHtcblx0XHQvLyBVc2UgYmluYXJ5IGlmIHRleHQgc3RyZWFtaW5nIG1heSBjb3JydXB0IGRhdGEgb3IgdGhlIGNvbnRlbnQtdHlwZSBoZWFkZXIsIG9yIGZvciBzcGVlZFxuXHRcdHByZWZlckJpbmFyeSA9IHRydWVcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIG9wdHMubW9kZScpXG5cdH1cblx0c2VsZi5fbW9kZSA9IGRlY2lkZU1vZGUocHJlZmVyQmluYXJ5KVxuXG5cdHNlbGYub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcblx0XHRzZWxmLl9vbkZpbmlzaCgpXG5cdH0pXG59XG5cbmluaGVyaXRzKENsaWVudFJlcXVlc3QsIHN0cmVhbS5Xcml0YWJsZSlcblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0SGVhZGVyID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHR2YXIgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXG5cdC8vIFRoaXMgY2hlY2sgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IGl0IHByZXZlbnRzIHdhcm5pbmdzIGZyb20gYnJvd3NlcnMgYWJvdXQgc2V0dGluZyB1bnNhZmVcblx0Ly8gaGVhZGVycy4gVG8gYmUgaG9uZXN0IEknbSBub3QgZW50aXJlbHkgc3VyZSBoaWRpbmcgdGhlc2Ugd2FybmluZ3MgaXMgYSBnb29kIHRoaW5nLCBidXRcblx0Ly8gaHR0cC1icm93c2VyaWZ5IGRpZCBpdCwgc28gSSB3aWxsIHRvby5cblx0aWYgKHVuc2FmZUhlYWRlcnMuaW5kZXhPZihsb3dlck5hbWUpICE9PSAtMSlcblx0XHRyZXR1cm5cblxuXHRzZWxmLl9oZWFkZXJzW2xvd2VyTmFtZV0gPSB7XG5cdFx0bmFtZTogbmFtZSxcblx0XHR2YWx1ZTogdmFsdWVcblx0fVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5nZXRIZWFkZXIgPSBmdW5jdGlvbiAobmFtZSkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0cmV0dXJuIHNlbGYuX2hlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXS52YWx1ZVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5yZW1vdmVIZWFkZXIgPSBmdW5jdGlvbiAobmFtZSkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0ZGVsZXRlIHNlbGYuX2hlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fb25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdGlmIChzZWxmLl9kZXN0cm95ZWQpXG5cdFx0cmV0dXJuXG5cdHZhciBvcHRzID0gc2VsZi5fb3B0c1xuXG5cdHZhciBoZWFkZXJzT2JqID0gc2VsZi5faGVhZGVyc1xuXHR2YXIgYm9keVxuXHRpZiAob3B0cy5tZXRob2QgPT09ICdQT1NUJyB8fCBvcHRzLm1ldGhvZCA9PT0gJ1BVVCcgfHwgb3B0cy5tZXRob2QgPT09ICdQQVRDSCcpIHtcblx0XHRpZiAoY2FwYWJpbGl0eS5ibG9iQ29uc3RydWN0b3IpIHtcblx0XHRcdGJvZHkgPSBuZXcgZ2xvYmFsLkJsb2Ioc2VsZi5fYm9keS5tYXAoZnVuY3Rpb24gKGJ1ZmZlcikge1xuXHRcdFx0XHRyZXR1cm4gdG9BcnJheUJ1ZmZlcihidWZmZXIpXG5cdFx0XHR9KSwge1xuXHRcdFx0XHR0eXBlOiAoaGVhZGVyc09ialsnY29udGVudC10eXBlJ10gfHwge30pLnZhbHVlIHx8ICcnXG5cdFx0XHR9KVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBnZXQgdXRmOCBzdHJpbmdcblx0XHRcdGJvZHkgPSBCdWZmZXIuY29uY2F0KHNlbGYuX2JvZHkpLnRvU3RyaW5nKClcblx0XHR9XG5cdH1cblxuXHRpZiAoc2VsZi5fbW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHZhciBoZWFkZXJzID0gT2JqZWN0LmtleXMoaGVhZGVyc09iaikubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG5cdFx0XHRyZXR1cm4gW2hlYWRlcnNPYmpbbmFtZV0ubmFtZSwgaGVhZGVyc09ialtuYW1lXS52YWx1ZV1cblx0XHR9KVxuXG5cdFx0Z2xvYmFsLmZldGNoKHNlbGYuX29wdHMudXJsLCB7XG5cdFx0XHRtZXRob2Q6IHNlbGYuX29wdHMubWV0aG9kLFxuXHRcdFx0aGVhZGVyczogaGVhZGVycyxcblx0XHRcdGJvZHk6IGJvZHksXG5cdFx0XHRtb2RlOiAnY29ycycsXG5cdFx0XHRjcmVkZW50aWFsczogb3B0cy53aXRoQ3JlZGVudGlhbHMgPyAnaW5jbHVkZScgOiAnc2FtZS1vcmlnaW4nXG5cdFx0fSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0XHRcdHNlbGYuX2ZldGNoUmVzcG9uc2UgPSByZXNwb25zZVxuXHRcdFx0c2VsZi5fY29ubmVjdCgpXG5cdFx0fSwgZnVuY3Rpb24gKHJlYXNvbikge1xuXHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIHJlYXNvbilcblx0XHR9KVxuXHR9IGVsc2Uge1xuXHRcdHZhciB4aHIgPSBzZWxmLl94aHIgPSBuZXcgZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0KClcblx0XHR0cnkge1xuXHRcdFx0eGhyLm9wZW4oc2VsZi5fb3B0cy5tZXRob2QsIHNlbGYuX29wdHMudXJsLCB0cnVlKVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0Ly8gQ2FuJ3Qgc2V0IHJlc3BvbnNlVHlwZSBvbiByZWFsbHkgb2xkIGJyb3dzZXJzXG5cdFx0aWYgKCdyZXNwb25zZVR5cGUnIGluIHhocilcblx0XHRcdHhoci5yZXNwb25zZVR5cGUgPSBzZWxmLl9tb2RlLnNwbGl0KCc6JylbMF1cblxuXHRcdGlmICgnd2l0aENyZWRlbnRpYWxzJyBpbiB4aHIpXG5cdFx0XHR4aHIud2l0aENyZWRlbnRpYWxzID0gISFvcHRzLndpdGhDcmVkZW50aWFsc1xuXG5cdFx0aWYgKHNlbGYuX21vZGUgPT09ICd0ZXh0JyAmJiAnb3ZlcnJpZGVNaW1lVHlwZScgaW4geGhyKVxuXHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQnKVxuXG5cdFx0T2JqZWN0LmtleXMoaGVhZGVyc09iaikuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyc09ialtuYW1lXS5uYW1lLCBoZWFkZXJzT2JqW25hbWVdLnZhbHVlKVxuXHRcdH0pXG5cblx0XHRzZWxmLl9yZXNwb25zZSA9IG51bGxcblx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0c3dpdGNoICh4aHIucmVhZHlTdGF0ZSkge1xuXHRcdFx0XHRjYXNlIHJTdGF0ZXMuTE9BRElORzpcblx0XHRcdFx0Y2FzZSByU3RhdGVzLkRPTkU6XG5cdFx0XHRcdFx0c2VsZi5fb25YSFJQcm9ncmVzcygpXG5cdFx0XHRcdFx0YnJlYWtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gTmVjZXNzYXJ5IGZvciBzdHJlYW1pbmcgaW4gRmlyZWZveCwgc2luY2UgeGhyLnJlc3BvbnNlIGlzIE9OTFkgZGVmaW5lZFxuXHRcdC8vIGluIG9ucHJvZ3Jlc3MsIG5vdCBpbiBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aCB4aHIucmVhZHlTdGF0ZSA9IDNcblx0XHRpZiAoc2VsZi5fbW9kZSA9PT0gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJykge1xuXHRcdFx0eGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuX29uWEhSUHJvZ3Jlc3MoKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdYSFIgZXJyb3InKSlcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0eGhyLnNlbmQoYm9keSlcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuXHRcdFx0fSlcblx0XHRcdHJldHVyblxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB4aHIuc3RhdHVzIGlzIHJlYWRhYmxlIGFuZCBub24temVybywgaW5kaWNhdGluZyBubyBlcnJvci5cbiAqIEV2ZW4gdGhvdWdoIHRoZSBzcGVjIHNheXMgaXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiByZWFkeVN0YXRlIDMsXG4gKiBhY2Nlc3NpbmcgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBJRThcbiAqL1xuZnVuY3Rpb24gc3RhdHVzVmFsaWQgKHhocikge1xuXHR0cnkge1xuXHRcdHZhciBzdGF0dXMgPSB4aHIuc3RhdHVzXG5cdFx0cmV0dXJuIChzdGF0dXMgIT09IG51bGwgJiYgc3RhdHVzICE9PSAwKVxuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX29uWEhSUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdGlmICghc3RhdHVzVmFsaWQoc2VsZi5feGhyKSB8fCBzZWxmLl9kZXN0cm95ZWQpXG5cdFx0cmV0dXJuXG5cblx0aWYgKCFzZWxmLl9yZXNwb25zZSlcblx0XHRzZWxmLl9jb25uZWN0KClcblxuXHRzZWxmLl9yZXNwb25zZS5fb25YSFJQcm9ncmVzcygpXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl9jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHRpZiAoc2VsZi5fZGVzdHJveWVkKVxuXHRcdHJldHVyblxuXG5cdHNlbGYuX3Jlc3BvbnNlID0gbmV3IEluY29taW5nTWVzc2FnZShzZWxmLl94aHIsIHNlbGYuX2ZldGNoUmVzcG9uc2UsIHNlbGYuX21vZGUpXG5cdHNlbGYuZW1pdCgncmVzcG9uc2UnLCBzZWxmLl9yZXNwb25zZSlcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0c2VsZi5fYm9keS5wdXNoKGNodW5rKVxuXHRjYigpXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLmFib3J0ID0gQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHNlbGYuX2Rlc3Ryb3llZCA9IHRydWVcblx0aWYgKHNlbGYuX3Jlc3BvbnNlKVxuXHRcdHNlbGYuX3Jlc3BvbnNlLl9kZXN0cm95ZWQgPSB0cnVlXG5cdGlmIChzZWxmLl94aHIpXG5cdFx0c2VsZi5feGhyLmFib3J0KClcblx0Ly8gQ3VycmVudGx5LCB0aGVyZSBpc24ndCBhIHdheSB0byB0cnVseSBhYm9ydCBhIGZldGNoLlxuXHQvLyBJZiB5b3UgbGlrZSBiaWtlc2hlZGRpbmcsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2ZldGNoL2lzc3Vlcy8yN1xufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoZGF0YSwgZW5jb2RpbmcsIGNiKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcblx0XHRjYiA9IGRhdGFcblx0XHRkYXRhID0gdW5kZWZpbmVkXG5cdH1cblxuXHRzdHJlYW0uV3JpdGFibGUucHJvdG90eXBlLmVuZC5jYWxsKHNlbGYsIGRhdGEsIGVuY29kaW5nLCBjYilcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZmx1c2hIZWFkZXJzID0gZnVuY3Rpb24gKCkge31cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7fVxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0Tm9EZWxheSA9IGZ1bmN0aW9uICgpIHt9XG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXRTb2NrZXRLZWVwQWxpdmUgPSBmdW5jdGlvbiAoKSB7fVxuXG4vLyBUYWtlbiBmcm9tIGh0dHA6Ly93d3cudzMub3JnL1RSL1hNTEh0dHBSZXF1ZXN0LyN0aGUtc2V0cmVxdWVzdGhlYWRlciUyOCUyOS1tZXRob2RcbnZhciB1bnNhZmVIZWFkZXJzID0gW1xuXHQnYWNjZXB0LWNoYXJzZXQnLFxuXHQnYWNjZXB0LWVuY29kaW5nJyxcblx0J2FjY2Vzcy1jb250cm9sLXJlcXVlc3QtaGVhZGVycycsXG5cdCdhY2Nlc3MtY29udHJvbC1yZXF1ZXN0LW1ldGhvZCcsXG5cdCdjb25uZWN0aW9uJyxcblx0J2NvbnRlbnQtbGVuZ3RoJyxcblx0J2Nvb2tpZScsXG5cdCdjb29raWUyJyxcblx0J2RhdGUnLFxuXHQnZG50Jyxcblx0J2V4cGVjdCcsXG5cdCdob3N0Jyxcblx0J2tlZXAtYWxpdmUnLFxuXHQnb3JpZ2luJyxcblx0J3JlZmVyZXInLFxuXHQndGUnLFxuXHQndHJhaWxlcicsXG5cdCd0cmFuc2Zlci1lbmNvZGluZycsXG5cdCd1cGdyYWRlJyxcblx0J3VzZXItYWdlbnQnLFxuXHQndmlhJ1xuXVxuIiwidmFyIGNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL2NhcGFiaWxpdHknKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5cbnZhciByU3RhdGVzID0gZXhwb3J0cy5yZWFkeVN0YXRlcyA9IHtcblx0VU5TRU5UOiAwLFxuXHRPUEVORUQ6IDEsXG5cdEhFQURFUlNfUkVDRUlWRUQ6IDIsXG5cdExPQURJTkc6IDMsXG5cdERPTkU6IDRcbn1cblxudmFyIEluY29taW5nTWVzc2FnZSA9IGV4cG9ydHMuSW5jb21pbmdNZXNzYWdlID0gZnVuY3Rpb24gKHhociwgcmVzcG9uc2UsIG1vZGUpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHN0cmVhbS5SZWFkYWJsZS5jYWxsKHNlbGYpXG5cblx0c2VsZi5fbW9kZSA9IG1vZGVcblx0c2VsZi5oZWFkZXJzID0ge31cblx0c2VsZi5yYXdIZWFkZXJzID0gW11cblx0c2VsZi50cmFpbGVycyA9IHt9XG5cdHNlbGYucmF3VHJhaWxlcnMgPSBbXVxuXG5cdC8vIEZha2UgdGhlICdjbG9zZScgZXZlbnQsIGJ1dCBvbmx5IG9uY2UgJ2VuZCcgZmlyZXNcblx0c2VsZi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuXHRcdC8vIFRoZSBuZXh0VGljayBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgJ3JlcXVlc3QnIG1vZHVsZSBmcm9tIGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcFxuXHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0c2VsZi5lbWl0KCdjbG9zZScpXG5cdFx0fSlcblx0fSlcblxuXHRpZiAobW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHNlbGYuX2ZldGNoUmVzcG9uc2UgPSByZXNwb25zZVxuXG5cdFx0c2VsZi5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzXG5cdFx0c2VsZi5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dFxuXHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlIHZlcnNpb24gb2YgZm9yICg8aXRlbT4gb2YgPGl0ZXJhYmxlPik6XG5cdFx0Ly8gZm9yICh2YXIgPGl0ZW0+LF9pLF9pdCA9IDxpdGVyYWJsZT5bU3ltYm9sLml0ZXJhdG9yXSgpOyA8aXRlbT4gPSAoX2kgPSBfaXQubmV4dCgpKS52YWx1ZSwhX2kuZG9uZTspXG5cdFx0Zm9yICh2YXIgaGVhZGVyLCBfaSwgX2l0ID0gcmVzcG9uc2UuaGVhZGVyc1tTeW1ib2wuaXRlcmF0b3JdKCk7IGhlYWRlciA9IChfaSA9IF9pdC5uZXh0KCkpLnZhbHVlLCAhX2kuZG9uZTspIHtcblx0XHRcdHNlbGYuaGVhZGVyc1toZWFkZXJbMF0udG9Mb3dlckNhc2UoKV0gPSBoZWFkZXJbMV1cblx0XHRcdHNlbGYucmF3SGVhZGVycy5wdXNoKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuXHRcdH1cblxuXHRcdC8vIFRPRE86IHRoaXMgZG9lc24ndCByZXNwZWN0IGJhY2twcmVzc3VyZS4gT25jZSBXcml0YWJsZVN0cmVhbSBpcyBhdmFpbGFibGUsIHRoaXMgY2FuIGJlIGZpeGVkXG5cdFx0dmFyIHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKClcblx0XHRmdW5jdGlvbiByZWFkICgpIHtcblx0XHRcdHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG5cdFx0XHRcdGlmIChzZWxmLl9kZXN0cm95ZWQpXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdGlmIChyZXN1bHQuZG9uZSkge1xuXHRcdFx0XHRcdHNlbGYucHVzaChudWxsKVxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKHJlc3VsdC52YWx1ZSkpXG5cdFx0XHRcdHJlYWQoKVxuXHRcdFx0fSlcblx0XHR9XG5cdFx0cmVhZCgpXG5cblx0fSBlbHNlIHtcblx0XHRzZWxmLl94aHIgPSB4aHJcblx0XHRzZWxmLl9wb3MgPSAwXG5cblx0XHRzZWxmLnN0YXR1c0NvZGUgPSB4aHIuc3RhdHVzXG5cdFx0c2VsZi5zdGF0dXNNZXNzYWdlID0geGhyLnN0YXR1c1RleHRcblx0XHR2YXIgaGVhZGVycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgvXFxyP1xcbi8pXG5cdFx0aGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHtcblx0XHRcdHZhciBtYXRjaGVzID0gaGVhZGVyLm1hdGNoKC9eKFteOl0rKTpcXHMqKC4qKS8pXG5cdFx0XHRpZiAobWF0Y2hlcykge1xuXHRcdFx0XHR2YXIga2V5ID0gbWF0Y2hlc1sxXS50b0xvd2VyQ2FzZSgpXG5cdFx0XHRcdGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuXHRcdFx0XHRcdGlmIChzZWxmLmhlYWRlcnNba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRzZWxmLmhlYWRlcnNba2V5XSA9IFtdXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNlbGYuaGVhZGVyc1trZXldLnB1c2gobWF0Y2hlc1syXSlcblx0XHRcdFx0fSBlbHNlIGlmIChzZWxmLmhlYWRlcnNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0c2VsZi5oZWFkZXJzW2tleV0gKz0gJywgJyArIG1hdGNoZXNbMl1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzZWxmLmhlYWRlcnNba2V5XSA9IG1hdGNoZXNbMl1cblx0XHRcdFx0fVxuXHRcdFx0XHRzZWxmLnJhd0hlYWRlcnMucHVzaChtYXRjaGVzWzFdLCBtYXRjaGVzWzJdKVxuXHRcdFx0fVxuXHRcdH0pXG5cblx0XHRzZWxmLl9jaGFyc2V0ID0gJ3gtdXNlci1kZWZpbmVkJ1xuXHRcdGlmICghY2FwYWJpbGl0eS5vdmVycmlkZU1pbWVUeXBlKSB7XG5cdFx0XHR2YXIgbWltZVR5cGUgPSBzZWxmLnJhd0hlYWRlcnNbJ21pbWUtdHlwZSddXG5cdFx0XHRpZiAobWltZVR5cGUpIHtcblx0XHRcdFx0dmFyIGNoYXJzZXRNYXRjaCA9IG1pbWVUeXBlLm1hdGNoKC87XFxzKmNoYXJzZXQ9KFteO10pKDt8JCkvKVxuXHRcdFx0XHRpZiAoY2hhcnNldE1hdGNoKSB7XG5cdFx0XHRcdFx0c2VsZi5fY2hhcnNldCA9IGNoYXJzZXRNYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghc2VsZi5fY2hhcnNldClcblx0XHRcdFx0c2VsZi5fY2hhcnNldCA9ICd1dGYtOCcgLy8gYmVzdCBndWVzc1xuXHRcdH1cblx0fVxufVxuXG5pbmhlcml0cyhJbmNvbWluZ01lc3NhZ2UsIHN0cmVhbS5SZWFkYWJsZSlcblxuSW5jb21pbmdNZXNzYWdlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uICgpIHt9XG5cbkluY29taW5nTWVzc2FnZS5wcm90b3R5cGUuX29uWEhSUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdHZhciB4aHIgPSBzZWxmLl94aHJcblxuXHR2YXIgcmVzcG9uc2UgPSBudWxsXG5cdHN3aXRjaCAoc2VsZi5fbW9kZSkge1xuXHRcdGNhc2UgJ3RleHQ6dmJhcnJheSc6IC8vIEZvciBJRTlcblx0XHRcdGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gclN0YXRlcy5ET05FKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gVGhpcyBmYWlscyBpbiBJRThcblx0XHRcdFx0cmVzcG9uc2UgPSBuZXcgZ2xvYmFsLlZCQXJyYXkoeGhyLnJlc3BvbnNlQm9keSkudG9BcnJheSgpXG5cdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0aWYgKHJlc3BvbnNlICE9PSBudWxsKSB7XG5cdFx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKHJlc3BvbnNlKSlcblx0XHRcdFx0YnJlYWtcblx0XHRcdH1cblx0XHRcdC8vIEZhbGxzIHRocm91Z2ggaW4gSUU4XHRcblx0XHRjYXNlICd0ZXh0Jzpcblx0XHRcdHRyeSB7IC8vIFRoaXMgd2lsbCBmYWlsIHdoZW4gcmVhZHlTdGF0ZSA9IDMgaW4gSUU5LiBTd2l0Y2ggbW9kZSBhbmQgd2FpdCBmb3IgcmVhZHlTdGF0ZSA9IDRcblx0XHRcdFx0cmVzcG9uc2UgPSB4aHIucmVzcG9uc2VUZXh0XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHNlbGYuX21vZGUgPSAndGV4dDp2YmFycmF5J1xuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlc3BvbnNlLmxlbmd0aCA+IHNlbGYuX3Bvcykge1xuXHRcdFx0XHR2YXIgbmV3RGF0YSA9IHJlc3BvbnNlLnN1YnN0cihzZWxmLl9wb3MpXG5cdFx0XHRcdGlmIChzZWxmLl9jaGFyc2V0ID09PSAneC11c2VyLWRlZmluZWQnKSB7XG5cdFx0XHRcdFx0dmFyIGJ1ZmZlciA9IG5ldyBCdWZmZXIobmV3RGF0YS5sZW5ndGgpXG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBuZXdEYXRhLmxlbmd0aDsgaSsrKVxuXHRcdFx0XHRcdFx0YnVmZmVyW2ldID0gbmV3RGF0YS5jaGFyQ29kZUF0KGkpICYgMHhmZlxuXG5cdFx0XHRcdFx0c2VsZi5wdXNoKGJ1ZmZlcilcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzZWxmLnB1c2gobmV3RGF0YSwgc2VsZi5fY2hhcnNldClcblx0XHRcdFx0fVxuXHRcdFx0XHRzZWxmLl9wb3MgPSByZXNwb25zZS5sZW5ndGhcblx0XHRcdH1cblx0XHRcdGJyZWFrXG5cdFx0Y2FzZSAnYXJyYXlidWZmZXInOlxuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkRPTkUpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRyZXNwb25zZSA9IHhoci5yZXNwb25zZVxuXHRcdFx0c2VsZi5wdXNoKG5ldyBCdWZmZXIobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKSlcblx0XHRcdGJyZWFrXG5cdFx0Y2FzZSAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInOiAvLyB0YWtlIHdob2xlXG5cdFx0XHRyZXNwb25zZSA9IHhoci5yZXNwb25zZVxuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkxPQURJTkcgfHwgIXJlc3BvbnNlKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0c2VsZi5wdXNoKG5ldyBCdWZmZXIobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKSlcblx0XHRcdGJyZWFrXG5cdFx0Y2FzZSAnbXMtc3RyZWFtJzpcblx0XHRcdHJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuTE9BRElORylcblx0XHRcdFx0YnJlYWtcblx0XHRcdHZhciByZWFkZXIgPSBuZXcgZ2xvYmFsLk1TU3RyZWFtUmVhZGVyKClcblx0XHRcdHJlYWRlci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAocmVhZGVyLnJlc3VsdC5ieXRlTGVuZ3RoID4gc2VsZi5fcG9zKSB7XG5cdFx0XHRcdFx0c2VsZi5wdXNoKG5ldyBCdWZmZXIobmV3IFVpbnQ4QXJyYXkocmVhZGVyLnJlc3VsdC5zbGljZShzZWxmLl9wb3MpKSkpXG5cdFx0XHRcdFx0c2VsZi5fcG9zID0gcmVhZGVyLnJlc3VsdC5ieXRlTGVuZ3RoXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYucHVzaChudWxsKVxuXHRcdFx0fVxuXHRcdFx0Ly8gcmVhZGVyLm9uZXJyb3IgPSA/Pz8gLy8gVE9ETzogdGhpc1xuXHRcdFx0cmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKHJlc3BvbnNlKVxuXHRcdFx0YnJlYWtcblx0fVxuXG5cdC8vIFRoZSBtcy1zdHJlYW0gY2FzZSBoYW5kbGVzIGVuZCBzZXBhcmF0ZWx5IGluIHJlYWRlci5vbmxvYWQoKVxuXHRpZiAoc2VsZi5feGhyLnJlYWR5U3RhdGUgPT09IHJTdGF0ZXMuRE9ORSAmJiBzZWxmLl9tb2RlICE9PSAnbXMtc3RyZWFtJykge1xuXHRcdHNlbGYucHVzaChudWxsKVxuXHR9XG59XG4iLCJ2YXIgcHVsbCA9IHJlcXVpcmUoJ3B1bGwtc3RyZWFtL3B1bGwnKVxuXG5mdW5jdGlvbiBkZXN0cm95KHN0cmVhbSwgY2IpIHtcbiAgZnVuY3Rpb24gb25DbG9zZSAoKSB7XG4gICAgY2xlYW51cCgpOyBjYigpXG4gIH1cbiAgZnVuY3Rpb24gb25FcnJvciAoZXJyKSB7XG4gICAgY2xlYW51cCgpOyBjYihlcnIpXG4gIH1cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25DbG9zZSlcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcilcbiAgfVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgb25DbG9zZSlcbiAgc3RyZWFtLm9uKCdlcnJvcicsIG9uRXJyb3IpXG59XG5cbmZ1bmN0aW9uIHdyaXRlKHJlYWQsIHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVuZGVkLCBjbG9zZWQgPSBmYWxzZSwgZGlkXG4gIGZ1bmN0aW9uIGRvbmUgKCkge1xuICAgIGlmKGRpZCkgcmV0dXJuXG4gICAgZGlkID0gdHJ1ZVxuICAgIGNiICYmIGNiKGVuZGVkID09PSB0cnVlID8gbnVsbCA6IGVuZGVkKVxuICB9XG5cbiAgZnVuY3Rpb24gb25DbG9zZSAoKSB7XG4gICAgaWYoY2xvc2VkKSByZXR1cm5cbiAgICBjbG9zZWQgPSB0cnVlXG4gICAgY2xlYW51cCgpXG4gICAgaWYoIWVuZGVkKSByZWFkKGVuZGVkID0gdHJ1ZSwgZG9uZSlcbiAgICBlbHNlICAgICAgIGRvbmUoKVxuICB9XG4gIGZ1bmN0aW9uIG9uRXJyb3IgKGVycikge1xuICAgIGNsZWFudXAoKVxuICAgIGlmKCFlbmRlZCkgcmVhZChlbmRlZCA9IGVyciwgZG9uZSlcbiAgfVxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHN0cmVhbS5vbignZmluaXNoJywgb25DbG9zZSlcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25DbG9zZSlcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcilcbiAgfVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgb25DbG9zZSlcbiAgc3RyZWFtLm9uKCdmaW5pc2gnLCBvbkNsb3NlKVxuICBzdHJlYW0ub24oJ2Vycm9yJywgb25FcnJvcilcbiAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBuZXh0KCkge1xuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgZW5kZWQgPSBlbmRlZCB8fCBlbmRcbiAgICAgIC8veW91IGNhbid0IFwiZW5kXCIgYSBzdGRvdXQgc3RyZWFtLCBzbyB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgc3BlY2lhbGx5LlxuICAgICAgaWYoZW5kID09PSB0cnVlKVxuICAgICAgICByZXR1cm4gc3RyZWFtLl9pc1N0ZGlvID8gZG9uZSgpIDogc3RyZWFtLmVuZCgpXG5cbiAgICAgIGlmKGVuZGVkID0gZW5kZWQgfHwgZW5kKSB7XG4gICAgICAgIHN0cmVhbS5kZXN0cm95ICYmIHN0cmVhbS5kZXN0cm95KClcbiAgICAgICAgcmV0dXJuIGRvbmUoZW5kZWQpXG4gICAgICB9XG5cbiAgICAgIC8vSSBub3RpY2VkIGEgcHJvYmxlbSBzdHJlYW1pbmcgdG8gdGhlIHRlcm1pbmFsOlxuICAgICAgLy9zb21ldGltZXMgdGhlIGVuZCBnb3QgY3V0IG9mZiwgY3JlYXRpbmcgaW52YWxpZCBvdXRwdXQuXG4gICAgICAvL2l0IHNlZW1zIHRoYXQgc3Rkb3V0IGFsd2F5cyBlbWl0cyBcImRyYWluXCIgd2hlbiBpdCBlbmRzLlxuICAgICAgLy9zbyB0aGlzIHNlZW1zIHRvIHdvcmssIGJ1dCBpIGhhdmUgYmVlbiB1bmFibGUgdG8gcmVwcm9kdWNlIHRoaXMgdGVzdFxuICAgICAgLy9hdXRvbWF0aWNhbGx5LCBzbyB5b3UgbmVlZCB0byBydW4gLi90ZXN0L3N0ZG91dC5qcyBhIGZldyB0aW1lcyBhbmQgdGhlIGVuZCBpcyB2YWxpZCBqc29uLlxuICAgICAgaWYoc3RyZWFtLl9pc1N0ZGlvKVxuICAgICAgICBzdHJlYW0ud3JpdGUoZGF0YSwgZnVuY3Rpb24gKCkgeyBuZXh0KCkgfSlcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgcGF1c2UgPSBzdHJlYW0ud3JpdGUoZGF0YSlcbiAgICAgICAgaWYocGF1c2UgPT09IGZhbHNlKVxuICAgICAgICAgIHN0cmVhbS5vbmNlKCdkcmFpbicsIG5leHQpXG4gICAgICAgIGVsc2UgbmV4dCgpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gZmlyc3QgKGVtaXR0ZXIsIGV2ZW50cywgaGFuZGxlcikge1xuICBmdW5jdGlvbiBsaXN0ZW5lciAodmFsKSB7XG4gICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoZSwgbGlzdGVuZXIpXG4gICAgfSlcbiAgICBoYW5kbGVyKHZhbClcbiAgfVxuICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgIGVtaXR0ZXIub24oZSwgbGlzdGVuZXIpXG4gIH0pXG4gIHJldHVybiBlbWl0dGVyXG59XG5cbmZ1bmN0aW9uIHJlYWQyKHN0cmVhbSkge1xuICB2YXIgZW5kZWQgPSBmYWxzZSwgd2FpdGluZyA9IGZhbHNlXG4gIHZhciBfY2JcblxuICBmdW5jdGlvbiByZWFkICgpIHtcbiAgICB2YXIgZGF0YSA9IHN0cmVhbS5yZWFkKClcbiAgICBpZihkYXRhICE9PSBudWxsICYmIF9jYikge1xuICAgICAgdmFyIGNiID0gX2NiOyBfY2IgPSBudWxsXG4gICAgICBjYihudWxsLCBkYXRhKVxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgd2FpdGluZyA9IHRydWVcbiAgICBfY2IgJiYgcmVhZCgpXG4gIH0pXG4gIC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGVuZGVkID0gdHJ1ZVxuICAgIF9jYiAmJiBfY2IoZW5kZWQpXG4gIH0pXG4gIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgZW5kZWQgPSBlcnJcbiAgICBfY2IgJiYgX2NiKGVuZGVkKVxuICB9KVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIF9jYiA9IGNiXG4gICAgaWYoZW5kZWQpXG4gICAgICBjYihlbmRlZClcbiAgICBlbHNlIGlmKHdhaXRpbmcpXG4gICAgICByZWFkKClcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkMShzdHJlYW0pIHtcbiAgdmFyIGJ1ZmZlciA9IFtdLCBjYnMgPSBbXSwgZW5kZWQsIHBhdXNlZCA9IGZhbHNlXG5cbiAgdmFyIGRyYWluaW5nXG4gIGZ1bmN0aW9uIGRyYWluKCkge1xuICAgIHdoaWxlKChidWZmZXIubGVuZ3RoIHx8IGVuZGVkKSAmJiBjYnMubGVuZ3RoKVxuICAgICAgY2JzLnNoaWZ0KCkoYnVmZmVyLmxlbmd0aCA/IG51bGwgOiBlbmRlZCwgYnVmZmVyLnNoaWZ0KCkpXG4gICAgaWYoIWJ1ZmZlci5sZW5ndGggJiYgKHBhdXNlZCkpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlXG4gICAgICBzdHJlYW0ucmVzdW1lKClcbiAgICB9XG4gIH1cblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgZHJhaW4oKVxuICAgIGlmKGJ1ZmZlci5sZW5ndGggJiYgc3RyZWFtLnBhdXNlKSB7XG4gICAgICBwYXVzZWQgPSB0cnVlXG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cbiAgfSlcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZW5kZWQgPSB0cnVlXG4gICAgZHJhaW4oKVxuICB9KVxuICBzdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGVuZGVkID0gZXJyXG4gICAgZHJhaW4oKVxuICB9KVxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKCFjYikgdGhyb3cgbmV3IEVycm9yKCcqbXVzdCogcHJvdmlkZSBjYicpXG4gICAgaWYoYWJvcnQpIHtcbiAgICAgIHN0cmVhbS5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2IoYWJvcnQpXG4gICAgICB9KVxuICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgIH1cbiAgICBjYnMucHVzaChjYilcbiAgICBkcmFpbigpXG4gIH1cbn1cblxudmFyIHJlYWQgPSByZWFkMVxuXG52YXIgc2luayA9IGZ1bmN0aW9uIChzdHJlYW0sIGNiKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIHJldHVybiB3cml0ZShyZWFkLCBzdHJlYW0sIGNiKVxuICB9XG59XG5cbnZhciBzb3VyY2UgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHJldHVybiByZWFkMShzdHJlYW0pXG59XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHJlYW0sIGNiKSB7XG4gIHJldHVybiAoXG4gICAgKHN0cmVhbS53cml0YWJsZSAmJiBzdHJlYW0ud3JpdGUpXG4gICAgPyBzdHJlYW0ucmVhZGFibGVcbiAgICAgID8gZnVuY3Rpb24oX3JlYWQpIHtcbiAgICAgICAgICB3cml0ZShfcmVhZCwgc3RyZWFtLCBjYik7XG4gICAgICAgICAgcmV0dXJuIHJlYWQxKHN0cmVhbSlcbiAgICAgICAgfVxuICAgICAgOiBzaW5rKHN0cmVhbSwgY2IpXG4gICAgOiBzb3VyY2Uoc3RyZWFtKVxuICApXG59XG5cbmV4cG9ydHMuc2luayA9IHNpbmtcbmV4cG9ydHMuc291cmNlID0gc291cmNlXG5leHBvcnRzLnJlYWQgPSByZWFkXG5leHBvcnRzLnJlYWQxID0gcmVhZDFcbmV4cG9ydHMucmVhZDIgPSByZWFkMlxuZXhwb3J0cy5kdXBsZXggPSBmdW5jdGlvbiAoc3RyZWFtLCBjYikge1xuICByZXR1cm4ge1xuICAgIHNvdXJjZTogc291cmNlKHN0cmVhbSksXG4gICAgc2luazogc2luayhzdHJlYW0sIGNiKVxuICB9XG59XG5cblxuXG5cbiIsIid1c2Ugc3RyaWN0J1xudmFyIGxldmVsID0gcmVxdWlyZSgnbGV2ZWwnKVxudmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgV3JpdGUgPSByZXF1aXJlKCdwdWxsLXdyaXRlJylcbnZhciBwbCA9IHJlcXVpcmUoJ3B1bGwtbGV2ZWwnKVxudmFyIHF1ZXJ5ID0gcmVxdWlyZSgnLi9xdWVyeScpXG52YXIgc2VsZWN0ID0gcmVxdWlyZSgnLi9zZWxlY3QnKVxudmFyIG1mciA9IHJlcXVpcmUoJ21hcC1maWx0ZXItcmVkdWNlJylcbnZhciBrZXlzID0gcmVxdWlyZSgnbWFwLWZpbHRlci1yZWR1Y2Uva2V5cycpXG52YXIgYnl0ZXdpc2UgPSByZXF1aXJlKCdieXRld2lzZScpXG52YXIgcGFyYW1hcCA9IHJlcXVpcmUoJ3B1bGwtcGFyYW1hcCcpXG52YXIgdSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheVxuXG4vL3NvcnRlZCBpbmRleC5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXRoLCBpbmRleGVzLCBsaW5rcywgdmVyc2lvbiwgY29kZWMpIHtcbiAgY29kZWMgPSBjb2RlYyB8fCByZXF1aXJlKCdieXRld2lzZScpXG4gIHZhciBkYiA9IGxldmVsKHBhdGgpXG5cbiAgaWYoJ3N0cmluZycgIT09IHR5cGVvZiBwYXRoKVxuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIHBhdGggZm9yIGxldmVsZGIgaW5zdGFuY2UnKVxuICBpZighQXJyYXkuaXNBcnJheShpbmRleGVzKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBhbiBhcnJheSBvZiBpbmRleGVzJylcbiAgaWYoJ251bWJlcicgIT09IHR5cGVvZiB2ZXJzaW9uKVxuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIHZlcnNpb24gbnVtYmVyJylcblxuICBpZighbGlua3MpXG4gICAgbGlua3MgPSBmdW5jdGlvbiAoZGF0YSwgZW1pdCkgeyBlbWl0KGRhdGEpIH1cblxuICAvL2Fsd2F5cyB3cml0ZSBtZXRhZGEgdG8gdGhlIGxvd2VzdCBrZXksXG4gIC8vc28gdGhlIGluZGV4ZXMgZG8gbm90IGludGVyZmVlclxuICAvL3dlIGRvbid0IHdhbnQgdG8gZW5jb2RlIHRoaXMgd2l0aCB0aGUgY29kZWMsXG4gIC8vYmVjYXVzZSB0aGVuIHdlIGNhbid0IGNoYW5nZSB0aGUgY29kZWMgc2FmZWx5XG4gIC8vKHByZWhhcHMgdGhlIGVuY29kaW5nIG9mIE1FVEEgaXMgYWxzbyBzb21lIGluZGV4ZWQgdmFsdWUgaW4gYW5vdGhlciBjb2RlYz8pXG4gIHZhciBNRVRBID0gJ1xceDAwJ1xuXG4gIHJldHVybiB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGNiKSB7XG4gICAgICBkYi5nZXQoTUVUQSwgZnVuY3Rpb24gKGVyciwgdmFsdWUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1JFTE9BRCBJTkRFWDonLCB2YWx1ZSlcbiAgICAgICAgaWYodmFsdWUpXG4gICAgICAgICAgdHJ5IHsgdmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlKSB9XG4gICAgICAgICAgY2F0Y2ggKGVycikgeyByZXR1cm4gY2IobnVsbCwgMCkgfVxuXG4gICAgICAgIGlmKGVycikgLy9maXJzdCB0aW1lIHRoaXMgd2FzIHJ1blxuICAgICAgICAgIGNiKG51bGwsIDApXG4gICAgICAgIC8vaWYgdGhlIHZpZXcgaGFzIGNoYW5nZWQsIHJlYnVpbGQgZW50aXJlIGluZGV4LlxuICAgICAgICAvL2Vsc2UsIHJlYWQgY3VycmVudCB2ZXJzaW9uLlxuXG4gICAgICAgIGVsc2UgaWYodmVyc2lvbiAmJiB2YWx1ZS52ZXJzaW9uICE9PSB2ZXJzaW9uKSB7XG4gICAgICAgICAgZGIuY2xvc2UoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV2ZWwuZGVzdHJveShwYXRoLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgICAgICAgZGIgPSBsZXZlbChwYXRoKVxuICAgICAgICAgICAgICBjYihudWxsLCAwKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBjYihudWxsLCB2YWx1ZS5zaW5jZSB8fCAwKVxuICAgICAgfSlcbiAgICB9LFxuICAgIHdyaXRlOiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHJldHVybiBwdWxsKFxuICAgICAgICBXcml0ZShmdW5jdGlvbiAoYmF0Y2gsIGNiKSB7XG4gICAgICAgICAgZGIuYmF0Y2goYmF0Y2gsIGNiKVxuICAgICAgICB9LCBmdW5jdGlvbiAoYmF0Y2gsIGRhdGEpIHtcbiAgICAgICAgICBpZihkYXRhLnN5bmMpIHJldHVybiBiYXRjaFxuICAgICAgICAgIGlmKCFiYXRjaClcbiAgICAgICAgICAgIGJhdGNoID0gW3tcbiAgICAgICAgICAgICAga2V5OiBNRVRBLFxuICAgICAgICAgICAgICB2YWx1ZToge3ZlcnNpb246IHZlcnNpb24sIHNpbmNlOiBkYXRhLnRzfSxcbiAgICAgICAgICAgICAgdmFsdWVFbmNvZGluZzogJ2pzb24nLFxuICAgICAgICAgICAgICB0eXBlOiAncHV0J1xuICAgICAgICAgICAgfV1cblxuICAgICAgICAgIGZ1bmN0aW9uIHB1c2goYXJ5KSB7XG4gICAgICAgICAgICBiYXRjaC5wdXNoKHtrZXk6IGNvZGVjLmVuY29kZShhcnkpLCB2YWx1ZTogJyAnLCB0eXBlOiAncHV0J30pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlua3MoZGF0YSwgZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgICAgICAgIGluZGV4ZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgdmFyIGEgPSBbaW5kZXgua2V5XVxuICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgaW5kZXgudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gaW5kZXgudmFsdWVbaV1cbiAgICAgICAgICAgICAgICBpZighdS5oYXMoa2V5LCBsaW5rKSkgcmV0dXJuXG4gICAgICAgICAgICAgICAgYS5wdXNoKHUuZ2V0KGtleSwgbGluaykpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHVzaChhKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgdmFyIHRzID0gZGF0YS50cyB8fCBkYXRhLnRpbWVzdGFtcFxuICAgICAgICAgIGlmKHRzKSBiYXRjaFswXS52YWx1ZS5zaW5jZSA9IHRzXG4gICAgICAgICAgcmV0dXJuIGJhdGNoXG4gICAgICAgIH0sIDEwMCwgY2IpXG4gICAgICApXG4gICAgfSxcbiAgICBjbG9zZTogZnVuY3Rpb24gKGNiKSB7XG4gICAgICBkYi5jbG9zZShjYilcbiAgICB9LFxuICAgIC8vZ2V0IHRoZSByYXcgaW5kZXhlcywgZm9yIGRlYnVnZ2luZy5cbiAgICBkdW1wOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcGwucmVhZChkYiwge2tleUVuY29kaW5nOiBjb2RlYywgZ3Q6ICdcXHgwMCd9KVxuICAgIH0sXG4gICAgLy9yZWFkIGFsbCB0aGUgbWVzc2FnZXMgb3V0LCB2aWEgbWF0Y2hpbmcgcmFuZ2VzLlxuICAgIHJlYWQ6IGZ1bmN0aW9uIChvcHRzLCBnZXQpIHtcbiAgICAgIHZhciBsb29rdXBcbiAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG4gICAgICB2YXIgX29wdHMgPSB7fVxuICAgICAgdmFyIHEsIGtcblxuICAgICAgaWYoaXNBcnJheShvcHRzLnF1ZXJ5KSkge1xuICAgICAgICBxID0gb3B0cy5xdWVyeVswXS4kZmlsdGVyIHx8IHt9XG4gICAgICAgIGsgPSBrZXlzKG9wdHMucXVlcnkpXG4gICAgICB9XG4gICAgICBlbHNlIGlmKG9wdHMucXVlcnkpIHtcbiAgICAgICAgcSA9IG9wdHMucXVlcnlcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgcSA9IHt9XG5cbiAgICAgIHZhciBpbmRleCA9IHNlbGVjdChpbmRleGVzLCBxKVxuICAgICAgdmFyIF9vcHRzID0gcXVlcnkoaW5kZXgsIHEpXG5cbiAgICAgIF9vcHRzLnZhbHVlcyA9IGZhbHNlXG4gICAgICBfb3B0cy5rZXlzID0gdHJ1ZVxuICAgICAgX29wdHMua2V5RW5jb2RpbmcgPSBjb2RlY1xuXG4gICAgICBfb3B0cy5yZXZlcnNlID0gb3B0cy5yZXZlcnNlXG4gICAgICBfb3B0cy5saXZlID0gb3B0cy5saXZlXG4gICAgICBfb3B0cy5saW1pdCA9IG9wdHMubGltaXRcblxuICAgICAgLy8gSWYgYSBxdWVyeSB1c2VzIGEga2V5IG5vdCBpbiB0aGUgaW5kZXhcbiAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBnZXQgdGhhdCBzb21laG93LlxuICAgICAgLy8gaWYgdGhpcyBpcyBhIGtleSBmcm9tIHRoZSB0aGluZyBpbmRleGVkLFxuICAgICAgLy8gaXQgbWFrZXMgc2Vuc2UgdG8gbG9vayB1cCB0aGF0IHJlY29yZC5cbiAgICAgIC8vIGhvdyB0byBkbyB0aGF0IG1pZ2h0IGJlIGRpZmZlcmVudCBpbiBhIHZpZXcuXG5cbiAgICAgIC8vIGp1c3QgZGlzYWJsZSB0aGlzIGZvciBub3cuXG5cbiAgICAgIGlmKGdldClcbiAgICAgICAgbG9va3VwID0gcGFyYW1hcChmdW5jdGlvbiAobGluaywgY2IpIHtcbiAgICAgICAgICBnZXQobGluay50cyB8fCBsaW5rLnRpbWVzdGFtcCwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICAgICAgaWYoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgICAgICAgbGluay5rZXkgPSBkYXRhLmtleVxuICAgICAgICAgICAgbGluay52YWx1ZSA9IGRhdGEudmFsdWVcbiAgICAgICAgICAgIGNiKG51bGwsIGxpbmspXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbi8vICAgICAgZWxzZVxuLy8gICAgICAgIGxvb2t1cCA9IHB1bGwudGhyb3VnaCgpXG5cblxuICAgICAgcmV0dXJuIHB1bGwoXG4gICAgICAgIHBsLnJlYWQoZGIsIF9vcHRzKSxcbiAgICAgICAgLy9yZWh5ZHJhdGUgdGhlIGluZGV4IHRvIHJlc2VtYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAgICAgIHB1bGwubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdmFyIG8gPSB7fVxuICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBpbmRleC52YWx1ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHUuc2V0KGluZGV4LnZhbHVlW2ldLCBlW2krMV0sIG8pXG4gICAgICAgICAgcmV0dXJuIG9cbiAgICAgICAgfSksXG4gICAgICAgIGxvb2t1cCxcbiAgICAgICAgaXNBcnJheShvcHRzLnF1ZXJ5KSA/IG1mcihvcHRzLnF1ZXJ5KSA6IHB1bGwudGhyb3VnaCgpXG4gICAgICApXG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbiIsInZhciB1ICAgICAgPSByZXF1aXJlKCdwdWxsLWNvcmUnKVxudmFyIHNvdXJjZXMgPSByZXF1aXJlKCcuL3NvdXJjZXMnKVxudmFyIHNpbmtzID0gcmVxdWlyZSgnLi9zaW5rcycpXG5cbnZhciBwcm9wICAgPSB1LnByb3BcbnZhciBpZCAgICAgPSB1LmlkXG52YXIgdGVzdGVyID0gdS50ZXN0ZXJcblxudmFyIG1hcCA9IGV4cG9ydHMubWFwID0gXG5mdW5jdGlvbiAocmVhZCwgbWFwKSB7XG4gIG1hcCA9IHByb3AobWFwKSB8fCBpZFxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgdmFyIGRhdGEgPSAhZW5kID8gbWFwKGRhdGEpIDogbnVsbFxuICAgICAgY2IoZW5kLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGFzeW5jTWFwID0gZXhwb3J0cy5hc3luY01hcCA9XG5mdW5jdGlvbiAocmVhZCwgbWFwKSB7XG4gIGlmKCFtYXApIHJldHVybiByZWFkXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kLCBjYikgLy9hYm9ydFxuICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgaWYoZW5kKSByZXR1cm4gY2IoZW5kLCBkYXRhKVxuICAgICAgbWFwKGRhdGEsIGNiKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHBhcmFNYXAgPSBleHBvcnRzLnBhcmFNYXAgPVxuZnVuY3Rpb24gKHJlYWQsIG1hcCwgd2lkdGgpIHtcbiAgaWYoIW1hcCkgcmV0dXJuIHJlYWRcbiAgdmFyIGVuZGVkID0gZmFsc2UsIHF1ZXVlID0gW10sIF9jYlxuXG4gIGZ1bmN0aW9uIGRyYWluICgpIHtcbiAgICBpZighX2NiKSByZXR1cm5cbiAgICB2YXIgY2IgPSBfY2JcbiAgICBfY2IgPSBudWxsXG4gICAgaWYocXVldWUubGVuZ3RoKVxuICAgICAgcmV0dXJuIGNiKG51bGwsIHF1ZXVlLnNoaWZ0KCkpXG4gICAgZWxzZSBpZihlbmRlZCAmJiAhbilcbiAgICAgIHJldHVybiBjYihlbmRlZClcbiAgICBfY2IgPSBjYlxuICB9XG5cbiAgZnVuY3Rpb24gcHVsbCAoKSB7XG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmQpIHtcbiAgICAgICAgZW5kZWQgPSBlbmRcbiAgICAgICAgcmV0dXJuIGRyYWluKClcbiAgICAgIH1cbiAgICAgIG4rK1xuICAgICAgbWFwKGRhdGEsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgbi0tXG5cbiAgICAgICAgcXVldWUucHVzaChkYXRhKVxuICAgICAgICBkcmFpbigpXG4gICAgICB9KVxuXG4gICAgICBpZihuIDwgd2lkdGggJiYgIWVuZGVkKVxuICAgICAgICBwdWxsKClcbiAgICB9KVxuICB9XG5cbiAgdmFyIG4gPSAwXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgcmV0dXJuIHJlYWQoZW5kLCBjYikgLy9hYm9ydFxuICAgIC8vY29udGludWUgdG8gcmVhZCB3aGlsZSB0aGVyZSBhcmUgbGVzcyB0aGFuIDMgbWFwcyBpbiBmbGlnaHRcbiAgICBfY2IgPSBjYlxuICAgIGlmKHF1ZXVlLmxlbmd0aCB8fCBlbmRlZClcbiAgICAgIHB1bGwoKSwgZHJhaW4oKVxuICAgIGVsc2UgcHVsbCgpXG4gIH1cbiAgcmV0dXJuIGhpZ2hXYXRlck1hcmsoYXN5bmNNYXAocmVhZCwgbWFwKSwgd2lkdGgpXG59XG5cbnZhciBmaWx0ZXIgPSBleHBvcnRzLmZpbHRlciA9XG5mdW5jdGlvbiAocmVhZCwgdGVzdCkge1xuICAvL3JlZ2V4cFxuICB0ZXN0ID0gdGVzdGVyKHRlc3QpXG4gIHJldHVybiBmdW5jdGlvbiBuZXh0IChlbmQsIGNiKSB7XG4gICAgcmVhZChlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgIGlmKCFlbmQgJiYgIXRlc3QoZGF0YSkpXG4gICAgICAgIHJldHVybiBuZXh0KGVuZCwgY2IpXG4gICAgICBjYihlbmQsIGRhdGEpXG4gICAgfSlcbiAgfVxufVxuXG52YXIgZmlsdGVyTm90ID0gZXhwb3J0cy5maWx0ZXJOb3QgPVxuZnVuY3Rpb24gKHJlYWQsIHRlc3QpIHtcbiAgdGVzdCA9IHRlc3Rlcih0ZXN0KVxuICByZXR1cm4gZmlsdGVyKHJlYWQsIGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuICF0ZXN0KGUpXG4gIH0pXG59XG5cbnZhciB0aHJvdWdoID0gZXhwb3J0cy50aHJvdWdoID0gXG5mdW5jdGlvbiAocmVhZCwgb3AsIG9uRW5kKSB7XG4gIHZhciBhID0gZmFsc2VcbiAgZnVuY3Rpb24gb25jZSAoYWJvcnQpIHtcbiAgICBpZihhIHx8ICFvbkVuZCkgcmV0dXJuXG4gICAgYSA9IHRydWVcbiAgICBvbkVuZChhYm9ydCA9PT0gdHJ1ZSA/IG51bGwgOiBhYm9ydClcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgIGlmKGVuZCkgb25jZShlbmQpXG4gICAgcmV0dXJuIHJlYWQoZW5kLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZighZW5kKSBvcCAmJiBvcChkYXRhKVxuICAgICAgZWxzZSBvbmNlKGVuZClcbiAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICB9KVxuICB9XG59XG5cbnZhciB0YWtlID0gZXhwb3J0cy50YWtlID1cbmZ1bmN0aW9uIChyZWFkLCB0ZXN0KSB7XG4gIHZhciBlbmRlZCA9IGZhbHNlXG4gIGlmKCdudW1iZXInID09PSB0eXBlb2YgdGVzdCkge1xuICAgIHZhciBuID0gdGVzdDsgdGVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuIC0tXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgaWYoZW5kZWQpIHJldHVybiBjYihlbmRlZClcbiAgICBpZihlbmRlZCA9IGVuZCkgcmV0dXJuIHJlYWQoZW5kZWQsIGNiKVxuXG4gICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkgcmV0dXJuIGNiKGVuZGVkKVxuICAgICAgaWYoIXRlc3QoZGF0YSkpIHtcbiAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgIHJlYWQodHJ1ZSwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGNiKGVuZGVkLCBkYXRhKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBjYihudWxsLCBkYXRhKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIHVuaXF1ZSA9IGV4cG9ydHMudW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkLCBpbnZlcnQpIHtcbiAgZmllbGQgPSBwcm9wKGZpZWxkKSB8fCBpZFxuICB2YXIgc2VlbiA9IHt9XG4gIHJldHVybiBmaWx0ZXIocmVhZCwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIga2V5ID0gZmllbGQoZGF0YSlcbiAgICBpZihzZWVuW2tleV0pIHJldHVybiAhIWludmVydCAvL2ZhbHNlLCBieSBkZWZhdWx0XG4gICAgZWxzZSBzZWVuW2tleV0gPSB0cnVlXG4gICAgcmV0dXJuICFpbnZlcnQgLy90cnVlIGJ5IGRlZmF1bHRcbiAgfSlcbn1cblxudmFyIG5vblVuaXF1ZSA9IGV4cG9ydHMubm9uVW5pcXVlID0gZnVuY3Rpb24gKHJlYWQsIGZpZWxkKSB7XG4gIHJldHVybiB1bmlxdWUocmVhZCwgZmllbGQsIHRydWUpXG59XG5cbnZhciBncm91cCA9IGV4cG9ydHMuZ3JvdXAgPVxuZnVuY3Rpb24gKHJlYWQsIHNpemUpIHtcbiAgdmFyIGVuZGVkOyBzaXplID0gc2l6ZSB8fCA1XG4gIHZhciBxdWV1ZSA9IFtdXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbmQsIGNiKSB7XG4gICAgLy90aGlzIG1lYW5zIHRoYXQgdGhlIHVwc3RyZWFtIGlzIHNlbmRpbmcgYW4gZXJyb3IuXG4gICAgaWYoZW5kKSByZXR1cm4gcmVhZChlbmRlZCA9IGVuZCwgY2IpXG4gICAgLy90aGlzIG1lYW5zIHRoYXQgd2UgcmVhZCBhbiBlbmQgYmVmb3JlLlxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICByZWFkKG51bGwsIGZ1bmN0aW9uIG5leHQoZW5kLCBkYXRhKSB7XG4gICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkge1xuICAgICAgICBpZighcXVldWUubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiBjYihlbmRlZClcblxuICAgICAgICB2YXIgX3F1ZXVlID0gcXVldWU7IHF1ZXVlID0gW11cbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIF9xdWV1ZSlcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2goZGF0YSlcbiAgICAgIGlmKHF1ZXVlLmxlbmd0aCA8IHNpemUpXG4gICAgICAgIHJldHVybiByZWFkKG51bGwsIG5leHQpXG5cbiAgICAgIHZhciBfcXVldWUgPSBxdWV1ZTsgcXVldWUgPSBbXVxuICAgICAgY2IobnVsbCwgX3F1ZXVlKVxuICAgIH0pXG4gIH1cbn1cblxudmFyIGZsYXR0ZW4gPSBleHBvcnRzLmZsYXR0ZW4gPSBmdW5jdGlvbiAocmVhZCkge1xuICB2YXIgX3JlYWRcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihfcmVhZCkgbmV4dENodW5rKClcbiAgICBlbHNlICAgICAgbmV4dFN0cmVhbSgpXG5cbiAgICBmdW5jdGlvbiBuZXh0Q2h1bmsgKCkge1xuICAgICAgX3JlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZihlbmQpIG5leHRTdHJlYW0oKVxuICAgICAgICBlbHNlICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgICBmdW5jdGlvbiBuZXh0U3RyZWFtICgpIHtcbiAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgc3RyZWFtKSB7XG4gICAgICAgIGlmKGVuZClcbiAgICAgICAgICByZXR1cm4gY2IoZW5kKVxuICAgICAgICBpZihBcnJheS5pc0FycmF5KHN0cmVhbSkpXG4gICAgICAgICAgc3RyZWFtID0gc291cmNlcy52YWx1ZXMoc3RyZWFtKVxuICAgICAgICBlbHNlIGlmKCdmdW5jdGlvbicgIT0gdHlwZW9mIHN0cmVhbSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmVhbSBvZiBzdHJlYW1zJylcbiAgICAgICAgXG4gICAgICAgIF9yZWFkID0gc3RyZWFtXG4gICAgICAgIG5leHRDaHVuaygpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG52YXIgcHJlcGVuZCA9XG5leHBvcnRzLnByZXBlbmQgPVxuZnVuY3Rpb24gKHJlYWQsIGhlYWQpIHtcblxuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGhlYWQgIT09IG51bGwpIHtcbiAgICAgIGlmKGFib3J0KVxuICAgICAgICByZXR1cm4gcmVhZChhYm9ydCwgY2IpXG4gICAgICB2YXIgX2hlYWQgPSBoZWFkXG4gICAgICBoZWFkID0gbnVsbFxuICAgICAgY2IobnVsbCwgX2hlYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWQoYWJvcnQsIGNiKVxuICAgIH1cbiAgfVxuXG59XG5cbi8vdmFyIGRyYWluSWYgPSBleHBvcnRzLmRyYWluSWYgPSBmdW5jdGlvbiAob3AsIGRvbmUpIHtcbi8vICBzaW5rcy5kcmFpbihcbi8vfVxuXG52YXIgX3JlZHVjZSA9IGV4cG9ydHMuX3JlZHVjZSA9IGZ1bmN0aW9uIChyZWFkLCByZWR1Y2UsIGluaXRpYWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjbG9zZSwgY2IpIHtcbiAgICBpZihjbG9zZSkgcmV0dXJuIHJlYWQoY2xvc2UsIGNiKVxuICAgIGlmKGVuZGVkKSByZXR1cm4gY2IoZW5kZWQpXG5cbiAgICBzaW5rcy5kcmFpbihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaW5pdGlhbCA9IHJlZHVjZShpbml0aWFsLCBpdGVtKVxuICAgIH0sIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGVuZGVkID0gZXJyIHx8IHRydWVcbiAgICAgIGlmKCFlcnIpIGNiKG51bGwsIGluaXRpYWwpXG4gICAgICBlbHNlICAgICBjYihlbmRlZClcbiAgICB9KVxuICAgIChyZWFkKVxuICB9XG59XG5cbnZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2tcblxudmFyIGhpZ2hXYXRlck1hcmsgPSBleHBvcnRzLmhpZ2hXYXRlck1hcmsgPSBcbmZ1bmN0aW9uIChyZWFkLCBoaWdoV2F0ZXJNYXJrKSB7XG4gIHZhciBidWZmZXIgPSBbXSwgd2FpdGluZyA9IFtdLCBlbmRlZCwgcmVhZGluZyA9IGZhbHNlXG4gIGhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrIHx8IDEwXG5cbiAgZnVuY3Rpb24gcmVhZEFoZWFkICgpIHtcbiAgICB3aGlsZSh3YWl0aW5nLmxlbmd0aCAmJiAoYnVmZmVyLmxlbmd0aCB8fCBlbmRlZCkpXG4gICAgICB3YWl0aW5nLnNoaWZ0KCkoZW5kZWQsIGVuZGVkID8gbnVsbCA6IGJ1ZmZlci5zaGlmdCgpKVxuICB9XG5cbiAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgaWYoZW5kZWQgfHwgcmVhZGluZyB8fCBidWZmZXIubGVuZ3RoID49IGhpZ2hXYXRlck1hcmspXG4gICAgICByZXR1cm5cbiAgICByZWFkaW5nID0gdHJ1ZVxuICAgIHJldHVybiByZWFkKGVuZGVkLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICByZWFkaW5nID0gZmFsc2VcbiAgICAgIGVuZGVkID0gZW5kZWQgfHwgZW5kXG4gICAgICBpZihkYXRhICE9IG51bGwpIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgICBcbiAgICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgICB9KVxuICB9XG5cbiAgbmV4dFRpY2sobmV4dClcblxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBlbmRlZCA9IGVuZGVkIHx8IGVuZFxuICAgIHdhaXRpbmcucHVzaChjYilcblxuICAgIG5leHQoKTsgcmVhZEFoZWFkKClcbiAgfVxufVxuXG5cblxuIiwiXG4vL2ZvcmNlIHRvIGEgdmFsaWQgcmFuZ2VcbnZhciByYW5nZSA9IGV4cG9ydHMucmFuZ2UgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBudWxsID09IG9iaiA/IHt9IDogJ3N0cmluZycgPT09IHR5cGVvZiByYW5nZSA/IHtcbiAgICAgIG1pbjogcmFuZ2UsIG1heDogcmFuZ2UgKyAnXFx4ZmYnXG4gICAgfSA6ICBvYmpcbn1cblxuLy90dXJuIGludG8gYSBzdWIgcmFuZ2UuXG52YXIgcHJlZml4ID0gZXhwb3J0cy5wcmVmaXggPSBmdW5jdGlvbiAocmFuZ2UsIHdpdGhpbiwgdGVybSkge1xuICByYW5nZSA9IGV4cG9ydHMucmFuZ2UocmFuZ2UpXG4gIHZhciBfcmFuZ2UgPSB7fVxuICB0ZXJtID0gdGVybSB8fCAnXFx4ZmYnXG4gIGlmKHJhbmdlIGluc3RhbmNlb2YgUmVnRXhwIHx8ICdmdW5jdGlvbicgPT0gdHlwZW9mIHJhbmdlKSB7XG4gICAgX3JhbmdlLm1pbiA9IHdpdGhpblxuICAgIF9yYW5nZS5tYXggICA9IHdpdGhpbiArIHRlcm0sXG4gICAgX3JhbmdlLmlubmVyID0gZnVuY3Rpb24gKGspIHtcbiAgICAgIHZhciBqID0gay5zdWJzdHJpbmcod2l0aGluLmxlbmd0aClcbiAgICAgIGlmKHJhbmdlLnRlc3QpXG4gICAgICAgIHJldHVybiByYW5nZS50ZXN0KGopXG4gICAgICByZXR1cm4gcmFuZ2UoailcbiAgICB9XG4gIH1cbiAgZWxzZSBpZignb2JqZWN0JyA9PT0gdHlwZW9mIHJhbmdlKSB7XG4gICAgX3JhbmdlLm1pbiA9IHdpdGhpbiArIChyYW5nZS5taW4gfHwgcmFuZ2Uuc3RhcnQgfHwgJycpXG4gICAgX3JhbmdlLm1heCA9IHdpdGhpbiArIChyYW5nZS5tYXggfHwgcmFuZ2UuZW5kICAgfHwgKHRlcm0gfHwgJ34nKSlcbiAgICBfcmFuZ2UucmV2ZXJzZSA9ICEhcmFuZ2UucmV2ZXJzZVxuICB9XG4gIHJldHVybiBfcmFuZ2Vcbn1cblxuLy9yZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBhIHJhbmdlXG52YXIgY2hlY2tlciA9IGV4cG9ydHMuY2hlY2tlciA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICBpZighcmFuZ2UpIHJhbmdlID0ge31cblxuICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiByYW5nZSlcbiAgICByZXR1cm4gZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIGtleS5pbmRleE9mKHJhbmdlKSA9PSAwXG4gICAgfVxuICBlbHNlIGlmKHJhbmdlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgIHJldHVybiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gcmFuZ2UudGVzdChrZXkpXG4gICAgfVxuICBlbHNlIGlmKCdvYmplY3QnID09PSB0eXBlb2YgcmFuZ2UpXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBtaW4gPSByYW5nZS5taW4gfHwgcmFuZ2Uuc3RhcnRcbiAgICAgIHZhciBtYXggPSByYW5nZS5tYXggfHwgcmFuZ2UuZW5kXG5cbiAgICAgIC8vIGZpeGVzIGtleXMgcGFzc2VkIGFzIGludHMgZnJvbSBzdWJsZXZlbHNcbiAgICAgIGtleSA9IFN0cmluZyhrZXkpXG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgICFtaW4gfHwga2V5ID49IG1pblxuICAgICAgKSAmJiAoXG4gICAgICAgICFtYXggfHwga2V5IDw9IG1heFxuICAgICAgKSAmJiAoXG4gICAgICAgICFyYW5nZS5pbm5lciB8fCAoXG4gICAgICAgICAgcmFuZ2UuaW5uZXIudGVzdCBcbiAgICAgICAgICAgID8gcmFuZ2UuaW5uZXIudGVzdChrZXkpXG4gICAgICAgICAgICA6IHJhbmdlLmlubmVyKGtleSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH1cbiAgZWxzZSBpZignZnVuY3Rpb24nID09PSB0eXBlb2YgcmFuZ2UpXG4gICAgcmV0dXJuIHJhbmdlXG59XG4vL2NoZWNrIGlmIGEga2V5IGlzIHdpdGhpbiBhIHJhbmdlLlxudmFyIHNhdGlmaWVzID0gZXhwb3J0cy5zYXRpc2ZpZXMgPSBmdW5jdGlvbiAoa2V5LCByYW5nZSkge1xuICByZXR1cm4gY2hlY2tlcihyYW5nZSkoa2V5KVxufVxuXG5cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfVxuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn07XG5cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuIiwiLyoqXG4gKiBAYXV0aG9yIFRpdHVzIFdvcm1lclxuICogQGNvcHlyaWdodCAyMDE1IFRpdHVzIFdvcm1lclxuICogQGxpY2Vuc2UgTUlUXG4gKiBAbW9kdWxlIHN0cmluZ2lmeS1lbnRpdGllc1xuICogQGZpbGVvdmVydmlldyBFbmNvZGUgSFRNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBhbmQgY2hhcmFjdGVyIGVudGl0aWVzLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWVudiBjb21tb25qcyAqL1xuXG4vKlxuICogRGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBlbnRpdGllcyA9IHJlcXVpcmUoJ2NoYXJhY3Rlci1lbnRpdGllcy1odG1sNCcpO1xudmFyIEVYUFJFU1NJT05fTkFNRUQgPSByZXF1aXJlKCcuL2xpYi9leHByZXNzaW9uLmpzJyk7XG5cbi8qXG4gKiBNZXRob2RzLlxuICovXG5cbnZhciBoYXMgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuLypcbiAqIExpc3Qgb2YgZW5mb3JjZWQgZXNjYXBlcy5cbiAqL1xuXG52YXIgZXNjYXBlcyA9IFsnXCInLCAnXFwnJywgJzwnLCAnPicsICcmJywgJ2AnXTtcblxuLypcbiAqIE1hcCBvZiBjaGFyYWN0ZXJzIHRvIG5hbWVzLlxuICovXG5cbnZhciBjaGFyYWN0ZXJzID0ge307XG5cbihmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5hbWU7XG5cbiAgICBmb3IgKG5hbWUgaW4gZW50aXRpZXMpIHtcbiAgICAgICAgY2hhcmFjdGVyc1tlbnRpdGllc1tuYW1lXV0gPSBuYW1lO1xuICAgIH1cbn0pKCk7XG5cbi8qXG4gKiBSZWd1bGFyIGV4cHJlc3Npb25zLlxuICovXG5cbnZhciBFWFBSRVNTSU9OX0VTQ0FQRSA9IG5ldyBSZWdFeHAoJ1snICsgZXNjYXBlcy5qb2luKCcnKSArICddJywgJ2cnKTtcbnZhciBFWFBSRVNTSU9OX1NVUlJPR0FURV9QQUlSID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcbnZhciBFWFBSRVNTSU9OX0JNUCA9IC9bXFx4MDEtXFx0XFx4MEJcXGZcXHgwRS1cXHgxRlxceDdGXFx4ODFcXHg4RFxceDhGXFx4OTBcXHg5RFxceEEwLVxcdUZGRkZdL2c7XG5cbi8qKlxuICogVHJhbnNmb3JtIGBjb2RlYCBpbnRvIGEgaGV4YWRlY2ltYWwgY2hhcmFjdGVyIHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZSAtIE51bWJlciB0byBlbmNvZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gYGNvZGVgIGVuY29kZWQgYXMgaGV4YWRlY2ltYWwuXG4gKi9cbmZ1bmN0aW9uIGNoYXJhY3RlckNvZGVUb0hleGFkZWNpbWFsUmVmZXJlbmNlKGNvZGUpIHtcbiAgICByZXR1cm4gJyYjeCcgKyBjb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgJzsnO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBgY2hhcmFjdGVyYCBpbnRvIGEgaGV4YWRlY2ltYWwgY2hhcmFjdGVyXG4gKiByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJhY3RlciAtIENoYXJhY3RlciB0byBlbmNvZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gYGNoYXJhY3RlcmAgZW5jb2RlZCBhcyBoZXhhZGVjaW1hbC5cbiAqL1xuZnVuY3Rpb24gY2hhcmFjdGVyVG9IZXhhZGVjaW1hbFJlZmVyZW5jZShjaGFyYWN0ZXIpIHtcbiAgICByZXR1cm4gY2hhcmFjdGVyQ29kZVRvSGV4YWRlY2ltYWxSZWZlcmVuY2UoY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCkpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBgY29kZWAgaW50byBhbiBlbnRpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBOYW1lIHRvIHdyYXAuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gYG5hbWVgIGVuY29kZWQgYXMgaGV4YWRlY2ltYWwuXG4gKi9cbmZ1bmN0aW9uIHRvTmFtZWRFbnRpdHkobmFtZSkge1xuICAgIHJldHVybiAnJicgKyBuYW1lICsgJzsnO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBgY29kZWAgaW50byBhbiBlbnRpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJhY3RlciAtIENoYXJhY3RlciB0byBlbmNvZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gYG5hbWVgIGVuY29kZWQgYXMgaGV4YWRlY2ltYWwuXG4gKi9cbmZ1bmN0aW9uIGNoYXJhY3RlclRvTmFtZWRFbnRpdHkoY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIHRvTmFtZWRFbnRpdHkoY2hhcmFjdGVyc1tjaGFyYWN0ZXJdKTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGB2YWx1ZWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gZW5jb2RlLlxuICogQHBhcmFtIHtPYmplY3Q/fSBbb3B0aW9uc10gLSBDb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFuP30gW29wdGlvbnMuZXNjYXBlT25seT1mYWxzZV1cbiAqICAgLSBXaGV0aGVyIHRvIG9ubHkgZXNjYXBlIHJlcXVpcmVkIGNoYXJhY3RlcnMuXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBbb3B0aW9ucy51c2VOYW1lZFJlZmVyZW5jZXM9ZmFsc2VdXG4gKiAgIC0gV2hldGhlciB0byB1c2UgZW50aXRpZXMgd2hlcmUgcG9zc2libGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gRW5jb2RlZCBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBlbmNvZGUodmFsdWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9O1xuICAgIHZhciBlc2NhcGVPbmx5ID0gc2V0dGluZ3MuZXNjYXBlT25seTtcbiAgICB2YXIgbmFtZWQgPSBzZXR0aW5ncy51c2VOYW1lZFJlZmVyZW5jZXM7XG4gICAgdmFyIG1hcCA9IG5hbWVkID8gY2hhcmFjdGVycyA6IG51bGw7XG5cbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoRVhQUkVTU0lPTl9FU0NBUEUsIGZ1bmN0aW9uIChjaGFyYWN0ZXIpIHtcbiAgICAgICAgcmV0dXJuIG1hcCAmJiBoYXMuY2FsbChtYXAsIGNoYXJhY3RlcikgP1xuICAgICAgICAgICAgdG9OYW1lZEVudGl0eShtYXBbY2hhcmFjdGVyXSkgOlxuICAgICAgICAgICAgY2hhcmFjdGVyVG9IZXhhZGVjaW1hbFJlZmVyZW5jZShjaGFyYWN0ZXIpO1xuICAgIH0pO1xuXG4gICAgaWYgKGVzY2FwZU9ubHkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmIChuYW1lZCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoRVhQUkVTU0lPTl9OQU1FRCwgY2hhcmFjdGVyVG9OYW1lZEVudGl0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIC5yZXBsYWNlKEVYUFJFU1NJT05fU1VSUk9HQVRFX1BBSVIsIGZ1bmN0aW9uIChwYWlyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hhcmFjdGVyQ29kZVRvSGV4YWRlY2ltYWxSZWZlcmVuY2UoXG4gICAgICAgICAgICAgICAgKHBhaXIuY2hhckNvZGVBdCgwKSAtIDB4RDgwMCkgKiAweDQwMCArXG4gICAgICAgICAgICAgICAgcGFpci5jaGFyQ29kZUF0KDEpIC0gMHhEQzAwICsgMHgxMDAwMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGxhY2UoRVhQUkVTU0lPTl9CTVAsIGNoYXJhY3RlclRvSGV4YWRlY2ltYWxSZWZlcmVuY2UpO1xufVxuXG4vKipcbiAqIFNob3J0Y3V0IHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gSFRNTC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBlbmNvZGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gRW5jb2RlZCBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBlc2NhcGUodmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2RlKHZhbHVlLCB7XG4gICAgICAgICdlc2NhcGVPbmx5JzogdHJ1ZSxcbiAgICAgICAgJ3VzZU5hbWVkUmVmZXJlbmNlcyc6IHRydWVcbiAgICB9KTtcbn1cblxuZW5jb2RlLmVzY2FwZSA9IGVzY2FwZTtcblxuLypcbiAqIEV4cG9zZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVuY29kZTtcbiIsIi8qIFRoaXMgc2NyaXB0IHdhcyBnZW5lcmF0ZWQgYnkgYHNjcmlwdC9nZW5lcmF0ZS1leHByZXNzaW9uLmpzYCAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWlycmVndWxhci13aGl0ZXNwYWNlICovXG5cbm1vZHVsZS5leHBvcnRzID0gL1vCoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w7/Gks6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHOo86kzqXOps6nzqjOqc6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPgs+Dz4TPhc+Gz4fPiM+Jz5HPks+W4oCi4oCm4oCy4oCz4oC+4oGE4oSY4oSR4oSc4oSi4oS14oaQ4oaR4oaS4oaT4oaU4oa14oeQ4oeR4oeS4oeT4oeU4oiA4oiC4oiD4oiF4oiH4oiI4oiJ4oiL4oiP4oiR4oiS4oiX4oia4oid4oie4oig4oin4oio4oip4oiq4oir4oi04oi84omF4omI4omg4omh4omk4oml4oqC4oqD4oqE4oqG4oqH4oqV4oqX4oql4ouF4oyI4oyJ4oyK4oyL4oyp4oyq4peK4pmg4pmj4pml4pmmxZLFk8WgxaHFuMuGy5zigILigIPigInigIzigI3igI7igI/igJPigJTigJjigJnigJrigJzigJ3igJ7igKDigKHigLDigLnigLrigqxdL2c7XG4iLCJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJ1Zikge1xuXHQvLyBJZiB0aGUgYnVmZmVyIGlzIGJhY2tlZCBieSBhIFVpbnQ4QXJyYXksIGEgZmFzdGVyIHZlcnNpb24gd2lsbCB3b3JrXG5cdGlmIChidWYgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG5cdFx0Ly8gSWYgdGhlIGJ1ZmZlciBpc24ndCBhIHN1YmFycmF5LCByZXR1cm4gdGhlIHVuZGVybHlpbmcgQXJyYXlCdWZmZXJcblx0XHRpZiAoYnVmLmJ5dGVPZmZzZXQgPT09IDAgJiYgYnVmLmJ5dGVMZW5ndGggPT09IGJ1Zi5idWZmZXIuYnl0ZUxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGJ1Zi5idWZmZXJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBidWYuYnVmZmVyLnNsaWNlID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBnZXQgYSBwcm9wZXIgY29weVxuXHRcdFx0cmV0dXJuIGJ1Zi5idWZmZXIuc2xpY2UoYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlT2Zmc2V0ICsgYnVmLmJ5dGVMZW5ndGgpXG5cdFx0fVxuXHR9XG5cblx0aWYgKEJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG5cdFx0Ly8gVGhpcyBpcyB0aGUgc2xvdyB2ZXJzaW9uIHRoYXQgd2lsbCB3b3JrIHdpdGggYW55IEJ1ZmZlclxuXHRcdC8vIGltcGxlbWVudGF0aW9uIChldmVuIGluIG9sZCBicm93c2Vycylcblx0XHR2YXIgYXJyYXlDb3B5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmxlbmd0aClcblx0XHR2YXIgbGVuID0gYnVmLmxlbmd0aFxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGFycmF5Q29weVtpXSA9IGJ1ZltpXVxuXHRcdH1cblx0XHRyZXR1cm4gYXJyYXlDb3B5LmJ1ZmZlclxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG5cdH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLypcbiAqIENvbnN0YW50cy5cbiAqL1xuXG52YXIgV0hJVEVfU1BBQ0VfQ09MTEFQU0FCTEVfTElORSA9IC9bIFxcdF0qXFxuK1sgXFx0XSovZztcbnZhciBMSU5FID0gJ1xcbic7XG5cbi8qKlxuICogUmVtb3ZlIGluaXRpYWwgYW5kIGZpbmFsIHNwYWNlcyBhbmQgdGFicyBhdCB0aGVcbiAqIGxpbmUgYnJlYWtzIGluIGB2YWx1ZWAuIERvZXMgbm90IHRyaW0gaW5pdGlhbCBhbmRcbiAqIGZpbmFsIHNwYWNlcyBhbmQgdGFicyBvZiB0aGUgdmFsdWUgaXRzZWxmLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHRyaW1MaW5lcygnIGZvb1xcdFxcblxcbiBiYXIgXFxuXFx0YmF6ICcpOyAvLyAnIGZvb1xcbmJhclxcbmJheiAnXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgd2l0aCB1bnRyaW1tZWQgbGluZSBicmVha3MsXG4gKiAgIGNvZXJjZWQgdG8gc3RyaW5nLlxuICogQHJldHVybiB7c3RyaW5nfSAtIFZhbHVlIHdpdGggdHJpbW1lZCBsaW5lIGJyZWFrcy5cbiAqL1xuZnVuY3Rpb24gdHJpbUxpbmVzKHZhbHVlKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZShXSElURV9TUEFDRV9DT0xMQVBTQUJMRV9MSU5FLCBMSU5FKTtcbn1cblxuLypcbiAqIEV4cG9zZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRyaW1MaW5lcztcbiIsIid1c2Ugc3RyaWN0JztcblxuLypcbiAqIENvbnN0YW50cy5cbiAqL1xuXG52YXIgTElORSA9ICdcXG4nO1xuXG4vKipcbiAqIFJlbW92ZSBmaW5hbCBuZXdsaW5lIGNoYXJhY3RlcnMgZnJvbSBgdmFsdWVgLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHRyaW1UcmFpbGluZ0xpbmVzKCdmb29cXG5iYXInKTsgLy8gJ2Zvb1xcbmJhcidcbiAqICAgdHJpbVRyYWlsaW5nTGluZXMoJ2Zvb1xcbmJhclxcbicpOyAvLyAnZm9vXFxuYmFyJ1xuICogICB0cmltVHJhaWxpbmdMaW5lcygnZm9vXFxuYmFyXFxuXFxuJyk7IC8vICdmb29cXG5iYXInXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgd2l0aCB0cmFpbGluZyBuZXdsaW5lcyxcbiAqICAgY29lcmNlZCB0byBzdHJpbmcuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gVmFsdWUgd2l0aG91dCB0cmFpbGluZyBuZXdsaW5lcy5cbiAqL1xuZnVuY3Rpb24gdHJpbVRyYWlsaW5nTGluZXModmFsdWUpIHtcbiAgICB2YXIgaW5kZXg7XG5cbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgaW5kZXggPSB2YWx1ZS5sZW5ndGg7XG5cbiAgICB3aGlsZSAodmFsdWUuY2hhckF0KC0taW5kZXgpID09PSBMSU5FKSB7IC8qIGVtcHR5ICovIH1cblxuICAgIHJldHVybiB2YWx1ZS5zbGljZSgwLCBpbmRleCArIDEpO1xufVxuXG4vKlxuICogRXhwb3NlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdHJpbVRyYWlsaW5nTGluZXM7XG4iLCJcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHRyaW07XG5cbmZ1bmN0aW9uIHRyaW0oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKnxcXHMqJC9nLCAnJyk7XG59XG5cbmV4cG9ydHMubGVmdCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyovLCAnJyk7XG59O1xuXG5leHBvcnRzLnJpZ2h0ID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbn07XG4iLCJ2YXIgY29sbGF0aW9uID0gcmVxdWlyZSgnLi9jb2xsYXRpb24nKVxuXG4vL1xuLy8gYmFzZSB0eXBlIHN5c3RlbVxuLy9cbnZhciBiYXNlID0ge31cblxuLy9cbi8vIGhlbHBlciB1dGlsaXRpZXNcbi8vXG5cbmZ1bmN0aW9uIF92YWx1ZU9mKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZSA9PSBudWxsID8gaW5zdGFuY2UgOiBpbnN0YW5jZS52YWx1ZU9mKClcbn1cblxudmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxuZnVuY3Rpb24gX2lzT2JqZWN0KGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZSAmJiBfdG9TdHJpbmcuY2FsbChpbnN0YW5jZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nXG59XG5cbi8vXG4vLyBiYXNlIHR5cGV3aXNlIGNvbXBhcmUgaW1wbGVtZW50YXRpb25cbi8vXG5iYXNlLmNvbXBhcmUgPSBmdW5jdGlvbiAoYSwgYikge1xuICAvL1xuICAvLyB0ZXN0IGZvciBpbnZhbGlkIHZhbHVlc1xuICAvL1xuICBpZiAoYmFzZS5pbnZhbGlkKGEsIGIpKVxuICAgIHJldHVybiBOYU5cblxuICAvL1xuICAvLyBzaG9ydCBjaXJjdWl0IGZvciBpZGVudGljYWwgb2JqZWN0c1xuICAvL1xuICBpZiAoYSA9PT0gYilcbiAgICByZXR1cm4gMFxuXG4gIC8vXG4gIC8vIHNob3J0IGNpcmN1aXQgZm9yIGJhc2UgYm91bmQgdHlwZXNcbiAgLy9cbiAgdmFyIHJlc3VsdCA9IGJhc2UuYm91bmQuY29tcGFyZShhLCBiKVxuICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIHJlc3VsdFxuXG4gIC8vXG4gIC8vIGNhY2hlIHR5cGVvZiBhbmQgdmFsdWVPZiBmb3IgYm90aCB2YWx1ZXNcbiAgLy9cbiAgdmFyIGFUeXBlT2YgPSB0eXBlb2YgYVxuICB2YXIgYlR5cGVPZiA9IHR5cGVvZiBiXG4gIHZhciBhVmFsdWVPZiA9IF92YWx1ZU9mKGEpXG4gIHZhciBiVmFsdWVPZiA9IF92YWx1ZU9mKGIpXG5cbiAgLy9cbiAgLy8gbG9vcCBvdmVyIHR5cGUgdGFncyBhbmQgYXR0ZW1wdCBjb21wYXJlXG4gIC8vXG4gIHZhciBvcmRlciA9IGJhc2Uub3JkZXJcbiAgdmFyIHNvcnRzID0gYmFzZS5zb3J0c1xuICB2YXIgc29ydFxuICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gb3JkZXIubGVuZ3RoOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBzb3J0ID0gc29ydHNbb3JkZXJbaV1dXG5cbiAgICAvL1xuICAgIC8vIGlmIGZpcnN0IGFyZyBpcyBhIG1lbWJlciBvZiB0aGlzIHNvcnQgd2UgaGF2ZSBhbiBhbnN3ZXJcbiAgICAvL1xuICAgIGlmIChzb3J0LmlzKGEsIGFUeXBlT2YpKVxuICAgICAgLy9cbiAgICAgIC8vIGlmIGIgaXMgdGhlIHNhbWUgYXMgYSB0aGVuIGRlZmVyIHRvIHNvcnQncyBjb21wYXJhdG9yLCBlbHNlIGEgY29tZXMgZmlyc3RcbiAgICAgIC8vXG4gICAgICByZXR1cm4gc29ydC5pcyhiLCBiVHlwZU9mKSA/IHNvcnQuY29tcGFyZShhVmFsdWVPZiwgYlZhbHVlT2YpIDogLTFcblxuICAgIC8vXG4gICAgLy8gaWYgYiBpcyB0aGlzIHR5cGUgYnV0IG5vdCBhIHRoZW4gYiBjb21lcyBmaXJzdFxuICAgIC8vXG4gICAgaWYgKHNvcnQuaXMoYiwgYlR5cGVPZikpXG4gICAgICByZXR1cm4gMVxuICB9XG5cbiAgLy9cbiAgLy8gdmFsdWVzIGFyZSBpbmNvbXBhcmFibGUgYXMgdGhleSBkaWRuJ3QgbWF0Y2ggYWdhaW5zdCBhbnkgcmVnaXN0ZXJlZCB0eXBlc1xuICAvL1xuICByZXR1cm4gTmFOXG59XG5cbi8vXG4vLyBzb3J0IGVxdWFsaXR5IHRlc3Rcbi8vXG5iYXNlLmVxdWFsID0gZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYmFzZS5jb21wYXJlKGEsIGIpID09PSAwXG59XG5cbi8vXG4vLyB0ZXN0IGZvciB0b3AtbGV2ZWwgaW5jb21wYXJhYmlsaXR5IHVzaW5nIGludmFsaWQgc29ydCBkZWZpbml0aW9uc1xuLy9cbmJhc2UuaW52YWxpZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHZhciB0eXBlcyA9IGJhc2UuaW52YWxpZFxuICBmb3IgKHZhciBrZXkgaW4gdHlwZXMpIHtcbiAgICB2YXIgdHlwZSA9IHR5cGVzW2tleV1cbiAgICBpZiAodHlwZSAmJiB0eXBlLmlzICYmICh0eXBlLmlzKGEpIHx8IHR5cGUuaXMoYikpKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy9cbi8vIGRlZmluaXRpb25zIGZvciBleHBsaWNpdGx5IGludmFsaWQvaW5jb21wYXJhYmxlIHR5cGVzXG4vL1xuXG5iYXNlLmludmFsaWQuTkFOID0ge1xuICBpczogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgdmFyIHZhbHVlT2YgPSBfdmFsdWVPZihpbnN0YW5jZSlcbiAgICByZXR1cm4gdmFsdWVPZiAhPT0gdmFsdWVPZlxuICB9XG59XG5cbmJhc2UuaW52YWxpZC5FUlJPUiA9IHtcbiAgaXM6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yXG4gIH1cbn1cblxuLy9cbi8vIGRlZmluaXRpb25zIGZvciBib3VuZGFyeSB0eXBlcywgdW5zZXJpYWxpemFibGUgYXMgdmFsdWVzXG4vL1xuXG5mdW5jdGlvbiBCb3VuZGVkS2V5KGJvdW5kLCB1cHBlciwgcHJlZml4KSB7XG4gIHRoaXMuYm91bmQgPSBib3VuZFxuICB0aGlzLnVwcGVyID0gISF1cHBlclxuICB0aGlzLnByZWZpeCA9IHByZWZpeFxufVxuXG5mdW5jdGlvbiBCb3VuZGFyeShzb3J0KSB7XG4gIHRoaXMuc29ydCA9IHNvcnRcbn1cblxuQm91bmRhcnkucHJvdG90eXBlLmxvd2VyID0gZnVuY3Rpb24gKHByZWZpeCkge1xuICByZXR1cm4gbmV3IEJvdW5kZWRLZXkodGhpcywgZmFsc2UsIHByZWZpeClcbn1cblxuQm91bmRhcnkucHJvdG90eXBlLnVwcGVyID0gZnVuY3Rpb24gKHByZWZpeCkge1xuICByZXR1cm4gbmV3IEJvdW5kZWRLZXkodGhpcywgdHJ1ZSwgcHJlZml4KVxufVxuXG5Cb3VuZGFyeS5wcm90b3R5cGUuaXMgPSBmdW5jdGlvbiAoc291cmNlKSB7XG4gIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBCb3VuZGVkS2V5ICYmIHNvdXJjZS5zb3J0ID09PSB0aGlzLnNvcnRcbn1cblxuQm91bmRhcnkuYWRkID0gZnVuY3Rpb24gKHNvcnQpIHtcbiAgc29ydC5ib3VuZCA9IG5ldyBCb3VuZGFyeShzb3J0KVxufVxuXG5Cb3VuZGFyeS5hZGQoYmFzZSlcblxuYmFzZS5ib3VuZC5nZXRCb3VuZGFyeSA9IGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIEJvdW5kZWRLZXkgJiYgc291cmNlLmJvdW5kXG59XG5cbi8vXG4vLyBjb21wYXJlIGEgdmFsdWVzIGFnYWluc3QgdG9wIGxldmVsIGJvdW5kcyAoYXNzdW1lcyBmaXJzdCBhcmcgaXMgYW4gaW5zdGFuY2UpXG4vL1xuYmFzZS5ib3VuZC5jb21wYXJlID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdmFyIGFCb3VuZCA9IGJhc2UuYm91bmQuaXMoYSlcbiAgdmFyIGJCb3VuZCA9IGJhc2UuYm91bmQuaXMoYilcbiAgaWYgKGFCb3VuZCkge1xuICAgIGlmIChiQm91bmQgJiYgIWEudXBwZXIgPT09ICFiLnVwcGVyKVxuICAgICAgcmV0dXJuIDBcbiAgICByZXR1cm4gYS51cHBlciA/IDEgOiAtMVxuICB9XG5cbiAgaWYgKGJCb3VuZClcbiAgICByZXR1cm4gLWJhc2UuYm91bmQuY29tcGFyZShiLCBhKVxufVxuXG4vL1xuLy8gaGVscGVyIHRvIHJlZ2lzdGVyIGZpeGVkIChudWxsYXJ5KSB0eXBlc1xuLy9cbmZ1bmN0aW9uIGZpeGVkKHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgaXM6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlID09PSB2YWx1ZVxuICAgIH0sXG4gICAgdmFsdWU6IHZhbHVlXG4gIH1cbn1cblxuLy9cbi8vIHZhbHVlIHR5cGVzIGRlZmluZWQgYXMgb3JkZXJlZCBtYXAgb2YgXCJzb3J0c1wiXG4vL1xudmFyIHNvcnRzID0gYmFzZS5zb3J0cyA9IHt9XG5cbnNvcnRzLnZvaWQgPSBmaXhlZCh2b2lkIDApXG5zb3J0cy52b2lkLmNvbXBhcmUgPSBjb2xsYXRpb24uaW5lcXVhbGl0eVxuXG5zb3J0cy5udWxsID0gZml4ZWQobnVsbClcbnNvcnRzLm51bGwuY29tcGFyZSA9IGNvbGxhdGlvbi5pbmVxdWFsaXR5XG5cbnZhciBCT09MRUFOID0gc29ydHMuYm9vbGVhbiA9IHt9XG5CT09MRUFOLmNvbXBhcmUgPSBjb2xsYXRpb24uaW5lcXVhbGl0eVxuQk9PTEVBTi5pcyA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgdHlwZU9mKSB7XG4gIHJldHVybiAodHlwZU9mIHx8IHR5cGVvZiBpbnN0YW5jZSkgPT09ICdib29sZWFuJ1xufVxuXG5CT09MRUFOLnNvcnRzID0ge31cbkJPT0xFQU4uc29ydHMudHJ1ZSA9IGZpeGVkKHRydWUpXG5CT09MRUFOLnNvcnRzLmZhbHNlID0gZml4ZWQoZmFsc2UpXG5cbkJvdW5kYXJ5LmFkZChCT09MRUFOKVxuXG5cbnZhciBOVU1CRVIgPSBzb3J0cy5udW1iZXIgPSB7fVxuTlVNQkVSLmNvbXBhcmUgPSBjb2xsYXRpb24uZGlmZmVyZW5jZVxuTlVNQkVSLmlzID0gZnVuY3Rpb24gKGluc3RhbmNlLCB0eXBlT2YpIHtcbiAgcmV0dXJuICh0eXBlT2YgfHwgdHlwZW9mIGluc3RhbmNlKSA9PT0gJ251bWJlcidcbn1cblxuTlVNQkVSLnNvcnRzID0ge31cbk5VTUJFUi5zb3J0cy5tYXggPSBmaXhlZChOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpXG5OVU1CRVIuc29ydHMubWluID0gZml4ZWQoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKVxuXG5OVU1CRVIuc29ydHMucG9zaXRpdmUgPSB7fVxuTlVNQkVSLnNvcnRzLnBvc2l0aXZlLmlzID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZSA+PSAwXG59XG5cbk5VTUJFUi5zb3J0cy5uZWdhdGl2ZSA9IHt9XG5OVU1CRVIuc29ydHMubmVnYXRpdmUuaXMgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlIDwgMFxufVxuXG5Cb3VuZGFyeS5hZGQoTlVNQkVSKVxuXG5cbnZhciBEQVRFID0gc29ydHMuZGF0ZSA9IHt9XG5EQVRFLmNvbXBhcmUgPSBjb2xsYXRpb24uZGlmZmVyZW5jZVxuREFURS5pcyA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UgaW5zdGFuY2VvZiBEYXRlICYmIGluc3RhbmNlLnZhbHVlT2YoKSA9PT0gaW5zdGFuY2UudmFsdWVPZigpXG59XG5cbkRBVEUuc29ydHMgPSB7fVxuREFURS5zb3J0cy5wb3NpdGl2ZSA9IHt9XG5EQVRFLnNvcnRzLnBvc2l0aXZlLmlzID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS52YWx1ZU9mKCkgPj0gMFxufVxuXG5EQVRFLnNvcnRzLm5lZ2F0aXZlID0ge31cbkRBVEUuc29ydHMubmVnYXRpdmUuaXMgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLnZhbHVlT2YoKSA8IDBcbn1cblxuQm91bmRhcnkuYWRkKERBVEUpXG5cblxudmFyIEJJTkFSWSA9IHNvcnRzLmJpbmFyeSA9IHt9XG5CSU5BUlkuZW1wdHkgPSBuZXcgQnVmZmVyKFtdKVxuQklOQVJZLmNvbXBhcmUgPSBjb2xsYXRpb24uYml0d2lzZVxuQklOQVJZLmlzID0gQnVmZmVyLmlzQnVmZmVyXG5cbkJvdW5kYXJ5LmFkZChCSU5BUlkpXG5cblxudmFyIFNUUklORyA9IHNvcnRzLnN0cmluZyA9IHt9XG5TVFJJTkcuZW1wdHkgPSAnJ1xuU1RSSU5HLmNvbXBhcmUgPSBjb2xsYXRpb24uaW5lcXVhbGl0eVxuU1RSSU5HLmlzID0gZnVuY3Rpb24gKGluc3RhbmNlLCB0eXBlT2YpIHtcbiAgcmV0dXJuICh0eXBlT2YgfHwgdHlwZW9mIGluc3RhbmNlKSA9PT0gJ3N0cmluZydcbn1cblxuQm91bmRhcnkuYWRkKFNUUklORylcblxuXG52YXIgQVJSQVkgPSBzb3J0cy5hcnJheSA9IHt9XG5BUlJBWS5lbXB0eSA9IFtdXG5BUlJBWS5jb21wYXJlID0gY29sbGF0aW9uLnJlY3Vyc2l2ZS5lbGVtZW50d2lzZShiYXNlLmNvbXBhcmUpXG5BUlJBWS5pcyA9IEFycmF5LmlzQXJyYXlcblxuQm91bmRhcnkuYWRkKEFSUkFZKVxuXG5cbi8vIHZhciBPQkpFQ1QgPSBzb3J0cy5vYmplY3QgPSB7fVxuLy8gT0JKRUNULmVtcHR5ID0ge31cbi8vIE9CSkVDVC5jb21wYXJlID0gY29sbGF0aW9uLnJlY3Vyc2l2ZS5maWVsZHdpc2UoYmFzZS5jb21wYXJlKVxuLy8gT0JKRUNULmlzID0gX2lzT2JqZWN0XG5cbi8vIEJvdW5kYXJ5LmFkZChPQkpFQ1QpXG5cbi8vXG4vLyBkZWZhdWx0IG9yZGVyIGZvciBpbnN0YW5jZSBjaGVja2luZyBpbiBjb21wYXJlIG9wZXJhdGlvbnNcbi8vXG5iYXNlLm9yZGVyID0gW11cbmZvciAodmFyIGtleSBpbiBzb3J0cykge1xuICBiYXNlLm9yZGVyLnB1c2goa2V5KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VcbiIsIi8vXG4vLyBnZW5lcmljIGNvbXBhcmF0b3IgaW1wbGVtZW50YXRpb25zIG91ciB0eXBlcyBjYW4gdXNlXG4vL1xudmFyIGNvbGxhdGlvbiA9IGV4cG9ydHNcblxuLy9cbi8vIHNjYWxhciBjb21wYXJpc29uc1xuLy9cbmNvbGxhdGlvbi5pbmVxdWFsaXR5ID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiAoIGEgPiBiID8gMSA6IDAgKVxufVxuXG5jb2xsYXRpb24uZGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHJldHVybiBhIC0gYlxufVxuXG4vL1xuLy8gcmVjdXJzaXZlIGNvbGxhdGlvbnMgaGF2ZSB0byBiZSBwcm92aWRlZCBhIGNvbGxhdGlvbiBmdW5jdGlvbiB0byBkZWxlZ2F0ZSB0b1xuLy9cbmNvbGxhdGlvbi5yZWN1cnNpdmUgPSB7fVxuXG4vL1xuLy8gZWxlbWVudCBieSBlbGVtZW50IChjb21wYXJpc29uIGZvciBsaXN0LWxpa2Ugc3RydWN0dXJlc1xuLy9cbmNvbGxhdGlvbi5yZWN1cnNpdmUuZWxlbWVudHdpc2UgPSBmdW5jdGlvbiAoY29tcGFyZSwgc2hvcnRsZXgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGFMZW5ndGggPSBhLmxlbmd0aFxuICAgIHZhciBiTGVuZ3RoID0gYi5sZW5ndGhcbiAgICB2YXIgZGlmZmVyZW5jZVxuXG4gICAgLy9cbiAgICAvLyBzaG9ydC1jaXJjdWl0IG9uIGxlbmd0aCBkaWZmZXJlbmNlIGZvciBzaG9ydGxleCBzZW1hbnRpY3NcbiAgICAvL1xuICAgIGlmIChzaG9ydGxleCAmJiBhTGVuZ3RoICE9PSBiTGVuZ3RoKVxuICAgICAgICByZXR1cm4gYUxlbmd0aCAtIGJMZW5ndGhcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBNYXRoLm1pbihhTGVuZ3RoLCBiTGVuZ3RoKTsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoZGlmZmVyZW5jZSA9IGNvbXBhcmUoYVtpXSwgYltpXSkpXG4gICAgICAgIHJldHVybiBkaWZmZXJlbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGFMZW5ndGggLSBiTGVuZ3RoXG4gIH1cbn1cblxuLy9cbi8vIGZpZWxkIGJ5IGZpZWxkIGNvbXBhcmlzb24gb2YgcmVjb3JkLWxpa2Ugc3RydWN0dXJlc1xuLy9cbmNvbGxhdGlvbi5yZWN1cnNpdmUuZmllbGR3aXNlID0gZnVuY3Rpb24gKGNvbXBhcmUsIHNob3J0bGV4KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBhS2V5cyA9IE9iamVjdC5rZXlzKGEpXG4gICAgdmFyIGJLZXlzID0gT2JqZWN0LmtleXMoYilcbiAgICB2YXIgYUxlbmd0aCA9IGFLZXlzLmxlbmd0aFxuICAgIHZhciBiTGVuZ3RoID0gYktleXMubGVuZ3RoXG4gICAgdmFyIGRpZmZlcmVuY2VcblxuICAgIC8vXG4gICAgLy8gc2hvcnQtY2lyY3VpdCBvbiBsZW5ndGggZGlmZmVyZW5jZSBmb3Igc2hvcnRsZXggc2VtYW50aWNzXG4gICAgLy9cbiAgICBpZiAoc2hvcnRsZXggJiYgYUxlbmd0aCAhPT0gYkxlbmd0aClcbiAgICAgICAgcmV0dXJuIGFMZW5ndGggLSBiTGVuZ3RoXG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gTWF0aC5taW4oYUxlbmd0aCwgYkxlbmd0aCk7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgLy9cbiAgICAgIC8vIGZpcnN0IGNvbXBhcmUga2V5c1xuICAgICAgLy9cbiAgICAgIGlmIChkaWZmZXJlbmNlID0gY29tcGFyZShhS2V5c1tpXSwgYktleXNbaV0pKVxuICAgICAgICByZXR1cm4gZGlmZmVyZW5jZVxuXG4gICAgICAvL1xuICAgICAgLy8gdGhlbiBjb21wYXJlIHZhbHVlc1xuICAgICAgLy9cbiAgICAgIGlmIChkaWZmZXJlbmNlID0gY29tcGFyZShhW2FLZXlzW2ldXSwgYltiS2V5c1tpXV0pKVxuICAgICAgICByZXR1cm4gZGlmZmVyZW5jZVxuICAgIH1cblxuICAgIHJldHVybiBhTGVuZ3RoIC0gYkxlbmd0aFxuICB9XG59XG5cbi8vXG4vLyBlbGVtZW50d2lzZSBjb21wYXJlIHdpdGggaW5lcXVhbGl0eSBjYW4gYmUgdXNlZCBmb3IgYmluYXJ5IGVxdWFsaXR5XG4vL1xuY29sbGF0aW9uLmJpdHdpc2UgPSBjb2xsYXRpb24ucmVjdXJzaXZlLmVsZW1lbnR3aXNlKGV4cG9ydHMuaW5lcXVhbGl0eSlcblxuIiwiLy9cbi8vIGV4dGVuZCBjb3JlIHR5cGV3aXNlXG4vL1xucmVxdWlyZSgnLi9jb2xsYXRpb24nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ3R5cGV3aXNlLWNvcmUvYmFzZScpXG4iLCIvL1xuLy8gZXh0ZW5kIGNvcmUgdHlwZXdpc2UgY29sbGF0aW9uc1xuLy9cbnZhciBjb2xsYXRpb24gPSByZXF1aXJlKCd0eXBld2lzZS1jb3JlL2NvbGxhdGlvbicpXG5cbi8vIFRPRE86IHNldCwgbWFwXG5cbm1vZHVsZS5leHBvcnRzID0gY29sbGF0aW9uXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYmFzZScpXG4iLCJmdW5jdGlvbiBpbmVxdWFsaXR5IChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiID8gMCA6IGEgPCBiID8gLTEgOiAxXG59XG5cbmZ1bmN0aW9uIGJ1ZmZlcmNtcCAoYSwgYikge1xuICB2YXIgbCA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aClcbiAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKylcbiAgICBpZihhW2ldICE9PSBiW2ldKSByZXR1cm4gaW5lcXVhbGl0eShhW2ldLCBiW2ldKVxuICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aFxufVxuXG5mdW5jdGlvbiBhcnJheWNtcCAoYSwgYikge1xuICB2YXIgbCA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aClcbiAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBjID0gY29tcGFyZShhW2ldLCBiW2ldKVxuICAgIGlmKGMpIHJldHVybiBjXG4gIH1cblxuICByZXR1cm4gaW5lcXVhbGl0eShhLmxlbmd0aCwgYi5sZW5ndGgpXG5cbn1cblxudmFyIGNvbXBhcmF0b3JzID0gW1xuICBpbmVxdWFsaXR5LCAvLyBudWxsXG4gIGluZXF1YWxpdHksIC8vIGJvb2xlYW5cbiAgaW5lcXVhbGl0eSwgLy8gbnVtYmVyXG4gIGJ1ZmZlcmNtcCwgIC8vIGJ1ZmZlclxuICBpbmVxdWFsaXR5LCAvLyBzdHJpbmdcbiAgLCAgICAgICAgICAgLy8gb2JqZWN0XG4gIGFycmF5Y21wLCAgIC8vIGFycmF5XG4gIGluZXF1YWxpdHkgIC8vIHVuZGVmaW5lZFxuXVxuXG5mdW5jdGlvbiBnZXRUeXBlICh2KSB7XG4gIGlmKHYgPT09IG51bGwpICAgICAgICAgcmV0dXJuIDBcbiAgdmFyIHQgPSB0eXBlb2YgdlxuICBpZih0ID09PSAnYm9vbGVhbicpICAgIHJldHVybiAxXG4gIGlmKHQgPT09ICdudW1iZXInKSAgICAgcmV0dXJuIDJcbiAgaWYoQnVmZmVyLmlzQnVmZmVyKHYpKSByZXR1cm4gM1xuICBpZihBcnJheS5pc0FycmF5KHYpKSAgIHJldHVybiA2XG4gIGlmKHQgPT09ICdzdHJpbmcnKSAgICAgcmV0dXJuIDRcbiAgaWYodCA9PT0gJ3VuZGVmaW5lZCcpICByZXR1cm4gN1xuXG4gIHRocm93IG5ldyBFcnJvcignY29tcGFyaW5nIG9iamVjdHMgb3IgZnVuY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWQnKVxuICAvLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgdmFyIHQgPSBnZXRUeXBlKGEpXG4gIHJldHVybiBpbmVxdWFsaXR5KHQsIGdldFR5cGUoYikpIHx8IGNvbXBhcmF0b3JzW3RdKGEsIGIpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZVxuXG5tb2R1bGUuZXhwb3J0cy5lcXVhbCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIpID09PSAwXG59XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTUgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgdW5oZXJpdFxuICogQGZpbGVvdmVydmlldyBDcmVhdGUgYSBjdXN0b20gY29uc3RydWN0b3Igd2hpY2ggY2FuIGJlIG1vZGlmaWVkXG4gKiAgIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbCBjbGFzcy5cbiAqIEBleGFtcGxlXG4gKiAgIHZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4gKiAgIHZhciBFbWl0dGVyID0gdW5oZXJpdChFdmVudEVtaXR0ZXIpO1xuICogICAvLyBDcmVhdGUgYSBwcml2YXRlIGNsYXNzIHdoaWNoIGFjdHMganVzdCBsaWtlXG4gKiAgIC8vIGBFdmVudEVtaXR0ZXJgLlxuICpcbiAqICAgRW1pdHRlci5wcm90b3R5cGUuZGVmYXVsdE1heExpc3RlbmVycyA9IDA7XG4gKiAgIC8vIE5vdywgYWxsIGluc3RhbmNlcyBvZiBgRW1pdHRlcmAgaGF2ZSBubyBtYXhpbXVtXG4gKiAgIC8vIGxpc3RlbmVycywgd2l0aG91dCBhZmZlY3Rpbmcgb3RoZXIgYEV2ZW50RW1pdHRlcmBzLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLypcbiAqIERlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgY2xvbmUgPSByZXF1aXJlKCdjbG9uZScpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjdXN0b20gY29uc3RydWN0b3Igd2hpY2ggY2FuIGJlIG1vZGlmaWVkXG4gKiB3aXRob3V0IGFmZmVjdGluZyB0aGUgb3JpZ2luYWwgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gU3VwZXIgLSBTdXBlci1jbGFzcy5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSAtIENvbnN0cnVjdG9yIGFjdGluZyBsaWtlIGBTdXBlcmAsXG4gKiAgIHdoaWNoIGNhbiBiZSBtb2RpZmllZCB3aXRob3V0IGFmZmVjdGluZyB0aGUgb3JpZ2luYWxcbiAqICAgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIHVuaGVyaXQoU3VwZXIpIHtcbiAgICB2YXIgYmFzZSA9IGNsb25lKFN1cGVyLnByb3RvdHlwZSk7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB2YXIga2V5O1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IgYWNjZXB0aW5nIGEgc2luZ2xlIGFyZ3VtZW50LFxuICAgICAqIHdoaWNoIGl0c2VsZiBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gRnJvbShwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiBTdXBlci5hcHBseSh0aGlzLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvciBhY2NlcHRpbmcgdmFyaWFkaWMgYXJndW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE9mKCkge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgT2YpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZyb20oYXJndW1lbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGluaGVyaXRzKE9mLCBTdXBlcik7XG4gICAgaW5oZXJpdHMoRnJvbSwgT2YpO1xuXG4gICAgLypcbiAgICAgKiBCb3RoIGRvIGR1cGxpY2F0ZSB3b3JrLiBIb3dldmVyLCBjbG9uaW5nIHRoZVxuICAgICAqIHByb3RvdHlwZSBlbnN1cmVzIGNsb25hYmxlIHRoaW5ncyBhcmUgY2xvbmVkXG4gICAgICogYW5kIHRodXMgdXNlZC4gVGhlIGBpbmhlcml0c2AgY2FsbCBlbnN1cmVzXG4gICAgICogYGluc3RhbmNlb2ZgIHN0aWxsIHRoaW5rcyBhbiBpbnN0YW5jZSBzdWJjbGFzc2VzXG4gICAgICogYFN1cGVyYC5cbiAgICAgKi9cblxuICAgIHJlc3VsdCA9IE9mLnByb3RvdHlwZTtcblxuICAgIGZvciAoa2V5IGluIGJhc2UpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBiYXNlW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIE9mO1xufVxuXG4vKlxuICogRXhwb3NlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdW5oZXJpdDtcbiIsIi8qKlxuICogQGF1dGhvciBUaXR1cyBXb3JtZXJcbiAqIEBjb3B5cmlnaHQgMjAxNSBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSB1bmlmaWVkXG4gKiBAZmlsZW92ZXJ2aWV3IFBhcnNlIC8gVHJhbnNmb3JtIC8gQ29tcGlsZSAvIFJlcGVhdC5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLypcbiAqIERlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgYmFpbCA9IHJlcXVpcmUoJ2JhaWwnKTtcbnZhciB3YXJlID0gcmVxdWlyZSgnd2FyZScpO1xudmFyIEF0dGFjaFdhcmUgPSByZXF1aXJlKCdhdHRhY2gtd2FyZScpKHdhcmUpO1xudmFyIFZGaWxlID0gcmVxdWlyZSgndmZpbGUnKTtcbnZhciB1bmhlcml0ID0gcmVxdWlyZSgndW5oZXJpdCcpO1xudmFyIGV4dGVuZDtcblxudHJ5IHtcbiAgICBleHRlbmQgPSByZXF1aXJlKCdub2RlLWV4dGVuZCcpO1xufSBjYXRjaCAoZSkge1xuICAgIGV4dGVuZCA9IHJlcXVpcmUoJ2V4dGVuZCcpO1xufVxuXG4vKlxuICogUHJvY2Vzc2luZyBwaXBlbGluZS5cbiAqL1xuXG52YXIgcGlwZWxpbmUgPSB3YXJlKClcbiAgICAudXNlKGZ1bmN0aW9uIChjdHgpIHtcbiAgICAgICAgY3R4LnRyZWUgPSBjdHguY29udGV4dC5wYXJzZShjdHguZmlsZSwgY3R4LnNldHRpbmdzKTtcbiAgICB9KVxuICAgIC51c2UoZnVuY3Rpb24gKGN0eCwgbmV4dCkge1xuICAgICAgICBjdHguY29udGV4dC5ydW4oY3R4LnRyZWUsIGN0eC5maWxlLCBuZXh0KTtcbiAgICB9KVxuICAgIC51c2UoZnVuY3Rpb24gKGN0eCkge1xuICAgICAgICBjdHgucmVzdWx0ID0gY3R4LmNvbnRleHQuc3RyaW5naWZ5KGN0eC50cmVlLCBjdHguZmlsZSwgY3R4LnNldHRpbmdzKTtcbiAgICB9KTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBuZXcgUHJvY2Vzc29yIGNsYXNzIGJhc2VkIG9uIHRoZVxuICogZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5uYW1lIC0gUHJpdmF0ZSBzdG9yYWdlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5QYXJzZXIgLSBDbGFzcyB0byB0dXJuIGFcbiAqICAgdmlydHVhbCBmaWxlIGludG8gYSBzeW50YXggdHJlZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMuQ29tcGlsZXIgLSBDbGFzcyB0byB0dXJuIGFcbiAqICAgc3ludGF4IHRyZWUgaW50byBhIHN0cmluZy5cbiAqIEByZXR1cm4ge1Byb2Nlc3Nvcn0gLSBBIG5ldyBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gdW5pZmllZChvcHRpb25zKSB7XG4gICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgdmFyIFBhcnNlciA9IG9wdGlvbnMuUGFyc2VyO1xuICAgIHZhciBDb21waWxlciA9IG9wdGlvbnMuQ29tcGlsZXI7XG4gICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBQcm9jZXNzb3IgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAY2xhc3Mge1Byb2Nlc3Nvcn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBQcm9jZXNzb3IocHJvY2Vzc29yKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICBpZiAoIShzZWxmIGluc3RhbmNlb2YgUHJvY2Vzc29yKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzb3IocHJvY2Vzc29yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYud2FyZSA9IG5ldyBBdHRhY2hXYXJlKHByb2Nlc3NvciAmJiBwcm9jZXNzb3Iud2FyZSk7XG4gICAgICAgIHNlbGYud2FyZS5jb250ZXh0ID0gc2VsZjtcblxuICAgICAgICBzZWxmLlBhcnNlciA9IHVuaGVyaXQoUGFyc2VyKTtcbiAgICAgICAgc2VsZi5Db21waWxlciA9IHVuaGVyaXQoQ29tcGlsZXIpO1xuXG4gICAgICAgIGlmIChzZWxmLmRhdGEpIHtcbiAgICAgICAgICAgIHNlbGYuZGF0YSA9IGV4dGVuZCh0cnVlLCB7fSwgc2VsZi5kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVpdGhlciByZXR1cm4gYGNvbnRleHRgIGlmIGl0cyBhbiBpbnN0YW5jZVxuICAgICAqIG9mIGBQcm9jZXNzb3JgIG9yIGNvbnN0cnVjdCBhIG5ldyBgUHJvY2Vzc29yYFxuICAgICAqIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3Nvcj99IFtjb250ZXh0XSAtIENvbnRleHQgb2JqZWN0LlxuICAgICAqIEByZXR1cm4ge1Byb2Nlc3Nvcn0gLSBFaXRoZXIgYGNvbnRleHRgIG9yIGEgbmV3XG4gICAgICogICBQcm9jZXNzb3IgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zdGFuY2UoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gY29udGV4dCBpbnN0YW5jZW9mIFByb2Nlc3NvciA/IGNvbnRleHQgOiBuZXcgUHJvY2Vzc29yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoIGEgcGx1Z2luLlxuICAgICAqXG4gICAgICogQHRoaXMge1Byb2Nlc3Nvcj99IC0gRWl0aGVyIGEgUHJvY2Vzc29yIGluc3RhbmNlIG9yXG4gICAgICogICB0aGUgUHJvY2Vzc29yIGNvbnN0cnVjdG9yLlxuICAgICAqIEByZXR1cm4ge1Byb2Nlc3Nvcn0gLSBFaXRoZXIgYGNvbnRleHRgIG9yIGEgbmV3XG4gICAgICogICBQcm9jZXNzb3IgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXNlKCkge1xuICAgICAgICB2YXIgc2VsZiA9IGluc3RhbmNlKHRoaXMpO1xuXG4gICAgICAgIHNlbGYud2FyZS51c2UuYXBwbHkoc2VsZi53YXJlLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybS5cbiAgICAgKlxuICAgICAqIEB0aGlzIHtQcm9jZXNzb3I/fSAtIEVpdGhlciBhIFByb2Nlc3NvciBpbnN0YW5jZSBvclxuICAgICAqICAgdGhlIFByb2Nlc3NvciBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAcGFyYW0ge05vZGV9IFtub2RlXSAtIFN5bnRheCB0cmVlLlxuICAgICAqIEBwYXJhbSB7VkZpbGU/fSBbZmlsZV0gLSBWaXJ0dWFsIGZpbGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbj99IFtkb25lXSAtIENhbGxiYWNrLlxuICAgICAqIEByZXR1cm4ge05vZGV9IC0gYG5vZGVgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJ1bihub2RlLCBmaWxlLCBkb25lKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHNwYWNlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZG9uZSA9IGZpbGU7XG4gICAgICAgICAgICBmaWxlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmlsZSAmJiBub2RlICYmICFub2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGZpbGUgPSBub2RlO1xuICAgICAgICAgICAgbm9kZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmaWxlID0gbmV3IFZGaWxlKGZpbGUpO1xuICAgICAgICBzcGFjZSA9IGZpbGUubmFtZXNwYWNlKG5hbWUpO1xuXG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgbm9kZSA9IHNwYWNlLnRyZWUgfHwgbm9kZTtcbiAgICAgICAgfSBlbHNlIGlmICghc3BhY2UudHJlZSkge1xuICAgICAgICAgICAgc3BhY2UudHJlZSA9IG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbm9kZSwgZ290ICcgKyBub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvbmUgPSB0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJyA/IGRvbmUgOiBiYWlsO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIE9ubHkgcnVuIHdoZW4gdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBQcm9jZXNzb3IsXG4gICAgICAgICAqIGFuZCB3aGVuIHRoZXJlIGFyZSB0cmFuc2Zvcm1lcnMuXG4gICAgICAgICAqL1xuXG4gICAgICAgIGlmIChzZWxmLndhcmUgJiYgc2VsZi53YXJlLmZucykge1xuICAgICAgICAgICAgc2VsZi53YXJlLnJ1bihub2RlLCBmaWxlLCBkb25lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvbmUobnVsbCwgbm9kZSwgZmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBhIGZpbGUuXG4gICAgICpcbiAgICAgKiBQYXRjaGVzIHRoZSBwYXJzZWQgbm9kZSBvbnRvIHRoZSBgbmFtZWBcbiAgICAgKiBuYW1lc3BhY2Ugb24gdGhlIGB0eXBlYCBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEB0aGlzIHtQcm9jZXNzb3I/fSAtIEVpdGhlciBhIFByb2Nlc3NvciBpbnN0YW5jZSBvclxuICAgICAqICAgdGhlIFByb2Nlc3NvciBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xWRmlsZX0gdmFsdWUgLSBJbnB1dCB0byBwYXJzZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdD99IFtzZXR0aW5nc10gLSBDb25maWd1cmF0aW9uLlxuICAgICAqIEByZXR1cm4ge05vZGV9IC0gYG5vZGVgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhcnNlKHZhbHVlLCBzZXR0aW5ncykge1xuICAgICAgICB2YXIgZmlsZSA9IG5ldyBWRmlsZSh2YWx1ZSk7XG4gICAgICAgIHZhciBDdXN0b21QYXJzZXIgPSAodGhpcyAmJiB0aGlzLlBhcnNlcikgfHwgUGFyc2VyO1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyBDdXN0b21QYXJzZXIoZmlsZSwgc2V0dGluZ3MsIGluc3RhbmNlKHRoaXMpKS5wYXJzZSgpO1xuXG4gICAgICAgIGZpbGUubmFtZXNwYWNlKG5hbWUpLnRyZWUgPSBub2RlO1xuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBpbGUgYSBmaWxlLlxuICAgICAqXG4gICAgICogVXNlZCB0aGUgcGFyc2VkIG5vZGUgYXQgdGhlIGBuYW1lYFxuICAgICAqIG5hbWVzcGFjZSBhdCBgJ3RyZWUnYCB3aGVuIG5vIG5vZGUgd2FzIGdpdmVuLlxuICAgICAqXG4gICAgICogQHRoaXMge1Byb2Nlc3Nvcj99IC0gRWl0aGVyIGEgUHJvY2Vzc29yIGluc3RhbmNlIG9yXG4gICAgICogICB0aGUgUHJvY2Vzc29yIGNvbnN0cnVjdG9yLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbbm9kZV0gLSBTeW50YXggdHJlZS5cbiAgICAgKiBAcGFyYW0ge1ZGaWxlfSBbZmlsZV0gLSBGaWxlIHdpdGggc3ludGF4IHRyZWUuXG4gICAgICogQHBhcmFtIHtPYmplY3Q/fSBbc2V0dGluZ3NdIC0gQ29uZmlndXJhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gQ29tcGlsZWQgYGZpbGVgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeShub2RlLCBmaWxlLCBzZXR0aW5ncykge1xuICAgICAgICB2YXIgQ3VzdG9tQ29tcGlsZXIgPSAodGhpcyAmJiB0aGlzLkNvbXBpbGVyKSB8fCBDb21waWxlcjtcbiAgICAgICAgdmFyIHNwYWNlO1xuXG4gICAgICAgIGlmIChzZXR0aW5ncyA9PT0gbnVsbCB8fCBzZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzZXR0aW5ncyA9IGZpbGU7XG4gICAgICAgICAgICBmaWxlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmlsZSAmJiBub2RlICYmICFub2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGZpbGUgPSBub2RlO1xuICAgICAgICAgICAgbm9kZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmaWxlID0gbmV3IFZGaWxlKGZpbGUpO1xuICAgICAgICBzcGFjZSA9IGZpbGUubmFtZXNwYWNlKG5hbWUpO1xuXG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgbm9kZSA9IHNwYWNlLnRyZWUgfHwgbm9kZTtcbiAgICAgICAgfSBlbHNlIGlmICghc3BhY2UudHJlZSkge1xuICAgICAgICAgICAgc3BhY2UudHJlZSA9IG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbm9kZSwgZ290ICcgKyBub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tQ29tcGlsZXIoZmlsZSwgc2V0dGluZ3MsIGluc3RhbmNlKHRoaXMpKS5jb21waWxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgLyBUcmFuc2Zvcm0gLyBDb21waWxlLlxuICAgICAqXG4gICAgICogQHRoaXMge1Byb2Nlc3Nvcj99IC0gRWl0aGVyIGEgUHJvY2Vzc29yIGluc3RhbmNlIG9yXG4gICAgICogICB0aGUgUHJvY2Vzc29yIGNvbnN0cnVjdG9yLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFZGaWxlfSB2YWx1ZSAtIElucHV0IHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtPYmplY3Q/fSBbc2V0dGluZ3NdIC0gQ29uZmlndXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uP30gW2RvbmVdIC0gQ2FsbGJhY2suXG4gICAgICogQHJldHVybiB7c3RyaW5nP30gLSBQYXJzZWQgZG9jdW1lbnQsIHdoZW5cbiAgICAgKiAgIHRyYW5zZm9ybWF0aW9uIHdhcyBhc3luYy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9jZXNzKHZhbHVlLCBzZXR0aW5ncywgZG9uZSkge1xuICAgICAgICB2YXIgc2VsZiA9IGluc3RhbmNlKHRoaXMpO1xuICAgICAgICB2YXIgZmlsZSA9IG5ldyBWRmlsZSh2YWx1ZSk7XG4gICAgICAgIHZhciByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGRvbmUgPSBzZXR0aW5ncztcbiAgICAgICAgICAgIHNldHRpbmdzID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHBpcGVsaW5lLnJ1bih7XG4gICAgICAgICAgICAnY29udGV4dCc6IHNlbGYsXG4gICAgICAgICAgICAnZmlsZSc6IGZpbGUsXG4gICAgICAgICAgICAnc2V0dGluZ3MnOiBzZXR0aW5ncyB8fCB7fVxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlcyAmJiByZXMucmVzdWx0O1xuXG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGRvbmUoZXJyLCBmaWxlLCByZXN1bHQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBiYWlsKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBNZXRob2RzIC8gZnVuY3Rpb25zLlxuICAgICAqL1xuXG4gICAgdmFyIHByb3RvID0gUHJvY2Vzc29yLnByb3RvdHlwZTtcblxuICAgIFByb2Nlc3Nvci51c2UgPSBwcm90by51c2UgPSB1c2U7XG4gICAgUHJvY2Vzc29yLnBhcnNlID0gcHJvdG8ucGFyc2UgPSBwYXJzZTtcbiAgICBQcm9jZXNzb3IucnVuID0gcHJvdG8ucnVuID0gcnVuO1xuICAgIFByb2Nlc3Nvci5zdHJpbmdpZnkgPSBwcm90by5zdHJpbmdpZnkgPSBzdHJpbmdpZnk7XG4gICAgUHJvY2Vzc29yLnByb2Nlc3MgPSBwcm90by5wcm9jZXNzID0gcHJvY2VzcztcbiAgICBQcm9jZXNzb3IuZGF0YSA9IHByb3RvLmRhdGEgPSBkYXRhIHx8IG51bGw7XG5cbiAgICByZXR1cm4gUHJvY2Vzc29yO1xufVxuXG4vKlxuICogRXhwb3NlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdW5pZmllZDtcbiIsIi8qKlxuICogQGF1dGhvciBUaXR1cyBXb3JtZXJcbiAqIEBjb3B5cmlnaHQgMjAxNSBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSB1bmlzdDp1dGlsOnZpc2l0XG4gKiBAZmlsZW92ZXJ2aWV3IFJlY3Vyc2l2ZWx5IHdhbGsgb3ZlciB1bmlzdCBub2Rlcy5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLyoqXG4gKiBWaXNpdC5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IHRyZWUgLSBSb290IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZV0gLSBOb2RlIHR5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG5vZGUpOiBib29sZWFuP30gdmlzaXRvciAtIEludm9rZWRcbiAqICAgd2l0aCBlYWNoIGZvdW5kIG5vZGUuICBDYW4gcmV0dXJuIGBmYWxzZWAgdG8gc3RvcC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2VdIC0gQnkgZGVmYXVsdCwgYHZpc2l0YCB3aWxsXG4gKiAgIHdhbGsgZm9yd2FyZHMsIHdoZW4gYHJldmVyc2VgIGlzIGB0cnVlYCwgYHZpc2l0YFxuICogICB3YWxrcyBiYWNrd2FyZHMuXG4gKi9cbmZ1bmN0aW9uIHZpc2l0KHRyZWUsIHR5cGUsIHZpc2l0b3IsIHJldmVyc2UpIHtcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV2ZXJzZSA9IHZpc2l0b3I7XG4gICAgICAgIHZpc2l0b3IgPSB0eXBlO1xuICAgICAgICB0eXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWaXNpdCBjaGlsZHJlbiBpbiBgcGFyZW50YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPE5vZGU+fSBjaGlsZHJlbiAtIENoaWxkcmVuIG9mIGBub2RlYC5cbiAgICAgKiBAcGFyYW0ge05vZGU/fSBwYXJlbnQgLSBQYXJlbnQgb2YgYG5vZGVgLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW4/fSAtIGBmYWxzZWAgaWYgdGhlIHZpc2l0aW5nIHN0b3BwZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWxsKGNoaWxkcmVuLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIHN0ZXAgPSByZXZlcnNlID8gLTEgOiAxO1xuICAgICAgICB2YXIgbWF4ID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICB2YXIgbWluID0gLTE7XG4gICAgICAgIHZhciBpbmRleCA9IChyZXZlcnNlID8gbWF4IDogbWluKSArIHN0ZXA7XG4gICAgICAgIHZhciBjaGlsZDtcblxuICAgICAgICB3aGlsZSAoaW5kZXggPiBtaW4gJiYgaW5kZXggPCBtYXgpIHtcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGQgJiYgb25lKGNoaWxkLCBpbmRleCwgcGFyZW50KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4ICs9IHN0ZXA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWaXNpdCBhIHNpbmdsZSBub2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0byB2aXNpdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcj99IFtpbmRleF0gLSBQb3NpdGlvbiBvZiBgbm9kZWAgaW4gYHBhcmVudGAuXG4gICAgICogQHBhcmFtIHtOb2RlP30gW3BhcmVudF0gLSBQYXJlbnQgb2YgYG5vZGVgLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW4/fSAtIEEgcmVzdWx0IG9mIGludm9raW5nIGB2aXNpdG9yYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbmUobm9kZSwgaW5kZXgsIHBhcmVudCkge1xuICAgICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICAgIGluZGV4ID0gaW5kZXggfHwgKHBhcmVudCA/IDAgOiBudWxsKTtcblxuICAgICAgICBpZiAoIXR5cGUgfHwgbm9kZS50eXBlID09PSB0eXBlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB2aXNpdG9yKG5vZGUsIGluZGV4LCBwYXJlbnQgfHwgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiByZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsKG5vZGUuY2hpbGRyZW4sIG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBvbmUodHJlZSk7XG59XG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB2aXNpdDtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwdW55Y29kZSA9IHJlcXVpcmUoJ3B1bnljb2RlJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5leHBvcnRzLnBhcnNlID0gdXJsUGFyc2U7XG5leHBvcnRzLnJlc29sdmUgPSB1cmxSZXNvbHZlO1xuZXhwb3J0cy5yZXNvbHZlT2JqZWN0ID0gdXJsUmVzb2x2ZU9iamVjdDtcbmV4cG9ydHMuZm9ybWF0ID0gdXJsRm9ybWF0O1xuXG5leHBvcnRzLlVybCA9IFVybDtcblxuZnVuY3Rpb24gVXJsKCkge1xuICB0aGlzLnByb3RvY29sID0gbnVsbDtcbiAgdGhpcy5zbGFzaGVzID0gbnVsbDtcbiAgdGhpcy5hdXRoID0gbnVsbDtcbiAgdGhpcy5ob3N0ID0gbnVsbDtcbiAgdGhpcy5wb3J0ID0gbnVsbDtcbiAgdGhpcy5ob3N0bmFtZSA9IG51bGw7XG4gIHRoaXMuaGFzaCA9IG51bGw7XG4gIHRoaXMuc2VhcmNoID0gbnVsbDtcbiAgdGhpcy5xdWVyeSA9IG51bGw7XG4gIHRoaXMucGF0aG5hbWUgPSBudWxsO1xuICB0aGlzLnBhdGggPSBudWxsO1xuICB0aGlzLmhyZWYgPSBudWxsO1xufVxuXG4vLyBSZWZlcmVuY2U6IFJGQyAzOTg2LCBSRkMgMTgwOCwgUkZDIDIzOTZcblxuLy8gZGVmaW5lIHRoZXNlIGhlcmUgc28gYXQgbGVhc3QgdGhleSBvbmx5IGhhdmUgdG8gYmVcbi8vIGNvbXBpbGVkIG9uY2Ugb24gdGhlIGZpcnN0IG1vZHVsZSBsb2FkLlxudmFyIHByb3RvY29sUGF0dGVybiA9IC9eKFthLXowLTkuKy1dKzopL2ksXG4gICAgcG9ydFBhdHRlcm4gPSAvOlswLTldKiQvLFxuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuICAgIHNpbXBsZVBhdGhQYXR0ZXJuID0gL14oXFwvXFwvPyg/IVxcLylbXlxcP1xcc10qKShcXD9bXlxcc10qKT8kLyxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIHJlc2VydmVkIGZvciBkZWxpbWl0aW5nIFVSTHMuXG4gICAgLy8gV2UgYWN0dWFsbHkganVzdCBhdXRvLWVzY2FwZSB0aGVzZS5cbiAgICBkZWxpbXMgPSBbJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXSxcblxuICAgIC8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIG5vdCBhbGxvd2VkIGZvciB2YXJpb3VzIHJlYXNvbnMuXG4gICAgdW53aXNlID0gWyd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCddLmNvbmNhdChkZWxpbXMpLFxuXG4gICAgLy8gQWxsb3dlZCBieSBSRkNzLCBidXQgY2F1c2Ugb2YgWFNTIGF0dGFja3MuICBBbHdheXMgZXNjYXBlIHRoZXNlLlxuICAgIGF1dG9Fc2NhcGUgPSBbJ1xcJyddLmNvbmNhdCh1bndpc2UpLFxuICAgIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUuXG4gICAgLy8gTm90ZSB0aGF0IGFueSBpbnZhbGlkIGNoYXJzIGFyZSBhbHNvIGhhbmRsZWQsIGJ1dCB0aGVzZVxuICAgIC8vIGFyZSB0aGUgb25lcyB0aGF0IGFyZSAqZXhwZWN0ZWQqIHRvIGJlIHNlZW4sIHNvIHdlIGZhc3QtcGF0aFxuICAgIC8vIHRoZW0uXG4gICAgbm9uSG9zdENoYXJzID0gWyclJywgJy8nLCAnPycsICc7JywgJyMnXS5jb25jYXQoYXV0b0VzY2FwZSksXG4gICAgaG9zdEVuZGluZ0NoYXJzID0gWycvJywgJz8nLCAnIyddLFxuICAgIGhvc3RuYW1lTWF4TGVuID0gMjU1LFxuICAgIGhvc3RuYW1lUGFydFBhdHRlcm4gPSAvXlsrYS16MC05QS1aXy1dezAsNjN9JC8sXG4gICAgaG9zdG5hbWVQYXJ0U3RhcnQgPSAvXihbK2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgY2FuIGFsbG93IFwidW5zYWZlXCIgYW5kIFwidW53aXNlXCIgY2hhcnMuXG4gICAgdW5zYWZlUHJvdG9jb2wgPSB7XG4gICAgICAnamF2YXNjcmlwdCc6IHRydWUsXG4gICAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gICAgfSxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBuZXZlciBoYXZlIGEgaG9zdG5hbWUuXG4gICAgaG9zdGxlc3NQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IGFsd2F5cyBjb250YWluIGEgLy8gYml0LlxuICAgIHNsYXNoZWRQcm90b2NvbCA9IHtcbiAgICAgICdodHRwJzogdHJ1ZSxcbiAgICAgICdodHRwcyc6IHRydWUsXG4gICAgICAnZnRwJzogdHJ1ZSxcbiAgICAgICdnb3BoZXInOiB0cnVlLFxuICAgICAgJ2ZpbGUnOiB0cnVlLFxuICAgICAgJ2h0dHA6JzogdHJ1ZSxcbiAgICAgICdodHRwczonOiB0cnVlLFxuICAgICAgJ2Z0cDonOiB0cnVlLFxuICAgICAgJ2dvcGhlcjonOiB0cnVlLFxuICAgICAgJ2ZpbGU6JzogdHJ1ZVxuICAgIH0sXG4gICAgcXVlcnlzdHJpbmcgPSByZXF1aXJlKCdxdWVyeXN0cmluZycpO1xuXG5mdW5jdGlvbiB1cmxQYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICh1cmwgJiYgdXRpbC5pc09iamVjdCh1cmwpICYmIHVybCBpbnN0YW5jZW9mIFVybCkgcmV0dXJuIHVybDtcblxuICB2YXIgdSA9IG5ldyBVcmw7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24odXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAoIXV0aWwuaXNTdHJpbmcodXJsKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHVybCk7XG4gIH1cblxuICAvLyBDb3B5IGNocm9tZSwgSUUsIG9wZXJhIGJhY2tzbGFzaC1oYW5kbGluZyBiZWhhdmlvci5cbiAgLy8gQmFjayBzbGFzaGVzIGJlZm9yZSB0aGUgcXVlcnkgc3RyaW5nIGdldCBjb252ZXJ0ZWQgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI1OTE2XG4gIHZhciBxdWVyeUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKSxcbiAgICAgIHNwbGl0dGVyID1cbiAgICAgICAgICAocXVlcnlJbmRleCAhPT0gLTEgJiYgcXVlcnlJbmRleCA8IHVybC5pbmRleE9mKCcjJykpID8gJz8nIDogJyMnLFxuICAgICAgdVNwbGl0ID0gdXJsLnNwbGl0KHNwbGl0dGVyKSxcbiAgICAgIHNsYXNoUmVnZXggPSAvXFxcXC9nO1xuICB1U3BsaXRbMF0gPSB1U3BsaXRbMF0ucmVwbGFjZShzbGFzaFJlZ2V4LCAnLycpO1xuICB1cmwgPSB1U3BsaXQuam9pbihzcGxpdHRlcik7XG5cbiAgdmFyIHJlc3QgPSB1cmw7XG5cbiAgLy8gdHJpbSBiZWZvcmUgcHJvY2VlZGluZy5cbiAgLy8gVGhpcyBpcyB0byBzdXBwb3J0IHBhcnNlIHN0dWZmIGxpa2UgXCIgIGh0dHA6Ly9mb28uY29tICBcXG5cIlxuICByZXN0ID0gcmVzdC50cmltKCk7XG5cbiAgaWYgKCFzbGFzaGVzRGVub3RlSG9zdCAmJiB1cmwuc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIHZhciBzaW1wbGVQYXRoID0gc2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgICBpZiAoc2ltcGxlUGF0aCkge1xuICAgICAgdGhpcy5wYXRoID0gcmVzdDtcbiAgICAgIHRoaXMuaHJlZiA9IHJlc3Q7XG4gICAgICB0aGlzLnBhdGhuYW1lID0gc2ltcGxlUGF0aFsxXTtcbiAgICAgIGlmIChzaW1wbGVQYXRoWzJdKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gc2ltcGxlUGF0aFsyXTtcbiAgICAgICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5zZWFyY2guc3Vic3RyKDEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWFyY2guc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpO1xuICB9XG5cbiAgLy8gZmlndXJlIG91dCBpZiBpdCdzIGdvdCBhIGhvc3RcbiAgLy8gdXNlckBzZXJ2ZXIgaXMgKmFsd2F5cyogaW50ZXJwcmV0ZWQgYXMgYSBob3N0bmFtZSwgYW5kIHVybFxuICAvLyByZXNvbHV0aW9uIHdpbGwgdHJlYXQgLy9mb28vYmFyIGFzIGhvc3Q9Zm9vLHBhdGg9YmFyIGJlY2F1c2UgdGhhdCdzXG4gIC8vIGhvdyB0aGUgYnJvd3NlciByZXNvbHZlcyByZWxhdGl2ZSBVUkxzLlxuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLykpIHtcbiAgICB2YXIgc2xhc2hlcyA9IHJlc3Quc3Vic3RyKDAsIDIpID09PSAnLy8nO1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMik7XG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiZcbiAgICAgIChzbGFzaGVzIHx8IChwcm90byAmJiAhc2xhc2hlZFByb3RvY29sW3Byb3RvXSkpKSB7XG5cbiAgICAvLyB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgLy8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAvL1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgIC8vIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgLy8gVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgIC8vXG4gICAgLy8gZXg6XG4gICAgLy8gaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAvLyBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmMgcGF0aDovP0BjXG5cbiAgICAvLyB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgLy8gUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9zdEVuZGluZ0NoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgdmFyIGF1dGgsIGF0U2lnbjtcbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0U2lnbiBtdXN0IGJlIGluIGF1dGggcG9ydGlvbi5cbiAgICAgIC8vIGh0dHA6Ly9hQGIvY0BkID0+IGhvc3Q6YiBhdXRoOmEgcGF0aDovY0BkXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJywgaG9zdEVuZCk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgYSBwb3J0aW9uIHdoaWNoIGlzIGRlZmluaXRlbHkgdGhlIGF1dGguXG4gICAgLy8gUHVsbCB0aGF0IG9mZi5cbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgYXV0aCA9IHJlc3Quc2xpY2UoMCwgYXRTaWduKTtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKGF0U2lnbiArIDEpO1xuICAgICAgdGhpcy5hdXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIH1cblxuICAgIC8vIHRoZSBob3N0IGlzIHRoZSByZW1haW5pbmcgdG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0IG5vbi1ob3N0IGNoYXJcbiAgICBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub25Ib3N0Q2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2Yobm9uSG9zdENoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSlcbiAgICAgIGhvc3RFbmQgPSByZXN0Lmxlbmd0aDtcblxuICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2UoMCwgaG9zdEVuZCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZCk7XG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KCk7XG5cbiAgICAvLyB3ZSd2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSBpcyBhIGhvc3RuYW1lLFxuICAgIC8vIHNvIGV2ZW4gaWYgaXQncyBlbXB0eSwgaXQgaGFzIHRvIGJlIHByZXNlbnQuXG4gICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG5cbiAgICAvLyBpZiBob3N0bmFtZSBiZWdpbnMgd2l0aCBbIGFuZCBlbmRzIHdpdGggXVxuICAgIC8vIGFzc3VtZSB0aGF0IGl0J3MgYW4gSVB2NiBhZGRyZXNzLlxuICAgIHZhciBpcHY2SG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lWzBdID09PSAnWycgJiZcbiAgICAgICAgdGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSc7XG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgdmFyIGhvc3RwYXJ0cyA9IHRoaXMuaG9zdG5hbWUuc3BsaXQoL1xcLi8pO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gaG9zdHBhcnRzW2ldO1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICB2YXIgbmV3cGFydCA9ICcnO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwLCBrID0gcGFydC5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNoYXJDb2RlQXQoaikgPiAxMjcpIHtcbiAgICAgICAgICAgICAgLy8gd2UgcmVwbGFjZSBub24tQVNDSUkgY2hhciB3aXRoIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcyB0byBtYWtlIHN1cmUgc2l6ZSBvZiBob3N0bmFtZSBpcyBub3RcbiAgICAgICAgICAgICAgLy8gYnJva2VuIGJ5IHJlcGxhY2luZyBub24tQVNDSUkgYnkgbm90aGluZ1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgdGVzdCBhZ2FpbiB3aXRoIEFTQ0lJIGNoYXIgb25seVxuICAgICAgICAgIGlmICghbmV3cGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB2YXIgbm90SG9zdCA9IGhvc3RwYXJ0cy5zbGljZShpICsgMSk7XG4gICAgICAgICAgICB2YXIgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydCk7XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIHZhbGlkUGFydHMucHVzaChiaXRbMV0pO1xuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gJy8nICsgbm90SG9zdC5qb2luKCcuJykgKyByZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IHZhbGlkUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9zdG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIC8vIElETkEgU3VwcG9ydDogUmV0dXJucyBhIHB1bnljb2RlZCByZXByZXNlbnRhdGlvbiBvZiBcImRvbWFpblwiLlxuICAgICAgLy8gSXQgb25seSBjb252ZXJ0cyBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgdGhhdFxuICAgICAgLy8gaGF2ZSBub24tQVNDSUkgY2hhcmFjdGVycywgaS5lLiBpdCBkb2Vzbid0IG1hdHRlciBpZlxuICAgICAgLy8geW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0IGFscmVhZHkgaXMgQVNDSUktb25seS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSBwdW55Y29kZS50b0FTQ0lJKHRoaXMuaG9zdG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBwID0gdGhpcy5wb3J0ID8gJzonICsgdGhpcy5wb3J0IDogJyc7XG4gICAgdmFyIGggPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGggKyBwO1xuICAgIHRoaXMuaHJlZiArPSB0aGlzLmhvc3Q7XG5cbiAgICAvLyBzdHJpcCBbIGFuZCBdIGZyb20gdGhlIGhvc3RuYW1lXG4gICAgLy8gdGhlIGhvc3QgZmllbGQgc3RpbGwgcmV0YWlucyB0aGVtLCB0aG91Z2hcbiAgICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS5zdWJzdHIoMSwgdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIGlmIChyZXN0WzBdICE9PSAnLycpIHtcbiAgICAgICAgcmVzdCA9ICcvJyArIHJlc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gbm93IHJlc3QgaXMgc2V0IHRvIHRoZSBwb3N0LWhvc3Qgc3R1ZmYuXG4gIC8vIGNob3Agb2ZmIGFueSBkZWxpbSBjaGFycy5cbiAgaWYgKCF1bnNhZmVQcm90b2NvbFtsb3dlclByb3RvXSkge1xuXG4gICAgLy8gRmlyc3QsIG1ha2UgMTAwJSBzdXJlIHRoYXQgYW55IFwiYXV0b0VzY2FwZVwiIGNoYXJzIGdldFxuICAgIC8vIGVzY2FwZWQsIGV2ZW4gaWYgZW5jb2RlVVJJQ29tcG9uZW50IGRvZXNuJ3QgdGhpbmsgdGhleVxuICAgIC8vIG5lZWQgdG8gYmUuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhdXRvRXNjYXBlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGFlID0gYXV0b0VzY2FwZVtpXTtcbiAgICAgIGlmIChyZXN0LmluZGV4T2YoYWUpID09PSAtMSlcbiAgICAgICAgY29udGludWU7XG4gICAgICB2YXIgZXNjID0gZW5jb2RlVVJJQ29tcG9uZW50KGFlKTtcbiAgICAgIGlmIChlc2MgPT09IGFlKSB7XG4gICAgICAgIGVzYyA9IGVzY2FwZShhZSk7XG4gICAgICB9XG4gICAgICByZXN0ID0gcmVzdC5zcGxpdChhZSkuam9pbihlc2MpO1xuICAgIH1cbiAgfVxuXG5cbiAgLy8gY2hvcCBvZmYgZnJvbSB0aGUgdGFpbCBmaXJzdC5cbiAgdmFyIGhhc2ggPSByZXN0LmluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2ggIT09IC0xKSB7XG4gICAgLy8gZ290IGEgZnJhZ21lbnQgc3RyaW5nLlxuICAgIHRoaXMuaGFzaCA9IHJlc3Quc3Vic3RyKGhhc2gpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIGhhc2gpO1xuICB9XG4gIHZhciBxbSA9IHJlc3QuaW5kZXhPZignPycpO1xuICBpZiAocW0gIT09IC0xKSB7XG4gICAgdGhpcy5zZWFyY2ggPSByZXN0LnN1YnN0cihxbSk7XG4gICAgdGhpcy5xdWVyeSA9IHJlc3Quc3Vic3RyKHFtICsgMSk7XG4gICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnF1ZXJ5KTtcbiAgICB9XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgcW0pO1xuICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAvLyBubyBxdWVyeSBzdHJpbmcsIGJ1dCBwYXJzZVF1ZXJ5U3RyaW5nIHN0aWxsIHJlcXVlc3RlZFxuICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICB9XG4gIGlmIChyZXN0KSB0aGlzLnBhdGhuYW1lID0gcmVzdDtcbiAgaWYgKHNsYXNoZWRQcm90b2NvbFtsb3dlclByb3RvXSAmJlxuICAgICAgdGhpcy5ob3N0bmFtZSAmJiAhdGhpcy5wYXRobmFtZSkge1xuICAgIHRoaXMucGF0aG5hbWUgPSAnLyc7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gIGlmICh0aGlzLnBhdGhuYW1lIHx8IHRoaXMuc2VhcmNoKSB7XG4gICAgdmFyIHAgPSB0aGlzLnBhdGhuYW1lIHx8ICcnO1xuICAgIHZhciBzID0gdGhpcy5zZWFyY2ggfHwgJyc7XG4gICAgdGhpcy5wYXRoID0gcCArIHM7XG4gIH1cblxuICAvLyBmaW5hbGx5LCByZWNvbnN0cnVjdCB0aGUgaHJlZiBiYXNlZCBvbiB3aGF0IGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgdGhpcy5ocmVmID0gdGhpcy5mb3JtYXQoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBmb3JtYXQgYSBwYXJzZWQgb2JqZWN0IGludG8gYSB1cmwgc3RyaW5nXG5mdW5jdGlvbiB1cmxGb3JtYXQob2JqKSB7XG4gIC8vIGVuc3VyZSBpdCdzIGFuIG9iamVjdCwgYW5kIG5vdCBhIHN0cmluZyB1cmwuXG4gIC8vIElmIGl0J3MgYW4gb2JqLCB0aGlzIGlzIGEgbm8tb3AuXG4gIC8vIHRoaXMgd2F5LCB5b3UgY2FuIGNhbGwgdXJsX2Zvcm1hdCgpIG9uIHN0cmluZ3NcbiAgLy8gdG8gY2xlYW4gdXAgcG90ZW50aWFsbHkgd29ua3kgdXJscy5cbiAgaWYgKHV0aWwuaXNTdHJpbmcob2JqKSkgb2JqID0gdXJsUGFyc2Uob2JqKTtcbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgcmV0dXJuIFVybC5wcm90b3R5cGUuZm9ybWF0LmNhbGwob2JqKTtcbiAgcmV0dXJuIG9iai5mb3JtYXQoKTtcbn1cblxuVXJsLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGF1dGggPSB0aGlzLmF1dGggfHwgJyc7XG4gIGlmIChhdXRoKSB7XG4gICAgYXV0aCA9IGVuY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICBhdXRoID0gYXV0aC5yZXBsYWNlKC8lM0EvaSwgJzonKTtcbiAgICBhdXRoICs9ICdAJztcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2wgfHwgJycsXG4gICAgICBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJycsXG4gICAgICBoYXNoID0gdGhpcy5oYXNoIHx8ICcnLFxuICAgICAgaG9zdCA9IGZhbHNlLFxuICAgICAgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgOlxuICAgICAgICAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAmJlxuICAgICAgdXRpbC5pc09iamVjdCh0aGlzLnF1ZXJ5KSAmJlxuICAgICAgT2JqZWN0LmtleXModGhpcy5xdWVyeSkubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSk7XG4gIH1cblxuICB2YXIgc2VhcmNoID0gdGhpcy5zZWFyY2ggfHwgKHF1ZXJ5ICYmICgnPycgKyBxdWVyeSkpIHx8ICcnO1xuXG4gIGlmIChwcm90b2NvbCAmJiBwcm90b2NvbC5zdWJzdHIoLTEpICE9PSAnOicpIHByb3RvY29sICs9ICc6JztcblxuICAvLyBvbmx5IHRoZSBzbGFzaGVkUHJvdG9jb2xzIGdldCB0aGUgLy8uICBOb3QgbWFpbHRvOiwgeG1wcDosIGV0Yy5cbiAgLy8gdW5sZXNzIHRoZXkgaGFkIHRoZW0gdG8gYmVnaW4gd2l0aC5cbiAgaWYgKHRoaXMuc2xhc2hlcyB8fFxuICAgICAgKCFwcm90b2NvbCB8fCBzbGFzaGVkUHJvdG9jb2xbcHJvdG9jb2xdKSAmJiBob3N0ICE9PSBmYWxzZSkge1xuICAgIGhvc3QgPSAnLy8nICsgKGhvc3QgfHwgJycpO1xuICAgIGlmIChwYXRobmFtZSAmJiBwYXRobmFtZS5jaGFyQXQoMCkgIT09ICcvJykgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTtcbiAgfSBlbHNlIGlmICghaG9zdCkge1xuICAgIGhvc3QgPSAnJztcbiAgfVxuXG4gIGlmIChoYXNoICYmIGhhc2guY2hhckF0KDApICE9PSAnIycpIGhhc2ggPSAnIycgKyBoYXNoO1xuICBpZiAoc2VhcmNoICYmIHNlYXJjaC5jaGFyQXQoMCkgIT09ICc/Jykgc2VhcmNoID0gJz8nICsgc2VhcmNoO1xuXG4gIHBhdGhuYW1lID0gcGF0aG5hbWUucmVwbGFjZSgvWz8jXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQobWF0Y2gpO1xuICB9KTtcbiAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoJyMnLCAnJTIzJyk7XG5cbiAgcmV0dXJuIHByb3RvY29sICsgaG9zdCArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmUoc291cmNlLCByZWxhdGl2ZSkge1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZShyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIHJldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKSkuZm9ybWF0KCk7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlT2JqZWN0KHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiByZWxhdGl2ZTtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmVPYmplY3QocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmVPYmplY3QgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICBpZiAodXRpbC5pc1N0cmluZyhyZWxhdGl2ZSkpIHtcbiAgICB2YXIgcmVsID0gbmV3IFVybCgpO1xuICAgIHJlbC5wYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJlbGF0aXZlID0gcmVsO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBVcmwoKTtcbiAgdmFyIHRrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gIGZvciAodmFyIHRrID0gMDsgdGsgPCB0a2V5cy5sZW5ndGg7IHRrKyspIHtcbiAgICB2YXIgdGtleSA9IHRrZXlzW3RrXTtcbiAgICByZXN1bHRbdGtleV0gPSB0aGlzW3RrZXldO1xuICB9XG5cbiAgLy8gaGFzaCBpcyBhbHdheXMgb3ZlcnJpZGRlbiwgbm8gbWF0dGVyIHdoYXQuXG4gIC8vIGV2ZW4gaHJlZj1cIlwiIHdpbGwgcmVtb3ZlIGl0LlxuICByZXN1bHQuaGFzaCA9IHJlbGF0aXZlLmhhc2g7XG5cbiAgLy8gaWYgdGhlIHJlbGF0aXZlIHVybCBpcyBlbXB0eSwgdGhlbiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyBoZXJlLlxuICBpZiAocmVsYXRpdmUuaHJlZiA9PT0gJycpIHtcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaHJlZnMgbGlrZSAvL2Zvby9iYXIgYWx3YXlzIGN1dCB0byB0aGUgcHJvdG9jb2wuXG4gIGlmIChyZWxhdGl2ZS5zbGFzaGVzICYmICFyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgIC8vIHRha2UgZXZlcnl0aGluZyBleGNlcHQgdGhlIHByb3RvY29sIGZyb20gcmVsYXRpdmVcbiAgICB2YXIgcmtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgZm9yICh2YXIgcmsgPSAwOyByayA8IHJrZXlzLmxlbmd0aDsgcmsrKykge1xuICAgICAgdmFyIHJrZXkgPSBya2V5c1tya107XG4gICAgICBpZiAocmtleSAhPT0gJ3Byb3RvY29sJylcbiAgICAgICAgcmVzdWx0W3JrZXldID0gcmVsYXRpdmVbcmtleV07XG4gICAgfVxuXG4gICAgLy91cmxQYXJzZSBhcHBlbmRzIHRyYWlsaW5nIC8gdG8gdXJscyBsaWtlIGh0dHA6Ly93d3cuZXhhbXBsZS5jb21cbiAgICBpZiAoc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF0gJiZcbiAgICAgICAgcmVzdWx0Lmhvc3RuYW1lICYmICFyZXN1bHQucGF0aG5hbWUpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gcmVzdWx0LnBhdGhuYW1lID0gJy8nO1xuICAgIH1cblxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAocmVsYXRpdmUucHJvdG9jb2wgJiYgcmVsYXRpdmUucHJvdG9jb2wgIT09IHJlc3VsdC5wcm90b2NvbCkge1xuICAgIC8vIGlmIGl0J3MgYSBrbm93biB1cmwgcHJvdG9jb2wsIHRoZW4gY2hhbmdpbmdcbiAgICAvLyB0aGUgcHJvdG9jb2wgZG9lcyB3ZWlyZCB0aGluZ3NcbiAgICAvLyBmaXJzdCwgaWYgaXQncyBub3QgZmlsZTosIHRoZW4gd2UgTVVTVCBoYXZlIGEgaG9zdCxcbiAgICAvLyBhbmQgaWYgdGhlcmUgd2FzIGEgcGF0aFxuICAgIC8vIHRvIGJlZ2luIHdpdGgsIHRoZW4gd2UgTVVTVCBoYXZlIGEgcGF0aC5cbiAgICAvLyBpZiBpdCBpcyBmaWxlOiwgdGhlbiB0aGUgaG9zdCBpcyBkcm9wcGVkLFxuICAgIC8vIGJlY2F1c2UgdGhhdCdzIGtub3duIHRvIGJlIGhvc3RsZXNzLlxuICAgIC8vIGFueXRoaW5nIGVsc2UgaXMgYXNzdW1lZCB0byBiZSBhYnNvbHV0ZS5cbiAgICBpZiAoIXNsYXNoZWRQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1t2XTtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVsYXRpdmVba107XG4gICAgICB9XG4gICAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb3RvY29sID0gcmVsYXRpdmUucHJvdG9jb2w7XG4gICAgaWYgKCFyZWxhdGl2ZS5ob3N0ICYmICFob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIHJlbFBhdGggPSAocmVsYXRpdmUucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgICB3aGlsZSAocmVsUGF0aC5sZW5ndGggJiYgIShyZWxhdGl2ZS5ob3N0ID0gcmVsUGF0aC5zaGlmdCgpKSk7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3QpIHJlbGF0aXZlLmhvc3QgPSAnJztcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdG5hbWUpIHJlbGF0aXZlLmhvc3RuYW1lID0gJyc7XG4gICAgICBpZiAocmVsUGF0aFswXSAhPT0gJycpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICBpZiAocmVsUGF0aC5sZW5ndGggPCAyKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsUGF0aC5qb2luKCcvJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbGF0aXZlLnBhdGhuYW1lO1xuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCAnJztcbiAgICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGg7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdDtcbiAgICByZXN1bHQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lIHx8IHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHZhciBwID0gcmVzdWx0LnBhdGhuYW1lIHx8ICcnO1xuICAgICAgdmFyIHMgPSByZXN1bHQuc2VhcmNoIHx8ICcnO1xuICAgICAgcmVzdWx0LnBhdGggPSBwICsgcztcbiAgICB9XG4gICAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaXNTb3VyY2VBYnMgPSAocmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyksXG4gICAgICBpc1JlbEFicyA9IChcbiAgICAgICAgICByZWxhdGl2ZS5ob3N0IHx8XG4gICAgICAgICAgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLydcbiAgICAgICksXG4gICAgICBtdXN0RW5kQWJzID0gKGlzUmVsQWJzIHx8IGlzU291cmNlQWJzIHx8XG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuaG9zdCAmJiByZWxhdGl2ZS5wYXRobmFtZSkpLFxuICAgICAgcmVtb3ZlQWxsRG90cyA9IG11c3RFbmRBYnMsXG4gICAgICBzcmNQYXRoID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgICAgcmVsUGF0aCA9IHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICBwc3ljaG90aWMgPSByZXN1bHQucHJvdG9jb2wgJiYgIXNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdO1xuXG4gIC8vIGlmIHRoZSB1cmwgaXMgYSBub24tc2xhc2hlZCB1cmwsIHRoZW4gcmVsYXRpdmVcbiAgLy8gbGlua3MgbGlrZSAuLi8uLiBzaG91bGQgYmUgYWJsZVxuICAvLyB0byBjcmF3bCB1cCB0byB0aGUgaG9zdG5hbWUsIGFzIHdlbGwuICBUaGlzIGlzIHN0cmFuZ2UuXG4gIC8vIHJlc3VsdC5wcm90b2NvbCBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBub3cuXG4gIC8vIExhdGVyIG9uLCBwdXQgdGhlIGZpcnN0IHBhdGggcGFydCBpbnRvIHRoZSBob3N0IGZpZWxkLlxuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gJyc7XG4gICAgcmVzdWx0LnBvcnQgPSBudWxsO1xuICAgIGlmIChyZXN1bHQuaG9zdCkge1xuICAgICAgaWYgKHNyY1BhdGhbMF0gPT09ICcnKSBzcmNQYXRoWzBdID0gcmVzdWx0Lmhvc3Q7XG4gICAgICBlbHNlIHNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCk7XG4gICAgfVxuICAgIHJlc3VsdC5ob3N0ID0gJyc7XG4gICAgaWYgKHJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgICByZWxhdGl2ZS5ob3N0bmFtZSA9IG51bGw7XG4gICAgICByZWxhdGl2ZS5wb3J0ID0gbnVsbDtcbiAgICAgIGlmIChyZWxhdGl2ZS5ob3N0KSB7XG4gICAgICAgIGlmIChyZWxQYXRoWzBdID09PSAnJykgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7XG4gICAgICAgIGVsc2UgcmVsUGF0aC51bnNoaWZ0KHJlbGF0aXZlLmhvc3QpO1xuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cblxuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gKHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUuaG9zdCA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAocmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnKSA/XG4gICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8vIGl0J3MgcmVsYXRpdmVcbiAgICAvLyB0aHJvdyBhd2F5IHRoZSBleGlzdGluZyBmaWxlLCBhbmQgdGFrZSB0aGUgbmV3IHBhdGggaW5zdGVhZC5cbiAgICBpZiAoIXNyY1BhdGgpIHNyY1BhdGggPSBbXTtcbiAgICBzcmNQYXRoLnBvcCgpO1xuICAgIHNyY1BhdGggPSBzcmNQYXRoLmNvbmNhdChyZWxQYXRoKTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICB9IGVsc2UgaWYgKCF1dGlsLmlzTnVsbE9yVW5kZWZpbmVkKHJlbGF0aXZlLnNlYXJjaCkpIHtcbiAgICAvLyBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgLy8gbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAvLyBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIC8vIG5vIHBhdGggYXQgYWxsLiAgZWFzeS5cbiAgICAvLyB3ZSd2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIG90aGVyIHN0dWZmIGFib3ZlLlxuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQuc2VhcmNoKSB7XG4gICAgICByZXN1bHQucGF0aCA9ICcvJyArIHJlc3VsdC5zZWFyY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGlmIGEgdXJsIEVORHMgaW4gLiBvciAuLiwgdGhlbiBpdCBtdXN0IGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICAvLyBob3dldmVyLCBpZiBpdCBlbmRzIGluIGFueXRoaW5nIGVsc2Ugbm9uLXNsYXNoeSxcbiAgLy8gdGhlbiBpdCBtdXN0IE5PVCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgdmFyIGxhc3QgPSBzcmNQYXRoLnNsaWNlKC0xKVswXTtcbiAgdmFyIGhhc1RyYWlsaW5nU2xhc2ggPSAoXG4gICAgICAocmVzdWx0Lmhvc3QgfHwgcmVsYXRpdmUuaG9zdCB8fCBzcmNQYXRoLmxlbmd0aCA+IDEpICYmXG4gICAgICAobGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicpIHx8IGxhc3QgPT09ICcnKTtcblxuICAvLyBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJlxuICAgICAgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHxcbiAgICAgIChzcmNQYXRoWzBdICYmIHNyY1BhdGhbMF0uY2hhckF0KDApID09PSAnLycpO1xuXG4gIC8vIHB1dCB0aGUgaG9zdCBiYWNrXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IGlzQWJzb2x1dGUgPyAnJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQYXRoLmxlbmd0aCA/IHNyY1BhdGguc2hpZnQoKSA6ICcnO1xuICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHNyY1BhdGgubGVuZ3RoKTtcblxuICBpZiAobXVzdEVuZEFicyAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gc3JjUGF0aC5qb2luKCcvJyk7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgcmVxdWVzdC5odHRwXG4gIGlmICghdXRpbC5pc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhdXRpbC5pc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICB9XG4gIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aCB8fCByZXN1bHQuYXV0aDtcbiAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblVybC5wcm90b3R5cGUucGFyc2VIb3N0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBob3N0ID0gdGhpcy5ob3N0O1xuICB2YXIgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7XG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF07XG4gICAgaWYgKHBvcnQgIT09ICc6Jykge1xuICAgICAgdGhpcy5wb3J0ID0gcG9ydC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgdGhpcy5ob3N0bmFtZSA9IGhvc3Q7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNTdHJpbmc6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ3N0cmluZyc7XG4gIH0sXG4gIGlzT2JqZWN0OiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mKGFyZykgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbiAgfSxcbiAgaXNOdWxsOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09PSBudWxsO1xuICB9LFxuICBpc051bGxPclVuZGVmaW5lZDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyA9PSBudWxsO1xuICB9XG59O1xuIiwiXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlO1xuXG4vKipcbiAqIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2Uubm9EZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudGhyb3dEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCB0aHJvdyBhbiBFcnJvciB3aGVuIGludm9rZWQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50cmFjZURlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGludm9rZSBgY29uc29sZS50cmFjZSgpYCBpbnN0ZWFkIG9mIGBjb25zb2xlLmVycm9yKClgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIGRlcHJlY2F0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIGNvbnNvbGUgd2hlbiBgZm5gIGlzIGludm9rZWRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBuZXcgXCJkZXByZWNhdGVkXCIgdmVyc2lvbiBvZiBgZm5gXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZSAoZm4sIG1zZykge1xuICBpZiAoY29uZmlnKCdub0RlcHJlY2F0aW9uJykpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChjb25maWcoJ3Rocm93RGVwcmVjYXRpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnKCd0cmFjZURlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBgbG9jYWxTdG9yYWdlYCBmb3IgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29uZmlnIChuYW1lKSB7XG4gIC8vIGFjY2Vzc2luZyBnbG9iYWwubG9jYWxTdG9yYWdlIGNhbiB0cmlnZ2VyIGEgRE9NRXhjZXB0aW9uIGluIHNhbmRib3hlZCBpZnJhbWVzXG4gIHRyeSB7XG4gICAgaWYgKCFnbG9iYWwubG9jYWxTdG9yYWdlKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IGdsb2JhbC5sb2NhbFN0b3JhZ2VbbmFtZV07XG4gIGlmIChudWxsID09IHZhbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIi8qKlxuICogQGF1dGhvciBUaXR1cyBXb3JtZXJcbiAqIEBjb3B5cmlnaHQgMjAxNSBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSB2ZmlsZVxuICogQGZpbGVvdmVydmlldyBWaXJ0dWFsIGZpbGUgZm9ybWF0IHRvIGF0dGFjaCBhZGRpdGlvbmFsXG4gKiAgIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcHJvY2Vzc2VkIGlucHV0LiAgU2ltaWxhciB0b1xuICogICBgd2VhcmVmcmFjdGFsL3ZpbnlsYC4gIEFkZGl0aW9uYWxseSwgYFZGaWxlYCBjYW4gYmVcbiAqICAgcGFzc2VkIGRpcmVjdGx5IHRvIEVTTGludCBmb3JtYXR0ZXJzIHRvIHZpc3VhbGlzZVxuICogICB3YXJuaW5ncyBhbmQgZXJyb3JzIHJlbGF0aW5nIHRvIGEgZmlsZS5cbiAqIEBleGFtcGxlXG4gKiAgIHZhciBWRmlsZSA9IHJlcXVpcmUoJ3ZmaWxlJyk7XG4gKlxuICogICB2YXIgZmlsZSA9IG5ldyBWRmlsZSh7XG4gKiAgICAgJ2RpcmVjdG9yeSc6ICd+JyxcbiAqICAgICAnZmlsZW5hbWUnOiAnZXhhbXBsZScsXG4gKiAgICAgJ2V4dGVuc2lvbic6ICd0eHQnLFxuICogICAgICdjb250ZW50cyc6ICdGb28gKmJhciogYmF6J1xuICogICB9KTtcbiAqXG4gKiAgIGZpbGUudG9TdHJpbmcoKTsgLy8gJ0ZvbyAqYmFyKiBiYXonXG4gKiAgIGZpbGUuZmlsZVBhdGgoKTsgLy8gJ34vZXhhbXBsZS50eHQnXG4gKlxuICogICBmaWxlLm1vdmUoeydleHRlbnNpb24nOiAnbWQnfSk7XG4gKiAgIGZpbGUuZmlsZVBhdGgoKTsgLy8gJ34vZXhhbXBsZS5tZCdcbiAqXG4gKiAgIGZpbGUud2FybignU29tZXRoaW5nIHdlbnQgd3JvbmcnLCB7J2xpbmUnOiAyLCAnY29sdW1uJzogM30pO1xuICogICAvLyB7IFt+L2V4YW1wbGUubWQ6MjozOiBTb21ldGhpbmcgd2VudCB3cm9uZ11cbiAqICAgLy8gICBuYW1lOiAnfi9leGFtcGxlLm1kOjI6MycsXG4gKiAgIC8vICAgZmlsZTogJ34vZXhhbXBsZS5tZCcsXG4gKiAgIC8vICAgcmVhc29uOiAnU29tZXRoaW5nIHdlbnQgd3JvbmcnLFxuICogICAvLyAgIGxpbmU6IDIsXG4gKiAgIC8vICAgY29sdW1uOiAzLFxuICogICAvLyAgIGZhdGFsOiBmYWxzZSB9XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzICovXG5cbnZhciBTRVBBUkFUT1IgPSAnLyc7XG5cbnRyeSB7XG4gICAgU0VQQVJBVE9SID0gcmVxdWlyZSgncGEnICsgJ3RoJykuc2VwO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbi8qKlxuICogQ29uc3RydWN0IGEgbmV3IGZpbGUgbWVzc2FnZS5cbiAqXG4gKiBOb3RlOiBXZSBjYW5ub3QgaW52b2tlIGBFcnJvcmAgb24gdGhlIGNyZWF0ZWQgY29udGV4dCxcbiAqIGFzIHRoYXQgYWRkcyByZWFkb25seSBgbGluZWAgYW5kIGBjb2x1bW5gIGF0dHJpYnV0ZXMgb25cbiAqIFNhZmFyaSA5LCB0aHVzIHRocm93aW5nIGFuZCBmYWlsaW5nIHRoZSBkYXRhLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBtZXNzYWdlID0gbmV3IFZGaWxlTWVzc2FnZSgnV2hvb3BzIScpO1xuICpcbiAqICAgbWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yIC8vIHRydWVcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBjbGFzcyB7VkZpbGVNZXNzYWdlfVxuICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIFJlYXNvbiBmb3IgbWVzc2FnaW5nLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmF0YWw9bnVsbF0gLSBXaGV0aGVyIHRoZSBtZXNzYWdlXG4gKiAgIGlzIGZhdGFsLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lPScnXSAtIEZpbGUtbmFtZSBhbmQgcG9zaXRpb25hbFxuICogICBpbmZvcm1hdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZmlsZT0nJ10gLSBGaWxlLXBhdGguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JlYXNvbj0nJ10gLSBSZWFzb24gZm9yIG1lc3NhZ2luZy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbGluZT1udWxsXSAtIFN0YXJ0IG9mIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NvbHVtbj1udWxsXSAtIFN0YXJ0IG9mIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufExvY2F0aW9ufSBbbG9jYXRpb249bnVsbF0gLSBQbGFjZSBvZlxuICogICBtZXNzYWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzdGFja10gLSBTdGFjay10cmFjZSBvZiB3YXJuaW5nLlxuICovXG5mdW5jdGlvbiBWRmlsZU1lc3NhZ2UocmVhc29uKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gcmVhc29uO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgRXJyb3IjYC5cbiAqL1xuZnVuY3Rpb24gVkZpbGVNZXNzYWdlUHJvdG90eXBlKCkge31cblxuVkZpbGVNZXNzYWdlUHJvdG90eXBlLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcblxudmFyIHByb3RvID0gbmV3IFZGaWxlTWVzc2FnZVByb3RvdHlwZSgpO1xuXG5WRmlsZU1lc3NhZ2UucHJvdG90eXBlID0gcHJvdG87XG5cbi8qXG4gKiBFeHBvc2UgZGVmYXVsdHMuXG4gKi9cblxucHJvdG8uZmlsZSA9IHByb3RvLm5hbWUgPSBwcm90by5yZWFzb24gPSBwcm90by5tZXNzYWdlID0gcHJvdG8uc3RhY2sgPSAnJztcbnByb3RvLmZhdGFsID0gcHJvdG8uY29sdW1uID0gcHJvdG8ubGluZSA9IG51bGw7XG5cbi8qKlxuICogRmlsZS1yZWxhdGVkIG1lc3NhZ2Ugd2l0aCBsb2NhdGlvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAdHlwZWRlZiB7RXJyb3J9IFZGaWxlTWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSAoU3RhcnRpbmcpIGxvY2F0aW9uIG9mIHRoZVxuICogICBtZXNzYWdlLCBwcmVjZWRlZCBieSBpdHMgZmlsZS1wYXRoIHdoZW4gYXZhaWxhYmxlLFxuICogICBhbmQgam9pbmVkIGJ5IGA6YC4gVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBuYXRpdmVcbiAqICAgYEVycm9yI3RvU3RyaW5nKClgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGUgLSBGaWxlLXBhdGguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gUmVhc29uIGZvciBtZXNzYWdlLlxuICogQHByb3BlcnR5IHtudW1iZXI/fSBsaW5lIC0gTGluZSBvZiBtZXNzYWdlLCB3aGVuXG4gKiAgIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyP30gY29sdW1uIC0gQ29sdW1uIG9mIG1lc3NhZ2UsIHdoZW5cbiAqICAgYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBzdGFjayAtIFN0YWNrIG9mIG1lc3NhZ2UsIHdoZW5cbiAqICAgYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtib29sZWFuP30gZmF0YWwgLSBXaGV0aGVyIHRoZSBhc3NvY2lhdGVkIGZpbGVcbiAqICAgaXMgc3RpbGwgcHJvY2Vzc2FibGUuXG4gKi9cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBwb3NpdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBzdHJpbmdpZnkoeydsaW5lJzogMSwgJ2NvbHVtbic6IDN9KSAvLyAnMTozJ1xuICogICBzdHJpbmdpZnkoeydsaW5lJzogMX0pIC8vICcxOjEnXG4gKiAgIHN0cmluZ2lmeSh7J2NvbHVtbic6IDN9KSAvLyAnMTozJ1xuICogICBzdHJpbmdpZnkoKSAvLyAnMToxJ1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdD99IFtwb3NpdGlvbl0gLSBTaW5nbGUgcG9zaXRpb24sIGxpa2VcbiAqICAgdGhvc2UgYXZhaWxhYmxlIGF0IGBub2RlLnBvc2l0aW9uLnN0YXJ0YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21waWxlZCBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5KHBvc2l0aW9uKSB7XG4gICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgICBwb3NpdGlvbiA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiAocG9zaXRpb24ubGluZSB8fCAxKSArICc6JyArIChwb3NpdGlvbi5jb2x1bW4gfHwgMSk7XG59XG5cbi8qKlxuICogRVNMaW50J3MgZm9ybWF0dGVyIEFQSSBleHBlY3RzIGBmaWxlUGF0aGAgdG8gYmUgYVxuICogc3RyaW5nLiAgVGhpcyBoYWNrIHN1cHBvcnRzIGludm9jYXRpb24gYXMgd2VsbCBhc1xuICogaW1wbGljaXQgY29lcmNpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGZpbGUgPSBuZXcgVkZpbGUoe1xuICogICAgICdmaWxlbmFtZSc6ICdleGFtcGxlJyxcbiAqICAgICAnZXh0ZW5zaW9uJzogJ3R4dCdcbiAqICAgfSk7XG4gKlxuICogICBmaWxlUGF0aCA9IGZpbGVQYXRoRmFjdG9yeShmaWxlKTtcbiAqXG4gKiAgIFN0cmluZyhmaWxlUGF0aCk7IC8vICdleGFtcGxlLnR4dCdcbiAqICAgZmlsZVBhdGgoKTsgLy8gJ2V4YW1wbGUudHh0J1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1ZGaWxlfSBmaWxlIC0gVmlydHVhbCBmaWxlLlxuICogQHJldHVybiB7RnVuY3Rpb259IC0gYGZpbGVQYXRoYCBnZXR0ZXIuXG4gKi9cbmZ1bmN0aW9uIGZpbGVQYXRoRmFjdG9yeShmaWxlKSB7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBmaWxlbmFtZSwgd2l0aCBleHRlbnNpb24gYW5kIGRpcmVjdG9yeSwgaWYgYXBwbGljYWJsZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICB2YXIgZmlsZSA9IG5ldyBWRmlsZSh7XG4gICAgICogICAgICdkaXJlY3RvcnknOiAnficsXG4gICAgICogICAgICdmaWxlbmFtZSc6ICdleGFtcGxlJyxcbiAgICAgKiAgICAgJ2V4dGVuc2lvbic6ICd0eHQnXG4gICAgICogICB9KTtcbiAgICAgKlxuICAgICAqICAgU3RyaW5nKGZpbGUuZmlsZVBhdGgpOyAvLyB+L2V4YW1wbGUudHh0XG4gICAgICogICBmaWxlLmZpbGVQYXRoKCkgLy8gfi9leGFtcGxlLnR4dFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIHtWRmlsZX1cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB0b1N0cmluZyAtIEl0c2VsZi4gRVNMaW50J3NcbiAgICAgKiAgIGZvcm1hdHRlciBBUEkgZXhwZWN0cyBgZmlsZVBhdGhgIHRvIGJlIGBzdHJpbmdgLlxuICAgICAqICAgVGhpcyBoYWNrIHN1cHBvcnRzIGludm9jYXRpb24gYXMgd2VsbCBhcyBpbXBsaWNpdFxuICAgICAqICAgY29lcmNpb24uXG4gICAgICogQHJldHVybiB7c3RyaW5nfSAtIElmIHRoZSBgdkZpbGVgIGhhcyBhIGBmaWxlbmFtZWAsXG4gICAgICogICBpdCB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIGRpcmVjdG9yeSAoc2xhc2hlZCksXG4gICAgICogICBpZiBhcHBsaWNhYmxlLCBhbmQgc3VmZml4ZWQgd2l0aCB0aGUgKGRvdHRlZClcbiAgICAgKiAgIGV4dGVuc2lvbiAoaWYgYXBwbGljYWJsZSkuICBPdGhlcndpc2UsIGFuIGVtcHR5XG4gICAgICogICBzdHJpbmcgaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsZVBhdGgoKSB7XG4gICAgICAgIHZhciBkaXJlY3RvcnkgPSBmaWxlLmRpcmVjdG9yeTtcbiAgICAgICAgdmFyIHNlcGFyYXRvcjtcblxuICAgICAgICBpZiAoZmlsZS5maWxlbmFtZSB8fCBmaWxlLmV4dGVuc2lvbikge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gZGlyZWN0b3J5LmNoYXJBdChkaXJlY3RvcnkubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPT09ICcvJyB8fCBzZXBhcmF0b3IgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IGRpcmVjdG9yeS5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkaXJlY3RvcnkgPT09ICcuJykge1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gKGRpcmVjdG9yeSA/IGRpcmVjdG9yeSArIFNFUEFSQVRPUiA6ICcnKSArXG4gICAgICAgICAgICAgICAgZmlsZS5maWxlbmFtZSArXG4gICAgICAgICAgICAgICAgKGZpbGUuZXh0ZW5zaW9uID8gJy4nICsgZmlsZS5leHRlbnNpb24gOiAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZmlsZVBhdGgudG9TdHJpbmcgPSBmaWxlUGF0aDtcblxuICAgIHJldHVybiBmaWxlUGF0aDtcbn1cblxuLyoqXG4qIEdldCB0aGUgZmlsZW5hbWUgd2l0aCBleHRhbnRpb24uXG4qXG4qIEBleGFtcGxlXG4qICAgdmFyIGZpbGUgPSBuZXcgVkZpbGUoe1xuKiAgICAgJ2RpcmVjdG9yeSc6ICd+L2Zvby9iYXInXG4qICAgICAnZmlsZW5hbWUnOiAnZXhhbXBsZScsXG4qICAgICAnZXh0ZW5zaW9uJzogJ3R4dCdcbiogICB9KTtcbipcbiogICBmaWxlLmJhc2VuYW1lKCkgLy8gZXhhbXBsZS50eHRcbipcbiogQG1lbWJlcm9mIHtWRmlsZX1cbiogQHJldHVybiB7c3RyaW5nfSAtIG5hbWUgb2YgZmlsZSB3aXRoIGV4dGFudGlvbi5cbiovXG5mdW5jdGlvbiBiYXNlbmFtZSgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGV4dGVuc2lvbiA9IHNlbGYuZXh0ZW5zaW9uO1xuXG4gICAgaWYgKHNlbGYuZmlsZW5hbWUgfHwgZXh0ZW5zaW9uKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lICsgKGV4dGVuc2lvbiA/ICcuJyArIGV4dGVuc2lvbiA6ICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgbmV3IGZpbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGZpbGUgPSBuZXcgVkZpbGUoe1xuICogICAgICdkaXJlY3RvcnknOiAnficsXG4gKiAgICAgJ2ZpbGVuYW1lJzogJ2V4YW1wbGUnLFxuICogICAgICdleHRlbnNpb24nOiAndHh0JyxcbiAqICAgICAnY29udGVudHMnOiAnRm9vICpiYXIqIGJheidcbiAqICAgfSk7XG4gKlxuICogICBmaWxlID09PSBWRmlsZShmaWxlKSAvLyB0cnVlXG4gKiAgIGZpbGUgPT09IG5ldyBWRmlsZShmaWxlKSAvLyB0cnVlXG4gKiAgIFZGaWxlKCdmb28nKSBpbnN0YW5jZW9mIFZGaWxlIC8vIHRydWVcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBjbGFzcyB7VkZpbGV9XG4gKiBAcGFyYW0ge09iamVjdHxWRmlsZXxzdHJpbmd9IFtvcHRpb25zXSAtIGVpdGhlciBhblxuICogICBvcHRpb25zIG9iamVjdCwgb3IgdGhlIHZhbHVlIG9mIGBjb250ZW50c2AgKGJvdGhcbiAqICAgb3B0aW9uYWwpLiAgV2hlbiBhIGBmaWxlYCBpcyBwYXNzZWQgaW4sIGl0J3NcbiAqICAgaW1tZWRpYXRlbHkgcmV0dXJuZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRlbnRzPScnXSAtIENvbnRlbnQgb2YgZmlsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlyZWN0b3J5PScnXSAtIFBhdGggdG8gcGFyZW50XG4gKiAgIGRpcmVjdG9yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZmlsZW5hbWU9JyddIC0gRmlsZW5hbWUuXG4gKiAgIEEgZmlsZS1wYXRoIGNhbiBzdGlsbCBiZSBnZW5lcmF0ZWQgd2hlbiBubyBmaWxlbmFtZVxuICogICBleGlzdHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V4dGVuc2lvbj0nJ10gLSBFeHRlbnNpb24uXG4gKiAgIEEgZmlsZS1wYXRoIGNhbiBzdGlsbCBiZSBnZW5lcmF0ZWQgd2hlbiBubyBleHRlbnNpb25cbiAqICAgZXhpc3RzLlxuICogQHByb3BlcnR5IHtib29sZWFuP30gcXVpZXQgLSBXaGV0aGVyIGFuIGVycm9yIGNyZWF0ZWQgYnlcbiAqICAgYFZGaWxlI2ZhaWwoKWAgaXMgcmV0dXJuZWQgKHdoZW4gdHJ1dGh5KSBvciB0aHJvd25cbiAqICAgKHdoZW4gZmFsc2V5KS4gRW5zdXJlIGFsbCBgbWVzc2FnZXNgIGFzc29jaWF0ZWQgd2l0aFxuICogICBhIGZpbGUgYXJlIGhhbmRsZWQgcHJvcGVybHkgd2hlbiBzZXR0aW5nIHRoaXMgdG9cbiAqICAgYHRydWVgLlxuICogQHByb3BlcnR5IHtBcnJheS48VkZpbGVNZXNzYWdlPn0gbWVzc2FnZXMgLSBMaXN0IG9mIGFzc29jaWF0ZWRcbiAqICAgbWVzc2FnZXMuXG4gKi9cbmZ1bmN0aW9uIFZGaWxlKG9wdGlvbnMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvKlxuICAgICAqIE5vIGBuZXdgIG9wZXJhdG9yLlxuICAgICAqL1xuXG4gICAgaWYgKCEoc2VsZiBpbnN0YW5jZW9mIFZGaWxlKSkge1xuICAgICAgICByZXR1cm4gbmV3IFZGaWxlKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogR2l2ZW4gZmlsZS5cbiAgICAgKi9cblxuICAgIGlmIChcbiAgICAgICAgb3B0aW9ucyAmJlxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5tZXNzYWdlID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLmhhc0ZhaWxlZCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAnY29udGVudHMnOiBvcHRpb25zXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2VsZi5jb250ZW50cyA9IG9wdGlvbnMuY29udGVudHMgfHwgJyc7XG5cbiAgICBzZWxmLm1lc3NhZ2VzID0gW107XG5cbiAgICAvKlxuICAgICAqIE1ha2Ugc3VyZSBlc2xpbnTigJlzIGZvcm1hdHRlcnMgc3RyaW5naWZ5IGBmaWxlUGF0aGBcbiAgICAgKiBwcm9wZXJseS5cbiAgICAgKi9cblxuICAgIHNlbGYuZmlsZVBhdGggPSBmaWxlUGF0aEZhY3Rvcnkoc2VsZik7XG5cbiAgICBzZWxmLmhpc3RvcnkgPSBbXTtcblxuICAgIHNlbGYubW92ZSh7XG4gICAgICAgICdmaWxlbmFtZSc6IG9wdGlvbnMuZmlsZW5hbWUsXG4gICAgICAgICdkaXJlY3RvcnknOiBvcHRpb25zLmRpcmVjdG9yeSxcbiAgICAgICAgJ2V4dGVuc2lvbic6IG9wdGlvbnMuZXh0ZW5zaW9uXG4gICAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmlsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgdkZpbGUgPSBuZXcgVkZpbGUoJ0ZvbycpO1xuICogICBTdHJpbmcodkZpbGUpOyAvLyAnRm9vJ1xuICpcbiAqIEB0aGlzIHtWRmlsZX1cbiAqIEBtZW1iZXJvZiB7VkZpbGV9XG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gdmFsdWUgYXQgdGhlIGBjb250ZW50c2AgcHJvcGVydHlcbiAqICAgaW4gY29udGV4dC5cbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudHM7XG59XG5cbi8qKlxuICogTW92ZSBhIGZpbGUgYnkgcGFzc2luZyBhIG5ldyBkaXJlY3RvcnksIGZpbGVuYW1lLFxuICogYW5kIGV4dGVuc2lvbi4gIFdoZW4gdGhlc2UgYXJlIG5vdCBnaXZlbiwgdGhlIGRlZmF1bHRcbiAqIHZhbHVlcyBhcmUga2VwdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgZmlsZSA9IG5ldyBWRmlsZSh7XG4gKiAgICAgJ2RpcmVjdG9yeSc6ICd+JyxcbiAqICAgICAnZmlsZW5hbWUnOiAnZXhhbXBsZScsXG4gKiAgICAgJ2V4dGVuc2lvbic6ICd0eHQnLFxuICogICAgICdjb250ZW50cyc6ICdGb28gKmJhciogYmF6J1xuICogICB9KTtcbiAqXG4gKiAgIGZpbGUubW92ZSh7J2RpcmVjdG9yeSc6ICcvdmFyL3d3dyd9KTtcbiAqICAgZmlsZS5maWxlUGF0aCgpOyAvLyAnL3Zhci93d3cvZXhhbXBsZS50eHQnXG4gKlxuICogICBmaWxlLm1vdmUoeydleHRlbnNpb24nOiAnbWQnfSk7XG4gKiAgIGZpbGUuZmlsZVBhdGgoKTsgLy8gJy92YXIvd3d3L2V4YW1wbGUubWQnXG4gKlxuICogQHRoaXMge1ZGaWxlfVxuICogQG1lbWJlcm9mIHtWRmlsZX1cbiAqIEBwYXJhbSB7T2JqZWN0P30gW29wdGlvbnNdIC0gQ29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm4ge1ZGaWxlfSAtIENvbnRleHQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBtb3ZlKG9wdGlvbnMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGJlZm9yZSA9IHNlbGYuZmlsZVBhdGgoKTtcbiAgICB2YXIgYWZ0ZXI7XG5cbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHNlbGYuZGlyZWN0b3J5ID0gb3B0aW9ucy5kaXJlY3RvcnkgfHwgc2VsZi5kaXJlY3RvcnkgfHwgJyc7XG4gICAgc2VsZi5maWxlbmFtZSA9IG9wdGlvbnMuZmlsZW5hbWUgfHwgc2VsZi5maWxlbmFtZSB8fCAnJztcbiAgICBzZWxmLmV4dGVuc2lvbiA9IG9wdGlvbnMuZXh0ZW5zaW9uIHx8IHNlbGYuZXh0ZW5zaW9uIHx8ICcnO1xuXG4gICAgYWZ0ZXIgPSBzZWxmLmZpbGVQYXRoKCk7XG5cbiAgICBpZiAoYWZ0ZXIgJiYgYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICBzZWxmLmhpc3RvcnkucHVzaChhZnRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbWVzc2FnZSB3aXRoIGByZWFzb25gIGF0IGBwb3NpdGlvbmAuXG4gKiBXaGVuIGFuIGVycm9yIGlzIHBhc3NlZCBpbiBhcyBgcmVhc29uYCwgY29waWVzIHRoZVxuICogc3RhY2suICBUaGlzIGRvZXMgbm90IGFkZCBhIG1lc3NhZ2UgdG8gYG1lc3NhZ2VzYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgZmlsZSA9IG5ldyBWRmlsZSgpO1xuICpcbiAqICAgZmlsZS5tZXNzYWdlKCdTb21ldGhpbmcgd2VudCB3cm9uZycpO1xuICogICAvLyB7IFsxOjE6IFNvbWV0aGluZyB3ZW50IHdyb25nXVxuICogICAvLyAgIG5hbWU6ICcxOjEnLFxuICogICAvLyAgIGZpbGU6ICcnLFxuICogICAvLyAgIHJlYXNvbjogJ1NvbWV0aGluZyB3ZW50IHdyb25nJyxcbiAqICAgLy8gICBsaW5lOiBudWxsLFxuICogICAvLyAgIGNvbHVtbjogbnVsbCB9XG4gKlxuICogQHRoaXMge1ZGaWxlfVxuICogQG1lbWJlcm9mIHtWRmlsZX1cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSByZWFzb24gLSBSZWFzb24gZm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge05vZGV8TG9jYXRpb258UG9zaXRpb259IFtwb3NpdGlvbl0gLSBMb2NhdGlvblxuICogICBvZiBtZXNzYWdlIGluIGZpbGUuXG4gKiBAcmV0dXJuIHtWRmlsZU1lc3NhZ2V9IC0gRmlsZS1yZWxhdGVkIG1lc3NhZ2Ugd2l0aFxuICogICBsb2NhdGlvbiBpbmZvcm1hdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVzc2FnZShyZWFzb24sIHBvc2l0aW9uKSB7XG4gICAgdmFyIGZpbGVQYXRoID0gdGhpcy5maWxlUGF0aCgpO1xuICAgIHZhciByYW5nZTtcbiAgICB2YXIgZXJyO1xuICAgIHZhciBsb2NhdGlvbiA9IHtcbiAgICAgICAgJ3N0YXJ0Jzoge1xuICAgICAgICAgICAgJ2xpbmUnOiBudWxsLFxuICAgICAgICAgICAgJ2NvbHVtbic6IG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgJ2VuZCc6IHtcbiAgICAgICAgICAgICdsaW5lJzogbnVsbCxcbiAgICAgICAgICAgICdjb2x1bW4nOiBudWxsXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBOb2RlIC8gbG9jYXRpb24gLyBwb3NpdGlvbi5cbiAgICAgKi9cblxuICAgIGlmIChwb3NpdGlvbiAmJiBwb3NpdGlvbi5wb3NpdGlvbikge1xuICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLnBvc2l0aW9uO1xuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiAmJiBwb3NpdGlvbi5zdGFydCkge1xuICAgICAgICByYW5nZSA9IHN0cmluZ2lmeShwb3NpdGlvbi5zdGFydCkgKyAnLScgKyBzdHJpbmdpZnkocG9zaXRpb24uZW5kKTtcbiAgICAgICAgbG9jYXRpb24gPSBwb3NpdGlvbjtcbiAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbi5zdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByYW5nZSA9IHN0cmluZ2lmeShwb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBsb2NhdGlvbi5zdGFydCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgbG9jYXRpb24uZW5kLmxpbmUgPSBudWxsO1xuICAgICAgICAgICAgbG9jYXRpb24uZW5kLmNvbHVtbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlcnIgPSBuZXcgVkZpbGVNZXNzYWdlKHJlYXNvbi5tZXNzYWdlIHx8IHJlYXNvbik7XG5cbiAgICBlcnIubmFtZSA9IChmaWxlUGF0aCA/IGZpbGVQYXRoICsgJzonIDogJycpICsgcmFuZ2U7XG4gICAgZXJyLmZpbGUgPSBmaWxlUGF0aDtcbiAgICBlcnIucmVhc29uID0gcmVhc29uLm1lc3NhZ2UgfHwgcmVhc29uO1xuICAgIGVyci5saW5lID0gcG9zaXRpb24gPyBwb3NpdGlvbi5saW5lIDogbnVsbDtcbiAgICBlcnIuY29sdW1uID0gcG9zaXRpb24gPyBwb3NpdGlvbi5jb2x1bW4gOiBudWxsO1xuICAgIGVyci5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuXG4gICAgaWYgKHJlYXNvbi5zdGFjaykge1xuICAgICAgICBlcnIuc3RhY2sgPSByZWFzb24uc3RhY2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBXYXJuLiBDcmVhdGVzIGEgbm9uLWZhdGFsIG1lc3NhZ2UgKHNlZSBgVkZpbGUjbWVzc2FnZSgpYCksXG4gKiBhbmQgYWRkcyBpdCB0byB0aGUgZmlsZSdzIGBtZXNzYWdlc2AgbGlzdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgZmlsZSA9IG5ldyBWRmlsZSgpO1xuICpcbiAqICAgZmlsZS53YXJuKCdTb21ldGhpbmcgd2VudCB3cm9uZycpO1xuICogICAvLyB7IFsxOjE6IFNvbWV0aGluZyB3ZW50IHdyb25nXVxuICogICAvLyAgIG5hbWU6ICcxOjEnLFxuICogICAvLyAgIGZpbGU6ICcnLFxuICogICAvLyAgIHJlYXNvbjogJ1NvbWV0aGluZyB3ZW50IHdyb25nJyxcbiAqICAgLy8gICBsaW5lOiBudWxsLFxuICogICAvLyAgIGNvbHVtbjogbnVsbCxcbiAqICAgLy8gICBmYXRhbDogZmFsc2UgfVxuICpcbiAqIEBzZWUgVkZpbGUjbWVzc2FnZVxuICogQHRoaXMge1ZGaWxlfVxuICogQG1lbWJlcm9mIHtWRmlsZX1cbiAqL1xuZnVuY3Rpb24gd2FybigpIHtcbiAgICB2YXIgZXJyID0gdGhpcy5tZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBlcnIuZmF0YWwgPSBmYWxzZTtcblxuICAgIHRoaXMubWVzc2FnZXMucHVzaChlcnIpO1xuXG4gICAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBGYWlsLiBDcmVhdGVzIGEgZmF0YWwgbWVzc2FnZSAoc2VlIGBWRmlsZSNtZXNzYWdlKClgKSxcbiAqIHNldHMgYGZhdGFsOiB0cnVlYCwgYWRkcyBpdCB0byB0aGUgZmlsZSdzXG4gKiBgbWVzc2FnZXNgIGxpc3QuXG4gKlxuICogSWYgYHF1aWV0YCBpcyBub3QgYHRydWVgLCB0aHJvd3MgdGhlIGVycm9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIHZhciBmaWxlID0gbmV3IFZGaWxlKCk7XG4gKlxuICogICBmaWxlLmZhaWwoJ1NvbWV0aGluZyB3ZW50IHdyb25nJyk7XG4gKiAgIC8vIDE6MTogU29tZXRoaW5nIHdlbnQgd3JvbmdcbiAqICAgLy8gICAgIGF0IFZGaWxlLmV4Y2VwdGlvbiAodmZpbGUvaW5kZXguanM6Mjk2OjExKVxuICogICAvLyAgICAgYXQgVkZpbGUuZmFpbCAodmZpbGUvaW5kZXguanM6MzYwOjIwKVxuICogICAvLyAgICAgYXQgcmVwbDoxOjZcbiAqXG4gKiAgIGZpbGUucXVpZXQgPSB0cnVlO1xuICogICBmaWxlLmZhaWwoJ1NvbWV0aGluZyB3ZW50IHdyb25nJyk7XG4gKiAgIC8vIHsgWzE6MTogU29tZXRoaW5nIHdlbnQgd3JvbmddXG4gKiAgIC8vICAgbmFtZTogJzE6MScsXG4gKiAgIC8vICAgZmlsZTogJycsXG4gKiAgIC8vICAgcmVhc29uOiAnU29tZXRoaW5nIHdlbnQgd3JvbmcnLFxuICogICAvLyAgIGxpbmU6IG51bGwsXG4gKiAgIC8vICAgY29sdW1uOiBudWxsLFxuICogICAvLyAgIGZhdGFsOiB0cnVlIH1cbiAqXG4gKiBAdGhpcyB7VkZpbGV9XG4gKiBAbWVtYmVyb2Yge1ZGaWxlfVxuICogQHRocm93cyB7VkZpbGVNZXNzYWdlfSAtIFdoZW4gbm90IGBxdWlldDogdHJ1ZWAuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gcmVhc29uIC0gUmVhc29uIGZvciBmYWlsdXJlLlxuICogQHBhcmFtIHtOb2RlfExvY2F0aW9ufFBvc2l0aW9ufSBbcG9zaXRpb25dIC0gUGxhY2VcbiAqICAgb2YgZmFpbHVyZSBpbiBmaWxlLlxuICogQHJldHVybiB7VkZpbGVNZXNzYWdlfSAtIFVubGVzcyB0aHJvd24sIG9mIGNvdXJzZS5cbiAqL1xuZnVuY3Rpb24gZmFpbChyZWFzb24sIHBvc2l0aW9uKSB7XG4gICAgdmFyIGVyciA9IHRoaXMubWVzc2FnZShyZWFzb24sIHBvc2l0aW9uKTtcblxuICAgIGVyci5mYXRhbCA9IHRydWU7XG5cbiAgICB0aGlzLm1lc3NhZ2VzLnB1c2goZXJyKTtcblxuICAgIGlmICghdGhpcy5xdWlldCkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGZhdGFsIG1lc3NhZ2Ugb2NjdXJyZWQgbWFraW5nIHRoZSBmaWxlIG5vXG4gKiBsb25nZXIgcHJvY2Vzc2FibGUuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgdmFyIGZpbGUgPSBuZXcgVkZpbGUoKTtcbiAqICAgZmlsZS5xdWlldCA9IHRydWU7XG4gKlxuICogICBmaWxlLmhhc0ZhaWxlZCgpOyAvLyBmYWxzZVxuICpcbiAqICAgZmlsZS5mYWlsKCdTb21ldGhpbmcgd2VudCB3cm9uZycpO1xuICogICBmaWxlLmhhc0ZhaWxlZCgpOyAvLyB0cnVlXG4gKlxuICogQHRoaXMge1ZGaWxlfVxuICogQG1lbWJlcm9mIHtWRmlsZX1cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gYHRydWVgIGlmIGF0IGxlYXN0IG9uZSBvZiBmaWxlJ3NcbiAqICAgYG1lc3NhZ2VzYCBoYXMgYSBgZmF0YWxgIHByb3BlcnR5IHNldCB0byBgdHJ1ZWBcbiAqL1xuZnVuY3Rpb24gaGFzRmFpbGVkKCkge1xuICAgIHZhciBtZXNzYWdlcyA9IHRoaXMubWVzc2FnZXM7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIGxlbmd0aCA9IG1lc3NhZ2VzLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc1tpbmRleF0uZmF0YWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEFjY2VzcyBtZXRhZGF0YS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB2YXIgZmlsZSA9IG5ldyBWRmlsZSgnRm9vJyk7XG4gKlxuICogICBmaWxlLm5hbWVzcGFjZSgnZm9vJykuYmFyID0gJ2Jheic7XG4gKlxuICogICBjb25zb2xlLmxvZyhmaWxlLm5hbWVzcGFjZSgnZm9vJykuYmFyKSAvLyAnYmF6JztcbiAqXG4gKiBAdGhpcyB7VkZpbGV9XG4gKiBAbWVtYmVyb2Yge1ZGaWxlfVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIE5hbWVzcGFjZSBrZXkuXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gUHJpdmF0ZSBzcGFjZS5cbiAqL1xuZnVuY3Rpb24gbmFtZXNwYWNlKGtleSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgc3BhY2UgPSBzZWxmLmRhdGE7XG5cbiAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIHNwYWNlID0gc2VsZi5kYXRhID0ge307XG4gICAgfVxuXG4gICAgaWYgKCFzcGFjZVtrZXldKSB7XG4gICAgICAgIHNwYWNlW2tleV0gPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3BhY2Vba2V5XTtcbn1cblxuLypcbiAqIE1ldGhvZHMuXG4gKi9cblxudmFyIHZGaWxlUHJvdG90eXBlID0gVkZpbGUucHJvdG90eXBlO1xuXG52RmlsZVByb3RvdHlwZS5iYXNlbmFtZSA9IGJhc2VuYW1lO1xudkZpbGVQcm90b3R5cGUubW92ZSA9IG1vdmU7XG52RmlsZVByb3RvdHlwZS50b1N0cmluZyA9IHRvU3RyaW5nO1xudkZpbGVQcm90b3R5cGUubWVzc2FnZSA9IG1lc3NhZ2U7XG52RmlsZVByb3RvdHlwZS53YXJuID0gd2FybjtcbnZGaWxlUHJvdG90eXBlLmZhaWwgPSBmYWlsO1xudkZpbGVQcm90b3R5cGUuaGFzRmFpbGVkID0gaGFzRmFpbGVkO1xudkZpbGVQcm90b3R5cGUubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXG4vKlxuICogRXhwb3NlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gVkZpbGU7XG4iLCJ2YXIgaW5kZXhPZiA9IHJlcXVpcmUoJ2luZGV4b2YnKTtcblxudmFyIE9iamVjdF9rZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgIGlmIChPYmplY3Qua2V5cykgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSByZXMucHVzaChrZXkpXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxufTtcblxudmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoeHMsIGZuKSB7XG4gICAgaWYgKHhzLmZvckVhY2gpIHJldHVybiB4cy5mb3JFYWNoKGZuKVxuICAgIGVsc2UgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmbih4c1tpXSwgaSwgeHMpO1xuICAgIH1cbn07XG5cbnZhciBkZWZpbmVQcm9wID0gKGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ18nLCB7fSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihvYmosIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBuYW1lLCB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iaiwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIG9ialtuYW1lXSA9IHZhbHVlO1xuICAgICAgICB9O1xuICAgIH1cbn0oKSk7XG5cbnZhciBnbG9iYWxzID0gWydBcnJheScsICdCb29sZWFuJywgJ0RhdGUnLCAnRXJyb3InLCAnRXZhbEVycm9yJywgJ0Z1bmN0aW9uJyxcbidJbmZpbml0eScsICdKU09OJywgJ01hdGgnLCAnTmFOJywgJ051bWJlcicsICdPYmplY3QnLCAnUmFuZ2VFcnJvcicsXG4nUmVmZXJlbmNlRXJyb3InLCAnUmVnRXhwJywgJ1N0cmluZycsICdTeW50YXhFcnJvcicsICdUeXBlRXJyb3InLCAnVVJJRXJyb3InLFxuJ2RlY29kZVVSSScsICdkZWNvZGVVUklDb21wb25lbnQnLCAnZW5jb2RlVVJJJywgJ2VuY29kZVVSSUNvbXBvbmVudCcsICdlc2NhcGUnLFxuJ2V2YWwnLCAnaXNGaW5pdGUnLCAnaXNOYU4nLCAncGFyc2VGbG9hdCcsICdwYXJzZUludCcsICd1bmRlZmluZWQnLCAndW5lc2NhcGUnXTtcblxuZnVuY3Rpb24gQ29udGV4dCgpIHt9XG5Db250ZXh0LnByb3RvdHlwZSA9IHt9O1xuXG52YXIgU2NyaXB0ID0gZXhwb3J0cy5TY3JpcHQgPSBmdW5jdGlvbiBOb2RlU2NyaXB0IChjb2RlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNjcmlwdCkpIHJldHVybiBuZXcgU2NyaXB0KGNvZGUpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG59O1xuXG5TY3JpcHQucHJvdG90eXBlLnJ1bkluQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJuZWVkcyBhICdjb250ZXh0JyBhcmd1bWVudC5cIik7XG4gICAgfVxuICAgIFxuICAgIHZhciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICBpZiAoIWlmcmFtZS5zdHlsZSkgaWZyYW1lLnN0eWxlID0ge307XG4gICAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAgIFxuICAgIHZhciB3aW4gPSBpZnJhbWUuY29udGVudFdpbmRvdztcbiAgICB2YXIgd0V2YWwgPSB3aW4uZXZhbCwgd0V4ZWNTY3JpcHQgPSB3aW4uZXhlY1NjcmlwdDtcblxuICAgIGlmICghd0V2YWwgJiYgd0V4ZWNTY3JpcHQpIHtcbiAgICAgICAgLy8gd2luLmV2YWwoKSBtYWdpY2FsbHkgYXBwZWFycyB3aGVuIHRoaXMgaXMgY2FsbGVkIGluIElFOlxuICAgICAgICB3RXhlY1NjcmlwdC5jYWxsKHdpbiwgJ251bGwnKTtcbiAgICAgICAgd0V2YWwgPSB3aW4uZXZhbDtcbiAgICB9XG4gICAgXG4gICAgZm9yRWFjaChPYmplY3Rfa2V5cyhjb250ZXh0KSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB3aW5ba2V5XSA9IGNvbnRleHRba2V5XTtcbiAgICB9KTtcbiAgICBmb3JFYWNoKGdsb2JhbHMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGNvbnRleHRba2V5XSkge1xuICAgICAgICAgICAgd2luW2tleV0gPSBjb250ZXh0W2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB2YXIgd2luS2V5cyA9IE9iamVjdF9rZXlzKHdpbik7XG5cbiAgICB2YXIgcmVzID0gd0V2YWwuY2FsbCh3aW4sIHRoaXMuY29kZSk7XG4gICAgXG4gICAgZm9yRWFjaChPYmplY3Rfa2V5cyh3aW4pLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIC8vIEF2b2lkIGNvcHlpbmcgY2lyY3VsYXIgb2JqZWN0cyBsaWtlIGB0b3BgIGFuZCBgd2luZG93YCBieSBvbmx5XG4gICAgICAgIC8vIHVwZGF0aW5nIGV4aXN0aW5nIGNvbnRleHQgcHJvcGVydGllcyBvciBuZXcgcHJvcGVydGllcyBpbiB0aGUgYHdpbmBcbiAgICAgICAgLy8gdGhhdCB3YXMgb25seSBpbnRyb2R1Y2VkIGFmdGVyIHRoZSBldmFsLlxuICAgICAgICBpZiAoa2V5IGluIGNvbnRleHQgfHwgaW5kZXhPZih3aW5LZXlzLCBrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgY29udGV4dFtrZXldID0gd2luW2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvckVhY2goZ2xvYmFscywgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gY29udGV4dCkpIHtcbiAgICAgICAgICAgIGRlZmluZVByb3AoY29udGV4dCwga2V5LCB3aW5ba2V5XSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gICAgXG4gICAgcmV0dXJuIHJlcztcbn07XG5cblNjcmlwdC5wcm90b3R5cGUucnVuSW5UaGlzQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZXZhbCh0aGlzLmNvZGUpOyAvLyBtYXliZS4uLlxufTtcblxuU2NyaXB0LnByb3RvdHlwZS5ydW5Jbk5ld0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHZhciBjdHggPSBTY3JpcHQuY3JlYXRlQ29udGV4dChjb250ZXh0KTtcbiAgICB2YXIgcmVzID0gdGhpcy5ydW5JbkNvbnRleHQoY3R4KTtcblxuICAgIGZvckVhY2goT2JqZWN0X2tleXMoY3R4KSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBjb250ZXh0W2tleV0gPSBjdHhba2V5XTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXM7XG59O1xuXG5mb3JFYWNoKE9iamVjdF9rZXlzKFNjcmlwdC5wcm90b3R5cGUpLCBmdW5jdGlvbiAobmFtZSkge1xuICAgIGV4cG9ydHNbbmFtZV0gPSBTY3JpcHRbbmFtZV0gPSBmdW5jdGlvbiAoY29kZSkge1xuICAgICAgICB2YXIgcyA9IFNjcmlwdChjb2RlKTtcbiAgICAgICAgcmV0dXJuIHNbbmFtZV0uYXBwbHkocywgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICB9O1xufSk7XG5cbmV4cG9ydHMuY3JlYXRlU2NyaXB0ID0gZnVuY3Rpb24gKGNvZGUpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5TY3JpcHQoY29kZSk7XG59O1xuXG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBTY3JpcHQuY3JlYXRlQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIGNvcHkgPSBuZXcgQ29udGV4dCgpO1xuICAgIGlmKHR5cGVvZiBjb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3JFYWNoKE9iamVjdF9rZXlzKGNvbnRleHQpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBjb3B5W2tleV0gPSBjb250ZXh0W2tleV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29weTtcbn07XG4iLCIvKipcbiAqIE1vZHVsZSBEZXBlbmRlbmNpZXNcbiAqL1xuXG52YXIgc2xpY2UgPSBbXS5zbGljZTtcbnZhciB3cmFwID0gcmVxdWlyZSgnd3JhcC1mbicpO1xuXG4vKipcbiAqIEV4cG9zZSBgV2FyZWAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBXYXJlO1xuXG4vKipcbiAqIFRocm93IGFuIGVycm9yLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cblxuZnVuY3Rpb24gZmFpbCAoZXJyKSB7XG4gIHRocm93IGVycjtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBXYXJlYCBtYW5hZ2VyLCB3aXRoIG9wdGlvbmFsIGBmbnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb24gb3IgQXJyYXkgb3IgV2FyZX0gZm4gKG9wdGlvbmFsKVxuICovXG5cbmZ1bmN0aW9uIFdhcmUgKGZuKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXYXJlKSkgcmV0dXJuIG5ldyBXYXJlKGZuKTtcbiAgdGhpcy5mbnMgPSBbXTtcbiAgaWYgKGZuKSB0aGlzLnVzZShmbik7XG59XG5cbi8qKlxuICogVXNlIGEgbWlkZGxld2FyZSBgZm5gLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb24gb3IgQXJyYXkgb3IgV2FyZX0gZm5cbiAqIEByZXR1cm4ge1dhcmV9XG4gKi9cblxuV2FyZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gKGZuKSB7XG4gIGlmIChmbiBpbnN0YW5jZW9mIFdhcmUpIHtcbiAgICByZXR1cm4gdGhpcy51c2UoZm4uZm5zKTtcbiAgfVxuXG4gIGlmIChmbiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGY7IGYgPSBmbltpKytdOykgdGhpcy51c2UoZik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLmZucy5wdXNoKGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJ1biB0aHJvdWdoIHRoZSBtaWRkbGV3YXJlIHdpdGggdGhlIGdpdmVuIGBhcmdzYCBhbmQgb3B0aW9uYWwgYGNhbGxiYWNrYC5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSBhcmdzLi4uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAob3B0aW9uYWwpXG4gKiBAcmV0dXJuIHtXYXJlfVxuICovXG5cbldhcmUucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZucyA9IHRoaXMuZm5zO1xuICB2YXIgY3R4ID0gdGhpcztcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGFzdCA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07XG4gIHZhciBkb25lID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbGFzdCAmJiBsYXN0O1xuICB2YXIgYXJncyA9IGRvbmVcbiAgICA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCBhcmd1bWVudHMubGVuZ3RoIC0gMSlcbiAgICA6IHNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAvLyBuZXh0IHN0ZXBcbiAgZnVuY3Rpb24gbmV4dCAoZXJyKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIChkb25lIHx8IGZhaWwpKGVycik7XG4gICAgdmFyIGZuID0gZm5zW2krK107XG4gICAgdmFyIGFyciA9IHNsaWNlLmNhbGwoYXJncyk7XG5cbiAgICBpZiAoIWZuKSB7XG4gICAgICByZXR1cm4gZG9uZSAmJiBkb25lLmFwcGx5KG51bGwsIFtudWxsXS5jb25jYXQoYXJncykpO1xuICAgIH1cblxuICAgIHdyYXAoZm4sIG5leHQpLmFwcGx5KGN0eCwgYXJyKTtcbiAgfVxuXG4gIG5leHQoKTtcblxuICByZXR1cm4gdGhpcztcbn07XG4iLCIvKipcbiAqIE1vZHVsZSBEZXBlbmRlbmNpZXNcbiAqL1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uKCl7fTtcbnZhciBjbyA9IHJlcXVpcmUoJ2NvJyk7XG5cbi8qKlxuICogRXhwb3J0IGB3cmFwLWZuYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcDtcblxuLyoqXG4gKiBXcmFwIGEgZnVuY3Rpb24gdG8gc3VwcG9ydFxuICogc3luYywgYXN5bmMsIGFuZCBnZW4gZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gd3JhcChmbiwgZG9uZSkge1xuICBkb25lID0gb25jZShkb25lIHx8IG5vb3ApO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAvLyBwcmV2ZW50cyBhcmd1bWVudHMgbGVha2FnZVxuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGV0a2FhbnRvbm92L2JsdWViaXJkL3dpa2kvT3B0aW1pemF0aW9uLWtpbGxlcnMjMy1tYW5hZ2luZy1hcmd1bWVudHNcbiAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoaSk7XG4gICAgd2hpbGUgKGktLSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIHZhciBjdHggPSB0aGlzO1xuXG4gICAgLy8gZG9uZVxuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybiBkb25lLmFwcGx5KGN0eCwgW251bGxdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuXG4gICAgLy8gYXN5bmNcbiAgICBpZiAoZm4ubGVuZ3RoID4gYXJncy5sZW5ndGgpIHtcbiAgICAgIC8vIE5PVEU6IHRoaXMgb25seSBoYW5kbGVzIHVuY2F1Z2h0IHN5bmNocm9ub3VzIGVycm9yc1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGN0eCwgYXJncy5jb25jYXQoZG9uZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZW5lcmF0b3JcbiAgICBpZiAoZ2VuZXJhdG9yKGZuKSkge1xuICAgICAgcmV0dXJuIGNvKGZuKS5hcHBseShjdHgsIGFyZ3MuY29uY2F0KGRvbmUpKTtcbiAgICB9XG5cbiAgICAvLyBzeW5jXG4gICAgcmV0dXJuIHN5bmMoZm4sIGRvbmUpLmFwcGx5KGN0eCwgYXJncyk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwIGEgc3luY2hyb25vdXMgZnVuY3Rpb24gZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN5bmMoZm4sIGRvbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmV0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZG9uZShlcnIpO1xuICAgIH1cblxuICAgIGlmIChwcm9taXNlKHJldCkpIHtcbiAgICAgIHJldC50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgeyBkb25lKG51bGwsIHZhbHVlKTsgfSwgZG9uZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldCBpbnN0YW5jZW9mIEVycm9yID8gZG9uZShyZXQpIDogZG9uZShudWxsLCByZXQpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIElzIGB2YWx1ZWAgYSBnZW5lcmF0b3I/XG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZW5lcmF0b3IodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgJiYgdmFsdWUuY29uc3RydWN0b3JcbiAgICAmJiAnR2VuZXJhdG9yRnVuY3Rpb24nID09IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG59XG5cblxuLyoqXG4gKiBJcyBgdmFsdWVgIGEgcHJvbWlzZT9cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHByb21pc2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHZhbHVlLnRoZW47XG59XG5cbi8qKlxuICogT25jZVxuICovXG5cbmZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXQgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGZuID0gbm9vcDtcbiAgICByZXR1cm4gcmV0O1xuICB9O1xufVxuIiwiLy8gUmV0dXJucyBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgd3JhcHBlZCBjYWxsYmFja1xuLy8gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGRvIHNvbWUgc3R1ZmYsIGFuZCByZXR1cm4gYVxuLy8gcHJlc3VtYWJseSBkaWZmZXJlbnQgY2FsbGJhY2sgZnVuY3Rpb24uXG4vLyBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvd24gcHJvcGVydGllcyBhcmUgcmV0YWluZWQsIHNvIHRoYXRcbi8vIGRlY29yYXRpb25zIGFuZCBzdWNoIGFyZSBub3QgbG9zdCBhbG9uZyB0aGUgd2F5LlxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHlcbmZ1bmN0aW9uIHdyYXBweSAoZm4sIGNiKSB7XG4gIGlmIChmbiAmJiBjYikgcmV0dXJuIHdyYXBweShmbikoY2IpXG5cbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCduZWVkIHdyYXBwZXIgZnVuY3Rpb24nKVxuXG4gIE9iamVjdC5rZXlzKGZuKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgd3JhcHBlcltrXSA9IGZuW2tdXG4gIH0pXG5cbiAgcmV0dXJuIHdyYXBwZXJcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuICAgIHZhciByZXQgPSBmbi5hcHBseSh0aGlzLCBhcmdzKVxuICAgIHZhciBjYiA9IGFyZ3NbYXJncy5sZW5ndGgtMV1cbiAgICBpZiAodHlwZW9mIHJldCA9PT0gJ2Z1bmN0aW9uJyAmJiByZXQgIT09IGNiKSB7XG4gICAgICBPYmplY3Qua2V5cyhjYikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXRba10gPSBjYltrXVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG59XG4iLCJcbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgZ2xvYmFsID0gKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSkoKTtcblxuLyoqXG4gKiBXZWJTb2NrZXQgY29uc3RydWN0b3IuXG4gKi9cblxudmFyIFdlYlNvY2tldCA9IGdsb2JhbC5XZWJTb2NrZXQgfHwgZ2xvYmFsLk1veldlYlNvY2tldDtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYlNvY2tldCA/IHdzIDogbnVsbDtcblxuLyoqXG4gKiBXZWJTb2NrZXQgY29uc3RydWN0b3IuXG4gKlxuICogVGhlIHRoaXJkIGBvcHRzYCBvcHRpb25zIG9iamVjdCBnZXRzIGlnbm9yZWQgaW4gd2ViIGJyb3dzZXJzLCBzaW5jZSBpdCdzXG4gKiBub24tc3RhbmRhcmQsIGFuZCB0aHJvd3MgYSBUeXBlRXJyb3IgaWYgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2VpbmFyb3Mvd3MvaXNzdWVzLzIyN1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmlcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3RvY29scyAob3B0aW9uYWwpXG4gKiBAcGFyYW0ge09iamVjdCkgb3B0cyAob3B0aW9uYWwpXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHdzKHVyaSwgcHJvdG9jb2xzLCBvcHRzKSB7XG4gIHZhciBpbnN0YW5jZTtcbiAgaWYgKHByb3RvY29scykge1xuICAgIGluc3RhbmNlID0gbmV3IFdlYlNvY2tldCh1cmksIHByb3RvY29scyk7XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UgPSBuZXcgV2ViU29ja2V0KHVyaSk7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5pZiAoV2ViU29ja2V0KSB3cy5wcm90b3R5cGUgPSBXZWJTb2NrZXQucHJvdG90eXBlO1xuIiwiXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHplcnIgKG5hbWUsIG1zZ1RlbXBsYXRlKSB7XG4gIC8vIG1ha2Ugc3VyZSB0aGUgbmFtZSBlbmRzIHdpdGggdGhlIHdvcmQgRXJyb3JcbiAgaWYgKG5hbWUuc2xpY2UoLTUpICE9ICdFcnJvcicpXG4gICAgbmFtZSArPSAnRXJyb3InXG5cbiAgZnVuY3Rpb24gWkVycm9yICgpIHtcbiAgICAvLyBjYWxsIGFzIGEgY2xhc3MgY29uc3RydWN0b3IgaWYgY2FsbGVkIGFzIGEgZnVuY3Rpb25cbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgWkVycm9yKSkge1xuICAgICAgLy8gYSBiaXQgdHJpY2tlciB0aGFuIHVzdWFsLCBiZWNhdXNlIHdlIGhhdmUgdG8gY29tYmluZSBgYXBwbHkoKWAgd2l0aCB0aGUgYG5ld2AgZm9ybS4uLlxuICAgICAgZnVuY3Rpb24gWkUgKGFyZ3MpIHsgcmV0dXJuIFpFcnJvci5hcHBseSh0aGlzLCBhcmdzKSB9XG4gICAgICBaRS5wcm90b3R5cGUgPSBaRXJyb3IucHJvdG90eXBlO1xuICAgICAgcmV0dXJuIG5ldyBaRShhcmd1bWVudHMpXG4gICAgfVxuXG4gICAgRXJyb3IuY2FsbCh0aGlzKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIGFyZ3VtZW50cy5jYWxsZWUpXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuXG4gICAgLy8gaWYgYW4gZXJyb3Igd2FzIHBhc3NlZCwgc2hpZnQgaXQgb3V0IG9mIHRoZSBhcmdzXG4gICAgdmFyIHBhcmVudEVyclxuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgIGlmIChhcmdzWzBdIGluc3RhbmNlb2YgRXJyb3IpXG4gICAgICBwYXJlbnRFcnIgPSBhcmdzLnNoaWZ0KClcblxuICAgIC8vIGNyZWF0ZSBtZXNzYWdlXG4gICAgaWYgKG1zZ1RlbXBsYXRlKVxuICAgICAgdGhpcy5tZXNzYWdlID0gaW50ZXJwKG1zZ1RlbXBsYXRlLCBhcmdzKVxuICAgIGVsc2UgaWYgKHR5cGVvZiBhcmdzWzBdID09ICdzdHJpbmcnKVxuICAgICAgdGhpcy5tZXNzYWdlID0gYXJnc1swXVxuXG4gICAgLy8gbW9kaWZ5IHN0YWNrIHRvIHNob3cgcGFyZW50IGVycm9yXG4gICAgaWYgKHBhcmVudEVycikge1xuICAgICAgdmFyIHN0YWNrID0gcmVtb3ZlUHJlZml4KGdldFN0YWNrKHRoaXMpLCBnZXRTdGFjayhwYXJlbnRFcnIpKS5qb2luKCdcXG4nKVxuICAgICAgdGhpcy5zdGFjayA9XG4gICAgICAgIHRoaXMubmFtZSArICc6ICcgKyB0aGlzLm1lc3NhZ2UgKyAnXFxuJyArXG4gICAgICAgIHN0YWNrICsgJ1xcbiAgJyArIHBhcmVudEVyci5zdGFja1xuICAgIH1cbiAgfVxuICBaRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpXG4gIHJldHVybiBaRXJyb3Jcbn1cblxuLy8gaW50ZXJwb2xhdGUgZnVuY3Rpb25cbi8vIC0gdGFrZXMgYSB0ZW1wbGF0ZSBzdHJpbmcgYW5kIGEgbGlzdCBvZiBzdHJpbmdzIHRvIGluc2VydFxuLy8gLSByZXBsYWNlcyAnJScgdG9rZW4gaW4gdG1wbCB1c2luZyB2YWx1ZXMgaW4gYGFyZ3NgXG4vLyBlZyBpbnRlcnAoJ2hlbGxvICUsIGhvdyBhcmUgeW91ICUgdG9kYXk/JywgWydib2InLCAnZG9pbmcnXSkgPT4gJ2hlbGxvIGJvYiwgaG93IGFyZSB5b3UgZG9pbmcgdG9kYXk/J1xuLy8gZWcgaW50ZXJwKCdoZWxsbyAlLCBob3cgYXJlIHlvdSAlIHRvZGF5PycsIFsnYm9iJ10pID0+ICdoZWxsbyBib2IsIGhvdyBhcmUgeW91ICB0b2RheT8nXG52YXIgcmUgPSAvJS9nXG5mdW5jdGlvbiBpbnRlcnAgKHRtcGwsIGFyZ3MpIHtcbiAgdmFyIG4gPSAwXG4gIHJldHVybiB0bXBsLnJlcGxhY2UocmUsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3NbbisrXSB8fCAnJyB9KVxufVxuXG5cbmZ1bmN0aW9uIGdldFN0YWNrKGVycikge1xuICByZXR1cm4gZXJyLnN0YWNrLnN1YnN0cmluZyhlcnIubmFtZS5sZW5ndGggKyAzICsgZXJyLm1lc3NhZ2UubGVuZ3RoKVxuICAgIC5zcGxpdCgnXFxuJylcbn1cblxuZnVuY3Rpb24gcmVtb3ZlUHJlZml4IChhLCBiKSB7XG4gIHJldHVybiBhLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiAhfmIuaW5kZXhPZihlKVxuICB9KVxufSIsInZhciBzc2JLZXlzICAgICAgPSByZXF1aXJlKCdzc2Ita2V5cycpXG52YXIgY29uZmlnICAgICAgID0gcmVxdWlyZSgnc3NiLWNvbmZpZy9pbmplY3QnKShwcm9jZXNzLmVudi5zc2JfYXBwbmFtZSlcbnZhciBmcyAgICAgICAgICAgPSByZXF1aXJlKCdmcycpXG52YXIgcGF0aCAgICAgICAgID0gcmVxdWlyZSgncGF0aCcpXG52YXIgbWFuaWZlc3RGaWxlID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ21hbmlmZXN0Lmpzb24nKVxudmFyIHB1bGwgPSByZXF1aXJlKCdwdWxsLXN0cmVhbScpXG52YXIgU2VyaWFsaXplciA9IHJlcXVpcmUoJ3B1bGwtc2VyaWFsaXplcicpXG5cbnZhciBrZXlzID0gc3NiS2V5cy5sb2FkT3JDcmVhdGVTeW5jKHBhdGguam9pbihjb25maWcucGF0aCwgJ3NlY3JldCcpKVxuXG52YXIgY3JlYXRlU2JvdCA9IHJlcXVpcmUoJ3NjdXR0bGVib3QnKVxuICAudXNlKHJlcXVpcmUoJ3NjdXR0bGVib3QvcGx1Z2lucy9tYXN0ZXInKSlcbiAgLnVzZShyZXF1aXJlKCdzY3V0dGxlYm90L3BsdWdpbnMvZ29zc2lwJykpXG4gIC51c2UocmVxdWlyZSgnc2N1dHRsZWJvdC9wbHVnaW5zL2ZyaWVuZHMnKSlcbiAgLnVzZShyZXF1aXJlKCdzY3V0dGxlYm90L3BsdWdpbnMvcmVwbGljYXRlJykpXG4gIC51c2UocmVxdWlyZSgnc2N1dHRsZWJvdC9wbHVnaW5zL2Jsb2JzJykpXG4gIC51c2UocmVxdWlyZSgnc2N1dHRsZWJvdC9wbHVnaW5zL2ludml0ZScpKVxuICAudXNlKHJlcXVpcmUoJ3NjdXR0bGVib3QvcGx1Z2lucy9ibG9jaycpKVxuICAudXNlKHJlcXVpcmUoJ3NjdXR0bGVib3QvcGx1Z2lucy9sb2NhbCcpKVxuICAudXNlKHJlcXVpcmUoJ3NjdXR0bGVib3QvcGx1Z2lucy9sb2dnaW5nJykpXG4gIC51c2UocmVxdWlyZSgnc2N1dHRsZWJvdC9wbHVnaW5zL3ByaXZhdGUnKSlcbiAgLnVzZShyZXF1aXJlKCdzc2ItbGlua3MnKSlcbiAgLnVzZShyZXF1aXJlKCdzc2ItcXVlcnknKSlcbiAgLnVzZShyZXF1aXJlKCdzc2ItaHR0cCcpKVxuXG5jb25maWcua2V5cyA9IGtleXNcbnZhciBzYm90ID0gY3JlYXRlU2JvdChjb25maWcpXG5mcy53cml0ZUZpbGVTeW5jKG1hbmlmZXN0RmlsZSwgSlNPTi5zdHJpbmdpZnkoc2JvdC5nZXRNYW5pZmVzdCgpLCBudWxsLCAyKSlcblxuXG52YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKVxudmFyIFdTID0gcmVxdWlyZSgncHVsbC13cy1zZXJ2ZXInKVxudmFyIE11eFJwYyA9IHJlcXVpcmUoJ211eHJwYycpXG52YXIgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoZnVuY3Rpb24gKHJlcSwgcmVzKSB7XG4gICAgZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLmpvaW4oX19kaXJuYW1lLCAnc3RhdGljJywgJ2luZGV4Lmh0bWwnKSkucGlwZShyZXMpXG4gIH0pLmxpc3Rlbig4MDAwKVxuXG5XUy5jcmVhdGVTZXJ2ZXIoe3NlcnZlcjogc2VydmVyfSwgZnVuY3Rpb24gKHdzKSB7XG4gIGNvbnNvbGUubG9nKCdSUEMgY29ubmVjdGlvbicpXG4gIHZhciBycGMgPSBNdXhScGMoc2JvdC5nZXRNYW5pZmVzdCgpLCBzYm90LmdldE1hbmlmZXN0KCksIFNlcmlhbGl6ZXIpXG4gICAgKHNib3QpXG5cbiAgcHVsbCh3cywgcHVsbC50aHJvdWdoKGNvbnNvbGUubG9nKSwgcnBjLmNyZWF0ZVN0cmVhbSgpLCBwdWxsLnRocm91Z2goY29uc29sZS5sb2cpLCB3cylcbn0pXG5cbiJdfQ==